Version in base suite: 2.52.3-2~deb13u1 Base version: webkit2gtk_2.52.3-2~deb13u1 Target version: webkit2gtk_2.52.5-1~deb13u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/w/webkit2gtk/webkit2gtk_2.52.3-2~deb13u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/w/webkit2gtk/webkit2gtk_2.52.5-1~deb13u1.dsc /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Black.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Black.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-BlackItalic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-BlackItalic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Bold.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Bold.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-BoldItalic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-BoldItalic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Italic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Italic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Medium.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Medium.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-MediumItalic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-MediumItalic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Regular.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Regular.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-Bold.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-Bold.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-BoldItalic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-BoldItalic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-Italic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-Italic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-Medium.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-Medium.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-MediumItalic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-MediumItalic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-Regular.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-Regular.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/SourceCodePro-It.ttf.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/SourceCodePro-Regular.ttf.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/SourceCodePro-Semibold.ttf.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/go-up-symbolic.png |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Black.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Black.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-BlackItalic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-BlackItalic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Bold.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Bold.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-BoldItalic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-BoldItalic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Italic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Italic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Medium.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Medium.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-MediumItalic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-MediumItalic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Regular.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Regular.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-Bold.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-Bold.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-BoldItalic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-BoldItalic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-Italic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-Italic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-Medium.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-Medium.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-MediumItalic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-MediumItalic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-Regular.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-Regular.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/SourceCodePro-It.ttf.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/SourceCodePro-Regular.ttf.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/SourceCodePro-Semibold.ttf.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/go-up-symbolic.png |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Black.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Black.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-BlackItalic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-BlackItalic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Bold.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Bold.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-BoldItalic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-BoldItalic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Italic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Italic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Medium.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Medium.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-MediumItalic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-MediumItalic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Regular.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Regular.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Bold.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Bold.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-BoldItalic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-BoldItalic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Italic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Italic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Medium.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Medium.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-MediumItalic.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-MediumItalic.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Regular.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Regular.woff2 |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/SourceCodePro-It.ttf.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/SourceCodePro-Regular.ttf.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/SourceCodePro-Semibold.ttf.woff |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/go-up-symbolic.png |binary /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/iccs/CGATS001Compat-v2-micro.icc |binary webkit2gtk-2.52.5/CMakeLists.txt | 4 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.ClassDeletePropertyFunction.html | 18 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.ClassEnumeratePropertiesFunction.html | 18 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.ClassGetPropertyFunction.html | 20 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.ClassHasPropertyFunction.html | 20 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.ClassSetPropertyFunction.html | 20 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.ExceptionHandler.html | 14 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.Executor.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.OptionsFunc.html | 14 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/class.Class.html | 52 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/class.Context.html | 72 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/class.Exception.html | 56 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/class.Value.html | 118 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/class.VirtualMachine.html | 34 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/class.WeakValue.html | 36 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/classes_hierarchy.html | 4 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.MAJOR_VERSION.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.MICRO_VERSION.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.MINOR_VERSION.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.OPTIONS_USE_DFG.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.OPTIONS_USE_FTL.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.OPTIONS_USE_JIT.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.OPTIONS_USE_LLINT.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Context.new.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Context.new_with_virtual_machine.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Exception.new.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Exception.new_printf.html | 12 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Exception.new_vprintf.html | 12 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Exception.new_with_name.html | 12 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Exception.new_with_name_printf.html | 14 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Exception.new_with_name_vprintf.html | 14 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_array.html | 12 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_array_buffer.html | 16 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_array_from_garray.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_array_from_strv.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_boolean.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_from_json.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_function.html | 22 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_function_variadic.html | 18 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_functionv.html | 22 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_null.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_number.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_object.html | 12 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_promise.html | 12 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_string.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_string_from_bytes.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_typed_array.html | 12 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_undefined.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.VirtualMachine.new.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.WeakValue.new.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/enum.CheckSyntaxMode.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/enum.CheckSyntaxResult.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/enum.OptionType.html | 4 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/enum.TypedArrayType.html | 4 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/flags.ValuePropertyFlags.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/fonts.css | 176 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.CHECK_VERSION.html | 14 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.DECLARE_FINAL_TYPE.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.get_major_version.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.get_micro_version.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.get_minor_version.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_foreach.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_boolean.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_double.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_int.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_option_group.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_range_string.html | 12 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_size.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_string.html | 12 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_uint.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_boolean.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_double.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_int.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_range_string.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_size.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_string.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_uint.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/index.html | 62 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/index.json | 2 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/javascriptcoregtk-6.0.devhelp2 | 2 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_constructor.html | 22 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_constructor_variadic.html | 18 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_constructorv.html | 22 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_method.html | 18 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_method_variadic.html | 14 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_methodv.html | 18 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_property.html | 16 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.get_name.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.get_parent.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.check_syntax.html | 20 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.clear_exception.html | 4 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.evaluate.html | 12 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.evaluate_in_object.html | 24 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.evaluate_with_source_uri.html | 16 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.get_exception.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.get_global_object.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.get_value.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.get_virtual_machine.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.pop_exception_handler.html | 4 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.push_exception_handler.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.register_class.html | 16 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.set_value.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.throw.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.throw_exception.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.throw_printf.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.throw_with_name.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.throw_with_name_printf.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.get_backtrace_string.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.get_column_number.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.get_line_number.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.get_message.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.get_name.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.get_source_uri.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.report.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.to_string.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.array_buffer_get_data.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.array_buffer_get_size.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.constructor_call.html | 12 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.constructor_callv.html | 12 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.function_call.html | 12 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.function_callv.html | 12 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.get_context.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_array.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_array_buffer.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_boolean.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_constructor.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_function.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_null.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_number.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_object.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_string.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_typed_array.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_undefined.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.new_typed_array_with_buffer.html | 14 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_define_property_accessor.html | 18 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_define_property_data.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_delete_property.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_enumerate_properties.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_get_property.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_get_property_at_index.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_has_property.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_invoke_method.html | 14 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_invoke_methodv.html | 14 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_is_instance_of.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_set_property.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_set_property_at_index.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.to_boolean.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.to_double.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.to_int32.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.to_json.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.to_string.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.to_string_as_bytes.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.typed_array_get_buffer.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.typed_array_get_data.html | 10 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.typed_array_get_length.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.typed_array_get_offset.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.typed_array_get_size.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.typed_array_get_type.html | 6 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.WeakValue.get_value.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/property.Class.context.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/property.Class.name.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/property.Class.parent.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/property.Context.virtual-machine.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/property.Value.context.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/property.WeakValue.value.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/signal.WeakValue.cleared.html | 8 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/struct.ClassVTable.html | 24 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/style.css | 2 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/type_func.Context.get_current.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/callback.URISchemeRequestCallback.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.AuthenticationRequest.html | 32 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.AutomationSession.html | 28 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.BackForwardList.html | 52 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.BackForwardListItem.html | 44 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.ClipboardPermissionRequest.html | 38 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.ColorChooserRequest.html | 32 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.ContextMenu.html | 54 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.ContextMenuItem.html | 50 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.CookieManager.html | 38 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.DeviceInfoPermissionRequest.html | 38 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.Download.html | 66 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.EditorState.html | 28 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.FaviconDatabase.html | 42 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.FileChooserRequest.html | 48 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.FindController.html | 60 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.FormSubmissionRequest.html | 34 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.GeolocationManager.html | 24 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.GeolocationPermissionRequest.html | 46 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.HitTestResult.html | 66 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.Image.html | 78 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.InputMethodContext.html | 80 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.MediaKeySystemPermissionRequest.html | 42 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.NavigationPolicyDecision.html | 48 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.NetworkSession.html | 28 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.Notification.html | 28 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.NotificationPermissionRequest.html | 42 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.OptionMenu.html | 28 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.PointerLockPermissionRequest.html | 38 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.PolicyDecision.html | 50 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.PrintOperation.html | 56 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.ResponsePolicyDecision.html | 56 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.SecurityManager.html | 52 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.Settings.html | 266 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.URIRequest.html | 42 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.URIResponse.html | 48 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.URISchemeRequest.html | 42 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.URISchemeResponse.html | 32 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.UserContentFilterStore.html | 28 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.UserContentManager.html | 30 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.UserMediaPermissionRequest.html | 38 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.UserMessage.html | 34 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebContext.html | 50 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebExtension.html | 34 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebInspector.html | 62 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebResource.html | 46 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebView.html | 819 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebViewBase.html | 507 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebsiteDataAccessPermissionRequest.html | 38 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebsiteDataManager.html | 28 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebsitePolicies.html | 24 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WindowProperties.html | 60 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.XRPermissionRequest.html | 42 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/classes_hierarchy.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_COPY.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_CREATE_LINK.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_CUT.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_INSERT_IMAGE.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_PASTE.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_PASTE_AS_PLAIN_TEXT.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_REDO.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_SELECT_ALL.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_UNDO.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.MAJOR_VERSION.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.MICRO_VERSION.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.MINOR_VERSION.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/contributing.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ApplicationInfo.new.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenu.new.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenu.new_with_items.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_from_gaction.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_from_stock_action.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_from_stock_action_with_label.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_separator.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_with_submenu.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.Credential.new.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.Credential.new_for_certificate.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.Credential.new_for_certificate_pin.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.GeolocationPosition.new.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.InputMethodUnderline.new.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.MemoryPressureSettings.new.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.NetworkProxySettings.new.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.NetworkSession.new.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.NetworkSession.new_ephemeral.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.PrintOperation.new.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.SecurityOrigin.new.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.SecurityOrigin.new_for_uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.Settings.new.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.Settings.new_with_settings.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.URIRequest.new.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.URISchemeResponse.new.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserContentFilterStore.new.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserContentManager.new.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserMessage.new.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserMessage.new_with_fd_list.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserScript.new.html | 16 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserScript.new_for_world.html | 18 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserStyleSheet.new.html | 16 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserStyleSheet.new_for_world.html | 18 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebContext.new.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebExtension.new.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_all_hosts_and_schemes.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_all_urls.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_with_scheme.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_with_string.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebView.new.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebViewSessionState.new.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebsitePolicies.new.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebsitePolicies.new_with_policies.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.AuthenticationScheme.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.AutomationBrowsingContextPresentation.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.AutoplayPolicy.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.CacheModel.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.ContextMenuAction.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.CookieAcceptPolicy.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.CookiePersistentStorage.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.CredentialPersistence.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.FeatureStatus.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.HardwareAccelerationPolicy.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.InputPurpose.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.InsecureContentEvent.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.LoadEvent.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.MediaCaptureState.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.NavigationType.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.NetworkProxyMode.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.PermissionState.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.PolicyDecisionType.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.PrintOperationResponse.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.SaveMode.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.ScriptDialogType.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.SnapshotRegion.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.TLSErrorsPolicy.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.UserContentInjectedFrames.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.UserScriptInjectionTime.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.UserStyleLevel.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.WebExtensionMode.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.WebProcessTerminationReason.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.XRSessionMode.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/environment-variables.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.DownloadError.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.FaviconDatabaseError.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.JavascriptError.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.MediaError.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.NetworkError.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.PolicyError.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.PrintError.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.SnapshotError.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.UserContentFilterError.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.UserMessageError.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.WebExtensionError.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.WebExtensionMatchPatternError.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.EditorTypingAttributes.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.FindOptions.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.HitTestResultContext.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.InputHints.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.SnapshotOptions.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.WebExtensionMatchPatternOptions.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.WebsiteDataTypes.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.XRSessionFeatures.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/fonts.css | 176 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.CHECK_VERSION.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.DECLARE_DERIVABLE_TYPE.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.DECLARE_FINAL_TYPE.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.DECLARE_TYPE.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.DEPRECATED_FOR.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.get_major_version.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.get_micro_version.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.get_minor_version.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.media_key_system_permission_get_name.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.uri_for_display.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.user_media_permission_is_for_audio_device.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.user_media_permission_is_for_display_device.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.user_media_permission_is_for_video_device.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/iface.PermissionRequest.html | 24 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/index.html | 166 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/index.json | 2 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ApplicationInfo.get_name.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ApplicationInfo.get_version.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ApplicationInfo.ref.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ApplicationInfo.set_name.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ApplicationInfo.set_version.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ApplicationInfo.unref.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.authenticate.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.can_save_credentials.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.cancel.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_certificate_pin_flags.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_host.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_port.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_proposed_credential.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_realm.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_scheme.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_security_origin.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.is_for_proxy.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.is_retry.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.set_can_save_credentials.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.set_proposed_credential.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AutomationSession.get_application_info.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AutomationSession.get_id.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AutomationSession.set_application_info.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_back_item.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_back_list.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_back_list_with_limit.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_current_item.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_forward_item.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_forward_list.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_forward_list_with_limit.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_length.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_nth_item.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardListItem.get_original_uri.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardListItem.get_title.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardListItem.get_uri.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ColorChooserRequest.cancel.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ColorChooserRequest.finish.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ColorChooserRequest.get_element_rectangle.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ColorChooserRequest.get_rgba.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ColorChooserRequest.set_rgba.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.append.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.first.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.get_event.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.get_item_at_position.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.get_items.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.get_n_items.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.get_position.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.get_user_data.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.insert.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.last.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.move_item.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.prepend.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.remove.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.remove_all.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.set_user_data.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_gaction.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_gaction_target.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_stock_action.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_submenu.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_title.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.is_separator.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.set_submenu.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.add_cookie.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.add_cookie_finish.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.delete_cookie.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.delete_cookie_finish.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.get_accept_policy.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.get_accept_policy_finish.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.get_all_cookies.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.get_all_cookies_finish.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.get_cookies.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.get_cookies_finish.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.replace_cookies.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.replace_cookies_finish.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.set_accept_policy.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.set_persistent_storage.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.copy.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.free.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.get_certificate.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.get_password.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.get_persistence.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.get_username.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.has_password.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.cancel.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_allow_overwrite.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_destination.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_elapsed_time.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_estimated_progress.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_received_data_length.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_request.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_response.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_web_view.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.set_allow_overwrite.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.set_destination.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.EditorState.get_typing_attributes.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.EditorState.is_copy_available.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.EditorState.is_cut_available.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.EditorState.is_paste_available.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.EditorState.is_redo_available.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.EditorState.is_undo_available.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FaviconDatabase.clear.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FaviconDatabase.get_favicon.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FaviconDatabase.get_favicon_finish.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FaviconDatabase.get_favicon_uri.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.get_category.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.get_default_value.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.get_details.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.get_identifier.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.get_name.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.get_status.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.ref.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.unref.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FeatureList.get.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FeatureList.get_length.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FeatureList.ref.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FeatureList.unref.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FileChooserRequest.cancel.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_mime_types.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_mime_types_filter.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_select_multiple.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_selected_files.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FileChooserRequest.select_files.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.count_matches.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.get_max_match_count.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.get_options.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.get_search_text.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.get_web_view.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.search.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.search_finish.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.search_next.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.search_previous.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FormSubmissionRequest.list_text_fields.html | 16 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FormSubmissionRequest.submit.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationManager.failed.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationManager.get_enable_high_accuracy.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationManager.update_position.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.copy.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.free.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_altitude.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_altitude_accuracy.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_heading.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_speed.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_timestamp.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_editable.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_image.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_link.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_media.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_scrollbar.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_selection.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.get_context.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.get_image_uri.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.get_link_label.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.get_link_title.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.get_link_uri.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.get_media_uri.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPFirstParty.get_domain.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPFirstParty.get_last_update_time.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPFirstParty.get_website_data_access_allowed.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPFirstParty.ref.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPFirstParty.unref.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPThirdParty.get_domain.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPThirdParty.get_first_parties.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPThirdParty.ref.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPThirdParty.unref.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Image.as_bytes.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Image.get_height.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Image.get_stride.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Image.get_width.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.filter_key_event.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.get_input_hints.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.get_input_purpose.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.get_preedit.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_cursor_area.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_focus_in.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_focus_out.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_surrounding.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.reset.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.set_enable_preedit.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.set_input_hints.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.set_input_purpose.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodUnderline.copy.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodUnderline.free.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodUnderline.set_color.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.copy.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.free.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_conservative_threshold.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_kill_threshold.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_memory_limit.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_poll_interval.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_strict_threshold.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_conservative_threshold.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_kill_threshold.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_memory_limit.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_poll_interval.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_strict_threshold.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.copy.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.free.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.get_frame_name.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.get_modifiers.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.get_mouse_button.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.get_navigation_type.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.get_request.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.is_redirect.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.is_user_gesture.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationPolicyDecision.get_navigation_action.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkProxySettings.add_proxy_for_scheme.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkProxySettings.copy.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkProxySettings.free.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.allow_tls_certificate_for_host.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.download_uri.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_cookie_manager.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_itp_enabled.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_itp_summary.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_itp_summary_finish.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_persistent_credential_storage_enabled.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_tls_errors_policy.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_website_data_manager.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.is_ephemeral.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.prefetch_dns.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.set_itp_enabled.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.set_persistent_credential_storage_enabled.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.set_proxy_settings.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.set_tls_errors_policy.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Notification.clicked.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Notification.close.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Notification.get_body.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Notification.get_id.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Notification.get_tag.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Notification.get_title.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenu.activate_item.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenu.close.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenu.get_event.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenu.get_item.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenu.get_n_items.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenu.select_item.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.copy.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.free.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.get_label.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.get_tooltip.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_enabled.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_group_child.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_group_label.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_selected.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionRequest.allow.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionRequest.deny.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionStateQuery.finish.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionStateQuery.get_name.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionStateQuery.get_security_origin.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionStateQuery.ref.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionStateQuery.unref.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PolicyDecision.download.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PolicyDecision.ignore.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PolicyDecision.use.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PolicyDecision.use_with_policies.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PrintOperation.get_page_setup.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PrintOperation.get_print_settings.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PrintOperation.print.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PrintOperation.run_dialog.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PrintOperation.set_page_setup.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PrintOperation.set_print_settings.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.get_request.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.get_response.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.is_main_frame_main_resource.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.is_mime_type_supported.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.close.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.confirm_set_confirmed.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.get_dialog_type.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.get_message.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.prompt_get_default_text.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.prompt_set_text.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.ref.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.unref.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptMessageReply.ref.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptMessageReply.return_error_message.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptMessageReply.return_value.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptMessageReply.unref.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_cors_enabled.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_display_isolated.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_empty_document.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_local.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_no_access.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_secure.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_cors_enabled.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_display_isolated.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_empty_document.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_local.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_no_access.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_secure.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityOrigin.get_host.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityOrigin.get_port.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityOrigin.get_protocol.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityOrigin.ref.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityOrigin.to_string.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityOrigin.unref.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.apply_from_key_file.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_allow_file_access_from_file_urls.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_allow_modal_dialogs.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_allow_top_navigation_to_data_urls.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_allow_universal_access_from_file_urls.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_auto_load_images.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_cursive_font_family.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_default_charset.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_default_font_family.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_default_font_size.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_default_monospace_font_size.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_disable_web_security.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_draw_compositing_indicators.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_2d_canvas_acceleration.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_back_forward_navigation_gestures.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_caret_browsing.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_developer_extras.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_dns_prefetching.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_encrypted_media.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_fullscreen.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_html5_database.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_html5_local_storage.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_hyperlink_auditing.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_javascript.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_javascript_markup.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_media.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_media_capabilities.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_media_stream.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_mediasource.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_mock_capture_devices.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_offline_web_application_cache.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_page_cache.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_resizable_text_areas.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_site_specific_quirks.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_smooth_scrolling.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_spatial_navigation.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_tabs_to_links.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_webaudio.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_webgl.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_webrtc.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_write_console_messages_to_stdout.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_fantasy_font_family.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_feature_enabled.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_hardware_acceleration_policy.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_javascript_can_access_clipboard.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_javascript_can_open_windows_automatically.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_load_icons_ignoring_image_load_setting.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_math_font_family.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_media_content_types_requiring_hardware_support.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_media_playback_allows_inline.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_media_playback_requires_user_gesture.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_minimum_font_size.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_monospace_font_family.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_pictograph_font_family.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_print_backgrounds.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_sans_serif_font_family.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_serif_font_family.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_user_agent.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_webrtc_udp_ports_range.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_zoom_text_only.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_allow_file_access_from_file_urls.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_allow_modal_dialogs.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_allow_top_navigation_to_data_urls.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_allow_universal_access_from_file_urls.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_auto_load_images.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_cursive_font_family.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_default_charset.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_default_font_family.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_default_font_size.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_default_monospace_font_size.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_disable_web_security.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_draw_compositing_indicators.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_2d_canvas_acceleration.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_back_forward_navigation_gestures.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_caret_browsing.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_developer_extras.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_dns_prefetching.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_encrypted_media.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_fullscreen.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_html5_database.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_html5_local_storage.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_hyperlink_auditing.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_javascript.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_javascript_markup.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_media.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_media_capabilities.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_media_stream.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_mediasource.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_mock_capture_devices.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_offline_web_application_cache.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_page_cache.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_resizable_text_areas.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_site_specific_quirks.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_smooth_scrolling.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_spatial_navigation.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_tabs_to_links.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_webaudio.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_webgl.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_webrtc.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_write_console_messages_to_stdout.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_fantasy_font_family.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_feature_enabled.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_hardware_acceleration_policy.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_javascript_can_access_clipboard.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_javascript_can_open_windows_automatically.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_load_icons_ignoring_image_load_setting.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_math_font_family.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_media_content_types_requiring_hardware_support.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_media_playback_allows_inline.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_media_playback_requires_user_gesture.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_minimum_font_size.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_monospace_font_family.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_pictograph_font_family.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_print_backgrounds.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_sans_serif_font_family.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_serif_font_family.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_user_agent.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_user_agent_with_application_details.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_webrtc_udp_ports_range.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_zoom_text_only.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIRequest.get_http_headers.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIRequest.get_http_method.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIRequest.get_uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIRequest.set_uri.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIResponse.get_content_length.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIResponse.get_http_headers.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIResponse.get_mime_type.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIResponse.get_status_code.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIResponse.get_suggested_filename.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIResponse.get_uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.finish.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.finish_error.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.finish_with_response.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_http_body.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_http_headers.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_http_method.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_path.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_scheme.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_web_view.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeResponse.set_content_type.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeResponse.set_http_headers.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeResponse.set_status.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilter.get_identifier.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilter.ref.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilter.unref.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.fetch_identifiers.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.fetch_identifiers_finish.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.get_path.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.load.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.load_finish.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.remove.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.remove_finish.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save_finish.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save_from_file.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save_from_file_finish.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.add_filter.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.add_script.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.add_style_sheet.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.register_script_message_handler.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.register_script_message_handler_with_reply.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_all_filters.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_all_scripts.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_all_style_sheets.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_filter.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_filter_by_id.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_script.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_style_sheet.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.unregister_script_message_handler.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserMessage.get_fd_list.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserMessage.get_name.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserMessage.get_parameters.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserMessage.send_reply.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserScript.ref.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserScript.unref.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserStyleSheet.ref.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserStyleSheet.unref.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.add_path_to_sandbox.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_cache_model.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_geolocation_manager.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_network_session_for_automation.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_security_manager.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_spell_checking_enabled.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_spell_checking_languages.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_time_zone_override.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.initialize_notification_permissions.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.is_automation_allowed.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.register_uri_scheme.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.send_message_to_all_extensions.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_automation_allowed.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_cache_model.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_preferred_languages.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_spell_checking_enabled.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_spell_checking_languages.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_web_process_extensions_directory.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_web_process_extensions_initialization_user_data.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_action_icon.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_all_requested_match_patterns.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_default_locale.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_display_action_label.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_display_description.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_display_name.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_display_short_name.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_display_version.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_background_content.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_commands.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_content_modification_rules.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_injected_content.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_options_page.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_override_new_tab_page.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_persistent_background_content.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_icon.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_manifest_version.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_optional_permission_match_patterns.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_optional_permissions.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_path.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_requested_permission_match_patterns.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_requested_permissions.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_version.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.supports_manifest_version.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_host.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_matches_all_hosts.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_matches_all_urls.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_path.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_scheme.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_string.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.matches_pattern.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.matches_url.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.ref.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.unref.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.attach.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.close.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.detach.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.get_attached_height.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.get_can_attach.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.get_inspected_uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.get_web_view.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.is_attached.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.show.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebResource.get_data.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebResource.get_data_finish.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebResource.get_response.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebResource.get_uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.call_async_javascript_function.html | 22 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.call_async_javascript_function_finish.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.can_execute_editing_command.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.can_execute_editing_command_finish.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.can_go_back.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.can_go_forward.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.can_show_mime_type.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.download_uri.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.evaluate_javascript.html | 20 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.evaluate_javascript_finish.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.execute_editing_command.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.execute_editing_command_with_argument.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_automation_presentation_type.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_back_forward_list.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_background_color.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_camera_capture_state.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_context.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_custom_charset.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_default_content_security_policy.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_display_capture_state.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_editor_state.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_estimated_load_progress.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_favicon.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_find_controller.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_input_method_context.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_inspector.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_is_muted.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_is_web_process_responsive.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_main_resource.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_microphone_capture_state.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_network_session.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_page_id.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_session_state.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_settings.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_snapshot.html | 16 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_snapshot_finish.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_theme_color.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_title.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_tls_info.html | 18 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_uri.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_user_content_manager.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_web_extension_mode.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_website_policies.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_window_properties.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_zoom_level.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.go_back.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.go_forward.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.go_to_back_forward_list_item.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.is_controlled_by_automation.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.is_editable.html | 16 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.is_immersive_mode_enabled.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.is_loading.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.is_playing_audio.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.leave_immersive_mode.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.load_alternate_html.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.load_bytes.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.load_html.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.load_plain_text.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.load_request.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.load_uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.reload.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.reload_bypass_cache.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.restore_session_state.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.save.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.save_finish.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.save_to_file.html | 16 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.save_to_file_finish.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.send_message_to_page.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.send_message_to_page_finish.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_background_color.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_camera_capture_state.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_cors_allowlist.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_custom_charset.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_display_capture_state.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_editable.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_input_method_context.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_is_muted.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_microphone_capture_state.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_settings.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_zoom_level.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.stop_loading.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.terminate_web_process.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.try_close.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebViewSessionState.ref.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebViewSessionState.serialize.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebViewSessionState.unref.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteData.get_name.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteData.get_size.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteData.get_types.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteData.ref.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteData.unref.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataAccessPermissionRequest.get_current_domain.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataAccessPermissionRequest.get_requesting_domain.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.clear.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.clear_finish.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.fetch.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.fetch_finish.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_base_cache_directory.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_base_data_directory.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_favicon_database.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_favicons_enabled.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_itp_summary.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_itp_summary_finish.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.is_ephemeral.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.remove.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.remove_finish.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.set_favicons_enabled.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsitePolicies.get_autoplay_policy.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_fullscreen.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_geometry.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_locationbar_visible.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_menubar_visible.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_resizable.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_scrollbars_visible.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_statusbar_visible.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_toolbar_visible.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_consent_optional_features.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_consent_required_features.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_granted_features.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_optional_features_requested.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_required_features_requested.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_security_origin.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_session_mode.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.set_granted_optional_features.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/migrating-to-webkitgtk-6.0.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/overview.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/profiling.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.AutomationSession.id.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.ColorChooserRequest.rgba.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Download.allow-overwrite.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Download.destination.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Download.estimated-progress.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Download.response.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.EditorState.typing-attributes.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FileChooserRequest.filter.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FileChooserRequest.mime-types.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FileChooserRequest.select-multiple.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FileChooserRequest.selected-files.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FindController.max-match-count.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FindController.options.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FindController.text.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FindController.web-view.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.GeolocationManager.enable-high-accuracy.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.HitTestResult.context.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.HitTestResult.image-uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.HitTestResult.link-label.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.HitTestResult.link-title.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.HitTestResult.link-uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.HitTestResult.media-uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Image.height.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Image.stride.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Image.width.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.InputMethodContext.input-hints.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.InputMethodContext.input-purpose.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.NavigationPolicyDecision.navigation-action.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.NetworkSession.cache-directory.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.NetworkSession.data-directory.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.NetworkSession.is-ephemeral.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Notification.body.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Notification.id.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Notification.tag.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Notification.title.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.PrintOperation.page-setup.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.PrintOperation.print-settings.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.PrintOperation.web-view.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.ResponsePolicyDecision.request.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.ResponsePolicyDecision.response.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.allow-file-access-from-file-urls.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.allow-modal-dialogs.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.allow-top-navigation-to-data-urls.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.allow-universal-access-from-file-urls.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.auto-load-images.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.cursive-font-family.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.default-charset.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.default-font-family.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.default-font-size.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.default-monospace-font-size.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.disable-web-security.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.draw-compositing-indicators.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-2d-canvas-acceleration.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-back-forward-navigation-gestures.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-caret-browsing.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-developer-extras.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-dns-prefetching.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-encrypted-media.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-fullscreen.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-html5-database.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-html5-local-storage.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-hyperlink-auditing.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-javascript-markup.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-javascript.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-media-capabilities.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-media-stream.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-media.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-mediasource.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-mock-capture-devices.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-offline-web-application-cache.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-page-cache.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-resizable-text-areas.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-site-specific-quirks.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-smooth-scrolling.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-spatial-navigation.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-tabs-to-links.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-webaudio.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-webgl.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-webrtc.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-write-console-messages-to-stdout.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.fantasy-font-family.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.hardware-acceleration-policy.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.javascript-can-access-clipboard.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.javascript-can-open-windows-automatically.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.load-icons-ignoring-image-load-setting.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.math-font-family.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.media-content-types-requiring-hardware-support.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.media-playback-allows-inline.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.media-playback-requires-user-gesture.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.minimum-font-size.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.monospace-font-family.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.pictograph-font-family.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.print-backgrounds.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.sans-serif-font-family.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.serif-font-family.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.user-agent.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.webrtc-udp-ports-range.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.zoom-text-only.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIRequest.uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIResponse.content-length.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIResponse.http-headers.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIResponse.mime-type.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIResponse.status-code.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIResponse.suggested-filename.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIResponse.uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URISchemeResponse.stream-length.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URISchemeResponse.stream.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.UserContentFilterStore.path.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.UserMediaPermissionRequest.is-for-audio-device.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.UserMediaPermissionRequest.is-for-video-device.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.UserMessage.fd-list.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.UserMessage.name.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.UserMessage.parameters.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebContext.memory-pressure-settings.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebContext.time-zone-override.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.default-locale.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.display-action-label.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.display-description.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.display-name.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.display-short-name.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.display-version.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-background-content.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-commands.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-content-modification-rules.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-injected-content.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-options-page.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-override-new-tab-page.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-persistent-background-content.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.manifest-version.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.optional-permissions.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.path.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.requested-permissions.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.version.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebInspector.attached-height.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebInspector.can-attach.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebInspector.inspected-uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebResource.response.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebResource.uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.automation-presentation-type.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.camera-capture-state.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.default-content-security-policy.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.display-capture-state.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.editable.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.estimated-load-progress.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.favicon.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.is-controlled-by-automation.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.is-immersive-mode-enabled.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.is-loading.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.is-muted.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.is-playing-audio.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.is-web-process-responsive.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.microphone-capture-state.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.network-session.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.page-id.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.related-view.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.settings.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.theme-color.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.title.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.uri.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.user-content-manager.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.web-context.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.web-extension-mode.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.website-policies.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.zoom-level.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebsiteDataManager.base-cache-directory.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebsiteDataManager.base-data-directory.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebsiteDataManager.is-ephemeral.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebsiteDataManager.origin-storage-ratio.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebsiteDataManager.total-storage-ratio.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebsitePolicies.autoplay.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.fullscreen.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.geometry.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.locationbar-visible.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.menubar-visible.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.resizable.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.scrollbars-visible.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.statusbar-visible.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.toolbar-visible.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/remote-inspector.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.AuthenticationRequest.authenticated.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.AuthenticationRequest.cancelled.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.AutomationSession.create-web-view.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.AutomationSession.will-close.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.BackForwardList.changed.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.ColorChooserRequest.finished.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.CookieManager.changed.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Download.created-destination.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Download.decide-destination.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Download.failed.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Download.finished.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Download.received-data.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.EditorState.changed.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.FaviconDatabase.favicon-changed.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.FindController.counted-matches.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.FindController.failed-to-find-text.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.FindController.found-text.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.GeolocationManager.start.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.GeolocationManager.stop.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.InputMethodContext.committed.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.InputMethodContext.delete-surrounding.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.InputMethodContext.preedit-changed.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.InputMethodContext.preedit-finished.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.InputMethodContext.preedit-started.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.NetworkSession.download-started.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Notification.clicked.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Notification.closed.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.OptionMenu.close.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.PrintOperation.failed.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.PrintOperation.finished.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.UserContentManager.script-message-received.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.UserContentManager.script-message-with-reply-received.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebContext.automation-started.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebContext.initialize-notification-permissions.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebContext.initialize-web-process-extensions.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebContext.user-message-received.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebInspector.attach.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebInspector.bring-to-front.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebInspector.closed.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebInspector.detach.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebInspector.open-window.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebResource.failed-with-tls-errors.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebResource.failed.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebResource.finished.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebResource.sent-request.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.authenticate.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.close.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.context-menu-dismissed.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.context-menu.html | 16 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.create.html | 16 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.decide-policy.html | 18 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.enter-fullscreen.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.insecure-content-detected.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.leave-fullscreen.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.load-changed.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.load-failed-with-tls-errors.html | 16 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.load-failed.html | 20 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.mouse-target-changed.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.permission-request.html | 16 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.print.html | 16 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.query-permission-state.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.ready-to-show.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.resource-load-started.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.run-as-modal.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.run-color-chooser.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.run-file-chooser.html | 16 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.script-dialog.html | 16 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.show-notification.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.show-option-menu.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.submit-form.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.user-message-received.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.web-process-terminated.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.ApplicationInfo.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.Credential.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.Feature.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.FeatureList.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.GeolocationPosition.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.ITPFirstParty.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.ITPThirdParty.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.InputMethodUnderline.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.MemoryPressureSettings.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.NavigationAction.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.NetworkProxySettings.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.OptionMenuItem.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.PermissionStateQuery.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.ScriptDialog.html | 18 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.ScriptMessageReply.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.SecurityOrigin.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.UserContentFilter.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.UserScript.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.UserStyleSheet.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.WebExtensionMatchPattern.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.WebViewSessionState.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.WebsiteData.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/style.css | 2 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.DownloadError.quark.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.FaviconDatabaseError.quark.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.JavascriptError.quark.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.MediaError.quark.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.NetworkError.quark.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.NetworkSession.get_default.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.NetworkSession.set_memory_pressure_settings.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.PolicyError.quark.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.PrintError.quark.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.Settings.font_size_to_pixels.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.Settings.font_size_to_points.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.Settings.get_all_features.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.Settings.get_development_features.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.Settings.get_experimental_features.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.SnapshotError.quark.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.UserContentFilterError.quark.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.UserMessageError.quark.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.WebContext.get_default.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.WebExtensionError.quark.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.WebExtensionMatchPattern.register_custom_URL_scheme.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.WebExtensionMatchPattern.register_custom_url_scheme.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.WebExtensionMatchPatternError.quark.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.committed.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.delete_surrounding.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.filter_key_event.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.get_preedit.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_cursor_area.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_focus_in.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_focus_out.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_surrounding.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.preedit_changed.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.preedit_finished.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.preedit_started.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.reset.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.set_enable_preedit.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.PermissionRequest.allow.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.PermissionRequest.deny.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.authenticate.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.close.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.context_menu.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.context_menu_dismissed.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.create.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.decide_policy.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.enter_fullscreen.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.insecure_content_detected.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.leave_fullscreen.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.load_changed.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.load_failed.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.load_failed_with_tls_errors.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.mouse_target_changed.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.permission_request.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.print.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.query_permission_state.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.ready_to_show.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.resource_load_started.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.run_as_modal.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.run_color_chooser.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.run_file_chooser.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.script_dialog.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.show_notification.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.show_option_menu.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.submit_form.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.user_message_received.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.web_process_crashed.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.web_process_terminated.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/webkitgtk-6.0.devhelp2 | 2 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/callback.WebProcessExtensionInitializeFunction.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/callback.WebProcessExtensionInitializeWithUserDataFunction.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.ContextMenu.html | 54 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.ContextMenuItem.html | 50 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.Frame.html | 28 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.HitTestResult.html | 66 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.ScriptWorld.html | 34 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.URIRequest.html | 42 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.URIResponse.html | 48 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.UserMessage.html | 36 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.WebEditor.html | 24 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.WebFormManager.html | 24 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.WebHitTestResult.html | 48 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.WebPage.html | 42 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.WebProcessExtension.html | 28 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/classes_hierarchy.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenu.new.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenu.new_with_items.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_from_gaction.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_from_stock_action.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_from_stock_action_with_label.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_separator.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_with_submenu.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ScriptWorld.new.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ScriptWorld.new_with_name.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.URIRequest.new.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.UserMessage.new.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.UserMessage.new_with_fd_list.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/enum.ConsoleMessageLevel.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/enum.ConsoleMessageSource.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/enum.ContextMenuAction.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/enum.UserMessageError.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/flags.HitTestResultContext.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/fonts.css | 176 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/index.html | 26 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/index.json | 2 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.copy.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.free.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_level.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_line.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_source.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_source_id.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_text.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.append.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.first.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_event.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_item_at_position.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_items.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_n_items.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_position.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_user_data.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.insert.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.last.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.move_item.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.prepend.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.remove.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.remove_all.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.set_user_data.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_gaction.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_gaction_target.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_stock_action.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_submenu.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_title.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.is_separator.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.set_submenu.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_id.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_js_context.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_js_context_for_script_world.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_uri.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.is_main_frame.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_editable.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_image.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_link.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_media.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_scrollbar.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_selection.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_context.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_image_uri.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_link_label.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_link_title.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_link_uri.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_media_uri.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ScriptWorld.get_name.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.get_http_headers.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.get_http_method.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.get_uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.set_uri.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_content_length.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_http_headers.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_mime_type.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_status_code.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_suggested_filename.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.get_fd_list.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.get_name.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.get_parameters.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.send_reply.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebEditor.get_page.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_editable.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_image.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_link.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_media.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_scrollbar.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_selection.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_context.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_image_uri.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_js_node.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_link_label.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_link_title.html | 14 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_link_uri.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_media_uri.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_editor.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_form_manager.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_id.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_main_frame.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_uri.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.send_message_to_view.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.send_message_to_view_finish.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebProcessExtension.get_page.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebProcessExtension.send_message_to_context.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebProcessExtension.send_message_to_context_finish.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.context.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.image-uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.link-label.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.link-title.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.link-uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.media-uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIRequest.uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.content-length.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.http-headers.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.mime-type.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.status-code.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.suggested-filename.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.UserMessage.fd-list.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.UserMessage.name.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.UserMessage.parameters.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.WebPage.uri.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.ScriptWorld.window-object-cleared.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebEditor.selection-changed.html | 4 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebFormManager.form-controls-associated.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebFormManager.will-send-submit-event.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebFormManager.will-submit-form.html | 12 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.console-message-sent.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.context-menu.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.document-loaded.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.send-request.html | 16 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.user-message-received.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebProcessExtension.page-created.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebProcessExtension.user-message-received.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/struct.ConsoleMessage.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/style.css | 2 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/type_func.ScriptWorld.get_default.html | 6 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/type_func.UserMessage.error_quark.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/type_func.WebFormManager.input_element_auto_fill.html | 8 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/type_func.WebFormManager.input_element_is_auto_filled.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/type_func.WebFormManager.input_element_is_user_edited.html | 10 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/webkitgtk-web-process-extension-6.0.devhelp2 | 2 webkit2gtk-2.52.5/NEWS | 33 webkit2gtk-2.52.5/Source/JavaScriptCore/CMakeLists.txt | 56 webkit2gtk-2.52.5/Source/JavaScriptCore/assembler/AssemblerBuffer.h | 14 webkit2gtk-2.52.5/Source/JavaScriptCore/b3/B3CanonicalizePrePostIncrements.cpp | 9 webkit2gtk-2.52.5/Source/JavaScriptCore/b3/air/AirFixObviousSpills.cpp | 63 webkit2gtk-2.52.5/Source/JavaScriptCore/builtins/TypedArrayConstructor.js | 10 webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/AccessCase.cpp | 6 webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/ExpressionInfo.cpp | 45 webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/ExpressionInfo.h | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/ExpressionInfoInlines.h | 3 webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/GetByStatus.cpp | 14 webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/GetByStatus.h | 9 webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/InlineCacheCompiler.cpp | 13 webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/Repatch.cpp | 3 webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/StructureStubClearingWatchpoint.h | 1 webkit2gtk-2.52.5/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp | 3 webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h | 23 webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGAdaptiveInferredPropertyValueWatchpoint.cpp | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGArgumentsEliminationPhase.cpp | 28 webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp | 7 webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGClobberize.h | 29 webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp | 25 webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGGraph.cpp | 45 webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGLoopUnrollingPhase.cpp | 1 webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGNode.h | 17 webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGOSRExit.cpp | 16 webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGObjectAllocationSinkingPhase.cpp | 11 webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGOperations.cpp | 5 webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGStoreBarrierInsertionPhase.cpp | 17 webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGValidate.cpp | 4 webkit2gtk-2.52.5/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp | 93 webkit2gtk-2.52.5/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp | 24 webkit2gtk-2.52.5/Source/JavaScriptCore/ftl/FTLOperations.cpp | 25 webkit2gtk-2.52.5/Source/JavaScriptCore/heap/ConservativeRoots.cpp | 11 webkit2gtk-2.52.5/Source/JavaScriptCore/heap/GCOwnedDataScope.h | 22 webkit2gtk-2.52.5/Source/JavaScriptCore/heap/Heap.cpp | 36 webkit2gtk-2.52.5/Source/JavaScriptCore/heap/Heap.h | 17 webkit2gtk-2.52.5/Source/JavaScriptCore/heap/IncrementalSweeper.cpp | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/inspector/JSInjectedScriptHost.cpp | 7 webkit2gtk-2.52.5/Source/JavaScriptCore/interpreter/Interpreter.cpp | 6 webkit2gtk-2.52.5/Source/JavaScriptCore/jit/BaselineJITRegisters.h | 7 webkit2gtk-2.52.5/Source/JavaScriptCore/jit/ExecutableAllocator.h | 8 webkit2gtk-2.52.5/Source/JavaScriptCore/jit/GCAwareJITStubRoutine.h | 1 webkit2gtk-2.52.5/Source/JavaScriptCore/jit/JIT.h | 59 webkit2gtk-2.52.5/Source/JavaScriptCore/jit/JITOperations.cpp | 12 webkit2gtk-2.52.5/Source/JavaScriptCore/jit/JITPropertyAccess.cpp | 28 webkit2gtk-2.52.5/Source/JavaScriptCore/jit/JITWorklist.cpp | 6 webkit2gtk-2.52.5/Source/JavaScriptCore/jit/JITWorklist.h | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/jsc.cpp | 7 webkit2gtk-2.52.5/Source/JavaScriptCore/llint/InPlaceInterpreter.asm | 8 webkit2gtk-2.52.5/Source/JavaScriptCore/llint/LLIntData.cpp | 81 webkit2gtk-2.52.5/Source/JavaScriptCore/parser/ASTBuilder.h | 3 webkit2gtk-2.52.5/Source/JavaScriptCore/parser/Lexer.cpp | 3 webkit2gtk-2.52.5/Source/JavaScriptCore/parser/ParserArena.h | 5 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/ArrayBuffer.cpp | 36 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/ArrayBuffer.h | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/ClonedArguments.cpp | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/CommonSlowPaths.cpp | 6 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/DeferredWorkTimer.cpp | 99 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/DeferredWorkTimer.h | 46 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/DeferredWorkTimerInlines.h | 38 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/HashMapHelper.h | 4 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/ISO8601.cpp | 23 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/IntlNumberFormat.cpp | 5 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/IntlObject.cpp | 90 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/IntlObject.h | 1 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSArrayBuffer.cpp | 34 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSArrayBuffer.h | 20 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSArrayBufferPrototype.cpp | 28 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSCJSValue.h | 28 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSCJSValueInlines.h | 39 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSFinalizationRegistry.cpp | 6 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSGenericTypedArrayViewPrototypeFunctions.h | 69 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSGlobalObject.cpp | 8 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSGlobalObject.h | 4 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSLock.cpp | 5 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSLock.h | 8 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSObjectInlines.h | 19 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSString.h | 14 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSStringJoiner.h | 4 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/LiteralParser.cpp | 27 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/MathCommon.cpp | 10 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/MathCommon.h | 17 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/NumberPrototype.cpp | 19 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/OptionsList.h | 1 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/RegExp.cpp | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/RegExpInlines.h | 8 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/StringConstructor.cpp | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/StringPrototypeInlines.h | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/Structure.cpp | 7 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/Structure.h | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/TypedArrayAdaptors.h | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/WaiterListManager.cpp | 31 webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/WaiterListManager.h | 15 webkit2gtk-2.52.5/Source/JavaScriptCore/tools/JSDollarVM.cpp | 87 webkit2gtk-2.52.5/Source/JavaScriptCore/tools/JSDollarVM.h | 9 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmBBQJIT.cpp | 18 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmBBQJIT.h | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmBBQJIT64.h | 3 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmBBQPlan.cpp | 6 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmCallee.cpp | 23 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmCalleeGroup.cpp | 10 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmEntryPlan.cpp | 16 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmEntryPlan.h | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmFormat.cpp | 1 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmFormat.h | 9 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmFunctionParser.h | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmGlobal.h | 12 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmIPIntGenerator.cpp | 58 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmIPIntPlan.cpp | 4 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmIPIntSlowPaths.cpp | 32 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmIPIntSlowPaths.h | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmMemory.cpp | 3 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmMemory.h | 7 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmModuleInformation.cpp | 18 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmModuleInformation.h | 10 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmOMGIRGenerator.cpp | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmOMGPlan.cpp | 6 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmOSREntryPlan.cpp | 6 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmPlan.cpp | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmSectionParser.cpp | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmStreamingCompiler.cpp | 68 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmStreamingCompiler.h | 5 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmStreamingParser.cpp | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmTable.cpp | 3 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmTable.h | 6 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmTypeDefinition.cpp | 24 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/debugger/WasmDebugServer.cpp | 8 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/debugger/WasmDebugServer.h | 1 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/debugger/WasmModuleManager.cpp | 9 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/debugger/WasmModuleManager.h | 1 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/js/JSWebAssembly.cpp | 37 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp | 11 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/js/JSWebAssemblyMemory.cpp | 11 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/js/WebAssemblyCompileOptions.cpp | 1 webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/js/WebAssemblyMemoryConstructor.cpp | 4 webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/RegularExpression.cpp | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrErrorCode.cpp | 4 webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrErrorCode.h | 2 webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrJIT.cpp | 32 webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrJIT.h | 1 webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrParser.h | 29 webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrPattern.cpp | 276 webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrSyntaxChecker.cpp | 2 webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/common/mathutil.h | 26 webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/common/utilities_unittest.cpp | 28 webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/libANGLE/ErrorStrings.h | 1 webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/libANGLE/validationES.h | 4 webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/libANGLE/validationES3.cpp | 7 webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/tests/gl_tests/TransformFeedbackTest.cpp | 89 webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/tests/gl_tests/WebGLCompatibilityTest.cpp | 115 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/PdfJSFiles.cmake | 25 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/README.webkit | 27 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/build/pdf.mjs |39467 +++++---- webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/build/pdf.sandbox.mjs | 65 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/build/pdf.worker.mjs |41069 +++++----- webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/debugger.css | 36 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/debugger.mjs | 256 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/iccs/LICENSE | 116 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/altText_disclaimer.svg | 3 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/altText_spinner.svg | 30 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/altText_warning.svg | 3 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/checkmark.svg | 5 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/comment-actionsButton.svg | 3 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/comment-closeButton.svg | 3 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/comment-editButton.svg | 8 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/comment-popup-editButton.svg | 5 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/editor-toolbar-edit.svg | 3 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/messageBar_closingButton.svg | 3 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/messageBar_info.svg | 3 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/messageBar_warning.svg | 3 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/pages_closeButton.svg | 3 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/pages_selected.svg | 7 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/pages_viewArrow.svg | 3 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/pages_viewButton.svg | 3 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/toolbarButton-editorSignature.svg | 6 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/toolbarButton-sidebarToggle.svg | 3 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/toolbarButton-viewsManagerToggle.svg | 3 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ach/viewer.ftl | 25 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/af/viewer.ftl | 33 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/an/viewer.ftl | 29 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ar/viewer.ftl | 534 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ast/viewer.ftl | 29 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/az/viewer.ftl | 29 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/be/viewer.ftl | 427 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/bg/viewer.ftl | 84 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/bn/viewer.ftl | 29 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/bo/viewer.ftl | 25 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/bqi/viewer.ftl | 67 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/br/viewer.ftl | 82 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/brx/viewer.ftl | 29 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/bs/viewer.ftl | 385 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ca/viewer.ftl | 37 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/cak/viewer.ftl | 33 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ckb/viewer.ftl | 29 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/cs/viewer.ftl | 435 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/cy/viewer.ftl | 447 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/da/viewer.ftl | 424 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/de/viewer.ftl | 421 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/dsb/viewer.ftl | 437 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/el/viewer.ftl | 427 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/en-CA/viewer.ftl | 463 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/en-GB/viewer.ftl | 421 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/en-US/viewer.ftl | 461 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/eo/viewer.ftl | 427 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/es-AR/viewer.ftl | 421 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/es-CL/viewer.ftl | 423 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/es-ES/viewer.ftl | 421 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/es-MX/viewer.ftl | 500 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/et/viewer.ftl | 26 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/eu/viewer.ftl | 431 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/fa/viewer.ftl | 106 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ff/viewer.ftl | 25 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/fi/viewer.ftl | 421 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/fr/viewer.ftl | 423 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/fur/viewer.ftl | 324 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/fy-NL/viewer.ftl | 427 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ga-IE/viewer.ftl | 33 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/gd/viewer.ftl | 39 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/gl/viewer.ftl | 299 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/gn/viewer.ftl | 429 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/gu-IN/viewer.ftl | 25 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/he/viewer.ftl | 429 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/hi-IN/viewer.ftl | 34 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/hr/viewer.ftl | 506 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/hsb/viewer.ftl | 433 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/hu/viewer.ftl | 423 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/hy-AM/viewer.ftl | 428 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/hye/viewer.ftl | 26 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ia/viewer.ftl | 434 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/id/viewer.ftl | 336 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/is/viewer.ftl | 256 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/it/viewer.ftl | 432 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ja/viewer.ftl | 415 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ka/viewer.ftl | 462 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/kab/viewer.ftl | 349 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/kk/viewer.ftl | 421 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/km/viewer.ftl | 53 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/kn/viewer.ftl | 33 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ko/viewer.ftl | 403 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/lij/viewer.ftl | 25 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/lo/viewer.ftl | 39 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/locale.json | 2 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/lt/viewer.ftl | 26 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ltg/viewer.ftl | 25 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/lv/viewer.ftl | 25 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/meh/viewer.ftl | 39 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/mk/viewer.ftl | 574 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ml/viewer.ftl | 509 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/mr/viewer.ftl | 29 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ms/viewer.ftl | 25 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/my/viewer.ftl | 33 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/nb-NO/viewer.ftl | 434 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ne-NP/viewer.ftl | 33 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/nl/viewer.ftl | 421 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/nn-NO/viewer.ftl | 449 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/oc/viewer.ftl | 110 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/pa-IN/viewer.ftl | 430 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/pl/viewer.ftl | 437 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/pt-BR/viewer.ftl | 437 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/pt-PT/viewer.ftl | 425 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/rm/viewer.ftl | 317 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ro/viewer.ftl | 549 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ru/viewer.ftl | 435 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sat/viewer.ftl | 39 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sc/viewer.ftl | 122 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/scn/viewer.ftl | 42 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sco/viewer.ftl | 26 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/si/viewer.ftl | 41 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sk/viewer.ftl | 433 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/skr/viewer.ftl | 192 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sl/viewer.ftl | 448 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/son/viewer.ftl | 33 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sq/viewer.ftl | 427 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sr/viewer.ftl | 514 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sv-SE/viewer.ftl | 421 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/szl/viewer.ftl | 29 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ta/viewer.ftl | 25 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/te/viewer.ftl | 28 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/tg/viewer.ftl | 426 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/th/viewer.ftl | 399 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/tl/viewer.ftl | 29 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/tr/viewer.ftl | 429 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/trs/viewer.ftl | 34 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/uk/viewer.ftl | 423 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ur/viewer.ftl | 26 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/uz/viewer.ftl | 33 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/vi/viewer.ftl | 399 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/wo/viewer.ftl | 27 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/xh/viewer.ftl | 33 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/zh-CN/viewer.ftl | 405 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/zh-TW/viewer.ftl | 439 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/viewer.css | 7677 + webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/viewer.html | 1393 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/viewer.mjs |22508 +++-- webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/LICENSE_JBIG2 | 196 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/LICENSE_OPENJPEG | 39 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/LICENSE_PDFJS_JBIG2 | 13 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/LICENSE_PDFJS_OPENJPEG | 22 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/LICENSE_PDFJS_QCMS | 22 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/LICENSE_QCMS | 21 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/jbig2_nowasm_fallback.js | 15 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/openjpeg_nowasm_fallback.js | 17 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/quickjs-eval.js | 16 webkit2gtk-2.52.5/Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml | 36 webkit2gtk-2.52.5/Source/WTF/wtf/Assertions.h | 7 webkit2gtk-2.52.5/Source/WTF/wtf/CMakeLists.txt | 9 webkit2gtk-2.52.5/Source/WTF/wtf/CheckedArithmetic.h | 8 webkit2gtk-2.52.5/Source/WTF/wtf/CheckedPtr.h | 16 webkit2gtk-2.52.5/Source/WTF/wtf/CheckedRef.h | 15 webkit2gtk-2.52.5/Source/WTF/wtf/Compiler.h | 6 webkit2gtk-2.52.5/Source/WTF/wtf/CurrentTime.cpp | 9 webkit2gtk-2.52.5/Source/WTF/wtf/FileSystem.cpp | 26 webkit2gtk-2.52.5/Source/WTF/wtf/FileSystem.h | 2 webkit2gtk-2.52.5/Source/WTF/wtf/Forward.h | 5 webkit2gtk-2.52.5/Source/WTF/wtf/JSONValues.cpp | 3 webkit2gtk-2.52.5/Source/WTF/wtf/LazyRef.h | 2 webkit2gtk-2.52.5/Source/WTF/wtf/LazyUniqueRef.h | 2 webkit2gtk-2.52.5/Source/WTF/wtf/ListHashSet.h | 4 webkit2gtk-2.52.5/Source/WTF/wtf/Logger.h | 2 webkit2gtk-2.52.5/Source/WTF/wtf/MappedFileData.h | 12 webkit2gtk-2.52.5/Source/WTF/wtf/MathExtras.h | 288 webkit2gtk-2.52.5/Source/WTF/wtf/MemoryPressureHandler.cpp | 5 webkit2gtk-2.52.5/Source/WTF/wtf/PlatformEnable.h | 2 webkit2gtk-2.52.5/Source/WTF/wtf/PlatformHave.h | 10 webkit2gtk-2.52.5/Source/WTF/wtf/Ref.h | 25 webkit2gtk-2.52.5/Source/WTF/wtf/RefPtr.h | 18 webkit2gtk-2.52.5/Source/WTF/wtf/RetainPtr.h | 16 webkit2gtk-2.52.5/Source/WTF/wtf/SegmentedVector.h | 191 webkit2gtk-2.52.5/Source/WTF/wtf/StatisticsManager.cpp | 3 webkit2gtk-2.52.5/Source/WTF/wtf/SuspendableWorkQueue.cpp | 9 webkit2gtk-2.52.5/Source/WTF/wtf/SuspendableWorkQueue.h | 1 webkit2gtk-2.52.5/Source/WTF/wtf/WallTime.cpp | 10 webkit2gtk-2.52.5/Source/WTF/wtf/WallTime.h | 5 webkit2gtk-2.52.5/Source/WTF/wtf/WeakPtr.h | 2 webkit2gtk-2.52.5/Source/WTF/wtf/glib/FileSystemGlib.cpp | 13 webkit2gtk-2.52.5/Source/WTF/wtf/posix/FileHandlePOSIX.cpp | 2 webkit2gtk-2.52.5/Source/WTF/wtf/posix/FileSystemPOSIX.cpp | 5 webkit2gtk-2.52.5/Source/WTF/wtf/posix/MappedFileDataPOSIX.cpp | 1 webkit2gtk-2.52.5/Source/WTF/wtf/text/CString.cpp | 9 webkit2gtk-2.52.5/Source/WTF/wtf/text/CString.h | 1 webkit2gtk-2.52.5/Source/WTF/wtf/text/StringCommon.h | 6 webkit2gtk-2.52.5/Source/WTF/wtf/text/StringImpl.cpp | 4 webkit2gtk-2.52.5/Source/WTF/wtf/text/StringImpl.h | 2 webkit2gtk-2.52.5/Source/WTF/wtf/text/TextStream.cpp | 3 webkit2gtk-2.52.5/Source/WebCore/CMakeLists.txt | 13 webkit2gtk-2.52.5/Source/WebCore/Modules/async-clipboard/Clipboard.cpp | 18 webkit2gtk-2.52.5/Source/WebCore/Modules/async-clipboard/ClipboardItemBindingsDataSource.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/Modules/cache/CacheStorageConnection.cpp | 1 webkit2gtk-2.52.5/Source/WebCore/Modules/encryptedmedia/MediaKeySession.cpp | 19 webkit2gtk-2.52.5/Source/WebCore/Modules/fetch/FetchBody.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp | 8 webkit2gtk-2.52.5/Source/WebCore/Modules/fetch/FetchBodySource.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/fetch/FetchRequest.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/IDBKeyData.cpp | 18 webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/IDBKeyData.h | 18 webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.h | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/MemoryIndex.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/MemoryIndexCursor.cpp | 7 webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp | 15 webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h | 5 webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h | 4 webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h | 6 webkit2gtk-2.52.5/Source/WebCore/Modules/mediarecorder/BlobEvent.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/mediarecorder/BlobEvent.h | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/mediasession/MediaMetadata.cpp | 15 webkit2gtk-2.52.5/Source/WebCore/Modules/mediasession/MediaMetadata.h | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/mediasource/MediaSource.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/RTCEncodedStreamProducer.cpp | 11 webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/RTCEncodedStreamProducer.h | 5 webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/RTCRtpScriptTransformer.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/RTCRtpTransformableFrame.h | 8 webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceAgent.cpp | 154 webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceAgent.h | 9 webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceStream.cpp | 1 webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceTransport.cpp | 1 webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerMediaEndpoint.cpp | 60 webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerMediaEndpoint.h | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerPeerConnectionBackend.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerPeerConnectionBackend.h | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerRtpSenderBackend.cpp | 12 webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h | 1 webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderTransformBackend.cpp | 3 webkit2gtk-2.52.5/Source/WebCore/Modules/notifications/Notification.cpp | 17 webkit2gtk-2.52.5/Source/WebCore/Modules/notifications/Notification.h | 4 webkit2gtk-2.52.5/Source/WebCore/Modules/notifications/NotificationData.h | 7 webkit2gtk-2.52.5/Source/WebCore/Modules/permissions/Permissions.cpp | 206 webkit2gtk-2.52.5/Source/WebCore/Modules/permissions/Permissions.h | 11 webkit2gtk-2.52.5/Source/WebCore/Modules/speech/SpeechSynthesis.cpp | 12 webkit2gtk-2.52.5/Source/WebCore/Modules/speech/SpeechSynthesis.h | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/speech/SpeechSynthesisUtterance.cpp | 6 webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableByteStreamController.cpp | 22 webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableByteStreamController.h | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStream.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStreamBYOBReader.cpp | 62 webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStreamBYOBReader.h | 4 webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStreamBYOBRequest.cpp | 30 webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStreamBYOBRequest.h | 10 webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStreamDefaultReader.cpp | 71 webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStreamDefaultReader.h | 6 webkit2gtk-2.52.5/Source/WebCore/Modules/streams/StreamPipeToUtilities.cpp | 15 webkit2gtk-2.52.5/Source/WebCore/Modules/streams/StreamTeeUtilities.cpp | 9 webkit2gtk-2.52.5/Source/WebCore/Modules/streams/TransformStream.cpp | 10 webkit2gtk-2.52.5/Source/WebCore/Modules/web-locks/WebLockManager.cpp | 44 webkit2gtk-2.52.5/Source/WebCore/Modules/web-locks/WebLockManager.h | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/AudioBufferSourceNode.cpp | 11 webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/AudioNodeInput.cpp | 3 webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/AudioWorkletGlobalScope.cpp | 1 webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/AudioWorkletMessagingProxy.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/BiquadFilterNode.cpp | 7 webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/WaveShaperDSPKernel.cpp | 25 webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/WaveShaperDSPKernel.h | 5 webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/WaveShaperNode.cpp | 20 webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/WaveShaperNode.h | 1 webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/WaveShaperProcessor.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/WaveShaperProcessor.h | 11 webkit2gtk-2.52.5/Source/WebCore/Modules/webcodecs/WebCodecsAudioData.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/webcodecs/WebCodecsAudioData.h | 5 webkit2gtk-2.52.5/Source/WebCore/Modules/websockets/WebSocketHandshake.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/webxr/WebXRSession.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/Modules/webxr/WebXRSession.h | 2 webkit2gtk-2.52.5/Source/WebCore/Modules/webxr/WebXRSystem.cpp | 56 webkit2gtk-2.52.5/Source/WebCore/Modules/webxr/WebXRSystem.h | 11 webkit2gtk-2.52.5/Source/WebCore/Modules/webxr/XRSessionInit.h | 9 webkit2gtk-2.52.5/Source/WebCore/Modules/webxr/XRSessionInit.idl | 4 webkit2gtk-2.52.5/Source/WebCore/PAL/pal/CMakeLists.txt | 9 webkit2gtk-2.52.5/Source/WebCore/SaferCPPExpectations/UncheckedCallArgsCheckerExpectations | 3 webkit2gtk-2.52.5/Source/WebCore/SaferCPPExpectations/UncountedCallArgsCheckerExpectations | 4 webkit2gtk-2.52.5/Source/WebCore/accessibility/AXCoreObject.h | 90 webkit2gtk-2.52.5/Source/WebCore/accessibility/AXLiveRegionManager.cpp | 17 webkit2gtk-2.52.5/Source/WebCore/accessibility/AXLogger.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/accessibility/AXObjectCache.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/accessibility/AccessibilityMenuList.cpp | 17 webkit2gtk-2.52.5/Source/WebCore/accessibility/AccessibilityNodeObject.cpp | 11 webkit2gtk-2.52.5/Source/WebCore/accessibility/AccessibilityObject.cpp | 3 webkit2gtk-2.52.5/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/accessibility/atspi/AccessibilityObjectComponentAtspi.cpp | 7 webkit2gtk-2.52.5/Source/WebCore/accessibility/atspi/AccessibilityObjectTextAtspi.cpp | 11 webkit2gtk-2.52.5/Source/WebCore/animation/AnimationTimelinesController.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/animation/KeyframeEffect.cpp | 42 webkit2gtk-2.52.5/Source/WebCore/animation/KeyframeEffect.h | 2 webkit2gtk-2.52.5/Source/WebCore/animation/StyleOriginatedTimelinesController.cpp | 8 webkit2gtk-2.52.5/Source/WebCore/bindings/IDLTypes.h | 2 webkit2gtk-2.52.5/Source/WebCore/bindings/js/InternalReadableStreamDefaultReader.cpp | 8 webkit2gtk-2.52.5/Source/WebCore/bindings/js/InternalWritableStreamWriter.cpp | 12 webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSAttrCustom.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp | 8 webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSDOMOperationReturningPromise.h | 4 webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSDOMPromiseDeferred.cpp | 22 webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSDOMPromiseDeferred.h | 30 webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSRangeCustom.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSStyleSheetCustom.h | 6 webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSSubscriberCustom.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSTextTrackCueCustom.cpp | 3 webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp | 6 webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSXPathResultCustom.cpp | 11 webkit2gtk-2.52.5/Source/WebCore/bindings/js/ScriptModuleLoader.cpp | 7 webkit2gtk-2.52.5/Source/WebCore/bindings/js/SerializedScriptValue.cpp | 66 webkit2gtk-2.52.5/Source/WebCore/bindings/js/SerializedScriptValue.h | 4 webkit2gtk-2.52.5/Source/WebCore/bindings/js/WorkerModuleScriptLoader.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm | 5 webkit2gtk-2.52.5/Source/WebCore/contentextensions/ImmutableNFA.h | 2 webkit2gtk-2.52.5/Source/WebCore/contentextensions/ImmutableNFANodeBuilder.h | 7 webkit2gtk-2.52.5/Source/WebCore/css/CSSFontFace.cpp | 6 webkit2gtk-2.52.5/Source/WebCore/css/CSSFontFaceSet.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/css/CSSFontFaceSet.h | 2 webkit2gtk-2.52.5/Source/WebCore/css/CSSImportRule.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/css/CSSImportRule.h | 5 webkit2gtk-2.52.5/Source/WebCore/css/CSSPseudoSelectors.json | 3 webkit2gtk-2.52.5/Source/WebCore/css/CSSStyleSheet.cpp | 20 webkit2gtk-2.52.5/Source/WebCore/css/CSSStyleSheet.h | 11 webkit2gtk-2.52.5/Source/WebCore/css/FontFace.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/css/FontFaceSet.cpp | 22 webkit2gtk-2.52.5/Source/WebCore/css/SelectorChecker.cpp | 3 webkit2gtk-2.52.5/Source/WebCore/css/SelectorCheckerTestFunctions.h | 16 webkit2gtk-2.52.5/Source/WebCore/css/StyleSheet.h | 2 webkit2gtk-2.52.5/Source/WebCore/css/calc/CSSCalcTree+Evaluation.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/css/calc/CSSCalcTree+Parser.cpp | 64 webkit2gtk-2.52.5/Source/WebCore/css/parser/CSSParserContext.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/css/parser/CSSParserContext.h | 1 webkit2gtk-2.52.5/Source/WebCore/css/parser/CSSSelectorParserContext.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/css/parser/CSSSelectorParserContext.h | 1 webkit2gtk-2.52.5/Source/WebCore/cssjit/SelectorCompiler.cpp | 12 webkit2gtk-2.52.5/Source/WebCore/dom/Attr.cpp | 27 webkit2gtk-2.52.5/Source/WebCore/dom/Attr.h | 13 webkit2gtk-2.52.5/Source/WebCore/dom/ContainerNode.cpp | 3 webkit2gtk-2.52.5/Source/WebCore/dom/ContainerNodeAlgorithms.cpp | 3 webkit2gtk-2.52.5/Source/WebCore/dom/ContainerNodeInlines.h | 2 webkit2gtk-2.52.5/Source/WebCore/dom/Document.cpp | 16 webkit2gtk-2.52.5/Source/WebCore/dom/DocumentStorageAccess.cpp | 11 webkit2gtk-2.52.5/Source/WebCore/dom/DocumentStorageAccess.h | 2 webkit2gtk-2.52.5/Source/WebCore/dom/Element.cpp | 37 webkit2gtk-2.52.5/Source/WebCore/dom/MessagePort.cpp | 25 webkit2gtk-2.52.5/Source/WebCore/dom/MessagePort.h | 1 webkit2gtk-2.52.5/Source/WebCore/dom/Node.cpp | 74 webkit2gtk-2.52.5/Source/WebCore/dom/Node.h | 10 webkit2gtk-2.52.5/Source/WebCore/dom/NodeInlines.h | 9 webkit2gtk-2.52.5/Source/WebCore/dom/Range.cpp | 103 webkit2gtk-2.52.5/Source/WebCore/dom/Range.h | 5 webkit2gtk-2.52.5/Source/WebCore/dom/ShadowRoot.cpp | 6 webkit2gtk-2.52.5/Source/WebCore/dom/ShadowRoot.h | 5 webkit2gtk-2.52.5/Source/WebCore/dom/SlotAssignment.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/dom/Subscriber.cpp | 28 webkit2gtk-2.52.5/Source/WebCore/dom/Subscriber.h | 5 webkit2gtk-2.52.5/Source/WebCore/editing/CompositeEditCommand.cpp | 1 webkit2gtk-2.52.5/Source/WebCore/editing/InsertParagraphSeparatorCommand.cpp | 1 webkit2gtk-2.52.5/Source/WebCore/fileapi/AsyncFileStream.cpp | 10 webkit2gtk-2.52.5/Source/WebCore/fileapi/AsyncFileStream.h | 3 webkit2gtk-2.52.5/Source/WebCore/history/CachedFrame.cpp | 1 webkit2gtk-2.52.5/Source/WebCore/html/BaseDateAndTimeInputType.cpp | 52 webkit2gtk-2.52.5/Source/WebCore/html/BaseDateAndTimeInputType.h | 38 webkit2gtk-2.52.5/Source/WebCore/html/CanvasBase.cpp | 112 webkit2gtk-2.52.5/Source/WebCore/html/CanvasBase.h | 31 webkit2gtk-2.52.5/Source/WebCore/html/ColorInputType.cpp | 48 webkit2gtk-2.52.5/Source/WebCore/html/ColorInputType.h | 12 webkit2gtk-2.52.5/Source/WebCore/html/CustomPaintCanvas.cpp | 3 webkit2gtk-2.52.5/Source/WebCore/html/CustomPaintCanvas.h | 1 webkit2gtk-2.52.5/Source/WebCore/html/HTMLCanvasElement.cpp | 138 webkit2gtk-2.52.5/Source/WebCore/html/HTMLCanvasElement.h | 11 webkit2gtk-2.52.5/Source/WebCore/html/HTMLCanvasElement.idl | 2 webkit2gtk-2.52.5/Source/WebCore/html/HTMLDetailsElement.cpp | 9 webkit2gtk-2.52.5/Source/WebCore/html/HTMLDetailsElement.h | 3 webkit2gtk-2.52.5/Source/WebCore/html/HTMLDialogElement.cpp | 18 webkit2gtk-2.52.5/Source/WebCore/html/HTMLDialogElement.h | 3 webkit2gtk-2.52.5/Source/WebCore/html/HTMLMediaElement.cpp | 18 webkit2gtk-2.52.5/Source/WebCore/html/HTMLMediaElement.h | 5 webkit2gtk-2.52.5/Source/WebCore/html/HTMLOptGroupElement.cpp | 1 webkit2gtk-2.52.5/Source/WebCore/html/HTMLOptionElement.cpp | 1 webkit2gtk-2.52.5/Source/WebCore/html/HTMLPlugInElement.cpp | 20 webkit2gtk-2.52.5/Source/WebCore/html/HTMLSelectElement.cpp | 124 webkit2gtk-2.52.5/Source/WebCore/html/HTMLSelectElement.h | 40 webkit2gtk-2.52.5/Source/WebCore/html/ImageBitmap.cpp | 8 webkit2gtk-2.52.5/Source/WebCore/html/ImageBitmap.h | 1 webkit2gtk-2.52.5/Source/WebCore/html/ImageDocument.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/html/OffscreenCanvas.cpp | 103 webkit2gtk-2.52.5/Source/WebCore/html/OffscreenCanvas.h | 16 webkit2gtk-2.52.5/Source/WebCore/html/OffscreenCanvas.idl | 2 webkit2gtk-2.52.5/Source/WebCore/html/TextFieldInputType.cpp | 49 webkit2gtk-2.52.5/Source/WebCore/html/TextFieldInputType.h | 17 webkit2gtk-2.52.5/Source/WebCore/html/canvas/CanvasRenderingContext.cpp | 42 webkit2gtk-2.52.5/Source/WebCore/html/canvas/CanvasRenderingContext.h | 17 webkit2gtk-2.52.5/Source/WebCore/html/canvas/CanvasRenderingContext2D.idl | 2 webkit2gtk-2.52.5/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp | 146 webkit2gtk-2.52.5/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.h | 19 webkit2gtk-2.52.5/Source/WebCore/html/canvas/EXTDisjointTimerQuery.cpp | 6 webkit2gtk-2.52.5/Source/WebCore/html/canvas/GPUBasedCanvasRenderingContext.h | 1 webkit2gtk-2.52.5/Source/WebCore/html/canvas/GPUCanvasContext.idl | 2 webkit2gtk-2.52.5/Source/WebCore/html/canvas/GPUCanvasContextCocoa.h | 7 webkit2gtk-2.52.5/Source/WebCore/html/canvas/ImageBitmapRenderingContext.cpp | 125 webkit2gtk-2.52.5/Source/WebCore/html/canvas/ImageBitmapRenderingContext.h | 17 webkit2gtk-2.52.5/Source/WebCore/html/canvas/ImageBitmapRenderingContext.idl | 2 webkit2gtk-2.52.5/Source/WebCore/html/canvas/OESVertexArrayObject.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/html/canvas/OESVertexArrayObject.h | 2 webkit2gtk-2.52.5/Source/WebCore/html/canvas/OESVertexArrayObject.idl | 2 webkit2gtk-2.52.5/Source/WebCore/html/canvas/OffscreenCanvasRenderingContext2D.cpp | 6 webkit2gtk-2.52.5/Source/WebCore/html/canvas/OffscreenCanvasRenderingContext2D.idl | 2 webkit2gtk-2.52.5/Source/WebCore/html/canvas/PaintRenderingContext2D.cpp | 36 webkit2gtk-2.52.5/Source/WebCore/html/canvas/PaintRenderingContext2D.h | 8 webkit2gtk-2.52.5/Source/WebCore/html/canvas/PlaceholderRenderingContext.cpp | 39 webkit2gtk-2.52.5/Source/WebCore/html/canvas/PlaceholderRenderingContext.h | 5 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp | 44 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGL2RenderingContext.h | 12 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGL2RenderingContext.idl | 11 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLBuffer.cpp | 11 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLBuffer.h | 4 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLFramebuffer.cpp | 16 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLFramebuffer.h | 4 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLObject.h | 2 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLProgram.cpp | 19 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLProgram.h | 4 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLQuery.cpp | 13 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLQuery.h | 4 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderbuffer.cpp | 12 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderbuffer.h | 4 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderingContext.h | 2 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderingContext.idl | 2 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp | 145 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderingContextBase.h | 23 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderingContextBase.idl | 10 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLSampler.cpp | 11 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLSampler.h | 6 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLShader.cpp | 14 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLShader.h | 4 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLSync.cpp | 16 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLSync.h | 6 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLTexture.cpp | 11 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLTexture.h | 5 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLTransformFeedback.cpp | 11 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLTransformFeedback.h | 5 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLVertexArrayObject.cpp | 12 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLVertexArrayObject.h | 4 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLVertexArrayObjectBase.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLVertexArrayObjectBase.h | 4 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLVertexArrayObjectOES.cpp | 11 webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLVertexArrayObjectOES.h | 5 webkit2gtk-2.52.5/Source/WebCore/html/closewatcher/CloseWatcher.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/html/closewatcher/CloseWatcherManager.cpp | 9 webkit2gtk-2.52.5/Source/WebCore/html/shadow/AutoFillButtonElement.cpp | 3 webkit2gtk-2.52.5/Source/WebCore/html/shadow/AutoFillButtonElement.h | 7 webkit2gtk-2.52.5/Source/WebCore/html/shadow/DateTimeEditElement.cpp | 42 webkit2gtk-2.52.5/Source/WebCore/html/shadow/DateTimeEditElement.h | 14 webkit2gtk-2.52.5/Source/WebCore/html/track/InbandDataTextTrack.h | 1 webkit2gtk-2.52.5/Source/WebCore/html/track/InbandGenericTextTrack.h | 1 webkit2gtk-2.52.5/Source/WebCore/html/track/InbandTextTrack.h | 1 webkit2gtk-2.52.5/Source/WebCore/html/track/InbandWebVTTTextTrack.h | 1 webkit2gtk-2.52.5/Source/WebCore/html/track/LoadableTextTrack.h | 1 webkit2gtk-2.52.5/Source/WebCore/html/track/TextTrack.h | 4 webkit2gtk-2.52.5/Source/WebCore/html/track/TextTrackCue.cpp | 29 webkit2gtk-2.52.5/Source/WebCore/html/track/TextTrackCue.h | 7 webkit2gtk-2.52.5/Source/WebCore/html/track/TrackBase.cpp | 6 webkit2gtk-2.52.5/Source/WebCore/html/track/TrackBase.h | 4 webkit2gtk-2.52.5/Source/WebCore/inspector/InspectorCanvas.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/inspector/InspectorInstrumentation.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/inspector/InspectorInstrumentation.h | 6 webkit2gtk-2.52.5/Source/WebCore/inspector/agents/InspectorCSSAgent.cpp | 14 webkit2gtk-2.52.5/Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp | 6 webkit2gtk-2.52.5/Source/WebCore/inspector/agents/InspectorCanvasAgent.h | 4 webkit2gtk-2.52.5/Source/WebCore/inspector/agents/InspectorLayerTreeAgent.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/layout/formattingContexts/FormattingGeometry.cpp | 1 webkit2gtk-2.52.5/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp | 16 webkit2gtk-2.52.5/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContent.cpp | 9 webkit2gtk-2.52.5/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContent.h | 1 webkit2gtk-2.52.5/Source/WebCore/layout/integration/grid/LayoutIntegrationGridLayout.cpp | 7 webkit2gtk-2.52.5/Source/WebCore/layout/integration/grid/LayoutIntegrationGridLayout.h | 1 webkit2gtk-2.52.5/Source/WebCore/loader/DocumentLoader.cpp | 46 webkit2gtk-2.52.5/Source/WebCore/loader/DocumentWriter.cpp | 1 webkit2gtk-2.52.5/Source/WebCore/loader/FetchOptions.h | 9 webkit2gtk-2.52.5/Source/WebCore/loader/FrameLoader.cpp | 22 webkit2gtk-2.52.5/Source/WebCore/loader/HistoryController.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/loader/NavigationAction.cpp | 14 webkit2gtk-2.52.5/Source/WebCore/loader/NavigationAction.h | 3 webkit2gtk-2.52.5/Source/WebCore/loader/ResourceMonitor.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/loader/SubframeLoader.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/mathml/MathMLScriptsElement.cpp | 1 webkit2gtk-2.52.5/Source/WebCore/page/ChromeClient.h | 2 webkit2gtk-2.52.5/Source/WebCore/page/DOMTimer.h | 2 webkit2gtk-2.52.5/Source/WebCore/page/FocusController.cpp | 19 webkit2gtk-2.52.5/Source/WebCore/page/Frame.cpp | 8 webkit2gtk-2.52.5/Source/WebCore/page/Frame.h | 1 webkit2gtk-2.52.5/Source/WebCore/page/FrameTree.cpp | 3 webkit2gtk-2.52.5/Source/WebCore/page/LocalDOMWindow.cpp | 12 webkit2gtk-2.52.5/Source/WebCore/page/LocalFrameView.cpp | 6 webkit2gtk-2.52.5/Source/WebCore/page/LocalFrameViewLayoutContext.cpp | 8 webkit2gtk-2.52.5/Source/WebCore/page/NavigateEvent.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/page/Navigation.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/page/Quirks.cpp | 51 webkit2gtk-2.52.5/Source/WebCore/page/Quirks.h | 2 webkit2gtk-2.52.5/Source/WebCore/page/QuirksData.h | 2 webkit2gtk-2.52.5/Source/WebCore/page/SocketProvider.h | 3 webkit2gtk-2.52.5/Source/WebCore/page/csp/ContentSecurityPolicy.cpp | 8 webkit2gtk-2.52.5/Source/WebCore/page/csp/ContentSecurityPolicyResponseHeaders.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/page/csp/ContentSecurityPolicySource.cpp | 55 webkit2gtk-2.52.5/Source/WebCore/page/csp/ContentSecurityPolicySourceList.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/page/linux/ResourceUsageThreadLinux.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/page/scrolling/ScrollingStateNode.h | 14 webkit2gtk-2.52.5/Source/WebCore/page/scrolling/ThreadedScrollingTree.cpp | 6 webkit2gtk-2.52.5/Source/WebCore/page/scrolling/ThreadedScrollingTree.h | 1 webkit2gtk-2.52.5/Source/WebCore/page/text-extraction/TextExtraction.cpp | 19 webkit2gtk-2.52.5/Source/WebCore/platform/FileStreamClient.h | 1 webkit2gtk-2.52.5/Source/WebCore/platform/GStreamer.cmake | 1 webkit2gtk-2.52.5/Source/WebCore/platform/LayoutUnit.h | 6 webkit2gtk-2.52.5/Source/WebCore/platform/PlatformScreen.cpp | 75 webkit2gtk-2.52.5/Source/WebCore/platform/PlatformScreen.h | 46 webkit2gtk-2.52.5/Source/WebCore/platform/ScreenProperties.h | 13 webkit2gtk-2.52.5/Source/WebCore/platform/ScrollView.cpp | 3 webkit2gtk-2.52.5/Source/WebCore/platform/SharedBufferChunkReader.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/SourcesSkia.txt | 2 webkit2gtk-2.52.5/Source/WebCore/platform/animation/AnimationUtilities.h | 13 webkit2gtk-2.52.5/Source/WebCore/platform/audio/AudioResamplerKernel.cpp | 3 webkit2gtk-2.52.5/Source/WebCore/platform/audio/FFTFrame.h | 4 webkit2gtk-2.52.5/Source/WebCore/platform/audio/gstreamer/AudioDecoderGStreamer.cpp | 10 webkit2gtk-2.52.5/Source/WebCore/platform/audio/gstreamer/FFTFrameGStreamer.cpp | 8 webkit2gtk-2.52.5/Source/WebCore/platform/encryptedmedia/CDMPrivate.cpp | 8 webkit2gtk-2.52.5/Source/WebCore/platform/encryptedmedia/CDMProxy.h | 3 webkit2gtk-2.52.5/Source/WebCore/platform/generic/ScrollbarsControllerGeneric.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/platform/generic/ScrollbarsControllerGeneric.h | 1 webkit2gtk-2.52.5/Source/WebCore/platform/glib/UserAgentGLib.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/glib/UserAgentQuirks.cpp | 21 webkit2gtk-2.52.5/Source/WebCore/platform/glib/UserAgentQuirks.h | 1 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/AV1Utilities.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/DestinationColorSpace.cpp | 10 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/DestinationColorSpace.h | 1 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/DoublePoint.h | 4 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/FloatPoint.h | 10 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/FloatSize.h | 8 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/FontCascade.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/FormatConverter.cpp | 37 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/GraphicsContext.cpp | 10 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/GraphicsContextSwitcher.h | 3 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/GraphicsLayerAnimation.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/Image.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/ImageBuffer.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/ImageBuffer.h | 1 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/ImageBufferContextSwitcher.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/ImageBufferContextSwitcher.h | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/ImageBufferDisplayListBackend.h | 4 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/IntPoint.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/IntRect.cpp | 13 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/IntSize.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/IntSize.h | 5 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/MIMESniffer.cpp | 6 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/MIMETypeCache.cpp | 49 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/MIMETypeCache.h | 13 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/MediaPlayer.cpp | 18 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/MediaPlayer.h | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/PixelBufferConversion.cpp | 32 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/Region.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/ShadowBlur.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/SourceBufferPrivate.cpp | 8 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/TrackPrivateBase.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/TransparencyLayerContextSwitcher.cpp | 18 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/TransparencyLayerContextSwitcher.h | 3 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/WOFFFileFormat.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/angle/GraphicsContextGLANGLE.cpp | 43 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/controls/ControlFactory.h | 4 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/cpu/arm/filters/FEBlendNeonApplier.cpp | 3 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/displaylists/DisplayListItem.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/displaylists/DisplayListItems.h | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/egl/GLContext.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/FEColorMatrix.cpp | 17 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/FEColorMatrix.h | 1 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/FilterImage.cpp | 55 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/FilterImage.h | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/software/FEGaussianBlurSoftwareApplier.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/software/FEMorphologySoftwareApplier.cpp | 122 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/software/FEMorphologySoftwareApplier.h | 29 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/software/FilterEffectSoftwareParallelApplier.h | 111 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.cpp | 78 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.h | 24 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/GLVideoSinkGStreamer.cpp | 7 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.cpp | 16 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.h | 3 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/GStreamerRegistryScanner.cpp | 165 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/GStreamerVideoSinkCommon.cpp | 11 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/GStreamerVideoSinkCommon.h | 1 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp | 49 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h | 13 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp | 302 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h | 16 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp | 373 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h | 134 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.h | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.cpp | 89 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.h | 22 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/CDMProxyThunder.cpp | 34 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/CDMProxyThunder.h | 4 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/CDMThunder.cpp | 14 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/GStreamerEMEUtilities.h | 6 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp | 24 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.h | 6 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/WebKitThunderDecryptorGStreamer.cpp | 13 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp | 76 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.h | 4 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.cpp | 14 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.h | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourceTrackGStreamer.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourceTrackGStreamer.h | 8 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/SourceBufferPrivateGStreamer.cpp | 19 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/TrackQueue.h | 6 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp | 44 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/skia/ComplexTextControllerSkia.cpp | 3 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/skia/FontCascadeSkia.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/skia/FontSkia.cpp | 12 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/texmap/GraphicsContextGLTextureMapperANGLE.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/texmap/TextureMapper.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/texmap/TextureMapperShaderProgram.cpp | 47 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/texmap/coordinated/GraphicsLayerCoordinated.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/transforms/TransformOperation.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/graphics/x11/XErrorTrapper.h | 3 webkit2gtk-2.52.5/Source/WebCore/platform/gstreamer/WebKitFliteSourceGStreamer.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/gtk/PlatformScreenGtk.cpp | 21 webkit2gtk-2.52.5/Source/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/MediaStreamTrackDataHolder.cpp | 7 webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/MediaStreamTrackDataHolder.h | 1 webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/RealtimeIncomingAudioSource.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/DesktopPortal.h | 1 webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/GStreamerCaptureDeviceManager.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/GStreamerIncomingTrackProcessor.h | 2 webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/GStreamerWebRTCCommon.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/RealtimeOutgoingMediaSourceGStreamer.cpp | 57 webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/RealtimeOutgoingMediaSourceGStreamer.h | 2 webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingAudioSourceLibWebRTC.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingAudioSourceLibWebRTC.h | 1 webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.h | 2 webkit2gtk-2.52.5/Source/WebCore/platform/mock/mediasource/MockBox.cpp | 8 webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobData.cpp | 1 webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobData.h | 2 webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobDataFileReference.cpp | 1 webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobDataFileReference.h | 2 webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobResourceHandle.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobResourceHandleBase.cpp | 19 webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobResourceHandleBase.h | 10 webkit2gtk-2.52.5/Source/WebCore/platform/network/HTTPHeaderMap.h | 12 webkit2gtk-2.52.5/Source/WebCore/platform/network/ParsedContentType.h | 4 webkit2gtk-2.52.5/Source/WebCore/platform/network/ResourceRequestBase.cpp | 8 webkit2gtk-2.52.5/Source/WebCore/platform/network/soup/NetworkStorageSessionSoup.cpp | 3 webkit2gtk-2.52.5/Source/WebCore/platform/network/soup/SoupNetworkSession.cpp | 9 webkit2gtk-2.52.5/Source/WebCore/platform/rice/GRefPtrRice.h | 6 webkit2gtk-2.52.5/Source/WebCore/platform/rice/GUniquePtrRice.h | 4 webkit2gtk-2.52.5/Source/WebCore/platform/rice/RiceUtilities.h | 9 webkit2gtk-2.52.5/Source/WebCore/platform/rice/RiceVersioning.h | 32 webkit2gtk-2.52.5/Source/WebCore/platform/text/hyphen/HyphenationLibHyphen.cpp | 3 webkit2gtk-2.52.5/Source/WebCore/rendering/EventRegion.cpp | 3 webkit2gtk-2.52.5/Source/WebCore/rendering/OutlinePainter.cpp | 1 webkit2gtk-2.52.5/Source/WebCore/rendering/RenderBlockFlow.cpp | 8 webkit2gtk-2.52.5/Source/WebCore/rendering/RenderBox.cpp | 53 webkit2gtk-2.52.5/Source/WebCore/rendering/RenderBox.h | 6 webkit2gtk-2.52.5/Source/WebCore/rendering/RenderElement.cpp | 19 webkit2gtk-2.52.5/Source/WebCore/rendering/RenderElement.h | 3 webkit2gtk-2.52.5/Source/WebCore/rendering/RenderFlexibleBox.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/rendering/RenderLayer.cpp | 84 webkit2gtk-2.52.5/Source/WebCore/rendering/RenderLayer.h | 2 webkit2gtk-2.52.5/Source/WebCore/rendering/RenderLayerBacking.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/rendering/RenderLayerCompositor.cpp | 1 webkit2gtk-2.52.5/Source/WebCore/rendering/RenderLayerFilters.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/rendering/RenderLayerFilters.h | 2 webkit2gtk-2.52.5/Source/WebCore/rendering/RenderLayerScrollableArea.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/rendering/RenderMenuList.cpp | 74 webkit2gtk-2.52.5/Source/WebCore/rendering/RenderMenuList.h | 18 webkit2gtk-2.52.5/Source/WebCore/rendering/svg/RenderSVGBlock.cpp | 1 webkit2gtk-2.52.5/Source/WebCore/style/MatchedDeclarationsCache.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/style/StyleAdjuster.cpp | 4 webkit2gtk-2.52.5/Source/WebCore/style/StyleDifference.cpp | 14 webkit2gtk-2.52.5/Source/WebCore/style/StyleTreeResolver.cpp | 7 webkit2gtk-2.52.5/Source/WebCore/style/values/filter-effects/StyleFilter.cpp | 9 webkit2gtk-2.52.5/Source/WebCore/style/values/filter-effects/StyleFilter.h | 2 webkit2gtk-2.52.5/Source/WebCore/style/values/primitives/StylePrimitiveNumericTypes+Conversions.h | 48 webkit2gtk-2.52.5/Source/WebCore/svg/SVGFEColorMatrixElement.cpp | 18 webkit2gtk-2.52.5/Source/WebCore/svg/SVGFEColorMatrixElement.h | 2 webkit2gtk-2.52.5/Source/WebCore/svg/SVGGeometryElement.cpp | 35 webkit2gtk-2.52.5/Source/WebCore/svg/SVGGeometryElement.h | 3 webkit2gtk-2.52.5/Source/WebCore/testing/Internals.cpp | 38 webkit2gtk-2.52.5/Source/WebCore/testing/Internals.h | 10 webkit2gtk-2.52.5/Source/WebCore/testing/Internals.idl | 6 webkit2gtk-2.52.5/Source/WebCore/testing/MockCDMFactory.cpp | 20 webkit2gtk-2.52.5/Source/WebCore/testing/MockCDMFactory.h | 18 webkit2gtk-2.52.5/Source/WebCore/testing/MockCDMFactory.idl | 1 webkit2gtk-2.52.5/Source/WebCore/testing/WebXRTest.cpp | 17 webkit2gtk-2.52.5/Source/WebCore/testing/WebXRTest.h | 5 webkit2gtk-2.52.5/Source/WebCore/testing/WebXRTest.idl | 6 webkit2gtk-2.52.5/Source/WebCore/workers/WorkerGlobalScope.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/workers/WorkerGlobalScope.h | 2 webkit2gtk-2.52.5/Source/WebCore/workers/WorkerMessagingProxy.cpp | 8 webkit2gtk-2.52.5/Source/WebCore/workers/WorkerOrWorkletGlobalScope.cpp | 6 webkit2gtk-2.52.5/Source/WebCore/workers/WorkerOrWorkletGlobalScope.h | 3 webkit2gtk-2.52.5/Source/WebCore/workers/service/background-fetch/BackgroundFetchRegistration.cpp | 5 webkit2gtk-2.52.5/Source/WebCore/workers/service/server/SWServer.cpp | 9 webkit2gtk-2.52.5/Source/WebCore/workers/service/server/SWServer.h | 2 webkit2gtk-2.52.5/Source/WebCore/workers/service/server/SWServerWorker.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/workers/shared/SharedWorkerScriptLoader.cpp | 11 webkit2gtk-2.52.5/Source/WebCore/worklets/PaintWorkletGlobalScope.cpp | 2 webkit2gtk-2.52.5/Source/WebCore/worklets/WorkletGlobalScope.cpp | 1 webkit2gtk-2.52.5/Source/WebCore/worklets/WorkletParameters.h | 6 webkit2gtk-2.52.5/Source/WebCore/xml/XMLHttpRequest.cpp | 72 webkit2gtk-2.52.5/Source/WebCore/xml/XMLHttpRequest.h | 9 webkit2gtk-2.52.5/Source/WebCore/xml/XPathResult.cpp | 40 webkit2gtk-2.52.5/Source/WebCore/xml/XPathResult.h | 7 webkit2gtk-2.52.5/Source/WebCore/xml/XSLStyleSheet.h | 8 webkit2gtk-2.52.5/Source/WebCore/xml/XSLStyleSheetLibxslt.cpp | 23 webkit2gtk-2.52.5/Source/WebCore/xml/XSLTProcessorLibxslt.cpp | 7 webkit2gtk-2.52.5/Source/WebCore/xml/parser/XMLDocumentParserLibxml2.cpp | 17 webkit2gtk-2.52.5/Source/WebGPU/WGSL/CMakeLists.txt | 2 webkit2gtk-2.52.5/Source/WebInspectorUI/UserInterface/Controllers/LayerTreeManager.js | 2 webkit2gtk-2.52.5/Source/WebInspectorUI/UserInterface/Views/FolderizedTreeElement.js | 2 webkit2gtk-2.52.5/Source/WebKit/CMakeLists.txt | 12 webkit2gtk-2.52.5/Source/WebKit/DerivedSources-input.xcfilelist | 1 webkit2gtk-2.52.5/Source/WebKit/DerivedSources.make | 1 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/RemoteGraphicsContextGL.cpp | 33 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/RemoteImageBuffer.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/RemoteImageBufferSet.cpp | 1 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/WebGPU/RemoteAdapter.h | 4 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/WebGPU/RemoteBindGroup.h | 2 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/WebGPU/RemoteCommandEncoder.h | 4 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/WebGPU/RemoteCompositorIntegration.h | 4 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/WebGPU/RemoteComputePassEncoder.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/WebGPU/RemoteComputePipeline.h | 4 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/WebGPU/RemoteDevice.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/WebGPU/RemoteDevice.h | 2 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/WebGPU/RemotePresentationContext.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/WebGPU/RemotePresentationContext.h | 2 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/WebGPU/RemoteQueue.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/WebGPU/RemoteRenderBundleEncoder.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/WebGPU/RemoteRenderBundleEncoder.h | 2 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/WebGPU/RemoteRenderPassEncoder.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/WebGPU/RemoteRenderPassEncoder.h | 2 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/WebGPU/RemoteRenderPipeline.h | 4 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/graphics/WebGPU/RemoteShaderModule.h | 4 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.cpp | 6 webkit2gtk-2.52.5/Source/WebKit/GPUProcess/webrtc/UserMediaCaptureManagerProxy.cpp | 7 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/BackgroundFetchLoad.cpp | 7 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/Classifier/WebResourceLoadStatisticsStore.cpp | 9 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/Classifier/WebResourceLoadStatisticsStore.h | 2 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/NetworkBroadcastChannelRegistry.cpp | 16 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/NetworkBroadcastChannelRegistry.h | 2 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp | 186 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h | 11 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in | 17 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/NetworkDataTaskBlob.cpp | 9 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/NetworkLoadChecker.cpp | 15 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/NetworkProcess.cpp | 15 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h | 1 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.serialization.in | 1 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.h | 1 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.serialization.in | 2 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp | 76 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/NetworkResourceLoader.h | 5 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/PreconnectRequest.h | 50 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/PreconnectRequest.serialization.in | 34 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/PreconnectTask.cpp | 6 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp | 25 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.h | 2 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/SharedWorker/WebSharedWorkerServer.cpp | 6 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/cache/NetworkCacheStorage.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/storage/CacheStorageCache.cpp | 92 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/storage/CacheStorageCache.h | 18 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/storage/IDBStorageConnectionToClient.cpp | 47 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/storage/IDBStorageConnectionToClient.h | 6 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/storage/IDBStorageRegistry.cpp | 52 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/storage/IDBStorageRegistry.h | 12 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp | 182 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h | 53 webkit2gtk-2.52.5/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp | 30 webkit2gtk-2.52.5/Source/WebKit/Platform/IPC/Connection.cpp | 12 webkit2gtk-2.52.5/Source/WebKit/Platform/IPC/Connection.h | 3 webkit2gtk-2.52.5/Source/WebKit/Platform/IPC/MessageReceiverMap.cpp | 23 webkit2gtk-2.52.5/Source/WebKit/Platform/IPC/TransferString.cpp | 6 webkit2gtk-2.52.5/Source/WebKit/Scripts/webkit/messages.py | 3 webkit2gtk-2.52.5/Source/WebKit/Shared/Extensions/WebExtensionRegisteredScriptsSQLiteStore.cpp | 15 webkit2gtk-2.52.5/Source/WebKit/Shared/Extensions/WebExtensionRegisteredScriptsSQLiteStore.h | 2 webkit2gtk-2.52.5/Source/WebKit/Shared/Extensions/WebExtensionSQLiteDatabase.h | 3 webkit2gtk-2.52.5/Source/WebKit/Shared/FrameInfoData.cpp | 4 webkit2gtk-2.52.5/Source/WebKit/Shared/FrameInfoData.h | 1 webkit2gtk-2.52.5/Source/WebKit/Shared/FrameInfoData.serialization.in | 1 webkit2gtk-2.52.5/Source/WebKit/Shared/LogStream.cpp | 33 webkit2gtk-2.52.5/Source/WebKit/Shared/NavigationActionData.h | 1 webkit2gtk-2.52.5/Source/WebKit/Shared/NavigationActionData.serialization.in | 1 webkit2gtk-2.52.5/Source/WebKit/Shared/NetworkProcessConnectionParameters.h | 4 webkit2gtk-2.52.5/Source/WebKit/Shared/NetworkProcessConnectionParameters.serialization.in | 2 webkit2gtk-2.52.5/Source/WebKit/Shared/RTCPacketOptions.cpp | 1 webkit2gtk-2.52.5/Source/WebKit/Shared/WebBackForwardListFrameItem.h | 4 webkit2gtk-2.52.5/Source/WebKit/Shared/WebContextMenuItem.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/Shared/WebCoreArgumentCoders.serialization.in | 8 webkit2gtk-2.52.5/Source/WebKit/Shared/WebProcessCreationParameters.h | 2 webkit2gtk-2.52.5/Source/WebKit/Shared/WebProcessCreationParameters.serialization.in | 2 webkit2gtk-2.52.5/Source/WebKit/Shared/WebPushDaemonConstants.h | 5 webkit2gtk-2.52.5/Source/WebKit/Shared/WebPushMessage.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/Shared/glib/ArgumentCodersGLib.cpp | 4 webkit2gtk-2.52.5/Source/WebKit/Shared/glib/JavaScriptEvaluationResultGLib.cpp | 20 webkit2gtk-2.52.5/Source/WebKit/Shared/linux/WebMemorySamplerLinux.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/SourcesGTK.txt | 2 webkit2gtk-2.52.5/Source/WebKit/UIProcess/API/APIContentRuleListStore.cpp | 53 webkit2gtk-2.52.5/Source/WebKit/UIProcess/API/APIContentRuleListStore.h | 2 webkit2gtk-2.52.5/Source/WebKit/UIProcess/API/APIHTTPCookieStore.cpp | 4 webkit2gtk-2.52.5/Source/WebKit/UIProcess/API/APINavigation.h | 2 webkit2gtk-2.52.5/Source/WebKit/UIProcess/API/C/WKWebsiteDataStoreConfigurationRef.cpp | 10 webkit2gtk-2.52.5/Source/WebKit/UIProcess/API/C/WKWebsiteDataStoreConfigurationRef.h | 3 webkit2gtk-2.52.5/Source/WebKit/UIProcess/API/glib/WebKitDownload.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/UIProcess/API/glib/WebKitFeature.h.in | 4 webkit2gtk-2.52.5/Source/WebKit/UIProcess/API/glib/WebKitFormSubmissionRequest.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/UIProcess/API/glib/WebKitProtocolHandler.cpp | 8 webkit2gtk-2.52.5/Source/WebKit/UIProcess/API/glib/WebKitSecurityOrigin.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp | 11 webkit2gtk-2.52.5/Source/WebKit/UIProcess/API/gtk/DropTargetGtk3.cpp | 4 webkit2gtk-2.52.5/Source/WebKit/UIProcess/API/gtk/DropTargetGtk4.cpp | 6 webkit2gtk-2.52.5/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp | 4 webkit2gtk-2.52.5/Source/WebKit/UIProcess/Extensions/API/WebExtensionContextAPIStorage.cpp | 8 webkit2gtk-2.52.5/Source/WebKit/UIProcess/Extensions/WebExtensionContext.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/UIProcess/Extensions/WebExtensionController.cpp | 6 webkit2gtk-2.52.5/Source/WebKit/UIProcess/Extensions/WebExtensionController.h | 2 webkit2gtk-2.52.5/Source/WebKit/UIProcess/Extensions/WebExtensionDeclarativeNetRequestSQLiteStore.cpp | 46 webkit2gtk-2.52.5/Source/WebKit/UIProcess/Extensions/WebExtensionDeclarativeNetRequestSQLiteStore.h | 2 webkit2gtk-2.52.5/Source/WebKit/UIProcess/Inspector/WebInspectorUIProxy.h | 8 webkit2gtk-2.52.5/Source/WebKit/UIProcess/Launcher/glib/BubblewrapLauncher.cpp | 5 webkit2gtk-2.52.5/Source/WebKit/UIProcess/Launcher/glib/XDGDBusProxy.cpp | 4 webkit2gtk-2.52.5/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp | 6 webkit2gtk-2.52.5/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp | 8 webkit2gtk-2.52.5/Source/WebKit/UIProcess/RemoteLayerTree/RemoteScrollingTree.cpp | 5 webkit2gtk-2.52.5/Source/WebKit/UIProcess/RemoteLayerTree/RemoteScrollingTree.h | 3 webkit2gtk-2.52.5/Source/WebKit/UIProcess/RemotePageProxy.cpp | 5 webkit2gtk-2.52.5/Source/WebKit/UIProcess/RemotePageVisitedLinkStoreRegistration.h | 2 webkit2gtk-2.52.5/Source/WebKit/UIProcess/SpeechRecognitionServer.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/UIProcess/SuspendedPageProxy.cpp | 3 webkit2gtk-2.52.5/Source/WebKit/UIProcess/WebBackForwardList.cpp | 45 webkit2gtk-2.52.5/Source/WebKit/UIProcess/WebBackForwardList.h | 4 webkit2gtk-2.52.5/Source/WebKit/UIProcess/WebFrameProxy.cpp | 66 webkit2gtk-2.52.5/Source/WebKit/UIProcess/WebFrameProxy.h | 6 webkit2gtk-2.52.5/Source/WebKit/UIProcess/WebLockRegistryProxy.cpp | 13 webkit2gtk-2.52.5/Source/WebKit/UIProcess/WebPageProxy.cpp | 127 webkit2gtk-2.52.5/Source/WebKit/UIProcess/WebPageProxy.h | 6 webkit2gtk-2.52.5/Source/WebKit/UIProcess/WebPageProxy.messages.in | 4 webkit2gtk-2.52.5/Source/WebKit/UIProcess/WebPermissionControllerProxy.cpp | 4 webkit2gtk-2.52.5/Source/WebKit/UIProcess/WebProcessPool.cpp | 23 webkit2gtk-2.52.5/Source/WebKit/UIProcess/WebProcessProxy.cpp | 88 webkit2gtk-2.52.5/Source/WebKit/UIProcess/WebProcessProxy.h | 74 webkit2gtk-2.52.5/Source/WebKit/UIProcess/WebsiteData/EnhancedSecuritySitesPersistence.cpp | 1 webkit2gtk-2.52.5/Source/WebKit/UIProcess/WebsiteData/WebDeviceOrientationAndMotionAccessController.cpp | 12 webkit2gtk-2.52.5/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp | 5 webkit2gtk-2.52.5/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStoreConfiguration.h | 4 webkit2gtk-2.52.5/Source/WebKit/UIProcess/glib/ScreenManager.cpp | 8 webkit2gtk-2.52.5/Source/WebKit/UIProcess/glib/ScreenManager.h | 18 webkit2gtk-2.52.5/Source/WebKit/UIProcess/glib/WebProcessProxyGLib.cpp | 5 webkit2gtk-2.52.5/Source/WebKit/UIProcess/gtk/ClipboardGtk3.cpp | 4 webkit2gtk-2.52.5/Source/WebKit/UIProcess/gtk/ScreenManagerGtk.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h | 13 webkit2gtk-2.52.5/Source/WebKit/WebProcess/Geolocation/WebGeolocationManager.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/glib/DOM/WebKitDOMDocument.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/glib/DOM/WebKitDOMElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/glib/DOM/WebKitDOMNode.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/glib/DOM/WebKitDOMObject.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/GObjectEventListener.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMAttr.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMBlob.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMCDATASection.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMCSSRule.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMCSSRuleList.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMCSSStyleDeclaration.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMCSSStyleSheet.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMCSSValue.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMCharacterData.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMClientRect.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMClientRectList.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMComment.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMDOMImplementation.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMDOMSelection.cpp | 3 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMDOMTokenList.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMDOMWindow.cpp | 3 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMDeprecated.cpp | 4 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMDocumentFragment.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMDocumentType.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMEvent.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMEventTarget.h | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMFile.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMFileList.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLAnchorElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLAppletElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLAreaElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLBRElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLBaseElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLBodyElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLButtonElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLCanvasElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLCollection.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLDListElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLDirectoryElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLDivElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLDocument.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLEmbedElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLFieldSetElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLFontElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLFormElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLFrameElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLFrameSetElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLHRElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLHeadElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLHeadingElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLHtmlElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLIFrameElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLImageElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLInputElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLLIElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLLabelElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLLegendElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLLinkElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLMapElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLMarqueeElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLMenuElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLMetaElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLModElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLOListElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLObjectElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLOptGroupElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLOptionElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLOptionsCollection.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLParagraphElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLParamElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLPreElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLQuoteElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLScriptElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLSelectElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLStyleElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLTableCaptionElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLTableCellElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLTableColElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLTableElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLTableRowElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLTableSectionElement.cpp | 4 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLTextAreaElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLTitleElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMHTMLUListElement.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMKeyboardEvent.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMMediaList.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMMouseEvent.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMNamedNodeMap.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMNodeFilter.h | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMNodeIterator.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMNodeList.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMProcessingInstruction.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMRange.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMStyleSheet.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMStyleSheetList.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMText.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMTreeWalker.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMUIEvent.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMWheelEvent.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMXPathExpression.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMXPathNSResolver.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMXPathNSResolver.h | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMXPathResult.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp | 56 webkit2gtk-2.52.5/Source/WebKit/WebProcess/Network/WebSocketChannel.cpp | 19 webkit2gtk-2.52.5/Source/WebKit/WebProcess/Network/WebSocketChannel.h | 1 webkit2gtk-2.52.5/Source/WebKit/WebProcess/Network/WebSocketProvider.cpp | 6 webkit2gtk-2.52.5/Source/WebKit/WebProcess/Network/WebSocketProvider.h | 1 webkit2gtk-2.52.5/Source/WebKit/WebProcess/Network/webrtc/WebRTCResolver.cpp | 1 webkit2gtk-2.52.5/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp | 12 webkit2gtk-2.52.5/Source/WebKit/WebProcess/Storage/WebSharedWorkerContextManagerConnection.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/WebCoreSupport/WebBroadcastChannelRegistry.cpp | 10 webkit2gtk-2.52.5/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.cpp | 14 webkit2gtk-2.52.5/Source/WebKit/WebProcess/WebCoreSupport/WebChromeClient.h | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/WebCoreSupport/WebLocalFrameLoaderClient.cpp | 20 webkit2gtk-2.52.5/Source/WebKit/WebProcess/WebCoreSupport/WebMessagePortChannelProvider.cpp | 21 webkit2gtk-2.52.5/Source/WebKit/WebProcess/WebCoreSupport/WebMessagePortChannelProvider.h | 3 webkit2gtk-2.52.5/Source/WebKit/WebProcess/WebCoreSupport/WebRemoteFrameClient.cpp | 10 webkit2gtk-2.52.5/Source/WebKit/WebProcess/WebPage/DrawingArea.h | 4 webkit2gtk-2.52.5/Source/WebKit/WebProcess/WebPage/EventDispatcher.cpp | 6 webkit2gtk-2.52.5/Source/WebKit/WebProcess/WebPage/WebCookieJar.cpp | 2 webkit2gtk-2.52.5/Source/WebKit/WebProcess/WebPage/WebFrame.cpp | 1 webkit2gtk-2.52.5/Source/WebKit/WebProcess/WebPage/WebPage.cpp | 22 webkit2gtk-2.52.5/Source/WebKit/WebProcess/WebPage/WebPage.h | 7 webkit2gtk-2.52.5/Source/WebKit/WebProcess/WebPage/WebPage.messages.in | 3 webkit2gtk-2.52.5/Source/WebKit/WebProcess/WebProcess.cpp | 7 webkit2gtk-2.52.5/Source/WebKit/WebProcess/WebProcess.h | 18 webkit2gtk-2.52.5/Source/WebKit/WebProcess/glib/WebProcessGLib.cpp | 10 webkit2gtk-2.52.5/Source/WebKit/gtk/NEWS | 33 webkit2gtk-2.52.5/Source/bmalloc/bmalloc/Gigacage.h | 4 webkit2gtk-2.52.5/Source/bmalloc/libpas/src/libpas/bmalloc_heap_inlines.h | 2 webkit2gtk-2.52.5/Source/bmalloc/libpas/src/libpas/bmalloc_type.c | 6 webkit2gtk-2.52.5/Source/bmalloc/libpas/src/libpas/pas_bitfit_directory.c | 7 webkit2gtk-2.52.5/Source/bmalloc/libpas/src/libpas/pas_config.h | 7 webkit2gtk-2.52.5/Source/bmalloc/libpas/src/libpas/pas_darwin_spi.h | 9 webkit2gtk-2.52.5/Source/bmalloc/libpas/src/libpas/pas_enumerator.c | 6 webkit2gtk-2.52.5/Source/bmalloc/libpas/src/libpas/pas_malloc_stack_logging.c | 8 webkit2gtk-2.52.5/Source/bmalloc/libpas/src/libpas/pas_malloc_stack_logging.h | 7 webkit2gtk-2.52.5/Source/bmalloc/libpas/src/libpas/pas_mar_registry.c | 21 webkit2gtk-2.52.5/Source/bmalloc/libpas/src/libpas/pas_mar_registry.h | 23 webkit2gtk-2.52.5/Source/bmalloc/libpas/src/libpas/pas_race_test_hooks.h | 8 webkit2gtk-2.52.5/Source/bmalloc/libpas/src/libpas/pas_segregated_heap.c | 12 webkit2gtk-2.52.5/Source/bmalloc/libpas/src/libpas/pas_segregated_heap_inlines.h | 25 webkit2gtk-2.52.5/Source/bmalloc/libpas/src/test/BitfitTests.cpp | 81 webkit2gtk-2.52.5/Source/bmalloc/libpas/src/test/EnumerationTests.cpp | 34 webkit2gtk-2.52.5/Source/bmalloc/libpas/src/test/RaceTests.cpp | 83 webkit2gtk-2.52.5/Source/cmake/OptionsGTK.cmake | 21 webkit2gtk-2.52.5/Source/cmake/WebKitCommon.cmake | 17 webkit2gtk-2.52.5/Source/cmake/WebKitCompilerFlags.cmake | 38 webkit2gtk-2.52.5/Source/cmake/WebKitMacros.cmake | 12 webkit2gtk-2.52.5/Tools/PlatformGTK.cmake | 4 webkit2gtk-2.52.5/Tools/TestWebKitAPI/CMakeLists.txt | 3 webkit2gtk-2.52.5/Tools/TestWebKitAPI/SourcesCocoa.txt | 1 webkit2gtk-2.52.5/Tools/TestWebKitAPI/Tests/JavaScriptCore/RegularExpression.cpp | 87 webkit2gtk-2.52.5/Tools/TestWebKitAPI/Tests/WTF/CheckedArithmeticOperations.cpp | 93 webkit2gtk-2.52.5/Tools/TestWebKitAPI/Tests/WTF/FileSystem.cpp | 17 webkit2gtk-2.52.5/Tools/TestWebKitAPI/Tests/WTF/MathExtras.cpp | 44 webkit2gtk-2.52.5/Tools/TestWebKitAPI/Tests/WTF/TruncateFloat.cpp | 500 webkit2gtk-2.52.5/Tools/TestWebKitAPI/Tests/WTF/Vector.cpp | 26 webkit2gtk-2.52.5/Tools/TestWebKitAPI/Tests/WTF/bmalloc/MAR.cpp | 114 webkit2gtk-2.52.5/Tools/TestWebKitAPI/Tests/WebCore/FontCascade.cpp | 23 webkit2gtk-2.52.5/Tools/TestWebKitAPI/Tests/WebCore/IDBKeyData.cpp | 98 webkit2gtk-2.52.5/Tools/TestWebKitAPI/Tests/WebCore/ImageBufferTests.cpp | 35 webkit2gtk-2.52.5/Tools/TestWebKitAPI/Tests/WebCore/MIMESniffer.cpp | 16 webkit2gtk-2.52.5/Tools/TestWebKitAPI/Tests/WebCore/RegionTests.cpp | 9 webkit2gtk-2.52.5/Tools/TestWebKitAPI/Tests/WebCore/UserAgentQuirks.cpp | 22 webkit2gtk-2.52.5/Tools/TestWebKitAPI/Tests/WebCore/glib/GraphicsContextGLTextureMapper.cpp | 8 webkit2gtk-2.52.5/Tools/TestWebKitAPI/Tests/WebCore/gstreamer/GStreamerTest.cpp | 4 webkit2gtk-2.52.5/Tools/TestWebKitAPI/Tests/WebKitCocoa/RemoteObjectRegistry.h | 1 webkit2gtk-2.52.5/Tools/TestWebKitAPI/Tests/WebKitCocoa/autoplay-quirk-pause-fires-once.html | 27 webkit2gtk-2.52.5/Tools/TestWebKitAPI/Tests/WebKitCocoa/coreipc.js | 48 webkit2gtk-2.52.5/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitWebView.cpp | 15 webkit2gtk-2.52.5/Tools/TestWebKitAPI/glib/TestExpectations.json | 11 webkit2gtk-2.52.5/Tools/TestWebKitAPI/glib/WebKitGLib/TestMain.h | 2 webkit2gtk-2.52.5/Tools/glib/generate-pdfjs-resource-manifest.py | 11 webkit2gtk-2.52.5/debian/changelog | 36 webkit2gtk-2.52.5/debian/patches/fix-atomics-detection.patch | 33 webkit2gtk-2.52.5/debian/patches/fix-big-endian-string.patch | 21 webkit2gtk-2.52.5/debian/patches/series | 2 webkit2gtk-2.52.5/debian/rules | 2 2805 files changed, 113764 insertions(+), 60963 deletions(-) dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmp545bvsyv/webkit2gtk_2.52.3-2~deb13u1.dsc: no acceptable signature found dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmp545bvsyv/webkit2gtk_2.52.5-1~deb13u1.dsc: no acceptable signature found diff: /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Source/ThirdParty/skia/src/ports/fontations/Cargo.toml: No such file or directory diff: /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Source/ThirdParty/skia/src/ports/fontations/Cargo.toml: No such file or directory diff -Nru webkit2gtk-2.52.3/CMakeLists.txt webkit2gtk-2.52.5/CMakeLists.txt --- webkit2gtk-2.52.3/CMakeLists.txt 2026-02-23 14:40:48.771337000 +0000 +++ webkit2gtk-2.52.5/CMakeLists.txt 2026-07-09 07:12:41.624806400 +0000 @@ -50,7 +50,9 @@ endif () if (DEVELOPER_MODE) - add_subdirectory(PerformanceTests) + if (EXISTS "${CMAKE_SOURCE_DIR}/PerformanceTests") + add_subdirectory(PerformanceTests) + endif () endif () # ----------------------------------------------------------------------------- Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatDisplay-Black.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Black.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatDisplay-Black.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Black.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatDisplay-BlackItalic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-BlackItalic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatDisplay-BlackItalic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-BlackItalic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatDisplay-Bold.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Bold.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatDisplay-Bold.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Bold.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatDisplay-BoldItalic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-BoldItalic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatDisplay-BoldItalic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-BoldItalic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatDisplay-Italic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Italic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatDisplay-Italic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Italic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatDisplay-Medium.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Medium.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatDisplay-Medium.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Medium.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatDisplay-MediumItalic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-MediumItalic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatDisplay-MediumItalic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-MediumItalic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatDisplay-Regular.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Regular.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatDisplay-Regular.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatDisplay-Regular.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatText-Bold.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-Bold.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatText-Bold.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-Bold.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatText-BoldItalic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-BoldItalic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatText-BoldItalic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-BoldItalic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatText-Italic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-Italic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatText-Italic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-Italic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatText-Medium.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-Medium.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatText-Medium.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-Medium.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatText-MediumItalic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-MediumItalic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatText-MediumItalic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-MediumItalic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatText-Regular.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-Regular.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/RedHatText-Regular.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/RedHatText-Regular.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/SourceCodePro-It.ttf.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/SourceCodePro-It.ttf.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/SourceCodePro-Regular.ttf.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/SourceCodePro-Regular.ttf.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/SourceCodePro-Semibold.ttf.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/SourceCodePro-Semibold.ttf.woff differ diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/callback.ClassDeletePropertyFunction.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.ClassDeletePropertyFunction.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/callback.ClassDeletePropertyFunction.html 2026-04-16 17:28:30.229328900 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.ClassDeletePropertyFunction.html 2026-07-09 07:28:48.033811300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -129,7 +129,7 @@
-

Available since: 6.0

+ @@ -152,7 +152,7 @@
jsc_class

Type: JSCClass

-

A JSCClass.

+

A JSCClass.

@@ -169,7 +169,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -186,7 +186,7 @@
instance

Type: gpointer

-

The jsc_class instance.

+

The jsc_class instance.

@@ -203,7 +203,7 @@
name

Type: const char*

-

The property name.

+

The property name.

The argument can be NULL.
@@ -235,7 +235,7 @@

Type: gboolean

-

TRUE if handled or FALSE to to forward the request to the parent class or prototype chain.

+

TRUE if handled or FALSE to to forward the request to the parent class or prototype chain.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/callback.ClassEnumeratePropertiesFunction.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.ClassEnumeratePropertiesFunction.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/callback.ClassEnumeratePropertiesFunction.html 2026-04-16 17:28:30.316329000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.ClassEnumeratePropertiesFunction.html 2026-07-09 07:28:48.042677400 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -128,7 +128,7 @@
-

Available since: 6.0

+ @@ -151,7 +151,7 @@
jsc_class

Type: JSCClass

-

A JSCClass.

+

A JSCClass.

@@ -168,7 +168,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -185,7 +185,7 @@
instance

Type: gpointer

-

The jsc_class instance.

+

The jsc_class instance.

@@ -217,8 +217,8 @@

Type: An array of utf8

-

A NULL-terminated array of strings - containing the property names, or NULL if instance doesn’t have enumerable properties.

+

A NULL-terminated array of strings + containing the property names, or NULL if instance doesn’t have enumerable properties.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/callback.ClassGetPropertyFunction.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.ClassGetPropertyFunction.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/callback.ClassGetPropertyFunction.html 2026-04-16 17:28:30.519329500 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.ClassGetPropertyFunction.html 2026-07-09 07:28:48.045811200 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -129,7 +129,7 @@
-

Available since: 6.0

+ @@ -152,7 +152,7 @@
jsc_class

Type: JSCClass

-

A JSCClass.

+

A JSCClass.

@@ -169,7 +169,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -186,7 +186,7 @@
instance

Type: gpointer

-

The jsc_class instance.

+

The jsc_class instance.

@@ -203,7 +203,7 @@
name

Type: const char*

-

The property name.

+

The property name.

The argument can be NULL.
@@ -235,8 +235,8 @@

Type: JSCValue

-

A JSCValue or NULL to forward the request to - the parent class or prototype chain.

+

A JSCValue or NULL to forward the request to + the parent class or prototype chain.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/callback.ClassHasPropertyFunction.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.ClassHasPropertyFunction.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/callback.ClassHasPropertyFunction.html 2026-04-16 17:28:30.653329800 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.ClassHasPropertyFunction.html 2026-07-09 07:28:48.052192000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -129,7 +129,7 @@
-

Available since: 6.0

+ @@ -152,7 +152,7 @@
jsc_class

Type: JSCClass

-

A JSCClass.

+

A JSCClass.

@@ -169,7 +169,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -186,7 +186,7 @@
instance

Type: gpointer

-

The jsc_class instance.

+

The jsc_class instance.

@@ -203,7 +203,7 @@
name

Type: const char*

-

The property name.

+

The property name.

The argument can be NULL.
@@ -235,8 +235,8 @@

Type: gboolean

-

TRUE if instance has a property with name or FALSE to forward the request - to the parent class or prototype chain.

+

TRUE if instance has a property with name or FALSE to forward the request + to the parent class or prototype chain.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/callback.ClassSetPropertyFunction.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.ClassSetPropertyFunction.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/callback.ClassSetPropertyFunction.html 2026-04-16 17:28:30.802330300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.ClassSetPropertyFunction.html 2026-07-09 07:28:48.057397400 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -130,7 +130,7 @@
-

Available since: 6.0

+ @@ -153,7 +153,7 @@
jsc_class

Type: JSCClass

-

A JSCClass.

+

A JSCClass.

@@ -170,7 +170,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -187,7 +187,7 @@
instance

Type: gpointer

-

The jsc_class instance.

+

The jsc_class instance.

@@ -204,7 +204,7 @@
name

Type: const char*

-

The property name.

+

The property name.

The argument can be NULL.
@@ -221,7 +221,7 @@
value

Type: JSCValue

-

The JSCValue to set.

+

The JSCValue to set.

@@ -253,7 +253,7 @@

Type: gboolean

-

TRUE if handled or FALSE to forward the request to the parent class or prototype chain.

+

TRUE if handled or FALSE to forward the request to the parent class or prototype chain.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/callback.ExceptionHandler.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.ExceptionHandler.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/callback.ExceptionHandler.html 2026-04-16 17:28:30.850330400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.ExceptionHandler.html 2026-07-09 07:28:48.060523500 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -127,7 +127,7 @@
-

Available since: 6.0

+ @@ -150,7 +150,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -167,7 +167,7 @@
exception

Type: JSCException

-

A JSCException.

+

A JSCException.

@@ -184,7 +184,7 @@
user_data

Type: gpointer

-

User data.

+

User data.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/callback.Executor.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.Executor.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/callback.Executor.html 2026-04-16 17:28:30.935330600 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.Executor.html 2026-07-09 07:28:48.064108400 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -153,7 +153,7 @@
resolve

Type: JSCValue

-

JSCValue function to call to resolve the promise.

+

JSCValue function to call to resolve the promise.

The argument can be NULL.
@@ -170,7 +170,7 @@
reject

Type: JSCValue

-

JSCValue function to call to reject the promise.

+

JSCValue function to call to reject the promise.

@@ -187,7 +187,7 @@
user_data

Type: gpointer

-

User data.

+

User data.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/callback.OptionsFunc.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.OptionsFunc.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/callback.OptionsFunc.html 2026-04-16 17:28:31.027330900 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/callback.OptionsFunc.html 2026-07-09 07:28:48.068482000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -152,7 +152,7 @@
option

Type: const char*

-

The option name.

+

The option name.

The argument can be NULL.
@@ -169,7 +169,7 @@
type

Type: JSCOptionType

-

The option JSCOptionType.

+

The option JSCOptionType.

@@ -186,7 +186,7 @@
description

Type: const char*

-

The option description, or NULL.

+

The option description, or NULL.

@@ -203,7 +203,7 @@
user_data

Type: gpointer

-

User data.

+

User data.

The argument can be NULL.
@@ -235,7 +235,7 @@

Type: gboolean

-

TRUE to stop the iteration, or FALSE otherwise.

+

TRUE to stop the iteration, or FALSE otherwise.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/class.Class.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/class.Class.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/class.Class.html 2026-04-16 17:28:30.880330600 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/class.Class.html 2026-07-09 07:28:48.181808000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -135,7 +135,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -151,7 +151,7 @@
-

unstable since: 6.0

+

@@ -179,8 +179,6 @@
-

Available since: 6.0

-
@@ -198,7 +196,7 @@ - this - -JSCClass + +JSCClass @@ -218,15 +216,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -280,7 +278,7 @@ destroy_notify is called with user_data as parameter.

-

unstable since: 6.0

+

@@ -293,7 +291,7 @@ is cleared in the JSCClass context, destroy_notify is called with user_data as parameter.

-

unstable since: 6.0

+

@@ -306,7 +304,7 @@ destroy_notify is called with user_data as parameter.

-

unstable since: 6.0

+

@@ -319,7 +317,7 @@ user_data as parameter.

-

unstable since: 6.0

+

@@ -332,7 +330,7 @@ destroy_notify is called with user_data as parameter.

-

unstable since: 6.0

+

@@ -345,7 +343,7 @@ user_data as parameter.

-

unstable since: 6.0

+

@@ -359,7 +357,7 @@ JSCClass context, destroy_notify is called with user_data as parameter.

-

unstable since: 6.0

+

@@ -369,7 +367,7 @@

Get the class name of jsc_class.

-

unstable since: 6.0

+

@@ -379,7 +377,7 @@

Get the parent class of jsc_class.

-

unstable since: 6.0

+

@@ -419,7 +417,7 @@

The JSCContext in which the class was registered.

-

unstable since: 6.0

+

@@ -429,7 +427,7 @@

The name of the class.

-

unstable since: 6.0

+

@@ -439,7 +437,7 @@

The parent class or NULL in case of final classes.

-

unstable since: 6.0

+

@@ -473,10 +471,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -502,7 +496,7 @@
- No description available. +

No description available.

@@ -512,7 +506,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/class.Context.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/class.Context.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/class.Context.html 2026-04-16 17:28:31.582332400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/class.Context.html 2026-07-09 07:28:48.276943200 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -169,7 +169,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,7 +185,7 @@
-

unstable since: 6.0

+

@@ -214,8 +214,6 @@
-

Available since: 6.0

-
@@ -233,7 +231,7 @@ - this - -JSCContext + +JSCContext @@ -253,15 +251,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -310,7 +308,7 @@ existing JSCVirtualMachine.

-

unstable since: 6.0

+

@@ -320,7 +318,7 @@

Create a new JSCContext in virtual_machine.

-

unstable since: 6.0

+

@@ -344,7 +342,7 @@ called within a function or method callback, otherwise NULL will be returned.

-

unstable since: 6.0

+

@@ -370,7 +368,7 @@ exception to ignore the error details.

-

unstable since: 6.0

+

@@ -380,7 +378,7 @@

Clear the uncaught exception in context if any.

-

unstable since: 6.0

+

@@ -390,7 +388,7 @@

Evaluate code in context.

-

unstable since: 6.0

+

@@ -404,7 +402,7 @@ uri and line_number will be shown in exceptions and they don’t affect the behavior of the script.

-

unstable since: 6.0

+

@@ -416,7 +414,7 @@ they don’t affect the behavior of the script.

-

unstable since: 6.0

+

@@ -426,7 +424,7 @@

Get the last unhandled exception thrown in context by API functions calls.

-

unstable since: 6.0

+

@@ -436,7 +434,7 @@

Get a JSCValue referencing the context global object.

-

unstable since: 6.0

+

@@ -446,7 +444,7 @@

Get a property of context global object with name.

-

unstable since: 6.0

+

@@ -456,7 +454,7 @@

Get the JSCVirtualMachine where context was created.

-

unstable since: 6.0

+

@@ -466,7 +464,7 @@

Remove the last JSCExceptionHandler previously pushed to context with jsc_context_push_exception_handler().

-

unstable since: 6.0

+

@@ -483,7 +481,7 @@ is removed from the context, destroy_notify is called with user_data as parameter.

-

unstable since: 6.0

+

@@ -498,7 +496,7 @@ the instance as parameter.

-

unstable since: 6.0

+

@@ -508,7 +506,7 @@

Set a property of context global object with name and value.

-

unstable since: 6.0

+

@@ -519,7 +517,7 @@ can be retrieved with jsc_context_get_exception().

-

unstable since: 6.0

+

@@ -529,7 +527,7 @@

Throw exception to context.

-

unstable since: 6.0

+

@@ -540,7 +538,7 @@ The created JSCException can be retrieved with jsc_context_get_exception().

-

unstable since: 6.0

+

@@ -551,7 +549,7 @@ can be retrieved with jsc_context_get_exception().

-

unstable since: 6.0

+

@@ -562,7 +560,7 @@ The created JSCException can be retrieved with jsc_context_get_exception().

-

unstable since: 6.0

+

@@ -602,7 +600,7 @@

The JSCVirtualMachine in which the context was created.

-

unstable since: 6.0

+

@@ -636,10 +634,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -665,7 +659,7 @@
- No description available. +

No description available.

@@ -675,7 +669,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/class.Exception.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/class.Exception.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/class.Exception.html 2026-04-16 17:28:32.164333800 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/class.Exception.html 2026-07-09 07:28:48.376907800 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -139,7 +139,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -155,7 +155,7 @@
-

unstable since: 6.0

+

@@ -179,8 +179,6 @@
-

Available since: 6.0

-
@@ -198,7 +196,7 @@ - this - -JSCException + +JSCException @@ -218,15 +216,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -273,7 +271,7 @@

Create a new JSCException in context with message.

-

unstable since: 6.0

+

@@ -284,7 +282,7 @@ for the message.

-

unstable since: 6.0

+

@@ -296,7 +294,7 @@ except that the arguments to the format string are passed as a va_list.

-

unstable since: 6.0

+

@@ -306,7 +304,7 @@

Create a new JSCException in context with name and message.

-

unstable since: 6.0

+

@@ -317,7 +315,7 @@ for the message.

-

unstable since: 6.0

+

@@ -329,7 +327,7 @@ except that the arguments to the format string are passed as a va_list.

-

unstable since: 6.0

+

@@ -354,7 +352,7 @@

Get a string with the exception backtrace.

-

unstable since: 6.0

+

@@ -364,7 +362,7 @@

Get the column number at which exception happened.

-

unstable since: 6.0

+

@@ -374,7 +372,7 @@

Get the line number at which exception happened.

-

unstable since: 6.0

+

@@ -384,7 +382,7 @@

Get the error message of exception.

-

unstable since: 6.0

+

@@ -394,7 +392,7 @@

Get the error name of exception.

-

unstable since: 6.0

+

@@ -404,7 +402,7 @@

Get the source URI of exception.

-

unstable since: 6.0

+

@@ -415,7 +413,7 @@ source URI, line, column and backtrace, and formatted to be printed.

-

unstable since: 6.0

+

@@ -425,7 +423,7 @@

Get the string representation of exception error.

-

unstable since: 6.0

+

@@ -469,10 +467,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -498,7 +492,7 @@
- No description available. +

No description available.

@@ -508,7 +502,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/class.Value.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/class.Value.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/class.Value.html 2026-04-16 17:28:32.556335000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/class.Value.html 2026-07-09 07:28:48.478680100 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -240,7 +240,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -256,7 +256,7 @@
-

unstable since: 6.0

+

@@ -281,8 +281,6 @@
-

Available since: 6.0

-
@@ -300,7 +298,7 @@ - this - -JSCValue + +JSCValue @@ -320,15 +318,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -376,7 +374,7 @@ is G_TYPE_NONE an empty array is created.

-

unstable since: 6.0

+

@@ -398,7 +396,7 @@ pointers to a JSCValue.

-

unstable since: 6.0

+

@@ -409,7 +407,7 @@ is NULL or empty a new empty array will be created.

-

unstable since: 6.0

+

@@ -419,7 +417,7 @@

Create a new JSCValue from value.

-

unstable since: 6.0

+

@@ -442,7 +440,7 @@ cleared in context, destroy_notify is called with user_data as parameter.

-

unstable since: 6.0

+

@@ -455,7 +453,7 @@ When the function is cleared in context, destroy_notify is called with user_data as parameter.

-

unstable since: 6.0

+

@@ -468,7 +466,7 @@ cleared in context, destroy_notify is called with user_data as parameter.

-

unstable since: 6.0

+

@@ -478,7 +476,7 @@

Create a new JSCValue referencing null in context.

-

unstable since: 6.0

+

@@ -488,7 +486,7 @@

Create a new JSCValue from number.

-

unstable since: 6.0

+

@@ -500,7 +498,7 @@ instance that will be freed by the GDestroyNotify passed to jsc_context_register_class().

-

unstable since: 6.0

+

@@ -525,7 +523,7 @@ string containing null characters, use jsc_value_new_string_from_bytes() instead.

-

unstable since: 6.0

+

@@ -535,7 +533,7 @@

Create a new JSCValue from bytes.

-

unstable since: 6.0

+

@@ -555,7 +553,7 @@

Create a new JSCValue referencing undefined in context.

-

unstable since: 6.0

+

@@ -601,7 +599,7 @@ is G_TYPE_NONE no parameters will be passed to the constructor.

-

unstable since: 6.0

+

@@ -612,7 +610,7 @@ is 0 no parameters will be passed to the constructor.

-

unstable since: 6.0

+

@@ -623,7 +621,7 @@ is G_TYPE_NONE no parameters will be passed to the function.

-

unstable since: 6.0

+

@@ -634,7 +632,7 @@ is 0 no parameters will be passed to the function.

-

unstable since: 6.0

+

@@ -644,7 +642,7 @@

Get the JSCContext in which value was created.

-

unstable since: 6.0

+

@@ -654,7 +652,7 @@

Get whether the value referenced by value is an array.

-

unstable since: 6.0

+

@@ -674,7 +672,7 @@

Get whether the value referenced by value is a boolean.

-

unstable since: 6.0

+

@@ -684,7 +682,7 @@

Get whether the value referenced by value is a constructor.

-

unstable since: 6.0

+

@@ -694,7 +692,7 @@

Get whether the value referenced by value is a function.

-

unstable since: 6.0

+

@@ -704,7 +702,7 @@

Get whether the value referenced by value is null.

-

unstable since: 6.0

+

@@ -714,7 +712,7 @@

Get whether the value referenced by value is a number.

-

unstable since: 6.0

+

@@ -724,7 +722,7 @@

Get whether the value referenced by value is an object.

-

unstable since: 6.0

+

@@ -734,7 +732,7 @@

Get whether the value referenced by value is a string.

-

unstable since: 6.0

+

@@ -754,7 +752,7 @@

Get whether the value referenced by value is undefined.

-

unstable since: 6.0

+

@@ -778,7 +776,7 @@ when used with an accessor descriptor.

-

unstable since: 6.0

+

@@ -789,7 +787,7 @@ JavaScript Object.defineProperty() when used with a data descriptor.

-

unstable since: 6.0

+

@@ -800,7 +798,7 @@ the property was defined without JSC_VALUE_PROPERTY_CONFIGURABLE flag.

-

unstable since: 6.0

+

@@ -811,7 +809,7 @@ flag will be collected.

-

unstable since: 6.0

+

@@ -821,7 +819,7 @@

Get property with name from value.

-

unstable since: 6.0

+

@@ -831,7 +829,7 @@

Get property at index from value.

-

unstable since: 6.0

+

@@ -841,7 +839,7 @@

Get whether value has property with name.

-

unstable since: 6.0

+

@@ -855,7 +853,7 @@ of this function.

-

unstable since: 6.0

+

@@ -869,7 +867,7 @@ of this function.

-

unstable since: 6.0

+

@@ -879,7 +877,7 @@

Get whether the value referenced by value is an instance of class name.

-

unstable since: 6.0

+

@@ -889,7 +887,7 @@

Set property with name on value.

-

unstable since: 6.0

+

@@ -899,7 +897,7 @@

Set property at index on value.

-

unstable since: 6.0

+

@@ -909,7 +907,7 @@

Convert value to a boolean.

-

unstable since: 6.0

+

@@ -919,7 +917,7 @@

Convert value to a double.

-

unstable since: 6.0

+

@@ -929,7 +927,7 @@

Convert value to a #gint32.

-

unstable since: 6.0

+

@@ -951,7 +949,7 @@ handle strings containing null characters.

-

unstable since: 6.0

+

@@ -962,7 +960,7 @@ to handle strings with null characters.

-

unstable since: 6.0

+

@@ -1065,7 +1063,7 @@

The JSCContext in which the value was created.

-

unstable since: 6.0

+

@@ -1099,10 +1097,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -1128,7 +1122,7 @@
- No description available. +

No description available.

@@ -1138,7 +1132,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/class.VirtualMachine.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/class.VirtualMachine.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/class.VirtualMachine.html 2026-04-16 17:28:33.743338000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/class.VirtualMachine.html 2026-07-09 07:28:48.724443400 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -122,7 +122,7 @@
-

unstable since: 6.0

+

@@ -150,8 +150,6 @@
-

Available since: 6.0

-
@@ -169,19 +167,19 @@ - - + hierarchy this - -JSCVirtualMachine + +JSCVirtualMachine @@ -189,15 +187,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -244,7 +242,7 @@

Create a new JSCVirtualMachine.

-

unstable since: 6.0

+

@@ -303,10 +301,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -332,7 +326,7 @@
- No description available. +

No description available.

@@ -342,7 +336,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/class.WeakValue.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/class.WeakValue.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/class.WeakValue.html 2026-04-16 17:28:33.828338100 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/class.WeakValue.html 2026-07-09 07:28:48.742175300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -133,7 +133,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable since: 6.0

+

@@ -175,8 +175,6 @@
-

Available since: 6.0

-
@@ -194,7 +192,7 @@ - this - -JSCWeakValue + +JSCWeakValue @@ -214,15 +212,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -269,7 +267,7 @@

Create a new JSCWeakValue for the JavaScript value referenced by value.

-

unstable since: 6.0

+

@@ -294,7 +292,7 @@

Get a JSCValue referencing the JavaScript value of weak_value.

-

unstable since: 6.0

+

@@ -334,7 +332,7 @@

The JSCValue referencing the JavaScript value.

-

unstable since: 6.0

+

@@ -366,7 +364,7 @@

This signal is emitted when the JavaScript value is destroyed.

-

unstable since: 6.0

+

@@ -382,10 +380,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -411,7 +405,7 @@
- No description available. +

No description available.

@@ -421,7 +415,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/classes_hierarchy.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/classes_hierarchy.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/classes_hierarchy.html 2026-04-16 17:28:28.577324400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/classes_hierarchy.html 2026-07-09 07:28:47.753817800 +0000 @@ -62,13 +62,13 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/const.MAJOR_VERSION.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.MAJOR_VERSION.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/const.MAJOR_VERSION.html 2026-04-16 17:28:30.217328800 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.MAJOR_VERSION.html 2026-07-09 07:28:48.074238300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -74,7 +74,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -89,7 +89,7 @@
-

unstable since: 6.0

+

@@ -122,8 +122,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/const.MICRO_VERSION.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.MICRO_VERSION.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/const.MICRO_VERSION.html 2026-04-16 17:28:30.311329100 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.MICRO_VERSION.html 2026-07-09 07:28:48.075636900 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -74,7 +74,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -89,7 +89,7 @@
-

unstable since: 6.0

+

@@ -100,7 +100,7 @@
-
#define JSC_MICRO_VERSION 3
+        
#define JSC_MICRO_VERSION 5
 
@@ -122,8 +122,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/const.MINOR_VERSION.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.MINOR_VERSION.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/const.MINOR_VERSION.html 2026-04-16 17:28:30.387329000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.MINOR_VERSION.html 2026-07-09 07:28:48.077014700 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -74,7 +74,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -89,7 +89,7 @@
-

unstable since: 6.0

+

@@ -122,8 +122,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/const.OPTIONS_USE_DFG.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.OPTIONS_USE_DFG.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/const.OPTIONS_USE_DFG.html 2026-04-16 17:28:30.541329600 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.OPTIONS_USE_DFG.html 2026-07-09 07:28:48.078260200 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -74,7 +74,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -89,7 +89,7 @@
-

unstable since: 6.0

+

@@ -122,8 +122,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/const.OPTIONS_USE_FTL.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.OPTIONS_USE_FTL.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/const.OPTIONS_USE_FTL.html 2026-04-16 17:28:30.637329800 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.OPTIONS_USE_FTL.html 2026-07-09 07:28:48.079466000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -74,7 +74,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -89,7 +89,7 @@
-

unstable since: 6.0

+

@@ -122,8 +122,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/const.OPTIONS_USE_JIT.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.OPTIONS_USE_JIT.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/const.OPTIONS_USE_JIT.html 2026-04-16 17:28:30.737330200 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.OPTIONS_USE_JIT.html 2026-07-09 07:28:48.080748600 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -74,7 +74,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -89,7 +89,7 @@
-

unstable since: 6.0

+

@@ -122,8 +122,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/const.OPTIONS_USE_LLINT.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.OPTIONS_USE_LLINT.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/const.OPTIONS_USE_LLINT.html 2026-04-16 17:28:30.809330200 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/const.OPTIONS_USE_LLINT.html 2026-07-09 07:28:48.081960000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -74,7 +74,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -89,7 +89,7 @@
-

unstable since: 6.0

+

@@ -122,8 +122,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Context.new.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Context.new.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Context.new.html 2026-04-16 17:28:31.595332400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Context.new.html 2026-07-09 07:28:48.279834500 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -158,7 +158,7 @@

Type: JSCContext

-

The newly created JSCContext.

+

The newly created JSCContext.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Context.new_with_virtual_machine.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Context.new_with_virtual_machine.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Context.new_with_virtual_machine.html 2026-04-16 17:28:31.606332300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Context.new_with_virtual_machine.html 2026-07-09 07:28:48.282290000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -156,7 +156,7 @@
vm

Type: JSCVirtualMachine

-

A JSCVirtualMachine.

+

A JSCVirtualMachine.

@@ -188,7 +188,7 @@

Type: JSCContext

-

The newly created JSCContext.

+

The newly created JSCContext.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Exception.new.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Exception.new.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Exception.new.html 2026-04-16 17:28:32.179334000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Exception.new.html 2026-07-09 07:28:48.380639600 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -182,7 +182,7 @@
message

Type: const char*

-

The error message.

+

The error message.

@@ -214,7 +214,7 @@

Type: JSCException

-

A new JSCException.

+

A new JSCException.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Exception.new_printf.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Exception.new_printf.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Exception.new_printf.html 2026-04-16 17:28:32.197334000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Exception.new_printf.html 2026-07-09 07:28:48.384906800 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -167,7 +167,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -184,7 +184,7 @@
format

Type: const char*

-

The string format.

+

The string format.

@@ -201,7 +201,7 @@
...

Type: 

-

The parameters to insert into the format string.

+

The parameters to insert into the format string.

@@ -233,7 +233,7 @@

Type: JSCException

-

A new JSCException.

+

A new JSCException.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Exception.new_vprintf.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Exception.new_vprintf.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Exception.new_vprintf.html 2026-04-16 17:28:32.216334000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Exception.new_vprintf.html 2026-07-09 07:28:48.389384700 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -168,7 +168,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -185,7 +185,7 @@
format

Type: const char*

-

The string format.

+

The string format.

@@ -202,7 +202,7 @@
args

Type: va_list

-

The parameters to insert into the format string.

+

The parameters to insert into the format string.

@@ -234,7 +234,7 @@

Type: JSCException

-

A new JSCException.

+

A new JSCException.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Exception.new_with_name.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Exception.new_with_name.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Exception.new_with_name.html 2026-04-16 17:28:32.233334000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Exception.new_with_name.html 2026-07-09 07:28:48.393005800 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -166,7 +166,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -183,7 +183,7 @@
name

Type: const char*

-

The error name.

+

The error name.

@@ -200,7 +200,7 @@
message

Type: const char*

-

The error message.

+

The error message.

@@ -232,7 +232,7 @@

Type: JSCException

-

A new JSCException.

+

A new JSCException.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Exception.new_with_name_printf.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Exception.new_with_name_printf.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Exception.new_with_name_printf.html 2026-04-16 17:28:32.253334000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Exception.new_with_name_printf.html 2026-07-09 07:28:48.421534500 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -168,7 +168,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -185,7 +185,7 @@
name

Type: const char*

-

The error name.

+

The error name.

@@ -202,7 +202,7 @@
format

Type: const char*

-

The string format.

+

The string format.

@@ -219,7 +219,7 @@
...

Type: 

-

The parameters to insert into the format string.

+

The parameters to insert into the format string.

@@ -251,7 +251,7 @@

Type: JSCException

-

A new JSCException.

+

A new JSCException.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Exception.new_with_name_vprintf.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Exception.new_with_name_vprintf.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Exception.new_with_name_vprintf.html 2026-04-16 17:28:32.275334100 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Exception.new_with_name_vprintf.html 2026-07-09 07:28:48.426560000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,7 +169,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -186,7 +186,7 @@
name

Type: const char*

-

The error name.

+

The error name.

@@ -203,7 +203,7 @@
format

Type: const char*

-

The string format.

+

The string format.

@@ -220,7 +220,7 @@
args

Type: va_list

-

The parameters to insert into the format string.

+

The parameters to insert into the format string.

@@ -252,7 +252,7 @@

Type: JSCException

-

A new JSCException.

+

A new JSCException.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_array.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_array.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_array.html 2026-04-16 17:28:32.581335000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_array.html 2026-07-09 07:28:48.483785600 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -114,7 +114,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -189,7 +189,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -206,7 +206,7 @@
first_item_type

Type: GType

-

GType of first item, or G_TYPE_NONE.

+

GType of first item, or G_TYPE_NONE.

@@ -223,7 +223,7 @@
...

Type: 

-

Value of the first item, followed optionally by more type/value pairs, followed by G_TYPE_NONE.

+

Value of the first item, followed optionally by more type/value pairs, followed by G_TYPE_NONE.

@@ -255,7 +255,7 @@

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_array_buffer.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_array_buffer.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_array_buffer.html 2026-04-16 17:28:32.612335000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_array_buffer.html 2026-07-09 07:28:48.490282500 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -114,7 +114,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -206,7 +206,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -223,7 +223,7 @@
data

Type: gpointer

-

Pointer to a region of memory.

+

Pointer to a region of memory.

@@ -240,7 +240,7 @@
size

Type: gsize

-

Size in bytes of the memory region.

+

Size in bytes of the memory region.

The argument can be NULL.
@@ -257,7 +257,7 @@
destroy_notify

Type: GDestroyNotify

-

Destroy notifier for user_data.

+

Destroy notifier for user_data.

@@ -274,7 +274,7 @@
user_data

Type: gpointer

-

User data.

+

User data.

The argument can be NULL.
@@ -306,7 +306,7 @@

Type: JSCValue

-

A JSCValue, or NULL in case of exception.

+

A JSCValue, or NULL in case of exception.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_array_from_garray.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_array_from_garray.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_array_from_garray.html 2026-04-16 17:28:32.633335000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_array_from_garray.html 2026-07-09 07:28:48.493823000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -114,7 +114,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -189,7 +189,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -206,7 +206,7 @@
array

Type: An array of JSCValue*

-

A GPtrArray.

+

A GPtrArray.

@@ -238,7 +238,7 @@

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_array_from_strv.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_array_from_strv.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_array_from_strv.html 2026-04-16 17:28:32.652335200 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_array_from_strv.html 2026-07-09 07:28:48.497702100 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -114,7 +114,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -188,7 +188,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -205,7 +205,7 @@
strv

Type: An array of utf8

-

A NULL-terminated array of strings.

+

A NULL-terminated array of strings.

@@ -237,7 +237,7 @@

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_boolean.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_boolean.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_boolean.html 2026-04-16 17:28:32.671335200 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_boolean.html 2026-07-09 07:28:48.500950000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -114,7 +114,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -204,7 +204,7 @@
value

Type: gboolean

-

A #gboolean.

+

A #gboolean.

@@ -236,7 +236,7 @@

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_from_json.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_from_json.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_from_json.html 2026-04-16 17:28:32.690335300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_from_json.html 2026-07-09 07:28:48.504325000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -114,7 +114,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -204,7 +204,7 @@
json

Type: const char*

-

The JSON string to be parsed.

+

The JSON string to be parsed.

@@ -236,7 +236,7 @@

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_function.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_function.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_function.html 2026-04-16 17:28:32.738335400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_function.html 2026-07-09 07:28:48.513571500 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -114,7 +114,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -200,7 +200,7 @@
context

Type: JSCContext

-

A JSCContext:

+

A JSCContext:

@@ -217,7 +217,7 @@
name

Type: const char*

-

The function name or NULL.

+

The function name or NULL.

@@ -234,7 +234,7 @@
callback

Type: GCallback

-

A GCallback.

+

A GCallback.

The argument can be NULL.
@@ -251,7 +251,7 @@
user_data

Type: gpointer

-

User data to pass to callback.

+

User data to pass to callback.

@@ -268,7 +268,7 @@
destroy_notify

Type: GDestroyNotify

-

Destroy notifier for user_data.

+

Destroy notifier for user_data.

The argument can be NULL.
@@ -285,7 +285,7 @@
return_type

Type: GType

-

The GType of the function return value, or G_TYPE_NONE if the function is void.

+

The GType of the function return value, or G_TYPE_NONE if the function is void.

The argument can be NULL.
@@ -302,7 +302,7 @@
n_params

Type: guint

-

The number of parameter types to follow or 0 if the function doesn’t receive parameters.

+

The number of parameter types to follow or 0 if the function doesn’t receive parameters.

@@ -319,7 +319,7 @@
...

Type: 

-

A list of GTypes, one for each parameter.

+

A list of GTypes, one for each parameter.

@@ -351,7 +351,7 @@

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_function_variadic.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_function_variadic.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_function_variadic.html 2026-04-16 17:28:32.778335600 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_function_variadic.html 2026-07-09 07:28:48.521680000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -114,7 +114,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -198,7 +198,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -215,7 +215,7 @@
name

Type: const char*

-

The function name or NULL.

+

The function name or NULL.

@@ -232,7 +232,7 @@
callback

Type: GCallback

-

A GCallback.

+

A GCallback.

The argument can be NULL.
@@ -249,7 +249,7 @@
user_data

Type: gpointer

-

User data to pass to callback.

+

User data to pass to callback.

@@ -266,7 +266,7 @@
destroy_notify

Type: GDestroyNotify

-

Destroy notifier for user_data.

+

Destroy notifier for user_data.

The argument can be NULL.
@@ -283,7 +283,7 @@
return_type

Type: GType

-

The GType of the function return value, or G_TYPE_NONE if the function is void.

+

The GType of the function return value, or G_TYPE_NONE if the function is void.

The argument can be NULL.
@@ -315,7 +315,7 @@

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_functionv.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_functionv.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_functionv.html 2026-04-16 17:28:32.824335600 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_functionv.html 2026-07-09 07:28:48.530829000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -114,7 +114,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -200,7 +200,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -217,7 +217,7 @@
name

Type: const char*

-

The function name or NULL.

+

The function name or NULL.

@@ -234,7 +234,7 @@
callback

Type: GCallback

-

A GCallback.

+

A GCallback.

The argument can be NULL.
@@ -251,7 +251,7 @@
user_data

Type: gpointer

-

User data to pass to callback.

+

User data to pass to callback.

@@ -268,7 +268,7 @@
destroy_notify

Type: GDestroyNotify

-

Destroy notifier for user_data.

+

Destroy notifier for user_data.

The argument can be NULL.
@@ -285,7 +285,7 @@
return_type

Type: GType

-

The GType of the function return value, or G_TYPE_NONE if the function is void.

+

The GType of the function return value, or G_TYPE_NONE if the function is void.

The argument can be NULL.
@@ -302,7 +302,7 @@
n_parameters

Type: guint

-

The number of parameters.

+

The number of parameters.

@@ -319,7 +319,7 @@
parameter_types

Type: An array of GType

-

A list of GTypes, one for each parameter, or NULL.

+

A list of GTypes, one for each parameter, or NULL.

@@ -351,7 +351,7 @@

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_null.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_null.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_null.html 2026-04-16 17:28:32.835335700 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_null.html 2026-07-09 07:28:48.533747200 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -114,7 +114,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -186,7 +186,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -218,7 +218,7 @@

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_number.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_number.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_number.html 2026-04-16 17:28:32.849335700 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_number.html 2026-07-09 07:28:48.536676200 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -114,7 +114,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -204,7 +204,7 @@
number

Type: double

-

A number.

+

A number.

@@ -236,7 +236,7 @@

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_object.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_object.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_object.html 2026-04-16 17:28:32.870335800 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_object.html 2026-07-09 07:28:48.541455500 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -114,7 +114,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -190,7 +190,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -207,7 +207,7 @@
instance

Type: gpointer

-

An object instance or NULL.

+

An object instance or NULL.

@@ -224,7 +224,7 @@
jsc_class

Type: JSCClass

-

The JSCClass of instance.

+

The JSCClass of instance.

The argument can be NULL.
@@ -256,7 +256,7 @@

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_promise.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_promise.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_promise.html 2026-04-16 17:28:32.890335800 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_promise.html 2026-07-09 07:28:48.545845700 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -114,7 +114,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -192,7 +192,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -209,7 +209,7 @@
executor

Type: JSCExecutor

-

An initialization callback.

+

An initialization callback.

@@ -226,7 +226,7 @@
user_data

Type: gpointer

-

User data passed in executor.

+

User data passed in executor.

@@ -258,7 +258,7 @@

Type: JSCValue

-

A deferred promise object.

+

A deferred promise object.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_string.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_string.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_string.html 2026-04-16 17:28:32.906335800 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_string.html 2026-07-09 07:28:48.549398700 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -114,7 +114,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -188,7 +188,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -205,7 +205,7 @@
string

Type: const char*

-

A null-terminated string.

+

A null-terminated string.

@@ -237,7 +237,7 @@

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_string_from_bytes.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_string_from_bytes.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_string_from_bytes.html 2026-04-16 17:28:32.920335800 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_string_from_bytes.html 2026-07-09 07:28:48.552363600 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -114,7 +114,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -204,7 +204,7 @@
bytes

Type: GBytes

-

A GBytes.

+

A GBytes.

@@ -236,7 +236,7 @@

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_typed_array.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_typed_array.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_typed_array.html 2026-04-16 17:28:32.941336000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_typed_array.html 2026-07-09 07:28:48.556649700 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -114,7 +114,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -193,7 +193,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -210,7 +210,7 @@
type

Type: JSCTypedArrayType

-

The type of array elements.

+

The type of array elements.

@@ -227,7 +227,7 @@
length

Type: gsize

-

Number of elements in the array.

+

Number of elements in the array.

@@ -259,7 +259,7 @@

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_undefined.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_undefined.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.Value.new_undefined.html 2026-04-16 17:28:32.953336000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.Value.new_undefined.html 2026-07-09 07:28:48.557799600 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -114,7 +114,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -186,7 +186,7 @@
context

Type: JSCContext

-

A JSCContext.

+

A JSCContext.

@@ -218,7 +218,7 @@

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.VirtualMachine.new.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.VirtualMachine.new.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.VirtualMachine.new.html 2026-04-16 17:28:33.753338000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.VirtualMachine.new.html 2026-07-09 07:28:48.726478000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@

Type: JSCVirtualMachine

-

The newly created JSCVirtualMachine.

+

The newly created JSCVirtualMachine.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.WeakValue.new.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.WeakValue.new.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/ctor.WeakValue.new.html 2026-04-16 17:28:33.842338300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/ctor.WeakValue.new.html 2026-07-09 07:28:48.745383000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@
value

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

@@ -186,7 +186,7 @@

Type: JSCWeakValue

-

A new JSCWeakValue.

+

A new JSCWeakValue.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/enum.CheckSyntaxMode.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/enum.CheckSyntaxMode.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/enum.CheckSyntaxMode.html 2026-04-16 17:28:29.691327300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/enum.CheckSyntaxMode.html 2026-07-09 07:28:47.882673300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -123,8 +123,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/enum.CheckSyntaxResult.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/enum.CheckSyntaxResult.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/enum.CheckSyntaxResult.html 2026-04-16 17:28:29.759327700 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/enum.CheckSyntaxResult.html 2026-07-09 07:28:47.885751500 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -123,8 +123,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/enum.OptionType.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/enum.OptionType.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/enum.OptionType.html 2026-04-16 17:28:29.841327700 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/enum.OptionType.html 2026-07-09 07:28:47.888290400 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/enum.TypedArrayType.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/enum.TypedArrayType.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/enum.TypedArrayType.html 2026-04-16 17:28:29.973328000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/enum.TypedArrayType.html 2026-07-09 07:28:47.892648500 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/flags.ValuePropertyFlags.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/flags.ValuePropertyFlags.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/flags.ValuePropertyFlags.html 2026-04-16 17:28:29.677327400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/flags.ValuePropertyFlags.html 2026-07-09 07:28:47.873815000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -123,8 +123,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/fonts.css webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/fonts.css --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/fonts.css 2026-04-16 17:28:33.969338700 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/fonts.css 2026-07-09 07:28:48.769728200 +0000 @@ -3,3 +3,179 @@ * * SPDX-License-Identifier: Apache-2.0 OR GPL-3.0-or-later */ + +/** + * RedHat Fonts taken from https://github.com/RedHatOfficial/RedHatFont + * License: SIL Open Font License 1.1 http://scripts.sil.org/OFL + * + * SourceCodePro Fonts + * License: SIL Open Font License 1.1 https://scripts.sil.org/OFL + */ + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-Regular.woff2") format("woff2"), + url("RedHatDisplay-Regular.woff") format("woff"); + font-style: normal; + font-weight: 400; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-RegularItalic.woff2") format("woff2"), + url("RedHatDisplay-RegularItalic.woff") format("woff"); + font-style: italic; + font-weight: 400; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-Medium.woff2") format("woff2"), + url("RedHatDisplay-Medium.woff") format("woff"); + font-style: normal; + font-weight: 500; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-MediumItalic.woff2") format("woff2"), + url("RedHatDisplay-MediumItalic.woff") format("woff"); + font-style: italic; + font-weight: 500; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-Bold.woff2") format("woff2"), + url("RedHatDisplay-Bold.woff") format("woff"); + font-style: normal; + font-weight: 700; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-BoldItalic.woff2") format("woff2"), + url("RedHatDisplay-BoldItalic.woff") format("woff"); + font-style: italic; + font-weight: 700; + font-display: fallback; +} + + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-Black.woff2") format("woff2"), + url("RedHatDisplay-Black.woff") format("woff"); + font-style: normal; + font-weight: 900; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-BlackItalic.woff2") format("woff2"), + url("RedHatDisplay-BlackItalic.woff") format("woff"); + font-style: italic; + font-weight: 900; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatTextWeb'), + url("RedHatText-Regular.woff2") format("woff2"), + url("RedHatText-Regular.woff") format("woff"); + font-style: normal; + font-weight: 400; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatTextWeb'), + url("RedHatText-Italic.woff2") format("woff2"), + url("RedHatText-Italic.woff") format("woff"); + font-style: italic; + font-weight: 400; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatTextWeb'), + url("RedHatText-Medium.woff2") format("woff2"), + url("RedHatText-Medium.woff") format("woff"); + font-style: normal; + font-weight: 700; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatTextWeb'), + url("RedHatText-MediumItalic.woff2") format("woff2"), + url("RedHatText-MediumItalic.woff") format("woff"); + font-style: italic; + font-weight: 700; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatTextWeb'), + url("RedHatText-Bold.woff2") format("woff2"), + url("RedHatText-Bold.woff") format("woff"); + font-style: normal; + font-weight: 900; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatTextWeb'), + url("RedHatText-BoldItalic.woff2") format("woff2"), + url("RedHatText-BoldItalic.woff") format("woff"); + font-style: italic; + font-weight: 900; + font-display: fallback; +} + +/* Do not fall back to locally installed SourceCodePro, as there are + * known bad copies being distributed to this day + */ +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: url("SourceCodePro-Regular.ttf.woff") format('woff'); + font-display: swap; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: italic; + font-weight: 400; + src: url("SourceCodePro-It.ttf.woff") format('woff'); + font-display: swap; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: url("SourceCodePro-Semibold.ttf.woff") format('woff'); + font-display: swap; +} diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.CHECK_VERSION.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.CHECK_VERSION.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.CHECK_VERSION.html 2026-04-16 17:28:30.283329000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.CHECK_VERSION.html 2026-07-09 07:28:48.085810200 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -128,7 +128,7 @@
-

Available since: 6.0

+

This function is not directly available to language bindings.

@@ -151,7 +151,7 @@
major

Type: -

-

Major version (e.g. 1 for version 1.2.5)

+

Major version (e.g. 1 for version 1.2.5)

@@ -168,7 +168,7 @@
minor

Type: -

-

Minor version (e.g. 2 for version 1.2.5)

+

Minor version (e.g. 2 for version 1.2.5)

@@ -185,7 +185,7 @@
micro

Type: -

-

Micro version (e.g. 5 for version 1.2.5)

+

Micro version (e.g. 5 for version 1.2.5)

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.DECLARE_FINAL_TYPE.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.DECLARE_FINAL_TYPE.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.DECLARE_FINAL_TYPE.html 2026-04-16 17:28:30.346329200 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.DECLARE_FINAL_TYPE.html 2026-07-09 07:28:48.153819300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -123,12 +123,12 @@

- No description available. +

No description available.

-

Available since: 6.0

+

This function is not directly available to language bindings.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.get_major_version.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.get_major_version.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.get_major_version.html 2026-04-16 17:28:30.193328600 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.get_major_version.html 2026-07-09 07:28:48.068482000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -132,7 +132,7 @@
-

Available since: 6.0

+ @@ -155,7 +155,7 @@

Type: guint

-

The major version number of the JavaScriptCore library.

+

The major version number of the JavaScriptCore library.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.get_micro_version.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.get_micro_version.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.get_micro_version.html 2026-04-16 17:28:30.378329300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.get_micro_version.html 2026-07-09 07:28:48.072290700 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -132,7 +132,7 @@
-

Available since: 6.0

+ @@ -155,7 +155,7 @@

Type: guint

-

The micro version number of the JavaScriptCore library.

+

The micro version number of the JavaScriptCore library.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.get_minor_version.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.get_minor_version.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.get_minor_version.html 2026-04-16 17:28:30.442329400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.get_minor_version.html 2026-07-09 07:28:48.074238300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -132,7 +132,7 @@
-

Available since: 6.0

+ @@ -155,7 +155,7 @@

Type: guint

-

The minor version number of the JavaScriptCore library.

+

The minor version number of the JavaScriptCore library.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_foreach.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_foreach.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_foreach.html 2026-04-16 17:28:30.532329600 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_foreach.html 2026-07-09 07:28:48.098966400 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -152,7 +152,7 @@
function

Type: JSCOptionsFunc

-

A JSCOptionsFunc callback.

+

A JSCOptionsFunc callback.

@@ -169,7 +169,7 @@
user_data

Type: gpointer

-

Callback user data.

+

Callback user data.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_get_boolean.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_boolean.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_get_boolean.html 2026-04-16 17:28:30.675330000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_boolean.html 2026-07-09 07:28:48.102568100 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -151,7 +151,7 @@
option

Type: const char*

-

The option identifier.

+

The option identifier.

The argument can be NULL.
@@ -168,7 +168,7 @@
value

Type: gboolean*

-

Return location for the option value.

+

Return location for the option value.

@@ -200,7 +200,7 @@

Type: gboolean

-

TRUE if value has been set or FALSE if the option doesn’t exist.

+

TRUE if value has been set or FALSE if the option doesn’t exist.

The argument will be set by the function.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_get_double.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_double.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_get_double.html 2026-04-16 17:28:30.732330000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_double.html 2026-07-09 07:28:48.105774000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -151,7 +151,7 @@
option

Type: const char*

-

The option identifier.

+

The option identifier.

@@ -168,7 +168,7 @@
value

Type: gdouble*

-

Return location for the option value.

+

Return location for the option value.

@@ -200,7 +200,7 @@

Type: gboolean

-

TRUE if value has been set or FALSE if the option doesn’t exist.

+

TRUE if value has been set or FALSE if the option doesn’t exist.

The argument will be set by the function.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_get_int.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_int.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_get_int.html 2026-04-16 17:28:30.799330200 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_int.html 2026-07-09 07:28:48.108752000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -151,7 +151,7 @@
option

Type: const char*

-

The option identifier.

+

The option identifier.

@@ -168,7 +168,7 @@
value

Type: gint*

-

Return location for the option value.

+

Return location for the option value.

@@ -200,7 +200,7 @@

Type: gboolean

-

TRUE if value has been set or FALSE if the option doesn’t exist.

+

TRUE if value has been set or FALSE if the option doesn’t exist.

The argument will be set by the function.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_get_option_group.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_option_group.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_get_option_group.html 2026-04-16 17:28:30.840330400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_option_group.html 2026-07-09 07:28:48.112314000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -156,7 +156,7 @@

Type: GOptionGroup

-

A GOptionGroup for the JSCOptions.

+

A GOptionGroup for the JSCOptions.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_get_range_string.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_range_string.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_get_range_string.html 2026-04-16 17:28:30.883330600 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_range_string.html 2026-07-09 07:28:48.116127300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@
option

Type: const char*

-

The option identifier.

+

The option identifier.

@@ -171,7 +171,7 @@
value

Type: char**

-

Return location for the option value.

+

Return location for the option value.

@@ -180,7 +180,7 @@ - +
The argument will be set by the function.
The caller of the function takes ownership of the data, and is responsible for freeing it.
The caller of the function takes ownership of the returned data, and is responsible for freeing it.
The value is a NUL terminated UTF-8 string.
@@ -203,7 +203,7 @@

Type: gboolean

-

TRUE if value has been set or FALSE if the option doesn’t exist.

+

TRUE if value has been set or FALSE if the option doesn’t exist.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_get_size.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_size.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_get_size.html 2026-04-16 17:28:30.994331000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_size.html 2026-07-09 07:28:48.117809500 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -151,7 +151,7 @@
option

Type: const char*

-

The option identifier.

+

The option identifier.

@@ -168,7 +168,7 @@
value

Type: gsize*

-

Return location for the option value.

+

Return location for the option value.

@@ -200,7 +200,7 @@

Type: gboolean

-

TRUE if value has been set or FALSE if the option doesn’t exist.

+

TRUE if value has been set or FALSE if the option doesn’t exist.

The argument will be set by the function.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_get_string.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_string.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_get_string.html 2026-04-16 17:28:31.073331000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_string.html 2026-07-09 07:28:48.122360700 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -151,7 +151,7 @@
option

Type: const char*

-

The option identifier.

+

The option identifier.

@@ -168,7 +168,7 @@
value

Type: char**

-

Return location for the option value.

+

Return location for the option value.

@@ -177,7 +177,7 @@ - +
The argument will be set by the function.
The caller of the function takes ownership of the data, and is responsible for freeing it.
The caller of the function takes ownership of the returned data, and is responsible for freeing it.
The value is a NUL terminated UTF-8 string.
@@ -200,7 +200,7 @@

Type: gboolean

-

TRUE if value has been set or FALSE if the option doesn’t exist.

+

TRUE if value has been set or FALSE if the option doesn’t exist.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_get_uint.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_uint.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_get_uint.html 2026-04-16 17:28:31.128331200 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_get_uint.html 2026-07-09 07:28:48.125592500 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -151,7 +151,7 @@
option

Type: const char*

-

The option identifier.

+

The option identifier.

@@ -168,7 +168,7 @@
value

Type: guint*

-

Return location for the option value.

+

Return location for the option value.

@@ -200,7 +200,7 @@

Type: gboolean

-

TRUE if value has been set or FALSE if the option doesn’t exist.

+

TRUE if value has been set or FALSE if the option doesn’t exist.

The argument will be set by the function.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_set_boolean.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_boolean.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_set_boolean.html 2026-04-16 17:28:31.168331100 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_boolean.html 2026-07-09 07:28:48.128712700 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -151,7 +151,7 @@
option

Type: const char*

-

The option identifier.

+

The option identifier.

@@ -168,7 +168,7 @@
value

Type: gboolean

-

The value to set.

+

The value to set.

@@ -200,7 +200,7 @@

Type: gboolean

-

TRUE if option was correctly set or FALSE otherwise.

+

TRUE if option was correctly set or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_set_double.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_double.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_set_double.html 2026-04-16 17:28:31.202331300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_double.html 2026-07-09 07:28:48.129809100 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -151,7 +151,7 @@
option

Type: const char*

-

The option identifier.

+

The option identifier.

@@ -168,7 +168,7 @@
value

Type: gdouble

-

The value to set.

+

The value to set.

@@ -200,7 +200,7 @@

Type: gboolean

-

TRUE if option was correctly set or FALSE otherwise.

+

TRUE if option was correctly set or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_set_int.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_int.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_set_int.html 2026-04-16 17:28:31.235331500 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_int.html 2026-07-09 07:28:48.134605400 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -151,7 +151,7 @@
option

Type: const char*

-

The option identifier.

+

The option identifier.

@@ -168,7 +168,7 @@
value

Type: gint

-

The value to set.

+

The value to set.

@@ -200,7 +200,7 @@

Type: gboolean

-

TRUE if option was correctly set or FALSE otherwise.

+

TRUE if option was correctly set or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_set_range_string.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_range_string.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_set_range_string.html 2026-04-16 17:28:31.271331500 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_range_string.html 2026-07-09 07:28:48.138375300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@
option

Type: const char*

-

The option identifier.

+

The option identifier.

@@ -171,7 +171,7 @@
value

Type: const char*

-

The value to set.

+

The value to set.

@@ -203,7 +203,7 @@

Type: gboolean

-

TRUE if option was correctly set or FALSE otherwise.

+

TRUE if option was correctly set or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_set_size.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_size.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_set_size.html 2026-04-16 17:28:31.309331700 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_size.html 2026-07-09 07:28:48.141275600 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -151,7 +151,7 @@
option

Type: const char*

-

The option identifier.

+

The option identifier.

@@ -168,7 +168,7 @@
value

Type: gsize

-

The value to set.

+

The value to set.

@@ -200,7 +200,7 @@

Type: gboolean

-

TRUE if option was correctly set or FALSE otherwise.

+

TRUE if option was correctly set or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_set_string.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_string.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_set_string.html 2026-04-16 17:28:31.365332000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_string.html 2026-07-09 07:28:48.144413500 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -151,7 +151,7 @@
option

Type: const char*

-

The option identifier.

+

The option identifier.

@@ -168,7 +168,7 @@
value

Type: const char*

-

The value to set.

+

The value to set.

@@ -200,7 +200,7 @@

Type: gboolean

-

TRUE if option was correctly set or FALSE otherwise.

+

TRUE if option was correctly set or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_set_uint.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_uint.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/func.options_set_uint.html 2026-04-16 17:28:31.396331800 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/func.options_set_uint.html 2026-07-09 07:28:48.147535800 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -151,7 +151,7 @@
option

Type: const char*

-

The option identifier.

+

The option identifier.

@@ -168,7 +168,7 @@
value

Type: guint

-

The value to set.

+

The value to set.

@@ -200,7 +200,7 @@

Type: gboolean

-

TRUE if option was correctly set or FALSE otherwise.

+

TRUE if option was correctly set or FALSE otherwise.

Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/go-up-symbolic.png and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/go-up-symbolic.png differ diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/index.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/index.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/index.html 2026-04-16 17:28:33.955338500 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/index.html 2026-07-09 07:28:48.767198600 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -117,7 +117,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -135,7 +135,7 @@
- + @@ -235,7 +235,7 @@ this API. It’s possible to add constructors, properties and methods for a JSSClass by providing GCallbacks to implement them.

-

unstable since: 6.0

+

@@ -246,7 +246,7 @@ @@ -256,7 +256,7 @@ @@ -267,7 +267,7 @@ @@ -279,7 +279,7 @@

JSCVirtualMachine represents a group of JSCContexts. It allows concurrent JavaScript execution by creating a different instance of JSCVirtualMachine in each thread.

-

unstable since: 6.0

+

@@ -291,7 +291,7 @@

JSCWeakValue represents a weak reference to a value in a JSCContext. It can be used to keep a reference to a JavaScript value without protecting it from being garbage collected and without referencing the JSCContext either.

-

unstable since: 6.0

+

@@ -322,7 +322,7 @@

Virtual table for a JSCClass. This can be optionally used when registering a JSCClass in a JSCContext to provide a custom implementation for the class. All virtual functions are optional and can be set to NULL to fallback to the default implementation.

-

unstable since: 6.0

+

@@ -352,7 +352,7 @@ @@ -362,7 +362,7 @@ @@ -410,7 +410,7 @@ @@ -440,7 +440,7 @@ @@ -451,7 +451,7 @@ @@ -462,7 +462,7 @@ @@ -473,7 +473,7 @@ @@ -484,7 +484,7 @@ @@ -494,7 +494,7 @@ @@ -543,7 +543,7 @@ @@ -554,7 +554,7 @@ @@ -565,7 +565,7 @@ @@ -766,7 +766,7 @@ @@ -776,7 +776,7 @@ @@ -806,7 +806,7 @@

Like jsc_get_major_version(), but from the headers used at application compile time, rather than from the library linked against at application run time.

-

unstable since: 6.0

+

@@ -818,7 +818,7 @@

Like jsc_get_micro_version(), but from the headers used at application compile time, rather than from the library linked against at application run time.

-

unstable since: 6.0

+

@@ -830,7 +830,7 @@

Like jsc_get_minor_version(), but from the headers used at application compile time, rather than from the library linked against at application run time.

-

unstable since: 6.0

+

@@ -842,7 +842,7 @@

Allows the DFG JIT to be used if TRUE. Option type: JSC_OPTION_BOOLEAN Default value: TRUE.

-

unstable since: 6.0

+

@@ -854,7 +854,7 @@

Allows the FTL JIT to be used if TRUE. Option type: JSC_OPTION_BOOLEAN Default value: TRUE.

-

unstable since: 6.0

+

@@ -866,7 +866,7 @@

Allows the executable pages to be allocated for JIT and thunks if TRUE. Option type: JSC_OPTION_BOOLEAN Default value: TRUE.

-

unstable since: 6.0

+

@@ -878,7 +878,7 @@

Allows the LLINT to be used if TRUE. Option type: JSC_OPTION_BOOLEAN Default value: TRUE.

-

unstable since: 6.0

+

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/index.json webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/index.json --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/index.json 2026-04-16 17:28:33.964501400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/index.json 2026-07-09 07:28:48.768644000 +0000 @@ -1 +1 @@ -{"meta":{"ns":"JavaScriptCore","version":"6.0","generator":"gi-docgen","generator-version":"2023.3"},"symbols":[{"type":"bitfield","name":"ValuePropertyFlags","ctype":"JSCValuePropertyFlags","summary":"Flags used when defining properties with jsc_value_object_define_property_data() and jsc_value_object_define_property_accessor().","deprecated":null},{"type":"callback","name":"ClassDeletePropertyFunction","ctype":"JSCClassDeletePropertyFunction","summary":"The type of delete_property in #JSCClassVTable. This is only required when you need to handle external properties not added ...","deprecated":null},{"type":"callback","name":"ClassEnumeratePropertiesFunction","ctype":"JSCClassEnumeratePropertiesFunction","summary":"The type of enumerate_properties in #JSCClassVTable. This is only required when you need to handle external properties not added ...","deprecated":null},{"type":"callback","name":"ClassGetPropertyFunction","ctype":"JSCClassGetPropertyFunction","summary":"The type of get_property in #JSCClassVTable. This is only required when you need to handle external properties not added ...","deprecated":null},{"type":"callback","name":"ClassHasPropertyFunction","ctype":"JSCClassHasPropertyFunction","summary":"The type of has_property in #JSCClassVTable. This is only required when you need to handle external properties not added ...","deprecated":null},{"type":"callback","name":"ClassSetPropertyFunction","ctype":"JSCClassSetPropertyFunction","summary":"The type of set_property in #JSCClassVTable. This is only required when you need to handle external properties not added ...","deprecated":null},{"type":"callback","name":"ExceptionHandler","ctype":"JSCExceptionHandler","summary":"Function used to handle JavaScript exceptions in a #JSCContext.","deprecated":null},{"type":"callback","name":"Executor","ctype":"JSCExecutor","summary":"A function passed to @jsc_value_new_promise called during initialization It is called like a JavaScript function, so exceptions raised ...","deprecated":null},{"type":"callback","name":"OptionsFunc","ctype":"JSCOptionsFunc","summary":"Function used to iterate options. Not that @description string is not localized.","deprecated":null},{"type":"class","name":"Class","ctype":"JSCClass","summary":"A JSSClass represents a custom JavaScript class registered by the user in a #JSCContext. It allows to create new ...","deprecated":null},{"type":"class","name":"Context","ctype":"JSCContext","summary":"JSCContext represents a JavaScript execution context, where all operations take place and where the values will be associated. ...","deprecated":null},{"type":"class","name":"Exception","ctype":"JSCException","summary":"JSCException represents a JavaScript exception.","deprecated":null},{"type":"class","name":"Value","ctype":"JSCValue","summary":"JSCValue represents a reference to a value in a #JSCContext. The JSCValue protects the referenced value from being garbage collected.","deprecated":null},{"type":"class","name":"VirtualMachine","ctype":"JSCVirtualMachine","summary":"JSCVirtualMachine represents a group of JSCContexts. It allows concurrent JavaScript execution by creating a different instance of JSCVirtualMachine in ...","deprecated":null},{"type":"class","name":"WeakValue","ctype":"JSCWeakValue","summary":"JSCWeakValue represents a weak reference to a value in a #JSCContext. It can be used to keep a reference ...","deprecated":null},{"type":"constant","name":"MAJOR_VERSION","ident":"JSC_MAJOR_VERSION","summary":"Like jsc_get_major_version(), but from the headers used at application compile time, rather than from the library linked against at ...","deprecated":null},{"type":"constant","name":"MICRO_VERSION","ident":"JSC_MICRO_VERSION","summary":"Like jsc_get_micro_version(), but from the headers used at application compile time, rather than from the library linked against at ...","deprecated":null},{"type":"constant","name":"MINOR_VERSION","ident":"JSC_MINOR_VERSION","summary":"Like jsc_get_minor_version(), but from the headers used at application compile time, rather than from the library linked against at ...","deprecated":null},{"type":"constant","name":"OPTIONS_USE_DFG","ident":"JSC_OPTIONS_USE_DFG","summary":"Allows the DFG JIT to be used if %TRUE. Option type: %JSC_OPTION_BOOLEAN Default value: %TRUE.","deprecated":null},{"type":"constant","name":"OPTIONS_USE_FTL","ident":"JSC_OPTIONS_USE_FTL","summary":"Allows the FTL JIT to be used if %TRUE. Option type: %JSC_OPTION_BOOLEAN Default value: %TRUE.","deprecated":null},{"type":"constant","name":"OPTIONS_USE_JIT","ident":"JSC_OPTIONS_USE_JIT","summary":"Allows the executable pages to be allocated for JIT and thunks if %TRUE. Option type: %JSC_OPTION_BOOLEAN Default value: %TRUE.","deprecated":null},{"type":"constant","name":"OPTIONS_USE_LLINT","ident":"JSC_OPTIONS_USE_LLINT","summary":"Allows the LLINT to be used if %TRUE. Option type: %JSC_OPTION_BOOLEAN Default value: %TRUE.","deprecated":null},{"type":"ctor","name":"new","type_name":"Context","ident":"jsc_context_new","summary":"Create a new #JSCContext. The context is created in a new #JSCVirtualMachine. Use jsc_context_new_with_virtual_machine() to create a new #JSCContext ...","deprecated":null},{"type":"ctor","name":"new","type_name":"Exception","ident":"jsc_exception_new","summary":"Create a new #JSCException in @context with @message.","deprecated":null},{"type":"ctor","name":"new","type_name":"VirtualMachine","ident":"jsc_virtual_machine_new","summary":"Create a new #JSCVirtualMachine.","deprecated":null},{"type":"ctor","name":"new","type_name":"WeakValue","ident":"jsc_weak_value_new","summary":"Create a new #JSCWeakValue for the JavaScript value referenced by @value.","deprecated":null},{"type":"ctor","name":"new_array","type_name":"Value","ident":"jsc_value_new_array","summary":"Create a new #JSCValue referencing an array with the given items. If @first_item_type is %G_TYPE_NONE an empty array is created.","deprecated":null},{"type":"ctor","name":"new_array_buffer","type_name":"Value","ident":"jsc_value_new_array_buffer","summary":"Creates a new %ArrayBuffer from existing @data in memory. The @data is not copied: while this allows sharing ...","deprecated":null},{"type":"ctor","name":"new_array_from_garray","type_name":"Value","ident":"jsc_value_new_array_from_garray","summary":"Create a new #JSCValue referencing an array with the items from @array. If @array is %NULL or empty a ...","deprecated":null},{"type":"ctor","name":"new_array_from_strv","type_name":"Value","ident":"jsc_value_new_array_from_strv","summary":"Create a new #JSCValue referencing an array of strings with the items from @strv. If @array is %NULL or ...","deprecated":null},{"type":"ctor","name":"new_boolean","type_name":"Value","ident":"jsc_value_new_boolean","summary":"Create a new #JSCValue from @value","deprecated":null},{"type":"ctor","name":"new_from_json","type_name":"Value","ident":"jsc_value_new_from_json","summary":"Create a new #JSCValue referencing a new value created by parsing @json.","deprecated":null},{"type":"ctor","name":"new_function","type_name":"Value","ident":"jsc_value_new_function","summary":"Create a function in @context. If @name is %NULL an anonymous function will be created. When the function is ...","deprecated":null},{"type":"ctor","name":"new_function_variadic","type_name":"Value","ident":"jsc_value_new_function_variadic","summary":"Create a function in @context. If @name is %NULL an anonymous function will be created. When the function is ...","deprecated":null},{"type":"ctor","name":"new_functionv","type_name":"Value","ident":"jsc_value_new_functionv","summary":"Create a function in @context. If @name is %NULL an anonymous function will be created. When the function is ...","deprecated":null},{"type":"ctor","name":"new_null","type_name":"Value","ident":"jsc_value_new_null","summary":"Create a new #JSCValue referencing null in @context.","deprecated":null},{"type":"ctor","name":"new_number","type_name":"Value","ident":"jsc_value_new_number","summary":"Create a new #JSCValue from @number.","deprecated":null},{"type":"ctor","name":"new_object","type_name":"Value","ident":"jsc_value_new_object","summary":"Create a new #JSCValue from @instance. If @instance is %NULL a new empty object is created. When @instance is ...","deprecated":null},{"type":"ctor","name":"new_printf","type_name":"Exception","ident":"jsc_exception_new_printf","summary":"Create a new #JSCException in @context using a formatted string for the message.","deprecated":null},{"type":"ctor","name":"new_promise","type_name":"Value","ident":"jsc_value_new_promise","summary":"Creates a new Promise. @executor will be invoked during promise initialization and it receives the @resolve and @reject objects ...","deprecated":null},{"type":"ctor","name":"new_string","type_name":"Value","ident":"jsc_value_new_string","summary":"Create a new #JSCValue from @string. If you need to create a #JSCValue from a string containing null characters, ...","deprecated":null},{"type":"ctor","name":"new_string_from_bytes","type_name":"Value","ident":"jsc_value_new_string_from_bytes","summary":"Create a new #JSCValue from @bytes.","deprecated":null},{"type":"ctor","name":"new_typed_array","type_name":"Value","ident":"jsc_value_new_typed_array","summary":"Create a new typed array containing a given amount of elements. Create a #JSCValue referencing a new typed ...","deprecated":null},{"type":"ctor","name":"new_undefined","type_name":"Value","ident":"jsc_value_new_undefined","summary":"Create a new #JSCValue referencing undefined in @context.","deprecated":null},{"type":"ctor","name":"new_vprintf","type_name":"Exception","ident":"jsc_exception_new_vprintf","summary":"Create a new #JSCException in @context using a formatted string for the message. This is similar to jsc_exception_new_printf() except ...","deprecated":null},{"type":"ctor","name":"new_with_name","type_name":"Exception","ident":"jsc_exception_new_with_name","summary":"Create a new #JSCException in @context with @name and @message.","deprecated":null},{"type":"ctor","name":"new_with_name_printf","type_name":"Exception","ident":"jsc_exception_new_with_name_printf","summary":"Create a new #JSCException in @context with @name and using a formatted string for the message.","deprecated":null},{"type":"ctor","name":"new_with_name_vprintf","type_name":"Exception","ident":"jsc_exception_new_with_name_vprintf","summary":"Create a new #JSCException in @context with @name and using a formatted string for the message. This is similar ...","deprecated":null},{"type":"ctor","name":"new_with_virtual_machine","type_name":"Context","ident":"jsc_context_new_with_virtual_machine","summary":"Create a new #JSCContext in @virtual_machine.","deprecated":null},{"type":"enum","name":"CheckSyntaxMode","ctype":"JSCCheckSyntaxMode","summary":"Enum values to specify a mode to check for syntax errors in jsc_context_check_syntax().","deprecated":null},{"type":"enum","name":"CheckSyntaxResult","ctype":"JSCCheckSyntaxResult","summary":"Enum values to specify the result of jsc_context_check_syntax().","deprecated":null},{"type":"enum","name":"OptionType","ctype":"JSCOptionType","summary":"Enum values for options types.","deprecated":null},{"type":"enum","name":"TypedArrayType","ctype":"JSCTypedArrayType","summary":"Possible types of the elements contained in a typed array.","deprecated":null},{"type":"function","name":"get_major_version","ident":"jsc_get_major_version","summary":"Returns the major version number of the JavaScriptCore library. (e.g. in JavaScriptCore version 1.8.3 this is 1.) This ...","deprecated":null},{"type":"function","name":"get_micro_version","ident":"jsc_get_micro_version","summary":"Returns the micro version number of the JavaScriptCore library. (e.g. in JavaScriptCore version 1.8.3 this is 3.) This ...","deprecated":null},{"type":"function","name":"get_minor_version","ident":"jsc_get_minor_version","summary":"Returns the minor version number of the JavaScriptCore library. (e.g. in JavaScriptCore version 1.8.3 this is 8.) This ...","deprecated":null},{"type":"function","name":"options_foreach","ident":"jsc_options_foreach","summary":"Iterates all available options calling @function for each one. Iteration can stop early if @function returns %FALSE.","deprecated":null},{"type":"function","name":"options_get_boolean","ident":"jsc_options_get_boolean","summary":"Get @option as a #gboolean value.","deprecated":null},{"type":"function","name":"options_get_double","ident":"jsc_options_get_double","summary":"Get @option as a #gdouble value.","deprecated":null},{"type":"function","name":"options_get_int","ident":"jsc_options_get_int","summary":"Get @option as a #gint value.","deprecated":null},{"type":"function","name":"options_get_option_group","ident":"jsc_options_get_option_group","summary":"Create a #GOptionGroup to handle JSCOptions as command line arguments. The options will be exposed as command line arguments ...","deprecated":null},{"type":"function","name":"options_get_range_string","ident":"jsc_options_get_range_string","summary":"Get @option as a range string. The string must be in the format [!]<low>[:<high>] where low and high are ...","deprecated":null},{"type":"function","name":"options_get_size","ident":"jsc_options_get_size","summary":"Get @option as a #gsize value.","deprecated":null},{"type":"function","name":"options_get_string","ident":"jsc_options_get_string","summary":"Get @option as a string.","deprecated":null},{"type":"function","name":"options_get_uint","ident":"jsc_options_get_uint","summary":"Get @option as a #guint value.","deprecated":null},{"type":"function","name":"options_set_boolean","ident":"jsc_options_set_boolean","summary":"Set @option as a #gboolean value.","deprecated":null},{"type":"function","name":"options_set_double","ident":"jsc_options_set_double","summary":"Set @option as a #gdouble value.","deprecated":null},{"type":"function","name":"options_set_int","ident":"jsc_options_set_int","summary":"Set @option as a #gint value.","deprecated":null},{"type":"function","name":"options_set_range_string","ident":"jsc_options_set_range_string","summary":"Set @option as a range string. The string must be in the format [!]<low>[:<high>] where low and high are ...","deprecated":null},{"type":"function","name":"options_set_size","ident":"jsc_options_set_size","summary":"Set @option as a #gsize value.","deprecated":null},{"type":"function","name":"options_set_string","ident":"jsc_options_set_string","summary":"Set @option as a string.","deprecated":null},{"type":"function","name":"options_set_uint","ident":"jsc_options_set_uint","summary":"Set @option as a #guint value.","deprecated":null},{"type":"function_macro","name":"CHECK_VERSION","ident":"JSC_CHECK_VERSION","summary":"Check the version of JSC header files at compile time.","deprecated":null},{"type":"function_macro","name":"DECLARE_FINAL_TYPE","ident":"JSC_DECLARE_FINAL_TYPE","summary":"No description available.","deprecated":null},{"type":"method","name":"add_constructor","type_name":"Class","ident":"jsc_class_add_constructor","summary":"Add a constructor to @jsc_class. If @name is %NULL, the class name will be used. When new is used ...","deprecated":null},{"type":"method","name":"add_constructor_variadic","type_name":"Class","ident":"jsc_class_add_constructor_variadic","summary":"Add a constructor to @jsc_class. If @name is %NULL, the class name will be used. When new is used ...","deprecated":null},{"type":"method","name":"add_constructorv","type_name":"Class","ident":"jsc_class_add_constructorv","summary":"Add a constructor to @jsc_class. If @name is %NULL, the class name will be used. When new is used ...","deprecated":null},{"type":"method","name":"add_method","type_name":"Class","ident":"jsc_class_add_method","summary":"Add method with @name to @jsc_class. When the method is called by JavaScript or jsc_value_object_invoke_method(), @callback is called receiving ...","deprecated":null},{"type":"method","name":"add_method_variadic","type_name":"Class","ident":"jsc_class_add_method_variadic","summary":"Add method with @name to @jsc_class. When the method is called by JavaScript or jsc_value_object_invoke_method(), @callback is called receiving ...","deprecated":null},{"type":"method","name":"add_methodv","type_name":"Class","ident":"jsc_class_add_methodv","summary":"Add method with @name to @jsc_class. When the method is called by JavaScript or jsc_value_object_invoke_method(), @callback is called receiving ...","deprecated":null},{"type":"method","name":"add_property","type_name":"Class","ident":"jsc_class_add_property","summary":"Add a property with @name to @jsc_class. When the property value is read, @getter is called receiving the the ...","deprecated":null},{"type":"method","name":"array_buffer_get_data","type_name":"Value","ident":"jsc_value_array_buffer_get_data","summary":"Gets a pointer to memory that contains the array buffer data. Obtains a pointer to the memory region ...","deprecated":null},{"type":"method","name":"array_buffer_get_size","type_name":"Value","ident":"jsc_value_array_buffer_get_size","summary":"Gets the size in bytes of the array buffer. Obtains the size in bytes of the memory region ...","deprecated":null},{"type":"method","name":"check_syntax","type_name":"Context","ident":"jsc_context_check_syntax","summary":"Check the given @code in @context for syntax errors. The @line_number is the starting line number in @uri; the ...","deprecated":null},{"type":"method","name":"clear_exception","type_name":"Context","ident":"jsc_context_clear_exception","summary":"Clear the uncaught exception in @context if any.","deprecated":null},{"type":"method","name":"constructor_call","type_name":"Value","ident":"jsc_value_constructor_call","summary":"Invoke new with constructor referenced by @value. If @first_parameter_type is %G_TYPE_NONE no parameters will be passed to the constructor.","deprecated":null},{"type":"method","name":"constructor_callv","type_name":"Value","ident":"jsc_value_constructor_callv","summary":"Invoke new with constructor referenced by @value. If @n_parameters is 0 no parameters will be passed to the constructor.","deprecated":null},{"type":"method","name":"evaluate","type_name":"Context","ident":"jsc_context_evaluate","summary":"Evaluate @code in @context.","deprecated":null},{"type":"method","name":"evaluate_in_object","type_name":"Context","ident":"jsc_context_evaluate_in_object","summary":"Evaluate @code and create an new object where symbols defined in @code will be added as properties, instead of ...","deprecated":null},{"type":"method","name":"evaluate_with_source_uri","type_name":"Context","ident":"jsc_context_evaluate_with_source_uri","summary":"Evaluate @code in @context using @uri as the source URI. The @line_number is the starting line number in @uri; ...","deprecated":null},{"type":"method","name":"function_call","type_name":"Value","ident":"jsc_value_function_call","summary":"Call function referenced by @value, passing the given parameters. If @first_parameter_type is %G_TYPE_NONE no parameters will be passed to ...","deprecated":null},{"type":"method","name":"function_callv","type_name":"Value","ident":"jsc_value_function_callv","summary":"Call function referenced by @value, passing the given @parameters. If @n_parameters is 0 no parameters will be passed to ...","deprecated":null},{"type":"method","name":"get_backtrace_string","type_name":"Exception","ident":"jsc_exception_get_backtrace_string","summary":"Get a string with the exception backtrace.","deprecated":null},{"type":"method","name":"get_column_number","type_name":"Exception","ident":"jsc_exception_get_column_number","summary":"Get the column number at which @exception happened.","deprecated":null},{"type":"method","name":"get_context","type_name":"Value","ident":"jsc_value_get_context","summary":"Get the #JSCContext in which @value was created.","deprecated":null},{"type":"method","name":"get_exception","type_name":"Context","ident":"jsc_context_get_exception","summary":"Get the last unhandled exception thrown in @context by API functions calls.","deprecated":null},{"type":"method","name":"get_global_object","type_name":"Context","ident":"jsc_context_get_global_object","summary":"Get a #JSCValue referencing the @context global object","deprecated":null},{"type":"method","name":"get_line_number","type_name":"Exception","ident":"jsc_exception_get_line_number","summary":"Get the line number at which @exception happened.","deprecated":null},{"type":"method","name":"get_message","type_name":"Exception","ident":"jsc_exception_get_message","summary":"Get the error message of @exception.","deprecated":null},{"type":"method","name":"get_name","type_name":"Class","ident":"jsc_class_get_name","summary":"Get the class name of @jsc_class","deprecated":null},{"type":"method","name":"get_name","type_name":"Exception","ident":"jsc_exception_get_name","summary":"Get the error name of @exception","deprecated":null},{"type":"method","name":"get_parent","type_name":"Class","ident":"jsc_class_get_parent","summary":"Get the parent class of @jsc_class","deprecated":null},{"type":"method","name":"get_source_uri","type_name":"Exception","ident":"jsc_exception_get_source_uri","summary":"Get the source URI of @exception.","deprecated":null},{"type":"method","name":"get_value","type_name":"Context","ident":"jsc_context_get_value","summary":"Get a property of @context global object with @name.","deprecated":null},{"type":"method","name":"get_value","type_name":"WeakValue","ident":"jsc_weak_value_get_value","summary":"Get a #JSCValue referencing the JavaScript value of @weak_value.","deprecated":null},{"type":"method","name":"get_virtual_machine","type_name":"Context","ident":"jsc_context_get_virtual_machine","summary":"Get the #JSCVirtualMachine where @context was created.","deprecated":null},{"type":"method","name":"is_array","type_name":"Value","ident":"jsc_value_is_array","summary":"Get whether the value referenced by @value is an array.","deprecated":null},{"type":"method","name":"is_array_buffer","type_name":"Value","ident":"jsc_value_is_array_buffer","summary":"Check whether the @value is an %ArrayBuffer.","deprecated":null},{"type":"method","name":"is_boolean","type_name":"Value","ident":"jsc_value_is_boolean","summary":"Get whether the value referenced by @value is a boolean.","deprecated":null},{"type":"method","name":"is_constructor","type_name":"Value","ident":"jsc_value_is_constructor","summary":"Get whether the value referenced by @value is a constructor.","deprecated":null},{"type":"method","name":"is_function","type_name":"Value","ident":"jsc_value_is_function","summary":"Get whether the value referenced by @value is a function","deprecated":null},{"type":"method","name":"is_null","type_name":"Value","ident":"jsc_value_is_null","summary":"Get whether the value referenced by @value is null.","deprecated":null},{"type":"method","name":"is_number","type_name":"Value","ident":"jsc_value_is_number","summary":"Get whether the value referenced by @value is a number.","deprecated":null},{"type":"method","name":"is_object","type_name":"Value","ident":"jsc_value_is_object","summary":"Get whether the value referenced by @value is an object.","deprecated":null},{"type":"method","name":"is_string","type_name":"Value","ident":"jsc_value_is_string","summary":"Get whether the value referenced by @value is a string","deprecated":null},{"type":"method","name":"is_typed_array","type_name":"Value","ident":"jsc_value_is_typed_array","summary":"Determines whether a value is a typed array.","deprecated":null},{"type":"method","name":"is_undefined","type_name":"Value","ident":"jsc_value_is_undefined","summary":"Get whether the value referenced by @value is undefined.","deprecated":null},{"type":"method","name":"new_typed_array_with_buffer","type_name":"Value","ident":"jsc_value_new_typed_array_with_buffer","summary":"Create a new typed array value with elements from an array buffer. Create a #JSCValue referencing a new ...","deprecated":null},{"type":"method","name":"object_define_property_accessor","type_name":"Value","ident":"jsc_value_object_define_property_accessor","summary":"Define or modify a property with @property_name in object referenced by @value. When the property value is read or ...","deprecated":null},{"type":"method","name":"object_define_property_data","type_name":"Value","ident":"jsc_value_object_define_property_data","summary":"Define or modify a property with @property_name in object referenced by @value. This is equivalent to JavaScript Object.defineProperty() when ...","deprecated":null},{"type":"method","name":"object_delete_property","type_name":"Value","ident":"jsc_value_object_delete_property","summary":"Try to delete property with @name from @value. This function will return %FALSE if the property was defined without ...","deprecated":null},{"type":"method","name":"object_enumerate_properties","type_name":"Value","ident":"jsc_value_object_enumerate_properties","summary":"Get the list of property names of @value. Only properties defined with %JSC_VALUE_PROPERTY_ENUMERABLE flag will be collected.","deprecated":null},{"type":"method","name":"object_get_property","type_name":"Value","ident":"jsc_value_object_get_property","summary":"Get property with @name from @value.","deprecated":null},{"type":"method","name":"object_get_property_at_index","type_name":"Value","ident":"jsc_value_object_get_property_at_index","summary":"Get property at @index from @value.","deprecated":null},{"type":"method","name":"object_has_property","type_name":"Value","ident":"jsc_value_object_has_property","summary":"Get whether @value has property with @name.","deprecated":null},{"type":"method","name":"object_invoke_method","type_name":"Value","ident":"jsc_value_object_invoke_method","summary":"Invoke method with @name on object referenced by @value, passing the given parameters. If @first_parameter_type is %G_TYPE_NONE no parameters ...","deprecated":null},{"type":"method","name":"object_invoke_methodv","type_name":"Value","ident":"jsc_value_object_invoke_methodv","summary":"Invoke method with @name on object referenced by @value, passing the given @parameters. If @n_parameters is 0 no parameters ...","deprecated":null},{"type":"method","name":"object_is_instance_of","type_name":"Value","ident":"jsc_value_object_is_instance_of","summary":"Get whether the value referenced by @value is an instance of class @name.","deprecated":null},{"type":"method","name":"object_set_property","type_name":"Value","ident":"jsc_value_object_set_property","summary":"Set @property with @name on @value.","deprecated":null},{"type":"method","name":"object_set_property_at_index","type_name":"Value","ident":"jsc_value_object_set_property_at_index","summary":"Set @property at @index on @value.","deprecated":null},{"type":"method","name":"pop_exception_handler","type_name":"Context","ident":"jsc_context_pop_exception_handler","summary":"Remove the last #JSCExceptionHandler previously pushed to @context with jsc_context_push_exception_handler().","deprecated":null},{"type":"method","name":"push_exception_handler","type_name":"Context","ident":"jsc_context_push_exception_handler","summary":"Push an exception handler in @context. Whenever a JavaScript exception happens in the #JSCContext, the given @handler will be ...","deprecated":null},{"type":"method","name":"register_class","type_name":"Context","ident":"jsc_context_register_class","summary":"Register a custom class in @context using the given @name. If the new class inherits from another #JSCClass, the ...","deprecated":null},{"type":"method","name":"report","type_name":"Exception","ident":"jsc_exception_report","summary":"Return a report message of @exception, containing all the possible details such us source URI, line, column and backtrace, ...","deprecated":null},{"type":"method","name":"set_value","type_name":"Context","ident":"jsc_context_set_value","summary":"Set a property of @context global object with @name and @value.","deprecated":null},{"type":"method","name":"throw","type_name":"Context","ident":"jsc_context_throw","summary":"Throw an exception to @context using the given error message. The created #JSCException can be retrieved with jsc_context_get_exception().","deprecated":null},{"type":"method","name":"throw_exception","type_name":"Context","ident":"jsc_context_throw_exception","summary":"Throw @exception to @context.","deprecated":null},{"type":"method","name":"throw_printf","type_name":"Context","ident":"jsc_context_throw_printf","summary":"Throw an exception to @context using the given formatted string as error message. The created #JSCException can be retrieved ...","deprecated":null},{"type":"method","name":"throw_with_name","type_name":"Context","ident":"jsc_context_throw_with_name","summary":"Throw an exception to @context using the given error name and message. The created #JSCException can be retrieved with jsc_context_get_exception().","deprecated":null},{"type":"method","name":"throw_with_name_printf","type_name":"Context","ident":"jsc_context_throw_with_name_printf","summary":"Throw an exception to @context using the given error name and the formatted string as error message. The created ...","deprecated":null},{"type":"method","name":"to_boolean","type_name":"Value","ident":"jsc_value_to_boolean","summary":"Convert @value to a boolean.","deprecated":null},{"type":"method","name":"to_double","type_name":"Value","ident":"jsc_value_to_double","summary":"Convert @value to a double.","deprecated":null},{"type":"method","name":"to_int32","type_name":"Value","ident":"jsc_value_to_int32","summary":"Convert @value to a #gint32.","deprecated":null},{"type":"method","name":"to_json","type_name":"Value","ident":"jsc_value_to_json","summary":"Create a JSON string of @value serialization. If @indent is 0, the resulting JSON will not contain newlines. The ...","deprecated":null},{"type":"method","name":"to_string","type_name":"Exception","ident":"jsc_exception_to_string","summary":"Get the string representation of @exception error.","deprecated":null},{"type":"method","name":"to_string","type_name":"Value","ident":"jsc_value_to_string","summary":"Convert @value to a string. Use jsc_value_to_string_as_bytes() instead, if you need to handle strings containing null characters.","deprecated":null},{"type":"method","name":"to_string_as_bytes","type_name":"Value","ident":"jsc_value_to_string_as_bytes","summary":"Convert @value to a string and return the results as #GBytes. This is needed to handle strings with null characters.","deprecated":null},{"type":"method","name":"typed_array_get_buffer","type_name":"Value","ident":"jsc_value_typed_array_get_buffer","summary":"Obtain the %ArrayBuffer for the memory region of the typed array elements.","deprecated":null},{"type":"method","name":"typed_array_get_data","type_name":"Value","ident":"jsc_value_typed_array_get_data","summary":"Obtains a pointer to the memory region that holds the elements of the typed array; modifications done to them ...","deprecated":null},{"type":"method","name":"typed_array_get_length","type_name":"Value","ident":"jsc_value_typed_array_get_length","summary":"Gets the number of elements in a typed array.","deprecated":null},{"type":"method","name":"typed_array_get_offset","type_name":"Value","ident":"jsc_value_typed_array_get_offset","summary":"Gets the offset over the underlying array buffer data.","deprecated":null},{"type":"method","name":"typed_array_get_size","type_name":"Value","ident":"jsc_value_typed_array_get_size","summary":"Gets the size of a typed array.","deprecated":null},{"type":"method","name":"typed_array_get_type","type_name":"Value","ident":"jsc_value_typed_array_get_type","summary":"Gets the type of elements contained in a typed array.","deprecated":null},{"type":"property","name":"context","type_name":"Class","summary":"The #JSCContext in which the class was registered.","deprecated":null},{"type":"property","name":"context","type_name":"Value","summary":"The #JSCContext in which the value was created.","deprecated":null},{"type":"property","name":"name","type_name":"Class","summary":"The name of the class.","deprecated":null},{"type":"property","name":"parent","type_name":"Class","summary":"The parent class or %NULL in case of final classes.","deprecated":null},{"type":"property","name":"value","type_name":"WeakValue","summary":"The #JSCValue referencing the JavaScript value.","deprecated":null},{"type":"property","name":"virtual-machine","type_name":"Context","summary":"The #JSCVirtualMachine in which the context was created.","deprecated":null},{"type":"record","name":"ClassVTable","ctype":"JSCClassVTable","summary":"Virtual table for a JSCClass. This can be optionally used when registering a #JSCClass in a #JSCContext to provide ...","deprecated":null},{"type":"signal","name":"cleared","type_name":"WeakValue","summary":"This signal is emitted when the JavaScript value is destroyed.","deprecated":null},{"type":"type_func","name":"get_current","type_name":"Context","ident":"jsc_context_get_current","summary":"Get the #JSCContext that is currently executing a function. This should only be called within a function or method ...","deprecated":null}],"terms":{}} \ No newline at end of file +{"meta":{"ns":"JavaScriptCore","version":"6.0","generator":"gi-docgen","generator-version":"2023.4"},"symbols":[{"type":"bitfield","name":"ValuePropertyFlags","ctype":"JSCValuePropertyFlags","summary":"Flags used when defining properties with jsc_value_object_define_property_data() and jsc_value_object_define_property_accessor().","deprecated":null},{"type":"callback","name":"ClassDeletePropertyFunction","ctype":"JSCClassDeletePropertyFunction","summary":"The type of delete_property in #JSCClassVTable. This is only required when you need to handle external properties not added ...","deprecated":null},{"type":"callback","name":"ClassEnumeratePropertiesFunction","ctype":"JSCClassEnumeratePropertiesFunction","summary":"The type of enumerate_properties in #JSCClassVTable. This is only required when you need to handle external properties not added ...","deprecated":null},{"type":"callback","name":"ClassGetPropertyFunction","ctype":"JSCClassGetPropertyFunction","summary":"The type of get_property in #JSCClassVTable. This is only required when you need to handle external properties not added ...","deprecated":null},{"type":"callback","name":"ClassHasPropertyFunction","ctype":"JSCClassHasPropertyFunction","summary":"The type of has_property in #JSCClassVTable. This is only required when you need to handle external properties not added ...","deprecated":null},{"type":"callback","name":"ClassSetPropertyFunction","ctype":"JSCClassSetPropertyFunction","summary":"The type of set_property in #JSCClassVTable. This is only required when you need to handle external properties not added ...","deprecated":null},{"type":"callback","name":"ExceptionHandler","ctype":"JSCExceptionHandler","summary":"Function used to handle JavaScript exceptions in a #JSCContext.","deprecated":null},{"type":"callback","name":"Executor","ctype":"JSCExecutor","summary":"A function passed to @jsc_value_new_promise called during initialization It is called like a JavaScript function, so exceptions raised ...","deprecated":null},{"type":"callback","name":"OptionsFunc","ctype":"JSCOptionsFunc","summary":"Function used to iterate options. Not that @description string is not localized.","deprecated":null},{"type":"class","name":"Class","ctype":"JSCClass","summary":"A JSSClass represents a custom JavaScript class registered by the user in a #JSCContext. It allows to create new ...","deprecated":null},{"type":"class","name":"Context","ctype":"JSCContext","summary":"JSCContext represents a JavaScript execution context, where all operations take place and where the values will be associated. ...","deprecated":null},{"type":"class","name":"Exception","ctype":"JSCException","summary":"JSCException represents a JavaScript exception.","deprecated":null},{"type":"class","name":"Value","ctype":"JSCValue","summary":"JSCValue represents a reference to a value in a #JSCContext. The JSCValue protects the referenced value from being garbage collected.","deprecated":null},{"type":"class","name":"VirtualMachine","ctype":"JSCVirtualMachine","summary":"JSCVirtualMachine represents a group of JSCContexts. It allows concurrent JavaScript execution by creating a different instance of JSCVirtualMachine in ...","deprecated":null},{"type":"class","name":"WeakValue","ctype":"JSCWeakValue","summary":"JSCWeakValue represents a weak reference to a value in a #JSCContext. It can be used to keep a reference ...","deprecated":null},{"type":"constant","name":"MAJOR_VERSION","ident":"JSC_MAJOR_VERSION","summary":"Like jsc_get_major_version(), but from the headers used at application compile time, rather than from the library linked against at ...","deprecated":null},{"type":"constant","name":"MICRO_VERSION","ident":"JSC_MICRO_VERSION","summary":"Like jsc_get_micro_version(), but from the headers used at application compile time, rather than from the library linked against at ...","deprecated":null},{"type":"constant","name":"MINOR_VERSION","ident":"JSC_MINOR_VERSION","summary":"Like jsc_get_minor_version(), but from the headers used at application compile time, rather than from the library linked against at ...","deprecated":null},{"type":"constant","name":"OPTIONS_USE_DFG","ident":"JSC_OPTIONS_USE_DFG","summary":"Allows the DFG JIT to be used if %TRUE. Option type: %JSC_OPTION_BOOLEAN Default value: %TRUE.","deprecated":null},{"type":"constant","name":"OPTIONS_USE_FTL","ident":"JSC_OPTIONS_USE_FTL","summary":"Allows the FTL JIT to be used if %TRUE. Option type: %JSC_OPTION_BOOLEAN Default value: %TRUE.","deprecated":null},{"type":"constant","name":"OPTIONS_USE_JIT","ident":"JSC_OPTIONS_USE_JIT","summary":"Allows the executable pages to be allocated for JIT and thunks if %TRUE. Option type: %JSC_OPTION_BOOLEAN Default value: %TRUE.","deprecated":null},{"type":"constant","name":"OPTIONS_USE_LLINT","ident":"JSC_OPTIONS_USE_LLINT","summary":"Allows the LLINT to be used if %TRUE. Option type: %JSC_OPTION_BOOLEAN Default value: %TRUE.","deprecated":null},{"type":"ctor","name":"new","type_name":"Context","ident":"jsc_context_new","summary":"Create a new #JSCContext. The context is created in a new #JSCVirtualMachine. Use jsc_context_new_with_virtual_machine() to create a new #JSCContext ...","deprecated":null},{"type":"ctor","name":"new","type_name":"Exception","ident":"jsc_exception_new","summary":"Create a new #JSCException in @context with @message.","deprecated":null},{"type":"ctor","name":"new","type_name":"VirtualMachine","ident":"jsc_virtual_machine_new","summary":"Create a new #JSCVirtualMachine.","deprecated":null},{"type":"ctor","name":"new","type_name":"WeakValue","ident":"jsc_weak_value_new","summary":"Create a new #JSCWeakValue for the JavaScript value referenced by @value.","deprecated":null},{"type":"ctor","name":"new_array","type_name":"Value","ident":"jsc_value_new_array","summary":"Create a new #JSCValue referencing an array with the given items. If @first_item_type is %G_TYPE_NONE an empty array is created.","deprecated":null},{"type":"ctor","name":"new_array_buffer","type_name":"Value","ident":"jsc_value_new_array_buffer","summary":"Creates a new %ArrayBuffer from existing @data in memory. The @data is not copied: while this allows sharing ...","deprecated":null},{"type":"ctor","name":"new_array_from_garray","type_name":"Value","ident":"jsc_value_new_array_from_garray","summary":"Create a new #JSCValue referencing an array with the items from @array. If @array is %NULL or empty a ...","deprecated":null},{"type":"ctor","name":"new_array_from_strv","type_name":"Value","ident":"jsc_value_new_array_from_strv","summary":"Create a new #JSCValue referencing an array of strings with the items from @strv. If @array is %NULL or ...","deprecated":null},{"type":"ctor","name":"new_boolean","type_name":"Value","ident":"jsc_value_new_boolean","summary":"Create a new #JSCValue from @value","deprecated":null},{"type":"ctor","name":"new_from_json","type_name":"Value","ident":"jsc_value_new_from_json","summary":"Create a new #JSCValue referencing a new value created by parsing @json.","deprecated":null},{"type":"ctor","name":"new_function","type_name":"Value","ident":"jsc_value_new_function","summary":"Create a function in @context. If @name is %NULL an anonymous function will be created. When the function is ...","deprecated":null},{"type":"ctor","name":"new_function_variadic","type_name":"Value","ident":"jsc_value_new_function_variadic","summary":"Create a function in @context. If @name is %NULL an anonymous function will be created. When the function is ...","deprecated":null},{"type":"ctor","name":"new_functionv","type_name":"Value","ident":"jsc_value_new_functionv","summary":"Create a function in @context. If @name is %NULL an anonymous function will be created. When the function is ...","deprecated":null},{"type":"ctor","name":"new_null","type_name":"Value","ident":"jsc_value_new_null","summary":"Create a new #JSCValue referencing null in @context.","deprecated":null},{"type":"ctor","name":"new_number","type_name":"Value","ident":"jsc_value_new_number","summary":"Create a new #JSCValue from @number.","deprecated":null},{"type":"ctor","name":"new_object","type_name":"Value","ident":"jsc_value_new_object","summary":"Create a new #JSCValue from @instance. If @instance is %NULL a new empty object is created. When @instance is ...","deprecated":null},{"type":"ctor","name":"new_printf","type_name":"Exception","ident":"jsc_exception_new_printf","summary":"Create a new #JSCException in @context using a formatted string for the message.","deprecated":null},{"type":"ctor","name":"new_promise","type_name":"Value","ident":"jsc_value_new_promise","summary":"Creates a new Promise. @executor will be invoked during promise initialization and it receives the @resolve and @reject objects ...","deprecated":null},{"type":"ctor","name":"new_string","type_name":"Value","ident":"jsc_value_new_string","summary":"Create a new #JSCValue from @string. If you need to create a #JSCValue from a string containing null characters, ...","deprecated":null},{"type":"ctor","name":"new_string_from_bytes","type_name":"Value","ident":"jsc_value_new_string_from_bytes","summary":"Create a new #JSCValue from @bytes.","deprecated":null},{"type":"ctor","name":"new_typed_array","type_name":"Value","ident":"jsc_value_new_typed_array","summary":"Create a new typed array containing a given amount of elements. Create a #JSCValue referencing a new typed ...","deprecated":null},{"type":"ctor","name":"new_undefined","type_name":"Value","ident":"jsc_value_new_undefined","summary":"Create a new #JSCValue referencing undefined in @context.","deprecated":null},{"type":"ctor","name":"new_vprintf","type_name":"Exception","ident":"jsc_exception_new_vprintf","summary":"Create a new #JSCException in @context using a formatted string for the message. This is similar to jsc_exception_new_printf() except ...","deprecated":null},{"type":"ctor","name":"new_with_name","type_name":"Exception","ident":"jsc_exception_new_with_name","summary":"Create a new #JSCException in @context with @name and @message.","deprecated":null},{"type":"ctor","name":"new_with_name_printf","type_name":"Exception","ident":"jsc_exception_new_with_name_printf","summary":"Create a new #JSCException in @context with @name and using a formatted string for the message.","deprecated":null},{"type":"ctor","name":"new_with_name_vprintf","type_name":"Exception","ident":"jsc_exception_new_with_name_vprintf","summary":"Create a new #JSCException in @context with @name and using a formatted string for the message. This is similar ...","deprecated":null},{"type":"ctor","name":"new_with_virtual_machine","type_name":"Context","ident":"jsc_context_new_with_virtual_machine","summary":"Create a new #JSCContext in @virtual_machine.","deprecated":null},{"type":"enum","name":"CheckSyntaxMode","ctype":"JSCCheckSyntaxMode","summary":"Enum values to specify a mode to check for syntax errors in jsc_context_check_syntax().","deprecated":null},{"type":"enum","name":"CheckSyntaxResult","ctype":"JSCCheckSyntaxResult","summary":"Enum values to specify the result of jsc_context_check_syntax().","deprecated":null},{"type":"enum","name":"OptionType","ctype":"JSCOptionType","summary":"Enum values for options types.","deprecated":null},{"type":"enum","name":"TypedArrayType","ctype":"JSCTypedArrayType","summary":"Possible types of the elements contained in a typed array.","deprecated":null},{"type":"function","name":"get_major_version","ident":"jsc_get_major_version","summary":"Returns the major version number of the JavaScriptCore library. (e.g. in JavaScriptCore version 1.8.3 this is 1.) This ...","deprecated":null},{"type":"function","name":"get_micro_version","ident":"jsc_get_micro_version","summary":"Returns the micro version number of the JavaScriptCore library. (e.g. in JavaScriptCore version 1.8.3 this is 3.) This ...","deprecated":null},{"type":"function","name":"get_minor_version","ident":"jsc_get_minor_version","summary":"Returns the minor version number of the JavaScriptCore library. (e.g. in JavaScriptCore version 1.8.3 this is 8.) This ...","deprecated":null},{"type":"function","name":"options_foreach","ident":"jsc_options_foreach","summary":"Iterates all available options calling @function for each one. Iteration can stop early if @function returns %FALSE.","deprecated":null},{"type":"function","name":"options_get_boolean","ident":"jsc_options_get_boolean","summary":"Get @option as a #gboolean value.","deprecated":null},{"type":"function","name":"options_get_double","ident":"jsc_options_get_double","summary":"Get @option as a #gdouble value.","deprecated":null},{"type":"function","name":"options_get_int","ident":"jsc_options_get_int","summary":"Get @option as a #gint value.","deprecated":null},{"type":"function","name":"options_get_option_group","ident":"jsc_options_get_option_group","summary":"Create a #GOptionGroup to handle JSCOptions as command line arguments. The options will be exposed as command line arguments ...","deprecated":null},{"type":"function","name":"options_get_range_string","ident":"jsc_options_get_range_string","summary":"Get @option as a range string. The string must be in the format [!]<low>[:<high>] where low and high are ...","deprecated":null},{"type":"function","name":"options_get_size","ident":"jsc_options_get_size","summary":"Get @option as a #gsize value.","deprecated":null},{"type":"function","name":"options_get_string","ident":"jsc_options_get_string","summary":"Get @option as a string.","deprecated":null},{"type":"function","name":"options_get_uint","ident":"jsc_options_get_uint","summary":"Get @option as a #guint value.","deprecated":null},{"type":"function","name":"options_set_boolean","ident":"jsc_options_set_boolean","summary":"Set @option as a #gboolean value.","deprecated":null},{"type":"function","name":"options_set_double","ident":"jsc_options_set_double","summary":"Set @option as a #gdouble value.","deprecated":null},{"type":"function","name":"options_set_int","ident":"jsc_options_set_int","summary":"Set @option as a #gint value.","deprecated":null},{"type":"function","name":"options_set_range_string","ident":"jsc_options_set_range_string","summary":"Set @option as a range string. The string must be in the format [!]<low>[:<high>] where low and high are ...","deprecated":null},{"type":"function","name":"options_set_size","ident":"jsc_options_set_size","summary":"Set @option as a #gsize value.","deprecated":null},{"type":"function","name":"options_set_string","ident":"jsc_options_set_string","summary":"Set @option as a string.","deprecated":null},{"type":"function","name":"options_set_uint","ident":"jsc_options_set_uint","summary":"Set @option as a #guint value.","deprecated":null},{"type":"function_macro","name":"CHECK_VERSION","ident":"JSC_CHECK_VERSION","summary":"Check the version of JSC header files at compile time.","deprecated":null},{"type":"function_macro","name":"DECLARE_FINAL_TYPE","ident":"JSC_DECLARE_FINAL_TYPE","summary":"No description available.","deprecated":null},{"type":"method","name":"add_constructor","type_name":"Class","ident":"jsc_class_add_constructor","summary":"Add a constructor to @jsc_class. If @name is %NULL, the class name will be used. When new is used ...","deprecated":null},{"type":"method","name":"add_constructor_variadic","type_name":"Class","ident":"jsc_class_add_constructor_variadic","summary":"Add a constructor to @jsc_class. If @name is %NULL, the class name will be used. When new is used ...","deprecated":null},{"type":"method","name":"add_constructorv","type_name":"Class","ident":"jsc_class_add_constructorv","summary":"Add a constructor to @jsc_class. If @name is %NULL, the class name will be used. When new is used ...","deprecated":null},{"type":"method","name":"add_method","type_name":"Class","ident":"jsc_class_add_method","summary":"Add method with @name to @jsc_class. When the method is called by JavaScript or jsc_value_object_invoke_method(), @callback is called receiving ...","deprecated":null},{"type":"method","name":"add_method_variadic","type_name":"Class","ident":"jsc_class_add_method_variadic","summary":"Add method with @name to @jsc_class. When the method is called by JavaScript or jsc_value_object_invoke_method(), @callback is called receiving ...","deprecated":null},{"type":"method","name":"add_methodv","type_name":"Class","ident":"jsc_class_add_methodv","summary":"Add method with @name to @jsc_class. When the method is called by JavaScript or jsc_value_object_invoke_method(), @callback is called receiving ...","deprecated":null},{"type":"method","name":"add_property","type_name":"Class","ident":"jsc_class_add_property","summary":"Add a property with @name to @jsc_class. When the property value is read, @getter is called receiving the the ...","deprecated":null},{"type":"method","name":"array_buffer_get_data","type_name":"Value","ident":"jsc_value_array_buffer_get_data","summary":"Gets a pointer to memory that contains the array buffer data. Obtains a pointer to the memory region ...","deprecated":null},{"type":"method","name":"array_buffer_get_size","type_name":"Value","ident":"jsc_value_array_buffer_get_size","summary":"Gets the size in bytes of the array buffer. Obtains the size in bytes of the memory region ...","deprecated":null},{"type":"method","name":"check_syntax","type_name":"Context","ident":"jsc_context_check_syntax","summary":"Check the given @code in @context for syntax errors. The @line_number is the starting line number in @uri; the ...","deprecated":null},{"type":"method","name":"clear_exception","type_name":"Context","ident":"jsc_context_clear_exception","summary":"Clear the uncaught exception in @context if any.","deprecated":null},{"type":"method","name":"constructor_call","type_name":"Value","ident":"jsc_value_constructor_call","summary":"Invoke new with constructor referenced by @value. If @first_parameter_type is %G_TYPE_NONE no parameters will be passed to the constructor.","deprecated":null},{"type":"method","name":"constructor_callv","type_name":"Value","ident":"jsc_value_constructor_callv","summary":"Invoke new with constructor referenced by @value. If @n_parameters is 0 no parameters will be passed to the constructor.","deprecated":null},{"type":"method","name":"evaluate","type_name":"Context","ident":"jsc_context_evaluate","summary":"Evaluate @code in @context.","deprecated":null},{"type":"method","name":"evaluate_in_object","type_name":"Context","ident":"jsc_context_evaluate_in_object","summary":"Evaluate @code and create an new object where symbols defined in @code will be added as properties, instead of ...","deprecated":null},{"type":"method","name":"evaluate_with_source_uri","type_name":"Context","ident":"jsc_context_evaluate_with_source_uri","summary":"Evaluate @code in @context using @uri as the source URI. The @line_number is the starting line number in @uri; ...","deprecated":null},{"type":"method","name":"function_call","type_name":"Value","ident":"jsc_value_function_call","summary":"Call function referenced by @value, passing the given parameters. If @first_parameter_type is %G_TYPE_NONE no parameters will be passed to ...","deprecated":null},{"type":"method","name":"function_callv","type_name":"Value","ident":"jsc_value_function_callv","summary":"Call function referenced by @value, passing the given @parameters. If @n_parameters is 0 no parameters will be passed to ...","deprecated":null},{"type":"method","name":"get_backtrace_string","type_name":"Exception","ident":"jsc_exception_get_backtrace_string","summary":"Get a string with the exception backtrace.","deprecated":null},{"type":"method","name":"get_column_number","type_name":"Exception","ident":"jsc_exception_get_column_number","summary":"Get the column number at which @exception happened.","deprecated":null},{"type":"method","name":"get_context","type_name":"Value","ident":"jsc_value_get_context","summary":"Get the #JSCContext in which @value was created.","deprecated":null},{"type":"method","name":"get_exception","type_name":"Context","ident":"jsc_context_get_exception","summary":"Get the last unhandled exception thrown in @context by API functions calls.","deprecated":null},{"type":"method","name":"get_global_object","type_name":"Context","ident":"jsc_context_get_global_object","summary":"Get a #JSCValue referencing the @context global object","deprecated":null},{"type":"method","name":"get_line_number","type_name":"Exception","ident":"jsc_exception_get_line_number","summary":"Get the line number at which @exception happened.","deprecated":null},{"type":"method","name":"get_message","type_name":"Exception","ident":"jsc_exception_get_message","summary":"Get the error message of @exception.","deprecated":null},{"type":"method","name":"get_name","type_name":"Class","ident":"jsc_class_get_name","summary":"Get the class name of @jsc_class","deprecated":null},{"type":"method","name":"get_name","type_name":"Exception","ident":"jsc_exception_get_name","summary":"Get the error name of @exception","deprecated":null},{"type":"method","name":"get_parent","type_name":"Class","ident":"jsc_class_get_parent","summary":"Get the parent class of @jsc_class","deprecated":null},{"type":"method","name":"get_source_uri","type_name":"Exception","ident":"jsc_exception_get_source_uri","summary":"Get the source URI of @exception.","deprecated":null},{"type":"method","name":"get_value","type_name":"Context","ident":"jsc_context_get_value","summary":"Get a property of @context global object with @name.","deprecated":null},{"type":"method","name":"get_value","type_name":"WeakValue","ident":"jsc_weak_value_get_value","summary":"Get a #JSCValue referencing the JavaScript value of @weak_value.","deprecated":null},{"type":"method","name":"get_virtual_machine","type_name":"Context","ident":"jsc_context_get_virtual_machine","summary":"Get the #JSCVirtualMachine where @context was created.","deprecated":null},{"type":"method","name":"is_array","type_name":"Value","ident":"jsc_value_is_array","summary":"Get whether the value referenced by @value is an array.","deprecated":null},{"type":"method","name":"is_array_buffer","type_name":"Value","ident":"jsc_value_is_array_buffer","summary":"Check whether the @value is an %ArrayBuffer.","deprecated":null},{"type":"method","name":"is_boolean","type_name":"Value","ident":"jsc_value_is_boolean","summary":"Get whether the value referenced by @value is a boolean.","deprecated":null},{"type":"method","name":"is_constructor","type_name":"Value","ident":"jsc_value_is_constructor","summary":"Get whether the value referenced by @value is a constructor.","deprecated":null},{"type":"method","name":"is_function","type_name":"Value","ident":"jsc_value_is_function","summary":"Get whether the value referenced by @value is a function","deprecated":null},{"type":"method","name":"is_null","type_name":"Value","ident":"jsc_value_is_null","summary":"Get whether the value referenced by @value is null.","deprecated":null},{"type":"method","name":"is_number","type_name":"Value","ident":"jsc_value_is_number","summary":"Get whether the value referenced by @value is a number.","deprecated":null},{"type":"method","name":"is_object","type_name":"Value","ident":"jsc_value_is_object","summary":"Get whether the value referenced by @value is an object.","deprecated":null},{"type":"method","name":"is_string","type_name":"Value","ident":"jsc_value_is_string","summary":"Get whether the value referenced by @value is a string","deprecated":null},{"type":"method","name":"is_typed_array","type_name":"Value","ident":"jsc_value_is_typed_array","summary":"Determines whether a value is a typed array.","deprecated":null},{"type":"method","name":"is_undefined","type_name":"Value","ident":"jsc_value_is_undefined","summary":"Get whether the value referenced by @value is undefined.","deprecated":null},{"type":"method","name":"new_typed_array_with_buffer","type_name":"Value","ident":"jsc_value_new_typed_array_with_buffer","summary":"Create a new typed array value with elements from an array buffer. Create a #JSCValue referencing a new ...","deprecated":null},{"type":"method","name":"object_define_property_accessor","type_name":"Value","ident":"jsc_value_object_define_property_accessor","summary":"Define or modify a property with @property_name in object referenced by @value. When the property value is read or ...","deprecated":null},{"type":"method","name":"object_define_property_data","type_name":"Value","ident":"jsc_value_object_define_property_data","summary":"Define or modify a property with @property_name in object referenced by @value. This is equivalent to JavaScript Object.defineProperty() when ...","deprecated":null},{"type":"method","name":"object_delete_property","type_name":"Value","ident":"jsc_value_object_delete_property","summary":"Try to delete property with @name from @value. This function will return %FALSE if the property was defined without ...","deprecated":null},{"type":"method","name":"object_enumerate_properties","type_name":"Value","ident":"jsc_value_object_enumerate_properties","summary":"Get the list of property names of @value. Only properties defined with %JSC_VALUE_PROPERTY_ENUMERABLE flag will be collected.","deprecated":null},{"type":"method","name":"object_get_property","type_name":"Value","ident":"jsc_value_object_get_property","summary":"Get property with @name from @value.","deprecated":null},{"type":"method","name":"object_get_property_at_index","type_name":"Value","ident":"jsc_value_object_get_property_at_index","summary":"Get property at @index from @value.","deprecated":null},{"type":"method","name":"object_has_property","type_name":"Value","ident":"jsc_value_object_has_property","summary":"Get whether @value has property with @name.","deprecated":null},{"type":"method","name":"object_invoke_method","type_name":"Value","ident":"jsc_value_object_invoke_method","summary":"Invoke method with @name on object referenced by @value, passing the given parameters. If @first_parameter_type is %G_TYPE_NONE no parameters ...","deprecated":null},{"type":"method","name":"object_invoke_methodv","type_name":"Value","ident":"jsc_value_object_invoke_methodv","summary":"Invoke method with @name on object referenced by @value, passing the given @parameters. If @n_parameters is 0 no parameters ...","deprecated":null},{"type":"method","name":"object_is_instance_of","type_name":"Value","ident":"jsc_value_object_is_instance_of","summary":"Get whether the value referenced by @value is an instance of class @name.","deprecated":null},{"type":"method","name":"object_set_property","type_name":"Value","ident":"jsc_value_object_set_property","summary":"Set @property with @name on @value.","deprecated":null},{"type":"method","name":"object_set_property_at_index","type_name":"Value","ident":"jsc_value_object_set_property_at_index","summary":"Set @property at @index on @value.","deprecated":null},{"type":"method","name":"pop_exception_handler","type_name":"Context","ident":"jsc_context_pop_exception_handler","summary":"Remove the last #JSCExceptionHandler previously pushed to @context with jsc_context_push_exception_handler().","deprecated":null},{"type":"method","name":"push_exception_handler","type_name":"Context","ident":"jsc_context_push_exception_handler","summary":"Push an exception handler in @context. Whenever a JavaScript exception happens in the #JSCContext, the given @handler will be ...","deprecated":null},{"type":"method","name":"register_class","type_name":"Context","ident":"jsc_context_register_class","summary":"Register a custom class in @context using the given @name. If the new class inherits from another #JSCClass, the ...","deprecated":null},{"type":"method","name":"report","type_name":"Exception","ident":"jsc_exception_report","summary":"Return a report message of @exception, containing all the possible details such us source URI, line, column and backtrace, ...","deprecated":null},{"type":"method","name":"set_value","type_name":"Context","ident":"jsc_context_set_value","summary":"Set a property of @context global object with @name and @value.","deprecated":null},{"type":"method","name":"throw","type_name":"Context","ident":"jsc_context_throw","summary":"Throw an exception to @context using the given error message. The created #JSCException can be retrieved with jsc_context_get_exception().","deprecated":null},{"type":"method","name":"throw_exception","type_name":"Context","ident":"jsc_context_throw_exception","summary":"Throw @exception to @context.","deprecated":null},{"type":"method","name":"throw_printf","type_name":"Context","ident":"jsc_context_throw_printf","summary":"Throw an exception to @context using the given formatted string as error message. The created #JSCException can be retrieved ...","deprecated":null},{"type":"method","name":"throw_with_name","type_name":"Context","ident":"jsc_context_throw_with_name","summary":"Throw an exception to @context using the given error name and message. The created #JSCException can be retrieved with jsc_context_get_exception().","deprecated":null},{"type":"method","name":"throw_with_name_printf","type_name":"Context","ident":"jsc_context_throw_with_name_printf","summary":"Throw an exception to @context using the given error name and the formatted string as error message. The created ...","deprecated":null},{"type":"method","name":"to_boolean","type_name":"Value","ident":"jsc_value_to_boolean","summary":"Convert @value to a boolean.","deprecated":null},{"type":"method","name":"to_double","type_name":"Value","ident":"jsc_value_to_double","summary":"Convert @value to a double.","deprecated":null},{"type":"method","name":"to_int32","type_name":"Value","ident":"jsc_value_to_int32","summary":"Convert @value to a #gint32.","deprecated":null},{"type":"method","name":"to_json","type_name":"Value","ident":"jsc_value_to_json","summary":"Create a JSON string of @value serialization. If @indent is 0, the resulting JSON will not contain newlines. The ...","deprecated":null},{"type":"method","name":"to_string","type_name":"Exception","ident":"jsc_exception_to_string","summary":"Get the string representation of @exception error.","deprecated":null},{"type":"method","name":"to_string","type_name":"Value","ident":"jsc_value_to_string","summary":"Convert @value to a string. Use jsc_value_to_string_as_bytes() instead, if you need to handle strings containing null characters.","deprecated":null},{"type":"method","name":"to_string_as_bytes","type_name":"Value","ident":"jsc_value_to_string_as_bytes","summary":"Convert @value to a string and return the results as #GBytes. This is needed to handle strings with null characters.","deprecated":null},{"type":"method","name":"typed_array_get_buffer","type_name":"Value","ident":"jsc_value_typed_array_get_buffer","summary":"Obtain the %ArrayBuffer for the memory region of the typed array elements.","deprecated":null},{"type":"method","name":"typed_array_get_data","type_name":"Value","ident":"jsc_value_typed_array_get_data","summary":"Obtains a pointer to the memory region that holds the elements of the typed array; modifications done to them ...","deprecated":null},{"type":"method","name":"typed_array_get_length","type_name":"Value","ident":"jsc_value_typed_array_get_length","summary":"Gets the number of elements in a typed array.","deprecated":null},{"type":"method","name":"typed_array_get_offset","type_name":"Value","ident":"jsc_value_typed_array_get_offset","summary":"Gets the offset over the underlying array buffer data.","deprecated":null},{"type":"method","name":"typed_array_get_size","type_name":"Value","ident":"jsc_value_typed_array_get_size","summary":"Gets the size of a typed array.","deprecated":null},{"type":"method","name":"typed_array_get_type","type_name":"Value","ident":"jsc_value_typed_array_get_type","summary":"Gets the type of elements contained in a typed array.","deprecated":null},{"type":"property","name":"context","type_name":"Class","summary":"The #JSCContext in which the class was registered.","deprecated":null},{"type":"property","name":"context","type_name":"Value","summary":"The #JSCContext in which the value was created.","deprecated":null},{"type":"property","name":"name","type_name":"Class","summary":"The name of the class.","deprecated":null},{"type":"property","name":"parent","type_name":"Class","summary":"The parent class or %NULL in case of final classes.","deprecated":null},{"type":"property","name":"value","type_name":"WeakValue","summary":"The #JSCValue referencing the JavaScript value.","deprecated":null},{"type":"property","name":"virtual-machine","type_name":"Context","summary":"The #JSCVirtualMachine in which the context was created.","deprecated":null},{"type":"record","name":"ClassVTable","ctype":"JSCClassVTable","summary":"Virtual table for a JSCClass. This can be optionally used when registering a #JSCClass in a #JSCContext to provide ...","deprecated":null},{"type":"signal","name":"cleared","type_name":"WeakValue","summary":"This signal is emitted when the JavaScript value is destroyed.","deprecated":null},{"type":"type_func","name":"get_current","type_name":"Context","ident":"jsc_context_get_current","summary":"Get the #JSCContext that is currently executing a function. This should only be called within a function or method ...","deprecated":null}],"terms":{}} \ No newline at end of file diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/javascriptcoregtk-6.0.devhelp2 webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/javascriptcoregtk-6.0.devhelp2 --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/javascriptcoregtk-6.0.devhelp2 2026-04-16 17:28:33.959338700 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/javascriptcoregtk-6.0.devhelp2 2026-07-09 07:28:48.767701100 +0000 @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Class.add_constructor.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_constructor.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Class.add_constructor.html 2026-04-16 17:28:30.991330900 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_constructor.html 2026-07-09 07:28:48.192817400 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@
name

Type: const char*

-

The constructor name or NULL.

+

The constructor name or NULL.

Version2.52.3
Version2.52.5
AuthorsThe WebKit GTK and WPE teams
LicenseBSD, LGPL-2.1
Websitehttps://webkit.org

JSCContext represents a JavaScript execution context, where all operations take place and where the values will be associated.

-

unstable since: 6.0

+

JSCException represents a JavaScript exception.

-

unstable since: 6.0

+

JSCValue represents a reference to a value in a JSCContext. The JSCValue protects the referenced value from being garbage collected.

-

unstable since: 6.0

+

Enum values to specify a mode to check for syntax errors in jsc_context_check_syntax().

-

unstable since: 6.0

+

Enum values to specify the result of jsc_context_check_syntax().

-

unstable since: 6.0

+

Flags used when defining properties with jsc_value_object_define_property_data() and jsc_value_object_define_property_accessor().

-

unstable since: 6.0

+

The type of delete_property in JSCClassVTable. This is only required when you need to handle external properties not added to the prototype.

-

unstable since: 6.0

+

The type of enumerate_properties in JSCClassVTable. This is only required when you need to handle external properties not added to the prototype.

-

unstable since: 6.0

+

The type of get_property in JSCClassVTable. This is only required when you need to handle external properties not added to the prototype.

-

unstable since: 6.0

+

The type of has_property in JSCClassVTable. This is only required when you need to handle external properties not added to the prototype.

-

unstable since: 6.0

+

The type of set_property in JSCClassVTable. This is only required when you need to handle external properties not added to the prototype.

-

unstable since: 6.0

+

Function used to handle JavaScript exceptions in a JSCContext.

-

unstable since: 6.0

+

Returns the major version number of the JavaScriptCore library. (e.g. in JavaScriptCore version 1.8.3 this is 1.)

-

unstable since: 6.0

+

Returns the micro version number of the JavaScriptCore library. (e.g. in JavaScriptCore version 1.8.3 this is 3.)

-

unstable since: 6.0

+

Returns the minor version number of the JavaScriptCore library. (e.g. in JavaScriptCore version 1.8.3 this is 8.)

-

unstable since: 6.0

+

Check the version of JSC header files at compile time.

-

unstable since: 6.0

+

-

unstable since: 6.0

+

@@ -204,7 +204,7 @@
callback

Type: GCallback

-

A GCallback to be called to create an instance of jsc_class.

+

A GCallback to be called to create an instance of jsc_class.

The argument can be NULL.
@@ -221,7 +221,7 @@
user_data

Type: gpointer

-

User data to pass to callback.

+

User data to pass to callback.

@@ -238,7 +238,7 @@
destroy_notify

Type: GDestroyNotify

-

Destroy notifier for user_data.

+

Destroy notifier for user_data.

The argument can be NULL.
@@ -255,7 +255,7 @@
return_type

Type: GType

-

The GType of the constructor return value.

+

The GType of the constructor return value.

The argument can be NULL.
@@ -272,7 +272,7 @@
n_params

Type: guint

-

The number of parameter types to follow or 0 if constructor doesn’t receive parameters.

+

The number of parameter types to follow or 0 if constructor doesn’t receive parameters.

@@ -289,7 +289,7 @@
...

Type: 

-

A list of GTypes, one for each parameter.

+

A list of GTypes, one for each parameter.

@@ -321,14 +321,14 @@

Type: JSCValue

-

A JSCValue representing the class constructor.

+

A JSCValue representing the class constructor.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Class.add_constructor_variadic.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_constructor_variadic.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Class.add_constructor_variadic.html 2026-04-16 17:28:31.070331000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_constructor_variadic.html 2026-07-09 07:28:48.201585000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,7 +185,7 @@
name

Type: const char*

-

The constructor name or NULL.

+

The constructor name or NULL.

@@ -202,7 +202,7 @@
callback

Type: GCallback

-

A GCallback to be called to create an instance of jsc_class.

+

A GCallback to be called to create an instance of jsc_class.

The argument can be NULL.
@@ -219,7 +219,7 @@
user_data

Type: gpointer

-

User data to pass to callback.

+

User data to pass to callback.

@@ -236,7 +236,7 @@
destroy_notify

Type: GDestroyNotify

-

Destroy notifier for user_data.

+

Destroy notifier for user_data.

The argument can be NULL.
@@ -253,7 +253,7 @@
return_type

Type: GType

-

The GType of the constructor return value.

+

The GType of the constructor return value.

The argument can be NULL.
@@ -285,14 +285,14 @@

Type: JSCValue

-

A JSCValue representing the class constructor.

+

A JSCValue representing the class constructor.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Class.add_constructorv.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_constructorv.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Class.add_constructorv.html 2026-04-16 17:28:31.165331400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_constructorv.html 2026-07-09 07:28:48.210777500 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@
name

Type: const char*

-

The constructor name or NULL.

+

The constructor name or NULL.

@@ -204,7 +204,7 @@
callback

Type: GCallback

-

A GCallback to be called to create an instance of jsc_class.

+

A GCallback to be called to create an instance of jsc_class.

The argument can be NULL.
@@ -221,7 +221,7 @@
user_data

Type: gpointer

-

User data to pass to callback.

+

User data to pass to callback.

@@ -238,7 +238,7 @@
destroy_notify

Type: GDestroyNotify

-

Destroy notifier for user_data.

+

Destroy notifier for user_data.

The argument can be NULL.
@@ -255,7 +255,7 @@
return_type

Type: GType

-

The GType of the constructor return value.

+

The GType of the constructor return value.

The argument can be NULL.
@@ -272,7 +272,7 @@
n_parameters

Type: guint

-

The number of parameters.

+

The number of parameters.

@@ -289,7 +289,7 @@
parameter_types

Type: An array of GType

-

A list of GTypes, one for each parameter, or NULL.

+

A list of GTypes, one for each parameter, or NULL.

@@ -321,14 +321,14 @@

Type: JSCValue

-

A JSCValue representing the class constructor.

+

A JSCValue representing the class constructor.

The argument can be NULL.
- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Class.add_method.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_method.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Class.add_method.html 2026-04-16 17:28:31.240331400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_method.html 2026-07-09 07:28:48.219725800 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@

-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@
name

Type: const char*

-

The method name.

+

The method name.

@@ -204,7 +204,7 @@
callback

Type: GCallback

-

A GCallback to be called to invoke method name of jsc_class.

+

A GCallback to be called to invoke method name of jsc_class.

@@ -221,7 +221,7 @@
user_data

Type: gpointer

-

User data to pass to callback.

+

User data to pass to callback.

@@ -238,7 +238,7 @@
destroy_notify

Type: GDestroyNotify

-

Destroy notifier for user_data.

+

Destroy notifier for user_data.

The argument can be NULL.
@@ -255,7 +255,7 @@
return_type

Type: GType

-

The GType of the method return value, or G_TYPE_NONE if the method is void.

+

The GType of the method return value, or G_TYPE_NONE if the method is void.

The argument can be NULL.
@@ -272,7 +272,7 @@
n_params

Type: guint

-

The number of parameter types to follow or 0 if the method doesn’t receive parameters.

+

The number of parameter types to follow or 0 if the method doesn’t receive parameters.

@@ -289,7 +289,7 @@
...

Type: 

-

A list of GTypes, one for each parameter.

+

A list of GTypes, one for each parameter.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Class.add_method_variadic.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_method_variadic.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Class.add_method_variadic.html 2026-04-16 17:28:31.307331600 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_method_variadic.html 2026-07-09 07:28:48.225807000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,7 +185,7 @@
name

Type: const char*

-

The method name.

+

The method name.

@@ -202,7 +202,7 @@
callback

Type: GCallback

-

A GCallback to be called to invoke method name of jsc_class.

+

A GCallback to be called to invoke method name of jsc_class.

@@ -219,7 +219,7 @@
user_data

Type: gpointer

-

User data to pass to callback.

+

User data to pass to callback.

@@ -236,7 +236,7 @@
destroy_notify

Type: GDestroyNotify

-

Destroy notifier for user_data.

+

Destroy notifier for user_data.

The argument can be NULL.
@@ -253,7 +253,7 @@
return_type

Type: GType

-

The GType of the method return value, or G_TYPE_NONE if the method is void.

+

The GType of the method return value, or G_TYPE_NONE if the method is void.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Class.add_methodv.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_methodv.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Class.add_methodv.html 2026-04-16 17:28:31.377331700 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_methodv.html 2026-07-09 07:28:48.235784000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@
name

Type: const char*

-

The method name.

+

The method name.

@@ -204,7 +204,7 @@
callback

Type: GCallback

-

A GCallback to be called to invoke method name of jsc_class.

+

A GCallback to be called to invoke method name of jsc_class.

@@ -221,7 +221,7 @@
user_data

Type: gpointer

-

User data to pass to callback.

+

User data to pass to callback.

@@ -238,7 +238,7 @@
destroy_notify

Type: GDestroyNotify

-

Destroy notifier for user_data.

+

Destroy notifier for user_data.

The argument can be NULL.
@@ -255,7 +255,7 @@
return_type

Type: GType

-

The GType of the method return value, or G_TYPE_NONE if the method is void.

+

The GType of the method return value, or G_TYPE_NONE if the method is void.

The argument can be NULL.
@@ -272,7 +272,7 @@
n_parameters

Type: guint

-

The number of parameter types to follow or 0 if the method doesn’t receive parameters.

+

The number of parameter types to follow or 0 if the method doesn’t receive parameters.

@@ -289,7 +289,7 @@
parameter_types

Type: An array of GType

-

A list of GTypes, one for each parameter, or NULL.

+

A list of GTypes, one for each parameter, or NULL.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Class.add_property.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_property.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Class.add_property.html 2026-04-16 17:28:31.428331900 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.add_property.html 2026-07-09 07:28:48.244106300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@
name

Type: const char*

-

The property name.

+

The property name.

The argument can be NULL.
@@ -204,7 +204,7 @@
property_type

Type: GType

-

The GType of the property value.

+

The GType of the property value.

@@ -221,7 +221,7 @@
getter

Type: GCallback

-

A GCallback to be called to get the property value.

+

A GCallback to be called to get the property value.

@@ -238,7 +238,7 @@
setter

Type: GCallback

-

A GCallback to be called to set the property value.

+

A GCallback to be called to set the property value.

The argument can be NULL.
@@ -255,7 +255,7 @@
user_data

Type: gpointer

-

User data to pass to getter and setter.

+

User data to pass to getter and setter.

The argument can be NULL.
@@ -272,7 +272,7 @@
destroy_notify

Type: GDestroyNotify

-

Destroy notifier for user_data.

+

Destroy notifier for user_data.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Class.get_name.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.get_name.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Class.get_name.html 2026-04-16 17:28:31.441331900 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.get_name.html 2026-07-09 07:28:48.246533200 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -181,14 +181,14 @@

Type: const char*

-

The name of jsc_class.

+

The name of jsc_class.

The argument can be NULL.
- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Class.get_parent.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.get_parent.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Class.get_parent.html 2026-04-16 17:28:31.456332000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Class.get_parent.html 2026-07-09 07:28:48.249175000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -181,14 +181,14 @@

Type: JSCClass

-

The parent class of jsc_class.

+

The parent class of jsc_class.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.check_syntax.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.check_syntax.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.check_syntax.html 2026-04-16 17:28:31.650332500 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.check_syntax.html 2026-07-09 07:28:48.292556300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -200,7 +200,7 @@
code

Type: const char*

-

A JavaScript script to check.

+

A JavaScript script to check.

@@ -217,7 +217,7 @@
length

Type: gssize

-

Length of code, or -1 if code is a nul-terminated string.

+

Length of code, or -1 if code is a nul-terminated string.

@@ -234,7 +234,7 @@
mode

Type: JSCCheckSyntaxMode

-

A JSCCheckSyntaxMode.

+

A JSCCheckSyntaxMode.

@@ -251,7 +251,7 @@
uri

Type: const char*

-

The source URI.

+

The source URI.

@@ -268,7 +268,7 @@
line_number

Type: unsigned

-

The starting line number.

+

The starting line number.

@@ -285,7 +285,7 @@
exception

Type: JSCException

-

Return location for a JSCException, or NULL to ignore.

+

Return location for a JSCException, or NULL to ignore.

@@ -294,7 +294,7 @@ - +
The argument will be set by the function.
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
@@ -317,7 +317,7 @@

Type: JSCCheckSyntaxResult

-

A JSCCheckSyntaxResult.

+

A JSCCheckSyntaxResult.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.clear_exception.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.clear_exception.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.clear_exception.html 2026-04-16 17:28:31.659332500 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.clear_exception.html 2026-07-09 07:28:48.294381000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.evaluate.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.evaluate.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.evaluate.html 2026-04-16 17:28:31.679332500 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.evaluate.html 2026-07-09 07:28:48.298344100 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -193,7 +193,7 @@
code

Type: const char*

-

A JavaScript script to evaluate.

+

A JavaScript script to evaluate.

@@ -210,7 +210,7 @@
length

Type: gssize

-

Length of code, or -1 if code is a nul-terminated string.

+

Length of code, or -1 if code is a nul-terminated string.

@@ -242,14 +242,14 @@

Type: JSCValue

-

A JSCValue representing the last value generated by the script.

+

A JSCValue representing the last value generated by the script.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.evaluate_in_object.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.evaluate_in_object.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.evaluate_in_object.html 2026-04-16 17:28:31.733332600 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.evaluate_in_object.html 2026-07-09 07:28:48.305805200 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -202,7 +202,7 @@
code

Type: const char*

-

A JavaScript script to evaluate.

+

A JavaScript script to evaluate.

@@ -219,7 +219,7 @@
length

Type: gssize

-

Length of code, or -1 if code is a nul-terminated string.

+

Length of code, or -1 if code is a nul-terminated string.

@@ -236,7 +236,7 @@
object_instance

Type: gpointer

-

An object instance.

+

An object instance.

@@ -253,7 +253,7 @@
object_class

Type: JSCClass

-

A JSCClass or NULL to use the default.

+

A JSCClass or NULL to use the default.

The argument can be NULL.
@@ -270,7 +270,7 @@
uri

Type: const char*

-

The source URI.

+

The source URI.

The argument can be NULL.
@@ -287,7 +287,7 @@
line_number

Type: guint

-

The starting line number.

+

The starting line number.

@@ -304,7 +304,7 @@
object

Type: JSCValue

-

Return location for a JSCValue.

+

Return location for a JSCValue.

@@ -313,7 +313,7 @@ - +
The argument will be set by the function.
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
@@ -336,14 +336,14 @@

Type: JSCValue

-

A JSCValue representing the last value generated by the script.

+

A JSCValue representing the last value generated by the script.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.evaluate_with_source_uri.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.evaluate_with_source_uri.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.evaluate_with_source_uri.html 2026-04-16 17:28:31.762333000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.evaluate_with_source_uri.html 2026-07-09 07:28:48.313144400 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -197,7 +197,7 @@
code

Type: const char*

-

A JavaScript script to evaluate.

+

A JavaScript script to evaluate.

@@ -214,7 +214,7 @@
length

Type: gssize

-

Length of code, or -1 if code is a nul-terminated string.

+

Length of code, or -1 if code is a nul-terminated string.

@@ -231,7 +231,7 @@
uri

Type: const char*

-

The source URI.

+

The source URI.

@@ -248,7 +248,7 @@
line_number

Type: guint

-

The starting line number.

+

The starting line number.

@@ -280,14 +280,14 @@

Type: JSCValue

-

A JSCValue representing the last value generated by the script.

+

A JSCValue representing the last value generated by the script.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.get_exception.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.get_exception.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.get_exception.html 2026-04-16 17:28:31.776332900 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.get_exception.html 2026-07-09 07:28:48.315832400 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -191,15 +191,15 @@

Type: JSCException

-

A JSCException or NULL if there isn’t any - unhandled exception in the JSCContext.

+

A JSCException or NULL if there isn’t any + unhandled exception in the JSCContext.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.get_global_object.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.get_global_object.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.get_global_object.html 2026-04-16 17:28:31.789332900 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.get_global_object.html 2026-07-09 07:28:48.318441600 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -191,14 +191,14 @@

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.get_value.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.get_value.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.get_value.html 2026-04-16 17:28:31.806332800 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.get_value.html 2026-07-09 07:28:48.321562300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -192,7 +192,7 @@
name

Type: const char*

-

The value name.

+

The value name.

@@ -224,14 +224,14 @@

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.get_virtual_machine.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.get_virtual_machine.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.get_virtual_machine.html 2026-04-16 17:28:31.914333300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.get_virtual_machine.html 2026-07-09 07:28:48.324122700 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -199,14 +199,14 @@

Type: JSCVirtualMachine

-

The JSCVirtualMachine where the JSCContext was created.

+

The JSCVirtualMachine where the JSCContext was created.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.pop_exception_handler.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.pop_exception_handler.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.pop_exception_handler.html 2026-04-16 17:28:31.924333300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.pop_exception_handler.html 2026-07-09 07:28:48.326074600 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.push_exception_handler.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.push_exception_handler.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.push_exception_handler.html 2026-04-16 17:28:31.952333200 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.push_exception_handler.html 2026-07-09 07:28:48.331875000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -201,7 +201,7 @@
handler

Type: JSCExceptionHandler

-

A JSCExceptionHandler.

+

A JSCExceptionHandler.

@@ -218,7 +218,7 @@
user_data

Type: gpointer

-

User data to pass to handler.

+

User data to pass to handler.

@@ -235,7 +235,7 @@
destroy_notify

Type: GDestroyNotify

-

Destroy notifier for user_data.

+

Destroy notifier for user_data.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.register_class.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.register_class.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.register_class.html 2026-04-16 17:28:31.983333300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.register_class.html 2026-07-09 07:28:48.338335500 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -200,7 +200,7 @@
name

Type: const char*

-

The class name.

+

The class name.

The argument can be NULL.
@@ -217,7 +217,7 @@
parent_class

Type: JSCClass

-

A JSCClass or NULL.

+

A JSCClass or NULL.

@@ -234,7 +234,7 @@
vtable

Type: JSCClassVTable

-

An optional JSCClassVTable or NULL.

+

An optional JSCClassVTable or NULL.

The argument can be NULL.
@@ -251,7 +251,7 @@
destroy_notify

Type: GDestroyNotify

-

A destroy notifier for class instances.

+

A destroy notifier for class instances.

The argument can be NULL.
@@ -283,14 +283,14 @@

Type: JSCClass

-

A JSCClass.

+

A JSCClass.

The argument can be NULL.
- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.set_value.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.set_value.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.set_value.html 2026-04-16 17:28:31.998333500 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.set_value.html 2026-07-09 07:28:48.341692700 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -193,7 +193,7 @@
name

Type: const char*

-

The value name.

+

The value name.

@@ -210,7 +210,7 @@
value

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.throw.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.throw.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.throw.html 2026-04-16 17:28:32.011333500 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.throw.html 2026-07-09 07:28:48.344266400 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -193,7 +193,7 @@
error_message

Type: const char*

-

An error message.

+

An error message.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.throw_exception.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.throw_exception.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.throw_exception.html 2026-04-16 17:28:32.023333500 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.throw_exception.html 2026-07-09 07:28:48.346884700 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -192,7 +192,7 @@
exception

Type: JSCException

-

A JSCException.

+

A JSCException.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.throw_printf.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.throw_printf.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.throw_printf.html 2026-04-16 17:28:32.040333500 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.throw_printf.html 2026-07-09 07:28:48.350282000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -194,7 +194,7 @@
format

Type: const char*

-

The string format.

+

The string format.

@@ -211,7 +211,7 @@
...

Type: 

-

The parameters to insert into the format string.

+

The parameters to insert into the format string.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.throw_with_name.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.throw_with_name.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.throw_with_name.html 2026-04-16 17:28:32.057333700 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.throw_with_name.html 2026-07-09 07:28:48.353316300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -194,7 +194,7 @@
error_name

Type: const char*

-

The error name.

+

The error name.

@@ -211,7 +211,7 @@
error_message

Type: const char*

-

An error message.

+

An error message.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.throw_with_name_printf.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.throw_with_name_printf.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Context.throw_with_name_printf.html 2026-04-16 17:28:32.076333800 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Context.throw_with_name_printf.html 2026-07-09 07:28:48.357310300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -195,7 +195,7 @@
error_name

Type: const char*

-

The error name.

+

The error name.

@@ -212,7 +212,7 @@
format

Type: const char*

-

The string format.

+

The string format.

@@ -229,7 +229,7 @@
...

Type: 

-

The parameters to insert into the format string.

+

The parameters to insert into the format string.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Exception.get_backtrace_string.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.get_backtrace_string.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Exception.get_backtrace_string.html 2026-04-16 17:28:32.287334200 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.get_backtrace_string.html 2026-07-09 07:28:48.428962200 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: const char*

-

The exception backtrace string or NULL.

+

The exception backtrace string or NULL.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Exception.get_column_number.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.get_column_number.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Exception.get_column_number.html 2026-04-16 17:28:32.299334300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.get_column_number.html 2026-07-09 07:28:48.429802400 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,7 +171,7 @@

Type: guint

-

The column number of exception.

+

The column number of exception.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Exception.get_line_number.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.get_line_number.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Exception.get_line_number.html 2026-04-16 17:28:32.309334300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.get_line_number.html 2026-07-09 07:28:48.433941600 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,7 +171,7 @@

Type: guint

-

The line number of exception.

+

The line number of exception.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Exception.get_message.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.get_message.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Exception.get_message.html 2026-04-16 17:28:32.329334300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.get_message.html 2026-07-09 07:28:48.436530800 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: const char*

-

The exception error message.

+

The exception error message.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Exception.get_name.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.get_name.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Exception.get_name.html 2026-04-16 17:28:32.340334400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.get_name.html 2026-07-09 07:28:48.438834700 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: const char*

-

The exception error name.

+

The exception error name.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Exception.get_source_uri.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.get_source_uri.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Exception.get_source_uri.html 2026-04-16 17:28:32.352334300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.get_source_uri.html 2026-07-09 07:28:48.441559000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: const char*

-

The the source URI of exception, or NULL.

+

The the source URI of exception, or NULL.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Exception.report.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.report.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Exception.report.html 2026-04-16 17:28:32.365334500 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.report.html 2026-07-09 07:28:48.444015000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -172,14 +172,14 @@

Type: char*

-

A new string with the exception report.

+

A new string with the exception report.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Exception.to_string.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.to_string.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Exception.to_string.html 2026-04-16 17:28:32.380334400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Exception.to_string.html 2026-07-09 07:28:48.446627900 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: char*

-

The string representation of exception.

+

The string representation of exception.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.array_buffer_get_data.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.array_buffer_get_data.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.array_buffer_get_data.html 2026-04-16 17:28:32.973336000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.array_buffer_get_data.html 2026-07-09 07:28:48.561799500 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -254,7 +254,7 @@
size

Type: gsize*

-

Location where to store the size of the memory region.

+

Location where to store the size of the memory region.

@@ -286,7 +286,7 @@

Type: An array of guint8

-

pointer to memory.

+

pointer to memory.

The argument will be set by the function.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.array_buffer_get_size.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.array_buffer_get_size.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.array_buffer_get_size.html 2026-04-16 17:28:32.984336100 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.array_buffer_get_size.html 2026-07-09 07:28:48.566230800 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -243,7 +243,7 @@

Type: gsize

-

Size, in bytes.

+

Size, in bytes.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.constructor_call.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.constructor_call.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.constructor_call.html 2026-04-16 17:28:33.005336000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.constructor_call.html 2026-07-09 07:28:48.570799000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -244,7 +244,7 @@
first_parameter_type

Type: GType

-

GType of first parameter, or G_TYPE_NONE.

+

GType of first parameter, or G_TYPE_NONE.

@@ -261,7 +261,7 @@
...

Type: 

-

Value of the first parameter, followed optionally by more type/value pairs, followed by G_TYPE_NONE.

+

Value of the first parameter, followed optionally by more type/value pairs, followed by G_TYPE_NONE.

@@ -293,14 +293,14 @@

Type: JSCValue

-

A JSCValue referencing the newly created object instance.

+

A JSCValue referencing the newly created object instance.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.constructor_callv.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.constructor_callv.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.constructor_callv.html 2026-04-16 17:28:33.025336300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.constructor_callv.html 2026-07-09 07:28:48.575013400 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -244,7 +244,7 @@
n_parameters

Type: guint

-

The number of parameters.

+

The number of parameters.

@@ -261,7 +261,7 @@
parameters

Type: An array of JSCValue*

-

The JSCValues to pass as parameters to the constructor, or NULL.

+

The JSCValues to pass as parameters to the constructor, or NULL.

@@ -293,14 +293,14 @@

Type: JSCValue

-

A JSCValue referencing the newly created object instance.

+

A JSCValue referencing the newly created object instance.

The argument can be NULL.
- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.function_call.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.function_call.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.function_call.html 2026-04-16 17:28:33.045336200 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.function_call.html 2026-07-09 07:28:48.580147000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -246,7 +246,7 @@
first_parameter_type

Type: GType

-

GType of first parameter, or G_TYPE_NONE.

+

GType of first parameter, or G_TYPE_NONE.

@@ -263,7 +263,7 @@
...

Type: 

-

Value of the first parameter, followed optionally by more type/value pairs, followed by G_TYPE_NONE.

+

Value of the first parameter, followed optionally by more type/value pairs, followed by G_TYPE_NONE.

@@ -295,14 +295,14 @@

Type: JSCValue

-

A JSCValue with the return value of the function.

+

A JSCValue with the return value of the function.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.function_callv.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.function_callv.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.function_callv.html 2026-04-16 17:28:33.069336200 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.function_callv.html 2026-07-09 07:28:48.584874600 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -246,7 +246,7 @@
n_parameters

Type: guint

-

The number of parameters.

+

The number of parameters.

@@ -263,7 +263,7 @@
parameters

Type: An array of JSCValue*

-

The JSCValues to pass as parameters to the function, or NULL.

+

The JSCValues to pass as parameters to the function, or NULL.

@@ -295,14 +295,14 @@

Type: JSCValue

-

A JSCValue with the return value of the function.

+

A JSCValue with the return value of the function.

The argument can be NULL.
- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.get_context.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.get_context.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.get_context.html 2026-04-16 17:28:33.085336200 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.get_context.html 2026-07-09 07:28:48.585799000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -249,14 +249,14 @@

Type: JSCContext

-

The JSCValue context.

+

The JSCValue context.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_array.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_array.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_array.html 2026-04-16 17:28:33.100336300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_array.html 2026-07-09 07:28:48.589953400 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -241,7 +241,7 @@

Type: gboolean

-

Whether the value is an array.

+

Whether the value is an array.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_array_buffer.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_array_buffer.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_array_buffer.html 2026-04-16 17:28:33.115336400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_array_buffer.html 2026-07-09 07:28:48.592584600 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -241,7 +241,7 @@

Type: gboolean

-

Whether the value is an %ArrayBuffer.

+

Whether the value is an %ArrayBuffer.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_boolean.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_boolean.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_boolean.html 2026-04-16 17:28:33.130336500 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_boolean.html 2026-07-09 07:28:48.594942600 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -241,7 +241,7 @@

Type: gboolean

-

Whether the value is a boolean.

+

Whether the value is a boolean.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_constructor.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_constructor.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_constructor.html 2026-04-16 17:28:33.145336400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_constructor.html 2026-07-09 07:28:48.597559000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -241,7 +241,7 @@

Type: gboolean

-

Whether the value is a constructor.

+

Whether the value is a constructor.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_function.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_function.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_function.html 2026-04-16 17:28:33.159336600 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_function.html 2026-07-09 07:28:48.599913400 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -241,7 +241,7 @@

Type: gboolean

-

Whether the value is a function.

+

Whether the value is a function.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_null.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_null.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_null.html 2026-04-16 17:28:33.172336600 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_null.html 2026-07-09 07:28:48.602628200 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -241,7 +241,7 @@

Type: gboolean

-

Whether the value is null.

+

Whether the value is null.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_number.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_number.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_number.html 2026-04-16 17:28:33.183336500 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_number.html 2026-07-09 07:28:48.604971000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -241,7 +241,7 @@

Type: gboolean

-

Whether the value is a number.

+

Whether the value is a number.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_object.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_object.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_object.html 2026-04-16 17:28:33.195336600 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_object.html 2026-07-09 07:28:48.605798500 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -241,7 +241,7 @@

Type: gboolean

-

Whether the value is an object.

+

Whether the value is an object.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_string.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_string.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_string.html 2026-04-16 17:28:33.209336500 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_string.html 2026-07-09 07:28:48.609974600 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -241,7 +241,7 @@

Type: gboolean

-

Whether the value is a string.

+

Whether the value is a string.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_typed_array.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_typed_array.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_typed_array.html 2026-04-16 17:28:33.221336600 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_typed_array.html 2026-07-09 07:28:48.612544300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -241,7 +241,7 @@

Type: gboolean

-

Whether value is a typed array.

+

Whether value is a typed array.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_undefined.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_undefined.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.is_undefined.html 2026-04-16 17:28:33.235336800 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.is_undefined.html 2026-07-09 07:28:48.615030500 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -241,7 +241,7 @@

Type: gboolean

-

Whether the value is undefined.

+

Whether the value is undefined.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.new_typed_array_with_buffer.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.new_typed_array_with_buffer.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.new_typed_array_with_buffer.html 2026-04-16 17:28:33.261336800 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.new_typed_array_with_buffer.html 2026-07-09 07:28:48.620614300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -254,7 +254,7 @@
type

Type: JSCTypedArrayType

-

Type of array elements.

+

Type of array elements.

@@ -271,7 +271,7 @@
offset

Type: gsize

-

Offset, in bytes.

+

Offset, in bytes.

@@ -288,7 +288,7 @@
length

Type: gssize

-

Number of array elements, or -1.

+

Number of array elements, or -1.

@@ -320,14 +320,14 @@

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_define_property_accessor.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_define_property_accessor.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_define_property_accessor.html 2026-04-16 17:28:33.301336800 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_define_property_accessor.html 2026-07-09 07:28:48.629497300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -258,7 +258,7 @@
property_name

Type: const char*

-

The name of the property to define.

+

The name of the property to define.

@@ -275,7 +275,7 @@
flags

Type: JSCValuePropertyFlags

-

JSCValuePropertyFlags.

+

JSCValuePropertyFlags.

@@ -292,7 +292,7 @@
property_type

Type: GType

-

The GType of the property.

+

The GType of the property.

@@ -309,7 +309,7 @@
getter

Type: GCallback

-

A GCallback to be called to get the property value.

+

A GCallback to be called to get the property value.

@@ -326,7 +326,7 @@
setter

Type: GCallback

-

A GCallback to be called to set the property value.

+

A GCallback to be called to set the property value.

The argument can be NULL.
@@ -343,7 +343,7 @@
user_data

Type: gpointer

-

User data to pass to getter and setter.

+

User data to pass to getter and setter.

The argument can be NULL.
@@ -360,7 +360,7 @@
destroy_notify

Type: GDestroyNotify

-

Destroy notifier for user_data.

+

Destroy notifier for user_data.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_define_property_data.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_define_property_data.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_define_property_data.html 2026-04-16 17:28:33.321337000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_define_property_data.html 2026-07-09 07:28:48.633445000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -245,7 +245,7 @@
property_name

Type: const char*

-

The name of the property to define.

+

The name of the property to define.

The argument can be NULL.
@@ -262,7 +262,7 @@
flags

Type: JSCValuePropertyFlags

-

JSCValuePropertyFlags.

+

JSCValuePropertyFlags.

@@ -279,7 +279,7 @@
property_value

Type: JSCValue

-

The default property value.

+

The default property value.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_delete_property.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_delete_property.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_delete_property.html 2026-04-16 17:28:33.339336900 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_delete_property.html 2026-07-09 07:28:48.637163200 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -243,7 +243,7 @@
name

Type: const char*

-

The property name.

+

The property name.

The argument can be NULL.
@@ -275,7 +275,7 @@

Type: gboolean

-

TRUE if the property was deleted, or FALSE otherwise.

+

TRUE if the property was deleted, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_enumerate_properties.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_enumerate_properties.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_enumerate_properties.html 2026-04-16 17:28:33.356337000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_enumerate_properties.html 2026-07-09 07:28:48.640668900 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -242,15 +242,15 @@

Type: An array of utf8

-

A NULL-terminated array of strings containing the - property names, or NULL if value doesn’t have enumerable properties. Use g_strfreev() to free.

+

A NULL-terminated array of strings containing the + property names, or NULL if value doesn’t have enumerable properties. Use g_strfreev() to free.

- +
The array is NULL-terminated.
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
The return value can be NULL.
Each element is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_get_property.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_get_property.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_get_property.html 2026-04-16 17:28:33.371337200 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_get_property.html 2026-07-09 07:28:48.643709700 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -242,7 +242,7 @@
name

Type: const char*

-

The property name.

+

The property name.

@@ -274,14 +274,14 @@

Type: JSCValue

-

The property JSCValue.

+

The property JSCValue.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_get_property_at_index.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_get_property_at_index.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_get_property_at_index.html 2026-04-16 17:28:33.386337000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_get_property_at_index.html 2026-07-09 07:28:48.647005000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -242,7 +242,7 @@
index

Type: guint

-

The property index.

+

The property index.

@@ -274,14 +274,14 @@

Type: JSCValue

-

The property JSCValue.

+

The property JSCValue.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_has_property.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_has_property.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_has_property.html 2026-04-16 17:28:33.402337000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_has_property.html 2026-07-09 07:28:48.650399000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -242,7 +242,7 @@
name

Type: const char*

-

The property name.

+

The property name.

@@ -274,7 +274,7 @@

Type: gboolean

-

TRUE if value has a property with name, or FALSE otherwise.

+

TRUE if value has a property with name, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_invoke_method.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_invoke_method.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_invoke_method.html 2026-04-16 17:28:33.429337300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_invoke_method.html 2026-07-09 07:28:48.656003000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -250,7 +250,7 @@
name

Type: const char*

-

The method name.

+

The method name.

@@ -267,7 +267,7 @@
first_parameter_type

Type: GType

-

GType of first parameter, or G_TYPE_NONE.

+

GType of first parameter, or G_TYPE_NONE.

@@ -284,7 +284,7 @@
...

Type: 

-

Value of the first parameter, followed optionally by more type/value pairs, followed by G_TYPE_NONE.

+

Value of the first parameter, followed optionally by more type/value pairs, followed by G_TYPE_NONE.

@@ -316,14 +316,14 @@

Type: JSCValue

-

A JSCValue with the return value of the method.

+

A JSCValue with the return value of the method.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_invoke_methodv.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_invoke_methodv.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_invoke_methodv.html 2026-04-16 17:28:33.452337300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_invoke_methodv.html 2026-07-09 07:28:48.661536000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -250,7 +250,7 @@
name

Type: const char*

-

The method name.

+

The method name.

@@ -267,7 +267,7 @@
n_parameters

Type: guint

-

The number of parameters.

+

The number of parameters.

@@ -284,7 +284,7 @@
parameters

Type: An array of JSCValue*

-

The JSCValues to pass as parameters to the method, or NULL.

+

The JSCValues to pass as parameters to the method, or NULL.

@@ -316,14 +316,14 @@

Type: JSCValue

-

A JSCValue with the return value of the method.

+

A JSCValue with the return value of the method.

The argument can be NULL.
- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_is_instance_of.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_is_instance_of.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_is_instance_of.html 2026-04-16 17:28:33.467337400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_is_instance_of.html 2026-07-09 07:28:48.664684300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -242,7 +242,7 @@
name

Type: const char*

-

A class name.

+

A class name.

@@ -274,7 +274,7 @@

Type: gboolean

-

Whether the value is an object instance of class name.

+

Whether the value is an object instance of class name.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_set_property.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_set_property.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_set_property.html 2026-04-16 17:28:33.480337400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_set_property.html 2026-07-09 07:28:48.668036000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -243,7 +243,7 @@
name

Type: const char*

-

The property name.

+

The property name.

@@ -260,7 +260,7 @@
property

Type: JSCValue

-

The JSCValue to set.

+

The JSCValue to set.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_set_property_at_index.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_set_property_at_index.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.object_set_property_at_index.html 2026-04-16 17:28:33.495337500 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.object_set_property_at_index.html 2026-07-09 07:28:48.669797000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -243,7 +243,7 @@
index

Type: guint

-

The property index.

+

The property index.

@@ -260,7 +260,7 @@
property

Type: JSCValue

-

The JSCValue to set.

+

The JSCValue to set.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.to_boolean.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.to_boolean.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.to_boolean.html 2026-04-16 17:28:33.506337400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.to_boolean.html 2026-07-09 07:28:48.673604500 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -241,7 +241,7 @@

Type: gboolean

-

A #gboolean result of the conversion.

+

A #gboolean result of the conversion.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.to_double.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.to_double.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.to_double.html 2026-04-16 17:28:33.518337500 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.to_double.html 2026-07-09 07:28:48.676164000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -241,7 +241,7 @@

Type: double

-

A #gdouble result of the conversion.

+

A #gdouble result of the conversion.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.to_int32.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.to_int32.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.to_int32.html 2026-04-16 17:28:33.530337600 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.to_int32.html 2026-07-09 07:28:48.678485000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -241,7 +241,7 @@

Type: gint32

-

A #gint32 result of the conversion.

+

A #gint32 result of the conversion.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.to_json.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.to_json.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.to_json.html 2026-04-16 17:28:33.547337500 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.to_json.html 2026-07-09 07:28:48.682084300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -243,7 +243,7 @@
indent

Type: guint

-

The number of spaces to indent when nesting.

+

The number of spaces to indent when nesting.

@@ -275,14 +275,14 @@

Type: char*

-

A null-terminated JSON string with serialization of value.

+

A null-terminated JSON string with serialization of value.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.to_string.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.to_string.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.to_string.html 2026-04-16 17:28:33.561337500 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.to_string.html 2026-07-09 07:28:48.684626600 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -242,14 +242,14 @@

Type: char*

-

A null-terminated string result of the conversion.

+

A null-terminated string result of the conversion.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.to_string_as_bytes.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.to_string_as_bytes.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.to_string_as_bytes.html 2026-04-16 17:28:33.575337600 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.to_string_as_bytes.html 2026-07-09 07:28:48.685796700 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -242,14 +242,14 @@

Type: GBytes

-

A GBytes with the result of the conversion.

+

A GBytes with the result of the conversion.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.typed_array_get_buffer.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.typed_array_get_buffer.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.typed_array_get_buffer.html 2026-04-16 17:28:33.587337700 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.typed_array_get_buffer.html 2026-07-09 07:28:48.689830800 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -241,14 +241,14 @@

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.typed_array_get_data.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.typed_array_get_data.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.typed_array_get_data.html 2026-04-16 17:28:33.617337700 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.typed_array_get_data.html 2026-07-09 07:28:48.696295700 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -260,7 +260,7 @@
length

Type: gsize*

-

Location to return the number of elements contained.

+

Location to return the number of elements contained.

@@ -292,14 +292,14 @@

Type: gpointer

-

Pointer to memory.

+

Pointer to memory.

The argument will be set by the function.
- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.typed_array_get_length.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.typed_array_get_length.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.typed_array_get_length.html 2026-04-16 17:28:33.630337700 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.typed_array_get_length.html 2026-07-09 07:28:48.698572000 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -241,7 +241,7 @@

Type: gsize

-

Number of elements.

+

Number of elements.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.typed_array_get_offset.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.typed_array_get_offset.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.typed_array_get_offset.html 2026-04-16 17:28:33.641337900 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.typed_array_get_offset.html 2026-07-09 07:28:48.701104200 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -241,7 +241,7 @@

Type: gsize

-

Offset, in bytes.

+

Offset, in bytes.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.typed_array_get_size.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.typed_array_get_size.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.typed_array_get_size.html 2026-04-16 17:28:33.653337700 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.typed_array_get_size.html 2026-07-09 07:28:48.701796300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -241,7 +241,7 @@

Type: gsize

-

Size, in bytes.

+

Size, in bytes.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.typed_array_get_type.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.typed_array_get_type.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.Value.typed_array_get_type.html 2026-04-16 17:28:33.666337700 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.Value.typed_array_get_type.html 2026-07-09 07:28:48.706256200 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -166,7 +166,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -241,7 +241,7 @@

Type: JSCTypedArrayType

-

Type of the elements, or JSC_TYPED_ARRAY_NONE if value is not a typed array.

+

Type of the elements, or JSC_TYPED_ARRAY_NONE if value is not a typed array.

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.WeakValue.get_value.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.WeakValue.get_value.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/method.WeakValue.get_value.html 2026-04-16 17:28:33.857338400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/method.WeakValue.get_value.html 2026-07-09 07:28:48.747989400 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -157,14 +157,14 @@

Type: JSCValue

-

A new JSCValue or NULL if weak_value was cleared.

+

A new JSCValue or NULL if weak_value was cleared.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/property.Class.context.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/property.Class.context.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/property.Class.context.html 2026-04-16 17:28:31.462466700 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/property.Class.context.html 2026-07-09 07:28:48.250061300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -101,7 +101,7 @@
-

unstable since: 6.0

+

@@ -134,8 +134,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/property.Class.name.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/property.Class.name.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/property.Class.name.html 2026-04-16 17:28:31.467449200 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/property.Class.name.html 2026-07-09 07:28:48.250793700 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -101,7 +101,7 @@
-

unstable since: 6.0

+

@@ -134,8 +134,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/property.Class.parent.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/property.Class.parent.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/property.Class.parent.html 2026-04-16 17:28:31.471332000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/property.Class.parent.html 2026-07-09 07:28:48.251645300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -101,7 +101,7 @@
-

unstable since: 6.0

+

@@ -134,8 +134,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/property.Context.virtual-machine.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/property.Context.virtual-machine.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/property.Context.virtual-machine.html 2026-04-16 17:28:32.081536300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/property.Context.virtual-machine.html 2026-07-09 07:28:48.358209600 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -97,7 +97,7 @@
-

unstable since: 6.0

+

@@ -130,8 +130,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/property.Value.context.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/property.Value.context.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/property.Value.context.html 2026-04-16 17:28:33.671337800 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/property.Value.context.html 2026-07-09 07:28:48.707152100 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -97,7 +97,7 @@
-

unstable since: 6.0

+

@@ -130,8 +130,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/property.WeakValue.value.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/property.WeakValue.value.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/property.WeakValue.value.html 2026-04-16 17:28:33.862338300 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/property.WeakValue.value.html 2026-07-09 07:28:48.748870100 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -97,7 +97,7 @@
-

unstable since: 6.0

+

@@ -130,8 +130,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/signal.WeakValue.cleared.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/signal.WeakValue.cleared.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/signal.WeakValue.cleared.html 2026-04-16 17:28:33.871338400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/signal.WeakValue.cleared.html 2026-07-09 07:28:48.750544500 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -97,7 +97,7 @@
-

unstable since: 6.0

+

@@ -138,8 +138,6 @@ - Available since: 6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/struct.ClassVTable.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/struct.ClassVTable.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/struct.ClassVTable.html 2026-04-16 17:28:30.227328800 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/struct.ClassVTable.html 2026-07-09 07:28:48.153819300 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -85,7 +85,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -101,7 +101,7 @@
-

unstable since: 6.0

+

@@ -178,28 +178,28 @@

A JSCClassEnumeratePropertiesFunction for enumerating properties.

_jsc_reserved0
-
No description available.
+

No description available.

_jsc_reserved1
-
No description available.
+

No description available.

_jsc_reserved2
-
No description available.
+

No description available.

_jsc_reserved3
-
No description available.
+

No description available.

_jsc_reserved4
-
No description available.
+

No description available.

_jsc_reserved5
-
No description available.
+

No description available.

_jsc_reserved6
-
No description available.
+

No description available.

_jsc_reserved7
-
No description available.
+

No description available.

@@ -209,8 +209,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/style.css webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/style.css --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/style.css 2026-04-16 17:28:33.968857000 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/style.css 2026-07-09 07:28:48.769728200 +0000 @@ -7,6 +7,8 @@ @import url("solarized-light.css") (prefers-color-scheme: light); @import url("solarized-dark.css") (prefers-color-scheme: dark); +@import url("fonts.css"); + /********************************* * LIGHT THEME *********************************/ diff -Nru webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/type_func.Context.get_current.html webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/type_func.Context.get_current.html --- webkit2gtk-2.52.3/Documentation/jsc-glib-6.0/type_func.Context.get_current.html 2026-04-16 17:28:31.615332400 +0000 +++ webkit2gtk-2.52.5/Documentation/jsc-glib-6.0/type_func.Context.get_current.html 2026-07-09 07:28:48.284965800 +0000 @@ -62,7 +62,7 @@

JavaScriptCore

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -157,7 +157,7 @@

Type: JSCContext

-

The JSCContext that is currently executing.

+

The JSCContext that is currently executing.

Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatDisplay-Black.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Black.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatDisplay-Black.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Black.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatDisplay-BlackItalic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-BlackItalic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatDisplay-BlackItalic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-BlackItalic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatDisplay-Bold.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Bold.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatDisplay-Bold.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Bold.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatDisplay-BoldItalic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-BoldItalic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatDisplay-BoldItalic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-BoldItalic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatDisplay-Italic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Italic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatDisplay-Italic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Italic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatDisplay-Medium.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Medium.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatDisplay-Medium.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Medium.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatDisplay-MediumItalic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-MediumItalic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatDisplay-MediumItalic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-MediumItalic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatDisplay-Regular.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Regular.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatDisplay-Regular.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatDisplay-Regular.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatText-Bold.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-Bold.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatText-Bold.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-Bold.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatText-BoldItalic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-BoldItalic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatText-BoldItalic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-BoldItalic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatText-Italic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-Italic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatText-Italic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-Italic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatText-Medium.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-Medium.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatText-Medium.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-Medium.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatText-MediumItalic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-MediumItalic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatText-MediumItalic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-MediumItalic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatText-Regular.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-Regular.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/RedHatText-Regular.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/RedHatText-Regular.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/SourceCodePro-It.ttf.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/SourceCodePro-It.ttf.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/SourceCodePro-Regular.ttf.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/SourceCodePro-Regular.ttf.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/SourceCodePro-Semibold.ttf.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/SourceCodePro-Semibold.ttf.woff differ diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/callback.URISchemeRequestCallback.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/callback.URISchemeRequestCallback.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/callback.URISchemeRequestCallback.html 2026-04-16 17:54:31.586688500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/callback.URISchemeRequestCallback.html 2026-07-09 07:33:39.599522600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -127,7 +127,7 @@
-

Available since: 6.0

+ @@ -150,7 +150,7 @@
request

Type: WebKitURISchemeRequest

-

The WebKitURISchemeRequest.

+

The WebKitURISchemeRequest.

@@ -167,7 +167,7 @@
user_data

Type: gpointer

-

User data passed to the callback.

+

User data passed to the callback.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.AuthenticationRequest.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.AuthenticationRequest.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.AuthenticationRequest.html 2026-04-16 17:54:33.934691700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.AuthenticationRequest.html 2026-07-09 07:33:40.423505500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -143,7 +143,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -159,7 +159,7 @@
-

unstable since: 6.0

+

@@ -194,8 +194,6 @@
-

Available since: 6.0

-
@@ -213,19 +211,19 @@ - - + hierarchy this - -WebKitAuthenticationRequest + +WebKitAuthenticationRequest @@ -233,15 +231,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -495,10 +493,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -524,7 +518,7 @@
- No description available. +

No description available.

@@ -534,7 +528,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.AutomationSession.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.AutomationSession.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.AutomationSession.html 2026-04-16 17:54:34.558692700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.AutomationSession.html 2026-07-09 07:33:40.670455700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -130,7 +130,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -195,19 +195,19 @@ - - + hierarchy this - -WebKitAutomationSession + +WebKitAutomationSession @@ -215,15 +215,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -397,10 +397,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -426,7 +422,7 @@
- No description available. +

No description available.

@@ -436,7 +432,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.BackForwardList.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.BackForwardList.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.BackForwardList.html 2026-04-16 17:54:34.741692800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.BackForwardList.html 2026-07-09 07:33:40.747196000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -131,7 +131,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -147,7 +147,7 @@
-

unstable since: 6.0

+

@@ -183,8 +183,6 @@
-

Available since: 6.0

-
@@ -202,19 +200,19 @@ - - + hierarchy this - -WebKitBackForwardList + +WebKitBackForwardList @@ -222,15 +220,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -281,7 +279,7 @@

Returns the item that precedes the current item.

-

unstable since: 6.0

+

@@ -291,7 +289,7 @@

Obtain the list of items preceding the current one.

-

unstable since: 6.0

+

@@ -301,7 +299,7 @@

Obtain a list up to some number of items preceding the current one.

-

unstable since: 6.0

+

@@ -311,7 +309,7 @@

Returns the current item in back_forward_list.

-

unstable since: 6.0

+

@@ -321,7 +319,7 @@

Returns the item that follows the current item.

-

unstable since: 6.0

+

@@ -331,7 +329,7 @@

Obtain the list of items following the current one.

-

unstable since: 6.0

+

@@ -341,7 +339,7 @@

Obtain a list up to some number of items following the current one.

-

unstable since: 6.0

+

@@ -351,7 +349,7 @@

Obtain the amount of items in the list.

-

unstable since: 6.0

+

@@ -361,7 +359,7 @@

Returns the item at a given index relative to the current item.

-

unstable since: 6.0

+

@@ -407,7 +405,7 @@ when the list is cleared or the maximum items limit is reached.

-

unstable since: 6.0

+

@@ -423,10 +421,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -452,7 +446,7 @@
- No description available. +

No description available.

@@ -462,7 +456,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.BackForwardListItem.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.BackForwardListItem.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.BackForwardListItem.html 2026-04-16 17:54:35.008693200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.BackForwardListItem.html 2026-07-09 07:33:40.876909300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -126,7 +126,7 @@
-

unstable since: 6.0

+

@@ -152,8 +152,6 @@
-

Available since: 6.0

-
@@ -171,19 +169,19 @@ - - + hierarchy this - -WebKitBackForwardListItem + +WebKitBackForwardListItem @@ -191,29 +189,29 @@ ancestor_0 - -GInitiallyUnowned + +GInitiallyUnowned ancestor_0--this - + ancestor_1 - -GObject + +GObject ancestor_1--ancestor_0 - + @@ -268,7 +266,7 @@

Obtain the original URI of the item.

-

unstable since: 6.0

+

@@ -278,7 +276,7 @@

Obtain the title of the item.

-

unstable since: 6.0

+

@@ -288,7 +286,7 @@

Obtain the URI of the item.

-

unstable since: 6.0

+

@@ -336,10 +334,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -365,7 +359,7 @@
- No description available. +

No description available.

@@ -375,7 +369,7 @@
parent_class: GInitiallyUnownedClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.ClipboardPermissionRequest.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.ClipboardPermissionRequest.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.ClipboardPermissionRequest.html 2026-04-16 17:54:35.181693600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.ClipboardPermissionRequest.html 2026-07-09 07:33:40.971060000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -97,7 +97,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -161,7 +161,7 @@ - this - -WebKitClipboardPermissionRequest + +WebKitClipboardPermissionRequest @@ -181,29 +181,29 @@ implements_0 - -WebKitPermissionRequest + +WebKitPermissionRequest this--implements_0 - + ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -290,16 +290,16 @@

Allow the action which triggered this request.

-

unstable since: 6.0

+

- +
webkit_permission_request_deny

Deny the action which triggered this request.

-

unstable since: 6.0

+

- + @@ -327,10 +327,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -358,7 +354,7 @@
- No description available. +

No description available.

@@ -368,7 +364,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.ColorChooserRequest.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.ColorChooserRequest.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.ColorChooserRequest.html 2026-04-16 17:54:35.254693500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.ColorChooserRequest.html 2026-07-09 07:33:41.002045400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -148,7 +148,7 @@
-

unstable since: 6.0

+

@@ -184,8 +184,6 @@
-

Available since: 6.0

-
@@ -203,19 +201,19 @@ - - + hierarchy this - -WebKitColorChooserRequest + +WebKitColorChooserRequest @@ -223,15 +221,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -414,10 +412,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -443,7 +437,7 @@
- No description available. +

No description available.

@@ -453,7 +447,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.ContextMenu.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.ContextMenu.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.ContextMenu.html 2026-04-16 17:54:35.462694000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.ContextMenu.html 2026-07-09 07:33:41.091191000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -145,7 +145,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -161,7 +161,7 @@
-

unstable since: 6.0

+

@@ -195,8 +195,6 @@
-

Available since: 6.0

-
@@ -214,7 +212,7 @@ - this - -WebKitContextMenu + +WebKitContextMenu @@ -234,15 +232,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -289,7 +287,7 @@

Creates a new WebKitContextMenu object.

-

unstable since: 6.0

+

@@ -299,7 +297,7 @@

Creates a new WebKitContextMenu object with the given items.

-

unstable since: 6.0

+

@@ -324,7 +322,7 @@

Adds item at the end of the menu.

-

unstable since: 6.0

+

@@ -334,7 +332,7 @@

Gets the first item in the menu.

-

unstable since: 6.0

+

@@ -356,7 +354,7 @@

Gets the item at the given position in the menu.

-

unstable since: 6.0

+

@@ -366,7 +364,7 @@

Returns the item list of menu.

-

unstable since: 6.0

+

@@ -376,7 +374,7 @@

Gets the length of the menu.

-

unstable since: 6.0

+

@@ -406,7 +404,7 @@

Inserts item into the menu at the given position.

-

unstable since: 6.0

+

@@ -416,7 +414,7 @@

Gets the last item in the menu.

-

unstable since: 6.0

+

@@ -426,7 +424,7 @@

Moves item to the given position in the menu.

-

unstable since: 6.0

+

@@ -436,7 +434,7 @@

Adds item at the beginning of the menu.

-

unstable since: 6.0

+

@@ -446,7 +444,7 @@

Removes item from the menu.

-

unstable since: 6.0

+

@@ -456,7 +454,7 @@

Removes all items of the menu.

-

unstable since: 6.0

+

@@ -510,10 +508,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -539,7 +533,7 @@
- No description available. +

No description available.

@@ -549,7 +543,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.ContextMenuItem.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.ContextMenuItem.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.ContextMenuItem.html 2026-04-16 17:54:35.906694400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.ContextMenuItem.html 2026-07-09 07:33:41.263488000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -135,7 +135,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -151,7 +151,7 @@
-

unstable since: 6.0

+

@@ -180,8 +180,6 @@
-

Available since: 6.0

-
@@ -199,7 +197,7 @@ - this - -WebKitContextMenuItem + +WebKitContextMenuItem @@ -219,29 +217,29 @@ ancestor_0 - -GInitiallyUnowned + +GInitiallyUnowned ancestor_0--this - + ancestor_1 - -GObject + +GObject ancestor_1--ancestor_0 - + @@ -302,7 +300,7 @@

Creates a new WebKitContextMenuItem for the given stock action.

-

unstable since: 6.0

+

@@ -312,7 +310,7 @@

Creates a new WebKitContextMenuItem for the given stock action using the given label.

-

unstable since: 6.0

+

@@ -322,7 +320,7 @@

Creates a new WebKitContextMenuItem representing a separator.

-

unstable since: 6.0

+

@@ -332,7 +330,7 @@

Creates a new WebKitContextMenuItem using the given label with a submenu.

-

unstable since: 6.0

+

@@ -377,7 +375,7 @@

Gets the WebKitContextMenuAction of item.

-

unstable since: 6.0

+

@@ -387,7 +385,7 @@

Gets the submenu of item.

-

unstable since: 6.0

+

@@ -407,7 +405,7 @@

Checks whether item is a separator.

-

unstable since: 6.0

+

@@ -417,7 +415,7 @@

Sets or replaces the item submenu.

-

unstable since: 6.0

+

@@ -465,10 +463,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -494,7 +488,7 @@
- No description available. +

No description available.

@@ -504,7 +498,7 @@
parent_class: GInitiallyUnownedClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.CookieManager.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.CookieManager.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.CookieManager.html 2026-04-16 17:54:36.512695300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.CookieManager.html 2026-07-09 07:33:41.465409500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -141,7 +141,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -157,7 +157,7 @@
-

unstable since: 6.0

+

@@ -186,8 +186,6 @@
-

Available since: 6.0

-
@@ -205,7 +203,7 @@ - this - -WebKitCookieManager + +WebKitCookieManager @@ -225,15 +223,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -324,7 +322,7 @@

Asynchronously get the cookie acceptance policy of cookie_manager.

-

unstable since: 6.0

+

@@ -334,7 +332,7 @@

Finish an asynchronous operation started with webkit_cookie_manager_get_accept_policy().

-

unstable since: 6.0

+

@@ -404,7 +402,7 @@

Set the cookie acceptance policy of cookie_manager as policy.

-

unstable since: 6.0

+

@@ -414,7 +412,7 @@

Set non-session cookies.

-

unstable since: 6.0

+

@@ -456,7 +454,7 @@

This signal is emitted when cookies are added, removed or modified.

-

unstable since: 6.0

+

@@ -472,10 +470,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -501,7 +495,7 @@
- No description available. +

No description available.

@@ -511,7 +505,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.DeviceInfoPermissionRequest.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.DeviceInfoPermissionRequest.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.DeviceInfoPermissionRequest.html 2026-04-16 17:54:36.721695700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.DeviceInfoPermissionRequest.html 2026-07-09 07:33:41.555557700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -97,7 +97,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -162,7 +162,7 @@ - this - -WebKitDeviceInfoPermissionRequest + +WebKitDeviceInfoPermissionRequest @@ -182,29 +182,29 @@ implements_0 - -WebKitPermissionRequest + +WebKitPermissionRequest this--implements_0 - + ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -291,16 +291,16 @@

Allow the action which triggered this request.

-

unstable since: 6.0

+

- +
webkit_permission_request_deny

Deny the action which triggered this request.

-

unstable since: 6.0

+

- + @@ -328,10 +328,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -359,7 +355,7 @@
- No description available. +

No description available.

@@ -369,7 +365,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.Download.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.Download.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.Download.html 2026-04-16 17:54:36.779695700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.Download.html 2026-07-09 07:33:41.571481700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -158,7 +158,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -174,7 +174,7 @@
-

unstable since: 6.0

+

@@ -203,8 +203,6 @@
-

Available since: 6.0

-
@@ -222,19 +220,19 @@ - - + hierarchy this - -WebKitDownload + +WebKitDownload @@ -242,15 +240,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -301,7 +299,7 @@

Cancels the download.

-

unstable since: 6.0

+

@@ -321,7 +319,7 @@

Obtains the destination to which the downloaded file will be written.

-

unstable since: 6.0

+

@@ -331,7 +329,7 @@

Gets the elapsed time in seconds, including any fractional part.

-

unstable since: 6.0

+

@@ -344,7 +342,7 @@ connecting to the notify::estimated-progress signal of download.

-

unstable since: 6.0

+

@@ -354,7 +352,7 @@

Gets the length of the data already downloaded for download.

-

unstable since: 6.0

+

@@ -364,7 +362,7 @@

Retrieves the WebKitURIRequest object that backs the download process.

-

unstable since: 6.0

+

@@ -374,7 +372,7 @@

Retrieves the WebKitURIResponse object that backs the download process.

-

unstable since: 6.0

+

@@ -384,7 +382,7 @@

Get the WebKitWebView that initiated the download.

-

unstable since: 6.0

+

@@ -404,7 +402,7 @@

Sets the destination to which the downloaded file will be written.

-

unstable since: 6.0

+

@@ -456,7 +454,7 @@

The local path to where the download will be saved.

-

unstable since: 6.0

+

@@ -471,7 +469,7 @@ WebKitDownload::received-data signal to track the progress.

-

unstable since: 6.0

+

@@ -481,7 +479,7 @@

The WebKitURIResponse associated with this download.

-

unstable since: 6.0

+

@@ -515,7 +513,7 @@ created successfully at destination.

-

unstable since: 6.0

+

@@ -529,7 +527,7 @@ directory using suggested_filename.

-

unstable since: 6.0

+

@@ -544,7 +542,7 @@ after an error and WebKitDownload::finished signal is emitted after this one.

-

unstable since: 6.0

+

@@ -555,7 +553,7 @@ In case of errors WebKitDownload::failed signal is emitted before this one.

-

unstable since: 6.0

+

@@ -567,7 +565,7 @@ useful to know the progress of the download operation.

-

unstable since: 6.0

+

@@ -583,10 +581,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -612,7 +606,7 @@
- No description available. +

No description available.

@@ -622,7 +616,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.EditorState.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.EditorState.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.EditorState.html 2026-04-16 17:54:36.954696000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.EditorState.html 2026-07-09 07:33:41.648424900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -196,19 +196,19 @@ - - + hierarchy this - -WebKitEditorState + +WebKitEditorState @@ -216,15 +216,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -414,10 +414,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -443,7 +439,7 @@
- No description available. +

No description available.

@@ -453,7 +449,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.FaviconDatabase.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.FaviconDatabase.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.FaviconDatabase.html 2026-04-16 17:54:37.051696000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.FaviconDatabase.html 2026-07-09 07:33:41.689738800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -121,7 +121,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -137,7 +137,7 @@
-

unstable since: 6.0

+

@@ -169,8 +169,6 @@
-

Available since: 6.0

-
@@ -188,19 +186,19 @@ - - + hierarchy this - -WebKitFaviconDatabase + +WebKitFaviconDatabase @@ -208,15 +206,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -267,7 +265,7 @@

Clears all icons from the database.

-

unstable since: 6.0

+

@@ -277,7 +275,7 @@

Asynchronously obtains a favicon image.

-

unstable since: 6.0

+

@@ -287,7 +285,7 @@

Finishes an operation started with webkit_favicon_database_get_favicon().

-

unstable since: 6.0

+

@@ -297,7 +295,7 @@

Obtains the URI of the favicon for the given page_uri.

-

unstable since: 6.0

+

@@ -344,7 +342,7 @@ property. See webkit_web_view_get_favicon() for more details.

-

unstable since: 6.0

+

@@ -360,10 +358,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -389,7 +383,7 @@
- No description available. +

No description available.

@@ -399,7 +393,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.FileChooserRequest.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.FileChooserRequest.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.FileChooserRequest.html 2026-04-16 17:54:37.152696100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.FileChooserRequest.html 2026-07-09 07:33:41.733863800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -131,7 +131,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -147,7 +147,7 @@
-

unstable since: 6.0

+

@@ -185,8 +185,6 @@
-

Available since: 6.0

-
@@ -204,7 +202,7 @@ - this - -WebKitFileChooserRequest + +WebKitFileChooserRequest @@ -224,15 +222,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -283,7 +281,7 @@

Ask WebKit to cancel the request.

-

unstable since: 6.0

+

@@ -293,7 +291,7 @@

Get the list of MIME types the file chooser dialog should handle.

-

unstable since: 6.0

+

@@ -303,7 +301,7 @@

Get the filter currently associated with the request.

-

unstable since: 6.0

+

@@ -313,7 +311,7 @@

Whether the file chooser should allow selecting multiple files.

-

unstable since: 6.0

+

@@ -323,7 +321,7 @@

Get the list of selected files associated to the request.

-

unstable since: 6.0

+

@@ -333,7 +331,7 @@

Ask WebKit to select local files for upload and complete the request.

-

unstable since: 6.0

+

@@ -374,7 +372,7 @@ webkit_file_chooser_request_get_mime_types_filter() for more details.

-

unstable since: 6.0

+

@@ -386,7 +384,7 @@ webkit_file_chooser_request_get_mime_types() for more details.

-

unstable since: 6.0

+

@@ -399,7 +397,7 @@ more details.

-

unstable since: 6.0

+

@@ -411,7 +409,7 @@ webkit_file_chooser_request_get_selected_files() for more details.

-

unstable since: 6.0

+

@@ -445,10 +443,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -474,7 +468,7 @@
- No description available. +

No description available.

@@ -484,7 +478,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.FindController.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.FindController.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.FindController.html 2026-04-16 17:54:37.270696400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.FindController.html 2026-07-09 07:33:41.778326000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -150,7 +150,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -166,7 +166,7 @@
-

unstable since: 6.0

+

@@ -199,8 +199,6 @@
-

Available since: 6.0

-
@@ -218,7 +216,7 @@ - this - -WebKitFindController + +WebKitFindController @@ -238,15 +236,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -297,7 +295,7 @@

Counts the number of matches for search_text.

-

unstable since: 6.0

+

@@ -307,7 +305,7 @@

Gets the maximum number of matches to report.

-

unstable since: 6.0

+

@@ -317,7 +315,7 @@

Gets the WebKitFindOptions for the current search.

-

unstable since: 6.0

+

@@ -327,7 +325,7 @@

Gets the text that find_controller is searching for.

-

unstable since: 6.0

+

@@ -337,7 +335,7 @@

Gets the WebKitWebView this find controller is associated to.

-

unstable since: 6.0

+

@@ -347,7 +345,7 @@

Looks for search_text associated with find_controller.

-

unstable since: 6.0

+

@@ -357,7 +355,7 @@

Finishes a find operation.

-

unstable since: 6.0

+

@@ -367,7 +365,7 @@

Looks for the next occurrence of the search text.

-

unstable since: 6.0

+

@@ -377,7 +375,7 @@

Looks for the previous occurrence of the search text.

-

unstable since: 6.0

+

@@ -417,7 +415,7 @@

The maximum number of matches to report for a given search.

-

unstable since: 6.0

+

@@ -427,7 +425,7 @@

The options to be used in the search operation.

-

unstable since: 6.0

+

@@ -437,7 +435,7 @@

The current search text for this WebKitFindController.

-

unstable since: 6.0

+

@@ -447,7 +445,7 @@

The WebKitWebView this controller is associated to.

-

unstable since: 6.0

+

@@ -481,7 +479,7 @@ to webkit_find_controller_count_matches().

-

unstable since: 6.0

+

@@ -495,7 +493,7 @@ or webkit_find_controller_search_previous().

-

unstable since: 6.0

+

@@ -508,7 +506,7 @@ webkit_find_controller_search_next() or webkit_find_controller_search_previous().

-

unstable since: 6.0

+

@@ -524,10 +522,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -553,7 +547,7 @@
- No description available. +

No description available.

@@ -563,7 +557,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.FormSubmissionRequest.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.FormSubmissionRequest.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.FormSubmissionRequest.html 2026-04-16 17:54:37.422696600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.FormSubmissionRequest.html 2026-07-09 07:33:41.832577500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -124,7 +124,7 @@
-

unstable since: 6.0

+

@@ -154,8 +154,6 @@
-

Available since: 6.0

-
@@ -173,19 +171,19 @@ - - + hierarchy this - -WebKitFormSubmissionRequest + +WebKitFormSubmissionRequest @@ -193,15 +191,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -262,7 +260,7 @@

Continue the form submission.

-

unstable since: 6.0

+

@@ -306,10 +304,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -335,7 +329,7 @@
- No description available. +

No description available.

@@ -345,7 +339,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.GeolocationManager.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.GeolocationManager.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.GeolocationManager.html 2026-04-16 17:54:37.483696700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.GeolocationManager.html 2026-07-09 07:33:41.859547100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -130,7 +130,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -195,7 +195,7 @@ - this - -WebKitGeolocationManager + +WebKitGeolocationManager @@ -215,15 +215,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -399,10 +399,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -428,7 +424,7 @@
- No description available. +

No description available.

@@ -438,7 +434,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.GeolocationPermissionRequest.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.GeolocationPermissionRequest.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.GeolocationPermissionRequest.html 2026-04-16 17:54:37.580696800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.GeolocationPermissionRequest.html 2026-07-09 07:33:41.894471200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -97,7 +97,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -113,7 +113,7 @@
-

unstable since: 6.0

+

@@ -155,8 +155,6 @@
-

Available since: 6.0

-
@@ -174,19 +172,19 @@ - - + hierarchy this - -WebKitGeolocationPermissionRequest + +WebKitGeolocationPermissionRequest @@ -194,29 +192,29 @@ implements_0 - -WebKitPermissionRequest + +WebKitPermissionRequest this--implements_0 - + ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -303,16 +301,16 @@

Allow the action which triggered this request.

-

unstable since: 6.0

+

- +
webkit_permission_request_deny

Deny the action which triggered this request.

-

unstable since: 6.0

+

- + @@ -340,10 +338,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -371,7 +365,7 @@
- No description available. +

No description available.

@@ -381,7 +375,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.HitTestResult.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.HitTestResult.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.HitTestResult.html 2026-04-16 17:54:37.636696800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.HitTestResult.html 2026-07-09 07:33:41.916720400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -147,7 +147,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -163,7 +163,7 @@
-

unstable since: 6.0

+

@@ -203,8 +203,6 @@
-

Available since: 6.0

-
@@ -222,19 +220,19 @@ - - + hierarchy this - -WebKitHitTestResult + +WebKitHitTestResult @@ -242,15 +240,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -302,7 +300,7 @@ WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -313,7 +311,7 @@ WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -324,7 +322,7 @@ WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -335,7 +333,7 @@ WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -346,7 +344,7 @@ WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -367,7 +365,7 @@

Gets the value of the WebKitHitTestResult:context property.

-

unstable since: 6.0

+

@@ -377,7 +375,7 @@

Gets the value of the WebKitHitTestResult:image-uri property.

-

unstable since: 6.0

+

@@ -387,7 +385,7 @@

Gets the value of the WebKitHitTestResult:link-label property.

-

unstable since: 6.0

+

@@ -397,7 +395,7 @@

Gets the value of the WebKitHitTestResult:link-title property.

-

unstable since: 6.0

+

@@ -407,7 +405,7 @@

Gets the value of the WebKitHitTestResult:link-uri property.

-

unstable since: 6.0

+

@@ -417,7 +415,7 @@

Gets the value of the WebKitHitTestResult:media-uri property.

-

unstable since: 6.0

+

@@ -458,7 +456,7 @@ the context of the WebKitHitTestResult.

-

unstable since: 6.0

+

@@ -469,7 +467,7 @@ is present in WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -480,7 +478,7 @@ is present in WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -491,7 +489,7 @@ is present in WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -502,7 +500,7 @@ is present in WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -513,7 +511,7 @@ is present in WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -547,10 +545,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -576,7 +570,7 @@
- No description available. +

No description available.

@@ -586,7 +580,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.Image.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.Image.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.Image.html 2026-03-04 10:12:45.282978800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.Image.html 2026-03-06 08:31:47.182577100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.51.92

+

Library Version: 2.51.93

@@ -125,7 +125,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,19 +187,19 @@ - - + hierarchy this - -WebKitImage + +WebKitImage @@ -207,43 +207,43 @@ implements_0 - -GIcon + +GIcon this--implements_0 - + implements_1 - -GLoadableIcon + +GLoadableIcon this--implements_1 - + ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -372,39 +372,23 @@
g_icon_equal

Checks if two icons are equal.

-
-
-

since: 2.0

-
-
g_icon_hash
+
g_icon_hash

Gets a hash for an icon.

-
-
-

since: 2.0

-
-
g_icon_serialize
+
g_icon_serialize

Serializes a GIcon into a GVariant. An equivalent GIcon can be retrieved back by calling g_icon_deserialize() on the returned value. As serialization will avoid using raw icon data when possible, it only makes sense to transfer the GVariant between processes on the same machine, (as opposed to over the network), and within the same file system namespace.

-
-
-

since: 2.38

-
-
g_icon_to_string
+
g_icon_to_string

Generates a textual representation of icon that can be used for serialization such as when passing icon to a different process or saving it to persistent storage. Use g_icon_new_for_string() to get icon back from the returned string.

-
-

since: 2.20

-
- @@ -416,27 +400,15 @@

Loads a loadable icon. For the asynchronous version of this function, see g_loadable_icon_load_async().

-
-
-

since: 2.0

-
-
g_loadable_icon_load_async
+
g_loadable_icon_load_async

Loads an icon asynchronously. To finish this function, see g_loadable_icon_load_finish(). For the synchronous, blocking version of this function, see g_loadable_icon_load().

-
-
-

since: 2.0

-
-
g_loadable_icon_load_finish
+
g_loadable_icon_load_finish

Finishes an asynchronous icon load started in g_loadable_icon_load_async().

-
-

since: 2.0

-
- @@ -521,10 +493,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -554,7 +522,7 @@
- No description available. +

No description available.

@@ -564,7 +532,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.InputMethodContext.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.InputMethodContext.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.InputMethodContext.html 2026-04-16 17:54:37.870697300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.InputMethodContext.html 2026-07-09 07:33:42.005414500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -189,7 +189,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -255,19 +255,19 @@ - - + hierarchy this - -WebKitInputMethodContext + +WebKitInputMethodContext @@ -275,15 +275,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -587,10 +587,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -719,7 +715,7 @@
- No description available. +

No description available.

@@ -729,35 +725,35 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

preedit_started: void (* preedit_started) ( WebKitInputMethodContext* context )
-
No description available.
+

No description available.

preedit_changed: void (* preedit_changed) ( WebKitInputMethodContext* context )
-
No description available.
+

No description available.

preedit_finished: void (* preedit_finished) ( WebKitInputMethodContext* context )
-
No description available.
+

No description available.

committed: void (* committed) ( WebKitInputMethodContext* context, const char* text )
-
No description available.
+

No description available.

delete_surrounding: void (* delete_surrounding) ( WebKitInputMethodContext* context, int offset, guint n_chars )
-
No description available.
+

No description available.

set_enable_preedit: void (* set_enable_preedit) ( WebKitInputMethodContext* context, @@ -835,82 +831,82 @@
_webkit_reserved0: void (* _webkit_reserved0) ( void )
-
No description available.
+

No description available.

_webkit_reserved1: void (* _webkit_reserved1) ( void )
-
No description available.
+

No description available.

_webkit_reserved2: void (* _webkit_reserved2) ( void )
-
No description available.
+

No description available.

_webkit_reserved3: void (* _webkit_reserved3) ( void )
-
No description available.
+

No description available.

_webkit_reserved4: void (* _webkit_reserved4) ( void )
-
No description available.
+

No description available.

_webkit_reserved5: void (* _webkit_reserved5) ( void )
-
No description available.
+

No description available.

_webkit_reserved6: void (* _webkit_reserved6) ( void )
-
No description available.
+

No description available.

_webkit_reserved7: void (* _webkit_reserved7) ( void )
-
No description available.
+

No description available.

_webkit_reserved8: void (* _webkit_reserved8) ( void )
-
No description available.
+

No description available.

_webkit_reserved9: void (* _webkit_reserved9) ( void )
-
No description available.
+

No description available.

_webkit_reserved10: void (* _webkit_reserved10) ( void )
-
No description available.
+

No description available.

_webkit_reserved11: void (* _webkit_reserved11) ( void )
-
No description available.
+

No description available.

_webkit_reserved12: void (* _webkit_reserved12) ( void )
-
No description available.
+

No description available.

_webkit_reserved13: void (* _webkit_reserved13) ( void )
-
No description available.
+

No description available.

_webkit_reserved14: void (* _webkit_reserved14) ( void )
-
No description available.
+

No description available.

_webkit_reserved15: void (* _webkit_reserved15) ( void )
-
No description available.
+

No description available.

@@ -933,7 +929,7 @@ No description available.
-

unstable since: 6.0

+

@@ -943,7 +939,7 @@ No description available.
-

unstable since: 6.0

+

@@ -1013,7 +1009,7 @@ No description available.
-

unstable since: 6.0

+

@@ -1023,7 +1019,7 @@ No description available.
-

unstable since: 6.0

+

@@ -1033,7 +1029,7 @@ No description available.
-

unstable since: 6.0

+

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.MediaKeySystemPermissionRequest.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.MediaKeySystemPermissionRequest.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.MediaKeySystemPermissionRequest.html 2026-04-16 17:54:38.125697600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.MediaKeySystemPermissionRequest.html 2026-07-09 07:33:42.099756500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -97,7 +97,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -113,7 +113,7 @@
-

unstable since: 6.0

+

@@ -144,8 +144,6 @@
-

Available since: 6.0

-
@@ -163,7 +161,7 @@ - this - -WebKitMediaKeySystemPermissionRequest + +WebKitMediaKeySystemPermissionRequest @@ -183,29 +181,29 @@ implements_0 - -WebKitPermissionRequest + +WebKitPermissionRequest this--implements_0 - + ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -292,16 +290,16 @@

Allow the action which triggered this request.

-

unstable since: 6.0

+

- +
webkit_permission_request_deny

Deny the action which triggered this request.

-

unstable since: 6.0

+

- + @@ -329,10 +327,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -360,7 +354,7 @@
- No description available. +

No description available.

@@ -370,7 +364,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.NavigationPolicyDecision.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.NavigationPolicyDecision.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.NavigationPolicyDecision.html 2026-04-16 17:54:38.169697500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.NavigationPolicyDecision.html 2026-07-09 07:33:42.117234200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -115,7 +115,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -131,7 +131,7 @@
-

unstable since: 6.0

+

@@ -158,8 +158,6 @@
-

Available since: 6.0

-
@@ -177,7 +175,7 @@ - this - -WebKitNavigationPolicyDecision + +WebKitNavigationPolicyDecision @@ -197,29 +195,29 @@ ancestor_0 - -WebKitPolicyDecision + +WebKitPolicyDecision ancestor_0--this - + ancestor_1 - -GObject + +GObject ancestor_1--ancestor_0 - + @@ -289,30 +287,30 @@

Spawn a download from this decision.

-

unstable since: 6.0

+

- +
webkit_policy_decision_ignore

WebKitResponsePolicyDecision, this would cancel the request.

-

unstable since: 6.0

+

- +
webkit_policy_decision_use

Accept the action which triggered this decision.

-

unstable since: 6.0

+

- +
webkit_policy_decision_use_with_policies

Accept the navigation action and continue with provided policies.

since: 2.30

- + @@ -388,10 +386,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -417,7 +411,7 @@
- No description available. +

No description available.

@@ -427,7 +421,7 @@
parent_class: WebKitPolicyDecisionClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.NetworkSession.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.NetworkSession.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.NetworkSession.html 2026-04-16 17:54:38.249697700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.NetworkSession.html 2026-07-09 07:33:42.144752700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -178,7 +178,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -237,19 +237,19 @@ - - + hierarchy this - -WebKitNetworkSession + +WebKitNetworkSession @@ -257,15 +257,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -637,10 +637,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -666,7 +662,7 @@
- No description available. +

No description available.

@@ -676,7 +672,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.Notification.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.Notification.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.Notification.html 2026-04-16 17:54:38.461698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.Notification.html 2026-07-09 07:33:42.229603300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -142,7 +142,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -201,19 +201,19 @@ - - + hierarchy this - -WebKitNotification + +WebKitNotification @@ -221,15 +221,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -458,10 +458,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -487,7 +483,7 @@
- No description available. +

No description available.

@@ -497,7 +493,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.NotificationPermissionRequest.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.NotificationPermissionRequest.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.NotificationPermissionRequest.html 2026-04-16 17:54:38.563580800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.NotificationPermissionRequest.html 2026-07-09 07:33:42.267959600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -97,7 +97,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -161,19 +161,19 @@ - - + hierarchy this - -WebKitNotificationPermissionRequest + +WebKitNotificationPermissionRequest @@ -181,29 +181,29 @@ implements_0 - -WebKitPermissionRequest + +WebKitPermissionRequest this--implements_0 - + ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -290,16 +290,16 @@

Allow the action which triggered this request.

-

unstable since: 6.0

+

- +
webkit_permission_request_deny

Deny the action which triggered this request.

-

unstable since: 6.0

+

- + @@ -327,10 +327,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -358,7 +354,7 @@
- No description available. +

No description available.

@@ -368,7 +364,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.OptionMenu.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.OptionMenu.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.OptionMenu.html 2026-04-16 17:54:38.609698300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.OptionMenu.html 2026-07-09 07:33:42.286431000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -125,7 +125,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,19 +187,19 @@ - - + hierarchy this - -WebKitOptionMenu + +WebKitOptionMenu @@ -207,15 +207,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -378,10 +378,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -407,7 +403,7 @@
- No description available. +

No description available.

@@ -417,7 +413,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.PointerLockPermissionRequest.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.PointerLockPermissionRequest.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.PointerLockPermissionRequest.html 2026-04-16 17:54:38.733698400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.PointerLockPermissionRequest.html 2026-07-09 07:33:42.328411000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -97,7 +97,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -161,7 +161,7 @@ - this - -WebKitPointerLockPermissionRequest + +WebKitPointerLockPermissionRequest @@ -181,29 +181,29 @@ implements_0 - -WebKitPermissionRequest + +WebKitPermissionRequest this--implements_0 - + ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -290,16 +290,16 @@

Allow the action which triggered this request.

-

unstable since: 6.0

+

- +
webkit_permission_request_deny

Deny the action which triggered this request.

-

unstable since: 6.0

+

- + @@ -327,10 +327,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -358,7 +354,7 @@
- No description available. +

No description available.

@@ -368,7 +364,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.PolicyDecision.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.PolicyDecision.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.PolicyDecision.html 2026-04-16 17:54:38.778698400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.PolicyDecision.html 2026-07-09 07:33:42.346685000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -112,7 +112,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -128,7 +128,7 @@
-

unstable since: 6.0

+

@@ -161,8 +161,6 @@
-

Available since: 6.0

-
@@ -180,7 +178,7 @@ - this - -WebKitPolicyDecision + +WebKitPolicyDecision @@ -200,15 +198,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -270,7 +268,7 @@

Spawn a download from this decision.

-

unstable since: 6.0

+

@@ -280,7 +278,7 @@

WebKitResponsePolicyDecision, this would cancel the request.

-

unstable since: 6.0

+

@@ -290,7 +288,7 @@

Accept the action which triggered this decision.

-

unstable since: 6.0

+

@@ -344,10 +342,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -397,7 +391,7 @@
- No description available. +

No description available.

@@ -407,47 +401,47 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

_webkit_reserved0: void (* _webkit_reserved0) ( void )
-
No description available.
+

No description available.

_webkit_reserved1: void (* _webkit_reserved1) ( void )
-
No description available.
+

No description available.

_webkit_reserved2: void (* _webkit_reserved2) ( void )
-
No description available.
+

No description available.

_webkit_reserved3: void (* _webkit_reserved3) ( void )
-
No description available.
+

No description available.

_webkit_reserved4: void (* _webkit_reserved4) ( void )
-
No description available.
+

No description available.

_webkit_reserved5: void (* _webkit_reserved5) ( void )
-
No description available.
+

No description available.

_webkit_reserved6: void (* _webkit_reserved6) ( void )
-
No description available.
+

No description available.

_webkit_reserved7: void (* _webkit_reserved7) ( void )
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.PrintOperation.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.PrintOperation.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.PrintOperation.html 2026-04-16 17:54:38.848698600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.PrintOperation.html 2026-07-09 07:33:42.379067400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -149,7 +149,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@
-

unstable since: 6.0

+

@@ -193,8 +193,6 @@
-

Available since: 6.0

-
@@ -212,19 +210,19 @@ - - + hierarchy this - -WebKitPrintOperation + +WebKitPrintOperation @@ -232,15 +230,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -287,7 +285,7 @@

Create a new WebKitPrintOperation to print web_view contents.

-

unstable since: 6.0

+

@@ -312,7 +310,7 @@

Return the current page setup of print_operation.

-

unstable since: 6.0

+

@@ -322,7 +320,7 @@

Return the current print settings of print_operation.

-

unstable since: 6.0

+

@@ -332,7 +330,7 @@

Start a print operation using current print settings and page setup.

-

unstable since: 6.0

+

@@ -342,7 +340,7 @@

Run the print dialog and start printing.

-

unstable since: 6.0

+

@@ -352,7 +350,7 @@

Set the current page setup of print_operation.

-

unstable since: 6.0

+

@@ -362,7 +360,7 @@

Set the current print settings of print_operation.

-

unstable since: 6.0

+

@@ -402,7 +400,7 @@

The initial GtkPageSetup for the print operation.

-

unstable since: 6.0

+

@@ -412,7 +410,7 @@

The initial GtkPrintSettings for the print operation.

-

unstable since: 6.0

+

@@ -422,7 +420,7 @@

The WebKitWebView that will be printed.

-

unstable since: 6.0

+

@@ -456,7 +454,7 @@ The WebKitPrintOperation::finished signal is emitted after this one.

-

unstable since: 6.0

+

@@ -467,7 +465,7 @@ required for printing.

-

unstable since: 6.0

+

@@ -483,10 +481,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -512,7 +506,7 @@
- No description available. +

No description available.

@@ -522,7 +516,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.ResponsePolicyDecision.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.ResponsePolicyDecision.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.ResponsePolicyDecision.html 2026-04-16 17:54:38.994698800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.ResponsePolicyDecision.html 2026-07-09 07:33:42.426736000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -123,7 +123,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -139,7 +139,7 @@
-

unstable since: 6.0

+

@@ -167,8 +167,6 @@
-

Available since: 6.0

-
@@ -186,7 +184,7 @@ - this - -WebKitResponsePolicyDecision + +WebKitResponsePolicyDecision @@ -206,29 +204,29 @@ ancestor_0 - -WebKitPolicyDecision + +WebKitPolicyDecision ancestor_0--this - + ancestor_1 - -GObject + +GObject ancestor_1--ancestor_0 - + @@ -283,7 +281,7 @@

Return the WebKitURIRequest associated with the response decision.

-

unstable since: 6.0

+

@@ -293,7 +291,7 @@

Gets the value of the WebKitResponsePolicyDecision:response property.

-

unstable since: 6.0

+

@@ -328,30 +326,30 @@

Spawn a download from this decision.

-

unstable since: 6.0

+

- +
webkit_policy_decision_ignore

WebKitResponsePolicyDecision, this would cancel the request.

-

unstable since: 6.0

+

- +
webkit_policy_decision_use

Accept the action which triggered this decision.

-

unstable since: 6.0

+

- +
webkit_policy_decision_use_with_policies

Accept the navigation action and continue with provided policies.

since: 2.30

- + @@ -390,7 +388,7 @@ policy decision.

-

unstable since: 6.0

+

@@ -401,7 +399,7 @@ policy decision.

-

unstable since: 6.0

+

@@ -439,10 +437,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -468,7 +462,7 @@
- No description available. +

No description available.

@@ -478,7 +472,7 @@
parent_class: WebKitPolicyDecisionClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.SecurityManager.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.SecurityManager.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.SecurityManager.html 2026-04-16 17:54:39.076698800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.SecurityManager.html 2026-07-09 07:33:42.460953000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -144,7 +144,7 @@
-

unstable since: 6.0

+

@@ -173,8 +173,6 @@
-

Available since: 6.0

-
@@ -192,7 +190,7 @@ - this - -WebKitSecurityManager + +WebKitSecurityManager @@ -212,15 +210,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -271,7 +269,7 @@

Register scheme as a CORS (Cross-origin resource sharing) enabled scheme.

-

unstable since: 6.0

+

@@ -281,7 +279,7 @@

Register scheme as a display isolated scheme.

-

unstable since: 6.0

+

@@ -291,7 +289,7 @@

Register scheme as an empty document scheme.

-

unstable since: 6.0

+

@@ -301,7 +299,7 @@

Register scheme as a local scheme.

-

unstable since: 6.0

+

@@ -311,7 +309,7 @@

Register scheme as a no-access scheme.

-

unstable since: 6.0

+

@@ -321,7 +319,7 @@

Register scheme as a secure scheme.

-

unstable since: 6.0

+

@@ -331,7 +329,7 @@

Whether scheme is considered as a CORS enabled scheme.

-

unstable since: 6.0

+

@@ -341,7 +339,7 @@

Whether scheme is considered as a display isolated scheme.

-

unstable since: 6.0

+

@@ -351,7 +349,7 @@

Whether scheme is considered as an empty document scheme.

-

unstable since: 6.0

+

@@ -361,7 +359,7 @@

Whether scheme is considered as a local scheme.

-

unstable since: 6.0

+

@@ -371,7 +369,7 @@

Whether scheme is considered as a no-access scheme.

-

unstable since: 6.0

+

@@ -381,7 +379,7 @@

Whether scheme is considered as a secure scheme.

-

unstable since: 6.0

+

@@ -425,10 +423,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -454,7 +448,7 @@
- No description available. +

No description available.

@@ -464,7 +458,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.Settings.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.Settings.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.Settings.html 2026-04-16 17:54:39.321699100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.Settings.html 2026-07-09 07:33:42.558488800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -495,7 +495,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -511,7 +511,7 @@
-

unstable since: 6.0

+

@@ -543,8 +543,6 @@
-

Available since: 6.0

-
@@ -562,7 +560,7 @@ - this - -WebKitSettings + +WebKitSettings @@ -582,15 +580,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -637,7 +635,7 @@

Creates a new WebKitSettings instance with default values.

-

unstable since: 6.0

+

@@ -647,7 +645,7 @@

Creates a new WebKitSettings instance with the given settings.

-

unstable since: 6.0

+

@@ -754,7 +752,7 @@

Get the WebKitSettings:allow-modal-dialogs property.

-

unstable since: 6.0

+

@@ -784,7 +782,7 @@

Get the WebKitSettings:auto-load-images property.

-

unstable since: 6.0

+

@@ -794,7 +792,7 @@

Gets the WebKitSettings:cursive-font-family property.

-

unstable since: 6.0

+

@@ -804,7 +802,7 @@

Gets the WebKitSettings:default-charset property.

-

unstable since: 6.0

+

@@ -814,7 +812,7 @@

Gets the WebKitSettings:default-font-family property.

-

unstable since: 6.0

+

@@ -824,7 +822,7 @@

Gets the WebKitSettings:default-font-size property.

-

unstable since: 6.0

+

@@ -834,7 +832,7 @@

Gets the WebKitSettings:default-monospace-font-size property.

-

unstable since: 6.0

+

@@ -854,7 +852,7 @@

Get the WebKitSettings:draw-compositing-indicators property.

-

unstable since: 6.0

+

@@ -884,7 +882,7 @@

Get the WebKitSettings:enable-caret-browsing property.

-

unstable since: 6.0

+

@@ -894,7 +892,7 @@

Get the WebKitSettings:enable-developer-extras property.

-

unstable since: 6.0

+

@@ -904,7 +902,7 @@

Get the WebKitSettings:enable-dns-prefetching property.

-

unstable deprecated: 2.48. since: 6.0

+

deprecated: 2.48. 

@@ -924,7 +922,7 @@

Get the WebKitSettings:enable-fullscreen property.

-

unstable since: 6.0

+

@@ -934,7 +932,7 @@

Get the WebKitSettings:enable-html5-database property.

-

unstable since: 6.0

+

@@ -944,7 +942,7 @@

Get the WebKitSettings:enable-html5-local-storage property.

-

unstable since: 6.0

+

@@ -954,7 +952,7 @@

Get the WebKitSettings:enable-hyperlink-auditing property.

-

unstable deprecated: 2.50. since: 6.0

+

deprecated: 2.50. 

@@ -964,7 +962,7 @@

Get the WebKitSettings:enable-javascript property.

-

unstable since: 6.0

+

@@ -1034,7 +1032,7 @@

Get the WebKitSettings:enable-offline-web-application-cache property.

-

unstable deprecated: 2.44 since: 6.0

+

deprecated: 2.44 

@@ -1044,7 +1042,7 @@

Get the WebKitSettings:enable-page-cache property.

-

unstable since: 6.0

+

@@ -1054,7 +1052,7 @@

Get the WebKitSettings:enable-resizable-text-areas property.

-

unstable since: 6.0

+

@@ -1064,7 +1062,7 @@

Get the WebKitSettings:enable-site-specific-quirks property.

-

unstable since: 6.0

+

@@ -1074,7 +1072,7 @@

Get the WebKitSettings:enable-smooth-scrolling property.

-

unstable since: 6.0

+

@@ -1094,7 +1092,7 @@

Get the WebKitSettings:enable-tabs-to-links property.

-

unstable since: 6.0

+

@@ -1104,7 +1102,7 @@

Get the WebKitSettings:enable-webaudio property.

-

unstable since: 6.0

+

@@ -1114,7 +1112,7 @@

Get the WebKitSettings:enable-webgl property.

-

unstable since: 6.0

+

@@ -1144,7 +1142,7 @@

Gets the WebKitSettings:fantasy-font-family property.

-

unstable since: 6.0

+

@@ -1174,7 +1172,7 @@

Get the WebKitSettings:javascript-can-access-clipboard property.

-

unstable since: 6.0

+

@@ -1184,7 +1182,7 @@

Get the WebKitSettings:javascript-can-open-windows-automatically property.

-

unstable since: 6.0

+

@@ -1194,7 +1192,7 @@

Setting no longer supported. This function returns FALSE.

-

unstable deprecated: 2.42 since: 6.0

+

deprecated: 2.42 

@@ -1204,7 +1202,7 @@

Gets the WebKitSettings:math-font-family property.

-

unstable since: 6.0

+

@@ -1224,7 +1222,7 @@

Get the WebKitSettings:media-playback-allows-inline property.

-

unstable since: 6.0

+

@@ -1234,7 +1232,7 @@

Get the WebKitSettings:media-playback-requires-user-gesture property.

-

unstable since: 6.0

+

@@ -1244,7 +1242,7 @@

Gets the WebKitSettings:minimum-font-size property.

-

unstable since: 6.0

+

@@ -1254,7 +1252,7 @@

Gets the WebKitSettings:monospace-font-family property.

-

unstable since: 6.0

+

@@ -1264,7 +1262,7 @@

Gets the WebKitSettings:pictograph-font-family property.

-

unstable since: 6.0

+

@@ -1274,7 +1272,7 @@

Get the WebKitSettings:print-backgrounds property.

-

unstable since: 6.0

+

@@ -1284,7 +1282,7 @@

Gets the WebKitSettings:sans-serif-font-family property.

-

unstable since: 6.0

+

@@ -1294,7 +1292,7 @@

Gets the WebKitSettings:serif-font-family property.

-

unstable since: 6.0

+

@@ -1304,7 +1302,7 @@

Get the WebKitSettings:user-agent property.

-

unstable since: 6.0

+

@@ -1324,7 +1322,7 @@

Get the WebKitSettings:zoom-text-only property.

-

unstable since: 6.0

+

@@ -1344,7 +1342,7 @@

Set the WebKitSettings:allow-modal-dialogs property.

-

unstable since: 6.0

+

@@ -1374,7 +1372,7 @@

Set the WebKitSettings:auto-load-images property.

-

unstable since: 6.0

+

@@ -1384,7 +1382,7 @@

Set the WebKitSettings:cursive-font-family property.

-

unstable since: 6.0

+

@@ -1394,7 +1392,7 @@

Set the WebKitSettings:default-charset property.

-

unstable since: 6.0

+

@@ -1404,7 +1402,7 @@

Set the WebKitSettings:default-font-family property.

-

unstable since: 6.0

+

@@ -1414,7 +1412,7 @@

Set the WebKitSettings:default-font-size property.

-

unstable since: 6.0

+

@@ -1424,7 +1422,7 @@

Set the WebKitSettings:default-monospace-font-size property.

-

unstable since: 6.0

+

@@ -1444,7 +1442,7 @@

Set the WebKitSettings:draw-compositing-indicators property.

-

unstable since: 6.0

+

@@ -1474,7 +1472,7 @@

Set the WebKitSettings:enable-caret-browsing property.

-

unstable since: 6.0

+

@@ -1484,7 +1482,7 @@

Set the WebKitSettings:enable-developer-extras property.

-

unstable since: 6.0

+

@@ -1494,7 +1492,7 @@

Set the WebKitSettings:enable-dns-prefetching property.

-

unstable deprecated: 2.48. since: 6.0

+

deprecated: 2.48. 

@@ -1514,7 +1512,7 @@

Set the WebKitSettings:enable-fullscreen property.

-

unstable since: 6.0

+

@@ -1524,7 +1522,7 @@

Set the WebKitSettings:enable-html5-database property.

-

unstable since: 6.0

+

@@ -1534,7 +1532,7 @@

Set the WebKitSettings:enable-html5-local-storage property.

-

unstable since: 6.0

+

@@ -1544,7 +1542,7 @@

Set the WebKitSettings:enable-hyperlink-auditing property.

-

unstable deprecated: 2.50. since: 6.0

+

deprecated: 2.50. 

@@ -1554,7 +1552,7 @@

Set the WebKitSettings:enable-javascript property.

-

unstable since: 6.0

+

@@ -1624,7 +1622,7 @@

Setting no longer supported. This function does nothing.

-

unstable deprecated: 2.44 since: 6.0

+

deprecated: 2.44 

@@ -1634,7 +1632,7 @@

Set the WebKitSettings:enable-page-cache property.

-

unstable since: 6.0

+

@@ -1644,7 +1642,7 @@

Set the WebKitSettings:enable-resizable-text-areas property.

-

unstable since: 6.0

+

@@ -1654,7 +1652,7 @@

Set the WebKitSettings:enable-site-specific-quirks property.

-

unstable since: 6.0

+

@@ -1664,7 +1662,7 @@

Set the WebKitSettings:enable-smooth-scrolling property.

-

unstable since: 6.0

+

@@ -1684,7 +1682,7 @@

Set the WebKitSettings:enable-tabs-to-links property.

-

unstable since: 6.0

+

@@ -1694,7 +1692,7 @@

Set the WebKitSettings:enable-webaudio property.

-

unstable since: 6.0

+

@@ -1704,7 +1702,7 @@

Set the WebKitSettings:enable-webgl property.

-

unstable since: 6.0

+

@@ -1734,7 +1732,7 @@

Set the WebKitSettings:fantasy-font-family property.

-

unstable since: 6.0

+

@@ -1764,7 +1762,7 @@

Set the WebKitSettings:javascript-can-access-clipboard property.

-

unstable since: 6.0

+

@@ -1774,7 +1772,7 @@

Set the WebKitSettings:javascript-can-open-windows-automatically property.

-

unstable since: 6.0

+

@@ -1784,7 +1782,7 @@

Setting no longer supported. This function does nothing.

-

unstable deprecated: 2.42 since: 6.0

+

deprecated: 2.42 

@@ -1794,7 +1792,7 @@

Set the WebKitSettings:math-font-family property.

-

unstable since: 6.0

+

@@ -1814,7 +1812,7 @@

Set the WebKitSettings:media-playback-allows-inline property.

-

unstable since: 6.0

+

@@ -1824,7 +1822,7 @@

Set the WebKitSettings:media-playback-requires-user-gesture property.

-

unstable since: 6.0

+

@@ -1834,7 +1832,7 @@

Set the WebKitSettings:minimum-font-size property.

-

unstable since: 6.0

+

@@ -1844,7 +1842,7 @@

Set the WebKitSettings:monospace-font-family property.

-

unstable since: 6.0

+

@@ -1854,7 +1852,7 @@

Set the WebKitSettings:pictograph-font-family property.

-

unstable since: 6.0

+

@@ -1864,7 +1862,7 @@

Set the WebKitSettings:print-backgrounds property.

-

unstable since: 6.0

+

@@ -1874,7 +1872,7 @@

Set the WebKitSettings:sans-serif-font-family property.

-

unstable since: 6.0

+

@@ -1884,7 +1882,7 @@

Set the WebKitSettings:serif-font-family property.

-

unstable since: 6.0

+

@@ -1894,7 +1892,7 @@

Set the WebKitSettings:user-agent property.

-

unstable since: 6.0

+

@@ -1904,7 +1902,7 @@

Set the WebKitSettings:user-agent property by appending the application details.

-

unstable since: 6.0

+

@@ -1924,7 +1922,7 @@

Set the WebKitSettings:zoom-text-only property.

-

unstable since: 6.0

+

@@ -1983,7 +1981,7 @@ signal will be emitted.

-

unstable since: 6.0

+

@@ -2023,7 +2021,7 @@ useful to turn this property off.

-

unstable since: 6.0

+

@@ -2033,7 +2031,7 @@

The font family used as the default for content using a cursive font.

-

unstable since: 6.0

+

@@ -2043,7 +2041,7 @@

The default text charset used when interpreting content with an unspecified charset.

-

unstable since: 6.0

+

@@ -2053,7 +2051,7 @@

The font family to use as the default for content that does not specify a font.

-

unstable since: 6.0

+

@@ -2064,7 +2062,7 @@ no font size is specified.

-

unstable since: 6.0

+

@@ -2075,7 +2073,7 @@ monospace font if no font size is specified.

-

unstable since: 6.0

+

@@ -2097,7 +2095,7 @@ to web content that is composited with the GPU.

-

unstable since: 6.0

+

@@ -2130,7 +2128,7 @@

Whether to enable accessibility enhanced keyboard navigation.

-

unstable since: 6.0

+

@@ -2140,7 +2138,7 @@

Determines whether or not developer tools, such as the Web Inspector, are enabled.

-

unstable since: 6.0

+

@@ -2151,7 +2149,7 @@ to resolve domain names before a user tries to follow a link.

-

unstable deprecated: 2.48 since: 6.0

+

deprecated: 2.48 

@@ -2177,7 +2175,7 @@ http://www.w3.org/TR/fullscreen/

-

unstable since: 6.0

+

@@ -2187,7 +2185,7 @@

Whether to enable HTML5 client-side SQL database support (IndexedDB).

-

unstable since: 6.0

+

@@ -2198,7 +2196,7 @@ simple synchronous storage access.

-

unstable since: 6.0

+

@@ -2208,7 +2206,7 @@

Determines whether or not hyperlink auditing is enabled.

-

unstable deprecated: 2.50 since: 6.0

+

deprecated: 2.50 

@@ -2218,7 +2216,7 @@

Determines whether or not JavaScript executes within a page.

-

unstable since: 6.0

+

@@ -2301,7 +2299,7 @@

Unsupported setting. This property does nothing.

-

unstable deprecated: 2.44 since: 6.0

+

deprecated: 2.44 

@@ -2318,7 +2316,7 @@ of caches and their purposes see: http://webkit.org/blog/427/webkit-page-cache-i-the-basics/

-

unstable since: 6.0

+

@@ -2328,7 +2326,7 @@

Determines whether or not text areas can be resized.

-

unstable since: 6.0

+

@@ -2343,7 +2341,7 @@ special-case this and other cases to make some specific sites work.

-

unstable since: 6.0

+

@@ -2353,7 +2351,7 @@

Enable or disable smooth scrolling.

-

unstable since: 6.0

+

@@ -2381,7 +2379,7 @@ then pressing tab key will insert the tab character.

-

unstable since: 6.0

+

@@ -2392,7 +2390,7 @@ API for processing and synthesizing audio in web applications.

-

unstable since: 6.0

+

@@ -2403,7 +2401,7 @@ content to use an API based on OpenGL ES 2.0.

-

unstable since: 6.0

+

@@ -2434,7 +2432,7 @@

The font family used as the default for content using a fantasy font.

-

unstable since: 6.0

+

@@ -2457,7 +2455,7 @@ set to TRUE, document.execCommand() allows cut, copy and paste commands.

-

unstable since: 6.0

+

@@ -2467,7 +2465,7 @@

Whether JavaScript can open popup windows automatically without user intervention.

-

unstable since: 6.0

+

@@ -2477,7 +2475,7 @@

Unsupported setting. This property does nothing.

-

unstable deprecated: 2.42 since: 6.0

+

deprecated: 2.42 

@@ -2510,7 +2508,7 @@ FALSE allows specifying that media playback should be always fullscreen.

-

unstable since: 6.0

+

@@ -2524,7 +2522,7 @@ load the media.

-

unstable since: 6.0

+

@@ -2536,7 +2534,7 @@ potentially break page layouts.

-

unstable since: 6.0

+

@@ -2546,7 +2544,7 @@

The font family used as the default for content using a monospace font.

-

unstable since: 6.0

+

@@ -2556,7 +2554,7 @@

The font family used as the default for content using a pictograph font.

-

unstable since: 6.0

+

@@ -2566,7 +2564,7 @@

Whether background images should be drawn during printing.

-

unstable since: 6.0

+

@@ -2576,7 +2574,7 @@

The font family used as the default for content using a sans-serif font.

-

unstable since: 6.0

+

@@ -2586,7 +2584,7 @@

The font family used as the default for content using a serif font.

-

unstable since: 6.0

+

@@ -2600,7 +2598,7 @@ webkit_settings_set_user_agent_with_application_details() instead.

-

unstable since: 6.0

+

@@ -2623,7 +2621,7 @@ this property is enabled.

-

unstable since: 6.0

+

@@ -2657,10 +2655,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -2686,7 +2680,7 @@
- No description available. +

No description available.

@@ -2696,7 +2690,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.URIRequest.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.URIRequest.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.URIRequest.html 2026-04-16 17:54:40.576701000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.URIRequest.html 2026-07-09 07:33:43.002528400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -130,7 +130,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -146,7 +146,7 @@
-

unstable since: 6.0

+

@@ -173,8 +173,6 @@
-

Available since: 6.0

-
@@ -192,19 +190,19 @@ - - + hierarchy this - -WebKitURIRequest + +WebKitURIRequest @@ -212,15 +210,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -267,7 +265,7 @@

Creates a new WebKitURIRequest for the given URI.

-

unstable since: 6.0

+

@@ -292,7 +290,7 @@

Get the HTTP headers of a WebKitURIRequest as a SoupMessageHeaders.

-

unstable since: 6.0

+

@@ -312,7 +310,7 @@

Obtains the request URI.

-

unstable since: 6.0

+

@@ -322,7 +320,7 @@

Set the URI of request.

-

unstable since: 6.0

+

@@ -362,7 +360,7 @@

The URI to which the request will be made.

-

unstable since: 6.0

+

@@ -396,10 +394,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -425,7 +419,7 @@
- No description available. +

No description available.

@@ -435,7 +429,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.URIResponse.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.URIResponse.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.URIResponse.html 2026-04-16 17:54:40.666701000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.URIResponse.html 2026-07-09 07:33:43.036056800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -135,7 +135,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -151,7 +151,7 @@
-

unstable since: 6.0

+

@@ -178,8 +178,6 @@
-

Available since: 6.0

-
@@ -197,7 +195,7 @@ - this - -WebKitURIResponse + +WebKitURIResponse @@ -217,15 +215,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -276,7 +274,7 @@

Get the expected content length of the WebKitURIResponse.

-

unstable since: 6.0

+

@@ -296,7 +294,7 @@

Gets the MIME type of the response.

-

unstable since: 6.0

+

@@ -306,7 +304,7 @@

Get the status code of the WebKitURIResponse.

-

unstable since: 6.0

+

@@ -316,7 +314,7 @@

Get the suggested filename for response.

-

unstable since: 6.0

+

@@ -326,7 +324,7 @@

Gets the URI which resulted in the response.

-

unstable since: 6.0

+

@@ -366,7 +364,7 @@

The expected content length of the response.

-

unstable since: 6.0

+

@@ -386,7 +384,7 @@

The MIME type of the response.

-

unstable since: 6.0

+

@@ -396,7 +394,7 @@

The status code of the response as returned by the server.

-

unstable since: 6.0

+

@@ -406,7 +404,7 @@

The suggested filename for the URI response.

-

unstable since: 6.0

+

@@ -416,7 +414,7 @@

The URI for which the response was made.

-

unstable since: 6.0

+

@@ -450,10 +448,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -479,7 +473,7 @@
- No description available. +

No description available.

@@ -489,7 +483,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.URISchemeRequest.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.URISchemeRequest.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.URISchemeRequest.html 2026-04-16 17:54:40.784701300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.URISchemeRequest.html 2026-07-09 07:33:43.078322200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -124,7 +124,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -140,7 +140,7 @@
-

unstable since: 6.0

+

@@ -171,8 +171,6 @@
-

Available since: 6.0

-
@@ -190,19 +188,19 @@ - - + hierarchy this - -WebKitURISchemeRequest + +WebKitURISchemeRequest @@ -210,15 +208,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -269,7 +267,7 @@

Finish a WebKitURISchemeRequest by setting the contents of the request and its mime type.

-

unstable since: 6.0

+

@@ -329,7 +327,7 @@

Get the URI path of request.

-

unstable since: 6.0

+

@@ -339,7 +337,7 @@

Get the URI scheme of request.

-

unstable since: 6.0

+

@@ -349,7 +347,7 @@

Get the URI of request.

-

unstable since: 6.0

+

@@ -359,7 +357,7 @@

Get the WebKitWebView that initiated the request.

-

unstable since: 6.0

+

@@ -403,10 +401,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -432,7 +426,7 @@
- No description available. +

No description available.

@@ -442,7 +436,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.URISchemeResponse.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.URISchemeResponse.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.URISchemeResponse.html 2026-04-16 17:54:40.909701300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.URISchemeResponse.html 2026-07-09 07:33:43.124190000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -130,7 +130,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -146,7 +146,7 @@
-

unstable since: 6.0

+

@@ -178,8 +178,6 @@
-

Available since: 6.0

-
@@ -197,19 +195,19 @@ - - + hierarchy this - -WebKitURISchemeResponse + +WebKitURISchemeResponse @@ -217,15 +215,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -401,10 +399,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -430,7 +424,7 @@
- No description available. +

No description available.

@@ -440,7 +434,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.UserContentFilterStore.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.UserContentFilterStore.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.UserContentFilterStore.html 2026-04-16 17:54:41.002701500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.UserContentFilterStore.html 2026-07-09 07:33:43.161206000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -144,7 +144,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -214,19 +214,19 @@ - - + hierarchy this - -WebKitUserContentFilterStore + +WebKitUserContentFilterStore @@ -234,15 +234,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -489,10 +489,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -518,7 +514,7 @@
- No description available. +

No description available.

@@ -528,7 +524,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.UserContentManager.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.UserContentManager.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.UserContentManager.html 2026-04-16 17:54:41.184702000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.UserContentManager.html 2026-07-09 07:33:43.232081400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -150,7 +150,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -216,19 +216,19 @@ - - + hierarchy this - -WebKitUserContentManager + +WebKitUserContentManager @@ -236,15 +236,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -396,7 +396,7 @@

Removes a filter from the given WebKitUserContentManager.

-

unstable since: 6.0

+

@@ -511,10 +511,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -540,7 +536,7 @@
- No description available. +

No description available.

@@ -550,7 +546,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.UserMediaPermissionRequest.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.UserMediaPermissionRequest.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.UserMediaPermissionRequest.html 2026-04-16 17:54:41.367702000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.UserMediaPermissionRequest.html 2026-07-09 07:33:43.299524800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -172,7 +172,7 @@ - this - -WebKitUserMediaPermissionRequest + +WebKitUserMediaPermissionRequest @@ -192,29 +192,29 @@ implements_0 - -WebKitPermissionRequest + +WebKitPermissionRequest this--implements_0 - + ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -301,16 +301,16 @@

Allow the action which triggered this request.

-

unstable since: 6.0

+

- +
webkit_permission_request_deny

Deny the action which triggered this request.

-

unstable since: 6.0

+

- + @@ -380,10 +380,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -411,7 +407,7 @@
- No description available. +

No description available.

@@ -421,7 +417,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.UserMessage.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.UserMessage.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.UserMessage.html 2026-04-16 17:54:41.419702000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.UserMessage.html 2026-07-09 07:33:43.321934700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -200,19 +200,19 @@ - - + hierarchy this - -WebKitUserMessage + +WebKitUserMessage @@ -220,29 +220,29 @@ ancestor_0 - -GInitiallyUnowned + +GInitiallyUnowned ancestor_0--this - + ancestor_1 - -GObject + +GObject ancestor_1--ancestor_0 - + @@ -459,10 +459,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -488,7 +484,7 @@
- No description available. +

No description available.

@@ -498,7 +494,7 @@
parent_class: GInitiallyUnownedClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WebContext.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebContext.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WebContext.html 2026-04-16 17:54:41.544702300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebContext.html 2026-07-09 07:33:43.369955300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -186,7 +186,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -202,7 +202,7 @@
-

unstable since: 6.0

+

@@ -243,8 +243,6 @@
-

Available since: 6.0

-
@@ -262,7 +260,7 @@ - this - -WebKitWebContext + +WebKitWebContext @@ -282,15 +280,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -360,7 +358,7 @@

Gets the default web context.

-

unstable since: 6.0

+

@@ -393,7 +391,7 @@

Returns the current cache model.

-

unstable since: 6.0

+

@@ -423,7 +421,7 @@

Get the WebKitSecurityManager of context.

-

unstable since: 6.0

+

@@ -433,7 +431,7 @@

Get whether spell checking feature is currently enabled.

-

unstable since: 6.0

+

@@ -443,7 +441,7 @@

Get the the list of spell checking languages.

-

unstable since: 6.0

+

@@ -483,7 +481,7 @@

Register scheme in context.

-

unstable since: 6.0

+

@@ -513,7 +511,7 @@

Specifies a usage model for WebViews.

-

unstable since: 6.0

+

@@ -523,7 +521,7 @@

Set the list of preferred languages.

-

unstable since: 6.0

+

@@ -533,7 +531,7 @@

Enable or disable the spell checking feature.

-

unstable since: 6.0

+

@@ -543,7 +541,7 @@

Set the list of spell checking languages to be used for spell checking.

-

unstable since: 6.0

+

@@ -553,7 +551,7 @@

Set the directory where WebKit will look for web process extensions.

-

unstable since: 6.0

+

@@ -708,10 +706,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -737,7 +731,7 @@
- No description available. +

No description available.

@@ -747,7 +741,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WebExtension.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebExtension.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WebExtension.html 2026-04-16 17:54:41.830702800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebExtension.html 2026-07-09 07:33:43.481871800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -204,7 +204,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -267,7 +267,7 @@ - this - -WebKitWebExtension + +WebKitWebExtension @@ -287,29 +287,29 @@ implements_0 - -GInitable + +GInitable this--implements_0 - + ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -675,10 +675,6 @@

Initializes the object implementing the interface.

-
-

since: 2.22

-
- @@ -926,10 +922,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -957,7 +949,7 @@
- No description available. +

No description available.

@@ -967,7 +959,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WebInspector.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebInspector.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WebInspector.html 2026-04-16 17:54:42.158703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebInspector.html 2026-07-09 07:33:43.601001300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -152,7 +152,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -168,7 +168,7 @@
-

unstable since: 6.0

+

@@ -210,8 +210,6 @@
-

Available since: 6.0

-
@@ -229,19 +227,19 @@ - - + hierarchy this - -WebKitWebInspector + +WebKitWebInspector @@ -249,15 +247,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -308,7 +306,7 @@

Request inspector to be attached.

-

unstable since: 6.0

+

@@ -318,7 +316,7 @@

Request inspector to be closed.

-

unstable since: 6.0

+

@@ -328,7 +326,7 @@

Request inspector to be detached.

-

unstable since: 6.0

+

@@ -338,7 +336,7 @@

Get the height that the inspector view when attached.

-

unstable since: 6.0

+

@@ -359,7 +357,7 @@

Get the URI that is currently being inspected.

-

unstable since: 6.0

+

@@ -369,7 +367,7 @@

Get the WebKitWebViewBase used to display the inspector.

-

unstable since: 6.0

+

@@ -380,7 +378,7 @@ the inspected view.

-

unstable since: 6.0

+

@@ -390,7 +388,7 @@

Request inspector to be shown.

-

unstable since: 6.0

+

@@ -430,7 +428,7 @@

The height that the inspector view should have when it is attached.

-

unstable since: 6.0

+

@@ -451,7 +449,7 @@

The URI that is currently being inspected.

-

unstable since: 6.0

+

@@ -488,7 +486,7 @@ the inspector view to a browser tab).

-

unstable since: 6.0

+

@@ -498,7 +496,7 @@

Emitted when the inspector should be shown.

-

unstable since: 6.0

+

@@ -509,7 +507,7 @@ inspector window, you should connect to this signal and destroy your window.

-

unstable since: 6.0

+

@@ -524,7 +522,7 @@ the signal WebKitWebInspector::open-window is emitted after this one.

-

unstable since: 6.0

+

@@ -539,7 +537,7 @@ the inspector in a separate window after being detached.

-

unstable since: 6.0

+

@@ -555,10 +553,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -584,7 +578,7 @@
- No description available. +

No description available.

@@ -594,7 +588,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WebResource.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebResource.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WebResource.html 2026-04-16 17:54:42.324703500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebResource.html 2026-07-09 07:33:43.662678500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -138,7 +138,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@
-

unstable since: 6.0

+

@@ -184,8 +184,6 @@
-

Available since: 6.0

-
@@ -203,7 +201,7 @@ - this - -WebKitWebResource + +WebKitWebResource @@ -223,15 +221,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -282,7 +280,7 @@

Asynchronously get the raw data for resource.

-

unstable since: 6.0

+

@@ -292,7 +290,7 @@

Finish an asynchronous operation started with webkit_web_resource_get_data().

-

unstable since: 6.0

+

@@ -302,7 +300,7 @@

Retrieves the WebKitURIResponse of the resource load operation.

-

unstable since: 6.0

+

@@ -312,7 +310,7 @@

Returns the current active URI of resource.

-

unstable since: 6.0

+

@@ -352,7 +350,7 @@

The WebKitURIResponse associated with this resource.

-

unstable since: 6.0

+

@@ -363,7 +361,7 @@ See webkit_web_resource_get_uri() for more details.

-

unstable since: 6.0

+

@@ -396,7 +394,7 @@ load operation.

-

unstable since: 6.0

+

@@ -418,7 +416,7 @@ is emitted before this one.

-

unstable since: 6.0

+

@@ -433,7 +431,7 @@ received by the server for the initial request.

-

unstable since: 6.0

+

@@ -449,10 +447,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -478,7 +472,7 @@
- No description available. +

No description available.

@@ -488,7 +482,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WebView.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebView.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WebView.html 2026-04-16 17:54:42.977704300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebView.html 2026-07-09 07:33:43.918098700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -462,7 +462,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -478,7 +478,7 @@
-

unstable since: 6.0

+

@@ -486,7 +486,7 @@ Description - [src] + [src] @@ -509,8 +509,6 @@
-

Available since: 6.0

-
@@ -528,19 +526,19 @@ - - + hierarchy this - -WebKitWebView + +WebKitWebView @@ -548,99 +546,99 @@ implements_0 - -GtkAccessible + +GtkAccessible this--implements_0 - + implements_1 - -GtkBuildable + +GtkBuildable this--implements_1 - + implements_2 - -GtkConstraintTarget + +GtkConstraintTarget this--implements_2 - + ancestor_0 - -WebKitWebViewBase + +WebKitWebViewBase ancestor_0--this - + ancestor_1 - -GtkWidget + +GtkWidget ancestor_1--ancestor_0 - + ancestor_2 - -GInitiallyUnowned + +GInitiallyUnowned ancestor_2--ancestor_1 - + ancestor_3 - -GObject + +GObject ancestor_3--ancestor_2 - + @@ -724,7 +722,7 @@

Creates a new WebKitWebView with the default WebKitWebContext.

-

unstable since: 6.0

+

@@ -774,7 +772,7 @@

Asynchronously check if it is possible to execute the given editing command.

-

unstable since: 6.0

+

@@ -784,7 +782,7 @@

Finish an asynchronous operation started with webkit_web_view_can_execute_editing_command().

-

unstable since: 6.0

+

@@ -794,7 +792,7 @@

Determines whether web_view has a previous history item.

-

unstable since: 6.0

+

@@ -804,7 +802,7 @@

Determines whether web_view has a next history item.

-

unstable since: 6.0

+

@@ -814,7 +812,7 @@

Whether or not a MIME type can be displayed in web_view.

-

unstable since: 6.0

+

@@ -824,7 +822,7 @@

Requests downloading of the specified URI string for web_view.

-

unstable since: 6.0

+

@@ -857,7 +855,7 @@

Request to execute the given command for web_view.

-

unstable since: 6.0

+

@@ -887,7 +885,7 @@

Obtains the WebKitBackForwardList associated with the given WebKitWebView.

-

unstable since: 6.0

+

@@ -917,7 +915,7 @@

Gets the web context of web_view.

-

unstable since: 6.0

+

@@ -927,7 +925,7 @@

Returns the current custom character encoding name of web_view.

-

unstable since: 6.0

+

@@ -967,7 +965,7 @@

Gets the value of the WebKitWebView:estimated-load-progress property.

-

unstable since: 6.0

+

@@ -977,7 +975,7 @@

Returns favicon currently associated to web_view.

-

unstable since: 6.0

+

@@ -987,7 +985,7 @@

Gets the WebKitFindController.

-

unstable since: 6.0

+

@@ -1007,7 +1005,7 @@

Get the WebKitWebInspector associated to web_view.

-

unstable since: 6.0

+

@@ -1037,7 +1035,7 @@

Return the main resource of web_view.

-

unstable since: 6.0

+

@@ -1068,7 +1066,7 @@ the WebKitWebView.

-

unstable since: 6.0

+

@@ -1088,7 +1086,7 @@

Gets the WebKitSettings currently applied to web_view.

-

unstable since: 6.0

+

@@ -1098,7 +1096,7 @@

Asynchronously retrieves a snapshot of web_view for region.

-

unstable since: 6.0

+

@@ -1109,7 +1107,7 @@ an image of the snapshot using the BGRA8888 pixel format.

-

unstable since: 6.0

+

@@ -1131,7 +1129,7 @@

Gets the value of the WebKitWebView:title property.

-

unstable since: 6.0

+

@@ -1141,7 +1139,7 @@

Retrieves the GTlsCertificate associated with the main resource of web_view.

-

unstable since: 6.0

+

@@ -1151,7 +1149,7 @@

Returns the current active URI of web_view.

-

unstable since: 6.0

+

@@ -1191,7 +1189,7 @@

Get the WebKitWindowProperties object.

-

unstable since: 6.0

+

@@ -1201,7 +1199,7 @@

Set the zoom level of web_view.

-

unstable since: 6.0

+

@@ -1211,7 +1209,7 @@

Loads the previous history item.

-

unstable since: 6.0

+

@@ -1221,7 +1219,7 @@

Loads the next history item.

-

unstable since: 6.0

+

@@ -1231,7 +1229,7 @@

Loads the specific history item list_item.

-

unstable since: 6.0

+

@@ -1272,7 +1270,7 @@

Gets the value of the WebKitWebView:is-loading property.

-

unstable since: 6.0

+

@@ -1302,7 +1300,7 @@

Load the given content string for the URI content_uri.

-

unstable since: 6.0

+

@@ -1322,7 +1320,7 @@

Load the given content string with the specified base_uri.

-

unstable since: 6.0

+

@@ -1332,7 +1330,7 @@

Load the specified plain_text string into web_view.

-

unstable since: 6.0

+

@@ -1342,7 +1340,7 @@

Requests loading of the specified WebKitURIRequest.

-

unstable since: 6.0

+

@@ -1352,7 +1350,7 @@

Requests loading of the specified URI string.

-

unstable since: 6.0

+

@@ -1362,7 +1360,7 @@

Reloads the current contents of web_view.

-

unstable since: 6.0

+

@@ -1373,7 +1371,7 @@ using any cached data.

-

unstable since: 6.0

+

@@ -1393,7 +1391,7 @@

Asynchronously save the current web page.

-

unstable since: 6.0

+

@@ -1403,7 +1401,7 @@

Finish an asynchronous operation started with webkit_web_view_save().

-

unstable since: 6.0

+

@@ -1413,7 +1411,7 @@

Asynchronously save the current web page.

-

unstable since: 6.0

+

@@ -1423,7 +1421,7 @@

Finish an asynchronous operation started with webkit_web_view_save_to_file().

-

unstable since: 6.0

+

@@ -1483,7 +1481,7 @@

Sets the current custom character encoding override of web_view.

-

unstable since: 6.0

+

@@ -1543,7 +1541,7 @@

Sets the WebKitSettings to be applied to web_view.

-

unstable since: 6.0

+

@@ -1553,7 +1551,7 @@

Set the zoom level of web_view.

-

unstable since: 6.0

+

@@ -1563,7 +1561,7 @@

Stops any ongoing loading operation in web_view.

-

unstable since: 6.0

+

@@ -1593,7 +1591,7 @@ -
Methods inherited from GtkWidget (162)
+
Methods inherited from GtkWidget (164)
@@ -1621,143 +1619,69 @@ -
Methods inherited from GtkAccessible (19)
+
Methods inherited from GtkAccessible (20)
gtk_accessible_announce

Requests the user’s screen reader to announce the given message.

-
-
-

unstable since: 4.14

-
-
gtk_accessible_get_accessible_parent
+
gtk_accessible_get_accessible_parent

Retrieves the accessible parent for an accessible object.

-
-
-

unstable since: 4.10

-
-
gtk_accessible_get_accessible_role
+
gtk_accessible_get_accessible_role

Retrieves the accessible role of an accessible object.

-
-
-

unstable since: 4.0

-
-
gtk_accessible_get_at_context
+
gtk_accessible_get_at_context
-

Retrieves the accessible implementation for the given GtkAccessible.

-
-
-

unstable since: 4.10

-
-
gtk_accessible_get_bounds
+

Retrieves the implementation for the given accessible object.

+
gtk_accessible_get_bounds

Queries the coordinates and dimensions of this accessible.

-
-
-

unstable since: 4.10

-
-
gtk_accessible_get_first_accessible_child
+
gtk_accessible_get_first_accessible_child

Retrieves the first accessible child of an accessible object.

-
-
-

unstable since: 4.10

-
-
gtk_accessible_get_next_accessible_sibling
+
gtk_accessible_get_next_accessible_sibling

Retrieves the next accessible sibling of an accessible object.

-
-
-

unstable since: 4.10

-
-
gtk_accessible_get_platform_state
-
-

Query a platform state, such as focus.

-
-
-

unstable since: 4.10

-
-
gtk_accessible_reset_property
+
gtk_accessible_get_platform_state
-

Resets the accessible property to its default value.

-
+

Queries a platform state, such as focus.

+
gtk_accessible_reset_property
-

unstable since: 4.0

-
-
gtk_accessible_reset_relation
+

Resets the accessible property to its default value.

+
gtk_accessible_reset_relation
-

Resets the accessible relation to its default value.

-
+

Resets the accessible relation to its default value.

+
gtk_accessible_reset_state
-

unstable since: 4.0

-
-
gtk_accessible_reset_state
-
-

Resets the accessible state to its default value.

-
-
-

unstable since: 4.0

-
-
gtk_accessible_set_accessible_parent
+

Resets the accessible state to its default value.

+
gtk_accessible_set_accessible_parent

Sets the parent and sibling of an accessible object.

-
-
-

unstable since: 4.10

-
-
gtk_accessible_update_next_accessible_sibling
+
gtk_accessible_update_next_accessible_sibling
-

Updates the next accessible sibling of self.

-
+

Updates the next accessible sibling.

+
gtk_accessible_update_platform_state
-

unstable since: 4.10

-
-
gtk_accessible_update_property
+

Informs ATs that the platform state has changed.

+
gtk_accessible_update_property

Updates a list of accessible properties.

-
-
-

unstable since: 4.0

-
-
gtk_accessible_update_property_value
+
gtk_accessible_update_property_value

Updates an array of accessible properties.

-
-
-

unstable since: 4.0

-
-
gtk_accessible_update_relation
+
gtk_accessible_update_relation

Updates a list of accessible relations.

-
-
-

unstable since: 4.0

-
-
gtk_accessible_update_relation_value
+
gtk_accessible_update_relation_value

Updates an array of accessible relations.

-
-
-

unstable since: 4.0

-
-
gtk_accessible_update_state
-
-

Updates a list of accessible states. See the GtkAccessibleState -documentation for the value types of accessible states.

-
+
gtk_accessible_update_state
-

unstable since: 4.0

-
-
gtk_accessible_update_state_value
+

Updates a list of accessible states.

+
gtk_accessible_update_state_value

Updates an array of accessible states.

-
-

unstable since: 4.0

-
- @@ -1769,10 +1693,6 @@

Gets the ID of the buildable object.

-
-

unstable since: 4.0

-
- @@ -1863,7 +1783,7 @@ and child documents.

-

unstable since: 6.0

+

@@ -1874,7 +1794,7 @@ See webkit_web_view_get_favicon() for more details.

-

unstable since: 6.0

+

@@ -1911,7 +1831,7 @@ WebKitWebView::load-changed is emitted with WEBKIT_LOAD_FINISHED.

-

unstable since: 6.0

+

@@ -2020,7 +1940,7 @@ the title has not been received yet, it will be NULL.

-

unstable since: 6.0

+

@@ -2031,7 +1951,7 @@ See webkit_web_view_get_uri() for more details.

-

unstable since: 6.0

+

@@ -2051,7 +1971,7 @@

The WebKitWebContext of the view.

-

unstable since: 6.0

+

@@ -2082,7 +2002,7 @@ See webkit_web_view_set_zoom_level() for more details.

-

unstable since: 6.0

+

@@ -2093,250 +2013,119 @@ -
Properties inherited from GtkWidget (34)
+
Properties inherited from GtkWidget (35)
Gtk.Widget:can-focus

Whether the widget or any of its descendents can accept the input focus.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:can-target
+
Gtk.Widget:can-target

Whether the widget can receive pointer events.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:css-classes
+
Gtk.Widget:css-classes

A list of css classes applied to this widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:css-name
+
Gtk.Widget:css-name

The name of this widget in the CSS tree.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:cursor
+
Gtk.Widget:cursor

The cursor used by widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:focus-on-click
+
Gtk.Widget:focus-on-click

Whether the widget should grab focus when it is clicked with the mouse.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:focusable
+
Gtk.Widget:focusable

Whether this widget itself will accept the input focus.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:halign
+
Gtk.Widget:halign

How to distribute horizontal space if widget gets extra space.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:has-default
+
Gtk.Widget:has-default

Whether the widget is the default widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:has-focus
+
Gtk.Widget:has-focus

Whether the widget has the input focus.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:has-tooltip
-
-

Enables or disables the emission of the ::query-tooltip signal on widget.

-
+
Gtk.Widget:has-tooltip
-

unstable since: 4.0

-
-
Gtk.Widget:height-request
+

Enables or disables the emission of the GtkWidget::query-tooltip +signal on widget.

+
Gtk.Widget:height-request
-

Override for height request of the widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:hexpand
+

Overrides for height request of the widget.

+
Gtk.Widget:hexpand

Whether to expand horizontally.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:hexpand-set
+
Gtk.Widget:hexpand-set

Whether to use the hexpand property.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:layout-manager
+
Gtk.Widget:layout-manager
-

The GtkLayoutManager instance to use to compute the preferred size -of the widget, and allocate its children.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:margin-bottom
+

The GtkLayoutManager instance to use to compute +the preferred size of the widget, and allocate its children.

+
Gtk.Widget:limit-events
+
+

Makes this widget act like a modal dialog, with respect to +event delivery.

+
Gtk.Widget:margin-bottom

Margin on bottom side of widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:margin-end
+
Gtk.Widget:margin-end

Margin on end of widget, horizontally.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:margin-start
+
Gtk.Widget:margin-start

Margin on start of widget, horizontally.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:margin-top
+
Gtk.Widget:margin-top

Margin on top side of widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:name
+
Gtk.Widget:name

The name of the widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:opacity
+
Gtk.Widget:opacity

The requested opacity of the widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:overflow
+
Gtk.Widget:overflow

How content outside the widget’s content area is treated.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:parent
+
Gtk.Widget:parent

The parent widget of this widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:receives-default
+
Gtk.Widget:receives-default

Whether the widget will receive the default action when it is focused.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:root
+
Gtk.Widget:root

The GtkRoot widget of the widget tree containing this widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:scale-factor
+
Gtk.Widget:scale-factor

The scale factor of the widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:sensitive
+
Gtk.Widget:sensitive

Whether the widget responds to input.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:tooltip-markup
+
Gtk.Widget:tooltip-markup

Sets the text of tooltip to be the given string, which is marked up with Pango markup.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:tooltip-text
+
Gtk.Widget:tooltip-text

Sets the text of tooltip to be the given string.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:valign
+
Gtk.Widget:valign

How to distribute vertical space if widget gets extra space.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:vexpand
+
Gtk.Widget:vexpand

Whether to expand vertically.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:vexpand-set
+
Gtk.Widget:vexpand-set

Whether to use the vexpand property.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:visible
+
Gtk.Widget:visible

Whether the widget is visible.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:width-request
+
Gtk.Widget:width-request
-

Override for width request of the widget.

+

Overrides for width request of the widget.

-
-

unstable since: 4.0

-
- @@ -2354,10 +2143,6 @@

The accessible role of the given GtkAccessible implementation.

-
-

unstable since: 4.0

-
- @@ -2408,7 +2193,7 @@ destroy the WebKitWebView, if necessary.

-

unstable since: 6.0

+

@@ -2444,7 +2229,7 @@

-

unstable since: 6.0

+

@@ -2455,7 +2240,7 @@ to notify that the context menu is dismissed.

-

unstable since: 6.0

+

@@ -2467,7 +2252,7 @@ newly created WebKitWebView.

-

unstable since: 6.0

+

@@ -2481,7 +2266,7 @@ specific type when making the decision. For example:

-

unstable since: 6.0

+

@@ -2498,7 +2283,7 @@ full screen window).

-

unstable since: 6.0

+

@@ -2510,7 +2295,7 @@ no longer emitted.

-

unstable deprecated: 2.46 since: 6.0

+

deprecated: 2.46 

@@ -2523,7 +2308,7 @@ WebKitWebView::enter-fullscreen stage for instance.

-

unstable since: 6.0

+

@@ -2544,7 +2329,7 @@ WEBKIT_LOAD_COMMITTED event.

-

unstable since: 6.0

+

@@ -2560,7 +2345,7 @@ WEBKIT_LOAD_FINISHED event right after this one.

-

unstable since: 6.0

+

@@ -2589,7 +2374,7 @@ current element with a new hit_test_result.

-

unstable since: 6.0

+

@@ -2601,7 +2386,7 @@ to switch to fullscreen mode, sharing its location or similar operations.

-

unstable since: 6.0

+

@@ -2616,7 +2401,7 @@ event so that the print dialog is shown.

-

unstable since: 6.0

+

@@ -2643,7 +2428,7 @@ of web_view. See also webkit_web_view_get_window_properties().

-

unstable since: 6.0

+

@@ -2656,7 +2441,7 @@ of resource.

-

unstable since: 6.0

+

@@ -2672,7 +2457,7 @@ WebKitWebView until the new dialog is closed.

-

unstable since: 6.0

+

@@ -2705,7 +2490,7 @@ argument.

-

unstable since: 6.0

+

@@ -2735,7 +2520,7 @@

-

unstable since: 6.0

+

@@ -2776,7 +2561,7 @@ The form will not be submitted until webkit_form_submission_request_submit() is called.

-

unstable since: 6.0

+

@@ -2816,95 +2601,43 @@

Signals that all holders of a reference to the widget should release the reference that they hold.

-
-
-

unstable since: 4.0

-
-
GtkWidget::direction-changed
+
GtkWidget::direction-changed

Emitted when the text direction of a widget changes.

-
-
-

unstable since: 4.0

-
-
GtkWidget::hide
+
GtkWidget::hide

Emitted when widget is hidden.

-
-
-

unstable since: 4.0

-
-
GtkWidget::keynav-failed
+
GtkWidget::keynav-failed

Emitted if keyboard navigation fails.

-
-
-

unstable since: 4.0

-
-
GtkWidget::map
+
GtkWidget::map

Emitted when widget is going to be mapped.

-
-
-

unstable since: 4.0

-
-
GtkWidget::mnemonic-activate
+
GtkWidget::mnemonic-activate

Emitted when a widget is activated via a mnemonic.

-
-
-

unstable since: 4.0

-
-
GtkWidget::move-focus
+
GtkWidget::move-focus

Emitted when the focus is moved.

-
-
-

unstable since: 4.0

-
-
GtkWidget::query-tooltip
+
GtkWidget::query-tooltip

Emitted when the widget’s tooltip is about to be shown.

-
-
-

unstable since: 4.0

-
-
GtkWidget::realize
+
GtkWidget::realize

Emitted when widget is associated with a GdkSurface.

-
-
-

unstable since: 4.0

-
-
GtkWidget::show
+
GtkWidget::show

Emitted when widget is shown.

-
-
-

unstable since: 4.0

-
-
GtkWidget::state-flags-changed
+
GtkWidget::state-flags-changed

Emitted when the widget state changes.

-
-
-

unstable since: 4.0

-
-
GtkWidget::unmap
+
GtkWidget::unmap

Emitted when widget is going to be unmapped.

-
-
-

unstable since: 4.0

-
-
GtkWidget::unrealize
+
GtkWidget::unrealize

Emitted when the GdkSurface associated with widget is destroyed.

-
-

unstable since: 4.0

-
- @@ -2919,10 +2652,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -3161,7 +2890,7 @@
- No description available. +

No description available.

@@ -3171,13 +2900,13 @@
parent: WebKitWebViewBaseClass
-
No description available.
+

No description available.

load_changed: void (* load_changed) ( WebKitWebView* web_view, WebKitLoadEvent load_event )
-
No description available.
+

No description available.

load_failed: gboolean (* load_failed) ( WebKitWebView* web_view, @@ -3185,118 +2914,118 @@ const gchar* failing_uri, GError* error )
-
No description available.
+

No description available.

create: GtkWidget* (* create) ( WebKitWebView* web_view, WebKitNavigationAction* navigation_action )
-
No description available.
+

No description available.

ready_to_show: void (* ready_to_show) ( WebKitWebView* web_view )
-
No description available.
+

No description available.

run_as_modal: void (* run_as_modal) ( WebKitWebView* web_view )
-
No description available.
+

No description available.

close: void (* close) ( WebKitWebView* web_view )
-
No description available.
+

No description available.

script_dialog: gboolean (* script_dialog) ( WebKitWebView* web_view, WebKitScriptDialog* dialog )
-
No description available.
+

No description available.

decide_policy: gboolean (* decide_policy) ( WebKitWebView* web_view, WebKitPolicyDecision* decision, WebKitPolicyDecisionType type )
-
No description available.
+

No description available.

permission_request: gboolean (* permission_request) ( WebKitWebView* web_view, WebKitPermissionRequest* permission_request )
-
No description available.
+

No description available.

mouse_target_changed: void (* mouse_target_changed) ( WebKitWebView* web_view, WebKitHitTestResult* hit_test_result, guint modifiers )
-
No description available.
+

No description available.

print: gboolean (* print) ( WebKitWebView* web_view, WebKitPrintOperation* print_operation )
-
No description available.
+

No description available.

resource_load_started: void (* resource_load_started) ( WebKitWebView* web_view, WebKitWebResource* resource, WebKitURIRequest* request )
-
No description available.
+

No description available.

enter_fullscreen: gboolean (* enter_fullscreen) ( WebKitWebView* web_view )
-
No description available.
+

No description available.

leave_fullscreen: gboolean (* leave_fullscreen) ( WebKitWebView* web_view )
-
No description available.
+

No description available.

run_file_chooser: gboolean (* run_file_chooser) ( WebKitWebView* web_view, WebKitFileChooserRequest* request )
-
No description available.
+

No description available.

context_menu: gboolean (* context_menu) ( WebKitWebView* web_view, WebKitContextMenu* context_menu, WebKitHitTestResult* hit_test_result )
-
No description available.
+

No description available.

context_menu_dismissed: void (* context_menu_dismissed) ( WebKitWebView* web_view )
-
No description available.
+

No description available.

submit_form: void (* submit_form) ( WebKitWebView* web_view, WebKitFormSubmissionRequest* request )
-
No description available.
+

No description available.

insecure_content_detected: void (* insecure_content_detected) ( WebKitWebView* web_view, WebKitInsecureContentEvent event )
-
No description available.
+

No description available.

web_process_crashed: gboolean (* web_process_crashed) ( WebKitWebView* web_view )
-
No description available.
+

No description available.

authenticate: gboolean (* authenticate) ( WebKitWebView* web_view, WebKitAuthenticationRequest* request )
-
No description available.
+

No description available.

load_failed_with_tls_errors: gboolean (* load_failed_with_tls_errors) ( WebKitWebView* web_view, @@ -3304,199 +3033,199 @@ GTlsCertificate* certificate, GTlsCertificateFlags errors )
-
No description available.
+

No description available.

show_notification: gboolean (* show_notification) ( WebKitWebView* web_view, WebKitNotification* notification )
-
No description available.
+

No description available.

run_color_chooser: gboolean (* run_color_chooser) ( WebKitWebView* web_view, WebKitColorChooserRequest* request )
-
No description available.
+

No description available.

show_option_menu: gboolean (* show_option_menu) ( WebKitWebView* web_view, WebKitOptionMenu* menu, GdkRectangle* rectangle )
-
No description available.
+

No description available.

web_process_terminated: void (* web_process_terminated) ( WebKitWebView* web_view, WebKitWebProcessTerminationReason reason )
-
No description available.
+

No description available.

user_message_received: gboolean (* user_message_received) ( WebKitWebView* web_view, WebKitUserMessage* message )
-
No description available.
+

No description available.

query_permission_state: gboolean (* query_permission_state) ( WebKitWebView* web_view, WebKitPermissionStateQuery* query )
-
No description available.
+

No description available.

_webkit_reserved0: void (* _webkit_reserved0) ( void )
-
No description available.
+

No description available.

_webkit_reserved1: void (* _webkit_reserved1) ( void )
-
No description available.
+

No description available.

_webkit_reserved2: void (* _webkit_reserved2) ( void )
-
No description available.
+

No description available.

_webkit_reserved3: void (* _webkit_reserved3) ( void )
-
No description available.
+

No description available.

_webkit_reserved4: void (* _webkit_reserved4) ( void )
-
No description available.
+

No description available.

_webkit_reserved5: void (* _webkit_reserved5) ( void )
-
No description available.
+

No description available.

_webkit_reserved6: void (* _webkit_reserved6) ( void )
-
No description available.
+

No description available.

_webkit_reserved7: void (* _webkit_reserved7) ( void )
-
No description available.
+

No description available.

_webkit_reserved8: void (* _webkit_reserved8) ( void )
-
No description available.
+

No description available.

_webkit_reserved9: void (* _webkit_reserved9) ( void )
-
No description available.
+

No description available.

_webkit_reserved10: void (* _webkit_reserved10) ( void )
-
No description available.
+

No description available.

_webkit_reserved11: void (* _webkit_reserved11) ( void )
-
No description available.
+

No description available.

_webkit_reserved12: void (* _webkit_reserved12) ( void )
-
No description available.
+

No description available.

_webkit_reserved13: void (* _webkit_reserved13) ( void )
-
No description available.
+

No description available.

_webkit_reserved14: void (* _webkit_reserved14) ( void )
-
No description available.
+

No description available.

_webkit_reserved15: void (* _webkit_reserved15) ( void )
-
No description available.
+

No description available.

_webkit_reserved16: void (* _webkit_reserved16) ( void )
-
No description available.
+

No description available.

_webkit_reserved17: void (* _webkit_reserved17) ( void )
-
No description available.
+

No description available.

_webkit_reserved18: void (* _webkit_reserved18) ( void )
-
No description available.
+

No description available.

_webkit_reserved19: void (* _webkit_reserved19) ( void )
-
No description available.
+

No description available.

_webkit_reserved20: void (* _webkit_reserved20) ( void )
-
No description available.
+

No description available.

_webkit_reserved21: void (* _webkit_reserved21) ( void )
-
No description available.
+

No description available.

_webkit_reserved22: void (* _webkit_reserved22) ( void )
-
No description available.
+

No description available.

_webkit_reserved23: void (* _webkit_reserved23) ( void )
-
No description available.
+

No description available.

_webkit_reserved24: void (* _webkit_reserved24) ( void )
-
No description available.
+

No description available.

_webkit_reserved25: void (* _webkit_reserved25) ( void )
-
No description available.
+

No description available.

_webkit_reserved26: void (* _webkit_reserved26) ( void )
-
No description available.
+

No description available.

_webkit_reserved27: void (* _webkit_reserved27) ( void )
-
No description available.
+

No description available.

_webkit_reserved28: void (* _webkit_reserved28) ( void )
-
No description available.
+

No description available.

_webkit_reserved29: void (* _webkit_reserved29) ( void )
-
No description available.
+

No description available.

_webkit_reserved30: void (* _webkit_reserved30) ( void )
-
No description available.
+

No description available.

@@ -3519,7 +3248,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3529,7 +3258,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3539,7 +3268,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3549,7 +3278,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3559,7 +3288,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3569,7 +3298,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3579,7 +3308,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3589,7 +3318,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3599,7 +3328,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3609,7 +3338,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3619,7 +3348,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3629,7 +3358,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3639,7 +3368,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3649,7 +3378,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3659,7 +3388,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3669,7 +3398,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3679,7 +3408,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3689,7 +3418,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3699,7 +3428,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3709,7 +3438,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3719,7 +3448,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3729,7 +3458,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3739,7 +3468,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3749,7 +3478,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3759,7 +3488,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3769,7 +3498,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3779,7 +3508,7 @@ No description available.
-

unstable since: 6.0

+

@@ -3789,7 +3518,7 @@ No description available.
-

unstable since: 6.0

+

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WebViewBase.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebViewBase.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WebViewBase.html 2026-04-16 17:54:44.308706300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebViewBase.html 2026-07-09 07:33:44.408175000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -97,7 +97,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -113,7 +113,7 @@
-

unstable since: 6.0

+

@@ -129,14 +129,12 @@ }
- No description available. +

No description available.

-

Available since: 6.0

-
@@ -154,19 +152,19 @@ - - + hierarchy this - -WebKitWebViewBase + +WebKitWebViewBase @@ -174,85 +172,85 @@ implements_0 - -GtkAccessible + +GtkAccessible this--implements_0 - + implements_1 - -GtkBuildable + +GtkBuildable this--implements_1 - + implements_2 - -GtkConstraintTarget + +GtkConstraintTarget this--implements_2 - + ancestor_0 - -GtkWidget + +GtkWidget ancestor_0--this - + ancestor_1 - -GInitiallyUnowned + +GInitiallyUnowned ancestor_1--ancestor_0 - + ancestor_2 - -GObject + +GObject ancestor_2--ancestor_1 - + @@ -343,7 +341,7 @@ -
Methods inherited from GtkWidget (162)
+
Methods inherited from GtkWidget (164)
@@ -371,143 +369,69 @@ -
Methods inherited from GtkAccessible (19)
+
Methods inherited from GtkAccessible (20)
gtk_accessible_announce

Requests the user’s screen reader to announce the given message.

-
-
-

unstable since: 4.14

-
-
gtk_accessible_get_accessible_parent
+
gtk_accessible_get_accessible_parent

Retrieves the accessible parent for an accessible object.

-
-
-

unstable since: 4.10

-
-
gtk_accessible_get_accessible_role
+
gtk_accessible_get_accessible_role

Retrieves the accessible role of an accessible object.

-
-
-

unstable since: 4.0

-
-
gtk_accessible_get_at_context
+
gtk_accessible_get_at_context
-

Retrieves the accessible implementation for the given GtkAccessible.

-
-
-

unstable since: 4.10

-
-
gtk_accessible_get_bounds
+

Retrieves the implementation for the given accessible object.

+
gtk_accessible_get_bounds

Queries the coordinates and dimensions of this accessible.

-
-
-

unstable since: 4.10

-
-
gtk_accessible_get_first_accessible_child
+
gtk_accessible_get_first_accessible_child

Retrieves the first accessible child of an accessible object.

-
-
-

unstable since: 4.10

-
-
gtk_accessible_get_next_accessible_sibling
+
gtk_accessible_get_next_accessible_sibling

Retrieves the next accessible sibling of an accessible object.

-
-
-

unstable since: 4.10

-
-
gtk_accessible_get_platform_state
-
-

Query a platform state, such as focus.

-
-
-

unstable since: 4.10

-
-
gtk_accessible_reset_property
+
gtk_accessible_get_platform_state
-

Resets the accessible property to its default value.

-
+

Queries a platform state, such as focus.

+
gtk_accessible_reset_property
-

unstable since: 4.0

-
-
gtk_accessible_reset_relation
+

Resets the accessible property to its default value.

+
gtk_accessible_reset_relation
-

Resets the accessible relation to its default value.

-
+

Resets the accessible relation to its default value.

+
gtk_accessible_reset_state
-

unstable since: 4.0

-
-
gtk_accessible_reset_state
-
-

Resets the accessible state to its default value.

-
-
-

unstable since: 4.0

-
-
gtk_accessible_set_accessible_parent
+

Resets the accessible state to its default value.

+
gtk_accessible_set_accessible_parent

Sets the parent and sibling of an accessible object.

-
-
-

unstable since: 4.10

-
-
gtk_accessible_update_next_accessible_sibling
+
gtk_accessible_update_next_accessible_sibling
-

Updates the next accessible sibling of self.

-
+

Updates the next accessible sibling.

+
gtk_accessible_update_platform_state
-

unstable since: 4.10

-
-
gtk_accessible_update_property
+

Informs ATs that the platform state has changed.

+
gtk_accessible_update_property

Updates a list of accessible properties.

-
-
-

unstable since: 4.0

-
-
gtk_accessible_update_property_value
+
gtk_accessible_update_property_value

Updates an array of accessible properties.

-
-
-

unstable since: 4.0

-
-
gtk_accessible_update_relation
+
gtk_accessible_update_relation

Updates a list of accessible relations.

-
-
-

unstable since: 4.0

-
-
gtk_accessible_update_relation_value
+
gtk_accessible_update_relation_value

Updates an array of accessible relations.

-
-
-

unstable since: 4.0

-
-
gtk_accessible_update_state
-
-

Updates a list of accessible states. See the GtkAccessibleState -documentation for the value types of accessible states.

-
+
gtk_accessible_update_state
-

unstable since: 4.0

-
-
gtk_accessible_update_state_value
+

Updates a list of accessible states.

+
gtk_accessible_update_state_value

Updates an array of accessible states.

-
-

unstable since: 4.0

-
- @@ -519,10 +443,6 @@

Gets the ID of the buildable object.

-
-

unstable since: 4.0

-
- @@ -543,250 +463,119 @@ -
Properties inherited from GtkWidget (34)
+
Properties inherited from GtkWidget (35)
Gtk.Widget:can-focus

Whether the widget or any of its descendents can accept the input focus.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:can-target
+
Gtk.Widget:can-target

Whether the widget can receive pointer events.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:css-classes
+
Gtk.Widget:css-classes

A list of css classes applied to this widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:css-name
+
Gtk.Widget:css-name

The name of this widget in the CSS tree.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:cursor
+
Gtk.Widget:cursor

The cursor used by widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:focus-on-click
+
Gtk.Widget:focus-on-click

Whether the widget should grab focus when it is clicked with the mouse.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:focusable
+
Gtk.Widget:focusable

Whether this widget itself will accept the input focus.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:halign
+
Gtk.Widget:halign

How to distribute horizontal space if widget gets extra space.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:has-default
+
Gtk.Widget:has-default

Whether the widget is the default widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:has-focus
+
Gtk.Widget:has-focus

Whether the widget has the input focus.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:has-tooltip
-
-

Enables or disables the emission of the ::query-tooltip signal on widget.

-
+
Gtk.Widget:has-tooltip
-

unstable since: 4.0

-
-
Gtk.Widget:height-request
+

Enables or disables the emission of the GtkWidget::query-tooltip +signal on widget.

+
Gtk.Widget:height-request
-

Override for height request of the widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:hexpand
+

Overrides for height request of the widget.

+
Gtk.Widget:hexpand

Whether to expand horizontally.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:hexpand-set
+
Gtk.Widget:hexpand-set

Whether to use the hexpand property.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:layout-manager
+
Gtk.Widget:layout-manager
-

The GtkLayoutManager instance to use to compute the preferred size -of the widget, and allocate its children.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:margin-bottom
+

The GtkLayoutManager instance to use to compute +the preferred size of the widget, and allocate its children.

+
Gtk.Widget:limit-events
+
+

Makes this widget act like a modal dialog, with respect to +event delivery.

+
Gtk.Widget:margin-bottom

Margin on bottom side of widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:margin-end
+
Gtk.Widget:margin-end

Margin on end of widget, horizontally.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:margin-start
+
Gtk.Widget:margin-start

Margin on start of widget, horizontally.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:margin-top
+
Gtk.Widget:margin-top

Margin on top side of widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:name
+
Gtk.Widget:name

The name of the widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:opacity
+
Gtk.Widget:opacity

The requested opacity of the widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:overflow
+
Gtk.Widget:overflow

How content outside the widget’s content area is treated.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:parent
+
Gtk.Widget:parent

The parent widget of this widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:receives-default
+
Gtk.Widget:receives-default

Whether the widget will receive the default action when it is focused.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:root
+
Gtk.Widget:root

The GtkRoot widget of the widget tree containing this widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:scale-factor
+
Gtk.Widget:scale-factor

The scale factor of the widget.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:sensitive
+
Gtk.Widget:sensitive

Whether the widget responds to input.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:tooltip-markup
+
Gtk.Widget:tooltip-markup

Sets the text of tooltip to be the given string, which is marked up with Pango markup.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:tooltip-text
+
Gtk.Widget:tooltip-text

Sets the text of tooltip to be the given string.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:valign
+
Gtk.Widget:valign

How to distribute vertical space if widget gets extra space.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:vexpand
+
Gtk.Widget:vexpand

Whether to expand vertically.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:vexpand-set
+
Gtk.Widget:vexpand-set

Whether to use the vexpand property.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:visible
+
Gtk.Widget:visible

Whether the widget is visible.

-
-
-

unstable since: 4.0

-
-
Gtk.Widget:width-request
+
Gtk.Widget:width-request
-

Override for width request of the widget.

+

Overrides for width request of the widget.

-
-

unstable since: 4.0

-
- @@ -804,10 +593,6 @@

The accessible role of the given GtkAccessible implementation.

-
-

unstable since: 4.0

-
- @@ -837,95 +622,43 @@

Signals that all holders of a reference to the widget should release the reference that they hold.

-
-
-

unstable since: 4.0

-
-
GtkWidget::direction-changed
+
GtkWidget::direction-changed

Emitted when the text direction of a widget changes.

-
-
-

unstable since: 4.0

-
-
GtkWidget::hide
+
GtkWidget::hide

Emitted when widget is hidden.

-
-
-

unstable since: 4.0

-
-
GtkWidget::keynav-failed
+
GtkWidget::keynav-failed

Emitted if keyboard navigation fails.

-
-
-

unstable since: 4.0

-
-
GtkWidget::map
+
GtkWidget::map

Emitted when widget is going to be mapped.

-
-
-

unstable since: 4.0

-
-
GtkWidget::mnemonic-activate
+
GtkWidget::mnemonic-activate

Emitted when a widget is activated via a mnemonic.

-
-
-

unstable since: 4.0

-
-
GtkWidget::move-focus
+
GtkWidget::move-focus

Emitted when the focus is moved.

-
-
-

unstable since: 4.0

-
-
GtkWidget::query-tooltip
+
GtkWidget::query-tooltip

Emitted when the widget’s tooltip is about to be shown.

-
-
-

unstable since: 4.0

-
-
GtkWidget::realize
+
GtkWidget::realize

Emitted when widget is associated with a GdkSurface.

-
-
-

unstable since: 4.0

-
-
GtkWidget::show
+
GtkWidget::show

Emitted when widget is shown.

-
-
-

unstable since: 4.0

-
-
GtkWidget::state-flags-changed
+
GtkWidget::state-flags-changed

Emitted when the widget state changes.

-
-
-

unstable since: 4.0

-
-
GtkWidget::unmap
+
GtkWidget::unmap

Emitted when widget is going to be unmapped.

-
-
-

unstable since: 4.0

-
-
GtkWidget::unrealize
+
GtkWidget::unrealize

Emitted when the GdkSurface associated with widget is destroyed.

-
-

unstable since: 4.0

-
- @@ -940,10 +673,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -987,7 +716,7 @@
- No description available. +

No description available.

@@ -997,27 +726,27 @@
parentClass: GtkWidgetClass
-
No description available.
+

No description available.

_webkit_reserved0: void (* _webkit_reserved0) ( void )
-
No description available.
+

No description available.

_webkit_reserved1: void (* _webkit_reserved1) ( void )
-
No description available.
+

No description available.

_webkit_reserved2: void (* _webkit_reserved2) ( void )
-
No description available.
+

No description available.

_webkit_reserved3: void (* _webkit_reserved3) ( void )
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WebsiteDataAccessPermissionRequest.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebsiteDataAccessPermissionRequest.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WebsiteDataAccessPermissionRequest.html 2026-04-16 17:54:42.458703500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebsiteDataAccessPermissionRequest.html 2026-07-09 07:33:43.713681500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,7 +171,7 @@ - this - -WebKitWebsiteDataAccessPermissionRequest + +WebKitWebsiteDataAccessPermissionRequest @@ -191,29 +191,29 @@ implements_0 - -WebKitPermissionRequest + +WebKitPermissionRequest this--implements_0 - + ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -320,16 +320,16 @@

Allow the action which triggered this request.

-

unstable since: 6.0

+

- +
webkit_permission_request_deny

Deny the action which triggered this request.

-

unstable since: 6.0

+

- + @@ -357,10 +357,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -388,7 +384,7 @@
- No description available. +

No description available.

@@ -398,7 +394,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WebsiteDataManager.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebsiteDataManager.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WebsiteDataManager.html 2026-04-16 17:54:42.525703700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebsiteDataManager.html 2026-07-09 07:33:43.743936000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -149,7 +149,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -218,19 +218,19 @@ - - + hierarchy this - -WebKitWebsiteDataManager + +WebKitWebsiteDataManager @@ -238,15 +238,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -554,10 +554,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -583,7 +579,7 @@
- No description available. +

No description available.

@@ -593,7 +589,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WebsitePolicies.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebsitePolicies.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WebsitePolicies.html 2026-04-16 17:54:42.727704000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WebsitePolicies.html 2026-07-09 07:33:43.826929000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -126,7 +126,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@ - this - -WebKitWebsitePolicies + +WebKitWebsitePolicies @@ -207,15 +207,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -371,10 +371,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -400,7 +396,7 @@
- No description available. +

No description available.

@@ -410,7 +406,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WindowProperties.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WindowProperties.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.WindowProperties.html 2026-04-16 17:54:44.364706300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.WindowProperties.html 2026-07-09 07:33:44.434200300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -143,7 +143,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -159,7 +159,7 @@
-

unstable since: 6.0

+

@@ -232,8 +232,6 @@
-

Available since: 6.0

-
@@ -251,7 +249,7 @@ - this - -WebKitWindowProperties + +WebKitWindowProperties @@ -271,15 +269,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -330,7 +328,7 @@

Get whether the window should be shown in fullscreen state or not.

-

unstable since: 6.0

+

@@ -340,7 +338,7 @@

Get the geometry the window should have on the screen when shown.

-

unstable since: 6.0

+

@@ -350,7 +348,7 @@

Get whether the window should have the locationbar visible or not.

-

unstable since: 6.0

+

@@ -360,7 +358,7 @@

Get whether the window should have the menubar visible or not.

-

unstable since: 6.0

+

@@ -370,7 +368,7 @@

Get whether the window should be resizable by the user or not.

-

unstable since: 6.0

+

@@ -380,7 +378,7 @@

Get whether the window should have the scrollbars visible or not.

-

unstable since: 6.0

+

@@ -390,7 +388,7 @@

Get whether the window should have the statusbar visible or not.

-

unstable since: 6.0

+

@@ -400,7 +398,7 @@

Get whether the window should have the toolbar visible or not.

-

unstable since: 6.0

+

@@ -440,7 +438,7 @@

Whether window will be displayed fullscreen.

-

unstable since: 6.0

+

@@ -450,7 +448,7 @@

The size and position of the window on the screen.

-

unstable since: 6.0

+

@@ -460,7 +458,7 @@

Whether the locationbar should be visible for the window.

-

unstable since: 6.0

+

@@ -470,7 +468,7 @@

Whether the menubar should be visible for the window.

-

unstable since: 6.0

+

@@ -480,7 +478,7 @@

Whether the window can be resized.

-

unstable since: 6.0

+

@@ -490,7 +488,7 @@

Whether the scrollbars should be visible for the window.

-

unstable since: 6.0

+

@@ -500,7 +498,7 @@

Whether the statusbar should be visible for the window.

-

unstable since: 6.0

+

@@ -510,7 +508,7 @@

Whether the toolbar should be visible for the window.

-

unstable since: 6.0

+

@@ -544,10 +542,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -573,7 +567,7 @@
- No description available. +

No description available.

@@ -583,7 +577,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.XRPermissionRequest.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.XRPermissionRequest.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/class.XRPermissionRequest.html 2026-04-16 17:54:44.495706600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/class.XRPermissionRequest.html 2026-07-09 07:33:44.488252900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -120,7 +120,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,19 +185,19 @@ - - + hierarchy this - -WebKitXRPermissionRequest + +WebKitXRPermissionRequest @@ -205,29 +205,29 @@ implements_0 - -WebKitPermissionRequest + +WebKitPermissionRequest this--implements_0 - + ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -396,16 +396,16 @@

Allow the action which triggered this request.

-

unstable since: 6.0

+

- +
webkit_permission_request_deny

Deny the action which triggered this request.

-

unstable since: 6.0

+

- + @@ -433,10 +433,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -464,7 +460,7 @@
- No description available. +

No description available.

@@ -474,7 +470,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/classes_hierarchy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/classes_hierarchy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/classes_hierarchy.html 2026-04-16 17:54:30.933687400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/classes_hierarchy.html 2026-07-09 07:33:39.509881300 +0000 @@ -62,13 +62,13 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_COPY.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_COPY.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_COPY.html 2026-04-16 17:54:31.578688400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_COPY.html 2026-07-09 07:33:39.635522000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -74,7 +74,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -89,7 +89,7 @@
-

unstable since: 6.0

+

@@ -125,8 +125,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_CREATE_LINK.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_CREATE_LINK.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_CREATE_LINK.html 2026-04-16 17:54:31.808688900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_CREATE_LINK.html 2026-07-09 07:33:39.671521000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -74,7 +74,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -89,7 +89,7 @@
-

unstable since: 6.0

+

@@ -124,8 +124,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_CUT.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_CUT.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_CUT.html 2026-04-16 17:54:31.997689000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_CUT.html 2026-07-09 07:33:40.027513700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -74,7 +74,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -89,7 +89,7 @@
-

unstable since: 6.0

+

@@ -125,8 +125,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_INSERT_IMAGE.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_INSERT_IMAGE.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_INSERT_IMAGE.html 2026-04-16 17:54:32.117689100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_INSERT_IMAGE.html 2026-07-09 07:33:40.103512000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -74,7 +74,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -89,7 +89,7 @@
-

unstable since: 6.0

+

@@ -122,8 +122,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_PASTE.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_PASTE.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_PASTE.html 2026-04-16 17:54:32.330689400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_PASTE.html 2026-07-09 07:33:40.179510600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -74,7 +74,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -89,7 +89,7 @@
-

unstable since: 6.0

+

@@ -125,8 +125,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_PASTE_AS_PLAIN_TEXT.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_PASTE_AS_PLAIN_TEXT.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_PASTE_AS_PLAIN_TEXT.html 2026-04-16 17:54:32.409689700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_PASTE_AS_PLAIN_TEXT.html 2026-07-09 07:33:40.223509600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -74,7 +74,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -89,7 +89,7 @@
-

unstable since: 6.0

+

@@ -125,8 +125,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_REDO.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_REDO.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_REDO.html 2026-04-16 17:54:32.545689800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_REDO.html 2026-07-09 07:33:40.286920000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -74,7 +74,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -89,7 +89,7 @@
-

unstable since: 6.0

+

@@ -124,8 +124,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_SELECT_ALL.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_SELECT_ALL.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_SELECT_ALL.html 2026-04-16 17:54:32.634690000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_SELECT_ALL.html 2026-07-09 07:33:40.292792300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -74,7 +74,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -89,7 +89,7 @@
-

unstable since: 6.0

+

@@ -124,8 +124,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_UNDO.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_UNDO.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_UNDO.html 2026-04-16 17:54:32.821690000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.EDITING_COMMAND_UNDO.html 2026-07-09 07:33:40.304074000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -74,7 +74,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -89,7 +89,7 @@
-

unstable since: 6.0

+

@@ -123,8 +123,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.MAJOR_VERSION.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.MAJOR_VERSION.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.MAJOR_VERSION.html 2026-04-16 17:54:32.961690400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.MAJOR_VERSION.html 2026-07-09 07:33:40.323797500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -74,7 +74,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -89,7 +89,7 @@
-

unstable since: 6.0

+

@@ -122,8 +122,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.MICRO_VERSION.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.MICRO_VERSION.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.MICRO_VERSION.html 2026-04-16 17:54:33.040690400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.MICRO_VERSION.html 2026-07-09 07:33:40.351068300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -74,7 +74,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -89,7 +89,7 @@
-

unstable since: 6.0

+

@@ -100,7 +100,7 @@
-
#define WEBKIT_MICRO_VERSION 3
+        
#define WEBKIT_MICRO_VERSION 5
 
@@ -122,8 +122,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.MINOR_VERSION.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.MINOR_VERSION.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/const.MINOR_VERSION.html 2026-04-16 17:54:33.153115700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/const.MINOR_VERSION.html 2026-07-09 07:33:40.386144900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -74,7 +74,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -89,7 +89,7 @@
-

unstable since: 6.0

+

@@ -122,8 +122,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/contributing.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/contributing.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/contributing.html 2026-04-16 17:54:30.843410300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/contributing.html 2026-07-09 07:33:39.467313000 +0000 @@ -62,13 +62,13 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.ApplicationInfo.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ApplicationInfo.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.ApplicationInfo.new.html 2026-04-16 17:54:32.392689700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ApplicationInfo.new.html 2026-07-09 07:33:40.031513700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -80,7 +80,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@

Type: WebKitApplicationInfo

-

The newly created WebKitApplicationInfo.

+

The newly created WebKitApplicationInfo.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.ContextMenu.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenu.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.ContextMenu.new.html 2026-04-16 17:54:35.480693800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenu.new.html 2026-07-09 07:33:41.095467300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -163,7 +163,7 @@

Type: WebKitContextMenu

-

The newly created WebKitContextMenu object.

+

The newly created WebKitContextMenu object.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.ContextMenu.new_with_items.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenu.new_with_items.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.ContextMenu.new_with_items.html 2026-04-16 17:54:35.499693900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenu.new_with_items.html 2026-07-09 07:33:41.121418200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -159,7 +159,7 @@
items

Type: A list of None

-

A GList of WebKitContextMenuItem.

+

A GList of WebKitContextMenuItem.

@@ -191,7 +191,7 @@

Type: WebKitContextMenu

-

The newly created WebKitContextMenu object.

+

The newly created WebKitContextMenu object.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_from_gaction.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_from_gaction.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_from_gaction.html 2026-04-16 17:54:35.926694400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_from_gaction.html 2026-07-09 07:33:41.278290300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -166,7 +166,7 @@
action

Type: GAction

-

A GAction.

+

A GAction.

@@ -183,7 +183,7 @@
label

Type: const gchar*

-

The menu item label text.

+

The menu item label text.

@@ -200,7 +200,7 @@
target

Type: GVariant

-

A GVariant to use as the action target.

+

A GVariant to use as the action target.

@@ -232,7 +232,7 @@

Type: WebKitContextMenuItem

-

The newly created WebKitContextMenuItem object.

+

The newly created WebKitContextMenuItem object.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_from_stock_action.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_from_stock_action.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_from_stock_action.html 2026-04-16 17:54:35.942694400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_from_stock_action.html 2026-07-09 07:33:41.282384600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -170,7 +170,7 @@
action

Type: WebKitContextMenuAction

-

A WebKitContextMenuAction stock action.

+

A WebKitContextMenuAction stock action.

@@ -202,7 +202,7 @@

Type: WebKitContextMenuItem

-

The newly created WebKitContextMenuItem object.

+

The newly created WebKitContextMenuItem object.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_from_stock_action_with_label.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_from_stock_action_with_label.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_from_stock_action_with_label.html 2026-04-16 17:54:35.957694500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_from_stock_action_with_label.html 2026-07-09 07:33:41.287561700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@
action

Type: WebKitContextMenuAction

-

A WebKitContextMenuAction stock action.

+

A WebKitContextMenuAction stock action.

@@ -182,7 +182,7 @@
label

Type: const gchar*

-

A custom label text to use instead of the predefined one.

+

A custom label text to use instead of the predefined one.

@@ -214,7 +214,7 @@

Type: WebKitContextMenuItem

-

The newly created WebKitContextMenuItem object.

+

The newly created WebKitContextMenuItem object.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_separator.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_separator.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_separator.html 2026-04-16 17:54:35.969694600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_separator.html 2026-07-09 07:33:41.294723700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -162,7 +162,7 @@

Type: WebKitContextMenuItem

-

The newly created WebKitContextMenuItem object.

+

The newly created WebKitContextMenuItem object.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_with_submenu.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_with_submenu.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_with_submenu.html 2026-04-16 17:54:36.214695000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.ContextMenuItem.new_with_submenu.html 2026-07-09 07:33:41.301347000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -163,7 +163,7 @@
label

Type: const gchar*

-

The menu item label text.

+

The menu item label text.

@@ -180,7 +180,7 @@
submenu

Type: WebKitContextMenu

-

A WebKitContextMenu to set.

+

A WebKitContextMenu to set.

@@ -212,7 +212,7 @@

Type: WebKitContextMenuItem

-

The newly created WebKitContextMenuItem object.

+

The newly created WebKitContextMenuItem object.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.Credential.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.Credential.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.Credential.new.html 2026-04-16 17:54:33.386690900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.Credential.new.html 2026-07-09 07:33:40.290683000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -80,7 +80,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -156,7 +156,7 @@
username

Type: const gchar*

-

The username for the new credential.

+

The username for the new credential.

@@ -173,7 +173,7 @@
password

Type: const gchar*

-

The password for the new credential.

+

The password for the new credential.

@@ -190,7 +190,7 @@
persistence

Type: WebKitCredentialPersistence

-

The WebKitCredentialPersistence of the new credential.

+

The WebKitCredentialPersistence of the new credential.

@@ -222,7 +222,7 @@

Type: WebKitCredential

-

A WebKitCredential.

+

A WebKitCredential.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.Credential.new_for_certificate.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.Credential.new_for_certificate.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.Credential.new_for_certificate.html 2026-04-16 17:54:33.498691000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.Credential.new_for_certificate.html 2026-07-09 07:33:40.311092600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -80,7 +80,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -156,7 +156,7 @@
certificate

Type: GTlsCertificate

-

The GTlsCertificate, or NULL.

+

The GTlsCertificate, or NULL.

@@ -173,7 +173,7 @@
persistence

Type: WebKitCredentialPersistence

-

The WebKitCredentialPersistence of the new credential.

+

The WebKitCredentialPersistence of the new credential.

The argument can be NULL.
@@ -205,7 +205,7 @@

Type: WebKitCredential

-

A WebKitCredential.

+

A WebKitCredential.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.Credential.new_for_certificate_pin.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.Credential.new_for_certificate_pin.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.Credential.new_for_certificate_pin.html 2026-04-16 17:54:33.700099500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.Credential.new_for_certificate_pin.html 2026-07-09 07:33:40.344221000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -80,7 +80,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -156,7 +156,7 @@
pin

Type: const gchar*

-

The PIN for the new credential.

+

The PIN for the new credential.

@@ -173,7 +173,7 @@
persistence

Type: WebKitCredentialPersistence

-

The WebKitCredentialPersistence of the new credential.

+

The WebKitCredentialPersistence of the new credential.

@@ -205,7 +205,7 @@

Type: WebKitCredential

-

A WebKitCredential.

+

A WebKitCredential.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.GeolocationPosition.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.GeolocationPosition.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.GeolocationPosition.new.html 2026-04-16 17:54:34.523692600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.GeolocationPosition.new.html 2026-07-09 07:33:40.665562200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -80,7 +80,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -156,7 +156,7 @@
latitude

Type: double

-

A valid latitude in degrees.

+

A valid latitude in degrees.

@@ -173,7 +173,7 @@
longitude

Type: double

-

A valid longitude in degrees.

+

A valid longitude in degrees.

@@ -190,7 +190,7 @@
accuracy

Type: double

-

Accuracy of location in meters.

+

Accuracy of location in meters.

@@ -222,7 +222,7 @@

Type: WebKitGeolocationPosition

-

A newly created WebKitGeolocationPosition.

+

A newly created WebKitGeolocationPosition.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.InputMethodUnderline.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.InputMethodUnderline.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.InputMethodUnderline.new.html 2026-04-16 17:54:34.613692800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.InputMethodUnderline.new.html 2026-07-09 07:33:40.732577600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -80,7 +80,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -155,7 +155,7 @@
start_offset

Type: guint

-

The start offset in preedit string.

+

The start offset in preedit string.

@@ -172,7 +172,7 @@
end_offset

Type: guint

-

The end offset in preedit string.

+

The end offset in preedit string.

@@ -204,7 +204,7 @@

Type: WebKitInputMethodUnderline

-

A newly created WebKitInputMethodUnderline.

+

A newly created WebKitInputMethodUnderline.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.MemoryPressureSettings.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.MemoryPressureSettings.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.MemoryPressureSettings.new.html 2026-04-16 17:54:34.802693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.MemoryPressureSettings.new.html 2026-07-09 07:33:40.850422900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -80,7 +80,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@

Type: WebKitMemoryPressureSettings

-

A new WebKitMemoryPressureSettings instance filled with the default values.

+

A new WebKitMemoryPressureSettings instance filled with the default values.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.NetworkProxySettings.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.NetworkProxySettings.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.NetworkProxySettings.new.html 2026-04-16 17:54:35.113693500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.NetworkProxySettings.new.html 2026-07-09 07:33:40.957857600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -80,7 +80,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
default_proxy_uri

Type: const gchar*

-

The default proxy URI to use, or NULL.

+

The default proxy URI to use, or NULL.

@@ -199,7 +199,7 @@
ignore_hosts

Type: An array of gchar*

-

An optional list of hosts/IP addresses to not use a proxy for.

+

An optional list of hosts/IP addresses to not use a proxy for.

The argument can be NULL.
@@ -231,7 +231,7 @@

Type: WebKitNetworkProxySettings

-

A new WebKitNetworkProxySettings.

+

A new WebKitNetworkProxySettings.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.NetworkSession.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.NetworkSession.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.NetworkSession.new.html 2026-04-16 17:54:38.261697800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.NetworkSession.new.html 2026-07-09 07:33:42.149870600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -164,7 +164,7 @@
data_directory

Type: const char*

-

A base directory for data, or NULL.

+

A base directory for data, or NULL.

@@ -181,7 +181,7 @@
cache_directory

Type: const char*

-

A base directory for caches, or NULL.

+

A base directory for caches, or NULL.

The argument can be NULL.
@@ -213,7 +213,7 @@

Type: WebKitNetworkSession

-

The newly created WebKitNetworkSession.

+

The newly created WebKitNetworkSession.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.NetworkSession.new_ephemeral.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.NetworkSession.new_ephemeral.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.NetworkSession.new_ephemeral.html 2026-04-16 17:54:38.266697600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.NetworkSession.new_ephemeral.html 2026-07-09 07:33:42.152027800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -156,7 +156,7 @@

Type: WebKitNetworkSession

-

A new ephemeral WebKitNetworkSession.

+

A new ephemeral WebKitNetworkSession.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.PrintOperation.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.PrintOperation.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.PrintOperation.new.html 2026-04-16 17:54:38.854698700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.PrintOperation.new.html 2026-07-09 07:33:42.382067400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@
web_view

Type: WebKitWebView

-

A WebKitWebView.

+

A WebKitWebView.

@@ -186,7 +186,7 @@

Type: WebKitPrintOperation

-

A new WebKitPrintOperation.

+

A new WebKitPrintOperation.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.SecurityOrigin.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.SecurityOrigin.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.SecurityOrigin.new.html 2026-04-16 17:54:35.445693700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.SecurityOrigin.new.html 2026-07-09 07:33:41.209051100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -80,7 +80,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -156,7 +156,7 @@
protocol

Type: const gchar*

-

The protocol for the new origin.

+

The protocol for the new origin.

@@ -173,7 +173,7 @@
host

Type: const gchar*

-

The host for the new origin.

+

The host for the new origin.

@@ -190,8 +190,8 @@
port

Type: guint16

-

The port number for the new origin, or 0 to indicate the - default port for protocol.

+

The port number for the new origin, or 0 to indicate the + default port for protocol.

@@ -223,7 +223,7 @@

Type: WebKitSecurityOrigin

-

A WebKitSecurityOrigin.

+

A WebKitSecurityOrigin.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.SecurityOrigin.new_for_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.SecurityOrigin.new_for_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.SecurityOrigin.new_for_uri.html 2026-04-16 17:54:35.452694000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.SecurityOrigin.new_for_uri.html 2026-07-09 07:33:41.221520400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -80,7 +80,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -157,7 +157,7 @@
uri

Type: const gchar*

-

The URI for the new origin.

+

The URI for the new origin.

@@ -189,7 +189,7 @@

Type: WebKitSecurityOrigin

-

A WebKitSecurityOrigin.

+

A WebKitSecurityOrigin.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.Settings.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.Settings.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.Settings.new.html 2026-04-16 17:54:39.326699300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.Settings.new.html 2026-07-09 07:33:42.560793900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -158,7 +158,7 @@

Type: WebKitSettings

-

A new WebKitSettings instance.

+

A new WebKitSettings instance.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.Settings.new_with_settings.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.Settings.new_with_settings.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.Settings.new_with_settings.html 2026-04-16 17:54:39.335699300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.Settings.new_with_settings.html 2026-07-09 07:33:42.564718700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -158,7 +158,7 @@
first_setting_name

Type: const gchar*

-

Name of first setting to set.

+

Name of first setting to set.

@@ -175,8 +175,8 @@
...

Type: 

-

Value of first setting, followed by more settings, - NULL-terminated.

+

Value of first setting, followed by more settings, + NULL-terminated.

@@ -208,7 +208,7 @@

Type: WebKitSettings

-

A new WebKitSettings instance.

+

A new WebKitSettings instance.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.URIRequest.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.URIRequest.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.URIRequest.new.html 2026-04-16 17:54:40.582701000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.URIRequest.new.html 2026-07-09 07:33:43.005220000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@
uri

Type: const gchar*

-

An URI.

+

An URI.

@@ -186,7 +186,7 @@

Type: WebKitURIRequest

-

A new WebKitURIRequest.

+

A new WebKitURIRequest.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.URISchemeResponse.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.URISchemeResponse.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.URISchemeResponse.new.html 2026-04-16 17:54:40.917701500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.URISchemeResponse.new.html 2026-07-09 07:33:43.127531800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -155,7 +155,7 @@
input_stream

Type: GInputStream

-

A GInputStream to read the contents of the request.

+

A GInputStream to read the contents of the request.

@@ -172,7 +172,7 @@
stream_length

Type: gint64

-

The length of the stream or -1 if not known.

+

The length of the stream or -1 if not known.

@@ -204,7 +204,7 @@

Type: WebKitURISchemeResponse

-

The newly created WebKitURISchemeResponse.

+

The newly created WebKitURISchemeResponse.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.UserContentFilterStore.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserContentFilterStore.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.UserContentFilterStore.new.html 2026-04-16 17:54:41.009701500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserContentFilterStore.new.html 2026-07-09 07:33:43.164054900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -155,7 +155,7 @@
storage_path

Type: const gchar*

-

Path where data for filters will be stored on disk.

+

Path where data for filters will be stored on disk.

@@ -187,7 +187,7 @@

Type: WebKitUserContentFilterStore

-

A newly created WebKitUserContentFilterStore.

+

A newly created WebKitUserContentFilterStore.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.UserContentManager.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserContentManager.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.UserContentManager.new.html 2026-04-16 17:54:41.189701800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserContentManager.new.html 2026-07-09 07:33:43.234030000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@

Type: WebKitUserContentManager

-

A WebKitUserContentManager.

+

A WebKitUserContentManager.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.UserMessage.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserMessage.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.UserMessage.new.html 2026-04-16 17:54:41.428702000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserMessage.new.html 2026-07-09 07:33:43.325452000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -157,7 +157,7 @@
name

Type: const char*

-

The message name.

+

The message name.

@@ -174,7 +174,7 @@
parameters

Type: GVariant

-

The message parameters as a GVariant, or NULL.

+

The message parameters as a GVariant, or NULL.

@@ -206,7 +206,7 @@

Type: WebKitUserMessage

-

The newly created WebKitUserMessage object.

+

The newly created WebKitUserMessage object.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.UserMessage.new_with_fd_list.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserMessage.new_with_fd_list.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.UserMessage.new_with_fd_list.html 2026-04-16 17:54:41.438702000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserMessage.new_with_fd_list.html 2026-07-09 07:33:43.329643700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -158,7 +158,7 @@
name

Type: const char*

-

The message name.

+

The message name.

@@ -175,7 +175,7 @@
parameters

Type: GVariant

-

The message parameters as a GVariant.

+

The message parameters as a GVariant.

@@ -192,7 +192,7 @@
fd_list

Type: GUnixFDList

-

The message file descriptors.

+

The message file descriptors.

The argument can be NULL.
@@ -224,7 +224,7 @@

Type: WebKitUserMessage

-

The newly created WebKitUserMessage object.

+

The newly created WebKitUserMessage object.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.UserScript.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserScript.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.UserScript.new.html 2026-04-16 17:54:35.648694000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserScript.new.html 2026-07-09 07:33:41.339486600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -80,7 +80,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@
source

Type: const gchar*

-

Source code of the user script.

+

Source code of the user script.

@@ -182,7 +182,7 @@
injected_frames

Type: WebKitUserContentInjectedFrames

-

A WebKitUserContentInjectedFrames value.

+

A WebKitUserContentInjectedFrames value.

@@ -199,7 +199,7 @@
injection_time

Type: WebKitUserScriptInjectionTime

-

A WebKitUserScriptInjectionTime value.

+

A WebKitUserScriptInjectionTime value.

@@ -216,7 +216,7 @@
allow_list

Type: An array of gchar*

-

An allow_list of URI patterns or NULL.

+

An allow_list of URI patterns or NULL.

@@ -233,7 +233,7 @@
block_list

Type: An array of gchar*

-

A block_list of URI patterns or NULL.

+

A block_list of URI patterns or NULL.

The argument can be NULL.
@@ -265,7 +265,7 @@

Type: WebKitUserScript

-

A new WebKitUserScript.

+

A new WebKitUserScript.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.UserScript.new_for_world.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserScript.new_for_world.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.UserScript.new_for_world.html 2026-04-16 17:54:35.681694300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserScript.new_for_world.html 2026-07-09 07:33:41.352415000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -80,7 +80,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -160,7 +160,7 @@
source

Type: const gchar*

-

Source code of the user script.

+

Source code of the user script.

@@ -177,7 +177,7 @@
injected_frames

Type: WebKitUserContentInjectedFrames

-

A WebKitUserContentInjectedFrames value.

+

A WebKitUserContentInjectedFrames value.

@@ -194,7 +194,7 @@
injection_time

Type: WebKitUserScriptInjectionTime

-

A WebKitUserScriptInjectionTime value.

+

A WebKitUserScriptInjectionTime value.

@@ -211,7 +211,7 @@
world_name

Type: const gchar*

-

The name of a WebKitScriptWorld.

+

The name of a WebKitScriptWorld.

@@ -228,7 +228,7 @@
allow_list

Type: An array of gchar*

-

An allow_list of URI patterns or NULL.

+

An allow_list of URI patterns or NULL.

@@ -245,7 +245,7 @@
block_list

Type: An array of gchar*

-

A block_list of URI patterns or NULL.

+

A block_list of URI patterns or NULL.

The argument can be NULL.
@@ -277,7 +277,7 @@

Type: WebKitUserScript

-

A new WebKitUserScript.

+

A new WebKitUserScript.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.UserStyleSheet.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserStyleSheet.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.UserStyleSheet.new.html 2026-04-16 17:54:35.763694300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserStyleSheet.new.html 2026-07-09 07:33:41.366505100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -80,7 +80,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@
source

Type: const gchar*

-

Source code of the user style sheet.

+

Source code of the user style sheet.

@@ -182,7 +182,7 @@
injected_frames

Type: WebKitUserContentInjectedFrames

-

A WebKitUserContentInjectedFrames value.

+

A WebKitUserContentInjectedFrames value.

@@ -199,7 +199,7 @@
level

Type: WebKitUserStyleLevel

-

A WebKitUserStyleLevel.

+

A WebKitUserStyleLevel.

@@ -216,7 +216,7 @@
allow_list

Type: An array of gchar*

-

An allow_list of URI patterns or NULL.

+

An allow_list of URI patterns or NULL.

@@ -233,7 +233,7 @@
block_list

Type: An array of gchar*

-

A block_list of URI patterns or NULL.

+

A block_list of URI patterns or NULL.

The argument can be NULL.
@@ -265,7 +265,7 @@

Type: WebKitUserStyleSheet

-

A new WebKitUserStyleSheet.

+

A new WebKitUserStyleSheet.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.UserStyleSheet.new_for_world.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserStyleSheet.new_for_world.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.UserStyleSheet.new_for_world.html 2026-04-16 17:54:35.799694300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.UserStyleSheet.new_for_world.html 2026-07-09 07:33:41.373285800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -80,7 +80,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -161,7 +161,7 @@
source

Type: const gchar*

-

Source code of the user style sheet.

+

Source code of the user style sheet.

@@ -178,7 +178,7 @@
injected_frames

Type: WebKitUserContentInjectedFrames

-

A WebKitUserContentInjectedFrames value.

+

A WebKitUserContentInjectedFrames value.

@@ -195,7 +195,7 @@
level

Type: WebKitUserStyleLevel

-

A WebKitUserStyleLevel.

+

A WebKitUserStyleLevel.

@@ -212,7 +212,7 @@
world_name

Type: const gchar*

-

The name of a WebKitScriptWorld.

+

The name of a WebKitScriptWorld.

@@ -229,7 +229,7 @@
allow_list

Type: An array of gchar*

-

An allow_list of URI patterns or NULL.

+

An allow_list of URI patterns or NULL.

@@ -246,7 +246,7 @@
block_list

Type: An array of gchar*

-

A block_list of URI patterns or NULL.

+

A block_list of URI patterns or NULL.

The argument can be NULL.
@@ -278,7 +278,7 @@

Type: WebKitUserStyleSheet

-

A new WebKitUserStyleSheet.

+

A new WebKitUserStyleSheet.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebContext.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebContext.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebContext.new.html 2026-04-16 17:54:41.549702400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebContext.new.html 2026-07-09 07:33:43.372567700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@

Type: WebKitWebContext

-

A newly created WebKitWebContext.

+

A newly created WebKitWebContext.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebExtension.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebExtension.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebExtension.new.html 2026-04-16 17:54:41.838702700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebExtension.new.html 2026-07-09 07:33:43.485228300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -156,7 +156,7 @@
extension_path

Type: const char*

-

A string pointing to the folder containing the extension manifest and resources.

+

A string pointing to the folder containing the extension manifest and resources.

@@ -200,7 +200,7 @@

Type: WebKitWebExtension

-

The new WebKitWebExtension, or NULL if the extension failed to be created.

+

The new WebKitWebExtension, or NULL if the extension failed to be created.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_all_hosts_and_schemes.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_all_hosts_and_schemes.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_all_hosts_and_schemes.html 2026-04-16 17:54:35.862694500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_all_hosts_and_schemes.html 2026-07-09 07:33:41.386782600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -158,7 +158,7 @@

Type: WebKitWebExtensionMatchPattern

-

A newly created WebKitWebExtensionMatchPattern.

+

A newly created WebKitWebExtensionMatchPattern.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_all_urls.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_all_urls.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_all_urls.html 2026-04-16 17:54:35.867694400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_all_urls.html 2026-07-09 07:33:41.388847800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -158,7 +158,7 @@

Type: WebKitWebExtensionMatchPattern

-

A newly created WebKitWebExtensionMatchPattern.

+

A newly created WebKitWebExtensionMatchPattern.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_with_scheme.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_with_scheme.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_with_scheme.html 2026-04-16 17:54:35.878694500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_with_scheme.html 2026-07-09 07:33:41.393651000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -161,7 +161,7 @@
scheme

Type: const gchar*

-

A pattern URL scheme.

+

A pattern URL scheme.

@@ -178,7 +178,7 @@
host

Type: const gchar*

-

A pattern URL host.

+

A pattern URL host.

@@ -195,7 +195,7 @@
path

Type: const gchar*

-

A pattern URL path.

+

A pattern URL path.

@@ -239,8 +239,8 @@

Type: WebKitWebExtensionMatchPattern

-

A newly created WebKitWebExtensionMatchPattern, or NULL -if any of the pattern strings are invalid.

+

A newly created WebKitWebExtensionMatchPattern, or NULL +if any of the pattern strings are invalid.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_with_string.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_with_string.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_with_string.html 2026-04-16 17:54:35.885694500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebExtensionMatchPattern.new_with_string.html 2026-07-09 07:33:41.396999100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -159,7 +159,7 @@
string

Type: const gchar*

-

A pattern string.

+

A pattern string.

@@ -203,8 +203,8 @@

Type: WebKitWebExtensionMatchPattern

-

A newly created WebKitWebExtensionMatchPattern, or NULL -if the pattern string is invalid.

+

A newly created WebKitWebExtensionMatchPattern, or NULL +if the pattern string is invalid.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebView.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebView.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebView.new.html 2026-04-16 17:54:42.983704300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebView.new.html 2026-07-09 07:33:43.920694600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -158,7 +158,7 @@

Type: GtkWidget

-

The newly created WebKitWebView widget.

+

The newly created WebKitWebView widget.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebViewSessionState.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebViewSessionState.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebViewSessionState.new.html 2026-04-16 17:54:36.484695200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebViewSessionState.new.html 2026-07-09 07:33:41.457504300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -80,7 +80,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@
data

Type: GBytes

-

A GBytes.

+

A GBytes.

@@ -186,8 +186,8 @@

Type: WebKitWebViewSessionState

-

A new WebKitWebViewSessionState, or NULL if data doesn’t contain a - valid serialized WebKitWebViewSessionState.

+

A new WebKitWebViewSessionState, or NULL if data doesn’t contain a + valid serialized WebKitWebViewSessionState.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebsitePolicies.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebsitePolicies.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebsitePolicies.new.html 2026-04-16 17:54:42.732704000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebsitePolicies.new.html 2026-07-09 07:33:43.829062000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -156,7 +156,7 @@

Type: WebKitWebsitePolicies

-

The newly created WebKitWebsitePolicies.

+

The newly created WebKitWebsitePolicies.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebsitePolicies.new_with_policies.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebsitePolicies.new_with_policies.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/ctor.WebsitePolicies.new_with_policies.html 2026-04-16 17:54:42.743704000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/ctor.WebsitePolicies.new_with_policies.html 2026-07-09 07:33:43.833563000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -158,7 +158,7 @@
first_policy_name

Type: const gchar*

-

Name of the first policy to set.

+

Name of the first policy to set.

@@ -175,7 +175,7 @@
...

Type: 

-

Value of first policy, followed by more policies, NULL-terminated.

+

Value of first policy, followed by more policies, NULL-terminated.

@@ -207,7 +207,7 @@

Type: WebKitWebsitePolicies

-

The newly created WebKitWebsitePolicies

+

The newly created WebKitWebsitePolicies

WebKitWebsitePolicies *default_website_policies = webkit_website_policies_new_with_policies(
     "autoplay", WEBKIT_AUTOPLAY_DENY,
     NULL);
@@ -222,7 +222,7 @@
     NULL));
 
 // ...
-

+
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.AuthenticationScheme.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.AuthenticationScheme.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.AuthenticationScheme.html 2026-04-16 17:54:32.504689700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.AuthenticationScheme.html 2026-07-09 07:33:39.971515000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.AutomationBrowsingContextPresentation.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.AutomationBrowsingContextPresentation.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.AutomationBrowsingContextPresentation.html 2026-04-16 17:54:32.568689800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.AutomationBrowsingContextPresentation.html 2026-07-09 07:33:40.047513200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.AutoplayPolicy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.AutoplayPolicy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.AutoplayPolicy.html 2026-04-16 17:54:32.621689800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.AutoplayPolicy.html 2026-07-09 07:33:40.063513000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.CacheModel.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.CacheModel.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.CacheModel.html 2026-04-16 17:54:32.830690100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.CacheModel.html 2026-07-09 07:33:40.103512000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -123,8 +123,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.ContextMenuAction.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.ContextMenuAction.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.ContextMenuAction.html 2026-04-16 17:54:33.208690600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.ContextMenuAction.html 2026-07-09 07:33:40.186305500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -124,8 +124,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.CookieAcceptPolicy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.CookieAcceptPolicy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.CookieAcceptPolicy.html 2026-04-16 17:54:33.356691000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.CookieAcceptPolicy.html 2026-07-09 07:33:40.211510000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -123,8 +123,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.CookiePersistentStorage.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.CookiePersistentStorage.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.CookiePersistentStorage.html 2026-04-16 17:54:33.387691000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.CookiePersistentStorage.html 2026-07-09 07:33:40.223509600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -123,8 +123,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.CredentialPersistence.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.CredentialPersistence.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.CredentialPersistence.html 2026-04-16 17:54:33.483691200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.CredentialPersistence.html 2026-07-09 07:33:40.250423700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.FeatureStatus.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.FeatureStatus.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.FeatureStatus.html 2026-04-16 17:54:33.599691200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.FeatureStatus.html 2026-07-09 07:33:40.290683000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.HardwareAccelerationPolicy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.HardwareAccelerationPolicy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.HardwareAccelerationPolicy.html 2026-04-16 17:54:33.690691500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.HardwareAccelerationPolicy.html 2026-07-09 07:33:40.344221000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.InputPurpose.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.InputPurpose.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.InputPurpose.html 2026-04-16 17:54:33.774691600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.InputPurpose.html 2026-07-09 07:33:40.364870000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.InsecureContentEvent.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.InsecureContentEvent.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.InsecureContentEvent.html 2026-04-16 17:54:33.818691500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.InsecureContentEvent.html 2026-07-09 07:33:40.374225000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable deprecated: 2.46 since: 6.0

+

deprecated: 2.46 

@@ -125,8 +125,6 @@
-

Available since: 6.0

-

Deprecated since: 2.46

Please do not use it in newly written code.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.LoadEvent.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.LoadEvent.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.LoadEvent.html 2026-04-16 17:54:33.865691700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.LoadEvent.html 2026-07-09 07:33:40.380580700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -124,8 +124,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.MediaCaptureState.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.MediaCaptureState.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.MediaCaptureState.html 2026-04-16 17:54:33.920691700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.MediaCaptureState.html 2026-07-09 07:33:40.391159500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.NavigationType.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.NavigationType.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.NavigationType.html 2026-04-16 17:54:33.970691700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.NavigationType.html 2026-07-09 07:33:40.405047000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -123,8 +123,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.NetworkProxyMode.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.NetworkProxyMode.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.NetworkProxyMode.html 2026-04-16 17:54:34.001691800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.NetworkProxyMode.html 2026-07-09 07:33:40.416002000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.PermissionState.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.PermissionState.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.PermissionState.html 2026-04-16 17:54:34.020691900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.PermissionState.html 2026-07-09 07:33:40.423505500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.PolicyDecisionType.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.PolicyDecisionType.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.PolicyDecisionType.html 2026-04-16 17:54:34.082692000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.PolicyDecisionType.html 2026-07-09 07:33:40.450685000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -124,8 +124,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.PrintOperationResponse.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.PrintOperationResponse.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.PrintOperationResponse.html 2026-04-16 17:54:34.122692000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.PrintOperationResponse.html 2026-07-09 07:33:40.463504600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -123,8 +123,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.SaveMode.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.SaveMode.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.SaveMode.html 2026-04-16 17:54:34.155692000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.SaveMode.html 2026-07-09 07:33:40.483504300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -124,8 +124,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.ScriptDialogType.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.ScriptDialogType.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.ScriptDialogType.html 2026-04-16 17:54:34.195692000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.ScriptDialogType.html 2026-07-09 07:33:40.503085000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -123,8 +123,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.SnapshotRegion.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.SnapshotRegion.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.SnapshotRegion.html 2026-04-16 17:54:34.242692200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.SnapshotRegion.html 2026-07-09 07:33:40.515830500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -124,8 +124,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.TLSErrorsPolicy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.TLSErrorsPolicy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.TLSErrorsPolicy.html 2026-04-16 17:54:34.272692200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.TLSErrorsPolicy.html 2026-07-09 07:33:40.530560000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -123,8 +123,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.UserContentInjectedFrames.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.UserContentInjectedFrames.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.UserContentInjectedFrames.html 2026-04-16 17:54:34.290692300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.UserContentInjectedFrames.html 2026-07-09 07:33:40.541815800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.UserScriptInjectionTime.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.UserScriptInjectionTime.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.UserScriptInjectionTime.html 2026-04-16 17:54:34.301692200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.UserScriptInjectionTime.html 2026-07-09 07:33:40.564858400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.UserStyleLevel.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.UserStyleLevel.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.UserStyleLevel.html 2026-04-16 17:54:34.323692300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.UserStyleLevel.html 2026-07-09 07:33:40.567502500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.WebExtensionMode.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.WebExtensionMode.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.WebExtensionMode.html 2026-04-16 17:54:34.340692300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.WebExtensionMode.html 2026-07-09 07:33:40.579502300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.WebProcessTerminationReason.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.WebProcessTerminationReason.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.WebProcessTerminationReason.html 2026-04-16 17:54:34.369692300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.WebProcessTerminationReason.html 2026-07-09 07:33:40.598949000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.XRSessionMode.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.XRSessionMode.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/enum.XRSessionMode.html 2026-04-16 17:54:34.412692300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/enum.XRSessionMode.html 2026-07-09 07:33:40.617892300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/environment-variables.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/environment-variables.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/environment-variables.html 2026-04-16 17:54:30.859591500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/environment-variables.html 2026-07-09 07:33:39.474259900 +0000 @@ -62,13 +62,13 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.DownloadError.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.DownloadError.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.DownloadError.html 2026-04-16 17:54:32.301689400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.DownloadError.html 2026-07-09 07:33:39.687422000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -101,7 +101,7 @@
-

unstable since: 6.0

+

@@ -132,8 +132,6 @@
-

Available since: 6.0

-
@@ -200,7 +198,7 @@

Gets the quark for the domain of download errors.

-

unstable since: 6.0

+

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.FaviconDatabaseError.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.FaviconDatabaseError.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.FaviconDatabaseError.html 2026-04-16 17:54:32.632690000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.FaviconDatabaseError.html 2026-07-09 07:33:40.043513300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -101,7 +101,7 @@
-

unstable since: 6.0

+

@@ -132,8 +132,6 @@
-

Available since: 6.0

-
@@ -200,7 +198,7 @@

Gets the quark for the domain of favicon database errors.

-

unstable since: 6.0

+

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.JavascriptError.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.JavascriptError.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.JavascriptError.html 2026-04-16 17:54:32.799690200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.JavascriptError.html 2026-07-09 07:33:40.160405400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -101,7 +101,7 @@
-

unstable since: 6.0

+

@@ -132,8 +132,6 @@
-

Available since: 6.0

-
@@ -200,7 +198,7 @@

Gets the quark for the domain of JavaScript errors.

-

unstable since: 6.0

+

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.MediaError.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.MediaError.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.MediaError.html 2026-04-16 17:54:33.163690600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.MediaError.html 2026-07-09 07:33:40.363469800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.NetworkError.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.NetworkError.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.NetworkError.html 2026-04-16 17:54:33.342691000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.NetworkError.html 2026-07-09 07:33:40.397462600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -101,7 +101,7 @@
-

unstable since: 6.0

+

@@ -132,8 +132,6 @@
-

Available since: 6.0

-
@@ -220,7 +218,7 @@

Gets the quark for the domain of networking errors.

-

unstable since: 6.0

+

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.PolicyError.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.PolicyError.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.PolicyError.html 2026-04-16 17:54:33.431691000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.PolicyError.html 2026-07-09 07:33:40.427505500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -101,7 +101,7 @@
-

unstable since: 6.0

+

@@ -132,8 +132,6 @@
-

Available since: 6.0

-
@@ -220,7 +218,7 @@

Gets the quark for the domain of policy errors.

-

unstable since: 6.0

+

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.PrintError.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.PrintError.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.PrintError.html 2026-04-16 17:54:33.577691300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.PrintError.html 2026-07-09 07:33:40.467504500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -101,7 +101,7 @@
-

unstable since: 6.0

+

@@ -132,8 +132,6 @@
-

Available since: 6.0

-
@@ -200,7 +198,7 @@

Gets the quark for the domain of printing errors.

-

unstable since: 6.0

+

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.SnapshotError.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.SnapshotError.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.SnapshotError.html 2026-04-16 17:54:33.734691400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.SnapshotError.html 2026-07-09 07:33:40.489650200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -101,7 +101,7 @@
-

unstable since: 6.0

+

@@ -132,8 +132,6 @@
-

Available since: 6.0

-
@@ -180,7 +178,7 @@

Gets the quark for the domain of page snapshot errors.

-

unstable since: 6.0

+

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.UserContentFilterError.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.UserContentFilterError.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.UserContentFilterError.html 2026-04-16 17:54:33.817691600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.UserContentFilterError.html 2026-07-09 07:33:40.503085000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -190,7 +190,7 @@

Gets the quark for the domain of user content filter errors.

-

unstable since: 6.0

+

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.UserMessageError.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.UserMessageError.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.UserMessageError.html 2026-04-16 17:54:33.914691700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.UserMessageError.html 2026-07-09 07:33:40.523503300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -180,7 +180,7 @@

Gets the quark for the domain of user message errors.

-

unstable since: 6.0

+

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.WebExtensionError.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.WebExtensionError.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.WebExtensionError.html 2026-04-16 17:54:33.972691800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.WebExtensionError.html 2026-07-09 07:33:40.567213300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.WebExtensionMatchPatternError.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.WebExtensionMatchPatternError.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/error.WebExtensionMatchPatternError.html 2026-04-16 17:54:34.064692000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/error.WebExtensionMatchPatternError.html 2026-07-09 07:33:40.617892300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/flags.EditorTypingAttributes.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.EditorTypingAttributes.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/flags.EditorTypingAttributes.html 2026-04-16 17:54:32.069689000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.EditorTypingAttributes.html 2026-07-09 07:33:39.971515000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/flags.FindOptions.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.FindOptions.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/flags.FindOptions.html 2026-04-16 17:54:32.346689500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.FindOptions.html 2026-07-09 07:33:39.991889000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -123,8 +123,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/flags.HitTestResultContext.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.HitTestResultContext.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/flags.HitTestResultContext.html 2026-04-16 17:54:32.501689700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.HitTestResultContext.html 2026-07-09 07:33:40.031513700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -123,8 +123,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/flags.InputHints.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.InputHints.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/flags.InputHints.html 2026-04-16 17:54:32.567690000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.InputHints.html 2026-07-09 07:33:40.215510000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/flags.SnapshotOptions.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.SnapshotOptions.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/flags.SnapshotOptions.html 2026-04-16 17:54:32.608689800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.SnapshotOptions.html 2026-07-09 07:33:40.223509600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -124,8 +124,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/flags.WebExtensionMatchPatternOptions.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.WebExtensionMatchPatternOptions.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/flags.WebExtensionMatchPatternOptions.html 2026-04-16 17:54:32.862690200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.WebExtensionMatchPatternOptions.html 2026-07-09 07:33:40.230407200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/flags.WebsiteDataTypes.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.WebsiteDataTypes.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/flags.WebsiteDataTypes.html 2026-04-16 17:54:33.042690500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.WebsiteDataTypes.html 2026-07-09 07:33:40.241834200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/flags.XRSessionFeatures.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.XRSessionFeatures.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/flags.XRSessionFeatures.html 2026-04-16 17:54:33.145690700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/flags.XRSessionFeatures.html 2026-07-09 07:33:40.339720000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/fonts.css webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/fonts.css --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/fonts.css 2026-04-16 17:54:44.633010600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/fonts.css 2026-07-09 07:33:44.536218000 +0000 @@ -3,3 +3,179 @@ * * SPDX-License-Identifier: Apache-2.0 OR GPL-3.0-or-later */ + +/** + * RedHat Fonts taken from https://github.com/RedHatOfficial/RedHatFont + * License: SIL Open Font License 1.1 http://scripts.sil.org/OFL + * + * SourceCodePro Fonts + * License: SIL Open Font License 1.1 https://scripts.sil.org/OFL + */ + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-Regular.woff2") format("woff2"), + url("RedHatDisplay-Regular.woff") format("woff"); + font-style: normal; + font-weight: 400; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-RegularItalic.woff2") format("woff2"), + url("RedHatDisplay-RegularItalic.woff") format("woff"); + font-style: italic; + font-weight: 400; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-Medium.woff2") format("woff2"), + url("RedHatDisplay-Medium.woff") format("woff"); + font-style: normal; + font-weight: 500; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-MediumItalic.woff2") format("woff2"), + url("RedHatDisplay-MediumItalic.woff") format("woff"); + font-style: italic; + font-weight: 500; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-Bold.woff2") format("woff2"), + url("RedHatDisplay-Bold.woff") format("woff"); + font-style: normal; + font-weight: 700; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-BoldItalic.woff2") format("woff2"), + url("RedHatDisplay-BoldItalic.woff") format("woff"); + font-style: italic; + font-weight: 700; + font-display: fallback; +} + + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-Black.woff2") format("woff2"), + url("RedHatDisplay-Black.woff") format("woff"); + font-style: normal; + font-weight: 900; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-BlackItalic.woff2") format("woff2"), + url("RedHatDisplay-BlackItalic.woff") format("woff"); + font-style: italic; + font-weight: 900; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatTextWeb'), + url("RedHatText-Regular.woff2") format("woff2"), + url("RedHatText-Regular.woff") format("woff"); + font-style: normal; + font-weight: 400; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatTextWeb'), + url("RedHatText-Italic.woff2") format("woff2"), + url("RedHatText-Italic.woff") format("woff"); + font-style: italic; + font-weight: 400; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatTextWeb'), + url("RedHatText-Medium.woff2") format("woff2"), + url("RedHatText-Medium.woff") format("woff"); + font-style: normal; + font-weight: 700; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatTextWeb'), + url("RedHatText-MediumItalic.woff2") format("woff2"), + url("RedHatText-MediumItalic.woff") format("woff"); + font-style: italic; + font-weight: 700; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatTextWeb'), + url("RedHatText-Bold.woff2") format("woff2"), + url("RedHatText-Bold.woff") format("woff"); + font-style: normal; + font-weight: 900; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatTextWeb'), + url("RedHatText-BoldItalic.woff2") format("woff2"), + url("RedHatText-BoldItalic.woff") format("woff"); + font-style: italic; + font-weight: 900; + font-display: fallback; +} + +/* Do not fall back to locally installed SourceCodePro, as there are + * known bad copies being distributed to this day + */ +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: url("SourceCodePro-Regular.ttf.woff") format('woff'); + font-display: swap; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: italic; + font-weight: 400; + src: url("SourceCodePro-It.ttf.woff") format('woff'); + font-display: swap; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: url("SourceCodePro-Semibold.ttf.woff") format('woff'); + font-display: swap; +} diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.CHECK_VERSION.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.CHECK_VERSION.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.CHECK_VERSION.html 2026-04-16 17:54:32.095689300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.CHECK_VERSION.html 2026-07-09 07:33:39.635341000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -128,7 +128,7 @@
-

Available since: 6.0

+

This function is not directly available to language bindings.

@@ -151,7 +151,7 @@
major

Type: -

-

Major version (e.g. 1 for version 1.2.5)

+

Major version (e.g. 1 for version 1.2.5)

@@ -168,7 +168,7 @@
minor

Type: -

-

Minor version (e.g. 2 for version 1.2.5)

+

Minor version (e.g. 2 for version 1.2.5)

@@ -185,7 +185,7 @@
micro

Type: -

-

Micro version (e.g. 5 for version 1.2.5)

+

Micro version (e.g. 5 for version 1.2.5)

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.DECLARE_DERIVABLE_TYPE.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.DECLARE_DERIVABLE_TYPE.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.DECLARE_DERIVABLE_TYPE.html 2026-04-16 17:54:32.346689500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.DECLARE_DERIVABLE_TYPE.html 2026-07-09 07:33:39.699520600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -123,12 +123,12 @@

- No description available. +

No description available.

-

Available since: 6.0

+

This function is not directly available to language bindings.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.DECLARE_FINAL_TYPE.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.DECLARE_FINAL_TYPE.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.DECLARE_FINAL_TYPE.html 2026-04-16 17:54:32.503689800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.DECLARE_FINAL_TYPE.html 2026-07-09 07:33:39.955515100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -123,12 +123,12 @@

- No description available. +

No description available.

-

Available since: 6.0

+

This function is not directly available to language bindings.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.DECLARE_TYPE.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.DECLARE_TYPE.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.DECLARE_TYPE.html 2026-04-16 17:54:32.610689900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.DECLARE_TYPE.html 2026-07-09 07:33:40.003514300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -123,12 +123,12 @@

- No description available. +

No description available.

-

Available since: 6.0

+

This function is not directly available to language bindings.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.DEPRECATED_FOR.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.DEPRECATED_FOR.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.DEPRECATED_FOR.html 2026-04-16 17:54:32.725690100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.DEPRECATED_FOR.html 2026-07-09 07:33:40.039513300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -126,7 +126,7 @@
-

Available since: 6.0

+

This function is not directly available to language bindings.

@@ -149,7 +149,7 @@
f

Type: -

-

Replacement symbol name.

+

Replacement symbol name.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.get_major_version.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.get_major_version.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.get_major_version.html 2026-04-16 17:54:32.037689200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.get_major_version.html 2026-07-09 07:33:39.635522000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -132,7 +132,7 @@
-

Available since: 6.0

+ @@ -155,7 +155,7 @@

Type: guint

-

The major version number of the WebKit library.

+

The major version number of the WebKit library.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.get_micro_version.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.get_micro_version.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.get_micro_version.html 2026-04-16 17:54:32.230689300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.get_micro_version.html 2026-07-09 07:33:39.659521300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -132,7 +132,7 @@
-

Available since: 6.0

+ @@ -155,7 +155,7 @@

Type: guint

-

The micro version number of the WebKit library.

+

The micro version number of the WebKit library.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.get_minor_version.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.get_minor_version.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.get_minor_version.html 2026-04-16 17:54:32.457689800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.get_minor_version.html 2026-07-09 07:33:39.723520000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -91,7 +91,7 @@
-

unstable since: 6.0

+

@@ -132,7 +132,7 @@
-

Available since: 6.0

+ @@ -155,7 +155,7 @@

Type: guint

-

The minor version number of the WebKit library.

+

The minor version number of the WebKit library.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.media_key_system_permission_get_name.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.media_key_system_permission_get_name.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.media_key_system_permission_get_name.html 2026-04-16 17:54:32.555689800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.media_key_system_permission_get_name.html 2026-07-09 07:33:39.747519500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -150,7 +150,7 @@
request

Type: WebKitMediaKeySystemPermissionRequest

-

A WebKitMediaKeySystemPermissionRequest.

+

A WebKitMediaKeySystemPermissionRequest.

@@ -182,7 +182,7 @@

Type: const gchar*

-

The key system name for request.

+

The key system name for request.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.uri_for_display.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.uri_for_display.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.uri_for_display.html 2026-04-16 17:54:32.720690000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.uri_for_display.html 2026-07-09 07:33:39.999514300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -155,7 +155,7 @@
uri

Type: const gchar*

-

The URI to be converted.

+

The URI to be converted.

@@ -187,8 +187,8 @@

Type: gchar*

-

uri suitable for display, or NULL in - case of error.

+

uri suitable for display, or NULL in + case of error.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.user_media_permission_is_for_audio_device.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.user_media_permission_is_for_audio_device.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.user_media_permission_is_for_audio_device.html 2026-04-16 17:54:32.807690100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.user_media_permission_is_for_audio_device.html 2026-07-09 07:33:40.047513200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -150,7 +150,7 @@
request

Type: WebKitUserMediaPermissionRequest

-

A WebKitUserMediaPermissionRequest.

+

A WebKitUserMediaPermissionRequest.

@@ -182,7 +182,7 @@

Type: gboolean

-

TRUE if access to an audio device was requested.

+

TRUE if access to an audio device was requested.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.user_media_permission_is_for_display_device.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.user_media_permission_is_for_display_device.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.user_media_permission_is_for_display_device.html 2026-04-16 17:54:33.030690400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.user_media_permission_is_for_display_device.html 2026-07-09 07:33:40.111512000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -150,7 +150,7 @@
request

Type: WebKitUserMediaPermissionRequest

-

A WebKitUserMediaPermissionRequest.

+

A WebKitUserMediaPermissionRequest.

@@ -182,7 +182,7 @@

Type: gboolean

-

TRUE if access to a display device was requested.

+

TRUE if access to a display device was requested.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.user_media_permission_is_for_video_device.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.user_media_permission_is_for_video_device.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/func.user_media_permission_is_for_video_device.html 2026-04-16 17:54:33.215690900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/func.user_media_permission_is_for_video_device.html 2026-07-09 07:33:40.175510600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -150,7 +150,7 @@
request

Type: WebKitUserMediaPermissionRequest

-

A WebKitUserMediaPermissionRequest.

+

A WebKitUserMediaPermissionRequest.

@@ -182,7 +182,7 @@

Type: gboolean

-

TRUE if access to a video device was requested.

+

TRUE if access to a video device was requested.

Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/go-up-symbolic.png and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/go-up-symbolic.png differ diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/iface.PermissionRequest.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/iface.PermissionRequest.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/iface.PermissionRequest.html 2026-04-16 17:54:33.733691500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/iface.PermissionRequest.html 2026-07-09 07:33:40.368446000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -132,7 +132,7 @@
-

unstable since: 6.0

+

@@ -158,8 +158,6 @@
-

Available since: 6.0

-
@@ -222,7 +220,7 @@

Allow the action which triggered this request.

-

unstable since: 6.0

+

@@ -232,7 +230,7 @@

Deny the action which triggered this request.

-

unstable since: 6.0

+

@@ -267,7 +265,7 @@
- No description available. +

No description available.

@@ -281,7 +279,7 @@
- + @@ -291,7 +289,7 @@ ) - + @@ -301,7 +299,7 @@ ) - +
GTypeInterface
 No description available. 

No description available.

 No description available. 

No description available.

 No description available. 

No description available.

@@ -327,7 +325,7 @@

Allow the action which triggered this request.

-

unstable since: 6.0

+

@@ -337,7 +335,7 @@

Deny the action which triggered this request.

-

unstable since: 6.0

+

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/index.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/index.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/index.html 2026-04-16 17:54:44.600706600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/index.html 2026-07-09 07:33:44.525858400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -155,7 +155,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -173,7 +173,7 @@
- + @@ -336,7 +336,7 @@ @@ -356,7 +356,7 @@ @@ -366,7 +366,7 @@ @@ -386,7 +386,7 @@ @@ -396,7 +396,7 @@ @@ -406,7 +406,7 @@ @@ -416,7 +416,7 @@ @@ -436,7 +436,7 @@ @@ -456,7 +456,7 @@ @@ -466,7 +466,7 @@ @@ -476,7 +476,7 @@ @@ -486,7 +486,7 @@ @@ -506,7 +506,7 @@ @@ -516,7 +516,7 @@ @@ -536,7 +536,7 @@ @@ -546,7 +546,7 @@ @@ -606,7 +606,7 @@ @@ -616,7 +616,7 @@ @@ -626,7 +626,7 @@ @@ -636,7 +636,7 @@ @@ -646,7 +646,7 @@ @@ -656,7 +656,7 @@ @@ -666,7 +666,7 @@ @@ -676,7 +676,7 @@ @@ -686,7 +686,7 @@ @@ -736,7 +736,7 @@ @@ -756,7 +756,7 @@ @@ -766,7 +766,7 @@ @@ -806,7 +806,7 @@ @@ -816,7 +816,7 @@ @@ -826,7 +826,7 @@ @@ -865,7 +865,7 @@ @@ -893,7 +893,7 @@ @@ -983,7 +983,7 @@ @@ -1015,7 +1015,7 @@

This query represents a user’s choice to allow or deny access to “powerful features” of the platform, as specified in the Permissions W3C Specification.

-

unstable since: 6.0

+

@@ -1025,7 +1025,7 @@ @@ -1167,7 +1167,7 @@ @@ -1178,7 +1178,7 @@ @@ -1188,7 +1188,7 @@ @@ -1198,7 +1198,7 @@ @@ -1250,7 +1250,7 @@

Enum values previously used to denote the different events which can trigger the detection of insecure content. Since 2.46, WebKit generally no longer loads insecure content in secure contexts.

-

unstable deprecated: 2.46 since: 6.0

+

deprecated: 2.46 

@@ -1261,7 +1261,7 @@ @@ -1281,7 +1281,7 @@ @@ -1312,7 +1312,7 @@ @@ -1322,7 +1322,7 @@ @@ -1333,7 +1333,7 @@ @@ -1343,7 +1343,7 @@ @@ -1354,7 +1354,7 @@ @@ -1364,7 +1364,7 @@ @@ -1462,7 +1462,7 @@ @@ -1472,7 +1472,7 @@ @@ -1493,7 +1493,7 @@ @@ -1551,7 +1551,7 @@ @@ -1561,7 +1561,7 @@ @@ -1571,7 +1571,7 @@ @@ -1591,7 +1591,7 @@ @@ -1601,7 +1601,7 @@ @@ -1611,7 +1611,7 @@ @@ -1621,7 +1621,7 @@ @@ -1690,7 +1690,7 @@ @@ -1718,7 +1718,7 @@ @@ -1728,7 +1728,7 @@ @@ -1738,7 +1738,7 @@ @@ -1816,7 +1816,7 @@ @@ -1826,7 +1826,7 @@ @@ -1836,7 +1836,7 @@ @@ -1846,7 +1846,7 @@ @@ -1856,7 +1856,7 @@ @@ -1889,7 +1889,7 @@ webkit_web_view_can_execute_editing_command(). In general it’s possible to copy to the clipboard when there is an active selection inside the WebKitWebView.

-

unstable since: 6.0

+

@@ -1903,7 +1903,7 @@ will be used as the link text, otherwise the URL itself will be used. It receives the link URL as argument. This command should be executed with webkit_web_view_execute_editing_command_with_argument()

-

unstable since: 6.0

+

@@ -1918,7 +1918,7 @@ webkit_web_view_can_execute_editing_command(). In general it’s possible to cut to the clipboard when the WebKitWebView content is editable and there is an active selection.

-

unstable since: 6.0

+

@@ -1930,7 +1930,7 @@

The insert image command. Creates an image element that is inserted at the current cursor position. It receives an URI as argument, that is used as the image source. This command should be executed with webkit_web_view_execute_editing_command_with_argument().

-

unstable since: 6.0

+

@@ -1945,7 +1945,7 @@ webkit_web_view_can_execute_editing_command(). In general it’s possible to paste from the clipboard when the WebKitWebView content is editable and clipboard is not empty.

-

unstable since: 6.0

+

@@ -1960,7 +1960,7 @@ webkit_web_view_can_execute_editing_command(). In general it’s possible to paste from the clipboard when the WebKitWebView content is editable and clipboard is not empty.

-

unstable since: 6.0

+

@@ -1974,7 +1974,7 @@ You can check whether it’s possible to execute the command with webkit_web_view_can_execute_editing_command(). It’s only possible to redo a command when it has been previously undone.

-

unstable since: 6.0

+

@@ -1988,7 +1988,7 @@ It is always possible to select all text, no matter whether the WebKitWebView content is editable or not. You can still check it with webkit_web_view_can_execute_editing_command().

-

unstable since: 6.0

+

@@ -2001,7 +2001,7 @@ You can check whether it’s possible to execute the command with webkit_web_view_can_execute_editing_command(). It’s only possible to undo a command after a previously executed editing operation.

-

unstable since: 6.0

+

@@ -2013,7 +2013,7 @@

Like webkit_get_major_version(), but from the headers used at application compile time, rather than from the library linked against at application run time.

-

unstable since: 6.0

+

@@ -2025,7 +2025,7 @@

Like webkit_get_micro_version(), but from the headers used at application compile time, rather than from the library linked against at application run time.

-

unstable since: 6.0

+

@@ -2037,7 +2037,7 @@

Like webkit_get_minor_version(), but from the headers used at application compile time, rather than from the library linked against at application run time.

-

unstable since: 6.0

+

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/index.json webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/index.json --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/index.json 2026-04-16 17:54:44.628224000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/index.json 2026-07-09 07:33:44.533950000 +0000 @@ -1 +1 @@ -{"meta":{"ns":"WebKit","version":"6.0","generator":"gi-docgen","generator-version":"2023.3"},"symbols":[{"type":"bitfield","name":"EditorTypingAttributes","ctype":"WebKitEditorTypingAttributes","summary":"Enum values with flags representing typing attributes.","deprecated":null},{"type":"bitfield","name":"FindOptions","ctype":"WebKitFindOptions","summary":"Enum values used to specify search options.","deprecated":null},{"type":"bitfield","name":"HitTestResultContext","ctype":"WebKitHitTestResultContext","summary":"Enum values with flags representing the context of a #WebKitHitTestResult.","deprecated":null},{"type":"bitfield","name":"InputHints","ctype":"WebKitInputHints","summary":"Enum values used to describe hints that might be taken into account by input methods.","deprecated":null},{"type":"bitfield","name":"SnapshotOptions","ctype":"WebKitSnapshotOptions","summary":"Enum values used to specify options when taking a snapshot from a #WebKitWebView.","deprecated":null},{"type":"bitfield","name":"WebExtensionMatchPatternOptions","ctype":"WebKitWebExtensionMatchPatternOptions","summary":"Enum values representing matching options.","deprecated":null},{"type":"bitfield","name":"WebsiteDataTypes","ctype":"WebKitWebsiteDataTypes","summary":"Enum values with flags representing types of Website data.","deprecated":null},{"type":"bitfield","name":"XRSessionFeatures","ctype":"WebKitXRSessionFeatures","summary":"Enum values representing the XR session features. See . And, see for hand tracking.","deprecated":null},{"type":"callback","name":"URISchemeRequestCallback","ctype":"WebKitURISchemeRequestCallback","summary":"Type definition for a function that will be called back when an URI request is made for a user ...","deprecated":null},{"type":"class","name":"AuthenticationRequest","ctype":"WebKitAuthenticationRequest","summary":"Represents an authentication request. Whenever a client attempts to load a page protected by HTTP authentication, credentials will ...","deprecated":null},{"type":"class","name":"AutomationSession","ctype":"WebKitAutomationSession","summary":"Automation Session. WebKitAutomationSession represents an automation session of a WebKitWebContext. When a new session is requested, a WebKitAutomationSession ...","deprecated":null},{"type":"class","name":"BackForwardList","ctype":"WebKitBackForwardList","summary":"List of visited pages. WebKitBackForwardList maintains a list of visited pages used to navigate to recent pages. Items ...","deprecated":null},{"type":"class","name":"BackForwardListItem","ctype":"WebKitBackForwardListItem","summary":"One item of the #WebKitBackForwardList. A history item is part of the #WebKitBackForwardList and consists out of a ...","deprecated":null},{"type":"class","name":"ClipboardPermissionRequest","ctype":"WebKitClipboardPermissionRequest","summary":"A permission request for reading clipboard contents. WebKitClipboardPermissionRequest represents a request for permission to decide whether WebKit can ...","deprecated":null},{"type":"class","name":"ColorChooserRequest","ctype":"WebKitColorChooserRequest","summary":"A request to open a color chooser. Whenever the user interacts with an HTML element, WebKit will ...","deprecated":null},{"type":"class","name":"ContextMenu","ctype":"WebKitContextMenu","summary":"Represents the context menu in a #WebKitWebView. #WebKitContextMenu represents a context menu containing #WebKitContextMenuItems in a #WebKitWebView. ...","deprecated":null},{"type":"class","name":"ContextMenuItem","ctype":"WebKitContextMenuItem","summary":"One item of a #WebKitContextMenu. The #WebKitContextMenu is composed of #WebKitContextMenuItems. These items can be created from a ...","deprecated":null},{"type":"class","name":"CookieManager","ctype":"WebKitCookieManager","summary":"Defines how to handle cookies in a #WebKitWebContext. The WebKitCookieManager defines how to set up and handle cookies. ...","deprecated":null},{"type":"class","name":"DeviceInfoPermissionRequest","ctype":"WebKitDeviceInfoPermissionRequest","summary":"A permission request for enumerating the user's media devices WebKitDeviceInfoPermissionRequest represents a request for permission to whether WebKit ...","deprecated":null},{"type":"class","name":"Download","ctype":"WebKitDownload","summary":"Object used to communicate with the application when downloading. #WebKitDownload carries information about a download request and response, ...","deprecated":null},{"type":"class","name":"EditorState","ctype":"WebKitEditorState","summary":"Web editor state. WebKitEditorState represents the state of a #WebKitWebView editor. Use webkit_web_view_get_editor_state() to get the WebKitEditorState of ...","deprecated":null},{"type":"class","name":"FaviconDatabase","ctype":"WebKitFaviconDatabase","summary":"Provides access to the icons associated with web sites. WebKit will automatically look for available icons in ...","deprecated":null},{"type":"class","name":"FileChooserRequest","ctype":"WebKitFileChooserRequest","summary":"A request to open a file chooser. Whenever the user interacts with an HTML input element with file ...","deprecated":null},{"type":"class","name":"FindController","ctype":"WebKitFindController","summary":"Controls text search in a #WebKitWebView. A #WebKitFindController is used to search text in a #WebKitWebView. You can ...","deprecated":null},{"type":"class","name":"FormSubmissionRequest","ctype":"WebKitFormSubmissionRequest","summary":"Represents a form submission request. When a form is about to be submitted in a #WebKitWebView, the #WebKitWebView::submit-form ...","deprecated":null},{"type":"class","name":"GeolocationManager","ctype":"WebKitGeolocationManager","summary":"Geolocation manager. WebKitGeolocationManager provides API to get the geographical position of the user. Once a #WebKitGeolocationPermissionRequest is allowed, ...","deprecated":null},{"type":"class","name":"GeolocationPermissionRequest","ctype":"WebKitGeolocationPermissionRequest","summary":"A permission request for sharing the user's location. WebKitGeolocationPermissionRequest represents a request for permission to decide whether WebKit ...","deprecated":null},{"type":"class","name":"HitTestResult","ctype":"WebKitHitTestResult","summary":"Result of a Hit Test. A Hit Test is an operation to get context information about a given ...","deprecated":null},{"type":"class","name":"InputMethodContext","ctype":"WebKitInputMethodContext","summary":"Base class for input method contexts. WebKitInputMethodContext defines the interface to implement WebKit input methods. The input methods ...","deprecated":null},{"type":"class","name":"MediaKeySystemPermissionRequest","ctype":"WebKitMediaKeySystemPermissionRequest","summary":"A permission request for using an EME Content Decryption Module. WebKitMediaKeySystemPermissionRequest represents a request for permission to decide ...","deprecated":null},{"type":"class","name":"NavigationPolicyDecision","ctype":"WebKitNavigationPolicyDecision","summary":"A policy decision for navigation actions. WebKitNavigationPolicyDecision represents a policy decision for events associated with navigations. If the ...","deprecated":null},{"type":"class","name":"NetworkSession","ctype":"WebKitNetworkSession","summary":"Manages network configuration.","deprecated":null},{"type":"class","name":"Notification","ctype":"WebKitNotification","summary":"Holds information about a notification that should be shown to the user.","deprecated":null},{"type":"class","name":"NotificationPermissionRequest","ctype":"WebKitNotificationPermissionRequest","summary":"A permission request for displaying web notifications. WebKitNotificationPermissionRequest represents a request for permission to decide whether WebKit should ...","deprecated":null},{"type":"class","name":"OptionMenu","ctype":"WebKitOptionMenu","summary":"Represents the dropdown menu of a `select` element in a #WebKitWebView. When a select element in a #WebKitWebView ...","deprecated":null},{"type":"class","name":"PointerLockPermissionRequest","ctype":"WebKitPointerLockPermissionRequest","summary":"A permission request for locking the pointer. WebKitPointerLockPermissionRequest represents a request for permission to decide whether WebKit can ...","deprecated":null},{"type":"class","name":"PolicyDecision","ctype":"WebKitPolicyDecision","summary":"A pending policy decision. Often WebKit allows the client to decide the policy for certain operations. For instance, ...","deprecated":null},{"type":"class","name":"PrintOperation","ctype":"WebKitPrintOperation","summary":"Controls a print operation. A #WebKitPrintOperation controls a print operation in WebKit. With a similar API to #GtkPrintOperation, ...","deprecated":null},{"type":"class","name":"ResponsePolicyDecision","ctype":"WebKitResponsePolicyDecision","summary":"A policy decision for resource responses. WebKitResponsePolicyDecision represents a policy decision for a resource response, whether from the ...","deprecated":null},{"type":"class","name":"SecurityManager","ctype":"WebKitSecurityManager","summary":"Controls security settings in a #WebKitWebContext. The #WebKitSecurityManager defines security settings for URI schemes in a #WebKitWebContext. Get ...","deprecated":null},{"type":"class","name":"Settings","ctype":"WebKitSettings","summary":"Control the behaviour of a #WebKitWebView. #WebKitSettings can be applied to a #WebKitWebView to control text charset, color, ...","deprecated":null},{"type":"class","name":"URIRequest","ctype":"WebKitURIRequest","summary":"Represents a URI request. A #WebKitURIRequest can be created with a URI using the webkit_uri_request_new() method, and you ...","deprecated":null},{"type":"class","name":"URIResponse","ctype":"WebKitURIResponse","summary":"Represents an URI response. A #WebKitURIResponse contains information such as the URI, the status code, the content length, ...","deprecated":null},{"type":"class","name":"URISchemeRequest","ctype":"WebKitURISchemeRequest","summary":"Represents a URI scheme request. If you register a particular URI scheme in a #WebKitWebContext, using webkit_web_context_register_uri_scheme(), you ...","deprecated":null},{"type":"class","name":"URISchemeResponse","ctype":"WebKitURISchemeResponse","summary":"Represents a URI scheme response. If you register a particular URI scheme in a #WebKitWebContext, using webkit_web_context_register_uri_scheme(), you ...","deprecated":null},{"type":"class","name":"UserContentFilterStore","ctype":"WebKitUserContentFilterStore","summary":"Handles storage of user content filters on disk. The WebKitUserContentFilterStore provides the means to import and save [JSON ...","deprecated":null},{"type":"class","name":"UserContentManager","ctype":"WebKitUserContentManager","summary":"Manages user-defined content which affects web pages. Using a #WebKitUserContentManager user CSS style sheets can be set to ...","deprecated":null},{"type":"class","name":"UserMediaPermissionRequest","ctype":"WebKitUserMediaPermissionRequest","summary":"A permission request for accessing user's audio/video devices. WebKitUserMediaPermissionRequest represents a request for permission to decide whether WebKit ...","deprecated":null},{"type":"class","name":"UserMessage","ctype":"WebKitUserMessage","summary":"Message that can be sent between the UI process and web process extensions. A WebKitUserMessage is a message ...","deprecated":null},{"type":"class","name":"WebContext","ctype":"WebKitWebContext","summary":"Manages aspects common to all #WebKitWebViews The #WebKitWebContext manages all aspects common to all #WebKitWebViews. You can ...","deprecated":null},{"type":"class","name":"WebExtension","ctype":"WebKitWebExtension","summary":"Represents a [WebExtension](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions). A #WebKitWebExtension object encapsulates a web extension\u2019s resources that are defined by a [`manifest.json` file](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json). ...","deprecated":null},{"type":"class","name":"WebInspector","ctype":"WebKitWebInspector","summary":"Access to the WebKit inspector. The WebKit Inspector is a graphical tool to inspect and change the content ...","deprecated":null},{"type":"class","name":"WebResource","ctype":"WebKitWebResource","summary":"Represents a resource at the end of a URI. A #WebKitWebResource encapsulates content for each resource at the ...","deprecated":null},{"type":"class","name":"WebView","ctype":"WebKitWebView","summary":"The central class of the WPE WebKit and WebKitGTK APIs. #WebKitWebView is the central class of the WPE ...","deprecated":null},{"type":"class","name":"WebViewBase","ctype":"WebKitWebViewBase","summary":"No description available.","deprecated":null},{"type":"class","name":"WebsiteDataAccessPermissionRequest","ctype":"WebKitWebsiteDataAccessPermissionRequest","summary":"A permission request for accessing website data from third-party domains. WebKitWebsiteDataAccessPermissionRequest represents a request for permission to allow ...","deprecated":null},{"type":"class","name":"WebsiteDataManager","ctype":"WebKitWebsiteDataManager","summary":"Manages data stored locally by web sites. You can use WebKitWebsiteDataManager to configure the local directories where website ...","deprecated":null},{"type":"class","name":"WebsitePolicies","ctype":"WebKitWebsitePolicies","summary":"View specific website policies. WebKitWebsitePolicies allows you to configure per-page policies, currently only autoplay policies are supported.","deprecated":null},{"type":"class","name":"WindowProperties","ctype":"WebKitWindowProperties","summary":"Window properties of a #WebKitWebView. The content of a #WebKitWebView can request to change certain properties of the ...","deprecated":null},{"type":"class","name":"XRPermissionRequest","ctype":"WebKitXRPermissionRequest","summary":"A permission request for accessing virtual reality (VR) and augmented reality (AR) devices, including sensors and head-mounted displays. ...","deprecated":null},{"type":"constant","name":"EDITING_COMMAND_COPY","ident":"WEBKIT_EDITING_COMMAND_COPY","summary":"The copy clipboard command. Copies the current selection inside a #WebKitWebView to the clipboard. You can check whether it's ...","deprecated":null},{"type":"constant","name":"EDITING_COMMAND_CREATE_LINK","ident":"WEBKIT_EDITING_COMMAND_CREATE_LINK","summary":"The create link command. Creates a link element that is inserted at the current cursor position. If there's a ...","deprecated":null},{"type":"constant","name":"EDITING_COMMAND_CUT","ident":"WEBKIT_EDITING_COMMAND_CUT","summary":"The cut clipboard command. Copies the current selection inside a #WebKitWebView to the clipboard and deletes the selected content. ...","deprecated":null},{"type":"constant","name":"EDITING_COMMAND_INSERT_IMAGE","ident":"WEBKIT_EDITING_COMMAND_INSERT_IMAGE","summary":"The insert image command. Creates an image element that is inserted at the current cursor position. It receives an ...","deprecated":null},{"type":"constant","name":"EDITING_COMMAND_PASTE","ident":"WEBKIT_EDITING_COMMAND_PASTE","summary":"The paste clipboard command. Pastes the contents of the clipboard to a #WebKitWebView. You can check whether it's possible ...","deprecated":null},{"type":"constant","name":"EDITING_COMMAND_PASTE_AS_PLAIN_TEXT","ident":"WEBKIT_EDITING_COMMAND_PASTE_AS_PLAIN_TEXT","summary":"The paste as plaintext clipboard command. Pastes the contents of the clipboard to a #WebKitWebView, with formatting removed. You ...","deprecated":null},{"type":"constant","name":"EDITING_COMMAND_REDO","ident":"WEBKIT_EDITING_COMMAND_REDO","summary":"The redo command. Redoes a previously undone editing command in a #WebKitWebView. You can check whether it's possible to ...","deprecated":null},{"type":"constant","name":"EDITING_COMMAND_SELECT_ALL","ident":"WEBKIT_EDITING_COMMAND_SELECT_ALL","summary":"The select all command. Selects all the content of the current text field in a #WebKitWebView. It is always ...","deprecated":null},{"type":"constant","name":"EDITING_COMMAND_UNDO","ident":"WEBKIT_EDITING_COMMAND_UNDO","summary":"The undo command. Undoes the last editing command in a #WebKitWebView. You can check whether it's possible to execute ...","deprecated":null},{"type":"constant","name":"MAJOR_VERSION","ident":"WEBKIT_MAJOR_VERSION","summary":"Like webkit_get_major_version(), but from the headers used at application compile time, rather than from the library linked against at ...","deprecated":null},{"type":"constant","name":"MICRO_VERSION","ident":"WEBKIT_MICRO_VERSION","summary":"Like webkit_get_micro_version(), but from the headers used at application compile time, rather than from the library linked against at ...","deprecated":null},{"type":"constant","name":"MINOR_VERSION","ident":"WEBKIT_MINOR_VERSION","summary":"Like webkit_get_minor_version(), but from the headers used at application compile time, rather than from the library linked against at ...","deprecated":null},{"type":"content","name":"Environment variables","href":"environment-variables.html","summary":" # List of environment variables WebKit uses several environment variables, most of which are designed for developers ..."},{"type":"content","name":"Migrating WebKitGTK Applications to GTK 4","href":"migrating-to-webkitgtk-6.0.html","summary":" # Migrating WebKitGTK Applications to GTK 4 This document contains guidance to application developers looking to migrate ..."},{"type":"content","name":"Overview","href":"overview.html","summary":" WebKitGTK is a GObject-based library that provides a GTK widget to interact with the WebKit engine. It can ..."},{"type":"content","name":"Pointers for contribution","href":"contributing.html","summary":" ## Contacting Us You can find the developers behind WebKitGTK on various platforms: - [Mastodon](https://floss.social/@WebKitGTK). ..."},{"type":"content","name":"Profiling","href":"profiling.html","summary":" # Profiling with Sysprof ## Prerequisites To work with [Sysprof](https://gitlab.gnome.org/GNOME/sysprof/) one needs to install it first: ..."},{"type":"content","name":"Remote Web Inspector","href":"remote-inspector.html","summary":" # Remote Web Inspector The remote Web Inspector enables debugging of web pages from a different device. ..."},{"type":"ctor","name":"new","type_name":"ContextMenu","ident":"webkit_context_menu_new","summary":"Creates a new #WebKitContextMenu object. Creates a new #WebKitContextMenu object to be used as a submenu of an ...","deprecated":null},{"type":"ctor","name":"new","type_name":"NetworkSession","ident":"webkit_network_session_new","summary":"Creates a new #WebKitNetworkSession with a persistent #WebKitWebsiteDataManager. The parameters @data_directory and @cache_directory will be used as construct properties ...","deprecated":null},{"type":"ctor","name":"new","type_name":"PrintOperation","ident":"webkit_print_operation_new","summary":"Create a new #WebKitPrintOperation to print @web_view contents.","deprecated":null},{"type":"ctor","name":"new","type_name":"Settings","ident":"webkit_settings_new","summary":"Creates a new #WebKitSettings instance with default values. It must be manually attached to a #WebKitWebView. See also webkit_settings_new_with_settings().","deprecated":null},{"type":"ctor","name":"new","type_name":"URIRequest","ident":"webkit_uri_request_new","summary":"Creates a new #WebKitURIRequest for the given URI.","deprecated":null},{"type":"ctor","name":"new","type_name":"URISchemeResponse","ident":"webkit_uri_scheme_response_new","summary":"Create a new #WebKitURISchemeResponse","deprecated":null},{"type":"ctor","name":"new","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_new","summary":"Create a new #WebKitUserContentFilterStore to manipulate filters stored at @storage_path. The path must point to a local filesystem, ...","deprecated":null},{"type":"ctor","name":"new","type_name":"UserContentManager","ident":"webkit_user_content_manager_new","summary":"Creates a new user content manager.","deprecated":null},{"type":"ctor","name":"new","type_name":"UserMessage","ident":"webkit_user_message_new","summary":"Create a new #WebKitUserMessage with @name.","deprecated":null},{"type":"ctor","name":"new","type_name":"WebContext","ident":"webkit_web_context_new","summary":"Create a new #WebKitWebContext.","deprecated":null},{"type":"ctor","name":"new","type_name":"WebExtension","ident":"webkit_web_extension_new","summary":"Creates a new WebKitWebExtension from a folder containing the extension contents. The folder must contain a `manifest.json` file. If ...","deprecated":null},{"type":"ctor","name":"new","type_name":"WebsitePolicies","ident":"webkit_website_policies_new","summary":"Create a new #WebKitWebsitePolicies.","deprecated":null},{"type":"ctor","name":"new","type_name":"WebView","ident":"webkit_web_view_new","summary":"Creates a new #WebKitWebView with the default #WebKitWebContext. Creates a new #WebKitWebView with the default #WebKitWebContext and no ...","deprecated":null},{"type":"ctor","name":"new","type_name":"ApplicationInfo","ident":"webkit_application_info_new","summary":"Creates a new #WebKitApplicationInfo","deprecated":null},{"type":"ctor","name":"new","type_name":"Credential","ident":"webkit_credential_new","summary":"Create a new credential from the provided username, password and persistence mode.","deprecated":null},{"type":"ctor","name":"new","type_name":"GeolocationPosition","ident":"webkit_geolocation_position_new","summary":"Create a new #WebKitGeolocationPosition.","deprecated":null},{"type":"ctor","name":"new","type_name":"InputMethodUnderline","ident":"webkit_input_method_underline_new","summary":"Create a new #WebKitInputMethodUnderline for the given range in preedit string","deprecated":null},{"type":"ctor","name":"new","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_new","summary":"Create a new #WebKitMemoryPressureSettings with the default values.","deprecated":null},{"type":"ctor","name":"new","type_name":"NetworkProxySettings","ident":"webkit_network_proxy_settings_new","summary":"Create a new #WebKitNetworkProxySettings with the given @default_proxy_uri and @ignore_hosts. The default proxy URI will be used for ...","deprecated":null},{"type":"ctor","name":"new","type_name":"SecurityOrigin","ident":"webkit_security_origin_new","summary":"Create a new security origin from the provided protocol, host and port.","deprecated":null},{"type":"ctor","name":"new","type_name":"UserScript","ident":"webkit_user_script_new","summary":"Creates a new user script. Scripts can be applied to some URIs only by passing non-null values for ...","deprecated":null},{"type":"ctor","name":"new","type_name":"UserStyleSheet","ident":"webkit_user_style_sheet_new","summary":"Creates a new user style sheet. Style sheets can be applied to some URIs only by passing non-null ...","deprecated":null},{"type":"ctor","name":"new","type_name":"WebViewSessionState","ident":"webkit_web_view_session_state_new","summary":"Creates a new #WebKitWebViewSessionState from serialized data.","deprecated":null},{"type":"ctor","name":"new_all_hosts_and_schemes","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_new_all_hosts_and_schemes","summary":"Returns a new #WebKitWebExtensionMatchPattern that has `*` for scheme, host, and path.","deprecated":null},{"type":"ctor","name":"new_all_urls","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_new_all_urls","summary":"Returns a new #WebKitWebExtensionMatchPattern for ``.","deprecated":null},{"type":"ctor","name":"new_ephemeral","type_name":"NetworkSession","ident":"webkit_network_session_new_ephemeral","summary":"Creates a new #WebKitNetworkSession with an ephemeral #WebKitWebsiteDataManager.","deprecated":null},{"type":"ctor","name":"new_for_certificate","type_name":"Credential","ident":"webkit_credential_new_for_certificate","summary":"Create a new credential from the @certificate and persistence mode. Note that %WEBKIT_CREDENTIAL_PERSISTENCE_PERMANENT is not supported for certificate credentials.","deprecated":null},{"type":"ctor","name":"new_for_certificate_pin","type_name":"Credential","ident":"webkit_credential_new_for_certificate_pin","summary":"Create a new credential from the provided PIN and persistence mode. Note that %WEBKIT_CREDENTIAL_PERSISTENCE_PERMANENT is not supported for ...","deprecated":null},{"type":"ctor","name":"new_for_uri","type_name":"SecurityOrigin","ident":"webkit_security_origin_new_for_uri","summary":"Create a new security origin from the provided. Create a new security origin from the provided URI. Components ...","deprecated":null},{"type":"ctor","name":"new_for_world","type_name":"UserScript","ident":"webkit_user_script_new_for_world","summary":"Creates a new user script for script world with name @world_name. See webkit_user_script_new() for a full description.","deprecated":null},{"type":"ctor","name":"new_for_world","type_name":"UserStyleSheet","ident":"webkit_user_style_sheet_new_for_world","summary":"Creates a new user style sheet for script world. Creates a new user style sheet for script world ...","deprecated":null},{"type":"ctor","name":"new_from_gaction","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_from_gaction","summary":"Creates a new #WebKitContextMenuItem for the given @action and @label. On activation @target will be passed as parameter ...","deprecated":null},{"type":"ctor","name":"new_from_stock_action","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_from_stock_action","summary":"Creates a new #WebKitContextMenuItem for the given stock action. Stock actions are handled automatically by WebKit so that, ...","deprecated":null},{"type":"ctor","name":"new_from_stock_action_with_label","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_from_stock_action_with_label","summary":"Creates a new #WebKitContextMenuItem for the given stock action using the given @label. Stock actions have a predefined ...","deprecated":null},{"type":"ctor","name":"new_separator","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_separator","summary":"Creates a new #WebKitContextMenuItem representing a separator.","deprecated":null},{"type":"ctor","name":"new_with_fd_list","type_name":"UserMessage","ident":"webkit_user_message_new_with_fd_list","summary":"Create a new #WebKitUserMessage including also a list of UNIX file descriptors to be sent.","deprecated":null},{"type":"ctor","name":"new_with_items","type_name":"ContextMenu","ident":"webkit_context_menu_new_with_items","summary":"Creates a new #WebKitContextMenu object with the given items. Creates a new #WebKitContextMenu object to be used as ...","deprecated":null},{"type":"ctor","name":"new_with_policies","type_name":"WebsitePolicies","ident":"webkit_website_policies_new_with_policies","summary":"Create a new #WebKitWebsitePolicies with given policies. Create a new #WebKitWebsitePolicies with policies given as variadic arguments.","deprecated":null},{"type":"ctor","name":"new_with_scheme","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_new_with_scheme","summary":"Returns a new #WebKitWebExtensionMatchPattern for the specified @scheme, @host, and @path strings.","deprecated":null},{"type":"ctor","name":"new_with_settings","type_name":"Settings","ident":"webkit_settings_new_with_settings","summary":"Creates a new #WebKitSettings instance with the given settings. It must be manually attached to a #WebKitWebView.","deprecated":null},{"type":"ctor","name":"new_with_string","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_new_with_string","summary":"Returns a new #WebKitWebExtensionMatchPattern for the specified @string.","deprecated":null},{"type":"ctor","name":"new_with_submenu","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_with_submenu","summary":"Creates a new #WebKitContextMenuItem using the given @label with a submenu.","deprecated":null},{"type":"domain","name":"DownloadError","ctype":"WebKitDownloadError","summary":"Enum values used to denote the various download errors.","deprecated":null},{"type":"domain","name":"FaviconDatabaseError","ctype":"WebKitFaviconDatabaseError","summary":"Enum values used to denote the various errors related to the #WebKitFaviconDatabase.","deprecated":null},{"type":"domain","name":"JavascriptError","ctype":"WebKitJavascriptError","summary":"Enum values used to denote errors happening when executing JavaScript","deprecated":null},{"type":"domain","name":"MediaError","ctype":"WebKitMediaError","summary":"Enum values used to denote the various media errors.","deprecated":null},{"type":"domain","name":"NetworkError","ctype":"WebKitNetworkError","summary":"Enum values used to denote the various network errors.","deprecated":null},{"type":"domain","name":"PolicyError","ctype":"WebKitPolicyError","summary":"Enum values used to denote the various policy errors.","deprecated":null},{"type":"domain","name":"PrintError","ctype":"WebKitPrintError","summary":"Enum values used to denote the various print errors.","deprecated":null},{"type":"domain","name":"SnapshotError","ctype":"WebKitSnapshotError","summary":"Enum values used to denote errors happening when creating snapshots of #WebKitWebView","deprecated":null},{"type":"domain","name":"UserContentFilterError","ctype":"WebKitUserContentFilterError","summary":"Errors that can occur while compiling content filters.","deprecated":null},{"type":"domain","name":"UserMessageError","ctype":"WebKitUserMessageError","summary":"Enum values used to denote errors happening when sending user messages.","deprecated":null},{"type":"domain","name":"WebExtensionError","ctype":"WebKitWebExtensionError","summary":"Enum values used to denote errors happening when parsing a #WebKitWebExtension","deprecated":null},{"type":"domain","name":"WebExtensionMatchPatternError","ctype":"WebKitWebExtensionMatchPatternError","summary":"Enum values used to denote errors happening when creating a #WebKitWebExtensionMatchPattern","deprecated":null},{"type":"enum","name":"AuthenticationScheme","ctype":"WebKitAuthenticationScheme","summary":"Enum values representing the authentication scheme.","deprecated":null},{"type":"enum","name":"AutomationBrowsingContextPresentation","ctype":"WebKitAutomationBrowsingContextPresentation","summary":"Enum values used for determining the automation browsing context presentation.","deprecated":null},{"type":"enum","name":"AutoplayPolicy","ctype":"WebKitAutoplayPolicy","summary":"Enum values used to specify autoplay policies.","deprecated":null},{"type":"enum","name":"CacheModel","ctype":"WebKitCacheModel","summary":"Enum values used for determining the #WebKitWebContext cache model.","deprecated":null},{"type":"enum","name":"ContextMenuAction","ctype":"WebKitContextMenuAction","summary":"Enum values used to denote the stock actions for #WebKitContextMenuItems","deprecated":null},{"type":"enum","name":"CookieAcceptPolicy","ctype":"WebKitCookieAcceptPolicy","summary":"Enum values used to denote the cookie acceptance policies.","deprecated":null},{"type":"enum","name":"CookiePersistentStorage","ctype":"WebKitCookiePersistentStorage","summary":"Enum values used to denote the cookie persistent storage types.","deprecated":null},{"type":"enum","name":"CredentialPersistence","ctype":"WebKitCredentialPersistence","summary":"Enum values representing the duration for which a credential persists.","deprecated":null},{"type":"enum","name":"FeatureStatus","ctype":"WebKitFeatureStatus","summary":"Describes the status of a [struct@WebKitFeature]. The status for a given feature can be obtained with [id@webkit_feature_get_status].","deprecated":null},{"type":"enum","name":"HardwareAccelerationPolicy","ctype":"WebKitHardwareAccelerationPolicy","summary":"Enum values used for determining the hardware acceleration policy.","deprecated":null},{"type":"enum","name":"InputPurpose","ctype":"WebKitInputPurpose","summary":"Enum values used to describe the primary purpose of the active editable element.","deprecated":null},{"type":"enum","name":"InsecureContentEvent","ctype":"WebKitInsecureContentEvent","summary":"Enum values previously used to denote the different events which can trigger the detection of insecure content. Since 2.46, ...","deprecated":"2.46"},{"type":"enum","name":"LoadEvent","ctype":"WebKitLoadEvent","summary":"Enum values used to denote the different events that happen during a #WebKitWebView load operation.","deprecated":null},{"type":"enum","name":"MediaCaptureState","ctype":"WebKitMediaCaptureState","summary":"Enum values used to specify the capture state of a media device.","deprecated":null},{"type":"enum","name":"NavigationType","ctype":"WebKitNavigationType","summary":"Enum values used to denote the various navigation types.","deprecated":null},{"type":"enum","name":"NetworkProxyMode","ctype":"WebKitNetworkProxyMode","summary":"Enum values used to set the network proxy mode.","deprecated":null},{"type":"enum","name":"PermissionState","ctype":"WebKitPermissionState","summary":"Enum values representing query permission results.","deprecated":null},{"type":"enum","name":"PolicyDecisionType","ctype":"WebKitPolicyDecisionType","summary":"Enum values used for determining the type of a policy decision during #WebKitWebView::decide-policy.","deprecated":null},{"type":"enum","name":"PrintOperationResponse","ctype":"WebKitPrintOperationResponse","summary":"Enum values representing the response of the print dialog shown with webkit_print_operation_run_dialog().","deprecated":null},{"type":"enum","name":"SaveMode","ctype":"WebKitSaveMode","summary":"Enum values to specify the different ways in which a #WebKitWebView can save its current web page into a ...","deprecated":null},{"type":"enum","name":"ScriptDialogType","ctype":"WebKitScriptDialogType","summary":"Enum values used for determining the type of #WebKitScriptDialog","deprecated":null},{"type":"enum","name":"SnapshotRegion","ctype":"WebKitSnapshotRegion","summary":"Enum values used to specify the region from which to get a #WebKitWebView snapshot","deprecated":null},{"type":"enum","name":"TLSErrorsPolicy","ctype":"WebKitTLSErrorsPolicy","summary":"Enum values used to denote the TLS errors policy.","deprecated":null},{"type":"enum","name":"UserContentInjectedFrames","ctype":"WebKitUserContentInjectedFrames","summary":"Specifies in which frames user style sheets are to be inserted in.","deprecated":null},{"type":"enum","name":"UserScriptInjectionTime","ctype":"WebKitUserScriptInjectionTime","summary":"Specifies at which place of documents an user script will be inserted.","deprecated":null},{"type":"enum","name":"UserStyleLevel","ctype":"WebKitUserStyleLevel","summary":"Specifies how to treat an user style sheet.","deprecated":null},{"type":"enum","name":"WebExtensionMode","ctype":"WebKitWebExtensionMode","summary":"Enum values used for setting if a #WebKitWebView is intended for WebExtensions.","deprecated":null},{"type":"enum","name":"WebProcessTerminationReason","ctype":"WebKitWebProcessTerminationReason","summary":"Enum values used to specify the reason why the web process terminated abnormally.","deprecated":null},{"type":"enum","name":"XRSessionMode","ctype":"WebKitXRSessionMode","summary":"Enum values representing the XR session mode. See ","deprecated":null},{"type":"function","name":"get_major_version","ident":"webkit_get_major_version","summary":"Returns the major version number of the WebKit library. (e.g. in WebKit version 1.8.3 this is 1.) ...","deprecated":null},{"type":"function","name":"get_micro_version","ident":"webkit_get_micro_version","summary":"Returns the micro version number of the WebKit library. (e.g. in WebKit version 1.8.3 this is 3.) ...","deprecated":null},{"type":"function","name":"get_minor_version","ident":"webkit_get_minor_version","summary":"Returns the minor version number of the WebKit library. (e.g. in WebKit version 1.8.3 this is 8.) ...","deprecated":null},{"type":"function","name":"media_key_system_permission_get_name","ident":"webkit_media_key_system_permission_get_name","summary":"Get the key system for which access permission is being requested.","deprecated":null},{"type":"function","name":"uri_for_display","ident":"webkit_uri_for_display","summary":"Use this function to format a URI for display. The URIs used internally by WebKit may contain percent-encoded ...","deprecated":null},{"type":"function","name":"user_media_permission_is_for_audio_device","ident":"webkit_user_media_permission_is_for_audio_device","summary":"Check whether the permission request is for an audio device.","deprecated":null},{"type":"function","name":"user_media_permission_is_for_display_device","ident":"webkit_user_media_permission_is_for_display_device","summary":"Check whether the permission request is for a display device.","deprecated":null},{"type":"function","name":"user_media_permission_is_for_video_device","ident":"webkit_user_media_permission_is_for_video_device","summary":"Check whether the permission request is for a video device.","deprecated":null},{"type":"function_macro","name":"CHECK_VERSION","ident":"WEBKIT_CHECK_VERSION","summary":"Check the version of the WebKit headers at compilation time.","deprecated":null},{"type":"function_macro","name":"DECLARE_DERIVABLE_TYPE","ident":"WEBKIT_DECLARE_DERIVABLE_TYPE","summary":"No description available.","deprecated":null},{"type":"function_macro","name":"DECLARE_FINAL_TYPE","ident":"WEBKIT_DECLARE_FINAL_TYPE","summary":"No description available.","deprecated":null},{"type":"function_macro","name":"DECLARE_TYPE","ident":"WEBKIT_DECLARE_TYPE","summary":"No description available.","deprecated":null},{"type":"function_macro","name":"DEPRECATED_FOR","ident":"WEBKIT_DEPRECATED_FOR","summary":"Marks a symbol as deprecated, indicating a replacement.","deprecated":null},{"type":"interface","name":"PermissionRequest","ctype":"WebKitPermissionRequest","summary":"A permission request. There are situations where an embedder would need to ask the user for permission to ...","deprecated":null},{"type":"method","name":"activate_item","type_name":"OptionMenu","ident":"webkit_option_menu_activate_item","summary":"Activates the #WebKitOptionMenuItem at @index in @menu. Activating an item changes the value of the element making the ...","deprecated":null},{"type":"method","name":"add_cookie","type_name":"CookieManager","ident":"webkit_cookie_manager_add_cookie","summary":"Asynchronously add a #SoupCookie to the underlying storage. When the operation is finished, @callback will be called. You ...","deprecated":null},{"type":"method","name":"add_cookie_finish","type_name":"CookieManager","ident":"webkit_cookie_manager_add_cookie_finish","summary":"Finish an asynchronous operation started with webkit_cookie_manager_add_cookie().","deprecated":null},{"type":"method","name":"add_filter","type_name":"UserContentManager","ident":"webkit_user_content_manager_add_filter","summary":"Adds a #WebKitUserContentFilter to the given #WebKitUserContentManager. The same #WebKitUserContentFilter can be reused with multiple #WebKitUserContentManager instances. ...","deprecated":null},{"type":"method","name":"add_path_to_sandbox","type_name":"WebContext","ident":"webkit_web_context_add_path_to_sandbox","summary":"Adds a path to be mounted in the sandbox. @path must exist before any web process has been ...","deprecated":null},{"type":"method","name":"add_proxy_for_scheme","type_name":"NetworkProxySettings","ident":"webkit_network_proxy_settings_add_proxy_for_scheme","summary":"Adds a URI-scheme-specific proxy. URIs whose scheme matches @uri_scheme will be proxied via @proxy_uri. As with the default ..."},{"type":"method","name":"add_script","type_name":"UserContentManager","ident":"webkit_user_content_manager_add_script","summary":"Adds a #WebKitUserScript to the given #WebKitUserContentManager. The same #WebKitUserScript can be reused with multiple #WebKitUserContentManager instances.","deprecated":null},{"type":"method","name":"add_style_sheet","type_name":"UserContentManager","ident":"webkit_user_content_manager_add_style_sheet","summary":"Adds a #WebKitUserStyleSheet to the given #WebKitUserContentManager. The same #WebKitUserStyleSheet can be reused with multiple #WebKitUserContentManager instances.","deprecated":null},{"type":"method","name":"allow","type_name":"PermissionRequest","ident":"webkit_permission_request_allow","summary":"Allow the action which triggered this request.","deprecated":null},{"type":"method","name":"allow_tls_certificate_for_host","type_name":"NetworkSession","ident":"webkit_network_session_allow_tls_certificate_for_host","summary":"Ignore further TLS errors on the @host for the certificate present in @info. If @host is an IPv6 ...","deprecated":null},{"type":"method","name":"append","type_name":"ContextMenu","ident":"webkit_context_menu_append","summary":"Adds @item at the end of the @menu.","deprecated":null},{"type":"method","name":"apply_from_key_file","type_name":"Settings","ident":"webkit_settings_apply_from_key_file","summary":"Reads the contents of the given @group_name from the given @key_file and apply the value of each key/value to ...","deprecated":null},{"type":"method","name":"attach","type_name":"WebInspector","ident":"webkit_web_inspector_attach","summary":"Request @inspector to be attached. The signal #WebKitWebInspector::attach will be emitted. If the inspector is already attached it ...","deprecated":null},{"type":"method","name":"authenticate","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_authenticate","summary":"Authenticate the #WebKitAuthenticationRequest. Authenticate the #WebKitAuthenticationRequest using the #WebKitCredential supplied. To continue without credentials, pass %NULL as @credential.","deprecated":null},{"type":"method","name":"call_async_javascript_function","type_name":"WebView","ident":"webkit_web_view_call_async_javascript_function","summary":"Asynchronously call @body with @arguments in the script world with name @world_name of the main frame current context in ...","deprecated":null},{"type":"method","name":"call_async_javascript_function_finish","type_name":"WebView","ident":"webkit_web_view_call_async_javascript_function_finish","summary":"Finish an asynchronous operation started with webkit_web_view_call_async_javascript_function().","deprecated":null},{"type":"method","name":"can_execute_editing_command","type_name":"WebView","ident":"webkit_web_view_can_execute_editing_command","summary":"Asynchronously check if it is possible to execute the given editing command. When the operation is finished, @callback ...","deprecated":null},{"type":"method","name":"can_execute_editing_command_finish","type_name":"WebView","ident":"webkit_web_view_can_execute_editing_command_finish","summary":"Finish an asynchronous operation started with webkit_web_view_can_execute_editing_command().","deprecated":null},{"type":"method","name":"can_go_back","type_name":"WebView","ident":"webkit_web_view_can_go_back","summary":"Determines whether @web_view has a previous history item.","deprecated":null},{"type":"method","name":"can_go_forward","type_name":"WebView","ident":"webkit_web_view_can_go_forward","summary":"Determines whether @web_view has a next history item.","deprecated":null},{"type":"method","name":"can_save_credentials","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_can_save_credentials","summary":"Determine whether this #WebKitAuthenticationRequest should allow the storage of credentials. Determine whether the authentication method associated with this ...","deprecated":null},{"type":"method","name":"can_show_mime_type","type_name":"WebView","ident":"webkit_web_view_can_show_mime_type","summary":"Whether or not a MIME type can be displayed in @web_view.","deprecated":null},{"type":"method","name":"cancel","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_cancel","summary":"Cancel the authentication challenge. This will also cancel the page loading and result in a #WebKitWebView::load-failed signal with ...","deprecated":null},{"type":"method","name":"cancel","type_name":"ColorChooserRequest","ident":"webkit_color_chooser_request_cancel","summary":"Cancels @request and the input element changes to use the initial color. Cancels @request and the input element ...","deprecated":null},{"type":"method","name":"cancel","type_name":"Download","ident":"webkit_download_cancel","summary":"Cancels the download. When the ongoing download operation is effectively cancelled the signal #WebKitDownload::failed is emitted with %WEBKIT_DOWNLOAD_ERROR_CANCELLED_BY_USER error.","deprecated":null},{"type":"method","name":"cancel","type_name":"FileChooserRequest","ident":"webkit_file_chooser_request_cancel","summary":"Ask WebKit to cancel the request. It's important to do this in case no selection has been made ...","deprecated":null},{"type":"method","name":"clear","type_name":"FaviconDatabase","ident":"webkit_favicon_database_clear","summary":"Clears all icons from the database.","deprecated":null},{"type":"method","name":"clear","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_clear","summary":"Asynchronously clear the website data of the given @types modified in the past @timespan. If @timespan is 0, ...","deprecated":null},{"type":"method","name":"clear_finish","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_clear_finish","summary":"Finish an asynchronous operation started with webkit_website_data_manager_clear()","deprecated":null},{"type":"method","name":"clicked","type_name":"Notification","ident":"webkit_notification_clicked","summary":"Tells WebKit the notification has been clicked. This will emit the #WebKitNotification::clicked signal.","deprecated":null},{"type":"method","name":"close","type_name":"Notification","ident":"webkit_notification_close","summary":"Closes the notification.","deprecated":null},{"type":"method","name":"close","type_name":"OptionMenu","ident":"webkit_option_menu_close","summary":"Request to close a #WebKitOptionMenu. This emits WebKitOptionMenu::close signal. This function should always be called to notify WebKit ...","deprecated":null},{"type":"method","name":"close","type_name":"WebInspector","ident":"webkit_web_inspector_close","summary":"Request @inspector to be closed.","deprecated":null},{"type":"method","name":"close","type_name":"ScriptDialog","ident":"webkit_script_dialog_close","summary":"Close @dialog. When handling a #WebKitScriptDialog asynchronously (webkit_script_dialog_ref() was called in #WebKitWebView::script-dialog callback), this function needs to be ..."},{"type":"method","name":"confirm_set_confirmed","type_name":"ScriptDialog","ident":"webkit_script_dialog_confirm_set_confirmed","summary":"Set whether the user confirmed the dialog. This method is used for %WEBKIT_SCRIPT_DIALOG_CONFIRM and %WEBKIT_SCRIPT_DIALOG_BEFORE_UNLOAD_CONFIRM dialogs when #WebKitWebView::script-dialog ..."},{"type":"method","name":"context_is_editable","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_editable","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_image","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_image","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_link","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_link","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_media","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_media","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_scrollbar","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_scrollbar","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_SCROLLBAR flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_selection","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_selection","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"copy","type_name":"Credential","ident":"webkit_credential_copy","summary":"Make a copy of the #WebKitCredential."},{"type":"method","name":"copy","type_name":"GeolocationPosition","ident":"webkit_geolocation_position_copy","summary":"Make a copy of the #WebKitGeolocationPosition."},{"type":"method","name":"copy","type_name":"InputMethodUnderline","ident":"webkit_input_method_underline_copy","summary":"Make a copy of the #WebKitInputMethodUnderline."},{"type":"method","name":"copy","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_copy","summary":"Make a copy of @settings."},{"type":"method","name":"copy","type_name":"NavigationAction","ident":"webkit_navigation_action_copy","summary":"Make a copy of @navigation."},{"type":"method","name":"copy","type_name":"NetworkProxySettings","ident":"webkit_network_proxy_settings_copy","summary":"Make a copy of the #WebKitNetworkProxySettings."},{"type":"method","name":"copy","type_name":"OptionMenuItem","ident":"webkit_option_menu_item_copy","summary":"Make a copy of the #WebKitOptionMenuItem."},{"type":"method","name":"count_matches","type_name":"FindController","ident":"webkit_find_controller_count_matches","summary":"Counts the number of matches for @search_text. Counts the number of matches for @search_text found in the #WebKitWebView ...","deprecated":null},{"type":"method","name":"delete_cookie","type_name":"CookieManager","ident":"webkit_cookie_manager_delete_cookie","summary":"Asynchronously delete a #SoupCookie from the current session. When the operation is finished, @callback will be called. You ...","deprecated":null},{"type":"method","name":"delete_cookie_finish","type_name":"CookieManager","ident":"webkit_cookie_manager_delete_cookie_finish","summary":"Finish an asynchronous operation started with webkit_cookie_manager_delete_cookie().","deprecated":null},{"type":"method","name":"deny","type_name":"PermissionRequest","ident":"webkit_permission_request_deny","summary":"Deny the action which triggered this request.","deprecated":null},{"type":"method","name":"detach","type_name":"WebInspector","ident":"webkit_web_inspector_detach","summary":"Request @inspector to be detached. The signal #WebKitWebInspector::detach will be emitted. If the inspector is already detached it ...","deprecated":null},{"type":"method","name":"download","type_name":"PolicyDecision","ident":"webkit_policy_decision_download","summary":"Spawn a download from this decision.","deprecated":null},{"type":"method","name":"download_uri","type_name":"NetworkSession","ident":"webkit_network_session_download_uri","summary":"Requests downloading of the specified URI string. The download operation will not be associated to any #WebKitWebView, if ...","deprecated":null},{"type":"method","name":"download_uri","type_name":"WebView","ident":"webkit_web_view_download_uri","summary":"Requests downloading of the specified URI string for @web_view.","deprecated":null},{"type":"method","name":"evaluate_javascript","type_name":"WebView","ident":"webkit_web_view_evaluate_javascript","summary":"Asynchronously evaluate @script in the script world with name @world_name of the main frame current context in @web_view. If ...","deprecated":null},{"type":"method","name":"evaluate_javascript_finish","type_name":"WebView","ident":"webkit_web_view_evaluate_javascript_finish","summary":"Finish an asynchronous operation started with webkit_web_view_evaluate_javascript().","deprecated":null},{"type":"method","name":"execute_editing_command","type_name":"WebView","ident":"webkit_web_view_execute_editing_command","summary":"Request to execute the given @command for @web_view. You can use webkit_web_view_can_execute_editing_command() to check whether it's possible to ...","deprecated":null},{"type":"method","name":"execute_editing_command_with_argument","type_name":"WebView","ident":"webkit_web_view_execute_editing_command_with_argument","summary":"Request to execute the given @command with @argument for @web_view. You can use webkit_web_view_can_execute_editing_command() to check whether it's ...","deprecated":null},{"type":"method","name":"failed","type_name":"GeolocationManager","ident":"webkit_geolocation_manager_failed","summary":"Notify @manager that determining the position failed.","deprecated":null},{"type":"method","name":"fetch","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_fetch","summary":"Asynchronously get the list of #WebKitWebsiteData for the given @types. When the operation is finished, @callback will be ...","deprecated":null},{"type":"method","name":"fetch_finish","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_fetch_finish","summary":"Finish an asynchronous operation started with webkit_website_data_manager_fetch().","deprecated":null},{"type":"method","name":"fetch_identifiers","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_fetch_identifiers","summary":"Asynchronously retrieve a list of the identifiers for all the stored filters. When the operation is finished, @callback ...","deprecated":null},{"type":"method","name":"fetch_identifiers_finish","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_fetch_identifiers_finish","summary":"Finishes an asynchronous fetch of the list of stored filters. Finishes an asynchronous fetch of the list of ...","deprecated":null},{"type":"method","name":"filter_key_event","type_name":"InputMethodContext","ident":"webkit_input_method_context_filter_key_event","summary":"Allow @key_event to be handled by the input method. If %TRUE is returned, then no further processing should ...","deprecated":null},{"type":"method","name":"finish","type_name":"ColorChooserRequest","ident":"webkit_color_chooser_request_finish","summary":"Finishes @request and the input element keeps the current value of #WebKitColorChooserRequest:rgba. Finishes @request and the input element ...","deprecated":null},{"type":"method","name":"finish","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_finish","summary":"Finish a #WebKitURISchemeRequest by setting the contents of the request and its mime type.","deprecated":null},{"type":"method","name":"finish","type_name":"PermissionStateQuery","ident":"webkit_permission_state_query_finish","summary":"Notify the web-engine of the selected permission state for the given query. This function should only be called as ..."},{"type":"method","name":"finish_error","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_finish_error","summary":"Finish a #WebKitURISchemeRequest with a #GError.","deprecated":null},{"type":"method","name":"finish_with_response","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_finish_with_response","summary":"Finish a #WebKitURISchemeRequest by returning a #WebKitURISchemeResponse","deprecated":null},{"type":"method","name":"first","type_name":"ContextMenu","ident":"webkit_context_menu_first","summary":"Gets the first item in the @menu.","deprecated":null},{"type":"method","name":"free","type_name":"Credential","ident":"webkit_credential_free","summary":"Free the #WebKitCredential."},{"type":"method","name":"free","type_name":"GeolocationPosition","ident":"webkit_geolocation_position_free","summary":"Free the #WebKitGeolocationPosition"},{"type":"method","name":"free","type_name":"InputMethodUnderline","ident":"webkit_input_method_underline_free","summary":"Free the #WebKitInputMethodUnderline."},{"type":"method","name":"free","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_free","summary":"Free the #WebKitMemoryPressureSettings."},{"type":"method","name":"free","type_name":"NavigationAction","ident":"webkit_navigation_action_free","summary":"Free the #WebKitNavigationAction"},{"type":"method","name":"free","type_name":"NetworkProxySettings","ident":"webkit_network_proxy_settings_free","summary":"Free the #WebKitNetworkProxySettings."},{"type":"method","name":"free","type_name":"OptionMenuItem","ident":"webkit_option_menu_item_free","summary":"Free the #WebKitOptionMenuItem."},{"type":"method","name":"get","type_name":"FeatureList","ident":"webkit_feature_list_get","summary":"Gets a feature given its index."},{"type":"method","name":"get_accept_policy","type_name":"CookieManager","ident":"webkit_cookie_manager_get_accept_policy","summary":"Asynchronously get the cookie acceptance policy of @cookie_manager. Note that when policy was set to %WEBKIT_COOKIE_POLICY_ACCEPT_NO_THIRD_PARTY and ITP ...","deprecated":null},{"type":"method","name":"get_accept_policy_finish","type_name":"CookieManager","ident":"webkit_cookie_manager_get_accept_policy_finish","summary":"Finish an asynchronous operation started with webkit_cookie_manager_get_accept_policy().","deprecated":null},{"type":"method","name":"get_action_icon","type_name":"WebExtension","ident":"webkit_web_extension_get_action_icon","summary":"Returns the extension's default action icon image for the specified size. This icon serves as a default and should ...","deprecated":null},{"type":"method","name":"get_all_cookies","type_name":"CookieManager","ident":"webkit_cookie_manager_get_all_cookies","summary":"Asynchronously get a list of #SoupCookie from @cookie_manager. When the operation is finished, @callback will be called. You ...","deprecated":null},{"type":"method","name":"get_all_cookies_finish","type_name":"CookieManager","ident":"webkit_cookie_manager_get_all_cookies_finish","summary":"Finish an asynchronous operation started with webkit_cookie_manager_get_all_cookies(). The return value is a #GList of #SoupCookie instances which should ...","deprecated":null},{"type":"method","name":"get_all_requested_match_patterns","type_name":"WebExtension","ident":"webkit_web_extension_get_all_requested_match_patterns","summary":"Get the set of websites that the extension requires access to for injected content and for receiving messages from websites.","deprecated":null},{"type":"method","name":"get_allow_file_access_from_file_urls","type_name":"Settings","ident":"webkit_settings_get_allow_file_access_from_file_urls","summary":"Get the #WebKitSettings:allow-file-access-from-file-urls property.","deprecated":null},{"type":"method","name":"get_allow_modal_dialogs","type_name":"Settings","ident":"webkit_settings_get_allow_modal_dialogs","summary":"Get the #WebKitSettings:allow-modal-dialogs property.","deprecated":null},{"type":"method","name":"get_allow_overwrite","type_name":"Download","ident":"webkit_download_get_allow_overwrite","summary":"Returns the current value of the #WebKitDownload:allow-overwrite property. Returns the current value of the #WebKitDownload:allow-overwrite property, which determines ...","deprecated":null},{"type":"method","name":"get_allow_top_navigation_to_data_urls","type_name":"Settings","ident":"webkit_settings_get_allow_top_navigation_to_data_urls","summary":"Get the #WebKitSettings:allow-top-navigation-to-data-urls property.","deprecated":null},{"type":"method","name":"get_allow_universal_access_from_file_urls","type_name":"Settings","ident":"webkit_settings_get_allow_universal_access_from_file_urls","summary":"Get the #WebKitSettings:allow-universal-access-from-file-urls property.","deprecated":null},{"type":"method","name":"get_application_info","type_name":"AutomationSession","ident":"webkit_automation_session_get_application_info","summary":"Get the the previously set #WebKitAutomationSession. Get the #WebKitAutomationSession previously set with webkit_automation_session_set_application_info().","deprecated":null},{"type":"method","name":"get_attached_height","type_name":"WebInspector","ident":"webkit_web_inspector_get_attached_height","summary":"Get the height that the inspector view when attached. Get the height that the inspector view should have ...","deprecated":null},{"type":"method","name":"get_auto_load_images","type_name":"Settings","ident":"webkit_settings_get_auto_load_images","summary":"Get the #WebKitSettings:auto-load-images property.","deprecated":null},{"type":"method","name":"get_automation_presentation_type","type_name":"WebView","ident":"webkit_web_view_get_automation_presentation_type","summary":"Get the presentation type of #WebKitWebView when created for automation.","deprecated":null},{"type":"method","name":"get_autoplay_policy","type_name":"WebsitePolicies","ident":"webkit_website_policies_get_autoplay_policy","summary":"Get the #WebKitWebsitePolicies:autoplay property.","deprecated":null},{"type":"method","name":"get_back_forward_list","type_name":"WebView","ident":"webkit_web_view_get_back_forward_list","summary":"Obtains the #WebKitBackForwardList associated with the given #WebKitWebView. The #WebKitBackForwardList is owned by the #WebKitWebView.","deprecated":null},{"type":"method","name":"get_back_item","type_name":"BackForwardList","ident":"webkit_back_forward_list_get_back_item","summary":"Returns the item that precedes the current item.","deprecated":null},{"type":"method","name":"get_back_list","type_name":"BackForwardList","ident":"webkit_back_forward_list_get_back_list","summary":"Obtain the list of items preceding the current one.","deprecated":null},{"type":"method","name":"get_back_list_with_limit","type_name":"BackForwardList","ident":"webkit_back_forward_list_get_back_list_with_limit","summary":"Obtain a list up to some number of items preceding the current one.","deprecated":null},{"type":"method","name":"get_background_color","type_name":"WebView","ident":"webkit_web_view_get_background_color","summary":"Gets the color that is used to draw the @web_view background. Gets the color that is used to ...","deprecated":null},{"type":"method","name":"get_base_cache_directory","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_get_base_cache_directory","summary":"Get the #WebKitWebsiteDataManager:base-cache-directory property.","deprecated":null},{"type":"method","name":"get_base_data_directory","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_get_base_data_directory","summary":"Get the #WebKitWebsiteDataManager:base-data-directory property.","deprecated":null},{"type":"method","name":"get_body","type_name":"Notification","ident":"webkit_notification_get_body","summary":"Obtains the body for the notification.","deprecated":null},{"type":"method","name":"get_cache_model","type_name":"WebContext","ident":"webkit_web_context_get_cache_model","summary":"Returns the current cache model. For more information about this value check the documentation of the function webkit_web_context_set_cache_model().","deprecated":null},{"type":"method","name":"get_camera_capture_state","type_name":"WebView","ident":"webkit_web_view_get_camera_capture_state","summary":"Get the camera capture state of a #WebKitWebView.","deprecated":null},{"type":"method","name":"get_can_attach","type_name":"WebInspector","ident":"webkit_web_inspector_get_can_attach","summary":"Whether the @inspector can be attached to the same window that contains the inspected view.","deprecated":null},{"type":"method","name":"get_category","type_name":"Feature","ident":"webkit_feature_get_category","summary":"Gets the category of the feature. Applications which include user interface to toggle features may want to use ..."},{"type":"method","name":"get_certificate","type_name":"Credential","ident":"webkit_credential_get_certificate","summary":"Get the certificate currently held by this #WebKitCredential."},{"type":"method","name":"get_certificate_pin_flags","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_get_certificate_pin_flags","summary":"Get the #GTlsPasswordFlags of the %WEBKIT_AUTHENTICATION_SCHEME_CLIENT_CERTIFICATE_PIN_REQUESTED authentication challenge.","deprecated":null},{"type":"method","name":"get_consent_optional_features","type_name":"XRPermissionRequest","ident":"webkit_xr_permission_request_get_consent_optional_features","summary":"Gets the optional features that need user consent. These features can be granted by calling webkit_xr_permission_request_set_granted_optional_features() before allowing ...","deprecated":null},{"type":"method","name":"get_consent_required_features","type_name":"XRPermissionRequest","ident":"webkit_xr_permission_request_get_consent_required_features","summary":"Gets the required features that need user consent. These features are automatically granted if the request is allowed ...","deprecated":null},{"type":"method","name":"get_conservative_threshold","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_get_conservative_threshold","summary":"Gets the conservative memory usage threshold."},{"type":"method","name":"get_content_length","type_name":"URIResponse","ident":"webkit_uri_response_get_content_length","summary":"Get the expected content length of the #WebKitURIResponse. It can be 0 if the server provided an incorrect ...","deprecated":null},{"type":"method","name":"get_context","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_context","summary":"Gets the value of the #WebKitHitTestResult:context property.","deprecated":null},{"type":"method","name":"get_context","type_name":"WebView","ident":"webkit_web_view_get_context","summary":"Gets the web context of @web_view.","deprecated":null},{"type":"method","name":"get_cookie_manager","type_name":"NetworkSession","ident":"webkit_network_session_get_cookie_manager","summary":"Get the #WebKitCookieManager of @session.","deprecated":null},{"type":"method","name":"get_cookies","type_name":"CookieManager","ident":"webkit_cookie_manager_get_cookies","summary":"Asynchronously get a list of #SoupCookie from @cookie_manager. Asynchronously get a list of #SoupCookie from @cookie_manager associated with ...","deprecated":null},{"type":"method","name":"get_cookies_finish","type_name":"CookieManager","ident":"webkit_cookie_manager_get_cookies_finish","summary":"Finish an asynchronous operation started with webkit_cookie_manager_get_cookies(). The return value is a #GList of #SoupCookie instances which should ...","deprecated":null},{"type":"method","name":"get_current_domain","type_name":"WebsiteDataAccessPermissionRequest","ident":"webkit_website_data_access_permission_request_get_current_domain","summary":"Get the current domain being browsed.","deprecated":null},{"type":"method","name":"get_current_item","type_name":"BackForwardList","ident":"webkit_back_forward_list_get_current_item","summary":"Returns the current item in @back_forward_list.","deprecated":null},{"type":"method","name":"get_cursive_font_family","type_name":"Settings","ident":"webkit_settings_get_cursive_font_family","summary":"Gets the #WebKitSettings:cursive-font-family property.","deprecated":null},{"type":"method","name":"get_custom_charset","type_name":"WebView","ident":"webkit_web_view_get_custom_charset","summary":"Returns the current custom character encoding name of @web_view.","deprecated":null},{"type":"method","name":"get_data","type_name":"WebResource","ident":"webkit_web_resource_get_data","summary":"Asynchronously get the raw data for @resource. When the operation is finished, @callback will be called. You can ...","deprecated":null},{"type":"method","name":"get_data_finish","type_name":"WebResource","ident":"webkit_web_resource_get_data_finish","summary":"Finish an asynchronous operation started with webkit_web_resource_get_data().","deprecated":null},{"type":"method","name":"get_default_charset","type_name":"Settings","ident":"webkit_settings_get_default_charset","summary":"Gets the #WebKitSettings:default-charset property.","deprecated":null},{"type":"method","name":"get_default_content_security_policy","type_name":"WebView","ident":"webkit_web_view_get_default_content_security_policy","summary":"Gets the configured default Content-Security-Policy.","deprecated":null},{"type":"method","name":"get_default_font_family","type_name":"Settings","ident":"webkit_settings_get_default_font_family","summary":"Gets the #WebKitSettings:default-font-family property.","deprecated":null},{"type":"method","name":"get_default_font_size","type_name":"Settings","ident":"webkit_settings_get_default_font_size","summary":"Gets the #WebKitSettings:default-font-size property.","deprecated":null},{"type":"method","name":"get_default_locale","type_name":"WebExtension","ident":"webkit_web_extension_get_default_locale","summary":"Get the default locale for the extension.","deprecated":null},{"type":"method","name":"get_default_monospace_font_size","type_name":"Settings","ident":"webkit_settings_get_default_monospace_font_size","summary":"Gets the #WebKitSettings:default-monospace-font-size property.","deprecated":null},{"type":"method","name":"get_default_value","type_name":"Feature","ident":"webkit_feature_get_default_value","summary":"Gets whether the feature is enabled by default. The default value may be used by applications which include ..."},{"type":"method","name":"get_destination","type_name":"Download","ident":"webkit_download_get_destination","summary":"Obtains the destination to which the downloaded file will be written. You can connect to #WebKitDownload::created-destination to make ...","deprecated":null},{"type":"method","name":"get_details","type_name":"Feature","ident":"webkit_feature_get_details","summary":"Gets a description for the @feature. The detailed description should be considered an additional clarification on the purpose ..."},{"type":"method","name":"get_dialog_type","type_name":"ScriptDialog","ident":"webkit_script_dialog_get_dialog_type","summary":"Get the dialog type of a #WebKitScriptDialog."},{"type":"method","name":"get_disable_web_security","type_name":"Settings","ident":"webkit_settings_get_disable_web_security","summary":"Get the #WebKitSettings:disable-web-security property.","deprecated":null},{"type":"method","name":"get_display_action_label","type_name":"WebExtension","ident":"webkit_web_extension_get_display_action_label","summary":"Get the localized display action label for the extension. This label serves as a default and should be ...","deprecated":null},{"type":"method","name":"get_display_capture_state","type_name":"WebView","ident":"webkit_web_view_get_display_capture_state","summary":"Get the display capture state of a #WebKitWebView.","deprecated":null},{"type":"method","name":"get_display_description","type_name":"WebExtension","ident":"webkit_web_extension_get_display_description","summary":"Get the localized display description for the extension.","deprecated":null},{"type":"method","name":"get_display_name","type_name":"WebExtension","ident":"webkit_web_extension_get_display_name","summary":"Get the localized name for the extension.","deprecated":null},{"type":"method","name":"get_display_short_name","type_name":"WebExtension","ident":"webkit_web_extension_get_display_short_name","summary":"Get the localized short name for the extension.","deprecated":null},{"type":"method","name":"get_display_version","type_name":"WebExtension","ident":"webkit_web_extension_get_display_version","summary":"Get the localized display version for the extension.","deprecated":null},{"type":"method","name":"get_domain","type_name":"ITPFirstParty","ident":"webkit_itp_first_party_get_domain","summary":"Get the domain name of @itp_first_party."},{"type":"method","name":"get_domain","type_name":"ITPThirdParty","ident":"webkit_itp_third_party_get_domain","summary":"Get the domain name of @itp_third_party."},{"type":"method","name":"get_draw_compositing_indicators","type_name":"Settings","ident":"webkit_settings_get_draw_compositing_indicators","summary":"Get the #WebKitSettings:draw-compositing-indicators property.","deprecated":null},{"type":"method","name":"get_editor_state","type_name":"WebView","ident":"webkit_web_view_get_editor_state","summary":"Gets the web editor state of @web_view.","deprecated":null},{"type":"method","name":"get_elapsed_time","type_name":"Download","ident":"webkit_download_get_elapsed_time","summary":"Gets the elapsed time in seconds, including any fractional part. If the download finished, had an error or ...","deprecated":null},{"type":"method","name":"get_element_rectangle","type_name":"ColorChooserRequest","ident":"webkit_color_chooser_request_get_element_rectangle","summary":"Gets the bounding box of the color input element.","deprecated":null},{"type":"method","name":"get_enable_2d_canvas_acceleration","type_name":"Settings","ident":"webkit_settings_get_enable_2d_canvas_acceleration","summary":"Get the #WebKitSettings:enable-2d-canvas-acceleration property.","deprecated":null},{"type":"method","name":"get_enable_back_forward_navigation_gestures","type_name":"Settings","ident":"webkit_settings_get_enable_back_forward_navigation_gestures","summary":"Get the #WebKitSettings:enable-back-forward-navigation-gestures property.","deprecated":null},{"type":"method","name":"get_enable_caret_browsing","type_name":"Settings","ident":"webkit_settings_get_enable_caret_browsing","summary":"Get the #WebKitSettings:enable-caret-browsing property.","deprecated":null},{"type":"method","name":"get_enable_developer_extras","type_name":"Settings","ident":"webkit_settings_get_enable_developer_extras","summary":"Get the #WebKitSettings:enable-developer-extras property.","deprecated":null},{"type":"method","name":"get_enable_dns_prefetching","type_name":"Settings","ident":"webkit_settings_get_enable_dns_prefetching","summary":"Get the #WebKitSettings:enable-dns-prefetching property.","deprecated":"2.48."},{"type":"method","name":"get_enable_encrypted_media","type_name":"Settings","ident":"webkit_settings_get_enable_encrypted_media","summary":"Get the #WebKitSettings:enable-encrypted-media property.","deprecated":null},{"type":"method","name":"get_enable_fullscreen","type_name":"Settings","ident":"webkit_settings_get_enable_fullscreen","summary":"Get the #WebKitSettings:enable-fullscreen property.","deprecated":null},{"type":"method","name":"get_enable_high_accuracy","type_name":"GeolocationManager","ident":"webkit_geolocation_manager_get_enable_high_accuracy","summary":"Get whether high accuracy is enabled.","deprecated":null},{"type":"method","name":"get_enable_html5_database","type_name":"Settings","ident":"webkit_settings_get_enable_html5_database","summary":"Get the #WebKitSettings:enable-html5-database property.","deprecated":null},{"type":"method","name":"get_enable_html5_local_storage","type_name":"Settings","ident":"webkit_settings_get_enable_html5_local_storage","summary":"Get the #WebKitSettings:enable-html5-local-storage property.","deprecated":null},{"type":"method","name":"get_enable_hyperlink_auditing","type_name":"Settings","ident":"webkit_settings_get_enable_hyperlink_auditing","summary":"Get the #WebKitSettings:enable-hyperlink-auditing property.","deprecated":"2.50."},{"type":"method","name":"get_enable_javascript","type_name":"Settings","ident":"webkit_settings_get_enable_javascript","summary":"Get the #WebKitSettings:enable-javascript property.","deprecated":null},{"type":"method","name":"get_enable_javascript_markup","type_name":"Settings","ident":"webkit_settings_get_enable_javascript_markup","summary":"Get the #WebKitSettings:enable-javascript-markup property.","deprecated":null},{"type":"method","name":"get_enable_media","type_name":"Settings","ident":"webkit_settings_get_enable_media","summary":"Get the #WebKitSettings:enable-media property.","deprecated":null},{"type":"method","name":"get_enable_media_capabilities","type_name":"Settings","ident":"webkit_settings_get_enable_media_capabilities","summary":"Get the #WebKitSettings:enable-media-capabilities property.","deprecated":null},{"type":"method","name":"get_enable_media_stream","type_name":"Settings","ident":"webkit_settings_get_enable_media_stream","summary":"Get the #WebKitSettings:enable-media-stream property.","deprecated":null},{"type":"method","name":"get_enable_mediasource","type_name":"Settings","ident":"webkit_settings_get_enable_mediasource","summary":"Get the #WebKitSettings:enable-mediasource property.","deprecated":null},{"type":"method","name":"get_enable_mock_capture_devices","type_name":"Settings","ident":"webkit_settings_get_enable_mock_capture_devices","summary":"Get the #WebKitSettings:enable-mock-capture-devices property.","deprecated":null},{"type":"method","name":"get_enable_offline_web_application_cache","type_name":"Settings","ident":"webkit_settings_get_enable_offline_web_application_cache","summary":"Get the #WebKitSettings:enable-offline-web-application-cache property.","deprecated":"2.44"},{"type":"method","name":"get_enable_page_cache","type_name":"Settings","ident":"webkit_settings_get_enable_page_cache","summary":"Get the #WebKitSettings:enable-page-cache property.","deprecated":null},{"type":"method","name":"get_enable_resizable_text_areas","type_name":"Settings","ident":"webkit_settings_get_enable_resizable_text_areas","summary":"Get the #WebKitSettings:enable-resizable-text-areas property.","deprecated":null},{"type":"method","name":"get_enable_site_specific_quirks","type_name":"Settings","ident":"webkit_settings_get_enable_site_specific_quirks","summary":"Get the #WebKitSettings:enable-site-specific-quirks property.","deprecated":null},{"type":"method","name":"get_enable_smooth_scrolling","type_name":"Settings","ident":"webkit_settings_get_enable_smooth_scrolling","summary":"Get the #WebKitSettings:enable-smooth-scrolling property.","deprecated":null},{"type":"method","name":"get_enable_spatial_navigation","type_name":"Settings","ident":"webkit_settings_get_enable_spatial_navigation","summary":"Get the #WebKitSettings:enable-spatial-navigation property.","deprecated":null},{"type":"method","name":"get_enable_tabs_to_links","type_name":"Settings","ident":"webkit_settings_get_enable_tabs_to_links","summary":"Get the #WebKitSettings:enable-tabs-to-links property.","deprecated":null},{"type":"method","name":"get_enable_webaudio","type_name":"Settings","ident":"webkit_settings_get_enable_webaudio","summary":"Get the #WebKitSettings:enable-webaudio property.","deprecated":null},{"type":"method","name":"get_enable_webgl","type_name":"Settings","ident":"webkit_settings_get_enable_webgl","summary":"Get the #WebKitSettings:enable-webgl property.","deprecated":null},{"type":"method","name":"get_enable_webrtc","type_name":"Settings","ident":"webkit_settings_get_enable_webrtc","summary":"Get the [property@Settings:enable-webrtc] property.","deprecated":null},{"type":"method","name":"get_enable_write_console_messages_to_stdout","type_name":"Settings","ident":"webkit_settings_get_enable_write_console_messages_to_stdout","summary":"Get the #WebKitSettings:enable-write-console-messages-to-stdout property.","deprecated":null},{"type":"method","name":"get_estimated_load_progress","type_name":"WebView","ident":"webkit_web_view_get_estimated_load_progress","summary":"Gets the value of the #WebKitWebView:estimated-load-progress property. You can monitor the estimated progress of a load operation by ...","deprecated":null},{"type":"method","name":"get_estimated_progress","type_name":"Download","ident":"webkit_download_get_estimated_progress","summary":"Gets the value of the #WebKitDownload:estimated-progress property. Gets the value of the #WebKitDownload:estimated-progress property. You can monitor the estimated ...","deprecated":null},{"type":"method","name":"get_event","type_name":"ContextMenu","ident":"webkit_context_menu_get_event","summary":"Gets the #GdkEvent that triggered the context menu. This function only returns a valid #GdkEvent when called for a ...","deprecated":null},{"type":"method","name":"get_event","type_name":"OptionMenu","ident":"webkit_option_menu_get_event","summary":"Gets the #GdkEvent that triggered the dropdown menu. If @menu was not triggered by a user interaction, like a ...","deprecated":null},{"type":"method","name":"get_fantasy_font_family","type_name":"Settings","ident":"webkit_settings_get_fantasy_font_family","summary":"Gets the #WebKitSettings:fantasy-font-family property.","deprecated":null},{"type":"method","name":"get_favicon","type_name":"FaviconDatabase","ident":"webkit_favicon_database_get_favicon","summary":"Asynchronously obtains a favicon image. Asynchronously obtains an image of the favicon for the given page URI. It ...","deprecated":null},{"type":"method","name":"get_favicon","type_name":"WebView","ident":"webkit_web_view_get_favicon","summary":"Returns favicon currently associated to @web_view. Returns favicon currently associated to @web_view, if any. You can connect to ...","deprecated":null},{"type":"method","name":"get_favicon_database","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_get_favicon_database","summary":"Get the #WebKitFaviconDatabase of @manager.","deprecated":null},{"type":"method","name":"get_favicon_finish","type_name":"FaviconDatabase","ident":"webkit_favicon_database_get_favicon_finish","summary":"Finishes an operation started with webkit_favicon_database_get_favicon().","deprecated":null},{"type":"method","name":"get_favicon_uri","type_name":"FaviconDatabase","ident":"webkit_favicon_database_get_favicon_uri","summary":"Obtains the URI of the favicon for the given @page_uri.","deprecated":null},{"type":"method","name":"get_favicons_enabled","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_get_favicons_enabled","summary":"Get whether website icons are enabled.","deprecated":null},{"type":"method","name":"get_fd_list","type_name":"UserMessage","ident":"webkit_user_message_get_fd_list","summary":"Get the @message list of file descritpor.","deprecated":null},{"type":"method","name":"get_feature_enabled","type_name":"Settings","ident":"webkit_settings_get_feature_enabled","summary":"Gets whether a feature is enabled.","deprecated":null},{"type":"method","name":"get_find_controller","type_name":"WebView","ident":"webkit_web_view_get_find_controller","summary":"Gets the #WebKitFindController. Gets the #WebKitFindController that will allow the caller to query the #WebKitWebView for the text ...","deprecated":null},{"type":"method","name":"get_first_parties","type_name":"ITPThirdParty","ident":"webkit_itp_third_party_get_first_parties","summary":"Get the list of #WebKitITPFirstParty under which @itp_third_party has been seen."},{"type":"method","name":"get_forward_item","type_name":"BackForwardList","ident":"webkit_back_forward_list_get_forward_item","summary":"Returns the item that follows the current item.","deprecated":null},{"type":"method","name":"get_forward_list","type_name":"BackForwardList","ident":"webkit_back_forward_list_get_forward_list","summary":"Obtain the list of items following the current one.","deprecated":null},{"type":"method","name":"get_forward_list_with_limit","type_name":"BackForwardList","ident":"webkit_back_forward_list_get_forward_list_with_limit","summary":"Obtain a list up to some number of items following the current one.","deprecated":null},{"type":"method","name":"get_frame_name","type_name":"NavigationAction","ident":"webkit_navigation_action_get_frame_name","summary":"Gets the @navigation target frame name. For example if navigation was triggered by clicking a link with a target ..."},{"type":"method","name":"get_fullscreen","type_name":"WindowProperties","ident":"webkit_window_properties_get_fullscreen","summary":"Get whether the window should be shown in fullscreen state or not.","deprecated":null},{"type":"method","name":"get_gaction","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_gaction","summary":"Gets the action associated to @item as a #GAction.","deprecated":null},{"type":"method","name":"get_gaction_target","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_gaction_target","summary":"Gets the target #GVariant associated with @item.","deprecated":null},{"type":"method","name":"get_geolocation_manager","type_name":"WebContext","ident":"webkit_web_context_get_geolocation_manager","summary":"Get the #WebKitGeolocationManager of @context.","deprecated":null},{"type":"method","name":"get_geometry","type_name":"WindowProperties","ident":"webkit_window_properties_get_geometry","summary":"Get the geometry the window should have on the screen when shown.","deprecated":null},{"type":"method","name":"get_granted_features","type_name":"XRPermissionRequest","ident":"webkit_xr_permission_request_get_granted_features","summary":"Gets the features requested by the origin for the XR device, which are either granted by default or have ...","deprecated":null},{"type":"method","name":"get_hardware_acceleration_policy","type_name":"Settings","ident":"webkit_settings_get_hardware_acceleration_policy","summary":"Get the #WebKitSettings:hardware-acceleration-policy property.","deprecated":null},{"type":"method","name":"get_has_background_content","type_name":"WebExtension","ident":"webkit_web_extension_get_has_background_content","summary":"Get whether the extension has background content that can run when needed.","deprecated":null},{"type":"method","name":"get_has_commands","type_name":"WebExtension","ident":"webkit_web_extension_get_has_commands","summary":"Get whether the extension includes commands that users can invoke. These commands should be accessible via keyboard shortcuts, ...","deprecated":null},{"type":"method","name":"get_has_content_modification_rules","type_name":"WebExtension","ident":"webkit_web_extension_get_has_content_modification_rules","summary":"Get whether the extension includes rules used for content modification or blocking.","deprecated":null},{"type":"method","name":"get_has_injected_content","type_name":"WebExtension","ident":"webkit_web_extension_get_has_injected_content","summary":"Get whether the extension has script or stylesheet content that can be injected into webpages. Once the extension ...","deprecated":null},{"type":"method","name":"get_has_options_page","type_name":"WebExtension","ident":"webkit_web_extension_get_has_options_page","summary":"Get whether the extension has an options page. The app should provide access to this page through a ...","deprecated":null},{"type":"method","name":"get_has_override_new_tab_page","type_name":"WebExtension","ident":"webkit_web_extension_get_has_override_new_tab_page","summary":"Get whether the extension provides an alternative to the default new tab page. The app should prompt the ...","deprecated":null},{"type":"method","name":"get_has_persistent_background_content","type_name":"WebExtension","ident":"webkit_web_extension_get_has_persistent_background_content","summary":"Get whether the extension has background content that stays in memory as long as the extension is loaded.","deprecated":null},{"type":"method","name":"get_host","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_get_host","summary":"Get the host that this authentication challenge is applicable to.","deprecated":null},{"type":"method","name":"get_host","type_name":"SecurityOrigin","ident":"webkit_security_origin_get_host","summary":"Gets the hostname of @origin. It is reasonable for this to be %NULL if its protocol does not ..."},{"type":"method","name":"get_host","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_get_host","summary":"Gets the host part of the pattern string, unless `webkit_web_extension_match_pattern_get_matches_all_urls` is %TRUE."},{"type":"method","name":"get_http_body","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_get_http_body","summary":"Get the request body.","deprecated":null},{"type":"method","name":"get_http_headers","type_name":"URIRequest","ident":"webkit_uri_request_get_http_headers","summary":"Get the HTTP headers of a #WebKitURIRequest as a #SoupMessageHeaders.","deprecated":null},{"type":"method","name":"get_http_headers","type_name":"URIResponse","ident":"webkit_uri_response_get_http_headers","summary":"Get the HTTP headers of a #WebKitURIResponse as a #SoupMessageHeaders.","deprecated":null},{"type":"method","name":"get_http_headers","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_get_http_headers","summary":"Get the #SoupMessageHeaders of the request.","deprecated":null},{"type":"method","name":"get_http_method","type_name":"URIRequest","ident":"webkit_uri_request_get_http_method","summary":"Get the HTTP method of the #WebKitURIRequest.","deprecated":null},{"type":"method","name":"get_http_method","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_get_http_method","summary":"Get the HTTP method of the @request.","deprecated":null},{"type":"method","name":"get_icon","type_name":"WebExtension","ident":"webkit_web_extension_get_icon","summary":"Returns the extension's icon image for the specified size. This icon should represent the extension in settings or other ...","deprecated":null},{"type":"method","name":"get_id","type_name":"AutomationSession","ident":"webkit_automation_session_get_id","summary":"Get the unique identifier of a #WebKitAutomationSession","deprecated":null},{"type":"method","name":"get_id","type_name":"Notification","ident":"webkit_notification_get_id","summary":"Obtains the unique id for the notification.","deprecated":null},{"type":"method","name":"get_identifier","type_name":"Feature","ident":"webkit_feature_get_identifier","summary":"Gets a string that uniquely identifies the @feature."},{"type":"method","name":"get_identifier","type_name":"UserContentFilter","ident":"webkit_user_content_filter_get_identifier","summary":"Obtain the identifier previously used to save the @user_content_filter. Obtain the identifier previously used to save the @user_content_filter ..."},{"type":"method","name":"get_image_uri","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_image_uri","summary":"Gets the value of the #WebKitHitTestResult:image-uri property.","deprecated":null},{"type":"method","name":"get_input_hints","type_name":"InputMethodContext","ident":"webkit_input_method_context_get_input_hints","summary":"Get the value of the #WebKitInputMethodContext:input-hints property.","deprecated":null},{"type":"method","name":"get_input_method_context","type_name":"WebView","ident":"webkit_web_view_get_input_method_context","summary":"Get the #WebKitInputMethodContext currently in use by @web_view. Get the #WebKitInputMethodContext currently in use by @web_view, or %NULL ...","deprecated":null},{"type":"method","name":"get_input_purpose","type_name":"InputMethodContext","ident":"webkit_input_method_context_get_input_purpose","summary":"Get the value of the #WebKitInputMethodContext:input-purpose property.","deprecated":null},{"type":"method","name":"get_inspected_uri","type_name":"WebInspector","ident":"webkit_web_inspector_get_inspected_uri","summary":"Get the URI that is currently being inspected. This can be %NULL if nothing has been loaded yet ...","deprecated":null},{"type":"method","name":"get_inspector","type_name":"WebView","ident":"webkit_web_view_get_inspector","summary":"Get the #WebKitWebInspector associated to @web_view","deprecated":null},{"type":"method","name":"get_is_muted","type_name":"WebView","ident":"webkit_web_view_get_is_muted","summary":"Gets the mute state of @web_view.","deprecated":null},{"type":"method","name":"get_is_web_process_responsive","type_name":"WebView","ident":"webkit_web_view_get_is_web_process_responsive","summary":"Get whether the current web process of a #WebKitWebView is responsive.","deprecated":null},{"type":"method","name":"get_item","type_name":"OptionMenu","ident":"webkit_option_menu_get_item","summary":"Returns the #WebKitOptionMenuItem at @index in @menu.","deprecated":null},{"type":"method","name":"get_item_at_position","type_name":"ContextMenu","ident":"webkit_context_menu_get_item_at_position","summary":"Gets the item at the given position in the @menu.","deprecated":null},{"type":"method","name":"get_items","type_name":"ContextMenu","ident":"webkit_context_menu_get_items","summary":"Returns the item list of @menu.","deprecated":null},{"type":"method","name":"get_itp_enabled","type_name":"NetworkSession","ident":"webkit_network_session_get_itp_enabled","summary":"Get whether Intelligent Tracking Prevention (ITP) is enabled or not.","deprecated":null},{"type":"method","name":"get_itp_summary","type_name":"NetworkSession","ident":"webkit_network_session_get_itp_summary","summary":"Asynchronously get the list of #WebKitITPThirdParty seen for @session. Every #WebKitITPThirdParty contains the list of #WebKitITPFirstParty under which ...","deprecated":null},{"type":"method","name":"get_itp_summary","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_get_itp_summary","summary":"Asynchronously get the list of #WebKitITPThirdParty seen for @manager. Every #WebKitITPThirdParty contains the list of #WebKitITPFirstParty under which ...","deprecated":null},{"type":"method","name":"get_itp_summary_finish","type_name":"NetworkSession","ident":"webkit_network_session_get_itp_summary_finish","summary":"Finish an asynchronous operation started with webkit_network_session_get_itp_summary().","deprecated":null},{"type":"method","name":"get_itp_summary_finish","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_get_itp_summary_finish","summary":"Finish an asynchronous operation started with webkit_website_data_manager_get_itp_summary().","deprecated":null},{"type":"method","name":"get_javascript_can_access_clipboard","type_name":"Settings","ident":"webkit_settings_get_javascript_can_access_clipboard","summary":"Get the #WebKitSettings:javascript-can-access-clipboard property.","deprecated":null},{"type":"method","name":"get_javascript_can_open_windows_automatically","type_name":"Settings","ident":"webkit_settings_get_javascript_can_open_windows_automatically","summary":"Get the #WebKitSettings:javascript-can-open-windows-automatically property.","deprecated":null},{"type":"method","name":"get_kill_threshold","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_get_kill_threshold","summary":"Gets the kill memory usage threshold."},{"type":"method","name":"get_label","type_name":"OptionMenuItem","ident":"webkit_option_menu_item_get_label","summary":"Get the label of a #WebKitOptionMenuItem."},{"type":"method","name":"get_last_update_time","type_name":"ITPFirstParty","ident":"webkit_itp_first_party_get_last_update_time","summary":"Get the last time a #WebKitITPThirdParty has been seen under @itp_first_party. Each @WebKitITPFirstParty is created by webkit_itp_third_party_get_first_parties() and ..."},{"type":"method","name":"get_length","type_name":"BackForwardList","ident":"webkit_back_forward_list_get_length","summary":"Obtain the amount of items in the list.","deprecated":null},{"type":"method","name":"get_length","type_name":"FeatureList","ident":"webkit_feature_list_get_length","summary":"Gets the number of elements in the feature list."},{"type":"method","name":"get_link_label","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_link_label","summary":"Gets the value of the #WebKitHitTestResult:link-label property.","deprecated":null},{"type":"method","name":"get_link_title","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_link_title","summary":"Gets the value of the #WebKitHitTestResult:link-title property.","deprecated":null},{"type":"method","name":"get_link_uri","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_link_uri","summary":"Gets the value of the #WebKitHitTestResult:link-uri property.","deprecated":null},{"type":"method","name":"get_load_icons_ignoring_image_load_setting","type_name":"Settings","ident":"webkit_settings_get_load_icons_ignoring_image_load_setting","summary":"Setting no longer supported. This function returns %FALSE.","deprecated":"2.42"},{"type":"method","name":"get_locationbar_visible","type_name":"WindowProperties","ident":"webkit_window_properties_get_locationbar_visible","summary":"Get whether the window should have the locationbar visible or not.","deprecated":null},{"type":"method","name":"get_main_resource","type_name":"WebView","ident":"webkit_web_view_get_main_resource","summary":"Return the main resource of @web_view.","deprecated":null},{"type":"method","name":"get_manifest_version","type_name":"WebExtension","ident":"webkit_web_extension_get_manifest_version","summary":"Get the parsed manifest version, or `0` if there is no version specified in the manifest. A [error@WebKit.WebExtensionError.UNSUPPORTED_MANIFEST_VERSION] ...","deprecated":null},{"type":"method","name":"get_matches_all_hosts","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_get_matches_all_hosts","summary":"Gets whether the match pattern matches all host. This happens when the pattern is ``, or if `*` is ..."},{"type":"method","name":"get_matches_all_urls","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_get_matches_all_urls","summary":"Gets whether the match pattern matches all URLs, in other words, whether the pattern is ``."},{"type":"method","name":"get_math_font_family","type_name":"Settings","ident":"webkit_settings_get_math_font_family","summary":"Gets the #WebKitSettings:math-font-family property.","deprecated":null},{"type":"method","name":"get_max_match_count","type_name":"FindController","ident":"webkit_find_controller_get_max_match_count","summary":"Gets the maximum number of matches to report. Gets the maximum number of matches to report during a ...","deprecated":null},{"type":"method","name":"get_media_content_types_requiring_hardware_support","type_name":"Settings","ident":"webkit_settings_get_media_content_types_requiring_hardware_support","summary":"Gets the #WebKitSettings:media-content-types-requiring-hardware-support property.","deprecated":null},{"type":"method","name":"get_media_playback_allows_inline","type_name":"Settings","ident":"webkit_settings_get_media_playback_allows_inline","summary":"Get the #WebKitSettings:media-playback-allows-inline property.","deprecated":null},{"type":"method","name":"get_media_playback_requires_user_gesture","type_name":"Settings","ident":"webkit_settings_get_media_playback_requires_user_gesture","summary":"Get the #WebKitSettings:media-playback-requires-user-gesture property.","deprecated":null},{"type":"method","name":"get_media_uri","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_media_uri","summary":"Gets the value of the #WebKitHitTestResult:media-uri property.","deprecated":null},{"type":"method","name":"get_memory_limit","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_get_memory_limit","summary":"Gets the memory usage limit."},{"type":"method","name":"get_menubar_visible","type_name":"WindowProperties","ident":"webkit_window_properties_get_menubar_visible","summary":"Get whether the window should have the menubar visible or not.","deprecated":null},{"type":"method","name":"get_message","type_name":"ScriptDialog","ident":"webkit_script_dialog_get_message","summary":"Get the message of a #WebKitScriptDialog."},{"type":"method","name":"get_microphone_capture_state","type_name":"WebView","ident":"webkit_web_view_get_microphone_capture_state","summary":"Get the microphone capture state of a #WebKitWebView.","deprecated":null},{"type":"method","name":"get_mime_type","type_name":"URIResponse","ident":"webkit_uri_response_get_mime_type","summary":"Gets the MIME type of the response.","deprecated":null},{"type":"method","name":"get_mime_types","type_name":"FileChooserRequest","ident":"webkit_file_chooser_request_get_mime_types","summary":"Get the list of MIME types the file chooser dialog should handle. Get the list of MIME types ...","deprecated":null},{"type":"method","name":"get_mime_types_filter","type_name":"FileChooserRequest","ident":"webkit_file_chooser_request_get_mime_types_filter","summary":"Get the filter currently associated with the request. Get the filter currently associated with the request, ready to ...","deprecated":null},{"type":"method","name":"get_minimum_font_size","type_name":"Settings","ident":"webkit_settings_get_minimum_font_size","summary":"Gets the #WebKitSettings:minimum-font-size property.","deprecated":null},{"type":"method","name":"get_modifiers","type_name":"NavigationAction","ident":"webkit_navigation_action_get_modifiers","summary":"Return the modifier keys. Return a bitmask of #GdkModifierType values describing the modifier keys that were in effect ..."},{"type":"method","name":"get_monospace_font_family","type_name":"Settings","ident":"webkit_settings_get_monospace_font_family","summary":"Gets the #WebKitSettings:monospace-font-family property.","deprecated":null},{"type":"method","name":"get_mouse_button","type_name":"NavigationAction","ident":"webkit_navigation_action_get_mouse_button","summary":"Return the number of the mouse button that triggered the navigation. Return the number of the mouse button ..."},{"type":"method","name":"get_n_items","type_name":"ContextMenu","ident":"webkit_context_menu_get_n_items","summary":"Gets the length of the @menu.","deprecated":null},{"type":"method","name":"get_n_items","type_name":"OptionMenu","ident":"webkit_option_menu_get_n_items","summary":"Gets the length of the @menu.","deprecated":null},{"type":"method","name":"get_name","type_name":"UserMessage","ident":"webkit_user_message_get_name","summary":"Get the @message name.","deprecated":null},{"type":"method","name":"get_name","type_name":"ApplicationInfo","ident":"webkit_application_info_get_name","summary":"Get the name of the application. If webkit_application_info_set_name() hasn't been called with a valid name, this returns g_get_prgname()."},{"type":"method","name":"get_name","type_name":"Feature","ident":"webkit_feature_get_name","summary":"Gets a short name for the @feature. The returned string is suitable to be displayed to end users, ..."},{"type":"method","name":"get_name","type_name":"PermissionStateQuery","ident":"webkit_permission_state_query_get_name","summary":"Get the permission name for which access is being queried."},{"type":"method","name":"get_name","type_name":"WebsiteData","ident":"webkit_website_data_get_name","summary":"Gets the name of #WebKitWebsiteData. This is the website name, normally represented by a domain or host name. ..."},{"type":"method","name":"get_navigation_action","type_name":"NavigationPolicyDecision","ident":"webkit_navigation_policy_decision_get_navigation_action","summary":"Gets the value of the #WebKitNavigationPolicyDecision:navigation-action property.","deprecated":null},{"type":"method","name":"get_navigation_type","type_name":"NavigationAction","ident":"webkit_navigation_action_get_navigation_type","summary":"Return the type of action that triggered the navigation."},{"type":"method","name":"get_network_session","type_name":"WebView","ident":"webkit_web_view_get_network_session","summary":"Get the #WebKitNetworkSession associated to @web_view.","deprecated":null},{"type":"method","name":"get_network_session_for_automation","type_name":"WebContext","ident":"webkit_web_context_get_network_session_for_automation","summary":"Get the #WebKitNetworkSession used for automation sessions started in @context.","deprecated":null},{"type":"method","name":"get_nth_item","type_name":"BackForwardList","ident":"webkit_back_forward_list_get_nth_item","summary":"Returns the item at a given index relative to the current item.","deprecated":null},{"type":"method","name":"get_optional_features_requested","type_name":"XRPermissionRequest","ident":"webkit_xr_permission_request_get_optional_features_requested","summary":"Gets the full set of optional features requested by the web application. This includes both already granted features ...","deprecated":null},{"type":"method","name":"get_optional_permission_match_patterns","type_name":"WebExtension","ident":"webkit_web_extension_get_optional_permission_match_patterns","summary":"Get the set of websites that the extension may need access to for optional functionality. These match patterns can ...","deprecated":null},{"type":"method","name":"get_optional_permissions","type_name":"WebExtension","ident":"webkit_web_extension_get_optional_permissions","summary":"Get the set of permissions that the extension may need for optional functionality. These permissions can be requested by ...","deprecated":null},{"type":"method","name":"get_options","type_name":"FindController","ident":"webkit_find_controller_get_options","summary":"Gets the #WebKitFindOptions for the current search. Gets a bitmask containing the #WebKitFindOptions associated with the current search.","deprecated":null},{"type":"method","name":"get_original_uri","type_name":"BackForwardListItem","ident":"webkit_back_forward_list_item_get_original_uri","summary":"Obtain the original URI of the item. See also webkit_back_forward_list_item_get_uri().","deprecated":null},{"type":"method","name":"get_page_id","type_name":"WebView","ident":"webkit_web_view_get_page_id","summary":"Get the identifier of the #WebKitWebPage corresponding to the #WebKitWebView","deprecated":null},{"type":"method","name":"get_page_setup","type_name":"PrintOperation","ident":"webkit_print_operation_get_page_setup","summary":"Return the current page setup of @print_operation. It returns %NULL until either webkit_print_operation_set_page_setup() or webkit_print_operation_run_dialog() have been called.","deprecated":null},{"type":"method","name":"get_parameters","type_name":"UserMessage","ident":"webkit_user_message_get_parameters","summary":"Get the @message parameters.","deprecated":null},{"type":"method","name":"get_password","type_name":"Credential","ident":"webkit_credential_get_password","summary":"Get the password currently held by this #WebKitCredential."},{"type":"method","name":"get_path","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_get_path","summary":"Get the URI path of @request.","deprecated":null},{"type":"method","name":"get_path","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_get_path","summary":"Gets the storage path for user content filters.","deprecated":null},{"type":"method","name":"get_path","type_name":"WebExtension","ident":"webkit_web_extension_get_path","summary":"Get the path pointing to the folder containing the extension manifest and resources","deprecated":null},{"type":"method","name":"get_path","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_get_path","summary":"Gets the path part of the pattern string, unless [method@WebExtensionMatchPattern.get_matches_all_urls] is %TRUE."},{"type":"method","name":"get_persistence","type_name":"Credential","ident":"webkit_credential_get_persistence","summary":"Get the persistence mode currently held by this #WebKitCredential."},{"type":"method","name":"get_persistent_credential_storage_enabled","type_name":"NetworkSession","ident":"webkit_network_session_get_persistent_credential_storage_enabled","summary":"Get whether persistent credential storage is enabled or not. See also webkit_network_session_set_persistent_credential_storage_enabled().","deprecated":null},{"type":"method","name":"get_pictograph_font_family","type_name":"Settings","ident":"webkit_settings_get_pictograph_font_family","summary":"Gets the #WebKitSettings:pictograph-font-family property.","deprecated":null},{"type":"method","name":"get_poll_interval","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_get_poll_interval","summary":"Gets the interval at which memory usage is checked."},{"type":"method","name":"get_port","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_get_port","summary":"Get the port that this authentication challenge is applicable to.","deprecated":null},{"type":"method","name":"get_port","type_name":"SecurityOrigin","ident":"webkit_security_origin_get_port","summary":"Gets the port of @origin. This function will always return 0 if the port is the default port ..."},{"type":"method","name":"get_position","type_name":"ContextMenu","ident":"webkit_context_menu_get_position","summary":"Gets the position in view coordinates where the context menu was triggered. This function only returns valid coordinates ...","deprecated":null},{"type":"method","name":"get_preedit","type_name":"InputMethodContext","ident":"webkit_input_method_context_get_preedit","summary":"Get the pre-edit string and a list of WebKitInputMethodUnderline. Get the current pre-edit string for the @context, and ...","deprecated":null},{"type":"method","name":"get_print_backgrounds","type_name":"Settings","ident":"webkit_settings_get_print_backgrounds","summary":"Get the #WebKitSettings:print-backgrounds property.","deprecated":null},{"type":"method","name":"get_print_settings","type_name":"PrintOperation","ident":"webkit_print_operation_get_print_settings","summary":"Return the current print settings of @print_operation. It returns %NULL until either webkit_print_operation_set_print_settings() or webkit_print_operation_run_dialog() have been called.","deprecated":null},{"type":"method","name":"get_proposed_credential","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_get_proposed_credential","summary":"Get the #WebKitCredential of the proposed authentication challenge. Get the #WebKitCredential of the proposed authentication challenge that was ...","deprecated":null},{"type":"method","name":"get_protocol","type_name":"SecurityOrigin","ident":"webkit_security_origin_get_protocol","summary":"Gets the protocol of @origin."},{"type":"method","name":"get_realm","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_get_realm","summary":"Get the realm that this authentication challenge is applicable to.","deprecated":null},{"type":"method","name":"get_received_data_length","type_name":"Download","ident":"webkit_download_get_received_data_length","summary":"Gets the length of the data already downloaded for @download. Gets the length of the data already downloaded ...","deprecated":null},{"type":"method","name":"get_request","type_name":"Download","ident":"webkit_download_get_request","summary":"Retrieves the #WebKitURIRequest object that backs the download process.","deprecated":null},{"type":"method","name":"get_request","type_name":"ResponsePolicyDecision","ident":"webkit_response_policy_decision_get_request","summary":"Return the #WebKitURIRequest associated with the response decision. Modifications to the returned object are not taken into account ...","deprecated":null},{"type":"method","name":"get_request","type_name":"NavigationAction","ident":"webkit_navigation_action_get_request","summary":"Return the #WebKitURIRequest associated with the navigation action. Modifications to the returned object are not taken into account ..."},{"type":"method","name":"get_requested_permission_match_patterns","type_name":"WebExtension","ident":"webkit_web_extension_get_requested_permission_match_patterns","summary":"Get the set of websites that the extension requires access to for its base functionality.","deprecated":null},{"type":"method","name":"get_requested_permissions","type_name":"WebExtension","ident":"webkit_web_extension_get_requested_permissions","summary":"Get the set of permissions that the extension requires for its base functionality.","deprecated":null},{"type":"method","name":"get_requesting_domain","type_name":"WebsiteDataAccessPermissionRequest","ident":"webkit_website_data_access_permission_request_get_requesting_domain","summary":"Get the domain requesting permission to access its cookies while browsing the current domain.","deprecated":null},{"type":"method","name":"get_required_features_requested","type_name":"XRPermissionRequest","ident":"webkit_xr_permission_request_get_required_features_requested","summary":"Gets the full set of required features requested by the web application. This includes both already granted features ...","deprecated":null},{"type":"method","name":"get_resizable","type_name":"WindowProperties","ident":"webkit_window_properties_get_resizable","summary":"Get whether the window should be resizable by the user or not.","deprecated":null},{"type":"method","name":"get_response","type_name":"Download","ident":"webkit_download_get_response","summary":"Retrieves the #WebKitURIResponse object that backs the download process. Retrieves the #WebKitURIResponse object that backs the download process. ...","deprecated":null},{"type":"method","name":"get_response","type_name":"ResponsePolicyDecision","ident":"webkit_response_policy_decision_get_response","summary":"Gets the value of the #WebKitResponsePolicyDecision:response property.","deprecated":null},{"type":"method","name":"get_response","type_name":"WebResource","ident":"webkit_web_resource_get_response","summary":"Retrieves the #WebKitURIResponse of the resource load operation. This method returns %NULL if called before the response is ...","deprecated":null},{"type":"method","name":"get_rgba","type_name":"ColorChooserRequest","ident":"webkit_color_chooser_request_get_rgba","summary":"Gets the current #GdkRGBA color of @request","deprecated":null},{"type":"method","name":"get_sans_serif_font_family","type_name":"Settings","ident":"webkit_settings_get_sans_serif_font_family","summary":"Gets the #WebKitSettings:sans-serif-font-family property.","deprecated":null},{"type":"method","name":"get_scheme","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_get_scheme","summary":"Get the authentication scheme of the authentication challenge.","deprecated":null},{"type":"method","name":"get_scheme","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_get_scheme","summary":"Get the URI scheme of @request.","deprecated":null},{"type":"method","name":"get_scheme","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_get_scheme","summary":"Gets the scheme part of the pattern string, unless `webkit_web_extension_match_pattern_get_matches_all_urls` is %TRUE."},{"type":"method","name":"get_scrollbars_visible","type_name":"WindowProperties","ident":"webkit_window_properties_get_scrollbars_visible","summary":"Get whether the window should have the scrollbars visible or not.","deprecated":null},{"type":"method","name":"get_search_text","type_name":"FindController","ident":"webkit_find_controller_get_search_text","summary":"Gets the text that @find_controller is searching for. Gets the text that @find_controller is currently searching for. This ...","deprecated":null},{"type":"method","name":"get_security_manager","type_name":"WebContext","ident":"webkit_web_context_get_security_manager","summary":"Get the #WebKitSecurityManager of @context.","deprecated":null},{"type":"method","name":"get_security_origin","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_get_security_origin","summary":"Get the #WebKitSecurityOrigin that this authentication challenge is applicable to.","deprecated":null},{"type":"method","name":"get_security_origin","type_name":"XRPermissionRequest","ident":"webkit_xr_permission_request_get_security_origin","summary":"Gets the security origin that initiated the permission request.","deprecated":null},{"type":"method","name":"get_security_origin","type_name":"PermissionStateQuery","ident":"webkit_permission_state_query_get_security_origin","summary":"Get the permission origin for which access is being queried."},{"type":"method","name":"get_select_multiple","type_name":"FileChooserRequest","ident":"webkit_file_chooser_request_get_select_multiple","summary":"Whether the file chooser should allow selecting multiple files. Determine whether the file chooser associated to this #WebKitFileChooserRequest ...","deprecated":null},{"type":"method","name":"get_selected_files","type_name":"FileChooserRequest","ident":"webkit_file_chooser_request_get_selected_files","summary":"Get the list of selected files associated to the request. Get the list of selected files currently associated ...","deprecated":null},{"type":"method","name":"get_serif_font_family","type_name":"Settings","ident":"webkit_settings_get_serif_font_family","summary":"Gets the #WebKitSettings:serif-font-family property.","deprecated":null},{"type":"method","name":"get_session_mode","type_name":"XRPermissionRequest","ident":"webkit_xr_permission_request_get_session_mode","summary":"Gets the session mode for which permission is being requested.","deprecated":null},{"type":"method","name":"get_session_state","type_name":"WebView","ident":"webkit_web_view_get_session_state","summary":"Gets the current session state of @web_view","deprecated":null},{"type":"method","name":"get_settings","type_name":"WebView","ident":"webkit_web_view_get_settings","summary":"Gets the #WebKitSettings currently applied to @web_view. If no other #WebKitSettings have been explicitly applied to @web_view with ...","deprecated":null},{"type":"method","name":"get_size","type_name":"WebsiteData","ident":"webkit_website_data_get_size","summary":"Gets the size of the data of types @types in a #WebKitWebsiteData. Note that currently the data size ..."},{"type":"method","name":"get_snapshot","type_name":"WebView","ident":"webkit_web_view_get_snapshot","summary":"Asynchronously retrieves a snapshot of @web_view for @region. @options specifies how the snapshot should be rendered. When ...","deprecated":null},{"type":"method","name":"get_snapshot_finish","type_name":"WebView","ident":"webkit_web_view_get_snapshot_finish","summary":"Finishes an asynchronous operation started with webkit_web_view_get_snapshot(), producing an image of the snapshot using the BGRA8888 pixel format.","deprecated":null},{"type":"method","name":"get_spell_checking_enabled","type_name":"WebContext","ident":"webkit_web_context_get_spell_checking_enabled","summary":"Get whether spell checking feature is currently enabled.","deprecated":null},{"type":"method","name":"get_spell_checking_languages","type_name":"WebContext","ident":"webkit_web_context_get_spell_checking_languages","summary":"Get the the list of spell checking languages. Get the the list of spell checking languages associated with ...","deprecated":null},{"type":"method","name":"get_status","type_name":"Feature","ident":"webkit_feature_get_status","summary":"Gets the status of the feature."},{"type":"method","name":"get_status_code","type_name":"URIResponse","ident":"webkit_uri_response_get_status_code","summary":"Get the status code of the #WebKitURIResponse. Get the status code of the #WebKitURIResponse as returned by the ...","deprecated":null},{"type":"method","name":"get_statusbar_visible","type_name":"WindowProperties","ident":"webkit_window_properties_get_statusbar_visible","summary":"Get whether the window should have the statusbar visible or not.","deprecated":null},{"type":"method","name":"get_stock_action","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_stock_action","summary":"Gets the #WebKitContextMenuAction of @item. If the #WebKitContextMenuItem was not created for a stock action %WEBKIT_CONTEXT_MENU_ACTION_CUSTOM will be ...","deprecated":null},{"type":"method","name":"get_strict_threshold","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_get_strict_threshold","summary":"Gets the strict memory usage threshold."},{"type":"method","name":"get_string","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_get_string","summary":"Gets the original pattern string."},{"type":"method","name":"get_submenu","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_submenu","summary":"Gets the submenu of @item.","deprecated":null},{"type":"method","name":"get_suggested_filename","type_name":"URIResponse","ident":"webkit_uri_response_get_suggested_filename","summary":"Get the suggested filename for @response. Get the suggested filename for @response, as specified by the 'Content-Disposition' HTTP ...","deprecated":null},{"type":"method","name":"get_tag","type_name":"Notification","ident":"webkit_notification_get_tag","summary":"Obtains the tag identifier for the notification.","deprecated":null},{"type":"method","name":"get_theme_color","type_name":"WebView","ident":"webkit_web_view_get_theme_color","summary":"Gets the theme color that is specified by the content in the @web_view. If the @web_view doesn't have a ...","deprecated":null},{"type":"method","name":"get_time_zone_override","type_name":"WebContext","ident":"webkit_web_context_get_time_zone_override","summary":"Get the #WebKitWebContext:time-zone-override property.","deprecated":null},{"type":"method","name":"get_title","type_name":"BackForwardListItem","ident":"webkit_back_forward_list_item_get_title","summary":"Obtain the title of the item.","deprecated":null},{"type":"method","name":"get_title","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_title","summary":"Gets the title of @item.","deprecated":null},{"type":"method","name":"get_title","type_name":"Notification","ident":"webkit_notification_get_title","summary":"Obtains the title for the notification.","deprecated":null},{"type":"method","name":"get_title","type_name":"WebView","ident":"webkit_web_view_get_title","summary":"Gets the value of the #WebKitWebView:title property. You can connect to notify::title signal of @web_view to be notified ...","deprecated":null},{"type":"method","name":"get_tls_errors_policy","type_name":"NetworkSession","ident":"webkit_network_session_get_tls_errors_policy","summary":"Get the TLS errors policy of @session.","deprecated":null},{"type":"method","name":"get_tls_info","type_name":"WebView","ident":"webkit_web_view_get_tls_info","summary":"Retrieves the #GTlsCertificate associated with the main resource of @web_view. Retrieves the #GTlsCertificate associated with the main resource ...","deprecated":null},{"type":"method","name":"get_toolbar_visible","type_name":"WindowProperties","ident":"webkit_window_properties_get_toolbar_visible","summary":"Get whether the window should have the toolbar visible or not.","deprecated":null},{"type":"method","name":"get_tooltip","type_name":"OptionMenuItem","ident":"webkit_option_menu_item_get_tooltip","summary":"Get the tooltip of a #WebKitOptionMenuItem."},{"type":"method","name":"get_types","type_name":"WebsiteData","ident":"webkit_website_data_get_types","summary":"Gets the types of data stored in the client for a #WebKitWebsiteData. These are the types actually present, ..."},{"type":"method","name":"get_typing_attributes","type_name":"EditorState","ident":"webkit_editor_state_get_typing_attributes","summary":"Gets the typing attributes at the current cursor position. If there is a selection, this returns the typing ...","deprecated":null},{"type":"method","name":"get_uri","type_name":"BackForwardListItem","ident":"webkit_back_forward_list_item_get_uri","summary":"Obtain the URI of the item. This URI may differ from the original URI if the page was, ...","deprecated":null},{"type":"method","name":"get_uri","type_name":"URIRequest","ident":"webkit_uri_request_get_uri","summary":"Obtains the request URI.","deprecated":null},{"type":"method","name":"get_uri","type_name":"URIResponse","ident":"webkit_uri_response_get_uri","summary":"Gets the URI which resulted in the response.","deprecated":null},{"type":"method","name":"get_uri","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_get_uri","summary":"Get the URI of @request.","deprecated":null},{"type":"method","name":"get_uri","type_name":"WebResource","ident":"webkit_web_resource_get_uri","summary":"Returns the current active URI of @resource. The active URI might change during a load operation: ...","deprecated":null},{"type":"method","name":"get_uri","type_name":"WebView","ident":"webkit_web_view_get_uri","summary":"Returns the current active URI of @web_view. The active URI might change during a load operation: ...","deprecated":null},{"type":"method","name":"get_user_agent","type_name":"Settings","ident":"webkit_settings_get_user_agent","summary":"Get the #WebKitSettings:user-agent property.","deprecated":null},{"type":"method","name":"get_user_content_manager","type_name":"WebView","ident":"webkit_web_view_get_user_content_manager","summary":"Gets the user content manager associated to @web_view.","deprecated":null},{"type":"method","name":"get_user_data","type_name":"ContextMenu","ident":"webkit_context_menu_get_user_data","summary":"Gets the user data of @menu. This function can be used from the UI Process to get user ...","deprecated":null},{"type":"method","name":"get_username","type_name":"Credential","ident":"webkit_credential_get_username","summary":"Get the username currently held by this #WebKitCredential."},{"type":"method","name":"get_version","type_name":"WebExtension","ident":"webkit_web_extension_get_version","summary":"Get the version for the extension.","deprecated":null},{"type":"method","name":"get_version","type_name":"ApplicationInfo","ident":"webkit_application_info_get_version","summary":"Get the application version previously set with webkit_application_info_set_version()."},{"type":"method","name":"get_web_extension_mode","type_name":"WebView","ident":"webkit_web_view_get_web_extension_mode","summary":"Get the view's #WebKitWebExtensionMode.","deprecated":null},{"type":"method","name":"get_web_view","type_name":"Download","ident":"webkit_download_get_web_view","summary":"Get the #WebKitWebView that initiated the download.","deprecated":null},{"type":"method","name":"get_web_view","type_name":"FindController","ident":"webkit_find_controller_get_web_view","summary":"Gets the #WebKitWebView this find controller is associated to. Do not dereference the returned instance as it belongs ...","deprecated":null},{"type":"method","name":"get_web_view","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_get_web_view","summary":"Get the #WebKitWebView that initiated the request.","deprecated":null},{"type":"method","name":"get_web_view","type_name":"WebInspector","ident":"webkit_web_inspector_get_web_view","summary":"Get the #WebKitWebViewBase used to display the inspector. This might be %NULL if the inspector hasn't been loaded ...","deprecated":null},{"type":"method","name":"get_webrtc_udp_ports_range","type_name":"Settings","ident":"webkit_settings_get_webrtc_udp_ports_range","summary":"Get the [property@Settings:webrtc-udp-ports-range] property.","deprecated":null},{"type":"method","name":"get_website_data_access_allowed","type_name":"ITPFirstParty","ident":"webkit_itp_first_party_get_website_data_access_allowed","summary":"Get whether @itp_first_party has granted website data access to its #WebKitITPThirdParty. Each @WebKitITPFirstParty is created by webkit_itp_third_party_get_first_parties() and ..."},{"type":"method","name":"get_website_data_manager","type_name":"NetworkSession","ident":"webkit_network_session_get_website_data_manager","summary":"Get the #WebKitWebsiteDataManager of @session.","deprecated":null},{"type":"method","name":"get_website_policies","type_name":"WebView","ident":"webkit_web_view_get_website_policies","summary":"Gets the default website policies. Gets the default website policies set on construction in the @web_view. These can ...","deprecated":null},{"type":"method","name":"get_window_properties","type_name":"WebView","ident":"webkit_web_view_get_window_properties","summary":"Get the #WebKitWindowProperties object. Get the #WebKitWindowProperties object containing the properties that the window containing @web_view should have.","deprecated":null},{"type":"method","name":"get_zoom_level","type_name":"WebView","ident":"webkit_web_view_get_zoom_level","summary":"Set the zoom level of @web_view. Get the zoom level of @web_view, i.e. the factor by which the ...","deprecated":null},{"type":"method","name":"get_zoom_text_only","type_name":"Settings","ident":"webkit_settings_get_zoom_text_only","summary":"Get the #WebKitSettings:zoom-text-only property.","deprecated":null},{"type":"method","name":"go_back","type_name":"WebView","ident":"webkit_web_view_go_back","summary":"Loads the previous history item. You can monitor the load operation by connecting to #WebKitWebView::load-changed signal.","deprecated":null},{"type":"method","name":"go_forward","type_name":"WebView","ident":"webkit_web_view_go_forward","summary":"Loads the next history item. You can monitor the load operation by connecting to #WebKitWebView::load-changed signal.","deprecated":null},{"type":"method","name":"go_to_back_forward_list_item","type_name":"WebView","ident":"webkit_web_view_go_to_back_forward_list_item","summary":"Loads the specific history item @list_item. You can monitor the load operation by connecting to #WebKitWebView::load-changed signal.","deprecated":null},{"type":"method","name":"has_password","type_name":"Credential","ident":"webkit_credential_has_password","summary":"Determine whether this credential has a password stored."},{"type":"method","name":"ignore","type_name":"PolicyDecision","ident":"webkit_policy_decision_ignore","summary":"#WebKitResponsePolicyDecision, this would cancel the request. Ignore the action which triggered this decision. For instance, for a #WebKitResponsePolicyDecision, ...","deprecated":null},{"type":"method","name":"initialize_notification_permissions","type_name":"WebContext","ident":"webkit_web_context_initialize_notification_permissions","summary":"Sets initial desktop notification permissions for the @context. @allowed_origins and @disallowed_origins must each be #GList of #WebKitSecurityOrigin objects ...","deprecated":null},{"type":"method","name":"insert","type_name":"ContextMenu","ident":"webkit_context_menu_insert","summary":"Inserts @item into the @menu at the given position. If @position is negative, or is larger than the ...","deprecated":null},{"type":"method","name":"is_attached","type_name":"WebInspector","ident":"webkit_web_inspector_is_attached","summary":"Whether the @inspector view is currently attached to the same window that contains the inspected view.","deprecated":null},{"type":"method","name":"is_automation_allowed","type_name":"WebContext","ident":"webkit_web_context_is_automation_allowed","summary":"Get whether automation is allowed in @context. See also webkit_web_context_set_automation_allowed().","deprecated":null},{"type":"method","name":"is_controlled_by_automation","type_name":"WebView","ident":"webkit_web_view_is_controlled_by_automation","summary":"Get whether a #WebKitWebView was created with #WebKitWebView:is-controlled-by-automation property enabled. Only #WebKitWebViews controlled by automation can be used ...","deprecated":null},{"type":"method","name":"is_copy_available","type_name":"EditorState","ident":"webkit_editor_state_is_copy_available","summary":"Gets whether a copy command can be issued.","deprecated":null},{"type":"method","name":"is_cut_available","type_name":"EditorState","ident":"webkit_editor_state_is_cut_available","summary":"Gets whether a cut command can be issued.","deprecated":null},{"type":"method","name":"is_editable","type_name":"WebView","ident":"webkit_web_view_is_editable","summary":"Gets whether the user is allowed to edit the HTML document. When @web_view is not editable an element ...","deprecated":null},{"type":"method","name":"is_enabled","type_name":"OptionMenuItem","ident":"webkit_option_menu_item_is_enabled","summary":"Whether a #WebKitOptionMenuItem is enabled."},{"type":"method","name":"is_ephemeral","type_name":"NetworkSession","ident":"webkit_network_session_is_ephemeral","summary":"Get whether @session is ephemeral. A #WebKitNetworkSession is ephemeral when its #WebKitWebsiteDataManager is ephemeral. See #WebKitWebsiteDataManager:is-ephemeral for more details.","deprecated":null},{"type":"method","name":"is_ephemeral","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_is_ephemeral","summary":"Get whether a #WebKitWebsiteDataManager is ephemeral. See #WebKitWebsiteDataManager:is-ephemeral for more details.","deprecated":null},{"type":"method","name":"is_for_proxy","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_is_for_proxy","summary":"Determine whether the authentication challenge is associated with a proxy server. Determine whether the authentication challenge is associated ...","deprecated":null},{"type":"method","name":"is_group_child","type_name":"OptionMenuItem","ident":"webkit_option_menu_item_is_group_child","summary":"Whether a #WebKitOptionMenuItem is a group child."},{"type":"method","name":"is_group_label","type_name":"OptionMenuItem","ident":"webkit_option_menu_item_is_group_label","summary":"Whether a #WebKitOptionMenuItem is a group label."},{"type":"method","name":"is_immersive_mode_enabled","type_name":"WebView","ident":"webkit_web_view_is_immersive_mode_enabled","summary":"Gets whether @web_view is in immersive mode. An immersive session is a mode in which the user is ...","deprecated":null},{"type":"method","name":"is_loading","type_name":"WebView","ident":"webkit_web_view_is_loading","summary":"Gets the value of the #WebKitWebView:is-loading property. You can monitor when a #WebKitWebView is loading a page by ...","deprecated":null},{"type":"method","name":"is_main_frame_main_resource","type_name":"ResponsePolicyDecision","ident":"webkit_response_policy_decision_is_main_frame_main_resource","summary":"Gets whether the request is the main frame main resource","deprecated":null},{"type":"method","name":"is_mime_type_supported","type_name":"ResponsePolicyDecision","ident":"webkit_response_policy_decision_is_mime_type_supported","summary":"Gets whether the MIME type of the response can be displayed in the #WebKitWebView. Gets whether the MIME ...","deprecated":null},{"type":"method","name":"is_paste_available","type_name":"EditorState","ident":"webkit_editor_state_is_paste_available","summary":"Gets whether a paste command can be issued.","deprecated":null},{"type":"method","name":"is_playing_audio","type_name":"WebView","ident":"webkit_web_view_is_playing_audio","summary":"Gets the value of the #WebKitWebView:is-playing-audio property. You can monitor when a page in a #WebKitWebView is playing ...","deprecated":null},{"type":"method","name":"is_redirect","type_name":"NavigationAction","ident":"webkit_navigation_action_is_redirect","summary":"Returns whether the @navigation was redirected."},{"type":"method","name":"is_redo_available","type_name":"EditorState","ident":"webkit_editor_state_is_redo_available","summary":"Gets whether a redo command can be issued.","deprecated":null},{"type":"method","name":"is_retry","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_is_retry","summary":"Determine whether this this is a first attempt or a retry for this authentication challenge.","deprecated":null},{"type":"method","name":"is_selected","type_name":"OptionMenuItem","ident":"webkit_option_menu_item_is_selected","summary":"Whether a #WebKitOptionMenuItem is the currently selected one."},{"type":"method","name":"is_separator","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_is_separator","summary":"Checks whether @item is a separator.","deprecated":null},{"type":"method","name":"is_undo_available","type_name":"EditorState","ident":"webkit_editor_state_is_undo_available","summary":"Gets whether an undo command can be issued.","deprecated":null},{"type":"method","name":"is_user_gesture","type_name":"NavigationAction","ident":"webkit_navigation_action_is_user_gesture","summary":"Return whether the navigation was triggered by a user gesture like a mouse click."},{"type":"method","name":"last","type_name":"ContextMenu","ident":"webkit_context_menu_last","summary":"Gets the last item in the @menu.","deprecated":null},{"type":"method","name":"leave_immersive_mode","type_name":"WebView","ident":"webkit_web_view_leave_immersive_mode","summary":"Requests to leave the immersive mode this #WebKitWebView is in. Users interact with web content to start XR ...","deprecated":null},{"type":"method","name":"list_text_fields","type_name":"FormSubmissionRequest","ident":"webkit_form_submission_request_list_text_fields","summary":"Get lists of the text fields contained in the form associated to @request. Get lists with the names ...","deprecated":null},{"type":"method","name":"load","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_load","summary":"Asynchronously load a content filter given its @identifier. The filter must have been previously stored using webkit_user_content_filter_store_save(). ...","deprecated":null},{"type":"method","name":"load_alternate_html","type_name":"WebView","ident":"webkit_web_view_load_alternate_html","summary":"Load the given @content string for the URI @content_uri. This allows clients to display page-loading errors in the ...","deprecated":null},{"type":"method","name":"load_bytes","type_name":"WebView","ident":"webkit_web_view_load_bytes","summary":"Load the specified @bytes into @web_view using the given @mime_type and @encoding. When @mime_type is %NULL, it defaults ...","deprecated":null},{"type":"method","name":"load_finish","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_load_finish","summary":"Finishes an asynchronous filter load previously started with webkit_user_content_filter_store_load().","deprecated":null},{"type":"method","name":"load_html","type_name":"WebView","ident":"webkit_web_view_load_html","summary":"Load the given @content string with the specified @base_uri. If @base_uri is not %NULL, relative URLs in the ...","deprecated":null},{"type":"method","name":"load_plain_text","type_name":"WebView","ident":"webkit_web_view_load_plain_text","summary":"Load the specified @plain_text string into @web_view. The mime type of document will be \"text/plain\". You can monitor ...","deprecated":null},{"type":"method","name":"load_request","type_name":"WebView","ident":"webkit_web_view_load_request","summary":"Requests loading of the specified #WebKitURIRequest. You can monitor the load operation by connecting to #WebKitWebView::load-changed signal.","deprecated":null},{"type":"method","name":"load_uri","type_name":"WebView","ident":"webkit_web_view_load_uri","summary":"Requests loading of the specified URI string. You can monitor the load operation by connecting to #WebKitWebView::load-changed signal.","deprecated":null},{"type":"method","name":"matches_pattern","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_matches_pattern","summary":"Matches the @matchPattern against the specified @pattern with options."},{"type":"method","name":"matches_url","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_matches_url","summary":"Matches the @matchPattern against the specified URL with options."},{"type":"method","name":"move_item","type_name":"ContextMenu","ident":"webkit_context_menu_move_item","summary":"Moves @item to the given position in the @menu. If @position is negative, or is larger than the ...","deprecated":null},{"type":"method","name":"notify_cursor_area","type_name":"InputMethodContext","ident":"webkit_input_method_context_notify_cursor_area","summary":"Notify @context that cursor area changed in input associated.","deprecated":null},{"type":"method","name":"notify_focus_in","type_name":"InputMethodContext","ident":"webkit_input_method_context_notify_focus_in","summary":"Notify @context that input associated has gained focus.","deprecated":null},{"type":"method","name":"notify_focus_out","type_name":"InputMethodContext","ident":"webkit_input_method_context_notify_focus_out","summary":"Notify @context that input associated has lost focus.","deprecated":null},{"type":"method","name":"notify_surrounding","type_name":"InputMethodContext","ident":"webkit_input_method_context_notify_surrounding","summary":"Notify @context that the context surrounding the cursor has changed. If there's no selection @selection_index is the same ...","deprecated":null},{"type":"method","name":"prefetch_dns","type_name":"NetworkSession","ident":"webkit_network_session_prefetch_dns","summary":"Resolve the domain name of the given @hostname in advance, so that if a URI of @hostname is requested ...","deprecated":null},{"type":"method","name":"prepend","type_name":"ContextMenu","ident":"webkit_context_menu_prepend","summary":"Adds @item at the beginning of the @menu.","deprecated":null},{"type":"method","name":"print","type_name":"PrintOperation","ident":"webkit_print_operation_print","summary":"Start a print operation using current print settings and page setup. Start a print operation using current print ...","deprecated":null},{"type":"method","name":"prompt_get_default_text","type_name":"ScriptDialog","ident":"webkit_script_dialog_prompt_get_default_text","summary":"Get the default text of a #WebKitScriptDialog of type %WEBKIT_SCRIPT_DIALOG_PROMPT. It's an error to use this method with ..."},{"type":"method","name":"prompt_set_text","type_name":"ScriptDialog","ident":"webkit_script_dialog_prompt_set_text","summary":"Set the text entered by the user in the dialog. This method is used for %WEBKIT_SCRIPT_DIALOG_PROMPT dialogs when ..."},{"type":"method","name":"ref","type_name":"ApplicationInfo","ident":"webkit_application_info_ref","summary":"Atomically increments the reference count of @info by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"Feature","ident":"webkit_feature_ref","summary":"Atomically acquires a reference on the given @feature. This function is MT-safe and may be called from any thread."},{"type":"method","name":"ref","type_name":"FeatureList","ident":"webkit_feature_list_ref","summary":"Atomically acquires a reference on the given @feature_list. This function is MT-safe and may be called from any thread."},{"type":"method","name":"ref","type_name":"ITPFirstParty","ident":"webkit_itp_first_party_ref","summary":"Atomically increments the reference count of @itp_first_party by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"ITPThirdParty","ident":"webkit_itp_third_party_ref","summary":"Atomically increments the reference count of @itp_third_party by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"PermissionStateQuery","ident":"webkit_permission_state_query_ref","summary":"Atomically increments the reference count of @query by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"ScriptDialog","ident":"webkit_script_dialog_ref","summary":"Atomically increments the reference count of @dialog by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"ScriptMessageReply","ident":"webkit_script_message_reply_ref","summary":"Atomically increments the reference count of @script_message_reply by one."},{"type":"method","name":"ref","type_name":"SecurityOrigin","ident":"webkit_security_origin_ref","summary":"Atomically increments the reference count of @origin by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"UserContentFilter","ident":"webkit_user_content_filter_ref","summary":"Atomically increments the reference count of @user_content_filter by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"UserScript","ident":"webkit_user_script_ref","summary":"Atomically increments the reference count of @user_script by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"UserStyleSheet","ident":"webkit_user_style_sheet_ref","summary":"Atomically increments the reference count of @user_style_sheet by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_ref","summary":"Atomically acquires a reference on the given @matchPattern. This function is MT-safe and may be called from any thread."},{"type":"method","name":"ref","type_name":"WebsiteData","ident":"webkit_website_data_ref","summary":"Atomically increments the reference count of @website_data by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"WebViewSessionState","ident":"webkit_web_view_session_state_ref","summary":"Atomically increments the reference count of @state by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"register_script_message_handler","type_name":"UserContentManager","ident":"webkit_user_content_manager_register_script_message_handler","summary":"Registers a new user script message handler in script world. After it is registered, scripts can use `window.webkit.messageHandlers..postMessage(value)` ...","deprecated":null},{"type":"method","name":"register_script_message_handler_with_reply","type_name":"UserContentManager","ident":"webkit_user_content_manager_register_script_message_handler_with_reply","summary":"Registers a new user script message handler in script world with name @world_name. Different from webkit_user_content_manager_register_script_message_handler(), when using ...","deprecated":null},{"type":"method","name":"register_uri_scheme","type_name":"WebContext","ident":"webkit_web_context_register_uri_scheme","summary":"Register @scheme in @context. Register @scheme in @context, so that when an URI request with @scheme is made ...","deprecated":null},{"type":"method","name":"register_uri_scheme_as_cors_enabled","type_name":"SecurityManager","ident":"webkit_security_manager_register_uri_scheme_as_cors_enabled","summary":"Register @scheme as a CORS (Cross-origin resource sharing) enabled scheme. This means that CORS requests are allowed. See ...","deprecated":null},{"type":"method","name":"register_uri_scheme_as_display_isolated","type_name":"SecurityManager","ident":"webkit_security_manager_register_uri_scheme_as_display_isolated","summary":"Register @scheme as a display isolated scheme. This means that pages cannot display these URIs unless they are ...","deprecated":null},{"type":"method","name":"register_uri_scheme_as_empty_document","type_name":"SecurityManager","ident":"webkit_security_manager_register_uri_scheme_as_empty_document","summary":"Register @scheme as an empty document scheme. This means that they are allowed to commit synchronously.","deprecated":null},{"type":"method","name":"register_uri_scheme_as_local","type_name":"SecurityManager","ident":"webkit_security_manager_register_uri_scheme_as_local","summary":"Register @scheme as a local scheme. This means that other non-local pages cannot link to or access URIs ...","deprecated":null},{"type":"method","name":"register_uri_scheme_as_no_access","type_name":"SecurityManager","ident":"webkit_security_manager_register_uri_scheme_as_no_access","summary":"Register @scheme as a no-access scheme. This means that pages loaded with this URI scheme cannot access pages ...","deprecated":null},{"type":"method","name":"register_uri_scheme_as_secure","type_name":"SecurityManager","ident":"webkit_security_manager_register_uri_scheme_as_secure","summary":"Register @scheme as a secure scheme. This means that mixed content warnings won't be generated for this scheme ...","deprecated":null},{"type":"method","name":"reload","type_name":"WebView","ident":"webkit_web_view_reload","summary":"Reloads the current contents of @web_view. See also webkit_web_view_reload_bypass_cache().","deprecated":null},{"type":"method","name":"reload_bypass_cache","type_name":"WebView","ident":"webkit_web_view_reload_bypass_cache","summary":"Reloads the current contents of @web_view without using any cached data.","deprecated":null},{"type":"method","name":"remove","type_name":"ContextMenu","ident":"webkit_context_menu_remove","summary":"Removes @item from the @menu. See also webkit_context_menu_remove_all() to remove all items.","deprecated":null},{"type":"method","name":"remove","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_remove","summary":"Asynchronously remove a content filter given its @identifier. When the operation is finished, @callback will be invoked, which ...","deprecated":null},{"type":"method","name":"remove","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_remove","summary":"Asynchronously removes the website data in the given @website_data list. Asynchronously removes the website data of the given ...","deprecated":null},{"type":"method","name":"remove_all","type_name":"ContextMenu","ident":"webkit_context_menu_remove_all","summary":"Removes all items of the @menu.","deprecated":null},{"type":"method","name":"remove_all_filters","type_name":"UserContentManager","ident":"webkit_user_content_manager_remove_all_filters","summary":"Removes all content filters from the given #WebKitUserContentManager.","deprecated":null},{"type":"method","name":"remove_all_scripts","type_name":"UserContentManager","ident":"webkit_user_content_manager_remove_all_scripts","summary":"Removes all user scripts from the given #WebKitUserContentManager See also webkit_user_content_manager_remove_script().","deprecated":null},{"type":"method","name":"remove_all_style_sheets","type_name":"UserContentManager","ident":"webkit_user_content_manager_remove_all_style_sheets","summary":"Removes all user style sheets from the given #WebKitUserContentManager.","deprecated":null},{"type":"method","name":"remove_filter","type_name":"UserContentManager","ident":"webkit_user_content_manager_remove_filter","summary":"Removes a filter from the given #WebKitUserContentManager. Since 2.24","deprecated":null},{"type":"method","name":"remove_filter_by_id","type_name":"UserContentManager","ident":"webkit_user_content_manager_remove_filter_by_id","summary":"Removes a filter by the given identifier. Removes a filter from the given #WebKitUserContentManager given the identifier of ...","deprecated":null},{"type":"method","name":"remove_finish","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_remove_finish","summary":"Finishes an asynchronous filter removal previously started with webkit_user_content_filter_store_remove().","deprecated":null},{"type":"method","name":"remove_finish","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_remove_finish","summary":"Finish an asynchronous operation started with webkit_website_data_manager_remove().","deprecated":null},{"type":"method","name":"remove_script","type_name":"UserContentManager","ident":"webkit_user_content_manager_remove_script","summary":"Removes a #WebKitUserScript from the given #WebKitUserContentManager. See also webkit_user_content_manager_remove_all_scripts().","deprecated":null},{"type":"method","name":"remove_style_sheet","type_name":"UserContentManager","ident":"webkit_user_content_manager_remove_style_sheet","summary":"Removes a #WebKitUserStyleSheet from the given #WebKitUserContentManager. See also webkit_user_content_manager_remove_all_style_sheets().","deprecated":null},{"type":"method","name":"replace_cookies","type_name":"CookieManager","ident":"webkit_cookie_manager_replace_cookies","summary":"Asynchronously replace all cookies in @cookie_manager with the given list of @cookies. When the operation is finished, @callback ...","deprecated":null},{"type":"method","name":"replace_cookies_finish","type_name":"CookieManager","ident":"webkit_cookie_manager_replace_cookies_finish","summary":"Finish an asynchronous operation started with webkit_cookie_manager_replace_cookies().","deprecated":null},{"type":"method","name":"reset","type_name":"InputMethodContext","ident":"webkit_input_method_context_reset","summary":"Reset the @context. This will typically cause the input to clear the preedit state.","deprecated":null},{"type":"method","name":"restore_session_state","type_name":"WebView","ident":"webkit_web_view_restore_session_state","summary":"Restore the @web_view session state from @state","deprecated":null},{"type":"method","name":"return_error_message","type_name":"ScriptMessageReply","ident":"webkit_script_message_reply_return_error_message","summary":"Reply to a script message with an error message."},{"type":"method","name":"return_value","type_name":"ScriptMessageReply","ident":"webkit_script_message_reply_return_value","summary":"Reply to a script message with a value. This function can be called twice for passing the reply ..."},{"type":"method","name":"run_dialog","type_name":"PrintOperation","ident":"webkit_print_operation_run_dialog","summary":"Run the print dialog and start printing. Run the print dialog and start printing using the options selected ...","deprecated":null},{"type":"method","name":"save","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_save","summary":"Asynchronously save a content filter from a set source rule. Asynchronously save a content filter from a source ...","deprecated":null},{"type":"method","name":"save","type_name":"WebView","ident":"webkit_web_view_save","summary":"Asynchronously save the current web page. Asynchronously save the current web page associated to the #WebKitWebView into a ...","deprecated":null},{"type":"method","name":"save_finish","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_save_finish","summary":"Finishes an asynchronous filter save previously started with webkit_user_content_filter_store_save().","deprecated":null},{"type":"method","name":"save_finish","type_name":"WebView","ident":"webkit_web_view_save_finish","summary":"Finish an asynchronous operation started with webkit_web_view_save().","deprecated":null},{"type":"method","name":"save_from_file","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_save_from_file","summary":"Asynchronously save a content filter from the contents of a file. Asynchronously save a content filter from the ...","deprecated":null},{"type":"method","name":"save_from_file_finish","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_save_from_file_finish","summary":"Finishes and asynchronous filter save previously started with webkit_user_content_filter_store_save_from_file().","deprecated":null},{"type":"method","name":"save_to_file","type_name":"WebView","ident":"webkit_web_view_save_to_file","summary":"Asynchronously save the current web page. Asynchronously save the current web page associated to the #WebKitWebView into a ...","deprecated":null},{"type":"method","name":"save_to_file_finish","type_name":"WebView","ident":"webkit_web_view_save_to_file_finish","summary":"Finish an asynchronous operation started with webkit_web_view_save_to_file().","deprecated":null},{"type":"method","name":"search","type_name":"FindController","ident":"webkit_find_controller_search","summary":"Looks for @search_text associated with @find_controller. Looks for @search_text in the #WebKitWebView associated with @find_controller since the beginning ...","deprecated":null},{"type":"method","name":"search_finish","type_name":"FindController","ident":"webkit_find_controller_search_finish","summary":"Finishes a find operation. Finishes a find operation started by webkit_find_controller_search(). It will basically unhighlight every text match ...","deprecated":null},{"type":"method","name":"search_next","type_name":"FindController","ident":"webkit_find_controller_search_next","summary":"Looks for the next occurrence of the search text. Calling this method before webkit_find_controller_search() or webkit_find_controller_count_matches() is a ...","deprecated":null},{"type":"method","name":"search_previous","type_name":"FindController","ident":"webkit_find_controller_search_previous","summary":"Looks for the previous occurrence of the search text. Calling this method before webkit_find_controller_search() or webkit_find_controller_count_matches() is a ...","deprecated":null},{"type":"method","name":"select_files","type_name":"FileChooserRequest","ident":"webkit_file_chooser_request_select_files","summary":"Ask WebKit to select local files for upload and complete the request.","deprecated":null},{"type":"method","name":"select_item","type_name":"OptionMenu","ident":"webkit_option_menu_select_item","summary":"Selects the #WebKitOptionMenuItem at @index in @menu. Selecting an item changes the text shown by the combo button, ...","deprecated":null},{"type":"method","name":"send_message_to_all_extensions","type_name":"WebContext","ident":"webkit_web_context_send_message_to_all_extensions","summary":"Send @message to all web process extensions associated to @context. If @message is floating, it's consumed.","deprecated":null},{"type":"method","name":"send_message_to_page","type_name":"WebView","ident":"webkit_web_view_send_message_to_page","summary":"Send @message to the #WebKitWebPage corresponding to @web_view. If @message is floating, it's consumed. If you don't expect ...","deprecated":null},{"type":"method","name":"send_message_to_page_finish","type_name":"WebView","ident":"webkit_web_view_send_message_to_page_finish","summary":"Finish an asynchronous operation started with webkit_web_view_send_message_to_page().","deprecated":null},{"type":"method","name":"send_reply","type_name":"UserMessage","ident":"webkit_user_message_send_reply","summary":"Send a reply to an user message. If @reply is floating, it's consumed. You can only send a ...","deprecated":null},{"type":"method","name":"serialize","type_name":"WebViewSessionState","ident":"webkit_web_view_session_state_serialize","summary":"Serializes a #WebKitWebViewSessionState."},{"type":"method","name":"set_accept_policy","type_name":"CookieManager","ident":"webkit_cookie_manager_set_accept_policy","summary":"Set the cookie acceptance policy of @cookie_manager as @policy. Note that ITP has its own way to handle ...","deprecated":null},{"type":"method","name":"set_allow_file_access_from_file_urls","type_name":"Settings","ident":"webkit_settings_set_allow_file_access_from_file_urls","summary":"Set the #WebKitSettings:allow-file-access-from-file-urls property.","deprecated":null},{"type":"method","name":"set_allow_modal_dialogs","type_name":"Settings","ident":"webkit_settings_set_allow_modal_dialogs","summary":"Set the #WebKitSettings:allow-modal-dialogs property.","deprecated":null},{"type":"method","name":"set_allow_overwrite","type_name":"Download","ident":"webkit_download_set_allow_overwrite","summary":"Sets the #WebKitDownload:allow-overwrite property. Sets the #WebKitDownload:allow-overwrite property, which determines whether the download may overwrite an existing file ...","deprecated":null},{"type":"method","name":"set_allow_top_navigation_to_data_urls","type_name":"Settings","ident":"webkit_settings_set_allow_top_navigation_to_data_urls","summary":"Set the #WebKitSettings:allow-top-navigation-to-data-urls property.","deprecated":null},{"type":"method","name":"set_allow_universal_access_from_file_urls","type_name":"Settings","ident":"webkit_settings_set_allow_universal_access_from_file_urls","summary":"Set the #WebKitSettings:allow-universal-access-from-file-urls property.","deprecated":null},{"type":"method","name":"set_altitude","type_name":"GeolocationPosition","ident":"webkit_geolocation_position_set_altitude","summary":"Set the @position altitude."},{"type":"method","name":"set_altitude_accuracy","type_name":"GeolocationPosition","ident":"webkit_geolocation_position_set_altitude_accuracy","summary":"Set the accuracy of @position altitude."},{"type":"method","name":"set_application_info","type_name":"AutomationSession","ident":"webkit_automation_session_set_application_info","summary":"Set the application information to @session. This information will be used by the driver service to match the ...","deprecated":null},{"type":"method","name":"set_auto_load_images","type_name":"Settings","ident":"webkit_settings_set_auto_load_images","summary":"Set the #WebKitSettings:auto-load-images property.","deprecated":null},{"type":"method","name":"set_automation_allowed","type_name":"WebContext","ident":"webkit_web_context_set_automation_allowed","summary":"Set whether automation is allowed in @context. When automation is enabled the browser could be controlled by another ...","deprecated":null},{"type":"method","name":"set_background_color","type_name":"WebView","ident":"webkit_web_view_set_background_color","summary":"Sets the color that will be used to draw the @web_view background. Sets the color that will be ...","deprecated":null},{"type":"method","name":"set_cache_model","type_name":"WebContext","ident":"webkit_web_context_set_cache_model","summary":"Specifies a usage model for WebViews. Specifies a usage model for WebViews, which WebKit will use to determine ...","deprecated":null},{"type":"method","name":"set_camera_capture_state","type_name":"WebView","ident":"webkit_web_view_set_camera_capture_state","summary":"Set the camera capture state of a #WebKitWebView. If #WebKitSettings:enable-mediastream is %FALSE, this method will have no visible ...","deprecated":null},{"type":"method","name":"set_can_save_credentials","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_set_can_save_credentials","summary":"Set whether the authentication method associated with @request should allow the storage of credentials. Set whether the authentication ...","deprecated":null},{"type":"method","name":"set_color","type_name":"InputMethodUnderline","ident":"webkit_input_method_underline_set_color","summary":"Set the color of the underline. If @rgba is %NULL the foreground text color will be used for ..."},{"type":"method","name":"set_conservative_threshold","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_set_conservative_threshold","summary":"Sets the memory limit for the conservative policy to start working. Sets @value as the fraction of the ..."},{"type":"method","name":"set_content_type","type_name":"URISchemeResponse","ident":"webkit_uri_scheme_response_set_content_type","summary":"Sets the content type for the @response","deprecated":null},{"type":"method","name":"set_cors_allowlist","type_name":"WebView","ident":"webkit_web_view_set_cors_allowlist","summary":"Sets the @allowlist for CORS. Sets the @allowlist for which [Cross-Origin Resource Sharing](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) checks are disabled in @web_view. ...","deprecated":null},{"type":"method","name":"set_cursive_font_family","type_name":"Settings","ident":"webkit_settings_set_cursive_font_family","summary":"Set the #WebKitSettings:cursive-font-family property.","deprecated":null},{"type":"method","name":"set_custom_charset","type_name":"WebView","ident":"webkit_web_view_set_custom_charset","summary":"Sets the current custom character encoding override of @web_view. The custom character encoding will override any text encoding ...","deprecated":null},{"type":"method","name":"set_default_charset","type_name":"Settings","ident":"webkit_settings_set_default_charset","summary":"Set the #WebKitSettings:default-charset property.","deprecated":null},{"type":"method","name":"set_default_font_family","type_name":"Settings","ident":"webkit_settings_set_default_font_family","summary":"Set the #WebKitSettings:default-font-family property.","deprecated":null},{"type":"method","name":"set_default_font_size","type_name":"Settings","ident":"webkit_settings_set_default_font_size","summary":"Set the #WebKitSettings:default-font-size property.","deprecated":null},{"type":"method","name":"set_default_monospace_font_size","type_name":"Settings","ident":"webkit_settings_set_default_monospace_font_size","summary":"Set the #WebKitSettings:default-monospace-font-size property.","deprecated":null},{"type":"method","name":"set_destination","type_name":"Download","ident":"webkit_download_set_destination","summary":"Sets the destination to which the downloaded file will be written. This method should be called before the ...","deprecated":null},{"type":"method","name":"set_disable_web_security","type_name":"Settings","ident":"webkit_settings_set_disable_web_security","summary":"Set the #WebKitSettings:disable-web-security property.","deprecated":null},{"type":"method","name":"set_display_capture_state","type_name":"WebView","ident":"webkit_web_view_set_display_capture_state","summary":"Set the display capture state of a #WebKitWebView. If #WebKitSettings:enable-mediastream is %FALSE, this method will have no visible ...","deprecated":null},{"type":"method","name":"set_draw_compositing_indicators","type_name":"Settings","ident":"webkit_settings_set_draw_compositing_indicators","summary":"Set the #WebKitSettings:draw-compositing-indicators property.","deprecated":null},{"type":"method","name":"set_editable","type_name":"WebView","ident":"webkit_web_view_set_editable","summary":"Sets whether the user is allowed to edit the HTML document. If @editable is %TRUE, @web_view allows the ...","deprecated":null},{"type":"method","name":"set_enable_2d_canvas_acceleration","type_name":"Settings","ident":"webkit_settings_set_enable_2d_canvas_acceleration","summary":"Set the #WebKitSettings:enable-2d-canvas-acceleration property.","deprecated":null},{"type":"method","name":"set_enable_back_forward_navigation_gestures","type_name":"Settings","ident":"webkit_settings_set_enable_back_forward_navigation_gestures","summary":"Set the #WebKitSettings:enable-back-forward-navigation-gestures property.","deprecated":null},{"type":"method","name":"set_enable_caret_browsing","type_name":"Settings","ident":"webkit_settings_set_enable_caret_browsing","summary":"Set the #WebKitSettings:enable-caret-browsing property.","deprecated":null},{"type":"method","name":"set_enable_developer_extras","type_name":"Settings","ident":"webkit_settings_set_enable_developer_extras","summary":"Set the #WebKitSettings:enable-developer-extras property.","deprecated":null},{"type":"method","name":"set_enable_dns_prefetching","type_name":"Settings","ident":"webkit_settings_set_enable_dns_prefetching","summary":"Set the #WebKitSettings:enable-dns-prefetching property.","deprecated":"2.48."},{"type":"method","name":"set_enable_encrypted_media","type_name":"Settings","ident":"webkit_settings_set_enable_encrypted_media","summary":"Set the #WebKitSettings:enable-encrypted-media property.","deprecated":null},{"type":"method","name":"set_enable_fullscreen","type_name":"Settings","ident":"webkit_settings_set_enable_fullscreen","summary":"Set the #WebKitSettings:enable-fullscreen property.","deprecated":null},{"type":"method","name":"set_enable_html5_database","type_name":"Settings","ident":"webkit_settings_set_enable_html5_database","summary":"Set the #WebKitSettings:enable-html5-database property.","deprecated":null},{"type":"method","name":"set_enable_html5_local_storage","type_name":"Settings","ident":"webkit_settings_set_enable_html5_local_storage","summary":"Set the #WebKitSettings:enable-html5-local-storage property.","deprecated":null},{"type":"method","name":"set_enable_hyperlink_auditing","type_name":"Settings","ident":"webkit_settings_set_enable_hyperlink_auditing","summary":"Set the #WebKitSettings:enable-hyperlink-auditing property.","deprecated":"2.50."},{"type":"method","name":"set_enable_javascript","type_name":"Settings","ident":"webkit_settings_set_enable_javascript","summary":"Set the #WebKitSettings:enable-javascript property.","deprecated":null},{"type":"method","name":"set_enable_javascript_markup","type_name":"Settings","ident":"webkit_settings_set_enable_javascript_markup","summary":"Set the #WebKitSettings:enable-javascript-markup property.","deprecated":null},{"type":"method","name":"set_enable_media","type_name":"Settings","ident":"webkit_settings_set_enable_media","summary":"Set the #WebKitSettings:enable-media property.","deprecated":null},{"type":"method","name":"set_enable_media_capabilities","type_name":"Settings","ident":"webkit_settings_set_enable_media_capabilities","summary":"Set the #WebKitSettings:enable-media-capabilities property.","deprecated":null},{"type":"method","name":"set_enable_media_stream","type_name":"Settings","ident":"webkit_settings_set_enable_media_stream","summary":"Set the #WebKitSettings:enable-media-stream property.","deprecated":null},{"type":"method","name":"set_enable_mediasource","type_name":"Settings","ident":"webkit_settings_set_enable_mediasource","summary":"Set the #WebKitSettings:enable-mediasource property.","deprecated":null},{"type":"method","name":"set_enable_mock_capture_devices","type_name":"Settings","ident":"webkit_settings_set_enable_mock_capture_devices","summary":"Set the #WebKitSettings:enable-mock-capture-devices property.","deprecated":null},{"type":"method","name":"set_enable_offline_web_application_cache","type_name":"Settings","ident":"webkit_settings_set_enable_offline_web_application_cache","summary":"Setting no longer supported. This function does nothing.","deprecated":"2.44"},{"type":"method","name":"set_enable_page_cache","type_name":"Settings","ident":"webkit_settings_set_enable_page_cache","summary":"Set the #WebKitSettings:enable-page-cache property.","deprecated":null},{"type":"method","name":"set_enable_preedit","type_name":"InputMethodContext","ident":"webkit_input_method_context_set_enable_preedit","summary":"Set whether @context should enable preedit to display feedback.","deprecated":null},{"type":"method","name":"set_enable_resizable_text_areas","type_name":"Settings","ident":"webkit_settings_set_enable_resizable_text_areas","summary":"Set the #WebKitSettings:enable-resizable-text-areas property.","deprecated":null},{"type":"method","name":"set_enable_site_specific_quirks","type_name":"Settings","ident":"webkit_settings_set_enable_site_specific_quirks","summary":"Set the #WebKitSettings:enable-site-specific-quirks property.","deprecated":null},{"type":"method","name":"set_enable_smooth_scrolling","type_name":"Settings","ident":"webkit_settings_set_enable_smooth_scrolling","summary":"Set the #WebKitSettings:enable-smooth-scrolling property.","deprecated":null},{"type":"method","name":"set_enable_spatial_navigation","type_name":"Settings","ident":"webkit_settings_set_enable_spatial_navigation","summary":"Set the #WebKitSettings:enable-spatial-navigation property.","deprecated":null},{"type":"method","name":"set_enable_tabs_to_links","type_name":"Settings","ident":"webkit_settings_set_enable_tabs_to_links","summary":"Set the #WebKitSettings:enable-tabs-to-links property.","deprecated":null},{"type":"method","name":"set_enable_webaudio","type_name":"Settings","ident":"webkit_settings_set_enable_webaudio","summary":"Set the #WebKitSettings:enable-webaudio property.","deprecated":null},{"type":"method","name":"set_enable_webgl","type_name":"Settings","ident":"webkit_settings_set_enable_webgl","summary":"Set the #WebKitSettings:enable-webgl property.","deprecated":null},{"type":"method","name":"set_enable_webrtc","type_name":"Settings","ident":"webkit_settings_set_enable_webrtc","summary":"Set the [property@Settings:enable-webrtc] property. Setting this property to %TRUE implies the media-stream web-setting will also be enabled.","deprecated":null},{"type":"method","name":"set_enable_write_console_messages_to_stdout","type_name":"Settings","ident":"webkit_settings_set_enable_write_console_messages_to_stdout","summary":"Set the #WebKitSettings:enable-write-console-messages-to-stdout property.","deprecated":null},{"type":"method","name":"set_fantasy_font_family","type_name":"Settings","ident":"webkit_settings_set_fantasy_font_family","summary":"Set the #WebKitSettings:fantasy-font-family property.","deprecated":null},{"type":"method","name":"set_favicons_enabled","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_set_favicons_enabled","summary":"Set whether website icons are enabled. Website icons are disabled by default. When website icons are disabled, the #WebKitFaviconDatabase ...","deprecated":null},{"type":"method","name":"set_feature_enabled","type_name":"Settings","ident":"webkit_settings_set_feature_enabled","summary":"Enables or disables a feature. The current status of the feature can be determined with [id@webkit_settings_get_feature_enabled]. To reset ...","deprecated":null},{"type":"method","name":"set_granted_optional_features","type_name":"XRPermissionRequest","ident":"webkit_xr_permission_request_set_granted_optional_features","summary":"Sets which optional features should be granted if the permission request is allowed. This function should be called ...","deprecated":null},{"type":"method","name":"set_hardware_acceleration_policy","type_name":"Settings","ident":"webkit_settings_set_hardware_acceleration_policy","summary":"Set the #WebKitSettings:hardware-acceleration-policy property.","deprecated":null},{"type":"method","name":"set_heading","type_name":"GeolocationPosition","ident":"webkit_geolocation_position_set_heading","summary":"Set the @position heading. Set the @position heading, as a positive angle between the direction of movement and ..."},{"type":"method","name":"set_http_headers","type_name":"URISchemeResponse","ident":"webkit_uri_scheme_response_set_http_headers","summary":"Assign the provided #SoupMessageHeaders to the response. @headers need to be of the type %SOUP_MESSAGE_HEADERS_RESPONSE. Any existing headers ...","deprecated":null},{"type":"method","name":"set_input_hints","type_name":"InputMethodContext","ident":"webkit_input_method_context_set_input_hints","summary":"Set the value of the #WebKitInputMethodContext:input-hints property.","deprecated":null},{"type":"method","name":"set_input_method_context","type_name":"WebView","ident":"webkit_web_view_set_input_method_context","summary":"Set the #WebKitInputMethodContext to be used by @web_view. Set the #WebKitInputMethodContext to be used by @web_view, or %NULL ...","deprecated":null},{"type":"method","name":"set_input_purpose","type_name":"InputMethodContext","ident":"webkit_input_method_context_set_input_purpose","summary":"Set the value of the #WebKitInputMethodContext:input-purpose property.","deprecated":null},{"type":"method","name":"set_is_muted","type_name":"WebView","ident":"webkit_web_view_set_is_muted","summary":"Sets the mute state of @web_view.","deprecated":null},{"type":"method","name":"set_itp_enabled","type_name":"NetworkSession","ident":"webkit_network_session_set_itp_enabled","summary":"Enable or disable Intelligent Tracking Prevention (ITP). When ITP is enabled resource load statistics are collected and used ...","deprecated":null},{"type":"method","name":"set_javascript_can_access_clipboard","type_name":"Settings","ident":"webkit_settings_set_javascript_can_access_clipboard","summary":"Set the #WebKitSettings:javascript-can-access-clipboard property.","deprecated":null},{"type":"method","name":"set_javascript_can_open_windows_automatically","type_name":"Settings","ident":"webkit_settings_set_javascript_can_open_windows_automatically","summary":"Set the #WebKitSettings:javascript-can-open-windows-automatically property.","deprecated":null},{"type":"method","name":"set_kill_threshold","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_set_kill_threshold","summary":"Sets @value as the fraction of the defined memory limit where the process will be killed. The threshold ..."},{"type":"method","name":"set_load_icons_ignoring_image_load_setting","type_name":"Settings","ident":"webkit_settings_set_load_icons_ignoring_image_load_setting","summary":"Setting no longer supported. This function does nothing.","deprecated":"2.42"},{"type":"method","name":"set_math_font_family","type_name":"Settings","ident":"webkit_settings_set_math_font_family","summary":"Set the #WebKitSettings:math-font-family property. Since 2.52","deprecated":null},{"type":"method","name":"set_media_content_types_requiring_hardware_support","type_name":"Settings","ident":"webkit_settings_set_media_content_types_requiring_hardware_support","summary":"Set the #WebKitSettings:media-content-types-requiring-hardware-support property.","deprecated":null},{"type":"method","name":"set_media_playback_allows_inline","type_name":"Settings","ident":"webkit_settings_set_media_playback_allows_inline","summary":"Set the #WebKitSettings:media-playback-allows-inline property.","deprecated":null},{"type":"method","name":"set_media_playback_requires_user_gesture","type_name":"Settings","ident":"webkit_settings_set_media_playback_requires_user_gesture","summary":"Set the #WebKitSettings:media-playback-requires-user-gesture property.","deprecated":null},{"type":"method","name":"set_memory_limit","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_set_memory_limit","summary":"Sets @memory_limit the memory limit value to @settings. The default value is the system's RAM size with a ..."},{"type":"method","name":"set_microphone_capture_state","type_name":"WebView","ident":"webkit_web_view_set_microphone_capture_state","summary":"Set the microphone capture state of a #WebKitWebView. If #WebKitSettings:enable-mediastream is %FALSE, this method will have no visible ...","deprecated":null},{"type":"method","name":"set_minimum_font_size","type_name":"Settings","ident":"webkit_settings_set_minimum_font_size","summary":"Set the #WebKitSettings:minimum-font-size property.","deprecated":null},{"type":"method","name":"set_monospace_font_family","type_name":"Settings","ident":"webkit_settings_set_monospace_font_family","summary":"Set the #WebKitSettings:monospace-font-family property.","deprecated":null},{"type":"method","name":"set_name","type_name":"ApplicationInfo","ident":"webkit_application_info_set_name","summary":"Set the name of the application. If not provided, or %NULL is passed, g_get_prgname() will be used."},{"type":"method","name":"set_page_setup","type_name":"PrintOperation","ident":"webkit_print_operation_set_page_setup","summary":"Set the current page setup of @print_operation. Current page setup is used for the initial values of the ...","deprecated":null},{"type":"method","name":"set_persistent_credential_storage_enabled","type_name":"NetworkSession","ident":"webkit_network_session_set_persistent_credential_storage_enabled","summary":"Enable or disable persistent credential storage. When enabled, which is the default for non-ephemeral sessions, the network process ...","deprecated":null},{"type":"method","name":"set_persistent_storage","type_name":"CookieManager","ident":"webkit_cookie_manager_set_persistent_storage","summary":"Set non-session cookies. Set the @filename where non-session cookies are stored persistently using @storage as the format to ...","deprecated":null},{"type":"method","name":"set_pictograph_font_family","type_name":"Settings","ident":"webkit_settings_set_pictograph_font_family","summary":"Set the #WebKitSettings:pictograph-font-family property.","deprecated":null},{"type":"method","name":"set_poll_interval","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_set_poll_interval","summary":"Sets @value as the poll interval used by @settings. The poll interval value must be bigger than 0. ..."},{"type":"method","name":"set_preferred_languages","type_name":"WebContext","ident":"webkit_web_context_set_preferred_languages","summary":"Set the list of preferred languages. Set the list of preferred languages, sorted from most desirable to least ...","deprecated":null},{"type":"method","name":"set_print_backgrounds","type_name":"Settings","ident":"webkit_settings_set_print_backgrounds","summary":"Set the #WebKitSettings:print-backgrounds property.","deprecated":null},{"type":"method","name":"set_print_settings","type_name":"PrintOperation","ident":"webkit_print_operation_set_print_settings","summary":"Set the current print settings of @print_operation. Set the current print settings of @print_operation. Current print settings are ...","deprecated":null},{"type":"method","name":"set_proposed_credential","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_set_proposed_credential","summary":"Set the #WebKitCredential of the proposed authentication challenge. Set the #WebKitCredential of the proposed authentication challenge that was ...","deprecated":null},{"type":"method","name":"set_proxy_settings","type_name":"NetworkSession","ident":"webkit_network_session_set_proxy_settings","summary":"Set the network proxy settings to be used by connections started in @session session. By default %WEBKIT_NETWORK_PROXY_MODE_DEFAULT is ...","deprecated":null},{"type":"method","name":"set_rgba","type_name":"ColorChooserRequest","ident":"webkit_color_chooser_request_set_rgba","summary":"Sets the current #GdkRGBA color of @request","deprecated":null},{"type":"method","name":"set_sans_serif_font_family","type_name":"Settings","ident":"webkit_settings_set_sans_serif_font_family","summary":"Set the #WebKitSettings:sans-serif-font-family property.","deprecated":null},{"type":"method","name":"set_serif_font_family","type_name":"Settings","ident":"webkit_settings_set_serif_font_family","summary":"Set the #WebKitSettings:serif-font-family property.","deprecated":null},{"type":"method","name":"set_settings","type_name":"WebView","ident":"webkit_web_view_set_settings","summary":"Sets the #WebKitSettings to be applied to @web_view. The existing #WebKitSettings of @web_view will be replaced by @settings. ...","deprecated":null},{"type":"method","name":"set_speed","type_name":"GeolocationPosition","ident":"webkit_geolocation_position_set_speed","summary":"Set the @position speed."},{"type":"method","name":"set_spell_checking_enabled","type_name":"WebContext","ident":"webkit_web_context_set_spell_checking_enabled","summary":"Enable or disable the spell checking feature.","deprecated":null},{"type":"method","name":"set_spell_checking_languages","type_name":"WebContext","ident":"webkit_web_context_set_spell_checking_languages","summary":"Set the list of spell checking languages to be used for spell checking. The locale string typically is ...","deprecated":null},{"type":"method","name":"set_status","type_name":"URISchemeResponse","ident":"webkit_uri_scheme_response_set_status","summary":"Sets the status code and reason phrase for the @response. If @status_code is a known value and @reason_phrase ...","deprecated":null},{"type":"method","name":"set_strict_threshold","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_set_strict_threshold","summary":"Sets the memory limit for the strict policy to start working. Sets @value as the fraction of the ..."},{"type":"method","name":"set_submenu","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_set_submenu","summary":"Sets or replaces the @item submenu. If @submenu is %NULL the current submenu of @item is removed.","deprecated":null},{"type":"method","name":"set_timestamp","type_name":"GeolocationPosition","ident":"webkit_geolocation_position_set_timestamp","summary":"Set the @position timestamp. By default it's the time when the @position was created."},{"type":"method","name":"set_tls_errors_policy","type_name":"NetworkSession","ident":"webkit_network_session_set_tls_errors_policy","summary":"Set the TLS errors policy of @session as @policy.","deprecated":null},{"type":"method","name":"set_uri","type_name":"URIRequest","ident":"webkit_uri_request_set_uri","summary":"Set the URI of @request","deprecated":null},{"type":"method","name":"set_user_agent","type_name":"Settings","ident":"webkit_settings_set_user_agent","summary":"Set the #WebKitSettings:user-agent property.","deprecated":null},{"type":"method","name":"set_user_agent_with_application_details","type_name":"Settings","ident":"webkit_settings_set_user_agent_with_application_details","summary":"Set the #WebKitSettings:user-agent property by appending the application details. Set the #WebKitSettings:user-agent property by appending the application details ...","deprecated":null},{"type":"method","name":"set_user_data","type_name":"ContextMenu","ident":"webkit_context_menu_set_user_data","summary":"Sets user data to @menu. This function can be used from a Web Process extension to set user ...","deprecated":null},{"type":"method","name":"set_version","type_name":"ApplicationInfo","ident":"webkit_application_info_set_version","summary":"Set the application version. If the application doesn't use the format major.minor.micro you can pass 0 as the ..."},{"type":"method","name":"set_web_process_extensions_directory","type_name":"WebContext","ident":"webkit_web_context_set_web_process_extensions_directory","summary":"Set the directory where WebKit will look for web process extensions. This method must be called before loading ...","deprecated":null},{"type":"method","name":"set_web_process_extensions_initialization_user_data","type_name":"WebContext","ident":"webkit_web_context_set_web_process_extensions_initialization_user_data","summary":"Set user data to be passed to Web Extensions on initialization. The data will be passed to the ...","deprecated":null},{"type":"method","name":"set_webrtc_udp_ports_range","type_name":"Settings","ident":"webkit_settings_set_webrtc_udp_ports_range","summary":"Set the [property@Settings:webrtc-udp-ports-range] property.","deprecated":null},{"type":"method","name":"set_zoom_level","type_name":"WebView","ident":"webkit_web_view_set_zoom_level","summary":"Set the zoom level of @web_view. Set the zoom level of @web_view, i.e. the factor by which the ...","deprecated":null},{"type":"method","name":"set_zoom_text_only","type_name":"Settings","ident":"webkit_settings_set_zoom_text_only","summary":"Set the #WebKitSettings:zoom-text-only property.","deprecated":null},{"type":"method","name":"show","type_name":"WebInspector","ident":"webkit_web_inspector_show","summary":"Request @inspector to be shown.","deprecated":null},{"type":"method","name":"stop_loading","type_name":"WebView","ident":"webkit_web_view_stop_loading","summary":"Stops any ongoing loading operation in @web_view. This method does nothing if no content is being loaded. If ...","deprecated":null},{"type":"method","name":"submit","type_name":"FormSubmissionRequest","ident":"webkit_form_submission_request_submit","summary":"Continue the form submission.","deprecated":null},{"type":"method","name":"supports_manifest_version","type_name":"WebExtension","ident":"webkit_web_extension_supports_manifest_version","summary":"Checks if a manifest version is supported by the extension.","deprecated":null},{"type":"method","name":"terminate_web_process","type_name":"WebView","ident":"webkit_web_view_terminate_web_process","summary":"Terminates the web process associated to @web_view. When the web process gets terminated using this method, the #WebKitWebView::web-process-terminated ...","deprecated":null},{"type":"method","name":"to_string","type_name":"SecurityOrigin","ident":"webkit_security_origin_to_string","summary":"Gets a string representation of @origin. The string representation is a valid URI with only protocol, host, and ..."},{"type":"method","name":"try_close","type_name":"WebView","ident":"webkit_web_view_try_close","summary":"Tries to close the @web_view. This will fire the onbeforeunload event to ask the user for confirmation to ...","deprecated":null},{"type":"method","name":"unref","type_name":"ApplicationInfo","ident":"webkit_application_info_unref","summary":"Atomically decrements the reference count of @info by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unref","type_name":"Feature","ident":"webkit_feature_unref","summary":"Atomically releases a reference on the given @feature. If the reference was the last, the resources associated to ..."},{"type":"method","name":"unref","type_name":"FeatureList","ident":"webkit_feature_list_unref","summary":"Atomically releases a reference on the given @feature_list. If the reference was the last, the resources associated to ..."},{"type":"method","name":"unref","type_name":"ITPFirstParty","ident":"webkit_itp_first_party_unref","summary":"Atomically decrements the reference count of @itp_first_party by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unref","type_name":"ITPThirdParty","ident":"webkit_itp_third_party_unref","summary":"Atomically decrements the reference count of @itp_third_party by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unref","type_name":"PermissionStateQuery","ident":"webkit_permission_state_query_unref","summary":"Atomically decrements the reference count of @query by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unref","type_name":"ScriptDialog","ident":"webkit_script_dialog_unref","summary":"Atomically decrements the reference count of @dialog by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unref","type_name":"ScriptMessageReply","ident":"webkit_script_message_reply_unref","summary":"Atomically decrements the reference count of @script_message_reply by one. If the reference count drops to 0, all the ..."},{"type":"method","name":"unref","type_name":"SecurityOrigin","ident":"webkit_security_origin_unref","summary":"Atomically decrements the reference count of @origin by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unref","type_name":"UserContentFilter","ident":"webkit_user_content_filter_unref","summary":"Atomically decrements the reference count of @user_content_filter by one. If the reference count drops to 0, all the ..."},{"type":"method","name":"unref","type_name":"UserScript","ident":"webkit_user_script_unref","summary":"Atomically decrements the reference count of @user_script by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unref","type_name":"UserStyleSheet","ident":"webkit_user_style_sheet_unref","summary":"Atomically decrements the reference count of @user_style_sheet by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unref","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_unref","summary":"Atomically releases a reference on the given @matchPattern. If the reference was the last, the resources associated to ..."},{"type":"method","name":"unref","type_name":"WebsiteData","ident":"webkit_website_data_unref","summary":"Atomically decrements the reference count of @website_data by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unref","type_name":"WebViewSessionState","ident":"webkit_web_view_session_state_unref","summary":"Atomically decrements the reference count of @state by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unregister_script_message_handler","type_name":"UserContentManager","ident":"webkit_user_content_manager_unregister_script_message_handler","summary":"Unregisters a previously registered message handler in script world with name @world_name. If %NULL is passed as the @world_name, ...","deprecated":null},{"type":"method","name":"update_position","type_name":"GeolocationManager","ident":"webkit_geolocation_manager_update_position","summary":"Notify @manager that position has been updated to @position.","deprecated":null},{"type":"method","name":"uri_scheme_is_cors_enabled","type_name":"SecurityManager","ident":"webkit_security_manager_uri_scheme_is_cors_enabled","summary":"Whether @scheme is considered as a CORS enabled scheme. See also webkit_security_manager_register_uri_scheme_as_cors_enabled().","deprecated":null},{"type":"method","name":"uri_scheme_is_display_isolated","type_name":"SecurityManager","ident":"webkit_security_manager_uri_scheme_is_display_isolated","summary":"Whether @scheme is considered as a display isolated scheme. See also webkit_security_manager_register_uri_scheme_as_display_isolated().","deprecated":null},{"type":"method","name":"uri_scheme_is_empty_document","type_name":"SecurityManager","ident":"webkit_security_manager_uri_scheme_is_empty_document","summary":"Whether @scheme is considered as an empty document scheme. See also webkit_security_manager_register_uri_scheme_as_empty_document().","deprecated":null},{"type":"method","name":"uri_scheme_is_local","type_name":"SecurityManager","ident":"webkit_security_manager_uri_scheme_is_local","summary":"Whether @scheme is considered as a local scheme. See also webkit_security_manager_register_uri_scheme_as_local().","deprecated":null},{"type":"method","name":"uri_scheme_is_no_access","type_name":"SecurityManager","ident":"webkit_security_manager_uri_scheme_is_no_access","summary":"Whether @scheme is considered as a no-access scheme. See also webkit_security_manager_register_uri_scheme_as_no_access().","deprecated":null},{"type":"method","name":"uri_scheme_is_secure","type_name":"SecurityManager","ident":"webkit_security_manager_uri_scheme_is_secure","summary":"Whether @scheme is considered as a secure scheme. See also webkit_security_manager_register_uri_scheme_as_secure().","deprecated":null},{"type":"method","name":"use","type_name":"PolicyDecision","ident":"webkit_policy_decision_use","summary":"Accept the action which triggered this decision.","deprecated":null},{"type":"method","name":"use_with_policies","type_name":"PolicyDecision","ident":"webkit_policy_decision_use_with_policies","summary":"Accept the navigation action and continue with provided @policies. Accept the navigation action which triggered this decision, and ...","deprecated":null},{"type":"property","name":"allow-file-access-from-file-urls","type_name":"Settings","summary":"Whether file access is allowed from file URLs. By default, when something is loaded in a #WebKitWebView using a ...","deprecated":null},{"type":"property","name":"allow-modal-dialogs","type_name":"Settings","summary":"Determine whether it's allowed to create and run modal dialogs from a #WebKitWebView through JavaScript with window.showModalDialog. If it's ...","deprecated":null},{"type":"property","name":"allow-overwrite","type_name":"Download","summary":"Whether or not the download is allowed to overwrite an existing file on disk. If this property is %FALSE ...","deprecated":null},{"type":"property","name":"allow-top-navigation-to-data-urls","type_name":"Settings","summary":"Whether or not the top frame is allowed to navigate to data URLs. It is disabled by default due ...","deprecated":null},{"type":"property","name":"allow-universal-access-from-file-urls","type_name":"Settings","summary":"Whether or not JavaScript running in the context of a file scheme URL should be allowed to access content ...","deprecated":null},{"type":"property","name":"attached-height","type_name":"WebInspector","summary":"The height that the inspector view should have when it is attached.","deprecated":null},{"type":"property","name":"auto-load-images","type_name":"Settings","summary":"Determines whether images should be automatically loaded or not. On devices where network bandwidth is of concern, it might ...","deprecated":null},{"type":"property","name":"automation-presentation-type","type_name":"WebView","summary":"The #WebKitAutomationBrowsingContextPresentation of #WebKitWebView. This should only be used when creating a new #WebKitWebView as a response to #WebKitAutomationSession::create-web-view ...","deprecated":null},{"type":"property","name":"autoplay","type_name":"WebsitePolicies","summary":"The #WebKitAutoplayPolicy of #WebKitWebsitePolicies.","deprecated":null},{"type":"property","name":"base-cache-directory","type_name":"WebsiteDataManager","summary":"The base directory for caches. If %NULL, a default location will be used.","deprecated":null},{"type":"property","name":"base-data-directory","type_name":"WebsiteDataManager","summary":"The base directory for website data. If %NULL, a default location will be used.","deprecated":null},{"type":"property","name":"body","type_name":"Notification","summary":"The body for the notification.","deprecated":null},{"type":"property","name":"cache-directory","type_name":"NetworkSession","summary":"The base caches directory used to create the #WebKitWebsiteDataManager. If %NULL, a default location will be used.","deprecated":null},{"type":"property","name":"camera-capture-state","type_name":"WebView","summary":"Capture state of the camera device. Whenever the user grants a media-request sent by the web page, requesting video ...","deprecated":null},{"type":"property","name":"can-attach","type_name":"WebInspector","summary":"Whether the @inspector can be attached to the same window that contains the inspected view.","deprecated":null},{"type":"property","name":"content-length","type_name":"URIResponse","summary":"The expected content length of the response.","deprecated":null},{"type":"property","name":"context","type_name":"HitTestResult","summary":"Bitmask of #WebKitHitTestResultContext flags representing the context of the #WebKitHitTestResult.","deprecated":null},{"type":"property","name":"cursive-font-family","type_name":"Settings","summary":"The font family used as the default for content using a cursive font.","deprecated":null},{"type":"property","name":"data-directory","type_name":"NetworkSession","summary":"The base data directory used to create the #WebKitWebsiteDataManager. If %NULL, a default location will be used.","deprecated":null},{"type":"property","name":"default-charset","type_name":"Settings","summary":"The default text charset used when interpreting content with an unspecified charset.","deprecated":null},{"type":"property","name":"default-content-security-policy","type_name":"WebView","summary":"The default Content-Security-Policy used by the webview as if it were set by an HTTP header. This applies ...","deprecated":null},{"type":"property","name":"default-font-family","type_name":"Settings","summary":"The font family to use as the default for content that does not specify a font.","deprecated":null},{"type":"property","name":"default-font-size","type_name":"Settings","summary":"The default font size in pixels to use for content displayed if no font size is specified.","deprecated":null},{"type":"property","name":"default-locale","type_name":"WebExtension","summary":"The default locale for the #WebKitWebExtension. See webkit_web_extension_get_default_locale() for more details.","deprecated":null},{"type":"property","name":"default-monospace-font-size","type_name":"Settings","summary":"The default font size in pixels to use for content displayed in monospace font if no font size is specified.","deprecated":null},{"type":"property","name":"destination","type_name":"Download","summary":"The local path to where the download will be saved.","deprecated":null},{"type":"property","name":"disable-web-security","type_name":"Settings","summary":"Enable or disable support for Web Security on pages. This setting disables the same-origin policy, allowing every website ...","deprecated":null},{"type":"property","name":"display-action-label","type_name":"WebExtension","summary":"The localized extension action label of the #WebKitWebExtension. See webkit_web_extension_get_display_action_label() for more details.","deprecated":null},{"type":"property","name":"display-capture-state","type_name":"WebView","summary":"Capture state of the display device. Whenever the user grants a media-request sent by the web page, requesting screencasting ...","deprecated":null},{"type":"property","name":"display-description","type_name":"WebExtension","summary":"The localized description of the #WebKitWebExtension. See webkit_web_extension_get_display_description() for more details.","deprecated":null},{"type":"property","name":"display-name","type_name":"WebExtension","summary":"The localized name of the #WebKitWebExtension. See webkit_web_extension_get_display_name() for more details.","deprecated":null},{"type":"property","name":"display-short-name","type_name":"WebExtension","summary":"The localized short name of the #WebKitWebExtension. See webkit_web_extension_get_display_short_name() for more details.","deprecated":null},{"type":"property","name":"display-version","type_name":"WebExtension","summary":"The localized display version of the #WebKitWebExtension. See webkit_web_extension_get_display_version() for more details.","deprecated":null},{"type":"property","name":"draw-compositing-indicators","type_name":"Settings","summary":"Whether to draw compositing borders and repaint counters on layers drawn with accelerated compositing. This is useful for debugging ...","deprecated":null},{"type":"property","name":"editable","type_name":"WebView","summary":"Whether the pages loaded inside #WebKitWebView are editable. For more information see webkit_web_view_set_editable().","deprecated":null},{"type":"property","name":"enable-2d-canvas-acceleration","type_name":"Settings","summary":"Enable or disable 2D canvas acceleration. If this setting is enabled, the 2D canvas will be accelerated even if ...","deprecated":null},{"type":"property","name":"enable-back-forward-navigation-gestures","type_name":"Settings","summary":"Enable or disable horizontal swipe gesture for back-forward navigation.","deprecated":null},{"type":"property","name":"enable-caret-browsing","type_name":"Settings","summary":"Whether to enable accessibility enhanced keyboard navigation.","deprecated":null},{"type":"property","name":"enable-developer-extras","type_name":"Settings","summary":"Determines whether or not developer tools, such as the Web Inspector, are enabled.","deprecated":null},{"type":"property","name":"enable-dns-prefetching","type_name":"Settings","summary":"Determines whether or not to prefetch domain names. DNS prefetching attempts to resolve domain names before a user tries ...","deprecated":"2.48"},{"type":"property","name":"enable-encrypted-media","type_name":"Settings","summary":"Enable or disable support for Encrypted Media API on pages. EncryptedMedia is an experimental JavaScript API for playing encrypted ...","deprecated":null},{"type":"property","name":"enable-fullscreen","type_name":"Settings","summary":"Whether to enable the Javascript Fullscreen API. The API allows any HTML element to request fullscreen display. See also ...","deprecated":null},{"type":"property","name":"enable-high-accuracy","type_name":"GeolocationManager","summary":"Whether high accuracy is enabled. This is a read-only property that will be set to %TRUE when a #WebKitGeolocationManager ...","deprecated":null},{"type":"property","name":"enable-html5-database","type_name":"Settings","summary":"Whether to enable HTML5 client-side SQL database support (IndexedDB).","deprecated":null},{"type":"property","name":"enable-html5-local-storage","type_name":"Settings","summary":"Whether to enable HTML5 local storage support. Local storage provides simple synchronous storage access. HTML5 local storage specification ...","deprecated":null},{"type":"property","name":"enable-hyperlink-auditing","type_name":"Settings","summary":"Determines whether or not hyperlink auditing is enabled. The hyperlink auditing specification is available at http://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#hyperlink-auditing.","deprecated":"2.50"},{"type":"property","name":"enable-javascript","type_name":"Settings","summary":"Determines whether or not JavaScript executes within a page.","deprecated":null},{"type":"property","name":"enable-javascript-markup","type_name":"Settings","summary":"Determines whether or not JavaScript markup is allowed in document. When this setting is disabled, all JavaScript-related elements and ...","deprecated":null},{"type":"property","name":"enable-media","type_name":"Settings","summary":"Enable or disable support for media playback on pages. This setting is enabled by default. Disabling it means ``, ...","deprecated":null},{"type":"property","name":"enable-media-capabilities","type_name":"Settings","summary":"Enable or disable support for MediaCapabilities on pages. This specification intends to provide APIs to allow websites to make ...","deprecated":null},{"type":"property","name":"enable-media-stream","type_name":"Settings","summary":"Enable or disable support for MediaStream on pages. MediaStream is an experimental proposal for allowing web pages to access ...","deprecated":null},{"type":"property","name":"enable-mediasource","type_name":"Settings","summary":"Enable or disable support for MediaSource on pages. MediaSource extends HTMLMediaElement to allow JavaScript to generate media streams for ...","deprecated":null},{"type":"property","name":"enable-mock-capture-devices","type_name":"Settings","summary":"Enable or disable the Mock Capture Devices. Those are fake Microphone and Camera devices to be used as MediaStream sources.","deprecated":null},{"type":"property","name":"enable-offline-web-application-cache","type_name":"Settings","summary":"Unsupported setting. This property does nothing.","deprecated":"2.44"},{"type":"property","name":"enable-page-cache","type_name":"Settings","summary":"Enable or disable the page cache. Disabling the page cache is generally only useful for special circumstances like low-memory ...","deprecated":null},{"type":"property","name":"enable-resizable-text-areas","type_name":"Settings","summary":"Determines whether or not text areas can be resized.","deprecated":null},{"type":"property","name":"enable-site-specific-quirks","type_name":"Settings","summary":"Whether to turn on site-specific quirks. Turning this on will tell WebKit to use some site-specific workarounds for better ...","deprecated":null},{"type":"property","name":"enable-smooth-scrolling","type_name":"Settings","summary":"Enable or disable smooth scrolling.","deprecated":null},{"type":"property","name":"enable-spatial-navigation","type_name":"Settings","summary":"Whether to enable Spatial Navigation. This feature consists in the ability to navigate between focusable elements in a Web ...","deprecated":null},{"type":"property","name":"enable-tabs-to-links","type_name":"Settings","summary":"Determines whether the tab key cycles through the elements on the page. When this setting is enabled, users will ...","deprecated":null},{"type":"property","name":"enable-webaudio","type_name":"Settings","summary":"Enable or disable support for WebAudio on pages. WebAudio is an API for processing and synthesizing audio in web ...","deprecated":null},{"type":"property","name":"enable-webgl","type_name":"Settings","summary":"Enable or disable support for WebGL on pages. WebGL enables web content to use an API based on OpenGL ...","deprecated":null},{"type":"property","name":"enable-webrtc","type_name":"Settings","summary":"Enable WebRTC support for loaded pages. Enabling this setting implies that [property@Settings:enable-media-stream] will be enabled as well. ...","deprecated":null},{"type":"property","name":"enable-write-console-messages-to-stdout","type_name":"Settings","summary":"Enable or disable writing console messages to stdout. These are messages sent to the console with console.log and related methods.","deprecated":null},{"type":"property","name":"estimated-load-progress","type_name":"WebView","summary":"An estimate of the percent completion for the current loading operation. This value will range from 0.0 to 1.0 ...","deprecated":null},{"type":"property","name":"estimated-progress","type_name":"Download","summary":"An estimate of the percent completion for the download operation. This value will range from 0.0 to 1.0. The ...","deprecated":null},{"type":"property","name":"fantasy-font-family","type_name":"Settings","summary":"The font family used as the default for content using a fantasy font.","deprecated":null},{"type":"property","name":"favicon","type_name":"WebView","summary":"The favicon currently associated to the #WebKitWebView. See webkit_web_view_get_favicon() for more details.","deprecated":null},{"type":"property","name":"fd-list","type_name":"UserMessage","summary":"The UNIX file descriptors of the user message.","deprecated":null},{"type":"property","name":"filter","type_name":"FileChooserRequest","summary":"The filter currently associated with the request. See webkit_file_chooser_request_get_mime_types_filter() for more details.","deprecated":null},{"type":"property","name":"fullscreen","type_name":"WindowProperties","summary":"Whether window will be displayed fullscreen.","deprecated":null},{"type":"property","name":"geometry","type_name":"WindowProperties","summary":"The size and position of the window on the screen.","deprecated":null},{"type":"property","name":"hardware-acceleration-policy","type_name":"Settings","summary":"The #WebKitHardwareAccelerationPolicy to decide how to enable and disable hardware acceleration. Disabling hardware acceleration might cause some websites to ...","deprecated":null},{"type":"property","name":"has-background-content","type_name":"WebExtension","summary":"Whether the #WebKitWebExtension has background content that can run when needed. See webkit_web_extension_get_has_background_content() for more details.","deprecated":null},{"type":"property","name":"has-commands","type_name":"WebExtension","summary":"Whether the #WebKitWebExtension includes commands that users can invoke. See webkit_web_extension_get_has_commands() for more details.","deprecated":null},{"type":"property","name":"has-content-modification-rules","type_name":"WebExtension","summary":"Whether the #WebKitWebExtension includes rules used for content modification or blocking. See webkit_web_extension_get_content_modification_rules() for more details.","deprecated":null},{"type":"property","name":"has-injected-content","type_name":"WebExtension","summary":"Whether the #WebKitWebExtension has script or stylesheet content that can be injected into webpages. See webkit_web_extension_get_has_injected_content() for more details.","deprecated":null},{"type":"property","name":"has-options-page","type_name":"WebExtension","summary":"Whether the #WebKitWebExtension has an options page. See webkit_web_extension_get_has_options_page() for more details.","deprecated":null},{"type":"property","name":"has-override-new-tab-page","type_name":"WebExtension","summary":"Whether the #WebKitWebExtension provides an alternative to the default new tab page. See webkit_web_extension_get_has_override_new_tab_page() for more details.","deprecated":null},{"type":"property","name":"has-persistent-background-content","type_name":"WebExtension","summary":"Whether the #WebKitWebExtension has background content that stays in memory as long as the extension is loaded. See webkit_web_extension_get_has_persistent_background_content() ...","deprecated":null},{"type":"property","name":"http-headers","type_name":"URIResponse","summary":"The HTTP headers of the response, or %NULL if the response is not an HTTP response.","deprecated":null},{"type":"property","name":"id","type_name":"AutomationSession","summary":"The session unique identifier.","deprecated":null},{"type":"property","name":"id","type_name":"Notification","summary":"The unique id for the notification.","deprecated":null},{"type":"property","name":"image-uri","type_name":"HitTestResult","summary":"The URI of the image if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"input-hints","type_name":"InputMethodContext","summary":"The #WebKitInputHints of the input associated with this context.","deprecated":null},{"type":"property","name":"input-purpose","type_name":"InputMethodContext","summary":"The #WebKitInputPurpose of the input associated with this context.","deprecated":null},{"type":"property","name":"inspected-uri","type_name":"WebInspector","summary":"The URI that is currently being inspected.","deprecated":null},{"type":"property","name":"is-controlled-by-automation","type_name":"WebView","summary":"Whether the #WebKitWebView is controlled by automation tools (e.g. WebDriver, Selenium). This is required for views returned as a ...","deprecated":null},{"type":"property","name":"is-ephemeral","type_name":"NetworkSession","summary":"Whether to create an ephermeral #WebKitWebsiteDataManager for the session.","deprecated":null},{"type":"property","name":"is-ephemeral","type_name":"WebsiteDataManager","summary":"Whether the #WebKitWebsiteDataManager is ephemeral. An ephemeral #WebKitWebsiteDataManager handles all websites data as non-persistent, and nothing will be written ...","deprecated":null},{"type":"property","name":"is-for-audio-device","type_name":"UserMediaPermissionRequest","summary":"Whether the media device to which the permission was requested has a microphone or not.","deprecated":null},{"type":"property","name":"is-for-video-device","type_name":"UserMediaPermissionRequest","summary":"Whether the media device to which the permission was requested has a video capture capability or not.","deprecated":null},{"type":"property","name":"is-immersive-mode-enabled","type_name":"WebView","summary":"Whether the #WebKitWebView is in immersive mode.","deprecated":null},{"type":"property","name":"is-loading","type_name":"WebView","summary":"Whether the #WebKitWebView is currently loading a page. This property becomes %TRUE as soon as a new load operation ...","deprecated":null},{"type":"property","name":"is-muted","type_name":"WebView","summary":"Whether the #WebKitWebView audio is muted. When %TRUE, audio is silenced. It may still be playing, i.e. #WebKitWebView:is-playing-audio may ...","deprecated":null},{"type":"property","name":"is-playing-audio","type_name":"WebView","summary":"Whether the #WebKitWebView is currently playing audio from a page. This property becomes %TRUE as soon as web content ...","deprecated":null},{"type":"property","name":"is-web-process-responsive","type_name":"WebView","summary":"Whether the web process currently associated to the #WebKitWebView is responsive.","deprecated":null},{"type":"property","name":"javascript-can-access-clipboard","type_name":"Settings","summary":"Whether JavaScript can access the clipboard. The default value is %FALSE. If set to %TRUE, document.execCommand() allows cut, copy ...","deprecated":null},{"type":"property","name":"javascript-can-open-windows-automatically","type_name":"Settings","summary":"Whether JavaScript can open popup windows automatically without user intervention.","deprecated":null},{"type":"property","name":"link-label","type_name":"HitTestResult","summary":"The label of the link if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"link-title","type_name":"HitTestResult","summary":"The title of the link if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"link-uri","type_name":"HitTestResult","summary":"The URI of the link if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"load-icons-ignoring-image-load-setting","type_name":"Settings","summary":"Unsupported setting. This property does nothing.","deprecated":"2.42"},{"type":"property","name":"locationbar-visible","type_name":"WindowProperties","summary":"Whether the locationbar should be visible for the window.","deprecated":null},{"type":"property","name":"manifest-version","type_name":"WebExtension","summary":"The parsed manifest version of the #WebKitWebExtension. See webkit_web_extension_get_manifest_version() for more details.","deprecated":null},{"type":"property","name":"math-font-family","type_name":"Settings","summary":"The font family used as the default for content using a math font.","deprecated":null},{"type":"property","name":"max-match-count","type_name":"FindController","summary":"The maximum number of matches to report for a given search.","deprecated":null},{"type":"property","name":"media-content-types-requiring-hardware-support","type_name":"Settings","summary":"List of media content types requiring hardware support, split by semicolons (:). For example: 'video/webm; codecs=\"vp*\":video/mp4; codecs=\"avc*\":video/* codecs=\"av1*\"'.","deprecated":null},{"type":"property","name":"media-playback-allows-inline","type_name":"Settings","summary":"Whether media playback is full-screen only or inline playback is allowed. This is %TRUE by default, so media playback ...","deprecated":null},{"type":"property","name":"media-playback-requires-user-gesture","type_name":"Settings","summary":"Whether a user gesture (such as clicking the play button) would be required to start media playback or load ...","deprecated":null},{"type":"property","name":"media-uri","type_name":"HitTestResult","summary":"The URI of the media if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"memory-pressure-settings","type_name":"WebContext","summary":"The #WebKitMemoryPressureSettings applied to the web processes created by this context.","deprecated":null},{"type":"property","name":"menubar-visible","type_name":"WindowProperties","summary":"Whether the menubar should be visible for the window.","deprecated":null},{"type":"property","name":"microphone-capture-state","type_name":"WebView","summary":"Capture state of the microphone device. Whenever the user grants a media-request sent by the web page, requesting audio ...","deprecated":null},{"type":"property","name":"mime-type","type_name":"URIResponse","summary":"The MIME type of the response.","deprecated":null},{"type":"property","name":"mime-types","type_name":"FileChooserRequest","summary":"A %NULL-terminated array of strings containing the list of MIME types the file chooser dialog should handle. See webkit_file_chooser_request_get_mime_types() ...","deprecated":null},{"type":"property","name":"minimum-font-size","type_name":"Settings","summary":"The minimum font size in pixels used to display text. This setting controls the absolute smallest size. Values other ...","deprecated":null},{"type":"property","name":"monospace-font-family","type_name":"Settings","summary":"The font family used as the default for content using a monospace font.","deprecated":null},{"type":"property","name":"name","type_name":"UserMessage","summary":"The name of the user message.","deprecated":null},{"type":"property","name":"navigation-action","type_name":"NavigationPolicyDecision","summary":"The #WebKitNavigationAction that triggered this policy decision.","deprecated":null},{"type":"property","name":"network-session","type_name":"WebView","summary":"The #WebKitNetworkSession of the view","deprecated":null},{"type":"property","name":"optional-permissions","type_name":"WebExtension","summary":"The set of permissions that the #WebKitWebExtension may need for optional functionality. See webkit_web_extension_get_optional_permissions() for more details.","deprecated":null},{"type":"property","name":"options","type_name":"FindController","summary":"The options to be used in the search operation.","deprecated":null},{"type":"property","name":"origin-storage-ratio","type_name":"WebsiteDataManager","summary":"The percentage of volume space that can be used for data storage for every domain. If the maximum storage ...","deprecated":null},{"type":"property","name":"page-id","type_name":"WebView","summary":"The identifier of the #WebKitWebPage corresponding to the #WebKitWebView.","deprecated":null},{"type":"property","name":"page-setup","type_name":"PrintOperation","summary":"The initial #GtkPageSetup for the print operation.","deprecated":null},{"type":"property","name":"parameters","type_name":"UserMessage","summary":"The parameters of the user message as a #GVariant, or %NULL if the message doesn't include parameters. Note that ...","deprecated":null},{"type":"property","name":"path","type_name":"UserContentFilterStore","summary":"The directory used for filter storage. This path is used as the base directory where user content filters are ...","deprecated":null},{"type":"property","name":"path","type_name":"WebExtension","summary":"A string pointing to the folder containing the extension manifest and resources. See webkit_web_extension_get_path() for more details.","deprecated":null},{"type":"property","name":"pictograph-font-family","type_name":"Settings","summary":"The font family used as the default for content using a pictograph font.","deprecated":null},{"type":"property","name":"print-backgrounds","type_name":"Settings","summary":"Whether background images should be drawn during printing.","deprecated":null},{"type":"property","name":"print-settings","type_name":"PrintOperation","summary":"The initial #GtkPrintSettings for the print operation.","deprecated":null},{"type":"property","name":"related-view","type_name":"WebView","summary":"The related #WebKitWebView used when creating the view to share the same web process and network session. This property ...","deprecated":null},{"type":"property","name":"request","type_name":"ResponsePolicyDecision","summary":"This property contains the #WebKitURIRequest associated with this policy decision.","deprecated":null},{"type":"property","name":"requested-permissions","type_name":"WebExtension","summary":"The set of permissions that the #WebKitWebExtension requires for its base functionality. See webkit_web_extension_get_requested_permissions() for more details.","deprecated":null},{"type":"property","name":"resizable","type_name":"WindowProperties","summary":"Whether the window can be resized.","deprecated":null},{"type":"property","name":"response","type_name":"Download","summary":"The #WebKitURIResponse associated with this download.","deprecated":null},{"type":"property","name":"response","type_name":"ResponsePolicyDecision","summary":"This property contains the #WebKitURIResponse associated with this policy decision.","deprecated":null},{"type":"property","name":"response","type_name":"WebResource","summary":"The #WebKitURIResponse associated with this resource.","deprecated":null},{"type":"property","name":"rgba","type_name":"ColorChooserRequest","summary":"The #GdkRGBA color of the request","deprecated":null},{"type":"property","name":"sans-serif-font-family","type_name":"Settings","summary":"The font family used as the default for content using a sans-serif font.","deprecated":null},{"type":"property","name":"scrollbars-visible","type_name":"WindowProperties","summary":"Whether the scrollbars should be visible for the window.","deprecated":null},{"type":"property","name":"select-multiple","type_name":"FileChooserRequest","summary":"Whether the file chooser should allow selecting multiple files. See webkit_file_chooser_request_get_select_multiple() for more details.","deprecated":null},{"type":"property","name":"selected-files","type_name":"FileChooserRequest","summary":"A %NULL-terminated array of strings containing the list of selected files associated to the current request. See webkit_file_chooser_request_get_selected_files() for ...","deprecated":null},{"type":"property","name":"serif-font-family","type_name":"Settings","summary":"The font family used as the default for content using a serif font.","deprecated":null},{"type":"property","name":"settings","type_name":"WebView","summary":"The #WebKitSettings of the view.","deprecated":null},{"type":"property","name":"status-code","type_name":"URIResponse","summary":"The status code of the response as returned by the server.","deprecated":null},{"type":"property","name":"statusbar-visible","type_name":"WindowProperties","summary":"Whether the statusbar should be visible for the window.","deprecated":null},{"type":"property","name":"stream","type_name":"URISchemeResponse","summary":"The input stream to read from.","deprecated":null},{"type":"property","name":"stream-length","type_name":"URISchemeResponse","summary":"The input stream length in bytes, `-1` for unknown length.","deprecated":null},{"type":"property","name":"suggested-filename","type_name":"URIResponse","summary":"The suggested filename for the URI response.","deprecated":null},{"type":"property","name":"tag","type_name":"Notification","summary":"The tag identifier for the notification.","deprecated":null},{"type":"property","name":"text","type_name":"FindController","summary":"The current search text for this #WebKitFindController.","deprecated":null},{"type":"property","name":"theme-color","type_name":"WebView","summary":"The theme color of the WebView's current page.","deprecated":null},{"type":"property","name":"time-zone-override","type_name":"WebContext","summary":"The timezone override for this web context. Setting this property provides a better alternative to configure the timezone information ...","deprecated":null},{"type":"property","name":"title","type_name":"Notification","summary":"The title for the notification.","deprecated":null},{"type":"property","name":"title","type_name":"WebView","summary":"The main frame document title of this #WebKitWebView. If the title has not been received yet, it will be %NULL.","deprecated":null},{"type":"property","name":"toolbar-visible","type_name":"WindowProperties","summary":"Whether the toolbar should be visible for the window.","deprecated":null},{"type":"property","name":"total-storage-ratio","type_name":"WebsiteDataManager","summary":"The percentage of volume space that can be used for data storage for all domains. If the maximum storage ...","deprecated":null},{"type":"property","name":"typing-attributes","type_name":"EditorState","summary":"Bitmask of #WebKitEditorTypingAttributes flags. See webkit_editor_state_get_typing_attributes() for more information.","deprecated":null},{"type":"property","name":"uri","type_name":"URIRequest","summary":"The URI to which the request will be made.","deprecated":null},{"type":"property","name":"uri","type_name":"URIResponse","summary":"The URI for which the response was made.","deprecated":null},{"type":"property","name":"uri","type_name":"WebResource","summary":"The current active URI of the #WebKitWebResource. See webkit_web_resource_get_uri() for more details.","deprecated":null},{"type":"property","name":"uri","type_name":"WebView","summary":"The current active URI of the #WebKitWebView. See webkit_web_view_get_uri() for more details.","deprecated":null},{"type":"property","name":"user-agent","type_name":"Settings","summary":"The user-agent string used by WebKit. Unusual user-agent strings may cause web content to render incorrectly or fail to ...","deprecated":null},{"type":"property","name":"user-content-manager","type_name":"WebView","summary":"The #WebKitUserContentManager of the view.","deprecated":null},{"type":"property","name":"version","type_name":"WebExtension","summary":"The version of the #WebKitWebExtension. See webkit_web_extension_get_version() for more details.","deprecated":null},{"type":"property","name":"web-context","type_name":"WebView","summary":"The #WebKitWebContext of the view.","deprecated":null},{"type":"property","name":"web-extension-mode","type_name":"WebView","summary":"This configures @web_view to treat the content as a WebExtension. Note that this refers to the web standard ...","deprecated":null},{"type":"property","name":"web-view","type_name":"FindController","summary":"The #WebKitWebView this controller is associated to.","deprecated":null},{"type":"property","name":"web-view","type_name":"PrintOperation","summary":"The #WebKitWebView that will be printed.","deprecated":null},{"type":"property","name":"webrtc-udp-ports-range","type_name":"Settings","summary":"Allow customization of the WebRTC UDP ports range. In some constrained environments where a firewall blocks UDP network ...","deprecated":null},{"type":"property","name":"website-policies","type_name":"WebView","summary":"The #WebKitWebsitePolicies for the view.","deprecated":null},{"type":"property","name":"zoom-level","type_name":"WebView","summary":"The zoom level of the #WebKitWebView content. See webkit_web_view_set_zoom_level() for more details.","deprecated":null},{"type":"property","name":"zoom-text-only","type_name":"Settings","summary":"Whether #WebKitWebView:zoom-level affects only the text of the page or all the contents. Other contents containing text like form ...","deprecated":null},{"type":"record","name":"ApplicationInfo","ctype":"WebKitApplicationInfo","summary":"Information about an application running in automation mode.","deprecated":null},{"type":"record","name":"Credential","ctype":"WebKitCredential","summary":"Groups information used for user authentication.","deprecated":null},{"type":"record","name":"Feature","ctype":"WebKitFeature","summary":"Describes a web engine feature that may be toggled at runtime. The WebKit web engine includes a set ...","deprecated":null},{"type":"record","name":"FeatureList","ctype":"WebKitFeatureList","summary":"Contains a set of toggle-able web engine features. The list supports passing around a set of [struct@Feature] objects ...","deprecated":null},{"type":"record","name":"GeolocationPosition","ctype":"WebKitGeolocationPosition","summary":"An opaque struct to provide position updates to a #WebKitGeolocationManager. WebKitGeolocationPosition is an opaque struct used to provide ...","deprecated":null},{"type":"record","name":"ITPFirstParty","ctype":"WebKitITPFirstParty","summary":"Describes a first party origin.","deprecated":null},{"type":"record","name":"ITPThirdParty","ctype":"WebKitITPThirdParty","summary":"Describes a third party origin.","deprecated":null},{"type":"record","name":"InputMethodUnderline","ctype":"WebKitInputMethodUnderline","summary":"Range of text in an preedit string to be shown underlined.","deprecated":null},{"type":"record","name":"MemoryPressureSettings","ctype":"WebKitMemoryPressureSettings","summary":"A boxed type representing the settings for the memory pressure handler #WebKitMemoryPressureSettings is a boxed type that can ...","deprecated":null},{"type":"record","name":"NavigationAction","ctype":"WebKitNavigationAction","summary":"Provides details about interaction resulting in a resource load.","deprecated":null},{"type":"record","name":"NetworkProxySettings","ctype":"WebKitNetworkProxySettings","summary":"Configures network proxies. WebKitNetworkProxySettings can be used to provide a custom proxy configuration to a #WebKitNetworkSession. You need ...","deprecated":null},{"type":"record","name":"OptionMenuItem","ctype":"WebKitOptionMenuItem","summary":"One item of a #WebKitOptionMenu. The #WebKitOptionMenu is composed of WebKitOptionMenuItems. A WebKitOptionMenuItem always has a label and ...","deprecated":null},{"type":"record","name":"PermissionStateQuery","ctype":"WebKitPermissionStateQuery","summary":"This query represents a user's choice to allow or deny access to \"powerful features\" of the platform, as specified ...","deprecated":null},{"type":"record","name":"ScriptDialog","ctype":"WebKitScriptDialog","summary":"Carries details to be shown in user-facing dialogs.","deprecated":null},{"type":"record","name":"ScriptMessageReply","ctype":"WebKitScriptMessageReply","summary":"A reply for a script message received. If no reply has been sent by the user, an automatically generated ...","deprecated":null},{"type":"record","name":"SecurityOrigin","ctype":"WebKitSecurityOrigin","summary":"A security boundary for websites. #WebKitSecurityOrigin is a representation of a security domain defined by websites. A security ...","deprecated":null},{"type":"record","name":"UserContentFilter","ctype":"WebKitUserContentFilter","summary":"A compiled set of rules which applied to resource loads.","deprecated":null},{"type":"record","name":"UserScript","ctype":"WebKitUserScript","summary":"A JavaScript snippet which can be injected in loaded pages.","deprecated":null},{"type":"record","name":"UserStyleSheet","ctype":"WebKitUserStyleSheet","summary":"A CSS style sheet which can be injected in loaded pages.","deprecated":null},{"type":"record","name":"WebExtensionMatchPattern","ctype":"WebKitWebExtensionMatchPattern","summary":"Represents a way to specify a group of URLs for use in WebExtensions. All match patterns are specified ...","deprecated":null},{"type":"record","name":"WebViewSessionState","ctype":"WebKitWebViewSessionState","summary":"Handles serialization of a web view's browsing state.","deprecated":null},{"type":"record","name":"WebsiteData","ctype":"WebKitWebsiteData","summary":"Data stored locally by a web site. WebKitWebsiteData represents data stored in the client by a particular website. ...","deprecated":null},{"type":"signal","name":"attach","type_name":"WebInspector","summary":"Emitted when the inspector is requested to be attached to the window where the inspected web view is. If ...","deprecated":null},{"type":"signal","name":"authenticate","type_name":"WebView","summary":"This signal is emitted when the user is challenged with HTTP authentication. To let the application access or ...","deprecated":null},{"type":"signal","name":"authenticated","type_name":"AuthenticationRequest","summary":"This signal is emitted when the user authentication request succeeded. Applications handling their own credential storage should connect to ...","deprecated":null},{"type":"signal","name":"automation-started","type_name":"WebContext","summary":"This signal is emitted when a new automation request is made. Note that it will never be emitted if ...","deprecated":null},{"type":"signal","name":"bring-to-front","type_name":"WebInspector","summary":"Emitted when the inspector should be shown. If the inspector is not attached the inspector window should be ...","deprecated":null},{"type":"signal","name":"cancelled","type_name":"AuthenticationRequest","summary":"This signal is emitted when the user authentication request is cancelled. It allows the application to dismiss its authentication ...","deprecated":null},{"type":"signal","name":"changed","type_name":"BackForwardList","summary":"This signal is emitted when @back_forward_list changes. This happens when the current item is updated, a new item is ...","deprecated":null},{"type":"signal","name":"changed","type_name":"CookieManager","summary":"This signal is emitted when cookies are added, removed or modified.","deprecated":null},{"type":"signal","name":"changed","type_name":"EditorState","summary":"Emitted when the #WebKitEdtorState is changed.","deprecated":null},{"type":"signal","name":"clicked","type_name":"Notification","summary":"Emitted when a notification has been clicked. See webkit_notification_clicked().","deprecated":null},{"type":"signal","name":"close","type_name":"OptionMenu","summary":"Emitted when closing a #WebKitOptionMenu is requested. This can happen when the user explicitly calls webkit_option_menu_close() or when the ...","deprecated":null},{"type":"signal","name":"close","type_name":"WebView","summary":"Emitted when closing a #WebKitWebView is requested. This occurs when a call is made from JavaScript's window.close function or ...","deprecated":null},{"type":"signal","name":"closed","type_name":"Notification","summary":"Emitted when a notification has been withdrawn. The default handler will close the notification using libnotify, if built ...","deprecated":null},{"type":"signal","name":"closed","type_name":"WebInspector","summary":"Emitted when the inspector page is closed. If you are using your own inspector window, you should connect to ...","deprecated":null},{"type":"signal","name":"committed","type_name":"InputMethodContext","summary":"Emitted when a complete input sequence has been entered by the user. This can be a single character immediately ...","deprecated":null},{"type":"signal","name":"context-menu","type_name":"WebView","summary":"Emitted when a context menu is about to be displayed to give the application a chance to customize the ...","deprecated":null},{"type":"signal","name":"context-menu-dismissed","type_name":"WebView","summary":"Emitted after #WebKitWebView::context-menu signal, if the context menu is shown, to notify that the context menu is dismissed.","deprecated":null},{"type":"signal","name":"counted-matches","type_name":"FindController","summary":"This signal is emitted when the #WebKitFindController has counted the number of matches for a given text after a ...","deprecated":null},{"type":"signal","name":"create","type_name":"WebView","summary":"Emitted when the creation of a new #WebKitWebView is requested. If this signal is handled the signal handler should ...","deprecated":null},{"type":"signal","name":"create-web-view","type_name":"AutomationSession","summary":"This signal is emitted when the automation client requests a new browsing context to interact with it. The callback ...","deprecated":null},{"type":"signal","name":"created-destination","type_name":"Download","summary":"This signal is emitted after #WebKitDownload::decide-destination and before #WebKitDownload::received-data to notify that destination file has been created successfully at @destination.","deprecated":null},{"type":"signal","name":"decide-destination","type_name":"Download","summary":"This signal is emitted after response is received to decide a destination for the download using webkit_download_set_destination(). If this ...","deprecated":null},{"type":"signal","name":"decide-policy","type_name":"WebView","summary":"This signal is emitted when WebKit is requesting the client to decide a policy decision, such as whether to ...","deprecated":null},{"type":"signal","name":"delete-surrounding","type_name":"InputMethodContext","summary":"Emitted when the input method wants to delete the context surrounding the cursor. If @offset is a negative value, ...","deprecated":null},{"type":"signal","name":"detach","type_name":"WebInspector","summary":"Emitted when the inspector is requested to be detached from the window it is currently attached to. The inspector ...","deprecated":null},{"type":"signal","name":"download-started","type_name":"NetworkSession","summary":"This signal is emitted when a new download request is made.","deprecated":null},{"type":"signal","name":"enter-fullscreen","type_name":"WebView","summary":"Emitted when JavaScript code calls element.webkitRequestFullScreen. If the signal is not handled the #WebKitWebView will proceed to full screen ...","deprecated":null},{"type":"signal","name":"failed","type_name":"Download","summary":"This signal is emitted when an error occurs during the download operation. The given @error, of the domain %WEBKIT_DOWNLOAD_ERROR, ...","deprecated":null},{"type":"signal","name":"failed","type_name":"PrintOperation","summary":"Emitted when an error occurs while printing. The given @error, of the domain %WEBKIT_PRINT_ERROR, contains further details of the ...","deprecated":null},{"type":"signal","name":"failed","type_name":"WebResource","summary":"This signal is emitted when an error occurs during the resource load operation.","deprecated":null},{"type":"signal","name":"failed-to-find-text","type_name":"FindController","summary":"This signal is emitted when a search operation does not find any result for the given text. It will ...","deprecated":null},{"type":"signal","name":"failed-with-tls-errors","type_name":"WebResource","summary":"This signal is emitted when a TLS error occurs during the resource load operation.","deprecated":null},{"type":"signal","name":"favicon-changed","type_name":"FaviconDatabase","summary":"This signal is emitted when the favicon URI of @page_uri has been changed to @favicon_uri in the database. You ...","deprecated":null},{"type":"signal","name":"finished","type_name":"ColorChooserRequest","summary":"Emitted when the @request finishes. This signal can be emitted because the user completed the @request calling webkit_color_chooser_request_finish(), or ...","deprecated":null},{"type":"signal","name":"finished","type_name":"Download","summary":"This signal is emitted when download finishes successfully or due to an error. In case of errors #WebKitDownload::failed signal ...","deprecated":null},{"type":"signal","name":"finished","type_name":"PrintOperation","summary":"Emitted when the print operation has finished doing everything required for printing.","deprecated":null},{"type":"signal","name":"finished","type_name":"WebResource","summary":"This signal is emitted when the resource load finishes successfully or due to an error. In case of errors ...","deprecated":null},{"type":"signal","name":"found-text","type_name":"FindController","summary":"This signal is emitted when a given text is found in the web page text. It will be issued ...","deprecated":null},{"type":"signal","name":"initialize-notification-permissions","type_name":"WebContext","summary":"This signal is emitted when a #WebKitWebContext needs to set initial notification permissions for a web process. It is ...","deprecated":null},{"type":"signal","name":"initialize-web-process-extensions","type_name":"WebContext","summary":"This signal is emitted when a new web process is about to be launched. It signals the most appropriate ...","deprecated":null},{"type":"signal","name":"insecure-content-detected","type_name":"WebView","summary":"Prior to 2.46, this signal was emitted when insecure content was loaded in a secure content. Since 2.46, this ...","deprecated":"2.46"},{"type":"signal","name":"leave-fullscreen","type_name":"WebView","summary":"Emitted when the #WebKitWebView is about to restore its top level window out of its full screen state. This ...","deprecated":null},{"type":"signal","name":"load-changed","type_name":"WebView","summary":"Emitted when a load operation in @web_view changes. The signal is always emitted with %WEBKIT_LOAD_STARTED when a new load ...","deprecated":null},{"type":"signal","name":"load-failed","type_name":"WebView","summary":"Emitted when an error occurs during a load operation. If the error happened when starting to load data for ...","deprecated":null},{"type":"signal","name":"load-failed-with-tls-errors","type_name":"WebView","summary":"Emitted when a TLS error occurs during a load operation. To allow an exception for this @certificate and the ...","deprecated":null},{"type":"signal","name":"mouse-target-changed","type_name":"WebView","summary":"This signal is emitted when the mouse cursor moves over an element such as a link, image or a ...","deprecated":null},{"type":"signal","name":"open-window","type_name":"WebInspector","summary":"Emitted when the inspector is requested to open in a separate window. If this signal is not handled, a ...","deprecated":null},{"type":"signal","name":"permission-request","type_name":"WebView","summary":"This signal is emitted when WebKit is requesting the client to decide about a permission request, such as allowing ...","deprecated":null},{"type":"signal","name":"preedit-changed","type_name":"InputMethodContext","summary":"Emitted whenever the preedit sequence currently being entered has changed. It is also emitted at the end of a ...","deprecated":null},{"type":"signal","name":"preedit-finished","type_name":"InputMethodContext","summary":"Emitted when a preediting sequence has been completed or canceled.","deprecated":null},{"type":"signal","name":"preedit-started","type_name":"InputMethodContext","summary":"Emitted when a new preediting sequence starts.","deprecated":null},{"type":"signal","name":"print","type_name":"WebView","summary":"Emitted when printing is requested on @web_view, usually by a JavaScript call, before the print dialog is shown. This ...","deprecated":null},{"type":"signal","name":"query-permission-state","type_name":"WebView","summary":"This signal allows the User-Agent to respond to permission requests for powerful features, as specified by the [Permissions W3C ...","deprecated":null},{"type":"signal","name":"ready-to-show","type_name":"WebView","summary":"Emitted after #WebKitWebView::create on the newly created #WebKitWebView when it should be displayed to the user. When this signal ...","deprecated":null},{"type":"signal","name":"received-data","type_name":"Download","summary":"This signal is emitted after response is received, every time new data has been written to the destination. It's ...","deprecated":null},{"type":"signal","name":"resource-load-started","type_name":"WebView","summary":"Emitted when a new resource is going to be loaded. The @request parameter contains the #WebKitURIRequest that will be ...","deprecated":null},{"type":"signal","name":"run-as-modal","type_name":"WebView","summary":"Emitted after #WebKitWebView::ready-to-show on the newly created #WebKitWebView when JavaScript code calls window.showModalDialog. The purpose of this signal is ...","deprecated":null},{"type":"signal","name":"run-color-chooser","type_name":"WebView","summary":"This signal is emitted when the user interacts with a HTML element, requesting from WebKit to show a ...","deprecated":null},{"type":"signal","name":"run-file-chooser","type_name":"WebView","summary":"This signal is emitted when the user interacts with a HTML element, requesting from WebKit to show a ...","deprecated":null},{"type":"signal","name":"script-dialog","type_name":"WebView","summary":"Emitted when JavaScript code calls window.alert, window.confirm or window.prompt, or when onbeforeunload event is fired. The @dialog parameter should ...","deprecated":null},{"type":"signal","name":"script-message-received","type_name":"UserContentManager","summary":"This signal is emitted when JavaScript in a web view calls window.webkit.messageHandlers..postMessage(), after registering using webkit_user_content_manager_register_script_message_handler()","deprecated":null},{"type":"signal","name":"script-message-with-reply-received","type_name":"UserContentManager","summary":"This signal is emitted when JavaScript in a web view calls window.webkit.messageHandlers..postMessage(), after registering using webkit_user_content_manager_register_script_message_handler_with_reply() The ...","deprecated":null},{"type":"signal","name":"sent-request","type_name":"WebResource","summary":"This signal is emitted when @request has been sent to the server. In case of a server redirection this ...","deprecated":null},{"type":"signal","name":"show-notification","type_name":"WebView","summary":"This signal is emitted when a notification should be presented to the user. The @notification is kept alive until ...","deprecated":null},{"type":"signal","name":"show-option-menu","type_name":"WebView","summary":"This signal is emitted when a select element in @web_view needs to display a dropdown menu. This signal can ...","deprecated":null},{"type":"signal","name":"start","type_name":"GeolocationManager","summary":"The signal is emitted to notify that @manager needs to start receiving position updates. After this signal is emitted ...","deprecated":null},{"type":"signal","name":"stop","type_name":"GeolocationManager","summary":"The signal is emitted to notify that @manager doesn't need to receive position updates anymore.","deprecated":null},{"type":"signal","name":"submit-form","type_name":"WebView","summary":"This signal is emitted when a form is about to be submitted. The @request argument passed contains information about ...","deprecated":null},{"type":"signal","name":"user-message-received","type_name":"WebContext","summary":"This signal is emitted when a #WebKitUserMessage is received from a web process extension. You can reply to the ...","deprecated":null},{"type":"signal","name":"user-message-received","type_name":"WebView","summary":"This signal is emitted when a #WebKitUserMessage is received from the #WebKitWebPage corresponding to @web_view. You can reply to ...","deprecated":null},{"type":"signal","name":"web-process-terminated","type_name":"WebView","summary":"This signal is emitted when the web process terminates abnormally due to @reason.","deprecated":null},{"type":"signal","name":"will-close","type_name":"AutomationSession","summary":"This signal is emitted when the given automation session is about to finish. It allows clients to perform any ...","deprecated":null},{"type":"type_func","name":"font_size_to_pixels","type_name":"Settings","ident":"webkit_settings_font_size_to_pixels","summary":"Convert @points to the equivalent value in pixels. Applications can use this function to convert font size values ...","deprecated":null},{"type":"type_func","name":"font_size_to_points","type_name":"Settings","ident":"webkit_settings_font_size_to_points","summary":"Convert @pixels to the equivalent value in points. Applications can use this function to convert font size values ...","deprecated":null},{"type":"type_func","name":"get_all_features","type_name":"Settings","ident":"webkit_settings_get_all_features","summary":"Gets the list of all available WebKit features. Features can be toggled with [method@Settings.set_feature_enabled], and their current state ...","deprecated":null},{"type":"type_func","name":"get_default","type_name":"NetworkSession","ident":"webkit_network_session_get_default","summary":"Get the default network session. The default network session is created using webkit_network_session_new() and passing %NULL as data and ...","deprecated":null},{"type":"type_func","name":"get_default","type_name":"WebContext","ident":"webkit_web_context_get_default","summary":"Gets the default web context.","deprecated":null},{"type":"type_func","name":"get_development_features","type_name":"Settings","ident":"webkit_settings_get_development_features","summary":"Gets the list of available development WebKit features. The returned features are a subset of those returned by ...","deprecated":null},{"type":"type_func","name":"get_experimental_features","type_name":"Settings","ident":"webkit_settings_get_experimental_features","summary":"Gets the list of available experimental WebKit features. The returned features are a subset of those returned by ...","deprecated":null},{"type":"type_func","name":"quark","type_name":"DownloadError","ident":"webkit_download_error_quark","summary":"Gets the quark for the domain of download errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"FaviconDatabaseError","ident":"webkit_favicon_database_error_quark","summary":"Gets the quark for the domain of favicon database errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"JavascriptError","ident":"webkit_javascript_error_quark","summary":"Gets the quark for the domain of JavaScript errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"MediaError","ident":"webkit_media_error_quark","summary":"Gets the quark for the domain of media errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"NetworkError","ident":"webkit_network_error_quark","summary":"Gets the quark for the domain of networking errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"PolicyError","ident":"webkit_policy_error_quark","summary":"Gets the quark for the domain of policy errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"PrintError","ident":"webkit_print_error_quark","summary":"Gets the quark for the domain of printing errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"SnapshotError","ident":"webkit_snapshot_error_quark","summary":"Gets the quark for the domain of page snapshot errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"UserContentFilterError","ident":"webkit_user_content_filter_error_quark","summary":"Gets the quark for the domain of user content filter errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"UserMessageError","ident":"webkit_user_message_error_quark","summary":"Gets the quark for the domain of user message errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"WebExtensionError","ident":"webkit_web_extension_error_quark","summary":"Gets the quark for the domain of Web Extension errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"WebExtensionMatchPatternError","ident":"webkit_web_extension_match_pattern_error_quark","summary":"Gets the quark for the domain of Web Extension Match Pattern errors.","deprecated":null},{"type":"type_func","name":"register_custom_URL_scheme","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_register_custom_URL_scheme","summary":"Registers a custom URL scheme that can be used in match patterns. This method should be used to ..."},{"type":"type_func","name":"register_custom_url_scheme","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_register_custom_url_scheme","summary":"Registers a custom URL scheme that can be used in match patterns. This method should be used to ..."},{"type":"type_func","name":"set_memory_pressure_settings","type_name":"NetworkSession","ident":"webkit_network_session_set_memory_pressure_settings","summary":"Sets @settings as the #WebKitMemoryPressureSettings. Sets @settings as the #WebKitMemoryPressureSettings to be used by the network process created ...","deprecated":null},{"type":"vfunc","name":"allow","type_name":"PermissionRequest","summary":"Allow the action which triggered this request.","deprecated":null},{"type":"vfunc","name":"authenticate","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"close","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"committed","type_name":"InputMethodContext","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"context_menu","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"context_menu_dismissed","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"create","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"decide_policy","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"delete_surrounding","type_name":"InputMethodContext","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"deny","type_name":"PermissionRequest","summary":"Deny the action which triggered this request.","deprecated":null},{"type":"vfunc","name":"enter_fullscreen","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"filter_key_event","type_name":"InputMethodContext","summary":"Allow @key_event to be handled by the input method. If %TRUE is returned, then no further processing should ...","deprecated":null},{"type":"vfunc","name":"get_preedit","type_name":"InputMethodContext","summary":"Get the pre-edit string and a list of WebKitInputMethodUnderline. Get the current pre-edit string for the @context, and ...","deprecated":null},{"type":"vfunc","name":"insecure_content_detected","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"leave_fullscreen","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"load_changed","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"load_failed","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"load_failed_with_tls_errors","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"mouse_target_changed","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"notify_cursor_area","type_name":"InputMethodContext","summary":"Notify @context that cursor area changed in input associated.","deprecated":null},{"type":"vfunc","name":"notify_focus_in","type_name":"InputMethodContext","summary":"Notify @context that input associated has gained focus.","deprecated":null},{"type":"vfunc","name":"notify_focus_out","type_name":"InputMethodContext","summary":"Notify @context that input associated has lost focus.","deprecated":null},{"type":"vfunc","name":"notify_surrounding","type_name":"InputMethodContext","summary":"Notify @context that the context surrounding the cursor has changed. If there's no selection @selection_index is the same ...","deprecated":null},{"type":"vfunc","name":"permission_request","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"preedit_changed","type_name":"InputMethodContext","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"preedit_finished","type_name":"InputMethodContext","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"preedit_started","type_name":"InputMethodContext","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"print","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"query_permission_state","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"ready_to_show","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"reset","type_name":"InputMethodContext","summary":"Reset the @context. This will typically cause the input to clear the preedit state.","deprecated":null},{"type":"vfunc","name":"resource_load_started","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"run_as_modal","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"run_color_chooser","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"run_file_chooser","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"script_dialog","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"set_enable_preedit","type_name":"InputMethodContext","summary":"Set whether @context should enable preedit to display feedback.","deprecated":null},{"type":"vfunc","name":"show_notification","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"show_option_menu","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"submit_form","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"user_message_received","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"web_process_crashed","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"web_process_terminated","type_name":"WebView","summary":"No description available.","deprecated":null}],"terms":{}} \ No newline at end of file +{"meta":{"ns":"WebKit","version":"6.0","generator":"gi-docgen","generator-version":"2023.4"},"symbols":[{"type":"bitfield","name":"EditorTypingAttributes","ctype":"WebKitEditorTypingAttributes","summary":"Enum values with flags representing typing attributes.","deprecated":null},{"type":"bitfield","name":"FindOptions","ctype":"WebKitFindOptions","summary":"Enum values used to specify search options.","deprecated":null},{"type":"bitfield","name":"HitTestResultContext","ctype":"WebKitHitTestResultContext","summary":"Enum values with flags representing the context of a #WebKitHitTestResult.","deprecated":null},{"type":"bitfield","name":"InputHints","ctype":"WebKitInputHints","summary":"Enum values used to describe hints that might be taken into account by input methods.","deprecated":null},{"type":"bitfield","name":"SnapshotOptions","ctype":"WebKitSnapshotOptions","summary":"Enum values used to specify options when taking a snapshot from a #WebKitWebView.","deprecated":null},{"type":"bitfield","name":"WebExtensionMatchPatternOptions","ctype":"WebKitWebExtensionMatchPatternOptions","summary":"Enum values representing matching options.","deprecated":null},{"type":"bitfield","name":"WebsiteDataTypes","ctype":"WebKitWebsiteDataTypes","summary":"Enum values with flags representing types of Website data.","deprecated":null},{"type":"bitfield","name":"XRSessionFeatures","ctype":"WebKitXRSessionFeatures","summary":"Enum values representing the XR session features. See . And, see for hand tracking.","deprecated":null},{"type":"callback","name":"URISchemeRequestCallback","ctype":"WebKitURISchemeRequestCallback","summary":"Type definition for a function that will be called back when an URI request is made for a user ...","deprecated":null},{"type":"class","name":"AuthenticationRequest","ctype":"WebKitAuthenticationRequest","summary":"Represents an authentication request. Whenever a client attempts to load a page protected by HTTP authentication, credentials will ...","deprecated":null},{"type":"class","name":"AutomationSession","ctype":"WebKitAutomationSession","summary":"Automation Session. WebKitAutomationSession represents an automation session of a WebKitWebContext. When a new session is requested, a WebKitAutomationSession ...","deprecated":null},{"type":"class","name":"BackForwardList","ctype":"WebKitBackForwardList","summary":"List of visited pages. WebKitBackForwardList maintains a list of visited pages used to navigate to recent pages. Items ...","deprecated":null},{"type":"class","name":"BackForwardListItem","ctype":"WebKitBackForwardListItem","summary":"One item of the #WebKitBackForwardList. A history item is part of the #WebKitBackForwardList and consists out of a ...","deprecated":null},{"type":"class","name":"ClipboardPermissionRequest","ctype":"WebKitClipboardPermissionRequest","summary":"A permission request for reading clipboard contents. WebKitClipboardPermissionRequest represents a request for permission to decide whether WebKit can ...","deprecated":null},{"type":"class","name":"ColorChooserRequest","ctype":"WebKitColorChooserRequest","summary":"A request to open a color chooser. Whenever the user interacts with an HTML element, WebKit will ...","deprecated":null},{"type":"class","name":"ContextMenu","ctype":"WebKitContextMenu","summary":"Represents the context menu in a #WebKitWebView. #WebKitContextMenu represents a context menu containing #WebKitContextMenuItems in a #WebKitWebView. ...","deprecated":null},{"type":"class","name":"ContextMenuItem","ctype":"WebKitContextMenuItem","summary":"One item of a #WebKitContextMenu. The #WebKitContextMenu is composed of #WebKitContextMenuItems. These items can be created from a ...","deprecated":null},{"type":"class","name":"CookieManager","ctype":"WebKitCookieManager","summary":"Defines how to handle cookies in a #WebKitWebContext. The WebKitCookieManager defines how to set up and handle cookies. ...","deprecated":null},{"type":"class","name":"DeviceInfoPermissionRequest","ctype":"WebKitDeviceInfoPermissionRequest","summary":"A permission request for enumerating the user's media devices WebKitDeviceInfoPermissionRequest represents a request for permission to whether WebKit ...","deprecated":null},{"type":"class","name":"Download","ctype":"WebKitDownload","summary":"Object used to communicate with the application when downloading. #WebKitDownload carries information about a download request and response, ...","deprecated":null},{"type":"class","name":"EditorState","ctype":"WebKitEditorState","summary":"Web editor state. WebKitEditorState represents the state of a #WebKitWebView editor. Use webkit_web_view_get_editor_state() to get the WebKitEditorState of ...","deprecated":null},{"type":"class","name":"FaviconDatabase","ctype":"WebKitFaviconDatabase","summary":"Provides access to the icons associated with web sites. WebKit will automatically look for available icons in ...","deprecated":null},{"type":"class","name":"FileChooserRequest","ctype":"WebKitFileChooserRequest","summary":"A request to open a file chooser. Whenever the user interacts with an HTML input element with file ...","deprecated":null},{"type":"class","name":"FindController","ctype":"WebKitFindController","summary":"Controls text search in a #WebKitWebView. A #WebKitFindController is used to search text in a #WebKitWebView. You can ...","deprecated":null},{"type":"class","name":"FormSubmissionRequest","ctype":"WebKitFormSubmissionRequest","summary":"Represents a form submission request. When a form is about to be submitted in a #WebKitWebView, the #WebKitWebView::submit-form ...","deprecated":null},{"type":"class","name":"GeolocationManager","ctype":"WebKitGeolocationManager","summary":"Geolocation manager. WebKitGeolocationManager provides API to get the geographical position of the user. Once a #WebKitGeolocationPermissionRequest is allowed, ...","deprecated":null},{"type":"class","name":"GeolocationPermissionRequest","ctype":"WebKitGeolocationPermissionRequest","summary":"A permission request for sharing the user's location. WebKitGeolocationPermissionRequest represents a request for permission to decide whether WebKit ...","deprecated":null},{"type":"class","name":"HitTestResult","ctype":"WebKitHitTestResult","summary":"Result of a Hit Test. A Hit Test is an operation to get context information about a given ...","deprecated":null},{"type":"class","name":"InputMethodContext","ctype":"WebKitInputMethodContext","summary":"Base class for input method contexts. WebKitInputMethodContext defines the interface to implement WebKit input methods. The input methods ...","deprecated":null},{"type":"class","name":"MediaKeySystemPermissionRequest","ctype":"WebKitMediaKeySystemPermissionRequest","summary":"A permission request for using an EME Content Decryption Module. WebKitMediaKeySystemPermissionRequest represents a request for permission to decide ...","deprecated":null},{"type":"class","name":"NavigationPolicyDecision","ctype":"WebKitNavigationPolicyDecision","summary":"A policy decision for navigation actions. WebKitNavigationPolicyDecision represents a policy decision for events associated with navigations. If the ...","deprecated":null},{"type":"class","name":"NetworkSession","ctype":"WebKitNetworkSession","summary":"Manages network configuration.","deprecated":null},{"type":"class","name":"Notification","ctype":"WebKitNotification","summary":"Holds information about a notification that should be shown to the user.","deprecated":null},{"type":"class","name":"NotificationPermissionRequest","ctype":"WebKitNotificationPermissionRequest","summary":"A permission request for displaying web notifications. WebKitNotificationPermissionRequest represents a request for permission to decide whether WebKit should ...","deprecated":null},{"type":"class","name":"OptionMenu","ctype":"WebKitOptionMenu","summary":"Represents the dropdown menu of a `select` element in a #WebKitWebView. When a select element in a #WebKitWebView ...","deprecated":null},{"type":"class","name":"PointerLockPermissionRequest","ctype":"WebKitPointerLockPermissionRequest","summary":"A permission request for locking the pointer. WebKitPointerLockPermissionRequest represents a request for permission to decide whether WebKit can ...","deprecated":null},{"type":"class","name":"PolicyDecision","ctype":"WebKitPolicyDecision","summary":"A pending policy decision. Often WebKit allows the client to decide the policy for certain operations. For instance, ...","deprecated":null},{"type":"class","name":"PrintOperation","ctype":"WebKitPrintOperation","summary":"Controls a print operation. A #WebKitPrintOperation controls a print operation in WebKit. With a similar API to #GtkPrintOperation, ...","deprecated":null},{"type":"class","name":"ResponsePolicyDecision","ctype":"WebKitResponsePolicyDecision","summary":"A policy decision for resource responses. WebKitResponsePolicyDecision represents a policy decision for a resource response, whether from the ...","deprecated":null},{"type":"class","name":"SecurityManager","ctype":"WebKitSecurityManager","summary":"Controls security settings in a #WebKitWebContext. The #WebKitSecurityManager defines security settings for URI schemes in a #WebKitWebContext. Get ...","deprecated":null},{"type":"class","name":"Settings","ctype":"WebKitSettings","summary":"Control the behaviour of a #WebKitWebView. #WebKitSettings can be applied to a #WebKitWebView to control text charset, color, ...","deprecated":null},{"type":"class","name":"URIRequest","ctype":"WebKitURIRequest","summary":"Represents a URI request. A #WebKitURIRequest can be created with a URI using the webkit_uri_request_new() method, and you ...","deprecated":null},{"type":"class","name":"URIResponse","ctype":"WebKitURIResponse","summary":"Represents an URI response. A #WebKitURIResponse contains information such as the URI, the status code, the content length, ...","deprecated":null},{"type":"class","name":"URISchemeRequest","ctype":"WebKitURISchemeRequest","summary":"Represents a URI scheme request. If you register a particular URI scheme in a #WebKitWebContext, using webkit_web_context_register_uri_scheme(), you ...","deprecated":null},{"type":"class","name":"URISchemeResponse","ctype":"WebKitURISchemeResponse","summary":"Represents a URI scheme response. If you register a particular URI scheme in a #WebKitWebContext, using webkit_web_context_register_uri_scheme(), you ...","deprecated":null},{"type":"class","name":"UserContentFilterStore","ctype":"WebKitUserContentFilterStore","summary":"Handles storage of user content filters on disk. The WebKitUserContentFilterStore provides the means to import and save [JSON ...","deprecated":null},{"type":"class","name":"UserContentManager","ctype":"WebKitUserContentManager","summary":"Manages user-defined content which affects web pages. Using a #WebKitUserContentManager user CSS style sheets can be set to ...","deprecated":null},{"type":"class","name":"UserMediaPermissionRequest","ctype":"WebKitUserMediaPermissionRequest","summary":"A permission request for accessing user's audio/video devices. WebKitUserMediaPermissionRequest represents a request for permission to decide whether WebKit ...","deprecated":null},{"type":"class","name":"UserMessage","ctype":"WebKitUserMessage","summary":"Message that can be sent between the UI process and web process extensions. A WebKitUserMessage is a message ...","deprecated":null},{"type":"class","name":"WebContext","ctype":"WebKitWebContext","summary":"Manages aspects common to all #WebKitWebViews The #WebKitWebContext manages all aspects common to all #WebKitWebViews. You can ...","deprecated":null},{"type":"class","name":"WebExtension","ctype":"WebKitWebExtension","summary":"Represents a [WebExtension](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions). A #WebKitWebExtension object encapsulates a web extension\u2019s resources that are defined by a [`manifest.json` file](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json). ...","deprecated":null},{"type":"class","name":"WebInspector","ctype":"WebKitWebInspector","summary":"Access to the WebKit inspector. The WebKit Inspector is a graphical tool to inspect and change the content ...","deprecated":null},{"type":"class","name":"WebResource","ctype":"WebKitWebResource","summary":"Represents a resource at the end of a URI. A #WebKitWebResource encapsulates content for each resource at the ...","deprecated":null},{"type":"class","name":"WebView","ctype":"WebKitWebView","summary":"The central class of the WPE WebKit and WebKitGTK APIs. #WebKitWebView is the central class of the WPE ...","deprecated":null},{"type":"class","name":"WebViewBase","ctype":"WebKitWebViewBase","summary":"No description available.","deprecated":null},{"type":"class","name":"WebsiteDataAccessPermissionRequest","ctype":"WebKitWebsiteDataAccessPermissionRequest","summary":"A permission request for accessing website data from third-party domains. WebKitWebsiteDataAccessPermissionRequest represents a request for permission to allow ...","deprecated":null},{"type":"class","name":"WebsiteDataManager","ctype":"WebKitWebsiteDataManager","summary":"Manages data stored locally by web sites. You can use WebKitWebsiteDataManager to configure the local directories where website ...","deprecated":null},{"type":"class","name":"WebsitePolicies","ctype":"WebKitWebsitePolicies","summary":"View specific website policies. WebKitWebsitePolicies allows you to configure per-page policies, currently only autoplay policies are supported.","deprecated":null},{"type":"class","name":"WindowProperties","ctype":"WebKitWindowProperties","summary":"Window properties of a #WebKitWebView. The content of a #WebKitWebView can request to change certain properties of the ...","deprecated":null},{"type":"class","name":"XRPermissionRequest","ctype":"WebKitXRPermissionRequest","summary":"A permission request for accessing virtual reality (VR) and augmented reality (AR) devices, including sensors and head-mounted displays. ...","deprecated":null},{"type":"constant","name":"EDITING_COMMAND_COPY","ident":"WEBKIT_EDITING_COMMAND_COPY","summary":"The copy clipboard command. Copies the current selection inside a #WebKitWebView to the clipboard. You can check whether it's ...","deprecated":null},{"type":"constant","name":"EDITING_COMMAND_CREATE_LINK","ident":"WEBKIT_EDITING_COMMAND_CREATE_LINK","summary":"The create link command. Creates a link element that is inserted at the current cursor position. If there's a ...","deprecated":null},{"type":"constant","name":"EDITING_COMMAND_CUT","ident":"WEBKIT_EDITING_COMMAND_CUT","summary":"The cut clipboard command. Copies the current selection inside a #WebKitWebView to the clipboard and deletes the selected content. ...","deprecated":null},{"type":"constant","name":"EDITING_COMMAND_INSERT_IMAGE","ident":"WEBKIT_EDITING_COMMAND_INSERT_IMAGE","summary":"The insert image command. Creates an image element that is inserted at the current cursor position. It receives an ...","deprecated":null},{"type":"constant","name":"EDITING_COMMAND_PASTE","ident":"WEBKIT_EDITING_COMMAND_PASTE","summary":"The paste clipboard command. Pastes the contents of the clipboard to a #WebKitWebView. You can check whether it's possible ...","deprecated":null},{"type":"constant","name":"EDITING_COMMAND_PASTE_AS_PLAIN_TEXT","ident":"WEBKIT_EDITING_COMMAND_PASTE_AS_PLAIN_TEXT","summary":"The paste as plaintext clipboard command. Pastes the contents of the clipboard to a #WebKitWebView, with formatting removed. You ...","deprecated":null},{"type":"constant","name":"EDITING_COMMAND_REDO","ident":"WEBKIT_EDITING_COMMAND_REDO","summary":"The redo command. Redoes a previously undone editing command in a #WebKitWebView. You can check whether it's possible to ...","deprecated":null},{"type":"constant","name":"EDITING_COMMAND_SELECT_ALL","ident":"WEBKIT_EDITING_COMMAND_SELECT_ALL","summary":"The select all command. Selects all the content of the current text field in a #WebKitWebView. It is always ...","deprecated":null},{"type":"constant","name":"EDITING_COMMAND_UNDO","ident":"WEBKIT_EDITING_COMMAND_UNDO","summary":"The undo command. Undoes the last editing command in a #WebKitWebView. You can check whether it's possible to execute ...","deprecated":null},{"type":"constant","name":"MAJOR_VERSION","ident":"WEBKIT_MAJOR_VERSION","summary":"Like webkit_get_major_version(), but from the headers used at application compile time, rather than from the library linked against at ...","deprecated":null},{"type":"constant","name":"MICRO_VERSION","ident":"WEBKIT_MICRO_VERSION","summary":"Like webkit_get_micro_version(), but from the headers used at application compile time, rather than from the library linked against at ...","deprecated":null},{"type":"constant","name":"MINOR_VERSION","ident":"WEBKIT_MINOR_VERSION","summary":"Like webkit_get_minor_version(), but from the headers used at application compile time, rather than from the library linked against at ...","deprecated":null},{"type":"content","name":"Environment variables","href":"environment-variables.html","summary":" # List of environment variables WebKit uses several environment variables, most of which are designed for developers ..."},{"type":"content","name":"Migrating WebKitGTK Applications to GTK 4","href":"migrating-to-webkitgtk-6.0.html","summary":" # Migrating WebKitGTK Applications to GTK 4 This document contains guidance to application developers looking to migrate ..."},{"type":"content","name":"Overview","href":"overview.html","summary":" WebKitGTK is a GObject-based library that provides a GTK widget to interact with the WebKit engine. It can ..."},{"type":"content","name":"Pointers for contribution","href":"contributing.html","summary":" ## Contacting Us You can find the developers behind WebKitGTK on various platforms: - [Mastodon](https://floss.social/@WebKitGTK). ..."},{"type":"content","name":"Profiling","href":"profiling.html","summary":" # Profiling with Sysprof ## Prerequisites To work with [Sysprof](https://gitlab.gnome.org/GNOME/sysprof/) one needs to install it first: ..."},{"type":"content","name":"Remote Web Inspector","href":"remote-inspector.html","summary":" # Remote Web Inspector The remote Web Inspector enables debugging of web pages from a different device. ..."},{"type":"ctor","name":"new","type_name":"ContextMenu","ident":"webkit_context_menu_new","summary":"Creates a new #WebKitContextMenu object. Creates a new #WebKitContextMenu object to be used as a submenu of an ...","deprecated":null},{"type":"ctor","name":"new","type_name":"NetworkSession","ident":"webkit_network_session_new","summary":"Creates a new #WebKitNetworkSession with a persistent #WebKitWebsiteDataManager. The parameters @data_directory and @cache_directory will be used as construct properties ...","deprecated":null},{"type":"ctor","name":"new","type_name":"PrintOperation","ident":"webkit_print_operation_new","summary":"Create a new #WebKitPrintOperation to print @web_view contents.","deprecated":null},{"type":"ctor","name":"new","type_name":"Settings","ident":"webkit_settings_new","summary":"Creates a new #WebKitSettings instance with default values. It must be manually attached to a #WebKitWebView. See also webkit_settings_new_with_settings().","deprecated":null},{"type":"ctor","name":"new","type_name":"URIRequest","ident":"webkit_uri_request_new","summary":"Creates a new #WebKitURIRequest for the given URI.","deprecated":null},{"type":"ctor","name":"new","type_name":"URISchemeResponse","ident":"webkit_uri_scheme_response_new","summary":"Create a new #WebKitURISchemeResponse","deprecated":null},{"type":"ctor","name":"new","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_new","summary":"Create a new #WebKitUserContentFilterStore to manipulate filters stored at @storage_path. The path must point to a local filesystem, ...","deprecated":null},{"type":"ctor","name":"new","type_name":"UserContentManager","ident":"webkit_user_content_manager_new","summary":"Creates a new user content manager.","deprecated":null},{"type":"ctor","name":"new","type_name":"UserMessage","ident":"webkit_user_message_new","summary":"Create a new #WebKitUserMessage with @name.","deprecated":null},{"type":"ctor","name":"new","type_name":"WebContext","ident":"webkit_web_context_new","summary":"Create a new #WebKitWebContext.","deprecated":null},{"type":"ctor","name":"new","type_name":"WebExtension","ident":"webkit_web_extension_new","summary":"Creates a new WebKitWebExtension from a folder containing the extension contents. The folder must contain a `manifest.json` file. If ...","deprecated":null},{"type":"ctor","name":"new","type_name":"WebsitePolicies","ident":"webkit_website_policies_new","summary":"Create a new #WebKitWebsitePolicies.","deprecated":null},{"type":"ctor","name":"new","type_name":"WebView","ident":"webkit_web_view_new","summary":"Creates a new #WebKitWebView with the default #WebKitWebContext. Creates a new #WebKitWebView with the default #WebKitWebContext and no ...","deprecated":null},{"type":"ctor","name":"new","type_name":"ApplicationInfo","ident":"webkit_application_info_new","summary":"Creates a new #WebKitApplicationInfo","deprecated":null},{"type":"ctor","name":"new","type_name":"Credential","ident":"webkit_credential_new","summary":"Create a new credential from the provided username, password and persistence mode.","deprecated":null},{"type":"ctor","name":"new","type_name":"GeolocationPosition","ident":"webkit_geolocation_position_new","summary":"Create a new #WebKitGeolocationPosition.","deprecated":null},{"type":"ctor","name":"new","type_name":"InputMethodUnderline","ident":"webkit_input_method_underline_new","summary":"Create a new #WebKitInputMethodUnderline for the given range in preedit string","deprecated":null},{"type":"ctor","name":"new","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_new","summary":"Create a new #WebKitMemoryPressureSettings with the default values.","deprecated":null},{"type":"ctor","name":"new","type_name":"NetworkProxySettings","ident":"webkit_network_proxy_settings_new","summary":"Create a new #WebKitNetworkProxySettings with the given @default_proxy_uri and @ignore_hosts. The default proxy URI will be used for ...","deprecated":null},{"type":"ctor","name":"new","type_name":"SecurityOrigin","ident":"webkit_security_origin_new","summary":"Create a new security origin from the provided protocol, host and port.","deprecated":null},{"type":"ctor","name":"new","type_name":"UserScript","ident":"webkit_user_script_new","summary":"Creates a new user script. Scripts can be applied to some URIs only by passing non-null values for ...","deprecated":null},{"type":"ctor","name":"new","type_name":"UserStyleSheet","ident":"webkit_user_style_sheet_new","summary":"Creates a new user style sheet. Style sheets can be applied to some URIs only by passing non-null ...","deprecated":null},{"type":"ctor","name":"new","type_name":"WebViewSessionState","ident":"webkit_web_view_session_state_new","summary":"Creates a new #WebKitWebViewSessionState from serialized data.","deprecated":null},{"type":"ctor","name":"new_all_hosts_and_schemes","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_new_all_hosts_and_schemes","summary":"Returns a new #WebKitWebExtensionMatchPattern that has `*` for scheme, host, and path.","deprecated":null},{"type":"ctor","name":"new_all_urls","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_new_all_urls","summary":"Returns a new #WebKitWebExtensionMatchPattern for ``.","deprecated":null},{"type":"ctor","name":"new_ephemeral","type_name":"NetworkSession","ident":"webkit_network_session_new_ephemeral","summary":"Creates a new #WebKitNetworkSession with an ephemeral #WebKitWebsiteDataManager.","deprecated":null},{"type":"ctor","name":"new_for_certificate","type_name":"Credential","ident":"webkit_credential_new_for_certificate","summary":"Create a new credential from the @certificate and persistence mode. Note that %WEBKIT_CREDENTIAL_PERSISTENCE_PERMANENT is not supported for certificate credentials.","deprecated":null},{"type":"ctor","name":"new_for_certificate_pin","type_name":"Credential","ident":"webkit_credential_new_for_certificate_pin","summary":"Create a new credential from the provided PIN and persistence mode. Note that %WEBKIT_CREDENTIAL_PERSISTENCE_PERMANENT is not supported for ...","deprecated":null},{"type":"ctor","name":"new_for_uri","type_name":"SecurityOrigin","ident":"webkit_security_origin_new_for_uri","summary":"Create a new security origin from the provided. Create a new security origin from the provided URI. Components ...","deprecated":null},{"type":"ctor","name":"new_for_world","type_name":"UserScript","ident":"webkit_user_script_new_for_world","summary":"Creates a new user script for script world with name @world_name. See webkit_user_script_new() for a full description.","deprecated":null},{"type":"ctor","name":"new_for_world","type_name":"UserStyleSheet","ident":"webkit_user_style_sheet_new_for_world","summary":"Creates a new user style sheet for script world. Creates a new user style sheet for script world ...","deprecated":null},{"type":"ctor","name":"new_from_gaction","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_from_gaction","summary":"Creates a new #WebKitContextMenuItem for the given @action and @label. On activation @target will be passed as parameter ...","deprecated":null},{"type":"ctor","name":"new_from_stock_action","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_from_stock_action","summary":"Creates a new #WebKitContextMenuItem for the given stock action. Stock actions are handled automatically by WebKit so that, ...","deprecated":null},{"type":"ctor","name":"new_from_stock_action_with_label","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_from_stock_action_with_label","summary":"Creates a new #WebKitContextMenuItem for the given stock action using the given @label. Stock actions have a predefined ...","deprecated":null},{"type":"ctor","name":"new_separator","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_separator","summary":"Creates a new #WebKitContextMenuItem representing a separator.","deprecated":null},{"type":"ctor","name":"new_with_fd_list","type_name":"UserMessage","ident":"webkit_user_message_new_with_fd_list","summary":"Create a new #WebKitUserMessage including also a list of UNIX file descriptors to be sent.","deprecated":null},{"type":"ctor","name":"new_with_items","type_name":"ContextMenu","ident":"webkit_context_menu_new_with_items","summary":"Creates a new #WebKitContextMenu object with the given items. Creates a new #WebKitContextMenu object to be used as ...","deprecated":null},{"type":"ctor","name":"new_with_policies","type_name":"WebsitePolicies","ident":"webkit_website_policies_new_with_policies","summary":"Create a new #WebKitWebsitePolicies with given policies. Create a new #WebKitWebsitePolicies with policies given as variadic arguments.","deprecated":null},{"type":"ctor","name":"new_with_scheme","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_new_with_scheme","summary":"Returns a new #WebKitWebExtensionMatchPattern for the specified @scheme, @host, and @path strings.","deprecated":null},{"type":"ctor","name":"new_with_settings","type_name":"Settings","ident":"webkit_settings_new_with_settings","summary":"Creates a new #WebKitSettings instance with the given settings. It must be manually attached to a #WebKitWebView.","deprecated":null},{"type":"ctor","name":"new_with_string","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_new_with_string","summary":"Returns a new #WebKitWebExtensionMatchPattern for the specified @string.","deprecated":null},{"type":"ctor","name":"new_with_submenu","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_with_submenu","summary":"Creates a new #WebKitContextMenuItem using the given @label with a submenu.","deprecated":null},{"type":"domain","name":"DownloadError","ctype":"WebKitDownloadError","summary":"Enum values used to denote the various download errors.","deprecated":null},{"type":"domain","name":"FaviconDatabaseError","ctype":"WebKitFaviconDatabaseError","summary":"Enum values used to denote the various errors related to the #WebKitFaviconDatabase.","deprecated":null},{"type":"domain","name":"JavascriptError","ctype":"WebKitJavascriptError","summary":"Enum values used to denote errors happening when executing JavaScript","deprecated":null},{"type":"domain","name":"MediaError","ctype":"WebKitMediaError","summary":"Enum values used to denote the various media errors.","deprecated":null},{"type":"domain","name":"NetworkError","ctype":"WebKitNetworkError","summary":"Enum values used to denote the various network errors.","deprecated":null},{"type":"domain","name":"PolicyError","ctype":"WebKitPolicyError","summary":"Enum values used to denote the various policy errors.","deprecated":null},{"type":"domain","name":"PrintError","ctype":"WebKitPrintError","summary":"Enum values used to denote the various print errors.","deprecated":null},{"type":"domain","name":"SnapshotError","ctype":"WebKitSnapshotError","summary":"Enum values used to denote errors happening when creating snapshots of #WebKitWebView","deprecated":null},{"type":"domain","name":"UserContentFilterError","ctype":"WebKitUserContentFilterError","summary":"Errors that can occur while compiling content filters.","deprecated":null},{"type":"domain","name":"UserMessageError","ctype":"WebKitUserMessageError","summary":"Enum values used to denote errors happening when sending user messages.","deprecated":null},{"type":"domain","name":"WebExtensionError","ctype":"WebKitWebExtensionError","summary":"Enum values used to denote errors happening when parsing a #WebKitWebExtension","deprecated":null},{"type":"domain","name":"WebExtensionMatchPatternError","ctype":"WebKitWebExtensionMatchPatternError","summary":"Enum values used to denote errors happening when creating a #WebKitWebExtensionMatchPattern","deprecated":null},{"type":"enum","name":"AuthenticationScheme","ctype":"WebKitAuthenticationScheme","summary":"Enum values representing the authentication scheme.","deprecated":null},{"type":"enum","name":"AutomationBrowsingContextPresentation","ctype":"WebKitAutomationBrowsingContextPresentation","summary":"Enum values used for determining the automation browsing context presentation.","deprecated":null},{"type":"enum","name":"AutoplayPolicy","ctype":"WebKitAutoplayPolicy","summary":"Enum values used to specify autoplay policies.","deprecated":null},{"type":"enum","name":"CacheModel","ctype":"WebKitCacheModel","summary":"Enum values used for determining the #WebKitWebContext cache model.","deprecated":null},{"type":"enum","name":"ContextMenuAction","ctype":"WebKitContextMenuAction","summary":"Enum values used to denote the stock actions for #WebKitContextMenuItems","deprecated":null},{"type":"enum","name":"CookieAcceptPolicy","ctype":"WebKitCookieAcceptPolicy","summary":"Enum values used to denote the cookie acceptance policies.","deprecated":null},{"type":"enum","name":"CookiePersistentStorage","ctype":"WebKitCookiePersistentStorage","summary":"Enum values used to denote the cookie persistent storage types.","deprecated":null},{"type":"enum","name":"CredentialPersistence","ctype":"WebKitCredentialPersistence","summary":"Enum values representing the duration for which a credential persists.","deprecated":null},{"type":"enum","name":"FeatureStatus","ctype":"WebKitFeatureStatus","summary":"Describes the status of a [struct@WebKitFeature]. The status for a given feature can be obtained with [id@webkit_feature_get_status].","deprecated":null},{"type":"enum","name":"HardwareAccelerationPolicy","ctype":"WebKitHardwareAccelerationPolicy","summary":"Enum values used for determining the hardware acceleration policy.","deprecated":null},{"type":"enum","name":"InputPurpose","ctype":"WebKitInputPurpose","summary":"Enum values used to describe the primary purpose of the active editable element.","deprecated":null},{"type":"enum","name":"InsecureContentEvent","ctype":"WebKitInsecureContentEvent","summary":"Enum values previously used to denote the different events which can trigger the detection of insecure content. Since 2.46, ...","deprecated":"2.46"},{"type":"enum","name":"LoadEvent","ctype":"WebKitLoadEvent","summary":"Enum values used to denote the different events that happen during a #WebKitWebView load operation.","deprecated":null},{"type":"enum","name":"MediaCaptureState","ctype":"WebKitMediaCaptureState","summary":"Enum values used to specify the capture state of a media device.","deprecated":null},{"type":"enum","name":"NavigationType","ctype":"WebKitNavigationType","summary":"Enum values used to denote the various navigation types.","deprecated":null},{"type":"enum","name":"NetworkProxyMode","ctype":"WebKitNetworkProxyMode","summary":"Enum values used to set the network proxy mode.","deprecated":null},{"type":"enum","name":"PermissionState","ctype":"WebKitPermissionState","summary":"Enum values representing query permission results.","deprecated":null},{"type":"enum","name":"PolicyDecisionType","ctype":"WebKitPolicyDecisionType","summary":"Enum values used for determining the type of a policy decision during #WebKitWebView::decide-policy.","deprecated":null},{"type":"enum","name":"PrintOperationResponse","ctype":"WebKitPrintOperationResponse","summary":"Enum values representing the response of the print dialog shown with webkit_print_operation_run_dialog().","deprecated":null},{"type":"enum","name":"SaveMode","ctype":"WebKitSaveMode","summary":"Enum values to specify the different ways in which a #WebKitWebView can save its current web page into a ...","deprecated":null},{"type":"enum","name":"ScriptDialogType","ctype":"WebKitScriptDialogType","summary":"Enum values used for determining the type of #WebKitScriptDialog","deprecated":null},{"type":"enum","name":"SnapshotRegion","ctype":"WebKitSnapshotRegion","summary":"Enum values used to specify the region from which to get a #WebKitWebView snapshot","deprecated":null},{"type":"enum","name":"TLSErrorsPolicy","ctype":"WebKitTLSErrorsPolicy","summary":"Enum values used to denote the TLS errors policy.","deprecated":null},{"type":"enum","name":"UserContentInjectedFrames","ctype":"WebKitUserContentInjectedFrames","summary":"Specifies in which frames user style sheets are to be inserted in.","deprecated":null},{"type":"enum","name":"UserScriptInjectionTime","ctype":"WebKitUserScriptInjectionTime","summary":"Specifies at which place of documents an user script will be inserted.","deprecated":null},{"type":"enum","name":"UserStyleLevel","ctype":"WebKitUserStyleLevel","summary":"Specifies how to treat an user style sheet.","deprecated":null},{"type":"enum","name":"WebExtensionMode","ctype":"WebKitWebExtensionMode","summary":"Enum values used for setting if a #WebKitWebView is intended for WebExtensions.","deprecated":null},{"type":"enum","name":"WebProcessTerminationReason","ctype":"WebKitWebProcessTerminationReason","summary":"Enum values used to specify the reason why the web process terminated abnormally.","deprecated":null},{"type":"enum","name":"XRSessionMode","ctype":"WebKitXRSessionMode","summary":"Enum values representing the XR session mode. See ","deprecated":null},{"type":"function","name":"get_major_version","ident":"webkit_get_major_version","summary":"Returns the major version number of the WebKit library. (e.g. in WebKit version 1.8.3 this is 1.) ...","deprecated":null},{"type":"function","name":"get_micro_version","ident":"webkit_get_micro_version","summary":"Returns the micro version number of the WebKit library. (e.g. in WebKit version 1.8.3 this is 3.) ...","deprecated":null},{"type":"function","name":"get_minor_version","ident":"webkit_get_minor_version","summary":"Returns the minor version number of the WebKit library. (e.g. in WebKit version 1.8.3 this is 8.) ...","deprecated":null},{"type":"function","name":"media_key_system_permission_get_name","ident":"webkit_media_key_system_permission_get_name","summary":"Get the key system for which access permission is being requested.","deprecated":null},{"type":"function","name":"uri_for_display","ident":"webkit_uri_for_display","summary":"Use this function to format a URI for display. The URIs used internally by WebKit may contain percent-encoded ...","deprecated":null},{"type":"function","name":"user_media_permission_is_for_audio_device","ident":"webkit_user_media_permission_is_for_audio_device","summary":"Check whether the permission request is for an audio device.","deprecated":null},{"type":"function","name":"user_media_permission_is_for_display_device","ident":"webkit_user_media_permission_is_for_display_device","summary":"Check whether the permission request is for a display device.","deprecated":null},{"type":"function","name":"user_media_permission_is_for_video_device","ident":"webkit_user_media_permission_is_for_video_device","summary":"Check whether the permission request is for a video device.","deprecated":null},{"type":"function_macro","name":"CHECK_VERSION","ident":"WEBKIT_CHECK_VERSION","summary":"Check the version of the WebKit headers at compilation time.","deprecated":null},{"type":"function_macro","name":"DECLARE_DERIVABLE_TYPE","ident":"WEBKIT_DECLARE_DERIVABLE_TYPE","summary":"No description available.","deprecated":null},{"type":"function_macro","name":"DECLARE_FINAL_TYPE","ident":"WEBKIT_DECLARE_FINAL_TYPE","summary":"No description available.","deprecated":null},{"type":"function_macro","name":"DECLARE_TYPE","ident":"WEBKIT_DECLARE_TYPE","summary":"No description available.","deprecated":null},{"type":"function_macro","name":"DEPRECATED_FOR","ident":"WEBKIT_DEPRECATED_FOR","summary":"Marks a symbol as deprecated, indicating a replacement.","deprecated":null},{"type":"interface","name":"PermissionRequest","ctype":"WebKitPermissionRequest","summary":"A permission request. There are situations where an embedder would need to ask the user for permission to ...","deprecated":null},{"type":"method","name":"activate_item","type_name":"OptionMenu","ident":"webkit_option_menu_activate_item","summary":"Activates the #WebKitOptionMenuItem at @index in @menu. Activating an item changes the value of the element making the ...","deprecated":null},{"type":"method","name":"add_cookie","type_name":"CookieManager","ident":"webkit_cookie_manager_add_cookie","summary":"Asynchronously add a #SoupCookie to the underlying storage. When the operation is finished, @callback will be called. You ...","deprecated":null},{"type":"method","name":"add_cookie_finish","type_name":"CookieManager","ident":"webkit_cookie_manager_add_cookie_finish","summary":"Finish an asynchronous operation started with webkit_cookie_manager_add_cookie().","deprecated":null},{"type":"method","name":"add_filter","type_name":"UserContentManager","ident":"webkit_user_content_manager_add_filter","summary":"Adds a #WebKitUserContentFilter to the given #WebKitUserContentManager. The same #WebKitUserContentFilter can be reused with multiple #WebKitUserContentManager instances. ...","deprecated":null},{"type":"method","name":"add_path_to_sandbox","type_name":"WebContext","ident":"webkit_web_context_add_path_to_sandbox","summary":"Adds a path to be mounted in the sandbox. @path must exist before any web process has been ...","deprecated":null},{"type":"method","name":"add_proxy_for_scheme","type_name":"NetworkProxySettings","ident":"webkit_network_proxy_settings_add_proxy_for_scheme","summary":"Adds a URI-scheme-specific proxy. URIs whose scheme matches @uri_scheme will be proxied via @proxy_uri. As with the default ..."},{"type":"method","name":"add_script","type_name":"UserContentManager","ident":"webkit_user_content_manager_add_script","summary":"Adds a #WebKitUserScript to the given #WebKitUserContentManager. The same #WebKitUserScript can be reused with multiple #WebKitUserContentManager instances.","deprecated":null},{"type":"method","name":"add_style_sheet","type_name":"UserContentManager","ident":"webkit_user_content_manager_add_style_sheet","summary":"Adds a #WebKitUserStyleSheet to the given #WebKitUserContentManager. The same #WebKitUserStyleSheet can be reused with multiple #WebKitUserContentManager instances.","deprecated":null},{"type":"method","name":"allow","type_name":"PermissionRequest","ident":"webkit_permission_request_allow","summary":"Allow the action which triggered this request.","deprecated":null},{"type":"method","name":"allow_tls_certificate_for_host","type_name":"NetworkSession","ident":"webkit_network_session_allow_tls_certificate_for_host","summary":"Ignore further TLS errors on the @host for the certificate present in @info. If @host is an IPv6 ...","deprecated":null},{"type":"method","name":"append","type_name":"ContextMenu","ident":"webkit_context_menu_append","summary":"Adds @item at the end of the @menu.","deprecated":null},{"type":"method","name":"apply_from_key_file","type_name":"Settings","ident":"webkit_settings_apply_from_key_file","summary":"Reads the contents of the given @group_name from the given @key_file and apply the value of each key/value to ...","deprecated":null},{"type":"method","name":"attach","type_name":"WebInspector","ident":"webkit_web_inspector_attach","summary":"Request @inspector to be attached. The signal #WebKitWebInspector::attach will be emitted. If the inspector is already attached it ...","deprecated":null},{"type":"method","name":"authenticate","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_authenticate","summary":"Authenticate the #WebKitAuthenticationRequest. Authenticate the #WebKitAuthenticationRequest using the #WebKitCredential supplied. To continue without credentials, pass %NULL as @credential.","deprecated":null},{"type":"method","name":"call_async_javascript_function","type_name":"WebView","ident":"webkit_web_view_call_async_javascript_function","summary":"Asynchronously call @body with @arguments in the script world with name @world_name of the main frame current context in ...","deprecated":null},{"type":"method","name":"call_async_javascript_function_finish","type_name":"WebView","ident":"webkit_web_view_call_async_javascript_function_finish","summary":"Finish an asynchronous operation started with webkit_web_view_call_async_javascript_function().","deprecated":null},{"type":"method","name":"can_execute_editing_command","type_name":"WebView","ident":"webkit_web_view_can_execute_editing_command","summary":"Asynchronously check if it is possible to execute the given editing command. When the operation is finished, @callback ...","deprecated":null},{"type":"method","name":"can_execute_editing_command_finish","type_name":"WebView","ident":"webkit_web_view_can_execute_editing_command_finish","summary":"Finish an asynchronous operation started with webkit_web_view_can_execute_editing_command().","deprecated":null},{"type":"method","name":"can_go_back","type_name":"WebView","ident":"webkit_web_view_can_go_back","summary":"Determines whether @web_view has a previous history item.","deprecated":null},{"type":"method","name":"can_go_forward","type_name":"WebView","ident":"webkit_web_view_can_go_forward","summary":"Determines whether @web_view has a next history item.","deprecated":null},{"type":"method","name":"can_save_credentials","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_can_save_credentials","summary":"Determine whether this #WebKitAuthenticationRequest should allow the storage of credentials. Determine whether the authentication method associated with this ...","deprecated":null},{"type":"method","name":"can_show_mime_type","type_name":"WebView","ident":"webkit_web_view_can_show_mime_type","summary":"Whether or not a MIME type can be displayed in @web_view.","deprecated":null},{"type":"method","name":"cancel","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_cancel","summary":"Cancel the authentication challenge. This will also cancel the page loading and result in a #WebKitWebView::load-failed signal with ...","deprecated":null},{"type":"method","name":"cancel","type_name":"ColorChooserRequest","ident":"webkit_color_chooser_request_cancel","summary":"Cancels @request and the input element changes to use the initial color. Cancels @request and the input element ...","deprecated":null},{"type":"method","name":"cancel","type_name":"Download","ident":"webkit_download_cancel","summary":"Cancels the download. When the ongoing download operation is effectively cancelled the signal #WebKitDownload::failed is emitted with %WEBKIT_DOWNLOAD_ERROR_CANCELLED_BY_USER error.","deprecated":null},{"type":"method","name":"cancel","type_name":"FileChooserRequest","ident":"webkit_file_chooser_request_cancel","summary":"Ask WebKit to cancel the request. It's important to do this in case no selection has been made ...","deprecated":null},{"type":"method","name":"clear","type_name":"FaviconDatabase","ident":"webkit_favicon_database_clear","summary":"Clears all icons from the database.","deprecated":null},{"type":"method","name":"clear","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_clear","summary":"Asynchronously clear the website data of the given @types modified in the past @timespan. If @timespan is 0, ...","deprecated":null},{"type":"method","name":"clear_finish","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_clear_finish","summary":"Finish an asynchronous operation started with webkit_website_data_manager_clear()","deprecated":null},{"type":"method","name":"clicked","type_name":"Notification","ident":"webkit_notification_clicked","summary":"Tells WebKit the notification has been clicked. This will emit the #WebKitNotification::clicked signal.","deprecated":null},{"type":"method","name":"close","type_name":"Notification","ident":"webkit_notification_close","summary":"Closes the notification.","deprecated":null},{"type":"method","name":"close","type_name":"OptionMenu","ident":"webkit_option_menu_close","summary":"Request to close a #WebKitOptionMenu. This emits WebKitOptionMenu::close signal. This function should always be called to notify WebKit ...","deprecated":null},{"type":"method","name":"close","type_name":"WebInspector","ident":"webkit_web_inspector_close","summary":"Request @inspector to be closed.","deprecated":null},{"type":"method","name":"close","type_name":"ScriptDialog","ident":"webkit_script_dialog_close","summary":"Close @dialog. When handling a #WebKitScriptDialog asynchronously (webkit_script_dialog_ref() was called in #WebKitWebView::script-dialog callback), this function needs to be ..."},{"type":"method","name":"confirm_set_confirmed","type_name":"ScriptDialog","ident":"webkit_script_dialog_confirm_set_confirmed","summary":"Set whether the user confirmed the dialog. This method is used for %WEBKIT_SCRIPT_DIALOG_CONFIRM and %WEBKIT_SCRIPT_DIALOG_BEFORE_UNLOAD_CONFIRM dialogs when #WebKitWebView::script-dialog ..."},{"type":"method","name":"context_is_editable","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_editable","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_image","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_image","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_link","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_link","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_media","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_media","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_scrollbar","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_scrollbar","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_SCROLLBAR flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_selection","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_selection","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"copy","type_name":"Credential","ident":"webkit_credential_copy","summary":"Make a copy of the #WebKitCredential."},{"type":"method","name":"copy","type_name":"GeolocationPosition","ident":"webkit_geolocation_position_copy","summary":"Make a copy of the #WebKitGeolocationPosition."},{"type":"method","name":"copy","type_name":"InputMethodUnderline","ident":"webkit_input_method_underline_copy","summary":"Make a copy of the #WebKitInputMethodUnderline."},{"type":"method","name":"copy","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_copy","summary":"Make a copy of @settings."},{"type":"method","name":"copy","type_name":"NavigationAction","ident":"webkit_navigation_action_copy","summary":"Make a copy of @navigation."},{"type":"method","name":"copy","type_name":"NetworkProxySettings","ident":"webkit_network_proxy_settings_copy","summary":"Make a copy of the #WebKitNetworkProxySettings."},{"type":"method","name":"copy","type_name":"OptionMenuItem","ident":"webkit_option_menu_item_copy","summary":"Make a copy of the #WebKitOptionMenuItem."},{"type":"method","name":"count_matches","type_name":"FindController","ident":"webkit_find_controller_count_matches","summary":"Counts the number of matches for @search_text. Counts the number of matches for @search_text found in the #WebKitWebView ...","deprecated":null},{"type":"method","name":"delete_cookie","type_name":"CookieManager","ident":"webkit_cookie_manager_delete_cookie","summary":"Asynchronously delete a #SoupCookie from the current session. When the operation is finished, @callback will be called. You ...","deprecated":null},{"type":"method","name":"delete_cookie_finish","type_name":"CookieManager","ident":"webkit_cookie_manager_delete_cookie_finish","summary":"Finish an asynchronous operation started with webkit_cookie_manager_delete_cookie().","deprecated":null},{"type":"method","name":"deny","type_name":"PermissionRequest","ident":"webkit_permission_request_deny","summary":"Deny the action which triggered this request.","deprecated":null},{"type":"method","name":"detach","type_name":"WebInspector","ident":"webkit_web_inspector_detach","summary":"Request @inspector to be detached. The signal #WebKitWebInspector::detach will be emitted. If the inspector is already detached it ...","deprecated":null},{"type":"method","name":"download","type_name":"PolicyDecision","ident":"webkit_policy_decision_download","summary":"Spawn a download from this decision.","deprecated":null},{"type":"method","name":"download_uri","type_name":"NetworkSession","ident":"webkit_network_session_download_uri","summary":"Requests downloading of the specified URI string. The download operation will not be associated to any #WebKitWebView, if ...","deprecated":null},{"type":"method","name":"download_uri","type_name":"WebView","ident":"webkit_web_view_download_uri","summary":"Requests downloading of the specified URI string for @web_view.","deprecated":null},{"type":"method","name":"evaluate_javascript","type_name":"WebView","ident":"webkit_web_view_evaluate_javascript","summary":"Asynchronously evaluate @script in the script world with name @world_name of the main frame current context in @web_view. If ...","deprecated":null},{"type":"method","name":"evaluate_javascript_finish","type_name":"WebView","ident":"webkit_web_view_evaluate_javascript_finish","summary":"Finish an asynchronous operation started with webkit_web_view_evaluate_javascript().","deprecated":null},{"type":"method","name":"execute_editing_command","type_name":"WebView","ident":"webkit_web_view_execute_editing_command","summary":"Request to execute the given @command for @web_view. You can use webkit_web_view_can_execute_editing_command() to check whether it's possible to ...","deprecated":null},{"type":"method","name":"execute_editing_command_with_argument","type_name":"WebView","ident":"webkit_web_view_execute_editing_command_with_argument","summary":"Request to execute the given @command with @argument for @web_view. You can use webkit_web_view_can_execute_editing_command() to check whether it's ...","deprecated":null},{"type":"method","name":"failed","type_name":"GeolocationManager","ident":"webkit_geolocation_manager_failed","summary":"Notify @manager that determining the position failed.","deprecated":null},{"type":"method","name":"fetch","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_fetch","summary":"Asynchronously get the list of #WebKitWebsiteData for the given @types. When the operation is finished, @callback will be ...","deprecated":null},{"type":"method","name":"fetch_finish","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_fetch_finish","summary":"Finish an asynchronous operation started with webkit_website_data_manager_fetch().","deprecated":null},{"type":"method","name":"fetch_identifiers","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_fetch_identifiers","summary":"Asynchronously retrieve a list of the identifiers for all the stored filters. When the operation is finished, @callback ...","deprecated":null},{"type":"method","name":"fetch_identifiers_finish","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_fetch_identifiers_finish","summary":"Finishes an asynchronous fetch of the list of stored filters. Finishes an asynchronous fetch of the list of ...","deprecated":null},{"type":"method","name":"filter_key_event","type_name":"InputMethodContext","ident":"webkit_input_method_context_filter_key_event","summary":"Allow @key_event to be handled by the input method. If %TRUE is returned, then no further processing should ...","deprecated":null},{"type":"method","name":"finish","type_name":"ColorChooserRequest","ident":"webkit_color_chooser_request_finish","summary":"Finishes @request and the input element keeps the current value of #WebKitColorChooserRequest:rgba. Finishes @request and the input element ...","deprecated":null},{"type":"method","name":"finish","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_finish","summary":"Finish a #WebKitURISchemeRequest by setting the contents of the request and its mime type.","deprecated":null},{"type":"method","name":"finish","type_name":"PermissionStateQuery","ident":"webkit_permission_state_query_finish","summary":"Notify the web-engine of the selected permission state for the given query. This function should only be called as ..."},{"type":"method","name":"finish_error","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_finish_error","summary":"Finish a #WebKitURISchemeRequest with a #GError.","deprecated":null},{"type":"method","name":"finish_with_response","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_finish_with_response","summary":"Finish a #WebKitURISchemeRequest by returning a #WebKitURISchemeResponse","deprecated":null},{"type":"method","name":"first","type_name":"ContextMenu","ident":"webkit_context_menu_first","summary":"Gets the first item in the @menu.","deprecated":null},{"type":"method","name":"free","type_name":"Credential","ident":"webkit_credential_free","summary":"Free the #WebKitCredential."},{"type":"method","name":"free","type_name":"GeolocationPosition","ident":"webkit_geolocation_position_free","summary":"Free the #WebKitGeolocationPosition"},{"type":"method","name":"free","type_name":"InputMethodUnderline","ident":"webkit_input_method_underline_free","summary":"Free the #WebKitInputMethodUnderline."},{"type":"method","name":"free","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_free","summary":"Free the #WebKitMemoryPressureSettings."},{"type":"method","name":"free","type_name":"NavigationAction","ident":"webkit_navigation_action_free","summary":"Free the #WebKitNavigationAction"},{"type":"method","name":"free","type_name":"NetworkProxySettings","ident":"webkit_network_proxy_settings_free","summary":"Free the #WebKitNetworkProxySettings."},{"type":"method","name":"free","type_name":"OptionMenuItem","ident":"webkit_option_menu_item_free","summary":"Free the #WebKitOptionMenuItem."},{"type":"method","name":"get","type_name":"FeatureList","ident":"webkit_feature_list_get","summary":"Gets a feature given its index."},{"type":"method","name":"get_accept_policy","type_name":"CookieManager","ident":"webkit_cookie_manager_get_accept_policy","summary":"Asynchronously get the cookie acceptance policy of @cookie_manager. Note that when policy was set to %WEBKIT_COOKIE_POLICY_ACCEPT_NO_THIRD_PARTY and ITP ...","deprecated":null},{"type":"method","name":"get_accept_policy_finish","type_name":"CookieManager","ident":"webkit_cookie_manager_get_accept_policy_finish","summary":"Finish an asynchronous operation started with webkit_cookie_manager_get_accept_policy().","deprecated":null},{"type":"method","name":"get_action_icon","type_name":"WebExtension","ident":"webkit_web_extension_get_action_icon","summary":"Returns the extension's default action icon image for the specified size. This icon serves as a default and should ...","deprecated":null},{"type":"method","name":"get_all_cookies","type_name":"CookieManager","ident":"webkit_cookie_manager_get_all_cookies","summary":"Asynchronously get a list of #SoupCookie from @cookie_manager. When the operation is finished, @callback will be called. You ...","deprecated":null},{"type":"method","name":"get_all_cookies_finish","type_name":"CookieManager","ident":"webkit_cookie_manager_get_all_cookies_finish","summary":"Finish an asynchronous operation started with webkit_cookie_manager_get_all_cookies(). The return value is a #GList of #SoupCookie instances which should ...","deprecated":null},{"type":"method","name":"get_all_requested_match_patterns","type_name":"WebExtension","ident":"webkit_web_extension_get_all_requested_match_patterns","summary":"Get the set of websites that the extension requires access to for injected content and for receiving messages from websites.","deprecated":null},{"type":"method","name":"get_allow_file_access_from_file_urls","type_name":"Settings","ident":"webkit_settings_get_allow_file_access_from_file_urls","summary":"Get the #WebKitSettings:allow-file-access-from-file-urls property.","deprecated":null},{"type":"method","name":"get_allow_modal_dialogs","type_name":"Settings","ident":"webkit_settings_get_allow_modal_dialogs","summary":"Get the #WebKitSettings:allow-modal-dialogs property.","deprecated":null},{"type":"method","name":"get_allow_overwrite","type_name":"Download","ident":"webkit_download_get_allow_overwrite","summary":"Returns the current value of the #WebKitDownload:allow-overwrite property. Returns the current value of the #WebKitDownload:allow-overwrite property, which determines ...","deprecated":null},{"type":"method","name":"get_allow_top_navigation_to_data_urls","type_name":"Settings","ident":"webkit_settings_get_allow_top_navigation_to_data_urls","summary":"Get the #WebKitSettings:allow-top-navigation-to-data-urls property.","deprecated":null},{"type":"method","name":"get_allow_universal_access_from_file_urls","type_name":"Settings","ident":"webkit_settings_get_allow_universal_access_from_file_urls","summary":"Get the #WebKitSettings:allow-universal-access-from-file-urls property.","deprecated":null},{"type":"method","name":"get_application_info","type_name":"AutomationSession","ident":"webkit_automation_session_get_application_info","summary":"Get the the previously set #WebKitAutomationSession. Get the #WebKitAutomationSession previously set with webkit_automation_session_set_application_info().","deprecated":null},{"type":"method","name":"get_attached_height","type_name":"WebInspector","ident":"webkit_web_inspector_get_attached_height","summary":"Get the height that the inspector view when attached. Get the height that the inspector view should have ...","deprecated":null},{"type":"method","name":"get_auto_load_images","type_name":"Settings","ident":"webkit_settings_get_auto_load_images","summary":"Get the #WebKitSettings:auto-load-images property.","deprecated":null},{"type":"method","name":"get_automation_presentation_type","type_name":"WebView","ident":"webkit_web_view_get_automation_presentation_type","summary":"Get the presentation type of #WebKitWebView when created for automation.","deprecated":null},{"type":"method","name":"get_autoplay_policy","type_name":"WebsitePolicies","ident":"webkit_website_policies_get_autoplay_policy","summary":"Get the #WebKitWebsitePolicies:autoplay property.","deprecated":null},{"type":"method","name":"get_back_forward_list","type_name":"WebView","ident":"webkit_web_view_get_back_forward_list","summary":"Obtains the #WebKitBackForwardList associated with the given #WebKitWebView. The #WebKitBackForwardList is owned by the #WebKitWebView.","deprecated":null},{"type":"method","name":"get_back_item","type_name":"BackForwardList","ident":"webkit_back_forward_list_get_back_item","summary":"Returns the item that precedes the current item.","deprecated":null},{"type":"method","name":"get_back_list","type_name":"BackForwardList","ident":"webkit_back_forward_list_get_back_list","summary":"Obtain the list of items preceding the current one.","deprecated":null},{"type":"method","name":"get_back_list_with_limit","type_name":"BackForwardList","ident":"webkit_back_forward_list_get_back_list_with_limit","summary":"Obtain a list up to some number of items preceding the current one.","deprecated":null},{"type":"method","name":"get_background_color","type_name":"WebView","ident":"webkit_web_view_get_background_color","summary":"Gets the color that is used to draw the @web_view background. Gets the color that is used to ...","deprecated":null},{"type":"method","name":"get_base_cache_directory","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_get_base_cache_directory","summary":"Get the #WebKitWebsiteDataManager:base-cache-directory property.","deprecated":null},{"type":"method","name":"get_base_data_directory","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_get_base_data_directory","summary":"Get the #WebKitWebsiteDataManager:base-data-directory property.","deprecated":null},{"type":"method","name":"get_body","type_name":"Notification","ident":"webkit_notification_get_body","summary":"Obtains the body for the notification.","deprecated":null},{"type":"method","name":"get_cache_model","type_name":"WebContext","ident":"webkit_web_context_get_cache_model","summary":"Returns the current cache model. For more information about this value check the documentation of the function webkit_web_context_set_cache_model().","deprecated":null},{"type":"method","name":"get_camera_capture_state","type_name":"WebView","ident":"webkit_web_view_get_camera_capture_state","summary":"Get the camera capture state of a #WebKitWebView.","deprecated":null},{"type":"method","name":"get_can_attach","type_name":"WebInspector","ident":"webkit_web_inspector_get_can_attach","summary":"Whether the @inspector can be attached to the same window that contains the inspected view.","deprecated":null},{"type":"method","name":"get_category","type_name":"Feature","ident":"webkit_feature_get_category","summary":"Gets the category of the feature. Applications which include user interface to toggle features may want to use ..."},{"type":"method","name":"get_certificate","type_name":"Credential","ident":"webkit_credential_get_certificate","summary":"Get the certificate currently held by this #WebKitCredential."},{"type":"method","name":"get_certificate_pin_flags","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_get_certificate_pin_flags","summary":"Get the #GTlsPasswordFlags of the %WEBKIT_AUTHENTICATION_SCHEME_CLIENT_CERTIFICATE_PIN_REQUESTED authentication challenge.","deprecated":null},{"type":"method","name":"get_consent_optional_features","type_name":"XRPermissionRequest","ident":"webkit_xr_permission_request_get_consent_optional_features","summary":"Gets the optional features that need user consent. These features can be granted by calling webkit_xr_permission_request_set_granted_optional_features() before allowing ...","deprecated":null},{"type":"method","name":"get_consent_required_features","type_name":"XRPermissionRequest","ident":"webkit_xr_permission_request_get_consent_required_features","summary":"Gets the required features that need user consent. These features are automatically granted if the request is allowed ...","deprecated":null},{"type":"method","name":"get_conservative_threshold","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_get_conservative_threshold","summary":"Gets the conservative memory usage threshold."},{"type":"method","name":"get_content_length","type_name":"URIResponse","ident":"webkit_uri_response_get_content_length","summary":"Get the expected content length of the #WebKitURIResponse. It can be 0 if the server provided an incorrect ...","deprecated":null},{"type":"method","name":"get_context","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_context","summary":"Gets the value of the #WebKitHitTestResult:context property.","deprecated":null},{"type":"method","name":"get_context","type_name":"WebView","ident":"webkit_web_view_get_context","summary":"Gets the web context of @web_view.","deprecated":null},{"type":"method","name":"get_cookie_manager","type_name":"NetworkSession","ident":"webkit_network_session_get_cookie_manager","summary":"Get the #WebKitCookieManager of @session.","deprecated":null},{"type":"method","name":"get_cookies","type_name":"CookieManager","ident":"webkit_cookie_manager_get_cookies","summary":"Asynchronously get a list of #SoupCookie from @cookie_manager. Asynchronously get a list of #SoupCookie from @cookie_manager associated with ...","deprecated":null},{"type":"method","name":"get_cookies_finish","type_name":"CookieManager","ident":"webkit_cookie_manager_get_cookies_finish","summary":"Finish an asynchronous operation started with webkit_cookie_manager_get_cookies(). The return value is a #GList of #SoupCookie instances which should ...","deprecated":null},{"type":"method","name":"get_current_domain","type_name":"WebsiteDataAccessPermissionRequest","ident":"webkit_website_data_access_permission_request_get_current_domain","summary":"Get the current domain being browsed.","deprecated":null},{"type":"method","name":"get_current_item","type_name":"BackForwardList","ident":"webkit_back_forward_list_get_current_item","summary":"Returns the current item in @back_forward_list.","deprecated":null},{"type":"method","name":"get_cursive_font_family","type_name":"Settings","ident":"webkit_settings_get_cursive_font_family","summary":"Gets the #WebKitSettings:cursive-font-family property.","deprecated":null},{"type":"method","name":"get_custom_charset","type_name":"WebView","ident":"webkit_web_view_get_custom_charset","summary":"Returns the current custom character encoding name of @web_view.","deprecated":null},{"type":"method","name":"get_data","type_name":"WebResource","ident":"webkit_web_resource_get_data","summary":"Asynchronously get the raw data for @resource. When the operation is finished, @callback will be called. You can ...","deprecated":null},{"type":"method","name":"get_data_finish","type_name":"WebResource","ident":"webkit_web_resource_get_data_finish","summary":"Finish an asynchronous operation started with webkit_web_resource_get_data().","deprecated":null},{"type":"method","name":"get_default_charset","type_name":"Settings","ident":"webkit_settings_get_default_charset","summary":"Gets the #WebKitSettings:default-charset property.","deprecated":null},{"type":"method","name":"get_default_content_security_policy","type_name":"WebView","ident":"webkit_web_view_get_default_content_security_policy","summary":"Gets the configured default Content-Security-Policy.","deprecated":null},{"type":"method","name":"get_default_font_family","type_name":"Settings","ident":"webkit_settings_get_default_font_family","summary":"Gets the #WebKitSettings:default-font-family property.","deprecated":null},{"type":"method","name":"get_default_font_size","type_name":"Settings","ident":"webkit_settings_get_default_font_size","summary":"Gets the #WebKitSettings:default-font-size property.","deprecated":null},{"type":"method","name":"get_default_locale","type_name":"WebExtension","ident":"webkit_web_extension_get_default_locale","summary":"Get the default locale for the extension.","deprecated":null},{"type":"method","name":"get_default_monospace_font_size","type_name":"Settings","ident":"webkit_settings_get_default_monospace_font_size","summary":"Gets the #WebKitSettings:default-monospace-font-size property.","deprecated":null},{"type":"method","name":"get_default_value","type_name":"Feature","ident":"webkit_feature_get_default_value","summary":"Gets whether the feature is enabled by default. The default value may be used by applications which include ..."},{"type":"method","name":"get_destination","type_name":"Download","ident":"webkit_download_get_destination","summary":"Obtains the destination to which the downloaded file will be written. You can connect to #WebKitDownload::created-destination to make ...","deprecated":null},{"type":"method","name":"get_details","type_name":"Feature","ident":"webkit_feature_get_details","summary":"Gets a description for the @feature. The detailed description should be considered an additional clarification on the purpose ..."},{"type":"method","name":"get_dialog_type","type_name":"ScriptDialog","ident":"webkit_script_dialog_get_dialog_type","summary":"Get the dialog type of a #WebKitScriptDialog."},{"type":"method","name":"get_disable_web_security","type_name":"Settings","ident":"webkit_settings_get_disable_web_security","summary":"Get the #WebKitSettings:disable-web-security property.","deprecated":null},{"type":"method","name":"get_display_action_label","type_name":"WebExtension","ident":"webkit_web_extension_get_display_action_label","summary":"Get the localized display action label for the extension. This label serves as a default and should be ...","deprecated":null},{"type":"method","name":"get_display_capture_state","type_name":"WebView","ident":"webkit_web_view_get_display_capture_state","summary":"Get the display capture state of a #WebKitWebView.","deprecated":null},{"type":"method","name":"get_display_description","type_name":"WebExtension","ident":"webkit_web_extension_get_display_description","summary":"Get the localized display description for the extension.","deprecated":null},{"type":"method","name":"get_display_name","type_name":"WebExtension","ident":"webkit_web_extension_get_display_name","summary":"Get the localized name for the extension.","deprecated":null},{"type":"method","name":"get_display_short_name","type_name":"WebExtension","ident":"webkit_web_extension_get_display_short_name","summary":"Get the localized short name for the extension.","deprecated":null},{"type":"method","name":"get_display_version","type_name":"WebExtension","ident":"webkit_web_extension_get_display_version","summary":"Get the localized display version for the extension.","deprecated":null},{"type":"method","name":"get_domain","type_name":"ITPFirstParty","ident":"webkit_itp_first_party_get_domain","summary":"Get the domain name of @itp_first_party."},{"type":"method","name":"get_domain","type_name":"ITPThirdParty","ident":"webkit_itp_third_party_get_domain","summary":"Get the domain name of @itp_third_party."},{"type":"method","name":"get_draw_compositing_indicators","type_name":"Settings","ident":"webkit_settings_get_draw_compositing_indicators","summary":"Get the #WebKitSettings:draw-compositing-indicators property.","deprecated":null},{"type":"method","name":"get_editor_state","type_name":"WebView","ident":"webkit_web_view_get_editor_state","summary":"Gets the web editor state of @web_view.","deprecated":null},{"type":"method","name":"get_elapsed_time","type_name":"Download","ident":"webkit_download_get_elapsed_time","summary":"Gets the elapsed time in seconds, including any fractional part. If the download finished, had an error or ...","deprecated":null},{"type":"method","name":"get_element_rectangle","type_name":"ColorChooserRequest","ident":"webkit_color_chooser_request_get_element_rectangle","summary":"Gets the bounding box of the color input element.","deprecated":null},{"type":"method","name":"get_enable_2d_canvas_acceleration","type_name":"Settings","ident":"webkit_settings_get_enable_2d_canvas_acceleration","summary":"Get the #WebKitSettings:enable-2d-canvas-acceleration property.","deprecated":null},{"type":"method","name":"get_enable_back_forward_navigation_gestures","type_name":"Settings","ident":"webkit_settings_get_enable_back_forward_navigation_gestures","summary":"Get the #WebKitSettings:enable-back-forward-navigation-gestures property.","deprecated":null},{"type":"method","name":"get_enable_caret_browsing","type_name":"Settings","ident":"webkit_settings_get_enable_caret_browsing","summary":"Get the #WebKitSettings:enable-caret-browsing property.","deprecated":null},{"type":"method","name":"get_enable_developer_extras","type_name":"Settings","ident":"webkit_settings_get_enable_developer_extras","summary":"Get the #WebKitSettings:enable-developer-extras property.","deprecated":null},{"type":"method","name":"get_enable_dns_prefetching","type_name":"Settings","ident":"webkit_settings_get_enable_dns_prefetching","summary":"Get the #WebKitSettings:enable-dns-prefetching property.","deprecated":"2.48."},{"type":"method","name":"get_enable_encrypted_media","type_name":"Settings","ident":"webkit_settings_get_enable_encrypted_media","summary":"Get the #WebKitSettings:enable-encrypted-media property.","deprecated":null},{"type":"method","name":"get_enable_fullscreen","type_name":"Settings","ident":"webkit_settings_get_enable_fullscreen","summary":"Get the #WebKitSettings:enable-fullscreen property.","deprecated":null},{"type":"method","name":"get_enable_high_accuracy","type_name":"GeolocationManager","ident":"webkit_geolocation_manager_get_enable_high_accuracy","summary":"Get whether high accuracy is enabled.","deprecated":null},{"type":"method","name":"get_enable_html5_database","type_name":"Settings","ident":"webkit_settings_get_enable_html5_database","summary":"Get the #WebKitSettings:enable-html5-database property.","deprecated":null},{"type":"method","name":"get_enable_html5_local_storage","type_name":"Settings","ident":"webkit_settings_get_enable_html5_local_storage","summary":"Get the #WebKitSettings:enable-html5-local-storage property.","deprecated":null},{"type":"method","name":"get_enable_hyperlink_auditing","type_name":"Settings","ident":"webkit_settings_get_enable_hyperlink_auditing","summary":"Get the #WebKitSettings:enable-hyperlink-auditing property.","deprecated":"2.50."},{"type":"method","name":"get_enable_javascript","type_name":"Settings","ident":"webkit_settings_get_enable_javascript","summary":"Get the #WebKitSettings:enable-javascript property.","deprecated":null},{"type":"method","name":"get_enable_javascript_markup","type_name":"Settings","ident":"webkit_settings_get_enable_javascript_markup","summary":"Get the #WebKitSettings:enable-javascript-markup property.","deprecated":null},{"type":"method","name":"get_enable_media","type_name":"Settings","ident":"webkit_settings_get_enable_media","summary":"Get the #WebKitSettings:enable-media property.","deprecated":null},{"type":"method","name":"get_enable_media_capabilities","type_name":"Settings","ident":"webkit_settings_get_enable_media_capabilities","summary":"Get the #WebKitSettings:enable-media-capabilities property.","deprecated":null},{"type":"method","name":"get_enable_media_stream","type_name":"Settings","ident":"webkit_settings_get_enable_media_stream","summary":"Get the #WebKitSettings:enable-media-stream property.","deprecated":null},{"type":"method","name":"get_enable_mediasource","type_name":"Settings","ident":"webkit_settings_get_enable_mediasource","summary":"Get the #WebKitSettings:enable-mediasource property.","deprecated":null},{"type":"method","name":"get_enable_mock_capture_devices","type_name":"Settings","ident":"webkit_settings_get_enable_mock_capture_devices","summary":"Get the #WebKitSettings:enable-mock-capture-devices property.","deprecated":null},{"type":"method","name":"get_enable_offline_web_application_cache","type_name":"Settings","ident":"webkit_settings_get_enable_offline_web_application_cache","summary":"Get the #WebKitSettings:enable-offline-web-application-cache property.","deprecated":"2.44"},{"type":"method","name":"get_enable_page_cache","type_name":"Settings","ident":"webkit_settings_get_enable_page_cache","summary":"Get the #WebKitSettings:enable-page-cache property.","deprecated":null},{"type":"method","name":"get_enable_resizable_text_areas","type_name":"Settings","ident":"webkit_settings_get_enable_resizable_text_areas","summary":"Get the #WebKitSettings:enable-resizable-text-areas property.","deprecated":null},{"type":"method","name":"get_enable_site_specific_quirks","type_name":"Settings","ident":"webkit_settings_get_enable_site_specific_quirks","summary":"Get the #WebKitSettings:enable-site-specific-quirks property.","deprecated":null},{"type":"method","name":"get_enable_smooth_scrolling","type_name":"Settings","ident":"webkit_settings_get_enable_smooth_scrolling","summary":"Get the #WebKitSettings:enable-smooth-scrolling property.","deprecated":null},{"type":"method","name":"get_enable_spatial_navigation","type_name":"Settings","ident":"webkit_settings_get_enable_spatial_navigation","summary":"Get the #WebKitSettings:enable-spatial-navigation property.","deprecated":null},{"type":"method","name":"get_enable_tabs_to_links","type_name":"Settings","ident":"webkit_settings_get_enable_tabs_to_links","summary":"Get the #WebKitSettings:enable-tabs-to-links property.","deprecated":null},{"type":"method","name":"get_enable_webaudio","type_name":"Settings","ident":"webkit_settings_get_enable_webaudio","summary":"Get the #WebKitSettings:enable-webaudio property.","deprecated":null},{"type":"method","name":"get_enable_webgl","type_name":"Settings","ident":"webkit_settings_get_enable_webgl","summary":"Get the #WebKitSettings:enable-webgl property.","deprecated":null},{"type":"method","name":"get_enable_webrtc","type_name":"Settings","ident":"webkit_settings_get_enable_webrtc","summary":"Get the [property@Settings:enable-webrtc] property.","deprecated":null},{"type":"method","name":"get_enable_write_console_messages_to_stdout","type_name":"Settings","ident":"webkit_settings_get_enable_write_console_messages_to_stdout","summary":"Get the #WebKitSettings:enable-write-console-messages-to-stdout property.","deprecated":null},{"type":"method","name":"get_estimated_load_progress","type_name":"WebView","ident":"webkit_web_view_get_estimated_load_progress","summary":"Gets the value of the #WebKitWebView:estimated-load-progress property. You can monitor the estimated progress of a load operation by ...","deprecated":null},{"type":"method","name":"get_estimated_progress","type_name":"Download","ident":"webkit_download_get_estimated_progress","summary":"Gets the value of the #WebKitDownload:estimated-progress property. Gets the value of the #WebKitDownload:estimated-progress property. You can monitor the estimated ...","deprecated":null},{"type":"method","name":"get_event","type_name":"ContextMenu","ident":"webkit_context_menu_get_event","summary":"Gets the #GdkEvent that triggered the context menu. This function only returns a valid #GdkEvent when called for a ...","deprecated":null},{"type":"method","name":"get_event","type_name":"OptionMenu","ident":"webkit_option_menu_get_event","summary":"Gets the #GdkEvent that triggered the dropdown menu. If @menu was not triggered by a user interaction, like a ...","deprecated":null},{"type":"method","name":"get_fantasy_font_family","type_name":"Settings","ident":"webkit_settings_get_fantasy_font_family","summary":"Gets the #WebKitSettings:fantasy-font-family property.","deprecated":null},{"type":"method","name":"get_favicon","type_name":"FaviconDatabase","ident":"webkit_favicon_database_get_favicon","summary":"Asynchronously obtains a favicon image. Asynchronously obtains an image of the favicon for the given page URI. It ...","deprecated":null},{"type":"method","name":"get_favicon","type_name":"WebView","ident":"webkit_web_view_get_favicon","summary":"Returns favicon currently associated to @web_view. Returns favicon currently associated to @web_view, if any. You can connect to ...","deprecated":null},{"type":"method","name":"get_favicon_database","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_get_favicon_database","summary":"Get the #WebKitFaviconDatabase of @manager.","deprecated":null},{"type":"method","name":"get_favicon_finish","type_name":"FaviconDatabase","ident":"webkit_favicon_database_get_favicon_finish","summary":"Finishes an operation started with webkit_favicon_database_get_favicon().","deprecated":null},{"type":"method","name":"get_favicon_uri","type_name":"FaviconDatabase","ident":"webkit_favicon_database_get_favicon_uri","summary":"Obtains the URI of the favicon for the given @page_uri.","deprecated":null},{"type":"method","name":"get_favicons_enabled","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_get_favicons_enabled","summary":"Get whether website icons are enabled.","deprecated":null},{"type":"method","name":"get_fd_list","type_name":"UserMessage","ident":"webkit_user_message_get_fd_list","summary":"Get the @message list of file descritpor.","deprecated":null},{"type":"method","name":"get_feature_enabled","type_name":"Settings","ident":"webkit_settings_get_feature_enabled","summary":"Gets whether a feature is enabled.","deprecated":null},{"type":"method","name":"get_find_controller","type_name":"WebView","ident":"webkit_web_view_get_find_controller","summary":"Gets the #WebKitFindController. Gets the #WebKitFindController that will allow the caller to query the #WebKitWebView for the text ...","deprecated":null},{"type":"method","name":"get_first_parties","type_name":"ITPThirdParty","ident":"webkit_itp_third_party_get_first_parties","summary":"Get the list of #WebKitITPFirstParty under which @itp_third_party has been seen."},{"type":"method","name":"get_forward_item","type_name":"BackForwardList","ident":"webkit_back_forward_list_get_forward_item","summary":"Returns the item that follows the current item.","deprecated":null},{"type":"method","name":"get_forward_list","type_name":"BackForwardList","ident":"webkit_back_forward_list_get_forward_list","summary":"Obtain the list of items following the current one.","deprecated":null},{"type":"method","name":"get_forward_list_with_limit","type_name":"BackForwardList","ident":"webkit_back_forward_list_get_forward_list_with_limit","summary":"Obtain a list up to some number of items following the current one.","deprecated":null},{"type":"method","name":"get_frame_name","type_name":"NavigationAction","ident":"webkit_navigation_action_get_frame_name","summary":"Gets the @navigation target frame name. For example if navigation was triggered by clicking a link with a target ..."},{"type":"method","name":"get_fullscreen","type_name":"WindowProperties","ident":"webkit_window_properties_get_fullscreen","summary":"Get whether the window should be shown in fullscreen state or not.","deprecated":null},{"type":"method","name":"get_gaction","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_gaction","summary":"Gets the action associated to @item as a #GAction.","deprecated":null},{"type":"method","name":"get_gaction_target","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_gaction_target","summary":"Gets the target #GVariant associated with @item.","deprecated":null},{"type":"method","name":"get_geolocation_manager","type_name":"WebContext","ident":"webkit_web_context_get_geolocation_manager","summary":"Get the #WebKitGeolocationManager of @context.","deprecated":null},{"type":"method","name":"get_geometry","type_name":"WindowProperties","ident":"webkit_window_properties_get_geometry","summary":"Get the geometry the window should have on the screen when shown.","deprecated":null},{"type":"method","name":"get_granted_features","type_name":"XRPermissionRequest","ident":"webkit_xr_permission_request_get_granted_features","summary":"Gets the features requested by the origin for the XR device, which are either granted by default or have ...","deprecated":null},{"type":"method","name":"get_hardware_acceleration_policy","type_name":"Settings","ident":"webkit_settings_get_hardware_acceleration_policy","summary":"Get the #WebKitSettings:hardware-acceleration-policy property.","deprecated":null},{"type":"method","name":"get_has_background_content","type_name":"WebExtension","ident":"webkit_web_extension_get_has_background_content","summary":"Get whether the extension has background content that can run when needed.","deprecated":null},{"type":"method","name":"get_has_commands","type_name":"WebExtension","ident":"webkit_web_extension_get_has_commands","summary":"Get whether the extension includes commands that users can invoke. These commands should be accessible via keyboard shortcuts, ...","deprecated":null},{"type":"method","name":"get_has_content_modification_rules","type_name":"WebExtension","ident":"webkit_web_extension_get_has_content_modification_rules","summary":"Get whether the extension includes rules used for content modification or blocking.","deprecated":null},{"type":"method","name":"get_has_injected_content","type_name":"WebExtension","ident":"webkit_web_extension_get_has_injected_content","summary":"Get whether the extension has script or stylesheet content that can be injected into webpages. Once the extension ...","deprecated":null},{"type":"method","name":"get_has_options_page","type_name":"WebExtension","ident":"webkit_web_extension_get_has_options_page","summary":"Get whether the extension has an options page. The app should provide access to this page through a ...","deprecated":null},{"type":"method","name":"get_has_override_new_tab_page","type_name":"WebExtension","ident":"webkit_web_extension_get_has_override_new_tab_page","summary":"Get whether the extension provides an alternative to the default new tab page. The app should prompt the ...","deprecated":null},{"type":"method","name":"get_has_persistent_background_content","type_name":"WebExtension","ident":"webkit_web_extension_get_has_persistent_background_content","summary":"Get whether the extension has background content that stays in memory as long as the extension is loaded.","deprecated":null},{"type":"method","name":"get_host","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_get_host","summary":"Get the host that this authentication challenge is applicable to.","deprecated":null},{"type":"method","name":"get_host","type_name":"SecurityOrigin","ident":"webkit_security_origin_get_host","summary":"Gets the hostname of @origin. It is reasonable for this to be %NULL if its protocol does not ..."},{"type":"method","name":"get_host","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_get_host","summary":"Gets the host part of the pattern string, unless `webkit_web_extension_match_pattern_get_matches_all_urls` is %TRUE."},{"type":"method","name":"get_http_body","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_get_http_body","summary":"Get the request body.","deprecated":null},{"type":"method","name":"get_http_headers","type_name":"URIRequest","ident":"webkit_uri_request_get_http_headers","summary":"Get the HTTP headers of a #WebKitURIRequest as a #SoupMessageHeaders.","deprecated":null},{"type":"method","name":"get_http_headers","type_name":"URIResponse","ident":"webkit_uri_response_get_http_headers","summary":"Get the HTTP headers of a #WebKitURIResponse as a #SoupMessageHeaders.","deprecated":null},{"type":"method","name":"get_http_headers","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_get_http_headers","summary":"Get the #SoupMessageHeaders of the request.","deprecated":null},{"type":"method","name":"get_http_method","type_name":"URIRequest","ident":"webkit_uri_request_get_http_method","summary":"Get the HTTP method of the #WebKitURIRequest.","deprecated":null},{"type":"method","name":"get_http_method","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_get_http_method","summary":"Get the HTTP method of the @request.","deprecated":null},{"type":"method","name":"get_icon","type_name":"WebExtension","ident":"webkit_web_extension_get_icon","summary":"Returns the extension's icon image for the specified size. This icon should represent the extension in settings or other ...","deprecated":null},{"type":"method","name":"get_id","type_name":"AutomationSession","ident":"webkit_automation_session_get_id","summary":"Get the unique identifier of a #WebKitAutomationSession","deprecated":null},{"type":"method","name":"get_id","type_name":"Notification","ident":"webkit_notification_get_id","summary":"Obtains the unique id for the notification.","deprecated":null},{"type":"method","name":"get_identifier","type_name":"Feature","ident":"webkit_feature_get_identifier","summary":"Gets a string that uniquely identifies the @feature."},{"type":"method","name":"get_identifier","type_name":"UserContentFilter","ident":"webkit_user_content_filter_get_identifier","summary":"Obtain the identifier previously used to save the @user_content_filter. Obtain the identifier previously used to save the @user_content_filter ..."},{"type":"method","name":"get_image_uri","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_image_uri","summary":"Gets the value of the #WebKitHitTestResult:image-uri property.","deprecated":null},{"type":"method","name":"get_input_hints","type_name":"InputMethodContext","ident":"webkit_input_method_context_get_input_hints","summary":"Get the value of the #WebKitInputMethodContext:input-hints property.","deprecated":null},{"type":"method","name":"get_input_method_context","type_name":"WebView","ident":"webkit_web_view_get_input_method_context","summary":"Get the #WebKitInputMethodContext currently in use by @web_view. Get the #WebKitInputMethodContext currently in use by @web_view, or %NULL ...","deprecated":null},{"type":"method","name":"get_input_purpose","type_name":"InputMethodContext","ident":"webkit_input_method_context_get_input_purpose","summary":"Get the value of the #WebKitInputMethodContext:input-purpose property.","deprecated":null},{"type":"method","name":"get_inspected_uri","type_name":"WebInspector","ident":"webkit_web_inspector_get_inspected_uri","summary":"Get the URI that is currently being inspected. This can be %NULL if nothing has been loaded yet ...","deprecated":null},{"type":"method","name":"get_inspector","type_name":"WebView","ident":"webkit_web_view_get_inspector","summary":"Get the #WebKitWebInspector associated to @web_view","deprecated":null},{"type":"method","name":"get_is_muted","type_name":"WebView","ident":"webkit_web_view_get_is_muted","summary":"Gets the mute state of @web_view.","deprecated":null},{"type":"method","name":"get_is_web_process_responsive","type_name":"WebView","ident":"webkit_web_view_get_is_web_process_responsive","summary":"Get whether the current web process of a #WebKitWebView is responsive.","deprecated":null},{"type":"method","name":"get_item","type_name":"OptionMenu","ident":"webkit_option_menu_get_item","summary":"Returns the #WebKitOptionMenuItem at @index in @menu.","deprecated":null},{"type":"method","name":"get_item_at_position","type_name":"ContextMenu","ident":"webkit_context_menu_get_item_at_position","summary":"Gets the item at the given position in the @menu.","deprecated":null},{"type":"method","name":"get_items","type_name":"ContextMenu","ident":"webkit_context_menu_get_items","summary":"Returns the item list of @menu.","deprecated":null},{"type":"method","name":"get_itp_enabled","type_name":"NetworkSession","ident":"webkit_network_session_get_itp_enabled","summary":"Get whether Intelligent Tracking Prevention (ITP) is enabled or not.","deprecated":null},{"type":"method","name":"get_itp_summary","type_name":"NetworkSession","ident":"webkit_network_session_get_itp_summary","summary":"Asynchronously get the list of #WebKitITPThirdParty seen for @session. Every #WebKitITPThirdParty contains the list of #WebKitITPFirstParty under which ...","deprecated":null},{"type":"method","name":"get_itp_summary","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_get_itp_summary","summary":"Asynchronously get the list of #WebKitITPThirdParty seen for @manager. Every #WebKitITPThirdParty contains the list of #WebKitITPFirstParty under which ...","deprecated":null},{"type":"method","name":"get_itp_summary_finish","type_name":"NetworkSession","ident":"webkit_network_session_get_itp_summary_finish","summary":"Finish an asynchronous operation started with webkit_network_session_get_itp_summary().","deprecated":null},{"type":"method","name":"get_itp_summary_finish","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_get_itp_summary_finish","summary":"Finish an asynchronous operation started with webkit_website_data_manager_get_itp_summary().","deprecated":null},{"type":"method","name":"get_javascript_can_access_clipboard","type_name":"Settings","ident":"webkit_settings_get_javascript_can_access_clipboard","summary":"Get the #WebKitSettings:javascript-can-access-clipboard property.","deprecated":null},{"type":"method","name":"get_javascript_can_open_windows_automatically","type_name":"Settings","ident":"webkit_settings_get_javascript_can_open_windows_automatically","summary":"Get the #WebKitSettings:javascript-can-open-windows-automatically property.","deprecated":null},{"type":"method","name":"get_kill_threshold","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_get_kill_threshold","summary":"Gets the kill memory usage threshold."},{"type":"method","name":"get_label","type_name":"OptionMenuItem","ident":"webkit_option_menu_item_get_label","summary":"Get the label of a #WebKitOptionMenuItem."},{"type":"method","name":"get_last_update_time","type_name":"ITPFirstParty","ident":"webkit_itp_first_party_get_last_update_time","summary":"Get the last time a #WebKitITPThirdParty has been seen under @itp_first_party. Each @WebKitITPFirstParty is created by webkit_itp_third_party_get_first_parties() and ..."},{"type":"method","name":"get_length","type_name":"BackForwardList","ident":"webkit_back_forward_list_get_length","summary":"Obtain the amount of items in the list.","deprecated":null},{"type":"method","name":"get_length","type_name":"FeatureList","ident":"webkit_feature_list_get_length","summary":"Gets the number of elements in the feature list."},{"type":"method","name":"get_link_label","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_link_label","summary":"Gets the value of the #WebKitHitTestResult:link-label property.","deprecated":null},{"type":"method","name":"get_link_title","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_link_title","summary":"Gets the value of the #WebKitHitTestResult:link-title property.","deprecated":null},{"type":"method","name":"get_link_uri","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_link_uri","summary":"Gets the value of the #WebKitHitTestResult:link-uri property.","deprecated":null},{"type":"method","name":"get_load_icons_ignoring_image_load_setting","type_name":"Settings","ident":"webkit_settings_get_load_icons_ignoring_image_load_setting","summary":"Setting no longer supported. This function returns %FALSE.","deprecated":"2.42"},{"type":"method","name":"get_locationbar_visible","type_name":"WindowProperties","ident":"webkit_window_properties_get_locationbar_visible","summary":"Get whether the window should have the locationbar visible or not.","deprecated":null},{"type":"method","name":"get_main_resource","type_name":"WebView","ident":"webkit_web_view_get_main_resource","summary":"Return the main resource of @web_view.","deprecated":null},{"type":"method","name":"get_manifest_version","type_name":"WebExtension","ident":"webkit_web_extension_get_manifest_version","summary":"Get the parsed manifest version, or `0` if there is no version specified in the manifest. A [error@WebKit.WebExtensionError.UNSUPPORTED_MANIFEST_VERSION] ...","deprecated":null},{"type":"method","name":"get_matches_all_hosts","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_get_matches_all_hosts","summary":"Gets whether the match pattern matches all host. This happens when the pattern is ``, or if `*` is ..."},{"type":"method","name":"get_matches_all_urls","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_get_matches_all_urls","summary":"Gets whether the match pattern matches all URLs, in other words, whether the pattern is ``."},{"type":"method","name":"get_math_font_family","type_name":"Settings","ident":"webkit_settings_get_math_font_family","summary":"Gets the #WebKitSettings:math-font-family property.","deprecated":null},{"type":"method","name":"get_max_match_count","type_name":"FindController","ident":"webkit_find_controller_get_max_match_count","summary":"Gets the maximum number of matches to report. Gets the maximum number of matches to report during a ...","deprecated":null},{"type":"method","name":"get_media_content_types_requiring_hardware_support","type_name":"Settings","ident":"webkit_settings_get_media_content_types_requiring_hardware_support","summary":"Gets the #WebKitSettings:media-content-types-requiring-hardware-support property.","deprecated":null},{"type":"method","name":"get_media_playback_allows_inline","type_name":"Settings","ident":"webkit_settings_get_media_playback_allows_inline","summary":"Get the #WebKitSettings:media-playback-allows-inline property.","deprecated":null},{"type":"method","name":"get_media_playback_requires_user_gesture","type_name":"Settings","ident":"webkit_settings_get_media_playback_requires_user_gesture","summary":"Get the #WebKitSettings:media-playback-requires-user-gesture property.","deprecated":null},{"type":"method","name":"get_media_uri","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_media_uri","summary":"Gets the value of the #WebKitHitTestResult:media-uri property.","deprecated":null},{"type":"method","name":"get_memory_limit","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_get_memory_limit","summary":"Gets the memory usage limit."},{"type":"method","name":"get_menubar_visible","type_name":"WindowProperties","ident":"webkit_window_properties_get_menubar_visible","summary":"Get whether the window should have the menubar visible or not.","deprecated":null},{"type":"method","name":"get_message","type_name":"ScriptDialog","ident":"webkit_script_dialog_get_message","summary":"Get the message of a #WebKitScriptDialog."},{"type":"method","name":"get_microphone_capture_state","type_name":"WebView","ident":"webkit_web_view_get_microphone_capture_state","summary":"Get the microphone capture state of a #WebKitWebView.","deprecated":null},{"type":"method","name":"get_mime_type","type_name":"URIResponse","ident":"webkit_uri_response_get_mime_type","summary":"Gets the MIME type of the response.","deprecated":null},{"type":"method","name":"get_mime_types","type_name":"FileChooserRequest","ident":"webkit_file_chooser_request_get_mime_types","summary":"Get the list of MIME types the file chooser dialog should handle. Get the list of MIME types ...","deprecated":null},{"type":"method","name":"get_mime_types_filter","type_name":"FileChooserRequest","ident":"webkit_file_chooser_request_get_mime_types_filter","summary":"Get the filter currently associated with the request. Get the filter currently associated with the request, ready to ...","deprecated":null},{"type":"method","name":"get_minimum_font_size","type_name":"Settings","ident":"webkit_settings_get_minimum_font_size","summary":"Gets the #WebKitSettings:minimum-font-size property.","deprecated":null},{"type":"method","name":"get_modifiers","type_name":"NavigationAction","ident":"webkit_navigation_action_get_modifiers","summary":"Return the modifier keys. Return a bitmask of #GdkModifierType values describing the modifier keys that were in effect ..."},{"type":"method","name":"get_monospace_font_family","type_name":"Settings","ident":"webkit_settings_get_monospace_font_family","summary":"Gets the #WebKitSettings:monospace-font-family property.","deprecated":null},{"type":"method","name":"get_mouse_button","type_name":"NavigationAction","ident":"webkit_navigation_action_get_mouse_button","summary":"Return the number of the mouse button that triggered the navigation. Return the number of the mouse button ..."},{"type":"method","name":"get_n_items","type_name":"ContextMenu","ident":"webkit_context_menu_get_n_items","summary":"Gets the length of the @menu.","deprecated":null},{"type":"method","name":"get_n_items","type_name":"OptionMenu","ident":"webkit_option_menu_get_n_items","summary":"Gets the length of the @menu.","deprecated":null},{"type":"method","name":"get_name","type_name":"UserMessage","ident":"webkit_user_message_get_name","summary":"Get the @message name.","deprecated":null},{"type":"method","name":"get_name","type_name":"ApplicationInfo","ident":"webkit_application_info_get_name","summary":"Get the name of the application. If webkit_application_info_set_name() hasn't been called with a valid name, this returns g_get_prgname()."},{"type":"method","name":"get_name","type_name":"Feature","ident":"webkit_feature_get_name","summary":"Gets a short name for the @feature. The returned string is suitable to be displayed to end users, ..."},{"type":"method","name":"get_name","type_name":"PermissionStateQuery","ident":"webkit_permission_state_query_get_name","summary":"Get the permission name for which access is being queried."},{"type":"method","name":"get_name","type_name":"WebsiteData","ident":"webkit_website_data_get_name","summary":"Gets the name of #WebKitWebsiteData. This is the website name, normally represented by a domain or host name. ..."},{"type":"method","name":"get_navigation_action","type_name":"NavigationPolicyDecision","ident":"webkit_navigation_policy_decision_get_navigation_action","summary":"Gets the value of the #WebKitNavigationPolicyDecision:navigation-action property.","deprecated":null},{"type":"method","name":"get_navigation_type","type_name":"NavigationAction","ident":"webkit_navigation_action_get_navigation_type","summary":"Return the type of action that triggered the navigation."},{"type":"method","name":"get_network_session","type_name":"WebView","ident":"webkit_web_view_get_network_session","summary":"Get the #WebKitNetworkSession associated to @web_view.","deprecated":null},{"type":"method","name":"get_network_session_for_automation","type_name":"WebContext","ident":"webkit_web_context_get_network_session_for_automation","summary":"Get the #WebKitNetworkSession used for automation sessions started in @context.","deprecated":null},{"type":"method","name":"get_nth_item","type_name":"BackForwardList","ident":"webkit_back_forward_list_get_nth_item","summary":"Returns the item at a given index relative to the current item.","deprecated":null},{"type":"method","name":"get_optional_features_requested","type_name":"XRPermissionRequest","ident":"webkit_xr_permission_request_get_optional_features_requested","summary":"Gets the full set of optional features requested by the web application. This includes both already granted features ...","deprecated":null},{"type":"method","name":"get_optional_permission_match_patterns","type_name":"WebExtension","ident":"webkit_web_extension_get_optional_permission_match_patterns","summary":"Get the set of websites that the extension may need access to for optional functionality. These match patterns can ...","deprecated":null},{"type":"method","name":"get_optional_permissions","type_name":"WebExtension","ident":"webkit_web_extension_get_optional_permissions","summary":"Get the set of permissions that the extension may need for optional functionality. These permissions can be requested by ...","deprecated":null},{"type":"method","name":"get_options","type_name":"FindController","ident":"webkit_find_controller_get_options","summary":"Gets the #WebKitFindOptions for the current search. Gets a bitmask containing the #WebKitFindOptions associated with the current search.","deprecated":null},{"type":"method","name":"get_original_uri","type_name":"BackForwardListItem","ident":"webkit_back_forward_list_item_get_original_uri","summary":"Obtain the original URI of the item. See also webkit_back_forward_list_item_get_uri().","deprecated":null},{"type":"method","name":"get_page_id","type_name":"WebView","ident":"webkit_web_view_get_page_id","summary":"Get the identifier of the #WebKitWebPage corresponding to the #WebKitWebView","deprecated":null},{"type":"method","name":"get_page_setup","type_name":"PrintOperation","ident":"webkit_print_operation_get_page_setup","summary":"Return the current page setup of @print_operation. It returns %NULL until either webkit_print_operation_set_page_setup() or webkit_print_operation_run_dialog() have been called.","deprecated":null},{"type":"method","name":"get_parameters","type_name":"UserMessage","ident":"webkit_user_message_get_parameters","summary":"Get the @message parameters.","deprecated":null},{"type":"method","name":"get_password","type_name":"Credential","ident":"webkit_credential_get_password","summary":"Get the password currently held by this #WebKitCredential."},{"type":"method","name":"get_path","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_get_path","summary":"Get the URI path of @request.","deprecated":null},{"type":"method","name":"get_path","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_get_path","summary":"Gets the storage path for user content filters.","deprecated":null},{"type":"method","name":"get_path","type_name":"WebExtension","ident":"webkit_web_extension_get_path","summary":"Get the path pointing to the folder containing the extension manifest and resources","deprecated":null},{"type":"method","name":"get_path","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_get_path","summary":"Gets the path part of the pattern string, unless [method@WebExtensionMatchPattern.get_matches_all_urls] is %TRUE."},{"type":"method","name":"get_persistence","type_name":"Credential","ident":"webkit_credential_get_persistence","summary":"Get the persistence mode currently held by this #WebKitCredential."},{"type":"method","name":"get_persistent_credential_storage_enabled","type_name":"NetworkSession","ident":"webkit_network_session_get_persistent_credential_storage_enabled","summary":"Get whether persistent credential storage is enabled or not. See also webkit_network_session_set_persistent_credential_storage_enabled().","deprecated":null},{"type":"method","name":"get_pictograph_font_family","type_name":"Settings","ident":"webkit_settings_get_pictograph_font_family","summary":"Gets the #WebKitSettings:pictograph-font-family property.","deprecated":null},{"type":"method","name":"get_poll_interval","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_get_poll_interval","summary":"Gets the interval at which memory usage is checked."},{"type":"method","name":"get_port","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_get_port","summary":"Get the port that this authentication challenge is applicable to.","deprecated":null},{"type":"method","name":"get_port","type_name":"SecurityOrigin","ident":"webkit_security_origin_get_port","summary":"Gets the port of @origin. This function will always return 0 if the port is the default port ..."},{"type":"method","name":"get_position","type_name":"ContextMenu","ident":"webkit_context_menu_get_position","summary":"Gets the position in view coordinates where the context menu was triggered. This function only returns valid coordinates ...","deprecated":null},{"type":"method","name":"get_preedit","type_name":"InputMethodContext","ident":"webkit_input_method_context_get_preedit","summary":"Get the pre-edit string and a list of WebKitInputMethodUnderline. Get the current pre-edit string for the @context, and ...","deprecated":null},{"type":"method","name":"get_print_backgrounds","type_name":"Settings","ident":"webkit_settings_get_print_backgrounds","summary":"Get the #WebKitSettings:print-backgrounds property.","deprecated":null},{"type":"method","name":"get_print_settings","type_name":"PrintOperation","ident":"webkit_print_operation_get_print_settings","summary":"Return the current print settings of @print_operation. It returns %NULL until either webkit_print_operation_set_print_settings() or webkit_print_operation_run_dialog() have been called.","deprecated":null},{"type":"method","name":"get_proposed_credential","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_get_proposed_credential","summary":"Get the #WebKitCredential of the proposed authentication challenge. Get the #WebKitCredential of the proposed authentication challenge that was ...","deprecated":null},{"type":"method","name":"get_protocol","type_name":"SecurityOrigin","ident":"webkit_security_origin_get_protocol","summary":"Gets the protocol of @origin."},{"type":"method","name":"get_realm","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_get_realm","summary":"Get the realm that this authentication challenge is applicable to.","deprecated":null},{"type":"method","name":"get_received_data_length","type_name":"Download","ident":"webkit_download_get_received_data_length","summary":"Gets the length of the data already downloaded for @download. Gets the length of the data already downloaded ...","deprecated":null},{"type":"method","name":"get_request","type_name":"Download","ident":"webkit_download_get_request","summary":"Retrieves the #WebKitURIRequest object that backs the download process.","deprecated":null},{"type":"method","name":"get_request","type_name":"ResponsePolicyDecision","ident":"webkit_response_policy_decision_get_request","summary":"Return the #WebKitURIRequest associated with the response decision. Modifications to the returned object are not taken into account ...","deprecated":null},{"type":"method","name":"get_request","type_name":"NavigationAction","ident":"webkit_navigation_action_get_request","summary":"Return the #WebKitURIRequest associated with the navigation action. Modifications to the returned object are not taken into account ..."},{"type":"method","name":"get_requested_permission_match_patterns","type_name":"WebExtension","ident":"webkit_web_extension_get_requested_permission_match_patterns","summary":"Get the set of websites that the extension requires access to for its base functionality.","deprecated":null},{"type":"method","name":"get_requested_permissions","type_name":"WebExtension","ident":"webkit_web_extension_get_requested_permissions","summary":"Get the set of permissions that the extension requires for its base functionality.","deprecated":null},{"type":"method","name":"get_requesting_domain","type_name":"WebsiteDataAccessPermissionRequest","ident":"webkit_website_data_access_permission_request_get_requesting_domain","summary":"Get the domain requesting permission to access its cookies while browsing the current domain.","deprecated":null},{"type":"method","name":"get_required_features_requested","type_name":"XRPermissionRequest","ident":"webkit_xr_permission_request_get_required_features_requested","summary":"Gets the full set of required features requested by the web application. This includes both already granted features ...","deprecated":null},{"type":"method","name":"get_resizable","type_name":"WindowProperties","ident":"webkit_window_properties_get_resizable","summary":"Get whether the window should be resizable by the user or not.","deprecated":null},{"type":"method","name":"get_response","type_name":"Download","ident":"webkit_download_get_response","summary":"Retrieves the #WebKitURIResponse object that backs the download process. Retrieves the #WebKitURIResponse object that backs the download process. ...","deprecated":null},{"type":"method","name":"get_response","type_name":"ResponsePolicyDecision","ident":"webkit_response_policy_decision_get_response","summary":"Gets the value of the #WebKitResponsePolicyDecision:response property.","deprecated":null},{"type":"method","name":"get_response","type_name":"WebResource","ident":"webkit_web_resource_get_response","summary":"Retrieves the #WebKitURIResponse of the resource load operation. This method returns %NULL if called before the response is ...","deprecated":null},{"type":"method","name":"get_rgba","type_name":"ColorChooserRequest","ident":"webkit_color_chooser_request_get_rgba","summary":"Gets the current #GdkRGBA color of @request","deprecated":null},{"type":"method","name":"get_sans_serif_font_family","type_name":"Settings","ident":"webkit_settings_get_sans_serif_font_family","summary":"Gets the #WebKitSettings:sans-serif-font-family property.","deprecated":null},{"type":"method","name":"get_scheme","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_get_scheme","summary":"Get the authentication scheme of the authentication challenge.","deprecated":null},{"type":"method","name":"get_scheme","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_get_scheme","summary":"Get the URI scheme of @request.","deprecated":null},{"type":"method","name":"get_scheme","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_get_scheme","summary":"Gets the scheme part of the pattern string, unless `webkit_web_extension_match_pattern_get_matches_all_urls` is %TRUE."},{"type":"method","name":"get_scrollbars_visible","type_name":"WindowProperties","ident":"webkit_window_properties_get_scrollbars_visible","summary":"Get whether the window should have the scrollbars visible or not.","deprecated":null},{"type":"method","name":"get_search_text","type_name":"FindController","ident":"webkit_find_controller_get_search_text","summary":"Gets the text that @find_controller is searching for. Gets the text that @find_controller is currently searching for. This ...","deprecated":null},{"type":"method","name":"get_security_manager","type_name":"WebContext","ident":"webkit_web_context_get_security_manager","summary":"Get the #WebKitSecurityManager of @context.","deprecated":null},{"type":"method","name":"get_security_origin","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_get_security_origin","summary":"Get the #WebKitSecurityOrigin that this authentication challenge is applicable to.","deprecated":null},{"type":"method","name":"get_security_origin","type_name":"XRPermissionRequest","ident":"webkit_xr_permission_request_get_security_origin","summary":"Gets the security origin that initiated the permission request.","deprecated":null},{"type":"method","name":"get_security_origin","type_name":"PermissionStateQuery","ident":"webkit_permission_state_query_get_security_origin","summary":"Get the permission origin for which access is being queried."},{"type":"method","name":"get_select_multiple","type_name":"FileChooserRequest","ident":"webkit_file_chooser_request_get_select_multiple","summary":"Whether the file chooser should allow selecting multiple files. Determine whether the file chooser associated to this #WebKitFileChooserRequest ...","deprecated":null},{"type":"method","name":"get_selected_files","type_name":"FileChooserRequest","ident":"webkit_file_chooser_request_get_selected_files","summary":"Get the list of selected files associated to the request. Get the list of selected files currently associated ...","deprecated":null},{"type":"method","name":"get_serif_font_family","type_name":"Settings","ident":"webkit_settings_get_serif_font_family","summary":"Gets the #WebKitSettings:serif-font-family property.","deprecated":null},{"type":"method","name":"get_session_mode","type_name":"XRPermissionRequest","ident":"webkit_xr_permission_request_get_session_mode","summary":"Gets the session mode for which permission is being requested.","deprecated":null},{"type":"method","name":"get_session_state","type_name":"WebView","ident":"webkit_web_view_get_session_state","summary":"Gets the current session state of @web_view","deprecated":null},{"type":"method","name":"get_settings","type_name":"WebView","ident":"webkit_web_view_get_settings","summary":"Gets the #WebKitSettings currently applied to @web_view. If no other #WebKitSettings have been explicitly applied to @web_view with ...","deprecated":null},{"type":"method","name":"get_size","type_name":"WebsiteData","ident":"webkit_website_data_get_size","summary":"Gets the size of the data of types @types in a #WebKitWebsiteData. Note that currently the data size ..."},{"type":"method","name":"get_snapshot","type_name":"WebView","ident":"webkit_web_view_get_snapshot","summary":"Asynchronously retrieves a snapshot of @web_view for @region. @options specifies how the snapshot should be rendered. When ...","deprecated":null},{"type":"method","name":"get_snapshot_finish","type_name":"WebView","ident":"webkit_web_view_get_snapshot_finish","summary":"Finishes an asynchronous operation started with webkit_web_view_get_snapshot(), producing an image of the snapshot using the BGRA8888 pixel format.","deprecated":null},{"type":"method","name":"get_spell_checking_enabled","type_name":"WebContext","ident":"webkit_web_context_get_spell_checking_enabled","summary":"Get whether spell checking feature is currently enabled.","deprecated":null},{"type":"method","name":"get_spell_checking_languages","type_name":"WebContext","ident":"webkit_web_context_get_spell_checking_languages","summary":"Get the the list of spell checking languages. Get the the list of spell checking languages associated with ...","deprecated":null},{"type":"method","name":"get_status","type_name":"Feature","ident":"webkit_feature_get_status","summary":"Gets the status of the feature."},{"type":"method","name":"get_status_code","type_name":"URIResponse","ident":"webkit_uri_response_get_status_code","summary":"Get the status code of the #WebKitURIResponse. Get the status code of the #WebKitURIResponse as returned by the ...","deprecated":null},{"type":"method","name":"get_statusbar_visible","type_name":"WindowProperties","ident":"webkit_window_properties_get_statusbar_visible","summary":"Get whether the window should have the statusbar visible or not.","deprecated":null},{"type":"method","name":"get_stock_action","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_stock_action","summary":"Gets the #WebKitContextMenuAction of @item. If the #WebKitContextMenuItem was not created for a stock action %WEBKIT_CONTEXT_MENU_ACTION_CUSTOM will be ...","deprecated":null},{"type":"method","name":"get_strict_threshold","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_get_strict_threshold","summary":"Gets the strict memory usage threshold."},{"type":"method","name":"get_string","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_get_string","summary":"Gets the original pattern string."},{"type":"method","name":"get_submenu","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_submenu","summary":"Gets the submenu of @item.","deprecated":null},{"type":"method","name":"get_suggested_filename","type_name":"URIResponse","ident":"webkit_uri_response_get_suggested_filename","summary":"Get the suggested filename for @response. Get the suggested filename for @response, as specified by the 'Content-Disposition' HTTP ...","deprecated":null},{"type":"method","name":"get_tag","type_name":"Notification","ident":"webkit_notification_get_tag","summary":"Obtains the tag identifier for the notification.","deprecated":null},{"type":"method","name":"get_theme_color","type_name":"WebView","ident":"webkit_web_view_get_theme_color","summary":"Gets the theme color that is specified by the content in the @web_view. If the @web_view doesn't have a ...","deprecated":null},{"type":"method","name":"get_time_zone_override","type_name":"WebContext","ident":"webkit_web_context_get_time_zone_override","summary":"Get the #WebKitWebContext:time-zone-override property.","deprecated":null},{"type":"method","name":"get_title","type_name":"BackForwardListItem","ident":"webkit_back_forward_list_item_get_title","summary":"Obtain the title of the item.","deprecated":null},{"type":"method","name":"get_title","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_title","summary":"Gets the title of @item.","deprecated":null},{"type":"method","name":"get_title","type_name":"Notification","ident":"webkit_notification_get_title","summary":"Obtains the title for the notification.","deprecated":null},{"type":"method","name":"get_title","type_name":"WebView","ident":"webkit_web_view_get_title","summary":"Gets the value of the #WebKitWebView:title property. You can connect to notify::title signal of @web_view to be notified ...","deprecated":null},{"type":"method","name":"get_tls_errors_policy","type_name":"NetworkSession","ident":"webkit_network_session_get_tls_errors_policy","summary":"Get the TLS errors policy of @session.","deprecated":null},{"type":"method","name":"get_tls_info","type_name":"WebView","ident":"webkit_web_view_get_tls_info","summary":"Retrieves the #GTlsCertificate associated with the main resource of @web_view. Retrieves the #GTlsCertificate associated with the main resource ...","deprecated":null},{"type":"method","name":"get_toolbar_visible","type_name":"WindowProperties","ident":"webkit_window_properties_get_toolbar_visible","summary":"Get whether the window should have the toolbar visible or not.","deprecated":null},{"type":"method","name":"get_tooltip","type_name":"OptionMenuItem","ident":"webkit_option_menu_item_get_tooltip","summary":"Get the tooltip of a #WebKitOptionMenuItem."},{"type":"method","name":"get_types","type_name":"WebsiteData","ident":"webkit_website_data_get_types","summary":"Gets the types of data stored in the client for a #WebKitWebsiteData. These are the types actually present, ..."},{"type":"method","name":"get_typing_attributes","type_name":"EditorState","ident":"webkit_editor_state_get_typing_attributes","summary":"Gets the typing attributes at the current cursor position. If there is a selection, this returns the typing ...","deprecated":null},{"type":"method","name":"get_uri","type_name":"BackForwardListItem","ident":"webkit_back_forward_list_item_get_uri","summary":"Obtain the URI of the item. This URI may differ from the original URI if the page was, ...","deprecated":null},{"type":"method","name":"get_uri","type_name":"URIRequest","ident":"webkit_uri_request_get_uri","summary":"Obtains the request URI.","deprecated":null},{"type":"method","name":"get_uri","type_name":"URIResponse","ident":"webkit_uri_response_get_uri","summary":"Gets the URI which resulted in the response.","deprecated":null},{"type":"method","name":"get_uri","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_get_uri","summary":"Get the URI of @request.","deprecated":null},{"type":"method","name":"get_uri","type_name":"WebResource","ident":"webkit_web_resource_get_uri","summary":"Returns the current active URI of @resource. The active URI might change during a load operation: ...","deprecated":null},{"type":"method","name":"get_uri","type_name":"WebView","ident":"webkit_web_view_get_uri","summary":"Returns the current active URI of @web_view. The active URI might change during a load operation: ...","deprecated":null},{"type":"method","name":"get_user_agent","type_name":"Settings","ident":"webkit_settings_get_user_agent","summary":"Get the #WebKitSettings:user-agent property.","deprecated":null},{"type":"method","name":"get_user_content_manager","type_name":"WebView","ident":"webkit_web_view_get_user_content_manager","summary":"Gets the user content manager associated to @web_view.","deprecated":null},{"type":"method","name":"get_user_data","type_name":"ContextMenu","ident":"webkit_context_menu_get_user_data","summary":"Gets the user data of @menu. This function can be used from the UI Process to get user ...","deprecated":null},{"type":"method","name":"get_username","type_name":"Credential","ident":"webkit_credential_get_username","summary":"Get the username currently held by this #WebKitCredential."},{"type":"method","name":"get_version","type_name":"WebExtension","ident":"webkit_web_extension_get_version","summary":"Get the version for the extension.","deprecated":null},{"type":"method","name":"get_version","type_name":"ApplicationInfo","ident":"webkit_application_info_get_version","summary":"Get the application version previously set with webkit_application_info_set_version()."},{"type":"method","name":"get_web_extension_mode","type_name":"WebView","ident":"webkit_web_view_get_web_extension_mode","summary":"Get the view's #WebKitWebExtensionMode.","deprecated":null},{"type":"method","name":"get_web_view","type_name":"Download","ident":"webkit_download_get_web_view","summary":"Get the #WebKitWebView that initiated the download.","deprecated":null},{"type":"method","name":"get_web_view","type_name":"FindController","ident":"webkit_find_controller_get_web_view","summary":"Gets the #WebKitWebView this find controller is associated to. Do not dereference the returned instance as it belongs ...","deprecated":null},{"type":"method","name":"get_web_view","type_name":"URISchemeRequest","ident":"webkit_uri_scheme_request_get_web_view","summary":"Get the #WebKitWebView that initiated the request.","deprecated":null},{"type":"method","name":"get_web_view","type_name":"WebInspector","ident":"webkit_web_inspector_get_web_view","summary":"Get the #WebKitWebViewBase used to display the inspector. This might be %NULL if the inspector hasn't been loaded ...","deprecated":null},{"type":"method","name":"get_webrtc_udp_ports_range","type_name":"Settings","ident":"webkit_settings_get_webrtc_udp_ports_range","summary":"Get the [property@Settings:webrtc-udp-ports-range] property.","deprecated":null},{"type":"method","name":"get_website_data_access_allowed","type_name":"ITPFirstParty","ident":"webkit_itp_first_party_get_website_data_access_allowed","summary":"Get whether @itp_first_party has granted website data access to its #WebKitITPThirdParty. Each @WebKitITPFirstParty is created by webkit_itp_third_party_get_first_parties() and ..."},{"type":"method","name":"get_website_data_manager","type_name":"NetworkSession","ident":"webkit_network_session_get_website_data_manager","summary":"Get the #WebKitWebsiteDataManager of @session.","deprecated":null},{"type":"method","name":"get_website_policies","type_name":"WebView","ident":"webkit_web_view_get_website_policies","summary":"Gets the default website policies. Gets the default website policies set on construction in the @web_view. These can ...","deprecated":null},{"type":"method","name":"get_window_properties","type_name":"WebView","ident":"webkit_web_view_get_window_properties","summary":"Get the #WebKitWindowProperties object. Get the #WebKitWindowProperties object containing the properties that the window containing @web_view should have.","deprecated":null},{"type":"method","name":"get_zoom_level","type_name":"WebView","ident":"webkit_web_view_get_zoom_level","summary":"Set the zoom level of @web_view. Get the zoom level of @web_view, i.e. the factor by which the ...","deprecated":null},{"type":"method","name":"get_zoom_text_only","type_name":"Settings","ident":"webkit_settings_get_zoom_text_only","summary":"Get the #WebKitSettings:zoom-text-only property.","deprecated":null},{"type":"method","name":"go_back","type_name":"WebView","ident":"webkit_web_view_go_back","summary":"Loads the previous history item. You can monitor the load operation by connecting to #WebKitWebView::load-changed signal.","deprecated":null},{"type":"method","name":"go_forward","type_name":"WebView","ident":"webkit_web_view_go_forward","summary":"Loads the next history item. You can monitor the load operation by connecting to #WebKitWebView::load-changed signal.","deprecated":null},{"type":"method","name":"go_to_back_forward_list_item","type_name":"WebView","ident":"webkit_web_view_go_to_back_forward_list_item","summary":"Loads the specific history item @list_item. You can monitor the load operation by connecting to #WebKitWebView::load-changed signal.","deprecated":null},{"type":"method","name":"has_password","type_name":"Credential","ident":"webkit_credential_has_password","summary":"Determine whether this credential has a password stored."},{"type":"method","name":"ignore","type_name":"PolicyDecision","ident":"webkit_policy_decision_ignore","summary":"#WebKitResponsePolicyDecision, this would cancel the request. Ignore the action which triggered this decision. For instance, for a #WebKitResponsePolicyDecision, ...","deprecated":null},{"type":"method","name":"initialize_notification_permissions","type_name":"WebContext","ident":"webkit_web_context_initialize_notification_permissions","summary":"Sets initial desktop notification permissions for the @context. @allowed_origins and @disallowed_origins must each be #GList of #WebKitSecurityOrigin objects ...","deprecated":null},{"type":"method","name":"insert","type_name":"ContextMenu","ident":"webkit_context_menu_insert","summary":"Inserts @item into the @menu at the given position. If @position is negative, or is larger than the ...","deprecated":null},{"type":"method","name":"is_attached","type_name":"WebInspector","ident":"webkit_web_inspector_is_attached","summary":"Whether the @inspector view is currently attached to the same window that contains the inspected view.","deprecated":null},{"type":"method","name":"is_automation_allowed","type_name":"WebContext","ident":"webkit_web_context_is_automation_allowed","summary":"Get whether automation is allowed in @context. See also webkit_web_context_set_automation_allowed().","deprecated":null},{"type":"method","name":"is_controlled_by_automation","type_name":"WebView","ident":"webkit_web_view_is_controlled_by_automation","summary":"Get whether a #WebKitWebView was created with #WebKitWebView:is-controlled-by-automation property enabled. Only #WebKitWebViews controlled by automation can be used ...","deprecated":null},{"type":"method","name":"is_copy_available","type_name":"EditorState","ident":"webkit_editor_state_is_copy_available","summary":"Gets whether a copy command can be issued.","deprecated":null},{"type":"method","name":"is_cut_available","type_name":"EditorState","ident":"webkit_editor_state_is_cut_available","summary":"Gets whether a cut command can be issued.","deprecated":null},{"type":"method","name":"is_editable","type_name":"WebView","ident":"webkit_web_view_is_editable","summary":"Gets whether the user is allowed to edit the HTML document. When @web_view is not editable an element ...","deprecated":null},{"type":"method","name":"is_enabled","type_name":"OptionMenuItem","ident":"webkit_option_menu_item_is_enabled","summary":"Whether a #WebKitOptionMenuItem is enabled."},{"type":"method","name":"is_ephemeral","type_name":"NetworkSession","ident":"webkit_network_session_is_ephemeral","summary":"Get whether @session is ephemeral. A #WebKitNetworkSession is ephemeral when its #WebKitWebsiteDataManager is ephemeral. See #WebKitWebsiteDataManager:is-ephemeral for more details.","deprecated":null},{"type":"method","name":"is_ephemeral","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_is_ephemeral","summary":"Get whether a #WebKitWebsiteDataManager is ephemeral. See #WebKitWebsiteDataManager:is-ephemeral for more details.","deprecated":null},{"type":"method","name":"is_for_proxy","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_is_for_proxy","summary":"Determine whether the authentication challenge is associated with a proxy server. Determine whether the authentication challenge is associated ...","deprecated":null},{"type":"method","name":"is_group_child","type_name":"OptionMenuItem","ident":"webkit_option_menu_item_is_group_child","summary":"Whether a #WebKitOptionMenuItem is a group child."},{"type":"method","name":"is_group_label","type_name":"OptionMenuItem","ident":"webkit_option_menu_item_is_group_label","summary":"Whether a #WebKitOptionMenuItem is a group label."},{"type":"method","name":"is_immersive_mode_enabled","type_name":"WebView","ident":"webkit_web_view_is_immersive_mode_enabled","summary":"Gets whether @web_view is in immersive mode. An immersive session is a mode in which the user is ...","deprecated":null},{"type":"method","name":"is_loading","type_name":"WebView","ident":"webkit_web_view_is_loading","summary":"Gets the value of the #WebKitWebView:is-loading property. You can monitor when a #WebKitWebView is loading a page by ...","deprecated":null},{"type":"method","name":"is_main_frame_main_resource","type_name":"ResponsePolicyDecision","ident":"webkit_response_policy_decision_is_main_frame_main_resource","summary":"Gets whether the request is the main frame main resource","deprecated":null},{"type":"method","name":"is_mime_type_supported","type_name":"ResponsePolicyDecision","ident":"webkit_response_policy_decision_is_mime_type_supported","summary":"Gets whether the MIME type of the response can be displayed in the #WebKitWebView. Gets whether the MIME ...","deprecated":null},{"type":"method","name":"is_paste_available","type_name":"EditorState","ident":"webkit_editor_state_is_paste_available","summary":"Gets whether a paste command can be issued.","deprecated":null},{"type":"method","name":"is_playing_audio","type_name":"WebView","ident":"webkit_web_view_is_playing_audio","summary":"Gets the value of the #WebKitWebView:is-playing-audio property. You can monitor when a page in a #WebKitWebView is playing ...","deprecated":null},{"type":"method","name":"is_redirect","type_name":"NavigationAction","ident":"webkit_navigation_action_is_redirect","summary":"Returns whether the @navigation was redirected."},{"type":"method","name":"is_redo_available","type_name":"EditorState","ident":"webkit_editor_state_is_redo_available","summary":"Gets whether a redo command can be issued.","deprecated":null},{"type":"method","name":"is_retry","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_is_retry","summary":"Determine whether this this is a first attempt or a retry for this authentication challenge.","deprecated":null},{"type":"method","name":"is_selected","type_name":"OptionMenuItem","ident":"webkit_option_menu_item_is_selected","summary":"Whether a #WebKitOptionMenuItem is the currently selected one."},{"type":"method","name":"is_separator","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_is_separator","summary":"Checks whether @item is a separator.","deprecated":null},{"type":"method","name":"is_undo_available","type_name":"EditorState","ident":"webkit_editor_state_is_undo_available","summary":"Gets whether an undo command can be issued.","deprecated":null},{"type":"method","name":"is_user_gesture","type_name":"NavigationAction","ident":"webkit_navigation_action_is_user_gesture","summary":"Return whether the navigation was triggered by a user gesture like a mouse click."},{"type":"method","name":"last","type_name":"ContextMenu","ident":"webkit_context_menu_last","summary":"Gets the last item in the @menu.","deprecated":null},{"type":"method","name":"leave_immersive_mode","type_name":"WebView","ident":"webkit_web_view_leave_immersive_mode","summary":"Requests to leave the immersive mode this #WebKitWebView is in. Users interact with web content to start XR ...","deprecated":null},{"type":"method","name":"list_text_fields","type_name":"FormSubmissionRequest","ident":"webkit_form_submission_request_list_text_fields","summary":"Get lists of the text fields contained in the form associated to @request. Get lists with the names ...","deprecated":null},{"type":"method","name":"load","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_load","summary":"Asynchronously load a content filter given its @identifier. The filter must have been previously stored using webkit_user_content_filter_store_save(). ...","deprecated":null},{"type":"method","name":"load_alternate_html","type_name":"WebView","ident":"webkit_web_view_load_alternate_html","summary":"Load the given @content string for the URI @content_uri. This allows clients to display page-loading errors in the ...","deprecated":null},{"type":"method","name":"load_bytes","type_name":"WebView","ident":"webkit_web_view_load_bytes","summary":"Load the specified @bytes into @web_view using the given @mime_type and @encoding. When @mime_type is %NULL, it defaults ...","deprecated":null},{"type":"method","name":"load_finish","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_load_finish","summary":"Finishes an asynchronous filter load previously started with webkit_user_content_filter_store_load().","deprecated":null},{"type":"method","name":"load_html","type_name":"WebView","ident":"webkit_web_view_load_html","summary":"Load the given @content string with the specified @base_uri. If @base_uri is not %NULL, relative URLs in the ...","deprecated":null},{"type":"method","name":"load_plain_text","type_name":"WebView","ident":"webkit_web_view_load_plain_text","summary":"Load the specified @plain_text string into @web_view. The mime type of document will be \"text/plain\". You can monitor ...","deprecated":null},{"type":"method","name":"load_request","type_name":"WebView","ident":"webkit_web_view_load_request","summary":"Requests loading of the specified #WebKitURIRequest. You can monitor the load operation by connecting to #WebKitWebView::load-changed signal.","deprecated":null},{"type":"method","name":"load_uri","type_name":"WebView","ident":"webkit_web_view_load_uri","summary":"Requests loading of the specified URI string. You can monitor the load operation by connecting to #WebKitWebView::load-changed signal.","deprecated":null},{"type":"method","name":"matches_pattern","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_matches_pattern","summary":"Matches the @matchPattern against the specified @pattern with options."},{"type":"method","name":"matches_url","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_matches_url","summary":"Matches the @matchPattern against the specified URL with options."},{"type":"method","name":"move_item","type_name":"ContextMenu","ident":"webkit_context_menu_move_item","summary":"Moves @item to the given position in the @menu. If @position is negative, or is larger than the ...","deprecated":null},{"type":"method","name":"notify_cursor_area","type_name":"InputMethodContext","ident":"webkit_input_method_context_notify_cursor_area","summary":"Notify @context that cursor area changed in input associated.","deprecated":null},{"type":"method","name":"notify_focus_in","type_name":"InputMethodContext","ident":"webkit_input_method_context_notify_focus_in","summary":"Notify @context that input associated has gained focus.","deprecated":null},{"type":"method","name":"notify_focus_out","type_name":"InputMethodContext","ident":"webkit_input_method_context_notify_focus_out","summary":"Notify @context that input associated has lost focus.","deprecated":null},{"type":"method","name":"notify_surrounding","type_name":"InputMethodContext","ident":"webkit_input_method_context_notify_surrounding","summary":"Notify @context that the context surrounding the cursor has changed. If there's no selection @selection_index is the same ...","deprecated":null},{"type":"method","name":"prefetch_dns","type_name":"NetworkSession","ident":"webkit_network_session_prefetch_dns","summary":"Resolve the domain name of the given @hostname in advance, so that if a URI of @hostname is requested ...","deprecated":null},{"type":"method","name":"prepend","type_name":"ContextMenu","ident":"webkit_context_menu_prepend","summary":"Adds @item at the beginning of the @menu.","deprecated":null},{"type":"method","name":"print","type_name":"PrintOperation","ident":"webkit_print_operation_print","summary":"Start a print operation using current print settings and page setup. Start a print operation using current print ...","deprecated":null},{"type":"method","name":"prompt_get_default_text","type_name":"ScriptDialog","ident":"webkit_script_dialog_prompt_get_default_text","summary":"Get the default text of a #WebKitScriptDialog of type %WEBKIT_SCRIPT_DIALOG_PROMPT. It's an error to use this method with ..."},{"type":"method","name":"prompt_set_text","type_name":"ScriptDialog","ident":"webkit_script_dialog_prompt_set_text","summary":"Set the text entered by the user in the dialog. This method is used for %WEBKIT_SCRIPT_DIALOG_PROMPT dialogs when ..."},{"type":"method","name":"ref","type_name":"ApplicationInfo","ident":"webkit_application_info_ref","summary":"Atomically increments the reference count of @info by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"Feature","ident":"webkit_feature_ref","summary":"Atomically acquires a reference on the given @feature. This function is MT-safe and may be called from any thread."},{"type":"method","name":"ref","type_name":"FeatureList","ident":"webkit_feature_list_ref","summary":"Atomically acquires a reference on the given @feature_list. This function is MT-safe and may be called from any thread."},{"type":"method","name":"ref","type_name":"ITPFirstParty","ident":"webkit_itp_first_party_ref","summary":"Atomically increments the reference count of @itp_first_party by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"ITPThirdParty","ident":"webkit_itp_third_party_ref","summary":"Atomically increments the reference count of @itp_third_party by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"PermissionStateQuery","ident":"webkit_permission_state_query_ref","summary":"Atomically increments the reference count of @query by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"ScriptDialog","ident":"webkit_script_dialog_ref","summary":"Atomically increments the reference count of @dialog by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"ScriptMessageReply","ident":"webkit_script_message_reply_ref","summary":"Atomically increments the reference count of @script_message_reply by one."},{"type":"method","name":"ref","type_name":"SecurityOrigin","ident":"webkit_security_origin_ref","summary":"Atomically increments the reference count of @origin by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"UserContentFilter","ident":"webkit_user_content_filter_ref","summary":"Atomically increments the reference count of @user_content_filter by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"UserScript","ident":"webkit_user_script_ref","summary":"Atomically increments the reference count of @user_script by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"UserStyleSheet","ident":"webkit_user_style_sheet_ref","summary":"Atomically increments the reference count of @user_style_sheet by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_ref","summary":"Atomically acquires a reference on the given @matchPattern. This function is MT-safe and may be called from any thread."},{"type":"method","name":"ref","type_name":"WebsiteData","ident":"webkit_website_data_ref","summary":"Atomically increments the reference count of @website_data by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"ref","type_name":"WebViewSessionState","ident":"webkit_web_view_session_state_ref","summary":"Atomically increments the reference count of @state by one. This function is MT-safe and may be called from ..."},{"type":"method","name":"register_script_message_handler","type_name":"UserContentManager","ident":"webkit_user_content_manager_register_script_message_handler","summary":"Registers a new user script message handler in script world. After it is registered, scripts can use `window.webkit.messageHandlers..postMessage(value)` ...","deprecated":null},{"type":"method","name":"register_script_message_handler_with_reply","type_name":"UserContentManager","ident":"webkit_user_content_manager_register_script_message_handler_with_reply","summary":"Registers a new user script message handler in script world with name @world_name. Different from webkit_user_content_manager_register_script_message_handler(), when using ...","deprecated":null},{"type":"method","name":"register_uri_scheme","type_name":"WebContext","ident":"webkit_web_context_register_uri_scheme","summary":"Register @scheme in @context. Register @scheme in @context, so that when an URI request with @scheme is made ...","deprecated":null},{"type":"method","name":"register_uri_scheme_as_cors_enabled","type_name":"SecurityManager","ident":"webkit_security_manager_register_uri_scheme_as_cors_enabled","summary":"Register @scheme as a CORS (Cross-origin resource sharing) enabled scheme. This means that CORS requests are allowed. See ...","deprecated":null},{"type":"method","name":"register_uri_scheme_as_display_isolated","type_name":"SecurityManager","ident":"webkit_security_manager_register_uri_scheme_as_display_isolated","summary":"Register @scheme as a display isolated scheme. This means that pages cannot display these URIs unless they are ...","deprecated":null},{"type":"method","name":"register_uri_scheme_as_empty_document","type_name":"SecurityManager","ident":"webkit_security_manager_register_uri_scheme_as_empty_document","summary":"Register @scheme as an empty document scheme. This means that they are allowed to commit synchronously.","deprecated":null},{"type":"method","name":"register_uri_scheme_as_local","type_name":"SecurityManager","ident":"webkit_security_manager_register_uri_scheme_as_local","summary":"Register @scheme as a local scheme. This means that other non-local pages cannot link to or access URIs ...","deprecated":null},{"type":"method","name":"register_uri_scheme_as_no_access","type_name":"SecurityManager","ident":"webkit_security_manager_register_uri_scheme_as_no_access","summary":"Register @scheme as a no-access scheme. This means that pages loaded with this URI scheme cannot access pages ...","deprecated":null},{"type":"method","name":"register_uri_scheme_as_secure","type_name":"SecurityManager","ident":"webkit_security_manager_register_uri_scheme_as_secure","summary":"Register @scheme as a secure scheme. This means that mixed content warnings won't be generated for this scheme ...","deprecated":null},{"type":"method","name":"reload","type_name":"WebView","ident":"webkit_web_view_reload","summary":"Reloads the current contents of @web_view. See also webkit_web_view_reload_bypass_cache().","deprecated":null},{"type":"method","name":"reload_bypass_cache","type_name":"WebView","ident":"webkit_web_view_reload_bypass_cache","summary":"Reloads the current contents of @web_view without using any cached data.","deprecated":null},{"type":"method","name":"remove","type_name":"ContextMenu","ident":"webkit_context_menu_remove","summary":"Removes @item from the @menu. See also webkit_context_menu_remove_all() to remove all items.","deprecated":null},{"type":"method","name":"remove","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_remove","summary":"Asynchronously remove a content filter given its @identifier. When the operation is finished, @callback will be invoked, which ...","deprecated":null},{"type":"method","name":"remove","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_remove","summary":"Asynchronously removes the website data in the given @website_data list. Asynchronously removes the website data of the given ...","deprecated":null},{"type":"method","name":"remove_all","type_name":"ContextMenu","ident":"webkit_context_menu_remove_all","summary":"Removes all items of the @menu.","deprecated":null},{"type":"method","name":"remove_all_filters","type_name":"UserContentManager","ident":"webkit_user_content_manager_remove_all_filters","summary":"Removes all content filters from the given #WebKitUserContentManager.","deprecated":null},{"type":"method","name":"remove_all_scripts","type_name":"UserContentManager","ident":"webkit_user_content_manager_remove_all_scripts","summary":"Removes all user scripts from the given #WebKitUserContentManager See also webkit_user_content_manager_remove_script().","deprecated":null},{"type":"method","name":"remove_all_style_sheets","type_name":"UserContentManager","ident":"webkit_user_content_manager_remove_all_style_sheets","summary":"Removes all user style sheets from the given #WebKitUserContentManager.","deprecated":null},{"type":"method","name":"remove_filter","type_name":"UserContentManager","ident":"webkit_user_content_manager_remove_filter","summary":"Removes a filter from the given #WebKitUserContentManager. Since 2.24","deprecated":null},{"type":"method","name":"remove_filter_by_id","type_name":"UserContentManager","ident":"webkit_user_content_manager_remove_filter_by_id","summary":"Removes a filter by the given identifier. Removes a filter from the given #WebKitUserContentManager given the identifier of ...","deprecated":null},{"type":"method","name":"remove_finish","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_remove_finish","summary":"Finishes an asynchronous filter removal previously started with webkit_user_content_filter_store_remove().","deprecated":null},{"type":"method","name":"remove_finish","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_remove_finish","summary":"Finish an asynchronous operation started with webkit_website_data_manager_remove().","deprecated":null},{"type":"method","name":"remove_script","type_name":"UserContentManager","ident":"webkit_user_content_manager_remove_script","summary":"Removes a #WebKitUserScript from the given #WebKitUserContentManager. See also webkit_user_content_manager_remove_all_scripts().","deprecated":null},{"type":"method","name":"remove_style_sheet","type_name":"UserContentManager","ident":"webkit_user_content_manager_remove_style_sheet","summary":"Removes a #WebKitUserStyleSheet from the given #WebKitUserContentManager. See also webkit_user_content_manager_remove_all_style_sheets().","deprecated":null},{"type":"method","name":"replace_cookies","type_name":"CookieManager","ident":"webkit_cookie_manager_replace_cookies","summary":"Asynchronously replace all cookies in @cookie_manager with the given list of @cookies. When the operation is finished, @callback ...","deprecated":null},{"type":"method","name":"replace_cookies_finish","type_name":"CookieManager","ident":"webkit_cookie_manager_replace_cookies_finish","summary":"Finish an asynchronous operation started with webkit_cookie_manager_replace_cookies().","deprecated":null},{"type":"method","name":"reset","type_name":"InputMethodContext","ident":"webkit_input_method_context_reset","summary":"Reset the @context. This will typically cause the input to clear the preedit state.","deprecated":null},{"type":"method","name":"restore_session_state","type_name":"WebView","ident":"webkit_web_view_restore_session_state","summary":"Restore the @web_view session state from @state","deprecated":null},{"type":"method","name":"return_error_message","type_name":"ScriptMessageReply","ident":"webkit_script_message_reply_return_error_message","summary":"Reply to a script message with an error message."},{"type":"method","name":"return_value","type_name":"ScriptMessageReply","ident":"webkit_script_message_reply_return_value","summary":"Reply to a script message with a value. This function can be called twice for passing the reply ..."},{"type":"method","name":"run_dialog","type_name":"PrintOperation","ident":"webkit_print_operation_run_dialog","summary":"Run the print dialog and start printing. Run the print dialog and start printing using the options selected ...","deprecated":null},{"type":"method","name":"save","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_save","summary":"Asynchronously save a content filter from a set source rule. Asynchronously save a content filter from a source ...","deprecated":null},{"type":"method","name":"save","type_name":"WebView","ident":"webkit_web_view_save","summary":"Asynchronously save the current web page. Asynchronously save the current web page associated to the #WebKitWebView into a ...","deprecated":null},{"type":"method","name":"save_finish","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_save_finish","summary":"Finishes an asynchronous filter save previously started with webkit_user_content_filter_store_save().","deprecated":null},{"type":"method","name":"save_finish","type_name":"WebView","ident":"webkit_web_view_save_finish","summary":"Finish an asynchronous operation started with webkit_web_view_save().","deprecated":null},{"type":"method","name":"save_from_file","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_save_from_file","summary":"Asynchronously save a content filter from the contents of a file. Asynchronously save a content filter from the ...","deprecated":null},{"type":"method","name":"save_from_file_finish","type_name":"UserContentFilterStore","ident":"webkit_user_content_filter_store_save_from_file_finish","summary":"Finishes and asynchronous filter save previously started with webkit_user_content_filter_store_save_from_file().","deprecated":null},{"type":"method","name":"save_to_file","type_name":"WebView","ident":"webkit_web_view_save_to_file","summary":"Asynchronously save the current web page. Asynchronously save the current web page associated to the #WebKitWebView into a ...","deprecated":null},{"type":"method","name":"save_to_file_finish","type_name":"WebView","ident":"webkit_web_view_save_to_file_finish","summary":"Finish an asynchronous operation started with webkit_web_view_save_to_file().","deprecated":null},{"type":"method","name":"search","type_name":"FindController","ident":"webkit_find_controller_search","summary":"Looks for @search_text associated with @find_controller. Looks for @search_text in the #WebKitWebView associated with @find_controller since the beginning ...","deprecated":null},{"type":"method","name":"search_finish","type_name":"FindController","ident":"webkit_find_controller_search_finish","summary":"Finishes a find operation. Finishes a find operation started by webkit_find_controller_search(). It will basically unhighlight every text match ...","deprecated":null},{"type":"method","name":"search_next","type_name":"FindController","ident":"webkit_find_controller_search_next","summary":"Looks for the next occurrence of the search text. Calling this method before webkit_find_controller_search() or webkit_find_controller_count_matches() is a ...","deprecated":null},{"type":"method","name":"search_previous","type_name":"FindController","ident":"webkit_find_controller_search_previous","summary":"Looks for the previous occurrence of the search text. Calling this method before webkit_find_controller_search() or webkit_find_controller_count_matches() is a ...","deprecated":null},{"type":"method","name":"select_files","type_name":"FileChooserRequest","ident":"webkit_file_chooser_request_select_files","summary":"Ask WebKit to select local files for upload and complete the request.","deprecated":null},{"type":"method","name":"select_item","type_name":"OptionMenu","ident":"webkit_option_menu_select_item","summary":"Selects the #WebKitOptionMenuItem at @index in @menu. Selecting an item changes the text shown by the combo button, ...","deprecated":null},{"type":"method","name":"send_message_to_all_extensions","type_name":"WebContext","ident":"webkit_web_context_send_message_to_all_extensions","summary":"Send @message to all web process extensions associated to @context. If @message is floating, it's consumed.","deprecated":null},{"type":"method","name":"send_message_to_page","type_name":"WebView","ident":"webkit_web_view_send_message_to_page","summary":"Send @message to the #WebKitWebPage corresponding to @web_view. If @message is floating, it's consumed. If you don't expect ...","deprecated":null},{"type":"method","name":"send_message_to_page_finish","type_name":"WebView","ident":"webkit_web_view_send_message_to_page_finish","summary":"Finish an asynchronous operation started with webkit_web_view_send_message_to_page().","deprecated":null},{"type":"method","name":"send_reply","type_name":"UserMessage","ident":"webkit_user_message_send_reply","summary":"Send a reply to an user message. If @reply is floating, it's consumed. You can only send a ...","deprecated":null},{"type":"method","name":"serialize","type_name":"WebViewSessionState","ident":"webkit_web_view_session_state_serialize","summary":"Serializes a #WebKitWebViewSessionState."},{"type":"method","name":"set_accept_policy","type_name":"CookieManager","ident":"webkit_cookie_manager_set_accept_policy","summary":"Set the cookie acceptance policy of @cookie_manager as @policy. Note that ITP has its own way to handle ...","deprecated":null},{"type":"method","name":"set_allow_file_access_from_file_urls","type_name":"Settings","ident":"webkit_settings_set_allow_file_access_from_file_urls","summary":"Set the #WebKitSettings:allow-file-access-from-file-urls property.","deprecated":null},{"type":"method","name":"set_allow_modal_dialogs","type_name":"Settings","ident":"webkit_settings_set_allow_modal_dialogs","summary":"Set the #WebKitSettings:allow-modal-dialogs property.","deprecated":null},{"type":"method","name":"set_allow_overwrite","type_name":"Download","ident":"webkit_download_set_allow_overwrite","summary":"Sets the #WebKitDownload:allow-overwrite property. Sets the #WebKitDownload:allow-overwrite property, which determines whether the download may overwrite an existing file ...","deprecated":null},{"type":"method","name":"set_allow_top_navigation_to_data_urls","type_name":"Settings","ident":"webkit_settings_set_allow_top_navigation_to_data_urls","summary":"Set the #WebKitSettings:allow-top-navigation-to-data-urls property.","deprecated":null},{"type":"method","name":"set_allow_universal_access_from_file_urls","type_name":"Settings","ident":"webkit_settings_set_allow_universal_access_from_file_urls","summary":"Set the #WebKitSettings:allow-universal-access-from-file-urls property.","deprecated":null},{"type":"method","name":"set_altitude","type_name":"GeolocationPosition","ident":"webkit_geolocation_position_set_altitude","summary":"Set the @position altitude."},{"type":"method","name":"set_altitude_accuracy","type_name":"GeolocationPosition","ident":"webkit_geolocation_position_set_altitude_accuracy","summary":"Set the accuracy of @position altitude."},{"type":"method","name":"set_application_info","type_name":"AutomationSession","ident":"webkit_automation_session_set_application_info","summary":"Set the application information to @session. This information will be used by the driver service to match the ...","deprecated":null},{"type":"method","name":"set_auto_load_images","type_name":"Settings","ident":"webkit_settings_set_auto_load_images","summary":"Set the #WebKitSettings:auto-load-images property.","deprecated":null},{"type":"method","name":"set_automation_allowed","type_name":"WebContext","ident":"webkit_web_context_set_automation_allowed","summary":"Set whether automation is allowed in @context. When automation is enabled the browser could be controlled by another ...","deprecated":null},{"type":"method","name":"set_background_color","type_name":"WebView","ident":"webkit_web_view_set_background_color","summary":"Sets the color that will be used to draw the @web_view background. Sets the color that will be ...","deprecated":null},{"type":"method","name":"set_cache_model","type_name":"WebContext","ident":"webkit_web_context_set_cache_model","summary":"Specifies a usage model for WebViews. Specifies a usage model for WebViews, which WebKit will use to determine ...","deprecated":null},{"type":"method","name":"set_camera_capture_state","type_name":"WebView","ident":"webkit_web_view_set_camera_capture_state","summary":"Set the camera capture state of a #WebKitWebView. If #WebKitSettings:enable-mediastream is %FALSE, this method will have no visible ...","deprecated":null},{"type":"method","name":"set_can_save_credentials","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_set_can_save_credentials","summary":"Set whether the authentication method associated with @request should allow the storage of credentials. Set whether the authentication ...","deprecated":null},{"type":"method","name":"set_color","type_name":"InputMethodUnderline","ident":"webkit_input_method_underline_set_color","summary":"Set the color of the underline. If @rgba is %NULL the foreground text color will be used for ..."},{"type":"method","name":"set_conservative_threshold","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_set_conservative_threshold","summary":"Sets the memory limit for the conservative policy to start working. Sets @value as the fraction of the ..."},{"type":"method","name":"set_content_type","type_name":"URISchemeResponse","ident":"webkit_uri_scheme_response_set_content_type","summary":"Sets the content type for the @response","deprecated":null},{"type":"method","name":"set_cors_allowlist","type_name":"WebView","ident":"webkit_web_view_set_cors_allowlist","summary":"Sets the @allowlist for CORS. Sets the @allowlist for which [Cross-Origin Resource Sharing](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) checks are disabled in @web_view. ...","deprecated":null},{"type":"method","name":"set_cursive_font_family","type_name":"Settings","ident":"webkit_settings_set_cursive_font_family","summary":"Set the #WebKitSettings:cursive-font-family property.","deprecated":null},{"type":"method","name":"set_custom_charset","type_name":"WebView","ident":"webkit_web_view_set_custom_charset","summary":"Sets the current custom character encoding override of @web_view. The custom character encoding will override any text encoding ...","deprecated":null},{"type":"method","name":"set_default_charset","type_name":"Settings","ident":"webkit_settings_set_default_charset","summary":"Set the #WebKitSettings:default-charset property.","deprecated":null},{"type":"method","name":"set_default_font_family","type_name":"Settings","ident":"webkit_settings_set_default_font_family","summary":"Set the #WebKitSettings:default-font-family property.","deprecated":null},{"type":"method","name":"set_default_font_size","type_name":"Settings","ident":"webkit_settings_set_default_font_size","summary":"Set the #WebKitSettings:default-font-size property.","deprecated":null},{"type":"method","name":"set_default_monospace_font_size","type_name":"Settings","ident":"webkit_settings_set_default_monospace_font_size","summary":"Set the #WebKitSettings:default-monospace-font-size property.","deprecated":null},{"type":"method","name":"set_destination","type_name":"Download","ident":"webkit_download_set_destination","summary":"Sets the destination to which the downloaded file will be written. This method should be called before the ...","deprecated":null},{"type":"method","name":"set_disable_web_security","type_name":"Settings","ident":"webkit_settings_set_disable_web_security","summary":"Set the #WebKitSettings:disable-web-security property.","deprecated":null},{"type":"method","name":"set_display_capture_state","type_name":"WebView","ident":"webkit_web_view_set_display_capture_state","summary":"Set the display capture state of a #WebKitWebView. If #WebKitSettings:enable-mediastream is %FALSE, this method will have no visible ...","deprecated":null},{"type":"method","name":"set_draw_compositing_indicators","type_name":"Settings","ident":"webkit_settings_set_draw_compositing_indicators","summary":"Set the #WebKitSettings:draw-compositing-indicators property.","deprecated":null},{"type":"method","name":"set_editable","type_name":"WebView","ident":"webkit_web_view_set_editable","summary":"Sets whether the user is allowed to edit the HTML document. If @editable is %TRUE, @web_view allows the ...","deprecated":null},{"type":"method","name":"set_enable_2d_canvas_acceleration","type_name":"Settings","ident":"webkit_settings_set_enable_2d_canvas_acceleration","summary":"Set the #WebKitSettings:enable-2d-canvas-acceleration property.","deprecated":null},{"type":"method","name":"set_enable_back_forward_navigation_gestures","type_name":"Settings","ident":"webkit_settings_set_enable_back_forward_navigation_gestures","summary":"Set the #WebKitSettings:enable-back-forward-navigation-gestures property.","deprecated":null},{"type":"method","name":"set_enable_caret_browsing","type_name":"Settings","ident":"webkit_settings_set_enable_caret_browsing","summary":"Set the #WebKitSettings:enable-caret-browsing property.","deprecated":null},{"type":"method","name":"set_enable_developer_extras","type_name":"Settings","ident":"webkit_settings_set_enable_developer_extras","summary":"Set the #WebKitSettings:enable-developer-extras property.","deprecated":null},{"type":"method","name":"set_enable_dns_prefetching","type_name":"Settings","ident":"webkit_settings_set_enable_dns_prefetching","summary":"Set the #WebKitSettings:enable-dns-prefetching property.","deprecated":"2.48."},{"type":"method","name":"set_enable_encrypted_media","type_name":"Settings","ident":"webkit_settings_set_enable_encrypted_media","summary":"Set the #WebKitSettings:enable-encrypted-media property.","deprecated":null},{"type":"method","name":"set_enable_fullscreen","type_name":"Settings","ident":"webkit_settings_set_enable_fullscreen","summary":"Set the #WebKitSettings:enable-fullscreen property.","deprecated":null},{"type":"method","name":"set_enable_html5_database","type_name":"Settings","ident":"webkit_settings_set_enable_html5_database","summary":"Set the #WebKitSettings:enable-html5-database property.","deprecated":null},{"type":"method","name":"set_enable_html5_local_storage","type_name":"Settings","ident":"webkit_settings_set_enable_html5_local_storage","summary":"Set the #WebKitSettings:enable-html5-local-storage property.","deprecated":null},{"type":"method","name":"set_enable_hyperlink_auditing","type_name":"Settings","ident":"webkit_settings_set_enable_hyperlink_auditing","summary":"Set the #WebKitSettings:enable-hyperlink-auditing property.","deprecated":"2.50."},{"type":"method","name":"set_enable_javascript","type_name":"Settings","ident":"webkit_settings_set_enable_javascript","summary":"Set the #WebKitSettings:enable-javascript property.","deprecated":null},{"type":"method","name":"set_enable_javascript_markup","type_name":"Settings","ident":"webkit_settings_set_enable_javascript_markup","summary":"Set the #WebKitSettings:enable-javascript-markup property.","deprecated":null},{"type":"method","name":"set_enable_media","type_name":"Settings","ident":"webkit_settings_set_enable_media","summary":"Set the #WebKitSettings:enable-media property.","deprecated":null},{"type":"method","name":"set_enable_media_capabilities","type_name":"Settings","ident":"webkit_settings_set_enable_media_capabilities","summary":"Set the #WebKitSettings:enable-media-capabilities property.","deprecated":null},{"type":"method","name":"set_enable_media_stream","type_name":"Settings","ident":"webkit_settings_set_enable_media_stream","summary":"Set the #WebKitSettings:enable-media-stream property.","deprecated":null},{"type":"method","name":"set_enable_mediasource","type_name":"Settings","ident":"webkit_settings_set_enable_mediasource","summary":"Set the #WebKitSettings:enable-mediasource property.","deprecated":null},{"type":"method","name":"set_enable_mock_capture_devices","type_name":"Settings","ident":"webkit_settings_set_enable_mock_capture_devices","summary":"Set the #WebKitSettings:enable-mock-capture-devices property.","deprecated":null},{"type":"method","name":"set_enable_offline_web_application_cache","type_name":"Settings","ident":"webkit_settings_set_enable_offline_web_application_cache","summary":"Setting no longer supported. This function does nothing.","deprecated":"2.44"},{"type":"method","name":"set_enable_page_cache","type_name":"Settings","ident":"webkit_settings_set_enable_page_cache","summary":"Set the #WebKitSettings:enable-page-cache property.","deprecated":null},{"type":"method","name":"set_enable_preedit","type_name":"InputMethodContext","ident":"webkit_input_method_context_set_enable_preedit","summary":"Set whether @context should enable preedit to display feedback.","deprecated":null},{"type":"method","name":"set_enable_resizable_text_areas","type_name":"Settings","ident":"webkit_settings_set_enable_resizable_text_areas","summary":"Set the #WebKitSettings:enable-resizable-text-areas property.","deprecated":null},{"type":"method","name":"set_enable_site_specific_quirks","type_name":"Settings","ident":"webkit_settings_set_enable_site_specific_quirks","summary":"Set the #WebKitSettings:enable-site-specific-quirks property.","deprecated":null},{"type":"method","name":"set_enable_smooth_scrolling","type_name":"Settings","ident":"webkit_settings_set_enable_smooth_scrolling","summary":"Set the #WebKitSettings:enable-smooth-scrolling property.","deprecated":null},{"type":"method","name":"set_enable_spatial_navigation","type_name":"Settings","ident":"webkit_settings_set_enable_spatial_navigation","summary":"Set the #WebKitSettings:enable-spatial-navigation property.","deprecated":null},{"type":"method","name":"set_enable_tabs_to_links","type_name":"Settings","ident":"webkit_settings_set_enable_tabs_to_links","summary":"Set the #WebKitSettings:enable-tabs-to-links property.","deprecated":null},{"type":"method","name":"set_enable_webaudio","type_name":"Settings","ident":"webkit_settings_set_enable_webaudio","summary":"Set the #WebKitSettings:enable-webaudio property.","deprecated":null},{"type":"method","name":"set_enable_webgl","type_name":"Settings","ident":"webkit_settings_set_enable_webgl","summary":"Set the #WebKitSettings:enable-webgl property.","deprecated":null},{"type":"method","name":"set_enable_webrtc","type_name":"Settings","ident":"webkit_settings_set_enable_webrtc","summary":"Set the [property@Settings:enable-webrtc] property. Setting this property to %TRUE implies the media-stream web-setting will also be enabled.","deprecated":null},{"type":"method","name":"set_enable_write_console_messages_to_stdout","type_name":"Settings","ident":"webkit_settings_set_enable_write_console_messages_to_stdout","summary":"Set the #WebKitSettings:enable-write-console-messages-to-stdout property.","deprecated":null},{"type":"method","name":"set_fantasy_font_family","type_name":"Settings","ident":"webkit_settings_set_fantasy_font_family","summary":"Set the #WebKitSettings:fantasy-font-family property.","deprecated":null},{"type":"method","name":"set_favicons_enabled","type_name":"WebsiteDataManager","ident":"webkit_website_data_manager_set_favicons_enabled","summary":"Set whether website icons are enabled. Website icons are disabled by default. When website icons are disabled, the #WebKitFaviconDatabase ...","deprecated":null},{"type":"method","name":"set_feature_enabled","type_name":"Settings","ident":"webkit_settings_set_feature_enabled","summary":"Enables or disables a feature. The current status of the feature can be determined with [id@webkit_settings_get_feature_enabled]. To reset ...","deprecated":null},{"type":"method","name":"set_granted_optional_features","type_name":"XRPermissionRequest","ident":"webkit_xr_permission_request_set_granted_optional_features","summary":"Sets which optional features should be granted if the permission request is allowed. This function should be called ...","deprecated":null},{"type":"method","name":"set_hardware_acceleration_policy","type_name":"Settings","ident":"webkit_settings_set_hardware_acceleration_policy","summary":"Set the #WebKitSettings:hardware-acceleration-policy property.","deprecated":null},{"type":"method","name":"set_heading","type_name":"GeolocationPosition","ident":"webkit_geolocation_position_set_heading","summary":"Set the @position heading. Set the @position heading, as a positive angle between the direction of movement and ..."},{"type":"method","name":"set_http_headers","type_name":"URISchemeResponse","ident":"webkit_uri_scheme_response_set_http_headers","summary":"Assign the provided #SoupMessageHeaders to the response. @headers need to be of the type %SOUP_MESSAGE_HEADERS_RESPONSE. Any existing headers ...","deprecated":null},{"type":"method","name":"set_input_hints","type_name":"InputMethodContext","ident":"webkit_input_method_context_set_input_hints","summary":"Set the value of the #WebKitInputMethodContext:input-hints property.","deprecated":null},{"type":"method","name":"set_input_method_context","type_name":"WebView","ident":"webkit_web_view_set_input_method_context","summary":"Set the #WebKitInputMethodContext to be used by @web_view. Set the #WebKitInputMethodContext to be used by @web_view, or %NULL ...","deprecated":null},{"type":"method","name":"set_input_purpose","type_name":"InputMethodContext","ident":"webkit_input_method_context_set_input_purpose","summary":"Set the value of the #WebKitInputMethodContext:input-purpose property.","deprecated":null},{"type":"method","name":"set_is_muted","type_name":"WebView","ident":"webkit_web_view_set_is_muted","summary":"Sets the mute state of @web_view.","deprecated":null},{"type":"method","name":"set_itp_enabled","type_name":"NetworkSession","ident":"webkit_network_session_set_itp_enabled","summary":"Enable or disable Intelligent Tracking Prevention (ITP). When ITP is enabled resource load statistics are collected and used ...","deprecated":null},{"type":"method","name":"set_javascript_can_access_clipboard","type_name":"Settings","ident":"webkit_settings_set_javascript_can_access_clipboard","summary":"Set the #WebKitSettings:javascript-can-access-clipboard property.","deprecated":null},{"type":"method","name":"set_javascript_can_open_windows_automatically","type_name":"Settings","ident":"webkit_settings_set_javascript_can_open_windows_automatically","summary":"Set the #WebKitSettings:javascript-can-open-windows-automatically property.","deprecated":null},{"type":"method","name":"set_kill_threshold","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_set_kill_threshold","summary":"Sets @value as the fraction of the defined memory limit where the process will be killed. The threshold ..."},{"type":"method","name":"set_load_icons_ignoring_image_load_setting","type_name":"Settings","ident":"webkit_settings_set_load_icons_ignoring_image_load_setting","summary":"Setting no longer supported. This function does nothing.","deprecated":"2.42"},{"type":"method","name":"set_math_font_family","type_name":"Settings","ident":"webkit_settings_set_math_font_family","summary":"Set the #WebKitSettings:math-font-family property. Since 2.52","deprecated":null},{"type":"method","name":"set_media_content_types_requiring_hardware_support","type_name":"Settings","ident":"webkit_settings_set_media_content_types_requiring_hardware_support","summary":"Set the #WebKitSettings:media-content-types-requiring-hardware-support property.","deprecated":null},{"type":"method","name":"set_media_playback_allows_inline","type_name":"Settings","ident":"webkit_settings_set_media_playback_allows_inline","summary":"Set the #WebKitSettings:media-playback-allows-inline property.","deprecated":null},{"type":"method","name":"set_media_playback_requires_user_gesture","type_name":"Settings","ident":"webkit_settings_set_media_playback_requires_user_gesture","summary":"Set the #WebKitSettings:media-playback-requires-user-gesture property.","deprecated":null},{"type":"method","name":"set_memory_limit","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_set_memory_limit","summary":"Sets @memory_limit the memory limit value to @settings. The default value is the system's RAM size with a ..."},{"type":"method","name":"set_microphone_capture_state","type_name":"WebView","ident":"webkit_web_view_set_microphone_capture_state","summary":"Set the microphone capture state of a #WebKitWebView. If #WebKitSettings:enable-mediastream is %FALSE, this method will have no visible ...","deprecated":null},{"type":"method","name":"set_minimum_font_size","type_name":"Settings","ident":"webkit_settings_set_minimum_font_size","summary":"Set the #WebKitSettings:minimum-font-size property.","deprecated":null},{"type":"method","name":"set_monospace_font_family","type_name":"Settings","ident":"webkit_settings_set_monospace_font_family","summary":"Set the #WebKitSettings:monospace-font-family property.","deprecated":null},{"type":"method","name":"set_name","type_name":"ApplicationInfo","ident":"webkit_application_info_set_name","summary":"Set the name of the application. If not provided, or %NULL is passed, g_get_prgname() will be used."},{"type":"method","name":"set_page_setup","type_name":"PrintOperation","ident":"webkit_print_operation_set_page_setup","summary":"Set the current page setup of @print_operation. Current page setup is used for the initial values of the ...","deprecated":null},{"type":"method","name":"set_persistent_credential_storage_enabled","type_name":"NetworkSession","ident":"webkit_network_session_set_persistent_credential_storage_enabled","summary":"Enable or disable persistent credential storage. When enabled, which is the default for non-ephemeral sessions, the network process ...","deprecated":null},{"type":"method","name":"set_persistent_storage","type_name":"CookieManager","ident":"webkit_cookie_manager_set_persistent_storage","summary":"Set non-session cookies. Set the @filename where non-session cookies are stored persistently using @storage as the format to ...","deprecated":null},{"type":"method","name":"set_pictograph_font_family","type_name":"Settings","ident":"webkit_settings_set_pictograph_font_family","summary":"Set the #WebKitSettings:pictograph-font-family property.","deprecated":null},{"type":"method","name":"set_poll_interval","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_set_poll_interval","summary":"Sets @value as the poll interval used by @settings. The poll interval value must be bigger than 0. ..."},{"type":"method","name":"set_preferred_languages","type_name":"WebContext","ident":"webkit_web_context_set_preferred_languages","summary":"Set the list of preferred languages. Set the list of preferred languages, sorted from most desirable to least ...","deprecated":null},{"type":"method","name":"set_print_backgrounds","type_name":"Settings","ident":"webkit_settings_set_print_backgrounds","summary":"Set the #WebKitSettings:print-backgrounds property.","deprecated":null},{"type":"method","name":"set_print_settings","type_name":"PrintOperation","ident":"webkit_print_operation_set_print_settings","summary":"Set the current print settings of @print_operation. Set the current print settings of @print_operation. Current print settings are ...","deprecated":null},{"type":"method","name":"set_proposed_credential","type_name":"AuthenticationRequest","ident":"webkit_authentication_request_set_proposed_credential","summary":"Set the #WebKitCredential of the proposed authentication challenge. Set the #WebKitCredential of the proposed authentication challenge that was ...","deprecated":null},{"type":"method","name":"set_proxy_settings","type_name":"NetworkSession","ident":"webkit_network_session_set_proxy_settings","summary":"Set the network proxy settings to be used by connections started in @session session. By default %WEBKIT_NETWORK_PROXY_MODE_DEFAULT is ...","deprecated":null},{"type":"method","name":"set_rgba","type_name":"ColorChooserRequest","ident":"webkit_color_chooser_request_set_rgba","summary":"Sets the current #GdkRGBA color of @request","deprecated":null},{"type":"method","name":"set_sans_serif_font_family","type_name":"Settings","ident":"webkit_settings_set_sans_serif_font_family","summary":"Set the #WebKitSettings:sans-serif-font-family property.","deprecated":null},{"type":"method","name":"set_serif_font_family","type_name":"Settings","ident":"webkit_settings_set_serif_font_family","summary":"Set the #WebKitSettings:serif-font-family property.","deprecated":null},{"type":"method","name":"set_settings","type_name":"WebView","ident":"webkit_web_view_set_settings","summary":"Sets the #WebKitSettings to be applied to @web_view. The existing #WebKitSettings of @web_view will be replaced by @settings. ...","deprecated":null},{"type":"method","name":"set_speed","type_name":"GeolocationPosition","ident":"webkit_geolocation_position_set_speed","summary":"Set the @position speed."},{"type":"method","name":"set_spell_checking_enabled","type_name":"WebContext","ident":"webkit_web_context_set_spell_checking_enabled","summary":"Enable or disable the spell checking feature.","deprecated":null},{"type":"method","name":"set_spell_checking_languages","type_name":"WebContext","ident":"webkit_web_context_set_spell_checking_languages","summary":"Set the list of spell checking languages to be used for spell checking. The locale string typically is ...","deprecated":null},{"type":"method","name":"set_status","type_name":"URISchemeResponse","ident":"webkit_uri_scheme_response_set_status","summary":"Sets the status code and reason phrase for the @response. If @status_code is a known value and @reason_phrase ...","deprecated":null},{"type":"method","name":"set_strict_threshold","type_name":"MemoryPressureSettings","ident":"webkit_memory_pressure_settings_set_strict_threshold","summary":"Sets the memory limit for the strict policy to start working. Sets @value as the fraction of the ..."},{"type":"method","name":"set_submenu","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_set_submenu","summary":"Sets or replaces the @item submenu. If @submenu is %NULL the current submenu of @item is removed.","deprecated":null},{"type":"method","name":"set_timestamp","type_name":"GeolocationPosition","ident":"webkit_geolocation_position_set_timestamp","summary":"Set the @position timestamp. By default it's the time when the @position was created."},{"type":"method","name":"set_tls_errors_policy","type_name":"NetworkSession","ident":"webkit_network_session_set_tls_errors_policy","summary":"Set the TLS errors policy of @session as @policy.","deprecated":null},{"type":"method","name":"set_uri","type_name":"URIRequest","ident":"webkit_uri_request_set_uri","summary":"Set the URI of @request","deprecated":null},{"type":"method","name":"set_user_agent","type_name":"Settings","ident":"webkit_settings_set_user_agent","summary":"Set the #WebKitSettings:user-agent property.","deprecated":null},{"type":"method","name":"set_user_agent_with_application_details","type_name":"Settings","ident":"webkit_settings_set_user_agent_with_application_details","summary":"Set the #WebKitSettings:user-agent property by appending the application details. Set the #WebKitSettings:user-agent property by appending the application details ...","deprecated":null},{"type":"method","name":"set_user_data","type_name":"ContextMenu","ident":"webkit_context_menu_set_user_data","summary":"Sets user data to @menu. This function can be used from a Web Process extension to set user ...","deprecated":null},{"type":"method","name":"set_version","type_name":"ApplicationInfo","ident":"webkit_application_info_set_version","summary":"Set the application version. If the application doesn't use the format major.minor.micro you can pass 0 as the ..."},{"type":"method","name":"set_web_process_extensions_directory","type_name":"WebContext","ident":"webkit_web_context_set_web_process_extensions_directory","summary":"Set the directory where WebKit will look for web process extensions. This method must be called before loading ...","deprecated":null},{"type":"method","name":"set_web_process_extensions_initialization_user_data","type_name":"WebContext","ident":"webkit_web_context_set_web_process_extensions_initialization_user_data","summary":"Set user data to be passed to Web Extensions on initialization. The data will be passed to the ...","deprecated":null},{"type":"method","name":"set_webrtc_udp_ports_range","type_name":"Settings","ident":"webkit_settings_set_webrtc_udp_ports_range","summary":"Set the [property@Settings:webrtc-udp-ports-range] property.","deprecated":null},{"type":"method","name":"set_zoom_level","type_name":"WebView","ident":"webkit_web_view_set_zoom_level","summary":"Set the zoom level of @web_view. Set the zoom level of @web_view, i.e. the factor by which the ...","deprecated":null},{"type":"method","name":"set_zoom_text_only","type_name":"Settings","ident":"webkit_settings_set_zoom_text_only","summary":"Set the #WebKitSettings:zoom-text-only property.","deprecated":null},{"type":"method","name":"show","type_name":"WebInspector","ident":"webkit_web_inspector_show","summary":"Request @inspector to be shown.","deprecated":null},{"type":"method","name":"stop_loading","type_name":"WebView","ident":"webkit_web_view_stop_loading","summary":"Stops any ongoing loading operation in @web_view. This method does nothing if no content is being loaded. If ...","deprecated":null},{"type":"method","name":"submit","type_name":"FormSubmissionRequest","ident":"webkit_form_submission_request_submit","summary":"Continue the form submission.","deprecated":null},{"type":"method","name":"supports_manifest_version","type_name":"WebExtension","ident":"webkit_web_extension_supports_manifest_version","summary":"Checks if a manifest version is supported by the extension.","deprecated":null},{"type":"method","name":"terminate_web_process","type_name":"WebView","ident":"webkit_web_view_terminate_web_process","summary":"Terminates the web process associated to @web_view. When the web process gets terminated using this method, the #WebKitWebView::web-process-terminated ...","deprecated":null},{"type":"method","name":"to_string","type_name":"SecurityOrigin","ident":"webkit_security_origin_to_string","summary":"Gets a string representation of @origin. The string representation is a valid URI with only protocol, host, and ..."},{"type":"method","name":"try_close","type_name":"WebView","ident":"webkit_web_view_try_close","summary":"Tries to close the @web_view. This will fire the onbeforeunload event to ask the user for confirmation to ...","deprecated":null},{"type":"method","name":"unref","type_name":"ApplicationInfo","ident":"webkit_application_info_unref","summary":"Atomically decrements the reference count of @info by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unref","type_name":"Feature","ident":"webkit_feature_unref","summary":"Atomically releases a reference on the given @feature. If the reference was the last, the resources associated to ..."},{"type":"method","name":"unref","type_name":"FeatureList","ident":"webkit_feature_list_unref","summary":"Atomically releases a reference on the given @feature_list. If the reference was the last, the resources associated to ..."},{"type":"method","name":"unref","type_name":"ITPFirstParty","ident":"webkit_itp_first_party_unref","summary":"Atomically decrements the reference count of @itp_first_party by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unref","type_name":"ITPThirdParty","ident":"webkit_itp_third_party_unref","summary":"Atomically decrements the reference count of @itp_third_party by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unref","type_name":"PermissionStateQuery","ident":"webkit_permission_state_query_unref","summary":"Atomically decrements the reference count of @query by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unref","type_name":"ScriptDialog","ident":"webkit_script_dialog_unref","summary":"Atomically decrements the reference count of @dialog by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unref","type_name":"ScriptMessageReply","ident":"webkit_script_message_reply_unref","summary":"Atomically decrements the reference count of @script_message_reply by one. If the reference count drops to 0, all the ..."},{"type":"method","name":"unref","type_name":"SecurityOrigin","ident":"webkit_security_origin_unref","summary":"Atomically decrements the reference count of @origin by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unref","type_name":"UserContentFilter","ident":"webkit_user_content_filter_unref","summary":"Atomically decrements the reference count of @user_content_filter by one. If the reference count drops to 0, all the ..."},{"type":"method","name":"unref","type_name":"UserScript","ident":"webkit_user_script_unref","summary":"Atomically decrements the reference count of @user_script by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unref","type_name":"UserStyleSheet","ident":"webkit_user_style_sheet_unref","summary":"Atomically decrements the reference count of @user_style_sheet by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unref","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_unref","summary":"Atomically releases a reference on the given @matchPattern. If the reference was the last, the resources associated to ..."},{"type":"method","name":"unref","type_name":"WebsiteData","ident":"webkit_website_data_unref","summary":"Atomically decrements the reference count of @website_data by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unref","type_name":"WebViewSessionState","ident":"webkit_web_view_session_state_unref","summary":"Atomically decrements the reference count of @state by one. If the reference count drops to 0, all memory ..."},{"type":"method","name":"unregister_script_message_handler","type_name":"UserContentManager","ident":"webkit_user_content_manager_unregister_script_message_handler","summary":"Unregisters a previously registered message handler in script world with name @world_name. If %NULL is passed as the @world_name, ...","deprecated":null},{"type":"method","name":"update_position","type_name":"GeolocationManager","ident":"webkit_geolocation_manager_update_position","summary":"Notify @manager that position has been updated to @position.","deprecated":null},{"type":"method","name":"uri_scheme_is_cors_enabled","type_name":"SecurityManager","ident":"webkit_security_manager_uri_scheme_is_cors_enabled","summary":"Whether @scheme is considered as a CORS enabled scheme. See also webkit_security_manager_register_uri_scheme_as_cors_enabled().","deprecated":null},{"type":"method","name":"uri_scheme_is_display_isolated","type_name":"SecurityManager","ident":"webkit_security_manager_uri_scheme_is_display_isolated","summary":"Whether @scheme is considered as a display isolated scheme. See also webkit_security_manager_register_uri_scheme_as_display_isolated().","deprecated":null},{"type":"method","name":"uri_scheme_is_empty_document","type_name":"SecurityManager","ident":"webkit_security_manager_uri_scheme_is_empty_document","summary":"Whether @scheme is considered as an empty document scheme. See also webkit_security_manager_register_uri_scheme_as_empty_document().","deprecated":null},{"type":"method","name":"uri_scheme_is_local","type_name":"SecurityManager","ident":"webkit_security_manager_uri_scheme_is_local","summary":"Whether @scheme is considered as a local scheme. See also webkit_security_manager_register_uri_scheme_as_local().","deprecated":null},{"type":"method","name":"uri_scheme_is_no_access","type_name":"SecurityManager","ident":"webkit_security_manager_uri_scheme_is_no_access","summary":"Whether @scheme is considered as a no-access scheme. See also webkit_security_manager_register_uri_scheme_as_no_access().","deprecated":null},{"type":"method","name":"uri_scheme_is_secure","type_name":"SecurityManager","ident":"webkit_security_manager_uri_scheme_is_secure","summary":"Whether @scheme is considered as a secure scheme. See also webkit_security_manager_register_uri_scheme_as_secure().","deprecated":null},{"type":"method","name":"use","type_name":"PolicyDecision","ident":"webkit_policy_decision_use","summary":"Accept the action which triggered this decision.","deprecated":null},{"type":"method","name":"use_with_policies","type_name":"PolicyDecision","ident":"webkit_policy_decision_use_with_policies","summary":"Accept the navigation action and continue with provided @policies. Accept the navigation action which triggered this decision, and ...","deprecated":null},{"type":"property","name":"allow-file-access-from-file-urls","type_name":"Settings","summary":"Whether file access is allowed from file URLs. By default, when something is loaded in a #WebKitWebView using a ...","deprecated":null},{"type":"property","name":"allow-modal-dialogs","type_name":"Settings","summary":"Determine whether it's allowed to create and run modal dialogs from a #WebKitWebView through JavaScript with window.showModalDialog. If it's ...","deprecated":null},{"type":"property","name":"allow-overwrite","type_name":"Download","summary":"Whether or not the download is allowed to overwrite an existing file on disk. If this property is %FALSE ...","deprecated":null},{"type":"property","name":"allow-top-navigation-to-data-urls","type_name":"Settings","summary":"Whether or not the top frame is allowed to navigate to data URLs. It is disabled by default due ...","deprecated":null},{"type":"property","name":"allow-universal-access-from-file-urls","type_name":"Settings","summary":"Whether or not JavaScript running in the context of a file scheme URL should be allowed to access content ...","deprecated":null},{"type":"property","name":"attached-height","type_name":"WebInspector","summary":"The height that the inspector view should have when it is attached.","deprecated":null},{"type":"property","name":"auto-load-images","type_name":"Settings","summary":"Determines whether images should be automatically loaded or not. On devices where network bandwidth is of concern, it might ...","deprecated":null},{"type":"property","name":"automation-presentation-type","type_name":"WebView","summary":"The #WebKitAutomationBrowsingContextPresentation of #WebKitWebView. This should only be used when creating a new #WebKitWebView as a response to #WebKitAutomationSession::create-web-view ...","deprecated":null},{"type":"property","name":"autoplay","type_name":"WebsitePolicies","summary":"The #WebKitAutoplayPolicy of #WebKitWebsitePolicies.","deprecated":null},{"type":"property","name":"base-cache-directory","type_name":"WebsiteDataManager","summary":"The base directory for caches. If %NULL, a default location will be used.","deprecated":null},{"type":"property","name":"base-data-directory","type_name":"WebsiteDataManager","summary":"The base directory for website data. If %NULL, a default location will be used.","deprecated":null},{"type":"property","name":"body","type_name":"Notification","summary":"The body for the notification.","deprecated":null},{"type":"property","name":"cache-directory","type_name":"NetworkSession","summary":"The base caches directory used to create the #WebKitWebsiteDataManager. If %NULL, a default location will be used.","deprecated":null},{"type":"property","name":"camera-capture-state","type_name":"WebView","summary":"Capture state of the camera device. Whenever the user grants a media-request sent by the web page, requesting video ...","deprecated":null},{"type":"property","name":"can-attach","type_name":"WebInspector","summary":"Whether the @inspector can be attached to the same window that contains the inspected view.","deprecated":null},{"type":"property","name":"content-length","type_name":"URIResponse","summary":"The expected content length of the response.","deprecated":null},{"type":"property","name":"context","type_name":"HitTestResult","summary":"Bitmask of #WebKitHitTestResultContext flags representing the context of the #WebKitHitTestResult.","deprecated":null},{"type":"property","name":"cursive-font-family","type_name":"Settings","summary":"The font family used as the default for content using a cursive font.","deprecated":null},{"type":"property","name":"data-directory","type_name":"NetworkSession","summary":"The base data directory used to create the #WebKitWebsiteDataManager. If %NULL, a default location will be used.","deprecated":null},{"type":"property","name":"default-charset","type_name":"Settings","summary":"The default text charset used when interpreting content with an unspecified charset.","deprecated":null},{"type":"property","name":"default-content-security-policy","type_name":"WebView","summary":"The default Content-Security-Policy used by the webview as if it were set by an HTTP header. This applies ...","deprecated":null},{"type":"property","name":"default-font-family","type_name":"Settings","summary":"The font family to use as the default for content that does not specify a font.","deprecated":null},{"type":"property","name":"default-font-size","type_name":"Settings","summary":"The default font size in pixels to use for content displayed if no font size is specified.","deprecated":null},{"type":"property","name":"default-locale","type_name":"WebExtension","summary":"The default locale for the #WebKitWebExtension. See webkit_web_extension_get_default_locale() for more details.","deprecated":null},{"type":"property","name":"default-monospace-font-size","type_name":"Settings","summary":"The default font size in pixels to use for content displayed in monospace font if no font size is specified.","deprecated":null},{"type":"property","name":"destination","type_name":"Download","summary":"The local path to where the download will be saved.","deprecated":null},{"type":"property","name":"disable-web-security","type_name":"Settings","summary":"Enable or disable support for Web Security on pages. This setting disables the same-origin policy, allowing every website ...","deprecated":null},{"type":"property","name":"display-action-label","type_name":"WebExtension","summary":"The localized extension action label of the #WebKitWebExtension. See webkit_web_extension_get_display_action_label() for more details.","deprecated":null},{"type":"property","name":"display-capture-state","type_name":"WebView","summary":"Capture state of the display device. Whenever the user grants a media-request sent by the web page, requesting screencasting ...","deprecated":null},{"type":"property","name":"display-description","type_name":"WebExtension","summary":"The localized description of the #WebKitWebExtension. See webkit_web_extension_get_display_description() for more details.","deprecated":null},{"type":"property","name":"display-name","type_name":"WebExtension","summary":"The localized name of the #WebKitWebExtension. See webkit_web_extension_get_display_name() for more details.","deprecated":null},{"type":"property","name":"display-short-name","type_name":"WebExtension","summary":"The localized short name of the #WebKitWebExtension. See webkit_web_extension_get_display_short_name() for more details.","deprecated":null},{"type":"property","name":"display-version","type_name":"WebExtension","summary":"The localized display version of the #WebKitWebExtension. See webkit_web_extension_get_display_version() for more details.","deprecated":null},{"type":"property","name":"draw-compositing-indicators","type_name":"Settings","summary":"Whether to draw compositing borders and repaint counters on layers drawn with accelerated compositing. This is useful for debugging ...","deprecated":null},{"type":"property","name":"editable","type_name":"WebView","summary":"Whether the pages loaded inside #WebKitWebView are editable. For more information see webkit_web_view_set_editable().","deprecated":null},{"type":"property","name":"enable-2d-canvas-acceleration","type_name":"Settings","summary":"Enable or disable 2D canvas acceleration. If this setting is enabled, the 2D canvas will be accelerated even if ...","deprecated":null},{"type":"property","name":"enable-back-forward-navigation-gestures","type_name":"Settings","summary":"Enable or disable horizontal swipe gesture for back-forward navigation.","deprecated":null},{"type":"property","name":"enable-caret-browsing","type_name":"Settings","summary":"Whether to enable accessibility enhanced keyboard navigation.","deprecated":null},{"type":"property","name":"enable-developer-extras","type_name":"Settings","summary":"Determines whether or not developer tools, such as the Web Inspector, are enabled.","deprecated":null},{"type":"property","name":"enable-dns-prefetching","type_name":"Settings","summary":"Determines whether or not to prefetch domain names. DNS prefetching attempts to resolve domain names before a user tries ...","deprecated":"2.48"},{"type":"property","name":"enable-encrypted-media","type_name":"Settings","summary":"Enable or disable support for Encrypted Media API on pages. EncryptedMedia is an experimental JavaScript API for playing encrypted ...","deprecated":null},{"type":"property","name":"enable-fullscreen","type_name":"Settings","summary":"Whether to enable the Javascript Fullscreen API. The API allows any HTML element to request fullscreen display. See also ...","deprecated":null},{"type":"property","name":"enable-high-accuracy","type_name":"GeolocationManager","summary":"Whether high accuracy is enabled. This is a read-only property that will be set to %TRUE when a #WebKitGeolocationManager ...","deprecated":null},{"type":"property","name":"enable-html5-database","type_name":"Settings","summary":"Whether to enable HTML5 client-side SQL database support (IndexedDB).","deprecated":null},{"type":"property","name":"enable-html5-local-storage","type_name":"Settings","summary":"Whether to enable HTML5 local storage support. Local storage provides simple synchronous storage access. HTML5 local storage specification ...","deprecated":null},{"type":"property","name":"enable-hyperlink-auditing","type_name":"Settings","summary":"Determines whether or not hyperlink auditing is enabled. The hyperlink auditing specification is available at http://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#hyperlink-auditing.","deprecated":"2.50"},{"type":"property","name":"enable-javascript","type_name":"Settings","summary":"Determines whether or not JavaScript executes within a page.","deprecated":null},{"type":"property","name":"enable-javascript-markup","type_name":"Settings","summary":"Determines whether or not JavaScript markup is allowed in document. When this setting is disabled, all JavaScript-related elements and ...","deprecated":null},{"type":"property","name":"enable-media","type_name":"Settings","summary":"Enable or disable support for media playback on pages. This setting is enabled by default. Disabling it means ``, ...","deprecated":null},{"type":"property","name":"enable-media-capabilities","type_name":"Settings","summary":"Enable or disable support for MediaCapabilities on pages. This specification intends to provide APIs to allow websites to make ...","deprecated":null},{"type":"property","name":"enable-media-stream","type_name":"Settings","summary":"Enable or disable support for MediaStream on pages. MediaStream is an experimental proposal for allowing web pages to access ...","deprecated":null},{"type":"property","name":"enable-mediasource","type_name":"Settings","summary":"Enable or disable support for MediaSource on pages. MediaSource extends HTMLMediaElement to allow JavaScript to generate media streams for ...","deprecated":null},{"type":"property","name":"enable-mock-capture-devices","type_name":"Settings","summary":"Enable or disable the Mock Capture Devices. Those are fake Microphone and Camera devices to be used as MediaStream sources.","deprecated":null},{"type":"property","name":"enable-offline-web-application-cache","type_name":"Settings","summary":"Unsupported setting. This property does nothing.","deprecated":"2.44"},{"type":"property","name":"enable-page-cache","type_name":"Settings","summary":"Enable or disable the page cache. Disabling the page cache is generally only useful for special circumstances like low-memory ...","deprecated":null},{"type":"property","name":"enable-resizable-text-areas","type_name":"Settings","summary":"Determines whether or not text areas can be resized.","deprecated":null},{"type":"property","name":"enable-site-specific-quirks","type_name":"Settings","summary":"Whether to turn on site-specific quirks. Turning this on will tell WebKit to use some site-specific workarounds for better ...","deprecated":null},{"type":"property","name":"enable-smooth-scrolling","type_name":"Settings","summary":"Enable or disable smooth scrolling.","deprecated":null},{"type":"property","name":"enable-spatial-navigation","type_name":"Settings","summary":"Whether to enable Spatial Navigation. This feature consists in the ability to navigate between focusable elements in a Web ...","deprecated":null},{"type":"property","name":"enable-tabs-to-links","type_name":"Settings","summary":"Determines whether the tab key cycles through the elements on the page. When this setting is enabled, users will ...","deprecated":null},{"type":"property","name":"enable-webaudio","type_name":"Settings","summary":"Enable or disable support for WebAudio on pages. WebAudio is an API for processing and synthesizing audio in web ...","deprecated":null},{"type":"property","name":"enable-webgl","type_name":"Settings","summary":"Enable or disable support for WebGL on pages. WebGL enables web content to use an API based on OpenGL ...","deprecated":null},{"type":"property","name":"enable-webrtc","type_name":"Settings","summary":"Enable WebRTC support for loaded pages. Enabling this setting implies that [property@Settings:enable-media-stream] will be enabled as well. ...","deprecated":null},{"type":"property","name":"enable-write-console-messages-to-stdout","type_name":"Settings","summary":"Enable or disable writing console messages to stdout. These are messages sent to the console with console.log and related methods.","deprecated":null},{"type":"property","name":"estimated-load-progress","type_name":"WebView","summary":"An estimate of the percent completion for the current loading operation. This value will range from 0.0 to 1.0 ...","deprecated":null},{"type":"property","name":"estimated-progress","type_name":"Download","summary":"An estimate of the percent completion for the download operation. This value will range from 0.0 to 1.0. The ...","deprecated":null},{"type":"property","name":"fantasy-font-family","type_name":"Settings","summary":"The font family used as the default for content using a fantasy font.","deprecated":null},{"type":"property","name":"favicon","type_name":"WebView","summary":"The favicon currently associated to the #WebKitWebView. See webkit_web_view_get_favicon() for more details.","deprecated":null},{"type":"property","name":"fd-list","type_name":"UserMessage","summary":"The UNIX file descriptors of the user message.","deprecated":null},{"type":"property","name":"filter","type_name":"FileChooserRequest","summary":"The filter currently associated with the request. See webkit_file_chooser_request_get_mime_types_filter() for more details.","deprecated":null},{"type":"property","name":"fullscreen","type_name":"WindowProperties","summary":"Whether window will be displayed fullscreen.","deprecated":null},{"type":"property","name":"geometry","type_name":"WindowProperties","summary":"The size and position of the window on the screen.","deprecated":null},{"type":"property","name":"hardware-acceleration-policy","type_name":"Settings","summary":"The #WebKitHardwareAccelerationPolicy to decide how to enable and disable hardware acceleration. Disabling hardware acceleration might cause some websites to ...","deprecated":null},{"type":"property","name":"has-background-content","type_name":"WebExtension","summary":"Whether the #WebKitWebExtension has background content that can run when needed. See webkit_web_extension_get_has_background_content() for more details.","deprecated":null},{"type":"property","name":"has-commands","type_name":"WebExtension","summary":"Whether the #WebKitWebExtension includes commands that users can invoke. See webkit_web_extension_get_has_commands() for more details.","deprecated":null},{"type":"property","name":"has-content-modification-rules","type_name":"WebExtension","summary":"Whether the #WebKitWebExtension includes rules used for content modification or blocking. See webkit_web_extension_get_content_modification_rules() for more details.","deprecated":null},{"type":"property","name":"has-injected-content","type_name":"WebExtension","summary":"Whether the #WebKitWebExtension has script or stylesheet content that can be injected into webpages. See webkit_web_extension_get_has_injected_content() for more details.","deprecated":null},{"type":"property","name":"has-options-page","type_name":"WebExtension","summary":"Whether the #WebKitWebExtension has an options page. See webkit_web_extension_get_has_options_page() for more details.","deprecated":null},{"type":"property","name":"has-override-new-tab-page","type_name":"WebExtension","summary":"Whether the #WebKitWebExtension provides an alternative to the default new tab page. See webkit_web_extension_get_has_override_new_tab_page() for more details.","deprecated":null},{"type":"property","name":"has-persistent-background-content","type_name":"WebExtension","summary":"Whether the #WebKitWebExtension has background content that stays in memory as long as the extension is loaded. See webkit_web_extension_get_has_persistent_background_content() ...","deprecated":null},{"type":"property","name":"http-headers","type_name":"URIResponse","summary":"The HTTP headers of the response, or %NULL if the response is not an HTTP response.","deprecated":null},{"type":"property","name":"id","type_name":"AutomationSession","summary":"The session unique identifier.","deprecated":null},{"type":"property","name":"id","type_name":"Notification","summary":"The unique id for the notification.","deprecated":null},{"type":"property","name":"image-uri","type_name":"HitTestResult","summary":"The URI of the image if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"input-hints","type_name":"InputMethodContext","summary":"The #WebKitInputHints of the input associated with this context.","deprecated":null},{"type":"property","name":"input-purpose","type_name":"InputMethodContext","summary":"The #WebKitInputPurpose of the input associated with this context.","deprecated":null},{"type":"property","name":"inspected-uri","type_name":"WebInspector","summary":"The URI that is currently being inspected.","deprecated":null},{"type":"property","name":"is-controlled-by-automation","type_name":"WebView","summary":"Whether the #WebKitWebView is controlled by automation tools (e.g. WebDriver, Selenium). This is required for views returned as a ...","deprecated":null},{"type":"property","name":"is-ephemeral","type_name":"NetworkSession","summary":"Whether to create an ephermeral #WebKitWebsiteDataManager for the session.","deprecated":null},{"type":"property","name":"is-ephemeral","type_name":"WebsiteDataManager","summary":"Whether the #WebKitWebsiteDataManager is ephemeral. An ephemeral #WebKitWebsiteDataManager handles all websites data as non-persistent, and nothing will be written ...","deprecated":null},{"type":"property","name":"is-for-audio-device","type_name":"UserMediaPermissionRequest","summary":"Whether the media device to which the permission was requested has a microphone or not.","deprecated":null},{"type":"property","name":"is-for-video-device","type_name":"UserMediaPermissionRequest","summary":"Whether the media device to which the permission was requested has a video capture capability or not.","deprecated":null},{"type":"property","name":"is-immersive-mode-enabled","type_name":"WebView","summary":"Whether the #WebKitWebView is in immersive mode.","deprecated":null},{"type":"property","name":"is-loading","type_name":"WebView","summary":"Whether the #WebKitWebView is currently loading a page. This property becomes %TRUE as soon as a new load operation ...","deprecated":null},{"type":"property","name":"is-muted","type_name":"WebView","summary":"Whether the #WebKitWebView audio is muted. When %TRUE, audio is silenced. It may still be playing, i.e. #WebKitWebView:is-playing-audio may ...","deprecated":null},{"type":"property","name":"is-playing-audio","type_name":"WebView","summary":"Whether the #WebKitWebView is currently playing audio from a page. This property becomes %TRUE as soon as web content ...","deprecated":null},{"type":"property","name":"is-web-process-responsive","type_name":"WebView","summary":"Whether the web process currently associated to the #WebKitWebView is responsive.","deprecated":null},{"type":"property","name":"javascript-can-access-clipboard","type_name":"Settings","summary":"Whether JavaScript can access the clipboard. The default value is %FALSE. If set to %TRUE, document.execCommand() allows cut, copy ...","deprecated":null},{"type":"property","name":"javascript-can-open-windows-automatically","type_name":"Settings","summary":"Whether JavaScript can open popup windows automatically without user intervention.","deprecated":null},{"type":"property","name":"link-label","type_name":"HitTestResult","summary":"The label of the link if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"link-title","type_name":"HitTestResult","summary":"The title of the link if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"link-uri","type_name":"HitTestResult","summary":"The URI of the link if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"load-icons-ignoring-image-load-setting","type_name":"Settings","summary":"Unsupported setting. This property does nothing.","deprecated":"2.42"},{"type":"property","name":"locationbar-visible","type_name":"WindowProperties","summary":"Whether the locationbar should be visible for the window.","deprecated":null},{"type":"property","name":"manifest-version","type_name":"WebExtension","summary":"The parsed manifest version of the #WebKitWebExtension. See webkit_web_extension_get_manifest_version() for more details.","deprecated":null},{"type":"property","name":"math-font-family","type_name":"Settings","summary":"The font family used as the default for content using a math font.","deprecated":null},{"type":"property","name":"max-match-count","type_name":"FindController","summary":"The maximum number of matches to report for a given search.","deprecated":null},{"type":"property","name":"media-content-types-requiring-hardware-support","type_name":"Settings","summary":"List of media content types requiring hardware support, split by semicolons (:). For example: 'video/webm; codecs=\"vp*\":video/mp4; codecs=\"avc*\":video/* codecs=\"av1*\"'.","deprecated":null},{"type":"property","name":"media-playback-allows-inline","type_name":"Settings","summary":"Whether media playback is full-screen only or inline playback is allowed. This is %TRUE by default, so media playback ...","deprecated":null},{"type":"property","name":"media-playback-requires-user-gesture","type_name":"Settings","summary":"Whether a user gesture (such as clicking the play button) would be required to start media playback or load ...","deprecated":null},{"type":"property","name":"media-uri","type_name":"HitTestResult","summary":"The URI of the media if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"memory-pressure-settings","type_name":"WebContext","summary":"The #WebKitMemoryPressureSettings applied to the web processes created by this context.","deprecated":null},{"type":"property","name":"menubar-visible","type_name":"WindowProperties","summary":"Whether the menubar should be visible for the window.","deprecated":null},{"type":"property","name":"microphone-capture-state","type_name":"WebView","summary":"Capture state of the microphone device. Whenever the user grants a media-request sent by the web page, requesting audio ...","deprecated":null},{"type":"property","name":"mime-type","type_name":"URIResponse","summary":"The MIME type of the response.","deprecated":null},{"type":"property","name":"mime-types","type_name":"FileChooserRequest","summary":"A %NULL-terminated array of strings containing the list of MIME types the file chooser dialog should handle. See webkit_file_chooser_request_get_mime_types() ...","deprecated":null},{"type":"property","name":"minimum-font-size","type_name":"Settings","summary":"The minimum font size in pixels used to display text. This setting controls the absolute smallest size. Values other ...","deprecated":null},{"type":"property","name":"monospace-font-family","type_name":"Settings","summary":"The font family used as the default for content using a monospace font.","deprecated":null},{"type":"property","name":"name","type_name":"UserMessage","summary":"The name of the user message.","deprecated":null},{"type":"property","name":"navigation-action","type_name":"NavigationPolicyDecision","summary":"The #WebKitNavigationAction that triggered this policy decision.","deprecated":null},{"type":"property","name":"network-session","type_name":"WebView","summary":"The #WebKitNetworkSession of the view","deprecated":null},{"type":"property","name":"optional-permissions","type_name":"WebExtension","summary":"The set of permissions that the #WebKitWebExtension may need for optional functionality. See webkit_web_extension_get_optional_permissions() for more details.","deprecated":null},{"type":"property","name":"options","type_name":"FindController","summary":"The options to be used in the search operation.","deprecated":null},{"type":"property","name":"origin-storage-ratio","type_name":"WebsiteDataManager","summary":"The percentage of volume space that can be used for data storage for every domain. If the maximum storage ...","deprecated":null},{"type":"property","name":"page-id","type_name":"WebView","summary":"The identifier of the #WebKitWebPage corresponding to the #WebKitWebView.","deprecated":null},{"type":"property","name":"page-setup","type_name":"PrintOperation","summary":"The initial #GtkPageSetup for the print operation.","deprecated":null},{"type":"property","name":"parameters","type_name":"UserMessage","summary":"The parameters of the user message as a #GVariant, or %NULL if the message doesn't include parameters. Note that ...","deprecated":null},{"type":"property","name":"path","type_name":"UserContentFilterStore","summary":"The directory used for filter storage. This path is used as the base directory where user content filters are ...","deprecated":null},{"type":"property","name":"path","type_name":"WebExtension","summary":"A string pointing to the folder containing the extension manifest and resources. See webkit_web_extension_get_path() for more details.","deprecated":null},{"type":"property","name":"pictograph-font-family","type_name":"Settings","summary":"The font family used as the default for content using a pictograph font.","deprecated":null},{"type":"property","name":"print-backgrounds","type_name":"Settings","summary":"Whether background images should be drawn during printing.","deprecated":null},{"type":"property","name":"print-settings","type_name":"PrintOperation","summary":"The initial #GtkPrintSettings for the print operation.","deprecated":null},{"type":"property","name":"related-view","type_name":"WebView","summary":"The related #WebKitWebView used when creating the view to share the same web process and network session. This property ...","deprecated":null},{"type":"property","name":"request","type_name":"ResponsePolicyDecision","summary":"This property contains the #WebKitURIRequest associated with this policy decision.","deprecated":null},{"type":"property","name":"requested-permissions","type_name":"WebExtension","summary":"The set of permissions that the #WebKitWebExtension requires for its base functionality. See webkit_web_extension_get_requested_permissions() for more details.","deprecated":null},{"type":"property","name":"resizable","type_name":"WindowProperties","summary":"Whether the window can be resized.","deprecated":null},{"type":"property","name":"response","type_name":"Download","summary":"The #WebKitURIResponse associated with this download.","deprecated":null},{"type":"property","name":"response","type_name":"ResponsePolicyDecision","summary":"This property contains the #WebKitURIResponse associated with this policy decision.","deprecated":null},{"type":"property","name":"response","type_name":"WebResource","summary":"The #WebKitURIResponse associated with this resource.","deprecated":null},{"type":"property","name":"rgba","type_name":"ColorChooserRequest","summary":"The #GdkRGBA color of the request","deprecated":null},{"type":"property","name":"sans-serif-font-family","type_name":"Settings","summary":"The font family used as the default for content using a sans-serif font.","deprecated":null},{"type":"property","name":"scrollbars-visible","type_name":"WindowProperties","summary":"Whether the scrollbars should be visible for the window.","deprecated":null},{"type":"property","name":"select-multiple","type_name":"FileChooserRequest","summary":"Whether the file chooser should allow selecting multiple files. See webkit_file_chooser_request_get_select_multiple() for more details.","deprecated":null},{"type":"property","name":"selected-files","type_name":"FileChooserRequest","summary":"A %NULL-terminated array of strings containing the list of selected files associated to the current request. See webkit_file_chooser_request_get_selected_files() for ...","deprecated":null},{"type":"property","name":"serif-font-family","type_name":"Settings","summary":"The font family used as the default for content using a serif font.","deprecated":null},{"type":"property","name":"settings","type_name":"WebView","summary":"The #WebKitSettings of the view.","deprecated":null},{"type":"property","name":"status-code","type_name":"URIResponse","summary":"The status code of the response as returned by the server.","deprecated":null},{"type":"property","name":"statusbar-visible","type_name":"WindowProperties","summary":"Whether the statusbar should be visible for the window.","deprecated":null},{"type":"property","name":"stream","type_name":"URISchemeResponse","summary":"The input stream to read from.","deprecated":null},{"type":"property","name":"stream-length","type_name":"URISchemeResponse","summary":"The input stream length in bytes, `-1` for unknown length.","deprecated":null},{"type":"property","name":"suggested-filename","type_name":"URIResponse","summary":"The suggested filename for the URI response.","deprecated":null},{"type":"property","name":"tag","type_name":"Notification","summary":"The tag identifier for the notification.","deprecated":null},{"type":"property","name":"text","type_name":"FindController","summary":"The current search text for this #WebKitFindController.","deprecated":null},{"type":"property","name":"theme-color","type_name":"WebView","summary":"The theme color of the WebView's current page.","deprecated":null},{"type":"property","name":"time-zone-override","type_name":"WebContext","summary":"The timezone override for this web context. Setting this property provides a better alternative to configure the timezone information ...","deprecated":null},{"type":"property","name":"title","type_name":"Notification","summary":"The title for the notification.","deprecated":null},{"type":"property","name":"title","type_name":"WebView","summary":"The main frame document title of this #WebKitWebView. If the title has not been received yet, it will be %NULL.","deprecated":null},{"type":"property","name":"toolbar-visible","type_name":"WindowProperties","summary":"Whether the toolbar should be visible for the window.","deprecated":null},{"type":"property","name":"total-storage-ratio","type_name":"WebsiteDataManager","summary":"The percentage of volume space that can be used for data storage for all domains. If the maximum storage ...","deprecated":null},{"type":"property","name":"typing-attributes","type_name":"EditorState","summary":"Bitmask of #WebKitEditorTypingAttributes flags. See webkit_editor_state_get_typing_attributes() for more information.","deprecated":null},{"type":"property","name":"uri","type_name":"URIRequest","summary":"The URI to which the request will be made.","deprecated":null},{"type":"property","name":"uri","type_name":"URIResponse","summary":"The URI for which the response was made.","deprecated":null},{"type":"property","name":"uri","type_name":"WebResource","summary":"The current active URI of the #WebKitWebResource. See webkit_web_resource_get_uri() for more details.","deprecated":null},{"type":"property","name":"uri","type_name":"WebView","summary":"The current active URI of the #WebKitWebView. See webkit_web_view_get_uri() for more details.","deprecated":null},{"type":"property","name":"user-agent","type_name":"Settings","summary":"The user-agent string used by WebKit. Unusual user-agent strings may cause web content to render incorrectly or fail to ...","deprecated":null},{"type":"property","name":"user-content-manager","type_name":"WebView","summary":"The #WebKitUserContentManager of the view.","deprecated":null},{"type":"property","name":"version","type_name":"WebExtension","summary":"The version of the #WebKitWebExtension. See webkit_web_extension_get_version() for more details.","deprecated":null},{"type":"property","name":"web-context","type_name":"WebView","summary":"The #WebKitWebContext of the view.","deprecated":null},{"type":"property","name":"web-extension-mode","type_name":"WebView","summary":"This configures @web_view to treat the content as a WebExtension. Note that this refers to the web standard ...","deprecated":null},{"type":"property","name":"web-view","type_name":"FindController","summary":"The #WebKitWebView this controller is associated to.","deprecated":null},{"type":"property","name":"web-view","type_name":"PrintOperation","summary":"The #WebKitWebView that will be printed.","deprecated":null},{"type":"property","name":"webrtc-udp-ports-range","type_name":"Settings","summary":"Allow customization of the WebRTC UDP ports range. In some constrained environments where a firewall blocks UDP network ...","deprecated":null},{"type":"property","name":"website-policies","type_name":"WebView","summary":"The #WebKitWebsitePolicies for the view.","deprecated":null},{"type":"property","name":"zoom-level","type_name":"WebView","summary":"The zoom level of the #WebKitWebView content. See webkit_web_view_set_zoom_level() for more details.","deprecated":null},{"type":"property","name":"zoom-text-only","type_name":"Settings","summary":"Whether #WebKitWebView:zoom-level affects only the text of the page or all the contents. Other contents containing text like form ...","deprecated":null},{"type":"record","name":"ApplicationInfo","ctype":"WebKitApplicationInfo","summary":"Information about an application running in automation mode.","deprecated":null},{"type":"record","name":"Credential","ctype":"WebKitCredential","summary":"Groups information used for user authentication.","deprecated":null},{"type":"record","name":"Feature","ctype":"WebKitFeature","summary":"Describes a web engine feature that may be toggled at runtime. The WebKit web engine includes a set ...","deprecated":null},{"type":"record","name":"FeatureList","ctype":"WebKitFeatureList","summary":"Contains a set of toggle-able web engine features. The list supports passing around a set of [struct@Feature] objects ...","deprecated":null},{"type":"record","name":"GeolocationPosition","ctype":"WebKitGeolocationPosition","summary":"An opaque struct to provide position updates to a #WebKitGeolocationManager. WebKitGeolocationPosition is an opaque struct used to provide ...","deprecated":null},{"type":"record","name":"ITPFirstParty","ctype":"WebKitITPFirstParty","summary":"Describes a first party origin.","deprecated":null},{"type":"record","name":"ITPThirdParty","ctype":"WebKitITPThirdParty","summary":"Describes a third party origin.","deprecated":null},{"type":"record","name":"InputMethodUnderline","ctype":"WebKitInputMethodUnderline","summary":"Range of text in an preedit string to be shown underlined.","deprecated":null},{"type":"record","name":"MemoryPressureSettings","ctype":"WebKitMemoryPressureSettings","summary":"A boxed type representing the settings for the memory pressure handler #WebKitMemoryPressureSettings is a boxed type that can ...","deprecated":null},{"type":"record","name":"NavigationAction","ctype":"WebKitNavigationAction","summary":"Provides details about interaction resulting in a resource load.","deprecated":null},{"type":"record","name":"NetworkProxySettings","ctype":"WebKitNetworkProxySettings","summary":"Configures network proxies. WebKitNetworkProxySettings can be used to provide a custom proxy configuration to a #WebKitNetworkSession. You need ...","deprecated":null},{"type":"record","name":"OptionMenuItem","ctype":"WebKitOptionMenuItem","summary":"One item of a #WebKitOptionMenu. The #WebKitOptionMenu is composed of WebKitOptionMenuItems. A WebKitOptionMenuItem always has a label and ...","deprecated":null},{"type":"record","name":"PermissionStateQuery","ctype":"WebKitPermissionStateQuery","summary":"This query represents a user's choice to allow or deny access to \"powerful features\" of the platform, as specified ...","deprecated":null},{"type":"record","name":"ScriptDialog","ctype":"WebKitScriptDialog","summary":"Carries details to be shown in user-facing dialogs.","deprecated":null},{"type":"record","name":"ScriptMessageReply","ctype":"WebKitScriptMessageReply","summary":"A reply for a script message received. If no reply has been sent by the user, an automatically generated ...","deprecated":null},{"type":"record","name":"SecurityOrigin","ctype":"WebKitSecurityOrigin","summary":"A security boundary for websites. #WebKitSecurityOrigin is a representation of a security domain defined by websites. A security ...","deprecated":null},{"type":"record","name":"UserContentFilter","ctype":"WebKitUserContentFilter","summary":"A compiled set of rules which applied to resource loads.","deprecated":null},{"type":"record","name":"UserScript","ctype":"WebKitUserScript","summary":"A JavaScript snippet which can be injected in loaded pages.","deprecated":null},{"type":"record","name":"UserStyleSheet","ctype":"WebKitUserStyleSheet","summary":"A CSS style sheet which can be injected in loaded pages.","deprecated":null},{"type":"record","name":"WebExtensionMatchPattern","ctype":"WebKitWebExtensionMatchPattern","summary":"Represents a way to specify a group of URLs for use in WebExtensions. All match patterns are specified ...","deprecated":null},{"type":"record","name":"WebViewSessionState","ctype":"WebKitWebViewSessionState","summary":"Handles serialization of a web view's browsing state.","deprecated":null},{"type":"record","name":"WebsiteData","ctype":"WebKitWebsiteData","summary":"Data stored locally by a web site. WebKitWebsiteData represents data stored in the client by a particular website. ...","deprecated":null},{"type":"signal","name":"attach","type_name":"WebInspector","summary":"Emitted when the inspector is requested to be attached to the window where the inspected web view is. If ...","deprecated":null},{"type":"signal","name":"authenticate","type_name":"WebView","summary":"This signal is emitted when the user is challenged with HTTP authentication. To let the application access or ...","deprecated":null},{"type":"signal","name":"authenticated","type_name":"AuthenticationRequest","summary":"This signal is emitted when the user authentication request succeeded. Applications handling their own credential storage should connect to ...","deprecated":null},{"type":"signal","name":"automation-started","type_name":"WebContext","summary":"This signal is emitted when a new automation request is made. Note that it will never be emitted if ...","deprecated":null},{"type":"signal","name":"bring-to-front","type_name":"WebInspector","summary":"Emitted when the inspector should be shown. If the inspector is not attached the inspector window should be ...","deprecated":null},{"type":"signal","name":"cancelled","type_name":"AuthenticationRequest","summary":"This signal is emitted when the user authentication request is cancelled. It allows the application to dismiss its authentication ...","deprecated":null},{"type":"signal","name":"changed","type_name":"BackForwardList","summary":"This signal is emitted when @back_forward_list changes. This happens when the current item is updated, a new item is ...","deprecated":null},{"type":"signal","name":"changed","type_name":"CookieManager","summary":"This signal is emitted when cookies are added, removed or modified.","deprecated":null},{"type":"signal","name":"changed","type_name":"EditorState","summary":"Emitted when the #WebKitEdtorState is changed.","deprecated":null},{"type":"signal","name":"clicked","type_name":"Notification","summary":"Emitted when a notification has been clicked. See webkit_notification_clicked().","deprecated":null},{"type":"signal","name":"close","type_name":"OptionMenu","summary":"Emitted when closing a #WebKitOptionMenu is requested. This can happen when the user explicitly calls webkit_option_menu_close() or when the ...","deprecated":null},{"type":"signal","name":"close","type_name":"WebView","summary":"Emitted when closing a #WebKitWebView is requested. This occurs when a call is made from JavaScript's window.close function or ...","deprecated":null},{"type":"signal","name":"closed","type_name":"Notification","summary":"Emitted when a notification has been withdrawn. The default handler will close the notification using libnotify, if built ...","deprecated":null},{"type":"signal","name":"closed","type_name":"WebInspector","summary":"Emitted when the inspector page is closed. If you are using your own inspector window, you should connect to ...","deprecated":null},{"type":"signal","name":"committed","type_name":"InputMethodContext","summary":"Emitted when a complete input sequence has been entered by the user. This can be a single character immediately ...","deprecated":null},{"type":"signal","name":"context-menu","type_name":"WebView","summary":"Emitted when a context menu is about to be displayed to give the application a chance to customize the ...","deprecated":null},{"type":"signal","name":"context-menu-dismissed","type_name":"WebView","summary":"Emitted after #WebKitWebView::context-menu signal, if the context menu is shown, to notify that the context menu is dismissed.","deprecated":null},{"type":"signal","name":"counted-matches","type_name":"FindController","summary":"This signal is emitted when the #WebKitFindController has counted the number of matches for a given text after a ...","deprecated":null},{"type":"signal","name":"create","type_name":"WebView","summary":"Emitted when the creation of a new #WebKitWebView is requested. If this signal is handled the signal handler should ...","deprecated":null},{"type":"signal","name":"create-web-view","type_name":"AutomationSession","summary":"This signal is emitted when the automation client requests a new browsing context to interact with it. The callback ...","deprecated":null},{"type":"signal","name":"created-destination","type_name":"Download","summary":"This signal is emitted after #WebKitDownload::decide-destination and before #WebKitDownload::received-data to notify that destination file has been created successfully at @destination.","deprecated":null},{"type":"signal","name":"decide-destination","type_name":"Download","summary":"This signal is emitted after response is received to decide a destination for the download using webkit_download_set_destination(). If this ...","deprecated":null},{"type":"signal","name":"decide-policy","type_name":"WebView","summary":"This signal is emitted when WebKit is requesting the client to decide a policy decision, such as whether to ...","deprecated":null},{"type":"signal","name":"delete-surrounding","type_name":"InputMethodContext","summary":"Emitted when the input method wants to delete the context surrounding the cursor. If @offset is a negative value, ...","deprecated":null},{"type":"signal","name":"detach","type_name":"WebInspector","summary":"Emitted when the inspector is requested to be detached from the window it is currently attached to. The inspector ...","deprecated":null},{"type":"signal","name":"download-started","type_name":"NetworkSession","summary":"This signal is emitted when a new download request is made.","deprecated":null},{"type":"signal","name":"enter-fullscreen","type_name":"WebView","summary":"Emitted when JavaScript code calls element.webkitRequestFullScreen. If the signal is not handled the #WebKitWebView will proceed to full screen ...","deprecated":null},{"type":"signal","name":"failed","type_name":"Download","summary":"This signal is emitted when an error occurs during the download operation. The given @error, of the domain %WEBKIT_DOWNLOAD_ERROR, ...","deprecated":null},{"type":"signal","name":"failed","type_name":"PrintOperation","summary":"Emitted when an error occurs while printing. The given @error, of the domain %WEBKIT_PRINT_ERROR, contains further details of the ...","deprecated":null},{"type":"signal","name":"failed","type_name":"WebResource","summary":"This signal is emitted when an error occurs during the resource load operation.","deprecated":null},{"type":"signal","name":"failed-to-find-text","type_name":"FindController","summary":"This signal is emitted when a search operation does not find any result for the given text. It will ...","deprecated":null},{"type":"signal","name":"failed-with-tls-errors","type_name":"WebResource","summary":"This signal is emitted when a TLS error occurs during the resource load operation.","deprecated":null},{"type":"signal","name":"favicon-changed","type_name":"FaviconDatabase","summary":"This signal is emitted when the favicon URI of @page_uri has been changed to @favicon_uri in the database. You ...","deprecated":null},{"type":"signal","name":"finished","type_name":"ColorChooserRequest","summary":"Emitted when the @request finishes. This signal can be emitted because the user completed the @request calling webkit_color_chooser_request_finish(), or ...","deprecated":null},{"type":"signal","name":"finished","type_name":"Download","summary":"This signal is emitted when download finishes successfully or due to an error. In case of errors #WebKitDownload::failed signal ...","deprecated":null},{"type":"signal","name":"finished","type_name":"PrintOperation","summary":"Emitted when the print operation has finished doing everything required for printing.","deprecated":null},{"type":"signal","name":"finished","type_name":"WebResource","summary":"This signal is emitted when the resource load finishes successfully or due to an error. In case of errors ...","deprecated":null},{"type":"signal","name":"found-text","type_name":"FindController","summary":"This signal is emitted when a given text is found in the web page text. It will be issued ...","deprecated":null},{"type":"signal","name":"initialize-notification-permissions","type_name":"WebContext","summary":"This signal is emitted when a #WebKitWebContext needs to set initial notification permissions for a web process. It is ...","deprecated":null},{"type":"signal","name":"initialize-web-process-extensions","type_name":"WebContext","summary":"This signal is emitted when a new web process is about to be launched. It signals the most appropriate ...","deprecated":null},{"type":"signal","name":"insecure-content-detected","type_name":"WebView","summary":"Prior to 2.46, this signal was emitted when insecure content was loaded in a secure content. Since 2.46, this ...","deprecated":"2.46"},{"type":"signal","name":"leave-fullscreen","type_name":"WebView","summary":"Emitted when the #WebKitWebView is about to restore its top level window out of its full screen state. This ...","deprecated":null},{"type":"signal","name":"load-changed","type_name":"WebView","summary":"Emitted when a load operation in @web_view changes. The signal is always emitted with %WEBKIT_LOAD_STARTED when a new load ...","deprecated":null},{"type":"signal","name":"load-failed","type_name":"WebView","summary":"Emitted when an error occurs during a load operation. If the error happened when starting to load data for ...","deprecated":null},{"type":"signal","name":"load-failed-with-tls-errors","type_name":"WebView","summary":"Emitted when a TLS error occurs during a load operation. To allow an exception for this @certificate and the ...","deprecated":null},{"type":"signal","name":"mouse-target-changed","type_name":"WebView","summary":"This signal is emitted when the mouse cursor moves over an element such as a link, image or a ...","deprecated":null},{"type":"signal","name":"open-window","type_name":"WebInspector","summary":"Emitted when the inspector is requested to open in a separate window. If this signal is not handled, a ...","deprecated":null},{"type":"signal","name":"permission-request","type_name":"WebView","summary":"This signal is emitted when WebKit is requesting the client to decide about a permission request, such as allowing ...","deprecated":null},{"type":"signal","name":"preedit-changed","type_name":"InputMethodContext","summary":"Emitted whenever the preedit sequence currently being entered has changed. It is also emitted at the end of a ...","deprecated":null},{"type":"signal","name":"preedit-finished","type_name":"InputMethodContext","summary":"Emitted when a preediting sequence has been completed or canceled.","deprecated":null},{"type":"signal","name":"preedit-started","type_name":"InputMethodContext","summary":"Emitted when a new preediting sequence starts.","deprecated":null},{"type":"signal","name":"print","type_name":"WebView","summary":"Emitted when printing is requested on @web_view, usually by a JavaScript call, before the print dialog is shown. This ...","deprecated":null},{"type":"signal","name":"query-permission-state","type_name":"WebView","summary":"This signal allows the User-Agent to respond to permission requests for powerful features, as specified by the [Permissions W3C ...","deprecated":null},{"type":"signal","name":"ready-to-show","type_name":"WebView","summary":"Emitted after #WebKitWebView::create on the newly created #WebKitWebView when it should be displayed to the user. When this signal ...","deprecated":null},{"type":"signal","name":"received-data","type_name":"Download","summary":"This signal is emitted after response is received, every time new data has been written to the destination. It's ...","deprecated":null},{"type":"signal","name":"resource-load-started","type_name":"WebView","summary":"Emitted when a new resource is going to be loaded. The @request parameter contains the #WebKitURIRequest that will be ...","deprecated":null},{"type":"signal","name":"run-as-modal","type_name":"WebView","summary":"Emitted after #WebKitWebView::ready-to-show on the newly created #WebKitWebView when JavaScript code calls window.showModalDialog. The purpose of this signal is ...","deprecated":null},{"type":"signal","name":"run-color-chooser","type_name":"WebView","summary":"This signal is emitted when the user interacts with a HTML element, requesting from WebKit to show a ...","deprecated":null},{"type":"signal","name":"run-file-chooser","type_name":"WebView","summary":"This signal is emitted when the user interacts with a HTML element, requesting from WebKit to show a ...","deprecated":null},{"type":"signal","name":"script-dialog","type_name":"WebView","summary":"Emitted when JavaScript code calls window.alert, window.confirm or window.prompt, or when onbeforeunload event is fired. The @dialog parameter should ...","deprecated":null},{"type":"signal","name":"script-message-received","type_name":"UserContentManager","summary":"This signal is emitted when JavaScript in a web view calls window.webkit.messageHandlers..postMessage(), after registering using webkit_user_content_manager_register_script_message_handler()","deprecated":null},{"type":"signal","name":"script-message-with-reply-received","type_name":"UserContentManager","summary":"This signal is emitted when JavaScript in a web view calls window.webkit.messageHandlers..postMessage(), after registering using webkit_user_content_manager_register_script_message_handler_with_reply() The ...","deprecated":null},{"type":"signal","name":"sent-request","type_name":"WebResource","summary":"This signal is emitted when @request has been sent to the server. In case of a server redirection this ...","deprecated":null},{"type":"signal","name":"show-notification","type_name":"WebView","summary":"This signal is emitted when a notification should be presented to the user. The @notification is kept alive until ...","deprecated":null},{"type":"signal","name":"show-option-menu","type_name":"WebView","summary":"This signal is emitted when a select element in @web_view needs to display a dropdown menu. This signal can ...","deprecated":null},{"type":"signal","name":"start","type_name":"GeolocationManager","summary":"The signal is emitted to notify that @manager needs to start receiving position updates. After this signal is emitted ...","deprecated":null},{"type":"signal","name":"stop","type_name":"GeolocationManager","summary":"The signal is emitted to notify that @manager doesn't need to receive position updates anymore.","deprecated":null},{"type":"signal","name":"submit-form","type_name":"WebView","summary":"This signal is emitted when a form is about to be submitted. The @request argument passed contains information about ...","deprecated":null},{"type":"signal","name":"user-message-received","type_name":"WebContext","summary":"This signal is emitted when a #WebKitUserMessage is received from a web process extension. You can reply to the ...","deprecated":null},{"type":"signal","name":"user-message-received","type_name":"WebView","summary":"This signal is emitted when a #WebKitUserMessage is received from the #WebKitWebPage corresponding to @web_view. You can reply to ...","deprecated":null},{"type":"signal","name":"web-process-terminated","type_name":"WebView","summary":"This signal is emitted when the web process terminates abnormally due to @reason.","deprecated":null},{"type":"signal","name":"will-close","type_name":"AutomationSession","summary":"This signal is emitted when the given automation session is about to finish. It allows clients to perform any ...","deprecated":null},{"type":"type_func","name":"font_size_to_pixels","type_name":"Settings","ident":"webkit_settings_font_size_to_pixels","summary":"Convert @points to the equivalent value in pixels. Applications can use this function to convert font size values ...","deprecated":null},{"type":"type_func","name":"font_size_to_points","type_name":"Settings","ident":"webkit_settings_font_size_to_points","summary":"Convert @pixels to the equivalent value in points. Applications can use this function to convert font size values ...","deprecated":null},{"type":"type_func","name":"get_all_features","type_name":"Settings","ident":"webkit_settings_get_all_features","summary":"Gets the list of all available WebKit features. Features can be toggled with [method@Settings.set_feature_enabled], and their current state ...","deprecated":null},{"type":"type_func","name":"get_default","type_name":"NetworkSession","ident":"webkit_network_session_get_default","summary":"Get the default network session. The default network session is created using webkit_network_session_new() and passing %NULL as data and ...","deprecated":null},{"type":"type_func","name":"get_default","type_name":"WebContext","ident":"webkit_web_context_get_default","summary":"Gets the default web context.","deprecated":null},{"type":"type_func","name":"get_development_features","type_name":"Settings","ident":"webkit_settings_get_development_features","summary":"Gets the list of available development WebKit features. The returned features are a subset of those returned by ...","deprecated":null},{"type":"type_func","name":"get_experimental_features","type_name":"Settings","ident":"webkit_settings_get_experimental_features","summary":"Gets the list of available experimental WebKit features. The returned features are a subset of those returned by ...","deprecated":null},{"type":"type_func","name":"quark","type_name":"DownloadError","ident":"webkit_download_error_quark","summary":"Gets the quark for the domain of download errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"FaviconDatabaseError","ident":"webkit_favicon_database_error_quark","summary":"Gets the quark for the domain of favicon database errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"JavascriptError","ident":"webkit_javascript_error_quark","summary":"Gets the quark for the domain of JavaScript errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"MediaError","ident":"webkit_media_error_quark","summary":"Gets the quark for the domain of media errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"NetworkError","ident":"webkit_network_error_quark","summary":"Gets the quark for the domain of networking errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"PolicyError","ident":"webkit_policy_error_quark","summary":"Gets the quark for the domain of policy errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"PrintError","ident":"webkit_print_error_quark","summary":"Gets the quark for the domain of printing errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"SnapshotError","ident":"webkit_snapshot_error_quark","summary":"Gets the quark for the domain of page snapshot errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"UserContentFilterError","ident":"webkit_user_content_filter_error_quark","summary":"Gets the quark for the domain of user content filter errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"UserMessageError","ident":"webkit_user_message_error_quark","summary":"Gets the quark for the domain of user message errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"WebExtensionError","ident":"webkit_web_extension_error_quark","summary":"Gets the quark for the domain of Web Extension errors.","deprecated":null},{"type":"type_func","name":"quark","type_name":"WebExtensionMatchPatternError","ident":"webkit_web_extension_match_pattern_error_quark","summary":"Gets the quark for the domain of Web Extension Match Pattern errors.","deprecated":null},{"type":"type_func","name":"register_custom_URL_scheme","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_register_custom_URL_scheme","summary":"Registers a custom URL scheme that can be used in match patterns. This method should be used to ..."},{"type":"type_func","name":"register_custom_url_scheme","type_name":"WebExtensionMatchPattern","ident":"webkit_web_extension_match_pattern_register_custom_url_scheme","summary":"Registers a custom URL scheme that can be used in match patterns. This method should be used to ..."},{"type":"type_func","name":"set_memory_pressure_settings","type_name":"NetworkSession","ident":"webkit_network_session_set_memory_pressure_settings","summary":"Sets @settings as the #WebKitMemoryPressureSettings. Sets @settings as the #WebKitMemoryPressureSettings to be used by the network process created ...","deprecated":null},{"type":"vfunc","name":"allow","type_name":"PermissionRequest","summary":"Allow the action which triggered this request.","deprecated":null},{"type":"vfunc","name":"authenticate","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"close","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"committed","type_name":"InputMethodContext","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"context_menu","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"context_menu_dismissed","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"create","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"decide_policy","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"delete_surrounding","type_name":"InputMethodContext","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"deny","type_name":"PermissionRequest","summary":"Deny the action which triggered this request.","deprecated":null},{"type":"vfunc","name":"enter_fullscreen","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"filter_key_event","type_name":"InputMethodContext","summary":"Allow @key_event to be handled by the input method. If %TRUE is returned, then no further processing should ...","deprecated":null},{"type":"vfunc","name":"get_preedit","type_name":"InputMethodContext","summary":"Get the pre-edit string and a list of WebKitInputMethodUnderline. Get the current pre-edit string for the @context, and ...","deprecated":null},{"type":"vfunc","name":"insecure_content_detected","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"leave_fullscreen","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"load_changed","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"load_failed","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"load_failed_with_tls_errors","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"mouse_target_changed","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"notify_cursor_area","type_name":"InputMethodContext","summary":"Notify @context that cursor area changed in input associated.","deprecated":null},{"type":"vfunc","name":"notify_focus_in","type_name":"InputMethodContext","summary":"Notify @context that input associated has gained focus.","deprecated":null},{"type":"vfunc","name":"notify_focus_out","type_name":"InputMethodContext","summary":"Notify @context that input associated has lost focus.","deprecated":null},{"type":"vfunc","name":"notify_surrounding","type_name":"InputMethodContext","summary":"Notify @context that the context surrounding the cursor has changed. If there's no selection @selection_index is the same ...","deprecated":null},{"type":"vfunc","name":"permission_request","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"preedit_changed","type_name":"InputMethodContext","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"preedit_finished","type_name":"InputMethodContext","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"preedit_started","type_name":"InputMethodContext","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"print","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"query_permission_state","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"ready_to_show","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"reset","type_name":"InputMethodContext","summary":"Reset the @context. This will typically cause the input to clear the preedit state.","deprecated":null},{"type":"vfunc","name":"resource_load_started","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"run_as_modal","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"run_color_chooser","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"run_file_chooser","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"script_dialog","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"set_enable_preedit","type_name":"InputMethodContext","summary":"Set whether @context should enable preedit to display feedback.","deprecated":null},{"type":"vfunc","name":"show_notification","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"show_option_menu","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"submit_form","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"user_message_received","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"web_process_crashed","type_name":"WebView","summary":"No description available.","deprecated":null},{"type":"vfunc","name":"web_process_terminated","type_name":"WebView","summary":"No description available.","deprecated":null}],"terms":{}} \ No newline at end of file diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ApplicationInfo.get_name.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ApplicationInfo.get_name.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ApplicationInfo.get_name.html 2026-04-16 17:54:32.607689900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ApplicationInfo.get_name.html 2026-07-09 07:33:40.071512700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,14 +169,14 @@

Type: const gchar*

-

The application name.

+

The application name.

Version2.52.3
Version2.52.5
AuthorsThe WebKit GTK and WPE teams
LicenseBSD, LGPL-2.1
Websitehttps://webkit.org

Represents an authentication request.

-

unstable since: 6.0

+

List of visited pages.

-

unstable since: 6.0

+

One item of the WebKitBackForwardList.

-

unstable since: 6.0

+

A request to open a color chooser.

-

unstable since: 6.0

+

Represents the context menu in a WebKitWebView.

-

unstable since: 6.0

+

One item of a WebKitContextMenu.

-

unstable since: 6.0

+

Defines how to handle cookies in a WebKitWebContext.

-

unstable since: 6.0

+

Object used to communicate with the application when downloading.

-

unstable since: 6.0

+

Provides access to the icons associated with web sites.

-

unstable since: 6.0

+

A request to open a file chooser.

-

unstable since: 6.0

+

Controls text search in a WebKitWebView.

-

unstable since: 6.0

+

Represents a form submission request.

-

unstable since: 6.0

+

A permission request for sharing the user’s location.

-

unstable since: 6.0

+

Result of a Hit Test.

-

unstable since: 6.0

+

A permission request for using an EME Content Decryption Module.

-

unstable since: 6.0

+

A policy decision for navigation actions.

-

unstable since: 6.0

+

A pending policy decision.

-

unstable since: 6.0

+

Controls a print operation.

-

unstable since: 6.0

+

A policy decision for resource responses.

-

unstable since: 6.0

+

Controls security settings in a WebKitWebContext.

-

unstable since: 6.0

+

Control the behaviour of a WebKitWebView.

-

unstable since: 6.0

+

Represents a URI request.

-

unstable since: 6.0

+

Represents an URI response.

-

unstable since: 6.0

+

Represents a URI scheme request.

-

unstable since: 6.0

+

Represents a URI scheme response.

-

unstable since: 6.0

+

Manages aspects common to all WebKitWebViews.

-

unstable since: 6.0

+

Access to the WebKit inspector.

-

unstable since: 6.0

+

Represents a resource at the end of a URI.

-

unstable since: 6.0

+

The central class of the WPE WebKit and WebKitGTK APIs.

-

unstable since: 6.0

+

-

unstable since: 6.0

+

Window properties of a WebKitWebView.

-

unstable since: 6.0

+

A permission request.

-

unstable since: 6.0

+

Information about an application running in automation mode.

-

unstable since: 6.0

+

Provides details about interaction resulting in a resource load.

-

unstable since: 6.0

+

Carries details to be shown in user-facing dialogs.

-

unstable since: 6.0

+

Enum values used for determining the WebKitWebContext cache model.

-

unstable since: 6.0

+

Enum values used to denote the stock actions for WebKitContextMenuItems.

-

unstable since: 6.0

+

Enum values used to denote the cookie acceptance policies.

-

unstable since: 6.0

+

Enum values used to denote the cookie persistent storage types.

-

unstable since: 6.0

+

Enum values used to denote the different events that happen during a WebKitWebView load operation.

-

unstable since: 6.0

+

Enum values used to denote the various navigation types.

-

unstable since: 6.0

+

Enum values used for determining the type of a policy decision during WebKitWebView::decide-policy.

-

unstable since: 6.0

+

Enum values representing the response of the print dialog shown with webkit_print_operation_run_dialog().

-

unstable since: 6.0

+

Enum values to specify the different ways in which a WebKitWebView can save its current web page into a self-contained file.

-

unstable since: 6.0

+

Enum values used for determining the type of WebKitScriptDialog.

-

unstable since: 6.0

+

Enum values used to specify the region from which to get a WebKitWebView snapshot.

-

unstable since: 6.0

+

Enum values used to denote the TLS errors policy.

-

unstable since: 6.0

+

Enum values used to specify search options.

-

unstable since: 6.0

+

Enum values with flags representing the context of a WebKitHitTestResult.

-

unstable since: 6.0

+

Enum values used to specify options when taking a snapshot from a WebKitWebView.

-

unstable since: 6.0

+

Enum values used to denote the various download errors.

-

unstable since: 6.0

+

Enum values used to denote the various errors related to the WebKitFaviconDatabase.

-

unstable since: 6.0

+

Enum values used to denote errors happening when executing JavaScript.

-

unstable since: 6.0

+

Enum values used to denote the various network errors.

-

unstable since: 6.0

+

Enum values used to denote the various policy errors.

-

unstable since: 6.0

+

Enum values used to denote the various print errors.

-

unstable since: 6.0

+

Enum values used to denote errors happening when creating snapshots of WebKitWebView.

-

unstable since: 6.0

+

Type definition for a function that will be called back when an URI request is made for a user registered URI scheme.

-

unstable since: 6.0

+

Returns the major version number of the WebKit library.

-

unstable since: 6.0

+

Returns the micro version number of the WebKit library.

-

unstable since: 6.0

+

Returns the minor version number of the WebKit library.

-

unstable since: 6.0

+

Check the version of the WebKit headers at compilation time.

-

unstable since: 6.0

+

-

unstable since: 6.0

+

-

unstable since: 6.0

+

-

unstable since: 6.0

+

Marks a symbol as deprecated, indicating a replacement.

-

unstable since: 6.0

+

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ApplicationInfo.get_version.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ApplicationInfo.get_version.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ApplicationInfo.get_version.html 2026-04-16 17:54:32.681690000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ApplicationInfo.get_version.html 2026-07-09 07:33:40.111512000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -170,7 +170,7 @@
major

Type: guint64*

-

Return location for the major version number.

+

Return location for the major version number.

@@ -187,7 +187,7 @@
minor

Type: guint64*

-

Return location for the minor version number.

+

Return location for the minor version number.

The argument will be set by the function.
@@ -204,7 +204,7 @@
micro

Type: guint64*

-

Return location for the micro version number.

+

Return location for the micro version number.

The argument will be set by the function.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ApplicationInfo.ref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ApplicationInfo.ref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ApplicationInfo.ref.html 2026-04-16 17:54:32.809690200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ApplicationInfo.ref.html 2026-07-09 07:33:40.147511200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,14 +169,14 @@

Type: WebKitApplicationInfo

-

The passed in WebKitApplicationInfo.

+

The passed in WebKitApplicationInfo.

The argument will be set by the function.
- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ApplicationInfo.set_name.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ApplicationInfo.set_name.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ApplicationInfo.set_name.html 2026-04-16 17:54:32.954690500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ApplicationInfo.set_name.html 2026-07-09 07:33:40.167510700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -170,7 +170,7 @@
name

Type: const gchar*

-

The application name.

+

The application name.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ApplicationInfo.set_version.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ApplicationInfo.set_version.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ApplicationInfo.set_version.html 2026-04-16 17:54:33.033690500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ApplicationInfo.set_version.html 2026-07-09 07:33:40.179510600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -174,7 +174,7 @@
major

Type: guint64

-

The major version number.

+

The major version number.

@@ -191,7 +191,7 @@
minor

Type: guint64

-

The minor version number.

+

The minor version number.

@@ -208,7 +208,7 @@
micro

Type: guint64

-

The micro version number.

+

The micro version number.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ApplicationInfo.unref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ApplicationInfo.unref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ApplicationInfo.unref.html 2026-04-16 17:54:33.118690500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ApplicationInfo.unref.html 2026-07-09 07:33:40.211510000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.authenticate.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.authenticate.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.authenticate.html 2026-04-16 17:54:33.971691800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.authenticate.html 2026-07-09 07:33:40.431505200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -186,7 +186,7 @@
credential

Type: WebKitCredential

-

A WebKitCredential, or NULL.

+

A WebKitCredential, or NULL.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.can_save_credentials.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.can_save_credentials.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.can_save_credentials.html 2026-04-16 17:54:34.003692000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.can_save_credentials.html 2026-07-09 07:33:40.450685000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -189,7 +189,7 @@

Type: gboolean

-

TRUE if WebKit can store credentials or FALSE otherwise.

+

TRUE if WebKit can store credentials or FALSE otherwise.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.cancel.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.cancel.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.cancel.html 2026-04-16 17:54:34.028691800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.cancel.html 2026-07-09 07:33:40.463504600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_certificate_pin_flags.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_certificate_pin_flags.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_certificate_pin_flags.html 2026-04-16 17:54:34.084692000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_certificate_pin_flags.html 2026-07-09 07:33:40.479504300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,7 +183,7 @@

Type: GTlsPasswordFlags

-

A GTlsPasswordFlags.

+

A GTlsPasswordFlags.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_host.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_host.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_host.html 2026-04-16 17:54:34.142692000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_host.html 2026-07-09 07:33:40.515830500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,14 +183,14 @@

Type: const gchar*

-

The host of request.

+

The host of request.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_port.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_port.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_port.html 2026-04-16 17:54:34.177692200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_port.html 2026-07-09 07:33:40.523503300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,7 +183,7 @@

Type: guint

-

The port of request.

+

The port of request.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_proposed_credential.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_proposed_credential.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_proposed_credential.html 2026-04-16 17:54:34.222692300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_proposed_credential.html 2026-07-09 07:33:40.541815800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -186,15 +186,15 @@

Type: WebKitCredential

-

A WebKitCredential encapsulating credential details -or NULL if there is no stored credential.

+

A WebKitCredential encapsulating credential details +or NULL if there is no stored credential.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_realm.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_realm.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_realm.html 2026-04-16 17:54:34.252692200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_realm.html 2026-07-09 07:33:40.543503000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,14 +183,14 @@

Type: const gchar*

-

The realm of request.

+

The realm of request.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_scheme.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_scheme.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_scheme.html 2026-04-16 17:54:34.280692000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_scheme.html 2026-07-09 07:33:40.567213300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,7 +183,7 @@

Type: WebKitAuthenticationScheme

-

The WebKitAuthenticationScheme of request.

+

The WebKitAuthenticationScheme of request.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_security_origin.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_security_origin.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_security_origin.html 2026-04-16 17:54:34.302692200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.get_security_origin.html 2026-07-09 07:33:40.578288300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,14 +183,14 @@

Type: WebKitSecurityOrigin

-

A newly created WebKitSecurityOrigin.

+

A newly created WebKitSecurityOrigin.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.is_for_proxy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.is_for_proxy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.is_for_proxy.html 2026-04-16 17:54:34.331692200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.is_for_proxy.html 2026-07-09 07:33:40.589425300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -184,7 +184,7 @@

Type: gboolean

-

TRUE if authentication is for a proxy or FALSE otherwise.

+

TRUE if authentication is for a proxy or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.is_retry.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.is_retry.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.is_retry.html 2026-04-16 17:54:34.357692200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.is_retry.html 2026-07-09 07:33:40.603721900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,7 +183,7 @@

Type: gboolean

-

TRUE if authentication attempt is a retry or FALSE otherwise.

+

TRUE if authentication attempt is a retry or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.set_can_save_credentials.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.set_can_save_credentials.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.set_can_save_credentials.html 2026-04-16 17:54:34.395692300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.set_can_save_credentials.html 2026-07-09 07:33:40.624536500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -192,7 +192,7 @@
enabled

Type: gboolean

-

Value to set.

+

Value to set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.set_proposed_credential.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.set_proposed_credential.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AuthenticationRequest.set_proposed_credential.html 2026-04-16 17:54:34.423692500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AuthenticationRequest.set_proposed_credential.html 2026-07-09 07:33:40.631054400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -190,7 +190,7 @@
credential

Type: WebKitCredential

-

A WebKitCredential, or NULL.

+

A WebKitCredential, or NULL.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AutomationSession.get_application_info.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AutomationSession.get_application_info.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AutomationSession.get_application_info.html 2026-04-16 17:54:34.586692600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AutomationSession.get_application_info.html 2026-07-09 07:33:40.679753800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -162,14 +162,14 @@

Type: WebKitApplicationInfo

-

The WebKitAutomationSession of session, or NULL if no one has been set.

+

The WebKitAutomationSession of session, or NULL if no one has been set.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AutomationSession.get_id.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AutomationSession.get_id.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AutomationSession.get_id.html 2026-04-16 17:54:34.612692600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AutomationSession.get_id.html 2026-07-09 07:33:40.683764000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,14 +169,14 @@

Type: const char*

-

The unique identifier of session.

+

The unique identifier of session.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AutomationSession.set_application_info.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AutomationSession.set_application_info.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.AutomationSession.set_application_info.html 2026-04-16 17:54:34.643692700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.AutomationSession.set_application_info.html 2026-07-09 07:33:40.690754000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -168,7 +168,7 @@
info

Type: WebKitApplicationInfo

-

A WebKitApplicationInfo.

+

A WebKitApplicationInfo.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardList.get_back_item.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_back_item.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardList.get_back_item.html 2026-04-16 17:54:34.755693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_back_item.html 2026-07-09 07:33:40.757978700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -173,15 +173,15 @@

Type: WebKitBackForwardListItem

-

The WebKitBackForwardListItem - preceding the current item or NULL.

+

The WebKitBackForwardListItem + preceding the current item or NULL.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardList.get_back_list.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_back_list.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardList.get_back_list.html 2026-04-16 17:54:34.786692900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_back_list.html 2026-07-09 07:33:40.766290700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -173,15 +173,15 @@

Type: A list of WebKitBackForwardListItem*

-

A GList of - items preceding the current item.

+

A GList of + items preceding the current item.

- +
The caller of the method takes ownership of the data container, but not the data inside it.
The caller of the method takes ownership of the returned data container, but not the data inside it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardList.get_back_list_with_limit.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_back_list_with_limit.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardList.get_back_list_with_limit.html 2026-04-16 17:54:34.814693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_back_list_with_limit.html 2026-07-09 07:33:40.778904400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -174,7 +174,7 @@
limit

Type: guint

-

The number of items to retrieve.

+

The number of items to retrieve.

@@ -206,15 +206,15 @@

Type: A list of WebKitBackForwardListItem*

-

A GList of - items preceding the current item limited by limit.

+

A GList of + items preceding the current item limited by limit.

- +
The caller of the method takes ownership of the data container, but not the data inside it.
The caller of the method takes ownership of the returned data container, but not the data inside it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardList.get_current_item.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_current_item.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardList.get_current_item.html 2026-04-16 17:54:34.841693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_current_item.html 2026-07-09 07:33:40.784378800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -173,15 +173,15 @@

Type: WebKitBackForwardListItem

-

A WebKitBackForwardListItem - or NULL if back_forward_list is empty.

+

A WebKitBackForwardListItem + or NULL if back_forward_list is empty.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardList.get_forward_item.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_forward_item.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardList.get_forward_item.html 2026-04-16 17:54:34.861693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_forward_item.html 2026-07-09 07:33:40.797142700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -173,15 +173,15 @@

Type: WebKitBackForwardListItem

-

The WebKitBackForwardListItem - following the current item or NULL.

+

The WebKitBackForwardListItem + following the current item or NULL.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardList.get_forward_list.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_forward_list.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardList.get_forward_list.html 2026-04-16 17:54:34.878693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_forward_list.html 2026-07-09 07:33:40.803497600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -173,15 +173,15 @@

Type: A list of WebKitBackForwardListItem*

-

A GList of - items following the current item.

+

A GList of + items following the current item.

- +
The caller of the method takes ownership of the data container, but not the data inside it.
The caller of the method takes ownership of the returned data container, but not the data inside it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardList.get_forward_list_with_limit.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_forward_list_with_limit.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardList.get_forward_list_with_limit.html 2026-04-16 17:54:34.898693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_forward_list_with_limit.html 2026-07-09 07:33:40.815473800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -174,7 +174,7 @@
limit

Type: guint

-

The number of items to retrieve.

+

The number of items to retrieve.

@@ -206,15 +206,15 @@

Type: A list of WebKitBackForwardListItem*

-

A GList of - items following the current item limited by limit.

+

A GList of + items following the current item limited by limit.

- +
The caller of the method takes ownership of the data container, but not the data inside it.
The caller of the method takes ownership of the returned data container, but not the data inside it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardList.get_length.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_length.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardList.get_length.html 2026-04-16 17:54:34.911693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_length.html 2026-07-09 07:33:40.819389600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -173,7 +173,7 @@

Type: guint

-

The length of back_forward_list.

+

The length of back_forward_list.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardList.get_nth_item.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_nth_item.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardList.get_nth_item.html 2026-04-16 17:54:34.927693100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardList.get_nth_item.html 2026-07-09 07:33:40.825829700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -174,7 +174,7 @@
index

Type: gint

-

The index of the item.

+

The index of the item.

@@ -206,15 +206,15 @@

Type: WebKitBackForwardListItem

-

The WebKitBackForwardListItem - located at the specified index relative to the current item or NULL.

+

The WebKitBackForwardListItem + located at the specified index relative to the current item or NULL.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardListItem.get_original_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardListItem.get_original_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardListItem.get_original_uri.html 2026-04-16 17:54:35.041693200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardListItem.get_original_uri.html 2026-07-09 07:33:40.888608700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -162,15 +162,15 @@

Type: const gchar*

-

The original URI of list_item or NULL - when the original URI is empty.

+

The original URI of list_item or NULL + when the original URI is empty.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardListItem.get_title.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardListItem.get_title.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardListItem.get_title.html 2026-04-16 17:54:35.060693300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardListItem.get_title.html 2026-07-09 07:33:40.898251000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -161,15 +161,15 @@

Type: const gchar*

-

The page title of list_item or NULL - when the title is empty.

+

The page title of list_item or NULL + when the title is empty.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardListItem.get_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardListItem.get_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.BackForwardListItem.get_uri.html 2026-04-16 17:54:35.087693500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.BackForwardListItem.get_uri.html 2026-07-09 07:33:40.913134000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -164,15 +164,15 @@

Type: const gchar*

-

The URI of list_item or NULL - when the URI is empty.

+

The URI of list_item or NULL + when the URI is empty.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ColorChooserRequest.cancel.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ColorChooserRequest.cancel.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ColorChooserRequest.cancel.html 2026-04-16 17:54:35.272693600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ColorChooserRequest.cancel.html 2026-07-09 07:33:41.013941300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ColorChooserRequest.finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ColorChooserRequest.finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ColorChooserRequest.finish.html 2026-04-16 17:54:35.286693600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ColorChooserRequest.finish.html 2026-07-09 07:33:41.021975800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ColorChooserRequest.get_element_rectangle.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ColorChooserRequest.get_element_rectangle.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ColorChooserRequest.get_element_rectangle.html 2026-04-16 17:54:35.299693600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ColorChooserRequest.get_element_rectangle.html 2026-07-09 07:33:41.027532000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -166,7 +166,7 @@
rect

Type: GdkRectangle

-

A GdkRectangle to fill in with the element area.

+

A GdkRectangle to fill in with the element area.

@@ -175,7 +175,7 @@ - +
The argument will be set by the function.
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ColorChooserRequest.get_rgba.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ColorChooserRequest.get_rgba.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ColorChooserRequest.get_rgba.html 2026-04-16 17:54:35.312693600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ColorChooserRequest.get_rgba.html 2026-07-09 07:33:41.033563100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -174,7 +174,7 @@
rgba

Type: GdkRGBA

-

A GdkRGBA to fill in with the current color.

+

A GdkRGBA to fill in with the current color.

@@ -183,7 +183,7 @@ - +
The argument will be set by the function.
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ColorChooserRequest.set_rgba.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ColorChooserRequest.set_rgba.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ColorChooserRequest.set_rgba.html 2026-04-16 17:54:35.334693700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ColorChooserRequest.set_rgba.html 2026-07-09 07:33:41.038747800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -174,7 +174,7 @@
rgba

Type: GdkRGBA

-

A pointer GdkRGBA.

+

A pointer GdkRGBA.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.append.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.append.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.append.html 2026-04-16 17:54:35.516693800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.append.html 2026-07-09 07:33:41.124661000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -186,7 +186,7 @@
item

Type: WebKitContextMenuItem

-

The WebKitContextMenuItem to add.

+

The WebKitContextMenuItem to add.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.first.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.first.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.first.html 2026-04-16 17:54:35.540694000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.first.html 2026-07-09 07:33:41.130976400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,15 +185,15 @@

Type: WebKitContextMenuItem

-

The first WebKitContextMenuItem of menu, - or NULL if the WebKitContextMenu is empty.

+

The first WebKitContextMenuItem of menu, + or NULL if the WebKitContextMenu is empty.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.get_event.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.get_event.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.get_event.html 2026-04-16 17:54:35.572694000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.get_event.html 2026-07-09 07:33:41.144383700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -199,14 +199,14 @@

Type: GdkEvent

-

The menu event or NULL.

+

The menu event or NULL.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.get_item_at_position.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.get_item_at_position.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.get_item_at_position.html 2026-04-16 17:54:35.588694000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.get_item_at_position.html 2026-07-09 07:33:41.148737200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -186,7 +186,7 @@
position

Type: guint

-

The position of the item, counting from 0

+

The position of the item, counting from 0

@@ -218,15 +218,15 @@

Type: WebKitContextMenuItem

-

The WebKitContextMenuItem at position position in menu, - or NULL if the position is off the end of the menu.

+

The WebKitContextMenuItem at position position in menu, + or NULL if the position is off the end of the menu.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.get_items.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.get_items.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.get_items.html 2026-04-16 17:54:35.602694000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.get_items.html 2026-07-09 07:33:41.159829900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,15 +185,15 @@

Type: A list of None

-

A GList of - WebKitContextMenuItems.

+

A GList of + WebKitContextMenuItems.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.get_n_items.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.get_n_items.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.get_n_items.html 2026-04-16 17:54:35.622694000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.get_n_items.html 2026-07-09 07:33:41.164449500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,7 +185,7 @@

Type: guint

-

The number of WebKitContextMenuItems in menu.

+

The number of WebKitContextMenuItems in menu.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.get_position.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.get_position.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.get_position.html 2026-04-16 17:54:35.646694200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.get_position.html 2026-07-09 07:33:41.169858200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -189,7 +189,7 @@
x

Type: gint*

-

Return location for the x coordinate.

+

Return location for the x coordinate.

@@ -206,7 +206,7 @@
y

Type: gint*

-

Return location for the y coordinate.

+

Return location for the y coordinate.

The argument will be set by the function.
@@ -238,7 +238,7 @@

Type: gboolean

-

TRUE if valid position coordinates are available, FALSE otherwise.

+

TRUE if valid position coordinates are available, FALSE otherwise.

The argument will be set by the function.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.get_user_data.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.get_user_data.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.get_user_data.html 2026-04-16 17:54:35.666694200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.get_user_data.html 2026-07-09 07:33:41.178378300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,14 +187,14 @@

Type: GVariant

-

The user data of menu, or NULL if menu doesn’t have user data.

+

The user data of menu, or NULL if menu doesn’t have user data.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.insert.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.insert.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.insert.html 2026-04-16 17:54:35.691694300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.insert.html 2026-07-09 07:33:41.189329400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -190,7 +190,7 @@
item

Type: WebKitContextMenuItem

-

The WebKitContextMenuItem to add.

+

The WebKitContextMenuItem to add.

@@ -207,7 +207,7 @@
position

Type: gint

-

The position to insert the item.

+

The position to insert the item.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.last.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.last.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.last.html 2026-04-16 17:54:35.708694200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.last.html 2026-07-09 07:33:41.196865300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,15 +185,15 @@

Type: WebKitContextMenuItem

-

The last WebKitContextMenuItem of menu, - or NULL if the WebKitContextMenu is empty.

+

The last WebKitContextMenuItem of menu, + or NULL if the WebKitContextMenu is empty.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.move_item.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.move_item.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.move_item.html 2026-04-16 17:54:35.741694200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.move_item.html 2026-07-09 07:33:41.202358700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -191,7 +191,7 @@
item

Type: WebKitContextMenuItem

-

The WebKitContextMenuItem to add.

+

The WebKitContextMenuItem to add.

@@ -208,7 +208,7 @@
position

Type: gint

-

The new position to move the item.

+

The new position to move the item.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.prepend.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.prepend.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.prepend.html 2026-04-16 17:54:35.765694400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.prepend.html 2026-07-09 07:33:41.210976100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -186,7 +186,7 @@
item

Type: WebKitContextMenuItem

-

The WebKitContextMenuItem to add.

+

The WebKitContextMenuItem to add.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.remove.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.remove.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.remove.html 2026-04-16 17:54:35.802694300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.remove.html 2026-07-09 07:33:41.219076600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@
item

Type: WebKitContextMenuItem

-

The WebKitContextMenuItem to remove.

+

The WebKitContextMenuItem to remove.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.remove_all.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.remove_all.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.remove_all.html 2026-04-16 17:54:35.818694400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.remove_all.html 2026-07-09 07:33:41.221520400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.set_user_data.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.set_user_data.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenu.set_user_data.html 2026-04-16 17:54:35.831694400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenu.set_user_data.html 2026-07-09 07:33:41.227488800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -189,7 +189,7 @@
user_data

Type: GVariant

-

A GVariant.

+

A GVariant.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_gaction.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_gaction.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_gaction.html 2026-04-16 17:54:36.241695000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_gaction.html 2026-07-09 07:33:41.311487200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,15 +169,15 @@

Type: GAction

-

The GAction associated to the WebKitContextMenuItem, - or NULL if item is a separator.

+

The GAction associated to the WebKitContextMenuItem, + or NULL if item is a separator.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_gaction_target.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_gaction_target.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_gaction_target.html 2026-04-16 17:54:36.270695000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_gaction_target.html 2026-07-09 07:33:41.321596100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,16 +169,16 @@

Type: GVariant

-

The target GVariant of the WebKitContextMenuItem, +

The target GVariant of the WebKitContextMenuItem, or NULL if item was not created with webkit_context_menu_item_new_from_gaction() - or if no target was specified.

+ or if no target was specified.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_stock_action.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_stock_action.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_stock_action.html 2026-04-16 17:54:36.302695000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_stock_action.html 2026-07-09 07:33:41.324699200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -173,7 +173,7 @@

Type: WebKitContextMenuAction

-

The WebKitContextMenuAction of item.

+

The WebKitContextMenuAction of item.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_submenu.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_submenu.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_submenu.html 2026-04-16 17:54:36.340695100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_submenu.html 2026-07-09 07:33:41.327797000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,15 +169,15 @@

Type: WebKitContextMenu

-

The WebKitContextMenu representing the submenu of - item or NULL if item doesn’t have a submenu.

+

The WebKitContextMenu representing the submenu of + item or NULL if item doesn’t have a submenu.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_title.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_title.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_title.html 2026-04-16 17:54:36.364695000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.get_title.html 2026-07-09 07:33:41.330469000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,14 +169,14 @@

Type: const gchar*

-

The title of item, or NULL if item is a separator.

+

The title of item, or NULL if item is a separator.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenuItem.is_separator.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.is_separator.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenuItem.is_separator.html 2026-04-16 17:54:36.394695000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.is_separator.html 2026-07-09 07:33:41.333525000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,7 +169,7 @@

Type: gboolean

-

TRUE is item is a separator or FALSE otherwise.

+

TRUE is item is a separator or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenuItem.set_submenu.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.set_submenu.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ContextMenuItem.set_submenu.html 2026-04-16 17:54:36.423695000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ContextMenuItem.set_submenu.html 2026-07-09 07:33:41.336166400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -172,7 +172,7 @@
submenu

Type: WebKitContextMenu

-

A WebKitContextMenu.

+

A WebKitContextMenu.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.add_cookie.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.add_cookie.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.add_cookie.html 2026-04-16 17:54:36.526695300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.add_cookie.html 2026-07-09 07:33:41.475943300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -189,7 +189,7 @@
cookie

Type: SoupCookie

-

The SoupCookie to be added.

+

The SoupCookie to be added.

The argument can be NULL.
@@ -206,7 +206,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -223,7 +223,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the request is satisfied.

+

A GAsyncReadyCallback to call when the request is satisfied.

The argument can be NULL.
@@ -240,7 +240,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.add_cookie_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.add_cookie_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.add_cookie_finish.html 2026-04-16 17:54:36.535695300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.add_cookie_finish.html 2026-07-09 07:33:41.479713000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,7 +185,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -229,7 +229,7 @@

Type: gboolean

-

TRUE if the cookie was added or FALSE in case of error.

+

TRUE if the cookie was added or FALSE in case of error.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.delete_cookie.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.delete_cookie.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.delete_cookie.html 2026-04-16 17:54:36.548695300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.delete_cookie.html 2026-07-09 07:33:41.485045700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -189,7 +189,7 @@
cookie

Type: SoupCookie

-

The SoupCookie to be deleted.

+

The SoupCookie to be deleted.

@@ -206,7 +206,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -223,7 +223,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the request is satisfied.

+

A GAsyncReadyCallback to call when the request is satisfied.

The argument can be NULL.
@@ -240,7 +240,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.delete_cookie_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.delete_cookie_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.delete_cookie_finish.html 2026-04-16 17:54:36.557695400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.delete_cookie_finish.html 2026-07-09 07:33:41.488911600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,7 +185,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -229,7 +229,7 @@

Type: gboolean

-

TRUE if the cookie was deleted or FALSE in case of error.

+

TRUE if the cookie was deleted or FALSE in case of error.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.get_accept_policy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.get_accept_policy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.get_accept_policy.html 2026-04-16 17:54:36.568695300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.get_accept_policy.html 2026-07-09 07:33:41.493392700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -191,7 +191,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -208,7 +208,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the request is satisfied.

+

A GAsyncReadyCallback to call when the request is satisfied.

The argument can be NULL.
@@ -225,7 +225,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.get_accept_policy_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.get_accept_policy_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.get_accept_policy_finish.html 2026-04-16 17:54:36.577695400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.get_accept_policy_finish.html 2026-07-09 07:33:41.497074100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,7 +185,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -229,7 +229,7 @@

Type: WebKitCookieAcceptPolicy

-

The cookie acceptance policy of cookie_manager as a WebKitCookieAcceptPolicy.

+

The cookie acceptance policy of cookie_manager as a WebKitCookieAcceptPolicy.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.get_all_cookies.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.get_all_cookies.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.get_all_cookies.html 2026-04-16 17:54:36.588695500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.get_all_cookies.html 2026-07-09 07:33:41.502301700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -188,7 +188,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -205,7 +205,7 @@
callback

Type: GAsyncReadyCallback

-

(closure user_data): a GAsyncReadyCallback to call when the request is satisfied.

+

(closure user_data): a GAsyncReadyCallback to call when the request is satisfied.

The argument can be NULL.
@@ -222,7 +222,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.get_all_cookies_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.get_all_cookies_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.get_all_cookies_finish.html 2026-04-16 17:54:36.597695400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.get_all_cookies_finish.html 2026-07-09 07:33:41.506830000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -231,14 +231,14 @@

Type: A list of SoupCookie*

-

A GList of SoupCookie instances.

+

A GList of SoupCookie instances.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.get_cookies.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.get_cookies.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.get_cookies.html 2026-04-16 17:54:36.610695400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.get_cookies.html 2026-07-09 07:33:41.513556200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -191,7 +191,7 @@
uri

Type: const gchar*

-

The URI associated to the cookies to be retrieved.

+

The URI associated to the cookies to be retrieved.

@@ -208,7 +208,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -225,7 +225,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the request is satisfied.

+

A GAsyncReadyCallback to call when the request is satisfied.

The argument can be NULL.
@@ -242,7 +242,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.get_cookies_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.get_cookies_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.get_cookies_finish.html 2026-04-16 17:54:36.619695400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.get_cookies_finish.html 2026-07-09 07:33:41.518177000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -231,14 +231,14 @@

Type: A list of SoupCookie*

-

A GList of SoupCookie instances.

+

A GList of SoupCookie instances.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.replace_cookies.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.replace_cookies.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.replace_cookies.html 2026-04-16 17:54:36.632695400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.replace_cookies.html 2026-07-09 07:33:41.524650600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -189,7 +189,7 @@
cookies

Type: A list of SoupCookie*

-

A GList of SoupCookie to be added.

+

A GList of SoupCookie to be added.

@@ -206,7 +206,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -223,7 +223,7 @@
callback

Type: GAsyncReadyCallback

-

(closure user_data): a GAsyncReadyCallback to call when the request is satisfied.

+

(closure user_data): a GAsyncReadyCallback to call when the request is satisfied.

The argument can be NULL.
@@ -240,7 +240,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.replace_cookies_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.replace_cookies_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.replace_cookies_finish.html 2026-04-16 17:54:36.641695500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.replace_cookies_finish.html 2026-07-09 07:33:41.529032000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,7 +185,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -229,7 +229,7 @@

Type: gboolean

-

TRUE if the cookies were added or FALSE in case of error.

+

TRUE if the cookies were added or FALSE in case of error.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.set_accept_policy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.set_accept_policy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.set_accept_policy.html 2026-04-16 17:54:36.649695400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.set_accept_policy.html 2026-07-09 07:33:41.532511200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -188,7 +188,7 @@
policy

Type: WebKitCookieAcceptPolicy

-

A WebKitCookieAcceptPolicy.

+

A WebKitCookieAcceptPolicy.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.set_persistent_storage.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.set_persistent_storage.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.CookieManager.set_persistent_storage.html 2026-04-16 17:54:36.659695600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.CookieManager.set_persistent_storage.html 2026-07-09 07:33:41.537260000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -193,7 +193,7 @@
filename

Type: const gchar*

-

The filename to read to/write from.

+

The filename to read to/write from.

@@ -210,7 +210,7 @@
storage

Type: WebKitCookiePersistentStorage

-

A WebKitCookiePersistentStorage.

+

A WebKitCookiePersistentStorage.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Credential.copy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.copy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Credential.copy.html 2026-04-16 17:54:33.748691600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.copy.html 2026-07-09 07:33:40.364870000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,14 +169,14 @@

Type: WebKitCredential

-

A copy of passed in WebKitCredential.

+

A copy of passed in WebKitCredential.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Credential.free.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.free.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Credential.free.html 2026-04-16 17:54:33.776691400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.free.html 2026-07-09 07:33:40.375506400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Credential.get_certificate.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.get_certificate.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Credential.get_certificate.html 2026-04-16 17:54:33.816691600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.get_certificate.html 2026-07-09 07:33:40.391159500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,14 +169,14 @@

Type: GTlsCertificate

-

A GTlsCertificate, or NULL.

+

A GTlsCertificate, or NULL.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Credential.get_password.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.get_password.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Credential.get_password.html 2026-04-16 17:54:33.867691800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.get_password.html 2026-07-09 07:33:40.407339800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,14 +169,14 @@

Type: const gchar*

-

The password stored in the WebKitCredential.

+

The password stored in the WebKitCredential.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Credential.get_persistence.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.get_persistence.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Credential.get_persistence.html 2026-04-16 17:54:33.913691800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.get_persistence.html 2026-07-09 07:33:40.416002000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,7 +169,7 @@

Type: WebKitCredentialPersistence

-

The WebKitCredentialPersistence stored in the WebKitCredential.

+

The WebKitCredentialPersistence stored in the WebKitCredential.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Credential.get_username.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.get_username.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Credential.get_username.html 2026-04-16 17:54:33.964691900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.get_username.html 2026-07-09 07:33:40.423505500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,14 +169,14 @@

Type: const gchar*

-

The username stored in the WebKitCredential.

+

The username stored in the WebKitCredential.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Credential.has_password.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.has_password.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Credential.has_password.html 2026-04-16 17:54:34.010692000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Credential.has_password.html 2026-07-09 07:33:40.450685000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,7 +169,7 @@

Type: gboolean

-

TRUE if the credential has a password or FALSE otherwise.

+

TRUE if the credential has a password or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.cancel.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.cancel.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.cancel.html 2026-04-16 17:54:36.784695600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.cancel.html 2026-07-09 07:33:41.577322700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -144,7 +144,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.get_allow_overwrite.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_allow_overwrite.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.get_allow_overwrite.html 2026-04-16 17:54:36.791695600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_allow_overwrite.html 2026-07-09 07:33:41.580637500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -144,7 +144,7 @@ Description - [src] + [src] @@ -188,7 +188,7 @@

Type: gboolean

-

The current value of the WebKitDownload:allow-overwrite property.

+

The current value of the WebKitDownload:allow-overwrite property.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.get_destination.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_destination.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.get_destination.html 2026-04-16 17:54:36.798695800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_destination.html 2026-07-09 07:33:41.583534700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,14 +187,14 @@

Type: const gchar*

-

The destination or NULL.

+

The destination or NULL.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.get_elapsed_time.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_elapsed_time.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.get_elapsed_time.html 2026-04-16 17:54:36.805695800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_elapsed_time.html 2026-07-09 07:33:41.585918400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -144,7 +144,7 @@ Description - [src] + [src] @@ -179,7 +179,7 @@

Type: gdouble

-

Seconds since the download was started.

+

Seconds since the download was started.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.get_estimated_progress.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_estimated_progress.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.get_estimated_progress.html 2026-04-16 17:54:36.813695700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_estimated_progress.html 2026-07-09 07:33:41.589254000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -144,7 +144,7 @@ Description - [src] + [src] @@ -188,8 +188,8 @@

Type: gdouble

-

An estimate of the of the percent complete for a download - as a range from 0.0 to 1.0.

+

An estimate of the of the percent complete for a download + as a range from 0.0 to 1.0.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.get_received_data_length.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_received_data_length.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.get_received_data_length.html 2026-04-16 17:54:36.820695600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_received_data_length.html 2026-07-09 07:33:41.591763300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -144,7 +144,7 @@ Description - [src] + [src] @@ -179,7 +179,7 @@

Type: guint64

-

The amount of bytes already downloaded.

+

The amount of bytes already downloaded.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.get_request.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_request.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.get_request.html 2026-04-16 17:54:36.827695800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_request.html 2026-07-09 07:33:41.594578700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -177,14 +177,14 @@

Type: WebKitURIRequest

-

The WebKitURIRequest of download.

+

The WebKitURIRequest of download.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.get_response.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_response.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.get_response.html 2026-04-16 17:54:36.834695800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_response.html 2026-07-09 07:33:41.597457600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -144,7 +144,7 @@ Description - [src] + [src] @@ -189,15 +189,15 @@

Type: WebKitURIResponse

-

The WebKitURIResponse, or NULL if - the response hasn’t been received yet.

+

The WebKitURIResponse, or NULL if + the response hasn’t been received yet.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.get_web_view.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_web_view.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.get_web_view.html 2026-04-16 17:54:36.842695700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.get_web_view.html 2026-07-09 07:33:41.600931400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -144,7 +144,7 @@ Description - [src] + [src] @@ -177,15 +177,15 @@

Type: WebKitWebView

-

The WebKitWebView that initiated download, - or NULL if download was not initiated by a WebKitWebView.

+

The WebKitWebView that initiated download, + or NULL if download was not initiated by a WebKitWebView.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.set_allow_overwrite.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.set_allow_overwrite.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.set_allow_overwrite.html 2026-04-16 17:54:36.849695700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.set_allow_overwrite.html 2026-07-09 07:33:41.603593800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -145,7 +145,7 @@ Description - [src] + [src] @@ -189,7 +189,7 @@
allowed

Type: gboolean

-

The new value for the WebKitDownload:allow-overwrite property.

+

The new value for the WebKitDownload:allow-overwrite property.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.set_destination.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.set_destination.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Download.set_destination.html 2026-04-16 17:54:36.858695700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Download.set_destination.html 2026-07-09 07:33:41.607246900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -189,7 +189,7 @@
destination

Type: const gchar*

-

The destination.

+

The destination.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.EditorState.get_typing_attributes.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.EditorState.get_typing_attributes.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.EditorState.get_typing_attributes.html 2026-04-16 17:54:36.961696000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.EditorState.get_typing_attributes.html 2026-07-09 07:33:41.651743000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@

Type: guint

-

A bitmask of WebKitEditorTypingAttributes flags.

+

A bitmask of WebKitEditorTypingAttributes flags.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.EditorState.is_copy_available.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.EditorState.is_copy_available.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.EditorState.is_copy_available.html 2026-04-16 17:54:36.967696000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.EditorState.is_copy_available.html 2026-07-09 07:33:41.654169600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -167,7 +167,7 @@

Type: gboolean

-

TRUE if copy is currently available.

+

TRUE if copy is currently available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.EditorState.is_cut_available.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.EditorState.is_cut_available.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.EditorState.is_cut_available.html 2026-04-16 17:54:36.973696000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.EditorState.is_cut_available.html 2026-07-09 07:33:41.656809600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -167,7 +167,7 @@

Type: gboolean

-

TRUE if cut is currently available.

+

TRUE if cut is currently available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.EditorState.is_paste_available.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.EditorState.is_paste_available.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.EditorState.is_paste_available.html 2026-04-16 17:54:36.979696000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.EditorState.is_paste_available.html 2026-07-09 07:33:41.659142700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -167,7 +167,7 @@

Type: gboolean

-

TRUE if paste is currently available.

+

TRUE if paste is currently available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.EditorState.is_redo_available.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.EditorState.is_redo_available.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.EditorState.is_redo_available.html 2026-04-16 17:54:36.985696000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.EditorState.is_redo_available.html 2026-07-09 07:33:41.661748200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -167,7 +167,7 @@

Type: gboolean

-

TRUE if redo is currently available.

+

TRUE if redo is currently available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.EditorState.is_undo_available.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.EditorState.is_undo_available.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.EditorState.is_undo_available.html 2026-04-16 17:54:36.991696000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.EditorState.is_undo_available.html 2026-07-09 07:33:41.663749700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -167,7 +167,7 @@

Type: gboolean

-

TRUE if undo is currently available.

+

TRUE if undo is currently available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FaviconDatabase.clear.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FaviconDatabase.clear.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FaviconDatabase.clear.html 2026-04-16 17:54:37.056696200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FaviconDatabase.clear.html 2026-07-09 07:33:41.693336500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FaviconDatabase.get_favicon.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FaviconDatabase.get_favicon.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FaviconDatabase.get_favicon.html 2026-04-16 17:54:37.069696200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FaviconDatabase.get_favicon.html 2026-07-09 07:33:41.699479000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -173,7 +173,7 @@
page_uri

Type: const gchar*

-

URI of the page for which we want to retrieve the favicon.

+

URI of the page for which we want to retrieve the favicon.

@@ -190,7 +190,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL.

+

A GCancellable or NULL.

@@ -207,8 +207,8 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the request is - satisfied or NULL if you don’t care about the result.

+

A GAsyncReadyCallback to call when the request is + satisfied or NULL if you don’t care about the result.

The argument can be NULL.
@@ -225,7 +225,7 @@
user_data

Type: gpointer

-

The data to pass to callback.

+

The data to pass to callback.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FaviconDatabase.get_favicon_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FaviconDatabase.get_favicon_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FaviconDatabase.get_favicon_finish.html 2026-04-16 17:54:37.077696000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FaviconDatabase.get_favicon_finish.html 2026-07-09 07:33:41.703479000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@
result

Type: GAsyncResult

-

A GAsyncResult obtained from the GAsyncReadyCallback passed to webkit_favicon_database_get_favicon()

+

A GAsyncResult obtained from the GAsyncReadyCallback passed to webkit_favicon_database_get_favicon()

The argument can be NULL.
@@ -209,14 +209,14 @@

Type: GdkTexture

-

A new favicon image, or NULL in case of error.

+

A new favicon image, or NULL in case of error.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FaviconDatabase.get_favicon_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FaviconDatabase.get_favicon_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FaviconDatabase.get_favicon_uri.html 2026-04-16 17:54:37.086696100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FaviconDatabase.get_favicon_uri.html 2026-07-09 07:33:41.710908700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -164,7 +164,7 @@
page_uri

Type: const gchar*

-

URI of the page containing the icon.

+

URI of the page containing the icon.

@@ -196,15 +196,15 @@

Type: gchar*

-

A newly allocated URI for the favicon, or NULL if the -database doesn’t have a favicon for page_uri.

+

A newly allocated URI for the favicon, or NULL if the +database doesn’t have a favicon for page_uri.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Feature.get_category.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.get_category.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Feature.get_category.html 2026-04-16 17:54:34.127692000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.get_category.html 2026-07-09 07:33:40.479504300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -173,14 +173,14 @@

Type: const char*

-

Feature category.

+

Feature category.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Feature.get_default_value.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.get_default_value.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Feature.get_default_value.html 2026-04-16 17:54:34.163692000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.get_default_value.html 2026-07-09 07:33:40.489650200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,7 +175,7 @@

Type: gboolean

-

Whether the feature is enabled by default.

+

Whether the feature is enabled by default.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Feature.get_details.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.get_details.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Feature.get_details.html 2026-04-16 17:54:34.217692100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.get_details.html 2026-07-09 07:33:40.497497600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -178,14 +178,14 @@

Type: const char*

-

Feature description.

+

Feature description.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Feature.get_identifier.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.get_identifier.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Feature.get_identifier.html 2026-04-16 17:54:34.244692000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.get_identifier.html 2026-07-09 07:33:40.513332100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: const char*

-

The identifier string for the feature.

+

The identifier string for the feature.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Feature.get_name.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.get_name.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Feature.get_name.html 2026-04-16 17:54:34.275692200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.get_name.html 2026-07-09 07:33:40.523503300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: const char*

-

Short feature name.

+

Short feature name.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Feature.get_status.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.get_status.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Feature.get_status.html 2026-04-16 17:54:34.301692200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.get_status.html 2026-07-09 07:33:40.537495000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,7 +171,7 @@

Type: WebKitFeatureStatus

-

Feature status.

+

Feature status.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Feature.ref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.ref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Feature.ref.html 2026-04-16 17:54:34.325692200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.ref.html 2026-07-09 07:33:40.564858400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -172,14 +172,14 @@

Type: WebKitFeature

-

The same feature with an additional reference.

+

The same feature with an additional reference.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Feature.unref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.unref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Feature.unref.html 2026-04-16 17:54:34.353692300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Feature.unref.html 2026-07-09 07:33:40.579502300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FeatureList.get.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FeatureList.get.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FeatureList.get.html 2026-04-16 17:54:34.422692300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FeatureList.get.html 2026-07-09 07:33:40.617892300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -164,7 +164,7 @@
index

Type: gsize

-

Index of the feature.

+

Index of the feature.

@@ -196,14 +196,14 @@

Type: WebKitFeature

-

The feature at index.

+

The feature at index.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FeatureList.get_length.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FeatureList.get_length.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FeatureList.get_length.html 2026-04-16 17:54:34.445692500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FeatureList.get_length.html 2026-07-09 07:33:40.624536500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -103,7 +103,7 @@
-

since: 2.42

+

@@ -140,7 +140,7 @@
-

Available since: 2.42

+ @@ -163,8 +163,8 @@

Type: gsize

-

Number of elements.

-

Since 2.42

+

Number of elements.

+

Since 2.42

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FeatureList.ref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FeatureList.ref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FeatureList.ref.html 2026-04-16 17:54:34.468692500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FeatureList.ref.html 2026-07-09 07:33:40.635501100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -164,14 +164,14 @@

Type: WebKitFeatureList

-

The same feature_list with an additional reference.

+

The same feature_list with an additional reference.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FeatureList.unref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FeatureList.unref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FeatureList.unref.html 2026-04-16 17:54:34.497692600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FeatureList.unref.html 2026-07-09 07:33:40.651045300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FileChooserRequest.cancel.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FileChooserRequest.cancel.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FileChooserRequest.cancel.html 2026-04-16 17:54:37.157696200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FileChooserRequest.cancel.html 2026-07-09 07:33:41.735967000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_mime_types.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_mime_types.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_mime_types.html 2026-04-16 17:54:37.166696300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_mime_types.html 2026-07-09 07:33:41.739452600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -181,18 +181,18 @@

Type: An array of utf8

-

A +

A NULL-terminated array of strings if a list of accepted MIME types is defined or NULL otherwise, meaning that any MIME type should be accepted. This array and its contents are owned by WebKit and -should not be modified or freed.

+should not be modified or freed.

- +
The array is NULL-terminated.
The data is owned by the instance.
The returned data is owned by the instance.
Each element is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_mime_types_filter.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_mime_types_filter.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_mime_types_filter.html 2026-04-16 17:54:37.174696200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_mime_types_filter.html 2026-07-09 07:33:41.742515300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -174,16 +174,16 @@

Type: GtkFileFilter

-

A GtkFileFilter if a list of accepted +

A GtkFileFilter if a list of accepted MIME types is defined or NULL otherwise. The returned object is -owned by WebKit should not be modified or freed.

+owned by WebKit should not be modified or freed.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_select_multiple.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_select_multiple.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_select_multiple.html 2026-04-16 17:54:37.182696300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_select_multiple.html 2026-07-09 07:33:41.745885100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@

Type: gboolean

-

TRUE if the file chooser should allow selecting multiple files or FALSE otherwise.

+

TRUE if the file chooser should allow selecting multiple files or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_selected_files.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_selected_files.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_selected_files.html 2026-04-16 17:54:37.190696200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FileChooserRequest.get_selected_files.html 2026-07-09 07:33:41.749084200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,17 +183,17 @@

Type: An array of utf8

-

A +

A NULL-terminated array of strings if there are selected files associated with the request or NULL otherwise. This array and its -contents are owned by WebKit and should not be modified or freed.

+contents are owned by WebKit and should not be modified or freed.

- +
The array is NULL-terminated.
The data is owned by the instance.
The returned data is owned by the instance.
Each element is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FileChooserRequest.select_files.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FileChooserRequest.select_files.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FileChooserRequest.select_files.html 2026-04-16 17:54:37.196696300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FileChooserRequest.select_files.html 2026-07-09 07:33:41.751857500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -168,8 +168,8 @@
files

Type: An array of gchar*

-

A -NULL-terminated array of strings, containing paths to local files.

+

A +NULL-terminated array of strings, containing paths to local files.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FindController.count_matches.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.count_matches.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FindController.count_matches.html 2026-04-16 17:54:37.280696400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.count_matches.html 2026-07-09 07:33:41.782684000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -180,7 +180,7 @@
search_text

Type: const gchar*

-

The text to look for.

+

The text to look for.

@@ -197,7 +197,7 @@
find_options

Type: guint32

-

A bitmask with the WebKitFindOptions used in the search.

+

A bitmask with the WebKitFindOptions used in the search.

@@ -214,7 +214,7 @@
max_match_count

Type: guint

-

The maximum number of matches allowed in the search.

+

The maximum number of matches allowed in the search.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FindController.get_max_match_count.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.get_max_match_count.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FindController.get_max_match_count.html 2026-04-16 17:54:37.287696400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.get_max_match_count.html 2026-07-09 07:33:41.785791200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -184,7 +184,7 @@

Type: guint

-

The maximum number of matches to report.

+

The maximum number of matches to report.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FindController.get_options.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.get_options.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FindController.get_options.html 2026-04-16 17:54:37.294696300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.get_options.html 2026-07-09 07:33:41.788486200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,8 +183,8 @@

Type: guint32

-

A bitmask containing the WebKitFindOptions associated -with the current search.

+

A bitmask containing the WebKitFindOptions associated +with the current search.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FindController.get_search_text.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.get_search_text.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FindController.get_search_text.html 2026-04-16 17:54:37.302696500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.get_search_text.html 2026-07-09 07:33:41.791501500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -176,14 +176,14 @@

Type: const gchar*

-

The text to look for in the WebKitWebView.

+

The text to look for in the WebKitWebView.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FindController.get_web_view.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.get_web_view.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FindController.get_web_view.html 2026-04-16 17:54:37.308696500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.get_web_view.html 2026-07-09 07:33:41.794116000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -184,14 +184,14 @@

Type: WebKitWebView

-

The WebKitWebView.

+

The WebKitWebView.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FindController.search.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.search.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FindController.search.html 2026-04-16 17:54:37.322696400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.search.html 2026-07-09 07:33:41.799391000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -191,7 +191,7 @@
search_text

Type: const gchar*

-

The text to look for.

+

The text to look for.

@@ -208,7 +208,7 @@
find_options

Type: guint32

-

A bitmask with the WebKitFindOptions used in the search.

+

A bitmask with the WebKitFindOptions used in the search.

@@ -225,7 +225,7 @@
max_match_count

Type: guint

-

The maximum number of matches allowed in the search.

+

The maximum number of matches allowed in the search.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FindController.search_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.search_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FindController.search_finish.html 2026-04-16 17:54:37.328696500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.search_finish.html 2026-07-09 07:33:41.801683400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FindController.search_next.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.search_next.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FindController.search_next.html 2026-04-16 17:54:37.333696400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.search_next.html 2026-07-09 07:33:41.803631800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FindController.search_previous.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.search_previous.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FindController.search_previous.html 2026-04-16 17:54:37.338696500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FindController.search_previous.html 2026-07-09 07:33:41.805529600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FormSubmissionRequest.list_text_fields.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FormSubmissionRequest.list_text_fields.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FormSubmissionRequest.list_text_fields.html 2026-04-16 17:54:37.433696500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FormSubmissionRequest.list_text_fields.html 2026-07-09 07:33:41.837370200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -128,7 +128,7 @@ Description - [src] + [src] @@ -166,7 +166,7 @@
field_names

Type: An array of utf8

-

names of the text fields in the form.

+

names of the text fields in the form.

@@ -175,7 +175,7 @@ - +
The argument will be set by the function.
The data is owned by the instance.
The returned data is owned by the instance.
Each element is a NUL terminated UTF-8 string.
@@ -183,7 +183,7 @@
field_values

Type: An array of utf8

-

values of the text fields in the form.

+

values of the text fields in the form.

@@ -192,7 +192,7 @@ - +
The argument will be set by the function.
The data is owned by the instance.
The returned data is owned by the instance.
Each element is a NUL terminated UTF-8 string.
@@ -215,7 +215,7 @@

Type: gboolean

-

TRUE if the form contains text fields, or FALSE otherwise.

+

TRUE if the form contains text fields, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FormSubmissionRequest.submit.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FormSubmissionRequest.submit.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.FormSubmissionRequest.submit.html 2026-04-16 17:54:37.437696700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.FormSubmissionRequest.submit.html 2026-07-09 07:33:41.839005200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -126,7 +126,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationManager.failed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationManager.failed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationManager.failed.html 2026-04-16 17:54:37.490696700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationManager.failed.html 2026-07-09 07:33:41.862537000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -162,7 +162,7 @@
error_message

Type: const char*

-

The error message.

+

The error message.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationManager.get_enable_high_accuracy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationManager.get_enable_high_accuracy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationManager.get_enable_high_accuracy.html 2026-04-16 17:54:37.496696700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationManager.get_enable_high_accuracy.html 2026-07-09 07:33:41.864818600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,7 +169,7 @@

Type: gboolean

-

Whether the setting is enabled.

+

Whether the setting is enabled.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationManager.update_position.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationManager.update_position.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationManager.update_position.html 2026-04-16 17:54:37.503696700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationManager.update_position.html 2026-07-09 07:33:41.867777800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -162,7 +162,7 @@
position

Type: WebKitGeolocationPosition

-

A WebKitGeolocationPosition.

+

A WebKitGeolocationPosition.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationPosition.copy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.copy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationPosition.copy.html 2026-04-16 17:54:34.530692600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.copy.html 2026-07-09 07:33:40.670455700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,14 +169,14 @@

Type: WebKitGeolocationPosition

-

A copy of position.

+

A copy of position.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationPosition.free.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.free.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationPosition.free.html 2026-04-16 17:54:34.536692600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.free.html 2026-07-09 07:33:40.679753800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_altitude.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_altitude.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_altitude.html 2026-04-16 17:54:34.542692700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_altitude.html 2026-07-09 07:33:40.694399600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -170,7 +170,7 @@
altitude

Type: double

-

Altitude in meters.

+

Altitude in meters.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_altitude_accuracy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_altitude_accuracy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_altitude_accuracy.html 2026-04-16 17:54:34.549692600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_altitude_accuracy.html 2026-07-09 07:33:40.702860000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -170,7 +170,7 @@
altitude_accuracy

Type: double

-

Accuracy of position altitude in meters.

+

Accuracy of position altitude in meters.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_heading.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_heading.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_heading.html 2026-04-16 17:54:34.556692600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_heading.html 2026-07-09 07:33:40.707275600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -172,7 +172,7 @@
heading

Type: double

-

Heading in degrees.

+

Heading in degrees.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_speed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_speed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_speed.html 2026-04-16 17:54:34.564692500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_speed.html 2026-07-09 07:33:40.712018000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -170,7 +170,7 @@
speed

Type: double

-

Speed in meters per second.

+

Speed in meters per second.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_timestamp.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_timestamp.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_timestamp.html 2026-04-16 17:54:34.583692600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.GeolocationPosition.set_timestamp.html 2026-07-09 07:33:40.721220700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,7 +171,7 @@
timestamp

Type: guint64

-

Timestamp in seconds since the epoch, or 0 to use current time.

+

Timestamp in seconds since the epoch, or 0 to use current time.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_editable.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_editable.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_editable.html 2026-04-16 17:54:37.652696800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_editable.html 2026-07-09 07:33:41.922448400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -180,8 +180,8 @@

Type: gboolean

-

TRUE if there’s an editable element at the coordinates of the hit_test_result, - or FALSE otherwise.

+

TRUE if there’s an editable element at the coordinates of the hit_test_result, + or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_image.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_image.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_image.html 2026-04-16 17:54:37.668696900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_image.html 2026-07-09 07:33:41.928068200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -180,8 +180,8 @@

Type: gboolean

-

TRUE if there’s an image element in the coordinates of the Hit Test, - or FALSE otherwise.

+

TRUE if there’s an image element in the coordinates of the Hit Test, + or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_link.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_link.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_link.html 2026-04-16 17:54:37.678696900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_link.html 2026-07-09 07:33:41.931688300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -180,8 +180,8 @@

Type: gboolean

-

TRUE if there’s a link element in the coordinates of the Hit Test, - or FALSE otherwise.

+

TRUE if there’s a link element in the coordinates of the Hit Test, + or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_media.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_media.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_media.html 2026-04-16 17:54:37.686697000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_media.html 2026-07-09 07:33:41.935123200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -180,8 +180,8 @@

Type: gboolean

-

TRUE if there’s a media element in the coordinates of the Hit Test, - or FALSE otherwise.

+

TRUE if there’s a media element in the coordinates of the Hit Test, + or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_scrollbar.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_scrollbar.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_scrollbar.html 2026-04-16 17:54:37.693697000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_scrollbar.html 2026-07-09 07:33:41.937972500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -180,8 +180,8 @@

Type: gboolean

-

TRUE if there’s a scrollbar element at the coordinates of the hit_test_result, - or FALSE otherwise.

+

TRUE if there’s a scrollbar element at the coordinates of the hit_test_result, + or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_selection.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_selection.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_selection.html 2026-04-16 17:54:37.702697000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.context_is_selection.html 2026-07-09 07:33:41.941106000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -180,8 +180,8 @@

Type: gboolean

-

TRUE if there’s a selected element at the coordinates of the hit_test_result, - or FALSE otherwise.

+

TRUE if there’s a selected element at the coordinates of the hit_test_result, + or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.get_context.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.get_context.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.get_context.html 2026-04-16 17:54:37.708697000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.get_context.html 2026-07-09 07:33:41.943313800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@

Type: guint

-

A bitmask of WebKitHitTestResultContext flags.

+

A bitmask of WebKitHitTestResultContext flags.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.get_image_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.get_image_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.get_image_uri.html 2026-04-16 17:54:37.716697000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.get_image_uri.html 2026-07-09 07:33:41.946518400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,15 +187,15 @@

Type: const gchar*

-

The URI of the image element in the coordinates of the Hit Test, - or NULL if there isn’t an image element in hit_test_result context.

+

The URI of the image element in the coordinates of the Hit Test, + or NULL if there isn’t an image element in hit_test_result context.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.get_link_label.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.get_link_label.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.get_link_label.html 2026-04-16 17:54:37.723697000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.get_link_label.html 2026-07-09 07:33:41.949331300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,16 +187,16 @@

Type: const gchar*

-

The label of the link element in the coordinates of the Hit Test, +

The label of the link element in the coordinates of the Hit Test, or NULL if there isn’t a link element in hit_test_result context or the - link element doesn’t have a label.

+ link element doesn’t have a label.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.get_link_title.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.get_link_title.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.get_link_title.html 2026-04-16 17:54:37.730697000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.get_link_title.html 2026-07-09 07:33:41.952423600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,16 +187,16 @@

Type: const gchar*

-

The title of the link element in the coordinates of the Hit Test, +

The title of the link element in the coordinates of the Hit Test, or NULL if there isn’t a link element in hit_test_result context or the - link element doesn’t have a title.

+ link element doesn’t have a title.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.get_link_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.get_link_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.get_link_uri.html 2026-04-16 17:54:37.738697000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.get_link_uri.html 2026-07-09 07:33:41.955080700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,15 +187,15 @@

Type: const gchar*

-

The URI of the link element in the coordinates of the Hit Test, - or NULL if there isn’t a link element in hit_test_result context.

+

The URI of the link element in the coordinates of the Hit Test, + or NULL if there isn’t a link element in hit_test_result context.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.get_media_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.get_media_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.HitTestResult.get_media_uri.html 2026-04-16 17:54:37.745697000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.HitTestResult.get_media_uri.html 2026-07-09 07:33:41.958105800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,15 +187,15 @@

Type: const gchar*

-

The URI of the media element in the coordinates of the Hit Test, - or NULL if there isn’t a media element in hit_test_result context.

+

The URI of the media element in the coordinates of the Hit Test, + or NULL if there isn’t a media element in hit_test_result context.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ITPFirstParty.get_domain.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPFirstParty.get_domain.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ITPFirstParty.get_domain.html 2026-04-16 17:54:34.682692800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPFirstParty.get_domain.html 2026-07-09 07:33:40.749745000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,14 +165,14 @@

Type: const char*

-

The domain name.

+

The domain name.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ITPFirstParty.get_last_update_time.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPFirstParty.get_last_update_time.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ITPFirstParty.get_last_update_time.html 2026-04-16 17:54:34.699692700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPFirstParty.get_last_update_time.html 2026-07-09 07:33:40.757978700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -167,14 +167,14 @@

Type: GDateTime

-

The last update time as a GDateTime.

+

The last update time as a GDateTime.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ITPFirstParty.get_website_data_access_allowed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPFirstParty.get_website_data_access_allowed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ITPFirstParty.get_website_data_access_allowed.html 2026-04-16 17:54:34.708692800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPFirstParty.get_website_data_access_allowed.html 2026-07-09 07:33:40.772695800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -167,7 +167,7 @@

Type: gboolean

-

TRUE if website data access has been granted, or FALSE otherwise.

+

TRUE if website data access has been granted, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ITPFirstParty.ref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPFirstParty.ref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ITPFirstParty.ref.html 2026-04-16 17:54:34.715692800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPFirstParty.ref.html 2026-07-09 07:33:40.777226400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -166,14 +166,14 @@

Type: WebKitITPFirstParty

-

The passed WebKitITPFirstParty.

+

The passed WebKitITPFirstParty.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ITPFirstParty.unref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPFirstParty.unref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ITPFirstParty.unref.html 2026-04-16 17:54:34.721692800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPFirstParty.unref.html 2026-07-09 07:33:40.784378800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ITPThirdParty.get_domain.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPThirdParty.get_domain.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ITPThirdParty.get_domain.html 2026-04-16 17:54:34.733693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPThirdParty.get_domain.html 2026-07-09 07:33:40.797142700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -163,14 +163,14 @@

Type: const char*

-

The domain name.

+

The domain name.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ITPThirdParty.get_first_parties.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPThirdParty.get_first_parties.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ITPThirdParty.get_first_parties.html 2026-04-16 17:54:34.740692900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPThirdParty.get_first_parties.html 2026-07-09 07:33:40.799497600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -163,14 +163,14 @@

Type: A list of WebKitITPFirstParty*

-

A GList of WebKitITPFirstParty.

+

A GList of WebKitITPFirstParty.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ITPThirdParty.ref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPThirdParty.ref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ITPThirdParty.ref.html 2026-04-16 17:54:34.754692800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPThirdParty.ref.html 2026-07-09 07:33:40.812239200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -164,14 +164,14 @@

Type: WebKitITPThirdParty

-

The passed WebKitITPThirdParty.

+

The passed WebKitITPThirdParty.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ITPThirdParty.unref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPThirdParty.unref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ITPThirdParty.unref.html 2026-04-16 17:54:34.760692800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ITPThirdParty.unref.html 2026-07-09 07:33:40.821075200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Image.as_bytes.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Image.as_bytes.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Image.as_bytes.html 2026-03-04 10:12:45.289978700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Image.as_bytes.html 2026-03-06 08:31:47.185291000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.51.92

+

Library Version: 2.51.93

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -166,14 +166,14 @@

Type: GBytes

-

A GBytes.

+

A GBytes.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Image.get_height.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Image.get_height.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Image.get_height.html 2026-03-04 10:12:45.295978800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Image.get_height.html 2026-03-06 08:31:47.187921300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.51.92

+

Library Version: 2.51.93

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,7 +171,7 @@

Type: int

-

The image height.

+

The image height.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Image.get_stride.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Image.get_stride.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Image.get_stride.html 2026-03-04 10:12:45.301978800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Image.get_stride.html 2026-03-06 08:31:47.190101400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.51.92

+

Library Version: 2.51.93

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,7 +171,7 @@

Type: guint

-

The image stride.

+

The image stride.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Image.get_width.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Image.get_width.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Image.get_width.html 2026-03-04 10:12:45.307978600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Image.get_width.html 2026-03-06 08:31:47.192661300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.51.92

+

Library Version: 2.51.93

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,7 +171,7 @@

Type: int

-

The image width.

+

The image width.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.filter_key_event.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.filter_key_event.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.filter_key_event.html 2026-04-16 17:54:37.879697300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.filter_key_event.html 2026-07-09 07:33:42.009858400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
key_event

Type: GdkEvent

-

The key event to filter.

+

The key event to filter.

@@ -214,7 +214,7 @@

Type: gboolean

-

TRUE if the key event was handled, or FALSE otherwise.

+

TRUE if the key event was handled, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.get_input_hints.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.get_input_hints.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.get_input_hints.html 2026-04-16 17:54:37.886697300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.get_input_hints.html 2026-07-09 07:33:42.012888700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@

Type: WebKitInputHints

-

The WebKitInputHints of the input associated with context.

+

The WebKitInputHints of the input associated with context.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.get_input_purpose.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.get_input_purpose.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.get_input_purpose.html 2026-04-16 17:54:37.893697300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.get_input_purpose.html 2026-07-09 07:33:42.015917000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@

Type: WebKitInputPurpose

-

The WebKitInputPurpose of the input associated with context.

+

The WebKitInputPurpose of the input associated with context.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.get_preedit.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.get_preedit.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.get_preedit.html 2026-04-16 17:54:37.904697200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.get_preedit.html 2026-07-09 07:33:42.020245000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -184,7 +184,7 @@
text

Type: char**

-

Location to store the preedit string.

+

Location to store the preedit string.

@@ -193,7 +193,7 @@ - +
The argument will be set by the function.
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
The value is a NUL terminated UTF-8 string.
@@ -201,7 +201,7 @@
underlines

Type: A list of None

-

Location to store the underlines as a GList of WebKitInputMethodUnderline.

+

Location to store the underlines as a GList of WebKitInputMethodUnderline.

@@ -210,7 +210,7 @@ - +
The argument will be set by the function.
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
@@ -218,7 +218,7 @@
cursor_offset

Type: guint*

-

Location to store the position of cursor in preedit string.

+

Location to store the position of cursor in preedit string.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_cursor_area.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_cursor_area.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_cursor_area.html 2026-04-16 17:54:37.914697200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_cursor_area.html 2026-07-09 07:33:42.024396700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,7 +183,7 @@
x

Type: int

-

The x coordinate of cursor location.

+

The x coordinate of cursor location.

The argument will be set by the function.
@@ -200,7 +200,7 @@
y

Type: int

-

The y coordinate of cursor location.

+

The y coordinate of cursor location.

@@ -217,7 +217,7 @@
width

Type: int

-

The width of cursor area.

+

The width of cursor area.

@@ -234,7 +234,7 @@
height

Type: int

-

The height of cursor area.

+

The height of cursor area.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_focus_in.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_focus_in.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_focus_in.html 2026-04-16 17:54:37.919697300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_focus_in.html 2026-07-09 07:33:42.026150200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_focus_out.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_focus_out.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_focus_out.html 2026-04-16 17:54:37.924697400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_focus_out.html 2026-07-09 07:33:42.027913600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_surrounding.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_surrounding.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_surrounding.html 2026-04-16 17:54:37.936697200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.notify_surrounding.html 2026-07-09 07:33:42.032847400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -184,7 +184,7 @@
text

Type: const gchar*

-

Text surrounding the insertion point.

+

Text surrounding the insertion point.

@@ -201,7 +201,7 @@
length

Type: int

-

The length of text, or -1 if text is nul-terminated.

+

The length of text, or -1 if text is nul-terminated.

@@ -218,7 +218,7 @@
cursor_index

Type: guint

-

The byte index of the insertion cursor within text.

+

The byte index of the insertion cursor within text.

@@ -235,7 +235,7 @@
selection_index

Type: guint

-

The byte index of the selection cursor within text.

+

The byte index of the selection cursor within text.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.reset.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.reset.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.reset.html 2026-04-16 17:54:37.942697300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.reset.html 2026-07-09 07:33:42.034746200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.set_enable_preedit.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.set_enable_preedit.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.set_enable_preedit.html 2026-04-16 17:54:37.949697300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.set_enable_preedit.html 2026-07-09 07:33:42.037358800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -180,7 +180,7 @@
enabled

Type: gboolean

-

Whether to enable preedit.

+

Whether to enable preedit.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.set_input_hints.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.set_input_hints.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.set_input_hints.html 2026-04-16 17:54:37.956697200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.set_input_hints.html 2026-07-09 07:33:42.039785100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -188,7 +188,7 @@
hints

Type: WebKitInputHints

-

A WebKitInputHints.

+

A WebKitInputHints.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.set_input_purpose.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.set_input_purpose.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodContext.set_input_purpose.html 2026-04-16 17:54:37.962697300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodContext.set_input_purpose.html 2026-07-09 07:33:42.042461600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -188,7 +188,7 @@
purpose

Type: WebKitInputPurpose

-

A WebKitInputPurpose.

+

A WebKitInputPurpose.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodUnderline.copy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodUnderline.copy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodUnderline.copy.html 2026-04-16 17:54:34.640692700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodUnderline.copy.html 2026-07-09 07:33:40.736050800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -161,14 +161,14 @@

Type: WebKitInputMethodUnderline

-

A copy of passed in WebKitInputMethodUnderline.

+

A copy of passed in WebKitInputMethodUnderline.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodUnderline.free.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodUnderline.free.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodUnderline.free.html 2026-04-16 17:54:34.647692700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodUnderline.free.html 2026-07-09 07:33:40.738750200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodUnderline.set_color.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodUnderline.set_color.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.InputMethodUnderline.set_color.html 2026-04-16 17:54:34.657692700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.InputMethodUnderline.set_color.html 2026-07-09 07:33:40.742344900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -164,7 +164,7 @@
rgba

Type: GdkRGBA

-

A GdkRGBA or NULL.

+

A GdkRGBA or NULL.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.copy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.copy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.copy.html 2026-04-16 17:54:34.815693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.copy.html 2026-07-09 07:33:40.857573000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,14 +179,14 @@

Type: WebKitMemoryPressureSettings

-

A copy of of the passed WebKitMemoryPressureSettings.

+

A copy of of the passed WebKitMemoryPressureSettings.

The argument can be NULL.
- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.free.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.free.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.free.html 2026-04-16 17:54:34.830693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.free.html 2026-07-09 07:33:40.859303500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_conservative_threshold.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_conservative_threshold.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_conservative_threshold.html 2026-04-16 17:54:34.842693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_conservative_threshold.html 2026-07-09 07:33:40.862461600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@

Type: gdouble

-

Value in the (0, 1) range.

+

Value in the (0, 1) range.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_kill_threshold.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_kill_threshold.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_kill_threshold.html 2026-04-16 17:54:34.859693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_kill_threshold.html 2026-07-09 07:33:40.865532200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@

Type: gdouble

-

Positive value, can be zero.

+

Positive value, can be zero.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_memory_limit.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_memory_limit.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_memory_limit.html 2026-04-16 17:54:34.877693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_memory_limit.html 2026-07-09 07:33:40.868637300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@

Type: guint

-

Current value, in megabytes.

+

Current value, in megabytes.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_poll_interval.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_poll_interval.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_poll_interval.html 2026-04-16 17:54:34.884693100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_poll_interval.html 2026-07-09 07:33:40.871393400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@

Type: gdouble

-

Current interval value, in seconds.

+

Current interval value, in seconds.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_strict_threshold.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_strict_threshold.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_strict_threshold.html 2026-04-16 17:54:34.899693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.get_strict_threshold.html 2026-07-09 07:33:40.874648000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@

Type: gdouble

-

Value in the (0, 1) range.

+

Value in the (0, 1) range.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_conservative_threshold.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_conservative_threshold.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_conservative_threshold.html 2026-04-16 17:54:34.913693200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_conservative_threshold.html 2026-07-09 07:33:40.878679800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,7 +185,7 @@
value

Type: gdouble

-

Fraction of the memory limit where the conservative policy starts working.

+

Fraction of the memory limit where the conservative policy starts working.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_kill_threshold.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_kill_threshold.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_kill_threshold.html 2026-04-16 17:54:34.929693200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_kill_threshold.html 2026-07-09 07:33:40.887763700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,8 +183,8 @@
value

Type: gdouble

-

Fraction of the memory limit where the process will be killed because - of excessive memory usage.

+

Fraction of the memory limit where the process will be killed because + of excessive memory usage.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_memory_limit.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_memory_limit.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_memory_limit.html 2026-04-16 17:54:34.945693300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_memory_limit.html 2026-07-09 07:33:40.896494200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -181,7 +181,7 @@
memory_limit

Type: guint

-

Amount of memory (in MB) that the process is allowed to use.

+

Amount of memory (in MB) that the process is allowed to use.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_poll_interval.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_poll_interval.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_poll_interval.html 2026-04-16 17:54:34.956693200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_poll_interval.html 2026-07-09 07:33:40.901559600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -181,7 +181,7 @@
value

Type: gdouble

-

Period (in seconds) between memory usage measurements.

+

Period (in seconds) between memory usage measurements.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_strict_threshold.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_strict_threshold.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_strict_threshold.html 2026-04-16 17:54:34.964693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.MemoryPressureSettings.set_strict_threshold.html 2026-07-09 07:33:40.909688000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -186,7 +186,7 @@
value

Type: gdouble

-

Fraction of the memory limit where the strict policy starts working.

+

Fraction of the memory limit where the strict policy starts working.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationAction.copy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.copy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationAction.copy.html 2026-04-16 17:54:34.979693200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.copy.html 2026-07-09 07:33:40.922098200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -173,14 +173,14 @@

Type: WebKitNavigationAction

-

A copy of passed in WebKitNavigationAction.

+

A copy of passed in WebKitNavigationAction.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationAction.free.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.free.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationAction.free.html 2026-04-16 17:54:34.984693300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.free.html 2026-07-09 07:33:40.925187300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationAction.get_frame_name.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.get_frame_name.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationAction.get_frame_name.html 2026-04-16 17:54:34.993693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.get_frame_name.html 2026-07-09 07:33:40.929989600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: const char*

-

The name of the new frame this navigation action targets or NULL.

+

The name of the new frame this navigation action targets or NULL.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationAction.get_modifiers.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.get_modifiers.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationAction.get_modifiers.html 2026-04-16 17:54:35.000693300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.get_modifiers.html 2026-07-09 07:33:40.933408500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,7 +175,7 @@

Type: guint

-

The modifier keys.

+

The modifier keys.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationAction.get_mouse_button.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.get_mouse_button.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationAction.get_mouse_button.html 2026-04-16 17:54:35.007693300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.get_mouse_button.html 2026-07-09 07:33:40.936354000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,7 +175,7 @@

Type: guint

-

The mouse button number or 0

+

The mouse button number or 0

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationAction.get_navigation_type.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.get_navigation_type.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationAction.get_navigation_type.html 2026-04-16 17:54:35.014693300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.get_navigation_type.html 2026-07-09 07:33:40.938636000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -173,7 +173,7 @@

Type: WebKitNavigationType

-

A WebKitNavigationType.

+

A WebKitNavigationType.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationAction.get_request.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.get_request.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationAction.get_request.html 2026-04-16 17:54:35.042693400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.get_request.html 2026-07-09 07:33:40.942793600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -178,14 +178,14 @@

Type: WebKitURIRequest

-

A WebKitURIRequest.

+

A WebKitURIRequest.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationAction.is_redirect.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.is_redirect.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationAction.is_redirect.html 2026-04-16 17:54:35.058693400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.is_redirect.html 2026-07-09 07:33:40.945650600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -173,7 +173,7 @@

Type: gboolean

-

TRUE if the original navigation was redirected, FALSE otherwise.

+

TRUE if the original navigation was redirected, FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationAction.is_user_gesture.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.is_user_gesture.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationAction.is_user_gesture.html 2026-04-16 17:54:35.077693200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationAction.is_user_gesture.html 2026-07-09 07:33:40.948487000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -173,7 +173,7 @@

Type: gboolean

-

Whether navigation action is a user gesture.

+

Whether navigation action is a user gesture.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationPolicyDecision.get_navigation_action.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationPolicyDecision.get_navigation_action.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NavigationPolicyDecision.get_navigation_action.html 2026-04-16 17:54:38.181697600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NavigationPolicyDecision.get_navigation_action.html 2026-07-09 07:33:42.119935500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,14 +165,14 @@

Type: WebKitNavigationAction

-

The WebKitNavigationAction triggering this policy decision.

+

The WebKitNavigationAction triggering this policy decision.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkProxySettings.add_proxy_for_scheme.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkProxySettings.add_proxy_for_scheme.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkProxySettings.add_proxy_for_scheme.html 2026-04-16 17:54:35.123693500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkProxySettings.add_proxy_for_scheme.html 2026-07-09 07:33:40.960798500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -166,7 +166,7 @@
scheme

Type: const gchar*

-

The URI scheme to add a proxy for.

+

The URI scheme to add a proxy for.

@@ -183,7 +183,7 @@
proxy_uri

Type: const gchar*

-

The proxy URI to use for uri_scheme.

+

The proxy URI to use for uri_scheme.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkProxySettings.copy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkProxySettings.copy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkProxySettings.copy.html 2026-04-16 17:54:35.130693400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkProxySettings.copy.html 2026-07-09 07:33:40.964450400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -161,14 +161,14 @@

Type: WebKitNetworkProxySettings

-

A copy of passed in WebKitNetworkProxySettings.

+

A copy of passed in WebKitNetworkProxySettings.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkProxySettings.free.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkProxySettings.free.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkProxySettings.free.html 2026-04-16 17:54:35.135693300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkProxySettings.free.html 2026-07-09 07:33:40.965925200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.allow_tls_certificate_for_host.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.allow_tls_certificate_for_host.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.allow_tls_certificate_for_host.html 2026-04-16 17:54:38.290697800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.allow_tls_certificate_for_host.html 2026-07-09 07:33:42.161564800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -189,7 +189,7 @@
certificate

Type: GTlsCertificate

-

A GTlsCertificate.

+

A GTlsCertificate.

@@ -206,7 +206,7 @@
host

Type: const char*

-

The host for which a certificate is to be allowed.

+

The host for which a certificate is to be allowed.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.download_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.download_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.download_uri.html 2026-04-16 17:54:38.299697900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.download_uri.html 2026-07-09 07:33:42.165177300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -189,7 +189,7 @@
uri

Type: const char*

-

The URI to download.

+

The URI to download.

@@ -221,15 +221,15 @@

Type: WebKitDownload

-

A new WebKitDownload representing - the download operation.

+

A new WebKitDownload representing + the download operation.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.get_cookie_manager.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_cookie_manager.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.get_cookie_manager.html 2026-04-16 17:54:38.305698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_cookie_manager.html 2026-07-09 07:33:42.167561300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,14 +185,14 @@

Type: WebKitCookieManager

-

A WebKitCookieManager.

+

A WebKitCookieManager.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.get_itp_enabled.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_itp_enabled.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.get_itp_enabled.html 2026-04-16 17:54:38.312698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_itp_enabled.html 2026-07-09 07:33:42.170235900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,7 +185,7 @@

Type: gboolean

-

TRUE if ITP is enabled, or FALSE otherwise.

+

TRUE if ITP is enabled, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.get_itp_summary.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_itp_summary.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.get_itp_summary.html 2026-04-16 17:54:38.323697800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_itp_summary.html 2026-07-09 07:33:42.175147500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -192,7 +192,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -209,7 +209,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the request is satisfied.

+

A GAsyncReadyCallback to call when the request is satisfied.

The argument can be NULL.
@@ -226,7 +226,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.get_itp_summary_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_itp_summary_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.get_itp_summary_finish.html 2026-04-16 17:54:38.333697800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_itp_summary_finish.html 2026-07-09 07:33:42.180412800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -231,16 +231,16 @@

Type: A list of WebKitITPThirdParty*

-

A GList of WebKitITPThirdParty. +

A GList of WebKitITPThirdParty. You must free the GList with g_list_free() and unref the WebKitITPThirdPartys with - webkit_itp_third_party_unref() when you’re done with them.

+ webkit_itp_third_party_unref() when you’re done with them.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.get_persistent_credential_storage_enabled.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_persistent_credential_storage_enabled.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.get_persistent_credential_storage_enabled.html 2026-04-16 17:54:38.340697800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_persistent_credential_storage_enabled.html 2026-07-09 07:33:42.183280500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -186,7 +186,7 @@

Type: gboolean

-

TRUE if persistent credential storage is enabled, or FALSE otherwise.

+

TRUE if persistent credential storage is enabled, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.get_tls_errors_policy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_tls_errors_policy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.get_tls_errors_policy.html 2026-04-16 17:54:38.347698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_tls_errors_policy.html 2026-07-09 07:33:42.185663200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,7 +185,7 @@

Type: WebKitTLSErrorsPolicy

-

A WebKitTLSErrorsPolicy.

+

A WebKitTLSErrorsPolicy.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.get_website_data_manager.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_website_data_manager.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.get_website_data_manager.html 2026-04-16 17:54:38.354698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.get_website_data_manager.html 2026-07-09 07:33:42.188377600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,14 +185,14 @@

Type: WebKitWebsiteDataManager

-

A WebKitWebsiteDataManager.

+

A WebKitWebsiteDataManager.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.is_ephemeral.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.is_ephemeral.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.is_ephemeral.html 2026-04-16 17:54:38.361698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.is_ephemeral.html 2026-07-09 07:33:42.191216000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@

Type: gboolean

-

TRUE if session is pehmeral, or FALSE otherwise.

+

TRUE if session is pehmeral, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.prefetch_dns.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.prefetch_dns.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.prefetch_dns.html 2026-04-16 17:54:38.368698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.prefetch_dns.html 2026-07-09 07:33:42.194113500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@
hostname

Type: const char*

-

A hostname to be resolved.

+

A hostname to be resolved.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.set_itp_enabled.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.set_itp_enabled.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.set_itp_enabled.html 2026-04-16 17:54:38.376698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.set_itp_enabled.html 2026-07-09 07:33:42.196948300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -190,7 +190,7 @@
enabled

Type: gboolean

-

Value to set.

+

Value to set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.set_persistent_credential_storage_enabled.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.set_persistent_credential_storage_enabled.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.set_persistent_credential_storage_enabled.html 2026-04-16 17:54:38.383698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.set_persistent_credential_storage_enabled.html 2026-07-09 07:33:42.199665000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -189,7 +189,7 @@
enabled

Type: gboolean

-

Value to set.

+

Value to set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.set_proxy_settings.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.set_proxy_settings.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.set_proxy_settings.html 2026-04-16 17:54:38.395697800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.set_proxy_settings.html 2026-07-09 07:33:42.203741800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -194,7 +194,7 @@
proxy_mode

Type: WebKitNetworkProxyMode

-

A WebKitNetworkProxyMode.

+

A WebKitNetworkProxyMode.

@@ -211,7 +211,7 @@
proxy_settings

Type: WebKitNetworkProxySettings

-

A WebKitNetworkProxySettings, or NULL.

+

A WebKitNetworkProxySettings, or NULL.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.set_tls_errors_policy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.set_tls_errors_policy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.NetworkSession.set_tls_errors_policy.html 2026-04-16 17:54:38.401697900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.NetworkSession.set_tls_errors_policy.html 2026-07-09 07:33:42.206804800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -186,7 +186,7 @@
policy

Type: WebKitTLSErrorsPolicy

-

A WebKitTLSErrorsPolicy.

+

A WebKitTLSErrorsPolicy.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Notification.clicked.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Notification.clicked.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Notification.clicked.html 2026-04-16 17:54:38.466698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Notification.clicked.html 2026-07-09 07:33:42.232852500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Notification.close.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Notification.close.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Notification.close.html 2026-04-16 17:54:38.471698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Notification.close.html 2026-07-09 07:33:42.234647500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Notification.get_body.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Notification.get_body.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Notification.get_body.html 2026-04-16 17:54:38.476698200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Notification.get_body.html 2026-07-09 07:33:42.237285400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: const gchar*

-

The body for the notification.

+

The body for the notification.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Notification.get_id.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Notification.get_id.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Notification.get_id.html 2026-04-16 17:54:38.482698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Notification.get_id.html 2026-07-09 07:33:42.239502700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,7 +175,7 @@

Type: guint64

-

The unique id for the notification.

+

The unique id for the notification.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Notification.get_tag.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Notification.get_tag.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Notification.get_tag.html 2026-04-16 17:54:38.488698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Notification.get_tag.html 2026-07-09 07:33:42.242183000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: const gchar*

-

The tag for the notification.

+

The tag for the notification.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Notification.get_title.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Notification.get_title.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Notification.get_title.html 2026-04-16 17:54:38.494698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Notification.get_title.html 2026-07-09 07:33:42.244474400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: const gchar*

-

The title for the notification.

+

The title for the notification.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenu.activate_item.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenu.activate_item.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenu.activate_item.html 2026-04-16 17:54:38.625698300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenu.activate_item.html 2026-07-09 07:33:42.289745800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,7 +171,7 @@
index

Type: guint

-

The index of the item.

+

The index of the item.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenu.close.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenu.close.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenu.close.html 2026-04-16 17:54:38.638698300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenu.close.html 2026-07-09 07:33:42.292596300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenu.get_event.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenu.get_event.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenu.get_event.html 2026-04-16 17:54:38.649698300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenu.get_event.html 2026-07-09 07:33:42.295487900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,14 +169,14 @@

Type: GdkEvent

-

The menu event or NULL.

+

The menu event or NULL.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenu.get_item.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenu.get_item.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenu.get_item.html 2026-04-16 17:54:38.658698300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenu.get_item.html 2026-07-09 07:33:42.298627100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -168,7 +168,7 @@
index

Type: guint

-

The index of the item.

+

The index of the item.

@@ -200,14 +200,14 @@

Type: WebKitOptionMenuItem

-

A WebKitOptionMenuItem of menu.

+

A WebKitOptionMenuItem of menu.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenu.get_n_items.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenu.get_n_items.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenu.get_n_items.html 2026-04-16 17:54:38.665698300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenu.get_n_items.html 2026-07-09 07:33:42.301732800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -167,7 +167,7 @@

Type: guint

-

The number of WebKitOptionMenuItems in menu.

+

The number of WebKitOptionMenuItems in menu.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenu.select_item.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenu.select_item.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenu.select_item.html 2026-04-16 17:54:38.674698400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenu.select_item.html 2026-07-09 07:33:42.304976500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -172,7 +172,7 @@
index

Type: guint

-

The index of the item.

+

The index of the item.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenuItem.copy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.copy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenuItem.copy.html 2026-04-16 17:54:35.149693500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.copy.html 2026-07-09 07:33:40.973641000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: WebKitOptionMenuItem

-

A copy of passed in WebKitOptionMenuItem.

+

A copy of passed in WebKitOptionMenuItem.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenuItem.free.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.free.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenuItem.free.html 2026-04-16 17:54:35.154693400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.free.html 2026-07-09 07:33:40.980319300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenuItem.get_label.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.get_label.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenuItem.get_label.html 2026-04-16 17:54:35.161693300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.get_label.html 2026-07-09 07:33:40.985275700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: const gchar*

-

The label of item.

+

The label of item.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenuItem.get_tooltip.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.get_tooltip.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenuItem.get_tooltip.html 2026-04-16 17:54:35.167693400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.get_tooltip.html 2026-07-09 07:33:40.988463200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: const gchar*

-

The tooltip of item, or NULL.

+

The tooltip of item, or NULL.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_enabled.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_enabled.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_enabled.html 2026-04-16 17:54:35.174693300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_enabled.html 2026-07-09 07:33:40.992210900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,7 +171,7 @@

Type: gboolean

-

TRUE if the item is enabled or FALSE otherwise.

+

TRUE if the item is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_group_child.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_group_child.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_group_child.html 2026-04-16 17:54:35.182693500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_group_child.html 2026-07-09 07:33:40.995242600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,7 +171,7 @@

Type: gboolean

-

TRUE if the item is a group child or FALSE otherwise.

+

TRUE if the item is a group child or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_group_label.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_group_label.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_group_label.html 2026-04-16 17:54:35.200693600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_group_label.html 2026-07-09 07:33:40.998923500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,7 +171,7 @@

Type: gboolean

-

TRUE if the item is a group label or FALSE otherwise.

+

TRUE if the item is a group label or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_selected.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_selected.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_selected.html 2026-04-16 17:54:35.206693400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.OptionMenuItem.is_selected.html 2026-07-09 07:33:41.002045400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,7 +171,7 @@

Type: gboolean

-

TRUE if the item is selected or FALSE otherwise.

+

TRUE if the item is selected or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PermissionRequest.allow.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionRequest.allow.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PermissionRequest.allow.html 2026-04-16 17:54:33.772691500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionRequest.allow.html 2026-07-09 07:33:40.374225000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PermissionRequest.deny.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionRequest.deny.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PermissionRequest.deny.html 2026-04-16 17:54:33.820691600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionRequest.deny.html 2026-07-09 07:33:40.391159500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PermissionStateQuery.finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionStateQuery.finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PermissionStateQuery.finish.html 2026-04-16 17:54:35.222693400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionStateQuery.finish.html 2026-07-09 07:33:41.013941300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -167,7 +167,7 @@
state

Type: WebKitPermissionState

-

A WebKitPermissionState.

+

A WebKitPermissionState.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PermissionStateQuery.get_name.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionStateQuery.get_name.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PermissionStateQuery.get_name.html 2026-04-16 17:54:35.228693500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionStateQuery.get_name.html 2026-07-09 07:33:41.024707800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,14 +165,14 @@

Type: const gchar*

-

The permission name for query.

+

The permission name for query.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PermissionStateQuery.get_security_origin.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionStateQuery.get_security_origin.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PermissionStateQuery.get_security_origin.html 2026-04-16 17:54:35.236693600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionStateQuery.get_security_origin.html 2026-07-09 07:33:41.046690200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,15 +165,15 @@

Type: WebKitSecurityOrigin

-

A WebKitSecurityOrigin representing the origin from which the -query was emitted.

+

A WebKitSecurityOrigin representing the origin from which the +query was emitted.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PermissionStateQuery.ref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionStateQuery.ref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PermissionStateQuery.ref.html 2026-04-16 17:54:35.247693500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionStateQuery.ref.html 2026-07-09 07:33:41.055636200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -166,14 +166,14 @@

Type: WebKitPermissionStateQuery

-

The passed WebKitPermissionStateQuery.

+

The passed WebKitPermissionStateQuery.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PermissionStateQuery.unref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionStateQuery.unref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PermissionStateQuery.unref.html 2026-04-16 17:54:35.253693600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PermissionStateQuery.unref.html 2026-07-09 07:33:41.071573300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PolicyDecision.download.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PolicyDecision.download.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PolicyDecision.download.html 2026-04-16 17:54:38.782698400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PolicyDecision.download.html 2026-07-09 07:33:42.349056500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PolicyDecision.ignore.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PolicyDecision.ignore.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PolicyDecision.ignore.html 2026-04-16 17:54:38.787698500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PolicyDecision.ignore.html 2026-07-09 07:33:42.351121400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PolicyDecision.use.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PolicyDecision.use.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PolicyDecision.use.html 2026-04-16 17:54:38.792698400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PolicyDecision.use.html 2026-07-09 07:33:42.352793200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PolicyDecision.use_with_policies.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PolicyDecision.use_with_policies.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PolicyDecision.use_with_policies.html 2026-04-16 17:54:38.800698500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PolicyDecision.use_with_policies.html 2026-07-09 07:33:42.356257200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -170,7 +170,7 @@
policies

Type: WebKitWebsitePolicies

-

A WebKitWebsitePolicies.

+

A WebKitWebsitePolicies.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PrintOperation.get_page_setup.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PrintOperation.get_page_setup.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PrintOperation.get_page_setup.html 2026-04-16 17:54:38.862698600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PrintOperation.get_page_setup.html 2026-07-09 07:33:42.385547900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -178,14 +178,14 @@

Type: GtkPageSetup

-

The current GtkPageSetup of print_operation.

+

The current GtkPageSetup of print_operation.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PrintOperation.get_print_settings.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PrintOperation.get_print_settings.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PrintOperation.get_print_settings.html 2026-04-16 17:54:38.869698500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PrintOperation.get_print_settings.html 2026-07-09 07:33:42.388325200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -178,14 +178,14 @@

Type: GtkPrintSettings

-

The current GtkPrintSettings of print_operation.

+

The current GtkPrintSettings of print_operation.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PrintOperation.print.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PrintOperation.print.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PrintOperation.print.html 2026-04-16 17:54:38.877698700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PrintOperation.print.html 2026-07-09 07:33:42.391867900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PrintOperation.run_dialog.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PrintOperation.run_dialog.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PrintOperation.run_dialog.html 2026-04-16 17:54:38.889698700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PrintOperation.run_dialog.html 2026-07-09 07:33:42.396118600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -180,7 +180,7 @@
parent

Type: GtkWindow

-

Transient parent of the print dialog.

+

Transient parent of the print dialog.

@@ -212,7 +212,7 @@

Type: WebKitPrintOperationResponse

-

The WebKitPrintOperationResponse of the print dialog.

+

The WebKitPrintOperationResponse of the print dialog.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PrintOperation.set_page_setup.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PrintOperation.set_page_setup.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PrintOperation.set_page_setup.html 2026-04-16 17:54:38.896698700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PrintOperation.set_page_setup.html 2026-07-09 07:33:42.399038000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -178,7 +178,7 @@
page_setup

Type: GtkPageSetup

-

A GtkPageSetup to set.

+

A GtkPageSetup to set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PrintOperation.set_print_settings.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PrintOperation.set_print_settings.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.PrintOperation.set_print_settings.html 2026-04-16 17:54:38.903698700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.PrintOperation.set_print_settings.html 2026-07-09 07:33:42.401745000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -178,7 +178,7 @@
print_settings

Type: GtkPrintSettings

-

A GtkPrintSettings to set.

+

A GtkPrintSettings to set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.get_request.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.get_request.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.get_request.html 2026-04-16 17:54:39.002699000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.get_request.html 2026-07-09 07:33:42.430387500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -176,14 +176,14 @@

Type: WebKitURIRequest

-

The URI request that is associated with this policy decision.

+

The URI request that is associated with this policy decision.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.get_response.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.get_response.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.get_response.html 2026-04-16 17:54:39.008698700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.get_response.html 2026-07-09 07:33:42.433326500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: WebKitURIResponse

-

The URI response that is associated with this policy decision.

+

The URI response that is associated with this policy decision.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.is_main_frame_main_resource.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.is_main_frame_main_resource.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.is_main_frame_main_resource.html 2026-04-16 17:54:39.016698800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.is_main_frame_main_resource.html 2026-07-09 07:33:42.436037800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -163,7 +163,7 @@

Type: gboolean

-

TRUE if the request is the main frame main resouce or FALSE otherwise.

+

TRUE if the request is the main frame main resouce or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.is_mime_type_supported.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.is_mime_type_supported.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.is_mime_type_supported.html 2026-04-16 17:54:39.024698700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ResponsePolicyDecision.is_mime_type_supported.html 2026-07-09 07:33:42.439234700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@

Type: gboolean

-

TRUE if the MIME type of the response is supported or FALSE otherwise.

+

TRUE if the MIME type of the response is supported or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptDialog.close.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.close.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptDialog.close.html 2026-04-16 17:54:35.273693600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.close.html 2026-07-09 07:33:41.084452000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptDialog.confirm_set_confirmed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.confirm_set_confirmed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptDialog.confirm_set_confirmed.html 2026-04-16 17:54:35.287693500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.confirm_set_confirmed.html 2026-07-09 07:33:41.091191000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -178,7 +178,7 @@
confirmed

Type: gboolean

-

Whether user confirmed the dialog.

+

Whether user confirmed the dialog.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptDialog.get_dialog_type.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.get_dialog_type.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptDialog.get_dialog_type.html 2026-04-16 17:54:35.300693800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.get_dialog_type.html 2026-07-09 07:33:41.100703200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,7 +171,7 @@

Type: WebKitScriptDialogType

-

The WebKitScriptDialogType of dialog.

+

The WebKitScriptDialogType of dialog.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptDialog.get_message.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.get_message.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptDialog.get_message.html 2026-04-16 17:54:35.313693800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.get_message.html 2026-07-09 07:33:41.106310600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: const gchar*

-

The message of dialog.

+

The message of dialog.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptDialog.prompt_get_default_text.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.prompt_get_default_text.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptDialog.prompt_get_default_text.html 2026-04-16 17:54:35.335693600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.prompt_get_default_text.html 2026-07-09 07:33:41.111962300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -173,14 +173,14 @@

Type: const gchar*

-

The default text of dialog.

+

The default text of dialog.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptDialog.prompt_set_text.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.prompt_set_text.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptDialog.prompt_set_text.html 2026-04-16 17:54:35.348693600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.prompt_set_text.html 2026-07-09 07:33:41.124661000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -178,7 +178,7 @@
text

Type: const gchar*

-

The text to set.

+

The text to set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptDialog.ref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.ref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptDialog.ref.html 2026-04-16 17:54:35.365693800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.ref.html 2026-07-09 07:33:41.132820400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -173,14 +173,14 @@

Type: WebKitScriptDialog

-

The passed in WebKitScriptDialog.

+

The passed in WebKitScriptDialog.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptDialog.unref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.unref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptDialog.unref.html 2026-04-16 17:54:35.383693700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptDialog.unref.html 2026-07-09 07:33:41.135746200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptMessageReply.ref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptMessageReply.ref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptMessageReply.ref.html 2026-04-16 17:54:35.409693700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptMessageReply.ref.html 2026-07-09 07:33:41.154894400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -163,14 +163,14 @@

Type: WebKitScriptMessageReply

-

The script_message_reply passed in.

+

The script_message_reply passed in.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptMessageReply.return_error_message.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptMessageReply.return_error_message.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptMessageReply.return_error_message.html 2026-04-16 17:54:35.415693800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptMessageReply.return_error_message.html 2026-07-09 07:33:41.158666000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -164,7 +164,7 @@
error_message

Type: const char*

-

An error message to return as specified by the user’s script message.

+

An error message to return as specified by the user’s script message.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptMessageReply.return_value.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptMessageReply.return_value.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptMessageReply.return_value.html 2026-04-16 17:54:35.421693800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptMessageReply.return_value.html 2026-07-09 07:33:41.179570700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@
reply_value

Type: JSCValue

-

Reply value of the provided script message.

+

Reply value of the provided script message.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptMessageReply.unref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptMessageReply.unref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.ScriptMessageReply.unref.html 2026-04-16 17:54:35.427693800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.ScriptMessageReply.unref.html 2026-07-09 07:33:41.189329400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_cors_enabled.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_cors_enabled.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_cors_enabled.html 2026-04-16 17:54:39.083699000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_cors_enabled.html 2026-07-09 07:33:42.464235500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
scheme

Type: const gchar*

-

A URI scheme.

+

A URI scheme.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_display_isolated.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_display_isolated.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_display_isolated.html 2026-04-16 17:54:39.090699000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_display_isolated.html 2026-07-09 07:33:42.466880800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
scheme

Type: const gchar*

-

A URI scheme.

+

A URI scheme.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_empty_document.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_empty_document.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_empty_document.html 2026-04-16 17:54:39.096699000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_empty_document.html 2026-07-09 07:33:42.469684100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
scheme

Type: const gchar*

-

A URI scheme.

+

A URI scheme.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_local.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_local.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_local.html 2026-04-16 17:54:39.103699000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_local.html 2026-07-09 07:33:42.472184000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
scheme

Type: const gchar*

-

A URI scheme.

+

A URI scheme.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_no_access.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_no_access.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_no_access.html 2026-04-16 17:54:39.110699000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_no_access.html 2026-07-09 07:33:42.474955000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
scheme

Type: const gchar*

-

A URI scheme.

+

A URI scheme.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_secure.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_secure.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_secure.html 2026-04-16 17:54:39.117699000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.register_uri_scheme_as_secure.html 2026-07-09 07:33:42.477420800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,7 +183,7 @@
scheme

Type: const gchar*

-

A URI scheme.

+

A URI scheme.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_cors_enabled.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_cors_enabled.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_cors_enabled.html 2026-04-16 17:54:39.126699000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_cors_enabled.html 2026-07-09 07:33:42.480921500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -181,7 +181,7 @@
scheme

Type: const gchar*

-

A URI scheme.

+

A URI scheme.

@@ -213,7 +213,7 @@

Type: gboolean

-

TRUE if scheme is a CORS enabled scheme or FALSE otherwise.

+

TRUE if scheme is a CORS enabled scheme or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_display_isolated.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_display_isolated.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_display_isolated.html 2026-04-16 17:54:39.134698900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_display_isolated.html 2026-07-09 07:33:42.484132500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -181,7 +181,7 @@
scheme

Type: const gchar*

-

A URI scheme.

+

A URI scheme.

@@ -213,7 +213,7 @@

Type: gboolean

-

TRUE if scheme is a display isolated scheme or FALSE otherwise.

+

TRUE if scheme is a display isolated scheme or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_empty_document.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_empty_document.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_empty_document.html 2026-04-16 17:54:39.143699000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_empty_document.html 2026-07-09 07:33:42.487636000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -181,7 +181,7 @@
scheme

Type: const gchar*

-

A URI scheme.

+

A URI scheme.

@@ -213,7 +213,7 @@

Type: gboolean

-

TRUE if scheme is an empty document scheme or FALSE otherwise.

+

TRUE if scheme is an empty document scheme or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_local.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_local.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_local.html 2026-04-16 17:54:39.151699000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_local.html 2026-07-09 07:33:42.491079600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -181,7 +181,7 @@
scheme

Type: const gchar*

-

A URI scheme.

+

A URI scheme.

@@ -213,7 +213,7 @@

Type: gboolean

-

TRUE if scheme is a local scheme or FALSE otherwise.

+

TRUE if scheme is a local scheme or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_no_access.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_no_access.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_no_access.html 2026-04-16 17:54:39.160699000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_no_access.html 2026-07-09 07:33:42.494204500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -181,7 +181,7 @@
scheme

Type: const gchar*

-

A URI scheme.

+

A URI scheme.

@@ -213,7 +213,7 @@

Type: gboolean

-

TRUE if scheme is a no-access scheme or FALSE otherwise.

+

TRUE if scheme is a no-access scheme or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_secure.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_secure.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_secure.html 2026-04-16 17:54:39.168699000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityManager.uri_scheme_is_secure.html 2026-07-09 07:33:42.497893800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -181,7 +181,7 @@
scheme

Type: const gchar*

-

A URI scheme.

+

A URI scheme.

@@ -213,7 +213,7 @@

Type: gboolean

-

TRUE if scheme is a secure scheme or FALSE otherwise.

+

TRUE if scheme is a secure scheme or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityOrigin.get_host.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityOrigin.get_host.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityOrigin.get_host.html 2026-04-16 17:54:35.463693900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityOrigin.get_host.html 2026-07-09 07:33:41.231543000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,14 +169,14 @@

Type: const gchar*

-

The host of the WebKitSecurityOrigin.

+

The host of the WebKitSecurityOrigin.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityOrigin.get_port.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityOrigin.get_port.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityOrigin.get_port.html 2026-04-16 17:54:35.482694000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityOrigin.get_port.html 2026-07-09 07:33:41.246429400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -172,7 +172,7 @@

Type: guint16

-

The port of the WebKitSecurityOrigin.

+

The port of the WebKitSecurityOrigin.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityOrigin.get_protocol.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityOrigin.get_protocol.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityOrigin.get_protocol.html 2026-04-16 17:54:35.500693800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityOrigin.get_protocol.html 2026-07-09 07:33:41.250687400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -167,14 +167,14 @@

Type: const gchar*

-

The protocol of the WebKitSecurityOrigin.

+

The protocol of the WebKitSecurityOrigin.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityOrigin.ref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityOrigin.ref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityOrigin.ref.html 2026-04-16 17:54:35.517694000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityOrigin.ref.html 2026-07-09 07:33:41.256375000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -168,14 +168,14 @@

Type: WebKitSecurityOrigin

-

The passed WebKitSecurityOrigin.

+

The passed WebKitSecurityOrigin.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityOrigin.to_string.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityOrigin.to_string.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityOrigin.to_string.html 2026-04-16 17:54:35.537694000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityOrigin.to_string.html 2026-07-09 07:33:41.263089000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -170,14 +170,14 @@

Type: gchar*

-

A URI representing origin.

+

A URI representing origin.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityOrigin.unref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityOrigin.unref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.SecurityOrigin.unref.html 2026-04-16 17:54:35.545693900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.SecurityOrigin.unref.html 2026-07-09 07:33:41.263488000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.apply_from_key_file.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.apply_from_key_file.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.apply_from_key_file.html 2026-04-16 17:54:39.381699300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.apply_from_key_file.html 2026-07-09 07:33:42.582071300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@
key_file

Type: GKeyFile

-

A GKeyFile.

+

A GKeyFile.

@@ -420,7 +420,7 @@
group_name

Type: const gchar*

-

Name of the group to read from key_file.

+

Name of the group to read from key_file.

@@ -464,7 +464,7 @@

Type: gboolean

-

TRUE if the settings were correctly applied or FALSE on error.

+

TRUE if the settings were correctly applied or FALSE on error.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_allow_file_access_from_file_urls.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_allow_file_access_from_file_urls.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_allow_file_access_from_file_urls.html 2026-04-16 17:54:39.388699300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_allow_file_access_from_file_urls.html 2026-07-09 07:33:42.585099200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If file access from file URLs is allowed or FALSE otherwise.

+

TRUE If file access from file URLs is allowed or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_allow_modal_dialogs.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_allow_modal_dialogs.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_allow_modal_dialogs.html 2026-04-16 17:54:39.396699400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_allow_modal_dialogs.html 2026-07-09 07:33:42.587794300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE if it’s allowed to create and run modal dialogs or FALSE otherwise.

+

TRUE if it’s allowed to create and run modal dialogs or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_allow_top_navigation_to_data_urls.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_allow_top_navigation_to_data_urls.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_allow_top_navigation_to_data_urls.html 2026-04-16 17:54:39.405699300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_allow_top_navigation_to_data_urls.html 2026-07-09 07:33:42.590885900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If navigation to data URLs from the top frame is allowed or FALSE\ otherwise.

+

TRUE If navigation to data URLs from the top frame is allowed or FALSE\ otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_allow_universal_access_from_file_urls.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_allow_universal_access_from_file_urls.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_allow_universal_access_from_file_urls.html 2026-04-16 17:54:39.413699400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_allow_universal_access_from_file_urls.html 2026-07-09 07:33:42.593548000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If universal access from file URLs is allowed or FALSE otherwise.

+

TRUE If universal access from file URLs is allowed or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_auto_load_images.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_auto_load_images.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_auto_load_images.html 2026-04-16 17:54:39.420699400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_auto_load_images.html 2026-07-09 07:33:42.596514500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If auto loading of images is enabled or FALSE otherwise.

+

TRUE If auto loading of images is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_cursive_font_family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_cursive_font_family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_cursive_font_family.html 2026-04-16 17:54:39.428699500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_cursive_font_family.html 2026-07-09 07:33:42.599062700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,14 +403,14 @@

Type: const gchar*

-

The default font family used to display content marked with cursive font.

+

The default font family used to display content marked with cursive font.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_default_charset.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_default_charset.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_default_charset.html 2026-04-16 17:54:39.435699500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_default_charset.html 2026-07-09 07:33:42.601837600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,14 +403,14 @@

Type: const gchar*

-

Default charset.

+

Default charset.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_default_font_family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_default_font_family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_default_font_family.html 2026-04-16 17:54:39.442699400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_default_font_family.html 2026-07-09 07:33:42.604426400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,14 +403,14 @@

Type: const gchar*

-

The default font family used to display content that does not specify a font.

+

The default font family used to display content that does not specify a font.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_default_font_size.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_default_font_size.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_default_font_size.html 2026-04-16 17:54:39.449699400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_default_font_size.html 2026-07-09 07:33:42.607226000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: guint32

-

The default font size, in pixels.

+

The default font size, in pixels.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_default_monospace_font_size.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_default_monospace_font_size.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_default_monospace_font_size.html 2026-04-16 17:54:39.456699400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_default_monospace_font_size.html 2026-07-09 07:33:42.609721400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: guint32

-

Default monospace font size, in pixels.

+

Default monospace font size, in pixels.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_disable_web_security.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_disable_web_security.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_disable_web_security.html 2026-04-16 17:54:39.464699500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_disable_web_security.html 2026-07-09 07:33:42.612642000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If web security support is disabled or FALSE otherwise.

+

TRUE If web security support is disabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_draw_compositing_indicators.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_draw_compositing_indicators.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_draw_compositing_indicators.html 2026-04-16 17:54:39.472699400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_draw_compositing_indicators.html 2026-07-09 07:33:42.615318000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If compositing borders are drawn or FALSE otherwise.

+

TRUE If compositing borders are drawn or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_2d_canvas_acceleration.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_2d_canvas_acceleration.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_2d_canvas_acceleration.html 2026-04-16 17:54:39.480699500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_2d_canvas_acceleration.html 2026-07-09 07:33:42.618504500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE if 2D canvas acceleration is enabled or FALSE otherwise.

+

TRUE if 2D canvas acceleration is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_back_forward_navigation_gestures.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_back_forward_navigation_gestures.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_back_forward_navigation_gestures.html 2026-04-16 17:54:39.488699400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_back_forward_navigation_gestures.html 2026-07-09 07:33:42.621259000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE if horizontal swipe gesture will trigger back-forward navigaiton or FALSE otherwise.

+

TRUE if horizontal swipe gesture will trigger back-forward navigaiton or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_caret_browsing.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_caret_browsing.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_caret_browsing.html 2026-04-16 17:54:39.496699600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_caret_browsing.html 2026-07-09 07:33:42.624184600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If caret browsing is enabled or FALSE otherwise.

+

TRUE If caret browsing is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_developer_extras.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_developer_extras.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_developer_extras.html 2026-04-16 17:54:39.503699500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_developer_extras.html 2026-07-09 07:33:42.626864700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If developer extras is enabled or FALSE otherwise.

+

TRUE If developer extras is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_dns_prefetching.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_dns_prefetching.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_dns_prefetching.html 2026-04-16 17:54:39.512699600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_dns_prefetching.html 2026-07-09 07:33:42.630106700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@

Type: gboolean

-

TRUE If DNS prefetching is enabled or FALSE otherwise.

+

TRUE If DNS prefetching is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_encrypted_media.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_encrypted_media.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_encrypted_media.html 2026-04-16 17:54:39.519699600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_encrypted_media.html 2026-07-09 07:33:42.632763100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE if EncryptedMedia support is enabled or FALSE otherwise.

+

TRUE if EncryptedMedia support is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_fullscreen.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_fullscreen.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_fullscreen.html 2026-04-16 17:54:39.527699500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_fullscreen.html 2026-07-09 07:33:42.635682000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If fullscreen support is enabled or FALSE otherwise.

+

TRUE If fullscreen support is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_html5_database.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_html5_database.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_html5_database.html 2026-04-16 17:54:39.535699600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_html5_database.html 2026-07-09 07:33:42.638344000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE if IndexedDB support is enabled or FALSE otherwise.

+

TRUE if IndexedDB support is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_html5_local_storage.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_html5_local_storage.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_html5_local_storage.html 2026-04-16 17:54:39.553699500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_html5_local_storage.html 2026-07-09 07:33:42.641248700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If HTML5 local storage support is enabled or FALSE otherwise.

+

TRUE If HTML5 local storage support is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_hyperlink_auditing.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_hyperlink_auditing.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_hyperlink_auditing.html 2026-04-16 17:54:39.561699600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_hyperlink_auditing.html 2026-07-09 07:33:42.644208700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@

Type: gboolean

-

TRUE If hyper link auditing is enabled or FALSE otherwise.

+

TRUE If hyper link auditing is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_javascript.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_javascript.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_javascript.html 2026-04-16 17:54:39.569699500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_javascript.html 2026-07-09 07:33:42.647179400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If JavaScript is enabled or FALSE otherwise.

+

TRUE If JavaScript is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_javascript_markup.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_javascript_markup.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_javascript_markup.html 2026-04-16 17:54:39.577699700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_javascript_markup.html 2026-07-09 07:33:42.649803400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE if JavaScript markup is enabled or FALSE otherwise.

+

TRUE if JavaScript markup is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_media.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_media.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_media.html 2026-04-16 17:54:39.585699600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_media.html 2026-07-09 07:33:42.652710000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE if media support is enabled or FALSE otherwise.

+

TRUE if media support is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_media_capabilities.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_media_capabilities.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_media_capabilities.html 2026-04-16 17:54:39.593699700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_media_capabilities.html 2026-07-09 07:33:42.655354000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE if MediaCapabilities support is enabled or FALSE otherwise.

+

TRUE if MediaCapabilities support is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_media_stream.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_media_stream.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_media_stream.html 2026-04-16 17:54:39.600699700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_media_stream.html 2026-07-09 07:33:42.658265800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If mediastream support is enabled or FALSE otherwise.

+

TRUE If mediastream support is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_mediasource.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_mediasource.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_mediasource.html 2026-04-16 17:54:39.608699600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_mediasource.html 2026-07-09 07:33:42.661006200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If MediaSource support is enabled or FALSE otherwise.

+

TRUE If MediaSource support is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_mock_capture_devices.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_mock_capture_devices.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_mock_capture_devices.html 2026-04-16 17:54:39.616699700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_mock_capture_devices.html 2026-07-09 07:33:42.663942000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If mock capture devices is enabled or FALSE otherwise.

+

TRUE If mock capture devices is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_offline_web_application_cache.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_offline_web_application_cache.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_offline_web_application_cache.html 2026-04-16 17:54:39.625699800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_offline_web_application_cache.html 2026-07-09 07:33:42.666721600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@

Type: gboolean

-

FALSE.

+

FALSE.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_page_cache.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_page_cache.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_page_cache.html 2026-04-16 17:54:39.632699700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_page_cache.html 2026-07-09 07:33:42.669674200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE if page cache enabled or FALSE otherwise.

+

TRUE if page cache enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_resizable_text_areas.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_resizable_text_areas.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_resizable_text_areas.html 2026-04-16 17:54:39.640699600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_resizable_text_areas.html 2026-07-09 07:33:42.672345900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If text areas can be resized or FALSE otherwise.

+

TRUE If text areas can be resized or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_site_specific_quirks.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_site_specific_quirks.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_site_specific_quirks.html 2026-04-16 17:54:39.648699800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_site_specific_quirks.html 2026-07-09 07:33:42.675327500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE if site specific quirks are enabled or FALSE otherwise.

+

TRUE if site specific quirks are enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_smooth_scrolling.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_smooth_scrolling.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_smooth_scrolling.html 2026-04-16 17:54:39.655699700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_smooth_scrolling.html 2026-07-09 07:33:42.677963500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE if smooth scrolling is enabled or FALSE otherwise.

+

TRUE if smooth scrolling is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_spatial_navigation.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_spatial_navigation.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_spatial_navigation.html 2026-04-16 17:54:39.663699600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_spatial_navigation.html 2026-07-09 07:33:42.680940600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If HTML5 spatial navigation support is enabled or FALSE otherwise.

+

TRUE If HTML5 spatial navigation support is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_tabs_to_links.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_tabs_to_links.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_tabs_to_links.html 2026-04-16 17:54:39.671699800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_tabs_to_links.html 2026-07-09 07:33:42.683615700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If tabs to link is enabled or FALSE otherwise.

+

TRUE If tabs to link is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_webaudio.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_webaudio.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_webaudio.html 2026-04-16 17:54:39.678699700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_webaudio.html 2026-07-09 07:33:42.686690800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If webaudio support is enabled or FALSE otherwise.

+

TRUE If webaudio support is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_webgl.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_webgl.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_webgl.html 2026-04-16 17:54:39.686699600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_webgl.html 2026-07-09 07:33:42.689363700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If WebGL support is enabled or FALSE otherwise.

+

TRUE If WebGL support is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_webrtc.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_webrtc.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_webrtc.html 2026-04-16 17:54:39.694699800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_webrtc.html 2026-07-09 07:33:42.692420700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If WebRTC support is enabled or FALSE otherwise.

+

TRUE If WebRTC support is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_write_console_messages_to_stdout.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_write_console_messages_to_stdout.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_enable_write_console_messages_to_stdout.html 2026-04-16 17:54:39.702699700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_enable_write_console_messages_to_stdout.html 2026-07-09 07:33:42.695153200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,8 +403,8 @@

Type: gboolean

-

TRUE if writing console messages to stdout is enabled or FALSE -otherwise.

+

TRUE if writing console messages to stdout is enabled or FALSE +otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_fantasy_font_family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_fantasy_font_family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_fantasy_font_family.html 2026-04-16 17:54:39.710699800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_fantasy_font_family.html 2026-07-09 07:33:42.697985600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,14 +403,14 @@

Type: const gchar*

-

The default font family used to display content marked with fantasy font.

+

The default font family used to display content marked with fantasy font.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_feature_enabled.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_feature_enabled.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_feature_enabled.html 2026-04-16 17:54:39.718699700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_feature_enabled.html 2026-07-09 07:33:42.700942000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -396,7 +396,7 @@
feature

Type: WebKitFeature

-

The feature to toggle.

+

The feature to toggle.

@@ -428,7 +428,7 @@

Type: gboolean

-

Whether the feature is enabled.

+

Whether the feature is enabled.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_hardware_acceleration_policy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_hardware_acceleration_policy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_hardware_acceleration_policy.html 2026-04-16 17:54:39.726699800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_hardware_acceleration_policy.html 2026-07-09 07:33:42.703787000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: WebKitHardwareAccelerationPolicy

-

A WebKitHardwareAccelerationPolicy.

+

A WebKitHardwareAccelerationPolicy.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_javascript_can_access_clipboard.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_javascript_can_access_clipboard.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_javascript_can_access_clipboard.html 2026-04-16 17:54:39.734699700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_javascript_can_access_clipboard.html 2026-07-09 07:33:42.706492000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If javascript-can-access-clipboard is enabled or FALSE otherwise.

+

TRUE If javascript-can-access-clipboard is enabled or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_javascript_can_open_windows_automatically.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_javascript_can_open_windows_automatically.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_javascript_can_open_windows_automatically.html 2026-04-16 17:54:39.742699900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_javascript_can_open_windows_automatically.html 2026-07-09 07:33:42.709480300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If JavaScript can open window automatically or FALSE otherwise.

+

TRUE If JavaScript can open window automatically or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_load_icons_ignoring_image_load_setting.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_load_icons_ignoring_image_load_setting.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_load_icons_ignoring_image_load_setting.html 2026-04-16 17:54:39.750699800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_load_icons_ignoring_image_load_setting.html 2026-07-09 07:33:42.712310600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@

Type: gboolean

-

FALSE.

+

FALSE.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_math_font_family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_math_font_family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_math_font_family.html 2026-04-16 17:54:39.758700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_math_font_family.html 2026-07-09 07:33:42.715263000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,15 +403,15 @@

Type: const gchar*

-

The default font family used to display content marked with math font.

-

Since 2.52

+

The default font family used to display content marked with math font.

+

Since 2.52

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_media_content_types_requiring_hardware_support.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_media_content_types_requiring_hardware_support.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_media_content_types_requiring_hardware_support.html 2026-04-16 17:54:39.765699900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_media_content_types_requiring_hardware_support.html 2026-07-09 07:33:42.717897400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,14 +403,14 @@

Type: const gchar*

-

Media content types requiring hardware support, or NULL.

+

Media content types requiring hardware support, or NULL.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_media_playback_allows_inline.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_media_playback_allows_inline.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_media_playback_allows_inline.html 2026-04-16 17:54:39.773699800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_media_playback_allows_inline.html 2026-07-09 07:33:42.720995700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,8 +403,8 @@

Type: gboolean

-

TRUE If inline playback is allowed for media - or FALSE if only fullscreen playback is allowed.

+

TRUE If inline playback is allowed for media + or FALSE if only fullscreen playback is allowed.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_media_playback_requires_user_gesture.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_media_playback_requires_user_gesture.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_media_playback_requires_user_gesture.html 2026-04-16 17:54:39.781700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_media_playback_requires_user_gesture.html 2026-07-09 07:33:42.723776800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,8 +403,8 @@

Type: gboolean

-

TRUE If an user gesture is needed to play or load media - or FALSE if no user gesture is needed.

+

TRUE If an user gesture is needed to play or load media + or FALSE if no user gesture is needed.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_minimum_font_size.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_minimum_font_size.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_minimum_font_size.html 2026-04-16 17:54:39.788699900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_minimum_font_size.html 2026-07-09 07:33:42.726507700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: guint32

-

Minimum font size, in pixels.

+

Minimum font size, in pixels.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_monospace_font_family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_monospace_font_family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_monospace_font_family.html 2026-04-16 17:54:39.796700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_monospace_font_family.html 2026-07-09 07:33:42.729028000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,14 +403,14 @@

Type: const gchar*

-

Default font family used to display content marked with monospace font.

+

Default font family used to display content marked with monospace font.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_pictograph_font_family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_pictograph_font_family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_pictograph_font_family.html 2026-04-16 17:54:39.803700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_pictograph_font_family.html 2026-07-09 07:33:42.731875400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,14 +403,14 @@

Type: const gchar*

-

The default font family used to display content marked with pictograph font.

+

The default font family used to display content marked with pictograph font.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_print_backgrounds.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_print_backgrounds.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_print_backgrounds.html 2026-04-16 17:54:39.811699900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_print_backgrounds.html 2026-07-09 07:33:42.734559500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,7 +403,7 @@

Type: gboolean

-

TRUE If background images should be printed or FALSE otherwise.

+

TRUE If background images should be printed or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_sans_serif_font_family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_sans_serif_font_family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_sans_serif_font_family.html 2026-04-16 17:54:39.818699800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_sans_serif_font_family.html 2026-07-09 07:33:42.737419400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,14 +403,14 @@

Type: const gchar*

-

The default font family used to display content marked with sans-serif font.

+

The default font family used to display content marked with sans-serif font.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_serif_font_family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_serif_font_family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_serif_font_family.html 2026-04-16 17:54:39.826700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_serif_font_family.html 2026-07-09 07:33:42.739995500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,14 +403,14 @@

Type: const gchar*

-

The default font family used to display content marked with serif font.

+

The default font family used to display content marked with serif font.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_user_agent.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_user_agent.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_user_agent.html 2026-04-16 17:54:39.833700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_user_agent.html 2026-07-09 07:33:42.742791700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,14 +403,14 @@

Type: const gchar*

-

The current value of the user-agent property.

+

The current value of the user-agent property.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_webrtc_udp_ports_range.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_webrtc_udp_ports_range.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_webrtc_udp_ports_range.html 2026-04-16 17:54:39.842700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_webrtc_udp_ports_range.html 2026-07-09 07:33:42.745593500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,14 +403,14 @@

Type: const gchar*

-

The WebRTC UDP ports range, or NULL if un-set.

+

The WebRTC UDP ports range, or NULL if un-set.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_zoom_text_only.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_zoom_text_only.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.get_zoom_text_only.html 2026-04-16 17:54:39.850700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.get_zoom_text_only.html 2026-07-09 07:33:42.748141000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -403,8 +403,8 @@

Type: gboolean

-

TRUE If zoom level of the view should only affect the text - or FALSE if all view contents should be scaled.

+

TRUE If zoom level of the view should only affect the text + or FALSE if all view contents should be scaled.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_allow_file_access_from_file_urls.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_allow_file_access_from_file_urls.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_allow_file_access_from_file_urls.html 2026-04-16 17:54:39.857699900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_allow_file_access_from_file_urls.html 2026-07-09 07:33:42.751227900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
allowed

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_allow_modal_dialogs.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_allow_modal_dialogs.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_allow_modal_dialogs.html 2026-04-16 17:54:39.865700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_allow_modal_dialogs.html 2026-07-09 07:33:42.754166000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
allowed

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_allow_top_navigation_to_data_urls.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_allow_top_navigation_to_data_urls.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_allow_top_navigation_to_data_urls.html 2026-04-16 17:54:39.872700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_allow_top_navigation_to_data_urls.html 2026-07-09 07:33:42.756270200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
allowed

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_allow_universal_access_from_file_urls.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_allow_universal_access_from_file_urls.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_allow_universal_access_from_file_urls.html 2026-04-16 17:54:39.880700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_allow_universal_access_from_file_urls.html 2026-07-09 07:33:42.759533400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
allowed

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_auto_load_images.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_auto_load_images.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_auto_load_images.html 2026-04-16 17:54:39.887700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_auto_load_images.html 2026-07-09 07:33:42.762061800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_cursive_font_family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_cursive_font_family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_cursive_font_family.html 2026-04-16 17:54:39.895700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_cursive_font_family.html 2026-07-09 07:33:42.764882300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
cursive_font_family

Type: const gchar*

-

The new default cursive font family.

+

The new default cursive font family.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_default_charset.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_default_charset.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_default_charset.html 2026-04-16 17:54:39.903700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_default_charset.html 2026-07-09 07:33:42.767437700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
default_charset

Type: const gchar*

-

Default charset to be set.

+

Default charset to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_default_font_family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_default_font_family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_default_font_family.html 2026-04-16 17:54:39.910700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_default_font_family.html 2026-07-09 07:33:42.770231700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
default_font_family

Type: const gchar*

-

The new default font family.

+

The new default font family.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_default_font_size.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_default_font_size.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_default_font_size.html 2026-04-16 17:54:39.917700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_default_font_size.html 2026-07-09 07:33:42.772786600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
font_size

Type: guint32

-

Default font size to be set in pixels.

+

Default font size to be set in pixels.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_default_monospace_font_size.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_default_monospace_font_size.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_default_monospace_font_size.html 2026-04-16 17:54:39.924700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_default_monospace_font_size.html 2026-07-09 07:33:42.775629800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
font_size

Type: guint32

-

Default monospace font size to be set in pixels.

+

Default monospace font size to be set in pixels.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_disable_web_security.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_disable_web_security.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_disable_web_security.html 2026-04-16 17:54:39.932700200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_disable_web_security.html 2026-07-09 07:33:42.778176500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
disabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_draw_compositing_indicators.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_draw_compositing_indicators.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_draw_compositing_indicators.html 2026-04-16 17:54:39.940700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_draw_compositing_indicators.html 2026-07-09 07:33:42.780960600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_2d_canvas_acceleration.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_2d_canvas_acceleration.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_2d_canvas_acceleration.html 2026-04-16 17:54:39.947700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_2d_canvas_acceleration.html 2026-07-09 07:33:42.783501900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_back_forward_navigation_gestures.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_back_forward_navigation_gestures.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_back_forward_navigation_gestures.html 2026-04-16 17:54:39.954700200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_back_forward_navigation_gestures.html 2026-07-09 07:33:42.786385000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_caret_browsing.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_caret_browsing.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_caret_browsing.html 2026-04-16 17:54:39.962700100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_caret_browsing.html 2026-07-09 07:33:42.788986400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_developer_extras.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_developer_extras.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_developer_extras.html 2026-04-16 17:54:39.970700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_developer_extras.html 2026-07-09 07:33:42.791794000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_dns_prefetching.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_dns_prefetching.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_dns_prefetching.html 2026-04-16 17:54:39.978700200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_dns_prefetching.html 2026-07-09 07:33:42.794604000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -405,7 +405,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_encrypted_media.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_encrypted_media.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_encrypted_media.html 2026-04-16 17:54:39.985700100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_encrypted_media.html 2026-07-09 07:33:42.797440500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_fullscreen.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_fullscreen.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_fullscreen.html 2026-04-16 17:54:39.992700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_fullscreen.html 2026-07-09 07:33:42.799891000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_html5_database.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_html5_database.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_html5_database.html 2026-04-16 17:54:40.002700000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_html5_database.html 2026-07-09 07:33:42.802648500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_html5_local_storage.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_html5_local_storage.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_html5_local_storage.html 2026-04-16 17:54:40.009700300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_html5_local_storage.html 2026-07-09 07:33:42.805176700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_hyperlink_auditing.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_hyperlink_auditing.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_hyperlink_auditing.html 2026-04-16 17:54:40.017700200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_hyperlink_auditing.html 2026-07-09 07:33:42.808252300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -405,7 +405,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_javascript.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_javascript.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_javascript.html 2026-04-16 17:54:40.024700200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_javascript.html 2026-07-09 07:33:42.810705400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_javascript_markup.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_javascript_markup.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_javascript_markup.html 2026-04-16 17:54:40.032700300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_javascript_markup.html 2026-07-09 07:33:42.813496000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_media.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_media.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_media.html 2026-04-16 17:54:40.039700300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_media.html 2026-07-09 07:33:42.816025700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_media_capabilities.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_media_capabilities.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_media_capabilities.html 2026-04-16 17:54:40.046700200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_media_capabilities.html 2026-07-09 07:33:42.818692400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_media_stream.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_media_stream.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_media_stream.html 2026-04-16 17:54:40.053700200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_media_stream.html 2026-07-09 07:33:42.821480300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_mediasource.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_mediasource.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_mediasource.html 2026-04-16 17:54:40.061700300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_mediasource.html 2026-07-09 07:33:42.824379400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_mock_capture_devices.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_mock_capture_devices.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_mock_capture_devices.html 2026-04-16 17:54:40.068700300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_mock_capture_devices.html 2026-07-09 07:33:42.826922200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_offline_web_application_cache.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_offline_web_application_cache.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_offline_web_application_cache.html 2026-04-16 17:54:40.076700200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_offline_web_application_cache.html 2026-07-09 07:33:42.829973000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -405,7 +405,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_page_cache.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_page_cache.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_page_cache.html 2026-04-16 17:54:40.084700300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_page_cache.html 2026-07-09 07:33:42.832445900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_resizable_text_areas.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_resizable_text_areas.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_resizable_text_areas.html 2026-04-16 17:54:40.091700300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_resizable_text_areas.html 2026-07-09 07:33:42.835230800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_site_specific_quirks.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_site_specific_quirks.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_site_specific_quirks.html 2026-04-16 17:54:40.099700200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_site_specific_quirks.html 2026-07-09 07:33:42.837739700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_smooth_scrolling.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_smooth_scrolling.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_smooth_scrolling.html 2026-04-16 17:54:40.106700400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_smooth_scrolling.html 2026-07-09 07:33:42.840486300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_spatial_navigation.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_spatial_navigation.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_spatial_navigation.html 2026-04-16 17:54:40.113700400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_spatial_navigation.html 2026-07-09 07:33:42.843033000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_tabs_to_links.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_tabs_to_links.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_tabs_to_links.html 2026-04-16 17:54:40.121700300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_tabs_to_links.html 2026-07-09 07:33:42.845889600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_webaudio.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_webaudio.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_webaudio.html 2026-04-16 17:54:40.128700300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_webaudio.html 2026-07-09 07:33:42.848421600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_webgl.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_webgl.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_webgl.html 2026-04-16 17:54:40.135700500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_webgl.html 2026-07-09 07:33:42.851218000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_webrtc.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_webrtc.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_webrtc.html 2026-04-16 17:54:40.144700300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_webrtc.html 2026-07-09 07:33:42.854065400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -405,7 +405,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_write_console_messages_to_stdout.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_write_console_messages_to_stdout.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_enable_write_console_messages_to_stdout.html 2026-04-16 17:54:40.151700500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_enable_write_console_messages_to_stdout.html 2026-07-09 07:33:42.856905700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_fantasy_font_family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_fantasy_font_family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_fantasy_font_family.html 2026-04-16 17:54:40.159700400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_fantasy_font_family.html 2026-07-09 07:33:42.859468000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
fantasy_font_family

Type: const gchar*

-

The new default fantasy font family.

+

The new default fantasy font family.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_feature_enabled.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_feature_enabled.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_feature_enabled.html 2026-04-16 17:54:40.169700400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_feature_enabled.html 2026-07-09 07:33:42.863321000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -401,7 +401,7 @@
feature

Type: WebKitFeature

-

The feature to toggle.

+

The feature to toggle.

@@ -418,7 +418,7 @@
enabled

Type: gboolean

-

Whether the feature will be enabled.

+

Whether the feature will be enabled.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_hardware_acceleration_policy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_hardware_acceleration_policy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_hardware_acceleration_policy.html 2026-04-16 17:54:40.177700500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_hardware_acceleration_policy.html 2026-07-09 07:33:42.865982000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
policy

Type: WebKitHardwareAccelerationPolicy

-

A WebKitHardwareAccelerationPolicy.

+

A WebKitHardwareAccelerationPolicy.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_javascript_can_access_clipboard.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_javascript_can_access_clipboard.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_javascript_can_access_clipboard.html 2026-04-16 17:54:40.184700500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_javascript_can_access_clipboard.html 2026-07-09 07:33:42.868859500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_javascript_can_open_windows_automatically.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_javascript_can_open_windows_automatically.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_javascript_can_open_windows_automatically.html 2026-04-16 17:54:40.191700500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_javascript_can_open_windows_automatically.html 2026-07-09 07:33:42.871343400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_load_icons_ignoring_image_load_setting.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_load_icons_ignoring_image_load_setting.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_load_icons_ignoring_image_load_setting.html 2026-04-16 17:54:40.199700400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_load_icons_ignoring_image_load_setting.html 2026-07-09 07:33:42.874401600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -405,7 +405,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_math_font_family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_math_font_family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_math_font_family.html 2026-04-16 17:54:40.207700500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_math_font_family.html 2026-07-09 07:33:42.877032500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -405,7 +405,7 @@
math_font_family

Type: const gchar*

-

The new default math font family.

+

The new default math font family.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_media_content_types_requiring_hardware_support.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_media_content_types_requiring_hardware_support.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_media_content_types_requiring_hardware_support.html 2026-04-16 17:54:40.215700400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_media_content_types_requiring_hardware_support.html 2026-07-09 07:33:42.880162500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
content_types

Type: const gchar*

-

List of media content types requiring hardware support split by semicolons (:) or NULL to use the default value.

+

List of media content types requiring hardware support split by semicolons (:) or NULL to use the default value.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_media_playback_allows_inline.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_media_playback_allows_inline.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_media_playback_allows_inline.html 2026-04-16 17:54:40.222700600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_media_playback_allows_inline.html 2026-07-09 07:33:42.882786000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_media_playback_requires_user_gesture.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_media_playback_requires_user_gesture.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_media_playback_requires_user_gesture.html 2026-04-16 17:54:40.231700400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_media_playback_requires_user_gesture.html 2026-07-09 07:33:42.885931700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_minimum_font_size.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_minimum_font_size.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_minimum_font_size.html 2026-04-16 17:54:40.238700600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_minimum_font_size.html 2026-07-09 07:33:42.888466800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
font_size

Type: guint32

-

Minimum font size to be set in pixels.

+

Minimum font size to be set in pixels.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_monospace_font_family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_monospace_font_family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_monospace_font_family.html 2026-04-16 17:54:40.246700500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_monospace_font_family.html 2026-07-09 07:33:42.891312600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
monospace_font_family

Type: const gchar*

-

The new default monospace font family.

+

The new default monospace font family.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_pictograph_font_family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_pictograph_font_family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_pictograph_font_family.html 2026-04-16 17:54:40.253700500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_pictograph_font_family.html 2026-07-09 07:33:42.893904700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
pictograph_font_family

Type: const gchar*

-

The new default pictograph font family.

+

The new default pictograph font family.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_print_backgrounds.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_print_backgrounds.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_print_backgrounds.html 2026-04-16 17:54:40.260700500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_print_backgrounds.html 2026-07-09 07:33:42.896706300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
print_backgrounds

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_sans_serif_font_family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_sans_serif_font_family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_sans_serif_font_family.html 2026-04-16 17:54:40.268700600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_sans_serif_font_family.html 2026-07-09 07:33:42.899308700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
sans_serif_font_family

Type: const gchar*

-

The new default sans-serif font family.

+

The new default sans-serif font family.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_serif_font_family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_serif_font_family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_serif_font_family.html 2026-04-16 17:54:40.275700600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_serif_font_family.html 2026-07-09 07:33:42.902132700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
serif_font_family

Type: const gchar*

-

The new default serif font family.

+

The new default serif font family.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_user_agent.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_user_agent.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_user_agent.html 2026-04-16 17:54:40.283700500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_user_agent.html 2026-07-09 07:33:42.904821600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
user_agent

Type: const gchar*

-

The new custom user agent string or NULL to use the default user agent.

+

The new custom user agent string or NULL to use the default user agent.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_user_agent_with_application_details.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_user_agent_with_application_details.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_user_agent_with_application_details.html 2026-04-16 17:54:40.294700600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_user_agent_with_application_details.html 2026-07-09 07:33:42.908886000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -400,7 +400,7 @@
application_name

Type: const gchar*

-

The application name used for the user agent or NULL to use the default user agent.

+

The application name used for the user agent or NULL to use the default user agent.

The argument can be NULL.
@@ -417,7 +417,7 @@
application_version

Type: const gchar*

-

The application version for the user agent or NULL to user the default version.

+

The application version for the user agent or NULL to user the default version.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_webrtc_udp_ports_range.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_webrtc_udp_ports_range.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_webrtc_udp_ports_range.html 2026-04-16 17:54:40.301700600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_webrtc_udp_ports_range.html 2026-07-09 07:33:42.911596800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
udp_port_range

Type: const gchar*

-

Value to be set.

+

Value to be set.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_zoom_text_only.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_zoom_text_only.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.Settings.set_zoom_text_only.html 2026-04-16 17:54:40.309700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.Settings.set_zoom_text_only.html 2026-07-09 07:33:42.914423700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -320,7 +320,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -404,7 +404,7 @@
zoom_text_only

Type: gboolean

-

Value to be set.

+

Value to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIRequest.get_http_headers.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIRequest.get_http_headers.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIRequest.get_http_headers.html 2026-04-16 17:54:40.590701000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIRequest.get_http_headers.html 2026-07-09 07:33:43.008481000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -163,15 +163,15 @@

Type: SoupMessageHeaders

-

A SoupMessageHeaders with the HTTP headers of request - or NULL if request is not an HTTP request.

+

A SoupMessageHeaders with the HTTP headers of request + or NULL if request is not an HTTP request.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIRequest.get_http_method.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIRequest.get_http_method.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIRequest.get_http_method.html 2026-04-16 17:54:40.597701000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIRequest.get_http_method.html 2026-07-09 07:33:43.011175000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -163,15 +163,15 @@

Type: const gchar*

-

The HTTP method of the WebKitURIRequest or NULL if request is not - an HTTP request.

+

The HTTP method of the WebKitURIRequest or NULL if request is not + an HTTP request.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIRequest.get_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIRequest.get_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIRequest.get_uri.html 2026-04-16 17:54:40.603701000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIRequest.get_uri.html 2026-07-09 07:33:43.013626800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: const gchar*

-

Request URI, as a string.

+

Request URI, as a string.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIRequest.set_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIRequest.set_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIRequest.set_uri.html 2026-04-16 17:54:40.610701000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIRequest.set_uri.html 2026-07-09 07:33:43.015920600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -172,7 +172,7 @@
uri

Type: const gchar*

-

An URI.

+

An URI.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIResponse.get_content_length.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIResponse.get_content_length.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIResponse.get_content_length.html 2026-04-16 17:54:40.673701000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIResponse.get_content_length.html 2026-07-09 07:33:43.039484300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -176,7 +176,7 @@

Type: guint64

-

The expected content length of response.

+

The expected content length of response.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIResponse.get_http_headers.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIResponse.get_http_headers.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIResponse.get_http_headers.html 2026-04-16 17:54:40.681701200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIResponse.get_http_headers.html 2026-07-09 07:33:43.042487600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,15 +175,15 @@

Type: SoupMessageHeaders

-

A SoupMessageHeaders with the HTTP headers of response - or NULL if response is not an HTTP response.

+

A SoupMessageHeaders with the HTTP headers of response + or NULL if response is not an HTTP response.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIResponse.get_mime_type.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIResponse.get_mime_type.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIResponse.get_mime_type.html 2026-04-16 17:54:40.687701200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIResponse.get_mime_type.html 2026-07-09 07:33:43.045028400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: const gchar*

-

MIME type, as a string.

+

MIME type, as a string.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIResponse.get_status_code.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIResponse.get_status_code.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIResponse.get_status_code.html 2026-04-16 17:54:40.694701200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIResponse.get_status_code.html 2026-07-09 07:33:43.047657500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@

Type: guint

-

The status code of response.

+

The status code of response.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIResponse.get_suggested_filename.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIResponse.get_suggested_filename.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIResponse.get_suggested_filename.html 2026-04-16 17:54:40.701701200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIResponse.get_suggested_filename.html 2026-07-09 07:33:43.050759800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -177,15 +177,15 @@

Type: const gchar*

-

The suggested filename or NULL if - the ‘Content-Disposition’ HTTP header is not present.

+

The suggested filename or NULL if + the ‘Content-Disposition’ HTTP header is not present.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIResponse.get_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIResponse.get_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URIResponse.get_uri.html 2026-04-16 17:54:40.707701200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URIResponse.get_uri.html 2026-07-09 07:33:43.052903200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: const gchar*

-

Response URI, as a string.

+

Response URI, as a string.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.finish.html 2026-04-16 17:54:40.795701300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.finish.html 2026-07-09 07:33:43.083044800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -178,7 +178,7 @@
stream

Type: GInputStream

-

A GInputStream to read the contents of the request.

+

A GInputStream to read the contents of the request.

@@ -195,7 +195,7 @@
stream_length

Type: gint64

-

The length of the stream or -1 if not known.

+

The length of the stream or -1 if not known.

@@ -212,7 +212,7 @@
content_type

Type: const gchar*

-

The content type of the stream or NULL if not known.

+

The content type of the stream or NULL if not known.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.finish_error.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.finish_error.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.finish_error.html 2026-04-16 17:54:40.802701200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.finish_error.html 2026-07-09 07:33:43.086120800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -176,7 +176,7 @@
error

Type: GError

-

A GError that will be passed to the WebKitWebView.

+

A GError that will be passed to the WebKitWebView.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.finish_with_response.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.finish_with_response.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.finish_with_response.html 2026-04-16 17:54:40.808701300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.finish_with_response.html 2026-07-09 07:33:43.088686200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -176,7 +176,7 @@
response

Type: WebKitURISchemeResponse

-

A WebKitURISchemeResponse.

+

A WebKitURISchemeResponse.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_http_body.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_http_body.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_http_body.html 2026-04-16 17:54:40.815701200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_http_body.html 2026-07-09 07:33:43.091550800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: GInputStream

-

(nullable): the body of the request.

+

(nullable): the body of the request.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_http_headers.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_http_headers.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_http_headers.html 2026-04-16 17:54:40.821701300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_http_headers.html 2026-07-09 07:33:43.094035100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: SoupMessageHeaders

-

The SoupMessageHeaders of the request.

+

The SoupMessageHeaders of the request.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_http_method.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_http_method.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_http_method.html 2026-04-16 17:54:40.828701300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_http_method.html 2026-07-09 07:33:43.096789800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: const gchar*

-

The HTTP method of the request.

+

The HTTP method of the request.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_path.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_path.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_path.html 2026-04-16 17:54:40.835701200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_path.html 2026-07-09 07:33:43.099149200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: const gchar*

-

The URI path of request.

+

The URI path of request.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_scheme.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_scheme.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_scheme.html 2026-04-16 17:54:40.841701300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_scheme.html 2026-07-09 07:33:43.101789000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: const gchar*

-

The URI scheme of request.

+

The URI scheme of request.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_uri.html 2026-04-16 17:54:40.849701400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_uri.html 2026-07-09 07:33:43.104161700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: const gchar*

-

The full URI of request.

+

The full URI of request.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_web_view.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_web_view.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_web_view.html 2026-04-16 17:54:40.856701400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeRequest.get_web_view.html 2026-07-09 07:33:43.106830100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: WebKitWebView

-

The WebKitWebView that initiated request.

+

The WebKitWebView that initiated request.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeResponse.set_content_type.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeResponse.set_content_type.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeResponse.set_content_type.html 2026-04-16 17:54:40.923701500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeResponse.set_content_type.html 2026-07-09 07:33:43.130427100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -162,7 +162,7 @@
content_type

Type: const gchar*

-

The content type of the stream.

+

The content type of the stream.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeResponse.set_http_headers.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeResponse.set_http_headers.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeResponse.set_http_headers.html 2026-04-16 17:54:40.930701500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeResponse.set_http_headers.html 2026-07-09 07:33:43.132943200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -164,7 +164,7 @@
headers

Type: SoupMessageHeaders

-

The HTTP headers to be set.

+

The HTTP headers to be set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeResponse.set_status.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeResponse.set_status.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.URISchemeResponse.set_status.html 2026-04-16 17:54:40.939701600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.URISchemeResponse.set_status.html 2026-07-09 07:33:43.136390200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -164,7 +164,7 @@
status_code

Type: guint

-

The HTTP status code to be returned.

+

The HTTP status code to be returned.

@@ -181,7 +181,7 @@
reason_phrase

Type: const gchar*

-

A reason phrase.

+

A reason phrase.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilter.get_identifier.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilter.get_identifier.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilter.get_identifier.html 2026-04-16 17:54:35.586694000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilter.get_identifier.html 2026-07-09 07:33:41.294723700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -163,14 +163,14 @@

Type: const char*

-

The identifier for the filter.

+

The identifier for the filter.

The argument can be NULL.
- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilter.ref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilter.ref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilter.ref.html 2026-04-16 17:54:35.601694000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilter.ref.html 2026-07-09 07:33:41.301347000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -162,14 +162,14 @@

Type: WebKitUserContentFilter

-

The user_content_filter passed in.

+

The user_content_filter passed in.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilter.unref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilter.unref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilter.unref.html 2026-04-16 17:54:35.608694000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilter.unref.html 2026-07-09 07:33:41.306985400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.fetch_identifiers.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.fetch_identifiers.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.fetch_identifiers.html 2026-04-16 17:54:41.019701500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.fetch_identifiers.html 2026-07-09 07:33:43.168423200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,7 +183,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -200,7 +200,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the removal is completed.

+

A GAsyncReadyCallback to call when the removal is completed.

The argument can be NULL.
@@ -217,7 +217,7 @@
user_data

Type: gpointer

-

The data to pass to the callback function.

+

The data to pass to the callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.fetch_identifiers_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.fetch_identifiers_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.fetch_identifiers_finish.html 2026-04-16 17:54:41.028701500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.fetch_identifiers_finish.html 2026-07-09 07:33:43.171572000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -180,7 +180,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -212,14 +212,14 @@

Type: An array of utf8

-

A NULL-terminated list of filter identifiers.

+

A NULL-terminated list of filter identifiers.

- +
The array is NULL-terminated.
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
Each element is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.get_path.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.get_path.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.get_path.html 2026-04-16 17:54:41.034701600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.get_path.html 2026-07-09 07:33:43.174074000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,14 +185,14 @@

Type: const gchar*

-

Path, as a string.

+

Path, as a string.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.load.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.load.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.load.html 2026-04-16 17:54:41.047701600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.load.html 2026-07-09 07:33:43.179019000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,7 +185,7 @@
identifier

Type: const gchar*

-

A filter identifier.

+

A filter identifier.

@@ -202,7 +202,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -219,7 +219,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the load is completed.

+

A GAsyncReadyCallback to call when the load is completed.

The argument can be NULL.
@@ -236,7 +236,7 @@
user_data

Type: gpointer

-

The data to pass to the callback function.

+

The data to pass to the callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.load_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.load_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.load_finish.html 2026-04-16 17:54:41.055701700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.load_finish.html 2026-07-09 07:33:43.182443100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -223,14 +223,14 @@

Type: WebKitUserContentFilter

-

A WebKitUserContentFilter, or NULL if the load failed.

+

A WebKitUserContentFilter, or NULL if the load failed.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.remove.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.remove.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.remove.html 2026-04-16 17:54:41.067701600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.remove.html 2026-07-09 07:33:43.183448300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,7 +183,7 @@
identifier

Type: const gchar*

-

A filter identifier.

+

A filter identifier.

@@ -200,7 +200,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -217,7 +217,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the removal is completed.

+

A GAsyncReadyCallback to call when the removal is completed.

The argument can be NULL.
@@ -234,7 +234,7 @@
user_data

Type: gpointer

-

The data to pass to the callback function.

+

The data to pass to the callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.remove_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.remove_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.remove_finish.html 2026-04-16 17:54:41.076701600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.remove_finish.html 2026-07-09 07:33:43.190182700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -223,7 +223,7 @@

Type: gboolean

-

Whether the removal was successful.

+

Whether the removal was successful.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save.html 2026-04-16 17:54:41.091701700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save.html 2026-07-09 07:33:43.196371300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -190,7 +190,7 @@
identifier

Type: const gchar*

-

A string used to identify the saved filter.

+

A string used to identify the saved filter.

@@ -207,7 +207,7 @@
source

Type: GBytes

-

GBytes containing the rule set in JSON format.

+

GBytes containing the rule set in JSON format.

@@ -224,7 +224,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -241,7 +241,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when saving is completed.

+

A GAsyncReadyCallback to call when saving is completed.

The argument can be NULL.
@@ -258,7 +258,7 @@
user_data

Type: gpointer

-

The data to pass to the callback function.

+

The data to pass to the callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save_finish.html 2026-04-16 17:54:41.099701600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save_finish.html 2026-07-09 07:33:43.199790500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -223,14 +223,14 @@

Type: WebKitUserContentFilter

-

A WebKitUserContentFilter, or NULL if saving failed.

+

A WebKitUserContentFilter, or NULL if saving failed.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save_from_file.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save_from_file.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save_from_file.html 2026-04-16 17:54:41.114701700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save_from_file.html 2026-07-09 07:33:43.205515600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@
identifier

Type: const gchar*

-

A string used to identify the saved filter.

+

A string used to identify the saved filter.

@@ -204,7 +204,7 @@
file

Type: GFile

-

A GFile containing the rule set in JSON format.

+

A GFile containing the rule set in JSON format.

@@ -221,7 +221,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -238,7 +238,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when saving is completed.

+

A GAsyncReadyCallback to call when saving is completed.

The argument can be NULL.
@@ -255,7 +255,7 @@
user_data

Type: gpointer

-

The data to pass to the callback function.

+

The data to pass to the callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save_from_file_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save_from_file_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save_from_file_finish.html 2026-04-16 17:54:41.122701600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentFilterStore.save_from_file_finish.html 2026-07-09 07:33:43.208985800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -223,14 +223,14 @@

Type: WebKitUserContentFilter

-

A WebKitUserContentFilter, or NULL if saving failed.

+

A WebKitUserContentFilter, or NULL if saving failed.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.add_filter.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.add_filter.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.add_filter.html 2026-04-16 17:54:41.197702000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.add_filter.html 2026-07-09 07:33:43.237387400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,7 +185,7 @@
filter

Type: WebKitUserContentFilter

-

A WebKitUserContentFilter.

+

A WebKitUserContentFilter.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.add_script.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.add_script.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.add_script.html 2026-04-16 17:54:41.204702000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.add_script.html 2026-07-09 07:33:43.240259400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -184,7 +184,7 @@
script

Type: WebKitUserScript

-

A WebKitUserScript.

+

A WebKitUserScript.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.add_style_sheet.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.add_style_sheet.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.add_style_sheet.html 2026-04-16 17:54:41.212701800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.add_style_sheet.html 2026-07-09 07:33:43.243232000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -184,7 +184,7 @@
stylesheet

Type: WebKitUserStyleSheet

-

A WebKitUserStyleSheet.

+

A WebKitUserStyleSheet.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.register_script_message_handler.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.register_script_message_handler.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.register_script_message_handler.html 2026-04-16 17:54:41.228701800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.register_script_message_handler.html 2026-07-09 07:33:43.248778800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -202,7 +202,7 @@
name

Type: const char*

-

Name of the script message channel.

+

Name of the script message channel.

@@ -219,7 +219,7 @@
world_name

Type: const char*

-

The name of a WebKitScriptWorld.

+

The name of a WebKitScriptWorld.

@@ -251,7 +251,7 @@

Type: gboolean

-

TRUE if message handler was registered successfully, or FALSE otherwise.

+

TRUE if message handler was registered successfully, or FALSE otherwise.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.register_script_message_handler_with_reply.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.register_script_message_handler_with_reply.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.register_script_message_handler_with_reply.html 2026-04-16 17:54:41.240702000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.register_script_message_handler_with_reply.html 2026-07-09 07:33:43.253331700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -192,7 +192,7 @@
name

Type: const char*

-

Name of the script message channel.

+

Name of the script message channel.

@@ -209,7 +209,7 @@
world_name

Type: const char*

-

The name of a WebKitScriptWorld.

+

The name of a WebKitScriptWorld.

@@ -241,7 +241,7 @@

Type: gboolean

-

TRUE if message handler was registered successfully, or FALSE otherwise.

+

TRUE if message handler was registered successfully, or FALSE otherwise.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.remove_all_filters.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_all_filters.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.remove_all_filters.html 2026-04-16 17:54:41.246702000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_all_filters.html 2026-07-09 07:33:43.255433300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.remove_all_scripts.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_all_scripts.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.remove_all_scripts.html 2026-04-16 17:54:41.251701800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_all_scripts.html 2026-07-09 07:33:43.257302300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.remove_all_style_sheets.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_all_style_sheets.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.remove_all_style_sheets.html 2026-04-16 17:54:41.257701900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_all_style_sheets.html 2026-07-09 07:33:43.259081800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.remove_filter.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_filter.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.remove_filter.html 2026-04-16 17:54:41.264701800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_filter.html 2026-07-09 07:33:43.261823200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -121,7 +121,7 @@
-

since: 2.6

+

@@ -160,7 +160,7 @@
-

Available since: 2.6

+ @@ -183,7 +183,7 @@
filter

Type: WebKitUserContentFilter

-

A WebKitUserContentFilter.

+

A WebKitUserContentFilter.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.remove_filter_by_id.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_filter_by_id.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.remove_filter_by_id.html 2026-04-16 17:54:41.271702000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_filter_by_id.html 2026-07-09 07:33:43.264325600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -184,7 +184,7 @@
filter_id

Type: const char*

-

Filter identifier.

+

Filter identifier.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.remove_script.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_script.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.remove_script.html 2026-04-16 17:54:41.278702000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_script.html 2026-07-09 07:33:43.267181200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,7 +183,7 @@
script

Type: WebKitUserScript

-

A WebKitUserScript.

+

A WebKitUserScript.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.remove_style_sheet.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_style_sheet.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.remove_style_sheet.html 2026-04-16 17:54:41.285702000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.remove_style_sheet.html 2026-07-09 07:33:43.269720600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,7 +183,7 @@
stylesheet

Type: WebKitUserStyleSheet

-

A WebKitUserStyleSheet.

+

A WebKitUserStyleSheet.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.unregister_script_message_handler.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.unregister_script_message_handler.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserContentManager.unregister_script_message_handler.html 2026-04-16 17:54:41.296702000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserContentManager.unregister_script_message_handler.html 2026-07-09 07:33:43.273727000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -189,7 +189,7 @@
name

Type: const gchar*

-

Name of the script message channel.

+

Name of the script message channel.

@@ -206,7 +206,7 @@
world_name

Type: const gchar*

-

The name of a WebKitScriptWorld.

+

The name of a WebKitScriptWorld.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserMessage.get_fd_list.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserMessage.get_fd_list.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserMessage.get_fd_list.html 2026-04-16 17:54:41.444702100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserMessage.get_fd_list.html 2026-07-09 07:33:43.332286000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: GUnixFDList

-

The message list of file descriptors.

+

The message list of file descriptors.

The argument can be NULL.
- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserMessage.get_name.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserMessage.get_name.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserMessage.get_name.html 2026-04-16 17:54:41.450702200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserMessage.get_name.html 2026-07-09 07:33:43.334474600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: const char*

-

The message name.

+

The message name.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserMessage.get_parameters.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserMessage.get_parameters.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserMessage.get_parameters.html 2026-04-16 17:54:41.456702200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserMessage.get_parameters.html 2026-07-09 07:33:43.336996600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: GVariant

-

The message parameters.

+

The message parameters.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserMessage.send_reply.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserMessage.send_reply.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserMessage.send_reply.html 2026-04-16 17:54:41.464702100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserMessage.send_reply.html 2026-07-09 07:33:43.339498500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -166,7 +166,7 @@
reply

Type: WebKitUserMessage

-

A WebKitUserMessage to send as reply.

+

A WebKitUserMessage to send as reply.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserScript.ref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserScript.ref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserScript.ref.html 2026-04-16 17:54:35.692694200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserScript.ref.html 2026-07-09 07:33:41.355305400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -160,14 +160,14 @@

Type: WebKitUserScript

-

The passed WebKitUserScript.

+

The passed WebKitUserScript.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserScript.unref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserScript.unref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserScript.unref.html 2026-04-16 17:54:35.709694100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserScript.unref.html 2026-07-09 07:33:41.357665800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserStyleSheet.ref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserStyleSheet.ref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserStyleSheet.ref.html 2026-04-16 17:54:35.816694300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserStyleSheet.ref.html 2026-07-09 07:33:41.376195400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -160,14 +160,14 @@

Type: WebKitUserStyleSheet

-

The passed WebKitUserStyleSheet.

+

The passed WebKitUserStyleSheet.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserStyleSheet.unref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserStyleSheet.unref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.UserStyleSheet.unref.html 2026-04-16 17:54:35.829694300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.UserStyleSheet.unref.html 2026-07-09 07:33:41.378791300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.add_path_to_sandbox.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.add_path_to_sandbox.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.add_path_to_sandbox.html 2026-04-16 17:54:41.563702300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.add_path_to_sandbox.html 2026-07-09 07:33:43.378891500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -118,7 +118,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -201,7 +201,7 @@
path

Type: const char*

-

An absolute path to mount in the sandbox.

+

An absolute path to mount in the sandbox.

@@ -218,7 +218,7 @@
read_only

Type: gboolean

-

If TRUE the path will be read-only.

+

If TRUE the path will be read-only.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.get_cache_model.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_cache_model.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.get_cache_model.html 2026-04-16 17:54:41.569702400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_cache_model.html 2026-07-09 07:33:43.381724000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -118,7 +118,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -195,7 +195,7 @@

Type: WebKitCacheModel

-

The current WebKitCacheModel.

+

The current WebKitCacheModel.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.get_geolocation_manager.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_geolocation_manager.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.get_geolocation_manager.html 2026-04-16 17:54:41.576702400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_geolocation_manager.html 2026-07-09 07:33:43.384303000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -118,7 +118,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -193,14 +193,14 @@

Type: WebKitGeolocationManager

-

The WebKitGeolocationManager of context.

+

The WebKitGeolocationManager of context.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.get_network_session_for_automation.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_network_session_for_automation.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.get_network_session_for_automation.html 2026-04-16 17:54:41.584702500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_network_session_for_automation.html 2026-07-09 07:33:43.387289800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -118,7 +118,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -193,14 +193,14 @@

Type: WebKitNetworkSession

-

A WebKitNetworkSession, or NULL if automation is not enabled.

+

A WebKitNetworkSession, or NULL if automation is not enabled.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.get_security_manager.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_security_manager.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.get_security_manager.html 2026-04-16 17:54:41.590702300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_security_manager.html 2026-07-09 07:33:43.389796500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -118,7 +118,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -193,14 +193,14 @@

Type: WebKitSecurityManager

-

The WebKitSecurityManager of context.

+

The WebKitSecurityManager of context.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.get_spell_checking_enabled.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_spell_checking_enabled.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.get_spell_checking_enabled.html 2026-04-16 17:54:41.597702500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_spell_checking_enabled.html 2026-07-09 07:33:43.392497000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -118,7 +118,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -193,7 +193,7 @@

Type: gboolean

-

TRUE If spell checking is enabled, or FALSE otherwise.

+

TRUE If spell checking is enabled, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.get_spell_checking_languages.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_spell_checking_languages.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.get_spell_checking_languages.html 2026-04-16 17:54:41.605702400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_spell_checking_languages.html 2026-07-09 07:33:43.395511400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -118,7 +118,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -197,15 +197,15 @@

Type: An array of utf8

-

A NULL-terminated - array of languages if available, or NULL otherwise.

+

A NULL-terminated + array of languages if available, or NULL otherwise.

- +
The array is NULL-terminated.
The data is owned by the instance.
The returned data is owned by the instance.
Each element is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.get_time_zone_override.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_time_zone_override.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.get_time_zone_override.html 2026-04-16 17:54:41.611702400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.get_time_zone_override.html 2026-07-09 07:33:43.397380000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -118,7 +118,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -208,7 +208,7 @@ - The data is owned by the instance. + The returned data is owned by the instance. The value is a NUL terminated UTF-8 string. diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.initialize_notification_permissions.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.initialize_notification_permissions.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.initialize_notification_permissions.html 2026-04-16 17:54:41.622702400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.initialize_notification_permissions.html 2026-07-09 07:33:43.401906300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -118,7 +118,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -207,7 +207,7 @@
allowed_origins

Type: A list of WebKitSecurityOrigin*

-

A GList of security origins.

+

A GList of security origins.

@@ -224,7 +224,7 @@
disallowed_origins

Type: A list of WebKitSecurityOrigin*

-

A GList of security origins.

+

A GList of security origins.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.is_automation_allowed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.is_automation_allowed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.is_automation_allowed.html 2026-04-16 17:54:41.629702600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.is_automation_allowed.html 2026-07-09 07:33:43.404763500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -118,7 +118,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -194,7 +194,7 @@

Type: gboolean

-

TRUE if automation is allowed or FALSE otherwise.

+

TRUE if automation is allowed or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.register_uri_scheme.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.register_uri_scheme.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.register_uri_scheme.html 2026-04-16 17:54:41.647702500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.register_uri_scheme.html 2026-07-09 07:33:43.411430100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -118,7 +118,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -230,7 +230,7 @@
scheme

Type: const gchar*

-

The network scheme to register.

+

The network scheme to register.

@@ -247,7 +247,7 @@
callback

Type: WebKitURISchemeRequestCallback

-

A WebKitURISchemeRequestCallback.

+

A WebKitURISchemeRequestCallback.

@@ -264,7 +264,7 @@
user_data

Type: gpointer

-

Data to pass to callback function.

+

Data to pass to callback function.

@@ -281,7 +281,7 @@
user_data_destroy_func

Type: GDestroyNotify

-

Destroy notify for user_data.

+

Destroy notify for user_data.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.send_message_to_all_extensions.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.send_message_to_all_extensions.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.send_message_to_all_extensions.html 2026-04-16 17:54:41.654702400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.send_message_to_all_extensions.html 2026-07-09 07:33:43.414447300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -118,7 +118,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -195,7 +195,7 @@
message

Type: WebKitUserMessage

-

A WebKitUserMessage.

+

A WebKitUserMessage.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.set_automation_allowed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_automation_allowed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.set_automation_allowed.html 2026-04-16 17:54:41.663702500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_automation_allowed.html 2026-07-09 07:33:43.417591000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -118,7 +118,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -201,7 +201,7 @@
allowed

Type: gboolean

-

Value to set.

+

Value to set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.set_cache_model.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_cache_model.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.set_cache_model.html 2026-04-16 17:54:41.672702600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_cache_model.html 2026-07-09 07:33:43.421408700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -118,7 +118,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -210,7 +210,7 @@
cache_model

Type: WebKitCacheModel

-

A WebKitCacheModel.

+

A WebKitCacheModel.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.set_preferred_languages.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_preferred_languages.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.set_preferred_languages.html 2026-04-16 17:54:41.681702600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_preferred_languages.html 2026-07-09 07:33:43.424577700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -118,7 +118,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -203,7 +203,7 @@
languages

Type: An array of utf8

-

A NULL-terminated list of language identifiers.

+

A NULL-terminated list of language identifiers.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.set_spell_checking_enabled.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_spell_checking_enabled.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.set_spell_checking_enabled.html 2026-04-16 17:54:41.688702600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_spell_checking_enabled.html 2026-07-09 07:33:43.427084700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -118,7 +118,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -194,7 +194,7 @@
enabled

Type: gboolean

-

Value to be set.

+

Value to be set.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.set_spell_checking_languages.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_spell_checking_languages.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.set_spell_checking_languages.html 2026-04-16 17:54:41.695702600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_spell_checking_languages.html 2026-07-09 07:33:43.429895200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -118,7 +118,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -201,7 +201,7 @@
languages

Type: An array of gchar*

-

A NULL-terminated list of spell checking languages.

+

A NULL-terminated list of spell checking languages.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.set_web_process_extensions_directory.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_web_process_extensions_directory.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.set_web_process_extensions_directory.html 2026-04-16 17:54:41.703702400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_web_process_extensions_directory.html 2026-07-09 07:33:43.432927100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -118,7 +118,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -200,7 +200,7 @@
directory

Type: const gchar*

-

The directory to add.

+

The directory to add.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.set_web_process_extensions_initialization_user_data.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_web_process_extensions_initialization_user_data.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebContext.set_web_process_extensions_initialization_user_data.html 2026-04-16 17:54:41.710702700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebContext.set_web_process_extensions_initialization_user_data.html 2026-07-09 07:33:43.435694000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -118,7 +118,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -200,7 +200,7 @@
user_data

Type: GVariant

-

A GVariant.

+

A GVariant.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_action_icon.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_action_icon.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_action_icon.html 2026-04-16 17:54:41.853702800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_action_icon.html 2026-07-09 07:33:43.490772700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -210,7 +210,7 @@
width

Type: gdouble

-

The width to use when looking up the icon.

+

The width to use when looking up the icon.

@@ -227,7 +227,7 @@
height

Type: gdouble

-

The height to use when looking up the icon.

+

The height to use when looking up the icon.

@@ -259,14 +259,14 @@

Type: GIcon

-

The icon image, or NULL if no icon could be loaded.

+

The icon image, or NULL if no icon could be loaded.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_all_requested_match_patterns.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_all_requested_match_patterns.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_all_requested_match_patterns.html 2026-04-16 17:54:41.860702800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_all_requested_match_patterns.html 2026-07-09 07:33:43.493366200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -204,15 +204,15 @@

Type: An array of None

-

A - NULL-terminated array of match patterns matching all requested websites.

+

A + NULL-terminated array of match patterns matching all requested websites.

- +
The array is NULL-terminated.
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_default_locale.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_default_locale.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_default_locale.html 2026-04-16 17:54:41.867702700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_default_locale.html 2026-07-09 07:33:43.496097300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,15 +211,15 @@

Type: const gchar*

-

The default locale, or NULL if there was no default -locale specified.

+

The default locale, or NULL if there was no default +locale specified.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_display_action_label.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_display_action_label.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_display_action_label.html 2026-04-16 17:54:41.875702900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_display_action_label.html 2026-07-09 07:33:43.499131000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -214,15 +214,15 @@

Type: const gchar*

-

The localized display action label, or NULL if there -was no display action label specified.

+

The localized display action label, or NULL if there +was no display action label specified.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_display_description.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_display_description.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_display_description.html 2026-04-16 17:54:41.882702800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_display_description.html 2026-07-09 07:33:43.501901900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,15 +211,15 @@

Type: const gchar*

-

The localized display description, or NULL if there -was no display description specified.

+

The localized display description, or NULL if there +was no display description specified.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_display_name.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_display_name.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_display_name.html 2026-04-16 17:54:41.889702800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_display_name.html 2026-07-09 07:33:43.504327300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,15 +211,15 @@

Type: const gchar*

-

The localized name, or NULL if there was no -name specified.

+

The localized name, or NULL if there was no +name specified.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_display_short_name.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_display_short_name.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_display_short_name.html 2026-04-16 17:54:41.895702800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_display_short_name.html 2026-07-09 07:33:43.507048000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,15 +211,15 @@

Type: const gchar*

-

The localized name, or NULL if there was no -short name specified.

+

The localized name, or NULL if there was no +short name specified.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_display_version.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_display_version.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_display_version.html 2026-04-16 17:54:41.902702800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_display_version.html 2026-07-09 07:33:43.509529600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,15 +211,15 @@

Type: const gchar*

-

The localized display version, or NULL if there was no -display version specified.

+

The localized display version, or NULL if there was no +display version specified.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_has_background_content.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_background_content.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_has_background_content.html 2026-04-16 17:54:41.909702800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_background_content.html 2026-07-09 07:33:43.512258000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,8 +211,8 @@

Type: gboolean

-

TRUE if the extension can run in the background even when no -webpages are open.

+

TRUE if the extension can run in the background even when no +webpages are open.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_has_commands.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_commands.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_has_commands.html 2026-04-16 17:54:41.917703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_commands.html 2026-07-09 07:33:43.515128900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -216,8 +216,8 @@

Type: gboolean

-

TRUE if the extension contains one or more commands -that can be performed by the user.

+

TRUE if the extension contains one or more commands +that can be performed by the user.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_has_content_modification_rules.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_content_modification_rules.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_has_content_modification_rules.html 2026-04-16 17:54:41.924703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_content_modification_rules.html 2026-07-09 07:33:43.517872800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -212,8 +212,8 @@

Type: gboolean

-

TRUE if the extension contains one or more rules -for content modification.

+

TRUE if the extension contains one or more rules +for content modification.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_has_injected_content.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_injected_content.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_has_injected_content.html 2026-04-16 17:54:41.931702900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_injected_content.html 2026-07-09 07:33:43.520540700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -215,9 +215,9 @@

Type: gboolean

-

TRUE if the extension has content that can be +

TRUE if the extension has content that can be injected by matching against the extension’s -requested match patterns.

+requested match patterns.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_has_options_page.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_options_page.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_has_options_page.html 2026-04-16 17:54:41.939703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_options_page.html 2026-07-09 07:33:43.523797300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -214,8 +214,8 @@

Type: gboolean

-

TRUE if the extension includes a dedicated options -page where users can customize settings.

+

TRUE if the extension includes a dedicated options +page where users can customize settings.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_has_override_new_tab_page.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_override_new_tab_page.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_has_override_new_tab_page.html 2026-04-16 17:54:41.950703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_override_new_tab_page.html 2026-07-09 07:33:43.526620100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -216,9 +216,9 @@

Type: gboolean

-

TRUE if the extension can specify a custom page +

TRUE if the extension can specify a custom page that can be displayed when a new tab is opened in the app, -instead of the default new tab page.

+instead of the default new tab page.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_has_persistent_background_content.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_persistent_background_content.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_has_persistent_background_content.html 2026-04-16 17:54:41.957702900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_has_persistent_background_content.html 2026-07-09 07:33:43.529273500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -212,7 +212,7 @@

Type: gboolean

-

TRUE if the extension can run in the background.

+

TRUE if the extension can run in the background.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_icon.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_icon.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_icon.html 2026-04-16 17:54:41.971702800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_icon.html 2026-07-09 07:33:43.534313400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -208,7 +208,7 @@
width

Type: gdouble

-

The width to use when looking up the icon.

+

The width to use when looking up the icon.

@@ -225,7 +225,7 @@
height

Type: gdouble

-

The height to use when looking up the icon.

+

The height to use when looking up the icon.

@@ -257,14 +257,14 @@

Type: GIcon

-

The icon image, or NULL if no icon could be loaded.

+

The icon image, or NULL if no icon could be loaded.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_manifest_version.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_manifest_version.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_manifest_version.html 2026-04-16 17:54:41.978703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_manifest_version.html 2026-07-09 07:33:43.537275000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -214,7 +214,7 @@

Type: gdouble

-

The parsed manifest version.

+

The parsed manifest version.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_optional_permission_match_patterns.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_optional_permission_match_patterns.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_optional_permission_match_patterns.html 2026-04-16 17:54:41.985703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_optional_permission_match_patterns.html 2026-07-09 07:33:43.539791300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -204,15 +204,15 @@

Type: An array of None

-

A - NULL-terminated array of match patterns matching the optional websites.

+

A + NULL-terminated array of match patterns matching the optional websites.

- +
The array is NULL-terminated.
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_optional_permissions.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_optional_permissions.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_optional_permissions.html 2026-04-16 17:54:41.993703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_optional_permissions.html 2026-07-09 07:33:43.542869300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -213,17 +213,17 @@

Type: An array of utf8

-

A +

A NULL-terminated array of strings containing permission names, or NULL otherwise. This array and its contents are owned by -WebKit and should not be modified or freed.

+WebKit and should not be modified or freed.

- +
The array is NULL-terminated.
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
Each element is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_path.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_path.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_path.html 2026-04-16 17:54:42.000702900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_path.html 2026-07-09 07:33:43.545164600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,14 +211,14 @@

Type: const char*

-

The path of the extension folder.

+

The path of the extension folder.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_requested_permission_match_patterns.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_requested_permission_match_patterns.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_requested_permission_match_patterns.html 2026-04-16 17:54:42.007703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_requested_permission_match_patterns.html 2026-07-09 07:33:43.547910200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -203,15 +203,15 @@

Type: An array of None

-

A - NULL-terminated array of match patterns matching the required websites.

+

A + NULL-terminated array of match patterns matching the required websites.

- +
The array is NULL-terminated.
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_requested_permissions.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_requested_permissions.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_requested_permissions.html 2026-04-16 17:54:42.014703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_requested_permissions.html 2026-07-09 07:33:43.550603200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -212,17 +212,17 @@

Type: An array of utf8

-

A +

A NULL-terminated array of strings containing permission names, or NULL otherwise. This array and its contents are owned by -WebKit and should not be modified or freed.

+WebKit and should not be modified or freed.

- +
The array is NULL-terminated.
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
Each element is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_version.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_version.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.get_version.html 2026-04-16 17:54:42.021703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.get_version.html 2026-07-09 07:33:43.553273000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,15 +211,15 @@

Type: const gchar*

-

The version, or NULL if there was no -version specified.

+

The version, or NULL if there was no +version specified.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.supports_manifest_version.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.supports_manifest_version.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtension.supports_manifest_version.html 2026-04-16 17:54:42.029703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtension.supports_manifest_version.html 2026-07-09 07:33:43.556378400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -128,7 +128,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -204,7 +204,7 @@
manifest_version

Type: gdouble

-

The version number to check.

+

The version number to check.

@@ -236,8 +236,8 @@

Type: gboolean

-

TRUE if the extension specified a manifest version -that is greater than or equal to manifest_version.

+

TRUE if the extension specified a manifest version +that is greater than or equal to manifest_version.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_host.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_host.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_host.html 2026-04-16 17:54:35.905694500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_host.html 2026-07-09 07:33:41.405224300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: const gchar*

-

The host string.

+

The host string.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_matches_all_hosts.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_matches_all_hosts.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_matches_all_hosts.html 2026-04-16 17:54:35.924694500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_matches_all_hosts.html 2026-07-09 07:33:41.408761500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -176,7 +176,7 @@

Type: gboolean

-

Whether this match pattern matches all hosts.

+

Whether this match pattern matches all hosts.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_matches_all_urls.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_matches_all_urls.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_matches_all_urls.html 2026-04-16 17:54:35.940694600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_matches_all_urls.html 2026-07-09 07:33:41.411472000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -176,7 +176,7 @@

Type: gboolean

-

Whether this match pattern matches all URLs.

+

Whether this match pattern matches all URLs.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_path.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_path.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_path.html 2026-04-16 17:54:35.956694600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_path.html 2026-07-09 07:33:41.414597500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: const gchar*

-

The path string.

+

The path string.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_scheme.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_scheme.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_scheme.html 2026-04-16 17:54:35.968694400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_scheme.html 2026-07-09 07:33:41.417238500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: const gchar*

-

The scheme string.

+

The scheme string.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_string.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_string.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_string.html 2026-04-16 17:54:36.199694900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.get_string.html 2026-07-09 07:33:41.419881800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: const gchar*

-

The original pattern string.

+

The original pattern string.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.matches_pattern.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.matches_pattern.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.matches_pattern.html 2026-04-16 17:54:36.216694800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.matches_pattern.html 2026-07-09 07:33:41.424051800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -177,7 +177,7 @@
pattern

Type: WebKitWebExtensionMatchPattern

-

The WebKitWebExtensionMatchPattern to match with matchPattern.

+

The WebKitWebExtensionMatchPattern to match with matchPattern.

@@ -194,7 +194,7 @@
options

Type: WebKitWebExtensionMatchPatternOptions

-

The WebKitWebExtensionMatchPatternOptions use while matching.

+

The WebKitWebExtensionMatchPatternOptions use while matching.

@@ -226,7 +226,7 @@

Type: gboolean

-

Whether the pattern matches the specified pattern.

+

Whether the pattern matches the specified pattern.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.matches_url.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.matches_url.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.matches_url.html 2026-04-16 17:54:36.239694800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.matches_url.html 2026-07-09 07:33:41.428220000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -177,7 +177,7 @@
url

Type: const gchar*

-

The URL to match against the pattern.

+

The URL to match against the pattern.

@@ -194,7 +194,7 @@
options

Type: WebKitWebExtensionMatchPatternOptions

-

The WebKitWebExtensionMatchPatternOptions use while matching.

+

The WebKitWebExtensionMatchPatternOptions use while matching.

@@ -226,7 +226,7 @@

Type: gboolean

-

Whether the pattern matches the specified URL.

+

Whether the pattern matches the specified URL.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.ref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.ref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.ref.html 2026-04-16 17:54:36.258695000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.ref.html 2026-07-09 07:33:41.431330200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -176,14 +176,14 @@

Type: WebKitWebExtensionMatchPattern

-

The same matchPattern with an additional reference.

+

The same matchPattern with an additional reference.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.unref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.unref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.unref.html 2026-04-16 17:54:36.271695000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebExtensionMatchPattern.unref.html 2026-07-09 07:33:41.433548700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebInspector.attach.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.attach.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebInspector.attach.html 2026-04-16 17:54:42.164703100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.attach.html 2026-07-09 07:33:43.603123200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebInspector.close.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.close.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebInspector.close.html 2026-04-16 17:54:42.169703200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.close.html 2026-07-09 07:33:43.604864400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebInspector.detach.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.detach.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebInspector.detach.html 2026-04-16 17:54:42.175703300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.detach.html 2026-07-09 07:33:43.607102900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebInspector.get_attached_height.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.get_attached_height.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebInspector.get_attached_height.html 2026-04-16 17:54:42.181703300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.get_attached_height.html 2026-07-09 07:33:43.609825000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -184,7 +184,7 @@

Type: guint

-

The height of the inspector view when attached.

+

The height of the inspector view when attached.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebInspector.get_can_attach.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.get_can_attach.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebInspector.get_can_attach.html 2026-04-16 17:54:42.189703200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.get_can_attach.html 2026-07-09 07:33:43.612993700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,8 +182,8 @@

Type: gboolean

-

TRUE if there is enough room for the inspector view inside the - window that contains the inspected view, or FALSE otherwise.

+

TRUE if there is enough room for the inspector view inside the + window that contains the inspected view, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebInspector.get_inspected_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.get_inspected_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebInspector.get_inspected_uri.html 2026-04-16 17:54:42.197703400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.get_inspected_uri.html 2026-07-09 07:33:43.615685200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,14 +185,14 @@

Type: const char*

-

The URI that is currently being inspected or NULL.

+

The URI that is currently being inspected or NULL.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebInspector.get_web_view.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.get_web_view.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebInspector.get_web_view.html 2026-04-16 17:54:42.205703300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.get_web_view.html 2026-07-09 07:33:43.618801000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: WebKitWebViewBase

-

The WebKitWebViewBase used to display the inspector or NULL.

+

The WebKitWebViewBase used to display the inspector or NULL.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebInspector.is_attached.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.is_attached.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebInspector.is_attached.html 2026-04-16 17:54:42.213703200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.is_attached.html 2026-07-09 07:33:43.621406300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -174,7 +174,7 @@

Type: gboolean

-

TRUE if inspector is currently attached or FALSE otherwise.

+

TRUE if inspector is currently attached or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebInspector.show.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.show.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebInspector.show.html 2026-04-16 17:54:42.218703300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebInspector.show.html 2026-07-09 07:33:43.623073800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebResource.get_data.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebResource.get_data.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebResource.get_data.html 2026-04-16 17:54:42.334703400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebResource.get_data.html 2026-07-09 07:33:43.668569600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -168,7 +168,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -185,7 +185,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the request is satisfied.

+

A GAsyncReadyCallback to call when the request is satisfied.

The argument can be NULL.
@@ -202,7 +202,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebResource.get_data_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebResource.get_data_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebResource.get_data_finish.html 2026-04-16 17:54:42.348703400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebResource.get_data_finish.html 2026-07-09 07:33:43.672800800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -166,7 +166,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -183,7 +183,7 @@
length

Type: gsize*

-

Return location for the length of the resource data.

+

Return location for the length of the resource data.

@@ -227,16 +227,16 @@

Type: An array of guint8

-

A +

A string with the data of resource, or NULL in case of error. if length - is not NULL, the size of the data will be assigned to it.

+ is not NULL, the size of the data will be assigned to it.

The argument will be set by the function.
- +
The length of the array is in the length argument.
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebResource.get_response.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebResource.get_response.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebResource.get_response.html 2026-04-16 17:54:42.355703400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebResource.get_response.html 2026-07-09 07:33:43.675645400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -174,15 +174,15 @@

Type: WebKitURIResponse

-

The WebKitURIResponse, or NULL if - the response hasn’t been received yet.

+

The WebKitURIResponse, or NULL if + the response hasn’t been received yet.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebResource.get_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebResource.get_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebResource.get_uri.html 2026-04-16 17:54:42.365703600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebResource.get_uri.html 2026-07-09 07:33:43.679650300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -194,14 +194,14 @@

Type: const gchar*

-

The current active URI of resource.

+

The current active URI of resource.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.call_async_javascript_function.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.call_async_javascript_function.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.call_async_javascript_function.html 2026-04-16 17:54:43.015704400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.call_async_javascript_function.html 2026-07-09 07:33:43.933129000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -296,7 +296,7 @@ Description - [src] + [src] @@ -381,7 +381,7 @@
body

Type: const char*

-

The function body.

+

The function body.

@@ -398,7 +398,7 @@
length

Type: gssize

-

Length of body, or -1 if body is a nul-terminated string.

+

Length of body, or -1 if body is a nul-terminated string.

@@ -415,7 +415,7 @@
arguments

Type: GVariant

-

A GVariant with format a{sv} storing the function arguments, or NULL.

+

A GVariant with format a{sv} storing the function arguments, or NULL.

@@ -432,7 +432,7 @@
world_name

Type: const char*

-

The name of a WebKitScriptWorld or NULL to use the default.

+

The name of a WebKitScriptWorld or NULL to use the default.

The argument can be NULL.
@@ -449,7 +449,7 @@
source_uri

Type: const char*

-

The source URI.

+

The source URI.

The argument can be NULL.
@@ -466,7 +466,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

The argument can be NULL.
@@ -483,7 +483,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the script finished.

+

A GAsyncReadyCallback to call when the script finished.

The argument can be NULL.
@@ -500,7 +500,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.call_async_javascript_function_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.call_async_javascript_function_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.call_async_javascript_function_finish.html 2026-04-16 17:54:43.025704400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.call_async_javascript_function_finish.html 2026-07-09 07:33:43.936732000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -290,7 +290,7 @@ Description - [src] + [src] @@ -323,7 +323,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -367,15 +367,15 @@

Type: JSCValue

-

A JSCValue with the return value of the async function - or NULL in case of error.

+

A JSCValue with the return value of the async function + or NULL in case of error.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.can_execute_editing_command.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.can_execute_editing_command.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.can_execute_editing_command.html 2026-04-16 17:54:43.037704500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.can_execute_editing_command.html 2026-07-09 07:33:43.941603000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -292,7 +292,7 @@ Description - [src] + [src] @@ -327,7 +327,7 @@
command

Type: const gchar*

-

The command to check.

+

The command to check.

@@ -344,7 +344,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -361,7 +361,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the request is satisfied.

+

A GAsyncReadyCallback to call when the request is satisfied.

The argument can be NULL.
@@ -378,7 +378,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.can_execute_editing_command_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.can_execute_editing_command_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.can_execute_editing_command_finish.html 2026-04-16 17:54:43.046704500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.can_execute_editing_command_finish.html 2026-07-09 07:33:43.945122000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -290,7 +290,7 @@ Description - [src] + [src] @@ -323,7 +323,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -367,7 +367,7 @@

Type: gboolean

-

TRUE if the editing command can be executed or FALSE otherwise.

+

TRUE if the editing command can be executed or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.can_go_back.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.can_go_back.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.can_go_back.html 2026-04-16 17:54:43.054704400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.can_go_back.html 2026-07-09 07:33:43.947692900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -321,7 +321,7 @@

Type: gboolean

-

TRUE if able to move back or FALSE otherwise.

+

TRUE if able to move back or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.can_go_forward.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.can_go_forward.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.can_go_forward.html 2026-04-16 17:54:43.061704400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.can_go_forward.html 2026-07-09 07:33:43.950554400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -321,7 +321,7 @@

Type: gboolean

-

TRUE if able to move forward or FALSE otherwise.

+

TRUE if able to move forward or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.can_show_mime_type.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.can_show_mime_type.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.can_show_mime_type.html 2026-04-16 17:54:43.070704500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.can_show_mime_type.html 2026-07-09 07:33:43.953847400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -289,7 +289,7 @@ Description - [src] + [src] @@ -322,7 +322,7 @@
mime_type

Type: const gchar*

-

A MIME type.

+

A MIME type.

@@ -354,7 +354,7 @@

Type: gboolean

-

TRUE if the MIME type mime_type can be displayed or FALSE otherwise.

+

TRUE if the MIME type mime_type can be displayed or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.download_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.download_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.download_uri.html 2026-04-16 17:54:43.079704500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.download_uri.html 2026-07-09 07:33:43.957413700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -289,7 +289,7 @@ Description - [src] + [src] @@ -322,7 +322,7 @@
uri

Type: const char*

-

The URI to download.

+

The URI to download.

@@ -354,15 +354,15 @@

Type: WebKitDownload

-

A new WebKitDownload representing - the download operation.

+

A new WebKitDownload representing + the download operation.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.evaluate_javascript.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.evaluate_javascript.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.evaluate_javascript.html 2026-04-16 17:54:43.106704500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.evaluate_javascript.html 2026-07-09 07:33:43.963432000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -295,7 +295,7 @@ Description - [src] + [src] @@ -376,7 +376,7 @@
script

Type: const char*

-

The script to evaluate.

+

The script to evaluate.

@@ -393,7 +393,7 @@
length

Type: gssize

-

Length of script, or -1 if script is a nul-terminated string.

+

Length of script, or -1 if script is a nul-terminated string.

@@ -410,7 +410,7 @@
world_name

Type: const char*

-

The name of a WebKitScriptWorld or NULL to use the default.

+

The name of a WebKitScriptWorld or NULL to use the default.

@@ -427,7 +427,7 @@
source_uri

Type: const char*

-

The source URI.

+

The source URI.

The argument can be NULL.
@@ -444,7 +444,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

The argument can be NULL.
@@ -461,7 +461,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the script finished.

+

A GAsyncReadyCallback to call when the script finished.

The argument can be NULL.
@@ -478,7 +478,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.evaluate_javascript_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.evaluate_javascript_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.evaluate_javascript_finish.html 2026-04-16 17:54:43.116704500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.evaluate_javascript_finish.html 2026-07-09 07:33:43.967432000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -290,7 +290,7 @@ Description - [src] + [src] @@ -323,7 +323,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -367,15 +367,15 @@

Type: JSCValue

-

A JSCValue with the result of the last executed statement in script - or NULL in case of error.

+

A JSCValue with the result of the last executed statement in script + or NULL in case of error.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.execute_editing_command.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.execute_editing_command.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.execute_editing_command.html 2026-04-16 17:54:43.123704400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.execute_editing_command.html 2026-07-09 07:33:43.974545500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -289,7 +289,7 @@ Description - [src] + [src] @@ -324,7 +324,7 @@
command

Type: const gchar*

-

The command to execute.

+

The command to execute.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.execute_editing_command_with_argument.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.execute_editing_command_with_argument.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.execute_editing_command_with_argument.html 2026-04-16 17:54:43.133704700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.execute_editing_command_with_argument.html 2026-07-09 07:33:43.977903000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -290,7 +290,7 @@ Description - [src] + [src] @@ -326,7 +326,7 @@
command

Type: const char*

-

The command to execute.

+

The command to execute.

@@ -343,7 +343,7 @@
argument

Type: const char*

-

The command argument.

+

The command argument.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_automation_presentation_type.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_automation_presentation_type.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_automation_presentation_type.html 2026-04-16 17:54:43.140704600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_automation_presentation_type.html 2026-07-09 07:33:43.980772700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -329,7 +329,7 @@

Type: WebKitAutomationBrowsingContextPresentation

-

A WebKitAutomationBrowsingContextPresentation.

+

A WebKitAutomationBrowsingContextPresentation.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_back_forward_list.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_back_forward_list.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_back_forward_list.html 2026-04-16 17:54:43.148704500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_back_forward_list.html 2026-07-09 07:33:43.983511700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -322,14 +322,14 @@

Type: WebKitBackForwardList

-

The WebKitBackForwardList.

+

The WebKitBackForwardList.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_background_color.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_background_color.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_background_color.html 2026-04-16 17:54:43.156704700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_background_color.html 2026-07-09 07:33:43.986722700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -325,7 +325,7 @@
rgba

Type: GdkRGBA

-

A GdkRGBA to fill in with the background color.

+

A GdkRGBA to fill in with the background color.

@@ -334,7 +334,7 @@ - +
The argument will be set by the function.
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_camera_capture_state.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_camera_capture_state.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_camera_capture_state.html 2026-04-16 17:54:43.164704600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_camera_capture_state.html 2026-07-09 07:33:43.989626400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -329,8 +329,8 @@

Type: WebKitMediaCaptureState

-

The WebKitMediaCaptureState of the camera device. If WebKitSettings:enable-mediastream -is FALSE, this method will return WEBKIT_MEDIA_CAPTURE_STATE_NONE.

+

The WebKitMediaCaptureState of the camera device. If WebKitSettings:enable-mediastream +is FALSE, this method will return WEBKIT_MEDIA_CAPTURE_STATE_NONE.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_context.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_context.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_context.html 2026-04-16 17:54:43.171704500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_context.html 2026-07-09 07:33:43.992662700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -321,14 +321,14 @@

Type: WebKitWebContext

-

The WebKitWebContext of the view.

+

The WebKitWebContext of the view.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_custom_charset.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_custom_charset.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_custom_charset.html 2026-04-16 17:54:43.179704700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_custom_charset.html 2026-07-09 07:33:43.995360100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -321,15 +321,15 @@

Type: const gchar*

-

The current custom character encoding name or NULL if no - custom character encoding has been set.

+

The current custom character encoding name or NULL if no + custom character encoding has been set.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_default_content_security_policy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_default_content_security_policy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_default_content_security_policy.html 2026-04-16 17:54:43.186704600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_default_content_security_policy.html 2026-07-09 07:33:43.998092400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -329,14 +329,14 @@

Type: const gchar*

-

The default policy or NULL.

+

The default policy or NULL.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_display_capture_state.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_display_capture_state.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_display_capture_state.html 2026-04-16 17:54:43.194704500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_display_capture_state.html 2026-07-09 07:33:44.000991300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -329,8 +329,8 @@

Type: WebKitMediaCaptureState

-

The WebKitMediaCaptureState of the display device. If WebKitSettings:enable-mediastream -is FALSE, this method will return WEBKIT_MEDIA_CAPTURE_STATE_NONE.

+

The WebKitMediaCaptureState of the display device. If WebKitSettings:enable-mediastream +is FALSE, this method will return WEBKIT_MEDIA_CAPTURE_STATE_NONE.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_editor_state.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_editor_state.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_editor_state.html 2026-04-16 17:54:43.202704700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_editor_state.html 2026-07-09 07:33:44.003815400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -321,14 +321,14 @@

Type: WebKitEditorState

-

The WebKitEditorState of the view.

+

The WebKitEditorState of the view.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_estimated_load_progress.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_estimated_load_progress.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_estimated_load_progress.html 2026-04-16 17:54:43.209704600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_estimated_load_progress.html 2026-07-09 07:33:44.006591600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -331,8 +331,8 @@

Type: gdouble

-

An estimate of the of the percent complete for a document - load as a range from 0.0 to 1.0.

+

An estimate of the of the percent complete for a document + load as a range from 0.0 to 1.0.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_favicon.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_favicon.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_favicon.html 2026-04-16 17:54:43.218704700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_favicon.html 2026-07-09 07:33:44.009832900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -332,15 +332,15 @@

Type: GdkTexture

-

The favicon image or NULL if there’s no - icon associated with web_view.

+

The favicon image or NULL if there’s no + icon associated with web_view.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_find_controller.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_find_controller.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_find_controller.html 2026-04-16 17:54:43.226704600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_find_controller.html 2026-07-09 07:33:44.012665500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -323,15 +323,15 @@

Type: WebKitFindController

-

The WebKitFindController associated to -this particular WebKitWebView.

+

The WebKitFindController associated to +this particular WebKitWebView.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_input_method_context.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_input_method_context.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_input_method_context.html 2026-04-16 17:54:43.234704700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_input_method_context.html 2026-07-09 07:33:44.015809000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -322,14 +322,14 @@

Type: WebKitInputMethodContext

-

A WebKitInputMethodContext, or NULL.

+

A WebKitInputMethodContext, or NULL.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_inspector.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_inspector.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_inspector.html 2026-04-16 17:54:43.242704600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_inspector.html 2026-07-09 07:33:44.018446700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -321,14 +321,14 @@

Type: WebKitWebInspector

-

The WebKitWebInspector of web_view.

+

The WebKitWebInspector of web_view.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_is_muted.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_is_muted.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_is_muted.html 2026-04-16 17:54:43.250704800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_is_muted.html 2026-07-09 07:33:44.021324200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -329,7 +329,7 @@

Type: gboolean

-

TRUE if web_view audio is muted or FALSE is audio is not muted.

+

TRUE if web_view audio is muted or FALSE is audio is not muted.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_is_web_process_responsive.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_is_web_process_responsive.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_is_web_process_responsive.html 2026-04-16 17:54:43.258704700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_is_web_process_responsive.html 2026-07-09 07:33:44.024038800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -329,7 +329,7 @@

Type: gboolean

-

TRUE if the web process attached to web_view is responsive, or FALSE otherwise.

+

TRUE if the web process attached to web_view is responsive, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_main_resource.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_main_resource.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_main_resource.html 2026-04-16 17:54:43.265704600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_main_resource.html 2026-07-09 07:33:44.026938400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -321,15 +321,15 @@

Type: WebKitWebResource

-

The main WebKitWebResource of the view - or NULL if nothing has been loaded.

+

The main WebKitWebResource of the view + or NULL if nothing has been loaded.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_microphone_capture_state.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_microphone_capture_state.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_microphone_capture_state.html 2026-04-16 17:54:43.273704800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_microphone_capture_state.html 2026-07-09 07:33:44.029851700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -329,8 +329,8 @@

Type: WebKitMediaCaptureState

-

The WebKitMediaCaptureState of the microphone device. If WebKitSettings:enable-mediastream -is FALSE, this method will return WEBKIT_MEDIA_CAPTURE_STATE_NONE.

+

The WebKitMediaCaptureState of the microphone device. If WebKitSettings:enable-mediastream +is FALSE, this method will return WEBKIT_MEDIA_CAPTURE_STATE_NONE.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_network_session.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_network_session.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_network_session.html 2026-04-16 17:54:43.281704700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_network_session.html 2026-07-09 07:33:44.032687000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -329,14 +329,14 @@

Type: WebKitNetworkSession

-

A WebKitNetworkSession.

+

A WebKitNetworkSession.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_page_id.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_page_id.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_page_id.html 2026-04-16 17:54:43.288704900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_page_id.html 2026-07-09 07:33:44.035344000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -330,7 +330,7 @@

Type: guint64

-

The page ID of web_view.

+

The page ID of web_view.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_session_state.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_session_state.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_session_state.html 2026-04-16 17:54:43.296704800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_session_state.html 2026-07-09 07:33:44.037688700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -321,14 +321,14 @@

Type: WebKitWebViewSessionState

-

A WebKitWebViewSessionState.

+

A WebKitWebViewSessionState.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_settings.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_settings.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_settings.html 2026-04-16 17:54:43.307704700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_settings.html 2026-07-09 07:33:44.042052500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -333,14 +333,14 @@

Type: WebKitSettings

-

The WebKitSettings attached to web_view.

+

The WebKitSettings attached to web_view.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_snapshot.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_snapshot.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_snapshot.html 2026-04-16 17:54:43.322704800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_snapshot.html 2026-07-09 07:33:44.043430600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -293,7 +293,7 @@ Description - [src] + [src] @@ -329,7 +329,7 @@
region

Type: WebKitSnapshotRegion

-

The WebKitSnapshotRegion for this snapshot.

+

The WebKitSnapshotRegion for this snapshot.

@@ -346,7 +346,7 @@
options

Type: WebKitSnapshotOptions

-

WebKitSnapshotOptions for the snapshot.

+

WebKitSnapshotOptions for the snapshot.

@@ -363,7 +363,7 @@
cancellable

Type: GCancellable

-

A GCancellable.

+

A GCancellable.

@@ -380,7 +380,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback.

+

A GAsyncReadyCallback.

The argument can be NULL.
@@ -397,7 +397,7 @@
user_data

Type: gpointer

-

User data.

+

User data.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_snapshot_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_snapshot_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_snapshot_finish.html 2026-04-16 17:54:43.331704900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_snapshot_finish.html 2026-07-09 07:33:44.047430500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -290,7 +290,7 @@ Description - [src] + [src] @@ -324,7 +324,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -368,14 +368,14 @@

Type: GdkTexture

-

An image with the retrieved snapshot, or NULL in case of error.

+

An image with the retrieved snapshot, or NULL in case of error.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_theme_color.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_theme_color.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_theme_color.html 2026-04-16 17:54:43.341704800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_theme_color.html 2026-07-09 07:33:44.051430200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -332,7 +332,7 @@
rgba

Type: GdkRGBA

-

A GdkRGBA to fill in with the theme color.

+

A GdkRGBA to fill in with the theme color.

@@ -341,7 +341,7 @@ - +
The argument will be set by the function.
The data is owned by the instance.
The returned data is owned by the instance.
@@ -364,7 +364,7 @@

Type: gboolean

-

Whether the currently loaded page defines a theme color.

+

Whether the currently loaded page defines a theme color.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_title.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_title.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_title.html 2026-04-16 17:54:43.348704800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_title.html 2026-07-09 07:33:44.057903800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -331,14 +331,14 @@

Type: const gchar*

-

The main frame document title of web_view.

+

The main frame document title of web_view.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_tls_info.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_tls_info.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_tls_info.html 2026-04-16 17:54:43.364704800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_tls_info.html 2026-07-09 07:33:44.064167300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -290,7 +290,7 @@ Description - [src] + [src] @@ -336,7 +336,7 @@
certificate

Type: GTlsCertificate

-

Return location for a GTlsCertificate.

+

Return location for a GTlsCertificate.

@@ -345,7 +345,7 @@ - +
The argument will be set by the function.
The data is owned by the instance.
The returned data is owned by the instance.
@@ -353,7 +353,7 @@
errors

Type: GTlsCertificateFlags

-

Return location for a GTlsCertificateFlags the verification status of certificate.

+

Return location for a GTlsCertificateFlags the verification status of certificate.

@@ -362,7 +362,7 @@ - +
The argument will be set by the function.
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
@@ -385,8 +385,8 @@

Type: gboolean

-

TRUE if the web_view connection uses HTTPS and a response has been received - from the server, or FALSE otherwise.

+

TRUE if the web_view connection uses HTTPS and a response has been received + from the server, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_uri.html 2026-04-16 17:54:43.383705000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_uri.html 2026-07-09 07:33:44.070039000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -377,15 +377,15 @@

Type: const gchar*

-

The current active URI of web_view or NULL - if nothing has been loaded yet.

+

The current active URI of web_view or NULL + if nothing has been loaded yet.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_user_content_manager.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_user_content_manager.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_user_content_manager.html 2026-04-16 17:54:43.390704900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_user_content_manager.html 2026-07-09 07:33:44.072937000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -329,14 +329,14 @@

Type: WebKitUserContentManager

-

The WebKitUserContentManager associated with the view.

+

The WebKitUserContentManager associated with the view.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_web_extension_mode.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_web_extension_mode.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_web_extension_mode.html 2026-04-16 17:54:43.399705000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_web_extension_mode.html 2026-07-09 07:33:44.075436800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -329,7 +329,7 @@

Type: WebKitWebExtensionMode

-

The WebKitWebExtensionMode.

+

The WebKitWebExtensionMode.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_website_policies.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_website_policies.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_website_policies.html 2026-04-16 17:54:43.407704800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_website_policies.html 2026-07-09 07:33:44.078626200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -333,15 +333,15 @@

Type: WebKitWebsitePolicies

-

The default WebKitWebsitePolicies - associated with the view.

+

The default WebKitWebsitePolicies + associated with the view.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_window_properties.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_window_properties.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_window_properties.html 2026-04-16 17:54:43.415705000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_window_properties.html 2026-07-09 07:33:44.081415700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -323,14 +323,14 @@

Type: WebKitWindowProperties

-

The WebKitWindowProperties of web_view.

+

The WebKitWindowProperties of web_view.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_zoom_level.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_zoom_level.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.get_zoom_level.html 2026-04-16 17:54:43.423704900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.get_zoom_level.html 2026-07-09 07:33:44.084410000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -331,7 +331,7 @@

Type: gdouble

-

The current zoom level of web_view.

+

The current zoom level of web_view.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.go_back.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.go_back.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.go_back.html 2026-04-16 17:54:43.428705000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.go_back.html 2026-07-09 07:33:44.086372000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.go_forward.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.go_forward.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.go_forward.html 2026-04-16 17:54:43.434705000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.go_forward.html 2026-07-09 07:33:44.088598000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.go_to_back_forward_list_item.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.go_to_back_forward_list_item.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.go_to_back_forward_list_item.html 2026-04-16 17:54:43.442705000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.go_to_back_forward_list_item.html 2026-07-09 07:33:44.091320800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -289,7 +289,7 @@ Description - [src] + [src] @@ -324,7 +324,7 @@
list_item

Type: WebKitBackForwardListItem

-

A WebKitBackForwardListItem.

+

A WebKitBackForwardListItem.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.is_controlled_by_automation.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.is_controlled_by_automation.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.is_controlled_by_automation.html 2026-04-16 17:54:43.450705000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.is_controlled_by_automation.html 2026-07-09 07:33:44.094594200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -324,7 +324,7 @@

Type: gboolean

-

TRUE if web_view is controlled by automation, or FALSE otherwise.

+

TRUE if web_view is controlled by automation, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.is_editable.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.is_editable.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.is_editable.html 2026-04-16 17:54:43.459705000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.is_editable.html 2026-07-09 07:33:44.095429400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -309,6 +309,14 @@ +
+
+ + + +
Gets propertyWebKit.WebView:editable
+
+
@@ -324,7 +332,7 @@

Type: gboolean

-

TRUE if the user is allowed to edit the HTML document, or FALSE otherwise.

+

TRUE if the user is allowed to edit the HTML document, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.is_immersive_mode_enabled.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.is_immersive_mode_enabled.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.is_immersive_mode_enabled.html 2026-04-16 17:54:43.468705000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.is_immersive_mode_enabled.html 2026-07-09 07:33:44.105615400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -332,7 +332,7 @@

Type: gboolean

-

TRUE if the web_view is in immersive mode, or FALSE otherwise.

+

TRUE if the web_view is in immersive mode, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.is_loading.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.is_loading.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.is_loading.html 2026-04-16 17:54:43.477705000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.is_loading.html 2026-07-09 07:33:44.108970900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -334,7 +334,7 @@

Type: gboolean

-

TRUE if web_view is loading a page or FALSE otherwise.

+

TRUE if web_view is loading a page or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.is_playing_audio.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.is_playing_audio.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.is_playing_audio.html 2026-04-16 17:54:43.485705100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.is_playing_audio.html 2026-07-09 07:33:44.112686000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] @@ -333,7 +333,7 @@

Type: gboolean

-

TRUE if a page in web_view is playing audio or FALSE otherwise.

+

TRUE if a page in web_view is playing audio or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.leave_immersive_mode.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.leave_immersive_mode.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.leave_immersive_mode.html 2026-04-16 17:54:43.492705000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.leave_immersive_mode.html 2026-07-09 07:33:44.115173600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.load_alternate_html.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.load_alternate_html.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.load_alternate_html.html 2026-04-16 17:54:43.504705000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.load_alternate_html.html 2026-07-09 07:33:44.119910000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -291,7 +291,7 @@ Description - [src] + [src] @@ -328,7 +328,7 @@
content

Type: const gchar*

-

The new content to display as the main page of the web_view.

+

The new content to display as the main page of the web_view.

@@ -345,7 +345,7 @@
content_uri

Type: const gchar*

-

The URI for the alternate page content.

+

The URI for the alternate page content.

@@ -362,7 +362,7 @@
base_uri

Type: const gchar*

-

The base URI for relative locations or NULL.

+

The base URI for relative locations or NULL.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.load_bytes.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.load_bytes.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.load_bytes.html 2026-04-16 17:54:43.519705000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.load_bytes.html 2026-07-09 07:33:44.125608200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -292,7 +292,7 @@ Description - [src] + [src] @@ -329,7 +329,7 @@
bytes

Type: GBytes

-

Input data to load.

+

Input data to load.

The argument can be NULL.
@@ -346,7 +346,7 @@
mime_type

Type: const gchar*

-

The MIME type of bytes, or NULL.

+

The MIME type of bytes, or NULL.

@@ -363,7 +363,7 @@
encoding

Type: const gchar*

-

The character encoding of bytes, or NULL.

+

The character encoding of bytes, or NULL.

The argument can be NULL.
@@ -380,7 +380,7 @@
base_uri

Type: const gchar*

-

The base URI for relative locations or NULL.

+

The base URI for relative locations or NULL.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.load_html.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.load_html.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.load_html.html 2026-04-16 17:54:43.531705100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.load_html.html 2026-07-09 07:33:44.129963600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -290,7 +290,7 @@ Description - [src] + [src] @@ -331,7 +331,7 @@
content

Type: const gchar*

-

The HTML string to load.

+

The HTML string to load.

The argument can be NULL.
@@ -348,7 +348,7 @@
base_uri

Type: const gchar*

-

The base URI for relative locations or NULL.

+

The base URI for relative locations or NULL.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.load_plain_text.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.load_plain_text.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.load_plain_text.html 2026-04-16 17:54:43.539705000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.load_plain_text.html 2026-07-09 07:33:44.133047600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -289,7 +289,7 @@ Description - [src] + [src] @@ -324,7 +324,7 @@
plain_text

Type: const gchar*

-

The plain text to load.

+

The plain text to load.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.load_request.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.load_request.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.load_request.html 2026-04-16 17:54:43.546705200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.load_request.html 2026-07-09 07:33:44.135764100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -289,7 +289,7 @@ Description - [src] + [src] @@ -324,7 +324,7 @@
request

Type: WebKitURIRequest

-

A WebKitURIRequest to load.

+

A WebKitURIRequest to load.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.load_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.load_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.load_uri.html 2026-04-16 17:54:43.554705100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.load_uri.html 2026-07-09 07:33:44.138636600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -289,7 +289,7 @@ Description - [src] + [src] @@ -324,7 +324,7 @@
uri

Type: const gchar*

-

An URI string.

+

An URI string.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.reload.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.reload.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.reload.html 2026-04-16 17:54:43.560705200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.reload.html 2026-07-09 07:33:44.140605200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.reload_bypass_cache.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.reload_bypass_cache.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.reload_bypass_cache.html 2026-04-16 17:54:43.566705200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.reload_bypass_cache.html 2026-07-09 07:33:44.142594300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.restore_session_state.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.restore_session_state.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.restore_session_state.html 2026-04-16 17:54:43.573705200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.restore_session_state.html 2026-07-09 07:33:44.145659200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -289,7 +289,7 @@ Description - [src] + [src] @@ -322,7 +322,7 @@
state

Type: WebKitWebViewSessionState

-

A WebKitWebViewSessionState.

+

A WebKitWebViewSessionState.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.save.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.save.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.save.html 2026-04-16 17:54:43.586705200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.save.html 2026-07-09 07:33:44.150868200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -292,7 +292,7 @@ Description - [src] + [src] @@ -330,7 +330,7 @@
save_mode

Type: WebKitSaveMode

-

The WebKitSaveMode specifying how the web page should be saved.

+

The WebKitSaveMode specifying how the web page should be saved.

@@ -347,7 +347,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -364,7 +364,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the request is satisfied.

+

A GAsyncReadyCallback to call when the request is satisfied.

The argument can be NULL.
@@ -381,7 +381,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.save_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.save_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.save_finish.html 2026-04-16 17:54:43.596705200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.save_finish.html 2026-07-09 07:33:44.154400800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -290,7 +290,7 @@ Description - [src] + [src] @@ -323,7 +323,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -367,15 +367,15 @@

Type: GInputStream

-

A GInputStream with the result of saving - the current web page or NULL in case of error.

+

A GInputStream with the result of saving + the current web page or NULL in case of error.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.save_to_file.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.save_to_file.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.save_to_file.html 2026-04-16 17:54:43.611705300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.save_to_file.html 2026-07-09 07:33:44.160338000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -293,7 +293,7 @@ Description - [src] + [src] @@ -331,7 +331,7 @@
file

Type: GFile

-

The GFile where the current web page should be saved to.

+

The GFile where the current web page should be saved to.

@@ -348,7 +348,7 @@
save_mode

Type: WebKitSaveMode

-

The WebKitSaveMode specifying how the web page should be saved.

+

The WebKitSaveMode specifying how the web page should be saved.

@@ -365,7 +365,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -382,7 +382,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the request is satisfied.

+

A GAsyncReadyCallback to call when the request is satisfied.

The argument can be NULL.
@@ -399,7 +399,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.save_to_file_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.save_to_file_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.save_to_file_finish.html 2026-04-16 17:54:43.620705100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.save_to_file_finish.html 2026-07-09 07:33:44.163553000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -290,7 +290,7 @@ Description - [src] + [src] @@ -323,7 +323,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -367,7 +367,7 @@

Type: gboolean

-

TRUE if the web page was successfully saved to a file or FALSE otherwise.

+

TRUE if the web page was successfully saved to a file or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.send_message_to_page.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.send_message_to_page.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.send_message_to_page.html 2026-04-16 17:54:43.635705200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.send_message_to_page.html 2026-07-09 07:33:44.169016000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -292,7 +292,7 @@ Description - [src] + [src] @@ -329,7 +329,7 @@
message

Type: WebKitUserMessage

-

A WebKitUserMessage.

+

A WebKitUserMessage.

@@ -346,7 +346,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -363,7 +363,7 @@
callback

Type: GAsyncReadyCallback

-

(nullable): A GAsyncReadyCallback to call when the request is satisfied or NULL.

+

(nullable): A GAsyncReadyCallback to call when the request is satisfied or NULL.

The argument can be NULL.
@@ -380,7 +380,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.send_message_to_page_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.send_message_to_page_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.send_message_to_page_finish.html 2026-04-16 17:54:43.644705300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.send_message_to_page_finish.html 2026-07-09 07:33:44.172544700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -290,7 +290,7 @@ Description - [src] + [src] @@ -323,7 +323,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -367,14 +367,14 @@

Type: WebKitUserMessage

-

A WebKitUserMessage with the reply or NULL in case of error.

+

A WebKitUserMessage with the reply or NULL in case of error.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_background_color.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_background_color.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_background_color.html 2026-04-16 17:54:43.653705400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_background_color.html 2026-07-09 07:33:44.175814600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -326,7 +326,7 @@
rgba

Type: GdkRGBA

-

A GdkRGBA.

+

A GdkRGBA.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_camera_capture_state.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_camera_capture_state.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_camera_capture_state.html 2026-04-16 17:54:43.661705300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_camera_capture_state.html 2026-07-09 07:33:44.178758900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -289,7 +289,7 @@ Description - [src] + [src] @@ -333,7 +333,7 @@
state

Type: WebKitMediaCaptureState

-

A WebKitMediaCaptureState.

+

A WebKitMediaCaptureState.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_cors_allowlist.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_cors_allowlist.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_cors_allowlist.html 2026-04-16 17:54:43.671705200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_cors_allowlist.html 2026-07-09 07:33:44.182453200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -289,7 +289,7 @@ Description - [src] + [src] @@ -333,7 +333,7 @@
allowlist

Type: An array of utf8

-

An allowlist of URI patterns, or NULL.

+

An allowlist of URI patterns, or NULL.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_custom_charset.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_custom_charset.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_custom_charset.html 2026-04-16 17:54:43.680705300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_custom_charset.html 2026-07-09 07:33:44.185652500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -289,7 +289,7 @@ Description - [src] + [src] @@ -326,7 +326,7 @@
charset

Type: const gchar*

-

A character encoding name or NULL.

+

A character encoding name or NULL.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_display_capture_state.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_display_capture_state.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_display_capture_state.html 2026-04-16 17:54:43.688705400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_display_capture_state.html 2026-07-09 07:33:44.188820800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -289,7 +289,7 @@ Description - [src] + [src] @@ -333,7 +333,7 @@
state

Type: WebKitMediaCaptureState

-

A WebKitMediaCaptureState.

+

A WebKitMediaCaptureState.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_editable.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_editable.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_editable.html 2026-04-16 17:54:43.698705400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_editable.html 2026-07-09 07:33:44.192245000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -289,7 +289,7 @@ Description - [src] + [src] @@ -337,7 +337,7 @@
editable

Type: gboolean

-

A #gboolean indicating the editable state.

+

A #gboolean indicating the editable state.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_input_method_context.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_input_method_context.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_input_method_context.html 2026-04-16 17:54:43.707705300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_input_method_context.html 2026-07-09 07:33:44.195550400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -289,7 +289,7 @@ Description - [src] + [src] @@ -324,7 +324,7 @@
context

Type: WebKitInputMethodContext

-

The WebKitInputMethodContext to set, or NULL.

+

The WebKitInputMethodContext to set, or NULL.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_is_muted.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_is_muted.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_is_muted.html 2026-04-16 17:54:43.714705500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_is_muted.html 2026-07-09 07:33:44.198006400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -289,7 +289,7 @@ Description - [src] + [src] @@ -330,7 +330,7 @@
muted

Type: gboolean

-

Mute flag.

+

Mute flag.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_microphone_capture_state.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_microphone_capture_state.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_microphone_capture_state.html 2026-04-16 17:54:43.722705400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_microphone_capture_state.html 2026-07-09 07:33:44.201195700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -289,7 +289,7 @@ Description - [src] + [src] @@ -333,7 +333,7 @@
state

Type: WebKitMediaCaptureState

-

A WebKitMediaCaptureState.

+

A WebKitMediaCaptureState.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_settings.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_settings.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_settings.html 2026-04-16 17:54:43.731705400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_settings.html 2026-07-09 07:33:44.204253000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -289,7 +289,7 @@ Description - [src] + [src] @@ -335,7 +335,7 @@
settings

Type: WebKitSettings

-

A WebKitSettings.

+

A WebKitSettings.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_zoom_level.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_zoom_level.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.set_zoom_level.html 2026-04-16 17:54:43.738705400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.set_zoom_level.html 2026-07-09 07:33:44.207137800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -289,7 +289,7 @@ Description - [src] + [src] @@ -332,7 +332,7 @@
zoom_level

Type: gdouble

-

The zoom level.

+

The zoom level.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.stop_loading.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.stop_loading.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.stop_loading.html 2026-04-16 17:54:43.745705400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.stop_loading.html 2026-07-09 07:33:44.209434300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.terminate_web_process.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.terminate_web_process.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.terminate_web_process.html 2026-04-16 17:54:43.751705400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.terminate_web_process.html 2026-07-09 07:33:44.211611700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.try_close.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.try_close.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebView.try_close.html 2026-04-16 17:54:43.758705400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebView.try_close.html 2026-07-09 07:33:44.214285100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -246,7 +246,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -288,7 +288,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebViewSessionState.ref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebViewSessionState.ref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebViewSessionState.ref.html 2026-04-16 17:54:36.491695400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebViewSessionState.ref.html 2026-07-09 07:33:41.460608700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -163,14 +163,14 @@

Type: WebKitWebViewSessionState

-

The passed in WebKitWebViewSessionState.

+

The passed in WebKitWebViewSessionState.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebViewSessionState.serialize.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebViewSessionState.serialize.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebViewSessionState.serialize.html 2026-04-16 17:54:36.497695200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebViewSessionState.serialize.html 2026-07-09 07:33:41.463168100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -161,14 +161,14 @@

Type: GBytes

-

A GBytes containing the state serialized.

+

A GBytes containing the state serialized.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebViewSessionState.unref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebViewSessionState.unref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebViewSessionState.unref.html 2026-04-16 17:54:36.502695300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebViewSessionState.unref.html 2026-07-09 07:33:41.465409500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteData.get_name.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteData.get_name.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteData.get_name.html 2026-04-16 17:54:36.323695000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteData.get_name.html 2026-07-09 07:33:41.440259700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -168,14 +168,14 @@

Type: const char*

-

The website name of website_data.

+

The website name of website_data.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteData.get_size.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteData.get_size.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteData.get_size.html 2026-04-16 17:54:36.361695000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteData.get_size.html 2026-07-09 07:33:41.443939700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -168,7 +168,7 @@
types

Type: WebKitWebsiteDataTypes

-

A bitmask of WebKitWebsiteDataTypes.

+

A bitmask of WebKitWebsiteDataTypes.

@@ -200,7 +200,7 @@

Type: guint64

-

The size of website_data for the given types.

+

The size of website_data for the given types.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteData.get_types.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteData.get_types.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteData.get_types.html 2026-04-16 17:54:36.391695300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteData.get_types.html 2026-07-09 07:33:41.447248500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -167,7 +167,7 @@

Type: WebKitWebsiteDataTypes

-

A bitmask of WebKitWebsiteDataTypes in website_data.

+

A bitmask of WebKitWebsiteDataTypes in website_data.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteData.ref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteData.ref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteData.ref.html 2026-04-16 17:54:36.421695200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteData.ref.html 2026-07-09 07:33:41.449926400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -166,14 +166,14 @@

Type: WebKitWebsiteData

-

The passed WebKitWebsiteData.

+

The passed WebKitWebsiteData.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteData.unref.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteData.unref.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteData.unref.html 2026-04-16 17:54:36.458695200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteData.unref.html 2026-07-09 07:33:41.452213500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataAccessPermissionRequest.get_current_domain.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataAccessPermissionRequest.get_current_domain.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataAccessPermissionRequest.get_current_domain.html 2026-04-16 17:54:42.464703600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataAccessPermissionRequest.get_current_domain.html 2026-07-09 07:33:43.716712000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -159,14 +159,14 @@

Type: const char*

-

The current domain name.

+

The current domain name.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataAccessPermissionRequest.get_requesting_domain.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataAccessPermissionRequest.get_requesting_domain.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataAccessPermissionRequest.get_requesting_domain.html 2026-04-16 17:54:42.470703600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataAccessPermissionRequest.get_requesting_domain.html 2026-07-09 07:33:43.719471700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -159,14 +159,14 @@

Type: const char*

-

The requesting domain name.

+

The requesting domain name.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.clear.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.clear.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.clear.html 2026-04-16 17:54:42.540703800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.clear.html 2026-07-09 07:33:43.754276800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -193,7 +193,7 @@
types

Type: WebKitWebsiteDataTypes

-

WebKitWebsiteDataTypes.

+

WebKitWebsiteDataTypes.

@@ -210,7 +210,7 @@
timespan

Type: GTimeSpan

-

A GTimeSpan.

+

A GTimeSpan.

@@ -227,7 +227,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -244,7 +244,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the request is satisfied.

+

A GAsyncReadyCallback to call when the request is satisfied.

The argument can be NULL.
@@ -261,7 +261,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.clear_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.clear_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.clear_finish.html 2026-04-16 17:54:42.549703800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.clear_finish.html 2026-07-09 07:33:43.761261000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,7 +185,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -229,7 +229,7 @@

Type: gboolean

-

TRUE if website data was successfully cleared, or FALSE otherwise.

+

TRUE if website data was successfully cleared, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.fetch.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.fetch.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.fetch.html 2026-04-16 17:54:42.562703800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.fetch.html 2026-07-09 07:33:43.768373700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -189,7 +189,7 @@
types

Type: WebKitWebsiteDataTypes

-

WebKitWebsiteDataTypes.

+

WebKitWebsiteDataTypes.

@@ -206,7 +206,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -223,7 +223,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the request is satisfied.

+

A GAsyncReadyCallback to call when the request is satisfied.

The argument can be NULL.
@@ -240,7 +240,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.fetch_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.fetch_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.fetch_finish.html 2026-04-16 17:54:42.572703800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.fetch_finish.html 2026-07-09 07:33:43.771921900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,7 +185,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -229,15 +229,15 @@

Type: A list of WebKitWebsiteData*

-

A GList of WebKitWebsiteData. You must free the GList with - g_list_free() and unref the WebKitWebsiteDatas with webkit_website_data_unref() when you’re done with them.

+

A GList of WebKitWebsiteData. You must free the GList with + g_list_free() and unref the WebKitWebsiteDatas with webkit_website_data_unref() when you’re done with them.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_base_cache_directory.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_base_cache_directory.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_base_cache_directory.html 2026-04-16 17:54:42.579703800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_base_cache_directory.html 2026-07-09 07:33:43.774940000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -191,15 +191,15 @@

Type: const gchar*

-

The base directory for caches, or NULL if - WebKitWebsiteDataManager:base-cache-directory was not provided or manager is ephemeral.

+

The base directory for caches, or NULL if + WebKitWebsiteDataManager:base-cache-directory was not provided or manager is ephemeral.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_base_data_directory.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_base_data_directory.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_base_data_directory.html 2026-04-16 17:54:42.586703800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_base_data_directory.html 2026-07-09 07:33:43.777640600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -191,15 +191,15 @@

Type: const gchar*

-

The base directory for website data, or NULL if - WebKitWebsiteDataManager:base-data-directory was not provided or manager is ephemeral.

+

The base directory for website data, or NULL if + WebKitWebsiteDataManager:base-data-directory was not provided or manager is ephemeral.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_favicon_database.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_favicon_database.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_favicon_database.html 2026-04-16 17:54:42.593703700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_favicon_database.html 2026-07-09 07:33:43.780382600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,14 +183,14 @@

Type: WebKitFaviconDatabase

-

A WebKitFaviconDatabase, or NULL if website icons are disabled.

+

A WebKitFaviconDatabase, or NULL if website icons are disabled.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_favicons_enabled.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_favicons_enabled.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_favicons_enabled.html 2026-04-16 17:54:42.600703700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_favicons_enabled.html 2026-07-09 07:33:43.782853400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,7 +183,7 @@

Type: gboolean

-

TRUE if website icons are enabled, or FALSE otherwise.

+

TRUE if website icons are enabled, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_itp_summary.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_itp_summary.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_itp_summary.html 2026-04-16 17:54:42.611703900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_itp_summary.html 2026-07-09 07:33:43.787355400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -190,7 +190,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -207,7 +207,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the request is satisfied.

+

A GAsyncReadyCallback to call when the request is satisfied.

The argument can be NULL.
@@ -224,7 +224,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_itp_summary_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_itp_summary_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_itp_summary_finish.html 2026-04-16 17:54:42.621703900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.get_itp_summary_finish.html 2026-07-09 07:33:43.787435800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,7 +185,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -229,16 +229,16 @@

Type: A list of WebKitITPThirdParty*

-

A GList of WebKitITPThirdParty. +

A GList of WebKitITPThirdParty. You must free the GList with g_list_free() and unref the WebKitITPThirdPartys with - webkit_itp_third_party_unref() when you’re done with them.

+ webkit_itp_third_party_unref() when you’re done with them.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.is_ephemeral.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.is_ephemeral.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.is_ephemeral.html 2026-04-16 17:54:42.629703800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.is_ephemeral.html 2026-07-09 07:33:43.793876000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -184,7 +184,7 @@

Type: gboolean

-

TRUE if manager is ephemeral or FALSE otherwise.

+

TRUE if manager is ephemeral or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.remove.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.remove.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.remove.html 2026-04-16 17:54:42.644703900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.remove.html 2026-07-09 07:33:43.795435700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -192,7 +192,7 @@
types

Type: WebKitWebsiteDataTypes

-

WebKitWebsiteDataTypes.

+

WebKitWebsiteDataTypes.

@@ -209,7 +209,7 @@
website_data

Type: A list of WebKitWebsiteData*

-

A GList of WebKitWebsiteData.

+

A GList of WebKitWebsiteData.

@@ -226,7 +226,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -243,7 +243,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the request is satisfied.

+

A GAsyncReadyCallback to call when the request is satisfied.

The argument can be NULL.
@@ -260,7 +260,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.remove_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.remove_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.remove_finish.html 2026-04-16 17:54:42.652703800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.remove_finish.html 2026-07-09 07:33:43.799435600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,7 +185,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -229,7 +229,7 @@

Type: gboolean

-

TRUE if website data resources were successfully removed, or FALSE otherwise.

+

TRUE if website data resources were successfully removed, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.set_favicons_enabled.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.set_favicons_enabled.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsiteDataManager.set_favicons_enabled.html 2026-04-16 17:54:42.661703800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsiteDataManager.set_favicons_enabled.html 2026-07-09 07:33:43.806718300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -188,7 +188,7 @@
enabled

Type: gboolean

-

Value to set.

+

Value to set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsitePolicies.get_autoplay_policy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsitePolicies.get_autoplay_policy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WebsitePolicies.get_autoplay_policy.html 2026-04-16 17:54:42.750704000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WebsitePolicies.get_autoplay_policy.html 2026-07-09 07:33:43.835946300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -157,7 +157,7 @@

Type: WebKitAutoplayPolicy

-

WebKitAutoplayPolicy.

+

WebKitAutoplayPolicy.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WindowProperties.get_fullscreen.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_fullscreen.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WindowProperties.get_fullscreen.html 2026-04-16 17:54:44.372706200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_fullscreen.html 2026-07-09 07:33:44.435422400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@

Type: gboolean

-

TRUE if the window should be fullscreen or FALSE otherwise.

+

TRUE if the window should be fullscreen or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WindowProperties.get_geometry.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_geometry.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WindowProperties.get_geometry.html 2026-04-16 17:54:44.379706400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_geometry.html 2026-07-09 07:33:44.443162700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -180,7 +180,7 @@
geometry

Type: GdkRectangle

-

Return location for the window geometry.

+

Return location for the window geometry.

@@ -189,7 +189,7 @@ - +
The argument will be set by the function.
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WindowProperties.get_locationbar_visible.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_locationbar_visible.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WindowProperties.get_locationbar_visible.html 2026-04-16 17:54:44.386706400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_locationbar_visible.html 2026-07-09 07:33:44.447993500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@

Type: gboolean

-

TRUE if locationbar should be visible or FALSE otherwise.

+

TRUE if locationbar should be visible or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WindowProperties.get_menubar_visible.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_menubar_visible.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WindowProperties.get_menubar_visible.html 2026-04-16 17:54:44.394706200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_menubar_visible.html 2026-07-09 07:33:44.452113400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@

Type: gboolean

-

TRUE if menubar should be visible or FALSE otherwise.

+

TRUE if menubar should be visible or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WindowProperties.get_resizable.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_resizable.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WindowProperties.get_resizable.html 2026-04-16 17:54:44.400706300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_resizable.html 2026-07-09 07:33:44.456493600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@

Type: gboolean

-

TRUE if the window should be resizable or FALSE otherwise.

+

TRUE if the window should be resizable or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WindowProperties.get_scrollbars_visible.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_scrollbars_visible.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WindowProperties.get_scrollbars_visible.html 2026-04-16 17:54:44.407706300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_scrollbars_visible.html 2026-07-09 07:33:44.459420700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@

Type: gboolean

-

TRUE if scrollbars should be visible or FALSE otherwise.

+

TRUE if scrollbars should be visible or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WindowProperties.get_statusbar_visible.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_statusbar_visible.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WindowProperties.get_statusbar_visible.html 2026-04-16 17:54:44.413706300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_statusbar_visible.html 2026-07-09 07:33:44.462057400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@

Type: gboolean

-

TRUE if statusbar should be visible or FALSE otherwise.

+

TRUE if statusbar should be visible or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WindowProperties.get_toolbar_visible.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_toolbar_visible.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.WindowProperties.get_toolbar_visible.html 2026-04-16 17:54:44.420706300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.WindowProperties.get_toolbar_visible.html 2026-07-09 07:33:44.464420800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@

Type: gboolean

-

TRUE if toolbar should be visible or FALSE otherwise.

+

TRUE if toolbar should be visible or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_consent_optional_features.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_consent_optional_features.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_consent_optional_features.html 2026-04-16 17:54:44.502706500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_consent_optional_features.html 2026-07-09 07:33:44.490985000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -174,7 +174,7 @@

Type: WebKitXRSessionFeatures

-

A WebKitXRSessionFeatures flag combination.

+

A WebKitXRSessionFeatures flag combination.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_consent_required_features.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_consent_required_features.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_consent_required_features.html 2026-04-16 17:54:44.509706500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_consent_required_features.html 2026-07-09 07:33:44.493891200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -172,7 +172,7 @@

Type: WebKitXRSessionFeatures

-

A WebKitXRSessionFeatures flag combination.

+

A WebKitXRSessionFeatures flag combination.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_granted_features.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_granted_features.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_granted_features.html 2026-04-16 17:54:44.516706500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_granted_features.html 2026-07-09 07:33:44.497161000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -173,7 +173,7 @@

Type: WebKitXRSessionFeatures

-

A WebKitXRSessionFeatures flag combination.

+

A WebKitXRSessionFeatures flag combination.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_optional_features_requested.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_optional_features_requested.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_optional_features_requested.html 2026-04-16 17:54:44.523706400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_optional_features_requested.html 2026-07-09 07:33:44.500341000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -172,7 +172,7 @@

Type: WebKitXRSessionFeatures

-

A WebKitXRSessionFeatures flag combination.

+

A WebKitXRSessionFeatures flag combination.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_required_features_requested.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_required_features_requested.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_required_features_requested.html 2026-04-16 17:54:44.530706400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_required_features_requested.html 2026-07-09 07:33:44.502747000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -172,7 +172,7 @@

Type: WebKitXRSessionFeatures

-

A WebKitXRSessionFeatures flag combination.

+

A WebKitXRSessionFeatures flag combination.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_security_origin.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_security_origin.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_security_origin.html 2026-04-16 17:54:44.536706400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_security_origin.html 2026-07-09 07:33:44.505321700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: WebKitSecurityOrigin

-

The WebKitSecurityOrigin that initiated the request.

+

The WebKitSecurityOrigin that initiated the request.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_session_mode.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_session_mode.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_session_mode.html 2026-04-16 17:54:44.542706500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.get_session_mode.html 2026-07-09 07:33:44.507588900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,7 +171,7 @@

Type: WebKitXRSessionMode

-

A WebKitXRSessionMode.

+

A WebKitXRSessionMode.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.XRPermissionRequest.set_granted_optional_features.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.set_granted_optional_features.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/method.XRPermissionRequest.set_granted_optional_features.html 2026-04-16 17:54:44.549706500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/method.XRPermissionRequest.set_granted_optional_features.html 2026-07-09 07:33:44.510401000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -176,7 +176,7 @@
granted

Type: WebKitXRSessionFeatures

-

Granted features.

+

Granted features.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/migrating-to-webkitgtk-6.0.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/migrating-to-webkitgtk-6.0.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/migrating-to-webkitgtk-6.0.html 2026-04-16 17:54:30.932687500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/migrating-to-webkitgtk-6.0.html 2026-07-09 07:33:39.509316700 +0000 @@ -62,13 +62,13 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/overview.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/overview.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/overview.html 2026-04-16 17:54:30.832687400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/overview.html 2026-07-09 07:33:39.455525600 +0000 @@ -62,13 +62,13 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/profiling.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/profiling.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/profiling.html 2026-04-16 17:54:30.882498700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/profiling.html 2026-07-09 07:33:39.486616600 +0000 @@ -62,13 +62,13 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.AutomationSession.id.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.AutomationSession.id.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.AutomationSession.id.html 2026-04-16 17:54:34.655692800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.AutomationSession.id.html 2026-07-09 07:33:40.698620000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.ColorChooserRequest.rgba.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.ColorChooserRequest.rgba.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.ColorChooserRequest.rgba.html 2026-04-16 17:54:35.347693700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.ColorChooserRequest.rgba.html 2026-07-09 07:33:41.043888800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Download.allow-overwrite.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Download.allow-overwrite.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Download.allow-overwrite.html 2026-04-16 17:54:36.863300800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Download.allow-overwrite.html 2026-07-09 07:33:41.608479300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Download.destination.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Download.destination.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Download.destination.html 2026-04-16 17:54:36.864695800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Download.destination.html 2026-07-09 07:33:41.609265800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -103,7 +103,7 @@
-

unstable since: 6.0

+

@@ -136,8 +136,6 @@ -

-
Available since:6.0
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Download.estimated-progress.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Download.estimated-progress.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Download.estimated-progress.html 2026-04-16 17:54:36.870695800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Download.estimated-progress.html 2026-07-09 07:33:41.611354400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -103,7 +103,7 @@
-

unstable since: 6.0

+

@@ -141,8 +141,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Download.response.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Download.response.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Download.response.html 2026-04-16 17:54:36.874588300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Download.response.html 2026-07-09 07:33:41.612204600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -103,7 +103,7 @@
-

unstable since: 6.0

+

@@ -136,8 +136,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.EditorState.typing-attributes.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.EditorState.typing-attributes.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.EditorState.typing-attributes.html 2026-04-16 17:54:36.996206800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.EditorState.typing-attributes.html 2026-07-09 07:33:41.665071700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.FileChooserRequest.filter.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FileChooserRequest.filter.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.FileChooserRequest.filter.html 2026-04-16 17:54:37.201397000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FileChooserRequest.filter.html 2026-07-09 07:33:41.752870800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -103,7 +103,7 @@
-

unstable since: 6.0

+

@@ -137,8 +137,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.FileChooserRequest.mime-types.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FileChooserRequest.mime-types.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.FileChooserRequest.mime-types.html 2026-04-16 17:54:37.203696300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FileChooserRequest.mime-types.html 2026-07-09 07:33:41.754081200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -103,7 +103,7 @@
-

unstable since: 6.0

+

@@ -138,8 +138,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.FileChooserRequest.select-multiple.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FileChooserRequest.select-multiple.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.FileChooserRequest.select-multiple.html 2026-04-16 17:54:37.208143200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FileChooserRequest.select-multiple.html 2026-07-09 07:33:41.755132000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -103,7 +103,7 @@
-

unstable since: 6.0

+

@@ -139,8 +139,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.FileChooserRequest.selected-files.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FileChooserRequest.selected-files.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.FileChooserRequest.selected-files.html 2026-04-16 17:54:37.210696200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FileChooserRequest.selected-files.html 2026-07-09 07:33:41.756345500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -103,7 +103,7 @@
-

unstable since: 6.0

+

@@ -138,8 +138,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.FindController.max-match-count.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FindController.max-match-count.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.FindController.max-match-count.html 2026-04-16 17:54:37.342374000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FindController.max-match-count.html 2026-07-09 07:33:41.806320000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -103,7 +103,7 @@
-

unstable since: 6.0

+

@@ -136,8 +136,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.FindController.options.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FindController.options.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.FindController.options.html 2026-04-16 17:54:37.344530300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FindController.options.html 2026-07-09 07:33:41.807103200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -103,7 +103,7 @@
-

unstable since: 6.0

+

@@ -136,8 +136,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.FindController.text.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FindController.text.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.FindController.text.html 2026-04-16 17:54:37.345696400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FindController.text.html 2026-07-09 07:33:41.808321700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -103,7 +103,7 @@
-

unstable since: 6.0

+

@@ -136,8 +136,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.FindController.web-view.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FindController.web-view.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.FindController.web-view.html 2026-04-16 17:54:37.349553000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.FindController.web-view.html 2026-07-09 07:33:41.809169800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -103,7 +103,7 @@
-

unstable since: 6.0

+

@@ -136,8 +136,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.GeolocationManager.enable-high-accuracy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.GeolocationManager.enable-high-accuracy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.GeolocationManager.enable-high-accuracy.html 2026-04-16 17:54:37.507696600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.GeolocationManager.enable-high-accuracy.html 2026-07-09 07:33:41.869201000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.HitTestResult.context.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.HitTestResult.context.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.HitTestResult.context.html 2026-04-16 17:54:37.750449400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.HitTestResult.context.html 2026-07-09 07:33:41.959154800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -141,8 +141,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.HitTestResult.image-uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.HitTestResult.image-uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.HitTestResult.image-uri.html 2026-04-16 17:54:37.753388000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.HitTestResult.image-uri.html 2026-07-09 07:33:41.960183900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -141,8 +141,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.HitTestResult.link-label.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.HitTestResult.link-label.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.HitTestResult.link-label.html 2026-04-16 17:54:37.756441600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.HitTestResult.link-label.html 2026-07-09 07:33:41.961195500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -141,8 +141,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.HitTestResult.link-title.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.HitTestResult.link-title.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.HitTestResult.link-title.html 2026-04-16 17:54:37.759266600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.HitTestResult.link-title.html 2026-07-09 07:33:41.962168700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -141,8 +141,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.HitTestResult.link-uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.HitTestResult.link-uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.HitTestResult.link-uri.html 2026-04-16 17:54:37.760697100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.HitTestResult.link-uri.html 2026-07-09 07:33:41.963169600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -141,8 +141,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.HitTestResult.media-uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.HitTestResult.media-uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.HitTestResult.media-uri.html 2026-04-16 17:54:37.765136700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.HitTestResult.media-uri.html 2026-07-09 07:33:41.964452700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -141,8 +141,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Image.height.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Image.height.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Image.height.html 2026-03-04 10:12:45.310978700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Image.height.html 2026-03-06 08:31:47.193450700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.51.92

+

Library Version: 2.51.93

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Image.stride.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Image.stride.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Image.stride.html 2026-03-04 10:12:45.314624800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Image.stride.html 2026-03-06 08:31:47.194520700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.51.92

+

Library Version: 2.51.93

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Image.width.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Image.width.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Image.width.html 2026-03-04 10:12:45.315978800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Image.width.html 2026-03-06 08:31:47.195280000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.51.92

+

Library Version: 2.51.93

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.InputMethodContext.input-hints.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.InputMethodContext.input-hints.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.InputMethodContext.input-hints.html 2026-04-16 17:54:37.965697300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.InputMethodContext.input-hints.html 2026-07-09 07:33:42.043385500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.InputMethodContext.input-purpose.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.InputMethodContext.input-purpose.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.InputMethodContext.input-purpose.html 2026-04-16 17:54:37.969452000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.InputMethodContext.input-purpose.html 2026-07-09 07:33:42.044263800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.NavigationPolicyDecision.navigation-action.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.NavigationPolicyDecision.navigation-action.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.NavigationPolicyDecision.navigation-action.html 2026-04-16 17:54:38.185697600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.NavigationPolicyDecision.navigation-action.html 2026-07-09 07:33:42.121228200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.NetworkSession.cache-directory.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.NetworkSession.cache-directory.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.NetworkSession.cache-directory.html 2026-04-16 17:54:38.406470300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.NetworkSession.cache-directory.html 2026-07-09 07:33:42.207875700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.NetworkSession.data-directory.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.NetworkSession.data-directory.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.NetworkSession.data-directory.html 2026-04-16 17:54:38.409519700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.NetworkSession.data-directory.html 2026-07-09 07:33:42.208852300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.NetworkSession.is-ephemeral.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.NetworkSession.is-ephemeral.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.NetworkSession.is-ephemeral.html 2026-04-16 17:54:38.410698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.NetworkSession.is-ephemeral.html 2026-07-09 07:33:42.209717300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Notification.body.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Notification.body.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Notification.body.html 2026-04-16 17:54:38.498592400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Notification.body.html 2026-07-09 07:33:42.245570700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Notification.id.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Notification.id.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Notification.id.html 2026-04-16 17:54:38.499698200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Notification.id.html 2026-07-09 07:33:42.246349800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Notification.tag.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Notification.tag.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Notification.tag.html 2026-04-16 17:54:38.501698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Notification.tag.html 2026-07-09 07:33:42.247112000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Notification.title.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Notification.title.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Notification.title.html 2026-04-16 17:54:38.503698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Notification.title.html 2026-07-09 07:33:42.247859000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.PrintOperation.page-setup.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.PrintOperation.page-setup.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.PrintOperation.page-setup.html 2026-04-16 17:54:38.907554000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.PrintOperation.page-setup.html 2026-07-09 07:33:42.402643200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -101,7 +101,7 @@
-

unstable since: 6.0

+

@@ -134,8 +134,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.PrintOperation.print-settings.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.PrintOperation.print-settings.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.PrintOperation.print-settings.html 2026-04-16 17:54:38.910225900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.PrintOperation.print-settings.html 2026-07-09 07:33:42.403781400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -101,7 +101,7 @@
-

unstable since: 6.0

+

@@ -134,8 +134,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.PrintOperation.web-view.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.PrintOperation.web-view.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.PrintOperation.web-view.html 2026-04-16 17:54:38.912535700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.PrintOperation.web-view.html 2026-07-09 07:33:42.404608000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -101,7 +101,7 @@
-

unstable since: 6.0

+

@@ -134,8 +134,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.ResponsePolicyDecision.request.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.ResponsePolicyDecision.request.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.ResponsePolicyDecision.request.html 2026-04-16 17:54:39.027698800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.ResponsePolicyDecision.request.html 2026-07-09 07:33:42.440208400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -99,7 +99,7 @@
-

unstable since: 6.0

+

@@ -133,8 +133,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.ResponsePolicyDecision.response.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.ResponsePolicyDecision.response.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.ResponsePolicyDecision.response.html 2026-04-16 17:54:39.031596000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.ResponsePolicyDecision.response.html 2026-07-09 07:33:42.441145400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -99,7 +99,7 @@
-

unstable since: 6.0

+

@@ -133,8 +133,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.allow-file-access-from-file-urls.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.allow-file-access-from-file-urls.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.allow-file-access-from-file-urls.html 2026-04-16 17:54:40.313700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.allow-file-access-from-file-urls.html 2026-07-09 07:33:42.915910200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.allow-modal-dialogs.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.allow-modal-dialogs.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.allow-modal-dialogs.html 2026-04-16 17:54:40.319700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.allow-modal-dialogs.html 2026-07-09 07:33:42.917729900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -249,8 +249,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.allow-top-navigation-to-data-urls.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.allow-top-navigation-to-data-urls.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.allow-top-navigation-to-data-urls.html 2026-04-16 17:54:40.322700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.allow-top-navigation-to-data-urls.html 2026-07-09 07:33:42.919017300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.allow-universal-access-from-file-urls.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.allow-universal-access-from-file-urls.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.allow-universal-access-from-file-urls.html 2026-04-16 17:54:40.329574000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.allow-universal-access-from-file-urls.html 2026-07-09 07:33:42.920808800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.auto-load-images.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.auto-load-images.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.auto-load-images.html 2026-04-16 17:54:40.331700600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.auto-load-images.html 2026-07-09 07:33:42.921856000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -246,8 +246,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.cursive-font-family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.cursive-font-family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.cursive-font-family.html 2026-04-16 17:54:40.333700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.cursive-font-family.html 2026-07-09 07:33:42.923066000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -244,8 +244,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.default-charset.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.default-charset.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.default-charset.html 2026-04-16 17:54:40.336700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.default-charset.html 2026-07-09 07:33:42.924001200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -244,8 +244,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.default-font-family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.default-font-family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.default-font-family.html 2026-04-16 17:54:40.339700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.default-font-family.html 2026-07-09 07:33:42.924932500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -244,8 +244,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.default-font-size.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.default-font-size.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.default-font-size.html 2026-04-16 17:54:40.342700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.default-font-size.html 2026-07-09 07:33:42.925874500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -245,8 +245,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.default-monospace-font-size.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.default-monospace-font-size.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.default-monospace-font-size.html 2026-04-16 17:54:40.345700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.default-monospace-font-size.html 2026-07-09 07:33:42.926835000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -245,8 +245,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.disable-web-security.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.disable-web-security.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.disable-web-security.html 2026-04-16 17:54:40.349700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.disable-web-security.html 2026-07-09 07:33:42.927955200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.draw-compositing-indicators.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.draw-compositing-indicators.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.draw-compositing-indicators.html 2026-04-16 17:54:40.352700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.draw-compositing-indicators.html 2026-07-09 07:33:42.929290300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -246,8 +246,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-2d-canvas-acceleration.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-2d-canvas-acceleration.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-2d-canvas-acceleration.html 2026-04-16 17:54:40.356700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-2d-canvas-acceleration.html 2026-07-09 07:33:42.930536700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-back-forward-navigation-gestures.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-back-forward-navigation-gestures.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-back-forward-navigation-gestures.html 2026-04-16 17:54:40.359700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-back-forward-navigation-gestures.html 2026-07-09 07:33:42.931483300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-caret-browsing.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-caret-browsing.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-caret-browsing.html 2026-04-16 17:54:40.362700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-caret-browsing.html 2026-07-09 07:33:42.932373500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -244,8 +244,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-developer-extras.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-developer-extras.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-developer-extras.html 2026-04-16 17:54:40.364700800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-developer-extras.html 2026-07-09 07:33:42.933279000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -244,8 +244,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-dns-prefetching.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-dns-prefetching.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-dns-prefetching.html 2026-04-16 17:54:40.368700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-dns-prefetching.html 2026-07-09 07:33:42.934597700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable deprecated: 2.48 since: 6.0

+

deprecated: 2.48 

@@ -245,8 +245,6 @@ - Available since:6.0 - Deprecated since:2.48

Please do not use it in newly written code.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-encrypted-media.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-encrypted-media.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-encrypted-media.html 2026-04-16 17:54:40.372700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-encrypted-media.html 2026-07-09 07:33:42.936229000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-fullscreen.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-fullscreen.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-fullscreen.html 2026-04-16 17:54:40.375700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-fullscreen.html 2026-07-09 07:33:42.937358000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -247,8 +247,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-html5-database.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-html5-database.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-html5-database.html 2026-04-16 17:54:40.378700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-html5-database.html 2026-07-09 07:33:42.938264600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -244,8 +244,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-html5-local-storage.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-html5-local-storage.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-html5-local-storage.html 2026-04-16 17:54:40.382700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-html5-local-storage.html 2026-07-09 07:33:42.939384000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -246,8 +246,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-hyperlink-auditing.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-hyperlink-auditing.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-hyperlink-auditing.html 2026-04-16 17:54:40.385700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-hyperlink-auditing.html 2026-07-09 07:33:42.940712200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable deprecated: 2.50 since: 6.0

+

deprecated: 2.50 

@@ -245,8 +245,6 @@ - Available since:6.0 - Deprecated since:2.50

Please do not use it in newly written code.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-javascript-markup.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-javascript-markup.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-javascript-markup.html 2026-04-16 17:54:40.394700800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-javascript-markup.html 2026-07-09 07:33:42.943878400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-javascript.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-javascript.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-javascript.html 2026-04-16 17:54:40.388700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-javascript.html 2026-07-09 07:33:42.941855700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -244,8 +244,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-media-capabilities.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-media-capabilities.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-media-capabilities.html 2026-04-16 17:54:40.403700800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-media-capabilities.html 2026-07-09 07:33:42.946865000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-media-stream.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-media-stream.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-media-stream.html 2026-04-16 17:54:40.407700800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-media-stream.html 2026-07-09 07:33:42.948027100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-media.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-media.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-media.html 2026-04-16 17:54:40.399700600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-media.html 2026-07-09 07:33:42.945387100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-mediasource.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-mediasource.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-mediasource.html 2026-04-16 17:54:40.410700800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-mediasource.html 2026-07-09 07:33:42.949170600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-mock-capture-devices.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-mock-capture-devices.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-mock-capture-devices.html 2026-04-16 17:54:40.413700800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-mock-capture-devices.html 2026-07-09 07:33:42.950472400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-offline-web-application-cache.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-offline-web-application-cache.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-offline-web-application-cache.html 2026-04-16 17:54:40.417700800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-offline-web-application-cache.html 2026-07-09 07:33:42.951657300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable deprecated: 2.44 since: 6.0

+

deprecated: 2.44 

@@ -244,8 +244,6 @@ - Available since:6.0 - Deprecated since:2.44

Please do not use it in newly written code.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-page-cache.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-page-cache.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-page-cache.html 2026-04-16 17:54:40.421700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-page-cache.html 2026-07-09 07:33:42.953198700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -251,8 +251,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-resizable-text-areas.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-resizable-text-areas.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-resizable-text-areas.html 2026-04-16 17:54:40.424700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-resizable-text-areas.html 2026-07-09 07:33:42.954064400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -244,8 +244,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-site-specific-quirks.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-site-specific-quirks.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-site-specific-quirks.html 2026-04-16 17:54:40.428700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-site-specific-quirks.html 2026-07-09 07:33:42.955389000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -249,8 +249,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-smooth-scrolling.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-smooth-scrolling.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-smooth-scrolling.html 2026-04-16 17:54:40.431700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-smooth-scrolling.html 2026-07-09 07:33:42.956251000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -244,8 +244,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-spatial-navigation.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-spatial-navigation.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-spatial-navigation.html 2026-04-16 17:54:40.435701000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-spatial-navigation.html 2026-07-09 07:33:42.957921500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-tabs-to-links.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-tabs-to-links.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-tabs-to-links.html 2026-04-16 17:54:40.438700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-tabs-to-links.html 2026-07-09 07:33:42.959102200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -247,8 +247,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-webaudio.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-webaudio.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-webaudio.html 2026-04-16 17:54:40.442700900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-webaudio.html 2026-07-09 07:33:42.960217000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -246,8 +246,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-webgl.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-webgl.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-webgl.html 2026-04-16 17:54:40.445701000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-webgl.html 2026-07-09 07:33:42.961207900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -245,8 +245,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-webrtc.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-webrtc.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-webrtc.html 2026-04-16 17:54:40.448701000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-webrtc.html 2026-07-09 07:33:42.962439800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -257,7 +257,7 @@
- + diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-write-console-messages-to-stdout.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-write-console-messages-to-stdout.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.enable-write-console-messages-to-stdout.html 2026-04-16 17:54:40.451701000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.enable-write-console-messages-to-stdout.html 2026-07-09 07:33:42.963461600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.fantasy-font-family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.fantasy-font-family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.fantasy-font-family.html 2026-04-16 17:54:40.454700700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.fantasy-font-family.html 2026-07-09 07:33:42.964824000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -244,8 +244,6 @@ -

-
Default valueTRUE
Default valueFALSE
Getter methodwebkit_settings_get_enable_webrtc()
Available since:6.0
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.hardware-acceleration-policy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.hardware-acceleration-policy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.hardware-acceleration-policy.html 2026-04-16 17:54:40.458701000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.hardware-acceleration-policy.html 2026-07-09 07:33:42.966279700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.javascript-can-access-clipboard.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.javascript-can-access-clipboard.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.javascript-can-access-clipboard.html 2026-04-16 17:54:40.462700800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.javascript-can-access-clipboard.html 2026-07-09 07:33:42.967552700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -245,8 +245,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.javascript-can-open-windows-automatically.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.javascript-can-open-windows-automatically.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.javascript-can-open-windows-automatically.html 2026-04-16 17:54:40.465700900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.javascript-can-open-windows-automatically.html 2026-07-09 07:33:42.968513500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -244,8 +244,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.load-icons-ignoring-image-load-setting.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.load-icons-ignoring-image-load-setting.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.load-icons-ignoring-image-load-setting.html 2026-04-16 17:54:40.468701000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.load-icons-ignoring-image-load-setting.html 2026-07-09 07:33:42.969633600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable deprecated: 2.42 since: 6.0

+

deprecated: 2.42 

@@ -244,8 +244,6 @@ - Available since:6.0 - Deprecated since:2.42

Please do not use it in newly written code.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.math-font-family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.math-font-family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.math-font-family.html 2026-04-16 17:54:40.471701000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.math-font-family.html 2026-07-09 07:33:42.970569100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.media-content-types-requiring-hardware-support.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.media-content-types-requiring-hardware-support.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.media-content-types-requiring-hardware-support.html 2026-04-16 17:54:40.475700900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.media-content-types-requiring-hardware-support.html 2026-07-09 07:33:42.972131700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.media-playback-allows-inline.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.media-playback-allows-inline.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.media-playback-allows-inline.html 2026-04-16 17:54:40.479700800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.media-playback-allows-inline.html 2026-07-09 07:33:42.973577000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -246,8 +246,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.media-playback-requires-user-gesture.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.media-playback-requires-user-gesture.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.media-playback-requires-user-gesture.html 2026-04-16 17:54:40.483700800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.media-playback-requires-user-gesture.html 2026-07-09 07:33:42.974746700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -248,8 +248,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.minimum-font-size.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.minimum-font-size.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.minimum-font-size.html 2026-04-16 17:54:40.486700800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.minimum-font-size.html 2026-07-09 07:33:42.975831700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -246,8 +246,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.monospace-font-family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.monospace-font-family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.monospace-font-family.html 2026-04-16 17:54:40.489700800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.monospace-font-family.html 2026-07-09 07:33:42.976711300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -244,8 +244,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.pictograph-font-family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.pictograph-font-family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.pictograph-font-family.html 2026-04-16 17:54:40.492700800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.pictograph-font-family.html 2026-07-09 07:33:42.977623000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -244,8 +244,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.print-backgrounds.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.print-backgrounds.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.print-backgrounds.html 2026-04-16 17:54:40.495700800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.print-backgrounds.html 2026-07-09 07:33:42.978747800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -244,8 +244,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.sans-serif-font-family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.sans-serif-font-family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.sans-serif-font-family.html 2026-04-16 17:54:40.499544400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.sans-serif-font-family.html 2026-07-09 07:33:42.979681000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -244,8 +244,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.serif-font-family.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.serif-font-family.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.serif-font-family.html 2026-04-16 17:54:40.500701000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.serif-font-family.html 2026-07-09 07:33:42.980587500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -244,8 +244,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.user-agent.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.user-agent.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.user-agent.html 2026-04-16 17:54:40.508700800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.user-agent.html 2026-07-09 07:33:42.983361200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -249,8 +249,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.webrtc-udp-ports-range.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.webrtc-udp-ports-range.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.webrtc-udp-ports-range.html 2026-04-16 17:54:40.512700800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.webrtc-udp-ports-range.html 2026-07-09 07:33:42.984617700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.zoom-text-only.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.zoom-text-only.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.Settings.zoom-text-only.html 2026-04-16 17:54:40.515700800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.Settings.zoom-text-only.html 2026-07-09 07:33:42.985823000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -196,7 +196,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -211,7 +211,7 @@
-

unstable since: 6.0

+

@@ -247,8 +247,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.URIRequest.uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIRequest.uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.URIRequest.uri.html 2026-04-16 17:54:40.612701000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIRequest.uri.html 2026-07-09 07:33:43.016719800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -97,7 +97,7 @@
-

unstable since: 6.0

+

@@ -130,8 +130,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.URIResponse.content-length.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIResponse.content-length.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.URIResponse.content-length.html 2026-04-16 17:54:40.710701200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIResponse.content-length.html 2026-07-09 07:33:43.053688000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -140,8 +140,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.URIResponse.http-headers.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIResponse.http-headers.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.URIResponse.http-headers.html 2026-04-16 17:54:40.713701200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIResponse.http-headers.html 2026-07-09 07:33:43.054919500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.URIResponse.mime-type.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIResponse.mime-type.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.URIResponse.mime-type.html 2026-04-16 17:54:40.715701000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIResponse.mime-type.html 2026-07-09 07:33:43.055664800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -140,8 +140,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.URIResponse.status-code.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIResponse.status-code.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.URIResponse.status-code.html 2026-04-16 17:54:40.719417000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIResponse.status-code.html 2026-07-09 07:33:43.056434400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -140,8 +140,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.URIResponse.suggested-filename.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIResponse.suggested-filename.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.URIResponse.suggested-filename.html 2026-04-16 17:54:40.720701200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIResponse.suggested-filename.html 2026-07-09 07:33:43.057157500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -140,8 +140,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.URIResponse.uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIResponse.uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.URIResponse.uri.html 2026-04-16 17:54:40.722701000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URIResponse.uri.html 2026-07-09 07:33:43.057917000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -140,8 +140,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.URISchemeResponse.stream-length.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URISchemeResponse.stream-length.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.URISchemeResponse.stream-length.html 2026-04-16 17:54:40.944701400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URISchemeResponse.stream-length.html 2026-07-09 07:33:43.138052700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.URISchemeResponse.stream.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URISchemeResponse.stream.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.URISchemeResponse.stream.html 2026-04-16 17:54:40.943370000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.URISchemeResponse.stream.html 2026-07-09 07:33:43.137165500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.UserContentFilterStore.path.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.UserContentFilterStore.path.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.UserContentFilterStore.path.html 2026-04-16 17:54:41.127554000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.UserContentFilterStore.path.html 2026-07-09 07:33:43.209901600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.UserMediaPermissionRequest.is-for-audio-device.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.UserMediaPermissionRequest.is-for-audio-device.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.UserMediaPermissionRequest.is-for-audio-device.html 2026-04-16 17:54:41.370702000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.UserMediaPermissionRequest.is-for-audio-device.html 2026-07-09 07:33:43.300671000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.UserMediaPermissionRequest.is-for-video-device.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.UserMediaPermissionRequest.is-for-video-device.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.UserMediaPermissionRequest.is-for-video-device.html 2026-04-16 17:54:41.374386000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.UserMediaPermissionRequest.is-for-video-device.html 2026-07-09 07:33:43.302408200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.UserMessage.fd-list.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.UserMessage.fd-list.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.UserMessage.fd-list.html 2026-04-16 17:54:41.467702200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.UserMessage.fd-list.html 2026-07-09 07:33:43.340295300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.UserMessage.name.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.UserMessage.name.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.UserMessage.name.html 2026-04-16 17:54:41.471201200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.UserMessage.name.html 2026-07-09 07:33:43.341008700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.UserMessage.parameters.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.UserMessage.parameters.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.UserMessage.parameters.html 2026-04-16 17:54:41.474416700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.UserMessage.parameters.html 2026-07-09 07:33:43.342402000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebContext.memory-pressure-settings.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebContext.memory-pressure-settings.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebContext.memory-pressure-settings.html 2026-04-16 17:54:41.715275800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebContext.memory-pressure-settings.html 2026-07-09 07:33:43.436613800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebContext.time-zone-override.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebContext.time-zone-override.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebContext.time-zone-override.html 2026-04-16 17:54:41.717702600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebContext.time-zone-override.html 2026-07-09 07:33:43.438318300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.default-locale.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.default-locale.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.default-locale.html 2026-04-16 17:54:42.034603600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.default-locale.html 2026-07-09 07:33:43.557704700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.display-action-label.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.display-action-label.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.display-action-label.html 2026-04-16 17:54:42.036703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.display-action-label.html 2026-07-09 07:33:43.558805700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.display-description.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.display-description.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.display-description.html 2026-04-16 17:54:42.039703100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.display-description.html 2026-07-09 07:33:43.559851200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.display-name.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.display-name.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.display-name.html 2026-04-16 17:54:42.042703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.display-name.html 2026-07-09 07:33:43.560865000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.display-short-name.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.display-short-name.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.display-short-name.html 2026-04-16 17:54:42.045703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.display-short-name.html 2026-07-09 07:33:43.561890000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.display-version.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.display-version.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.display-version.html 2026-04-16 17:54:42.048703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.display-version.html 2026-07-09 07:33:43.562920300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.has-background-content.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-background-content.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.has-background-content.html 2026-04-16 17:54:42.053278400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-background-content.html 2026-07-09 07:33:43.564269000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.has-commands.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-commands.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.has-commands.html 2026-04-16 17:54:42.056330700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-commands.html 2026-07-09 07:33:43.565364600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.has-content-modification-rules.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-content-modification-rules.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.has-content-modification-rules.html 2026-04-16 17:54:42.059471100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-content-modification-rules.html 2026-07-09 07:33:43.566486100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.has-injected-content.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-injected-content.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.has-injected-content.html 2026-04-16 17:54:42.061703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-injected-content.html 2026-07-09 07:33:43.567629300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.has-options-page.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-options-page.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.has-options-page.html 2026-04-16 17:54:42.064703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-options-page.html 2026-07-09 07:33:43.568644500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.has-override-new-tab-page.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-override-new-tab-page.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.has-override-new-tab-page.html 2026-04-16 17:54:42.069493000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-override-new-tab-page.html 2026-07-09 07:33:43.569759000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.has-persistent-background-content.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-persistent-background-content.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.has-persistent-background-content.html 2026-04-16 17:54:42.071703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.has-persistent-background-content.html 2026-07-09 07:33:43.571187000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.manifest-version.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.manifest-version.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.manifest-version.html 2026-04-16 17:54:42.074703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.manifest-version.html 2026-07-09 07:33:43.572244200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.optional-permissions.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.optional-permissions.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.optional-permissions.html 2026-04-16 17:54:42.077703000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.optional-permissions.html 2026-07-09 07:33:43.573312800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.path.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.path.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.path.html 2026-04-16 17:54:42.082310400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.path.html 2026-07-09 07:33:43.574395700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.requested-permissions.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.requested-permissions.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.requested-permissions.html 2026-04-16 17:54:42.086302000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.requested-permissions.html 2026-07-09 07:33:43.575479300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.version.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.version.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebExtension.version.html 2026-04-16 17:54:42.089191000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebExtension.version.html 2026-07-09 07:33:43.576486300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -116,7 +116,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebInspector.attached-height.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebInspector.attached-height.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebInspector.attached-height.html 2026-04-16 17:54:42.222347300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebInspector.attached-height.html 2026-07-09 07:33:43.624159300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -101,7 +101,7 @@
-

unstable since: 6.0

+

@@ -134,8 +134,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebInspector.can-attach.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebInspector.can-attach.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebInspector.can-attach.html 2026-04-16 17:54:42.223703400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebInspector.can-attach.html 2026-07-09 07:33:43.625118300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebInspector.inspected-uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebInspector.inspected-uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebInspector.inspected-uri.html 2026-04-16 17:54:42.227384800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebInspector.inspected-uri.html 2026-07-09 07:33:43.625885500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -101,7 +101,7 @@
-

unstable since: 6.0

+

@@ -134,8 +134,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebResource.response.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebResource.response.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebResource.response.html 2026-04-16 17:54:42.368703400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebResource.response.html 2026-07-09 07:33:43.680541800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -99,7 +99,7 @@
-

unstable since: 6.0

+

@@ -132,8 +132,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebResource.uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebResource.uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebResource.uri.html 2026-04-16 17:54:42.373053000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebResource.uri.html 2026-07-09 07:33:43.681542600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -99,7 +99,7 @@
-

unstable since: 6.0

+

@@ -133,8 +133,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.automation-presentation-type.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.automation-presentation-type.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.automation-presentation-type.html 2026-04-16 17:54:43.763705500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.automation-presentation-type.html 2026-07-09 07:33:44.215974800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.camera-capture-state.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.camera-capture-state.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.camera-capture-state.html 2026-04-16 17:54:43.769705500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.camera-capture-state.html 2026-07-09 07:33:44.218078000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.default-content-security-policy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.default-content-security-policy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.default-content-security-policy.html 2026-04-16 17:54:43.775616200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.default-content-security-policy.html 2026-07-09 07:33:44.219653000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.display-capture-state.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.display-capture-state.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.display-capture-state.html 2026-04-16 17:54:43.781546600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.display-capture-state.html 2026-07-09 07:33:44.221718800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.editable.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.editable.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.editable.html 2026-04-16 17:54:43.783705500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.editable.html 2026-07-09 07:33:44.222762300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@ Description - [src] + [src] @@ -193,6 +193,8 @@ Default valueFALSE + Getter methodwebkit_web_view_is_editable() + Setter methodwebkit_web_view_set_editable() diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.estimated-load-progress.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.estimated-load-progress.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.estimated-load-progress.html 2026-04-16 17:54:43.788374700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.estimated-load-progress.html 2026-07-09 07:33:44.224265600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -147,7 +147,7 @@
-

unstable since: 6.0

+

@@ -165,7 +165,7 @@ Description - [src] + [src]

@@ -186,8 +186,6 @@ - Available since:6.0 -
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.favicon.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.favicon.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.favicon.html 2026-04-16 17:54:43.790705400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.favicon.html 2026-07-09 07:33:44.225371400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -147,7 +147,7 @@
-

unstable since: 6.0

+

@@ -165,7 +165,7 @@ Description - [src] + [src]

@@ -181,8 +181,6 @@ - Available since:6.0 -
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.is-controlled-by-automation.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.is-controlled-by-automation.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.is-controlled-by-automation.html 2026-04-16 17:54:43.797482500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.is-controlled-by-automation.html 2026-07-09 07:33:44.227519800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.is-immersive-mode-enabled.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.is-immersive-mode-enabled.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.is-immersive-mode-enabled.html 2026-04-16 17:54:43.799705500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.is-immersive-mode-enabled.html 2026-07-09 07:33:44.228449000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.is-loading.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.is-loading.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.is-loading.html 2026-04-16 17:54:43.806603000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.is-loading.html 2026-07-09 07:33:44.230458500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -147,7 +147,7 @@
-

unstable since: 6.0

+

@@ -165,7 +165,7 @@ Description - [src] + [src]

@@ -185,8 +185,6 @@ - Available since:6.0 -
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.is-muted.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.is-muted.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.is-muted.html 2026-04-16 17:54:43.810532600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.is-muted.html 2026-07-09 07:33:44.231740700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.is-playing-audio.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.is-playing-audio.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.is-playing-audio.html 2026-04-16 17:54:43.813705400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.is-playing-audio.html 2026-07-09 07:33:44.233563700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.is-web-process-responsive.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.is-web-process-responsive.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.is-web-process-responsive.html 2026-04-16 17:54:43.816705500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.is-web-process-responsive.html 2026-07-09 07:33:44.234546200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.microphone-capture-state.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.microphone-capture-state.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.microphone-capture-state.html 2026-04-16 17:54:43.822705500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.microphone-capture-state.html 2026-07-09 07:33:44.236677000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.network-session.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.network-session.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.network-session.html 2026-04-16 17:54:43.825705500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.network-session.html 2026-07-09 07:33:44.237568600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.page-id.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.page-id.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.page-id.html 2026-04-16 17:54:43.828705500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.page-id.html 2026-07-09 07:33:44.238540600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.related-view.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.related-view.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.related-view.html 2026-04-16 17:54:43.831705600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.related-view.html 2026-07-09 07:33:44.239652200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.settings.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.settings.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.settings.html 2026-04-16 17:54:43.834705600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.settings.html 2026-07-09 07:33:44.240734000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.theme-color.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.theme-color.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.theme-color.html 2026-04-16 17:54:43.838430200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.theme-color.html 2026-07-09 07:33:44.241578300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.title.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.title.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.title.html 2026-04-16 17:54:43.840705600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.title.html 2026-07-09 07:33:44.242715100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -147,7 +147,7 @@
-

unstable since: 6.0

+

@@ -165,7 +165,7 @@ Description - [src] + [src]

@@ -181,8 +181,6 @@ - Available since:6.0 -
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.uri.html 2026-04-16 17:54:43.843705700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.uri.html 2026-07-09 07:33:44.243738400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -147,7 +147,7 @@
-

unstable since: 6.0

+

@@ -165,7 +165,7 @@ Description - [src] + [src]

@@ -181,8 +181,6 @@ - Available since:6.0 -
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.user-content-manager.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.user-content-manager.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.user-content-manager.html 2026-04-16 17:54:43.847642000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.user-content-manager.html 2026-07-09 07:33:44.244622200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.web-context.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.web-context.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.web-context.html 2026-04-16 17:54:43.848705500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.web-context.html 2026-07-09 07:33:44.245473100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -147,7 +147,7 @@
-

unstable since: 6.0

+

@@ -165,7 +165,7 @@ Description - [src] + [src]

@@ -180,8 +180,6 @@ - Available since:6.0 -
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.web-extension-mode.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.web-extension-mode.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.web-extension-mode.html 2026-04-16 17:54:43.854430700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.web-extension-mode.html 2026-07-09 07:33:44.247104200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.website-policies.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.website-policies.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.website-policies.html 2026-04-16 17:54:43.855705500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.website-policies.html 2026-07-09 07:33:44.247997300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@ Description - [src] + [src] diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.zoom-level.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.zoom-level.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebView.zoom-level.html 2026-04-16 17:54:43.860399700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebView.zoom-level.html 2026-07-09 07:33:44.249017700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -132,7 +132,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -147,7 +147,7 @@
-

unstable since: 6.0

+

@@ -165,7 +165,7 @@ Description - [src] + [src]

@@ -181,8 +181,6 @@ - Available since:6.0 -
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebsiteDataManager.base-cache-directory.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebsiteDataManager.base-cache-directory.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebsiteDataManager.base-cache-directory.html 2026-04-16 17:54:42.664703800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebsiteDataManager.base-cache-directory.html 2026-07-09 07:33:43.807681600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebsiteDataManager.base-data-directory.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebsiteDataManager.base-data-directory.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebsiteDataManager.base-data-directory.html 2026-04-16 17:54:42.668640900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebsiteDataManager.base-data-directory.html 2026-07-09 07:33:43.808617400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebsiteDataManager.is-ephemeral.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebsiteDataManager.is-ephemeral.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebsiteDataManager.is-ephemeral.html 2026-04-16 17:54:42.671703800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebsiteDataManager.is-ephemeral.html 2026-07-09 07:33:43.810145000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebsiteDataManager.origin-storage-ratio.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebsiteDataManager.origin-storage-ratio.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebsiteDataManager.origin-storage-ratio.html 2026-04-16 17:54:42.674703800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebsiteDataManager.origin-storage-ratio.html 2026-07-09 07:33:43.811278000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebsiteDataManager.total-storage-ratio.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebsiteDataManager.total-storage-ratio.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebsiteDataManager.total-storage-ratio.html 2026-04-16 17:54:42.677703900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebsiteDataManager.total-storage-ratio.html 2026-07-09 07:33:43.812371000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebsitePolicies.autoplay.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebsitePolicies.autoplay.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WebsitePolicies.autoplay.html 2026-04-16 17:54:42.754558000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WebsitePolicies.autoplay.html 2026-07-09 07:33:43.836917200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WindowProperties.fullscreen.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.fullscreen.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WindowProperties.fullscreen.html 2026-04-16 17:54:44.424375500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.fullscreen.html 2026-07-09 07:33:44.465221600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -111,7 +111,7 @@
-

unstable since: 6.0

+

@@ -144,8 +144,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WindowProperties.geometry.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.geometry.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WindowProperties.geometry.html 2026-04-16 17:54:44.425706400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.geometry.html 2026-07-09 07:33:44.465994600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -111,7 +111,7 @@
-

unstable since: 6.0

+

@@ -144,8 +144,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WindowProperties.locationbar-visible.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.locationbar-visible.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WindowProperties.locationbar-visible.html 2026-04-16 17:54:44.429388300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.locationbar-visible.html 2026-07-09 07:33:44.466738200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -111,7 +111,7 @@
-

unstable since: 6.0

+

@@ -144,8 +144,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WindowProperties.menubar-visible.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.menubar-visible.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WindowProperties.menubar-visible.html 2026-04-16 17:54:44.430706300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.menubar-visible.html 2026-07-09 07:33:44.468128400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -111,7 +111,7 @@
-

unstable since: 6.0

+

@@ -144,8 +144,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WindowProperties.resizable.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.resizable.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WindowProperties.resizable.html 2026-04-16 17:54:44.434460600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.resizable.html 2026-07-09 07:33:44.468850900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -111,7 +111,7 @@
-

unstable since: 6.0

+

@@ -144,8 +144,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WindowProperties.scrollbars-visible.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.scrollbars-visible.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WindowProperties.scrollbars-visible.html 2026-04-16 17:54:44.437154300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.scrollbars-visible.html 2026-07-09 07:33:44.469608300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -111,7 +111,7 @@
-

unstable since: 6.0

+

@@ -144,8 +144,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WindowProperties.statusbar-visible.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.statusbar-visible.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WindowProperties.statusbar-visible.html 2026-04-16 17:54:44.439581200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.statusbar-visible.html 2026-07-09 07:33:44.470345500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -111,7 +111,7 @@
-

unstable since: 6.0

+

@@ -144,8 +144,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WindowProperties.toolbar-visible.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.toolbar-visible.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/property.WindowProperties.toolbar-visible.html 2026-04-16 17:54:44.440706500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/property.WindowProperties.toolbar-visible.html 2026-07-09 07:33:44.471121500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -96,7 +96,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -111,7 +111,7 @@
-

unstable since: 6.0

+

@@ -144,8 +144,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/remote-inspector.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/remote-inspector.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/remote-inspector.html 2026-04-16 17:54:30.897524400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/remote-inspector.html 2026-07-09 07:33:39.494306800 +0000 @@ -62,13 +62,13 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.AuthenticationRequest.authenticated.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.AuthenticationRequest.authenticated.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.AuthenticationRequest.authenticated.html 2026-04-16 17:54:34.448692600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.AuthenticationRequest.authenticated.html 2026-07-09 07:33:40.635501100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@
credential

Type: WebKitCredential

-

The WebKitCredential accepted.

+

The WebKitCredential accepted.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.AuthenticationRequest.cancelled.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.AuthenticationRequest.cancelled.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.AuthenticationRequest.cancelled.html 2026-04-16 17:54:34.470692400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.AuthenticationRequest.cancelled.html 2026-07-09 07:33:40.642070300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.AutomationSession.create-web-view.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.AutomationSession.create-web-view.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.AutomationSession.create-web-view.html 2026-04-16 17:54:34.670692700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.AutomationSession.create-web-view.html 2026-07-09 07:33:40.707275600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -174,7 +174,7 @@

Type: WebKitWebView

-

A WebKitWebView widget.

+

A WebKitWebView widget.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.AutomationSession.will-close.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.AutomationSession.will-close.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.AutomationSession.will-close.html 2026-04-16 17:54:34.681692800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.AutomationSession.will-close.html 2026-07-09 07:33:40.712018000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.BackForwardList.changed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.BackForwardList.changed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.BackForwardList.changed.html 2026-04-16 17:54:34.944693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.BackForwardList.changed.html 2026-07-09 07:33:40.844219000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -97,7 +97,7 @@
-

unstable since: 6.0

+

@@ -144,8 +144,6 @@ -

-
Available since: 6.0
@@ -166,7 +164,7 @@
item_added

Type: WebKitBackForwardListItem

-

The WebKitBackForwardListItem added or NULL.

+

The WebKitBackForwardListItem added or NULL.

@@ -183,7 +181,7 @@
items_removed

Type: gpointer

-

A GList of WebKitBackForwardListItems.

+

A GList of WebKitBackForwardListItems.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.ColorChooserRequest.finished.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.ColorChooserRequest.finished.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.ColorChooserRequest.finished.html 2026-04-16 17:54:35.367693700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.ColorChooserRequest.finished.html 2026-07-09 07:33:41.055636200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.CookieManager.changed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.CookieManager.changed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.CookieManager.changed.html 2026-04-16 17:54:36.663695600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.CookieManager.changed.html 2026-07-09 07:33:41.538916300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -97,7 +97,7 @@
-

unstable since: 6.0

+

@@ -138,8 +138,6 @@ -

-
The argument can be NULL.
Available since: 6.0
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.Download.created-destination.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Download.created-destination.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.Download.created-destination.html 2026-04-16 17:54:36.879696000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Download.created-destination.html 2026-07-09 07:33:41.614949500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -105,7 +105,7 @@
-

unstable since: 6.0

+

@@ -149,8 +149,6 @@ - Available since: 6.0 -

@@ -171,7 +169,7 @@
destination

Type: gchar*

-

The destination.

+

The destination.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.Download.decide-destination.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Download.decide-destination.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.Download.decide-destination.html 2026-04-16 17:54:36.890695800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Download.decide-destination.html 2026-07-09 07:33:41.615481000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -105,7 +105,7 @@
-

unstable since: 6.0

+

@@ -156,8 +156,6 @@ -

-
Available since: 6.0
@@ -178,7 +176,7 @@
suggested_filename

Type: gchar*

-

The filename suggested for the download.

+

The filename suggested for the download.

@@ -210,8 +208,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event, - or FALSE to propagate the event further.

+

TRUE to stop other handlers from being invoked for the event, + or FALSE to propagate the event further.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.Download.failed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Download.failed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.Download.failed.html 2026-04-16 17:54:36.899695900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Download.failed.html 2026-07-09 07:33:41.622839200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -105,7 +105,7 @@
-

unstable since: 6.0

+

@@ -152,8 +152,6 @@ -

-
Available since: 6.0
@@ -174,7 +172,7 @@
error

Type: GError

-

The GError that was triggered.

+

The GError that was triggered.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.Download.finished.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Download.finished.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.Download.finished.html 2026-04-16 17:54:36.904695700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Download.finished.html 2026-07-09 07:33:41.624702500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -105,7 +105,7 @@
-

unstable since: 6.0

+

@@ -147,8 +147,6 @@ -

-
Available since: 6.0
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.Download.received-data.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Download.received-data.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.Download.received-data.html 2026-04-16 17:54:36.910695800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Download.received-data.html 2026-07-09 07:33:41.626876800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -105,7 +105,7 @@
-

unstable since: 6.0

+

@@ -149,8 +149,6 @@ - Available since: 6.0 -

@@ -171,7 +169,7 @@
data_length

Type: guint64

-

The length of data received in bytes.

+

The length of data received in bytes.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.EditorState.changed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.EditorState.changed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.EditorState.changed.html 2026-04-16 17:54:36.998696000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.EditorState.changed.html 2026-07-09 07:33:41.666865300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.FaviconDatabase.favicon-changed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.FaviconDatabase.favicon-changed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.FaviconDatabase.favicon-changed.html 2026-04-16 17:54:37.095696200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.FaviconDatabase.favicon-changed.html 2026-07-09 07:33:41.714723600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -97,7 +97,7 @@
-

unstable since: 6.0

+

@@ -145,8 +145,6 @@ -

-
Available since: 6.0
@@ -167,7 +165,7 @@
page_uri

Type: gchar*

-

The URI of the Web page containing the icon.

+

The URI of the Web page containing the icon.

@@ -184,7 +182,7 @@
favicon_uri

Type: gchar*

-

The URI of the favicon.

+

The URI of the favicon.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.FindController.counted-matches.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.FindController.counted-matches.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.FindController.counted-matches.html 2026-04-16 17:54:37.358696500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.FindController.counted-matches.html 2026-07-09 07:33:41.811411000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -101,7 +101,7 @@
-

unstable since: 6.0

+

@@ -145,8 +145,6 @@ -

-
Available since: 6.0
@@ -167,7 +165,7 @@
match_count

Type: guint

-

The number of matches of the search text.

+

The number of matches of the search text.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.FindController.failed-to-find-text.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.FindController.failed-to-find-text.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.FindController.failed-to-find-text.html 2026-04-16 17:54:37.365696400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.FindController.failed-to-find-text.html 2026-07-09 07:33:41.813655100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -101,7 +101,7 @@
-

unstable since: 6.0

+

@@ -146,8 +146,6 @@ -

-
Available since: 6.0
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.FindController.found-text.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.FindController.found-text.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.FindController.found-text.html 2026-04-16 17:54:37.373696600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.FindController.found-text.html 2026-07-09 07:33:41.816753000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -101,7 +101,7 @@
-

unstable since: 6.0

+

@@ -146,8 +146,6 @@ - Available since: 6.0 -

@@ -168,7 +166,7 @@
match_count

Type: guint

-

The number of matches found of the search text.

+

The number of matches found of the search text.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.GeolocationManager.start.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.GeolocationManager.start.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.GeolocationManager.start.html 2026-04-16 17:54:37.515696800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.GeolocationManager.start.html 2026-07-09 07:33:41.872459400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -168,8 +168,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to propagate the event further.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.GeolocationManager.stop.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.GeolocationManager.stop.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.GeolocationManager.stop.html 2026-04-16 17:54:37.519696700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.GeolocationManager.stop.html 2026-07-09 07:33:41.874089700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.InputMethodContext.committed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.InputMethodContext.committed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.InputMethodContext.committed.html 2026-04-16 17:54:37.973697400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.InputMethodContext.committed.html 2026-07-09 07:33:42.046637300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,7 +171,7 @@
text

Type: gchar*

-

The string result.

+

The string result.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.InputMethodContext.delete-surrounding.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.InputMethodContext.delete-surrounding.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.InputMethodContext.delete-surrounding.html 2026-04-16 17:54:37.981697300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.InputMethodContext.delete-surrounding.html 2026-07-09 07:33:42.049491600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,7 +171,7 @@
offset

Type: gint

-

The character offset from the cursor position of the text to be deleted.

+

The character offset from the cursor position of the text to be deleted.

@@ -188,7 +188,7 @@
n_chars

Type: guint

-

The number of characters to be deleted.

+

The number of characters to be deleted.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.InputMethodContext.preedit-changed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.InputMethodContext.preedit-changed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.InputMethodContext.preedit-changed.html 2026-04-16 17:54:37.986697400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.InputMethodContext.preedit-changed.html 2026-07-09 07:33:42.051426200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.InputMethodContext.preedit-finished.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.InputMethodContext.preedit-finished.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.InputMethodContext.preedit-finished.html 2026-04-16 17:54:37.990697400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.InputMethodContext.preedit-finished.html 2026-07-09 07:33:42.053119700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.InputMethodContext.preedit-started.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.InputMethodContext.preedit-started.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.InputMethodContext.preedit-started.html 2026-04-16 17:54:37.994697300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.InputMethodContext.preedit-started.html 2026-07-09 07:33:42.054502200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.NetworkSession.download-started.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.NetworkSession.download-started.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.NetworkSession.download-started.html 2026-04-16 17:54:38.415698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.NetworkSession.download-started.html 2026-07-09 07:33:42.211999700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -161,7 +161,7 @@
download

Type: WebKitDownload

-

The WebKitDownload associated with this event.

+

The WebKitDownload associated with this event.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.Notification.clicked.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Notification.clicked.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.Notification.clicked.html 2026-04-16 17:54:38.507698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Notification.clicked.html 2026-07-09 07:33:42.249271400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.Notification.closed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Notification.closed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.Notification.closed.html 2026-04-16 17:54:38.511698000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.Notification.closed.html 2026-07-09 07:33:42.250801800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.OptionMenu.close.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.OptionMenu.close.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.OptionMenu.close.html 2026-04-16 17:54:38.679698200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.OptionMenu.close.html 2026-07-09 07:33:42.306764800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.PrintOperation.failed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.PrintOperation.failed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.PrintOperation.failed.html 2026-04-16 17:54:38.917698600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.PrintOperation.failed.html 2026-07-09 07:33:42.407111200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -99,7 +99,7 @@
-

unstable since: 6.0

+

@@ -143,8 +143,6 @@ -

-
Available since: 6.0
@@ -165,7 +163,7 @@
error

Type: GError

-

The GError that was triggered.

+

The GError that was triggered.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.PrintOperation.finished.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.PrintOperation.finished.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.PrintOperation.finished.html 2026-04-16 17:54:38.921698600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.PrintOperation.finished.html 2026-07-09 07:33:42.408563600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -99,7 +99,7 @@
-

unstable since: 6.0

+

@@ -141,8 +141,6 @@ -

-
Available since: 6.0
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.UserContentManager.script-message-received.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.UserContentManager.script-message-received.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.UserContentManager.script-message-received.html 2026-04-16 17:54:41.303701900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.UserContentManager.script-message-received.html 2026-07-09 07:33:43.276227000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -168,7 +168,7 @@
value

Type: JSCValue

-

The value received from the JavaScript world.

+

The value received from the JavaScript world.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.UserContentManager.script-message-with-reply-received.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.UserContentManager.script-message-with-reply-received.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.UserContentManager.script-message-with-reply-received.html 2026-04-16 17:54:41.315702000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.UserContentManager.script-message-with-reply-received.html 2026-07-09 07:33:43.281098400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,7 +175,7 @@
value

Type: JSCValue

-

The value received from the JavaScript world.

+

The value received from the JavaScript world.

@@ -192,7 +192,7 @@
reply

Type: WebKitScriptMessageReply

-

The WebKitScriptMessageReply to send the reply to the script message.

+

The WebKitScriptMessageReply to send the reply to the script message.

@@ -224,8 +224,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to propagate the event further.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebContext.automation-started.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebContext.automation-started.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebContext.automation-started.html 2026-04-16 17:54:41.724702600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebContext.automation-started.html 2026-07-09 07:33:43.440926000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,7 +169,7 @@
session

Type: WebKitAutomationSession

-

The WebKitAutomationSession associated with this event.

+

The WebKitAutomationSession associated with this event.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebContext.initialize-notification-permissions.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebContext.initialize-notification-permissions.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebContext.initialize-notification-permissions.html 2026-04-16 17:54:41.734702600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebContext.initialize-notification-permissions.html 2026-07-09 07:33:43.444379300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebContext.initialize-web-process-extensions.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebContext.initialize-web-process-extensions.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebContext.initialize-web-process-extensions.html 2026-04-16 17:54:41.739702700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebContext.initialize-web-process-extensions.html 2026-07-09 07:33:43.446249700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebContext.user-message-received.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebContext.user-message-received.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebContext.user-message-received.html 2026-04-16 17:54:41.748702500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebContext.user-message-received.html 2026-07-09 07:33:43.449747300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -170,7 +170,7 @@
message

Type: WebKitUserMessage

-

The WebKitUserMessage received.

+

The WebKitUserMessage received.

@@ -202,7 +202,7 @@

Type: gboolean

-

TRUE if the message was handled, or FALSE otherwise.

+

TRUE if the message was handled, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebInspector.attach.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebInspector.attach.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebInspector.attach.html 2026-04-16 17:54:42.234703300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebInspector.attach.html 2026-07-09 07:33:43.628702600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -105,7 +105,7 @@
-

unstable since: 6.0

+

@@ -153,8 +153,6 @@ -

-
Available since: 6.0
@@ -175,8 +173,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to propagate the event further.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebInspector.bring-to-front.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebInspector.bring-to-front.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebInspector.bring-to-front.html 2026-04-16 17:54:42.244703300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebInspector.bring-to-front.html 2026-07-09 07:33:43.632780600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -105,7 +105,7 @@
-

unstable since: 6.0

+

@@ -155,8 +155,6 @@ -

-
Available since: 6.0
@@ -177,8 +175,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to propagate the event further.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebInspector.closed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebInspector.closed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebInspector.closed.html 2026-04-16 17:54:42.248703200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebInspector.closed.html 2026-07-09 07:33:43.634348600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -105,7 +105,7 @@
-

unstable since: 6.0

+

@@ -147,8 +147,6 @@ -

-
Available since: 6.0
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebInspector.detach.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebInspector.detach.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebInspector.detach.html 2026-04-16 17:54:42.259703400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebInspector.detach.html 2026-07-09 07:33:43.638212000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -105,7 +105,7 @@
-

unstable since: 6.0

+

@@ -153,8 +153,6 @@ - Available since: 6.0 -

@@ -175,8 +173,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to propagate the event further.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebInspector.open-window.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebInspector.open-window.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebInspector.open-window.html 2026-04-16 17:54:42.268703500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebInspector.open-window.html 2026-07-09 07:33:43.641893400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -105,7 +105,7 @@
-

unstable since: 6.0

+

@@ -153,8 +153,6 @@ -

-
Available since: 6.0
@@ -175,8 +173,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to propagate the event further.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebResource.failed-with-tls-errors.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebResource.failed-with-tls-errors.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebResource.failed-with-tls-errors.html 2026-04-16 17:54:42.385703600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebResource.failed-with-tls-errors.html 2026-07-09 07:33:43.686724700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -168,7 +168,7 @@
certificate

Type: GTlsCertificate

-

A GTlsCertificate.

+

A GTlsCertificate.

@@ -185,7 +185,7 @@
errors

Type: GTlsCertificateFlags

-

A GTlsCertificateFlags with the verification status of certificate.

+

A GTlsCertificateFlags with the verification status of certificate.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebResource.failed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebResource.failed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebResource.failed.html 2026-04-16 17:54:42.377703400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebResource.failed.html 2026-07-09 07:33:43.683604000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -103,7 +103,7 @@
-

unstable since: 6.0

+

@@ -146,8 +146,6 @@ -

-
Available since: 6.0
@@ -168,7 +166,7 @@
error

Type: GError

-

The GError that was triggered.

+

The GError that was triggered.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebResource.finished.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebResource.finished.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebResource.finished.html 2026-04-16 17:54:42.390703400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebResource.finished.html 2026-07-09 07:33:43.688498500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -103,7 +103,7 @@
-

unstable since: 6.0

+

@@ -146,8 +146,6 @@ -

-
Available since: 6.0
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebResource.sent-request.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebResource.sent-request.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebResource.sent-request.html 2026-04-16 17:54:42.400703400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebResource.sent-request.html 2026-07-09 07:33:43.692382800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -103,7 +103,7 @@
-

unstable since: 6.0

+

@@ -151,8 +151,6 @@ - Available since: 6.0 -

@@ -173,7 +171,7 @@
request

Type: WebKitURIRequest

-

A WebKitURIRequest.

+

A WebKitURIRequest.

@@ -190,7 +188,7 @@
redirected_response

Type: WebKitURIResponse

-

A WebKitURIResponse, or NULL.

+

A WebKitURIResponse, or NULL.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.authenticate.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.authenticate.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.authenticate.html 2026-04-16 17:54:43.872705700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.authenticate.html 2026-07-09 07:33:44.254007600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -174,7 +174,7 @@ Description - [src] + [src] @@ -223,7 +223,7 @@
request

Type: WebKitAuthenticationRequest

-

A WebKitAuthenticationRequest.

+

A WebKitAuthenticationRequest.

@@ -255,8 +255,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to propagate the event further.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.close.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.close.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.close.html 2026-04-16 17:54:43.879705700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.close.html 2026-07-09 07:33:44.256660700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable since: 6.0

+

@@ -173,7 +173,7 @@ Description - [src] + [src]

@@ -194,8 +194,6 @@ -
-
Available since: 6.0
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.context-menu-dismissed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.context-menu-dismissed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.context-menu-dismissed.html 2026-04-16 17:54:43.906705600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.context-menu-dismissed.html 2026-07-09 07:33:44.266776000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable since: 6.0

+

@@ -173,7 +173,7 @@ Description - [src] + [src]

@@ -191,8 +191,6 @@ - Available since: 6.0 -
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.context-menu.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.context-menu.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.context-menu.html 2026-04-16 17:54:43.901705700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.context-menu.html 2026-07-09 07:33:44.264869000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable since: 6.0

+

@@ -222,8 +222,6 @@ - Available since: 6.0 -

@@ -244,7 +242,7 @@
context_menu

Type: WebKitContextMenu

-

The proposed WebKitContextMenu.

+

The proposed WebKitContextMenu.

@@ -261,7 +259,7 @@
hit_test_result

Type: WebKitHitTestResult

-

A WebKitHitTestResult.

+

A WebKitHitTestResult.

@@ -293,8 +291,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to propagate the event further.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.create.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.create.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.create.html 2026-04-16 17:54:43.918705700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.create.html 2026-07-09 07:33:44.270815400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable since: 6.0

+

@@ -174,7 +174,7 @@ Description - [src] + [src]

@@ -201,8 +201,6 @@ -
-
Available since: 6.0
@@ -223,7 +221,7 @@
navigation_action

Type: WebKitNavigationAction

-

A WebKitNavigationAction.

+

A WebKitNavigationAction.

@@ -255,8 +253,8 @@

Type: GtkWidget

-

A newly allocated WebKitWebView widget - or NULL to propagate the event further.

+

A newly allocated WebKitWebView widget + or NULL to propagate the event further.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.decide-policy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.decide-policy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.decide-policy.html 2026-04-16 17:54:43.935705700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.decide-policy.html 2026-07-09 07:33:44.277926000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable since: 6.0

+

@@ -175,7 +175,7 @@ Description - [src] + [src]

@@ -230,8 +230,6 @@ -
-
Available since: 6.0
@@ -252,7 +250,7 @@
decision

Type: WebKitPolicyDecision

-

The WebKitPolicyDecision.

+

The WebKitPolicyDecision.

@@ -269,7 +267,7 @@
decision_type

Type: WebKitPolicyDecisionType

-

A WebKitPolicyDecisionType denoting the type of decision.

+

A WebKitPolicyDecisionType denoting the type of decision.

@@ -301,8 +299,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to propagate the event further.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.enter-fullscreen.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.enter-fullscreen.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.enter-fullscreen.html 2026-04-16 17:54:43.944705700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.enter-fullscreen.html 2026-07-09 07:33:44.281147500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable since: 6.0

+

@@ -173,7 +173,7 @@ Description - [src] + [src]

@@ -197,8 +197,6 @@ -
-
Available since: 6.0
@@ -219,8 +217,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to continue emission of the event.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to continue emission of the event.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.insecure-content-detected.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.insecure-content-detected.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.insecure-content-detected.html 2026-04-16 17:54:43.951705700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.insecure-content-detected.html 2026-07-09 07:33:44.284047100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable deprecated: 2.46 since: 6.0

+

deprecated: 2.46 

@@ -174,7 +174,7 @@ Description - [src] + [src]

@@ -193,8 +193,6 @@ -
- @@ -218,7 +216,7 @@
event

Type: WebKitInsecureContentEvent

-

The WebKitInsecureContentEvent.

+

The WebKitInsecureContentEvent.

Available since: 6.0
Deprecated since: 2.46

Please do not use it in newly written code.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.leave-fullscreen.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.leave-fullscreen.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.leave-fullscreen.html 2026-04-16 17:54:43.959705600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.leave-fullscreen.html 2026-07-09 07:33:44.287121500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable since: 6.0

+

@@ -173,7 +173,7 @@ Description - [src] + [src]

@@ -193,8 +193,6 @@ -
-
Available since: 6.0
@@ -215,8 +213,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to continue emission of the event.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to continue emission of the event.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.load-changed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.load-changed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.load-changed.html 2026-04-16 17:54:43.973705800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.load-changed.html 2026-07-09 07:33:44.292694800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable since: 6.0

+

@@ -174,7 +174,7 @@ Description - [src] + [src]

@@ -231,8 +231,6 @@ -
-
Available since: 6.0
@@ -253,7 +251,7 @@
load_event

Type: WebKitLoadEvent

-

The WebKitLoadEvent.

+

The WebKitLoadEvent.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.load-failed-with-tls-errors.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.load-failed-with-tls-errors.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.load-failed-with-tls-errors.html 2026-04-16 17:54:44.001705600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.load-failed-with-tls-errors.html 2026-07-09 07:33:44.303930500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -176,7 +176,7 @@ Description - [src] + [src] @@ -221,7 +221,7 @@
failing_uri

Type: gchar*

-

The URI that failed to load.

+

The URI that failed to load.

@@ -238,7 +238,7 @@
certificate

Type: GTlsCertificate

-

A GTlsCertificate.

+

A GTlsCertificate.

@@ -255,7 +255,7 @@
errors

Type: GTlsCertificateFlags

-

A GTlsCertificateFlags with the verification status of certificate.

+

A GTlsCertificateFlags with the verification status of certificate.

@@ -287,8 +287,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to propagate the event further.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.load-failed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.load-failed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.load-failed.html 2026-04-16 17:54:43.988705600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.load-failed.html 2026-07-09 07:33:44.298541000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable since: 6.0

+

@@ -176,7 +176,7 @@ Description - [src] + [src]

@@ -201,8 +201,6 @@ -
-
Available since: 6.0
@@ -223,7 +221,7 @@
load_event

Type: WebKitLoadEvent

-

The WebKitLoadEvent of the load operation.

+

The WebKitLoadEvent of the load operation.

@@ -240,7 +238,7 @@
failing_uri

Type: gchar*

-

The URI that failed to load.

+

The URI that failed to load.

@@ -257,7 +255,7 @@
error

Type: GError

-

The GError that was triggered.

+

The GError that was triggered.

@@ -289,8 +287,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to propagate the event further.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.mouse-target-changed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.mouse-target-changed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.mouse-target-changed.html 2026-04-16 17:54:44.015705800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.mouse-target-changed.html 2026-07-09 07:33:44.308512700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable since: 6.0

+

@@ -175,7 +175,7 @@ Description - [src] + [src]

@@ -199,8 +199,6 @@ -
-
Available since: 6.0
@@ -221,7 +219,7 @@
hit_test_result

Type: WebKitHitTestResult

-

A WebKitHitTestResult.

+

A WebKitHitTestResult.

@@ -238,7 +236,7 @@
modifiers

Type: guint

-

A bitmask of GdkModifierType.

+

A bitmask of GdkModifierType.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.permission-request.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.permission-request.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.permission-request.html 2026-04-16 17:54:44.029705800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.permission-request.html 2026-07-09 07:33:44.314380400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable since: 6.0

+

@@ -174,7 +174,7 @@ Description - [src] + [src]

@@ -231,8 +231,6 @@ -
-
Available since: 6.0
@@ -253,7 +251,7 @@
request

Type: WebKitPermissionRequest

-

The WebKitPermissionRequest.

+

The WebKitPermissionRequest.

@@ -285,8 +283,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to propagate the event further.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.print.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.print.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.print.html 2026-04-16 17:54:44.041705800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.print.html 2026-07-09 07:33:44.318674600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable since: 6.0

+

@@ -174,7 +174,7 @@ Description - [src] + [src]

@@ -198,8 +198,6 @@ -
-
Available since: 6.0
@@ -220,7 +218,7 @@
print_operation

Type: WebKitPrintOperation

-

The WebKitPrintOperation that will handle the print request.

+

The WebKitPrintOperation that will handle the print request.

@@ -252,8 +250,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to propagate the event further.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.query-permission-state.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.query-permission-state.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.query-permission-state.html 2026-04-16 17:54:44.051705800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.query-permission-state.html 2026-07-09 07:33:44.322612000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -174,7 +174,7 @@ Description - [src] + [src] @@ -218,7 +218,7 @@
query

Type: WebKitPermissionStateQuery

-

The WebKitPermissionStateQuery.

+

The WebKitPermissionStateQuery.

@@ -250,7 +250,7 @@

Type: gboolean

-

TRUE if the message was handled, or FALSE otherwise.

+

TRUE if the message was handled, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.ready-to-show.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.ready-to-show.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.ready-to-show.html 2026-04-16 17:54:44.058705800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.ready-to-show.html 2026-07-09 07:33:44.325474500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable since: 6.0

+

@@ -173,7 +173,7 @@ Description - [src] + [src]

@@ -195,8 +195,6 @@ -
-
Available since: 6.0
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.resource-load-started.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.resource-load-started.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.resource-load-started.html 2026-04-16 17:54:44.068705800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.resource-load-started.html 2026-07-09 07:33:44.329059400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable since: 6.0

+

@@ -175,7 +175,7 @@ Description - [src] + [src]

@@ -195,8 +195,6 @@ - Available since: 6.0 -
@@ -217,7 +215,7 @@
resource

Type: WebKitWebResource

-

A WebKitWebResource.

+

A WebKitWebResource.

@@ -234,7 +232,7 @@
request

Type: WebKitURIRequest

-

A WebKitURIRequest.

+

A WebKitURIRequest.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.run-as-modal.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.run-as-modal.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.run-as-modal.html 2026-04-16 17:54:44.075705800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.run-as-modal.html 2026-07-09 07:33:44.331767800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable since: 6.0

+

@@ -173,7 +173,7 @@ Description - [src] + [src]

@@ -196,8 +196,6 @@ -
-
Available since: 6.0
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.run-color-chooser.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.run-color-chooser.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.run-color-chooser.html 2026-04-16 17:54:44.089706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.run-color-chooser.html 2026-07-09 07:33:44.336591000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -174,7 +174,7 @@ Description - [src] + [src] @@ -223,7 +223,7 @@
request

Type: WebKitColorChooserRequest

-

A WebKitColorChooserRequest.

+

A WebKitColorChooserRequest.

@@ -255,8 +255,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to propagate the event further.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.run-file-chooser.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.run-file-chooser.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.run-file-chooser.html 2026-04-16 17:54:44.103706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.run-file-chooser.html 2026-07-09 07:33:44.341830300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable since: 6.0

+

@@ -174,7 +174,7 @@ Description - [src] + [src]

@@ -200,8 +200,6 @@ -
-
Available since: 6.0
@@ -222,7 +220,7 @@
request

Type: WebKitFileChooserRequest

-

A WebKitFileChooserRequest.

+

A WebKitFileChooserRequest.

@@ -254,8 +252,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to propagate the event further.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.script-dialog.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.script-dialog.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.script-dialog.html 2026-04-16 17:54:44.120705800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.script-dialog.html 2026-07-09 07:33:44.348035000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable since: 6.0

+

@@ -174,7 +174,7 @@ Description - [src] + [src]

@@ -216,8 +216,6 @@ -
-
Available since: 6.0
@@ -238,7 +236,7 @@
dialog

Type: WebKitScriptDialog

-

The WebKitScriptDialog to show.

+

The WebKitScriptDialog to show.

@@ -270,8 +268,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to propagate the event further.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.show-notification.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.show-notification.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.show-notification.html 2026-04-16 17:54:44.129706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.show-notification.html 2026-07-09 07:33:44.351494300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -174,7 +174,7 @@ Description - [src] + [src] @@ -217,7 +217,7 @@
notification

Type: WebKitNotification

-

A WebKitNotification.

+

A WebKitNotification.

@@ -249,7 +249,7 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked. FALSE otherwise.

+

TRUE to stop other handlers from being invoked. FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.show-option-menu.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.show-option-menu.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.show-option-menu.html 2026-04-16 17:54:44.142706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.show-option-menu.html 2026-07-09 07:33:44.356931700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -220,7 +220,7 @@
menu

Type: WebKitOptionMenu

-

The WebKitOptionMenu.

+

The WebKitOptionMenu.

@@ -237,7 +237,7 @@
rectangle

Type: GdkRectangle

-

The option element area.

+

The option element area.

@@ -269,8 +269,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to propagate the event further.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.submit-form.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.submit-form.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.submit-form.html 2026-04-16 17:54:44.152706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.submit-form.html 2026-07-09 07:33:44.360777600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
-

unstable since: 6.0

+

@@ -174,7 +174,7 @@ Description - [src] + [src]

@@ -200,8 +200,6 @@ -
-
Available since: 6.0
@@ -222,7 +220,7 @@
request

Type: WebKitFormSubmissionRequest

-

A WebKitFormSubmissionRequest.

+

A WebKitFormSubmissionRequest.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.user-message-received.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.user-message-received.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.user-message-received.html 2026-04-16 17:54:44.162706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.user-message-received.html 2026-07-09 07:33:44.365018100 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -174,7 +174,7 @@ Description - [src] + [src] @@ -219,7 +219,7 @@
message

Type: WebKitUserMessage

-

The WebKitUserMessage received.

+

The WebKitUserMessage received.

@@ -251,7 +251,7 @@

Type: gboolean

-

TRUE if the message was handled, or FALSE otherwise.

+

TRUE if the message was handled, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.web-process-terminated.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.web-process-terminated.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/signal.WebView.web-process-terminated.html 2026-04-16 17:54:44.169706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/signal.WebView.web-process-terminated.html 2026-07-09 07:33:44.367390600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -134,7 +134,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -174,7 +174,7 @@ Description - [src] + [src] @@ -214,7 +214,7 @@
reason

Type: WebKitWebProcessTerminationReason

-

The a WebKitWebProcessTerminationReason.

+

The a WebKitWebProcessTerminationReason.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.ApplicationInfo.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.ApplicationInfo.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.ApplicationInfo.html 2026-04-16 17:54:32.290689500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.ApplicationInfo.html 2026-07-09 07:33:39.783518800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -113,7 +113,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -129,7 +129,7 @@
-

unstable since: 6.0

+

@@ -155,8 +155,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.Credential.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.Credential.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.Credential.html 2026-04-16 17:54:33.302690700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.Credential.html 2026-07-09 07:33:40.250423700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -119,7 +119,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.Feature.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.Feature.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.Feature.html 2026-04-16 17:54:34.087692000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.Feature.html 2026-07-09 07:33:40.467504500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.FeatureList.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.FeatureList.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.FeatureList.html 2026-04-16 17:54:34.388692400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.FeatureList.html 2026-07-09 07:33:40.603721900 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -193,7 +193,7 @@

Gets the number of elements in the feature list.

-

unstable since: 6.0

+

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.GeolocationPosition.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.GeolocationPosition.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.GeolocationPosition.html 2026-04-16 17:54:34.514692500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.GeolocationPosition.html 2026-07-09 07:33:40.658420800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -115,7 +115,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.ITPFirstParty.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.ITPFirstParty.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.ITPFirstParty.html 2026-04-16 17:54:34.672692800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.ITPFirstParty.html 2026-07-09 07:33:40.745299800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.ITPThirdParty.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.ITPThirdParty.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.ITPThirdParty.html 2026-04-16 17:54:34.726693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.ITPThirdParty.html 2026-07-09 07:33:40.789555500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.InputMethodUnderline.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.InputMethodUnderline.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.InputMethodUnderline.html 2026-04-16 17:54:34.601692700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.InputMethodUnderline.html 2026-07-09 07:33:40.727302000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -107,7 +107,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.MemoryPressureSettings.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.MemoryPressureSettings.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.MemoryPressureSettings.html 2026-04-16 17:54:34.787693000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.MemoryPressureSettings.html 2026-07-09 07:33:40.842601000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -125,7 +125,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.NavigationAction.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.NavigationAction.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.NavigationAction.html 2026-04-16 17:54:34.973693100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.NavigationAction.html 2026-07-09 07:33:40.915738300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -126,7 +126,7 @@
-

unstable since: 6.0

+

@@ -152,8 +152,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.NetworkProxySettings.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.NetworkProxySettings.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.NetworkProxySettings.html 2026-04-16 17:54:35.088693400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.NetworkProxySettings.html 2026-07-09 07:33:40.950824000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -107,7 +107,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.OptionMenuItem.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.OptionMenuItem.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.OptionMenuItem.html 2026-04-16 17:54:35.143693400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.OptionMenuItem.html 2026-07-09 07:33:40.969727800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.PermissionStateQuery.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.PermissionStateQuery.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.PermissionStateQuery.html 2026-04-16 17:54:35.215693500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.PermissionStateQuery.html 2026-07-09 07:33:41.009011300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -118,7 +118,7 @@
-

unstable since: 6.0

+

@@ -151,8 +151,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.ScriptDialog.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.ScriptDialog.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.ScriptDialog.html 2026-04-16 17:54:35.261693500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.ScriptDialog.html 2026-07-09 07:33:41.075492000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -108,7 +108,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -124,7 +124,7 @@
-

unstable since: 6.0

+

@@ -150,8 +150,6 @@
-

Available since: 6.0

-
@@ -188,7 +186,7 @@

Set whether the user confirmed the dialog.

-

unstable since: 6.0

+

@@ -198,7 +196,7 @@

Get the dialog type of a WebKitScriptDialog.

-

unstable since: 6.0

+

@@ -208,7 +206,7 @@

Get the message of a WebKitScriptDialog.

-

unstable since: 6.0

+

@@ -218,7 +216,7 @@

Get the default text of a WebKitScriptDialog of type WEBKIT_SCRIPT_DIALOG_PROMPT.

-

unstable since: 6.0

+

@@ -228,7 +226,7 @@

Set the text entered by the user in the dialog.

-

unstable since: 6.0

+

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.ScriptMessageReply.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.ScriptMessageReply.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.ScriptMessageReply.html 2026-04-16 17:54:35.401693800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.ScriptMessageReply.html 2026-07-09 07:33:41.140476200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -100,7 +100,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.SecurityOrigin.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.SecurityOrigin.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.SecurityOrigin.html 2026-04-16 17:54:35.435693700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.SecurityOrigin.html 2026-07-09 07:33:41.196865300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -115,7 +115,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.UserContentFilter.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.UserContentFilter.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.UserContentFilter.html 2026-04-16 17:54:35.571694000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.UserContentFilter.html 2026-07-09 07:33:41.282384600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -98,7 +98,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.UserScript.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.UserScript.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.UserScript.html 2026-04-16 17:54:35.623694200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.UserScript.html 2026-07-09 07:33:41.309015500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -107,7 +107,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.UserStyleSheet.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.UserStyleSheet.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.UserStyleSheet.html 2026-04-16 17:54:35.726694000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.UserStyleSheet.html 2026-07-09 07:33:41.359556000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -107,7 +107,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.WebExtensionMatchPattern.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.WebExtensionMatchPattern.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.WebExtensionMatchPattern.html 2026-04-16 17:54:35.856694500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.WebExtensionMatchPattern.html 2026-07-09 07:33:41.384749400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -138,7 +138,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.WebViewSessionState.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.WebViewSessionState.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.WebViewSessionState.html 2026-04-16 17:54:36.471695200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.WebViewSessionState.html 2026-07-09 07:33:41.454567700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -107,7 +107,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.WebsiteData.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.WebsiteData.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/struct.WebsiteData.html 2026-04-16 17:54:36.294695000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/struct.WebsiteData.html 2026-07-09 07:33:41.436973800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -102,7 +102,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/style.css webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/style.css --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/style.css 2026-04-16 17:54:44.631980400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/style.css 2026-07-09 07:33:44.534795800 +0000 @@ -7,6 +7,8 @@ @import url("solarized-light.css") (prefers-color-scheme: light); @import url("solarized-dark.css") (prefers-color-scheme: dark); +@import url("fonts.css"); + /********************************* * LIGHT THEME *********************************/ diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.DownloadError.quark.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.DownloadError.quark.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.DownloadError.quark.html 2026-04-16 17:54:32.449689600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.DownloadError.quark.html 2026-07-09 07:33:39.783518800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@

Type: GQuark

-

Download error domain.

+

Download error domain.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.FaviconDatabaseError.quark.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.FaviconDatabaseError.quark.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.FaviconDatabaseError.quark.html 2026-04-16 17:54:32.723690000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.FaviconDatabaseError.quark.html 2026-07-09 07:33:40.111512000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@

Type: GQuark

-

Favicon database error domain.

+

Favicon database error domain.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.JavascriptError.quark.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.JavascriptError.quark.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.JavascriptError.quark.html 2026-04-16 17:54:32.955690400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.JavascriptError.quark.html 2026-07-09 07:33:40.231509400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@

Type: GQuark

-

JavaScript error domain.

+

JavaScript error domain.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.MediaError.quark.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.MediaError.quark.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.MediaError.quark.html 2026-04-16 17:54:33.228690900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.MediaError.quark.html 2026-07-09 07:33:40.380580700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@

Type: GQuark

-

Media error domin.

+

Media error domin.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.NetworkError.quark.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.NetworkError.quark.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.NetworkError.quark.html 2026-04-16 17:54:33.383691000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.NetworkError.quark.html 2026-07-09 07:33:40.412751200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@

Type: GQuark

-

Network error domain.

+

Network error domain.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.NetworkSession.get_default.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.NetworkSession.get_default.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.NetworkSession.get_default.html 2026-04-16 17:54:38.273697900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.NetworkSession.get_default.html 2026-07-09 07:33:42.154539800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -160,7 +160,7 @@

Type: WebKitNetworkSession

-

A WebKitNetworkSession.

+

A WebKitNetworkSession.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.NetworkSession.set_memory_pressure_settings.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.NetworkSession.set_memory_pressure_settings.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.NetworkSession.set_memory_pressure_settings.html 2026-04-16 17:54:38.281697800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.NetworkSession.set_memory_pressure_settings.html 2026-07-09 07:33:42.158101300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -166,7 +166,7 @@
settings

Type: WebKitMemoryPressureSettings

-

A WebKitMemoryPressureSettings.

+

A WebKitMemoryPressureSettings.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.PolicyError.quark.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.PolicyError.quark.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.PolicyError.quark.html 2026-04-16 17:54:33.500691200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.PolicyError.quark.html 2026-07-09 07:33:40.447304000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@

Type: GQuark

-

Policy error domain.

+

Policy error domain.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.PrintError.quark.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.PrintError.quark.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.PrintError.quark.html 2026-04-16 17:54:33.670691300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.PrintError.quark.html 2026-07-09 07:33:40.479504300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@

Type: GQuark

-

Print error domain.

+

Print error domain.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.Settings.font_size_to_pixels.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.Settings.font_size_to_pixels.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.Settings.font_size_to_pixels.html 2026-04-16 17:54:39.342699300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.Settings.font_size_to_pixels.html 2026-07-09 07:33:42.567385700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -167,7 +167,7 @@
points

Type: guint32

-

The font size in points to convert to pixels.

+

The font size in points to convert to pixels.

@@ -199,7 +199,7 @@

Type: guint32

-

The equivalent font size in pixels.

+

The equivalent font size in pixels.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.Settings.font_size_to_points.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.Settings.font_size_to_points.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.Settings.font_size_to_points.html 2026-04-16 17:54:39.349699300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.Settings.font_size_to_points.html 2026-07-09 07:33:42.570013500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -167,7 +167,7 @@
pixels

Type: guint32

-

The font size in pixels to convert to points.

+

The font size in pixels to convert to points.

@@ -199,7 +199,7 @@

Type: guint32

-

The equivalent font size in points.

+

The equivalent font size in points.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.Settings.get_all_features.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.Settings.get_all_features.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.Settings.get_all_features.html 2026-04-16 17:54:39.355699300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.Settings.get_all_features.html 2026-07-09 07:33:42.572648500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -170,7 +170,7 @@

Type: WebKitFeatureList

-

List of all features.

+

List of all features.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.Settings.get_development_features.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.Settings.get_development_features.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.Settings.get_development_features.html 2026-04-16 17:54:39.361699300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.Settings.get_development_features.html 2026-07-09 07:33:42.574779300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,7 +169,7 @@

Type: WebKitFeatureList

-

List of development features.

+

List of development features.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.Settings.get_experimental_features.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.Settings.get_experimental_features.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.Settings.get_experimental_features.html 2026-04-16 17:54:39.367699400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.Settings.get_experimental_features.html 2026-07-09 07:33:42.576858000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -168,7 +168,7 @@

Type: WebKitFeatureList

-

List of experimental features.

+

List of experimental features.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.SnapshotError.quark.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.SnapshotError.quark.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.SnapshotError.quark.html 2026-04-16 17:54:33.778691500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.SnapshotError.quark.html 2026-07-09 07:33:40.497497600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@

Type: GQuark

-

Snapshot error domain.

+

Snapshot error domain.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.UserContentFilterError.quark.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.UserContentFilterError.quark.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.UserContentFilterError.quark.html 2026-04-16 17:54:33.875691700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.UserContentFilterError.quark.html 2026-07-09 07:33:40.515830500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -97,7 +97,7 @@
-

since: 2.24

+

@@ -131,7 +131,7 @@
-

Available since: 2.24

+ @@ -154,7 +154,7 @@

Type: GQuark

-

User content filter error domain.

+

User content filter error domain.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.UserMessageError.quark.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.UserMessageError.quark.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.UserMessageError.quark.html 2026-04-16 17:54:33.936691800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.UserMessageError.quark.html 2026-07-09 07:33:40.541815800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -97,7 +97,7 @@
-

since: 2.28

+

@@ -131,7 +131,7 @@
-

Available since: 2.28

+ @@ -154,7 +154,7 @@

Type: GQuark

-

User message error domain.

+

User message error domain.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.WebContext.get_default.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.WebContext.get_default.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.WebContext.get_default.html 2026-04-16 17:54:41.553702400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.WebContext.get_default.html 2026-07-09 07:33:43.374924700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -156,7 +156,7 @@

Type: WebKitWebContext

-

A WebKitWebContext.

+

A WebKitWebContext.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.WebExtensionError.quark.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.WebExtensionError.quark.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.WebExtensionError.quark.html 2026-04-16 17:54:34.004691800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.WebExtensionError.quark.html 2026-07-09 07:33:40.593501800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@

Type: GQuark

-

Web extension error domain.

+

Web extension error domain.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.WebExtensionMatchPattern.register_custom_URL_scheme.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.WebExtensionMatchPattern.register_custom_URL_scheme.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.WebExtensionMatchPattern.register_custom_URL_scheme.html 2026-04-16 17:54:35.892694500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.WebExtensionMatchPattern.register_custom_URL_scheme.html 2026-07-09 07:33:41.399765000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -161,7 +161,7 @@
urlScheme

Type: const gchar*

-

The custom URL scheme to register.

+

The custom URL scheme to register.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.WebExtensionMatchPattern.register_custom_url_scheme.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.WebExtensionMatchPattern.register_custom_url_scheme.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.WebExtensionMatchPattern.register_custom_url_scheme.html 2026-04-16 17:54:35.898694500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.WebExtensionMatchPattern.register_custom_url_scheme.html 2026-07-09 07:33:41.402492000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -160,7 +160,7 @@
urlScheme

Type: const gchar*

-

The custom URL scheme to register.

+

The custom URL scheme to register.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.WebExtensionMatchPatternError.quark.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.WebExtensionMatchPatternError.quark.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/type_func.WebExtensionMatchPatternError.quark.html 2026-04-16 17:54:34.083691800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/type_func.WebExtensionMatchPatternError.quark.html 2026-07-09 07:33:40.624536500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@

Type: GQuark

-

Web extension match pattern error domain.

+

Web extension match pattern error domain.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.committed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.committed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.committed.html 2026-04-16 17:54:37.996697400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.committed.html 2026-07-09 07:33:42.054962000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -121,7 +121,7 @@
-

since: 2.28

+

@@ -152,12 +152,12 @@
- No description available. +

No description available.

-

Available since: 2.28

+
@@ -186,7 +186,7 @@ -
+
The data is owned by the caller of the function.
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.delete_surrounding.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.delete_surrounding.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.delete_surrounding.html 2026-04-16 17:54:37.997697400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.delete_surrounding.html 2026-07-09 07:33:42.055430000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -121,7 +121,7 @@
-

since: 2.28

+

@@ -153,12 +153,12 @@
- No description available. +

No description available.

-

Available since: 2.28

+
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.filter_key_event.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.filter_key_event.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.filter_key_event.html 2026-04-16 17:54:38.006697400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.filter_key_event.html 2026-07-09 07:33:42.058863600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -181,7 +181,7 @@
key_event

Type: GdkEvent

-

The key event to filter.

+

The key event to filter.

@@ -190,7 +190,7 @@ - +
The data is owned by the caller of the function.
The data is owned by the caller of the method.
@@ -213,7 +213,7 @@

Type: gboolean

-

TRUE if the key event was handled, or FALSE otherwise.

+

TRUE if the key event was handled, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.get_preedit.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.get_preedit.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.get_preedit.html 2026-04-16 17:54:38.016697400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.get_preedit.html 2026-07-09 07:33:42.062828500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,7 +183,7 @@
text

Type: gchar**

-

Location to store the preedit string.

+

Location to store the preedit string.

@@ -192,7 +192,7 @@ - +
The argument will be set by the function.
The caller of the function takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
The value is a NUL terminated UTF-8 string.
@@ -200,7 +200,7 @@
underlines

Type: A list of None

-

Location to store the underlines as a GList of WebKitInputMethodUnderline.

+

Location to store the underlines as a GList of WebKitInputMethodUnderline.

@@ -209,7 +209,7 @@ - +
The argument will be set by the function.
The caller of the function takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
@@ -217,7 +217,7 @@
cursor_offset

Type: guint*

-

Location to store the position of cursor in preedit string.

+

Location to store the position of cursor in preedit string.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_cursor_area.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_cursor_area.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_cursor_area.html 2026-04-16 17:54:38.028697500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_cursor_area.html 2026-07-09 07:33:42.067049000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
x

Type: int

-

The x coordinate of cursor location.

+

The x coordinate of cursor location.

The argument will be set by the function.
@@ -199,7 +199,7 @@
y

Type: int

-

The y coordinate of cursor location.

+

The y coordinate of cursor location.

@@ -216,7 +216,7 @@
width

Type: int

-

The width of cursor area.

+

The width of cursor area.

@@ -233,7 +233,7 @@
height

Type: int

-

The height of cursor area.

+

The height of cursor area.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_focus_in.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_focus_in.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_focus_in.html 2026-04-16 17:54:38.033697400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_focus_in.html 2026-07-09 07:33:42.069091800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_focus_out.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_focus_out.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_focus_out.html 2026-04-16 17:54:38.038697500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_focus_out.html 2026-07-09 07:33:42.070789600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_surrounding.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_surrounding.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_surrounding.html 2026-04-16 17:54:38.050697600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.notify_surrounding.html 2026-07-09 07:33:42.075907500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,7 +183,7 @@
text

Type: const gchar*

-

Text surrounding the insertion point.

+

Text surrounding the insertion point.

@@ -192,7 +192,7 @@ - +
The data is owned by the caller of the function.
The data is owned by the caller of the method.
The value is a NUL terminated UTF-8 string.
@@ -200,7 +200,7 @@
length

Type: guint

-

The length of text, or -1 if text is nul-terminated.

+

The length of text, or -1 if text is nul-terminated.

@@ -217,7 +217,7 @@
cursor_index

Type: guint

-

The byte index of the insertion cursor within text.

+

The byte index of the insertion cursor within text.

@@ -234,7 +234,7 @@
selection_index

Type: guint

-

The byte index of the selection cursor within text.

+

The byte index of the selection cursor within text.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.preedit_changed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.preedit_changed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.preedit_changed.html 2026-04-16 17:54:38.051697500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.preedit_changed.html 2026-07-09 07:33:42.076334500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -121,7 +121,7 @@
-

since: 2.28

+

@@ -151,12 +151,12 @@
- No description available. +

No description available.

-

Available since: 2.28

+
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.preedit_finished.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.preedit_finished.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.preedit_finished.html 2026-04-16 17:54:38.053697300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.preedit_finished.html 2026-07-09 07:33:42.076725200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -121,7 +121,7 @@
-

since: 2.28

+

@@ -151,12 +151,12 @@
- No description available. +

No description available.

-

Available since: 2.28

+
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.preedit_started.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.preedit_started.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.preedit_started.html 2026-04-16 17:54:38.054697500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.preedit_started.html 2026-07-09 07:33:42.077100300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -121,7 +121,7 @@
-

since: 2.28

+

@@ -151,12 +151,12 @@
- No description available. +

No description available.

-

Available since: 2.28

+
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.reset.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.reset.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.reset.html 2026-04-16 17:54:38.059697400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.reset.html 2026-07-09 07:33:42.078891000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.set_enable_preedit.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.set_enable_preedit.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.set_enable_preedit.html 2026-04-16 17:54:38.065697400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.InputMethodContext.set_enable_preedit.html 2026-07-09 07:33:42.081508200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@
enabled

Type: gboolean

-

Whether to enable preedit.

+

Whether to enable preedit.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.PermissionRequest.allow.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.PermissionRequest.allow.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.PermissionRequest.allow.html 2026-04-16 17:54:33.863691600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.PermissionRequest.allow.html 2026-07-09 07:33:40.405047000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.PermissionRequest.deny.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.PermissionRequest.deny.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.PermissionRequest.deny.html 2026-04-16 17:54:33.904691700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.PermissionRequest.deny.html 2026-07-09 07:33:40.427505500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.authenticate.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.authenticate.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.authenticate.html 2026-04-16 17:54:44.170706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.authenticate.html 2026-07-09 07:33:44.367913700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
- No description available. +

No description available.

@@ -216,7 +216,7 @@ -
+
The data is owned by the caller of the function.
The data is owned by the caller of the method.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.close.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.close.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.close.html 2026-04-16 17:54:44.172706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.close.html 2026-07-09 07:33:44.368346700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -181,7 +181,7 @@
- No description available. +

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.context_menu.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.context_menu.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.context_menu.html 2026-04-16 17:54:44.173706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.context_menu.html 2026-07-09 07:33:44.368862600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,7 +183,7 @@
- No description available. +

No description available.

@@ -217,7 +217,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method.
@@ -234,7 +234,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.context_menu_dismissed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.context_menu_dismissed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.context_menu_dismissed.html 2026-04-16 17:54:44.175706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.context_menu_dismissed.html 2026-07-09 07:33:44.369297000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -181,7 +181,7 @@
- No description available. +

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.create.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.create.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.create.html 2026-04-16 17:54:44.176706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.create.html 2026-07-09 07:33:44.369793000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
- No description available. +

No description available.

@@ -216,7 +216,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method.
@@ -246,7 +246,7 @@ - The data is owned by the called function. + The returned data is owned by the instance. diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.decide_policy.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.decide_policy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.decide_policy.html 2026-04-16 17:54:44.178706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.decide_policy.html 2026-07-09 07:33:44.370289800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,7 +183,7 @@
- No description available. +

No description available.

@@ -217,7 +217,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.enter_fullscreen.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.enter_fullscreen.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.enter_fullscreen.html 2026-04-16 17:54:44.179706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.enter_fullscreen.html 2026-07-09 07:33:44.370710800 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -181,7 +181,7 @@
- No description available. +

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.insecure_content_detected.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.insecure_content_detected.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.insecure_content_detected.html 2026-04-16 17:54:44.181706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.insecure_content_detected.html 2026-07-09 07:33:44.371164000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
- No description available. +

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.leave_fullscreen.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.leave_fullscreen.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.leave_fullscreen.html 2026-04-16 17:54:44.182706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.leave_fullscreen.html 2026-07-09 07:33:44.371604400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -181,7 +181,7 @@
- No description available. +

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.load_changed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.load_changed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.load_changed.html 2026-04-16 17:54:44.184706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.load_changed.html 2026-07-09 07:33:44.372094200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
- No description available. +

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.load_failed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.load_failed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.load_failed.html 2026-04-16 17:54:44.185706100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.load_failed.html 2026-07-09 07:33:44.372635000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -184,7 +184,7 @@
- No description available. +

No description available.

@@ -235,7 +235,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method. The value is a NUL terminated UTF-8 string.
@@ -252,7 +252,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.load_failed_with_tls_errors.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.load_failed_with_tls_errors.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.load_failed_with_tls_errors.html 2026-04-16 17:54:44.187706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.load_failed_with_tls_errors.html 2026-07-09 07:33:44.373179700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -184,7 +184,7 @@
- No description available. +

No description available.

@@ -218,7 +218,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method. The value is a NUL terminated UTF-8 string.
@@ -235,7 +235,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method. diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.mouse_target_changed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.mouse_target_changed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.mouse_target_changed.html 2026-04-16 17:54:44.189706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.mouse_target_changed.html 2026-07-09 07:33:44.373695400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,7 +183,7 @@
- No description available. +

No description available.

@@ -217,7 +217,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method. diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.permission_request.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.permission_request.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.permission_request.html 2026-04-16 17:54:44.190706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.permission_request.html 2026-07-09 07:33:44.374166000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
- No description available. +

No description available.

@@ -216,7 +216,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method. diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.print.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.print.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.print.html 2026-04-16 17:54:44.192706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.print.html 2026-07-09 07:33:44.374620400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
- No description available. +

No description available.

@@ -216,7 +216,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method. diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.query_permission_state.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.query_permission_state.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.query_permission_state.html 2026-04-16 17:54:44.193706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.query_permission_state.html 2026-07-09 07:33:44.375085400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
- No description available. +

No description available.

@@ -216,7 +216,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method. diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.ready_to_show.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.ready_to_show.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.ready_to_show.html 2026-04-16 17:54:44.194706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.ready_to_show.html 2026-07-09 07:33:44.375524000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -181,7 +181,7 @@
- No description available. +

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.resource_load_started.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.resource_load_started.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.resource_load_started.html 2026-04-16 17:54:44.196706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.resource_load_started.html 2026-07-09 07:33:44.376024500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,7 +183,7 @@
- No description available. +

No description available.

@@ -217,7 +217,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method. @@ -234,7 +234,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method. diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.run_as_modal.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.run_as_modal.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.run_as_modal.html 2026-04-16 17:54:44.198706200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.run_as_modal.html 2026-07-09 07:33:44.376442400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -181,7 +181,7 @@
- No description available. +

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.run_color_chooser.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.run_color_chooser.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.run_color_chooser.html 2026-04-16 17:54:44.199706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.run_color_chooser.html 2026-07-09 07:33:44.376925000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
- No description available. +

No description available.

@@ -216,7 +216,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method. diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.run_file_chooser.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.run_file_chooser.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.run_file_chooser.html 2026-04-16 17:54:44.201706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.run_file_chooser.html 2026-07-09 07:33:44.377391600 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
- No description available. +

No description available.

@@ -216,7 +216,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method. diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.script_dialog.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.script_dialog.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.script_dialog.html 2026-04-16 17:54:44.203706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.script_dialog.html 2026-07-09 07:33:44.377851000 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
- No description available. +

No description available.

@@ -216,7 +216,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method. diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.show_notification.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.show_notification.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.show_notification.html 2026-04-16 17:54:44.204706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.show_notification.html 2026-07-09 07:33:44.378326200 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
- No description available. +

No description available.

@@ -216,7 +216,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method. diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.show_option_menu.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.show_option_menu.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.show_option_menu.html 2026-04-16 17:54:44.206706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.show_option_menu.html 2026-07-09 07:33:44.378831400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -183,7 +183,7 @@
- No description available. +

No description available.

@@ -217,7 +217,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method. @@ -234,7 +234,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method. diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.submit_form.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.submit_form.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.submit_form.html 2026-04-16 17:54:44.208706100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.submit_form.html 2026-07-09 07:33:44.379296300 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
- No description available. +

No description available.

@@ -216,7 +216,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method. diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.user_message_received.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.user_message_received.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.user_message_received.html 2026-04-16 17:54:44.209706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.user_message_received.html 2026-07-09 07:33:44.379781500 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
- No description available. +

No description available.

@@ -216,7 +216,7 @@ - The data is owned by the caller of the function. + The data is owned by the caller of the method. diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.web_process_crashed.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.web_process_crashed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.web_process_crashed.html 2026-04-16 17:54:44.211706200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.web_process_crashed.html 2026-07-09 07:33:44.380215400 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -181,7 +181,7 @@
- No description available. +

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.web_process_terminated.html webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.web_process_terminated.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/vfunc.WebView.web_process_terminated.html 2026-04-16 17:54:44.212706000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/vfunc.WebView.web_process_terminated.html 2026-07-09 07:33:44.380676700 +0000 @@ -62,7 +62,7 @@

WebKit

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -136,7 +136,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
- No description available. +

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/webkitgtk-6.0.devhelp2 webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/webkitgtk-6.0.devhelp2 --- webkit2gtk-2.52.3/Documentation/webkitgtk-6.0/webkitgtk-6.0.devhelp2 2026-04-16 17:54:44.614706500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-6.0/webkitgtk-6.0.devhelp2 2026-07-09 07:33:44.527638400 +0000 @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Black.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Black.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Black.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Black.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-BlackItalic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-BlackItalic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-BlackItalic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-BlackItalic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Bold.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Bold.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Bold.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Bold.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-BoldItalic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-BoldItalic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-BoldItalic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-BoldItalic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Italic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Italic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Italic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Italic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Medium.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Medium.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Medium.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Medium.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-MediumItalic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-MediumItalic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-MediumItalic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-MediumItalic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Regular.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Regular.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Regular.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatDisplay-Regular.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Bold.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Bold.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Bold.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Bold.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-BoldItalic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-BoldItalic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-BoldItalic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-BoldItalic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Italic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Italic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Italic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Italic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Medium.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Medium.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Medium.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Medium.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-MediumItalic.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-MediumItalic.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-MediumItalic.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-MediumItalic.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Regular.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Regular.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Regular.woff2 and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/RedHatText-Regular.woff2 differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/SourceCodePro-It.ttf.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/SourceCodePro-It.ttf.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/SourceCodePro-Regular.ttf.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/SourceCodePro-Regular.ttf.woff differ Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/SourceCodePro-Semibold.ttf.woff and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/SourceCodePro-Semibold.ttf.woff differ diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/callback.WebProcessExtensionInitializeFunction.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/callback.WebProcessExtensionInitializeFunction.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/callback.WebProcessExtensionInitializeFunction.html 2026-04-16 17:54:31.654688600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/callback.WebProcessExtensionInitializeFunction.html 2026-07-09 07:33:40.175510600 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -149,7 +149,7 @@
extension

Type: WebKitWebProcessExtension

-

A WebKitWebProcessExtension.

+

A WebKitWebProcessExtension.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/callback.WebProcessExtensionInitializeWithUserDataFunction.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/callback.WebProcessExtensionInitializeWithUserDataFunction.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/callback.WebProcessExtensionInitializeWithUserDataFunction.html 2026-04-16 17:54:31.753688800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/callback.WebProcessExtensionInitializeWithUserDataFunction.html 2026-07-09 07:33:40.199510000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -76,7 +76,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -151,7 +151,7 @@
extension

Type: WebKitWebProcessExtension

-

A WebKitWebProcessExtension.

+

A WebKitWebProcessExtension.

@@ -168,7 +168,7 @@
user_data

Type: GVariant

-

A GVariant.

+

A GVariant.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.ContextMenu.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.ContextMenu.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.ContextMenu.html 2026-04-16 17:54:32.191689300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.ContextMenu.html 2026-07-09 07:33:40.297483400 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -145,7 +145,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -161,7 +161,7 @@
-

unstable since: 6.0

+

@@ -195,8 +195,6 @@
-

Available since: 6.0

-
@@ -214,7 +212,7 @@ - this - -WebKitContextMenu + +WebKitContextMenu @@ -234,15 +232,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -289,7 +287,7 @@

Creates a new WebKitContextMenu object.

-

unstable since: 6.0

+

@@ -299,7 +297,7 @@

Creates a new WebKitContextMenu object with the given items.

-

unstable since: 6.0

+

@@ -324,7 +322,7 @@

Adds item at the end of the menu.

-

unstable since: 6.0

+

@@ -334,7 +332,7 @@

Gets the first item in the menu.

-

unstable since: 6.0

+

@@ -356,7 +354,7 @@

Gets the item at the given position in the menu.

-

unstable since: 6.0

+

@@ -366,7 +364,7 @@

Returns the item list of menu.

-

unstable since: 6.0

+

@@ -376,7 +374,7 @@

Gets the length of the menu.

-

unstable since: 6.0

+

@@ -406,7 +404,7 @@

Inserts item into the menu at the given position.

-

unstable since: 6.0

+

@@ -416,7 +414,7 @@

Gets the last item in the menu.

-

unstable since: 6.0

+

@@ -426,7 +424,7 @@

Moves item to the given position in the menu.

-

unstable since: 6.0

+

@@ -436,7 +434,7 @@

Adds item at the beginning of the menu.

-

unstable since: 6.0

+

@@ -446,7 +444,7 @@

Removes item from the menu.

-

unstable since: 6.0

+

@@ -456,7 +454,7 @@

Removes all items of the menu.

-

unstable since: 6.0

+

@@ -510,10 +508,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -539,7 +533,7 @@
- No description available. +

No description available.

@@ -549,7 +543,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.ContextMenuItem.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.ContextMenuItem.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.ContextMenuItem.html 2026-04-16 17:54:32.419689700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.ContextMenuItem.html 2026-07-09 07:33:40.380580700 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -135,7 +135,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -151,7 +151,7 @@
-

unstable since: 6.0

+

@@ -180,8 +180,6 @@
-

Available since: 6.0

-
@@ -199,7 +197,7 @@ - this - -WebKitContextMenuItem + +WebKitContextMenuItem @@ -219,29 +217,29 @@ ancestor_0 - -GInitiallyUnowned + +GInitiallyUnowned ancestor_0--this - + ancestor_1 - -GObject + +GObject ancestor_1--ancestor_0 - + @@ -302,7 +300,7 @@

Creates a new WebKitContextMenuItem for the given stock action.

-

unstable since: 6.0

+

@@ -312,7 +310,7 @@

Creates a new WebKitContextMenuItem for the given stock action using the given label.

-

unstable since: 6.0

+

@@ -322,7 +320,7 @@

Creates a new WebKitContextMenuItem representing a separator.

-

unstable since: 6.0

+

@@ -332,7 +330,7 @@

Creates a new WebKitContextMenuItem using the given label with a submenu.

-

unstable since: 6.0

+

@@ -377,7 +375,7 @@

Gets the WebKitContextMenuAction of item.

-

unstable since: 6.0

+

@@ -387,7 +385,7 @@

Gets the submenu of item.

-

unstable since: 6.0

+

@@ -407,7 +405,7 @@

Checks whether item is a separator.

-

unstable since: 6.0

+

@@ -417,7 +415,7 @@

Sets or replaces the item submenu.

-

unstable since: 6.0

+

@@ -465,10 +463,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -494,7 +488,7 @@
- No description available. +

No description available.

@@ -504,7 +498,7 @@
parent_class: GInitiallyUnownedClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.Frame.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.Frame.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.Frame.html 2026-04-16 17:54:32.588689800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.Frame.html 2026-07-09 07:33:40.583502000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -114,7 +114,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,19 +175,19 @@ - - + hierarchy this - -WebKitFrame + +WebKitFrame @@ -195,15 +195,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -341,10 +341,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -370,7 +366,7 @@
- No description available. +

No description available.

@@ -380,7 +376,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.HitTestResult.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.HitTestResult.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.HitTestResult.html 2026-04-16 17:54:32.706690000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.HitTestResult.html 2026-07-09 07:33:40.634639700 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -147,7 +147,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -163,7 +163,7 @@
-

unstable since: 6.0

+

@@ -203,8 +203,6 @@
-

Available since: 6.0

-
@@ -222,19 +220,19 @@ - - + hierarchy this - -WebKitHitTestResult + +WebKitHitTestResult @@ -242,15 +240,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -302,7 +300,7 @@ WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -313,7 +311,7 @@ WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -324,7 +322,7 @@ WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -335,7 +333,7 @@ WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -346,7 +344,7 @@ WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -367,7 +365,7 @@

Gets the value of the WebKitHitTestResult:context property.

-

unstable since: 6.0

+

@@ -377,7 +375,7 @@

Gets the value of the WebKitHitTestResult:image-uri property.

-

unstable since: 6.0

+

@@ -387,7 +385,7 @@

Gets the value of the WebKitHitTestResult:link-label property.

-

unstable since: 6.0

+

@@ -397,7 +395,7 @@

Gets the value of the WebKitHitTestResult:link-title property.

-

unstable since: 6.0

+

@@ -407,7 +405,7 @@

Gets the value of the WebKitHitTestResult:link-uri property.

-

unstable since: 6.0

+

@@ -417,7 +415,7 @@

Gets the value of the WebKitHitTestResult:media-uri property.

-

unstable since: 6.0

+

@@ -458,7 +456,7 @@ the context of the WebKitHitTestResult.

-

unstable since: 6.0

+

@@ -469,7 +467,7 @@ is present in WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -480,7 +478,7 @@ is present in WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -491,7 +489,7 @@ is present in WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -502,7 +500,7 @@ is present in WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -513,7 +511,7 @@ is present in WebKitHitTestResult:context.

-

unstable since: 6.0

+

@@ -547,10 +545,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -576,7 +570,7 @@
- No description available. +

No description available.

@@ -586,7 +580,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.ScriptWorld.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.ScriptWorld.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.ScriptWorld.html 2026-04-16 17:54:32.916690300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.ScriptWorld.html 2026-07-09 07:33:40.734048000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -135,7 +135,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -151,7 +151,7 @@
-

unstable since: 6.0

+

@@ -167,14 +167,12 @@ }
- No description available. +

No description available.

-

Available since: 6.0

-
@@ -192,19 +190,19 @@ - - + hierarchy this - -WebKitScriptWorld + +WebKitScriptWorld @@ -212,15 +210,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -398,10 +396,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -427,7 +421,7 @@
- No description available. +

No description available.

@@ -437,7 +431,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.URIRequest.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.URIRequest.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.URIRequest.html 2026-04-16 17:54:33.007690400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.URIRequest.html 2026-07-09 07:33:40.772695800 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -130,7 +130,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -146,7 +146,7 @@
-

unstable since: 6.0

+

@@ -173,8 +173,6 @@
-

Available since: 6.0

-
@@ -192,19 +190,19 @@ - - + hierarchy this - -WebKitURIRequest + +WebKitURIRequest @@ -212,15 +210,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -267,7 +265,7 @@

Creates a new WebKitURIRequest for the given URI.

-

unstable since: 6.0

+

@@ -292,7 +290,7 @@

Get the HTTP headers of a WebKitURIRequest as a SoupMessageHeaders.

-

unstable since: 6.0

+

@@ -312,7 +310,7 @@

Obtains the request URI.

-

unstable since: 6.0

+

@@ -322,7 +320,7 @@

Set the URI of request.

-

unstable since: 6.0

+

@@ -362,7 +360,7 @@

The URI to which the request will be made.

-

unstable since: 6.0

+

@@ -396,10 +394,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -425,7 +419,7 @@
- No description available. +

No description available.

@@ -435,7 +429,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.URIResponse.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.URIResponse.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.URIResponse.html 2026-04-16 17:54:33.100690600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.URIResponse.html 2026-07-09 07:33:40.816643000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -135,7 +135,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -151,7 +151,7 @@
-

unstable since: 6.0

+

@@ -178,8 +178,6 @@
-

Available since: 6.0

-
@@ -197,7 +195,7 @@ - this - -WebKitURIResponse + +WebKitURIResponse @@ -217,15 +215,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -276,7 +274,7 @@

Get the expected content length of the WebKitURIResponse.

-

unstable since: 6.0

+

@@ -296,7 +294,7 @@

Gets the MIME type of the response.

-

unstable since: 6.0

+

@@ -306,7 +304,7 @@

Get the status code of the WebKitURIResponse.

-

unstable since: 6.0

+

@@ -316,7 +314,7 @@

Get the suggested filename for response.

-

unstable since: 6.0

+

@@ -326,7 +324,7 @@

Gets the URI which resulted in the response.

-

unstable since: 6.0

+

@@ -366,7 +364,7 @@

The expected content length of the response.

-

unstable since: 6.0

+

@@ -386,7 +384,7 @@

The MIME type of the response.

-

unstable since: 6.0

+

@@ -396,7 +394,7 @@

The status code of the response as returned by the server.

-

unstable since: 6.0

+

@@ -406,7 +404,7 @@

The suggested filename for the URI response.

-

unstable since: 6.0

+

@@ -416,7 +414,7 @@

The URI for which the response was made.

-

unstable since: 6.0

+

@@ -450,10 +448,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -479,7 +473,7 @@
- No description available. +

No description available.

@@ -489,7 +483,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.UserMessage.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.UserMessage.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.UserMessage.html 2026-04-16 17:54:33.203690800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.UserMessage.html 2026-07-09 07:33:40.864597800 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -145,7 +145,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -209,19 +209,19 @@ - - + hierarchy this - -WebKitUserMessage + +WebKitUserMessage @@ -229,29 +229,29 @@ ancestor_0 - -GInitiallyUnowned + +GInitiallyUnowned ancestor_0--this - + ancestor_1 - -GObject + +GObject ancestor_1--ancestor_0 - + @@ -335,7 +335,7 @@

Gets the quark for the domain of user message errors.

-

unstable since: 6.0

+

@@ -489,10 +489,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -518,7 +514,7 @@
- No description available. +

No description available.

@@ -528,7 +524,7 @@
parent_class: GInitiallyUnownedClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.WebEditor.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.WebEditor.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.WebEditor.html 2026-04-16 17:54:33.314690800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.WebEditor.html 2026-07-09 07:33:40.912524200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -115,7 +115,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -177,7 +177,7 @@ - this - -WebKitWebEditor + +WebKitWebEditor @@ -197,15 +197,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -315,10 +315,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -344,7 +340,7 @@
- No description available. +

No description available.

@@ -354,7 +350,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.WebFormManager.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.WebFormManager.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.WebFormManager.html 2026-04-16 17:54:33.373690800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.WebFormManager.html 2026-07-09 07:33:40.938636000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -123,7 +123,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@ - this - -WebKitWebFormManager + +WebKitWebFormManager @@ -202,15 +202,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -389,10 +389,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -418,7 +414,7 @@
- No description available. +

No description available.

@@ -428,7 +424,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.WebHitTestResult.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.WebHitTestResult.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.WebHitTestResult.html 2026-04-16 17:54:33.492691000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.WebHitTestResult.html 2026-07-09 07:33:41.012973300 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -130,7 +130,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -191,7 +191,7 @@ - this - -WebKitWebHitTestResult + +WebKitWebHitTestResult @@ -211,15 +211,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -270,7 +270,7 @@

Check whether there is an editable element at the hit test position.

-

unstable since: 6.0

+

@@ -280,7 +280,7 @@

Check whether there is an image element at the hit test position.

-

unstable since: 6.0

+

@@ -290,7 +290,7 @@

Check whether there is a link element at the hit test position.

-

unstable since: 6.0

+

@@ -300,7 +300,7 @@

Check whether there is a media element at the hit test position.

-

unstable since: 6.0

+

@@ -310,7 +310,7 @@

Check whether there is a scrollbar at the hit test position.

-

unstable since: 6.0

+

@@ -320,7 +320,7 @@

Check whether there is a selected element at the hit test position.

-

unstable since: 6.0

+

@@ -330,7 +330,7 @@

Gets the the context flags for the hit test result.

-

unstable since: 6.0

+

@@ -340,7 +340,7 @@

Obtains the URI associated with the image element at the hit test position.

-

unstable since: 6.0

+

@@ -360,7 +360,7 @@

Obtains the label associated with the link element at the hit test position.

-

unstable since: 6.0

+

@@ -370,7 +370,7 @@

Obtains the title associated with the link element at the hit test position.

-

unstable since: 6.0

+

@@ -380,7 +380,7 @@

Obtains the URI associated with the link element at the hit test position.

-

unstable since: 6.0

+

@@ -390,7 +390,7 @@

Obtains the URI associated with the media element at the hit test position.

-

unstable since: 6.0

+

@@ -434,10 +434,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -463,7 +459,7 @@
- No description available. +

No description available.

@@ -473,7 +469,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.WebPage.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.WebPage.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.WebPage.html 2026-04-16 17:54:33.637691300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.WebPage.html 2026-07-09 07:33:41.085474300 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -144,7 +144,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -160,7 +160,7 @@
-

unstable since: 6.0

+

@@ -184,8 +184,6 @@
-

Available since: 6.0

-
@@ -203,19 +201,19 @@ - - + hierarchy this - -WebKitWebPage + +WebKitWebPage @@ -223,15 +221,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -302,7 +300,7 @@

Get the identifier of the WebKitWebPage.

-

unstable since: 6.0

+

@@ -322,7 +320,7 @@

Returns the current active URI of web_page.

-

unstable since: 6.0

+

@@ -382,7 +380,7 @@

The current active URI of the WebKitWebPage.

-

unstable since: 6.0

+

@@ -444,7 +442,7 @@

This signal is emitted when the DOM document of a WebKitWebPage has been loaded.

-

unstable since: 6.0

+

@@ -457,7 +455,7 @@ operation by connecting to this signal and returning TRUE.

-

unstable since: 6.0

+

@@ -485,10 +483,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -514,7 +508,7 @@
- No description available. +

No description available.

@@ -524,7 +518,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.WebProcessExtension.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.WebProcessExtension.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/class.WebProcessExtension.html 2026-04-16 17:54:33.811691500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/class.WebProcessExtension.html 2026-07-09 07:33:41.202358700 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -121,7 +121,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -242,19 +242,19 @@ - - + hierarchy this - -WebKitWebProcessExtension + +WebKitWebProcessExtension @@ -262,15 +262,15 @@ ancestor_0 - -GObject + +GObject ancestor_0--this - + @@ -413,10 +413,6 @@

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

-
-

since: 2.0

-
- @@ -442,7 +438,7 @@
- No description available. +

No description available.

@@ -452,7 +448,7 @@
parent_class: GObjectClass
-
No description available.
+

No description available.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/classes_hierarchy.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/classes_hierarchy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/classes_hierarchy.html 2026-04-16 17:54:29.852686200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/classes_hierarchy.html 2026-07-09 07:33:39.703520300 +0000 @@ -62,13 +62,13 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenu.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenu.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenu.new.html 2026-04-16 17:54:32.199689400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenu.new.html 2026-07-09 07:33:40.300880000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -163,7 +163,7 @@

Type: WebKitContextMenu

-

The newly created WebKitContextMenu object.

+

The newly created WebKitContextMenu object.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenu.new_with_items.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenu.new_with_items.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenu.new_with_items.html 2026-04-16 17:54:32.207689300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenu.new_with_items.html 2026-07-09 07:33:40.304074000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -159,7 +159,7 @@
items

Type: A list of None

-

A GList of WebKitContextMenuItem.

+

A GList of WebKitContextMenuItem.

@@ -191,7 +191,7 @@

Type: WebKitContextMenu

-

The newly created WebKitContextMenu object.

+

The newly created WebKitContextMenu object.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_from_gaction.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_from_gaction.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_from_gaction.html 2026-04-16 17:54:32.436689600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_from_gaction.html 2026-07-09 07:33:40.386144900 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -166,7 +166,7 @@
action

Type: GAction

-

A GAction.

+

A GAction.

@@ -183,7 +183,7 @@
label

Type: const gchar*

-

The menu item label text.

+

The menu item label text.

@@ -200,7 +200,7 @@
target

Type: GVariant

-

A GVariant to use as the action target.

+

A GVariant to use as the action target.

@@ -232,7 +232,7 @@

Type: WebKitContextMenuItem

-

The newly created WebKitContextMenuItem object.

+

The newly created WebKitContextMenuItem object.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_from_stock_action.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_from_stock_action.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_from_stock_action.html 2026-04-16 17:54:32.444689800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_from_stock_action.html 2026-07-09 07:33:40.390556300 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -170,7 +170,7 @@
action

Type: WebKitContextMenuAction

-

A WebKitContextMenuAction stock action.

+

A WebKitContextMenuAction stock action.

@@ -202,7 +202,7 @@

Type: WebKitContextMenuItem

-

The newly created WebKitContextMenuItem object.

+

The newly created WebKitContextMenuItem object.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_from_stock_action_with_label.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_from_stock_action_with_label.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_from_stock_action_with_label.html 2026-04-16 17:54:32.454689700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_from_stock_action_with_label.html 2026-07-09 07:33:40.394750600 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@
action

Type: WebKitContextMenuAction

-

A WebKitContextMenuAction stock action.

+

A WebKitContextMenuAction stock action.

@@ -182,7 +182,7 @@
label

Type: const gchar*

-

A custom label text to use instead of the predefined one.

+

A custom label text to use instead of the predefined one.

@@ -214,7 +214,7 @@

Type: WebKitContextMenuItem

-

The newly created WebKitContextMenuItem object.

+

The newly created WebKitContextMenuItem object.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_separator.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_separator.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_separator.html 2026-04-16 17:54:32.460689800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_separator.html 2026-07-09 07:33:40.397462600 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -162,7 +162,7 @@

Type: WebKitContextMenuItem

-

The newly created WebKitContextMenuItem object.

+

The newly created WebKitContextMenuItem object.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_with_submenu.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_with_submenu.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_with_submenu.html 2026-04-16 17:54:32.469689600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ContextMenuItem.new_with_submenu.html 2026-07-09 07:33:40.401269400 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -163,7 +163,7 @@
label

Type: const gchar*

-

The menu item label text.

+

The menu item label text.

@@ -180,7 +180,7 @@
submenu

Type: WebKitContextMenu

-

A WebKitContextMenu to set.

+

A WebKitContextMenu to set.

@@ -212,7 +212,7 @@

Type: WebKitContextMenuItem

-

The newly created WebKitContextMenuItem object.

+

The newly created WebKitContextMenuItem object.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.ScriptWorld.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ScriptWorld.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.ScriptWorld.new.html 2026-04-16 17:54:32.924690200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ScriptWorld.new.html 2026-07-09 07:33:40.738750200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -163,7 +163,7 @@

Type: WebKitScriptWorld

-

A new isolated WebKitScriptWorld.

+

A new isolated WebKitScriptWorld.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.ScriptWorld.new_with_name.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ScriptWorld.new_with_name.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.ScriptWorld.new_with_name.html 2026-04-16 17:54:32.933690300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.ScriptWorld.new_with_name.html 2026-07-09 07:33:40.744059000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -160,7 +160,7 @@
name

Type: const char*

-

A name for the script world.

+

A name for the script world.

@@ -192,7 +192,7 @@

Type: WebKitScriptWorld

-

A new isolated WebKitScriptWorld.

+

A new isolated WebKitScriptWorld.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.URIRequest.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.URIRequest.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.URIRequest.new.html 2026-04-16 17:54:33.013690500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.URIRequest.new.html 2026-07-09 07:33:40.778904400 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -154,7 +154,7 @@
uri

Type: const gchar*

-

An URI.

+

An URI.

@@ -186,7 +186,7 @@

Type: WebKitURIRequest

-

A new WebKitURIRequest.

+

A new WebKitURIRequest.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.UserMessage.new.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.UserMessage.new.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.UserMessage.new.html 2026-04-16 17:54:33.212690800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.UserMessage.new.html 2026-07-09 07:33:40.871393400 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -157,7 +157,7 @@
name

Type: const char*

-

The message name.

+

The message name.

@@ -174,7 +174,7 @@
parameters

Type: GVariant

-

The message parameters as a GVariant, or NULL.

+

The message parameters as a GVariant, or NULL.

@@ -206,7 +206,7 @@

Type: WebKitUserMessage

-

The newly created WebKitUserMessage object.

+

The newly created WebKitUserMessage object.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.UserMessage.new_with_fd_list.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.UserMessage.new_with_fd_list.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/ctor.UserMessage.new_with_fd_list.html 2026-04-16 17:54:33.222690800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/ctor.UserMessage.new_with_fd_list.html 2026-07-09 07:33:40.876909300 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -158,7 +158,7 @@
name

Type: const char*

-

The message name.

+

The message name.

@@ -175,7 +175,7 @@
parameters

Type: GVariant

-

The message parameters as a GVariant.

+

The message parameters as a GVariant.

@@ -192,7 +192,7 @@
fd_list

Type: GUnixFDList

-

The message file descriptors.

+

The message file descriptors.

The argument can be NULL.
@@ -224,7 +224,7 @@

Type: WebKitUserMessage

-

The newly created WebKitUserMessage object.

+

The newly created WebKitUserMessage object.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/enum.ConsoleMessageLevel.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/enum.ConsoleMessageLevel.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/enum.ConsoleMessageLevel.html 2026-04-16 17:54:31.139687800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/enum.ConsoleMessageLevel.html 2026-07-09 07:33:40.019513800 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/enum.ConsoleMessageSource.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/enum.ConsoleMessageSource.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/enum.ConsoleMessageSource.html 2026-04-16 17:54:31.368688000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/enum.ConsoleMessageSource.html 2026-07-09 07:33:40.055513100 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/enum.ContextMenuAction.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/enum.ContextMenuAction.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/enum.ContextMenuAction.html 2026-04-16 17:54:31.786688800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/enum.ContextMenuAction.html 2026-07-09 07:33:40.131511400 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -124,8 +124,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/enum.UserMessageError.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/enum.UserMessageError.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/enum.UserMessageError.html 2026-04-16 17:54:31.854689000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/enum.UserMessageError.html 2026-07-09 07:33:40.143511300 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/flags.HitTestResultContext.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/flags.HitTestResultContext.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/flags.HitTestResultContext.html 2026-04-16 17:54:31.335688000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/flags.HitTestResultContext.html 2026-07-09 07:33:40.123511800 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -77,7 +77,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -92,7 +92,7 @@
-

unstable since: 6.0

+

@@ -123,8 +123,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/fonts.css webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/fonts.css --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/fonts.css 2026-04-16 17:54:33.953360000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/fonts.css 2026-07-09 07:33:41.244907600 +0000 @@ -3,3 +3,179 @@ * * SPDX-License-Identifier: Apache-2.0 OR GPL-3.0-or-later */ + +/** + * RedHat Fonts taken from https://github.com/RedHatOfficial/RedHatFont + * License: SIL Open Font License 1.1 http://scripts.sil.org/OFL + * + * SourceCodePro Fonts + * License: SIL Open Font License 1.1 https://scripts.sil.org/OFL + */ + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-Regular.woff2") format("woff2"), + url("RedHatDisplay-Regular.woff") format("woff"); + font-style: normal; + font-weight: 400; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-RegularItalic.woff2") format("woff2"), + url("RedHatDisplay-RegularItalic.woff") format("woff"); + font-style: italic; + font-weight: 400; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-Medium.woff2") format("woff2"), + url("RedHatDisplay-Medium.woff") format("woff"); + font-style: normal; + font-weight: 500; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-MediumItalic.woff2") format("woff2"), + url("RedHatDisplay-MediumItalic.woff") format("woff"); + font-style: italic; + font-weight: 500; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-Bold.woff2") format("woff2"), + url("RedHatDisplay-Bold.woff") format("woff"); + font-style: normal; + font-weight: 700; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-BoldItalic.woff2") format("woff2"), + url("RedHatDisplay-BoldItalic.woff") format("woff"); + font-style: italic; + font-weight: 700; + font-display: fallback; +} + + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-Black.woff2") format("woff2"), + url("RedHatDisplay-Black.woff") format("woff"); + font-style: normal; + font-weight: 900; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Display"; + src: local('RedHatDisplayWeb'), + url("RedHatDisplay-BlackItalic.woff2") format("woff2"), + url("RedHatDisplay-BlackItalic.woff") format("woff"); + font-style: italic; + font-weight: 900; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatTextWeb'), + url("RedHatText-Regular.woff2") format("woff2"), + url("RedHatText-Regular.woff") format("woff"); + font-style: normal; + font-weight: 400; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatTextWeb'), + url("RedHatText-Italic.woff2") format("woff2"), + url("RedHatText-Italic.woff") format("woff"); + font-style: italic; + font-weight: 400; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatTextWeb'), + url("RedHatText-Medium.woff2") format("woff2"), + url("RedHatText-Medium.woff") format("woff"); + font-style: normal; + font-weight: 700; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatTextWeb'), + url("RedHatText-MediumItalic.woff2") format("woff2"), + url("RedHatText-MediumItalic.woff") format("woff"); + font-style: italic; + font-weight: 700; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatTextWeb'), + url("RedHatText-Bold.woff2") format("woff2"), + url("RedHatText-Bold.woff") format("woff"); + font-style: normal; + font-weight: 900; + font-display: fallback; +} + +@font-face { + font-family: "Red Hat Text"; + src: local('RedHatTextWeb'), + url("RedHatText-BoldItalic.woff2") format("woff2"), + url("RedHatText-BoldItalic.woff") format("woff"); + font-style: italic; + font-weight: 900; + font-display: fallback; +} + +/* Do not fall back to locally installed SourceCodePro, as there are + * known bad copies being distributed to this day + */ +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: url("SourceCodePro-Regular.ttf.woff") format('woff'); + font-display: swap; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: italic; + font-weight: 400; + src: url("SourceCodePro-It.ttf.woff") format('woff'); + font-display: swap; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: url("SourceCodePro-Semibold.ttf.woff") format('woff'); + font-display: swap; +} Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/go-up-symbolic.png and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/go-up-symbolic.png differ diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/index.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/index.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/index.html 2026-04-16 17:54:33.942691800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/index.html 2026-07-09 07:33:41.241700000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -143,7 +143,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -161,7 +161,7 @@
- + @@ -303,7 +303,7 @@ @@ -313,7 +313,7 @@ @@ -333,7 +333,7 @@ @@ -343,7 +343,7 @@ @@ -353,7 +353,7 @@ @@ -363,7 +363,7 @@ @@ -413,7 +413,7 @@ @@ -452,7 +452,7 @@ @@ -503,7 +503,7 @@ @@ -541,7 +541,7 @@ diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/index.json webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/index.json --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/index.json 2026-04-16 17:54:33.949294600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/index.json 2026-07-09 07:33:41.243472000 +0000 @@ -1 +1 @@ -{"meta":{"ns":"WebKitWebProcessExtension","version":"6.0","generator":"gi-docgen","generator-version":"2023.3"},"symbols":[{"type":"bitfield","name":"HitTestResultContext","ctype":"WebKitHitTestResultContext","summary":"Enum values with flags representing the context of a #WebKitHitTestResult.","deprecated":null},{"type":"callback","name":"WebProcessExtensionInitializeFunction","ctype":"WebKitWebProcessExtensionInitializeFunction","summary":"Type definition for a function that will be called to initialize the web extension when the web process starts.","deprecated":null},{"type":"callback","name":"WebProcessExtensionInitializeWithUserDataFunction","ctype":"WebKitWebProcessExtensionInitializeWithUserDataFunction","summary":"Type definition for a function that will be called to initialize the web extensions when the web process starts, ...","deprecated":null},{"type":"class","name":"ContextMenu","ctype":"WebKitContextMenu","summary":"Represents the context menu in a #WebKitWebView. #WebKitContextMenu represents a context menu containing #WebKitContextMenuItems in a #WebKitWebView. ...","deprecated":null},{"type":"class","name":"ContextMenuItem","ctype":"WebKitContextMenuItem","summary":"One item of a #WebKitContextMenu. The #WebKitContextMenu is composed of #WebKitContextMenuItems. These items can be created from a ...","deprecated":null},{"type":"class","name":"Frame","ctype":"WebKitFrame","summary":"A web page frame. Each `WebKitWebPage` has at least one main frame, and can have any number of subframes.","deprecated":null},{"type":"class","name":"HitTestResult","ctype":"WebKitHitTestResult","summary":"Result of a Hit Test. A Hit Test is an operation to get context information about a given ...","deprecated":null},{"type":"class","name":"ScriptWorld","ctype":"WebKitScriptWorld","summary":"No description available.","deprecated":null},{"type":"class","name":"URIRequest","ctype":"WebKitURIRequest","summary":"Represents a URI request. A #WebKitURIRequest can be created with a URI using the webkit_uri_request_new() method, and you ...","deprecated":null},{"type":"class","name":"URIResponse","ctype":"WebKitURIResponse","summary":"Represents an URI response. A #WebKitURIResponse contains information such as the URI, the status code, the content length, ...","deprecated":null},{"type":"class","name":"UserMessage","ctype":"WebKitUserMessage","summary":"Message that can be sent between the UI process and web process extensions. A WebKitUserMessage is a message ...","deprecated":null},{"type":"class","name":"WebEditor","ctype":"WebKitWebEditor","summary":"Access to editing capabilities of a #WebKitWebPage. The WebKitWebEditor provides access to various editing capabilities of a #WebKitWebPage ...","deprecated":null},{"type":"class","name":"WebFormManager","ctype":"WebKitWebFormManager","summary":"Form manager of a #WebKitWebPage in a #WebKitScriptWorld","deprecated":null},{"type":"class","name":"WebHitTestResult","ctype":"WebKitWebHitTestResult","summary":"Result of a Hit Test (Web Process Extensions). WebKitWebHitTestResult extends #WebKitHitTestResult to provide information about the #WebKitDOMNode in ...","deprecated":null},{"type":"class","name":"WebPage","ctype":"WebKitWebPage","summary":"A loaded web page.","deprecated":null},{"type":"class","name":"WebProcessExtension","ctype":"WebKitWebProcessExtension","summary":"Represents an extension of the web process. WebKitWebProcessExtension is a loadable module for the web process. It allows ...","deprecated":null},{"type":"ctor","name":"new","type_name":"ContextMenu","ident":"webkit_context_menu_new","summary":"Creates a new #WebKitContextMenu object. Creates a new #WebKitContextMenu object to be used as a submenu of an ...","deprecated":null},{"type":"ctor","name":"new","type_name":"ScriptWorld","ident":"webkit_script_world_new","summary":"Creates a new isolated #WebKitScriptWorld. Scripts executed in isolated worlds have access to the DOM but not to other ...","deprecated":null},{"type":"ctor","name":"new","type_name":"URIRequest","ident":"webkit_uri_request_new","summary":"Creates a new #WebKitURIRequest for the given URI.","deprecated":null},{"type":"ctor","name":"new","type_name":"UserMessage","ident":"webkit_user_message_new","summary":"Create a new #WebKitUserMessage with @name.","deprecated":null},{"type":"ctor","name":"new_from_gaction","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_from_gaction","summary":"Creates a new #WebKitContextMenuItem for the given @action and @label. On activation @target will be passed as parameter ...","deprecated":null},{"type":"ctor","name":"new_from_stock_action","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_from_stock_action","summary":"Creates a new #WebKitContextMenuItem for the given stock action. Stock actions are handled automatically by WebKit so that, ...","deprecated":null},{"type":"ctor","name":"new_from_stock_action_with_label","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_from_stock_action_with_label","summary":"Creates a new #WebKitContextMenuItem for the given stock action using the given @label. Stock actions have a predefined ...","deprecated":null},{"type":"ctor","name":"new_separator","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_separator","summary":"Creates a new #WebKitContextMenuItem representing a separator.","deprecated":null},{"type":"ctor","name":"new_with_fd_list","type_name":"UserMessage","ident":"webkit_user_message_new_with_fd_list","summary":"Create a new #WebKitUserMessage including also a list of UNIX file descriptors to be sent.","deprecated":null},{"type":"ctor","name":"new_with_items","type_name":"ContextMenu","ident":"webkit_context_menu_new_with_items","summary":"Creates a new #WebKitContextMenu object with the given items. Creates a new #WebKitContextMenu object to be used as ...","deprecated":null},{"type":"ctor","name":"new_with_name","type_name":"ScriptWorld","ident":"webkit_script_world_new_with_name","summary":"Creates a new isolated #WebKitScriptWorld with a name. Scripts executed in isolated worlds have access to the DOM but ...","deprecated":null},{"type":"ctor","name":"new_with_submenu","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_with_submenu","summary":"Creates a new #WebKitContextMenuItem using the given @label with a submenu.","deprecated":null},{"type":"enum","name":"ConsoleMessageLevel","ctype":"WebKitConsoleMessageLevel","summary":"Enum values used to denote the various levels of console messages.","deprecated":null},{"type":"enum","name":"ConsoleMessageSource","ctype":"WebKitConsoleMessageSource","summary":"Enum values used to denote the various sources of console messages.","deprecated":null},{"type":"enum","name":"ContextMenuAction","ctype":"WebKitContextMenuAction","summary":"Enum values used to denote the stock actions for #WebKitContextMenuItems","deprecated":null},{"type":"enum","name":"UserMessageError","ctype":"WebKitUserMessageError","summary":"Enum values used to denote errors happening when sending user messages.","deprecated":null},{"type":"method","name":"append","type_name":"ContextMenu","ident":"webkit_context_menu_append","summary":"Adds @item at the end of the @menu.","deprecated":null},{"type":"method","name":"context_is_editable","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_editable","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_editable","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_context_is_editable","summary":"Check whether there is an editable element at the hit test position. Checks whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE flag is present ...","deprecated":null},{"type":"method","name":"context_is_image","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_image","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_image","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_context_is_image","summary":"Check whether there is an image element at the hit test position. Checks whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE flag is present ...","deprecated":null},{"type":"method","name":"context_is_link","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_link","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_link","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_context_is_link","summary":"Check whether there is a link element at the hit test position. Checks whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK flag is present ...","deprecated":null},{"type":"method","name":"context_is_media","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_media","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_media","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_context_is_media","summary":"Check whether there is a media element at the hit test position. Checks whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA flag is present ...","deprecated":null},{"type":"method","name":"context_is_scrollbar","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_scrollbar","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_SCROLLBAR flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_scrollbar","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_context_is_scrollbar","summary":"Check whether there is a scrollbar at the hit test position. Checks whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_SCROLLBAR flag is present in ...","deprecated":null},{"type":"method","name":"context_is_selection","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_selection","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_selection","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_context_is_selection","summary":"Check whether there is a selected element at the hit test position. Checks whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION flag is present ...","deprecated":null},{"type":"method","name":"copy","type_name":"ConsoleMessage","ident":"webkit_console_message_copy","summary":"Make a copy of @console_message."},{"type":"method","name":"first","type_name":"ContextMenu","ident":"webkit_context_menu_first","summary":"Gets the first item in the @menu.","deprecated":null},{"type":"method","name":"free","type_name":"ConsoleMessage","ident":"webkit_console_message_free","summary":"Free the #WebKitConsoleMessage"},{"type":"method","name":"get_content_length","type_name":"URIResponse","ident":"webkit_uri_response_get_content_length","summary":"Get the expected content length of the #WebKitURIResponse. It can be 0 if the server provided an incorrect ...","deprecated":null},{"type":"method","name":"get_context","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_context","summary":"Gets the value of the #WebKitHitTestResult:context property.","deprecated":null},{"type":"method","name":"get_context","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_get_context","summary":"Gets the the context flags for the hit test result.","deprecated":null},{"type":"method","name":"get_editor","type_name":"WebPage","ident":"webkit_web_page_get_editor","summary":"Gets the #WebKitWebEditor of a #WebKitWebPage.","deprecated":null},{"type":"method","name":"get_event","type_name":"ContextMenu","ident":"webkit_context_menu_get_event","summary":"Gets the #GdkEvent that triggered the context menu. This function only returns a valid #GdkEvent when called for a ...","deprecated":null},{"type":"method","name":"get_fd_list","type_name":"UserMessage","ident":"webkit_user_message_get_fd_list","summary":"Get the @message list of file descritpor.","deprecated":null},{"type":"method","name":"get_form_manager","type_name":"WebPage","ident":"webkit_web_page_get_form_manager","summary":"Get the #WebKitWebFormManager of @web_page in @world.","deprecated":null},{"type":"method","name":"get_gaction","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_gaction","summary":"Gets the action associated to @item as a #GAction.","deprecated":null},{"type":"method","name":"get_gaction_target","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_gaction_target","summary":"Gets the target #GVariant associated with @item.","deprecated":null},{"type":"method","name":"get_http_headers","type_name":"URIRequest","ident":"webkit_uri_request_get_http_headers","summary":"Get the HTTP headers of a #WebKitURIRequest as a #SoupMessageHeaders.","deprecated":null},{"type":"method","name":"get_http_headers","type_name":"URIResponse","ident":"webkit_uri_response_get_http_headers","summary":"Get the HTTP headers of a #WebKitURIResponse as a #SoupMessageHeaders.","deprecated":null},{"type":"method","name":"get_http_method","type_name":"URIRequest","ident":"webkit_uri_request_get_http_method","summary":"Get the HTTP method of the #WebKitURIRequest.","deprecated":null},{"type":"method","name":"get_id","type_name":"Frame","ident":"webkit_frame_get_id","summary":"Gets the process-unique identifier of this #WebKitFrame. No other frame in the same web process will have the same ...","deprecated":null},{"type":"method","name":"get_id","type_name":"WebPage","ident":"webkit_web_page_get_id","summary":"Get the identifier of the #WebKitWebPage","deprecated":null},{"type":"method","name":"get_image_uri","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_image_uri","summary":"Gets the value of the #WebKitHitTestResult:image-uri property.","deprecated":null},{"type":"method","name":"get_image_uri","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_get_image_uri","summary":"Obtains the URI associated with the image element at the hit test position.","deprecated":null},{"type":"method","name":"get_item_at_position","type_name":"ContextMenu","ident":"webkit_context_menu_get_item_at_position","summary":"Gets the item at the given position in the @menu.","deprecated":null},{"type":"method","name":"get_items","type_name":"ContextMenu","ident":"webkit_context_menu_get_items","summary":"Returns the item list of @menu.","deprecated":null},{"type":"method","name":"get_js_context","type_name":"Frame","ident":"webkit_frame_get_js_context","summary":"Get the JavaScript execution context of @frame. Use this function to bridge between the WebKit and JavaScriptCore APIs.","deprecated":null},{"type":"method","name":"get_js_context_for_script_world","type_name":"Frame","ident":"webkit_frame_get_js_context_for_script_world","summary":"Get the JavaScript execution context of @frame for the given #WebKitScriptWorld.","deprecated":null},{"type":"method","name":"get_js_node","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_get_js_node","summary":"Get the #JSCValue for the DOM node in @world at the coordinates of the Hit Test.","deprecated":null},{"type":"method","name":"get_level","type_name":"ConsoleMessage","ident":"webkit_console_message_get_level","summary":"Gets the log level of a #WebKitConsoleMessage"},{"type":"method","name":"get_line","type_name":"ConsoleMessage","ident":"webkit_console_message_get_line","summary":"Gets the line number of a #WebKitConsoleMessage"},{"type":"method","name":"get_link_label","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_link_label","summary":"Gets the value of the #WebKitHitTestResult:link-label property.","deprecated":null},{"type":"method","name":"get_link_label","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_get_link_label","summary":"Obtains the label associated with the link element at the hit test position.","deprecated":null},{"type":"method","name":"get_link_title","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_link_title","summary":"Gets the value of the #WebKitHitTestResult:link-title property.","deprecated":null},{"type":"method","name":"get_link_title","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_get_link_title","summary":"Obtains the title associated with the link element at the hit test position.","deprecated":null},{"type":"method","name":"get_link_uri","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_link_uri","summary":"Gets the value of the #WebKitHitTestResult:link-uri property.","deprecated":null},{"type":"method","name":"get_link_uri","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_get_link_uri","summary":"Obtains the URI associated with the link element at the hit test position.","deprecated":null},{"type":"method","name":"get_main_frame","type_name":"WebPage","ident":"webkit_web_page_get_main_frame","summary":"Returns the main frame of a #WebKitWebPage.","deprecated":"2.48"},{"type":"method","name":"get_media_uri","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_media_uri","summary":"Gets the value of the #WebKitHitTestResult:media-uri property.","deprecated":null},{"type":"method","name":"get_media_uri","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_get_media_uri","summary":"Obtains the URI associated with the media element at the hit test position.","deprecated":null},{"type":"method","name":"get_mime_type","type_name":"URIResponse","ident":"webkit_uri_response_get_mime_type","summary":"Gets the MIME type of the response.","deprecated":null},{"type":"method","name":"get_n_items","type_name":"ContextMenu","ident":"webkit_context_menu_get_n_items","summary":"Gets the length of the @menu.","deprecated":null},{"type":"method","name":"get_name","type_name":"ScriptWorld","ident":"webkit_script_world_get_name","summary":"Get the name of a #WebKitScriptWorld.","deprecated":null},{"type":"method","name":"get_name","type_name":"UserMessage","ident":"webkit_user_message_get_name","summary":"Get the @message name.","deprecated":null},{"type":"method","name":"get_page","type_name":"WebEditor","ident":"webkit_web_editor_get_page","summary":"Gets the #WebKitWebPage that is associated with the #WebKitWebEditor.","deprecated":null},{"type":"method","name":"get_page","type_name":"WebProcessExtension","ident":"webkit_web_process_extension_get_page","summary":"Get the web page of the given @page_id.","deprecated":null},{"type":"method","name":"get_parameters","type_name":"UserMessage","ident":"webkit_user_message_get_parameters","summary":"Get the @message parameters.","deprecated":null},{"type":"method","name":"get_position","type_name":"ContextMenu","ident":"webkit_context_menu_get_position","summary":"Gets the position in view coordinates where the context menu was triggered. This function only returns valid coordinates ...","deprecated":null},{"type":"method","name":"get_source","type_name":"ConsoleMessage","ident":"webkit_console_message_get_source","summary":"Gets the source of a #WebKitConsoleMessage"},{"type":"method","name":"get_source_id","type_name":"ConsoleMessage","ident":"webkit_console_message_get_source_id","summary":"Gets the source identifier of a #WebKitConsoleMessage"},{"type":"method","name":"get_status_code","type_name":"URIResponse","ident":"webkit_uri_response_get_status_code","summary":"Get the status code of the #WebKitURIResponse. Get the status code of the #WebKitURIResponse as returned by the ...","deprecated":null},{"type":"method","name":"get_stock_action","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_stock_action","summary":"Gets the #WebKitContextMenuAction of @item. If the #WebKitContextMenuItem was not created for a stock action %WEBKIT_CONTEXT_MENU_ACTION_CUSTOM will be ...","deprecated":null},{"type":"method","name":"get_submenu","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_submenu","summary":"Gets the submenu of @item.","deprecated":null},{"type":"method","name":"get_suggested_filename","type_name":"URIResponse","ident":"webkit_uri_response_get_suggested_filename","summary":"Get the suggested filename for @response. Get the suggested filename for @response, as specified by the 'Content-Disposition' HTTP ...","deprecated":null},{"type":"method","name":"get_text","type_name":"ConsoleMessage","ident":"webkit_console_message_get_text","summary":"Gets the text message of a #WebKitConsoleMessage"},{"type":"method","name":"get_title","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_title","summary":"Gets the title of @item.","deprecated":null},{"type":"method","name":"get_uri","type_name":"Frame","ident":"webkit_frame_get_uri","summary":"Gets the current active URI of @frame.","deprecated":null},{"type":"method","name":"get_uri","type_name":"URIRequest","ident":"webkit_uri_request_get_uri","summary":"Obtains the request URI.","deprecated":null},{"type":"method","name":"get_uri","type_name":"URIResponse","ident":"webkit_uri_response_get_uri","summary":"Gets the URI which resulted in the response.","deprecated":null},{"type":"method","name":"get_uri","type_name":"WebPage","ident":"webkit_web_page_get_uri","summary":"Returns the current active URI of @web_page. You can monitor the active URI by connecting to the notify::uri ...","deprecated":null},{"type":"method","name":"get_user_data","type_name":"ContextMenu","ident":"webkit_context_menu_get_user_data","summary":"Gets the user data of @menu. This function can be used from the UI Process to get user ...","deprecated":null},{"type":"method","name":"insert","type_name":"ContextMenu","ident":"webkit_context_menu_insert","summary":"Inserts @item into the @menu at the given position. If @position is negative, or is larger than the ...","deprecated":null},{"type":"method","name":"is_main_frame","type_name":"Frame","ident":"webkit_frame_is_main_frame","summary":"Gets whether @frame is the main frame of a #WebKitWebPage","deprecated":null},{"type":"method","name":"is_separator","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_is_separator","summary":"Checks whether @item is a separator.","deprecated":null},{"type":"method","name":"last","type_name":"ContextMenu","ident":"webkit_context_menu_last","summary":"Gets the last item in the @menu.","deprecated":null},{"type":"method","name":"move_item","type_name":"ContextMenu","ident":"webkit_context_menu_move_item","summary":"Moves @item to the given position in the @menu. If @position is negative, or is larger than the ...","deprecated":null},{"type":"method","name":"prepend","type_name":"ContextMenu","ident":"webkit_context_menu_prepend","summary":"Adds @item at the beginning of the @menu.","deprecated":null},{"type":"method","name":"remove","type_name":"ContextMenu","ident":"webkit_context_menu_remove","summary":"Removes @item from the @menu. See also webkit_context_menu_remove_all() to remove all items.","deprecated":null},{"type":"method","name":"remove_all","type_name":"ContextMenu","ident":"webkit_context_menu_remove_all","summary":"Removes all items of the @menu.","deprecated":null},{"type":"method","name":"send_message_to_context","type_name":"WebProcessExtension","ident":"webkit_web_process_extension_send_message_to_context","summary":"Send @message to the #WebKitWebContext corresponding to @extension. If @message is floating, it's consumed. If you don't expect ...","deprecated":null},{"type":"method","name":"send_message_to_context_finish","type_name":"WebProcessExtension","ident":"webkit_web_process_extension_send_message_to_context_finish","summary":"Finish an asynchronous operation started with webkit_web_process_extension_send_message_to_context().","deprecated":null},{"type":"method","name":"send_message_to_view","type_name":"WebPage","ident":"webkit_web_page_send_message_to_view","summary":"Send @message to the #WebKitWebView corresponding to @web_page. If @message is floating, it's consumed. If you don't expect ...","deprecated":null},{"type":"method","name":"send_message_to_view_finish","type_name":"WebPage","ident":"webkit_web_page_send_message_to_view_finish","summary":"Finish an asynchronous operation started with webkit_web_page_send_message_to_view().","deprecated":null},{"type":"method","name":"send_reply","type_name":"UserMessage","ident":"webkit_user_message_send_reply","summary":"Send a reply to an user message. If @reply is floating, it's consumed. You can only send a ...","deprecated":null},{"type":"method","name":"set_submenu","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_set_submenu","summary":"Sets or replaces the @item submenu. If @submenu is %NULL the current submenu of @item is removed.","deprecated":null},{"type":"method","name":"set_uri","type_name":"URIRequest","ident":"webkit_uri_request_set_uri","summary":"Set the URI of @request","deprecated":null},{"type":"method","name":"set_user_data","type_name":"ContextMenu","ident":"webkit_context_menu_set_user_data","summary":"Sets user data to @menu. This function can be used from a Web Process extension to set user ...","deprecated":null},{"type":"property","name":"content-length","type_name":"URIResponse","summary":"The expected content length of the response.","deprecated":null},{"type":"property","name":"context","type_name":"HitTestResult","summary":"Bitmask of #WebKitHitTestResultContext flags representing the context of the #WebKitHitTestResult.","deprecated":null},{"type":"property","name":"fd-list","type_name":"UserMessage","summary":"The UNIX file descriptors of the user message.","deprecated":null},{"type":"property","name":"http-headers","type_name":"URIResponse","summary":"The HTTP headers of the response, or %NULL if the response is not an HTTP response.","deprecated":null},{"type":"property","name":"image-uri","type_name":"HitTestResult","summary":"The URI of the image if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"link-label","type_name":"HitTestResult","summary":"The label of the link if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"link-title","type_name":"HitTestResult","summary":"The title of the link if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"link-uri","type_name":"HitTestResult","summary":"The URI of the link if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"media-uri","type_name":"HitTestResult","summary":"The URI of the media if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"mime-type","type_name":"URIResponse","summary":"The MIME type of the response.","deprecated":null},{"type":"property","name":"name","type_name":"UserMessage","summary":"The name of the user message.","deprecated":null},{"type":"property","name":"parameters","type_name":"UserMessage","summary":"The parameters of the user message as a #GVariant, or %NULL if the message doesn't include parameters. Note that ...","deprecated":null},{"type":"property","name":"status-code","type_name":"URIResponse","summary":"The status code of the response as returned by the server.","deprecated":null},{"type":"property","name":"suggested-filename","type_name":"URIResponse","summary":"The suggested filename for the URI response.","deprecated":null},{"type":"property","name":"uri","type_name":"URIRequest","summary":"The URI to which the request will be made.","deprecated":null},{"type":"property","name":"uri","type_name":"URIResponse","summary":"The URI for which the response was made.","deprecated":null},{"type":"property","name":"uri","type_name":"WebPage","summary":"The current active URI of the #WebKitWebPage.","deprecated":null},{"type":"record","name":"ConsoleMessage","ctype":"WebKitConsoleMessage","summary":"No description available.","deprecated":null},{"type":"signal","name":"console-message-sent","type_name":"WebPage","summary":"Emitted when a message is sent to the console. This can be a message produced by the use of ...","deprecated":null},{"type":"signal","name":"context-menu","type_name":"WebPage","summary":"Emitted before a context menu is displayed in the UI Process to give the application a chance to customize ...","deprecated":null},{"type":"signal","name":"document-loaded","type_name":"WebPage","summary":"This signal is emitted when the DOM document of a #WebKitWebPage has been loaded. You can wait for ...","deprecated":null},{"type":"signal","name":"form-controls-associated","type_name":"WebFormManager","summary":"Emitted after form elements (or form associated elements) are associated to @frame. This is useful to implement form auto ...","deprecated":null},{"type":"signal","name":"page-created","type_name":"WebProcessExtension","summary":"This signal is emitted when a new #WebKitWebPage is created in the Web Process.","deprecated":null},{"type":"signal","name":"selection-changed","type_name":"WebEditor","summary":"This signal is emitted for every selection change inside a #WebKitWebPage as well as for every caret position change ...","deprecated":null},{"type":"signal","name":"send-request","type_name":"WebPage","summary":"This signal is emitted when @request is about to be sent to the server. This signal can be used ...","deprecated":null},{"type":"signal","name":"user-message-received","type_name":"WebPage","summary":"This signal is emitted when a #WebKitUserMessage is received from the #WebKitWebView corresponding to @web_page. You can reply to ...","deprecated":null},{"type":"signal","name":"user-message-received","type_name":"WebProcessExtension","summary":"This signal is emitted when a #WebKitUserMessage is received from the #WebKitWebContext corresponding to @extension. Messages sent by #WebKitWebContext ...","deprecated":null},{"type":"signal","name":"will-send-submit-event","type_name":"WebFormManager","summary":"This signal is emitted when the DOM submit event is about to be fired for @form. JavaScript code may ...","deprecated":null},{"type":"signal","name":"will-submit-form","type_name":"WebFormManager","summary":"This signal is emitted when @form will imminently be submitted. It can no longer be cancelled. This event always ...","deprecated":null},{"type":"signal","name":"window-object-cleared","type_name":"ScriptWorld","summary":"Emitted when the JavaScript window object in a #WebKitScriptWorld has been cleared. This is the preferred place to set ...","deprecated":null},{"type":"type_func","name":"error_quark","type_name":"UserMessage","ident":"webkit_user_message_error_quark","summary":"Gets the quark for the domain of user message errors.","deprecated":null},{"type":"type_func","name":"get_default","type_name":"ScriptWorld","ident":"webkit_script_world_get_default","summary":"Get the default #WebKitScriptWorld. This is the normal script world where all scripts are executed by default. You can ...","deprecated":null},{"type":"type_func","name":"input_element_auto_fill","type_name":"WebFormManager","ident":"webkit_web_form_manager_input_element_auto_fill","summary":"Set the value of an HTML input element as if it had been edited by the user, triggering a ...","deprecated":null},{"type":"type_func","name":"input_element_is_auto_filled","type_name":"WebFormManager","ident":"webkit_web_form_manager_input_element_is_auto_filled","summary":"Get whether @element is an HTML input element that has been filled automatically.","deprecated":null},{"type":"type_func","name":"input_element_is_user_edited","type_name":"WebFormManager","ident":"webkit_web_form_manager_input_element_is_user_edited","summary":"Get whether @element is an HTML text input element that has been edited by a user action.","deprecated":null}],"terms":{}} \ No newline at end of file +{"meta":{"ns":"WebKitWebProcessExtension","version":"6.0","generator":"gi-docgen","generator-version":"2023.4"},"symbols":[{"type":"bitfield","name":"HitTestResultContext","ctype":"WebKitHitTestResultContext","summary":"Enum values with flags representing the context of a #WebKitHitTestResult.","deprecated":null},{"type":"callback","name":"WebProcessExtensionInitializeFunction","ctype":"WebKitWebProcessExtensionInitializeFunction","summary":"Type definition for a function that will be called to initialize the web extension when the web process starts.","deprecated":null},{"type":"callback","name":"WebProcessExtensionInitializeWithUserDataFunction","ctype":"WebKitWebProcessExtensionInitializeWithUserDataFunction","summary":"Type definition for a function that will be called to initialize the web extensions when the web process starts, ...","deprecated":null},{"type":"class","name":"ContextMenu","ctype":"WebKitContextMenu","summary":"Represents the context menu in a #WebKitWebView. #WebKitContextMenu represents a context menu containing #WebKitContextMenuItems in a #WebKitWebView. ...","deprecated":null},{"type":"class","name":"ContextMenuItem","ctype":"WebKitContextMenuItem","summary":"One item of a #WebKitContextMenu. The #WebKitContextMenu is composed of #WebKitContextMenuItems. These items can be created from a ...","deprecated":null},{"type":"class","name":"Frame","ctype":"WebKitFrame","summary":"A web page frame. Each `WebKitWebPage` has at least one main frame, and can have any number of subframes.","deprecated":null},{"type":"class","name":"HitTestResult","ctype":"WebKitHitTestResult","summary":"Result of a Hit Test. A Hit Test is an operation to get context information about a given ...","deprecated":null},{"type":"class","name":"ScriptWorld","ctype":"WebKitScriptWorld","summary":"No description available.","deprecated":null},{"type":"class","name":"URIRequest","ctype":"WebKitURIRequest","summary":"Represents a URI request. A #WebKitURIRequest can be created with a URI using the webkit_uri_request_new() method, and you ...","deprecated":null},{"type":"class","name":"URIResponse","ctype":"WebKitURIResponse","summary":"Represents an URI response. A #WebKitURIResponse contains information such as the URI, the status code, the content length, ...","deprecated":null},{"type":"class","name":"UserMessage","ctype":"WebKitUserMessage","summary":"Message that can be sent between the UI process and web process extensions. A WebKitUserMessage is a message ...","deprecated":null},{"type":"class","name":"WebEditor","ctype":"WebKitWebEditor","summary":"Access to editing capabilities of a #WebKitWebPage. The WebKitWebEditor provides access to various editing capabilities of a #WebKitWebPage ...","deprecated":null},{"type":"class","name":"WebFormManager","ctype":"WebKitWebFormManager","summary":"Form manager of a #WebKitWebPage in a #WebKitScriptWorld","deprecated":null},{"type":"class","name":"WebHitTestResult","ctype":"WebKitWebHitTestResult","summary":"Result of a Hit Test (Web Process Extensions). WebKitWebHitTestResult extends #WebKitHitTestResult to provide information about the #WebKitDOMNode in ...","deprecated":null},{"type":"class","name":"WebPage","ctype":"WebKitWebPage","summary":"A loaded web page.","deprecated":null},{"type":"class","name":"WebProcessExtension","ctype":"WebKitWebProcessExtension","summary":"Represents an extension of the web process. WebKitWebProcessExtension is a loadable module for the web process. It allows ...","deprecated":null},{"type":"ctor","name":"new","type_name":"ContextMenu","ident":"webkit_context_menu_new","summary":"Creates a new #WebKitContextMenu object. Creates a new #WebKitContextMenu object to be used as a submenu of an ...","deprecated":null},{"type":"ctor","name":"new","type_name":"ScriptWorld","ident":"webkit_script_world_new","summary":"Creates a new isolated #WebKitScriptWorld. Scripts executed in isolated worlds have access to the DOM but not to other ...","deprecated":null},{"type":"ctor","name":"new","type_name":"URIRequest","ident":"webkit_uri_request_new","summary":"Creates a new #WebKitURIRequest for the given URI.","deprecated":null},{"type":"ctor","name":"new","type_name":"UserMessage","ident":"webkit_user_message_new","summary":"Create a new #WebKitUserMessage with @name.","deprecated":null},{"type":"ctor","name":"new_from_gaction","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_from_gaction","summary":"Creates a new #WebKitContextMenuItem for the given @action and @label. On activation @target will be passed as parameter ...","deprecated":null},{"type":"ctor","name":"new_from_stock_action","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_from_stock_action","summary":"Creates a new #WebKitContextMenuItem for the given stock action. Stock actions are handled automatically by WebKit so that, ...","deprecated":null},{"type":"ctor","name":"new_from_stock_action_with_label","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_from_stock_action_with_label","summary":"Creates a new #WebKitContextMenuItem for the given stock action using the given @label. Stock actions have a predefined ...","deprecated":null},{"type":"ctor","name":"new_separator","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_separator","summary":"Creates a new #WebKitContextMenuItem representing a separator.","deprecated":null},{"type":"ctor","name":"new_with_fd_list","type_name":"UserMessage","ident":"webkit_user_message_new_with_fd_list","summary":"Create a new #WebKitUserMessage including also a list of UNIX file descriptors to be sent.","deprecated":null},{"type":"ctor","name":"new_with_items","type_name":"ContextMenu","ident":"webkit_context_menu_new_with_items","summary":"Creates a new #WebKitContextMenu object with the given items. Creates a new #WebKitContextMenu object to be used as ...","deprecated":null},{"type":"ctor","name":"new_with_name","type_name":"ScriptWorld","ident":"webkit_script_world_new_with_name","summary":"Creates a new isolated #WebKitScriptWorld with a name. Scripts executed in isolated worlds have access to the DOM but ...","deprecated":null},{"type":"ctor","name":"new_with_submenu","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_new_with_submenu","summary":"Creates a new #WebKitContextMenuItem using the given @label with a submenu.","deprecated":null},{"type":"enum","name":"ConsoleMessageLevel","ctype":"WebKitConsoleMessageLevel","summary":"Enum values used to denote the various levels of console messages.","deprecated":null},{"type":"enum","name":"ConsoleMessageSource","ctype":"WebKitConsoleMessageSource","summary":"Enum values used to denote the various sources of console messages.","deprecated":null},{"type":"enum","name":"ContextMenuAction","ctype":"WebKitContextMenuAction","summary":"Enum values used to denote the stock actions for #WebKitContextMenuItems","deprecated":null},{"type":"enum","name":"UserMessageError","ctype":"WebKitUserMessageError","summary":"Enum values used to denote errors happening when sending user messages.","deprecated":null},{"type":"method","name":"append","type_name":"ContextMenu","ident":"webkit_context_menu_append","summary":"Adds @item at the end of the @menu.","deprecated":null},{"type":"method","name":"context_is_editable","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_editable","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_editable","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_context_is_editable","summary":"Check whether there is an editable element at the hit test position. Checks whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE flag is present ...","deprecated":null},{"type":"method","name":"context_is_image","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_image","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_image","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_context_is_image","summary":"Check whether there is an image element at the hit test position. Checks whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE flag is present ...","deprecated":null},{"type":"method","name":"context_is_link","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_link","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_link","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_context_is_link","summary":"Check whether there is a link element at the hit test position. Checks whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK flag is present ...","deprecated":null},{"type":"method","name":"context_is_media","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_media","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_media","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_context_is_media","summary":"Check whether there is a media element at the hit test position. Checks whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA flag is present ...","deprecated":null},{"type":"method","name":"context_is_scrollbar","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_scrollbar","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_SCROLLBAR flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_scrollbar","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_context_is_scrollbar","summary":"Check whether there is a scrollbar at the hit test position. Checks whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_SCROLLBAR flag is present in ...","deprecated":null},{"type":"method","name":"context_is_selection","type_name":"HitTestResult","ident":"webkit_hit_test_result_context_is_selection","summary":"Gets whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION flag is present in #WebKitHitTestResult:context.","deprecated":null},{"type":"method","name":"context_is_selection","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_context_is_selection","summary":"Check whether there is a selected element at the hit test position. Checks whether %WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION flag is present ...","deprecated":null},{"type":"method","name":"copy","type_name":"ConsoleMessage","ident":"webkit_console_message_copy","summary":"Make a copy of @console_message."},{"type":"method","name":"first","type_name":"ContextMenu","ident":"webkit_context_menu_first","summary":"Gets the first item in the @menu.","deprecated":null},{"type":"method","name":"free","type_name":"ConsoleMessage","ident":"webkit_console_message_free","summary":"Free the #WebKitConsoleMessage"},{"type":"method","name":"get_content_length","type_name":"URIResponse","ident":"webkit_uri_response_get_content_length","summary":"Get the expected content length of the #WebKitURIResponse. It can be 0 if the server provided an incorrect ...","deprecated":null},{"type":"method","name":"get_context","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_context","summary":"Gets the value of the #WebKitHitTestResult:context property.","deprecated":null},{"type":"method","name":"get_context","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_get_context","summary":"Gets the the context flags for the hit test result.","deprecated":null},{"type":"method","name":"get_editor","type_name":"WebPage","ident":"webkit_web_page_get_editor","summary":"Gets the #WebKitWebEditor of a #WebKitWebPage.","deprecated":null},{"type":"method","name":"get_event","type_name":"ContextMenu","ident":"webkit_context_menu_get_event","summary":"Gets the #GdkEvent that triggered the context menu. This function only returns a valid #GdkEvent when called for a ...","deprecated":null},{"type":"method","name":"get_fd_list","type_name":"UserMessage","ident":"webkit_user_message_get_fd_list","summary":"Get the @message list of file descritpor.","deprecated":null},{"type":"method","name":"get_form_manager","type_name":"WebPage","ident":"webkit_web_page_get_form_manager","summary":"Get the #WebKitWebFormManager of @web_page in @world.","deprecated":null},{"type":"method","name":"get_gaction","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_gaction","summary":"Gets the action associated to @item as a #GAction.","deprecated":null},{"type":"method","name":"get_gaction_target","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_gaction_target","summary":"Gets the target #GVariant associated with @item.","deprecated":null},{"type":"method","name":"get_http_headers","type_name":"URIRequest","ident":"webkit_uri_request_get_http_headers","summary":"Get the HTTP headers of a #WebKitURIRequest as a #SoupMessageHeaders.","deprecated":null},{"type":"method","name":"get_http_headers","type_name":"URIResponse","ident":"webkit_uri_response_get_http_headers","summary":"Get the HTTP headers of a #WebKitURIResponse as a #SoupMessageHeaders.","deprecated":null},{"type":"method","name":"get_http_method","type_name":"URIRequest","ident":"webkit_uri_request_get_http_method","summary":"Get the HTTP method of the #WebKitURIRequest.","deprecated":null},{"type":"method","name":"get_id","type_name":"Frame","ident":"webkit_frame_get_id","summary":"Gets the process-unique identifier of this #WebKitFrame. No other frame in the same web process will have the same ...","deprecated":null},{"type":"method","name":"get_id","type_name":"WebPage","ident":"webkit_web_page_get_id","summary":"Get the identifier of the #WebKitWebPage","deprecated":null},{"type":"method","name":"get_image_uri","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_image_uri","summary":"Gets the value of the #WebKitHitTestResult:image-uri property.","deprecated":null},{"type":"method","name":"get_image_uri","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_get_image_uri","summary":"Obtains the URI associated with the image element at the hit test position.","deprecated":null},{"type":"method","name":"get_item_at_position","type_name":"ContextMenu","ident":"webkit_context_menu_get_item_at_position","summary":"Gets the item at the given position in the @menu.","deprecated":null},{"type":"method","name":"get_items","type_name":"ContextMenu","ident":"webkit_context_menu_get_items","summary":"Returns the item list of @menu.","deprecated":null},{"type":"method","name":"get_js_context","type_name":"Frame","ident":"webkit_frame_get_js_context","summary":"Get the JavaScript execution context of @frame. Use this function to bridge between the WebKit and JavaScriptCore APIs.","deprecated":null},{"type":"method","name":"get_js_context_for_script_world","type_name":"Frame","ident":"webkit_frame_get_js_context_for_script_world","summary":"Get the JavaScript execution context of @frame for the given #WebKitScriptWorld.","deprecated":null},{"type":"method","name":"get_js_node","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_get_js_node","summary":"Get the #JSCValue for the DOM node in @world at the coordinates of the Hit Test.","deprecated":null},{"type":"method","name":"get_level","type_name":"ConsoleMessage","ident":"webkit_console_message_get_level","summary":"Gets the log level of a #WebKitConsoleMessage"},{"type":"method","name":"get_line","type_name":"ConsoleMessage","ident":"webkit_console_message_get_line","summary":"Gets the line number of a #WebKitConsoleMessage"},{"type":"method","name":"get_link_label","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_link_label","summary":"Gets the value of the #WebKitHitTestResult:link-label property.","deprecated":null},{"type":"method","name":"get_link_label","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_get_link_label","summary":"Obtains the label associated with the link element at the hit test position.","deprecated":null},{"type":"method","name":"get_link_title","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_link_title","summary":"Gets the value of the #WebKitHitTestResult:link-title property.","deprecated":null},{"type":"method","name":"get_link_title","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_get_link_title","summary":"Obtains the title associated with the link element at the hit test position.","deprecated":null},{"type":"method","name":"get_link_uri","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_link_uri","summary":"Gets the value of the #WebKitHitTestResult:link-uri property.","deprecated":null},{"type":"method","name":"get_link_uri","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_get_link_uri","summary":"Obtains the URI associated with the link element at the hit test position.","deprecated":null},{"type":"method","name":"get_main_frame","type_name":"WebPage","ident":"webkit_web_page_get_main_frame","summary":"Returns the main frame of a #WebKitWebPage.","deprecated":"2.48"},{"type":"method","name":"get_media_uri","type_name":"HitTestResult","ident":"webkit_hit_test_result_get_media_uri","summary":"Gets the value of the #WebKitHitTestResult:media-uri property.","deprecated":null},{"type":"method","name":"get_media_uri","type_name":"WebHitTestResult","ident":"webkit_web_hit_test_result_get_media_uri","summary":"Obtains the URI associated with the media element at the hit test position.","deprecated":null},{"type":"method","name":"get_mime_type","type_name":"URIResponse","ident":"webkit_uri_response_get_mime_type","summary":"Gets the MIME type of the response.","deprecated":null},{"type":"method","name":"get_n_items","type_name":"ContextMenu","ident":"webkit_context_menu_get_n_items","summary":"Gets the length of the @menu.","deprecated":null},{"type":"method","name":"get_name","type_name":"ScriptWorld","ident":"webkit_script_world_get_name","summary":"Get the name of a #WebKitScriptWorld.","deprecated":null},{"type":"method","name":"get_name","type_name":"UserMessage","ident":"webkit_user_message_get_name","summary":"Get the @message name.","deprecated":null},{"type":"method","name":"get_page","type_name":"WebEditor","ident":"webkit_web_editor_get_page","summary":"Gets the #WebKitWebPage that is associated with the #WebKitWebEditor.","deprecated":null},{"type":"method","name":"get_page","type_name":"WebProcessExtension","ident":"webkit_web_process_extension_get_page","summary":"Get the web page of the given @page_id.","deprecated":null},{"type":"method","name":"get_parameters","type_name":"UserMessage","ident":"webkit_user_message_get_parameters","summary":"Get the @message parameters.","deprecated":null},{"type":"method","name":"get_position","type_name":"ContextMenu","ident":"webkit_context_menu_get_position","summary":"Gets the position in view coordinates where the context menu was triggered. This function only returns valid coordinates ...","deprecated":null},{"type":"method","name":"get_source","type_name":"ConsoleMessage","ident":"webkit_console_message_get_source","summary":"Gets the source of a #WebKitConsoleMessage"},{"type":"method","name":"get_source_id","type_name":"ConsoleMessage","ident":"webkit_console_message_get_source_id","summary":"Gets the source identifier of a #WebKitConsoleMessage"},{"type":"method","name":"get_status_code","type_name":"URIResponse","ident":"webkit_uri_response_get_status_code","summary":"Get the status code of the #WebKitURIResponse. Get the status code of the #WebKitURIResponse as returned by the ...","deprecated":null},{"type":"method","name":"get_stock_action","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_stock_action","summary":"Gets the #WebKitContextMenuAction of @item. If the #WebKitContextMenuItem was not created for a stock action %WEBKIT_CONTEXT_MENU_ACTION_CUSTOM will be ...","deprecated":null},{"type":"method","name":"get_submenu","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_submenu","summary":"Gets the submenu of @item.","deprecated":null},{"type":"method","name":"get_suggested_filename","type_name":"URIResponse","ident":"webkit_uri_response_get_suggested_filename","summary":"Get the suggested filename for @response. Get the suggested filename for @response, as specified by the 'Content-Disposition' HTTP ...","deprecated":null},{"type":"method","name":"get_text","type_name":"ConsoleMessage","ident":"webkit_console_message_get_text","summary":"Gets the text message of a #WebKitConsoleMessage"},{"type":"method","name":"get_title","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_get_title","summary":"Gets the title of @item.","deprecated":null},{"type":"method","name":"get_uri","type_name":"Frame","ident":"webkit_frame_get_uri","summary":"Gets the current active URI of @frame.","deprecated":null},{"type":"method","name":"get_uri","type_name":"URIRequest","ident":"webkit_uri_request_get_uri","summary":"Obtains the request URI.","deprecated":null},{"type":"method","name":"get_uri","type_name":"URIResponse","ident":"webkit_uri_response_get_uri","summary":"Gets the URI which resulted in the response.","deprecated":null},{"type":"method","name":"get_uri","type_name":"WebPage","ident":"webkit_web_page_get_uri","summary":"Returns the current active URI of @web_page. You can monitor the active URI by connecting to the notify::uri ...","deprecated":null},{"type":"method","name":"get_user_data","type_name":"ContextMenu","ident":"webkit_context_menu_get_user_data","summary":"Gets the user data of @menu. This function can be used from the UI Process to get user ...","deprecated":null},{"type":"method","name":"insert","type_name":"ContextMenu","ident":"webkit_context_menu_insert","summary":"Inserts @item into the @menu at the given position. If @position is negative, or is larger than the ...","deprecated":null},{"type":"method","name":"is_main_frame","type_name":"Frame","ident":"webkit_frame_is_main_frame","summary":"Gets whether @frame is the main frame of a #WebKitWebPage","deprecated":null},{"type":"method","name":"is_separator","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_is_separator","summary":"Checks whether @item is a separator.","deprecated":null},{"type":"method","name":"last","type_name":"ContextMenu","ident":"webkit_context_menu_last","summary":"Gets the last item in the @menu.","deprecated":null},{"type":"method","name":"move_item","type_name":"ContextMenu","ident":"webkit_context_menu_move_item","summary":"Moves @item to the given position in the @menu. If @position is negative, or is larger than the ...","deprecated":null},{"type":"method","name":"prepend","type_name":"ContextMenu","ident":"webkit_context_menu_prepend","summary":"Adds @item at the beginning of the @menu.","deprecated":null},{"type":"method","name":"remove","type_name":"ContextMenu","ident":"webkit_context_menu_remove","summary":"Removes @item from the @menu. See also webkit_context_menu_remove_all() to remove all items.","deprecated":null},{"type":"method","name":"remove_all","type_name":"ContextMenu","ident":"webkit_context_menu_remove_all","summary":"Removes all items of the @menu.","deprecated":null},{"type":"method","name":"send_message_to_context","type_name":"WebProcessExtension","ident":"webkit_web_process_extension_send_message_to_context","summary":"Send @message to the #WebKitWebContext corresponding to @extension. If @message is floating, it's consumed. If you don't expect ...","deprecated":null},{"type":"method","name":"send_message_to_context_finish","type_name":"WebProcessExtension","ident":"webkit_web_process_extension_send_message_to_context_finish","summary":"Finish an asynchronous operation started with webkit_web_process_extension_send_message_to_context().","deprecated":null},{"type":"method","name":"send_message_to_view","type_name":"WebPage","ident":"webkit_web_page_send_message_to_view","summary":"Send @message to the #WebKitWebView corresponding to @web_page. If @message is floating, it's consumed. If you don't expect ...","deprecated":null},{"type":"method","name":"send_message_to_view_finish","type_name":"WebPage","ident":"webkit_web_page_send_message_to_view_finish","summary":"Finish an asynchronous operation started with webkit_web_page_send_message_to_view().","deprecated":null},{"type":"method","name":"send_reply","type_name":"UserMessage","ident":"webkit_user_message_send_reply","summary":"Send a reply to an user message. If @reply is floating, it's consumed. You can only send a ...","deprecated":null},{"type":"method","name":"set_submenu","type_name":"ContextMenuItem","ident":"webkit_context_menu_item_set_submenu","summary":"Sets or replaces the @item submenu. If @submenu is %NULL the current submenu of @item is removed.","deprecated":null},{"type":"method","name":"set_uri","type_name":"URIRequest","ident":"webkit_uri_request_set_uri","summary":"Set the URI of @request","deprecated":null},{"type":"method","name":"set_user_data","type_name":"ContextMenu","ident":"webkit_context_menu_set_user_data","summary":"Sets user data to @menu. This function can be used from a Web Process extension to set user ...","deprecated":null},{"type":"property","name":"content-length","type_name":"URIResponse","summary":"The expected content length of the response.","deprecated":null},{"type":"property","name":"context","type_name":"HitTestResult","summary":"Bitmask of #WebKitHitTestResultContext flags representing the context of the #WebKitHitTestResult.","deprecated":null},{"type":"property","name":"fd-list","type_name":"UserMessage","summary":"The UNIX file descriptors of the user message.","deprecated":null},{"type":"property","name":"http-headers","type_name":"URIResponse","summary":"The HTTP headers of the response, or %NULL if the response is not an HTTP response.","deprecated":null},{"type":"property","name":"image-uri","type_name":"HitTestResult","summary":"The URI of the image if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"link-label","type_name":"HitTestResult","summary":"The label of the link if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"link-title","type_name":"HitTestResult","summary":"The title of the link if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"link-uri","type_name":"HitTestResult","summary":"The URI of the link if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"media-uri","type_name":"HitTestResult","summary":"The URI of the media if flag %WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA is present in #WebKitHitTestResult:context","deprecated":null},{"type":"property","name":"mime-type","type_name":"URIResponse","summary":"The MIME type of the response.","deprecated":null},{"type":"property","name":"name","type_name":"UserMessage","summary":"The name of the user message.","deprecated":null},{"type":"property","name":"parameters","type_name":"UserMessage","summary":"The parameters of the user message as a #GVariant, or %NULL if the message doesn't include parameters. Note that ...","deprecated":null},{"type":"property","name":"status-code","type_name":"URIResponse","summary":"The status code of the response as returned by the server.","deprecated":null},{"type":"property","name":"suggested-filename","type_name":"URIResponse","summary":"The suggested filename for the URI response.","deprecated":null},{"type":"property","name":"uri","type_name":"URIRequest","summary":"The URI to which the request will be made.","deprecated":null},{"type":"property","name":"uri","type_name":"URIResponse","summary":"The URI for which the response was made.","deprecated":null},{"type":"property","name":"uri","type_name":"WebPage","summary":"The current active URI of the #WebKitWebPage.","deprecated":null},{"type":"record","name":"ConsoleMessage","ctype":"WebKitConsoleMessage","summary":"No description available.","deprecated":null},{"type":"signal","name":"console-message-sent","type_name":"WebPage","summary":"Emitted when a message is sent to the console. This can be a message produced by the use of ...","deprecated":null},{"type":"signal","name":"context-menu","type_name":"WebPage","summary":"Emitted before a context menu is displayed in the UI Process to give the application a chance to customize ...","deprecated":null},{"type":"signal","name":"document-loaded","type_name":"WebPage","summary":"This signal is emitted when the DOM document of a #WebKitWebPage has been loaded. You can wait for ...","deprecated":null},{"type":"signal","name":"form-controls-associated","type_name":"WebFormManager","summary":"Emitted after form elements (or form associated elements) are associated to @frame. This is useful to implement form auto ...","deprecated":null},{"type":"signal","name":"page-created","type_name":"WebProcessExtension","summary":"This signal is emitted when a new #WebKitWebPage is created in the Web Process.","deprecated":null},{"type":"signal","name":"selection-changed","type_name":"WebEditor","summary":"This signal is emitted for every selection change inside a #WebKitWebPage as well as for every caret position change ...","deprecated":null},{"type":"signal","name":"send-request","type_name":"WebPage","summary":"This signal is emitted when @request is about to be sent to the server. This signal can be used ...","deprecated":null},{"type":"signal","name":"user-message-received","type_name":"WebPage","summary":"This signal is emitted when a #WebKitUserMessage is received from the #WebKitWebView corresponding to @web_page. You can reply to ...","deprecated":null},{"type":"signal","name":"user-message-received","type_name":"WebProcessExtension","summary":"This signal is emitted when a #WebKitUserMessage is received from the #WebKitWebContext corresponding to @extension. Messages sent by #WebKitWebContext ...","deprecated":null},{"type":"signal","name":"will-send-submit-event","type_name":"WebFormManager","summary":"This signal is emitted when the DOM submit event is about to be fired for @form. JavaScript code may ...","deprecated":null},{"type":"signal","name":"will-submit-form","type_name":"WebFormManager","summary":"This signal is emitted when @form will imminently be submitted. It can no longer be cancelled. This event always ...","deprecated":null},{"type":"signal","name":"window-object-cleared","type_name":"ScriptWorld","summary":"Emitted when the JavaScript window object in a #WebKitScriptWorld has been cleared. This is the preferred place to set ...","deprecated":null},{"type":"type_func","name":"error_quark","type_name":"UserMessage","ident":"webkit_user_message_error_quark","summary":"Gets the quark for the domain of user message errors.","deprecated":null},{"type":"type_func","name":"get_default","type_name":"ScriptWorld","ident":"webkit_script_world_get_default","summary":"Get the default #WebKitScriptWorld. This is the normal script world where all scripts are executed by default. You can ...","deprecated":null},{"type":"type_func","name":"input_element_auto_fill","type_name":"WebFormManager","ident":"webkit_web_form_manager_input_element_auto_fill","summary":"Set the value of an HTML input element as if it had been edited by the user, triggering a ...","deprecated":null},{"type":"type_func","name":"input_element_is_auto_filled","type_name":"WebFormManager","ident":"webkit_web_form_manager_input_element_is_auto_filled","summary":"Get whether @element is an HTML input element that has been filled automatically.","deprecated":null},{"type":"type_func","name":"input_element_is_user_edited","type_name":"WebFormManager","ident":"webkit_web_form_manager_input_element_is_user_edited","summary":"Get whether @element is an HTML text input element that has been edited by a user action.","deprecated":null}],"terms":{}} \ No newline at end of file diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.copy.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.copy.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.copy.html 2026-04-16 17:54:31.774688700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.copy.html 2026-07-09 07:33:40.203510000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,14 +169,14 @@

Type: WebKitConsoleMessage

-

A copy of passed in WebKitConsoleMessage.

+

A copy of passed in WebKitConsoleMessage.

Version2.52.3
Version2.52.5
AuthorsThe WebKit GTK and WPE teams
LicenseBSD, LGPL-2.1
Websitehttps://webkit.org

Represents the context menu in a WebKitWebView.

-

unstable since: 6.0

+

One item of a WebKitContextMenu.

-

unstable since: 6.0

+

Result of a Hit Test.

-

unstable since: 6.0

+

-

unstable since: 6.0

+

Represents a URI request.

-

unstable since: 6.0

+

Represents an URI response.

-

unstable since: 6.0

+

A loaded web page.

-

unstable since: 6.0

+

-

unstable since: 6.0

+

Enum values used to denote the stock actions for WebKitContextMenuItems.

-

unstable since: 6.0

+

Enum values with flags representing the context of a WebKitHitTestResult.

-

unstable since: 6.0

+

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.free.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.free.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.free.html 2026-04-16 17:54:31.822688800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.free.html 2026-07-09 07:33:40.209346300 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_level.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_level.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_level.html 2026-04-16 17:54:31.926689000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_level.html 2026-07-09 07:33:40.241834200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,7 +169,7 @@

Type: WebKitConsoleMessageLevel

-

A WebKitConsoleMessageLevel indicating the log level of console_message.

+

A WebKitConsoleMessageLevel indicating the log level of console_message.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_line.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_line.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_line.html 2026-04-16 17:54:31.998689000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_line.html 2026-07-09 07:33:40.267508700 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,7 +169,7 @@

Type: guint

-

The line number of console_message.

+

The line number of console_message.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_source.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_source.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_source.html 2026-04-16 17:54:32.034689200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_source.html 2026-07-09 07:33:40.286920000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,7 +169,7 @@

Type: WebKitConsoleMessageSource

-

A WebKitConsoleMessageSource indicating the source of console_message.

+

A WebKitConsoleMessageSource indicating the source of console_message.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_source_id.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_source_id.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_source_id.html 2026-04-16 17:54:32.075689000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_source_id.html 2026-07-09 07:33:40.290683000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,14 +169,14 @@

Type: const gchar*

-

The source identifier of console_message.

+

The source identifier of console_message.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_text.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_text.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_text.html 2026-04-16 17:54:32.132689200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ConsoleMessage.get_text.html 2026-07-09 07:33:40.293991300 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,14 +169,14 @@

Type: const gchar*

-

The text message of console_message.

+

The text message of console_message.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.append.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.append.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.append.html 2026-04-16 17:54:32.214689300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.append.html 2026-07-09 07:33:40.308046600 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -186,7 +186,7 @@
item

Type: WebKitContextMenuItem

-

The WebKitContextMenuItem to add.

+

The WebKitContextMenuItem to add.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.first.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.first.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.first.html 2026-04-16 17:54:32.222689400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.first.html 2026-07-09 07:33:40.311092600 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,15 +185,15 @@

Type: WebKitContextMenuItem

-

The first WebKitContextMenuItem of menu, - or NULL if the WebKitContextMenu is empty.

+

The first WebKitContextMenuItem of menu, + or NULL if the WebKitContextMenu is empty.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_event.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_event.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_event.html 2026-04-16 17:54:32.234689500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_event.html 2026-07-09 07:33:40.316141400 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -199,14 +199,14 @@

Type: GdkEvent

-

The menu event or NULL.

+

The menu event or NULL.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_item_at_position.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_item_at_position.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_item_at_position.html 2026-04-16 17:54:32.243689300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_item_at_position.html 2026-07-09 07:33:40.320259800 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -186,7 +186,7 @@
position

Type: guint

-

The position of the item, counting from 0

+

The position of the item, counting from 0

@@ -218,15 +218,15 @@

Type: WebKitContextMenuItem

-

The WebKitContextMenuItem at position position in menu, - or NULL if the position is off the end of the menu.

+

The WebKitContextMenuItem at position position in menu, + or NULL if the position is off the end of the menu.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_items.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_items.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_items.html 2026-04-16 17:54:32.252689400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_items.html 2026-07-09 07:33:40.323797500 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,15 +185,15 @@

Type: A list of None

-

A GList of - WebKitContextMenuItems.

+

A GList of + WebKitContextMenuItems.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_n_items.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_n_items.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_n_items.html 2026-04-16 17:54:32.261689400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_n_items.html 2026-07-09 07:33:40.326897000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,7 +185,7 @@

Type: guint

-

The number of WebKitContextMenuItems in menu.

+

The number of WebKitContextMenuItems in menu.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_position.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_position.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_position.html 2026-04-16 17:54:32.276689500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_position.html 2026-07-09 07:33:40.331980200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -189,7 +189,7 @@
x

Type: gint*

-

Return location for the x coordinate.

+

Return location for the x coordinate.

@@ -206,7 +206,7 @@
y

Type: gint*

-

Return location for the y coordinate.

+

Return location for the y coordinate.

The argument will be set by the function.
@@ -238,7 +238,7 @@

Type: gboolean

-

TRUE if valid position coordinates are available, FALSE otherwise.

+

TRUE if valid position coordinates are available, FALSE otherwise.

The argument will be set by the function.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_user_data.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_user_data.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_user_data.html 2026-04-16 17:54:32.283689500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.get_user_data.html 2026-07-09 07:33:40.335699000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,14 +187,14 @@

Type: GVariant

-

The user data of menu, or NULL if menu doesn’t have user data.

+

The user data of menu, or NULL if menu doesn’t have user data.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.insert.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.insert.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.insert.html 2026-04-16 17:54:32.295689300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.insert.html 2026-07-09 07:33:40.339720000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -190,7 +190,7 @@
item

Type: WebKitContextMenuItem

-

The WebKitContextMenuItem to add.

+

The WebKitContextMenuItem to add.

@@ -207,7 +207,7 @@
position

Type: gint

-

The position to insert the item.

+

The position to insert the item.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.last.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.last.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.last.html 2026-04-16 17:54:32.302689600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.last.html 2026-07-09 07:33:40.343266000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -185,15 +185,15 @@

Type: WebKitContextMenuItem

-

The last WebKitContextMenuItem of menu, - or NULL if the WebKitContextMenu is empty.

+

The last WebKitContextMenuItem of menu, + or NULL if the WebKitContextMenu is empty.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.move_item.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.move_item.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.move_item.html 2026-04-16 17:54:32.311689400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.move_item.html 2026-07-09 07:33:40.346894500 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -191,7 +191,7 @@
item

Type: WebKitContextMenuItem

-

The WebKitContextMenuItem to add.

+

The WebKitContextMenuItem to add.

@@ -208,7 +208,7 @@
position

Type: gint

-

The new position to move the item.

+

The new position to move the item.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.prepend.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.prepend.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.prepend.html 2026-04-16 17:54:32.318689600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.prepend.html 2026-07-09 07:33:40.351068300 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -186,7 +186,7 @@
item

Type: WebKitContextMenuItem

-

The WebKitContextMenuItem to add.

+

The WebKitContextMenuItem to add.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.remove.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.remove.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.remove.html 2026-04-16 17:54:32.325689600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.remove.html 2026-07-09 07:33:40.354198200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@
item

Type: WebKitContextMenuItem

-

The WebKitContextMenuItem to remove.

+

The WebKitContextMenuItem to remove.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.remove_all.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.remove_all.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.remove_all.html 2026-04-16 17:54:32.330689400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.remove_all.html 2026-07-09 07:33:40.356800800 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.set_user_data.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.set_user_data.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.set_user_data.html 2026-04-16 17:54:32.338689600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenu.set_user_data.html 2026-07-09 07:33:40.360176600 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -110,7 +110,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -189,7 +189,7 @@
user_data

Type: GVariant

-

A GVariant.

+

A GVariant.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_gaction.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_gaction.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_gaction.html 2026-04-16 17:54:32.476689800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_gaction.html 2026-07-09 07:33:40.405047000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,15 +169,15 @@

Type: GAction

-

The GAction associated to the WebKitContextMenuItem, - or NULL if item is a separator.

+

The GAction associated to the WebKitContextMenuItem, + or NULL if item is a separator.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_gaction_target.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_gaction_target.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_gaction_target.html 2026-04-16 17:54:32.485689600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_gaction_target.html 2026-07-09 07:33:40.408538800 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,16 +169,16 @@

Type: GVariant

-

The target GVariant of the WebKitContextMenuItem, +

The target GVariant of the WebKitContextMenuItem, or NULL if item was not created with webkit_context_menu_item_new_from_gaction() - or if no target was specified.

+ or if no target was specified.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_stock_action.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_stock_action.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_stock_action.html 2026-04-16 17:54:32.493689800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_stock_action.html 2026-07-09 07:33:40.412751200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -173,7 +173,7 @@

Type: WebKitContextMenuAction

-

The WebKitContextMenuAction of item.

+

The WebKitContextMenuAction of item.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_submenu.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_submenu.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_submenu.html 2026-04-16 17:54:32.500689700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_submenu.html 2026-07-09 07:33:40.416002000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,15 +169,15 @@

Type: WebKitContextMenu

-

The WebKitContextMenu representing the submenu of - item or NULL if item doesn’t have a submenu.

+

The WebKitContextMenu representing the submenu of + item or NULL if item doesn’t have a submenu.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_title.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_title.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_title.html 2026-04-16 17:54:32.509689800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.get_title.html 2026-07-09 07:33:40.562593200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,14 +169,14 @@

Type: const gchar*

-

The title of item, or NULL if item is a separator.

+

The title of item, or NULL if item is a separator.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.is_separator.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.is_separator.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.is_separator.html 2026-04-16 17:54:32.516689800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.is_separator.html 2026-07-09 07:33:40.566164700 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,7 +169,7 @@

Type: gboolean

-

TRUE is item is a separator or FALSE otherwise.

+

TRUE is item is a separator or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.set_submenu.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.set_submenu.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.set_submenu.html 2026-04-16 17:54:32.526689800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ContextMenuItem.set_submenu.html 2026-07-09 07:33:40.567502500 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -172,7 +172,7 @@
submenu

Type: WebKitContextMenu

-

A WebKitContextMenu.

+

A WebKitContextMenu.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_id.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_id.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_id.html 2026-04-16 17:54:32.596690000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_id.html 2026-07-09 07:33:40.593255300 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -167,7 +167,7 @@

Type: guint64

-

The identifier of frame.

+

The identifier of frame.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_js_context.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_js_context.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_js_context.html 2026-04-16 17:54:32.606690000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_js_context.html 2026-07-09 07:33:40.598949000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -166,14 +166,14 @@

Type: JSCContext

-

The JSCContext for the JavaScript execution context of frame.

+

The JSCContext for the JavaScript execution context of frame.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_js_context_for_script_world.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_js_context_for_script_world.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_js_context_for_script_world.html 2026-04-16 17:54:32.617689800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_js_context_for_script_world.html 2026-07-09 07:33:40.603721900 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -166,7 +166,7 @@
world

Type: WebKitScriptWorld

-

A WebKitScriptWorld.

+

A WebKitScriptWorld.

@@ -198,14 +198,14 @@

Type: JSCContext

-

The JSCContext for the JavaScript execution context of frame for world.

+

The JSCContext for the JavaScript execution context of frame for world.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_uri.html 2026-04-16 17:54:32.624689800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.get_uri.html 2026-07-09 07:33:40.607498600 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,15 +165,15 @@

Type: const gchar*

-

The current active URI of frame or NULL if nothing has been - loaded yet.

+

The current active URI of frame or NULL if nothing has been + loaded yet.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.is_main_frame.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.is_main_frame.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.is_main_frame.html 2026-04-16 17:54:32.631690000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.Frame.is_main_frame.html 2026-07-09 07:33:40.611401600 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@

Type: gboolean

-

TRUE if frame is a main frame or FALSE otherwise.

+

TRUE if frame is a main frame or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_editable.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_editable.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_editable.html 2026-04-16 17:54:32.721690000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_editable.html 2026-07-09 07:33:40.642070300 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -180,8 +180,8 @@

Type: gboolean

-

TRUE if there’s an editable element at the coordinates of the hit_test_result, - or FALSE otherwise.

+

TRUE if there’s an editable element at the coordinates of the hit_test_result, + or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_image.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_image.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_image.html 2026-04-16 17:54:32.736690000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_image.html 2026-07-09 07:33:40.649464400 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -180,8 +180,8 @@

Type: gboolean

-

TRUE if there’s an image element in the coordinates of the Hit Test, - or FALSE otherwise.

+

TRUE if there’s an image element in the coordinates of the Hit Test, + or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_link.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_link.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_link.html 2026-04-16 17:54:32.745690000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_link.html 2026-07-09 07:33:40.651500700 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -180,8 +180,8 @@

Type: gboolean

-

TRUE if there’s a link element in the coordinates of the Hit Test, - or FALSE otherwise.

+

TRUE if there’s a link element in the coordinates of the Hit Test, + or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_media.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_media.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_media.html 2026-04-16 17:54:32.753690000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_media.html 2026-07-09 07:33:40.661602700 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -180,8 +180,8 @@

Type: gboolean

-

TRUE if there’s a media element in the coordinates of the Hit Test, - or FALSE otherwise.

+

TRUE if there’s a media element in the coordinates of the Hit Test, + or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_scrollbar.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_scrollbar.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_scrollbar.html 2026-04-16 17:54:32.763690000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_scrollbar.html 2026-07-09 07:33:40.667583700 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -180,8 +180,8 @@

Type: gboolean

-

TRUE if there’s a scrollbar element at the coordinates of the hit_test_result, - or FALSE otherwise.

+

TRUE if there’s a scrollbar element at the coordinates of the hit_test_result, + or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_selection.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_selection.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_selection.html 2026-04-16 17:54:32.771690100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.context_is_selection.html 2026-07-09 07:33:40.674120700 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -180,8 +180,8 @@

Type: gboolean

-

TRUE if there’s a selected element at the coordinates of the hit_test_result, - or FALSE otherwise.

+

TRUE if there’s a selected element at the coordinates of the hit_test_result, + or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_context.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_context.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_context.html 2026-04-16 17:54:32.778690000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_context.html 2026-07-09 07:33:40.678885500 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,7 +187,7 @@

Type: guint

-

A bitmask of WebKitHitTestResultContext flags.

+

A bitmask of WebKitHitTestResultContext flags.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_image_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_image_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_image_uri.html 2026-04-16 17:54:32.785690000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_image_uri.html 2026-07-09 07:33:40.685371900 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,15 +187,15 @@

Type: const gchar*

-

The URI of the image element in the coordinates of the Hit Test, - or NULL if there isn’t an image element in hit_test_result context.

+

The URI of the image element in the coordinates of the Hit Test, + or NULL if there isn’t an image element in hit_test_result context.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_link_label.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_link_label.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_link_label.html 2026-04-16 17:54:32.793690200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_link_label.html 2026-07-09 07:33:40.690754000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,16 +187,16 @@

Type: const gchar*

-

The label of the link element in the coordinates of the Hit Test, +

The label of the link element in the coordinates of the Hit Test, or NULL if there isn’t a link element in hit_test_result context or the - link element doesn’t have a label.

+ link element doesn’t have a label.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_link_title.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_link_title.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_link_title.html 2026-04-16 17:54:32.816690200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_link_title.html 2026-07-09 07:33:40.694399600 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,16 +187,16 @@

Type: const gchar*

-

The title of the link element in the coordinates of the Hit Test, +

The title of the link element in the coordinates of the Hit Test, or NULL if there isn’t a link element in hit_test_result context or the - link element doesn’t have a title.

+ link element doesn’t have a title.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_link_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_link_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_link_uri.html 2026-04-16 17:54:32.831690300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_link_uri.html 2026-07-09 07:33:40.698620000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,15 +187,15 @@

Type: const gchar*

-

The URI of the link element in the coordinates of the Hit Test, - or NULL if there isn’t a link element in hit_test_result context.

+

The URI of the link element in the coordinates of the Hit Test, + or NULL if there isn’t a link element in hit_test_result context.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_media_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_media_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_media_uri.html 2026-04-16 17:54:32.839690200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.HitTestResult.get_media_uri.html 2026-07-09 07:33:40.702860000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -104,7 +104,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -187,15 +187,15 @@

Type: const gchar*

-

The URI of the media element in the coordinates of the Hit Test, - or NULL if there isn’t a media element in hit_test_result context.

+

The URI of the media element in the coordinates of the Hit Test, + or NULL if there isn’t a media element in hit_test_result context.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ScriptWorld.get_name.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ScriptWorld.get_name.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.ScriptWorld.get_name.html 2026-04-16 17:54:32.946690300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.ScriptWorld.get_name.html 2026-07-09 07:33:40.750422000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -157,14 +157,14 @@

Type: const char*

-

The name of world.

+

The name of world.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.get_http_headers.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.get_http_headers.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.get_http_headers.html 2026-04-16 17:54:33.022690500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.get_http_headers.html 2026-07-09 07:33:40.784378800 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -163,15 +163,15 @@

Type: SoupMessageHeaders

-

A SoupMessageHeaders with the HTTP headers of request - or NULL if request is not an HTTP request.

+

A SoupMessageHeaders with the HTTP headers of request + or NULL if request is not an HTTP request.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.get_http_method.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.get_http_method.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.get_http_method.html 2026-04-16 17:54:33.030690400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.get_http_method.html 2026-07-09 07:33:40.789555500 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -163,15 +163,15 @@

Type: const gchar*

-

The HTTP method of the WebKitURIRequest or NULL if request is not - an HTTP request.

+

The HTTP method of the WebKitURIRequest or NULL if request is not + an HTTP request.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.get_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.get_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.get_uri.html 2026-04-16 17:54:33.037690400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.get_uri.html 2026-07-09 07:33:40.792891300 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: const gchar*

-

Request URI, as a string.

+

Request URI, as a string.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.set_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.set_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.set_uri.html 2026-04-16 17:54:33.043690400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIRequest.set_uri.html 2026-07-09 07:33:40.795723000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -172,7 +172,7 @@
uri

Type: const gchar*

-

An URI.

+

An URI.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_content_length.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_content_length.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_content_length.html 2026-04-16 17:54:33.107690600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_content_length.html 2026-07-09 07:33:40.821075200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -176,7 +176,7 @@

Type: guint64

-

The expected content length of response.

+

The expected content length of response.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_http_headers.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_http_headers.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_http_headers.html 2026-04-16 17:54:33.115690700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_http_headers.html 2026-07-09 07:33:40.825105200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,15 +175,15 @@

Type: SoupMessageHeaders

-

A SoupMessageHeaders with the HTTP headers of response - or NULL if response is not an HTTP response.

+

A SoupMessageHeaders with the HTTP headers of response + or NULL if response is not an HTTP response.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_mime_type.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_mime_type.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_mime_type.html 2026-04-16 17:54:33.121690500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_mime_type.html 2026-07-09 07:33:40.827906400 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: const gchar*

-

MIME type, as a string.

+

MIME type, as a string.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_status_code.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_status_code.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_status_code.html 2026-04-16 17:54:33.128690700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_status_code.html 2026-07-09 07:33:40.831923700 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,7 +179,7 @@

Type: guint

-

The status code of response.

+

The status code of response.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_suggested_filename.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_suggested_filename.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_suggested_filename.html 2026-04-16 17:54:33.135690700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_suggested_filename.html 2026-07-09 07:33:40.835682400 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -177,15 +177,15 @@

Type: const gchar*

-

The suggested filename or NULL if - the ‘Content-Disposition’ HTTP header is not present.

+

The suggested filename or NULL if + the ‘Content-Disposition’ HTTP header is not present.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_uri.html 2026-04-16 17:54:33.141690700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.URIResponse.get_uri.html 2026-07-09 07:33:40.839222200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,14 +175,14 @@

Type: const gchar*

-

Response URI, as a string.

+

Response URI, as a string.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.get_fd_list.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.get_fd_list.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.get_fd_list.html 2026-04-16 17:54:33.232690800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.get_fd_list.html 2026-07-09 07:33:40.882303500 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: GUnixFDList

-

The message list of file descriptors.

+

The message list of file descriptors.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.get_name.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.get_name.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.get_name.html 2026-04-16 17:54:33.238690900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.get_name.html 2026-07-09 07:33:40.885055300 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: const char*

-

The message name.

+

The message name.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.get_parameters.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.get_parameters.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.get_parameters.html 2026-04-16 17:54:33.244690700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.get_parameters.html 2026-07-09 07:33:40.888608700 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,14 +171,14 @@

Type: GVariant

-

The message parameters.

+

The message parameters.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The return value can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.send_reply.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.send_reply.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.send_reply.html 2026-04-16 17:54:33.251690900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.UserMessage.send_reply.html 2026-07-09 07:33:40.892735200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -88,7 +88,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -166,7 +166,7 @@
reply

Type: WebKitUserMessage

-

A WebKitUserMessage to send as reply.

+

A WebKitUserMessage to send as reply.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebEditor.get_page.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebEditor.get_page.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebEditor.get_page.html 2026-04-16 17:54:33.321690800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebEditor.get_page.html 2026-07-09 07:33:40.915738300 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -157,14 +157,14 @@

Type: WebKitWebPage

-

The associated WebKitWebPage.

+

The associated WebKitWebPage.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_editable.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_editable.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_editable.html 2026-04-16 17:54:33.499691200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_editable.html 2026-07-09 07:33:41.018699400 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -121,7 +121,7 @@
-

since: 2.8

+

@@ -160,7 +160,7 @@
-

Available since: 2.8

+ @@ -183,7 +183,7 @@

Type: gboolean

-

TRUE if the hit test covers an editable element or FALSE otherwise.

+

TRUE if the hit test covers an editable element or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_image.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_image.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_image.html 2026-04-16 17:54:33.506691200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_image.html 2026-07-09 07:33:41.024707800 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -121,7 +121,7 @@
-

since: 2.8

+

@@ -160,7 +160,7 @@
-

Available since: 2.8

+ @@ -183,7 +183,7 @@

Type: gboolean

-

TRUE if the hit test covers an image element or FALSE otherwise.

+

TRUE if the hit test covers an image element or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_link.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_link.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_link.html 2026-04-16 17:54:33.513691200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_link.html 2026-07-09 07:33:41.030143300 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -121,7 +121,7 @@
-

since: 2.8

+

@@ -160,7 +160,7 @@
-

Available since: 2.8

+ @@ -183,7 +183,7 @@

Type: gboolean

-

TRUE if the hit test covers a link element or FALSE otherwise.

+

TRUE if the hit test covers a link element or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_media.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_media.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_media.html 2026-04-16 17:54:33.521691000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_media.html 2026-07-09 07:33:41.034302200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -121,7 +121,7 @@
-

since: 2.8

+

@@ -160,7 +160,7 @@
-

Available since: 2.8

+ @@ -183,7 +183,7 @@

Type: gboolean

-

TRUE if the hit test covers a media element or FALSE otherwise.

+

TRUE if the hit test covers a media element or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_scrollbar.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_scrollbar.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_scrollbar.html 2026-04-16 17:54:33.528691000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_scrollbar.html 2026-07-09 07:33:41.037346400 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -121,7 +121,7 @@
-

since: 2.8

+

@@ -160,7 +160,7 @@
-

Available since: 2.8

+ @@ -183,7 +183,7 @@

Type: gboolean

-

TRUE if the hit test covers a scrollbar or FALSE otherwise.

+

TRUE if the hit test covers a scrollbar or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_selection.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_selection.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_selection.html 2026-04-16 17:54:33.535691300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.context_is_selection.html 2026-07-09 07:33:41.040782200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -121,7 +121,7 @@
-

since: 2.8

+

@@ -160,7 +160,7 @@
-

Available since: 2.8

+ @@ -183,7 +183,7 @@

Type: gboolean

-

TRUE if the hit test covers a selected element or FALSE otherwise.

+

TRUE if the hit test covers a selected element or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_context.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_context.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_context.html 2026-04-16 17:54:33.541691300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_context.html 2026-07-09 07:33:41.043888800 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -121,7 +121,7 @@
-

since: 2.8

+

@@ -158,7 +158,7 @@
-

Available since: 2.8

+ @@ -181,7 +181,7 @@

Type: guint

-

A bitmask of WebKitHitTestResultContext flags.

+

A bitmask of WebKitHitTestResultContext flags.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_image_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_image_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_image_uri.html 2026-04-16 17:54:33.548691300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_image_uri.html 2026-07-09 07:33:41.047386200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -121,7 +121,7 @@
-

since: 2.8

+

@@ -158,7 +158,7 @@
-

Available since: 2.8

+ @@ -181,14 +181,14 @@

Type: const gchar*

-

The URI of the image element, or NULL if the hit test does not cover an image element.

+

The URI of the image element, or NULL if the hit test does not cover an image element.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_js_node.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_js_node.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_js_node.html 2026-04-16 17:54:33.557691000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_js_node.html 2026-07-09 07:33:41.051780500 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -182,7 +182,7 @@
world

Type: WebKitScriptWorld

-

A WebKitScriptWorld, or NULL to use the default.

+

A WebKitScriptWorld, or NULL to use the default.

@@ -214,14 +214,14 @@

Type: JSCValue

-

A JSCValue for the DOM node, or NULL.

+

A JSCValue for the DOM node, or NULL.

The argument can be NULL.
- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
The return value can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_link_label.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_link_label.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_link_label.html 2026-04-16 17:54:33.563691100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_link_label.html 2026-07-09 07:33:41.055636200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -121,7 +121,7 @@
-

since: 2.8

+

@@ -158,7 +158,7 @@
-

Available since: 2.8

+ @@ -181,15 +181,15 @@

Type: const gchar*

-

The label of the link element, or NULL if the hit test does not cover a link element - or the link element does not have a label.

+

The label of the link element, or NULL if the hit test does not cover a link element + or the link element does not have a label.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_link_title.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_link_title.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_link_title.html 2026-04-16 17:54:33.570691300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_link_title.html 2026-07-09 07:33:41.058755900 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -121,7 +121,7 @@
-

since: 2.8

+

@@ -158,7 +158,7 @@
-

Available since: 2.8

+ @@ -181,15 +181,15 @@

Type: const gchar*

-

The title of the link element, or NULL if the hit test does not cover a link element - or the link element does not have a title.

+

The title of the link element, or NULL if the hit test does not cover a link element + or the link element does not have a title.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_link_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_link_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_link_uri.html 2026-04-16 17:54:33.577691300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_link_uri.html 2026-07-09 07:33:41.062616000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -121,7 +121,7 @@
-

since: 2.8

+

@@ -158,7 +158,7 @@
-

Available since: 2.8

+ @@ -181,14 +181,14 @@

Type: const gchar*

-

The URI of the link element, or NULL if the hit test does not cover a link element.

+

The URI of the link element, or NULL if the hit test does not cover a link element.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_media_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_media_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_media_uri.html 2026-04-16 17:54:33.584691300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebHitTestResult.get_media_uri.html 2026-07-09 07:33:41.065952800 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -121,7 +121,7 @@
-

since: 2.8

+

@@ -158,7 +158,7 @@
-

Available since: 2.8

+ @@ -181,14 +181,14 @@

Type: const gchar*

-

The URI of the media element, or NULL if the hit test does not cover a media element.

+

The URI of the media element, or NULL if the hit test does not cover a media element.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_editor.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_editor.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_editor.html 2026-04-16 17:54:33.643691300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_editor.html 2026-07-09 07:33:41.089961000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,14 +169,14 @@

Type: WebKitWebEditor

-

The WebKitWebEditor.

+

The WebKitWebEditor.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_form_manager.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_form_manager.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_form_manager.html 2026-04-16 17:54:33.652691400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_form_manager.html 2026-07-09 07:33:41.096203800 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -170,7 +170,7 @@
world

Type: WebKitScriptWorld

-

A WebKitScriptWorld.

+

A WebKitScriptWorld.

@@ -202,14 +202,14 @@

Type: WebKitWebFormManager

-

A WebKitWebFormManager.

+

A WebKitWebFormManager.

The argument can be NULL.
- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_id.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_id.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_id.html 2026-04-16 17:54:33.658691400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_id.html 2026-07-09 07:33:41.102420800 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -169,7 +169,7 @@

Type: guint64

-

The identifier of web_page.

+

The identifier of web_page.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_main_frame.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_main_frame.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_main_frame.html 2026-04-16 17:54:33.665691400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_main_frame.html 2026-07-09 07:33:41.108910000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -170,14 +170,14 @@

Type: WebKitFrame

-

The WebKitFrame that is the main frame of web_page.

+

The WebKitFrame that is the main frame of web_page.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_uri.html 2026-04-16 17:54:33.673691300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.get_uri.html 2026-07-09 07:33:41.114807100 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -179,15 +179,15 @@

Type: const gchar*

-

The current active URI of web_view or NULL if nothing has been - loaded yet.

+

The current active URI of web_view or NULL if nothing has been + loaded yet.

- +
The data is owned by the instance.
The returned data is owned by the instance.
The value is a NUL terminated UTF-8 string.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.send_message_to_view.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.send_message_to_view.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.send_message_to_view.html 2026-04-16 17:54:33.687691500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.send_message_to_view.html 2026-07-09 07:33:41.126330000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -176,7 +176,7 @@
message

Type: WebKitUserMessage

-

A WebKitUserMessage.

+

A WebKitUserMessage.

@@ -193,7 +193,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -210,7 +210,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the request is satisfied or NULL.

+

A GAsyncReadyCallback to call when the request is satisfied or NULL.

The argument can be NULL.
@@ -227,7 +227,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.send_message_to_view_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.send_message_to_view_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.send_message_to_view_finish.html 2026-04-16 17:54:33.695691300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebPage.send_message_to_view_finish.html 2026-07-09 07:33:41.132820400 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -94,7 +94,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,7 +171,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -215,14 +215,14 @@

Type: WebKitUserMessage

-

A WebKitUserMessage with the reply or NULL in case of error.

+

A WebKitUserMessage with the reply or NULL in case of error.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebProcessExtension.get_page.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebProcessExtension.get_page.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebProcessExtension.get_page.html 2026-04-16 17:54:33.820691600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebProcessExtension.get_page.html 2026-07-09 07:33:41.209051100 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -162,7 +162,7 @@
page_id

Type: guint64

-

The identifier of the WebKitWebPage to get.

+

The identifier of the WebKitWebPage to get.

@@ -194,15 +194,15 @@

Type: WebKitWebPage

-

The WebKitWebPage for the given page_id, or NULL if the - identifier doesn’t correspond to an existing web page.

+

The WebKitWebPage for the given page_id, or NULL if the + identifier doesn’t correspond to an existing web page.

- +
The data is owned by the instance.
The returned data is owned by the instance.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebProcessExtension.send_message_to_context.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebProcessExtension.send_message_to_context.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebProcessExtension.send_message_to_context.html 2026-04-16 17:54:33.834691500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebProcessExtension.send_message_to_context.html 2026-07-09 07:33:41.214694300 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -168,7 +168,7 @@
message

Type: WebKitUserMessage

-

A WebKitUserMessage.

+

A WebKitUserMessage.

@@ -185,7 +185,7 @@
cancellable

Type: GCancellable

-

A GCancellable or NULL to ignore.

+

A GCancellable or NULL to ignore.

@@ -202,7 +202,7 @@
callback

Type: GAsyncReadyCallback

-

A GAsyncReadyCallback to call when the request is satisfied or NULL.

+

A GAsyncReadyCallback to call when the request is satisfied or NULL.

The argument can be NULL.
@@ -219,7 +219,7 @@
user_data

Type: gpointer

-

The data to pass to callback function.

+

The data to pass to callback function.

The argument can be NULL.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebProcessExtension.send_message_to_context_finish.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebProcessExtension.send_message_to_context_finish.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/method.WebProcessExtension.send_message_to_context_finish.html 2026-04-16 17:54:33.842691700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/method.WebProcessExtension.send_message_to_context_finish.html 2026-07-09 07:33:41.219076600 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -163,7 +163,7 @@
result

Type: GAsyncResult

-

A GAsyncResult.

+

A GAsyncResult.

The argument can be NULL.
@@ -207,14 +207,14 @@

Type: WebKitUserMessage

-

A WebKitUserMessage with the reply or NULL in case of error.

+

A WebKitUserMessage with the reply or NULL in case of error.

- +
The caller of the method takes ownership of the data, and is responsible for freeing it.
The caller of the method takes ownership of the returned data, and is responsible for freeing it.
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.context.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.context.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.context.html 2026-04-16 17:54:32.843690200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.context.html 2026-07-09 07:33:40.704539800 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -141,8 +141,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.image-uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.image-uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.image-uri.html 2026-04-16 17:54:32.848366000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.image-uri.html 2026-07-09 07:33:40.705959300 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -141,8 +141,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.link-label.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.link-label.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.link-label.html 2026-04-16 17:54:32.851192200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.link-label.html 2026-07-09 07:33:40.707275600 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -141,8 +141,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.link-title.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.link-title.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.link-title.html 2026-04-16 17:54:32.854364200 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.link-title.html 2026-07-09 07:33:40.708740700 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -141,8 +141,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.link-uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.link-uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.link-uri.html 2026-04-16 17:54:32.857150000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.link-uri.html 2026-07-09 07:33:40.710104700 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -141,8 +141,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.media-uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.media-uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.media-uri.html 2026-04-16 17:54:32.858690300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.HitTestResult.media-uri.html 2026-07-09 07:33:40.712018000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -141,8 +141,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.URIRequest.uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIRequest.uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.URIRequest.uri.html 2026-04-16 17:54:33.047690400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIRequest.uri.html 2026-07-09 07:33:40.797142700 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -97,7 +97,7 @@
-

unstable since: 6.0

+

@@ -130,8 +130,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.content-length.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.content-length.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.content-length.html 2026-04-16 17:54:33.144690800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.content-length.html 2026-07-09 07:33:40.840328700 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -140,8 +140,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.http-headers.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.http-headers.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.http-headers.html 2026-04-16 17:54:33.148570000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.http-headers.html 2026-07-09 07:33:40.841633000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.mime-type.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.mime-type.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.mime-type.html 2026-04-16 17:54:33.149690600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.mime-type.html 2026-07-09 07:33:40.842601000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -140,8 +140,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.status-code.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.status-code.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.status-code.html 2026-04-16 17:54:33.153115700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.status-code.html 2026-07-09 07:33:40.843598400 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -140,8 +140,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.suggested-filename.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.suggested-filename.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.suggested-filename.html 2026-04-16 17:54:33.155336100 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.suggested-filename.html 2026-07-09 07:33:40.845072700 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -140,8 +140,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.uri.html 2026-04-16 17:54:33.156690600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.URIResponse.uri.html 2026-07-09 07:33:40.846089100 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -92,7 +92,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -107,7 +107,7 @@
-

unstable since: 6.0

+

@@ -140,8 +140,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.UserMessage.fd-list.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.UserMessage.fd-list.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.UserMessage.fd-list.html 2026-04-16 17:54:33.255354000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.UserMessage.fd-list.html 2026-07-09 07:33:40.893762800 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.UserMessage.name.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.UserMessage.name.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.UserMessage.name.html 2026-04-16 17:54:33.256690700 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.UserMessage.name.html 2026-07-09 07:33:40.894681000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.UserMessage.parameters.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.UserMessage.parameters.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.UserMessage.parameters.html 2026-04-16 17:54:33.260642500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.UserMessage.parameters.html 2026-07-09 07:33:40.896100800 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.WebPage.uri.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.WebPage.uri.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/property.WebPage.uri.html 2026-04-16 17:54:33.700099500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/property.WebPage.uri.html 2026-07-09 07:33:41.135160700 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -97,7 +97,7 @@
-

unstable since: 6.0

+

@@ -130,8 +130,6 @@ - Available since:6.0 -

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.ScriptWorld.window-object-cleared.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.ScriptWorld.window-object-cleared.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.ScriptWorld.window-object-cleared.html 2026-04-16 17:54:32.956690300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.ScriptWorld.window-object-cleared.html 2026-07-09 07:33:40.756086300 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -165,7 +165,7 @@
page

Type: WebKitWebPage

-

A WebKitWebPage.

+

A WebKitWebPage.

@@ -182,7 +182,7 @@
frame

Type: WebKitFrame

-

The WebKitFrame to which world belongs.

+

The WebKitFrame to which world belongs.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebEditor.selection-changed.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebEditor.selection-changed.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebEditor.selection-changed.html 2026-04-16 17:54:33.326691000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebEditor.selection-changed.html 2026-07-09 07:33:40.918433200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebFormManager.form-controls-associated.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebFormManager.form-controls-associated.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebFormManager.form-controls-associated.html 2026-04-16 17:54:33.419691000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebFormManager.form-controls-associated.html 2026-07-09 07:33:40.965925200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -172,7 +172,7 @@
frame

Type: WebKitFrame

-

A WebKitFrame.

+

A WebKitFrame.

@@ -189,8 +189,8 @@
elements

Type: An array of JSCValue*

-

A GPtrArray of - JSCValue with the list of forms in the page.

+

A GPtrArray of + JSCValue with the list of forms in the page.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebFormManager.will-send-submit-event.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebFormManager.will-send-submit-event.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebFormManager.will-send-submit-event.html 2026-04-16 17:54:33.433691000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebFormManager.will-send-submit-event.html 2026-07-09 07:33:40.977442500 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -178,7 +178,7 @@
form

Type: JSCValue

-

The JSCValue to be submitted, which will always correspond to an HTMLFormElement.

+

The JSCValue to be submitted, which will always correspond to an HTMLFormElement.

@@ -195,7 +195,7 @@
source_frame

Type: WebKitFrame

-

The WebKitFrame containing the form to be submitted.

+

The WebKitFrame containing the form to be submitted.

@@ -212,8 +212,8 @@
target_frame

Type: WebKitFrame

-

The WebKitFrame containing the form’s target, - which may be the same as source_frame if no target was specified.

+

The WebKitFrame containing the form’s target, + which may be the same as source_frame if no target was specified.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebFormManager.will-submit-form.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebFormManager.will-submit-form.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebFormManager.will-submit-form.html 2026-04-16 17:54:33.446691000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebFormManager.will-submit-form.html 2026-07-09 07:33:40.988463200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -171,7 +171,7 @@
form

Type: JSCValue

-

The JSCValue to be submitted, which will always correspond to an HTMLFormElement.

+

The JSCValue to be submitted, which will always correspond to an HTMLFormElement.

@@ -188,7 +188,7 @@
source_frame

Type: WebKitFrame

-

The WebKitFrame containing the form to be submitted.

+

The WebKitFrame containing the form to be submitted.

@@ -205,8 +205,8 @@
target_frame

Type: WebKitFrame

-

The WebKitFrame containing the form’s target, - which may be the same as source_frame if no target was specified.

+

The WebKitFrame containing the form’s target, + which may be the same as source_frame if no target was specified.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.console-message-sent.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.console-message-sent.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.console-message-sent.html 2026-04-16 17:54:33.707691400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.console-message-sent.html 2026-07-09 07:33:41.140476200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -172,7 +172,7 @@
console_message

Type: WebKitConsoleMessage

-

The WebKitConsoleMessage.

+

The WebKitConsoleMessage.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.context-menu.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.context-menu.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.context-menu.html 2026-04-16 17:54:33.723691500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.context-menu.html 2026-07-09 07:33:41.154894400 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -177,7 +177,7 @@
context_menu

Type: WebKitContextMenu

-

The proposed WebKitContextMenu.

+

The proposed WebKitContextMenu.

@@ -194,7 +194,7 @@
hit_test_result

Type: WebKitWebHitTestResult

-

A WebKitWebHitTestResult.

+

A WebKitWebHitTestResult.

@@ -226,7 +226,7 @@

Type: gboolean

-

TRUE if the proposed context_menu has been modified, or FALSE otherwise.

+

TRUE if the proposed context_menu has been modified, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.document-loaded.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.document-loaded.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.document-loaded.html 2026-04-16 17:54:33.728691300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.document-loaded.html 2026-07-09 07:33:41.158666000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -105,7 +105,7 @@
-

unstable since: 6.0

+

@@ -147,8 +147,6 @@ -

-
Available since: 6.0
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.send-request.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.send-request.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.send-request.html 2026-04-16 17:54:33.741691400 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.send-request.html 2026-07-09 07:33:41.169858200 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -105,7 +105,7 @@
-

unstable since: 6.0

+

@@ -159,8 +159,6 @@ - Available since: 6.0 -

@@ -181,7 +179,7 @@
request

Type: WebKitURIRequest

-

A WebKitURIRequest.

+

A WebKitURIRequest.

@@ -198,7 +196,7 @@
redirected_response

Type: WebKitURIResponse

-

A WebKitURIResponse, or NULL.

+

A WebKitURIResponse, or NULL.

@@ -230,8 +228,8 @@

Type: gboolean

-

TRUE to stop other handlers from being invoked for the event. - FALSE to continue emission of the event.

+

TRUE to stop other handlers from being invoked for the event. + FALSE to continue emission of the event.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.user-message-received.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.user-message-received.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.user-message-received.html 2026-04-16 17:54:33.751691600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebPage.user-message-received.html 2026-07-09 07:33:41.176903500 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -90,7 +90,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -175,7 +175,7 @@
message

Type: WebKitUserMessage

-

The WebKitUserMessage received.

+

The WebKitUserMessage received.

@@ -207,7 +207,7 @@

Type: gboolean

-

TRUE if the message was handled, or FALSE otherwise.

+

TRUE if the message was handled, or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebProcessExtension.page-created.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebProcessExtension.page-created.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebProcessExtension.page-created.html 2026-04-16 17:54:33.849691600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebProcessExtension.page-created.html 2026-07-09 07:33:41.221520400 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -164,7 +164,7 @@
web_page

Type: WebKitWebPage

-

The WebKitWebPage created.

+

The WebKitWebPage created.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebProcessExtension.user-message-received.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebProcessExtension.user-message-received.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/signal.WebProcessExtension.user-message-received.html 2026-04-16 17:54:33.857691500 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/signal.WebProcessExtension.user-message-received.html 2026-07-09 07:33:41.224992300 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -84,7 +84,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -166,7 +166,7 @@
message

Type: WebKitUserMessage

-

The WebKitUserMessage received.

+

The WebKitUserMessage received.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/struct.ConsoleMessage.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/struct.ConsoleMessage.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/struct.ConsoleMessage.html 2026-04-16 17:54:31.693688600 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/struct.ConsoleMessage.html 2026-07-09 07:33:40.171510700 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -106,7 +106,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -122,7 +122,7 @@
-

unstable since: 6.0

+

@@ -138,7 +138,7 @@
- No description available. +

No description available.

@@ -146,8 +146,6 @@
-

Available since: 6.0

-
diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/style.css webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/style.css --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/style.css 2026-04-16 17:54:33.953360000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/style.css 2026-07-09 07:33:41.244386700 +0000 @@ -7,6 +7,8 @@ @import url("solarized-light.css") (prefers-color-scheme: light); @import url("solarized-dark.css") (prefers-color-scheme: dark); +@import url("fonts.css"); + /********************************* * LIGHT THEME *********************************/ diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/type_func.ScriptWorld.get_default.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/type_func.ScriptWorld.get_default.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/type_func.ScriptWorld.get_default.html 2026-04-16 17:54:32.940690300 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/type_func.ScriptWorld.get_default.html 2026-07-09 07:33:40.747196000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -159,7 +159,7 @@

Type: WebKitScriptWorld

-

The default WebKitScriptWorld.

+

The default WebKitScriptWorld.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/type_func.UserMessage.error_quark.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/type_func.UserMessage.error_quark.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/type_func.UserMessage.error_quark.html 2026-04-16 17:54:33.226690800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/type_func.UserMessage.error_quark.html 2026-07-09 07:33:40.879399300 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -82,7 +82,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -97,7 +97,7 @@
-

since: 2.28

+

@@ -131,7 +131,7 @@
-

Available since: 2.28

+ @@ -154,7 +154,7 @@

Type: GQuark

-

User message error domain.

+

User message error domain.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/type_func.WebFormManager.input_element_auto_fill.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/type_func.WebFormManager.input_element_auto_fill.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/type_func.WebFormManager.input_element_auto_fill.html 2026-04-16 17:54:33.386690900 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/type_func.WebFormManager.input_element_auto_fill.html 2026-07-09 07:33:40.945650600 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -163,7 +163,7 @@
element

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

@@ -180,7 +180,7 @@
value

Type: const char*

-

The text to set.

+

The text to set.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/type_func.WebFormManager.input_element_is_auto_filled.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/type_func.WebFormManager.input_element_is_auto_filled.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/type_func.WebFormManager.input_element_is_auto_filled.html 2026-04-16 17:54:33.398691000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/type_func.WebFormManager.input_element_is_auto_filled.html 2026-07-09 07:33:40.950824000 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -160,7 +160,7 @@
element

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

@@ -192,8 +192,8 @@

Type: gboolean

-

TRUE if element is an HTML input element that has been filled automatically, - or FALSE otherwise.

+

TRUE if element is an HTML input element that has been filled automatically, + or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/type_func.WebFormManager.input_element_is_user_edited.html webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/type_func.WebFormManager.input_element_is_user_edited.html --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/type_func.WebFormManager.input_element_is_user_edited.html 2026-04-16 17:54:33.409691000 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/type_func.WebFormManager.input_element_is_user_edited.html 2026-07-09 07:33:40.957857600 +0000 @@ -62,7 +62,7 @@

WebKitWebProcessExtension

API Version: 6.0

-

Library Version: 2.52.3

+

Library Version: 2.52.5

@@ -86,7 +86,7 @@
-

Generated by gi-docgen 2023.3

+

Generated by gi-docgen 2023.4

@@ -160,7 +160,7 @@
element

Type: JSCValue

-

A JSCValue.

+

A JSCValue.

@@ -192,8 +192,8 @@

Type: gboolean

-

TRUE if element is an HTML text input element that has been edited by a user action, - or FALSE otherwise.

+

TRUE if element is an HTML text input element that has been edited by a user action, + or FALSE otherwise.

diff -Nru webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/webkitgtk-web-process-extension-6.0.devhelp2 webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/webkitgtk-web-process-extension-6.0.devhelp2 --- webkit2gtk-2.52.3/Documentation/webkitgtk-web-process-extension-6.0/webkitgtk-web-process-extension-6.0.devhelp2 2026-04-16 17:54:33.945691800 +0000 +++ webkit2gtk-2.52.5/Documentation/webkitgtk-web-process-extension-6.0/webkitgtk-web-process-extension-6.0.devhelp2 2026-07-09 07:33:41.242364200 +0000 @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff -Nru webkit2gtk-2.52.3/NEWS webkit2gtk-2.52.5/NEWS --- webkit2gtk-2.52.3/NEWS 2026-04-16 17:22:34.122377600 +0000 +++ webkit2gtk-2.52.5/NEWS 2026-07-09 08:19:57.849771700 +0000 @@ -1,4 +1,37 @@ ================ +WebKitGTK 2.52.5 +================ + +What's new in WebKitGTK 2.52.5? + + - Fire scrollend event for instant programmatic scrolls. + - Increase network idle connection timeout to 115 seconds. + - Add User-Agent quirk for HBO Max. + - Fix the build with system malloc. + - Fix several crashes and rendering issues. + +================ +WebKitGTK 2.52.4 +================ + +What's new in WebKitGTK 2.52.4? + + - Add support for half-width fonts. + - Improve content filter compilation by avoiding file copies. + - Improve handling of out of disk space conditions when the NetworkProcess + tried to write data in caches. + - Improve how the CMake build system checks whether libatomic is required. + - Fix painting scrollbars when their width changes. + - Fix playback of certain YouTube videos with low frame rates. + - Fix webkit://gpu not working in systems where neither libGL.so.1 + nor libOpenGL.so.0 are available. + - Fix the build with librice 0.4 or newer when the GStreamer WebRTC + backend is enabled at build configuration time. + - Fix the build with USE_GSTREAMER_WEBRTC=OFF. + - Fix the build with USE_GBM=OFF. + - Fix several crashes and rendering issues. + +================ WebKitGTK 2.52.3 ================ diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/CMakeLists.txt webkit2gtk-2.52.5/Source/JavaScriptCore/CMakeLists.txt --- webkit2gtk-2.52.3/Source/JavaScriptCore/CMakeLists.txt 2026-02-23 14:40:52.207318300 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/CMakeLists.txt 2026-07-09 07:12:41.740804000 +0000 @@ -265,7 +265,7 @@ OUTPUT ${JavaScriptCore_DERIVED_SOURCES_DIR}/Bytecodes.h ${JavaScriptCore_DERIVED_SOURCES_DIR}/InitBytecodes.asm ${JavaScriptCore_DERIVED_SOURCES_DIR}/BytecodeStructs.h ${JavaScriptCore_DERIVED_SOURCES_DIR}/BytecodeIndices.h ${JavaScriptCore_DERIVED_SOURCES_DIR}/BytecodeDumperGenerated.cpp MAIN_DEPENDENCY ${JAVASCRIPTCORE_DIR}/generator/main.rb DEPENDS ${GENERATOR} bytecode/BytecodeList.rb ${JAVASCRIPTCORE_DIR}/wasm/wasm.json - COMMAND ${RUBY_EXECUTABLE} ${JAVASCRIPTCORE_DIR}/generator/main.rb --bytecodes_h ${JavaScriptCore_DERIVED_SOURCES_DIR}/Bytecodes.h --init_bytecodes_asm ${JavaScriptCore_DERIVED_SOURCES_DIR}/InitBytecodes.asm --bytecode_structs_h ${JavaScriptCore_DERIVED_SOURCES_DIR}/BytecodeStructs.h --bytecode_indices_h ${JavaScriptCore_DERIVED_SOURCES_DIR}/BytecodeIndices.h ${JAVASCRIPTCORE_DIR}/bytecode/BytecodeList.rb --wasm_json ${JAVASCRIPTCORE_DIR}/wasm/wasm.json --bytecode_dumper ${JavaScriptCore_DERIVED_SOURCES_DIR}/BytecodeDumperGenerated.cpp + COMMAND ${Ruby_EXECUTABLE} ${JAVASCRIPTCORE_DIR}/generator/main.rb --bytecodes_h ${JavaScriptCore_DERIVED_SOURCES_DIR}/Bytecodes.h --init_bytecodes_asm ${JavaScriptCore_DERIVED_SOURCES_DIR}/InitBytecodes.asm --bytecode_structs_h ${JavaScriptCore_DERIVED_SOURCES_DIR}/BytecodeStructs.h --bytecode_indices_h ${JavaScriptCore_DERIVED_SOURCES_DIR}/BytecodeIndices.h ${JAVASCRIPTCORE_DIR}/bytecode/BytecodeList.rb --wasm_json ${JAVASCRIPTCORE_DIR}/wasm/wasm.json --bytecode_dumper ${JavaScriptCore_DERIVED_SOURCES_DIR}/BytecodeDumperGenerated.cpp VERBATIM) add_custom_target(Bytecodes DEPENDS "${JavaScriptCore_DERIVED_SOURCES_DIR}/Bytecodes.h") @@ -296,7 +296,7 @@ OUTPUT ${JavaScriptCore_DERIVED_SOURCES_DIR}/AirOpcode.h ${JavaScriptCore_DERIVED_SOURCES_DIR}/AirOpcodeGenerated.h MAIN_DEPENDENCY ${JAVASCRIPTCORE_DIR}/b3/air/AirOpcode.opcodes DEPENDS ${JAVASCRIPTCORE_DIR}/b3/air/opcode_generator.rb - COMMAND ${RUBY_EXECUTABLE} ${JAVASCRIPTCORE_DIR}/b3/air/opcode_generator.rb ${JAVASCRIPTCORE_DIR}/b3/air/AirOpcode.opcodes VERBATIM + COMMAND ${Ruby_EXECUTABLE} ${JAVASCRIPTCORE_DIR}/b3/air/opcode_generator.rb ${JAVASCRIPTCORE_DIR}/b3/air/AirOpcode.opcodes VERBATIM WORKING_DIRECTORY ${JavaScriptCore_DERIVED_SOURCES_DIR} ) @@ -309,14 +309,14 @@ OUTPUT ${JavaScriptCore_DERIVED_SOURCES_DIR}/LLIntDesiredSettings.h MAIN_DEPENDENCY ${JAVASCRIPTCORE_DIR}/offlineasm/generate_settings_extractor.rb DEPENDS ${LLINT_ASM} ${OFFLINE_ASM} ${JavaScriptCore_DERIVED_SOURCES_DIR}/InitBytecodes.asm - COMMAND ${RUBY_EXECUTABLE} ${JAVASCRIPTCORE_DIR}/offlineasm/generate_settings_extractor.rb -I${JavaScriptCore_DERIVED_SOURCES_DIR}/ ${JAVASCRIPTCORE_DIR}/llint/LowLevelInterpreter.asm ${JavaScriptCore_DERIVED_SOURCES_DIR}/LLIntDesiredSettings.h ${OFFLINE_ASM_BACKEND} + COMMAND ${Ruby_EXECUTABLE} ${JAVASCRIPTCORE_DIR}/offlineasm/generate_settings_extractor.rb -I${JavaScriptCore_DERIVED_SOURCES_DIR}/ ${JAVASCRIPTCORE_DIR}/llint/LowLevelInterpreter.asm ${JavaScriptCore_DERIVED_SOURCES_DIR}/LLIntDesiredSettings.h ${OFFLINE_ASM_BACKEND} VERBATIM) add_custom_command( OUTPUT ${JavaScriptCore_DERIVED_SOURCES_DIR}/LLIntDesiredOffsets.h MAIN_DEPENDENCY ${JAVASCRIPTCORE_DIR}/offlineasm/generate_offset_extractor.rb DEPENDS LLIntSettingsExtractor ${LLINT_ASM} ${OFFLINE_ASM} ${JavaScriptCore_DERIVED_SOURCES_DIR}/InitBytecodes.asm ${JavaScriptCore_DERIVED_SOURCES_DIR}/AirOpcode.h ${JavaScriptCore_DERIVED_SOURCES_DIR}/WasmOps.h - COMMAND ${RUBY_EXECUTABLE} ${JAVASCRIPTCORE_DIR}/offlineasm/generate_offset_extractor.rb -I${JavaScriptCore_DERIVED_SOURCES_DIR}/ ${JAVASCRIPTCORE_DIR}/llint/LowLevelInterpreter.asm $ ${JavaScriptCore_DERIVED_SOURCES_DIR}/LLIntDesiredOffsets.h ${OFFLINE_ASM_BACKEND} ${BUILD_VARIANTS} + COMMAND ${Ruby_EXECUTABLE} ${JAVASCRIPTCORE_DIR}/offlineasm/generate_offset_extractor.rb -I${JavaScriptCore_DERIVED_SOURCES_DIR}/ ${JAVASCRIPTCORE_DIR}/llint/LowLevelInterpreter.asm $ ${JavaScriptCore_DERIVED_SOURCES_DIR}/LLIntDesiredOffsets.h ${OFFLINE_ASM_BACKEND} ${BUILD_VARIANTS} VERBATIM) # JSCBuiltins @@ -406,8 +406,16 @@ $ "${JavaScriptCore_PRIVATE_FRAMEWORK_HEADERS_DIR}/JavaScriptCore" ) -set(LLIntSettingsExtractor_FRAMEWORKS ${JavaScriptCore_FRAMEWORKS}) -set(LLIntSettingsExtractor_DEPENDENCIES JavaScriptCore_CopyHeaders JavaScriptCore_CopyPrivateHeaders) + +set(LLIntSettingsExtractor_FRAMEWORKS) +set(LLIntSettingsExtractor_DEPENDENCIES + JavaScriptCore_CopyHeaders + JavaScriptCore_CopyPrivateHeaders + WTF_CopyHeaders +) +if (NOT USE_SYSTEM_MALLOC) + list(APPEND LLIntSettingsExtractor_DEPENDENCIES bmalloc_CopyHeaders) +endif () WEBKIT_EXECUTABLE(LLIntSettingsExtractor) # LLIntSettingsExtractor target needs to have a direct or indirect @@ -426,8 +434,17 @@ $ "${JavaScriptCore_PRIVATE_FRAMEWORK_HEADERS_DIR}/JavaScriptCore" ) -set(LLIntOffsetsExtractor_FRAMEWORKS ${JavaScriptCore_FRAMEWORKS}) -set(LLIntOffsetsExtractor_DEPENDENCIES JavaScriptCore_CopyHeaders JavaScriptCore_CopyPrivateHeaders JSCBuiltins) + +set(LLIntOffsetsExtractor_FRAMEWORKS) +set(LLIntOffsetsExtractor_DEPENDENCIES + JSCBuiltins + JavaScriptCore_CopyHeaders + JavaScriptCore_CopyPrivateHeaders + WTF_CopyHeaders +) +if (NOT USE_SYSTEM_MALLOC) + list(APPEND LLIntOffsetsExtractor_DEPENDENCIES bmalloc_CopyHeaders) +endif () WEBKIT_EXECUTABLE(LLIntOffsetsExtractor) # The build system will execute asm.rb every time LLIntOffsetsExtractor's mtime is newer than @@ -450,7 +467,7 @@ OUTPUT ${JavaScriptCore_DERIVED_SOURCES_DIR}/${LLIntOutput} MAIN_DEPENDENCY ${JAVASCRIPTCORE_DIR}/offlineasm/asm.rb DEPENDS LLIntOffsetsExtractor ${LLINT_ASM} ${OFFLINE_ASM} ${JavaScriptCore_DERIVED_SOURCES_DIR}/InitBytecodes.asm - COMMAND ${CMAKE_COMMAND} -E env CMAKE_CXX_COMPILER_ID=${CMAKE_CXX_COMPILER_ID} GCC_OFFLINEASM_SOURCE_MAP=${GCC_OFFLINEASM_SOURCE_MAP} ${RUBY_EXECUTABLE} ${JAVASCRIPTCORE_DIR}/offlineasm/asm.rb -I${JavaScriptCore_DERIVED_SOURCES_DIR}/ ${JAVASCRIPTCORE_DIR}/llint/LowLevelInterpreter.asm $ ${JavaScriptCore_DERIVED_SOURCES_DIR}/${LLIntOutput} ${BUILD_VARIANTS} ${OFFLINE_ASM_ARGS} + COMMAND ${CMAKE_COMMAND} -E env CMAKE_CXX_COMPILER_ID=${CMAKE_CXX_COMPILER_ID} GCC_OFFLINEASM_SOURCE_MAP=${GCC_OFFLINEASM_SOURCE_MAP} ${Ruby_EXECUTABLE} ${JAVASCRIPTCORE_DIR}/offlineasm/asm.rb -I${JavaScriptCore_DERIVED_SOURCES_DIR}/ ${JAVASCRIPTCORE_DIR}/llint/LowLevelInterpreter.asm $ ${JavaScriptCore_DERIVED_SOURCES_DIR}/${LLIntOutput} ${BUILD_VARIANTS} ${OFFLINE_ASM_ARGS} COMMAND ${CMAKE_COMMAND} -E touch_nocreate ${JavaScriptCore_DERIVED_SOURCES_DIR}/${LLIntOutput} WORKING_DIRECTORY ${JavaScriptCore_DERIVED_SOURCES_DIR} VERBATIM) @@ -1071,7 +1088,6 @@ runtime/DateInstance.h runtime/DateInstanceCache.h runtime/DeferredWorkTimer.h - runtime/DeferredWorkTimerInlines.h runtime/DeferTermination.h runtime/DefinePropertyAttributes.h runtime/DeletePropertySlot.h @@ -1633,14 +1649,7 @@ WEBKIT_FRAMEWORK_DECLARE(JavaScriptCore) WEBKIT_INCLUDE_CONFIG_FILES_IF_EXISTS() - -if (NOT WIN32) - WEBKIT_ADD_TARGET_CXX_FLAGS(JavaScriptCore - -Wunsafe-buffer-usage - -Wunsafe-buffer-usage-in-libc-call - -fsafe-buffer-usage-suggestions - ) -endif () +WEBKIT_ADD_TARGET_UNSAFE_BUFFER_WARNINGS(JavaScriptCore) if (COMPILER_IS_GCC_OR_CLANG) # Avoid using fused multiply-add instructions since this could give different results @@ -1682,7 +1691,7 @@ if (CMAKE_COMPILER_IS_GNUCXX AND GCC_OFFLINEASM_SOURCE_MAP) message(STATUS "Enabling asm postprocessing") - set(LowLevelInterpreter_LAUNCHER "${RUBY_EXECUTABLE} ${JavaScriptCore_SCRIPTS_SOURCES_DIR}/postprocess-asm") + set(LowLevelInterpreter_LAUNCHER "${Ruby_EXECUTABLE} ${JavaScriptCore_SCRIPTS_SOURCES_DIR}/postprocess-asm") get_target_property(PROP_RULE_LAUNCH_COMPILE LowLevelInterpreterLib RULE_LAUNCH_COMPILE) if (PROP_RULE_LAUNCH_COMPILE) set(LowLevelInterpreter_LAUNCHER "${LowLevelInterpreter_LAUNCHER} ${PROP_RULE_LAUNCH_COMPILE}") @@ -1724,14 +1733,7 @@ add_custom_target(JavaScriptCoreSharedScripts DEPENDS ${JavaScriptCore_SCRIPTS}) add_dependencies(JavaScriptCore JavaScriptCoreSharedScripts ${JavaScriptCore_EXTRA_DEPENDENCIES}) - -if (CMAKE_GENERATOR MATCHES "Visual Studio") - # JavaScriptCoreSharedScripts and JSCBuiltins targets need to have - # a direct or indirect dependency for CMake Visual Studio - # generator to eliminate duplicated custom commands. Otherwise, - # JavaScriptCore_SCRIPTS will be generated in both projects. - add_dependencies(JavaScriptCoreSharedScripts JSCBuiltins) -endif () +add_dependencies(JavaScriptCoreSharedScripts JSCBuiltins) if (ENABLE_JAVASCRIPT_SHELL) add_subdirectory(shell) diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/assembler/AssemblerBuffer.h webkit2gtk-2.52.5/Source/JavaScriptCore/assembler/AssemblerBuffer.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/assembler/AssemblerBuffer.h 2026-02-23 14:40:52.220318300 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/assembler/AssemblerBuffer.h 2026-07-09 07:12:41.744804000 +0000 @@ -211,7 +211,8 @@ void grow(unsigned extraCapacity = 0) { - m_capacity = m_capacity + m_capacity / 2 + extraCapacity; + auto capacity = Checked(m_capacity) + m_capacity / 2 + extraCapacity; + m_capacity = capacity.value(); if (isInlineBuffer()) { m_buffer = static_cast(AssemblerDataMalloc::malloc(m_capacity)); memcpy(m_buffer, m_inlineBuffer, InlineCapacity); @@ -325,7 +326,6 @@ public: AssemblerBuffer() : m_storage() - , m_index(0) #if ENABLE(JIT_SIGN_ASSEMBLER_BUFFER) , m_hash() , m_hashes() @@ -345,7 +345,7 @@ bool isAvailable(unsigned space) { - return m_index + space <= m_storage.capacity(); + return static_cast(m_index) + space <= m_storage.capacity(); } void ensureSpace(unsigned space) @@ -444,7 +444,7 @@ void putIntegralUnchecked(IntegralType value) { WTF_ALLOW_UNSAFE_BUFFER_USAGE_BEGIN - ASSERT(m_index + sizeof(IntegralType) <= m_buffer.m_storage.capacity()); + ASSERT(static_cast(m_index) + sizeof(IntegralType) <= m_buffer.m_storage.capacity()); WTF::unalignedStore(m_storageBuffer + m_index, value); m_index += sizeof(IntegralType); WTF_ALLOW_UNSAFE_BUFFER_USAGE_END @@ -471,8 +471,8 @@ template void putIntegral(IntegralType value) { - unsigned nextIndex = m_index + sizeof(IntegralType); - if (nextIndex > m_storage.capacity()) [[unlikely]] + auto nextIndex = Checked(m_index) + sizeof(IntegralType); + if (nextIndex.value() > m_storage.capacity()) [[unlikely]] outOfLineGrow(); putIntegralUnchecked(value); } @@ -517,7 +517,7 @@ friend LinkBuffer; AssemblerData m_storage; - unsigned m_index; + unsigned m_index { 0 }; #if ENABLE(JIT_SIGN_ASSEMBLER_BUFFER) ARM64EHash m_hash; AssemblerHashes m_hashes; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/b3/B3CanonicalizePrePostIncrements.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/b3/B3CanonicalizePrePostIncrements.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/b3/B3CanonicalizePrePostIncrements.cpp 2026-01-20 14:08:31.624707700 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/b3/B3CanonicalizePrePostIncrements.cpp 2026-07-09 07:12:41.744804000 +0000 @@ -176,10 +176,15 @@ // which is located just before the memory. auto uses = addressUses.find(address); ASSERT(uses != addressUses.end() && uses->value.size()); + bool allUsesDominated = true; for (Value* use : uses->value) { - if (!dominators.dominates(memory->owner, use->owner)) - continue; + if (!dominators.dominates(memory->owner, use->owner)) { + allUsesDominated = false; + break; + } } + if (!allUsesDominated) + continue; unsigned index = memoryToIndex.get(memory); Value* newAddress = insertionSet.insert(index, Add, memory->origin(), address->child(0), address->child(1)); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/b3/air/AirFixObviousSpills.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/b3/air/AirFixObviousSpills.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/b3/air/AirFixObviousSpills.cpp 2026-02-23 14:40:52.242318200 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/b3/air/AirFixObviousSpills.cpp 2026-07-09 07:12:41.744804000 +0000 @@ -55,9 +55,7 @@ void run() { - if (AirFixObviousSpillsInternal::verbose) - dataLog("Code before fixObviousSpills:\n", m_code); - + dataLogLnIf(AirFixObviousSpillsInternal::verbose, "Code before fixObviousSpills:\n", m_code); computeAliases(); fixCode(); } @@ -79,11 +77,13 @@ m_block = block; m_state = m_atHead[block]; - if (AirFixObviousSpillsInternal::verbose) - dataLog("Executing block ", *m_block, ": ", m_state, "\n"); - - for (m_instIndex = 0; m_instIndex < block->size(); ++m_instIndex) - executeInst(); + dataLogLnIf(AirFixObviousSpillsInternal::verbose, "Executing block ", *m_block, ": ", m_state); + for (m_instIndex = 0; m_instIndex < block->size(); ++m_instIndex) { + dataLogLnIf(AirFixObviousSpillsInternal::verbose, " Executing ", m_block->at(m_instIndex), ": ", m_state); + clobberEarlyDefs(); + clobberLateDefs(); + addInstAliases(); + } // Before we call merge we must make sure that the two states are sorted. m_state.sort(); @@ -116,8 +116,10 @@ RELEASE_ASSERT(m_notBottom.quickGet(block->index())); for (m_instIndex = 0; m_instIndex < block->size(); ++m_instIndex) { + clobberEarlyDefs(); fixInst(); - executeInst(); + clobberLateDefs(); + addInstAliases(); } } } @@ -181,27 +183,33 @@ } } - void executeInst() + void clobberDefs(Inst* prevInst, Inst* nextInst) { - Inst& inst = m_block->at(m_instIndex); - - if (AirFixObviousSpillsInternal::verbose) - dataLog(" Executing ", inst, ": ", m_state, "\n"); - - Inst::forEachDefWithExtraClobberedRegs(&inst, &inst, + Inst::forEachDefWithExtraClobberedRegs(prevInst, nextInst, [&] (const Reg& reg, Arg::Role, Bank, Width, PreservedWidth) { - if (AirFixObviousSpillsInternal::verbose) - dataLog(" Clobbering ", reg, "\n"); + dataLogLnIf(AirFixObviousSpillsInternal::verbose, " Clobbering ", reg); m_state.clobber(reg); }); - Inst::forEachDef(&inst, &inst, + Inst::forEachDef(prevInst, nextInst, [&] (StackSlot* slot, Arg::Role, Bank, Width) { - if (AirFixObviousSpillsInternal::verbose) - dataLog(" Clobbering ", *slot, "\n"); + dataLogLnIf(AirFixObviousSpillsInternal::verbose, " Clobbering ", *slot); m_state.clobber(slot); }); + } + + void clobberEarlyDefs() + { + clobberDefs(nullptr, &m_block->at(m_instIndex)); + } + void clobberLateDefs() + { + clobberDefs(&m_block->at(m_instIndex), nullptr); + } + + void addInstAliases() + { forAllAliases( [&] (const auto& alias) { m_state.addAlias(alias); @@ -211,9 +219,7 @@ void fixInst() { Inst& inst = m_block->at(m_instIndex); - - if (AirFixObviousSpillsInternal::verbose) - dataLog("Fixing inst ", inst, ": ", m_state, "\n"); + dataLogLnIf(AirFixObviousSpillsInternal::verbose, "Fixing inst ", inst, ": ", m_state); // Check if alias analysis says that this is unnecessary. bool shouldLive = true; @@ -289,14 +295,12 @@ case Width64: if (alias->mode != RegSlot::AllBits) return; - if (AirFixObviousSpillsInternal::verbose) - dataLog(" Replacing ", arg, " with ", alias->reg, "\n"); + dataLogLnIf(AirFixObviousSpillsInternal::verbose, " Replacing ", arg, " with ", alias->reg); arg = Tmp(alias->reg); didThings = true; return; case Width32: - if (AirFixObviousSpillsInternal::verbose) - dataLog(" Replacing ", arg, " with ", alias->reg, " (subwidth case)\n"); + dataLogLnIf(AirFixObviousSpillsInternal::verbose, " Replacing ", arg, " with ", alias->reg, " (subwidth case)"); arg = Tmp(alias->reg); didThings = true; return; @@ -307,8 +311,7 @@ // Revert to immediate if that didn't work. if (const SlotConst* alias = m_state.getSlotConst(arg.stackSlot())) { - if (AirFixObviousSpillsInternal::verbose) - dataLog(" Replacing ", arg, " with constant ", alias->constant, "\n"); + dataLogLnIf(AirFixObviousSpillsInternal::verbose, " Replacing ", arg, " with constant ", alias->constant); if (Arg::isValidImmForm(alias->constant)) arg = Arg::imm(alias->constant); else diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/builtins/TypedArrayConstructor.js webkit2gtk-2.52.5/Source/JavaScriptCore/builtins/TypedArrayConstructor.js --- webkit2gtk-2.52.3/Source/JavaScriptCore/builtins/TypedArrayConstructor.js 2026-01-20 14:08:31.731707600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/builtins/TypedArrayConstructor.js 2026-07-09 07:12:41.744804000 +0000 @@ -109,11 +109,17 @@ @throwTypeError("TypedArray.from constructed typed array of insufficient length"); for (var k = 0; k < arrayLikeLength; k++) { + if (@isTypedArrayView(arrayLike) && (@isDetached(arrayLike) || k >= @typedArrayLength(arrayLike))) + break; var value = arrayLike[k]; if (mapFn === @undefined) result[k] = value; - else - result[k] = thisArg === @undefined ? mapFn(value, k) : mapFn.@call(thisArg, value, k); + else { + var mapped = thisArg === @undefined ? mapFn(value, k) : mapFn.@call(thisArg, value, k); + if (@isTypedArrayView(result) && (k >= @typedArrayLength(result) || @isDetached(result))) + break; + result[k] = mapped; + } } return result; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/bytecode/AccessCase.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/AccessCase.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/bytecode/AccessCase.cpp 2026-02-23 14:40:52.253318000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/AccessCase.cpp 2026-07-09 07:12:41.748803900 +0000 @@ -730,7 +730,9 @@ break; } case CustomValueGetter: - case CustomValueSetter: { + case CustomValueSetter: + case CustomAccessorGetter: + case CustomAccessorSetter: { auto& accessor = this->as(); if (accessor.customSlotBase()) functor(accessor.customSlotBase()); @@ -755,8 +757,6 @@ if (as().prototype()) functor(as().prototype()); break; - case CustomAccessorGetter: - case CustomAccessorSetter: case Load: case LoadMegamorphic: case StoreMegamorphic: diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/bytecode/ExpressionInfo.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/ExpressionInfo.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/bytecode/ExpressionInfo.cpp 2026-02-23 14:40:52.260318000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/ExpressionInfo.cpp 2026-07-09 07:12:41.748803900 +0000 @@ -59,7 +59,7 @@ Extension: [ 11111b | 1b | offset:26 ] AbsInstPC: [ 11111b | 0b | value:26 ] MultiWide: [ 11110b | 1b | 111b | numFields:5 | fields[6]:18 ] [ value:32 ] ... - DuoWide: [ 11110b | 1b | field2:3 | value2:10 | field1:3 | value1:10 ] + DuoWide: [ 11110b | 1b | field1:3 | value1:10 | field2:3 | value2:10 ] SingleWide: [ 11110b | 0b | field:3 | value:23 ] ExtensionEnd: [ 11110b | 0b | 111b | 0:23 ] Basic: [ instPC:5 | divot:7 | start:6 | end:6 | line:3 | column:5 ] @@ -141,7 +141,7 @@ over to the extension island. For all encodings, this is just a single word. The only exception is the MultiWide encoding, which are followed by N value words. Because the decoder expects these words to be contiguous, we move all the value words over too. The - slots of the original value words will not be replaced by no-ops (SingleWide with 0). + slots of the original value words will now be replaced by no-ops (SingleWide with 0). AbsInstPC and Chapters ====================== @@ -385,11 +385,9 @@ return { word }; } -void ExpressionInfo::Encoder::adjustInstPC(EncodedInfo* info, unsigned instPCDelta) +void ExpressionInfo::Encoder::adjustInstPC(unsigned infoIndex, unsigned instPCDelta) { - unsigned infoIndex = info - &m_expressionInfoEncodedInfo[0]; - auto* firstInfo = info; - unsigned firstValue = firstInfo->value; + unsigned firstValue = m_expressionInfoEncodedInfo[infoIndex].value; unsigned headerBits = firstValue >> headerShift; bool isMulti = (firstValue >> multiBitShift) & 1; @@ -403,7 +401,7 @@ unsigned instPC = cast(firstValue); unsigned updatedInstPC = instPC + instPCDelta; if (fits(updatedInstPC)) { - *firstInfo = encodeAbsInstPC(updatedInstPC); + m_expressionInfoEncodedInfo[infoIndex] = encodeAbsInstPC(updatedInstPC); return; } goto emitExtension; @@ -417,7 +415,7 @@ unsigned candidateInstPC = cast(firstValue); unsigned updatedInstPC = candidateInstPC + instPCDelta; if (fieldID == FieldID::InstPC && fits(updatedInstPC)) { - *firstInfo = encodeSingle(FieldID::InstPC, updatedInstPC); + m_expressionInfoEncodedInfo[infoIndex] = encodeSingle(FieldID::InstPC, updatedInstPC); return; } goto emitExtension; @@ -433,7 +431,7 @@ if (fieldID == FieldID::InstPC && fits(updatedInstPC)) { FieldID fieldID2 = static_cast((firstValue >> duoSecondFieldIDShift) & fieldIDMask); unsigned value2 = cast(firstValue >> duoSecondValueShift); - *firstInfo = encodeDuo(FieldID::InstPC, updatedInstPC, fieldID2, value2); + m_expressionInfoEncodedInfo[infoIndex] = encodeDuo(FieldID::InstPC, updatedInstPC, fieldID2, value2); return; } goto emitExtension; @@ -453,15 +451,20 @@ // being contiguous. unsigned numberOfFields = (firstValue >> multiSizeShift) & multiSizeMask; + unsigned locationOfExtensionIsland = m_expressionInfoEncodedInfo.size(); m_expressionInfoEncodedInfo.append({ firstValue }); // MultiWide header. for (unsigned i = 1; i < numberOfFields; ++i) { - m_expressionInfoEncodedInfo.append(firstInfo[i]); - firstInfo[i] = encodeSingle(FieldID::InstPC, 0); // Replace with a no-op. + auto fieldValue = m_expressionInfoEncodedInfo[infoIndex + i]; + m_expressionInfoEncodedInfo.append(fieldValue); + m_expressionInfoEncodedInfo[infoIndex + i] = encodeSingle(FieldID::InstPC, 0); // Replace with a no-op. } // Save the last field in firstValue, and let the extension emitter below append it. - firstValue = firstInfo[numberOfFields].value; - firstInfo[numberOfFields] = encodeSingle(FieldID::InstPC, 0); // Replace with a no-op. - goto emitExtension; + firstValue = m_expressionInfoEncodedInfo[infoIndex + numberOfFields].value; + m_expressionInfoEncodedInfo[infoIndex + numberOfFields] = encodeSingle(FieldID::InstPC, 0); // Replace with a no-op. + + unsigned extensionOffset = locationOfExtensionIsland - infoIndex; + m_expressionInfoEncodedInfo[infoIndex] = encodeExtension(extensionOffset); + goto emitExtensionIsland; } // Handle Basic. @@ -471,16 +474,18 @@ if (updatedInstPC < maxInstPCValue) { unsigned replacement = firstValue & ((1u << instPCShift) - 1); replacement |= updatedInstPC << instPCShift; - *firstInfo = { replacement }; + m_expressionInfoEncodedInfo[infoIndex] = { replacement }; return; } } isBasic = true; emitExtension: - unsigned extensionOffset = m_expressionInfoEncodedInfo.size() - infoIndex; - m_expressionInfoEncodedInfo[infoIndex] = encodeExtension(extensionOffset); - + { + unsigned extensionOffset = m_expressionInfoEncodedInfo.size() - infoIndex; + m_expressionInfoEncodedInfo[infoIndex] = encodeExtension(extensionOffset); + } +emitExtensionIsland: // Because the Basic word is used as a terminator for the current Entry, // if the firstValue is a Basic word, it needs to come last. Otherwise, we should // just emit firstValue first. AbsInstPC and MultiWide relies on this for correctness. @@ -492,7 +497,7 @@ else { // The wides array is really only to enable us to use encodeMultiHeader. Hence, // we don't really need to store instPCDelta as the value here. It can be any value - // since it's not ued. However, to avoid confusion, we'll just populate it consistently. + // since it's not used. However, to avoid confusion, we'll just populate it consistently. Wide wides[1] = { { instPCDelta, FieldID::InstPC } }; m_expressionInfoEncodedInfo.append(encodeMultiHeader(1, wides)); m_expressionInfoEncodedInfo.append({ instPCDelta }); @@ -1034,7 +1039,7 @@ out.print(" DUO ", fieldID1, " "); print(out, fieldID1, value >> duoFirstValueShift); out.print(" ", fieldID2, " "); - print(out, fieldID2, value >> duoFirstValueShift); + print(out, fieldID2, value >> duoSecondValueShift); out.println(); } else { diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/bytecode/ExpressionInfo.h webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/ExpressionInfo.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/bytecode/ExpressionInfo.h 2026-02-23 14:40:52.260318000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/ExpressionInfo.h 2026-07-09 07:12:41.748803900 +0000 @@ -115,7 +115,7 @@ static EncodedInfo encodeMultiHeader(unsigned numWides, Wide*); static EncodedInfo encodeBasic(const Diff&); - void adjustInstPC(EncodedInfo*, unsigned instPCDelta); + void adjustInstPC(unsigned infoIndex, unsigned instPCDelta); template bool fits(Wide); template bool fits(T); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/bytecode/ExpressionInfoInlines.h webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/ExpressionInfoInlines.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/bytecode/ExpressionInfoInlines.h 2026-02-23 14:40:52.261318000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/ExpressionInfoInlines.h 2026-07-09 07:12:41.748803900 +0000 @@ -102,7 +102,8 @@ cummulativeDelta = 0; instPCDelta = remapFunc(instPC) - instPC - cummulativeDelta; if (instPCDelta || isAbsInstPC) { - adjustInstPC(decoder.currentInfo(), instPCDelta); + unsigned infoIndex = static_cast(decoder.currentInfo() - m_expressionInfoEncodedInfo.begin()); + adjustInstPC(infoIndex, instPCDelta); // adjustInstPC() may have resized and reallocated m_expressionInfoEncodedInfo. // So, we need to re-compute endInfo. info will be re-computed at the top of the loop. diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/bytecode/GetByStatus.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/GetByStatus.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/bytecode/GetByStatus.cpp 2026-03-03 21:30:17.008498400 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/GetByStatus.cpp 2026-07-09 07:12:41.748803900 +0000 @@ -478,14 +478,10 @@ return computeFor(profiledBlock, baselineMap, didExit, callExitSiteData, codeOrigin); } -GetByStatus GetByStatus::computeFor(JSGlobalObject* globalObject, const StructureSet& set, CacheableIdentifier identifier) +GetByStatus GetByStatus::computeFor(JSGlobalObject* globalObject, const StructureSet& set, CacheableIdentifier identifier, GetByStatus::LookupMode mode) { // For now we only handle the super simple self access case. We could handle the // prototype case in the future. - // - // Note that this code is also used for GetByIdDirect since this function only looks - // into direct properties. When supporting prototype chains, we should split this for - // GetById and GetByIdDirect. if (set.isEmpty()) return GetByStatus(); @@ -580,8 +576,12 @@ return std::nullopt; }; - if (auto result = attempToFold()) - return result.value(); + // We should do a prototype walk searching for the property only if this + // is a normal access. Don't consult proto for for direct accesses. + if (mode == GetByStatus::LookupMode::Normal) { + if (auto result = attempToFold()) + return result.value(); + } GetByStatus result; result.m_state = Simple; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/bytecode/GetByStatus.h webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/GetByStatus.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/bytecode/GetByStatus.h 2026-01-20 14:08:31.759707500 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/GetByStatus.h 2026-07-09 07:12:41.748803900 +0000 @@ -76,6 +76,13 @@ ObservedSlowPathAndMakesCalls, }; + enum class LookupMode : bool { + // Normal property lookups can traverse the prototype chain + Normal, + // Direct property lookups only work for own properties (see getByIdDirect) + Direct + }; + GetByStatus() : m_state(NoInformation) { @@ -97,7 +104,7 @@ } static GetByStatus computeFor(CodeBlock* baselineBlock, ICStatusMap& baselineMap, ICStatusContextStack& dfgContextStack, CodeOrigin); - static GetByStatus computeFor(JSGlobalObject*, const StructureSet&, CacheableIdentifier); + static GetByStatus computeFor(JSGlobalObject*, const StructureSet&, CacheableIdentifier, LookupMode); State state() const { return m_state; } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/bytecode/InlineCacheCompiler.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/InlineCacheCompiler.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/bytecode/InlineCacheCompiler.cpp 2026-04-10 12:18:32.159458000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/InlineCacheCompiler.cpp 2026-07-09 07:12:41.752803800 +0000 @@ -4326,14 +4326,19 @@ #if USE(JSVALUE64) if (isResizableOrGrowableSharedTypedArrayIncludingDataView(accessCase.structure()->classInfoForCells())) { + // The null-vector guard above was emitted before the push, so route it + // directly to m_failAndIgnore to avoid the post-push restore path. + m_failAndIgnore.append(failAndIgnore); + auto allocator = makeDefaultScratchAllocator(m_scratchGPR); GPRReg scratch2GPR = allocator.allocateScratchGPR(); ScratchRegisterAllocator::PreservedState preservedState = allocator.preserveReusedRegistersByPushing(jit, ScratchRegisterAllocator::ExtraStackSpace::NoExtraSpace); + CCallHelpers::JumpList postPushFailAndIgnore; if (isDataView) { auto [outOfBounds, doneCases] = jit.loadDataViewByteLength(baseGPR, valueGPR, m_scratchGPR, scratch2GPR, type); - failAndIgnore.append(outOfBounds); + postPushFailAndIgnore.append(outOfBounds); doneCases.link(&jit); } else jit.loadTypedArrayByteLength(baseGPR, valueGPR, m_scratchGPR, scratch2GPR, typedArrayType(accessCase.structure()->typeInfo().type())); @@ -4345,12 +4350,12 @@ allocator.restoreReusedRegistersByPopping(jit, preservedState); succeed(); - if (allocator.didReuseRegisters() && !failAndIgnore.empty()) { - failAndIgnore.link(&jit); + if (allocator.didReuseRegisters() && !postPushFailAndIgnore.empty()) { + postPushFailAndIgnore.link(&jit); allocator.restoreReusedRegistersByPopping(jit, preservedState); m_failAndIgnore.append(jit.jump()); } else - m_failAndIgnore.append(failAndIgnore); + m_failAndIgnore.append(postPushFailAndIgnore); return; } #endif diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/bytecode/Repatch.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/Repatch.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/bytecode/Repatch.cpp 2026-02-23 14:40:52.269317900 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/Repatch.cpp 2026-07-09 07:12:41.752803800 +0000 @@ -723,6 +723,7 @@ // Mainly used to transition from megamorphic case to generic case. void repatchGetBySlowPathCall(CodeBlock* codeBlock, StructureStubInfo& stubInfo, GetByKind kind) { + ConcurrentJSLocker locker(codeBlock->m_lock); resetGetBy(codeBlock, stubInfo, kind); repatchSlowPathCall(codeBlock, stubInfo, appropriateGetByGaveUpFunction(kind)); } @@ -927,6 +928,7 @@ // Mainly used to transition from megamorphic case to generic case. void repatchPutBySlowPathCall(CodeBlock* codeBlock, StructureStubInfo& stubInfo, PutByKind kind) { + ConcurrentJSLocker locker(codeBlock->m_lock); resetPutBy(codeBlock, stubInfo, kind); repatchSlowPathCall(codeBlock, stubInfo, appropriatePutByGaveUpFunction(kind)); } @@ -1533,6 +1535,7 @@ // Mainly used to transition from megamorphic case to generic case. void repatchInBySlowPathCall(CodeBlock* codeBlock, StructureStubInfo& stubInfo, InByKind kind) { + ConcurrentJSLocker locker(codeBlock->m_lock); resetInBy(codeBlock, stubInfo, kind); repatchSlowPathCall(codeBlock, stubInfo, appropriateInByGaveUpFunction(kind)); } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/bytecode/StructureStubClearingWatchpoint.h webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/StructureStubClearingWatchpoint.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/bytecode/StructureStubClearingWatchpoint.h 2026-01-20 14:08:31.786707400 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/bytecode/StructureStubClearingWatchpoint.h 2026-07-09 07:12:41.752803800 +0000 @@ -86,6 +86,7 @@ WTF_MAKE_NONCOPYABLE(AdaptiveValueStructureStubClearingWatchpoint); WTF_MAKE_TZONE_ALLOCATED(AdaptiveValueStructureStubClearingWatchpoint); + bool isValid() const final { return !m_owner->ownerIsDead(); } void handleFire(VM&, const FireDetail&) final; public: diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp 2026-02-23 14:40:52.276317800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp 2026-07-09 07:12:41.752803800 +0000 @@ -55,6 +55,7 @@ #include "UnlinkedMetadataTableInlines.h" #include "YarrFlags.h" #include +#include #include namespace JSC { @@ -5025,7 +5026,7 @@ literalVector.append(clauseExpression); if (clauseExpression->isNumber()) { double value = static_cast(clauseExpression)->value(); - int32_t intVal = static_cast(value); + int32_t intVal = truncateDoubleToInt32(value); if ((typeForTable & ~SwitchNumber) || (intVal != value)) { typeForTable = SwitchNeither; break; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h 2026-03-16 22:06:45.610290800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h 2026-07-09 07:12:41.756803800 +0000 @@ -1513,7 +1513,7 @@ break; } if (producesInteger(node->arithRoundingMode())) { - int32_t roundedValueAsInt32 = static_cast(roundedValue); + int32_t roundedValueAsInt32 = truncateDoubleToInt32(roundedValue); if (roundedValueAsInt32 == roundedValue) { if (shouldCheckNegativeZero(node->arithRoundingMode())) { if (roundedValueAsInt32 || !std::signbit(roundedValue)) { @@ -3680,7 +3680,12 @@ break; } - setForNode(node, m_vm.cellButterflyStructure(CopyOnWriteArrayWithContiguous)); + { + RegisteredStructureSet structureSet; + structureSet.add(m_graph.registerStructure(m_vm.cellButterflyStructure(CopyOnWriteArrayWithContiguous))); + structureSet.add(m_graph.registerStructure(m_vm.cellButterflyOnlyAtomStringsStructure.get())); + setForNode(node, structureSet); + } break; case NewArrayBuffer: @@ -4402,7 +4407,9 @@ && value.m_structure.isFinite() && (node->child1().useKind() == CellUse || !(value.m_type & ~SpecCell))) { CacheableIdentifier identifier = node->cacheableIdentifier(); - GetByStatus status = GetByStatus::computeFor(m_graph.globalObjectFor(node->origin.semantic), value.m_structure.toStructureSet(), identifier); + GetByStatus::LookupMode lookupMode = node->propertyLookupMode(); + + GetByStatus status = GetByStatus::computeFor(m_graph.globalObjectFor(node->origin.semantic), value.m_structure.toStructureSet(), identifier, lookupMode); if (status.isSimple()) { if (status.numVariants() == 1) { auto variant = status[0]; @@ -5771,9 +5778,13 @@ if (argument.isType(SpecPromiseObject)) { if (m_graph.isWatchingPromiseSpeciesWatchpoint(node)) { - didFoldClobberWorld(); - forNode(node) = argument; - break; + if (auto structure = argument.m_structure.onlyStructure()) { + if (structure.get() == globalObject->promiseStructure()) { + didFoldClobberWorld(); + forNode(node) = argument; + break; + } + } } } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGAdaptiveInferredPropertyValueWatchpoint.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGAdaptiveInferredPropertyValueWatchpoint.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGAdaptiveInferredPropertyValueWatchpoint.cpp 2026-01-20 14:08:31.816707400 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGAdaptiveInferredPropertyValueWatchpoint.cpp 2026-07-09 07:12:41.756803800 +0000 @@ -28,7 +28,7 @@ #if ENABLE(DFG_JIT) -#include "CodeBlock.h" +#include "CodeBlockInlines.h" #include "DFGCommon.h" #include diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGArgumentsEliminationPhase.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGArgumentsEliminationPhase.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGArgumentsEliminationPhase.cpp 2026-02-23 14:40:52.279317900 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGArgumentsEliminationPhase.cpp 2026-07-09 07:12:41.756803800 +0000 @@ -604,7 +604,7 @@ return interfere; }; - auto removeViaKill = [&](BasicBlock* block, unsigned nodeIndex, Node* candidate) { + auto removeViaKill = [&](BasicBlock* block, const unsigned nodeIndex, Node* candidate) { if (!m_candidates.contains(candidate)) return; @@ -660,21 +660,17 @@ } // This loop considers all nodes up to the nodeIndex, excluding the nodeIndex. + // scanIndex is a working copy so each inline call frame independently + // scans the full [0, nodeIndex) range. // - // Note: nodeIndex here has a double meaning. Before entering this - // while loop, it refers to the remaining number of nodes that have - // yet to be processed. Inside the loop, it refers to the index - // of the current node to process (after we decrement it). - // - // If the remaining number of nodes is 0, we should not decrement nodeIndex. - // Hence, we must only decrement nodeIndex inside the while loop instead of - // in its condition statement. Note that this while loop is embedded in an - // outer for loop. If we decrement nodeIndex in the condition statement, a - // nodeIndex of 0 will become UINT_MAX, and the outer loop will wrongly - // treat this as there being UINT_MAX remaining nodes to process. - while (nodeIndex) { - --nodeIndex; - Node* node = block->at(nodeIndex); + // If the remaining number of nodes is 0, we should not decrement + // scanIndex. Hence, we must only decrement it inside the while loop + // instead of in its condition statement; otherwise a scanIndex of 0 would + // become UINT_MAX. + unsigned scanIndex = nodeIndex; + while (scanIndex) { + --scanIndex; + Node* node = block->at(scanIndex); if (node == candidate) break; @@ -693,7 +689,7 @@ NoOpClobberize()); if (found) { - dataLogLnIf(DFGArgumentsEliminationPhaseInternal::verbose, "eliminating candidate: ", candidate, " because it is clobbered by ", block->at(nodeIndex)); + dataLogLnIf(DFGArgumentsEliminationPhaseInternal::verbose, "eliminating candidate: ", candidate, " because it is clobbered by ", block->at(scanIndex)); transitivelyRemoveCandidate(candidate); return; } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp 2026-02-23 14:40:52.282317900 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp 2026-07-09 07:12:41.764803400 +0000 @@ -9711,7 +9711,12 @@ SpeculatedType prediction = getPrediction(); CacheableIdentifier identifier = CacheableIdentifier::createFromIdentifierOwnedByCodeBlock(m_inlineStackTop->m_profiledBlock, uid); - GetByStatus status = GetByStatus::computeFor(globalObject, structure, identifier); + + // op_get_from_scope for a global property should walk the + // proto chain of the global object searching for the desired property + GetByStatus::LookupMode lookupMode = GetByStatus::LookupMode::Normal; + GetByStatus status = GetByStatus::computeFor(globalObject, structure, identifier, lookupMode); + if (status.state() != GetByStatus::Simple || status.numVariants() != 1 || status[0].structureSet().size() != 1) { diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGClobberize.h webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGClobberize.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGClobberize.h 2026-02-23 14:40:52.283317800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGClobberize.h 2026-07-09 07:12:41.764803400 +0000 @@ -240,7 +240,6 @@ case SameValue: case IsEmpty: case IsEmptyStorage: - case TypeOfIsUndefined: case IsUndefinedOrNull: case IsBoolean: case IsNumber: @@ -248,8 +247,6 @@ case NumberIsInteger: case IsObject: case IsTypedArrayView: - case ToBoolean: - case LogicalNot: case CheckInBounds: case CheckInBoundsInt52: case DoubleRep: @@ -264,10 +261,18 @@ case ValueToInt32: case GetExecutable: case BottomValue: - case TypeOf: def(PureValue(node)); return; + // These nodes are realm-dependent when MasqueradesAsUndefined is involved. + // Including the globalObject in the PureValue ensures nodes from different realms are not folded by CSE. + case TypeOfIsUndefined: + case ToBoolean: + case LogicalNot: + case TypeOf: + def(PureValue(node, graph.globalObjectFor(node->origin.semantic))); + return; + // JSCallee for Eval can change the scope field. case GetEvalScope: read(World); @@ -659,12 +664,12 @@ case TypeOfIsObject: read(MiscFields); - def(HeapLocation(TypeOfIsObjectLoc, MiscFields, node->child1()), LazyNode(node)); + def(HeapLocation(TypeOfIsObjectLoc, MiscFields, node->child1(), graph.globalObjectFor(node->origin.semantic)), LazyNode(node)); return; case TypeOfIsFunction: read(MiscFields); - def(HeapLocation(TypeOfIsFunctionLoc, MiscFields, node->child1()), LazyNode(node)); + def(HeapLocation(TypeOfIsFunctionLoc, MiscFields, node->child1(), graph.globalObjectFor(node->origin.semantic)), LazyNode(node)); return; case IsCallable: @@ -2230,6 +2235,11 @@ return; case StringAt: + // String.prototype.at returns a string when in bounds and undefined when OOB. This is + // unlike charAt, which always returns a string. Include arrayMode to prevent CSE across + // modes. + def(PureValue(node, node->arrayMode().asWord())); + return; case StringCharAt: def(PureValue(node)); return; @@ -2255,6 +2265,13 @@ return; } + // CompareEq is realm-dependent when MasqueradesAsUndefined is involved. + // Including the globalObject ensures nodes from different realms are not folded by CSE. + if (node->op() == CompareEq) { + def(PureValue(node, graph.globalObjectFor(node->origin.semantic))); + return; + } + def(PureValue(node)); return; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp 2026-02-23 14:40:52.284318000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp 2026-07-09 07:12:41.764803400 +0000 @@ -336,7 +336,13 @@ // https://bugs.webkit.org/show_bug.cgi?id=125425 break; } - + + if (view->isResizableOrGrowableShared()) { + // Because resizable and growable-shared views can have their backing store reallocated + // by resize() / WebAssembly.Memory.grow(), a folded vector pointer would go stale. + break; + } + m_interpreter.execute(indexInBlock); eliminated = true; @@ -759,7 +765,8 @@ || (node->child1().useKind() == UntypedUse || (baseValue.m_type & ~SpecCell))) break; - GetByStatus status = GetByStatus::computeFor(m_graph.globalObjectFor(node->origin.semantic), baseValue.m_structure.toStructureSet(), identifier); + GetByStatus::LookupMode lookupMode = node->propertyLookupMode(); + GetByStatus status = GetByStatus::computeFor(m_graph.globalObjectFor(node->origin.semantic), baseValue.m_structure.toStructureSet(), identifier, lookupMode); if (!status.isSimple()) break; @@ -1716,11 +1723,15 @@ if (argument.isType(SpecPromiseObject)) { if (m_graph.isWatchingPromiseSpeciesWatchpoint(node)) { - m_interpreter.execute(indexInBlock); // Push CFA over this node after we get the state before. - alreadyHandled = true; // Don't allow the default constant folder to do things to this. - node->convertToIdentityOn(node->child2().node()); - changed = true; - break; + if (auto structure = argument.m_structure.onlyStructure()) { + if (structure.get() == globalObject->promiseStructure()) { + m_interpreter.execute(indexInBlock); // Push CFA over this node after we get the state before. + alreadyHandled = true; // Don't allow the default constant folder to do things to this. + node->convertToIdentityOn(node->child2().node()); + changed = true; + break; + } + } } } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGGraph.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGGraph.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGGraph.cpp 2026-02-23 14:40:52.286317800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGGraph.cpp 2026-07-09 07:12:41.764803400 +0000 @@ -237,7 +237,7 @@ }); } - if (toCString(NodeFlagsDump(node->flags())) != "") + if (toCString(NodeFlagsDump(node->flags())) != ""_s) out.print(comma, NodeFlagsDump(node->flags())); if (node->prediction()) out.print(comma, SpeculationDump(node->prediction())); @@ -564,7 +564,7 @@ continue; out.print(" D@", phiNode->index(), "<", phiNode->operand(), ",", phiNode->refCount()); - if (toCString(NodeFlagsDump(phiNode->flags())) != "") + if (toCString(NodeFlagsDump(phiNode->flags())) != ""_s) out.print(", ", NodeFlagsDump(phiNode->flags())); out.print(">->("); if (phiNode->child1()) { @@ -1553,6 +1553,30 @@ if (!headStructure) return ObjectPropertyConditionSet::invalid(); + auto isAbsenceCacheable = [&](Structure* structure) { + // Absences cannot be cached on any dictionaries, including CachedDictionaryKind, because + // new properties can be added without structure transitions. + if (structure->isDictionary()) + return false; + if (structure->typeInfo().overridesGetOwnPropertySlot()) + return false; + if (!structure->propertyAccessesAreCacheable()) + return false; + if (!structure->propertyAccessesAreCacheableForAbsence()) + return false; + unsigned attributes; + if (isValidOffset(structure->getConcurrently(identifier.uid(), attributes))) + return false; + if (structure->hasPolyProto()) + return false; + return true; + }; + + // generateConditionsForPropertyMissConcurrently only walks the prototype chain, so validate + // headStructure first. + if (!isAbsenceCacheable(headStructure)) + return ObjectPropertyConditionSet::invalid(); + auto result = generateConditionsForPropertyMissConcurrently(globalObject->vm(), globalObject, headStructure, identifier.uid()); if (!result.isValid()) return result; @@ -1562,22 +1586,7 @@ if (!object) return ObjectPropertyConditionSet::invalid(); - auto* structure = object->structure(); - if (structure->typeInfo().overridesGetOwnPropertySlot()) - return ObjectPropertyConditionSet::invalid(); - - if (!structure->propertyAccessesAreCacheable()) - return ObjectPropertyConditionSet::invalid(); - - if (!structure->propertyAccessesAreCacheableForAbsence()) - return ObjectPropertyConditionSet::invalid(); - - unsigned attributes; - PropertyOffset offset = structure->getConcurrently(identifier.uid(), attributes); - if (isValidOffset(offset)) - return ObjectPropertyConditionSet::invalid(); - - if (structure->hasPolyProto()) + if (!isAbsenceCacheable(object->structure())) return ObjectPropertyConditionSet::invalid(); } return result; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGLoopUnrollingPhase.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGLoopUnrollingPhase.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGLoopUnrollingPhase.cpp 2026-02-23 14:40:52.289317800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGLoopUnrollingPhase.cpp 2026-07-09 07:12:41.764803400 +0000 @@ -29,6 +29,7 @@ #if ENABLE(DFG_JIT) #include "CodeOrigin.h" +#include "DFGBasicBlockInlines.h" #include "DFGBlockInsertionSet.h" #include "DFGCFAPhase.h" #include "DFGCloneHelper.h" diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGNode.h webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGNode.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGNode.h 2026-02-23 14:40:52.290317800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGNode.h 2026-07-09 07:12:41.768803400 +0000 @@ -50,6 +50,7 @@ #include "DFGVariableAccessData.h" #include "DOMJITSignature.h" #include "DeleteByVariant.h" +#include "GetByStatus.h" #include "GetByVariant.h" #include "InlineCacheCompiler.h" #include "JSCJSValue.h" @@ -3622,6 +3623,22 @@ return op() == CreateRest || op() == PhantomCreateRest || op() == GetRestLength || op() == GetMyArgumentByVal || op() == GetMyArgumentByValOutOfBounds; } + GetByStatus::LookupMode propertyLookupMode() + { + switch (op()) { + case GetByIdDirect: + case GetByIdDirectFlush: + case GetPrivateNameById: + return GetByStatus::LookupMode::Direct; + case GetById: + case GetByIdFlush: + case GetByIdMegamorphic: + return GetByStatus::LookupMode::Normal; + default: + RELEASE_ASSERT_NOT_REACHED(); + } + } + unsigned numberOfArgumentsToSkip() { ASSERT(hasNumberOfArgumentsToSkip()); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGOSRExit.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGOSRExit.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGOSRExit.cpp 2026-02-23 14:40:52.291318000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGOSRExit.cpp 2026-07-09 07:12:41.768803400 +0000 @@ -491,7 +491,8 @@ // Save all state from GPRs into the scratch buffer. - ScratchBuffer* scratchBuffer = vm.scratchBufferForSize(sizeof(EncodedJSValue) * operands.size()); + const size_t scratchBufferSize = sizeof(EncodedJSValue) * operands.size(); + ScratchBuffer* scratchBuffer = vm.scratchBufferForSize(scratchBufferSize); EncodedJSValue* scratch = scratchBuffer ? static_cast(scratchBuffer->dataBuffer()) : nullptr; for (size_t index = 0; index < operands.size(); ++index) { @@ -697,6 +698,14 @@ } } + // The scratch buffer can become the sole retainer of saved on-stack values if the + // stack is overwritten by emitSaveCalleeSavesFor below, so set the active length + // for the GC. + if (scratchBuffer) { + jit.move(CCallHelpers::TrustedImmPtr(scratchBuffer->addressOfActiveLength()), GPRInfo::regT0); + jit.storePtr(CCallHelpers::TrustedImm32(scratchBufferSize), CCallHelpers::Address(GPRInfo::regT0)); + } + if constexpr (validateDFGDoesGC) { if (Options::validateDoesGC()) { // We're about to exit optimized code. So, there's no longer any optimized @@ -828,6 +837,11 @@ spooler.finalizeGPR(); #endif + if (scratchBuffer) { + jit.move(CCallHelpers::TrustedImmPtr(scratchBuffer->addressOfActiveLength()), GPRInfo::regT0); + jit.storePtr(CCallHelpers::TrustedImm32(0), CCallHelpers::Address(GPRInfo::regT0)); + } + // Now that things on the stack are recovered, do the arguments recovery. We assume that arguments // recoveries don't recursively refer to each other. But, we don't try to assume that they only // refer to certain ranges of locals. Hence why we need to do this here, once the stack is sensible. diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp 2026-01-20 14:08:31.897707200 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp 2026-07-09 07:12:41.768803400 +0000 @@ -389,7 +389,7 @@ jit.store32(AssemblyHelpers::TrustedImm32(inlineCallFrame->argumentCountIncludingThis), AssemblyHelpers::payloadFor(VirtualRegister(inlineCallFrame->stackOffset + CallFrameSlot::argumentCountIncludingThis))); jit.storePtr(callerFrameGPR, AssemblyHelpers::addressForByteOffset(inlineCallFrame->callerFrameOffset())); - BytecodeIndex exitIndex = baselineCodeBlock->bytecodeIndexForExit(codeOrigin->bytecodeIndex()); + BytecodeIndex exitIndex(codeOrigin->bytecodeIndex().offset()); uint32_t locationBits = CallSiteIndex(exitIndex).bits(); jit.store32(AssemblyHelpers::TrustedImm32(locationBits), AssemblyHelpers::tagFor(VirtualRegister(inlineCallFrame->stackOffset + CallFrameSlot::argumentCountIncludingThis))); if (!inlineCallFrame->isClosureCall) diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGObjectAllocationSinkingPhase.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGObjectAllocationSinkingPhase.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGObjectAllocationSinkingPhase.cpp 2026-03-16 22:06:45.611290700 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGObjectAllocationSinkingPhase.cpp 2026-07-09 07:12:41.768803400 +0000 @@ -2290,14 +2290,6 @@ doLower = true; - if (node->op() == PutByVal) { - // We must insert the check before the PutHint inserted below. This is because that both PutHint and PutByVal - // clobber the exit state. Since they have consistent exit state clobberization assumption, an ExitOK wouldn't be - // inserted below which breaks the validation. - Edge value = m_graph.varArgChild(node, 2); - m_insertionSet.insertNode(nodeIndex + 1, SpecNone, Check, node->origin, Edge(value.node(), value.useKind())); - } - dataLogLnIf(Options::verboseObjectAllocationSinking(), "Creating hint with value ", nodeValue, " before ", node); m_insertionSet.insert( nodeIndex + 1, @@ -2309,9 +2301,6 @@ }); - // After inserting a PutHint, the next node cannot exit. If the current node does clobber the exit state, then we are fine since - // the exit state clobberization are consistent after the insertion. Otherwise, the assumption was broken and an ExitOK is required - // to ensure a valid exit state. if (!nextCanExit && desiredNextExitOK) { // We indicate that the exit state is fine now. We need to do this because we // emitted hints that appear to invalidate the exit state. diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGOperations.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGOperations.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGOperations.cpp 2026-03-26 12:33:41.417457000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGOperations.cpp 2026-07-09 07:12:41.768803400 +0000 @@ -172,9 +172,6 @@ static ALWAYS_INLINE EncodedJSValue parseIntResult(double input) { - int asInt = static_cast(input); - if (static_cast(asInt) == input && (asInt || !std::signbit(input))) [[likely]] - return JSValue::encode(jsNumber(asInt)); return JSValue::encode(jsNumber(input)); } @@ -4691,7 +4688,7 @@ JITOperationPrologueCallFrameTracer tracer(vm, callFrame); auto scope = DECLARE_THROW_SCOPE(vm); - uint64_t length = static_cast(JSValue::decode(encodedLength).asNumber()); + uint64_t length = truncateDoubleToUint64(JSValue::decode(encodedLength).asNumber()); OPERATION_RETURN(scope, newArrayWithSpeciesImpl(globalObject, length, array, indexingType)); } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGStoreBarrierInsertionPhase.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGStoreBarrierInsertionPhase.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGStoreBarrierInsertionPhase.cpp 2026-02-23 14:40:52.299317800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGStoreBarrierInsertionPhase.cpp 2026-07-09 07:12:41.772803300 +0000 @@ -68,6 +68,8 @@ Global }; +// FIXME(rdar://177100632): Document barrier placement invariants expected of nodes for this phase +// and improve barrier-related phases overall. template class StoreBarrierInsertionPhase : public Phase { public: @@ -349,9 +351,20 @@ break; } - case MultiPutByOffset: + case MultiPutByOffset: { + // This node may cause a transition before performing a store if it reallocates + // storage. This is different from the usual assumption in this phase a node's fast + // path either does GC or performs a store, but not both within the same node (a + // slow path call to an operation always performs its own barrier). In this special + // case, bump the epoch before considering the barrier. + if (m_node->multiPutByOffsetData().reallocatesStorage()) + m_currentEpoch.bump(); + considerBarrier(m_node->child1()); + break; + } + case MultiDeleteByOffset: { - // These nodes may cause transition too. + // This node may cause a transition but does not GC. considerBarrier(m_node->child1()); break; } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGValidate.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGValidate.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/dfg/DFGValidate.cpp 2026-02-23 14:40:52.300317800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/dfg/DFGValidate.cpp 2026-07-09 07:12:41.772803300 +0000 @@ -1018,10 +1018,6 @@ VALIDATE((node), node->entrypointIndex() < m_graph.m_numberOfEntrypoints); break; - case GetButterfly: - VALIDATE((node), !node->child1()->isPhantomAllocation()); - break; - default: m_graph.doToChildren( node, diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp 2026-03-16 22:06:45.615290900 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp 2026-07-09 07:12:41.776803300 +0000 @@ -230,6 +230,36 @@ m_proc.code().setPrologueForEntrypoint(catchEntrypointIndex, catchPrologueGenerator.copyRef()); } + const unsigned exitFrameSize = m_graph.requiredRegisterCountForExit() * sizeof(Register); + VM* vm = &this->vm(); + + Ref mainPrologueGenerator = createSharedTask( + [=](CCallHelpers& jit, B3::Air::Code& code) { + jit.emitFunctionPrologue(); + + AllowMacroScratchRegisterUsage allowScratch(jit); + + // Stack overflow check before frame allocation. + // At this point SP == FP; no callee-saves have been saved. + const unsigned ftlFrameSize = code.frameSize(); + const unsigned maxFrameSize = std::max(exitFrameSize, ftlFrameSize); + + GPRReg scratch = CCallHelpers::selectScratchGPR(GPRInfo::callFrameRegister); + + jit.jitAssertCodeBlockOnCallFrameWithType(scratch, JITType::FTLJIT); + + jit.addPtr(CCallHelpers::TrustedImm32(-maxFrameSize), GPRInfo::callFrameRegister, scratch); + auto stackOverflow = jit.branchPtr(CCallHelpers::GreaterThan, CCallHelpers::AbsoluteAddress(vm->addressOfSoftStackLimit()), scratch); + stackOverflow.linkThunk(CodeLocationLabel(vm->getCTIStub(CommonJITThunkID::ThrowStackOverflowAtPrologue).retaggedCode()), &jit); + + if (ftlFrameSize) + jit.subPtr(CCallHelpers::TrustedImm32(ftlFrameSize), CCallHelpers::stackPointerRegister); + + jit.emitSave(code.calleeSaveRegisterAtOffsetList()); + }); + + m_proc.code().setPrologueForEntrypoint(0, WTF::move(mainPrologueGenerator)); + if (m_graph.m_maxLocalsForCatchOSREntry) { uint32_t numberOfLiveLocals = std::max(*m_graph.m_maxLocalsForCatchOSREntry, 1u); // Make sure we always allocate a non-null catchOSREntryBuffer. m_ftlState.jitCode->common.catchOSREntryBuffer = m_graph.m_vm.scratchBufferForSize(sizeof(JSValue) * numberOfLiveLocals); @@ -292,43 +322,6 @@ // When running FTL code, we already store CodeBlock to CallFrameSlot::codeBlock. - // Stack Overflow Check. - unsigned exitFrameSize = m_graph.requiredRegisterCountForExit() * sizeof(Register); - PatchpointValue* stackOverflowHandler = m_out.patchpoint(Void); - stackOverflowHandler->appendSomeRegister(m_callFrame); - stackOverflowHandler->appendSomeRegister(m_vmValue); - stackOverflowHandler->clobber(RegisterSetBuilder::macroClobberedGPRs()); - stackOverflowHandler->numGPScratchRegisters = 1; - stackOverflowHandler->setGenerator( - [=] (CCallHelpers& jit, const StackmapGenerationParams& params) { - AllowMacroScratchRegisterUsage allowScratch(jit); - GPRReg fp = params[0].gpr(); - GPRReg vmGPR = params[1].gpr(); - GPRReg scratch = params.gpScratch(0); - - unsigned ftlFrameSize = params.proc().frameSize(); - unsigned maxFrameSize = std::max(exitFrameSize, ftlFrameSize); - - jit.jitAssertCodeBlockOnCallFrameWithType(scratch, JITType::FTLJIT); - - jit.addPtr(MacroAssembler::TrustedImm32(-maxFrameSize), fp, scratch); - MacroAssembler::JumpList stackOverflow; - stackOverflow.append(jit.branchPtr(MacroAssembler::GreaterThan, CCallHelpers::Address(vmGPR, VM::offsetOfSoftStackLimit()), scratch)); - - params.addLatePath([=] (CCallHelpers& jit) { - AllowMacroScratchRegisterUsage allowScratch(jit); - - stackOverflow.link(&jit); - - // FIXME: We would not have to do this if the stack check was part of the Air - // prologue. Then, we would know that there is no way for the callee-saves to - // get clobbered. - // https://bugs.webkit.org/show_bug.cgi?id=172456 - jit.emitRestore(params.proc().calleeSaveRegisterAtOffsetList()); - jit.jumpThunk(CodeLocationLabel(vm->getCTIStub(CommonJITThunkID::ThrowStackOverflowAtPrologue).retaggedCode())); - }); - }); - LBasicBlock firstDFGBasicBlock = lowBlock(m_graph.block(0)); { @@ -8653,12 +8646,12 @@ setInt32(vmCall(Int32, operationArrayIndexOfValueDouble, storage, lowJSValue(searchElementEdge), startIndex)); return; case Array::Contiguous: - // We have to keep base alive since that keeps content of storage alive. - ensureStillAliveHere(base); if (isArrayIncludes) setBoolean(vmCall(Int32, operationArrayIncludesValueInt32OrContiguous, weakPointer(globalObject), storage, lowJSValue(searchElementEdge), startIndex)); else setInt32(vmCall(Int32, operationArrayIndexOfValueInt32OrContiguous, weakPointer(globalObject), storage, lowJSValue(searchElementEdge), startIndex)); + // We have to keep base alive since that keeps content of storage alive. + ensureStillAliveHere(base); return; case Array::Int32: if (isArrayIncludes) @@ -17565,6 +17558,9 @@ ObjectMaterializationData& data = m_node->objectMaterializationData(); + // Contiguous element values may be GC cell pointers; keep them live across allocateJSArray + // since the butterfly is unowned at allocateCell and the GC won't trace its contents. + Vector contiguousElementValues; for (unsigned i = 0; i < data.m_properties.size(); ++i) { // Add two to account for `size` and `butterfly` Edge edge = m_graph.varArgChild(m_node, i + 2); @@ -17573,10 +17569,15 @@ case ALL_DOUBLE_INDEXING_TYPES: m_out.storeDouble(lowDouble(edge), butterfly, m_heaps.indexedDoubleProperties[index]); break; - case ALL_INT32_INDEXING_TYPES: + case ALL_INT32_INDEXING_TYPES: { + LValue value = lowJSValue(edge, ManualOperandSpeculation); // We already speculated it so it is fine. + m_out.store64(value, butterfly, m_heaps.forIndexingType(indexingType)->at(index)); + break; + } case ALL_CONTIGUOUS_INDEXING_TYPES: { LValue value = lowJSValue(edge, ManualOperandSpeculation); // We already speculated it so it is fine. m_out.store64(value, butterfly, m_heaps.forIndexingType(indexingType)->at(index)); + contiguousElementValues.append(value); break; } default: @@ -17586,6 +17587,8 @@ } LValue array = allocateJSArray(indexingType, publicLength, butterfly); + // Keep contiguous element values live across the GC point in allocateJSArray's slow path. + ensureStillAliveHere(contiguousElementValues); setJSValue(array); mutatorFence(); } @@ -25268,16 +25271,22 @@ return true; } - void ensureStillAliveHere(LValue value) + void ensureStillAliveHereImpl(const Vector& values) { + if (values.isEmpty()) + return; PatchpointValue* patchpoint = m_out.patchpoint(Void); patchpoint->effects = Effects::none(); patchpoint->effects.writesLocalState = true; patchpoint->effects.reads = HeapRange::top(); - patchpoint->append(value, ValueRep::ColdAny); + for (LValue value : values) + patchpoint->append(value, ValueRep::ColdAny); patchpoint->setGenerator([=] (CCallHelpers&, const StackmapGenerationParams&) { }); } + void ensureStillAliveHere(const Vector& values) { ensureStillAliveHereImpl(values); } + void ensureStillAliveHere(LValue value) { ensureStillAliveHereImpl({ value }); } + LValue toButterfly(LValue immutableButterfly) { return m_out.addPtr(immutableButterfly, JSCellButterfly::offsetOfData()); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp 2026-02-23 14:40:52.308317700 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp 2026-07-09 07:12:41.776803300 +0000 @@ -191,11 +191,11 @@ materialization->properties().size()); } - ScratchBuffer* scratchBuffer = vm.scratchBufferForSize( - sizeof(EncodedJSValue) * ( - exit.m_descriptor->m_values.size() + numMaterializations + maxMaterializationNumArguments) + + const size_t scratchBufferSize = + sizeof(EncodedJSValue) * (exit.m_descriptor->m_values.size() + numMaterializations + maxMaterializationNumArguments) + requiredScratchMemorySizeInBytes() + - codeBlock->jitCode()->calleeSaveRegisters()->sizeOfAreaInBytes()); + codeBlock->jitCode()->calleeSaveRegisters()->sizeOfAreaInBytes(); + ScratchBuffer* scratchBuffer = vm.scratchBufferForSize(scratchBufferSize); EncodedJSValue* scratch = scratchBuffer ? static_cast(scratchBuffer->dataBuffer()) : nullptr; EncodedJSValue* materializationPointers = scratch + exit.m_descriptor->m_values.size(); EncodedJSValue* materializationArguments = materializationPointers + numMaterializations; @@ -446,7 +446,14 @@ } spooler.finalizeGPR(); } - + + // The scratch buffer can become the sole retainer of saved on-stack values, so set the + // active length for the GC. + if (scratchBuffer) { + jit.move(CCallHelpers::TrustedImmPtr(scratchBuffer->addressOfActiveLength()), GPRInfo::regT0); + jit.storePtr(CCallHelpers::TrustedImm32(scratchBufferSize), CCallHelpers::Address(GPRInfo::regT0)); + } + // Henceforth we make it look like the exiting function was called through a register // preservation wrapper. This implies that FP must be nudged down by a certain amount. Then // we restore the various things according to either exit.m_descriptor->m_values or by copying from the @@ -631,7 +638,12 @@ } spooler.finalizeGPR(); } - + + if (scratchBuffer) { + jit.move(CCallHelpers::TrustedImmPtr(scratchBuffer->addressOfActiveLength()), GPRInfo::regT0); + jit.storePtr(CCallHelpers::TrustedImm32(0), CCallHelpers::Address(GPRInfo::regT0)); + } + handleExitCounts(vm, jit, exit); reifyInlinedCallFrames(jit, exit); adjustAndJumpToTarget(vm, jit, exit); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/ftl/FTLOperations.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/ftl/FTLOperations.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/ftl/FTLOperations.cpp 2026-03-17 09:27:34.222005800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/ftl/FTLOperations.cpp 2026-07-09 07:12:41.776803300 +0000 @@ -95,6 +95,15 @@ JSValue value = JSValue::decode(values[i]); unsigned index = property.location().info(); + if (value.isEmpty()) { + ASSERT(!hasDouble(materialization->indexingType())); + if (hasAnyArrayStorage(array->indexingType())) + array->butterfly()->arrayStorage()->m_vector[index].clear(); + else + array->butterfly()->contiguous().atUnsafe(index).clear(); + continue; + } + array->putDirectIndex(globalObject, index, value); scope.assertNoExceptionExceptTermination(); } @@ -280,7 +289,13 @@ } case PhantomNewArrayWithButterfly: { - Structure* structure = globalObject->arrayStructureForIndexingTypeDuringAllocation(materialization->indexingType()); + // Rematerialized butterflies are always non-ArrayStorage. However, isHavingABadTime could + // have become true between the FTL compilation and the rematerialization, which would have + // switched arrayStructureForIndexingTypeDuringAllocation to SlowPutArrayStorage for all + // indexing types. To avoid a layout mismatch, the original Array structure is used to + // rematerialize the Array initially. If we're having a bad time, the layout is switched to + // SlowPutArrayStorage below. + Structure* structure = globalObject->originalArrayStructureForIndexingType(materialization->indexingType()); Butterfly* butterfly = nullptr; for (unsigned i = 0; i < materialization->properties().size(); ++i) { @@ -321,6 +336,14 @@ butterfly->contiguous().atUnsafe(index).setStartingValue(jsNumber(sentinel)); } + if (globalObject->isHavingABadTime()) [[unlikely]] { +#if ASSERT_ENABLED + Structure* originalStructure = globalObject->arrayStructureForIndexingTypeDuringAllocation(materialization->indexingType()); + ASSERT(!originalStructure || hasSlowPutArrayStorage(originalStructure->indexingType())); +#endif + result->switchToSlowPutArrayStorage(vm); + } + return result; } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/heap/ConservativeRoots.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/heap/ConservativeRoots.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/heap/ConservativeRoots.cpp 2026-01-20 14:08:31.995706800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/heap/ConservativeRoots.cpp 2026-07-09 07:12:41.776803300 +0000 @@ -33,6 +33,7 @@ #include "JITStubRoutineSet.h" #include "JSCast.h" #include "JSCellInlines.h" +#include "JSString.h" #include "MarkedBlockInlines.h" #include "WasmCallee.h" #include @@ -193,7 +194,15 @@ // Only return early if we are marking a non-butterfly, since butterflies without indexed properties could point past the end of their allocation. // If we do, and there is another live butterfly immediately following the first, we will mark the latter one here but we still need to // mark the former. - return isLive && !mayHaveIndexingHeader(cellKind); + if (isLive && !mayHaveIndexingHeader(cellKind)) { + static_assert(!JSString::numberOfLowerTierPreciseCells && !JSRopeString::numberOfLowerTierPreciseCells, "We only check for strings in MarkedBlocks so Strings better not have precise allocations"); + // Since we're looking for strings we only need to check if we know we're not looking at an allocation with an IndexingHeader. + // FIXME: If we wanted to make this more performant we could have a JSString HeapCell::Kind or embed the JSType in the MarkedBlock::Handle. + if (auto* string = jsDynamicCast(std::bit_cast(pointer))) + m_heap.m_discoveredAccessedStringsFromGCOwnedDataScope.add(string); + return true; + } + return false; }; if (isJSCellKind(cellKind)) { diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/heap/GCOwnedDataScope.h webkit2gtk-2.52.5/Source/JavaScriptCore/heap/GCOwnedDataScope.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/heap/GCOwnedDataScope.h 2026-02-23 14:40:52.315317600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/heap/GCOwnedDataScope.h 2026-07-09 07:12:41.780803200 +0000 @@ -26,12 +26,12 @@ #pragma once #include +#include +#include #include namespace JSC { -class JSCell; - // This class is used return data owned by a JSCell. Consider: // int foo(JSString* jsString) // { @@ -74,9 +74,21 @@ GCOwnedDataScope(const JSCell* cell, T value) : owner(cell) , data(value) - { } - - ~GCOwnedDataScope() { ensureStillAliveHere(owner); } + { +#if ASSERT_ENABLED + if (!owner->vm().heap.m_topGCOwnedDataScope) + owner->vm().heap.m_topGCOwnedDataScope = this; +#endif + } + + ~GCOwnedDataScope() + { +#if ASSERT_ENABLED + if (owner && owner->vm().heap.m_topGCOwnedDataScope == this) + owner->vm().heap.m_topGCOwnedDataScope = nullptr; +#endif + ensureStillAliveHere(owner); + } operator const T() const LIFETIME_BOUND { return data; } operator T() LIFETIME_BOUND { return data; } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/heap/Heap.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/heap/Heap.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/heap/Heap.cpp 2026-02-23 14:40:52.316317800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/heap/Heap.cpp 2026-07-09 07:12:41.780803200 +0000 @@ -792,6 +792,9 @@ if (collectionScope == CollectionScope::Full) { finalizeMarkedUnconditionalFinalizers(structureSpace, collectionScope); finalizeMarkedUnconditionalFinalizers(brandedStructureSpace, collectionScope); +#if ENABLE(WEBASSEMBLY) + finalizeMarkedUnconditionalFinalizers(webAssemblyGCStructureSpace, collectionScope); +#endif } finalizeMarkedUnconditionalFinalizers(structureRareDataSpace, collectionScope); finalizeMarkedUnconditionalFinalizers(unlinkedFunctionExecutableSpaceAndSet.set, collectionScope); @@ -1218,6 +1221,33 @@ m_mutatorMarkStack->append(cell); } +void Heap::clearConcurrentRetainedDataIfPossible() +{ + // It wouldn't be safe to clear the list if it's possible to have a GCOwnedDataScope on the stack since + // m_possiblyAccessedStringsFromConcurrentThreadsOrGCOwnedDataScope + // is what's keeping the backing bytes alive. +#if ASSERT_ENABLED + if (!m_topGCOwnedDataScope) [[unlikely]] + return; +#endif + if (!vm().entryScope) [[unlikely]] + return; + + if (!m_possiblyAccessedStringsFromConcurrentThreadsOrGCOwnedDataScope.size()) + return; +#if ENABLE(JIT) + auto* worklist = JITWorklist::existingGlobalWorklistOrNull(); + // We need to make sure no JIT thread could be looking at one of our old strings. Any thread that starts after + // this check will load the new StringImpl rather than the one in this list so we're safe to delete these as + // long as none were running at the time of this check. + if (!worklist || !worklist->totalOngoingCompilations()) { +#else + { +#endif + m_possiblyAccessedStringsFromConcurrentThreadsOrGCOwnedDataScope.clear(); + } +} + void Heap::sweepSynchronously() { if (!Options::useGC()) [[unlikely]] @@ -2293,7 +2323,10 @@ vm().keyAtomStringCache.clear(); vm().stringSplitCache.clear(); - m_possiblyAccessedStringsFromConcurrentThreads.clear(); + m_possiblyAccessedStringsFromConcurrentThreadsOrGCOwnedDataScope.removeAllMatching([&](const auto& iter) { + return !m_discoveredAccessedStringsFromGCOwnedDataScope.contains(iter.first); + }); + m_discoveredAccessedStringsFromGCOwnedDataScope.clear(); immutableButterflyToStringCache.clear(); @@ -2999,7 +3032,6 @@ // If we tried to scan while not under a safepoint we could stop a thread that's in the process of calling // one of the callees we are looking for. // FIXME: Should we have two constraints for this? One for concurrent and one under safepoint at the bitter end. - // TODO: Verify this part only runs on one thread. ASSERT(worldIsStopped()); ConservativeRoots conservativeRoots(*this); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/heap/Heap.h webkit2gtk-2.52.5/Source/JavaScriptCore/heap/Heap.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/heap/Heap.h 2026-02-23 14:40:52.316317800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/heap/Heap.h 2026-07-09 07:12:41.780803200 +0000 @@ -57,6 +57,7 @@ #include #include #include +#include #include WTF_ALLOW_UNSAFE_BUFFER_USAGE_BEGIN @@ -608,11 +609,13 @@ void setKeepVerifierSlotVisitor(); void clearVerifierSlotVisitor(); - void appendPossiblyAccessedStringFromConcurrentThreads(String&& string) + void appendPossiblyAccessedStringFromConcurrentThreadsOrGCOwnedDataScope(const JSString* owner, String&& string) { - m_possiblyAccessedStringsFromConcurrentThreads.append(WTF::move(string)); + m_possiblyAccessedStringsFromConcurrentThreadsOrGCOwnedDataScope.append({ owner, WTF::move(string) }); } + void clearConcurrentRetainedDataIfPossible(); + bool isInPhase(CollectorPhase phase) const { return m_currentPhase == phase; } #if ENABLE(WEBASSEMBLY) @@ -902,7 +905,15 @@ Vector m_logicallyEmptyWeakBlocks; size_t m_indexOfNextLogicallyEmptyWeakBlockToSweep { WTF::notFound }; - Vector m_possiblyAccessedStringsFromConcurrentThreads; +#if ASSERT_ENABLED + template friend struct GCOwnedDataScope; + const void* m_topGCOwnedDataScope { nullptr }; +#endif + // Use a SegmentedVector rather than a Vector because we don't want to have to copy in order to grow the buffer. + // Since this list is walked once to deref all the strings + // We don't need fast access. + SegmentedVector, 256, 10, SegmentedVectorGrowthPolicy::Doubling> m_possiblyAccessedStringsFromConcurrentThreadsOrGCOwnedDataScope; + UncheckedKeyHashSet m_discoveredAccessedStringsFromGCOwnedDataScope; RefPtr m_fullActivityCallback; RefPtr m_edenActivityCallback; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/heap/IncrementalSweeper.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/heap/IncrementalSweeper.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/heap/IncrementalSweeper.cpp 2026-01-20 14:08:32.018706800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/heap/IncrementalSweeper.cpp 2026-07-09 07:12:41.780803200 +0000 @@ -73,6 +73,8 @@ if (Options::useTracePoints()) [[unlikely]] traceScope.emplace(IncrementalSweepStart, IncrementalSweepEnd, vm.heap.size(), vm.heap.capacity()); + vm.heap.clearConcurrentRetainedDataIfPossible(); + while (sweepNextBlock(vm, trigger)) { if (MonotonicTime::now() < deadline) continue; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/inspector/JSInjectedScriptHost.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/inspector/JSInjectedScriptHost.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/inspector/JSInjectedScriptHost.cpp 2026-02-23 14:40:52.332317600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/inspector/JSInjectedScriptHost.cpp 2026-07-09 07:12:41.780803200 +0000 @@ -70,6 +70,7 @@ #include #include #include +#include #include #include #include @@ -613,7 +614,7 @@ MarkedArgumentBuffer buffer; auto fetchCount = callFrame->argument(1).toIntegerOrInfinity(globalObject); - weakMap->takeSnapshot(buffer, fetchCount >= 0 ? static_cast(fetchCount) : 0); + weakMap->takeSnapshot(buffer, clampTo(fetchCount)); ASSERT(!buffer.hasOverflowed()); JSArray* array = constructEmptyArray(globalObject, nullptr); @@ -656,7 +657,7 @@ MarkedArgumentBuffer buffer; auto fetchCount = callFrame->argument(1).toIntegerOrInfinity(globalObject); - weakSet->takeSnapshot(buffer, fetchCount >= 0 ? static_cast(fetchCount) : 0); + weakSet->takeSnapshot(buffer, clampTo(fetchCount)); ASSERT(!buffer.hasOverflowed()); JSArray* array = constructEmptyArray(globalObject, nullptr); @@ -740,7 +741,7 @@ double fetchDouble = numberToFetchArg.toIntegerOrInfinity(globalObject); RETURN_IF_EXCEPTION(scope, { }); if (fetchDouble >= 0) - numberToFetch = static_cast(fetchDouble); + numberToFetch = clampTo(fetchDouble); JSArray* array = constructEmptyArray(globalObject, nullptr); RETURN_IF_EXCEPTION(scope, { }); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/interpreter/Interpreter.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/interpreter/Interpreter.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/interpreter/Interpreter.cpp 2026-02-23 14:40:52.352317600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/interpreter/Interpreter.cpp 2026-07-09 07:12:41.780803200 +0000 @@ -173,6 +173,12 @@ RETURN_IF_EXCEPTION(scope, { }); DirectEvalExecutable* eval = callerBaselineCodeBlock->directEvalCodeCache().get(cacheKey); if (!eval) { + // GC needs to be deferred as it's possible cacheKey holds one of programString's fibers' + // contents as a raw StringImpl*. Even though programString is on the stack, rope + // flattening could cause that fiber JSString to be unreachable by the GC, causing its + // content StringImpl to be deref'd if when the JSString is swept. + DeferGC deferGC(vm); + auto programSource = programString->value(globalObject).data; if (SourceProfiler::g_profilerHook) [[unlikely]] { SourceTaintedOrigin sourceTaintedOrigin = computeNewSourceTaintedOriginFromStack(vm, callFrame); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/jit/BaselineJITRegisters.h webkit2gtk-2.52.5/Source/JavaScriptCore/jit/BaselineJITRegisters.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/jit/BaselineJITRegisters.h 2026-02-23 14:40:52.355317600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/jit/BaselineJITRegisters.h 2026-07-09 07:12:41.780803200 +0000 @@ -307,8 +307,9 @@ static constexpr GPRReg scratch1GPR { scratchRegisters[0] }; static constexpr GPRReg scratch2GPR { scratchRegisters[1] }; static constexpr GPRReg scratch3GPR { scratchRegisters[2] }; + static constexpr JSValueRegs scratchJSR { JSValueRegs::withTwoAvailableRegs(scratch1GPR, scratch2GPR) }; - static_assert(noOverlap(baseJSR, stubInfoGPR, scratch1GPR, scratch2GPR, scratch3GPR, GPRInfo::handlerGPR), "Required for call to slow operation"); + static_assert(noOverlap(baseJSR, stubInfoGPR, scratchJSR, scratch3GPR, GPRInfo::handlerGPR), "Required for call to slow operation"); static_assert(noOverlap(resultJSR.payloadGPR(), stubInfoGPR)); } @@ -323,7 +324,9 @@ static constexpr GPRReg scratch1GPR { scratchRegisters[0] }; static constexpr GPRReg scratch2GPR { scratchRegisters[1] }; static constexpr GPRReg scratch3GPR { scratchRegisters[2] }; - static_assert(noOverlap(baseJSR, propertyJSR, stubInfoGPR, scratch1GPR, scratch2GPR, scratch3GPR, GPRInfo::handlerGPR), "Required for call to slow operation"); + static constexpr JSValueRegs scratchJSR { JSValueRegs::withTwoAvailableRegs(scratch1GPR, scratch2GPR) }; + + static_assert(noOverlap(baseJSR, propertyJSR, stubInfoGPR, scratchJSR, scratch3GPR, GPRInfo::handlerGPR), "Required for call to slow operation"); static_assert(noOverlap(resultJSR.payloadGPR(), stubInfoGPR)); } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/jit/ExecutableAllocator.h webkit2gtk-2.52.5/Source/JavaScriptCore/jit/ExecutableAllocator.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/jit/ExecutableAllocator.h 2026-02-23 14:40:52.357317400 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/jit/ExecutableAllocator.h 2026-07-09 07:12:41.780803200 +0000 @@ -390,6 +390,14 @@ WTF_ALLOW_UNSAFE_BUFFER_USAGE_END } +template +inline void* performJITMemcpy(void *dst, const void *src, size_t n) +{ +WTF_ALLOW_UNSAFE_BUFFER_USAGE_BEGIN + return memcpy(dst, src, n); +WTF_ALLOW_UNSAFE_BUFFER_USAGE_END +} + inline bool isJITPC(void*) { return false; } #endif // ENABLE(JIT) diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/jit/GCAwareJITStubRoutine.h webkit2gtk-2.52.5/Source/JavaScriptCore/jit/GCAwareJITStubRoutine.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/jit/GCAwareJITStubRoutine.h 2026-02-23 14:40:52.357317400 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/jit/GCAwareJITStubRoutine.h 2026-07-09 07:12:41.780803200 +0000 @@ -58,6 +58,7 @@ public: using Base = JITStubRoutine; friend class JITStubRoutine; + friend class JSDollarVMHelper; GCAwareJITStubRoutine(Type, const MacroAssemblerCodeRef&, JSCell* owner, bool isCodeImmutable); static Ref create(VM& vm, const MacroAssemblerCodeRef& code, JSCell* owner, bool isCodeImmutable) diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/jit/JIT.h webkit2gtk-2.52.5/Source/JavaScriptCore/jit/JIT.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/jit/JIT.h 2026-02-23 14:40:52.359317500 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/jit/JIT.h 2026-07-09 07:12:41.780803200 +0000 @@ -249,9 +249,9 @@ void loadCodeBlockConstant(VirtualRegister, JSValueRegs); void loadCodeBlockConstantPayload(VirtualRegister, RegisterID); -#if USE(JSVALUE32_64) + #if USE(JSVALUE32_64) void loadCodeBlockConstantTag(VirtualRegister, RegisterID); -#endif + #endif void exceptionCheck(Jump jumpToHandler); void exceptionCheck(); @@ -282,27 +282,28 @@ template void emitPutCallResult(const Op&); -#if USE(JSVALUE64) + #if USE(JSVALUE64) template void compileOpStrictEq(const JSInstruction*); template void compileOpStrictEqJump(const JSInstruction*); -#elif USE(JSVALUE32_64) + #elif USE(JSVALUE32_64) void compileOpEqCommon(VirtualRegister src1, VirtualRegister src2); void compileOpEqSlowCommon(Vector::iterator&); void compileOpStrictEqCommon(VirtualRegister src1, VirtualRegister src2); -#endif + #endif enum class WriteBarrierMode { UnconditionalWriteBarrier, ShouldFilterBase, ShouldFilterValue, ShouldFilterBaseAndValue }; -#if COMPILER(GCC) && GCC_VERSION < 120300 + #if COMPILER(GCC) && GCC_VERSION < 120300 // Workaround for GCC < 12.3.0 ICE with using-enum in templates: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103081 static constexpr auto UnconditionalWriteBarrier = WriteBarrierMode::UnconditionalWriteBarrier; static constexpr auto ShouldFilterBase = WriteBarrierMode::ShouldFilterBase; static constexpr auto ShouldFilterValue = WriteBarrierMode::ShouldFilterValue; static constexpr auto ShouldFilterBaseAndValue = WriteBarrierMode::ShouldFilterBaseAndValue; -#else + #else using enum WriteBarrierMode; -#endif + #endif // value register in write barrier is used before any scratch registers // so may safely be the same as either of the scratch registers. + void emitWriteBarrier(JSValueRegs owner, WriteBarrierMode); void emitWriteBarrier(VirtualRegister owner, WriteBarrierMode); void emitWriteBarrier(VirtualRegister owner, VirtualRegister value, WriteBarrierMode); void emitWriteBarrier(JSCell* owner); @@ -337,9 +338,9 @@ void emitGetVirtualRegisterPayload(VirtualRegister src, RegisterID dst); void emitPutVirtualRegister(VirtualRegister dst, JSValueRegs src); -#if USE(JSVALUE32_64) + #if USE(JSVALUE32_64) void emitGetVirtualRegisterTag(VirtualRegister src, RegisterID dst); -#elif USE(JSVALUE64) + #elif USE(JSVALUE64) // Machine register variants purely for convenience void emitGetVirtualRegister(VirtualRegister src, RegisterID dst); void emitPutVirtualRegister(VirtualRegister dst, RegisterID from); @@ -347,7 +348,7 @@ Jump emitJumpIfNotInt(RegisterID, RegisterID, RegisterID scratch); void emitJumpSlowCaseIfNotInt(RegisterID, RegisterID, RegisterID scratch); void emitJumpSlowCaseIfNotInt(RegisterID); -#endif + #endif void emitJumpSlowCaseIfNotInt(JSValueRegs, JSValueRegs, RegisterID scratch); void emitJumpSlowCaseIfNotInt(JSValueRegs); @@ -436,11 +437,11 @@ void emit_op_is_undefined_or_null(const JSInstruction*); void emit_op_is_boolean(const JSInstruction*); void emit_op_is_number(const JSInstruction*); -#if USE(BIGINT32) + #if USE(BIGINT32) void emit_op_is_big_int(const JSInstruction*); -#else + #else [[noreturn]] void emit_op_is_big_int(const JSInstruction*); -#endif + #endif void emit_op_is_object(const JSInstruction*); void emit_op_is_cell_with_type(const JSInstruction*); void emit_op_has_structure_with_flags(const JSInstruction*); @@ -644,10 +645,10 @@ JSValue getConstantOperand(VirtualRegister); -#if USE(JSVALUE64) + #if USE(JSVALUE64) bool isOperandConstantDouble(VirtualRegister); double getOperandConstantDouble(VirtualRegister src); -#endif + #endif bool isOperandConstantInt(VirtualRegister); int32_t getOperandConstantInt(VirtualRegister src); bool isOperandConstantChar(VirtualRegister); @@ -815,38 +816,38 @@ int jumpTarget(const JSInstruction*, int target); -#ifndef NDEBUG + #ifndef NDEBUG void printBytecodeOperandTypes(VirtualRegister src1, VirtualRegister src2); -#endif + #endif -#if ENABLE(SAMPLING_FLAGS) + #if ENABLE(SAMPLING_FLAGS) void setSamplingFlag(int32_t); void clearSamplingFlag(int32_t); -#endif + #endif -#if ENABLE(SAMPLING_COUNTERS) + #if ENABLE(SAMPLING_COUNTERS) void emitCount(AbstractSamplingCounter&, int32_t = 1); -#endif + #endif -#if ENABLE(DFG_JIT) + #if ENABLE(DFG_JIT) bool canBeOptimized() { return m_canBeOptimized; } bool shouldEmitProfiling() { return m_shouldEmitProfiling; } -#else + #else bool canBeOptimized() { return false; } // Enables use of value profiler with tiered compilation turned off, // in which case all code gets profiled. bool shouldEmitProfiling() { return false; } -#endif + #endif void emitMaterializeMetadataAndConstantPoolRegisters(); void emitSaveCalleeSaves(); void emitRestoreCalleeSaves(); -#if ASSERT_ENABLED + #if ASSERT_ENABLED static MacroAssemblerCodeRef consistencyCheckGenerator(VM&); void emitConsistencyCheck(); -#endif + #endif static bool reportCompileTimes(); static bool computeCompileTimes(); @@ -881,10 +882,10 @@ Vector m_slowCases; Vector m_switches; -#if ASSERT_ENABLED + #if ASSERT_ENABLED Label m_consistencyCheckLabel; Vector m_consistencyCheckCalls; -#endif + #endif unsigned m_getByIdIndex { UINT_MAX }; unsigned m_getByValIndex { UINT_MAX }; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/jit/JITOperations.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/jit/JITOperations.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/jit/JITOperations.cpp 2026-02-23 14:40:52.363317500 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/jit/JITOperations.cpp 2026-07-09 07:12:41.784803200 +0000 @@ -401,13 +401,15 @@ static ALWAYS_INLINE JSValue getByIdMegamorphic(JSGlobalObject* globalObject, VM& vm, CallFrame* callFrame, StructureStubInfo* stubInfo, JSValue baseValue, JSValue thisValue, CacheableIdentifier identifier, GetByKind kind) { + auto scope = DECLARE_THROW_SCOPE(vm); + auto* uid = identifier.uid(); PropertySlot slot(thisValue, PropertySlot::InternalMethodType::Get); if (!baseValue.isObject()) [[unlikely]] { if (stubInfo && stubInfo->considerRepatchingCacheMegamorphic(vm)) repatchGetBySlowPathCall(callFrame->codeBlock(), *stubInfo, kind); - return baseValue.get(globalObject, uid, slot); + RELEASE_AND_RETURN(scope, baseValue.get(globalObject, uid, slot)); } JSObject* baseObject = asObject(baseValue); @@ -418,8 +420,10 @@ if (TypeInfo::overridesGetOwnPropertySlot(object->inlineTypeFlags()) && object->type() != ArrayType && object->type() != JSFunctionType && object != globalObject->arrayPrototype()) [[unlikely]] { if (stubInfo && stubInfo->considerRepatchingCacheMegamorphic(vm)) repatchGetBySlowPathCall(callFrame->codeBlock(), *stubInfo, kind); - if (object->getNonIndexPropertySlot(globalObject, uid, slot)) - return slot.getValue(globalObject, uid); + bool hasProperty = object->getNonIndexPropertySlot(globalObject, uid, slot); + RETURN_IF_EXCEPTION(scope, { }); + if (hasProperty) + RELEASE_AND_RETURN(scope, slot.getValue(globalObject, uid)); return jsUndefined(); } @@ -444,7 +448,7 @@ if (shouldGiveUp && stubInfo && stubInfo->considerRepatchingCacheMegamorphic(vm)) repatchGetBySlowPathCall(callFrame->codeBlock(), *stubInfo, kind); } - return slot.getValue(globalObject, uid); + RELEASE_AND_RETURN(scope, slot.getValue(globalObject, uid)); } if (!structure->propertyAccessesAreCacheableForAbsence()) { diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/jit/JITPropertyAccess.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/jit/JITPropertyAccess.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/jit/JITPropertyAccess.cpp 2026-02-23 14:40:52.364317400 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/jit/JITPropertyAccess.cpp 2026-07-09 07:12:41.784803200 +0000 @@ -427,6 +427,7 @@ using BaselineJITRegisters::DelById::baseJSR; using BaselineJITRegisters::DelById::resultJSR; using BaselineJITRegisters::DelById::stubInfoGPR; + using BaselineJITRegisters::DelById::scratchJSR; emitGetVirtualRegister(base, baseJSR); @@ -445,6 +446,7 @@ m_delByIds.append(gen); setFastPathResumePoint(); + emitGetVirtualRegister(base, scratchJSR); // IC may clobber baseJSR so reload from virtual register boxBoolean(resultJSR.payloadGPR(), resultJSR); emitPutVirtualRegister(dst, resultJSR); @@ -452,7 +454,7 @@ // We should emit write-barrier at the end of sequence since write-barrier clobbers registers. // FIXME: Use UnconditionalWriteBarrier in Baseline effectively to reduce code size. // https://bugs.webkit.org/show_bug.cgi?id=209395 - emitWriteBarrier(base, ShouldFilterBase); + emitWriteBarrier(scratchJSR, ShouldFilterBase); } void JIT::emitSlow_op_del_by_id(const JSInstruction*, Vector::iterator& iter) @@ -475,6 +477,7 @@ using BaselineJITRegisters::DelByVal::propertyJSR; using BaselineJITRegisters::DelByVal::resultJSR; using BaselineJITRegisters::DelByVal::stubInfoGPR; + using BaselineJITRegisters::DelByVal::scratchJSR; emitGetVirtualRegister(base, baseJSR); emitGetVirtualRegister(property, propertyJSR); @@ -495,6 +498,7 @@ m_delByVals.append(gen); setFastPathResumePoint(); + emitGetVirtualRegister(base, scratchJSR); // IC may clobber baseJSR so reload from virtual register boxBoolean(resultJSR.payloadGPR(), resultJSR); emitPutVirtualRegister(dst, resultJSR); @@ -502,7 +506,7 @@ // IC can write new Structure without write-barrier if a base is cell. // FIXME: Use UnconditionalWriteBarrier in Baseline effectively to reduce code size. // https://bugs.webkit.org/show_bug.cgi?id=209395 - emitWriteBarrier(base, ShouldFilterBase); + emitWriteBarrier(scratchJSR, ShouldFilterBase); } void JIT::emitSlow_op_del_by_val(const JSInstruction*, Vector::iterator& iter) @@ -2313,6 +2317,26 @@ valueNotCell.link(this); } +void JIT::emitWriteBarrier(JSValueRegs ownerJSR, WriteBarrierMode mode) +{ + ASSERT(mode == UnconditionalWriteBarrier || mode == ShouldFilterBase); + + constexpr GPRReg tempGPR = regT0; + + ASSERT(noOverlap(tempGPR, ownerJSR)); + + Jump ownerNotCell; + if (mode == ShouldFilterBase) + ownerNotCell = branchIfNotCell(ownerJSR); + + Jump ownerIsRememberedOrInEden = barrierBranch(vm(), ownerJSR.payloadGPR(), tempGPR); + callOperationNoExceptionCheck(operationWriteBarrierSlowPath, TrustedImmPtr(&vm()), ownerJSR.payloadGPR()); + ownerIsRememberedOrInEden.link(this); + + if (mode == ShouldFilterBase) + ownerNotCell.link(this); +} + void JIT::emitWriteBarrier(VirtualRegister owner, WriteBarrierMode mode) { ASSERT(mode == UnconditionalWriteBarrier || mode == ShouldFilterBase); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/jit/JITWorklist.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/jit/JITWorklist.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/jit/JITWorklist.cpp 2026-02-23 14:40:52.365317300 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/jit/JITWorklist.cpp 2026-07-09 07:12:41.784803200 +0000 @@ -195,6 +195,12 @@ return queueLength; } +size_t JITWorklist::totalOngoingCompilations() const +{ + Locker locker { *m_lock }; + return totalOngoingCompilations(locker); +} + size_t JITWorklist::totalOngoingCompilations(const AbstractLocker&) const { size_t total = 0; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/jit/JITWorklist.h webkit2gtk-2.52.5/Source/JavaScriptCore/jit/JITWorklist.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/jit/JITWorklist.h 2026-02-23 14:40:52.365317300 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/jit/JITWorklist.h 2026-07-09 07:12:41.784803200 +0000 @@ -85,6 +85,8 @@ void dump(PrintStream&) const; + size_t totalOngoingCompilations() const; + private: JITWorklist(); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/jsc.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/jsc.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/jsc.cpp 2026-02-23 14:40:52.370317500 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/jsc.cpp 2026-07-09 07:12:41.784803200 +0000 @@ -2954,9 +2954,10 @@ if (!callback) return throwVMTypeError(globalObject, scope, "First argument is not a JS function"_s); - auto ticket = vm.deferredWorkTimer->addPendingWork(DeferredWorkTimer::WorkType::AtSomePoint, vm, callback, { }); - auto dispatch = [callback, ticket] { - callback->vm().deferredWorkTimer->scheduleWorkSoon(ticket, [callback](DeferredWorkTimer::Ticket) { + auto weakTicket = vm.deferredWorkTimer->addPendingWork(DeferredWorkTimer::WorkType::AtSomePoint, vm, callback, { }); + auto dispatch = [weakTicket = WTF::move(weakTicket), vmPtr = &vm] { + vmPtr->deferredWorkTimer->scheduleWorkSoonIfActive(weakTicket, [](DeferredWorkTimer::Ticket& ticket) { + auto* callback = jsCast(ticket.target()); JSGlobalObject* globalObject = callback->globalObject(); MarkedArgumentBuffer args; call(globalObject, callback, jsUndefined(), args, "You shouldn't see this..."_s); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/llint/InPlaceInterpreter.asm webkit2gtk-2.52.5/Source/JavaScriptCore/llint/InPlaceInterpreter.asm --- webkit2gtk-2.52.3/Source/JavaScriptCore/llint/InPlaceInterpreter.asm 2026-02-23 14:40:52.371317400 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/llint/InPlaceInterpreter.asm 2026-07-09 07:12:41.784803200 +0000 @@ -420,7 +420,7 @@ # OSR macro ipintPrologueOSR(increment) -if JIT +if WEBASSEMBLY_BBQJIT loadp UnboxedWasmCalleeStackSlot[cfr], ws0 baddis increment, Wasm::IPIntCallee::m_tierUpCounter + Wasm::IPIntTierUpCounter::m_counter[ws0], .continue @@ -457,11 +457,11 @@ if ARMv7 break # FIXME: ipint support. end # ARMv7 -end # JIT +end # WEBASSEMBLY_BBQJIT end macro ipintLoopOSR(increment) -if JIT and not ARMv7 +if WEBASSEMBLY_BBQJIT and not ARMv7 validateOpcodeConfig(ws0) loadp UnboxedWasmCalleeStackSlot[cfr], ws0 baddis increment, Wasm::IPIntCallee::m_tierUpCounter + Wasm::IPIntTierUpCounter::m_counter[ws0], .continue @@ -492,7 +492,7 @@ end macro ipintEpilogueOSR(increment) -if JIT and not ARMv7 +if WEBASSEMBLY_BBQJIT and not ARMv7 loadp UnboxedWasmCalleeStackSlot[cfr], ws0 baddis increment, Wasm::IPIntCallee::m_tierUpCounter + Wasm::IPIntTierUpCounter::m_counter[ws0], .continue diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/llint/LLIntData.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/llint/LLIntData.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/llint/LLIntData.cpp 2026-02-23 14:40:52.372317300 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/llint/LLIntData.cpp 2026-07-09 07:12:41.788803000 +0000 @@ -199,8 +199,28 @@ #if CPU(ARM64E) #if ENABLE(JIT_CAGE) - if (Options::useJITCage()) + if (Options::useJITCage()) { g_jscConfig.llint.gateMap[static_cast(Gate::jitCagePtr)] = jitCagePtrThunk().code().taggedPtr(); +#if ENABLE(WEBASSEMBLY) + // JSPI JITCage gates + g_jscConfig.llint.gateMap[static_cast(Gate::jspiResignReturnPCs)] = jspiResignReturnPCsThunk().code().taggedPtr(); + g_jscConfig.llint.gateMap[static_cast(Gate::jspiExecuteSliceEntry)] = jspiExecuteSliceEntryThunk().code().taggedPtr(); + // jspiExitImplantedSlice is stored untagged because it's used as a return address + // (not as a jump target) and will be signed by JITCage with the stack pointer diversifier. + g_jscConfig.llint.gateMap[static_cast(Gate::jspiExitImplantedSlice)] = jspiExitImplantedSliceThunk().code().untaggedPtr(); +#endif // ENABLE(WEBASSEMBLY) + } +#endif + +#if ENABLE(JIT) +#define INITIALIZE_JS_GATE_JIT_PATH(name, tag) \ + if (Options::useJIT()) { \ + codeRef8.construct(createJSGateThunk(retagCodePtr(LLInt::getCodeFunctionPtr(name##_return_location)), tag, #name)); \ + codeRef16.construct(createJSGateThunk(retagCodePtr(LLInt::getWide16CodeFunctionPtr(name##_return_location)), tag, #name "_wide16")); \ + codeRef32.construct(createJSGateThunk(retagCodePtr(LLInt::getWide32CodeFunctionPtr(name##_return_location)), tag, #name "_wide32")); \ + } else +#else +#define INITIALIZE_JS_GATE_JIT_PATH(name, tag) #endif #define INITIALIZE_JS_GATE(name, tag) \ @@ -208,11 +228,7 @@ static LazyNeverDestroyed> codeRef8; \ static LazyNeverDestroyed> codeRef16; \ static LazyNeverDestroyed> codeRef32; \ - if (Options::useJIT()) { \ - codeRef8.construct(createJSGateThunk(retagCodePtr(LLInt::getCodeFunctionPtr(name##_return_location)), tag, #name)); \ - codeRef16.construct(createJSGateThunk(retagCodePtr(LLInt::getWide16CodeFunctionPtr(name##_return_location)), tag, #name "_wide16")); \ - codeRef32.construct(createJSGateThunk(retagCodePtr(LLInt::getWide32CodeFunctionPtr(name##_return_location)), tag, #name "_wide32")); \ - } else { \ + INITIALIZE_JS_GATE_JIT_PATH(name, tag) { \ codeRef8.construct(LLInt::getCodeRef(js_trampoline_##name)); \ codeRef16.construct(LLInt::getWide16CodeRef(js_trampoline_##name)); \ codeRef32.construct(LLInt::getWide32CodeRef(js_trampoline_##name)); \ @@ -226,16 +242,23 @@ #if ENABLE(WEBASSEMBLY) +#if ENABLE(JIT) +#define INITIALIZE_WASM_GATE_JIT_PATH(name, tag) \ + if (Options::useJIT()) { \ + codeRef8.construct(createWasmGateThunk(retagCodePtr(LLInt::getCodeFunctionPtr(name##_return_location)), tag, #name)); \ + codeRef16.construct(createWasmGateThunk(retagCodePtr(LLInt::getWide16CodeFunctionPtr(name##_return_location)), tag, #name "_wide16")); \ + codeRef32.construct(createWasmGateThunk(retagCodePtr(LLInt::getWide32CodeFunctionPtr(name##_return_location)), tag, #name "_wide32")); \ + } else +#else +#define INITIALIZE_WASM_GATE_JIT_PATH(name, tag) +#endif + #define INITIALIZE_WASM_GATE(name, tag) \ do { \ static LazyNeverDestroyed> codeRef8; \ static LazyNeverDestroyed> codeRef16; \ static LazyNeverDestroyed> codeRef32; \ - if (Options::useJIT()) { \ - codeRef8.construct(createWasmGateThunk(retagCodePtr(LLInt::getCodeFunctionPtr(name##_return_location)), tag, #name)); \ - codeRef16.construct(createWasmGateThunk(retagCodePtr(LLInt::getWide16CodeFunctionPtr(name##_return_location)), tag, #name "_wide16")); \ - codeRef32.construct(createWasmGateThunk(retagCodePtr(LLInt::getWide32CodeFunctionPtr(name##_return_location)), tag, #name "_wide32")); \ - } else { \ + INITIALIZE_WASM_GATE_JIT_PATH(name, tag) { \ codeRef8.construct(LLInt::getCodeRef(wasm_trampoline_##name)); \ codeRef16.construct(LLInt::getWide16CodeRef(wasm_trampoline_##name)); \ codeRef32.construct(LLInt::getWide32CodeRef(wasm_trampoline_##name)); \ @@ -253,10 +276,12 @@ // This is key to entering the interpreter. { static LazyNeverDestroyed> codeRef; +#if ENABLE(JIT) if (Options::useJIT()) { auto gateCodeRef = createJSGateThunk(retagCodePtr(&vmEntryToJavaScriptGateAfter), JSEntryPtrTag, "vmEntryToJavaScript"); codeRef.construct(gateCodeRef.retagged()); } else +#endif codeRef.construct(MacroAssemblerCodeRef::createSelfManagedCodeRef(CodePtr::fromTaggedPtr(retagCodePtr(&vmEntryToJavaScriptTrampoline)))); g_jscConfig.llint.gateMap[static_cast(Gate::vmEntryToJavaScript)] = codeRef.get().code().taggedPtr(); } @@ -268,79 +293,103 @@ { static LazyNeverDestroyed> codeRef; +#if ENABLE(JIT) if (Options::useJIT()) codeRef.construct(createTailCallGate(JSEntryPtrTag, true)); else +#endif codeRef.construct(MacroAssemblerCodeRef::createSelfManagedCodeRef(CodePtr::fromTaggedPtr(retagCodePtr(&tailCallJSEntryTrampoline)))); g_jscConfig.llint.gateMap[static_cast(Gate::tailCallJSEntryPtrTag)]= codeRef.get().code().taggedPtr(); } { static LazyNeverDestroyed> codeRef; +#if ENABLE(JIT) if (Options::useJIT()) codeRef.construct(createTailCallGate(JSEntryPtrTag, true)); else +#endif codeRef.construct(MacroAssemblerCodeRef::createSelfManagedCodeRef(CodePtr::fromTaggedPtr(retagCodePtr(&tailCallJSEntrySlowPathTrampoline)))); g_jscConfig.llint.gateMap[static_cast(Gate::tailCallJSEntrySlowPathPtrTag)] = codeRef.get().code().taggedPtr(); } { static LazyNeverDestroyed> codeRef; +#if ENABLE(JIT) if (Options::useJIT()) codeRef.construct(createTailCallGate(JSEntryPtrTag, false)); else +#endif codeRef.construct(MacroAssemblerCodeRef::createSelfManagedCodeRef(CodePtr::fromTaggedPtr(retagCodePtr(&tailCallWithoutUntagJSEntryTrampoline)))); g_jscConfig.llint.gateMap[static_cast(Gate::tailCallWithoutUntagJSEntryPtrTag)]= codeRef.get().code().taggedPtr(); } { static LazyNeverDestroyed> codeRef; +#if ENABLE(JIT) if (Options::useJIT()) codeRef.construct(createWasmTailCallGate(WasmEntryPtrTag)); else +#endif codeRef.construct(MacroAssemblerCodeRef::createSelfManagedCodeRef(CodePtr::fromTaggedPtr(retagCodePtr(&wasmTailCallTrampoline)))); g_jscConfig.llint.gateMap[static_cast(Gate::wasmTailCallWasmEntryPtrTag)]= codeRef.get().code().taggedPtr(); } { static LazyNeverDestroyed> codeRef; +#if ENABLE(JIT) if (Options::useJIT()) codeRef.construct(createWasmTailCallGate(WasmEntryPtrTag)); else +#endif codeRef.construct(MacroAssemblerCodeRef::createSelfManagedCodeRef(CodePtr::fromTaggedPtr(retagCodePtr(&wasmTailCallTrampoline)))); g_jscConfig.llint.gateMap[static_cast(Gate::wasmIPIntTailCallWasmEntryPtrTag)]= codeRef.get().code().taggedPtr(); } { static LazyNeverDestroyed> codeRef; +#if ENABLE(JIT) if (Options::useJIT()) codeRef.construct(exceptionHandlerGateThunk()); else +#endif codeRef.construct(MacroAssemblerCodeRef::createSelfManagedCodeRef(CodePtr::fromTaggedPtr(retagCodePtr(&exceptionHandlerTrampoline)))); g_jscConfig.llint.gateMap[static_cast(Gate::exceptionHandler)] = codeRef.get().code().taggedPtr(); } { static LazyNeverDestroyed> codeRef; +#if ENABLE(JIT) if (Options::useJIT()) codeRef.construct(returnFromLLIntGateThunk()); else +#endif codeRef.construct(MacroAssemblerCodeRef::createSelfManagedCodeRef(CodePtr::fromTaggedPtr(retagCodePtr(&returnFromLLIntTrampoline)))); g_jscConfig.llint.gateMap[static_cast(Gate::returnFromLLInt)] = codeRef.get().code().taggedPtr(); } +#if ENABLE(JIT) if (Options::useJIT()) { g_jscConfig.llint.gateMap[static_cast(Gate::loopOSREntry)] = loopOSREntryGateThunk().code().taggedPtr(); g_jscConfig.llint.gateMap[static_cast(Gate::entryOSREntry)] = entryOSREntryGateThunk().code().taggedPtr(); g_jscConfig.llint.gateMap[static_cast(Gate::wasmOSREntry)] = wasmOSREntryGateThunk().code().taggedPtr(); - } else { + } else +#endif + { g_jscConfig.llint.gateMap[static_cast(Gate::loopOSREntry)] = LLInt::getCodeRef(loop_osr_entry_gate).code().taggedPtr(); g_jscConfig.llint.gateMap[static_cast(Gate::entryOSREntry)] = nullptr; g_jscConfig.llint.gateMap[static_cast(Gate::wasmOSREntry)] = nullptr; } +#if ENABLE(JIT) +#define INITIALIZE_TAG_AND_UNTAG_THUNKS_JIT_PATH(name) \ + if (Options::useJIT()) { \ + tagCodeRef.construct(tagGateThunk(retagCodePtr(name##TagGateAfter))); \ + untagCodeRef.construct(untagGateThunk(retagCodePtr(name##UntagGateAfter))); \ + } else +#else +#define INITIALIZE_TAG_AND_UNTAG_THUNKS_JIT_PATH(name) +#endif + #define INITIALIZE_TAG_AND_UNTAG_THUNKS(name) \ do { \ static LazyNeverDestroyed> tagCodeRef; \ static LazyNeverDestroyed> untagCodeRef; \ - if (Options::useJIT()) { \ - tagCodeRef.construct(tagGateThunk(retagCodePtr(name##TagGateAfter))); \ - untagCodeRef.construct(untagGateThunk(retagCodePtr(name##UntagGateAfter))); \ - } else { \ + INITIALIZE_TAG_AND_UNTAG_THUNKS_JIT_PATH(name) { \ tagCodeRef.construct(LLInt::getCodeRef(js_trampoline_##name##_tag)); \ untagCodeRef.construct(LLInt::getCodeRef(js_trampoline_##name##_untag)); \ } \ diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/parser/ASTBuilder.h webkit2gtk-2.52.5/Source/JavaScriptCore/parser/ASTBuilder.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/parser/ASTBuilder.h 2026-02-23 14:40:52.380317400 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/parser/ASTBuilder.h 2026-07-09 07:12:41.788803000 +0000 @@ -33,6 +33,7 @@ #include "SyntaxChecker.h" #include "VariableEnvironment.h" #include +#include namespace JSC { @@ -1327,7 +1328,7 @@ const NumberNode& numberExpr1 = static_cast(*expr1); const NumberNode& numberExpr2 = static_cast(*expr2); double result = numberExpr1.value() / numberExpr2.value(); - if (static_cast(result) == result) + if (truncateDoubleToInt64(result) == result) return createNumberFromBinaryOperation(location, result, numberExpr1, numberExpr2); return createDoubleLikeNumber(location, result); } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/parser/Lexer.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/parser/Lexer.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/parser/Lexer.cpp 2026-02-23 14:40:52.380317400 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/parser/Lexer.cpp 2026-07-09 07:12:41.788803000 +0000 @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -511,7 +512,7 @@ static inline JSTokenType tokenTypeForIntegerLikeToken(double doubleValue) { - if ((doubleValue || !std::signbit(doubleValue)) && static_cast(doubleValue) == doubleValue) + if ((doubleValue || !std::signbit(doubleValue)) && truncateDoubleToInt64(doubleValue) == doubleValue) return INTEGER; return DOUBLE; } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/parser/ParserArena.h webkit2gtk-2.52.5/Source/JavaScriptCore/parser/ParserArena.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/parser/ParserArena.h 2026-02-23 14:40:52.383317200 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/parser/ParserArena.h 2026-07-09 07:12:41.792802800 +0000 @@ -137,9 +137,8 @@ inline const Identifier& IdentifierArena::makeNumericIdentifier(VM& vm, double number) { Identifier token; - // This is possible that number can be -0, but it is OK since ToString(-0) is "0". - if (canBeInt32(number)) - token = Identifier::from(vm, static_cast(number)); + if (auto int32Value = tryConvertToStrictInt32(number)) + token = Identifier::from(vm, int32Value.value()); else token = Identifier::from(vm, number); m_identifiers.append(WTF::move(token)); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/ArrayBuffer.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/ArrayBuffer.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/ArrayBuffer.cpp 2026-03-25 16:38:32.895259600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/ArrayBuffer.cpp 2026-07-09 07:12:41.792802800 +0000 @@ -375,19 +375,6 @@ m_isWasmMemory = true; } -void ArrayBuffer::setAssociatedWasmMemory(Wasm::Memory* memory) -{ - // The pointer from a buffer to a memory is only required when the buffer is resizable non-shared, - // to direct a grow request to the memory (see ArrayBuffer::resize). In other scenarios - // the pointer is not necessary and we should not be setting it to anything but a nullptr. - ASSERT(isWasmMemory() && (isResizableNonShared() || !memory)); -#if ENABLE(WEBASSEMBLY) - m_associatedWasmMemory = memory; -#else - UNUSED_PARAM(memory); -#endif -} - void ArrayBuffer::refreshAfterWasmMemoryGrow(Wasm::Memory* memory) { ASSERT(isWasmMemory()); @@ -485,10 +472,10 @@ return result; } -// Wasm JS API redefines the abstract operation HostResizeArrayBuffer as follows: -// https://webassembly.github.io/threads/js-api/index.html#abstract-operation-hostresizearraybuffer Expected ArrayBuffer::resize(VM& vm, size_t newByteLength) { + RELEASE_ASSERT(!isWasmMemory()); + auto memoryHandle = m_contents.m_memoryHandle; if (!memoryHandle || m_contents.m_shared) [[unlikely]] return makeUnexpected(GrowFailReason::GrowSharedUnavailable); @@ -502,12 +489,6 @@ return makeUnexpected(GrowFailReason::InvalidGrowSize); deltaByteLength = static_cast(newByteLength) - static_cast(m_contents.m_sizeInBytes); -#if ENABLE(WEBASSEMBLY) - if (Options::useWasmMemoryToBufferAPIs()) { - if (isWasmMemory() && (deltaByteLength < 0 || deltaByteLength % PageCount::pageSize)) - return makeUnexpected(GrowFailReason::InvalidGrowSize); - } -#endif if (!deltaByteLength) return 0; @@ -519,17 +500,6 @@ if (newPageCount != oldPageCount) { ASSERT(memoryHandle->maximum() >= newPageCount); -#if ENABLE(WEBASSEMBLY) - if (Options::useWasmMemoryToBufferAPIs()) { - // If this is currently associated with a Wasm memory, let the memory do the growing. - // The memory will call back to our refreshAfterWasmMemoryGrow(). - RefPtr memory = m_associatedWasmMemory.get(); - if (memory) { - std::ignore = memory->grow(vm, PageCount(newPageCount.pageCount() - oldPageCount.pageCount())); - return deltaByteLength; - } - } -#endif size_t desiredSize = newPageCount.bytes(); RELEASE_ASSERT(desiredSize <= MAX_ARRAY_BUFFER_SIZE); @@ -684,7 +654,7 @@ ASCIILiteral errorMessageForTransfer(ArrayBuffer* buffer) { - ASSERT(buffer->isLocked()); + ASSERT(!buffer->isDetachable()); if (buffer->isShared()) return "Cannot transfer a SharedArrayBuffer"_s; if (buffer->isWasmMemory()) diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/ArrayBuffer.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/ArrayBuffer.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/ArrayBuffer.h 2026-02-23 14:40:52.390317200 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/ArrayBuffer.h 2026-07-09 07:12:41.792802800 +0000 @@ -330,7 +330,6 @@ void makeWasmMemory(); inline bool isWasmMemory(); - void setAssociatedWasmMemory(Wasm::Memory*); // When a resizable buffer is associated with a non-shared Wasm memory, this function is called by the memory's growthSuccessCallback. void refreshAfterWasmMemoryGrow(Wasm::Memory*); @@ -373,7 +372,6 @@ private: Checked m_pinCount { 0 }; bool m_isWasmMemory { false }; - WeakPtr m_associatedWasmMemory; // m_locked == true means that some API user fetched m_contents directly from a TypedArray object, // the buffer is backed by a WebAssembly.Memory, or is a SharedArrayBuffer. bool m_locked { false }; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/ClonedArguments.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/ClonedArguments.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/ClonedArguments.cpp 2026-02-23 14:40:52.398317300 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/ClonedArguments.cpp 2026-07-09 07:12:41.792802800 +0000 @@ -317,7 +317,7 @@ } firstElementDest[i - offset] = value; } - for (; i < length; ++i) { + for (; i < length + offset; ++i) { firstElementDest[i - offset] = get(globalObject, i); RETURN_IF_EXCEPTION(scope, void()); } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/CommonSlowPaths.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/CommonSlowPaths.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/CommonSlowPaths.cpp 2026-03-26 12:33:41.417457000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/CommonSlowPaths.cpp 2026-07-09 07:12:41.792802800 +0000 @@ -415,7 +415,7 @@ // Therefore, we will get a false positive if the result is that value. This is intentionally // done to simplify the checking algorithm. static const int64_t int52OverflowPoint = (1ll << 51); - int64_t int64Val = static_cast(std::abs(doubleVal)); + int64_t int64Val = truncateDoubleToInt64(std::abs(doubleVal)); if (int64Val >= int52OverflowPoint) profile.setObservedInt52Overflow(); } @@ -481,7 +481,7 @@ // Therefore, we will get a false positive if the result is that value. This is intentionally // done to simplify the checking algorithm. static const int64_t int52OverflowPoint = (1ll << 51); - int64_t int64Val = static_cast(std::abs(doubleVal)); + int64_t int64Val = truncateDoubleToInt64(std::abs(doubleVal)); if (int64Val >= int52OverflowPoint) profile.setObservedInt52Overflow(); } @@ -1354,7 +1354,7 @@ BEGIN(); auto bytecode = pc->as(); JSObject* array = asObject(GET_C(bytecode.m_array).jsValue()); - uint64_t length = static_cast(GET_C(bytecode.m_length).jsValue().asNumber()); + uint64_t length = truncateDoubleToUint64(GET_C(bytecode.m_length).jsValue().asNumber()); auto& metadata = bytecode.metadata(codeBlock); auto& arrayAllocationProfile = metadata.m_arrayAllocationProfile; auto& arrayProfile = metadata.m_arrayProfile; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/DeferredWorkTimer.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/DeferredWorkTimer.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/DeferredWorkTimer.cpp 2026-02-23 14:40:52.403317200 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/DeferredWorkTimer.cpp 2026-07-09 07:12:41.792802800 +0000 @@ -27,8 +27,9 @@ #include "DeferredWorkTimer.h" #include "CatchScope.h" -#include "DeferredWorkTimerInlines.h" #include "GlobalObjectMethodTable.h" +#include "HeapInlines.h" +#include "JSCellInlines.h" #include "JSGlobalObject.h" #include "VM.h" #include @@ -37,46 +38,51 @@ namespace JSC { -WTF_MAKE_TZONE_ALLOCATED_IMPL(DeferredWorkTimer::TicketData); +WTF_MAKE_TZONE_ALLOCATED_IMPL(DeferredWorkTimer::Ticket); namespace DeferredWorkTimerInternal { static constexpr bool verbose = false; } -inline DeferredWorkTimer::TicketData::TicketData(WorkType type, JSObject* scriptExecutionOwner, Vector&& dependencies) +inline DeferredWorkTimer::Ticket::Ticket(WorkType type, JSObject* scriptExecutionOwner, Vector&& dependencies) : m_type(type) , m_dependencies(WTF::move(dependencies)) , m_scriptExecutionOwner(scriptExecutionOwner) { ASSERT_WITH_MESSAGE(!m_dependencies.isEmpty(), "dependencies shouldn't be empty since it should contain the target"); ASSERT_WITH_MESSAGE(isTargetObject(), "target must be a JSObject"); - target()->globalObject()->addWeakTicket(this); + target()->globalObject()->addWeakTicket(*this); } -inline Ref DeferredWorkTimer::TicketData::create(WorkType type, JSObject* scriptExecutionOwner, Vector&& dependencies) +inline Ref DeferredWorkTimer::Ticket::create(WorkType type, JSObject* scriptExecutionOwner, Vector&& dependencies) { - return adoptRef(*new TicketData(type, scriptExecutionOwner, WTF::move(dependencies))); + return adoptRef(*new Ticket(type, scriptExecutionOwner, WTF::move(dependencies))); } -inline VM& DeferredWorkTimer::TicketData::vm() +inline VM& DeferredWorkTimer::Ticket::vm() { ASSERT(!isCancelled()); return target()->vm(); } -inline void DeferredWorkTimer::TicketData::cancel() +inline void DeferredWorkTimer::Ticket::cancel() { dataLogLnIf(DeferredWorkTimerInternal::verbose, "Canceling ticket: ", RawPointer(this)); m_isCancelled = true; } -inline void DeferredWorkTimer::TicketData::cancelAndClear() +inline void DeferredWorkTimer::Ticket::cancelAndClear() { cancel(); m_dependencies.clear(); m_scriptExecutionOwner = nullptr; } +bool DeferredWorkTimer::Ticket::isTargetObject() +{ + return m_dependencies.last()->isObject(); +} + DeferredWorkTimer::DeferredWorkTimer(VM& vm) : Base(vm) { @@ -105,29 +111,29 @@ } }); - Vector> suspendedTasks; + Vector, Task>> suspendedTasks; while (!m_tasks.isEmpty()) { auto [ticket, task] = m_tasks.takeFirst(); - dataLogLnIf(DeferredWorkTimerInternal::verbose, "Doing work on: ", RawPointer(ticket)); + dataLogLnIf(DeferredWorkTimerInternal::verbose, "Doing work on: ", RawPointer(ticket.ptr())); - auto pendingTicket = m_pendingTickets.find(ticket); + auto pendingTicket = m_pendingTickets.find(ticket.ptr()); // We may have already canceled this task or its owner may have been canceled. if (pendingTicket == m_pendingTickets.end()) continue; - ASSERT(ticket == pendingTicket->ptr()); + ASSERT(ticket.ptr() == pendingTicket->ptr()); if (ticket->isCancelled()) { m_pendingTickets.remove(pendingTicket); continue; } - // We shouldn't access the TicketData to get this globalObject until + // We shouldn't access the Ticket to get this globalObject until // after we confirm that the ticket is still valid (which we did above). auto globalObject = ticket->target()->globalObject(); switch (globalObject->globalObjectMethodTable()->scriptExecutionStatus(globalObject, ticket->scriptExecutionOwner())) { case ScriptExecutionStatus::Suspended: - suspendedTasks.append(std::make_tuple(ticket, WTF::move(task))); + suspendedTasks.append(std::make_tuple(WTF::move(ticket), WTF::move(task))); continue; case ScriptExecutionStatus::Stopped: m_pendingTickets.remove(pendingTicket); @@ -137,8 +143,9 @@ } // Remove ticket from m_pendingTickets since we are going to run it. - // But we want to keep ticketData while running task since its globalObject ensures dependencies are strongly held. - auto ticketData = m_pendingTickets.take(pendingTicket); + // But we want to keep the ticket alive while running task since its globalObject ensures dependencies are strongly held. + // (m_tasks's Ref already keeps it alive, but we remove from m_pendingTickets to match existing semantics.) + m_pendingTickets.remove(pendingTicket); { // Allow tasks we are about to run to schedule work. @@ -149,8 +156,7 @@ vm.finalizeSynchronousJSExecution(); auto scope = DECLARE_CATCH_SCOPE(vm); - task(ticket); - ticketData = nullptr; + task(ticket.get()); if (Exception* exception = scope.exception()) { if (scope.clearExceptionExceptTermination()) globalObject->globalObjectMethodTable()->reportUncaughtExceptionAtEventLoop(globalObject, exception); @@ -186,7 +192,7 @@ RunLoop::run(); } -DeferredWorkTimer::Ticket DeferredWorkTimer::addPendingWork(WorkType type, VM& vm, JSObject* target, Vector&& dependencies) +DeferredWorkTimer::WeakTicket DeferredWorkTimer::addPendingWork(WorkType type, VM& vm, JSObject* target, Vector&& dependencies) { ASSERT_UNUSED(vm, vm.currentThreadIsHoldingAPILock() || (Thread::mayBeGCThread() && vm.heap.worldIsStopped())); for (unsigned i = 0; i < dependencies.size(); ++i) @@ -196,53 +202,57 @@ JSObject* scriptExecutionOwner = globalObject->globalObjectMethodTable()->currentScriptExecutionOwner(globalObject); dependencies.append(target); - auto ticketData = TicketData::create(type, scriptExecutionOwner, WTF::move(dependencies)); - Ticket ticket = ticketData.ptr(); + auto ticket = Ticket::create(type, scriptExecutionOwner, WTF::move(dependencies)); + WeakTicket weakTicket { ticket.get() }; - dataLogLnIf(DeferredWorkTimerInternal::verbose, "Adding new pending ticket: ", RawPointer(ticket)); - auto result = m_pendingTickets.add(WTF::move(ticketData)); + dataLogLnIf(DeferredWorkTimerInternal::verbose, "Adding new pending ticket: ", RawPointer(ticket.ptr())); + auto result = m_pendingTickets.add(WTF::move(ticket)); RELEASE_ASSERT(result.isNewEntry); - return ticket; + return weakTicket; } -bool DeferredWorkTimer::hasPendingWork(Ticket ticket) +bool DeferredWorkTimer::hasPendingWork(Ticket& ticket) { - auto result = m_pendingTickets.find(ticket); - if (result == m_pendingTickets.end() || ticket->isCancelled()) + auto result = m_pendingTickets.find(&ticket); + if (result == m_pendingTickets.end() || ticket.isCancelled()) return false; - ASSERT(ticket->vm().currentThreadIsHoldingAPILock() || (Thread::mayBeGCThread() && ticket->vm().heap.worldIsStopped())); + ASSERT(ticket.vm().currentThreadIsHoldingAPILock() || (Thread::mayBeGCThread() && ticket.vm().heap.worldIsStopped())); return true; } -bool DeferredWorkTimer::hasDependencyInPendingWork(Ticket ticket, JSCell* dependency) +bool DeferredWorkTimer::hasDependencyInPendingWork(Ticket& ticket, JSCell* dependency) { - auto result = m_pendingTickets.find(ticket); - if (result == m_pendingTickets.end() || ticket->isCancelled()) + auto result = m_pendingTickets.find(&ticket); + if (result == m_pendingTickets.end() || ticket.isCancelled()) return false; - ASSERT(ticket->vm().currentThreadIsHoldingAPILock() || (Thread::mayBeGCThread() && ticket->vm().heap.worldIsStopped())); + ASSERT(ticket.vm().currentThreadIsHoldingAPILock() || (Thread::mayBeGCThread() && ticket.vm().heap.worldIsStopped())); return (*result)->dependencies().contains(dependency); } -void DeferredWorkTimer::scheduleWorkSoon(Ticket ticket, Task&& task) +bool DeferredWorkTimer::scheduleWorkSoonIfActive(const WeakTicket& weakTicket, Task&& task) { + RefPtr ticket = weakTicket.get(); + if (!ticket || ticket->isCancelled()) + return false; Locker locker { m_taskLock }; - m_tasks.append(std::make_tuple(ticket, WTF::move(task))); + m_tasks.append(std::make_tuple(ticket.releaseNonNull(), WTF::move(task))); if (!isScheduled() && !m_currentlyRunningTask) setTimeUntilFire(0_s); + return true; } -// Since TicketData is ThreadSafeWeakPtr now, we should optimize the DeferredWorkTimer's -// workflow, e.g. directly clear the TicketData from cancelPendingWork. +// Since Ticket is ThreadSafeWeakPtr now, we should optimize the DeferredWorkTimer's +// workflow, e.g. directly clear the Ticket from cancelPendingWork. // https://bugs.webkit.org/show_bug.cgi?id=276538 -bool DeferredWorkTimer::cancelPendingWork(Ticket ticket) +bool DeferredWorkTimer::cancelPendingWork(Ticket& ticket) { - ASSERT(m_pendingTickets.contains(ticket)); - ASSERT(ticket->isCancelled() || ticket->vm().currentThreadIsHoldingAPILock() || (Thread::mayBeGCThread() && ticket->vm().heap.worldIsStopped())); + ASSERT(m_pendingTickets.contains(&ticket)); + ASSERT(ticket.isCancelled() || ticket.vm().currentThreadIsHoldingAPILock() || (Thread::mayBeGCThread() && ticket.vm().heap.worldIsStopped())); bool result = false; - if (!ticket->isCancelled()) { - ticket->cancel(); + if (!ticket.isCancelled()) { + ticket.cancel(); result = true; } @@ -254,10 +264,9 @@ Locker locker { m_taskLock }; dataLogLnIf(DeferredWorkTimerInternal::verbose, "Cancel pending work for globalObject ", RawPointer(globalObject)); - for (Ref ticket : *globalObject->m_weakTickets) { + for (Ref ticket : *globalObject->m_weakTickets) { if (!ticket->isCancelled()) - cancelPendingWork(ticket.ptr()); - m_tasks.append(std::make_tuple(ticket.ptr(), [](DeferredWorkTimer::Ticket) { })); + cancelPendingWork(ticket.get()); } if (!isScheduled() && !m_currentlyRunningTask) setTimeUntilFire(0_s); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/DeferredWorkTimer.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/DeferredWorkTimer.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/DeferredWorkTimer.h 2026-02-23 14:40:52.403317200 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/DeferredWorkTimer.h 2026-07-09 07:12:41.792802800 +0000 @@ -51,17 +51,17 @@ AtSomePoint, }; - class TicketData : public ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr { + class Ticket : public ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr { private: - WTF_MAKE_TZONE_ALLOCATED(TicketData); - WTF_MAKE_NONCOPYABLE(TicketData); + WTF_MAKE_TZONE_ALLOCATED(Ticket); + WTF_MAKE_NONCOPYABLE(Ticket); public: - inline static Ref create(WorkType, JSObject* scriptExecutionOwner, Vector&& dependencies); + inline static Ref create(WorkType, JSObject* scriptExecutionOwner, Vector&& dependencies); WorkType type() const { return m_type; } inline VM& vm(); JSObject* target(); - bool isTargetObject(); + JS_EXPORT_PRIVATE bool isTargetObject(); inline const FixedVector& dependencies(bool mayBeCancelled = false); inline JSObject* scriptExecutionOwner(); @@ -71,7 +71,7 @@ bool isCancelled() const { return m_isCancelled; } private: - inline TicketData(WorkType, JSObject* scriptExecutionOwner, Vector&& dependencies); + inline Ticket(WorkType, JSObject* scriptExecutionOwner, Vector&& dependencies); WorkType m_type; FixedVector m_dependencies; @@ -79,18 +79,20 @@ bool m_isCancelled { false }; }; - using Ticket = TicketData*; + using WeakTicket = ThreadSafeWeakPtr; void doWork(VM&) final; - JS_EXPORT_PRIVATE Ticket addPendingWork(WorkType, VM&, JSObject* target, Vector&& dependencies); + // Tickets are strongly held by the timer and should be weakly held by the caller and global object. + // This allows detached global objects, most commonly iframes / Workers, to cancel tickets without leaking memory. + JS_EXPORT_PRIVATE WeakTicket addPendingWork(WorkType, VM&, JSObject* target, Vector&& dependencies); void cancelPendingWork(VM&); JS_EXPORT_PRIVATE bool hasAnyPendingWork() const; JS_EXPORT_PRIVATE bool hasImminentlyScheduledWork() const; - bool hasPendingWork(Ticket); - bool hasDependencyInPendingWork(Ticket, JSCell* dependency); - bool cancelPendingWork(Ticket); + bool hasPendingWork(Ticket&); + bool hasDependencyInPendingWork(Ticket&, JSCell* dependency); + bool cancelPendingWork(Ticket&); void cancelPendingWorkSafe(JSGlobalObject*); // If the script execution owner your ticket is associated with gets canceled @@ -98,8 +100,12 @@ // to make sure your memory ownership model won't leak memory when // this occurs. The easiest way is to make sure everything is either owned // by a GC'd value in dependencies or by the Task lambda. - using Task = Function; - JS_EXPORT_PRIVATE void scheduleWorkSoon(Ticket, Task&&); + // The Ticket& passed into the task is valid for the duration of the call: + // m_tasks holds a Ref until the task runs. Queue via + // scheduleWorkSoonIfActive — the API internally promotes the WeakTicket + // and drops the request if the ticket is gone or cancelled. + using Task = Function; + JS_EXPORT_PRIVATE bool scheduleWorkSoonIfActive(const WeakTicket&, Task&&); JS_EXPORT_PRIVATE void didResumeScriptExecutionOwner(); void stopRunningTasks() { m_runTasks = false; } @@ -113,11 +119,15 @@ bool m_runTasks { true }; bool m_shouldStopRunLoopWhenAllTicketsFinish { false }; bool m_currentlyRunningTask { false }; - Deque> m_tasks WTF_GUARDED_BY_LOCK(m_taskLock); - UncheckedKeyHashSet> m_pendingTickets; + Deque, Task>> m_tasks WTF_GUARDED_BY_LOCK(m_taskLock); + UncheckedKeyHashSet> m_pendingTickets; }; -inline JSObject* DeferredWorkTimer::TicketData::target() +// target() reads m_dependencies, which cancelAndClear() can free concurrently. +// Safe only when: (1) holding m_taskLock, (2) inside a scheduleWorkSoonIfActive task lambda +// (ticket already removed from m_pendingTickets), or (3) GC End phase is prevented from running. +// Never call from a foreign VM's thread. +inline JSObject* DeferredWorkTimer::Ticket::target() { ASSERT(!isCancelled() && isTargetObject()); // This function can be triggered on the main thread with a GC end phase @@ -125,13 +135,13 @@ return std::bit_cast(m_dependencies.last()); } -inline const FixedVector& DeferredWorkTimer::TicketData::dependencies(bool mayBeCancelled) +inline const FixedVector& DeferredWorkTimer::Ticket::dependencies(bool mayBeCancelled) { ASSERT_UNUSED(mayBeCancelled, mayBeCancelled || !isCancelled()); return m_dependencies; } -inline JSObject* DeferredWorkTimer::TicketData::scriptExecutionOwner() +inline JSObject* DeferredWorkTimer::Ticket::scriptExecutionOwner() { ASSERT(!isCancelled()); return m_scriptExecutionOwner; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/DeferredWorkTimerInlines.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/DeferredWorkTimerInlines.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/DeferredWorkTimerInlines.h 2026-02-23 14:40:52.404317100 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/DeferredWorkTimerInlines.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2017-2024 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#pragma once - -#include -#include - -namespace JSC { - -inline bool DeferredWorkTimer::TicketData::isTargetObject() -{ - return m_dependencies.last()->isObject(); -} - -} // namespace JSC diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/HashMapHelper.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/HashMapHelper.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/HashMapHelper.h 2026-02-23 14:40:52.412317300 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/HashMapHelper.h 2026-07-09 07:12:41.792802800 +0000 @@ -30,6 +30,8 @@ #include #include #include +#include +#include namespace JSC { @@ -59,7 +61,7 @@ if (std::isnan(d)) return jsNaN(); - int i = static_cast(d); + int32_t i = truncateDoubleToInt32(d); if (i == d) { // When a key is -0, we convert it to positive zero. // When a key is the double representation for an integer, we convert it to an integer. diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/ISO8601.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/ISO8601.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/ISO8601.cpp 2026-02-23 14:40:52.412317300 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/ISO8601.cpp 2026-07-09 07:12:41.792802800 +0000 @@ -1083,16 +1083,12 @@ if (*buffer == '-') { splitByHyphen = true; buffer.advance(); - if (buffer.lengthRemaining() < 5 && format == TemporalDateFormat::Date) - return std::nullopt; - } else { - if (buffer.lengthRemaining() < 4 && format == TemporalDateFormat::Date) - return std::nullopt; } } - // We ensured that buffer has enough length for month and day. We do not need to check length. unsigned month = 0; + if (buffer.lengthRemaining() < 2) + return std::nullopt; auto firstMonthCharacter = *buffer; if (firstMonthCharacter == '0' || firstMonthCharacter == '1') { buffer.advance(); @@ -1112,17 +1108,22 @@ return PlainDate(year, month, 1); } + if (buffer.atEnd()) + return std::nullopt; + + bool consumedDaySeparator = false; if (*buffer == '-') { - if (splitByHyphen || format != TemporalDateFormat::Date) + if (splitByHyphen || format != TemporalDateFormat::Date) { buffer.advance(); - else + consumedDaySeparator = true; + } else return std::nullopt; } else if (splitByHyphen) return std::nullopt; unsigned day = 0; - auto firstDayCharacter = *buffer; - if (firstDayCharacter >= '0' && firstDayCharacter <= '3') { + if (buffer.lengthRemaining() >= 2 && *buffer >= '0' && *buffer <= '3') { + auto firstDayCharacter = *buffer; buffer.advance(); auto secondDayCharacter = *buffer; if (!isASCIIDigit(secondDayCharacter)) @@ -1131,7 +1132,7 @@ if (!day || day > daysInMonth(year, month)) return std::nullopt; buffer.advance(); - } else if (format != TemporalDateFormat::YearMonth) + } else if (consumedDaySeparator || format != TemporalDateFormat::YearMonth) return std::nullopt; // PlainDate represents out-of-range years using outOfRangeYear diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/IntlNumberFormat.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/IntlNumberFormat.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/IntlNumberFormat.cpp 2026-02-23 14:40:52.416317200 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/IntlNumberFormat.cpp 2026-07-09 07:12:41.796802800 +0000 @@ -450,12 +450,11 @@ // The measure-unit stem takes one required option: the unit identifier of the unit to be formatted. // The full unit identifier is required: both the type and the subtype (for example, length-meter). // https://github.com/unicode-org/icu/blob/master/docs/userguide/format_parse/numbers/skeletons.md#unit - skeletonBuilder.append(" measure-unit/"_s); auto numeratorUnit = wellFormedUnit->numerator; - skeletonBuilder.append(numeratorUnit.type, '-', numeratorUnit.subType); + skeletonBuilder.append(" unit/"_s, numeratorUnit.subType); if (auto denominatorUnitValue = wellFormedUnit->denominator) { auto denominatorUnit = denominatorUnitValue.value(); - skeletonBuilder.append(" per-measure-unit/"_s, denominatorUnit.type, '-', denominatorUnit.subType); + skeletonBuilder.append("-per-"_s, denominatorUnit.subType); } // https://github.com/unicode-org/icu/blob/master/docs/userguide/format_parse/numbers/skeletons.md#unit-width diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/IntlObject.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/IntlObject.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/IntlObject.cpp 2026-03-02 17:11:00.808242300 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/IntlObject.cpp 2026-07-09 07:12:41.796802800 +0000 @@ -194,51 +194,51 @@ } const MeasureUnit simpleUnits[45] = { - { "area"_s, "acre"_s }, - { "digital"_s, "bit"_s }, - { "digital"_s, "byte"_s }, - { "temperature"_s, "celsius"_s }, - { "length"_s, "centimeter"_s }, - { "duration"_s, "day"_s }, - { "angle"_s, "degree"_s }, - { "temperature"_s, "fahrenheit"_s }, - { "volume"_s, "fluid-ounce"_s }, - { "length"_s, "foot"_s }, - { "volume"_s, "gallon"_s }, - { "digital"_s, "gigabit"_s }, - { "digital"_s, "gigabyte"_s }, - { "mass"_s, "gram"_s }, - { "area"_s, "hectare"_s }, - { "duration"_s, "hour"_s }, - { "length"_s, "inch"_s }, - { "digital"_s, "kilobit"_s }, - { "digital"_s, "kilobyte"_s }, - { "mass"_s, "kilogram"_s }, - { "length"_s, "kilometer"_s }, - { "volume"_s, "liter"_s }, - { "digital"_s, "megabit"_s }, - { "digital"_s, "megabyte"_s }, - { "length"_s, "meter"_s }, - { "duration"_s, "microsecond"_s }, - { "length"_s, "mile"_s }, - { "length"_s, "mile-scandinavian"_s }, - { "volume"_s, "milliliter"_s }, - { "length"_s, "millimeter"_s }, - { "duration"_s, "millisecond"_s }, - { "duration"_s, "minute"_s }, - { "duration"_s, "month"_s }, - { "duration"_s, "nanosecond"_s }, - { "mass"_s, "ounce"_s }, - { "concentr"_s, "percent"_s }, - { "digital"_s, "petabyte"_s }, - { "mass"_s, "pound"_s }, - { "duration"_s, "second"_s }, - { "mass"_s, "stone"_s }, - { "digital"_s, "terabit"_s }, - { "digital"_s, "terabyte"_s }, - { "duration"_s, "week"_s }, - { "length"_s, "yard"_s }, - { "duration"_s, "year"_s }, + { "acre"_s }, + { "bit"_s }, + { "byte"_s }, + { "celsius"_s }, + { "centimeter"_s }, + { "day"_s }, + { "degree"_s }, + { "fahrenheit"_s }, + { "fluid-ounce"_s }, + { "foot"_s }, + { "gallon"_s }, + { "gigabit"_s }, + { "gigabyte"_s }, + { "gram"_s }, + { "hectare"_s }, + { "hour"_s }, + { "inch"_s }, + { "kilobit"_s }, + { "kilobyte"_s }, + { "kilogram"_s }, + { "kilometer"_s }, + { "liter"_s }, + { "megabit"_s }, + { "megabyte"_s }, + { "meter"_s }, + { "microsecond"_s }, + { "mile"_s }, + { "mile-scandinavian"_s }, + { "milliliter"_s }, + { "millimeter"_s }, + { "millisecond"_s }, + { "minute"_s }, + { "month"_s }, + { "nanosecond"_s }, + { "ounce"_s }, + { "percent"_s }, + { "petabyte"_s }, + { "pound"_s }, + { "second"_s }, + { "stone"_s }, + { "terabit"_s }, + { "terabyte"_s }, + { "week"_s }, + { "yard"_s }, + { "year"_s }, }; IntlObject::IntlObject(VM& vm, Structure* structure) diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/IntlObject.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/IntlObject.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/IntlObject.h 2026-01-20 14:08:32.361706000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/IntlObject.h 2026-07-09 07:12:41.796802800 +0000 @@ -61,7 +61,6 @@ #undef JSC_COUNT_INTL_RELEVANT_EXTENSION_KEYS struct MeasureUnit { - ASCIILiteral type; ASCIILiteral subType; }; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSArrayBuffer.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSArrayBuffer.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSArrayBuffer.cpp 2026-02-23 14:40:52.420317200 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSArrayBuffer.cpp 2026-07-09 07:12:41.796802800 +0000 @@ -27,6 +27,9 @@ #include "JSArrayBuffer.h" #include "JSCInlines.h" +#if ENABLE(WEBASSEMBLY) +#include "JSWebAssemblyMemory.h" +#endif // ENABLE(WEBASSEMBLY) #include "TypedArrayController.h" namespace JSC { @@ -82,5 +85,36 @@ return Base::estimatedSize(cell, vm) + bufferEstimatedSize; } +#if ENABLE(WEBASSEMBLY) +JSWebAssemblyMemory* JSArrayBuffer::associatedWasmMemoryWrapper() const +{ + return m_associatedWasmMemoryWrapper.get(); +} + +void JSArrayBuffer::setAssociatedWasmMemoryWrapper(VM& vm, JSWebAssemblyMemory* wrapper) +{ + ASSERT(impl()->isWasmMemory() && impl()->isResizableNonShared()); + m_associatedWasmMemoryWrapper.set(vm, this, wrapper); +} + +void JSArrayBuffer::clearAssociatedWasmMemoryWrapper() +{ + m_associatedWasmMemoryWrapper.clear(); +} +#endif // ENABLE(WEBASSEMBLY) + +template +void JSArrayBuffer::visitChildrenImpl(JSCell* cell, Visitor& visitor) +{ + auto* thisObject = jsCast(cell); + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + Base::visitChildren(thisObject, visitor); +#if ENABLE(WEBASSEMBLY) + visitor.append(thisObject->m_associatedWasmMemoryWrapper); +#endif // ENABLE(WEBASSEMBLY) +} + +DEFINE_VISIT_CHILDREN(JSArrayBuffer); + } // namespace JSC diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSArrayBuffer.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSArrayBuffer.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSArrayBuffer.h 2026-02-23 14:40:52.420317200 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSArrayBuffer.h 2026-07-09 07:12:41.796802800 +0000 @@ -27,9 +27,14 @@ #include #include +#include namespace JSC { +#if ENABLE(WEBASSEMBLY) +class JSWebAssemblyMemory; +#endif // ENABLE(WEBASSEMBLY) + class JSArrayBuffer final : public JSNonFinalObject { public: using Base = JSNonFinalObject; @@ -51,8 +56,16 @@ JS_EXPORT_PRIVATE bool isShared() const; ArrayBufferSharingMode sharingMode() const; bool isResizableOrGrowableShared() const { return m_impl->isResizableOrGrowableShared(); } - + +#if ENABLE(WEBASSEMBLY) + JSWebAssemblyMemory* associatedWasmMemoryWrapper() const; + void setAssociatedWasmMemoryWrapper(VM&, JSWebAssemblyMemory*); + void clearAssociatedWasmMemoryWrapper(); +#endif // ENABLE(WEBASSEMBLY) + DECLARE_EXPORT_INFO; + + DECLARE_VISIT_CHILDREN; // This is the default DOM unwrapping. It calls toUnsharedArrayBuffer(). static ArrayBuffer* toWrapped(VM&, JSValue); @@ -65,6 +78,11 @@ static size_t estimatedSize(JSCell*, VM&); ArrayBuffer* m_impl; + // For resizable non-shared Wasm buffers, this points back to the owning JSWebAssemblyMemory so + // that ArrayBuffer.prototype.resize can delegate to Wasm::Memory::grow. +#if ENABLE(WEBASSEMBLY) + WriteBarrier m_associatedWasmMemoryWrapper; +#endif // ENABLE(WEBASSEMBLY) }; inline ArrayBuffer* toPossiblySharedArrayBuffer(VM&, JSValue value) diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSArrayBufferPrototype.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSArrayBufferPrototype.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSArrayBufferPrototype.cpp 2026-02-23 14:40:52.420317200 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSArrayBufferPrototype.cpp 2026-07-09 07:12:41.796802800 +0000 @@ -32,6 +32,11 @@ #include "JSCInlines.h" #include +#if ENABLE(WEBASSEMBLY) +#include "JSWebAssemblyMemory.h" +#include "WasmMemory.h" +#endif + WTF_ALLOW_UNSAFE_BUFFER_USAGE_BEGIN namespace JSC { @@ -292,6 +297,29 @@ if (!std::isfinite(newLength) || newLength < 0) return throwVMRangeError(globalObject, scope, "new length is out of range"_s); size_t newByteLength = static_cast(newLength); + +#if ENABLE(WEBASSEMBLY) + // Wasm JS API redefines the abstract operation HostResizeArrayBuffer as follows: + // https://webassembly.github.io/threads/js-api/index.html#abstract-operation-hostresizearraybuffer + // + // Further, WebAssembly-originated resizable ArrayBuffers must defer resizing to the backing + // WebAssembly memory for correct handling of refreshing bounds-checking memories. + if (auto* jsMemory = thisObject->associatedWasmMemoryWrapper()) { + size_t oldByteLength = thisObject->impl()->byteLength(); + if (newByteLength < oldByteLength) + return throwVMRangeError(globalObject, scope, "Cannot shrink WebAssembly memory"_s); + if (newByteLength % PageCount::pageSize) + return throwVMRangeError(globalObject, scope, makeString("WebAssembly memory cannot be resized to new byte length "_s, newByteLength, " because it is not a multiple of "_s, PageCount::pageSize)); + size_t delta = newByteLength - oldByteLength; + if (delta) { + auto result = jsMemory->memory().grow(vm, PageCount::fromBytes(delta)); + if (!result) + return throwVMRangeError(globalObject, scope, makeString("ArrayBuffer resize failed with new byte length "_s, newByteLength)); + } + return JSValue::encode(jsUndefined()); + } +#endif + if (!thisObject->impl()->resize(vm, newByteLength)) return throwVMRangeError(globalObject, scope, makeString("ArrayBuffer resize failed with new byte length "_s, newByteLength)); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSCJSValue.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSCJSValue.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSCJSValue.h 2026-04-02 14:33:47.377656000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSCJSValue.h 2026-07-09 07:12:41.796802800 +0000 @@ -296,7 +296,7 @@ inline JSObject* getObject() const; // 0 if not an object. Defined in JSCJSValueCellInlines.h // Extracting integer values. - bool getUInt32(uint32_t&) const; + inline bool getUInt32(uint32_t&) const; // Defined below // Basic conversions. inline JSValue toPrimitive(JSGlobalObject*, PreferredPrimitiveType = NoPreference) const; // Defined in JSCJSValueCellInlines.h @@ -366,7 +366,7 @@ JSValue getPrototype(JSGlobalObject*) const; JSValue toThis(JSGlobalObject*, ECMAMode) const; - inline static bool equal(JSGlobalObject*, JSValue v1, JSValue v2); // Defined in JSCJSValueInlines.h + inline static bool equal(JSGlobalObject*, JSValue v1, JSValue v2); // Defined below static bool equalSlowCase(JSGlobalObject*, JSValue v1, JSValue v2); inline static bool equalSlowCaseInline(JSGlobalObject*, JSValue v1, JSValue v2); // Defined in JSCJSValueInlines.h inline static bool strictEqual(JSGlobalObject*, JSValue v1, JSValue v2); // Defined in JSCJSValueInlines.h @@ -1410,4 +1410,28 @@ } #endif // USE(BIGINT32) +ALWAYS_INLINE bool JSValue::getUInt32(uint32_t& v) const +{ + if (isInt32()) { + int32_t i = asInt32(); + v = static_cast(i); + return i >= 0; + } + if (isDouble()) { + double d = asDouble(); + v = truncateDoubleToUint32(d); + return v == d; + } + return false; +} + +// ECMA 11.9.3 +inline bool JSValue::equal(JSGlobalObject* globalObject, JSValue v1, JSValue v2) +{ + if (v1.isInt32() && v2.isInt32()) + return v1 == v2; + + return equalSlowCase(globalObject, v1, v2); +} + } // namespace JSC diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSCJSValueInlines.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSCJSValueInlines.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSCJSValueInlines.h 2026-03-26 12:33:41.417457000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSCJSValueInlines.h 2026-07-09 07:12:41.796802800 +0000 @@ -64,8 +64,8 @@ inline JSValue::JSValue(double d) { - if (canBeStrictInt32(d)) { - *this = JSValue(static_cast(d)); + if (auto int32Value = tryConvertToStrictInt32(d)) { + *this = JSValue(int32Value.value()); return; } *this = JSValue(EncodeAsDouble, d); @@ -125,7 +125,7 @@ } if (isNumber()) { double number = asNumber(); - uint32_t asUint = static_cast(number); + uint32_t asUint = static_cast(truncateDoubleToUint64(number)); if (static_cast(asUint) == number && isIndex(asUint)) return asUint; } @@ -138,7 +138,7 @@ return asInt32(); if (isNumber()) { double number = asNumber(); - int32_t asInt = static_cast(number); + int32_t asInt = truncateDoubleToInt32(number); if (static_cast(asInt) == number) return asInt; } @@ -159,15 +159,6 @@ } #endif // USE(JSVALUE64) -// ECMA 11.9.3 -inline bool JSValue::equal(JSGlobalObject* globalObject, JSValue v1, JSValue v2) -{ - if (v1.isInt32() && v2.isInt32()) - return v1 == v2; - - return equalSlowCase(globalObject, v1, v2); -} - inline bool JSValue::isZeroBigInt() const { ASSERT(isBigInt()); @@ -195,21 +186,6 @@ return jsValue().getString(globalObject); } -ALWAYS_INLINE bool JSValue::getUInt32(uint32_t& v) const -{ - if (isInt32()) { - int32_t i = asInt32(); - v = static_cast(i); - return i >= 0; - } - if (isDouble()) { - double d = asDouble(); - v = static_cast(d); - return v == d; - } - return false; -} - ALWAYS_INLINE Identifier JSValue::toPropertyKey(JSGlobalObject* globalObject) const { VM& vm = getVM(globalObject); @@ -309,8 +285,11 @@ if (isInt32() || isBigInt()) return *this; - if (isDouble() && canBeInt32(asDouble())) - return jsNumber(static_cast(asDouble())); + + if (isDouble()) { + if (auto int32Value = tryConvertToStrictInt32(asDouble())) + return jsNumber(int32Value.value()); + } JSValue primValue = this->toPrimitive(globalObject, PreferNumber); RETURN_IF_EXCEPTION(scope, { }); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSFinalizationRegistry.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSFinalizationRegistry.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSFinalizationRegistry.cpp 2026-02-23 14:40:52.428317000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSFinalizationRegistry.cpp 2026-07-09 07:12:41.796802800 +0000 @@ -151,13 +151,13 @@ }); if (!m_hasAlreadyScheduledWork && (readiedCell || deadCount(locker))) { - auto ticket = vm.deferredWorkTimer->addPendingWork(DeferredWorkTimer::WorkType::ImminentlyScheduled, vm, this, { }); - ASSERT(vm.deferredWorkTimer->hasPendingWork(ticket)); - vm.deferredWorkTimer->scheduleWorkSoon(ticket, [this](DeferredWorkTimer::Ticket) { + auto weakTicket = vm.deferredWorkTimer->addPendingWork(DeferredWorkTimer::WorkType::ImminentlyScheduled, vm, this, { }); + bool queued = vm.deferredWorkTimer->scheduleWorkSoonIfActive(weakTicket, [this](DeferredWorkTimer::Ticket&) { JSGlobalObject* globalObject = this->globalObject(); this->m_hasAlreadyScheduledWork = false; this->runFinalizationCleanup(globalObject); }); + RELEASE_ASSERT(queued); m_hasAlreadyScheduledWork = true; } } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSGenericTypedArrayViewPrototypeFunctions.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSGenericTypedArrayViewPrototypeFunctions.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSGenericTypedArrayViewPrototypeFunctions.h 2026-03-25 16:38:32.896259500 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSGenericTypedArrayViewPrototypeFunctions.h 2026-07-09 07:12:41.796802800 +0000 @@ -208,22 +208,7 @@ { auto scope = DECLARE_THROW_SCOPE(vm); - if (!thisObject->isResizableNonShared()) [[likely]] { - // Including GrowableShared. The key invariant here is that we can access element via array[index] if we check isDetached. - auto* array = thisObject->typedVector(); - - auto loopBody = [&](size_t index) ALWAYS_INLINE_LAMBDA -> IterationStatus { - JSValue element = jsUndefined(); - auto nativeValue = ViewClass::Adaptor::toNativeFromUndefined(); - if (!thisObject->isDetached()) [[likely]] { - nativeValue = array[index]; - element = ViewClass::Adaptor::toJSValue(globalObject, nativeValue); - RETURN_IF_EXCEPTION_WITH_TRAPS_DEFERRED(scope, { }); - } - - return functor(element, index, nativeValue); - }; - + auto forEachLoop = [&](auto&& loopBody) ALWAYS_INLINE_LAMBDA { if constexpr (direction == ForEachDirection::Forward) { for (size_t index = 0; index < length; ++index) { auto status = loopBody(index); @@ -240,10 +225,35 @@ return; } } + }; + + if (!thisObject->isResizableNonShared()) [[likely]] { + // Fixed-length TypedArrays backed by non-shared ArrayBuffers cannot shrink and go out of + // bounds, and only need to check for detachment. + // + // But they may have their vectors move: + // - Non-wasteful TypedArrays that don't have a backing ArrayBuffer yet can transition to + // being wasteful, and having an ArrayBuffer and change backing stores. + // - BoundsChecking Wasm memories can reallocate. + const bool hasStableVector = thisObject->hasArrayBuffer() && !thisObject->possiblySharedBuffer()->isWasmMemory(); + auto* array = hasStableVector ? thisObject->typedVector() : nullptr; + + forEachLoop([&](size_t index) ALWAYS_INLINE_LAMBDA -> IterationStatus { + JSValue element = jsUndefined(); + auto nativeValue = ViewClass::Adaptor::toNativeFromUndefined(); + if (!thisObject->isDetached()) [[likely]] { + nativeValue = (hasStableVector ? array : thisObject->typedVector())[index]; + element = ViewClass::Adaptor::toJSValue(globalObject, nativeValue); + RETURN_IF_EXCEPTION_WITH_TRAPS_DEFERRED(scope, { }); + } + + return functor(element, index, nativeValue); + }); + return; } - auto loopBody = [&](size_t index) ALWAYS_INLINE_LAMBDA -> IterationStatus { + forEachLoop([&](size_t index) ALWAYS_INLINE_LAMBDA -> IterationStatus { JSValue element = jsUndefined(); auto nativeValue = ViewClass::Adaptor::toNativeFromUndefined(); if (!thisObject->isDetached() && thisObject->inBounds(index)) [[likely]] { @@ -253,24 +263,7 @@ } return functor(element, index, nativeValue); - }; - - if constexpr (direction == ForEachDirection::Forward) { - for (size_t index = 0; index < length; ++index) { - auto status = loopBody(index); - RETURN_IF_EXCEPTION_WITH_TRAPS_DEFERRED(scope, void()); - if (IterationStatus::Done == status) - return; - } - } else { - size_t index = length; - while (index--) { - auto status = loopBody(index); - RETURN_IF_EXCEPTION_WITH_TRAPS_DEFERRED(scope, void()); - if (IterationStatus::Done == status) - return; - } - } + }); } template @@ -1525,12 +1518,12 @@ auto callData = JSC::getCallDataInline(comparatorValue); - size_t length = thisObject->length(); + auto originalSpan = thisObject->typedSpan(); + size_t length = originalSpan.size(); + if (length < 2) return JSValue::encode(thisObject); - auto originalSpan = thisObject->typedSpan(); - Vector vector; auto totalSize = CheckedSize { length } * 2U; if (totalSize.hasOverflowed() || !vector.tryGrow(totalSize.value())) [[unlikely]] { diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSGlobalObject.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSGlobalObject.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSGlobalObject.cpp 2026-02-23 14:40:52.431317000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSGlobalObject.cpp 2026-07-09 07:12:41.800802700 +0000 @@ -3028,7 +3028,7 @@ { if (thisObject->m_weakTickets) { Locker locker { thisObject->cellLock() }; - for (Ref ticket : *thisObject->m_weakTickets) { + for (Ref ticket : *thisObject->m_weakTickets) { // FIXME: This seems like it should remove the cancelled ticket? Although, it would likely have to deal with deadlocking somehow. if (ticket->isCancelled()) continue; @@ -3666,15 +3666,15 @@ } #endif -void JSGlobalObject::addWeakTicket(DeferredWorkTimer::Ticket ticket) +void JSGlobalObject::addWeakTicket(DeferredWorkTimer::Ticket& ticket) { Locker locker { cellLock() }; if (!m_weakTickets) { - auto weakTickets = makeUnique>(); + auto weakTickets = makeUnique>(); WTF::storeStoreFence(); m_weakTickets = WTF::move(weakTickets); } - m_weakTickets->add(*ticket); + m_weakTickets->add(ticket); vm().writeBarrier(this); } void JSGlobalObject::clearWeakTickets() diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSGlobalObject.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSGlobalObject.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSGlobalObject.h 2026-02-23 14:40:52.431317000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSGlobalObject.h 2026-07-09 07:12:41.800802700 +0000 @@ -553,9 +553,9 @@ inline std::unique_ptr& typedArrayPrototypeSymbolIteratorAbsenceWatchpoint(TypedArrayType); inline std::unique_ptr>& typedArrayPrototypeConstructorWatchpoint(TypedArrayType); - void addWeakTicket(DeferredWorkTimer::Ticket); + void addWeakTicket(DeferredWorkTimer::Ticket&); void clearWeakTickets(); - std::unique_ptr> m_weakTickets; + std::unique_ptr> m_weakTickets; public: JSCallee* zombieFrameCallee() const { return m_zombieFrameCallee.get(); } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSLock.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSLock.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSLock.cpp 2026-01-20 14:08:32.423705800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSLock.cpp 2026-07-09 07:12:41.800802700 +0000 @@ -105,8 +105,7 @@ } m_ownerThread = &Thread::currentSingleton(); - WTF::storeStoreFence(); - m_hasOwnerThread = true; + m_hasOwnerThread.store(true, std::memory_order_release); ASSERT(!m_lockCount); m_lockCount = lockCount; @@ -177,7 +176,7 @@ m_lockCount -= unlockCount; if (!m_lockCount) { - m_hasOwnerThread = false; + m_hasOwnerThread.store(false, std::memory_order_release); m_lock.unlock(); } } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSLock.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSLock.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSLock.h 2026-02-23 14:40:52.434317000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSLock.h 2026-07-09 07:12:41.800802700 +0000 @@ -89,7 +89,7 @@ std::optional> ownerThread() const { - if (m_hasOwnerThread) + if (m_hasOwnerThread.load(std::memory_order_acquire)) return m_ownerThread; return std::nullopt; } @@ -99,12 +99,12 @@ // with thread suspension. Returns std::nullopt if there is no owner thread. std::optional ownerThreadUID() const { - if (!m_hasOwnerThread) + if (!m_hasOwnerThread.load(std::memory_order_acquire)) return std::nullopt; return m_ownerThread->uid(); } - bool currentThreadIsHoldingLock() { return m_hasOwnerThread && m_ownerThread.get() == &Thread::currentSingleton(); } + bool currentThreadIsHoldingLock() { return m_hasOwnerThread.load(std::memory_order_acquire) && m_ownerThread.get() == &Thread::currentSingleton(); } void willDestroyVM(VM*); @@ -148,7 +148,7 @@ // m_hasOwnerThread) because currentThreadIsHoldingLock() may be called from a // different thread, and an optional is vulnerable to races. // See https://bugs.webkit.org/show_bug.cgi?id=169042#c6 - bool m_hasOwnerThread { false }; + std::atomic m_hasOwnerThread { false }; bool m_shouldReleaseHeapAccess; RefPtr m_ownerThread; intptr_t m_lockCount; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSObjectInlines.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSObjectInlines.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSObjectInlines.h 2026-02-23 14:40:52.438317000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSObjectInlines.h 2026-07-09 07:12:41.800802700 +0000 @@ -881,7 +881,7 @@ ASSERT(!slot.isVMInquiry()); if (!JSObject::getPrivateFieldSlot(this, globalObject, propertyName, slot)) { throwException(globalObject, scope, createInvalidPrivateNameError(globalObject)); - RELEASE_AND_RETURN(scope, false); + return false; } EXCEPTION_ASSERT(!scope.exception()); RELEASE_AND_RETURN(scope, true); @@ -894,7 +894,7 @@ PropertySlot slot(this, PropertySlot::InternalMethodType::HasProperty); if (!JSObject::getPrivateFieldSlot(this, globalObject, propertyName, slot)) { throwException(globalObject, scope, createInvalidPrivateNameError(globalObject)); - RELEASE_AND_RETURN(scope, void()); + return; } EXCEPTION_ASSERT(!scope.exception()); @@ -906,10 +906,16 @@ { VM& vm = getVM(globalObject); auto scope = DECLARE_THROW_SCOPE(vm); + + if (type() == WebAssemblyGCObjectType) { + throwTypeError(globalObject, scope, "Cannot define private field on a WebAssembly GC object"_s); + return; + } + PropertySlot slot(this, PropertySlot::InternalMethodType::HasProperty); if (JSObject::getPrivateFieldSlot(this, globalObject, propertyName, slot)) { throwException(globalObject, scope, createRedefinedPrivateNameError(globalObject)); - RELEASE_AND_RETURN(scope, void()); + return; } EXCEPTION_ASSERT(!scope.exception()); @@ -970,10 +976,15 @@ Structure* structure = this->structure(); if (structure->isBrandedStructure() && jsCast(structure)->checkBrand(asSymbol(brand))) { throwException(globalObject, scope, createReinstallPrivateMethodError(globalObject)); - RELEASE_AND_RETURN(scope, void()); + return; } EXCEPTION_ASSERT(!scope.exception()); + if (type() == WebAssemblyGCObjectType) { + throwTypeError(globalObject, scope, "Cannot add private method to a WebAssembly GC object"_s); + return; + } + scope.release(); DeferredStructureTransitionWatchpointFire deferredWatchpointFire(vm, structure); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSString.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSString.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSString.h 2026-02-23 14:40:52.444317000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSString.h 2026-07-09 07:12:41.800802700 +0000 @@ -842,15 +842,19 @@ ALWAYS_INLINE void JSString::swapToAtomString(VM& vm, RefPtr&& atom) const { - // We replace currently held string with new AtomString. But the old string can be accessed from concurrent compilers and GC threads at any time. - // So, we keep the old string alive by appending it to Heap::m_possiblyAccessedStringsFromConcurrentThreads. And GC clears that list when GC finishes. - // This is OK since (1) when finishing GC concurrent compiler threads and GC threads are stopped, and (2) AtomString is already held in the atom table, - // and we anyway keep this old string until this JSString* is GC-ed. So it does not increase any memory pressure, we release at the same timing. + // When we swap a JSString's value to an AtomString, the old StringImpl can still be accessed + // by concurrent JIT compiler threads, GC threads, or via GCOwnedDataScope references on the stack. + // We keep the old string alive by appending it (paired with its owning JSString*) to + // Heap::m_possiblyAccessedStringsFromConcurrentThreadsOrGCOwnedDataScope. + // During GC, conservative root scanning discovers which JSStrings are still on the stack; at GC + // end we prune entries whose JSString was not discovered. Between GCs, + // Heap::clearConcurrentRetainedDataIfPossible clears the vector entirely when no JS is executing + // and no JIT compilations are in progress. ASSERT(!isCompilationThread() && !Thread::mayBeGCThread()); String target(WTF::move(atom)); WTF::storeStoreFence(); // Ensure AtomStringImpl's string is fully initialized when it is exposed to concurrent threads. valueInternal().swap(target); - vm.heap.appendPossiblyAccessedStringFromConcurrentThreads(WTF::move(target)); + vm.heap.appendPossiblyAccessedStringFromConcurrentThreadsOrGCOwnedDataScope(this, WTF::move(target)); } ALWAYS_INLINE Identifier JSString::toIdentifier(JSGlobalObject* globalObject) const diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSStringJoiner.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSStringJoiner.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/JSStringJoiner.h 2026-02-23 14:40:52.444317000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/JSStringJoiner.h 2026-07-09 07:12:41.800802700 +0000 @@ -216,8 +216,8 @@ ALWAYS_INLINE void JSStringJoiner::appendNumber(VM& vm, double value) { - if (canBeStrictInt32(value)) - appendNumber(vm, static_cast(value)); + if (auto int32Value = tryConvertToStrictInt32(value)) + appendNumber(vm, int32Value.value()); else append8Bit(vm.numericStrings.add(value)); } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/LiteralParser.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/LiteralParser.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/LiteralParser.cpp 2026-02-23 14:40:52.447317000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/LiteralParser.cpp 2026-07-09 07:12:41.800802700 +0000 @@ -98,7 +98,7 @@ if (m_lexer.next() != TokNumber) return false; double doubleIndex = m_lexer.currentToken()->numberToken; - int index = (int)doubleIndex; + int index = truncateDoubleToInt32(doubleIndex); if (index != doubleIndex || index < 0) return false; entry.m_pathIndex = index; @@ -150,6 +150,9 @@ template ALWAYS_INLINE bool LiteralParser::equalIdentifier(UniquedStringImpl* rep, typename Lexer::LiteralParserTokenPtr token) { + // In the literal parser, we don't want to follow property addition transitions if the property name is a symbol. + if (rep->isSymbol()) + return false; if (token->type == TokIdentifier) return WTF::equal(rep, token->identifier()); ASSERT(token->type == TokString); @@ -1417,9 +1420,9 @@ PropertyOffset offset; }; - auto* structure = object->structure(); + auto* originalStructure = object->structure(); auto property = [&, &vm = vm] ALWAYS_INLINE_LAMBDA -> Variant { - if (Structure* transition = structure->trySingleTransition()) { + if (Structure* transition = originalStructure->trySingleTransition()) { // This check avoids hash lookup and refcount churn in the common case of a matching single transition. SUPPRESS_UNCOUNTED_ARG if (transition->transitionKind() == TransitionKind::PropertyAddition && !transition->transitionPropertyAttributes() @@ -1429,11 +1432,11 @@ else if (transition->transitionPropertyName() != vm.propertyNames->underscoreProto && m_visitedUnderscoreProto.isEmpty()) return ExistingProperty { transition, transition->transitionOffset() }; } - } else if (!structure->isDictionary()) { + } else if (!originalStructure->isDictionary()) { // This check avoids refcount churn in the common case of a cached Identifier. if (SUPPRESS_UNCOUNTED_LOCAL AtomStringImpl* ident = existingIdentifier(vm, m_lexer.currentToken())) { PropertyOffset offset = 0; - Structure* newStructure = Structure::addPropertyTransitionToExistingStructure(structure, ident, 0, offset); + Structure* newStructure = Structure::addPropertyTransitionToExistingStructure(originalStructure, ident, 0, offset); if (newStructure) [[likely]] { if constexpr (parserMode == StrictJSON) return ExistingProperty { newStructure, offset }; @@ -1462,6 +1465,12 @@ if (!value) [[unlikely]] return { }; + // After parseRecursively, user code may have run (e.g. due to a __proto__ setter in a + // nested object), which may have changed the structure of the object. This invalidates + // any cached transition, so reset it to Identifier to take the slow path. + if (object->structure() != originalStructure && std::holds_alternative(property)) [[unlikely]] + property = Identifier::fromUid(vm, std::get(property).structure->transitionPropertyName()); + // When creating JSON object in this fast path, we know the following. // 1. The object is definitely JSFinalObject. // 2. The object rarely has duplicate properties. @@ -1471,10 +1480,10 @@ auto& [newStructure, offset] = std::get(property); Butterfly* newButterfly = object->butterfly(); - if (structure->outOfLineCapacity() != newStructure->outOfLineCapacity()) { - ASSERT(newStructure != structure); - newButterfly = object->allocateMoreOutOfLineStorage(vm, structure->outOfLineCapacity(), newStructure->outOfLineCapacity()); - object->nukeStructureAndSetButterfly(vm, structure->id(), newButterfly); + if (originalStructure->outOfLineCapacity() != newStructure->outOfLineCapacity()) { + ASSERT(newStructure != originalStructure); + newButterfly = object->allocateMoreOutOfLineStorage(vm, originalStructure->outOfLineCapacity(), newStructure->outOfLineCapacity()); + object->nukeStructureAndSetButterfly(vm, originalStructure->id(), newButterfly); } validateOffset(offset); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/MathCommon.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/MathCommon.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/MathCommon.cpp 2026-03-26 12:33:41.418457000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/MathCommon.cpp 2026-07-09 07:12:41.800802700 +0000 @@ -462,7 +462,7 @@ #if HAVE(ARM_IDIV_INSTRUCTIONS) static inline bool isStrictInt32(double value) { - int32_t valueAsInt32 = static_cast(value); + int32_t valueAsInt32 = truncateDoubleToInt32(value); if (value != valueAsInt32) return false; @@ -640,10 +640,10 @@ JSC_DEFINE_NOEXCEPT_JIT_OPERATION(i64_rem_s, int64_t, (int64_t a, int64_t b)) { return a % b; } JSC_DEFINE_NOEXCEPT_JIT_OPERATION(i64_rem_u, uint64_t, (uint64_t a, uint64_t b)) { return a % b; } -JSC_DEFINE_NOEXCEPT_JIT_OPERATION(i64_trunc_u_f32, uint64_t, (float operand)) { return static_cast(operand); } -JSC_DEFINE_NOEXCEPT_JIT_OPERATION(i64_trunc_s_f32, int64_t, (float operand)) { return static_cast(operand); } -JSC_DEFINE_NOEXCEPT_JIT_OPERATION(i64_trunc_u_f64, uint64_t, (double operand)) { return static_cast(operand); } -JSC_DEFINE_NOEXCEPT_JIT_OPERATION(i64_trunc_s_f64, int64_t, (double operand)) { return static_cast(operand); } +JSC_DEFINE_NOEXCEPT_JIT_OPERATION(i64_trunc_u_f32, uint64_t, (float operand)) { return truncateFloatToUint64(operand); } +JSC_DEFINE_NOEXCEPT_JIT_OPERATION(i64_trunc_s_f32, int64_t, (float operand)) { return truncateFloatToInt64(operand); } +JSC_DEFINE_NOEXCEPT_JIT_OPERATION(i64_trunc_u_f64, uint64_t, (double operand)) { return truncateDoubleToUint64(operand); } +JSC_DEFINE_NOEXCEPT_JIT_OPERATION(i64_trunc_s_f64, int64_t, (double operand)) { return truncateDoubleToInt64(operand); } JSC_DEFINE_NOEXCEPT_JIT_OPERATION(f32_convert_u_i64, float, (uint64_t operand)) { return static_cast(operand); } JSC_DEFINE_NOEXCEPT_JIT_OPERATION(f32_convert_s_i64, float, (int64_t operand)) { return static_cast(operand); } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/MathCommon.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/MathCommon.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/MathCommon.h 2026-03-26 12:33:41.418457000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/MathCommon.h 2026-07-09 07:12:41.800802700 +0000 @@ -31,6 +31,7 @@ #include #include #include +#include namespace JSC { @@ -240,21 +241,6 @@ return reciprocal; } -ALWAYS_INLINE bool canBeStrictInt32(double value) -{ - if (std::isinf(value) || std::isnan(value)) - return false; - const int32_t asInt32 = static_cast(value); - return !(asInt32 != value || (!asInt32 && std::signbit(value))); // true for -0.0 -} - -ALWAYS_INLINE bool canBeInt32(double value) -{ - if (std::isinf(value) || std::isnan(value)) - return false; - return static_cast(value) == value; -} - extern "C" { JSC_DECLARE_NOEXCEPT_JIT_OPERATION(jsRound, double, (double)); } @@ -366,6 +352,7 @@ JSC_DECLARE_NOEXCEPT_JIT_OPERATION(jsRoundDouble, double, (double)); JSC_DECLARE_NOEXCEPT_JIT_OPERATION(roundFloat, float, (float)); +// FIXME: Remote them. These functions were only used in 32bit wasm. JSC_DECLARE_NOEXCEPT_JIT_OPERATION(f32_nearest, float, (float)); JSC_DECLARE_NOEXCEPT_JIT_OPERATION(f64_nearest, double, (double)); JSC_DECLARE_NOEXCEPT_JIT_OPERATION(f32_roundeven, float, (float)); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/NumberPrototype.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/NumberPrototype.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/NumberPrototype.cpp 2026-03-26 12:33:41.418457000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/NumberPrototype.cpp 2026-07-09 07:12:41.800802700 +0000 @@ -374,7 +374,7 @@ { ASSERT(2 <= radix && radix <= 36); - int32_t integerValue = static_cast(doubleValue); + int32_t integerValue = truncateDoubleToInt32(doubleValue); if (integerValue == doubleValue) return toStringWithRadixInternal(integerValue, radix); @@ -400,15 +400,16 @@ JSValue arg = callFrame->argument(0); // Perform ToInteger on the argument before remaining steps. - int decimalPlaces = static_cast(arg.toIntegerOrInfinity(globalObject)); + double decimalPlacesDouble = arg.toIntegerOrInfinity(globalObject); RETURN_IF_EXCEPTION(scope, { }); // Handle NaN and Infinity. if (!std::isfinite(x)) return JSValue::encode(jsNontrivialString(vm, String::number(x))); - if (decimalPlaces < 0 || decimalPlaces > 100) + if (decimalPlacesDouble < 0 || decimalPlacesDouble > 100) return throwVMRangeError(globalObject, scope, "toExponential() argument must be between 0 and 100"_s); + int decimalPlaces = static_cast(decimalPlacesDouble); // Round if the argument is not undefined, always format as exponential. NumberToStringBuffer buffer; @@ -436,10 +437,11 @@ if (!toThisNumber(callFrame->thisValue(), x)) return throwVMToThisNumberError(globalObject, scope, callFrame->thisValue()); - int decimalPlaces = static_cast(callFrame->argument(0).toIntegerOrInfinity(globalObject)); + double decimalPlacesDouble = callFrame->argument(0).toIntegerOrInfinity(globalObject); RETURN_IF_EXCEPTION(scope, { }); - if (decimalPlaces < 0 || decimalPlaces > 100) + if (decimalPlacesDouble < 0 || decimalPlacesDouble > 100) return throwVMRangeError(globalObject, scope, "toFixed() argument must be between 0 and 100"_s); + int decimalPlaces = static_cast(decimalPlacesDouble); // 15.7.4.5.7 states "If x >= 10^21, then let m = ToString(x)" // This also covers Ininity, and structure the check so that NaN @@ -476,15 +478,16 @@ return JSValue::encode(jsString(vm, String::number(x))); // Perform ToInteger on the argument before remaining steps. - int significantFigures = static_cast(arg.toIntegerOrInfinity(globalObject)); + double significantFiguresDouble = arg.toIntegerOrInfinity(globalObject); RETURN_IF_EXCEPTION(scope, { }); // Handle NaN and Infinity. if (!std::isfinite(x)) return JSValue::encode(jsNontrivialString(vm, String::number(x))); - if (significantFigures < 1 || significantFigures > 100) + if (significantFiguresDouble < 1 || significantFiguresDouble > 100) return throwVMRangeError(globalObject, scope, "toPrecision() argument must be between 1 and 100"_s); + int significantFigures = static_cast(significantFiguresDouble); return JSValue::encode(jsString(vm, String::numberToStringFixedPrecision(x, significantFigures, TrailingZerosPolicy::Keep))); } @@ -559,7 +562,7 @@ { ASSERT(!(radix < 2 || radix > 36)); - int32_t integerValue = static_cast(doubleValue); + int32_t integerValue = truncateDoubleToInt32(doubleValue); if (integerValue == doubleValue) return int32ToStringInternal(vm, integerValue, radix); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/OptionsList.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/OptionsList.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/OptionsList.h 2026-02-23 14:40:52.454316900 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/OptionsList.h 2026-07-09 07:12:41.800802700 +0000 @@ -329,6 +329,7 @@ v(Unsigned, maximumBinaryStringSwitchCaseLength, 50, Normal, nullptr) \ v(Unsigned, maximumBinaryStringSwitchTotalLength, 2000, Normal, nullptr) \ v(Unsigned, maximumRegExpTestInlineCodesize, 500, Normal, "Maximum code size in bytes for inlined RegExp.test JIT code."_s) \ + v(Unsigned, maximumRegExpJITCodeSize, 16 * MB, Normal, "Maximum generated code size in bytes for RegExp JIT compilation before falling back to the interpreter."_s) \ \ v(Unsigned, wasmInliningMaximumDepth, 7, Normal, "Maximum inlining depth to consider inlining a wasm function."_s) \ v(Unsigned, wasmInliningMaximumWasmCalleeSize, 500, Normal, "Maximum wasm size in bytes to consider inlining a wasm function."_s) \ diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/RegExp.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/RegExp.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/RegExp.cpp 2026-02-23 14:40:52.458317000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/RegExp.cpp 2026-07-09 07:12:41.800802700 +0000 @@ -216,6 +216,8 @@ void RegExp::byteCodeCompileIfNecessary(VM* vm) { + Locker locker { cellLock() }; + if (m_regExpBytecode) return; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/RegExpInlines.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/RegExpInlines.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/RegExpInlines.h 2026-02-23 14:40:52.459317000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/RegExpInlines.h 2026-07-09 07:12:41.804802700 +0000 @@ -165,6 +165,10 @@ if (result == static_cast(Yarr::JSRegExpResult::JITCodeFailure)) { // JIT'ed code couldn't handle expression, so punt back to the interpreter. + if constexpr (matchFrom == Yarr::MatchFrom::CompilerThread) { + if (!m_regExpBytecode) + return -1; + } byteCodeCompileIfNecessary(&vm); if (m_state == ParseError) return throwError(); @@ -289,6 +293,10 @@ return result; // JIT'ed code couldn't handle expression, so punt back to the interpreter. + if constexpr (matchFrom == Yarr::MatchFrom::CompilerThread) { + if (!m_regExpBytecode) + return MatchResult::failed(); + } byteCodeCompileIfNecessary(&vm); if (m_state == ParseError) return throwError(); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/StringConstructor.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/StringConstructor.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/StringConstructor.cpp 2026-02-23 14:40:52.466317000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/StringConstructor.cpp 2026-07-09 07:12:41.804802700 +0000 @@ -129,7 +129,7 @@ double codePointAsDouble = callFrame->uncheckedArgument(i).toNumber(globalObject); RETURN_IF_EXCEPTION(scope, encodedJSValue()); - uint32_t codePoint = static_cast(codePointAsDouble); + uint32_t codePoint = truncateDoubleToUint32(codePointAsDouble); if (codePoint != codePointAsDouble || codePoint > UCHAR_MAX_VALUE) return throwVMError(globalObject, scope, createRangeError(globalObject, "Arguments contain a value that is out of range of code points"_s)); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/StringPrototypeInlines.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/StringPrototypeInlines.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/StringPrototypeInlines.h 2026-02-23 14:40:52.467316900 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/StringPrototypeInlines.h 2026-07-09 07:12:41.804802700 +0000 @@ -800,6 +800,8 @@ RETURN_IF_EXCEPTION_WITH_TRAPS_DEFERRED(scope, nullptr); auto string = jsString->value(globalObject); + RETURN_IF_EXCEPTION_WITH_TRAPS_DEFERRED(scope, nullptr); + replacementsAre8Bit &= string->is8Bit(); totalLength += string->length(); totalLength += (start - lastIndex); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/Structure.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/Structure.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/Structure.cpp 2026-02-23 14:40:52.468316800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/Structure.cpp 2026-07-09 07:12:41.804802700 +0000 @@ -208,15 +208,16 @@ { bool hasStaticNonEnumerableProperty = m_classInfo->hasStaticPropertyWithAnyOfAttributes(static_cast(PropertyAttribute::DontEnum)); bool hasStaticNonConfigurableProperty = m_classInfo->hasStaticPropertyWithAnyOfAttributes(static_cast(PropertyAttribute::DontDelete)); + bool isArrayStorage = hasAnyArrayStorage(indexingType); setDictionaryKind(NoneDictionaryKind); setIsPinnedPropertyTable(false); setHasAnyKindOfGetterSetterProperties(m_classInfo->hasStaticPropertyWithAnyOfAttributes(static_cast(PropertyAttribute::AccessorOrCustomAccessorOrValue))); setHasReadOnlyOrGetterSetterPropertiesExcludingProto(hasAnyKindOfGetterSetterProperties() || m_classInfo->hasStaticPropertyWithAnyOfAttributes(static_cast(PropertyAttribute::ReadOnly))); - setHasNonEnumerableProperties(hasStaticNonEnumerableProperty || typeInfo.overridesGetOwnPropertySlot()); + setHasNonEnumerableProperties(hasStaticNonEnumerableProperty || typeInfo.overridesGetOwnPropertySlot() || isArrayStorage); setHasSpecialProperties(false); - setHasNonConfigurableProperties(hasStaticNonConfigurableProperty || typeInfo.overridesGetOwnPropertySlot()); - setHasNonConfigurableReadOnlyOrGetterSetterProperties(hasStaticNonConfigurableProperty || (typeInfo.overridesGetOwnPropertySlot() && typeInfo.type() != ArrayType)); + setHasNonConfigurableProperties(hasStaticNonConfigurableProperty || typeInfo.overridesGetOwnPropertySlot() || isArrayStorage); + setHasNonConfigurableReadOnlyOrGetterSetterProperties(hasStaticNonConfigurableProperty || (typeInfo.overridesGetOwnPropertySlot() && typeInfo.type() != ArrayType) || isArrayStorage); setHasUnderscoreProtoPropertyExcludingOriginalProto(false); setIsQuickPropertyAccessAllowedForEnumeration(true); setTransitionPropertyAttributes(0); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/Structure.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/Structure.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/Structure.h 2026-02-23 14:40:52.468316800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/Structure.h 2026-07-09 07:12:41.804802700 +0000 @@ -353,6 +353,8 @@ bool propertyAccessesAreCacheableForAbsence() { + // FIXME: dictionaries cannot be cached for absence, so check for dictionaries here instead + // of at all call sites. return !typeInfo().getOwnPropertySlotIsImpureForPropertyAbsence(); } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/TypedArrayAdaptors.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/TypedArrayAdaptors.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/TypedArrayAdaptors.h 2026-02-23 14:40:52.478316800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/TypedArrayAdaptors.h 2026-07-09 07:12:41.804802700 +0000 @@ -71,7 +71,7 @@ #if HAVE(FJCVTZS_INSTRUCTION) return static_cast(toInt32(value)); #else - int32_t result = static_cast(value); + int32_t result = truncateDoubleToInt32(value); if (static_cast(result) != value) result = toInt32(value); return static_cast(result); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/WaiterListManager.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/WaiterListManager.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/WaiterListManager.cpp 2026-02-23 14:40:52.482316700 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/WaiterListManager.cpp 2026-07-09 07:12:41.804802700 +0000 @@ -26,7 +26,6 @@ #include "config.h" #include "WaiterListManager.h" -#include "DeferredWorkTimerInlines.h" #include "HeapCellInlines.h" #include "JSGlobalObject.h" #include "JSLock.h" @@ -56,6 +55,7 @@ Waiter::Waiter(JSPromise* promise) : m_vm(&promise->vm()) + , m_globalObject(promise->globalObject()) , m_ticket(m_vm->deferredWorkTimer->addPendingWork(DeferredWorkTimer::WorkType::AtSomePoint, *m_vm, promise, { })) , m_isAsync(true) { @@ -204,8 +204,8 @@ ASSERT(!waiter->isOnList()); if (waiter->isAsync()) { - waiter->scheduleWorkAndClear(listLocker, [resolveResult](DeferredWorkTimer::Ticket ticket) { - JSPromise* promise = jsCast(ticket->target()); + waiter->scheduleWorkAndClear(listLocker, [resolveResult](DeferredWorkTimer::Ticket& ticket) { + JSPromise* promise = jsCast(ticket.target()); JSGlobalObject* globalObject = promise->globalObject(); VM& vm = promise->vm(); JSValue result = resolveResult == ResolveResult::Ok ? vm.smallStrings.okString() : vm.smallStrings.timedOutString(); @@ -243,10 +243,8 @@ void Waiter::scheduleWorkAndClear(const AbstractLocker& listLocker, DeferredWorkTimer::Task&& task) { ASSERT(m_isAsync && m_vm && !isOnList()); - if (auto ticket = this->ticket(listLocker)) { - m_vm->deferredWorkTimer->scheduleWorkSoon(ticket.get(), WTF::move(task)); + if (m_vm->deferredWorkTimer->scheduleWorkSoonIfActive(m_ticket, WTF::move(task))) clearTicket(listLocker); - } clearTimer(listLocker); } @@ -254,8 +252,7 @@ { ASSERT(m_isAsync); if (auto ticket = this->ticket(listLocker)) { - m_vm->deferredWorkTimer->cancelPendingWork(ticket.get()); - m_vm->deferredWorkTimer->scheduleWorkSoon(ticket.get(), [](DeferredWorkTimer::Ticket) { }); + m_vm->deferredWorkTimer->cancelPendingWork(*ticket); clearTicket(listLocker); } clearTimer(listLocker); @@ -292,16 +289,14 @@ Ref list = entry.value; Locker listLocker { list->lock }; list->removeIf(listLocker, [&](Waiter* waiter) { - if (waiter->isAsync()) { - if (auto ticket = waiter->ticket(listLocker); ticket && !ticket->isCancelled() && ticket->target()->globalObject() == globalObject) { - dataLogLnIf(WaiterListsManagerInternal::verbose, - " unregister JSGlobalObject is cancelling waiter=", *waiter, - " in WaiterList for ptr ", RawPointer(entry.key)); + if (waiter->isAsync() && waiter->globalObject() == globalObject) { + dataLogLnIf(WaiterListsManagerInternal::verbose, + " unregister JSGlobalObject is cancelling waiter=", *waiter, + " in WaiterList for ptr ", RawPointer(entry.key)); - waiter->cancelAndClear(listLocker); - return true; - } + waiter->cancelAndClear(listLocker); + return true; } return false; }); @@ -374,8 +369,8 @@ auto ticket = this->ticket(NoLockingNecessary); out.print(", ticket=", RawPointer(ticket.get())); + out.print(", globalObject=", RawPointer(m_globalObject)); if (ticket && !ticket->isCancelled()) { - out.print(", m_ticket->globalObject=", RawPointer(ticket->target()->globalObject())); out.print(", m_ticket->target=", RawPointer(jsCast(ticket->dependencies().last()))); out.print(", m_ticket->scriptExecutionOwner=", RawPointer(ticket->scriptExecutionOwner())); } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/WaiterListManager.h webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/WaiterListManager.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/runtime/WaiterListManager.h 2026-02-23 14:40:52.482316700 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/runtime/WaiterListManager.h 2026-07-09 07:12:41.804802700 +0000 @@ -54,13 +54,19 @@ return m_vm; } + JSGlobalObject* globalObject() const + { + ASSERT(m_isAsync); + return m_globalObject; + } + Condition& condition() { ASSERT(!m_isAsync); return m_condition; } - RefPtr ticket(const AbstractLocker&) const + RefPtr ticket(const AbstractLocker&) const { ASSERT(m_isAsync); return m_ticket.get(); @@ -101,7 +107,12 @@ private: VM* m_vm { nullptr }; - ThreadSafeWeakPtr m_ticket { nullptr }; + // Cached at construction to avoid a cross-VM race: unregister(JSGlobalObject*) runs on + // one VM's sweep thread; reading ticket->target()->globalObject() would race with another + // VM's GC End phase freeing m_dependencies via cancelAndClear(). Written before the Waiter + // is added to any list, so readers acquiring list->lock always see the completed write. + JSGlobalObject* m_globalObject { nullptr }; + ThreadSafeWeakPtr m_ticket { nullptr }; RefPtr m_timer { nullptr }; Condition m_condition; bool m_isAsync { false }; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/tools/JSDollarVM.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/tools/JSDollarVM.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/tools/JSDollarVM.cpp 2026-02-23 14:40:52.487316800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/tools/JSDollarVM.cpp 2026-07-09 07:12:41.808802600 +0000 @@ -26,6 +26,7 @@ #include "config.h" #include "JSDollarVM.h" +#include "AccessCase.h" #include "ArrayPrototype.h" #include "BuiltinNames.h" #include "CachedCall.h" @@ -52,14 +53,17 @@ #include "JSString.h" #include "LinkBuffer.h" #include "NativeCallee.h" +#include "ObjectPropertyCondition.h" #include "OperationResult.h" #include "Options.h" #include "Parser.h" #include "ProbeContext.h" +#include "Scribble.h" #include "ShadowChicken.h" #include "Snippet.h" #include "SnippetParams.h" #include "Strong.h" +#include "StructureStubClearingWatchpoint.h" #include "TypeProfiler.h" #include "TypeProfilerLog.h" #include "VMEntryScopeInlines.h" @@ -119,6 +123,8 @@ void updateVMStackLimits() { return m_vm.updateStackLimits(); }; + static void setOwnerIsDead(GCAwareJITStubRoutine& stub) { stub.m_ownerIsDead = true; } + VM& m_vm; }; @@ -2227,6 +2233,8 @@ static JSC_DECLARE_HOST_FUNCTION(functionGetGetterSetter); static JSC_DECLARE_HOST_FUNCTION(functionLoadGetterFromGetterSetter); static JSC_DECLARE_HOST_FUNCTION(functionCreateCustomTestGetterSetter); +static JSC_DECLARE_HOST_FUNCTION(functionCreateCustomTestGetterSetterWithSharedStructure); +static JSC_DECLARE_HOST_FUNCTION(functionInstallStructureStubClearingWatchpointWithDeadOwner); static JSC_DECLARE_HOST_FUNCTION(functionDeltaBetweenButterflies); static JSC_DECLARE_HOST_FUNCTION(functionCurrentCPUTime); static JSC_DECLARE_HOST_FUNCTION(functionTotalGCTime); @@ -3823,6 +3831,81 @@ return JSValue::encode(JSTestCustomGetterSetter::create(vm, globalObject, JSTestCustomGetterSetter::createStructure(vm, globalObject))); } +JSC_DEFINE_HOST_FUNCTION(functionCreateCustomTestGetterSetterWithSharedStructure, (JSGlobalObject* globalObject, CallFrame* callFrame)) +{ + DollarVMAssertScope assertScope; + VM& vm = globalObject->vm(); + auto* dollarVM = jsDynamicCast(callFrame->thisValue()); + RELEASE_ASSERT(dollarVM); + return JSValue::encode(JSTestCustomGetterSetter::create(vm, globalObject, dollarVM->testCustomGetterSetterStructure())); +} + +// Usage: $vm.installStructureStubClearingWatchpointWithDeadOwner(proto, "propertyName") Creates a +// +// PolymorphicAccessJITStubRoutine with an AdaptiveValueStructureStubClearingWatchpoint installed on +// proto's Structure for the given Equivalence property condition, then simulates the dead-owner +// state. +JSC_DEFINE_HOST_FUNCTION(functionInstallStructureStubClearingWatchpointWithDeadOwner, (JSGlobalObject* globalObject, CallFrame* callFrame)) +{ +#if ENABLE(JIT) + DollarVMAssertScope assertScope; + VM& vm = globalObject->vm(); + + JSObject* proto = jsDynamicCast(callFrame->argument(0)); + RELEASE_ASSERT(proto); + JSString* propNameStr = jsDynamicCast(callFrame->argument(1)); + RELEASE_ASSERT(propNameStr); + auto scope = DECLARE_THROW_SCOPE(vm); + auto propertyName = propNameStr->toIdentifier(globalObject); + RETURN_IF_EXCEPTION(scope, { }); + + Structure* structure = proto->structure(); + PropertyOffset offset = structure->get(vm, propertyName); + RELEASE_ASSERT(isValidOffset(offset)); + JSValue value = proto->getDirect(offset); + RELEASE_ASSERT(value.isCell() && value.asCell()->type() == CustomGetterSetterType); + + // Create Equivalence ObjectPropertyCondition: "property on proto equals value". + ObjectPropertyCondition condition = ObjectPropertyCondition::equivalence( + vm, proto, proto, propertyName.impl(), value); + RELEASE_ASSERT(condition); + RELEASE_ASSERT(condition.kind() == PropertyCondition::Equivalence); + + // Create a PolymorphicAccessJITStubRoutine. + // Use isCodeImmutable=true so JITStubRoutineSet::add doesn't read the (empty) code address. + MacroAssemblerCodeRef emptyCode; + auto stub = adoptRef(*new PolymorphicAccessJITStubRoutine( + JITStubRoutine::Type::PolymorphicAccessJITStubRoutineType, emptyCode, vm, + FixedVector> { }, FixedVector { }, proto, true)); + stub->makeGCAware(vm); + + // Install the AdaptiveValueStructureStubClearingWatchpoint on proto's Structure. + // Must start watching property replacements first (as the IC does). + structure->startWatchingPropertyForReplacements(vm, offset); + auto& watchpointVariant = *stub->watchpoints().add( + WTF::InPlaceType, + stub.ptr(), condition, stub->watchpointSet()); + auto& adaptiveWp = std::get(watchpointVariant); + adaptiveWp.install(vm); + + // Store the stub on $vm and set the owner as dead, simulating the window + // between GC marking-end and CodeBlock sweep. + JSDollarVMHelper::setOwnerIsDead(stub.get()); + auto* dollarVM = jsDynamicCast(callFrame->thisValue()); + RELEASE_ASSERT(dollarVM); + dollarVM->m_testStubRoutine = WTF::move(stub); + + // Scribble proto's cell header to simulate a swept dead cell. + scribble(proto, sizeof(JSCell)); + + return JSValue::encode(jsUndefined()); +#else + UNUSED_PARAM(globalObject); + UNUSED_PARAM(callFrame); + return JSValue::encode(jsUndefined()); +#endif +} + JSC_DEFINE_HOST_FUNCTION(functionDeltaBetweenButterflies, (JSGlobalObject*, CallFrame* callFrame)) { DollarVMAssertScope assertScope; @@ -4483,6 +4566,8 @@ addFunction(vm, "getGetterSetter"_s, functionGetGetterSetter, 2); addFunction(vm, "loadGetterFromGetterSetter"_s, functionLoadGetterFromGetterSetter, 1); addFunction(vm, "createCustomTestGetterSetter"_s, functionCreateCustomTestGetterSetter, 1); + addFunction(vm, "createCustomTestGetterSetterWithSharedStructure"_s, functionCreateCustomTestGetterSetterWithSharedStructure, 0); + addFunction(vm, "installStructureStubClearingWatchpointWithDeadOwner"_s, functionInstallStructureStubClearingWatchpointWithDeadOwner, 2); addFunction(vm, "deltaBetweenButterflies"_s, functionDeltaBetweenButterflies, 2); @@ -4551,6 +4636,7 @@ addFunction(vm, "weakCreate"_s, functionWeakCreate, 0); m_objectDoingSideEffectPutWithoutCorrectSlotStatusStructureID.set(vm, this, ObjectDoingSideEffectPutWithoutCorrectSlotStatus::createStructure(vm, globalObject, jsNull())); + m_testCustomGetterSetterStructureID.set(vm, this, JSTestCustomGetterSetter::createStructure(vm, globalObject)); } void JSDollarVM::addFunction(VM& vm, JSGlobalObject* globalObject, ASCIILiteral name, NativeFunction function, unsigned arguments) @@ -4578,6 +4664,7 @@ JSDollarVM* thisObject = jsCast(cell); Base::visitChildren(thisObject, visitor); visitor.append(thisObject->m_objectDoingSideEffectPutWithoutCorrectSlotStatusStructureID); + visitor.append(thisObject->m_testCustomGetterSetterStructureID); } DEFINE_VISIT_CHILDREN(JSDollarVM); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/tools/JSDollarVM.h webkit2gtk-2.52.5/Source/JavaScriptCore/tools/JSDollarVM.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/tools/JSDollarVM.h 2026-02-23 14:40:52.487316800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/tools/JSDollarVM.h 2026-07-09 07:12:41.808802600 +0000 @@ -25,6 +25,7 @@ #pragma once +#include #include #include @@ -65,7 +66,12 @@ } Structure* objectDoingSideEffectPutWithoutCorrectSlotStatusStructure() { return m_objectDoingSideEffectPutWithoutCorrectSlotStatusStructureID.get(); } - + Structure* testCustomGetterSetterStructure() { return m_testCustomGetterSetterStructureID.get(); } + +#if ENABLE(JIT) + RefPtr m_testStubRoutine; +#endif + private: JSDollarVM(VM& vm, Structure* structure) : Base(vm, structure) @@ -80,6 +86,7 @@ static void getOwnPropertyNames(JSObject*, JSGlobalObject*, PropertyNameArrayBuilder&, DontEnumPropertiesMode); WriteBarrierStructureID m_objectDoingSideEffectPutWithoutCorrectSlotStatusStructureID; + WriteBarrierStructureID m_testCustomGetterSetterStructureID; }; } // namespace JSC diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmBBQJIT.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmBBQJIT.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmBBQJIT.cpp 2026-03-03 21:30:17.018498700 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmBBQJIT.cpp 2026-07-09 07:12:41.808802600 +0000 @@ -287,6 +287,18 @@ } } +bool Location::rangesOverlap(Location a, uint32_t aSize, Location b, uint32_t bSize) +{ + if (a.m_kind != b.m_kind) + return false; + if (a.isStack() || a.isStackArgument()) { + ASSERT(aSize); + ASSERT(bSize); + return WTF::nonEmptyRangesOverlap(a.m_offset, a.m_offset + static_cast(aSize), b.m_offset, b.m_offset + static_cast(bSize)); + } + return a == b; +} + Location::Kind Location::kind() const { return Kind(m_kind); @@ -3134,8 +3146,8 @@ [[nodiscard]] ControlData BBQJIT::addTopLevel(BlockSignature&& signature) { if (Options::verboseBBQJITInstructions()) [[unlikely]] { - auto nameSection = m_info.nameSection; - std::pair> name = nameSection->get(m_functionIndex); + auto& nameSection = m_info.nameSection(); + std::pair> name = nameSection.get(m_functionIndex); dataLog("BBQ\tFunction "); if (name.first) dataLog(makeString(*name.first)); @@ -5417,7 +5429,7 @@ #if ASSERT_ENABLED for (size_t i = 0; i < dstVector.size(); ++i) { for (size_t j = i + 1; j < dstVector.size(); ++j) - ASSERT(dstVector[i] != dstVector[j]); + ASSERT(!Location::rangesOverlap(dstVector[i], srcVector[i].size(), dstVector[j], srcVector[j].size())); } // This algorithm assumes at most one cycle: https://xavierleroy.org/publi/parallel-move.pdf diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmBBQJIT.h webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmBBQJIT.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmBBQJIT.h 2026-03-03 21:30:17.019498600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmBBQJIT.h 2026-07-09 07:12:41.808802600 +0000 @@ -123,6 +123,8 @@ static Location fromArgumentLocation(ArgumentLocation argLocation, TypeKind type); + static bool rangesOverlap(Location a, uint32_t aSize, Location b, uint32_t bSize); + bool isNone() const; bool isGPR() const; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmBBQJIT64.h webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmBBQJIT64.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmBBQJIT64.h 2026-02-23 14:40:52.502316700 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmBBQJIT64.h 2026-07-09 07:12:41.808802600 +0000 @@ -462,11 +462,12 @@ if (srcLocation == dst) return; // Easily eliminate redundant moves here. + uint32_t dstSize = srcVector[index].size(); statusVector[index] = ShuffleStatus::BeingMoved; for (unsigned i = 0; i < srcVector.size(); i ++) { // This check should handle constants too - constants always have location None, and no // dst should ever be a constant. But we assume that's asserted in the caller. - if (locationOf(srcVector[i]) == dst) { + if (Location::rangesOverlap(locationOf(srcVector[i]), srcVector[i].size(), dst, dstSize)) { switch (statusVector[i]) { case ShuffleStatus::ToMove: emitShuffleMove(srcVector, dstVector, statusVector, i); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmBBQPlan.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmBBQPlan.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmBBQPlan.cpp 2026-02-23 14:40:52.503316600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmBBQPlan.cpp 2026-07-09 07:12:41.812802600 +0000 @@ -78,7 +78,7 @@ bool BBQPlan::dumpDisassembly(CompilationContext& context, LinkBuffer& linkBuffer, const TypeDefinition& signature, FunctionSpaceIndex functionIndexSpace) { if (shouldDumpDisassemblyFor(CompilationMode::BBQMode)) [[unlikely]] { - dataLogLn("Generated BBQ functionIndexSpace:(", functionIndexSpace, "),sig:(", signature.toString().ascii().data(), "),name:(", makeString(IndexOrName(functionIndexSpace, m_moduleInformation->nameSection->get(functionIndexSpace))).ascii().data(), "),wasmSize:(", m_moduleInformation->functionWasmSizeImportSpace(functionIndexSpace), ")"); + dataLogLn("Generated BBQ functionIndexSpace:(", functionIndexSpace, "),sig:(", signature.toString().ascii().data(), "),name:(", makeString(IndexOrName(functionIndexSpace, m_moduleInformation->nameSection().get(functionIndexSpace))).ascii().data(), "),wasmSize:(", m_moduleInformation->functionWasmSizeImportSpace(functionIndexSpace), ")"); if (context.bbqDisassembler) context.bbqDisassembler->dump(linkBuffer); linkBuffer.didAlreadyDisassemble(); @@ -96,7 +96,7 @@ TypeIndex typeIndex = m_moduleInformation->internalFunctionTypeIndices[m_functionIndex]; const TypeDefinition& signature = TypeInformation::get(typeIndex).expand(); - Ref callee = BBQCallee::create(functionIndexSpace, m_moduleInformation->nameSection->get(functionIndexSpace)); + Ref callee = BBQCallee::create(functionIndexSpace, m_moduleInformation->nameSection().get(functionIndexSpace)); std::unique_ptr function = compileFunction(m_functionIndex, callee.get(), context, unlinkedWasmToWasmCalls); LinkBuffer linkBuffer(*context.wasmEntrypointJIT, callee.ptr(), LinkBuffer::Profile::WasmBBQ, JITCompilationCanFail); @@ -114,7 +114,7 @@ bool alreadyDumped = dumpDisassembly(context, linkBuffer, signature, functionIndexSpace); function->entrypoint.compilation = makeUnique( - FINALIZE_CODE_IF((!alreadyDumped && shouldDumpDisassemblyFor(CompilationMode::BBQMode)), linkBuffer, JITCompilationPtrTag, nullptr, "BBQ functionIndexSpace:(", functionIndexSpace, "),sig:(", signature.toString().ascii().data(), "),name:(", makeString(IndexOrName(functionIndexSpace, m_moduleInformation->nameSection->get(functionIndexSpace))).ascii().data(), "),wasmSize:(", m_moduleInformation->functionWasmSizeImportSpace(functionIndexSpace), ")"), + FINALIZE_CODE_IF((!alreadyDumped && shouldDumpDisassemblyFor(CompilationMode::BBQMode)), linkBuffer, JITCompilationPtrTag, nullptr, "BBQ functionIndexSpace:(", functionIndexSpace, "),sig:(", signature.toString().ascii().data(), "),name:(", makeString(IndexOrName(functionIndexSpace, m_moduleInformation->nameSection().get(functionIndexSpace))).ascii().data(), "),wasmSize:(", m_moduleInformation->functionWasmSizeImportSpace(functionIndexSpace), ")"), WTF::move(context.wasmEntrypointByproducts)); CodePtr entrypoint; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmCallee.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmCallee.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmCallee.cpp 2026-02-23 14:40:52.504316600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmCallee.cpp 2026-07-09 07:12:41.812802600 +0000 @@ -55,13 +55,25 @@ WTF_MAKE_COMPACT_TZONE_ALLOCATED_IMPL(JITCallee); WTF_MAKE_COMPACT_TZONE_ALLOCATED_IMPL(JSToWasmCallee); WTF_MAKE_COMPACT_TZONE_ALLOCATED_IMPL(WasmToJSCallee); +WTF_MAKE_COMPACT_TZONE_ALLOCATED_IMPL(IPIntCallee); +WTF_MAKE_COMPACT_TZONE_ALLOCATED_IMPL(WasmBuiltinCallee); + +#if ENABLE(JIT) WTF_MAKE_COMPACT_TZONE_ALLOCATED_IMPL(JSToWasmICCallee); +#endif + +#if ENABLE(WEBASSEMBLY_BBQJIT) || ENABLE(WEBASSEMBLY_OMGJIT) WTF_MAKE_COMPACT_TZONE_ALLOCATED_IMPL(OptimizingJITCallee); +#endif + +#if ENABLE(WEBASSEMBLY_BBQJIT) +WTF_MAKE_COMPACT_TZONE_ALLOCATED_IMPL(BBQCallee); +#endif + +#if ENABLE(WEBASSEMBLY_OMGJIT) WTF_MAKE_COMPACT_TZONE_ALLOCATED_IMPL(OMGCallee); WTF_MAKE_COMPACT_TZONE_ALLOCATED_IMPL(OMGOSREntryCallee); -WTF_MAKE_COMPACT_TZONE_ALLOCATED_IMPL(BBQCallee); -WTF_MAKE_COMPACT_TZONE_ALLOCATED_IMPL(IPIntCallee); -WTF_MAKE_COMPACT_TZONE_ALLOCATED_IMPL(WasmBuiltinCallee); +#endif Callee::Callee(Wasm::CompilationMode compilationMode) : NativeCallee(NativeCallee::Category::Wasm, ImplementationVisibility::Private) @@ -292,7 +304,7 @@ void OptimizingJITCallee::addCodeOrigin(unsigned firstInlineCSI, unsigned lastInlineCSI, const Wasm::ModuleInformation& info, uint32_t functionIndex) { if (!nameSections.size()) - nameSections.append(info.nameSection); + nameSections.append(info.nameSection()); // The inline frame list is stored in postorder. For example: // A { B() C() D { E() } F() } -> B C E D F A #if ASSERT_ENABLED @@ -302,7 +314,7 @@ for (unsigned i = 0; i < codeOrigins.size(); ++i) ASSERT(codeOrigins[i].lastInlineCSI <= lastInlineCSI); ASSERT(nameSections.size() == 1); - ASSERT(nameSections[0].ptr() == info.nameSection.ptr()); + ASSERT(nameSections[0].ptr() == &info.nameSection()); #endif codeOrigins.append({ firstInlineCSI, lastInlineCSI, functionIndex, 0 }); } @@ -460,7 +472,6 @@ BBQCallee::~BBQCallee() { if (Options::freeRetiredWasmCode() && m_osrEntryCallee) { - ASSERT(m_osrEntryCallee->hasOneRef()); m_osrEntryCallee->reportToVMsForDestruction(); } } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmCalleeGroup.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmCalleeGroup.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmCalleeGroup.cpp 2026-02-23 14:40:52.504316600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmCalleeGroup.cpp 2026-07-09 07:12:41.812802600 +0000 @@ -326,9 +326,13 @@ }; // This is necessary since Callees are released under `Heap::stopThePeriphery()`, but that only stops JS compiler - // threads and not wasm ones. So the OMGOSREntryCallee could die between the time we collect the callsites and when - // we actually repatch its callsites. + // threads and not wasm ones. So a weakly held BBQCallee and its OMGOSREntryCallee could die between the time we + // collect the callsites and when we actually repatch its callsites. Additionally, after a re-tier (where a fresh + // BBQCallee replaces a retired one), m_osrEntryCallees may hold a stale weak ref to an OMGOSREntryCallee not + // owned by the current BBQCallee, so we always keep it alive unconditionally. + // FIXME: These inline capacities were picked semi-randomly. We should figure out if there's a better number. + Vector, 4> keepAliveBBQCallees; Vector, 4> keepAliveOSREntryCallees; Vector callsites; @@ -365,12 +369,14 @@ if (bbqCallee) { collectCallsites(bbqCallee.get()); ASSERT(!bbqCallee->osrEntryCallee() || m_osrEntryCallees.find(callerIndex) != m_osrEntryCallees.end()); + keepAliveBBQCallees.append(bbqCallee.releaseNonNull()); } #endif #if ENABLE(WEBASSEMBLY_OMGJIT) collectCallsites(tuple->m_omgCallee.get()); if (auto iter = m_osrEntryCallees.find(callerIndex); iter != m_osrEntryCallees.end()) { if (RefPtr callee = iter->value.get()) { + // Since there is a OMGOSREntryCallee, we need to collect all the callsites there and also keep it alive until we patch it. collectCallsites(callee.get()); keepAliveOSREntryCallees.append(callee.releaseNonNull()); } else diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmEntryPlan.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmEntryPlan.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmEntryPlan.cpp 2026-02-23 14:40:52.505316700 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmEntryPlan.cpp 2026-07-09 07:12:41.812802600 +0000 @@ -229,10 +229,10 @@ for (uint32_t index = functionIndex; index < functionIndexEnd; ++index) compileFunction(FunctionCodeIndex(index)); - if (m_moduleInformation->m_usesModernExceptions.loadRelaxed() && m_moduleInformation->m_usesLegacyExceptions.loadRelaxed()) { + { Locker locker { m_lock }; - fail(makeString("Module uses both legacy exceptions and try_table"_s)); - return; + if (failIfMixedExceptionHandlingProposals()) + return; } if (!areWasmToWasmStubsCompiled) { @@ -267,6 +267,16 @@ } } +bool EntryPlan::failIfMixedExceptionHandlingProposals() +{ + if (m_moduleInformation->m_usesModernExceptions.loadRelaxed() + && m_moduleInformation->m_usesLegacyExceptions.loadRelaxed()) { + fail(makeString("Module uses both legacy exceptions and try_table"_s)); + return true; + } + return false; +} + bool EntryPlan::completeSyncIfPossible() { Locker locker { m_lock }; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmEntryPlan.h webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmEntryPlan.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmEntryPlan.h 2026-02-23 14:40:52.505316700 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmEntryPlan.h 2026-07-09 07:12:41.812802600 +0000 @@ -118,6 +118,8 @@ bool isComplete() const override { return m_state == State::Completed; } void complete() WTF_REQUIRES_LOCK(m_lock) override; + bool failIfMixedExceptionHandlingProposals() WTF_REQUIRES_LOCK(m_lock); + virtual bool prepareImpl() = 0; virtual void compileFunction(FunctionCodeIndex functionIndex) = 0; virtual void didCompleteCompilation() WTF_REQUIRES_LOCK(m_lock) = 0; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmFormat.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmFormat.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmFormat.cpp 2026-02-23 14:40:52.506316700 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmFormat.cpp 2026-07-09 07:12:41.812802600 +0000 @@ -30,6 +30,7 @@ #if ENABLE(WEBASSEMBLY) #include "HeapVerifier.h" +#include "JSCellInlines.h" #include "JSWebAssemblyArray.h" #include "JSWebAssemblyStruct.h" #include "WasmCallee.h" diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmFormat.h webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmFormat.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmFormat.h 2026-03-26 12:33:41.419457000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmFormat.h 2026-07-09 07:12:41.812802600 +0000 @@ -554,10 +554,11 @@ inline JSValue internalizeExternref(JSValue value) { - if (value.isDouble() && JSC::canBeStrictInt32(value.asDouble())) { - int32_t int32Value = JSC::toInt32(value.asDouble()); - if (int32Value <= Wasm::maxI31ref && int32Value >= Wasm::minI31ref) - return jsNumber(int32Value); + if (value.isDouble()) { + if (auto int32Value = tryConvertToStrictInt32(value.asDouble())) { + if (int32Value.value() <= Wasm::maxI31ref && int32Value.value() >= Wasm::minI31ref) + return jsNumber(int32Value.value()); + } } return value; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmFunctionParser.h webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmFunctionParser.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmFunctionParser.h 2026-03-03 21:30:17.024498500 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmFunctionParser.h 2026-07-09 07:12:41.812802600 +0000 @@ -2814,6 +2814,7 @@ auto opName = op == ExtGCOpType::BrOnCast ? "br_on_cast"_s : "br_on_cast_fail"_s; uint8_t flags; WASM_VALIDATOR_FAIL_IF(!parseUInt8(flags), "can't get flags byte for "_s, opName); + WASM_VALIDATOR_FAIL_IF(flags & 0xFC, "reserved bits set in flags byte for "_s, opName); bool hasNull1 = flags & 0x1; bool hasNull2 = flags & 0x2; @@ -4312,6 +4313,7 @@ auto opName = op == ExtGCOpType::BrOnCast ? "br_on_cast"_s : "br_on_cast_fail"_s; uint8_t flags; WASM_VALIDATOR_FAIL_IF(!parseUInt8(flags), "can't get flags byte for "_s, opName); + WASM_VALIDATOR_FAIL_IF(flags & 0xFC, "reserved bits set in flags byte for "_s, opName); bool hasNull1 = flags & 0x1; bool hasNull2 = flags & 0x2; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmGlobal.h webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmGlobal.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmGlobal.h 2026-02-23 14:40:52.508316800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmGlobal.h 2026-07-09 07:12:41.812802600 +0000 @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -99,25 +100,28 @@ private: Global(Wasm::Type type, Wasm::Mutability mutability, uint64_t initialValue) : m_type(type) - , m_typeDefinition(TypeInformation::getRef(type.index)) , m_mutability(mutability) { ASSERT(m_type != Types::V128); + if (auto typeDefinition = TypeInformation::getRef(type.index)) + m_typeDependencies.emplace(Ref { *typeDefinition }); m_value.m_primitive = initialValue; } Global(Wasm::Type type, Wasm::Mutability mutability, v128_t initialValue) : m_type(type) - , m_typeDefinition(TypeInformation::getRef(type.index)) , m_mutability(mutability) { ASSERT(m_type == Types::V128); + if (auto typeDefinition = TypeInformation::getRef(type.index)) + m_typeDependencies.emplace(Ref { *typeDefinition }); m_value.m_vector = initialValue; } Wasm::Type m_type; - // If m_type came from a TypeDefinition, the following retains the definition to prevent a dangling m_type. - RefPtr m_typeDefinition; + // If m_type came from a TypeDefinition, the following retains the definition + // and all transitively reachable types to prevent dangling TypeIndex values. + std::optional m_typeDependencies; Wasm::Mutability m_mutability; JSWebAssemblyGlobal* m_owner { nullptr }; Value m_value; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmIPIntGenerator.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmIPIntGenerator.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmIPIntGenerator.cpp 2026-03-03 21:30:17.025498600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmIPIntGenerator.cpp 2026-07-09 07:12:41.812802600 +0000 @@ -178,7 +178,7 @@ BlockType m_blockType; CatchKind m_catchKind; - int32_t m_pendingOffset { -1 }; + std::optional m_pendingOffset; uint32_t m_index { 0 }; uint32_t m_pc { 0 }; // where am i? @@ -594,7 +594,7 @@ auto& target = m_controlStructuresAwaitingCoalescing[index]; if (target.isLoop) { ASSERT(target.m_entryResolved); - IPInt::BlockMetadata md = { static_cast(target.m_entryTarget.pc - loc.pc), static_cast(target.m_entryTarget.mc - loc.mc) }; + IPInt::BlockMetadata md = checkedDelta(target.m_entryTarget, loc); WRITE_TO_METADATA(metadata + loc.mc, md, IPInt::BlockMetadata); RECORD_NEXT_INSTRUCTION(loc.pc, target.m_entryTarget.pc); } else { @@ -655,9 +655,21 @@ // all jumps that go to the top level and return Vector m_jumpLocationsAwaitingEnd; - inline uint32_t curPC() { return m_parser->currentOpcodeStartingOffset() - m_metadata->m_bytecodeOffset; } - inline uint32_t nextPC() { return m_parser->offset() - m_metadata->m_bytecodeOffset; } - inline uint32_t curMC() { return m_metadata->m_metadata.size(); } + inline uint32_t curPC() { return Checked(m_parser->currentOpcodeStartingOffset()) - m_metadata->m_bytecodeOffset; } + inline uint32_t nextPC() { return Checked(m_parser->offset()) - m_metadata->m_bytecodeOffset; } + // FIXME: Should return size_t, but BlockMetadata::deltaMC is int32_t and the interpreter loads it with loadpairi. + inline uint32_t curMC() + { + Checked size = m_metadata->m_metadata.size(); + return size; + } + + static ALWAYS_INLINE IPInt::BlockMetadata checkedDelta(IPIntLocation to, IPIntLocation from) + { + Checked dPC = static_cast(to.pc) - static_cast(from.pc); + Checked dMC = static_cast(to.mc) - static_cast(from.mc); + return { dPC, dMC }; + } CallInformation m_cachedCallInformation { }; const FunctionSignature* m_cachedSignature { nullptr }; @@ -2154,7 +2166,7 @@ m_controlStructuresAwaitingCoalescing.shrink(0); for (auto& src : m_exitHandlersAwaitingCoalescing) { - IPInt::BlockMetadata md = { static_cast(here.pc - src.pc), static_cast(here.mc - src.mc) }; + IPInt::BlockMetadata md = checkedDelta(here, src); WRITE_TO_METADATA(m_metadata->m_metadata.mutableSpan().data() + src.mc, md, IPInt::BlockMetadata); RECORD_NEXT_INSTRUCTION(src.pc, here.pc); } @@ -2167,13 +2179,13 @@ ASSERT(!control.m_entryResolved); for (auto& src : control.m_awaitingEntryTarget) { // write delta PC and delta MC - IPInt::BlockMetadata md = { static_cast(loc.pc - src.pc), static_cast(loc.mc - src.mc) }; + IPInt::BlockMetadata md = checkedDelta(loc, src); WRITE_TO_METADATA(m_metadata->m_metadata.mutableSpan().data() + src.mc, md, IPInt::BlockMetadata); RECORD_NEXT_INSTRUCTION(src.pc, loc.pc); // FIXME: coalescing sequential blocks - should update instead of adding } if (control.isLoop) { for (auto& src : control.m_awaitingBranchTarget) { - IPInt::BlockMetadata md = { static_cast(loc.pc - src.pc), static_cast(loc.mc - src.mc) }; + IPInt::BlockMetadata md = checkedDelta(loc, src); WRITE_TO_METADATA(m_metadata->m_metadata.mutableSpan().data() + src.mc, md, IPInt::BlockMetadata); RECORD_NEXT_INSTRUCTION(src.pc, loc.pc); } @@ -2190,13 +2202,13 @@ ASSERT(!control.m_exitResolved); for (auto& src : control.m_awaitingExitTarget) { // write delta PC and delta MC - IPInt::BlockMetadata md = { static_cast(loc.pc - src.pc), static_cast(loc.mc - src.mc) }; + IPInt::BlockMetadata md = checkedDelta(loc, src); WRITE_TO_METADATA(m_metadata->m_metadata.mutableSpan().data() + src.mc, md, IPInt::BlockMetadata); RECORD_NEXT_INSTRUCTION(src.pc, loc.pc); } if (!control.isLoop) { for (auto& src : control.m_awaitingBranchTarget) { - IPInt::BlockMetadata md = { static_cast(loc.pc - src.pc), static_cast(loc.mc - src.mc) }; + IPInt::BlockMetadata md = checkedDelta(loc, src); WRITE_TO_METADATA(m_metadata->m_metadata.mutableSpan().data() + src.mc, md, IPInt::BlockMetadata); RECORD_NEXT_INSTRUCTION(src.pc, loc.pc); } @@ -2252,7 +2264,7 @@ splitStack(signature, oldStack, newStack); block = ControlType(WTF::move(signature), m_stackSize.value() - newStack.size(), BlockType::Loop); block.m_index = m_controlStructuresAwaitingCoalescing.size(); - block.m_pendingOffset = -1; // no need to update! + block.m_pendingOffset = std::nullopt; // no need to update! block.m_pc = curPC(); RECORD_NEXT_INSTRUCTION(block.m_pc, nextPC()); @@ -2286,7 +2298,7 @@ block.m_index = m_controlStructuresAwaitingCoalescing.size(); block.m_pc = curPC(); block.m_mc = curMC(); - block.m_pendingOffset = m_metadata->m_metadata.size(); + block.m_pendingOffset = curMC(); RECORD_NEXT_INSTRUCTION(block.m_pc, nextPC()); m_coalesceQueue.append(QueuedCoalesceRequest { m_controlStructuresAwaitingCoalescing.size(), true }); @@ -2317,7 +2329,7 @@ changeStackSize(blockSignature.argumentCount()); auto ifIndex = block.m_index; - auto mdIf = reinterpret_cast(m_metadata->m_metadata.mutableSpan().data() + block.m_pendingOffset); + auto mdIf = reinterpret_cast(m_metadata->m_metadata.mutableSpan().data() + *block.m_pendingOffset); // delta PC mdIf->elseDeltaPC = nextPC() - block.m_pc; @@ -2329,7 +2341,7 @@ mdIf->elseDeltaMC = curMC() - block.m_mc; block = ControlType(WTF::move(blockSignature), block.stackSize(), BlockType::Else); block.m_index = ifIndex; - block.m_pendingOffset = -1; + block.m_pendingOffset = std::nullopt; return { }; } @@ -2473,8 +2485,8 @@ HandlerType::Catch, static_cast(block.m_pc), static_cast(block.m_pcEnd + 1), // + 1 since m_pcEnd is the PC of the catch bytecode, which should be included in the range - static_cast(m_parser->offset() - m_metadata->m_bytecodeOffset), - static_cast(m_metadata->m_metadata.size()), + nextPC(), + curMC(), m_tryDepth, exceptionIndex }); @@ -2512,8 +2524,8 @@ HandlerType::CatchAll, static_cast(block.m_pc), static_cast(block.m_pcEnd + 1), // + 1 since m_pcEnd is the PC of the catch bytecode, which should be included in the range - static_cast(m_parser->offset() - m_metadata->m_bytecodeOffset), - static_cast(m_metadata->m_metadata.size()), + nextPC(), + curMC(), m_tryDepth, 0 }); @@ -2550,8 +2562,8 @@ HandlerType::Delegate, static_cast(data.m_pc), static_cast(data.m_pcEnd + 1), // + 1 since m_pcEnd is the PC of the delegate bytecode, which should be included in the range - static_cast(curPC()), - static_cast(curMC()), + curPC(), + curMC(), m_tryDepth, targetDepth }); @@ -2776,7 +2788,7 @@ m_exitHandlersAwaitingCoalescing.append({ block.m_pc, block.m_mc }); } else if (ControlType::isElse(block)) { // if it's not an if ... end, coalesce - if (block.m_pendingOffset != -1) + if (block.m_pendingOffset) m_exitHandlersAwaitingCoalescing.append({ block.m_pc, block.m_mc }); m_coalesceQueue.append({ static_cast(block.m_index), false }); --m_coalesceDebt; @@ -3180,8 +3192,8 @@ if (m_metadata->m_numLocals % 2) m_metadata->m_argumINTBytecode.append(0); - m_metadata->m_maxFrameSizeInV128 = roundUpToMultipleOf<2>(m_metadata->m_numLocals) / 2; - m_metadata->m_maxFrameSizeInV128 += m_metadata->m_numAlignedRethrowSlots / 2; + m_metadata->m_maxFrameSizeInV128 = roundUpToMultipleOf<2>(m_metadata->m_numLocals); + m_metadata->m_maxFrameSizeInV128 += m_metadata->m_numAlignedRethrowSlots; m_metadata->m_maxFrameSizeInV128 += m_maxStackSize; if (m_metadata->m_callTargets.size() < m_parser->numCallProfiles()) m_metadata->m_callTargets.insertFill(m_metadata->m_callTargets.size(), FunctionSpaceIndex { }, m_parser->numCallProfiles() - m_metadata->m_callTargets.size()); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmIPIntPlan.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmIPIntPlan.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmIPIntPlan.cpp 2026-02-23 14:40:52.508316800 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmIPIntPlan.cpp 2026-07-09 07:12:41.812802600 +0000 @@ -128,7 +128,7 @@ IPIntCallee* ipintCallee = nullptr; if (!m_callees) { - auto callee = IPIntCallee::create(*m_wasmInternalFunctions[functionIndex], functionIndexSpace, m_moduleInformation->nameSection->get(functionIndexSpace)); + auto callee = IPIntCallee::create(*m_wasmInternalFunctions[functionIndex], functionIndexSpace, m_moduleInformation->nameSection().get(functionIndexSpace)); ASSERT(!callee->entrypoint()); bool usesSIMD = m_moduleInformation->usesSIMD(functionIndex); // Immediately tier up to BBQ for SIMD, if necesary. @@ -224,6 +224,8 @@ void IPIntPlan::completeInStreaming() { Locker locker { m_lock }; + if (failIfMixedExceptionHandlingProposals()) + return; complete(); } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmIPIntSlowPaths.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmIPIntSlowPaths.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmIPIntSlowPaths.cpp 2026-02-23 14:40:52.509316700 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmIPIntSlowPaths.cpp 2026-07-09 07:12:41.812802600 +0000 @@ -349,6 +349,12 @@ ASSERT(!payloadIndex); } +static ALWAYS_INLINE IPIntLocal& rethrowSlotForDepth(IPIntLocal* pl, Wasm::IPIntCallee* callee, uint32_t depth) +{ + RELEASE_ASSERT(depth && depth <= callee->rethrowSlots()); + return pl[static_cast(callee->localSizeToAlloc()) + static_cast(depth) - 1]; +} + WASM_IPINT_EXTERN_CPP_DECL(retrieve_and_clear_exception, CallFrame* callFrame, IPIntStackEntry* stackPointer, IPIntLocal* pl) { VM& vm = instance->vm(); @@ -356,10 +362,8 @@ RELEASE_ASSERT(!!throwScope.exception()); Wasm::IPIntCallee* callee = IPINT_CALLEE(callFrame); - if (callee->rethrowSlots()) { - RELEASE_ASSERT(vm.targetTryDepthForThrow <= callee->rethrowSlots()); - pl[callee->localSizeToAlloc() + vm.targetTryDepthForThrow - 1].i64 = std::bit_cast(throwScope.exception()->value()); - } + if (callee->rethrowSlots()) + rethrowSlotForDepth(pl, callee, vm.targetTryDepthForThrow).i64 = std::bit_cast(throwScope.exception()->value()); if (stackPointer) { // We only have a stack pointer if we're doing a catch not a catch_all @@ -383,10 +387,8 @@ RELEASE_ASSERT(!!throwScope.exception()); Wasm::IPIntCallee* callee = IPINT_CALLEE(callFrame); - if (callee->rethrowSlots()) { - RELEASE_ASSERT(vm.targetTryDepthForThrow <= callee->rethrowSlots()); - pl[callee->localSizeToAlloc() + vm.targetTryDepthForThrow - 1].i64 = std::bit_cast(throwScope.exception()->value()); - } + if (callee->rethrowSlots()) + rethrowSlotForDepth(pl, callee, vm.targetTryDepthForThrow).i64 = std::bit_cast(throwScope.exception()->value()); Exception* exception = throwScope.exception(); stackPointer[0].ref = JSValue::encode(exception->value()); @@ -406,10 +408,8 @@ RELEASE_ASSERT(!!throwScope.exception()); Wasm::IPIntCallee* callee = IPINT_CALLEE(callFrame); - if (callee->rethrowSlots()) { - RELEASE_ASSERT(vm.targetTryDepthForThrow <= callee->rethrowSlots()); - pl[callee->localSizeToAlloc() + vm.targetTryDepthForThrow - 1].i64 = std::bit_cast(throwScope.exception()->value()); - } + if (callee->rethrowSlots()) + rethrowSlotForDepth(pl, callee, vm.targetTryDepthForThrow).i64 = std::bit_cast(throwScope.exception()->value()); Exception* exception = throwScope.exception(); auto* wasmException = jsSecureCast(exception->value()); @@ -453,7 +453,7 @@ WASM_RETURN_TWO(vm.targetMachinePCForThrow, nullptr); } -WASM_IPINT_EXTERN_CPP_DECL(rethrow_exception, CallFrame* callFrame, IPIntStackEntry* pl, unsigned tryDepth) +WASM_IPINT_EXTERN_CPP_DECL(rethrow_exception, CallFrame* callFrame, IPIntLocal* pl, unsigned tryDepth) { SlowPathFrameTracer tracer(instance->vm(), callFrame); @@ -462,11 +462,11 @@ auto throwScope = DECLARE_THROW_SCOPE(vm); Wasm::IPIntCallee* callee = IPINT_CALLEE(callFrame); - RELEASE_ASSERT(tryDepth <= callee->rethrowSlots()); + auto& slot = rethrowSlotForDepth(pl, callee, tryDepth); #if CPU(ADDRESS64) - JSWebAssemblyException* exception = std::bit_cast(pl[callee->localSizeToAlloc() + tryDepth - 1].i64); + JSWebAssemblyException* exception = std::bit_cast(slot.i64); #else - JSWebAssemblyException* exception = std::bit_cast(pl[callee->localSizeToAlloc() + tryDepth - 1].i32); + JSWebAssemblyException* exception = std::bit_cast(slot.i32); #endif RELEASE_ASSERT(exception); throwException(globalObject, throwScope, exception); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmIPIntSlowPaths.h webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmIPIntSlowPaths.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmIPIntSlowPaths.h 2026-02-23 14:40:52.509316700 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmIPIntSlowPaths.h 2026-07-09 07:12:41.816802500 +0000 @@ -78,7 +78,7 @@ WASM_IPINT_EXTERN_CPP_HIDDEN_DECL(retrieve_clear_and_push_exception, CallFrame*, IPIntStackEntry* stack, IPIntLocal* pl); WASM_IPINT_EXTERN_CPP_HIDDEN_DECL(retrieve_clear_and_push_exception_and_arguments, CallFrame*, IPIntStackEntry* stack, IPIntLocal* pl); WASM_IPINT_EXTERN_CPP_HIDDEN_DECL(throw_exception, CallFrame*, IPIntStackEntry* arguments, unsigned exceptionIndex); -WASM_IPINT_EXTERN_CPP_HIDDEN_DECL(rethrow_exception, CallFrame*, IPIntStackEntry* pl, unsigned tryDepth); +WASM_IPINT_EXTERN_CPP_HIDDEN_DECL(rethrow_exception, CallFrame*, IPIntLocal* pl, unsigned tryDepth); WASM_IPINT_EXTERN_CPP_HIDDEN_DECL(throw_ref, CallFrame* callFrame, EncodedJSValue exnref); WASM_IPINT_EXTERN_CPP_HIDDEN_DECL(ref_func, unsigned index); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmMemory.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmMemory.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmMemory.cpp 2026-02-23 14:40:52.510316600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmMemory.cpp 2026-07-09 07:12:41.816802500 +0000 @@ -210,7 +210,7 @@ switch (sharingMode) { case MemorySharingMode::Default: { if (!initialBytes) - return adoptRef(new Memory(initial, maximum, MemorySharingMode::Default, WTF::move(growSuccessCallback))); + return adoptRef(*new Memory(initial, maximum, MemorySharingMode::Default, WTF::move(growSuccessCallback))); void* slowMemory = Gigacage::tryAllocateZeroedVirtualPages(Gigacage::Primitive, initialBytes); if (!slowMemory) { @@ -258,6 +258,7 @@ PageCount oldPageCount; PageCount newPageCount; Expected result; + { std::optional> locker; // m_shared may not be exist, if this is zero byte memory with zero byte maximum size. diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmMemory.h webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmMemory.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmMemory.h 2026-02-23 14:40:52.510316600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmMemory.h 2026-07-09 07:12:41.816802500 +0000 @@ -37,10 +37,9 @@ #include #include #include -#include +#include #include #include -#include #include namespace WTF { @@ -53,7 +52,7 @@ namespace Wasm { -class Memory final : public RefCountedAndCanMakeWeakPtr { +class Memory final : public RefCounted { WTF_MAKE_NONCOPYABLE(Memory); WTF_MAKE_TZONE_ALLOCATED_EXPORT(Memory, JS_EXPORT_PRIVATE); friend LLIntOffsetsExtractor; @@ -94,8 +93,6 @@ void registerInstance(JSWebAssemblyInstance&); - void checkLifetime() { ASSERT(!refCountDebugger().deletionHasBegun()); } - static constexpr ptrdiff_t offsetOfHandle() { return OBJECT_OFFSETOF(Memory, m_handle); } SharedArrayBufferContents* shared() const { return m_shared.get(); } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmModuleInformation.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmModuleInformation.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmModuleInformation.cpp 2026-02-23 14:40:52.511316500 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmModuleInformation.cpp 2026-07-09 07:12:41.816802500 +0000 @@ -36,14 +36,30 @@ namespace JSC { namespace Wasm { ModuleInformation::ModuleInformation() - : nameSection(NameSection::create()) + : m_nameSection(NameSection::create()) { + m_nameSectionPtr.store(m_nameSection.ptr(), std::memory_order_relaxed); if (Options::enableWasmDebugger()) [[unlikely]] debugInfo = WTF::makeUnique(*this); } ModuleInformation::~ModuleInformation() = default; +void ModuleInformation::setNameSection(Ref&& section) +{ + // The spec has the following editorial note: + // The name section should appear only once in a module, [...] + // + // Since custom sections have no effect on the observable behavior, for simplicity, we ignore + // name sections after the first one if multiple such sections are present in a module. + if (m_hasCustomNameSection) + return; + m_hasCustomNameSection = true; + m_retiredNameSection = WTF::move(m_nameSection); + m_nameSection = WTF::move(section); + m_nameSectionPtr.store(m_nameSection.ptr(), std::memory_order_release); +} + // This is called during module creation, so at this point we have fully isolated access // to this ModuleInformation object. void ModuleInformation::applyCompileOptions(const WebAssemblyCompileOptions& options) diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmModuleInformation.h webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmModuleInformation.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmModuleInformation.h 2026-03-25 16:38:32.898259600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmModuleInformation.h 2026-07-09 07:12:41.816802500 +0000 @@ -182,6 +182,11 @@ bool importedStringConstantsEquals(const String& expected) const { return m_importedStringConstants && m_importedStringConstants.value() == expected; } bool builtinSetsInclude(const String& qualifiedName) const { return m_qualifiedBuiltinSetNames.contains(qualifiedName); } + // nameSection is read from compiler threads (lock-free via atomic pointer) + // and written from the main thread when the custom "name" section is parsed. + NameSection& nameSection() const { return *m_nameSectionPtr.load(std::memory_order_acquire); } + void setNameSection(Ref&&); + // FIXME: These should probably be FixedVectors. Vector imports; FixedBitVector importShouldBeHidden; // filter imports[i] from the result of Module.imports(moduleObject) @@ -208,7 +213,6 @@ unsigned firstInternalGlobal { 0 }; uint32_t codeSectionSize { 0 }; Vector customSections; - Ref nameSection; BranchHints branchHints; std::optional numberOfDataSegments; Vector> rtts; @@ -229,6 +233,10 @@ std::optional m_importedStringConstants; Vector m_qualifiedBuiltinSetNames; + Ref m_nameSection; + RefPtr m_retiredNameSection; + std::atomic m_nameSectionPtr { nullptr }; + bool m_hasCustomNameSection { false }; }; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmOMGIRGenerator.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmOMGIRGenerator.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmOMGIRGenerator.cpp 2026-03-03 21:30:17.027498500 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmOMGIRGenerator.cpp 2026-07-09 07:12:41.816802500 +0000 @@ -6801,7 +6801,7 @@ ionGraphFunction = JSON::Object::create(); auto passes = JSON::Array::create(); ionGraphPasses = passes.get(); - ionGraphFunction->setString("name"_s, makeString(IndexOrName(functionIndexSpace, info.nameSection->get(functionIndexSpace)))); + ionGraphFunction->setString("name"_s, makeString(IndexOrName(functionIndexSpace, info.nameSection().get(functionIndexSpace)))); ionGraphFunction->setArray("passes"_s, WTF::move(passes)); } auto result = makeUnique(); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmOMGPlan.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmOMGPlan.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmOMGPlan.cpp 2026-02-23 14:40:52.513316600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmOMGPlan.cpp 2026-07-09 07:12:41.816802500 +0000 @@ -77,7 +77,7 @@ void OMGPlan::dumpDisassembly(CompilationContext& context, LinkBuffer& linkBuffer, const TypeDefinition& signature, FunctionSpaceIndex functionIndexSpace) { - dataLogLnIf(context.procedure->shouldDumpIR() || shouldDumpDisassemblyFor(CompilationMode::OMGMode), "Generated OMG functionIndexSpace:(", functionIndexSpace, "),sig:(", signature.toString().ascii().data(), "),name:(", makeString(IndexOrName(functionIndexSpace, m_moduleInformation->nameSection->get(functionIndexSpace))).ascii().data(), "),wasmSize:(", m_moduleInformation->functionWasmSizeImportSpace(functionIndexSpace), ")"); + dataLogLnIf(context.procedure->shouldDumpIR() || shouldDumpDisassemblyFor(CompilationMode::OMGMode), "Generated OMG functionIndexSpace:(", functionIndexSpace, "),sig:(", signature.toString().ascii().data(), "),name:(", makeString(IndexOrName(functionIndexSpace, m_moduleInformation->nameSection().get(functionIndexSpace))).ascii().data(), "),wasmSize:(", m_moduleInformation->functionWasmSizeImportSpace(functionIndexSpace), ")"); if (shouldDumpDisassemblyFor(CompilationMode::OMGMode)) [[unlikely]] { ScopedPrintStream out; UncheckedKeyHashSet printedValues; @@ -131,7 +131,7 @@ const TypeDefinition& signature = TypeInformation::get(typeIndex).expand(); Ref profiledCallee = m_calleeGroup->ipintCalleeFromFunctionIndexSpace(functionIndexSpace); - Ref callee = OMGCallee::create(functionIndexSpace, m_moduleInformation->nameSection->get(functionIndexSpace)); + Ref callee = OMGCallee::create(functionIndexSpace, m_moduleInformation->nameSection().get(functionIndexSpace)); beginCompilerSignpost(callee.get()); Vector unlinkedCalls; @@ -162,7 +162,7 @@ ScopedPrintStream out; dumpDisassembly(context, linkBuffer, signature, functionIndexSpace); omgEntrypoint.compilation = makeUnique( - FINALIZE_CODE_IF(context.procedure->shouldDumpIR(), linkBuffer, JITCompilationPtrTag, nullptr, "OMG functionIndexSpace:(", functionIndexSpace, "),sig:(", signature.toString().ascii().data(), "),name:(", makeString(IndexOrName(functionIndexSpace, m_moduleInformation->nameSection->get(functionIndexSpace))).ascii().data(), "),wasmSize:(", m_moduleInformation->functionWasmSizeImportSpace(functionIndexSpace), ")"), + FINALIZE_CODE_IF(context.procedure->shouldDumpIR(), linkBuffer, JITCompilationPtrTag, nullptr, "OMG functionIndexSpace:(", functionIndexSpace, "),sig:(", signature.toString().ascii().data(), "),name:(", makeString(IndexOrName(functionIndexSpace, m_moduleInformation->nameSection().get(functionIndexSpace))).ascii().data(), "),wasmSize:(", m_moduleInformation->functionWasmSizeImportSpace(functionIndexSpace), ")"), WTF::move(context.wasmEntrypointByproducts)); } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmOSREntryPlan.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmOSREntryPlan.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmOSREntryPlan.cpp 2026-02-23 14:40:52.514316600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmOSREntryPlan.cpp 2026-07-09 07:12:41.816802500 +0000 @@ -68,7 +68,7 @@ void OSREntryPlan::dumpDisassembly(CompilationContext& context, LinkBuffer& linkBuffer, const TypeDefinition& signature, FunctionSpaceIndex functionIndexSpace) { CompilationMode targetCompilationMode = CompilationMode::OMGForOSREntryMode; - dataLogLnIf(context.procedure->shouldDumpIR() || shouldDumpDisassemblyFor(targetCompilationMode), "Generated OMGforOSREntry functionIndexSpace:(", functionIndexSpace, "),sig:(", signature.toString().ascii().data(), "),name:(", makeString(IndexOrName(functionIndexSpace, m_moduleInformation->nameSection->get(functionIndexSpace))).ascii().data(), "),wasmSize:(", m_moduleInformation->functionWasmSizeImportSpace(functionIndexSpace), ")"); + dataLogLnIf(context.procedure->shouldDumpIR() || shouldDumpDisassemblyFor(targetCompilationMode), "Generated OMGforOSREntry functionIndexSpace:(", functionIndexSpace, "),sig:(", signature.toString().ascii().data(), "),name:(", makeString(IndexOrName(functionIndexSpace, m_moduleInformation->nameSection().get(functionIndexSpace))).ascii().data(), "),wasmSize:(", m_moduleInformation->functionWasmSizeImportSpace(functionIndexSpace), ")"); if (shouldDumpDisassemblyFor(targetCompilationMode)) [[unlikely]] { auto* disassembler = context.procedure->code().disassembler(); @@ -106,7 +106,7 @@ const TypeDefinition& signature = TypeInformation::get(typeIndex).expand(); Ref profiledCallee = m_calleeGroup->ipintCalleeFromFunctionIndexSpace(functionIndexSpace); - Ref callee = OMGOSREntryCallee::create(functionIndexSpace, m_moduleInformation->nameSection->get(functionIndexSpace), m_loopIndex); + Ref callee = OMGOSREntryCallee::create(functionIndexSpace, m_moduleInformation->nameSection().get(functionIndexSpace), m_loopIndex); beginCompilerSignpost(callee.get()); Vector unlinkedCalls; @@ -136,7 +136,7 @@ dumpDisassembly(context, linkBuffer, signature, functionIndexSpace); omgEntrypoint.compilation = makeUnique( - FINALIZE_CODE_IF(context.procedure->shouldDumpIR(), linkBuffer, JITCompilationPtrTag, nullptr, "WebAssembly OMGForOSREntry function[%i] %s name %s", m_functionIndex, signature.toString().ascii().data(), makeString(IndexOrName(functionIndexSpace, m_moduleInformation->nameSection->get(functionIndexSpace))).ascii().data()), + FINALIZE_CODE_IF(context.procedure->shouldDumpIR(), linkBuffer, JITCompilationPtrTag, nullptr, "WebAssembly OMGForOSREntry function[%i] %s name %s", m_functionIndex, signature.toString().ascii().data(), makeString(IndexOrName(functionIndexSpace, m_moduleInformation->nameSection().get(functionIndexSpace))).ascii().data()), WTF::move(context.wasmEntrypointByproducts)); omgEntrypoint.calleeSaveRegisters = WTF::move(internalFunction->entrypoint.calleeSaveRegisters); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmPlan.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmPlan.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmPlan.cpp 2026-02-23 14:40:52.515316700 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmPlan.cpp 2026-07-09 07:12:41.816802500 +0000 @@ -134,7 +134,7 @@ CString signpostMessage; const FunctionData& function = m_moduleInformation->functions[functionIndexSpace - m_moduleInformation->importFunctionTypeIndices.size()]; StringPrintStream stream; - stream.print(compilationMode, " ", makeString(IndexOrName(functionIndexSpace, m_moduleInformation->nameSection->get(functionIndexSpace))), " instructions size = ", function.data.size()); + stream.print(compilationMode, " ", makeString(IndexOrName(functionIndexSpace, m_moduleInformation->nameSection().get(functionIndexSpace))), " instructions size = ", function.data.size()); return stream.toCString(); } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmSectionParser.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmSectionParser.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmSectionParser.cpp 2026-03-25 16:38:32.899259600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmSectionParser.cpp 2026-07-09 07:12:41.820802200 +0000 @@ -1404,7 +1404,7 @@ NameSectionParser nameSectionParser(section.payload, m_info); auto nameSection = nameSectionParser.parse(); if (nameSection) - m_info->nameSection = WTF::move(*nameSection); + m_info->setNameSection(WTF::move(*nameSection)); else dataLogLnIf(Options::dumpWasmWarnings(), "Could not parse name section: ", nameSection.error()); } else if (WTF::Unicode::equal("metadata.code.branch_hint"_span8, section.name.span())) { diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmStreamingCompiler.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmStreamingCompiler.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmStreamingCompiler.cpp 2026-02-23 14:40:52.516316700 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmStreamingCompiler.cpp 2026-07-09 07:12:41.820802200 +0000 @@ -26,7 +26,6 @@ #include "config.h" #include "WasmStreamingCompiler.h" -#include "DeferredWorkTimerInlines.h" #include "JSBigInt.h" #include "JSWebAssembly.h" #include "JSWebAssemblyCompileError.h" @@ -54,17 +53,19 @@ if (importObject) dependencies.append(importObject); m_ticket = vm.deferredWorkTimer->addPendingWork(DeferredWorkTimer::WorkType::AtSomePoint, vm, promise, WTF::move(dependencies)); - ASSERT(vm.deferredWorkTimer->hasPendingWork(m_ticket)); - ASSERT(vm.deferredWorkTimer->hasDependencyInPendingWork(m_ticket, globalObject)); - ASSERT(!importObject || vm.deferredWorkTimer->hasDependencyInPendingWork(m_ticket, importObject)); +#if ASSERT_ENABLED + RefPtr ticket = m_ticket.get(); + ASSERT(ticket); + ASSERT(vm.deferredWorkTimer->hasPendingWork(*ticket)); + ASSERT(vm.deferredWorkTimer->hasDependencyInPendingWork(*ticket, globalObject)); + ASSERT(!importObject || vm.deferredWorkTimer->hasDependencyInPendingWork(*ticket, importObject)); +#endif } StreamingCompiler::~StreamingCompiler() { - if (m_ticket) { - auto ticket = std::exchange(m_ticket, nullptr); - m_vm.deferredWorkTimer->scheduleWorkSoon(ticket, [](DeferredWorkTimer::Ticket) { }); - } + m_vm.deferredWorkTimer->scheduleWorkSoonIfActive(m_ticket, [](DeferredWorkTimer::Ticket&) { }); + m_ticket = nullptr; } Ref StreamingCompiler::create(VM& vm, CompilerMode compilerMode, JSGlobalObject* globalObject, JSPromise* promise, JSObject* importObject, const SourceCode& source) @@ -140,12 +141,11 @@ }; auto result = makeValidationResult(*m_plan); - auto ticket = std::exchange(m_ticket, nullptr); switch (m_compilerMode) { case CompilerMode::Validation: { - m_vm.deferredWorkTimer->scheduleWorkSoon(ticket, [result = WTF::move(result)](DeferredWorkTimer::Ticket ticket) mutable { - JSPromise* promise = jsCast(ticket->target()); - JSGlobalObject* globalObject = jsCast(ticket->dependencies()[0]); + m_vm.deferredWorkTimer->scheduleWorkSoonIfActive(m_ticket, [result = WTF::move(result)](DeferredWorkTimer::Ticket& ticket) mutable { + JSPromise* promise = jsCast(ticket.target()); + JSGlobalObject* globalObject = jsCast(ticket.dependencies()[0]); VM& vm = globalObject->vm(); auto scope = DECLARE_THROW_SCOPE(vm); @@ -160,15 +160,16 @@ scope.release(); promise->resolve(globalObject, module); }); + m_ticket = nullptr; return; } case CompilerMode::FullCompile: { RefPtr provider = m_source.provider(); - m_vm.deferredWorkTimer->scheduleWorkSoon(ticket, [result = WTF::move(result), provider = WTF::move(provider)](DeferredWorkTimer::Ticket ticket) mutable { - JSPromise* promise = jsCast(ticket->target()); - JSGlobalObject* globalObject = jsCast(ticket->dependencies()[0]); - JSObject* importObject = jsCast(ticket->dependencies()[1]); + m_vm.deferredWorkTimer->scheduleWorkSoonIfActive(m_ticket, [result = WTF::move(result), provider = WTF::move(provider)](DeferredWorkTimer::Ticket& ticket) mutable { + JSPromise* promise = jsCast(ticket.target()); + JSGlobalObject* globalObject = jsCast(ticket.dependencies()[0]); + JSObject* importObject = jsCast(ticket.dependencies()[1]); VM& vm = globalObject->vm(); auto scope = DECLARE_THROW_SCOPE(vm); @@ -185,6 +186,7 @@ return; } }); + m_ticket = nullptr; return; } } @@ -213,14 +215,15 @@ return; m_eagerFailed = true; } - auto ticket = std::exchange(m_ticket, nullptr); + auto ticket = takeTicketIfActive(); + if (!ticket) + return; JSPromise* promise = jsCast(ticket->target()); - // The pending work TicketData was keeping the promise alive. We need to + // The pending work Ticket was keeping the promise alive. We need to // make sure it is reachable from the stack before we remove it from the - // pending work list. Note: m_ticket stores it as a PackedPtr, which is not - // scannable by the GC. + // pending work list. WTF::compilerFence(); - m_vm.deferredWorkTimer->cancelPendingWork(ticket); + m_vm.deferredWorkTimer->cancelPendingWork(*ticket); promise->reject(m_vm, globalObject, error); } @@ -233,8 +236,27 @@ return; m_eagerFailed = true; } - auto ticket = std::exchange(m_ticket, nullptr); - m_vm.deferredWorkTimer->cancelPendingWork(ticket); + auto ticket = takeTicketIfActive(); + if (!ticket) + return; + m_vm.deferredWorkTimer->cancelPendingWork(*ticket); +} + +RefPtr StreamingCompiler::takeTicketIfActive() +{ + auto ticket = m_ticket.get(); + m_ticket = nullptr; + if (!ticket || ticket->isCancelled()) + return nullptr; + return ticket; +} + +JSGlobalObject* StreamingCompiler::globalObjectIfActive() +{ + auto ticket = m_ticket.get(); + if (!ticket || ticket->isCancelled()) + return nullptr; + return jsCast(ticket->dependencies()[0]); } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmStreamingCompiler.h webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmStreamingCompiler.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmStreamingCompiler.h 2026-02-23 14:40:52.516316700 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmStreamingCompiler.h 2026-07-09 07:12:41.820802200 +0000 @@ -59,6 +59,8 @@ void didCompileFunction(StreamingPlan&); + JS_EXPORT_PRIVATE JSGlobalObject* globalObjectIfActive(); + private: JS_EXPORT_PRIVATE StreamingCompiler(VM&, CompilerMode, JSGlobalObject*, JSPromise*, JSObject*, const SourceCode&); @@ -66,6 +68,7 @@ void didFinishParsing() final; void didComplete() WTF_REQUIRES_LOCK(m_lock); void completeIfNecessary() WTF_REQUIRES_LOCK(m_lock); + RefPtr takeTicketIfActive(); VM& m_vm; CompilerMode m_compilerMode; @@ -74,7 +77,7 @@ bool m_threadedCompilationStarted { false }; Lock m_lock; unsigned m_remainingCompilationRequests { 0 }; - DeferredWorkTimer::Ticket m_ticket; + ThreadSafeWeakPtr m_ticket; const Ref m_info; StreamingParser m_parser; RefPtr m_plan; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmStreamingParser.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmStreamingParser.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmStreamingParser.cpp 2026-02-23 14:40:52.517316600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmStreamingParser.cpp 2026-07-09 07:12:41.820802200 +0000 @@ -454,7 +454,7 @@ if (m_remaining.isEmpty()) { if (Options::useEagerWasmModuleHashing()) [[unlikely]] - m_info->nameSection->setHash(m_hasher.computeHexDigest()); + m_info->nameSection().setHash(m_hasher.computeHexDigest()); m_info->importShouldBeHidden = FixedBitVector(m_info->imports.size()); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmTable.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmTable.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmTable.cpp 2026-02-23 14:40:52.517316600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmTable.cpp 2026-07-09 07:12:41.820802200 +0000 @@ -86,10 +86,11 @@ : m_maximum(maximum) , m_type(type) , m_wasmType(wasmType) - , m_wasmTypeDefinition(TypeInformation::getRef(wasmType.index)) , m_isFixedSized(maximum && maximum.value() == initial) , m_owner(nullptr) { + if (auto typeDefinition = TypeInformation::getRef(wasmType.index)) + m_typeDependencies.emplace(Ref { *typeDefinition }); setLength(initial); ASSERT(!m_maximum || *m_maximum >= m_length); } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmTable.h webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmTable.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmTable.h 2026-02-23 14:40:52.517316600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmTable.h 2026-07-09 07:12:41.820802200 +0000 @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -106,8 +107,9 @@ NO_UNIQUE_ADDRESS const std::optional m_maximum; const TableElementType m_type; Type m_wasmType; - // If m_wasmType came from a TypeDefinition, the following retains the definition to prevent a dangling m_wasmType. - RefPtr m_wasmTypeDefinition; + // If m_wasmType came from a TypeDefinition, the following retains the definition + // and all transitively reachable types to prevent dangling TypeIndex values. + std::optional m_typeDependencies; bool m_isFixedSized { false }; JSWebAssemblyTable* m_owner; }; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmTypeDefinition.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmTypeDefinition.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/WasmTypeDefinition.cpp 2026-03-25 16:38:32.900259500 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/WasmTypeDefinition.cpp 2026-07-09 07:12:41.820802200 +0000 @@ -1227,16 +1227,15 @@ WebAssemblyGCTypeDependencies::WebAssemblyGCTypeDependencies(const Ref& unexpandedType) { WorkList work; - SUPPRESS_UNCHECKED_ARG work.append(unexpandedType->expand()); + SUPPRESS_UNCHECKED_ARG work.append(unexpandedType.get()); while (!work.isEmpty()) SUPPRESS_UNCHECKED_ARG process(work.takeLast(), work); - m_typeDefinitions.add(typeHash(unexpandedType)); } inline static void appendToWorkIfNeeded(Type type, WebAssemblyGCTypeDependencies::WorkList& work) { if (isRefWithTypeIndex(type)) { - SUPPRESS_UNCHECKED_LOCAL const auto& referencedType = TypeInformation::get(type.index).expand(); + SUPPRESS_UNCHECKED_LOCAL const auto& referencedType = TypeInformation::get(type.index); work.append(referencedType); } } @@ -1247,14 +1246,21 @@ return; m_typeDefinitions.add(typeHash(typeDef)); - if (typeDef.is()) { - SUPPRESS_UNCHECKED_LOCAL auto* structType = typeDef.as(); + SUPPRESS_UNCHECKED_LOCAL const auto& expanded = typeDef.expand(); + if (&expanded != &typeDef) { + if (m_typeDefinitions.contains(typeHash(expanded))) + return; + m_typeDefinitions.add(typeHash(expanded)); + } + + if (expanded.is()) { + SUPPRESS_UNCHECKED_LOCAL auto* structType = expanded.as(); for (unsigned i = 0; i < structType->fieldCount(); ++i) process(structType->field(i), work); - } else if (typeDef.is()) { - process(typeDef.as()->elementType(), work); - } else if (typeDef.is()) { - SUPPRESS_UNCHECKED_LOCAL auto* signature = typeDef.as(); + } else if (expanded.is()) { + process(expanded.as()->elementType(), work); + } else if (expanded.is()) { + SUPPRESS_UNCHECKED_LOCAL auto* signature = expanded.as(); for (unsigned i = 0; i < signature->argumentCount(); ++i) appendToWorkIfNeeded(signature->argumentType(i), work); for (unsigned i = 0; i < signature->returnCount(); ++i) diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/debugger/WasmDebugServer.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/debugger/WasmDebugServer.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/debugger/WasmDebugServer.cpp 2026-02-23 14:40:52.520387000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/debugger/WasmDebugServer.cpp 2026-07-09 07:12:41.820802200 +0000 @@ -533,6 +533,14 @@ } } +void DebugServer::untrackInstance(JSWebAssemblyInstance* instance) +{ + if (!m_moduleManager) + return; + dataLogLnIf(Options::verboseWasmDebugger(), "[Debugger] Untracking WebAssembly instance: ", RawPointer(instance)); + m_moduleManager->unregisterInstance(instance); +} + void DebugServer::trackModule(Module& module) { if (!m_moduleManager) diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/debugger/WasmDebugServer.h webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/debugger/WasmDebugServer.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/debugger/WasmDebugServer.h 2026-02-23 14:40:52.520387000 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/debugger/WasmDebugServer.h 2026-07-09 07:12:41.820802200 +0000 @@ -111,6 +111,7 @@ #endif void trackInstance(JSWebAssemblyInstance*); + void untrackInstance(JSWebAssemblyInstance*); void trackModule(Module&); void untrackModule(Module&); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/debugger/WasmModuleManager.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/debugger/WasmModuleManager.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/debugger/WasmModuleManager.cpp 2026-02-23 14:40:52.521316500 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/debugger/WasmModuleManager.cpp 2026-07-09 07:12:41.820802200 +0000 @@ -88,6 +88,15 @@ return instanceId; } +uint32_t ModuleManager::unregisterInstance(JSWebAssemblyInstance* jsInstance) +{ + Locker locker { m_lock }; + uint32_t instanceId = jsInstance->debugId(); + m_instanceIdToInstance.remove(instanceId); + dataLogLnIf(Options::verboseWasmDebugger(), "[ModuleManager][unregisterInstance] - unregistered instance with ID: ", instanceId, " for module ID: ", jsInstance->module().debugId()); + return instanceId; +} + Module* ModuleManager::module(uint32_t moduleId) const { Locker locker { m_lock }; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/debugger/WasmModuleManager.h webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/debugger/WasmModuleManager.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/debugger/WasmModuleManager.h 2026-02-23 14:40:52.521316500 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/debugger/WasmModuleManager.h 2026-07-09 07:12:41.820802200 +0000 @@ -60,6 +60,7 @@ Module* module(uint32_t moduleId) const; uint32_t registerInstance(JSWebAssemblyInstance*); + uint32_t unregisterInstance(JSWebAssemblyInstance*); JSWebAssemblyInstance* jsInstance(uint32_t instanceId); uint32_t nextInstanceId() const; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/js/JSWebAssembly.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/js/JSWebAssembly.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/js/JSWebAssembly.cpp 2026-02-23 14:40:52.524316500 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/js/JSWebAssembly.cpp 2026-07-09 07:12:41.820802200 +0000 @@ -171,9 +171,11 @@ Vector dependencies; dependencies.append(globalObject); - auto ticket = vm.deferredWorkTimer->addPendingWork(DeferredWorkTimer::WorkType::ImminentlyScheduled, vm, promise, WTF::move(dependencies)); - Wasm::Module::validateAsync(vm, WTF::move(source), createSharedTask([ticket, promise, globalObject, compileOptions = WTF::move(compileOptions), &vm] (Wasm::Module::ValidationResult&& result) mutable { - vm.deferredWorkTimer->scheduleWorkSoon(ticket, [promise, globalObject, result = WTF::move(result), compileOptions = WTF::move(compileOptions), &vm](DeferredWorkTimer::Ticket) mutable { + auto weakTicket = vm.deferredWorkTimer->addPendingWork(DeferredWorkTimer::WorkType::ImminentlyScheduled, vm, promise, WTF::move(dependencies)); + Wasm::Module::validateAsync(vm, WTF::move(source), createSharedTask([weakTicket = WTF::move(weakTicket), compileOptions = WTF::move(compileOptions), &vm] (Wasm::Module::ValidationResult&& result) mutable { + vm.deferredWorkTimer->scheduleWorkSoonIfActive(weakTicket, [result = WTF::move(result), compileOptions = WTF::move(compileOptions), &vm](DeferredWorkTimer::Ticket& ticket) mutable { + auto* promise = jsCast(ticket.target()); + auto* globalObject = jsCast(ticket.dependencies()[0]); auto scope = DECLARE_THROW_SCOPE(vm); if (!result.has_value()) [[unlikely]] { @@ -222,10 +224,12 @@ dependencies.append(promise); scope.release(); - auto ticket = vm.deferredWorkTimer->addPendingWork(DeferredWorkTimer::WorkType::ImminentlyScheduled, vm, instance, WTF::move(dependencies)); + auto weakTicket = vm.deferredWorkTimer->addPendingWork(DeferredWorkTimer::WorkType::ImminentlyScheduled, vm, instance, WTF::move(dependencies)); // Note: This completion task may or may not get called immediately. - module->module().compileAsync(vm, instance->memoryMode(), createSharedTask([ticket, promise, instance, module, resolveKind, creationMode, &vm, alwaysAsync] (Ref&& calleeGroup, bool isAsync) mutable { - auto callback = [promise, instance, module, resolveKind, creationMode, &vm, calleeGroup = WTF::move(calleeGroup)](DeferredWorkTimer::Ticket) mutable { + module->module().compileAsync(vm, instance->memoryMode(), createSharedTask([weakTicket = WTF::move(weakTicket), module, resolveKind, creationMode, &vm, alwaysAsync] (Ref&& calleeGroup, bool isAsync) mutable { + auto callback = [module, resolveKind, creationMode, &vm, calleeGroup = WTF::move(calleeGroup)](DeferredWorkTimer::Ticket& ticket) mutable { + auto* instance = jsCast(ticket.target()); + auto* promise = jsCast(ticket.dependencies()[0]); auto scope = DECLARE_THROW_SCOPE(vm); JSGlobalObject* globalObject = instance->globalObject(); instance->finalizeCreation(vm, globalObject, WTF::move(calleeGroup), creationMode); @@ -258,11 +262,16 @@ }; if (alwaysAsync || isAsync) { - vm.deferredWorkTimer->scheduleWorkSoon(ticket, WTF::move(callback)); + vm.deferredWorkTimer->scheduleWorkSoonIfActive(weakTicket, WTF::move(callback)); return; } - vm.deferredWorkTimer->cancelPendingWork(ticket); - callback(ticket); + // Sync path: the callback recovers target/dependencies from the ticket, so it must run + // while the ticket is still active. Cancel afterwards so doWork's sweep removes it. + RefPtr ticket = weakTicket.get(); + if (!ticket || ticket->isCancelled()) + return; + callback(*ticket); + vm.deferredWorkTimer->cancelPendingWork(*ticket); })); } @@ -281,9 +290,13 @@ if (importObject) dependencies.append(importObject); dependencies.append(moduleKeyCell); - auto ticket = vm.deferredWorkTimer->addPendingWork(DeferredWorkTimer::WorkType::ImminentlyScheduled, vm, promise, WTF::move(dependencies)); - Wasm::Module::validateAsync(vm, WTF::move(source), createSharedTask([ticket, promise, importObject, sourceProvider = WTF::move(sourceProvider), compileOptions = WTF::move(compileOptions), moduleKeyCell, globalObject, resolveKind, creationMode, &vm] (Wasm::Module::ValidationResult&& result) mutable { - vm.deferredWorkTimer->scheduleWorkSoon(ticket, [promise, importObject, sourceProvider = WTF::move(sourceProvider), compileOptions = WTF::move(compileOptions), moduleKeyCell, globalObject, result = WTF::move(result), resolveKind, creationMode, &vm](DeferredWorkTimer::Ticket) mutable { + auto weakTicket = vm.deferredWorkTimer->addPendingWork(DeferredWorkTimer::WorkType::ImminentlyScheduled, vm, promise, WTF::move(dependencies)); + Wasm::Module::validateAsync(vm, WTF::move(source), createSharedTask([weakTicket = WTF::move(weakTicket), importObject, sourceProvider = WTF::move(sourceProvider), compileOptions = WTF::move(compileOptions), resolveKind, creationMode, &vm] (Wasm::Module::ValidationResult&& result) mutable { + vm.deferredWorkTimer->scheduleWorkSoonIfActive(weakTicket, [importObject, sourceProvider = WTF::move(sourceProvider), compileOptions = WTF::move(compileOptions), result = WTF::move(result), resolveKind, creationMode, &vm](DeferredWorkTimer::Ticket& ticket) mutable { + auto* promise = jsCast(ticket.target()); + auto& deps = ticket.dependencies(); + JSCell* moduleKeyCell = deps[deps.size() - 2]; + auto* globalObject = promise->globalObject(); auto scope = DECLARE_THROW_SCOPE(vm); if (!result.has_value()) [[unlikely]] { diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp 2026-02-23 14:40:52.526316600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp 2026-07-09 07:12:41.820802200 +0000 @@ -162,6 +162,11 @@ JSWebAssemblyInstance::~JSWebAssemblyInstance() { + if (m_anchor) { + m_anchor->tearDown(); + m_anchor = nullptr; + } + m_vm->traps().unregisterMirror(m_stackMirror); clearJSCallICs(*m_vm); @@ -174,10 +179,8 @@ for (auto& slot : baselineDatas()) std::destroy_at(&slot); - if (m_anchor) { - m_anchor->tearDown(); - m_anchor = nullptr; - } + if (Options::enableWasmDebugger()) [[unlikely]] + Wasm::DebugServer::singleton().untrackInstance(this); } void JSWebAssemblyInstance::destroy(JSCell* cell) diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/js/JSWebAssemblyMemory.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/js/JSWebAssemblyMemory.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/js/JSWebAssemblyMemory.cpp 2026-02-23 14:40:52.526316600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/js/JSWebAssemblyMemory.cpp 2026-07-09 07:12:41.820802200 +0000 @@ -51,7 +51,6 @@ { m_memory.swap(memory); ASSERT(m_memory->refCount() == 1); - m_memory->checkLifetime(); } Structure* JSWebAssemblyMemory::createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) @@ -104,10 +103,10 @@ m_buffer->makeShared(); } m_buffer->makeWasmMemory(); - if (m_buffer->isResizableNonShared()) - m_buffer->setAssociatedWasmMemory(m_memory.ptr()); auto* arrayBuffer = JSArrayBuffer::create(vm, globalObject->arrayBufferStructure(m_buffer->sharingMode()), m_buffer.get()); + if (m_buffer->isResizableNonShared()) + arrayBuffer->setAssociatedWasmMemoryWrapper(vm, this); if (m_memory->sharingMode() == MemorySharingMode::Shared) { objectConstructorFreeze(globalObject, arrayBuffer); RETURN_IF_EXCEPTION(throwScope, void()); @@ -122,8 +121,9 @@ ASSERT(m_buffer); if (!m_buffer->isShared()) m_buffer->detach(vm); - m_buffer->setAssociatedWasmMemory(nullptr); m_buffer = nullptr; + if (auto* wrapper = m_bufferWrapper.get()) + wrapper->clearAssociatedWasmMemoryWrapper(); m_bufferWrapper.clear(); } @@ -298,9 +298,6 @@ } } - - memory().checkLifetime(); - vm.heap.reportExtraMemoryAllocated(this, newPageCount.bytes() - oldPageCount.bytes()); } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/js/WebAssemblyCompileOptions.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/js/WebAssemblyCompileOptions.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/js/WebAssemblyCompileOptions.cpp 2026-02-23 14:40:52.528316500 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/js/WebAssemblyCompileOptions.cpp 2026-07-09 07:12:41.824802200 +0000 @@ -48,6 +48,7 @@ RETURN_IF_EXCEPTION(scope, std::nullopt); if (importedStringConstantsValue.isString()) { auto importedStringConstants = asString(importedStringConstantsValue)->value(globalObject); + RETURN_IF_EXCEPTION(scope, std::nullopt); options.m_importedStringConstants = makeString(StringView(importedStringConstants)); } else if (!importedStringConstantsValue.isUndefined()) { auto error = createTypeError(globalObject, "importedStringConstants option value must be a string"_s); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/js/WebAssemblyMemoryConstructor.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/js/WebAssemblyMemoryConstructor.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/wasm/js/WebAssemblyMemoryConstructor.cpp 2026-01-20 14:08:32.677705300 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/wasm/js/WebAssemblyMemoryConstructor.cpp 2026-07-09 07:12:41.824802200 +0000 @@ -123,7 +123,9 @@ auto* jsMemory = JSWebAssemblyMemory::create(vm, webAssemblyMemoryStructure); RefPtr memory = Wasm::Memory::tryCreate(vm, initialPageCount, maximumPageCount, sharingMode, desiredMemoryMode, - [&vm, jsMemory] (Wasm::Memory::GrowSuccess, PageCount oldPageCount, PageCount newPageCount) { jsMemory->growSuccessCallback(vm, oldPageCount, newPageCount); }); + [&vm, jsMemory] (Wasm::Memory::GrowSuccess, PageCount oldPageCount, PageCount newPageCount) { + jsMemory->growSuccessCallback(vm, oldPageCount, newPageCount); + }); if (!memory) { throwException(globalObject, throwScope, createOutOfMemoryError(globalObject)); return { }; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/yarr/RegularExpression.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/RegularExpression.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/yarr/RegularExpression.cpp 2026-01-20 14:08:32.682705400 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/RegularExpression.cpp 2026-07-09 07:12:41.824802200 +0000 @@ -103,7 +103,7 @@ if (str.isNull()) return -1; - int offsetVectorSize = (d->m_numSubpatterns + 1) * 2; + int offsetVectorSize = d->m_regExpByteCode->m_offsetsSize; unsigned* offsetVector; Vector nonReturnedOvector; diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/yarr/YarrErrorCode.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrErrorCode.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/yarr/YarrErrorCode.cpp 2026-01-20 14:08:32.683811700 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrErrorCode.cpp 2026-07-09 07:12:41.824802200 +0000 @@ -72,6 +72,8 @@ REGEXP_ERROR_PREFIX "negated class set may contain strings"_s, // NegatedClassSetMayContainStrings REGEXP_ERROR_PREFIX "invalid class set character"_s, // InvalidClassSetCharacter REGEXP_ERROR_PREFIX "invalid regular expression modifier"_s, // InvalidRegularExpressionModifier + REGEXP_ERROR_PREFIX "too many captures"_s, // TooManyCaptures + REGEXP_ERROR_PREFIX "too many frame slots for state"_s, // FrameTooLarge // The following are NOT hard errors. REGEXP_ERROR_PREFIX "too many nested disjunctions"_s, // TooManyDisjunctions @@ -117,6 +119,8 @@ case ErrorCode::NegatedClassSetMayContainStrings: case ErrorCode::InvalidClassSetCharacter: case ErrorCode::InvalidRegularExpressionModifier: + case ErrorCode::TooManyCaptures: + case ErrorCode::FrameTooLarge: return createSyntaxError(globalObject, errorMessage(error)); case ErrorCode::TooManyDisjunctions: return createOutOfMemoryError(globalObject, errorMessage(error)); diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/yarr/YarrErrorCode.h webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrErrorCode.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/yarr/YarrErrorCode.h 2026-02-23 14:40:52.540316600 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrErrorCode.h 2026-07-09 07:12:41.824802200 +0000 @@ -77,6 +77,8 @@ NegatedClassSetMayContainStrings, InvalidClassSetCharacter, InvalidRegularExpressionModifier, + TooManyCaptures, + FrameTooLarge, // The following are NOT hard errors. TooManyDisjunctions, // we ran out stack compiling. diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/yarr/YarrJIT.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrJIT.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/yarr/YarrJIT.cpp 2026-03-03 21:30:17.033498500 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrJIT.cpp 2026-07-09 07:12:41.824802200 +0000 @@ -1120,9 +1120,9 @@ Checked characterOffset(-static_cast(negativeCharacterOffset)); if (m_charSize == CharSize::Char8) - return MacroAssembler::BaseIndex(m_regs.input, indexReg, MacroAssembler::TimesOne, characterOffset * static_cast(sizeof(char))); + return MacroAssembler::BaseIndex(base, indexReg, MacroAssembler::TimesOne, characterOffset * static_cast(sizeof(char))); - return MacroAssembler::BaseIndex(m_regs.input, indexReg, MacroAssembler::TimesTwo, characterOffset * static_cast(sizeof(char16_t))); + return MacroAssembler::BaseIndex(base, indexReg, MacroAssembler::TimesTwo, characterOffset * static_cast(sizeof(char16_t))); } #if ENABLE(YARR_JIT_UNICODE_EXPRESSIONS) @@ -1757,7 +1757,7 @@ else { // For reading Unicode characters, use the standard resultReg so we can call the standard tryReadUnicodeChar() // helper instead of emitting an inlined version. - readCharacter(op.m_checkedOffset - term->inputPosition, character, patternIndex); + readCharacter(0, character, patternIndex); m_jit.move(character, patternCharacter); } #else @@ -3800,7 +3800,7 @@ } ++opIndex; - } while (opIndex < m_ops.size()); + } while (opIndex < m_ops.size() && !hasExceededCodeSizeLimit()); termMatchTargets.takeLast(); } @@ -4476,7 +4476,18 @@ case YarrOpCode::MatchFailed: break; } - } while (opIndex); + } while (opIndex && !hasExceededCodeSizeLimit()); + } + + bool hasExceededCodeSizeLimit() + { + if (m_failureReason) + return true; + if (m_jit.m_assembler.buffer().codeSize() > Options::maximumRegExpJITCodeSize()) [[unlikely]] { + m_failureReason = JITFailureReason::GeneratedCodeSizeTooLarge; + return true; + } + return false; } // Compilation methods: @@ -5346,9 +5357,17 @@ generate(); if (m_disassembler) m_disassembler->setEndOfGenerate(m_jit.label()); + if (m_failureReason) { + codeBlock.setFallBackWithFailureReason(*m_failureReason); + return; + } backtrack(); if (m_disassembler) m_disassembler->setEndOfBacktrack(m_jit.label()); + if (m_failureReason) { + codeBlock.setFallBackWithFailureReason(*m_failureReason); + return; + } ptrdiff_t codeSize = MacroAssembler::differenceBetween(startOfMainCode, m_jit.label()); bool canInline = ([&] -> bool { @@ -5942,6 +5961,9 @@ case JITFailureReason::OffsetTooLarge: dataLog("Can't JIT because pattern exceeds string length limits\n"); break; + case JITFailureReason::GeneratedCodeSizeTooLarge: + dataLog("Can't JIT because generated code size exceeds limit\n"); + break; } } diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/yarr/YarrJIT.h webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrJIT.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/yarr/YarrJIT.h 2026-02-23 14:40:52.541316500 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrJIT.h 2026-07-09 07:12:41.824802200 +0000 @@ -67,6 +67,7 @@ ParenthesisNestedTooDeep, ExecutableMemoryAllocationFailure, OffsetTooLarge, + GeneratedCodeSizeTooLarge, }; class BoyerMooreFastCandidates { diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/yarr/YarrParser.h webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrParser.h --- webkit2gtk-2.52.3/Source/JavaScriptCore/yarr/YarrParser.h 2026-02-23 14:40:52.542316400 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrParser.h 2026-07-09 07:12:41.828802000 +0000 @@ -65,7 +65,6 @@ { checker.atomCharacterClassPushNested(bool { }) } -> std::same_as; { checker.atomCharacterClassPopNested(bool { }) } -> std::same_as; { checker.atomCharacterClassEnd() } -> std::same_as; - { checker.atomParenthesesSubpatternBegin() } -> std::same_as; { checker.atomParenthesesSubpatternBegin(bool { }) } -> std::same_as; { checker.atomParenthesesSubpatternBegin(bool { }, std::optional { }) } -> std::same_as; { checker.atomParentheticalAssertionBegin(bool { }, MatchDirection { }) } -> std::same_as; @@ -102,7 +101,7 @@ */ ErrorCode parse() { - if (m_size > MAX_PATTERN_SIZE) + if (m_size > maxPatternSize) return ErrorCode::PatternTooLarge; parseTokens(); @@ -859,6 +858,8 @@ Vector> m_strings; }; + enum class ParenthesesType : uint8_t { Subpattern, Assertion, LookbehindAssertion }; + // The handling of IdentityEscapes is different depending on which unicode flag if any is active. // For both Unicode and UnicodeSet patterns, IdentityEscapes only include SyntaxCharacters or '/'. // For UnicodeSet patterns when parsing ClassSet expressions and ClassStringDisjunctions, escapes include SyntaxCharacters, '/' @@ -1557,9 +1558,10 @@ } auto setAddResult = m_namedCaptureGroups.add(groupName.value()); - if (setAddResult.isNewEntry) + if (setAddResult.isNewEntry) { m_delegate.atomParenthesesSubpatternBegin(true, groupName); - else + countCaptures(); + } else m_errorCode = ErrorCode::DuplicateGroupName; } else { if (tryConsume('=')) { @@ -1643,8 +1645,10 @@ default: m_errorCode = ErrorCode::ParenthesesTypeInvalid; } - } else - m_delegate.atomParenthesesSubpatternBegin(); + } else { + m_delegate.atomParenthesesSubpatternBegin(true); + countCaptures(); + } if (type == ParenthesesType::Subpattern) ++m_numSubpatterns; @@ -2187,13 +2191,17 @@ return std::nullopt; } + void countCaptures() + { + if (++m_numCaptures > maxCapturesCount) + m_errorCode = ErrorCode::TooManyCaptures; + } + bool isLegacyCompilation() const { return m_compileMode == CompileMode::Legacy; } bool isUnicodeCompilation() const { return m_compileMode == CompileMode::Unicode; } bool isUnicodeSetsCompilation() const { return m_compileMode == CompileMode::UnicodeSets; } bool isEitherUnicodeCompilation() const { return isUnicodeCompilation() || isUnicodeSetsCompilation(); } - enum class ParenthesesType : uint8_t { Subpattern, Assertion, LookbehindAssertion }; - Delegate& m_delegate; ErrorCode m_errorCode { ErrorCode::NoError }; const CharType* m_data; @@ -2203,14 +2211,15 @@ unsigned m_backReferenceLimit; unsigned m_numSubpatterns { 0 }; unsigned m_maxSeenBackReference { 0 }; + unsigned m_numCaptures { 0 }; bool m_isNamedForwardReferenceAllowed; bool m_kIdentityEscapeSeen { false }; Vector m_parenthesesStack; NamedCaptureGroups m_namedCaptureGroups; UncheckedKeyHashSet m_forwardReferenceNames; - // Derived by empirical testing of compile time in PCRE and WREC. - static constexpr unsigned MAX_PATTERN_SIZE = 1024 * 1024; + static constexpr unsigned maxPatternSize = 1024 * 1024; // Derived by empirical testing of compile time in PCRE and WREC. + static constexpr unsigned maxCapturesCount = (1 << 16) / 2; // Derived from V8's configuration. }; /* diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/yarr/YarrPattern.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrPattern.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/yarr/YarrPattern.cpp 2026-03-03 21:30:17.034498500 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrPattern.cpp 2026-07-09 07:12:41.828802000 +0000 @@ -1116,6 +1116,123 @@ unsigned m_termIndex; const String m_namedGroup; }; + class ParenthesisContext { + private: + class SavedContext { + public: + SavedContext(bool isModifier, bool invert, MatchDirection matchDirection, OptionSet flags) + : m_isModifier(isModifier) + , m_invert(invert) + , m_matchDirection(matchDirection) + , m_flags(flags) + { + } + + void restore(bool& isModifier, bool& invert, MatchDirection& matchDirection, OptionSet& flags) + { + isModifier = m_isModifier; + invert = m_invert; + matchDirection = m_matchDirection; + flags = m_flags; + } + + private: + bool m_isModifier { false }; + bool m_invert { false }; + MatchDirection m_matchDirection { Forward }; + OptionSet m_flags; + }; + + public: + ParenthesisContext() + { + } + + void push() + { + ASSERT(m_stackDepth < std::numeric_limits::max()); + + if (m_stackDepth++ > 0) + m_backingStack.append(SavedContext(m_isModifier, m_invert, m_matchDirection, m_flags)); + + // isModifier should only apply to one frame at a time + m_isModifier = false; + } + + void pop() + { + ASSERT(m_stackDepth > 0); + + if (--m_stackDepth > 0) { + SavedContext context = m_backingStack.takeLast(); + context.restore(m_isModifier, m_invert, m_matchDirection, m_flags); + } else { + m_isModifier = false; + m_invert = false; + m_matchDirection = Forward; + m_flags = { }; + } + } + + void setModifier(bool isMod) + { + m_isModifier = isMod; + } + + bool isModifier() const + { + return m_isModifier; + } + + void setInvert(bool invert) + { + m_invert = invert; + } + + bool invert() const + { + return m_invert; + } + + void setMatchDirection(MatchDirection matchDirection) + { + m_matchDirection = matchDirection; + } + + MatchDirection matchDirection() const + { + return m_matchDirection; + } + + void setFlags(OptionSet flags) + { + m_flags = flags; + } + + OptionSet flags() const + { + return m_flags; + } + + void reset() + { + m_backingStack.clear(); + m_stackDepth = 0; + + m_isModifier = false; + m_invert = false; + m_matchDirection = Forward; + m_flags = { }; + } + + private: + Vector m_backingStack; + unsigned m_stackDepth { 0 }; + bool m_isModifier { false }; + bool m_invert { false }; + MatchDirection m_matchDirection { Forward }; + OptionSet m_flags; + }; public: YarrPatternConstructor(YarrPattern& pattern, OptionSet flags) @@ -1439,7 +1556,7 @@ m_pattern.m_userCharacterClasses.append(WTF::move(newCharacterClass)); } - void atomParenthesesSubpatternBegin(bool capture = true, std::optional optGroupName = std::nullopt) + void atomParenthesesSubpatternBegin(bool capture, std::optional optGroupName = std::nullopt) { unsigned subpatternId = m_pattern.m_numSubpatterns + 1; if (capture) { @@ -1768,7 +1885,7 @@ return m_error; } - [[nodiscard]] ErrorCode setupAlternativeOffsets(PatternAlternative* alternative, unsigned currentCallFrameSize, unsigned initialInputPosition, unsigned& newCallFrameSize) + [[nodiscard]] ErrorCode setupAlternativeOffsets(PatternAlternative* alternative, CheckedUint32 currentCallFrameSize, unsigned initialInputPosition, CheckedUint32& newCallFrameSize) { if (!isSafeToRecurse()) [[unlikely]] return ErrorCode::TooManyDisjunctions; @@ -1792,6 +1909,8 @@ term.inputPosition = currentInputPosition; term.frameLocation = currentCallFrameSize; currentCallFrameSize += YarrStackSpaceForBackTrackInfoBackReference; + if (currentCallFrameSize.hasOverflowed()) + return ErrorCode::FrameTooLarge; alternative->m_hasFixedSize = false; break; @@ -1804,6 +1923,8 @@ if (term.quantityType != QuantifierType::FixedCount) { term.frameLocation = currentCallFrameSize; currentCallFrameSize += YarrStackSpaceForBackTrackInfoPatternCharacter; + if (currentCallFrameSize.hasOverflowed()) + return ErrorCode::FrameTooLarge; alternative->m_hasFixedSize = false; } else if (m_pattern.eitherUnicode()) { CheckedUint32 tempCount = term.quantityMaxCount; @@ -1820,10 +1941,14 @@ if (term.quantityType != QuantifierType::FixedCount) { term.frameLocation = currentCallFrameSize; currentCallFrameSize += YarrStackSpaceForBackTrackInfoCharacterClass; + if (currentCallFrameSize.hasOverflowed()) + return ErrorCode::FrameTooLarge; alternative->m_hasFixedSize = false; } else if (m_pattern.eitherUnicode()) { term.frameLocation = currentCallFrameSize; currentCallFrameSize += YarrStackSpaceForBackTrackInfoCharacterClass; + if (currentCallFrameSize.hasOverflowed()) + return ErrorCode::FrameTooLarge; if (term.characterClass->hasOneCharacterSize() && !term.invert()) { CheckedUint32 tempCount = term.quantityMaxCount; tempCount *= term.characterClass->hasNonBMPCharacters() ? 2 : 1; @@ -1843,6 +1968,8 @@ term.frameLocation = currentCallFrameSize; if (term.quantityMaxCount == 1 && !term.parentheses.isCopy) { currentCallFrameSize += YarrStackSpaceForBackTrackInfoParenthesesOnce; + if (currentCallFrameSize.hasOverflowed()) + return ErrorCode::FrameTooLarge; error = setupDisjunctionOffsets(term.parentheses.disjunction, currentCallFrameSize, currentInputPosition, currentCallFrameSize); if (hasError(error)) return error; @@ -1852,6 +1979,8 @@ term.inputPosition = currentInputPosition; } else if (term.parentheses.isTerminal) { currentCallFrameSize += YarrStackSpaceForBackTrackInfoParenthesesTerminal; + if (currentCallFrameSize.hasOverflowed()) + return ErrorCode::FrameTooLarge; error = setupDisjunctionOffsets(term.parentheses.disjunction, currentCallFrameSize, currentInputPosition, currentCallFrameSize); if (hasError(error)) return error; @@ -1859,6 +1988,8 @@ } else { term.inputPosition = currentInputPosition; currentCallFrameSize += YarrStackSpaceForBackTrackInfoParentheses; + if (currentCallFrameSize.hasOverflowed()) + return ErrorCode::FrameTooLarge; error = setupDisjunctionOffsets(term.parentheses.disjunction, currentCallFrameSize, currentInputPosition, currentCallFrameSize); if (hasError(error)) return error; @@ -1871,7 +2002,10 @@ unsigned disjunctionInitialInputPosition = (term.matchDirection() == Forward) ? currentInputPosition.value() : 0; term.inputPosition = currentInputPosition; term.frameLocation = currentCallFrameSize; - error = setupDisjunctionOffsets(term.parentheses.disjunction, currentCallFrameSize + YarrStackSpaceForBackTrackInfoParentheticalAssertion, disjunctionInitialInputPosition, currentCallFrameSize); + currentCallFrameSize += YarrStackSpaceForBackTrackInfoParentheticalAssertion; + if (currentCallFrameSize.hasOverflowed()) + return ErrorCode::FrameTooLarge; + error = setupDisjunctionOffsets(term.parentheses.disjunction, currentCallFrameSize, disjunctionInitialInputPosition, currentCallFrameSize); if (hasError(error)) return error; break; @@ -1883,6 +2017,8 @@ term.inputPosition = initialInputPosition; m_pattern.m_initialStartValueFrameLocation = currentCallFrameSize; currentCallFrameSize += YarrStackSpaceForDotStarEnclosure; + if (currentCallFrameSize.hasOverflowed()) + return ErrorCode::FrameTooLarge; m_pattern.m_saveInitialStartValue = true; break; } @@ -1891,17 +2027,20 @@ } alternative->m_minimumSize = currentInputPosition - initialInputPosition; - newCallFrameSize = currentCallFrameSize; + newCallFrameSize = currentCallFrameSize.value(); return error; } - ErrorCode setupDisjunctionOffsets(PatternDisjunction* disjunction, unsigned initialCallFrameSize, unsigned initialInputPosition, unsigned& callFrameSize) + ErrorCode setupDisjunctionOffsets(PatternDisjunction* disjunction, CheckedUint32 initialCallFrameSize, unsigned initialInputPosition, CheckedUint32& callFrameSize) { if (!isSafeToRecurse()) [[unlikely]] return ErrorCode::TooManyDisjunctions; - if ((disjunction != m_pattern.m_body) && (disjunction->m_alternatives.size() > 1)) + if ((disjunction != m_pattern.m_body) && (disjunction->m_alternatives.size() > 1)) { initialCallFrameSize += YarrStackSpaceForBackTrackInfoAlternative; + if (initialCallFrameSize.hasOverflowed()) + return ErrorCode::FrameTooLarge; + } unsigned minimumInputSize = UINT_MAX; unsigned maximumCallFrameSize = 0; @@ -1910,17 +2049,17 @@ for (unsigned alt = 0; alt < disjunction->m_alternatives.size(); ++alt) { PatternAlternative* alternative = disjunction->m_alternatives[alt].get(); - unsigned currentAlternativeCallFrameSize; + CheckedUint32 currentAlternativeCallFrameSize; error = setupAlternativeOffsets(alternative, initialCallFrameSize, initialInputPosition, currentAlternativeCallFrameSize); if (hasError(error)) return error; minimumInputSize = std::min(minimumInputSize, alternative->m_minimumSize); - maximumCallFrameSize = std::max(maximumCallFrameSize, currentAlternativeCallFrameSize); + maximumCallFrameSize = std::max(maximumCallFrameSize, currentAlternativeCallFrameSize.value()); hasFixedSize &= alternative->m_hasFixedSize; if (alternative->m_minimumSize > INT_MAX) m_pattern.m_containsUnsignedLengthPattern = true; } - + ASSERT(maximumCallFrameSize >= initialCallFrameSize); disjunction->m_hasFixedSize = hasFixedSize; @@ -1933,7 +2072,7 @@ ErrorCode setupOffsets() { // FIXME: Yarr should not use the stack to handle subpatterns (rdar://problem/26436314). - unsigned ignoredCallFrameSize; + CheckedUint32 ignoredCallFrameSize; return setupDisjunctionOffsets(m_pattern.m_body, 0, 0, ignoredCallFrameSize); } @@ -2428,123 +2567,6 @@ ErrorCode error() { return m_error; } private: - class ParenthesisContext { - private: - class SavedContext { - public: - SavedContext(bool isModifier, bool invert, MatchDirection matchDirection, OptionSet flags) - : m_isModifier(isModifier) - , m_invert(invert) - , m_matchDirection(matchDirection) - , m_flags(flags) - { - } - - void restore(bool& isModifier, bool& invert, MatchDirection& matchDirection, OptionSet& flags) - { - isModifier = m_isModifier; - invert = m_invert; - matchDirection = m_matchDirection; - flags = m_flags; - } - - private: - bool m_isModifier { false }; - bool m_invert { false }; - MatchDirection m_matchDirection { Forward }; - OptionSet m_flags; - }; - - public: - ParenthesisContext() - { - } - - void push() - { - ASSERT(m_stackDepth < std::numeric_limits::max()); - - if (m_stackDepth++ > 0) - m_backingStack.append(SavedContext(m_isModifier, m_invert, m_matchDirection, m_flags)); - - // isModifier should only apply to one frame at a time - m_isModifier = false; - } - - void pop() - { - ASSERT(m_stackDepth > 0); - - if (--m_stackDepth > 0) { - SavedContext context = m_backingStack.takeLast(); - context.restore(m_isModifier, m_invert, m_matchDirection, m_flags); - } else { - m_isModifier = false; - m_invert = false; - m_matchDirection = Forward; - m_flags = { }; - } - } - - void setModifier(bool isMod) - { - m_isModifier = isMod; - } - - bool isModifier() const - { - return m_isModifier; - } - - void setInvert(bool invert) - { - m_invert = invert; - } - - bool invert() const - { - return m_invert; - } - - void setMatchDirection(MatchDirection matchDirection) - { - m_matchDirection = matchDirection; - } - - MatchDirection matchDirection() const - { - return m_matchDirection; - } - - void setFlags(OptionSet flags) - { - m_flags = flags; - } - - OptionSet flags() const - { - return m_flags; - } - - void reset() - { - m_backingStack.clear(); - m_stackDepth = 0; - - m_isModifier = false; - m_invert = false; - m_matchDirection = Forward; - m_flags = { }; - } - - private: - Vector m_backingStack; - unsigned m_stackDepth { 0 }; - bool m_isModifier { false }; - bool m_invert { false }; - MatchDirection m_matchDirection { Forward }; - OptionSet m_flags; - }; void pushParenthesisContext() { diff -Nru webkit2gtk-2.52.3/Source/JavaScriptCore/yarr/YarrSyntaxChecker.cpp webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrSyntaxChecker.cpp --- webkit2gtk-2.52.3/Source/JavaScriptCore/yarr/YarrSyntaxChecker.cpp 2026-01-20 14:08:32.688705200 +0000 +++ webkit2gtk-2.52.5/Source/JavaScriptCore/yarr/YarrSyntaxChecker.cpp 2026-07-09 07:12:41.828802000 +0000 @@ -48,7 +48,7 @@ void atomCharacterClassPushNested(bool) { } void atomCharacterClassPopNested(bool) { } void atomCharacterClassEnd() { } - void atomParenthesesSubpatternBegin(bool = true, std::optional = std::nullopt) { } + void atomParenthesesSubpatternBegin(bool, std::optional = std::nullopt) { } void atomParentheticalAssertionBegin(bool, MatchDirection) { } void atomParentheticalModifierBegin(OptionSet, OptionSet) { } void atomParenthesesEnd() { } diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/ANGLE/src/common/mathutil.h webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/common/mathutil.h --- webkit2gtk-2.52.3/Source/ThirdParty/ANGLE/src/common/mathutil.h 2026-02-23 14:40:52.569316400 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/common/mathutil.h 2026-07-09 07:12:41.832802000 +0000 @@ -872,11 +872,11 @@ {}; IndexRange(Undefined) {} IndexRange() = default; - IndexRange(uint32_t start_, uint32_t end_) : mStart(start_), mCount(end_ - start_ + 1) + IndexRange(uint32_t start_, uint32_t end_) : mStart(start_), mEnd(end_) { ASSERT(start_ <= end_); } - bool isEmpty() const { return mCount == 0; } + bool isEmpty() const { return mStart > mEnd; } uint32_t start() const { ASSERT(!isEmpty()); @@ -885,23 +885,23 @@ uint32_t end() const { ASSERT(!isEmpty()); - return mStart + mCount - 1; + return mEnd; } // Number of vertices in the range. - uint32_t vertexCount() const { return mCount; } - + // Range: [0, 0] == 1 + // Range: [0, 0xFFFFFFFF] == 0x100000000 (needs size_t). + size_t vertexCount() const + { + // Note: unsigned underflow ok on isEmpty() == true. + return static_cast(mEnd) - mStart + 1u; + } private: - uint32_t mStart{0}; - uint32_t mCount{0}; + uint32_t mStart{1}; + uint32_t mEnd{0}; + friend bool operator==(const IndexRange &a, const IndexRange &b) noexcept = default; }; -inline bool operator==(const IndexRange &a, const IndexRange &b) -{ - return a.vertexCount() == b.vertexCount() && - ((a.vertexCount() == 0) || (a.start() == b.start())); -} - std::ostream &operator<<(std::ostream &s, const IndexRange &a); // Combine a floating-point value representing a mantissa (x) and an integer exponent (exp) into a diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/ANGLE/src/common/utilities_unittest.cpp webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/common/utilities_unittest.cpp --- webkit2gtk-2.52.3/Source/ThirdParty/ANGLE/src/common/utilities_unittest.cpp 2026-02-23 14:40:52.573316300 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/common/utilities_unittest.cpp 2026-07-09 07:12:41.832802000 +0000 @@ -256,6 +256,34 @@ EXPECT_EQ(ComputeIndexRange(b, vertices2, 2, false), gl::IndexRange(255, 255)); EXPECT_EQ(ComputeIndexRange(b, vertices2, 3, true), gl::IndexRange(2, 2)); EXPECT_EQ(ComputeIndexRange(b, vertices2, 3, false), gl::IndexRange(2, 255)); + + constexpr auto i = gl::DrawElementsType::UnsignedInt; + uint32_t vertices3[] = { + 0, + 0xff, + 0xffffffff, + }; + EXPECT_EQ(ComputeIndexRange(i, vertices3, 1, true), gl::IndexRange(0, 0)); + EXPECT_EQ(ComputeIndexRange(i, vertices3, 2, true), gl::IndexRange(0, 255)); + EXPECT_EQ(ComputeIndexRange(i, vertices3, 2, false), gl::IndexRange(0, 255)); + EXPECT_EQ(ComputeIndexRange(i, vertices3, 3, true), gl::IndexRange(0, 255)); + EXPECT_EQ(ComputeIndexRange(i, vertices3, 3, false), gl::IndexRange(0, 0xffffffff)); + EXPECT_EQ(ComputeIndexRange(i, vertices3 + 1, 2, true), gl::IndexRange(255, 255)); + EXPECT_EQ(ComputeIndexRange(i, vertices3 + 1, 2, false), gl::IndexRange(255, 0xffffffff)); + + EXPECT_TRUE(gl::IndexRange().isEmpty()); + EXPECT_FALSE(gl::IndexRange(0, 0).isEmpty()); + EXPECT_FALSE(gl::IndexRange(0xfffffffe, 0xffffffff).isEmpty()); + EXPECT_FALSE(gl::IndexRange(0xffffffff, 0xffffffff).isEmpty()); + + EXPECT_EQ(0u, gl::IndexRange().vertexCount()); + EXPECT_EQ(1u, gl::IndexRange(0, 0).vertexCount()); + EXPECT_EQ(1u, gl::IndexRange(255, 255).vertexCount()); + EXPECT_EQ(255u, gl::IndexRange(1, 255).vertexCount()); + EXPECT_EQ(256u, gl::IndexRange(0, 255).vertexCount()); + + EXPECT_EQ(0xffffffffu, gl::IndexRange(1, 0xffffffff).vertexCount()); + EXPECT_EQ(static_cast(0x100000000ull), gl::IndexRange(0, 0xffffffff).vertexCount()); } } // anonymous namespace diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/ANGLE/src/libANGLE/ErrorStrings.h webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/libANGLE/ErrorStrings.h --- webkit2gtk-2.52.3/Source/ThirdParty/ANGLE/src/libANGLE/ErrorStrings.h 2026-02-23 14:40:52.610316000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/libANGLE/ErrorStrings.h 2026-07-09 07:12:41.832802000 +0000 @@ -640,6 +640,7 @@ inline constexpr const char *kTransformFeedbackPaused = "The active Transform Feedback object is paused."; inline constexpr const char *kTransformFeedbackProgramBinary = "Cannot change program binary while program is associated with an active transform feedback object."; inline constexpr const char *kTransformFeedbackTargetActive = "Target is TRANSFORM_FEEDBACK_BUFFER and transform feedback is currently active."; +inline constexpr const char *kTransformFeedbackProgramNotActive = "The program being used by the current transform feedback object is not the active program."; inline constexpr const char *kTransformFeedbackUseProgram = "Cannot change active program while transform feedback is unpaused."; inline constexpr const char *kTransformFeedbackVaryingIndexOutOfRange = "Index must be less than the transform feedback varying count in the program."; inline constexpr const char *kTypeNotUnsignedShortByte = "Only UNSIGNED_SHORT and UNSIGNED_BYTE types are supported."; diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/ANGLE/src/libANGLE/validationES.h webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/libANGLE/validationES.h --- webkit2gtk-2.52.3/Source/ThirdParty/ANGLE/src/libANGLE/validationES.h 2026-02-23 14:40:52.687315700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/libANGLE/validationES.h 2026-07-09 07:12:41.832802000 +0000 @@ -1120,13 +1120,13 @@ // If we use an index greater than our maximum supported index range, return an error. // The ES3 spec does not specify behaviour here, it is undefined, but ANGLE should // always return an error if possible here. - if (static_cast(indexRange.end()) >= context->getCaps().maxElementIndex) + if (indexRange.end() >= context->getCaps().maxElementIndex) { ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, err::kExceedsMaxElement); return false; } - if (!ValidateDrawAttribs(context, entryPoint, static_cast(indexRange.end()))) + if (!ValidateDrawAttribs(context, entryPoint, indexRange.end())) { return false; } diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/ANGLE/src/libANGLE/validationES3.cpp webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/libANGLE/validationES3.cpp --- webkit2gtk-2.52.3/Source/ThirdParty/ANGLE/src/libANGLE/validationES3.cpp 2026-02-23 14:40:52.689315800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/libANGLE/validationES3.cpp 2026-07-09 07:12:41.832802000 +0000 @@ -4144,6 +4144,13 @@ return false; } + const Program *currentProgram = context->getState().getProgram(); + if (!currentProgram || !transformFeedback->hasBoundProgram(currentProgram->id())) + { + ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTransformFeedbackProgramNotActive); + return false; + } + if (!ValidateProgramExecutableXFBBuffersPresent( context, context->getState().getLinkedProgramExecutable(context))) { diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/ANGLE/src/tests/gl_tests/TransformFeedbackTest.cpp webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/tests/gl_tests/TransformFeedbackTest.cpp --- webkit2gtk-2.52.3/Source/ThirdParty/ANGLE/src/tests/gl_tests/TransformFeedbackTest.cpp 2026-02-23 14:40:52.730315400 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/tests/gl_tests/TransformFeedbackTest.cpp 2026-07-09 07:12:41.832802000 +0000 @@ -4735,6 +4735,95 @@ glEndTransformFeedback(); } +// Test that UseProgram generates INVALID_OPERATION when transform feedback is active and not paused. +TEST_P(TransformFeedbackTest, UseProgramWhileActiveAndNotPaused) +{ + std::vector tfVaryings = {"gl_Position"}; + compileDefaultProgram(tfVaryings, GL_INTERLEAVED_ATTRIBS); + ANGLE_GL_PROGRAM(otherProgram, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red()); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer); + glUseProgram(mProgram); + glBeginTransformFeedback(GL_POINTS); + ASSERT_GL_NO_ERROR(); + glUseProgram(otherProgram); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + GLint currentProgram = 0; + glGetIntegerv(GL_CURRENT_PROGRAM, ¤tProgram); + EXPECT_EQ(static_cast(currentProgram), mProgram); + glEndTransformFeedback(); + EXPECT_GL_NO_ERROR(); +} + +// Test that LinkProgram generates INVALID_OPERATION when the program is used by an active +// transform feedback object, even if it is paused. +TEST_P(TransformFeedbackTest, LinkProgramWhileActiveAndPaused) +{ + std::vector tfVaryings = {"gl_Position"}; + compileDefaultProgram(tfVaryings, GL_INTERLEAVED_ATTRIBS); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer); + glUseProgram(mProgram); + glBeginTransformFeedback(GL_POINTS); + glPauseTransformFeedback(); + ASSERT_GL_NO_ERROR(); + glLinkProgram(mProgram); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + glEndTransformFeedback(); + EXPECT_GL_NO_ERROR(); +} + +// Test that BindBufferBase, BindBufferRange with TRANSFORM_FEEDBACK_BUFFER generates INVALID_OPERATION when +// transform feedback is active. +TEST_P(TransformFeedbackTest, BindBufferBaseWhileActive) +{ + std::vector tfVaryings = {"gl_Position"}; + compileDefaultProgram(tfVaryings, GL_INTERLEAVED_ATTRIBS); + + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer); + glUseProgram(mProgram); + glBeginTransformFeedback(GL_POINTS); + ASSERT_GL_NO_ERROR(); + GLBuffer otherBuffer; + glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, otherBuffer); + glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 1024, nullptr, GL_STATIC_DRAW); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, otherBuffer); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, otherBuffer, 0, 512); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + glEndTransformFeedback(); + EXPECT_GL_NO_ERROR(); +} + +// Test that ResumeTransformFeedback generates INVALID_OPERATION when a different program is +// current than the one used to begin transform feedback on the current TFO. +TEST_P(TransformFeedbackTest, ResumeWithDifferentProgram) +{ + std::vector tfVaryings = {"gl_Position"}; + compileDefaultProgram(tfVaryings, GL_INTERLEAVED_ATTRIBS); + + ANGLE_GL_PROGRAM_TRANSFORM_FEEDBACK(otherProgram, essl3_shaders::vs::Simple(), + essl3_shaders::fs::Red(), tfVaryings, + GL_INTERLEAVED_ATTRIBS); + + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer); + glUseProgram(mProgram); + glBeginTransformFeedback(GL_POINTS); + ASSERT_GL_NO_ERROR(); + + glPauseTransformFeedback(); + glUseProgram(otherProgram); + ASSERT_GL_NO_ERROR(); + + glResumeTransformFeedback(); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glUseProgram(mProgram); + glResumeTransformFeedback(); + EXPECT_GL_NO_ERROR(); + + glEndTransformFeedback(); + EXPECT_GL_NO_ERROR(); +} + GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TransformFeedbackTest); ANGLE_INSTANTIATE_TEST_ES3_AND(TransformFeedbackTest, ES3_VULKAN().disable(Feature::SupportsTransformFeedbackExtension), diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/ANGLE/src/tests/gl_tests/WebGLCompatibilityTest.cpp webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/tests/gl_tests/WebGLCompatibilityTest.cpp --- webkit2gtk-2.52.3/Source/ThirdParty/ANGLE/src/tests/gl_tests/WebGLCompatibilityTest.cpp 2026-02-23 14:40:52.733315500 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/ANGLE/src/tests/gl_tests/WebGLCompatibilityTest.cpp 2026-07-09 07:12:41.836802000 +0000 @@ -1640,15 +1640,16 @@ ANGLE_GL_PROGRAM(program, kVS, essl1_shaders::fs::Red()); glUseProgram(program); - glEnableVertexAttribArray(glGetAttribLocation(program, "a_Position")); - + GLint posLocation = glGetAttribLocation(program, "a_Position"); + ASSERT_NE(-1, posLocation); + glEnableVertexAttribArray(posLocation); constexpr float kVertexData[] = { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, }; - GLBuffer vertexBuffer; glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(kVertexData), kVertexData, GL_STREAM_DRAW); + glVertexAttribPointer(posLocation, 4, GL_FLOAT, GL_FALSE, 0, nullptr); constexpr GLuint kMaxIntAsGLuint = static_cast(std::numeric_limits::max()); constexpr GLuint kIndexData[] = { @@ -1659,7 +1660,7 @@ }; GLBuffer indexBuffer; - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vertexBuffer); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(kIndexData), kIndexData, GL_DYNAMIC_DRAW); EXPECT_GL_NO_ERROR(); @@ -1671,6 +1672,36 @@ // Neither index is representable as 32-bit int glDrawElements(GL_LINES, 2, GL_UNSIGNED_INT, reinterpret_cast(sizeof(GLuint) * 2)); EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + constexpr GLuint kIndexData2[] = { + 0, + std::numeric_limits::max(), + }; + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(kIndexData2), kIndexData2, GL_DYNAMIC_DRAW); + + glDrawElements(GL_LINES, 2, GL_UNSIGNED_INT, 0); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glDrawElements(GL_LINES, 2, GL_UNSIGNED_SHORT, reinterpret_cast(2)); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + glDrawElements(GL_LINES, 2, GL_UNSIGNED_BYTE, reinterpret_cast(3)); + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + + constexpr GLuint kIndexData3[] = { + 0, + 1 + }; + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(kIndexData3), kIndexData3, GL_DYNAMIC_DRAW); + + glDrawElements(GL_LINES, 2, GL_UNSIGNED_INT, 0); + EXPECT_GL_NO_ERROR(); + + glDrawElements(GL_LINES, 2, GL_UNSIGNED_SHORT, reinterpret_cast(2)); + EXPECT_GL_NO_ERROR(); + + glDrawElements(GL_LINES, 2, GL_UNSIGNED_BYTE, reinterpret_cast(3)); + EXPECT_GL_NO_ERROR(); } // Test for drawing with a null index buffer @@ -6962,6 +6993,82 @@ EXPECT_GL_ERROR(GL_INVALID_OPERATION); } +// Test that drawing a large GLuint index works. +TEST_P(WebGL2CompatibilityTest, DrawLargeIndex) +{ + constexpr std::array kGreen = {0.0f, 1.0f, 0.0f, 1.0f}; + constexpr GLuint offset = 0x80000000; + GLuint indexData[] = {0, 1, 2, 1, 3, 2}; + for (auto& index : indexData) + { + index += offset; + } + float vertexData[] = {-1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f}; + + GLBuffer indexBuffer; + ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor()); + GLint vPos = glGetAttribLocation(program, essl1_shaders::PositionAttrib()); + ASSERT_NE(vPos, -1); + glUseProgram(program); + GLint colorUniformLocation = + glGetUniformLocation(program, angle::essl1_shaders::ColorUniform()); + ASSERT_NE(colorUniformLocation, -1); + + GLBuffer vertexBuffer; + glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); + glBufferData(GL_ARRAY_BUFFER, offset * sizeof(float) * 2 + sizeof(vertexData), nullptr, GL_STATIC_DRAW); + glBufferSubData(GL_ARRAY_BUFFER, offset * sizeof(float) * 2, sizeof(vertexData), vertexData); + glVertexAttribPointer(vPos, 2, GL_FLOAT, GL_FALSE, 0, nullptr); + glEnableVertexAttribArray(vPos); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexData), indexData, GL_DYNAMIC_DRAW); + + glUniform4fv(colorUniformLocation, 1, kGreen.data()); + ASSERT_GL_NO_ERROR(); + + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr); + ASSERT_GL_NO_ERROR(); + EXPECT_PIXEL_COLOR_EQ(getWindowWidth() - 1, 0, GLColor::green); + EXPECT_PIXEL_COLOR_EQ(0, getWindowHeight() - 1, GLColor::green); +} + +// Test that drawing a large GLuint index is detected as out-of-bounds access. +TEST_P(WebGL2CompatibilityTest, DrawLargeIndexOOB) +{ + constexpr GLuint offset = 0x80000000; + GLuint indexData[] = {0, 1, 2}; + for (auto& index : indexData) + { + index += offset; + } + GLBuffer indexBuffer; + ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor()); + GLint vPos = glGetAttribLocation(program, essl1_shaders::PositionAttrib()); + ASSERT_NE(vPos, -1); + glUseProgram(program); + + GLBuffer vertexBuffer; + glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); + glBufferData(GL_ARRAY_BUFFER, 10, nullptr, GL_STATIC_DRAW); + glVertexAttribPointer(vPos, 2, GL_FLOAT, GL_FALSE, 0, nullptr); + glEnableVertexAttribArray(vPos); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexData), indexData, GL_DYNAMIC_DRAW); + + EXPECT_GL_NO_ERROR(); + glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, nullptr); + if (!IsGLExtensionEnabled("GL_KHR_robust_buffer_access_behavior")) + { + EXPECT_GL_ERROR(GL_INVALID_OPERATION); + } + else + { + EXPECT_GL_NO_ERROR(); + } +} + ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(WebGLCompatibilityTest); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(WebGL2CompatibilityTest); diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/PdfJSFiles.cmake webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/PdfJSFiles.cmake --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/PdfJSFiles.cmake 2026-01-20 14:08:39.296690000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/PdfJSFiles.cmake 2026-07-09 07:12:41.840802000 +0000 @@ -176,8 +176,12 @@ ${THIRDPARTY_DIR}/pdfjs/web/cmaps/UniKS-UTF8-V.bcmap ${THIRDPARTY_DIR}/pdfjs/web/cmaps/V.bcmap ${THIRDPARTY_DIR}/pdfjs/web/cmaps/WP-Symbol.bcmap + ${THIRDPARTY_DIR}/pdfjs/web/iccs/CGATS001Compat-v2-micro.icc ${THIRDPARTY_DIR}/pdfjs/web/images/altText_add.svg + ${THIRDPARTY_DIR}/pdfjs/web/images/altText_disclaimer.svg ${THIRDPARTY_DIR}/pdfjs/web/images/altText_done.svg + ${THIRDPARTY_DIR}/pdfjs/web/images/altText_spinner.svg + ${THIRDPARTY_DIR}/pdfjs/web/images/altText_warning.svg ${THIRDPARTY_DIR}/pdfjs/web/images/annotation-check.svg ${THIRDPARTY_DIR}/pdfjs/web/images/annotation-comment.svg ${THIRDPARTY_DIR}/pdfjs/web/images/annotation-help.svg @@ -189,16 +193,29 @@ ${THIRDPARTY_DIR}/pdfjs/web/images/annotation-paperclip.svg ${THIRDPARTY_DIR}/pdfjs/web/images/annotation-paragraph.svg ${THIRDPARTY_DIR}/pdfjs/web/images/annotation-pushpin.svg + ${THIRDPARTY_DIR}/pdfjs/web/images/checkmark.svg + ${THIRDPARTY_DIR}/pdfjs/web/images/comment-actionsButton.svg + ${THIRDPARTY_DIR}/pdfjs/web/images/comment-closeButton.svg + ${THIRDPARTY_DIR}/pdfjs/web/images/comment-editButton.svg + ${THIRDPARTY_DIR}/pdfjs/web/images/comment-popup-editButton.svg ${THIRDPARTY_DIR}/pdfjs/web/images/cursor-editorFreeHighlight.svg ${THIRDPARTY_DIR}/pdfjs/web/images/cursor-editorFreeText.svg ${THIRDPARTY_DIR}/pdfjs/web/images/cursor-editorInk.svg ${THIRDPARTY_DIR}/pdfjs/web/images/cursor-editorTextHighlight.svg ${THIRDPARTY_DIR}/pdfjs/web/images/editor-toolbar-delete.svg + ${THIRDPARTY_DIR}/pdfjs/web/images/editor-toolbar-edit.svg ${THIRDPARTY_DIR}/pdfjs/web/images/findbarButton-next.svg ${THIRDPARTY_DIR}/pdfjs/web/images/findbarButton-previous.svg ${THIRDPARTY_DIR}/pdfjs/web/images/gv-toolbarButton-download.svg ${THIRDPARTY_DIR}/pdfjs/web/images/loading-icon.gif ${THIRDPARTY_DIR}/pdfjs/web/images/loading.svg + ${THIRDPARTY_DIR}/pdfjs/web/images/messageBar_closingButton.svg + ${THIRDPARTY_DIR}/pdfjs/web/images/messageBar_info.svg + ${THIRDPARTY_DIR}/pdfjs/web/images/messageBar_warning.svg + ${THIRDPARTY_DIR}/pdfjs/web/images/pages_closeButton.svg + ${THIRDPARTY_DIR}/pdfjs/web/images/pages_selected.svg + ${THIRDPARTY_DIR}/pdfjs/web/images/pages_viewArrow.svg + ${THIRDPARTY_DIR}/pdfjs/web/images/pages_viewButton.svg ${THIRDPARTY_DIR}/pdfjs/web/images/secondaryToolbarButton-documentProperties.svg ${THIRDPARTY_DIR}/pdfjs/web/images/secondaryToolbarButton-firstPage.svg ${THIRDPARTY_DIR}/pdfjs/web/images/secondaryToolbarButton-handTool.svg @@ -219,6 +236,7 @@ ${THIRDPARTY_DIR}/pdfjs/web/images/toolbarButton-editorFreeText.svg ${THIRDPARTY_DIR}/pdfjs/web/images/toolbarButton-editorHighlight.svg ${THIRDPARTY_DIR}/pdfjs/web/images/toolbarButton-editorInk.svg + ${THIRDPARTY_DIR}/pdfjs/web/images/toolbarButton-editorSignature.svg ${THIRDPARTY_DIR}/pdfjs/web/images/toolbarButton-editorStamp.svg ${THIRDPARTY_DIR}/pdfjs/web/images/toolbarButton-menuArrow.svg ${THIRDPARTY_DIR}/pdfjs/web/images/toolbarButton-openFile.svg @@ -228,11 +246,11 @@ ${THIRDPARTY_DIR}/pdfjs/web/images/toolbarButton-print.svg ${THIRDPARTY_DIR}/pdfjs/web/images/toolbarButton-search.svg ${THIRDPARTY_DIR}/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.svg - ${THIRDPARTY_DIR}/pdfjs/web/images/toolbarButton-sidebarToggle.svg ${THIRDPARTY_DIR}/pdfjs/web/images/toolbarButton-viewAttachments.svg ${THIRDPARTY_DIR}/pdfjs/web/images/toolbarButton-viewLayers.svg ${THIRDPARTY_DIR}/pdfjs/web/images/toolbarButton-viewOutline.svg ${THIRDPARTY_DIR}/pdfjs/web/images/toolbarButton-viewThumbnail.svg + ${THIRDPARTY_DIR}/pdfjs/web/images/toolbarButton-viewsManagerToggle.svg ${THIRDPARTY_DIR}/pdfjs/web/images/toolbarButton-zoomIn.svg ${THIRDPARTY_DIR}/pdfjs/web/images/toolbarButton-zoomOut.svg ${THIRDPARTY_DIR}/pdfjs/web/images/treeitem-collapsed.svg @@ -248,6 +266,7 @@ ${THIRDPARTY_DIR}/pdfjs/web/locale/bg/viewer.ftl ${THIRDPARTY_DIR}/pdfjs/web/locale/bn/viewer.ftl ${THIRDPARTY_DIR}/pdfjs/web/locale/bo/viewer.ftl + ${THIRDPARTY_DIR}/pdfjs/web/locale/bqi/viewer.ftl ${THIRDPARTY_DIR}/pdfjs/web/locale/br/viewer.ftl ${THIRDPARTY_DIR}/pdfjs/web/locale/brx/viewer.ftl ${THIRDPARTY_DIR}/pdfjs/web/locale/bs/viewer.ftl @@ -306,6 +325,7 @@ ${THIRDPARTY_DIR}/pdfjs/web/locale/lv/viewer.ftl ${THIRDPARTY_DIR}/pdfjs/web/locale/meh/viewer.ftl ${THIRDPARTY_DIR}/pdfjs/web/locale/mk/viewer.ftl + ${THIRDPARTY_DIR}/pdfjs/web/locale/ml/viewer.ftl ${THIRDPARTY_DIR}/pdfjs/web/locale/mr/viewer.ftl ${THIRDPARTY_DIR}/pdfjs/web/locale/ms/viewer.ftl ${THIRDPARTY_DIR}/pdfjs/web/locale/my/viewer.ftl @@ -363,4 +383,7 @@ ${THIRDPARTY_DIR}/pdfjs/web/standard_fonts/LiberationSans-BoldItalic.ttf ${THIRDPARTY_DIR}/pdfjs/web/standard_fonts/LiberationSans-Italic.ttf ${THIRDPARTY_DIR}/pdfjs/web/standard_fonts/LiberationSans-Regular.ttf + ${THIRDPARTY_DIR}/pdfjs/web/wasm/jbig2_nowasm_fallback.js + ${THIRDPARTY_DIR}/pdfjs/web/wasm/openjpeg_nowasm_fallback.js + ${THIRDPARTY_DIR}/pdfjs/web/wasm/quickjs-eval.js ) \ No newline at end of file diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/README.webkit webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/README.webkit --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/README.webkit 2026-01-20 14:08:39.296690000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/README.webkit 2026-07-09 07:12:41.840802000 +0000 @@ -1,23 +1,16 @@ This directory contains an official PDF.js release version, distributed at: https://github.com/mozilla/pdf.js -======================================================================= - -Since April 2024, the version of PDF.js is frozen due to the discovery of binary code. Please do not -update PDF.js until we have removed the binary code: - -https://bugs.webkit.org/show_bug.cgi?id=273435 - -======================================================================= - To update to a newer version: 1. Delete existing files except for this README.webkit. -2. Grab a new official release (pdfjs-*-dist.zip, non-legacy version) distributed at GitHub and extract everything into this directory. -3. Delete the sourcemap (.js.map) files (currently viewer.js.map, pdf.js.map, pdf.worker.js.map, and pdf.sandbox.js.map). -4. Delete the example PDF file, compressed.tracemonkey-pldi-09.pdf. -5. From top source dir, run: 'Tools/glib/generate-pdfjs-resource-manifest.py --cmake --input=Source/ThirdParty/pdfjs --output=Source/ThirdParty/pdfjs/PdfJSFiles.cmake' -6. Build WebKit, your favorite port will do -7. Sanity-check: +2. Grab a new official release (pdfjs-*-dist.zip, non-legacy version) distributed at GitHub. +3. Extract everything into this directory. +4. Delete the binary .wasm files (currently jbig2.wasm, qcms_bg.wasm, openjpeg.wasm, and quickjs-eval.wasm). +5. Delete the .mjs.map files (currently pdf.mjs.map, viewer.mjs.map, pdf.worker.mjs.map, and pdf.sandbox.mjs.map). +6. Delete the example PDF file, compressed.tracemonkey-pldi-09.pdf. +7. From top source dir, run: 'Tools/glib/generate-pdfjs-resource-manifest.py --cmake --input=Source/ThirdParty/pdfjs --output=Source/ThirdParty/pdfjs/PdfJSFiles.cmake' +8. Build WebKit, your favorite port will do +9. Sanity-check: * Load https://www.irs.gov/pub/irs-pdf/i1040gi.pdf (a big PDF) * Test downloading the PDF * Test opening the print dialog @@ -27,3 +20,7 @@ ideal and possibly violates the packaging requirements of most major Linux distributions. However, requiring a huge number of Node.js packages would surely result in most distributions disabling the PDF support altogether. The .mjs files are not minified or obfuscated, so using them is pragmatic. + +Certain js files actually *are* minified, e.g. quickjs-eval.js. This is even more likely to violate +distro policies, but at least they are text and can be viewed in a text editor. If you follow the +above instructions to delete the .wasm files, then there should hopefully be no binary code. diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/build/pdf.mjs webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/build/pdf.mjs --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/build/pdf.mjs 2026-01-20 14:08:39.300690000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/build/pdf.mjs 2026-07-09 07:12:41.844802000 +0000 @@ -2,7 +2,7 @@ * @licstart The following is the entire license notice for the * JavaScript code in this page * - * Copyright 2023 Mozilla Foundation + * Copyright 2024 Mozilla Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,2494 +20,6676 @@ * JavaScript code in this page */ -/******/ var __webpack_modules__ = ({ - -/***/ 976: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - - -// EXPORTS -__webpack_require__.d(__webpack_exports__, { - AnnotationLayer: () => (/* binding */ AnnotationLayer), - FreeTextAnnotationElement: () => (/* binding */ FreeTextAnnotationElement), - InkAnnotationElement: () => (/* binding */ InkAnnotationElement), - StampAnnotationElement: () => (/* binding */ StampAnnotationElement) -}); +/** + * pdfjsVersion = 6.1.200 + * pdfjsBuild = 6353acefe + */ -// EXTERNAL MODULE: ./src/shared/util.js -var util = __webpack_require__(292); -// EXTERNAL MODULE: ./src/display/display_utils.js -var display_utils = __webpack_require__(419); -// EXTERNAL MODULE: ./src/display/annotation_storage.js -var annotation_storage = __webpack_require__(792); -;// CONCATENATED MODULE: ./src/shared/scripting_utils.js -function makeColorComp(n) { - return Math.floor(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, "0"); +;// ./src/shared/util.js +const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); +const BBOX_INIT = [Infinity, Infinity, -Infinity, -Infinity]; +const F32_BBOX_INIT = new Float32Array(BBOX_INIT); +const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; +const LINE_FACTOR = 1.35; +const LINE_DESCENT_FACTOR = 0.35; +const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR; +const SVG_NS = "http://www.w3.org/2000/svg"; +const RenderingIntentFlag = { + ANY: 0x01, + DISPLAY: 0x02, + PRINT: 0x04, + SAVE: 0x08, + ANNOTATIONS_FORMS: 0x10, + ANNOTATIONS_STORAGE: 0x20, + ANNOTATIONS_DISABLE: 0x40, + IS_EDITING: 0x80, + OPLIST: 0x100 +}; +const AnnotationMode = { + DISABLE: 0, + ENABLE: 1, + ENABLE_FORMS: 2, + ENABLE_STORAGE: 3 +}; +const AnnotationPrefix = "pdfjs_internal_id_"; +const AnnotationEditorPrefix = "pdfjs_internal_editor_"; +const AnnotationEditorType = { + DISABLE: -1, + NONE: 0, + FREETEXT: 3, + HIGHLIGHT: 9, + STAMP: 13, + INK: 15, + POPUP: 16, + SIGNATURE: 101, + COMMENT: 102 +}; +const AnnotationEditorParamsType = { + RESIZE: 1, + CREATE: 2, + FREETEXT_SIZE: 11, + FREETEXT_COLOR: 12, + FREETEXT_OPACITY: 13, + INK_COLOR: 21, + INK_THICKNESS: 22, + INK_OPACITY: 23, + INK_COLOR_AND_OPACITY: 24, + HIGHLIGHT_COLOR: 31, + HIGHLIGHT_THICKNESS: 32, + HIGHLIGHT_FREE: 33, + HIGHLIGHT_SHOW_ALL: 34, + DRAW_STEP: 41 +}; +const PermissionFlag = { + PRINT: 0x04, + MODIFY_CONTENTS: 0x08, + COPY: 0x10, + MODIFY_ANNOTATIONS: 0x20, + FILL_INTERACTIVE_FORMS: 0x100, + COPY_FOR_ACCESSIBILITY: 0x200, + ASSEMBLE: 0x400, + PRINT_HIGH_QUALITY: 0x800 +}; +const MeshFigureType = (/* unused pure expression or super */ null && ({ + TRIANGLES: 1, + LATTICE: 2, + PATCH: 3 +})); +const TextRenderingMode = { + FILL: 0, + STROKE: 1, + FILL_STROKE: 2, + INVISIBLE: 3, + FILL_ADD_TO_PATH: 4, + STROKE_ADD_TO_PATH: 5, + FILL_STROKE_ADD_TO_PATH: 6, + ADD_TO_PATH: 7, + FILL_STROKE_MASK: 3, + ADD_TO_PATH_FLAG: 4 +}; +const ImageKind = { + GRAYSCALE_1BPP: 1, + RGB_24BPP: 2, + RGBA_32BPP: 3 +}; +const AnnotationType = { + TEXT: 1, + LINK: 2, + FREETEXT: 3, + LINE: 4, + SQUARE: 5, + CIRCLE: 6, + POLYGON: 7, + POLYLINE: 8, + HIGHLIGHT: 9, + UNDERLINE: 10, + SQUIGGLY: 11, + STRIKEOUT: 12, + STAMP: 13, + CARET: 14, + INK: 15, + POPUP: 16, + FILEATTACHMENT: 17, + SOUND: 18, + MOVIE: 19, + WIDGET: 20, + SCREEN: 21, + PRINTERMARK: 22, + TRAPNET: 23, + WATERMARK: 24, + THREED: 25, + REDACT: 26, + RICHMEDIA: 27 +}; +const AnnotationReplyType = (/* unused pure expression or super */ null && ({ + GROUP: "Group", + REPLY: "R" +})); +const AnnotationRenditionOperation = (/* unused pure expression or super */ null && ({ + PLAY_OR_RESUME: 0, + STOP: 1, + PAUSE: 2, + RESUME: 3, + PLAY: 4 +})); +const AnnotationFlag = (/* unused pure expression or super */ null && ({ + INVISIBLE: 0x01, + HIDDEN: 0x02, + PRINT: 0x04, + NOZOOM: 0x08, + NOROTATE: 0x10, + NOVIEW: 0x20, + READONLY: 0x40, + LOCKED: 0x80, + TOGGLENOVIEW: 0x100, + LOCKEDCONTENTS: 0x200 +})); +const AnnotationFieldFlag = (/* unused pure expression or super */ null && ({ + READONLY: 0x0000001, + REQUIRED: 0x0000002, + NOEXPORT: 0x0000004, + MULTILINE: 0x0001000, + PASSWORD: 0x0002000, + NOTOGGLETOOFF: 0x0004000, + RADIO: 0x0008000, + PUSHBUTTON: 0x0010000, + COMBO: 0x0020000, + EDIT: 0x0040000, + SORT: 0x0080000, + FILESELECT: 0x0100000, + MULTISELECT: 0x0200000, + DONOTSPELLCHECK: 0x0400000, + DONOTSCROLL: 0x0800000, + COMB: 0x1000000, + RICHTEXT: 0x2000000, + RADIOSINUNISON: 0x2000000, + COMMITONSELCHANGE: 0x4000000 +})); +const AnnotationBorderStyleType = { + SOLID: 1, + DASHED: 2, + BEVELED: 3, + INSET: 4, + UNDERLINE: 5 +}; +const AnnotationActionEventType = (/* unused pure expression or super */ null && ({ + E: "Mouse Enter", + X: "Mouse Exit", + D: "Mouse Down", + U: "Mouse Up", + Fo: "Focus", + Bl: "Blur", + PO: "PageOpen", + PC: "PageClose", + PV: "PageVisible", + PI: "PageInvisible", + K: "Keystroke", + F: "Format", + V: "Validate", + C: "Calculate" +})); +const DocumentActionEventType = (/* unused pure expression or super */ null && ({ + WC: "WillClose", + WS: "WillSave", + DS: "DidSave", + WP: "WillPrint", + DP: "DidPrint" +})); +const PageActionEventType = (/* unused pure expression or super */ null && ({ + O: "PageOpen", + C: "PageClose" +})); +const VerbosityLevel = { + ERRORS: 0, + WARNINGS: 1, + INFOS: 5 +}; +const OPS = { + dependency: 1, + setLineWidth: 2, + setLineCap: 3, + setLineJoin: 4, + setMiterLimit: 5, + setDash: 6, + setRenderingIntent: 7, + setFlatness: 8, + setGState: 9, + save: 10, + restore: 11, + transform: 12, + moveTo: 13, + lineTo: 14, + curveTo: 15, + curveTo2: 16, + curveTo3: 17, + closePath: 18, + rectangle: 19, + stroke: 20, + closeStroke: 21, + fill: 22, + eoFill: 23, + fillStroke: 24, + eoFillStroke: 25, + closeFillStroke: 26, + closeEOFillStroke: 27, + endPath: 28, + clip: 29, + eoClip: 30, + beginText: 31, + endText: 32, + setCharSpacing: 33, + setWordSpacing: 34, + setHScale: 35, + setLeading: 36, + setFont: 37, + setTextRenderingMode: 38, + setTextRise: 39, + moveText: 40, + setLeadingMoveText: 41, + setTextMatrix: 42, + nextLine: 43, + showText: 44, + showSpacedText: 45, + nextLineShowText: 46, + nextLineSetSpacingShowText: 47, + setCharWidth: 48, + setCharWidthAndBounds: 49, + setStrokeColorSpace: 50, + setFillColorSpace: 51, + setStrokeColor: 52, + setStrokeColorN: 53, + setFillColor: 54, + setFillColorN: 55, + setStrokeGray: 56, + setFillGray: 57, + setStrokeRGBColor: 58, + setFillRGBColor: 59, + setStrokeCMYKColor: 60, + setFillCMYKColor: 61, + shadingFill: 62, + beginInlineImage: 63, + beginImageData: 64, + endInlineImage: 65, + paintXObject: 66, + markPoint: 67, + markPointProps: 68, + beginMarkedContent: 69, + beginMarkedContentProps: 70, + endMarkedContent: 71, + beginCompat: 72, + endCompat: 73, + paintFormXObjectBegin: 74, + paintFormXObjectEnd: 75, + beginGroup: 76, + endGroup: 77, + beginAnnotation: 80, + endAnnotation: 81, + paintImageMaskXObject: 83, + paintImageMaskXObjectGroup: 84, + paintImageXObject: 85, + paintInlineImageXObject: 86, + paintInlineImageXObjectGroup: 87, + paintImageXObjectRepeat: 88, + paintImageMaskXObjectRepeat: 89, + paintSolidColorImageMask: 90, + constructPath: 91, + setStrokeTransparent: 92, + setFillTransparent: 93, + rawFillPath: 94 +}; +const DrawOPS = { + moveTo: 0, + lineTo: 1, + curveTo: 2, + quadraticCurveTo: 3, + closePath: 4 +}; +const PasswordResponses = { + NEED_PASSWORD: 1, + INCORRECT_PASSWORD: 2 +}; +let verbosity = VerbosityLevel.WARNINGS; +function setVerbosityLevel(level) { + if (Number.isInteger(level)) { + verbosity = level; + } } -function scaleAndClamp(x) { - return Math.max(0, Math.min(255, 255 * x)); +function getVerbosityLevel() { + return verbosity; } -class ColorConverters { - static CMYK_G([c, y, m, k]) { - return ["G", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)]; +function info(msg) { + if (verbosity >= VerbosityLevel.INFOS) { + console.info(`Info: ${msg}`); } - static G_CMYK([g]) { - return ["CMYK", 0, 0, 0, 1 - g]; +} +function warn(msg) { + if (verbosity >= VerbosityLevel.WARNINGS) { + console.warn(`Warning: ${msg}`); } - static G_RGB([g]) { - return ["RGB", g, g, g]; +} +function unreachable(msg) { + throw new Error(msg); +} +function assert(cond, msg) { + if (!cond) { + unreachable(msg); } - static G_rgb([g]) { - g = scaleAndClamp(g); - return [g, g, g]; +} +function _isValidProtocol(url) { + switch (url?.protocol) { + case "http:": + case "https:": + case "ftp:": + case "mailto:": + case "tel:": + return true; + default: + return false; } - static G_HTML([g]) { - const G = makeColorComp(g); - return `#${G}${G}${G}`; +} +function createValidAbsoluteUrl(url, baseUrl = null, options = null) { + if (!url) { + return null; } - static RGB_G([r, g, b]) { - return ["G", 0.3 * r + 0.59 * g + 0.11 * b]; + if (options && typeof url === "string") { + if (options.addDefaultProtocol && url.startsWith("www.")) { + const dots = url.match(/\./g); + if (dots?.length >= 2) { + url = `http://${url}`; + } + } + if (options.tryConvertEncoding) { + try { + url = stringToUTF8String(url); + } catch {} + } } - static RGB_rgb(color) { - return color.map(scaleAndClamp); + const absoluteUrl = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url); + return _isValidProtocol(absoluteUrl) ? absoluteUrl : null; +} +function updateUrlHash(url, hash, allowRel = false) { + const res = URL.parse(url); + if (res) { + res.hash = hash; + return res.href; } - static RGB_HTML(color) { - return `#${color.map(makeColorComp).join("")}`; + if (allowRel && createValidAbsoluteUrl(url, "http://example.com")) { + return url.split("#", 1)[0] + `${hash ? `#${hash}` : ""}`; } - static T_HTML() { - return "#00000000"; + return ""; +} +function stripPath(str) { + return str.substring(str.lastIndexOf("/") + 1); +} +function shadow(obj, prop, value, nonSerializable = false) { + Object.defineProperty(obj, prop, { + value, + enumerable: !nonSerializable, + configurable: true, + writable: false + }); + return value; +} +const BaseException = function BaseExceptionClosure() { + function BaseException(message, name) { + this.message = message; + this.name = name; } - static T_rgb() { - return [null]; + BaseException.prototype = new Error(); + BaseException.constructor = BaseException; + return BaseException; +}(); +class PasswordException extends BaseException { + constructor(msg, code) { + super(msg, "PasswordException"); + this.code = code; } - static CMYK_RGB([c, y, m, k]) { - return ["RGB", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)]; +} +class UnknownErrorException extends BaseException { + constructor(msg, details) { + super(msg, "UnknownErrorException"); + this.details = details; } - static CMYK_rgb([c, y, m, k]) { - return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))]; +} +class InvalidPDFException extends BaseException { + constructor(msg) { + super(msg, "InvalidPDFException"); } - static CMYK_HTML(components) { - const rgb = this.CMYK_RGB(components).slice(1); - return this.RGB_HTML(rgb); +} +class ResponseException extends BaseException { + constructor(msg, status, missing) { + super(msg, "ResponseException"); + this.status = status; + this.missing = missing; } - static RGB_CMYK([r, g, b]) { - const c = 1 - r; - const m = 1 - g; - const y = 1 - b; - const k = Math.min(c, m, y); - return ["CMYK", c, m, y, k]; +} +class FormatError extends BaseException { + constructor(msg) { + super(msg, "FormatError"); } } - -// EXTERNAL MODULE: ./src/display/xfa_layer.js -var xfa_layer = __webpack_require__(284); -;// CONCATENATED MODULE: ./src/display/annotation_layer.js - - - - - -const DEFAULT_TAB_INDEX = 1000; -const DEFAULT_FONT_SIZE = 9; -const GetElementsByNameSet = new WeakSet(); -function getRectDims(rect) { - return { - width: rect[2] - rect[0], - height: rect[3] - rect[1] - }; +class AbortException extends BaseException { + constructor(msg) { + super(msg, "AbortException"); + } } -class AnnotationElementFactory { - static create(parameters) { - const subtype = parameters.data.annotationType; - switch (subtype) { - case util.AnnotationType.LINK: - return new LinkAnnotationElement(parameters); - case util.AnnotationType.TEXT: - return new TextAnnotationElement(parameters); - case util.AnnotationType.WIDGET: - const fieldType = parameters.data.fieldType; - switch (fieldType) { - case "Tx": - return new TextWidgetAnnotationElement(parameters); - case "Btn": - if (parameters.data.radioButton) { - return new RadioButtonWidgetAnnotationElement(parameters); - } else if (parameters.data.checkBox) { - return new CheckboxWidgetAnnotationElement(parameters); - } - return new PushButtonWidgetAnnotationElement(parameters); - case "Ch": - return new ChoiceWidgetAnnotationElement(parameters); - case "Sig": - return new SignatureWidgetAnnotationElement(parameters); - } - return new WidgetAnnotationElement(parameters); - case util.AnnotationType.POPUP: - return new PopupAnnotationElement(parameters); - case util.AnnotationType.FREETEXT: - return new FreeTextAnnotationElement(parameters); - case util.AnnotationType.LINE: - return new LineAnnotationElement(parameters); - case util.AnnotationType.SQUARE: - return new SquareAnnotationElement(parameters); - case util.AnnotationType.CIRCLE: - return new CircleAnnotationElement(parameters); - case util.AnnotationType.POLYLINE: - return new PolylineAnnotationElement(parameters); - case util.AnnotationType.CARET: - return new CaretAnnotationElement(parameters); - case util.AnnotationType.INK: - return new InkAnnotationElement(parameters); - case util.AnnotationType.POLYGON: - return new PolygonAnnotationElement(parameters); - case util.AnnotationType.HIGHLIGHT: - return new HighlightAnnotationElement(parameters); - case util.AnnotationType.UNDERLINE: - return new UnderlineAnnotationElement(parameters); - case util.AnnotationType.SQUIGGLY: - return new SquigglyAnnotationElement(parameters); - case util.AnnotationType.STRIKEOUT: - return new StrikeOutAnnotationElement(parameters); - case util.AnnotationType.STAMP: - return new StampAnnotationElement(parameters); - case util.AnnotationType.FILEATTACHMENT: - return new FileAttachmentAnnotationElement(parameters); - default: - return new AnnotationElement(parameters); +function bytesToString(bytes) { + if (typeof bytes !== "object" || bytes?.length === undefined) { + unreachable("Invalid argument for bytesToString"); + } + const length = bytes.length; + const MAX_ARGUMENT_COUNT = 8192; + if (length < MAX_ARGUMENT_COUNT) { + return String.fromCharCode.apply(null, bytes); + } + const strBuf = []; + for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) { + const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); + const chunk = bytes.subarray(i, chunkEnd); + strBuf.push(String.fromCharCode.apply(null, chunk)); + } + return strBuf.join(""); +} +function stringToBytes(str) { + if (typeof str !== "string") { + unreachable("Invalid argument for stringToBytes"); + } + const length = str.length; + const bytes = new Uint8Array(length); + for (let i = 0; i < length; ++i) { + bytes[i] = str.charCodeAt(i) & 0xff; + } + return bytes; +} +function objectSize(obj) { + return Object.keys(obj).length; +} +class FeatureTest { + static get isLittleEndian() { + const buffer8 = new Uint8Array(4); + buffer8[0] = 1; + const view32 = new Uint32Array(buffer8.buffer, 0, 1); + return shadow(this, "isLittleEndian", view32[0] === 1); + } + static get isOffscreenCanvasSupported() { + return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined"); + } + static get isImageDecoderSupported() { + return shadow(this, "isImageDecoderSupported", typeof ImageDecoder !== "undefined"); + } + static get isFloat16ArraySupported() { + return shadow(this, "isFloat16ArraySupported", typeof Float16Array !== "undefined"); + } + static get isSanitizerSupported() { + return shadow(this, "isSanitizerSupported", typeof Sanitizer !== "undefined"); + } + static get platform() { + const { + platform, + userAgent + } = navigator; + return shadow(this, "platform", { + isAndroid: userAgent.includes("Android"), + isLinux: platform.includes("Linux"), + isMac: platform.includes("Mac"), + isWindows: platform.includes("Win"), + isFirefox: userAgent.includes("Firefox") + }); + } + static get isCanvasFilterSupported() { + let ctx; + if (this.isOffscreenCanvasSupported) { + ctx = new OffscreenCanvas(1, 1).getContext("2d"); + } else if (typeof document !== "undefined") { + ctx = document.createElement("canvas").getContext("2d"); + } + return shadow(this, "isCanvasFilterSupported", ctx?.filter !== undefined); + } + static get isAlphaColorInputSupported() { + if (typeof document === "undefined") { + return shadow(this, "isAlphaColorInputSupported", false); } + const input = document.createElement("input"); + input.type = "color"; + input.setAttribute("alpha", ""); + input.value = "#ff000080"; + return shadow(this, "isAlphaColorInputSupported", input.value !== "#ff0000"); + } + static get isBackdropFilterSupported() { + return shadow(this, "isBackdropFilterSupported", typeof CSS !== "undefined" && CSS.supports("backdrop-filter", "blur(1px)")); } } -class AnnotationElement { - #hasBorder = false; - constructor(parameters, { - isRenderable = false, - ignoreBorder = false, - createQuadrilaterals = false - } = {}) { - this.isRenderable = isRenderable; - this.data = parameters.data; - this.layer = parameters.layer; - this.linkService = parameters.linkService; - this.downloadManager = parameters.downloadManager; - this.imageResourcesPath = parameters.imageResourcesPath; - this.renderForms = parameters.renderForms; - this.svgFactory = parameters.svgFactory; - this.annotationStorage = parameters.annotationStorage; - this.enableScripting = parameters.enableScripting; - this.hasJSActions = parameters.hasJSActions; - this._fieldObjects = parameters.fieldObjects; - this.parent = parameters.parent; - if (isRenderable) { - this.container = this._createContainer(ignoreBorder); +class Util { + static get hexNums() { + return shadow(this, "hexNums", Array.from(Array(256).keys(), n => n.toString(16).padStart(2, "0"))); + } + static makeHexColor(r, g, b) { + return `#${this.hexNums[r]}${this.hexNums[g]}${this.hexNums[b]}`; + } + static transform(m1, m2) { + return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]]; + } + static multiplyByDOMMatrix(m, md) { + return [m[0] * md.a + m[2] * md.b, m[1] * md.a + m[3] * md.b, m[0] * md.c + m[2] * md.d, m[1] * md.c + m[3] * md.d, m[0] * md.e + m[2] * md.f + m[4], m[1] * md.e + m[3] * md.f + m[5]]; + } + static applyTransform(p, m, pos = 0) { + const p0 = p[pos]; + const p1 = p[pos + 1]; + p[pos] = p0 * m[0] + p1 * m[2] + m[4]; + p[pos + 1] = p0 * m[1] + p1 * m[3] + m[5]; + } + static applyTransformToBezier(p, transform, pos = 0) { + const m0 = transform[0]; + const m1 = transform[1]; + const m2 = transform[2]; + const m3 = transform[3]; + const m4 = transform[4]; + const m5 = transform[5]; + for (let i = 0; i < 6; i += 2) { + const pI = p[pos + i]; + const pI1 = p[pos + i + 1]; + p[pos + i] = pI * m0 + pI1 * m2 + m4; + p[pos + i + 1] = pI * m1 + pI1 * m3 + m5; } - if (createQuadrilaterals) { - this._createQuadrilaterals(); + } + static applyInverseTransform(p, m) { + const p0 = p[0]; + const p1 = p[1]; + const d = m[0] * m[3] - m[1] * m[2]; + p[0] = (p0 * m[3] - p1 * m[2] + m[2] * m[5] - m[4] * m[3]) / d; + p[1] = (-p0 * m[1] + p1 * m[0] + m[4] * m[1] - m[5] * m[0]) / d; + } + static axialAlignedBoundingBox(rect, transform, output) { + const m0 = transform[0]; + const m1 = transform[1]; + const m2 = transform[2]; + const m3 = transform[3]; + const m4 = transform[4]; + const m5 = transform[5]; + const r0 = rect[0]; + const r1 = rect[1]; + const r2 = rect[2]; + const r3 = rect[3]; + let a0 = m0 * r0 + m4; + let a2 = a0; + let a1 = m0 * r2 + m4; + let a3 = a1; + let b0 = m3 * r1 + m5; + let b2 = b0; + let b1 = m3 * r3 + m5; + let b3 = b1; + if (m1 !== 0 || m2 !== 0) { + const m1r0 = m1 * r0; + const m1r2 = m1 * r2; + const m2r1 = m2 * r1; + const m2r3 = m2 * r3; + a0 += m2r1; + a3 += m2r1; + a1 += m2r3; + a2 += m2r3; + b0 += m1r0; + b3 += m1r0; + b1 += m1r2; + b2 += m1r2; + } + output[0] = Math.min(output[0], a0, a1, a2, a3); + output[1] = Math.min(output[1], b0, b1, b2, b3); + output[2] = Math.max(output[2], a0, a1, a2, a3); + output[3] = Math.max(output[3], b0, b1, b2, b3); + } + static inverseTransform(m) { + const d = m[0] * m[3] - m[1] * m[2]; + return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; + } + static singularValueDecompose2dScale(matrix, output) { + const m0 = matrix[0]; + const m1 = matrix[1]; + const m2 = matrix[2]; + const m3 = matrix[3]; + const a = m0 ** 2 + m1 ** 2; + const b = m0 * m2 + m1 * m3; + const c = m2 ** 2 + m3 ** 2; + const first = (a + c) / 2; + const second = Math.sqrt(first ** 2 - (a * c - b ** 2)); + output[0] = Math.sqrt(first + second || 1); + output[1] = Math.sqrt(first - second || 1); + } + static normalizeRect(rect) { + const r = rect.slice(0); + if (rect[0] > rect[2]) { + r[0] = rect[2]; + r[2] = rect[0]; + } + if (rect[1] > rect[3]) { + r[1] = rect[3]; + r[3] = rect[1]; } + return r; } - static _hasPopupData({ - titleObj, - contentsObj, - richText - }) { - return !!(titleObj?.str || contentsObj?.str || richText?.str); + static intersect(rect1, rect2) { + const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2])); + const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2])); + if (xLow > xHigh) { + return null; + } + const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3])); + const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3])); + if (yLow > yHigh) { + return null; + } + return [xLow, yLow, xHigh, yHigh]; } - get hasPopupData() { - return AnnotationElement._hasPopupData(this.data); + static pointBoundingBox(x, y, minMax) { + minMax[0] = Math.min(minMax[0], x); + minMax[1] = Math.min(minMax[1], y); + minMax[2] = Math.max(minMax[2], x); + minMax[3] = Math.max(minMax[3], y); } - _createContainer(ignoreBorder) { - const { - data, - parent: { - page, - viewport + static rectBoundingBox(x0, y0, x1, y1, minMax) { + minMax[0] = Math.min(minMax[0], x0, x1); + minMax[1] = Math.min(minMax[1], y0, y1); + minMax[2] = Math.max(minMax[2], x0, x1); + minMax[3] = Math.max(minMax[3], y0, y1); + } + static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) { + if (t <= 0 || t >= 1) { + return; + } + const mt = 1 - t; + const tt = t * t; + const ttt = tt * t; + const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3; + const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3; + minMax[0] = Math.min(minMax[0], x); + minMax[1] = Math.min(minMax[1], y); + minMax[2] = Math.max(minMax[2], x); + minMax[3] = Math.max(minMax[3], y); + } + static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) { + if (Math.abs(a) < 1e-12) { + if (Math.abs(b) >= 1e-12) { + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, -c / b, minMax); } - } = this; - const container = document.createElement("section"); - container.setAttribute("data-annotation-id", data.id); - if (!(this instanceof WidgetAnnotationElement)) { - container.tabIndex = DEFAULT_TAB_INDEX; + return; } - container.style.zIndex = this.parent.zIndex++; - if (data.popupRef) { - container.setAttribute("aria-haspopup", "dialog"); + const delta = b ** 2 - 4 * c * a; + if (delta < 0) { + return; } - if (data.alternativeText) { - container.title = data.alternativeText; + const sqrtDelta = Math.sqrt(delta); + const a2 = 2 * a; + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b + sqrtDelta) / a2, minMax); + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b - sqrtDelta) / a2, minMax); + } + static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) { + minMax[0] = Math.min(minMax[0], x0, x3); + minMax[1] = Math.min(minMax[1], y0, y3); + minMax[2] = Math.max(minMax[2], x0, x3); + minMax[3] = Math.max(minMax[3], y0, y3); + this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-x0 + 3 * (x1 - x2) + x3), 6 * (x0 - 2 * x1 + x2), 3 * (x1 - x0), minMax); + this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-y0 + 3 * (y1 - y2) + y3), 6 * (y0 - 2 * y1 + y2), 3 * (y1 - y0), minMax); + } +} +function stringToUTF8String(str) { + return decodeURIComponent(escape(str)); +} +function utf8StringToString(str) { + return unescape(encodeURIComponent(str)); +} +function isArrayEqual(arr1, arr2) { + if (arr1.length !== arr2.length) { + return false; + } + for (let i = 0, ii = arr1.length; i < ii; i++) { + if (arr1[i] !== arr2[i]) { + return false; } - if (data.noRotate) { - container.classList.add("norotate"); + } + return true; +} +let NormalizeRegex = null; +let NormalizationMap = null; +function normalizeUnicode(str) { + if (!NormalizeRegex) { + NormalizeRegex = /([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu; + NormalizationMap = new Map([["ſt", "ſt"]]); + } + return str.replaceAll(NormalizeRegex, (_, p1, p2) => p1 ? p1.normalize("NFKC") : NormalizationMap.get(p2)); +} +function getUuid() { + if (typeof crypto.randomUUID === "function") { + return crypto.randomUUID(); + } + const buf = new Uint8Array(32); + crypto.getRandomValues(buf); + return bytesToString(buf); +} +function _isValidExplicitDest(validRef, validName, dest) { + if (!Array.isArray(dest) || dest.length < 2) { + return false; + } + const [page, zoom, ...args] = dest; + if (!validRef(page) && !Number.isInteger(page)) { + return false; + } + if (!validName(zoom)) { + return false; + } + const argsLen = args.length; + let allowNull = true; + switch (zoom.name) { + case "XYZ": + if (argsLen < 2 || argsLen > 3) { + return false; + } + break; + case "Fit": + case "FitB": + return argsLen === 0; + case "FitH": + case "FitBH": + case "FitV": + case "FitBV": + if (argsLen > 1) { + return false; + } + break; + case "FitR": + if (argsLen !== 4) { + return false; + } + allowNull = false; + break; + default: + return false; + } + for (const arg of args) { + if (typeof arg === "number" || allowNull && arg === null) { + continue; } - const { - pageWidth, - pageHeight, - pageX, - pageY - } = viewport.rawDims; - if (!data.rect || this instanceof PopupAnnotationElement) { - const { - rotation - } = data; - if (!data.hasOwnCanvas && rotation !== 0) { - this.setRotation(rotation, container); + return false; + } + return true; +} +const makeArr = () => []; +const makeMap = () => new Map(); +const makeObj = () => Object.create(null); + +;// ./src/shared/math_clamp.js +function MathClamp(v, min, max) { + return Math.min(Math.max(v, min), max); +} + +;// ./src/display/page_viewport.js + +class PageViewport { + constructor({ + viewBox, + userUnit, + scale, + rotation, + offsetX = 0, + offsetY = 0, + dontFlip = false + }) { + this.viewBox = viewBox; + this.userUnit = userUnit; + this.scale = scale; + this.rotation = rotation; + this.offsetX = offsetX; + this.offsetY = offsetY; + scale *= userUnit; + const centerX = (viewBox[2] + viewBox[0]) / 2; + const centerY = (viewBox[3] + viewBox[1]) / 2; + let rotateA, rotateB, rotateC, rotateD; + rotation %= 360; + if (rotation < 0) { + rotation += 360; + } + switch (rotation) { + case 180: + rotateA = -1; + rotateB = 0; + rotateC = 0; + rotateD = 1; + break; + case 90: + rotateA = 0; + rotateB = 1; + rotateC = 1; + rotateD = 0; + break; + case 270: + rotateA = 0; + rotateB = -1; + rotateC = -1; + rotateD = 0; + break; + case 0: + rotateA = 1; + rotateB = 0; + rotateC = 0; + rotateD = -1; + break; + default: + throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees."); + } + if (dontFlip) { + rotateC = -rotateC; + rotateD = -rotateD; + } + let offsetCanvasX, offsetCanvasY; + let width, height; + if (rotateA === 0) { + offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; + offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; + width = (viewBox[3] - viewBox[1]) * scale; + height = (viewBox[2] - viewBox[0]) * scale; + } else { + offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; + offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; + width = (viewBox[2] - viewBox[0]) * scale; + height = (viewBox[3] - viewBox[1]) * scale; + } + this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY]; + this.width = width; + this.height = height; + } + get rawDims() { + const dims = this.viewBox; + return shadow(this, "rawDims", { + pageWidth: dims[2] - dims[0], + pageHeight: dims[3] - dims[1], + pageX: dims[0], + pageY: dims[1] + }); + } + clone({ + scale = this.scale, + rotation = this.rotation, + offsetX = this.offsetX, + offsetY = this.offsetY, + dontFlip = false + } = {}) { + return new PageViewport({ + viewBox: this.viewBox.slice(), + userUnit: this.userUnit, + scale, + rotation, + offsetX, + offsetY, + dontFlip + }); + } + convertToViewportPoint(x, y) { + const p = [x, y]; + Util.applyTransform(p, this.transform); + return p; + } + convertToPdfPoint(x, y) { + const p = [x, y]; + Util.applyInverseTransform(p, this.transform); + return p; + } +} + +;// ./src/display/xfa_text.js +class XfaText { + static textContent(xfa) { + const items = []; + const output = { + items, + styles: Object.create(null) + }; + function walk(node) { + if (!node) { + return; + } + let str = null; + const name = node.name; + if (name === "#text") { + str = node.value; + } else if (!XfaText.shouldBuildText(name)) { + return; + } else if (node?.attributes?.textContent) { + str = node.attributes.textContent; + } else if (node.value) { + str = node.value; + } + if (str !== null) { + items.push({ + str + }); + } + if (!node.children) { + return; + } + for (const child of node.children) { + walk(child); } - return container; } + walk(xfa); + return output; + } + static shouldBuildText(name) { + return !(name === "textarea" || name === "input" || name === "option" || name === "select"); + } +} + +;// ./src/display/xfa_layer.js + + +class XfaLayer { + static setupStorage(html, id, element, storage, intent) { + const storedData = storage.getValue(id, { + value: null + }); + switch (element.name) { + case "textarea": + if (storedData.value !== null) { + html.textContent = storedData.value; + } + if (intent === "print") { + break; + } + html.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + }); + break; + case "input": + if (element.attributes.type === "radio" || element.attributes.type === "checkbox") { + if (storedData.value === element.attributes.xfaOn) { + html.setAttribute("checked", true); + } else if (storedData.value === element.attributes.xfaOff) { + html.removeAttribute("checked"); + } + if (intent === "print") { + break; + } + html.addEventListener("change", event => { + storage.setValue(id, { + value: event.target.checked ? event.target.getAttribute("xfaOn") : event.target.getAttribute("xfaOff") + }); + }); + } else { + if (storedData.value !== null) { + html.setAttribute("value", storedData.value); + } + if (intent === "print") { + break; + } + html.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + }); + } + break; + case "select": + if (storedData.value !== null) { + html.setAttribute("value", storedData.value); + for (const option of element.children) { + if (option.attributes.value === storedData.value) { + option.attributes.selected = true; + } else if (Object.hasOwn(option.attributes, "selected")) { + delete option.attributes.selected; + } + } + } + html.addEventListener("input", event => { + const options = event.target.options; + const value = options.selectedIndex === -1 ? "" : options[options.selectedIndex].value; + storage.setValue(id, { + value + }); + }); + break; + } + } + static setAttributes({ + html, + element, + storage = null, + intent, + linkService + }) { const { - width, - height - } = getRectDims(data.rect); - const rect = util.Util.normalizeRect([data.rect[0], page.view[3] - data.rect[1] + page.view[1], data.rect[2], page.view[3] - data.rect[3] + page.view[1]]); - if (!ignoreBorder && data.borderStyle.width > 0) { - container.style.borderWidth = `${data.borderStyle.width}px`; - const horizontalRadius = data.borderStyle.horizontalCornerRadius; - const verticalRadius = data.borderStyle.verticalCornerRadius; - if (horizontalRadius > 0 || verticalRadius > 0) { - const radius = `calc(${horizontalRadius}px * var(--scale-factor)) / calc(${verticalRadius}px * var(--scale-factor))`; - container.style.borderRadius = radius; - } else if (this instanceof RadioButtonWidgetAnnotationElement) { - const radius = `calc(${width}px * var(--scale-factor)) / calc(${height}px * var(--scale-factor))`; - container.style.borderRadius = radius; + attributes + } = element; + const isHTMLAnchorElement = html instanceof HTMLAnchorElement; + if (attributes.type === "radio") { + attributes.name = `${attributes.name}-${intent}`; + } + for (const [key, value] of Object.entries(attributes)) { + if (value === null || value === undefined) { + continue; } - switch (data.borderStyle.style) { - case util.AnnotationBorderStyleType.SOLID: - container.style.borderStyle = "solid"; + switch (key) { + case "class": + if (value.length) { + html.setAttribute(key, value.join(" ")); + } break; - case util.AnnotationBorderStyleType.DASHED: - container.style.borderStyle = "dashed"; + case "dataId": break; - case util.AnnotationBorderStyleType.BEVELED: - (0,util.warn)("Unimplemented border style: beveled"); + case "id": + html.setAttribute("data-element-id", value); break; - case util.AnnotationBorderStyleType.INSET: - (0,util.warn)("Unimplemented border style: inset"); + case "style": + Object.assign(html.style, value); break; - case util.AnnotationBorderStyleType.UNDERLINE: - container.style.borderBottomStyle = "solid"; + case "textContent": + html.textContent = value; break; default: - break; + if (!isHTMLAnchorElement || key !== "href" && key !== "newWindow") { + html.setAttribute(key, value); + } } - const borderColor = data.borderColor || null; - if (borderColor) { - this.#hasBorder = true; - container.style.borderColor = util.Util.makeHexColor(borderColor[0] | 0, borderColor[1] | 0, borderColor[2] | 0); - } else { - container.style.borderWidth = 0; + } + if (isHTMLAnchorElement) { + linkService.addLinkAttributes(html, attributes.href, attributes.newWindow); + } + if (storage && attributes.dataId) { + this.setupStorage(html, attributes.dataId, element, storage); + } + } + static render(parameters) { + const storage = parameters.annotationStorage; + const linkService = parameters.linkService; + const root = parameters.xfaHtml; + const intent = parameters.intent || "display"; + const rootHtml = document.createElement(root.name); + if (root.attributes) { + this.setAttributes({ + html: rootHtml, + element: root, + intent, + linkService + }); + } + const isNotForRichText = intent !== "richText"; + const rootDiv = parameters.div; + rootDiv.append(rootHtml); + if (parameters.viewport) { + const transform = `matrix(${parameters.viewport.transform.join(",")})`; + rootDiv.style.transform = transform; + } + if (isNotForRichText) { + rootDiv.setAttribute("class", "xfaLayer xfaFont"); + } + const textDivs = []; + if (root.children.length === 0) { + if (root.value) { + const node = document.createTextNode(root.value); + rootHtml.append(node); + if (isNotForRichText && XfaText.shouldBuildText(root.name)) { + textDivs.push(node); + } + } + return { + textDivs + }; + } + const stack = [[root, -1, rootHtml]]; + while (stack.length > 0) { + const [parent, i, html] = stack.at(-1); + if (i + 1 === parent.children.length) { + stack.pop(); + continue; + } + const child = parent.children[++stack.at(-1)[1]]; + if (child === null) { + continue; + } + const { + name + } = child; + if (name === "#text") { + const node = document.createTextNode(child.value); + textDivs.push(node); + html.append(node); + continue; + } + const childHtml = child?.attributes?.xmlns ? document.createElementNS(child.attributes.xmlns, name) : document.createElement(name); + html.append(childHtml); + if (child.attributes) { + this.setAttributes({ + html: childHtml, + element: child, + storage, + intent, + linkService + }); + } + if (child.children?.length > 0) { + stack.push([child, -1, childHtml]); + } else if (child.value) { + const node = document.createTextNode(child.value); + if (isNotForRichText && XfaText.shouldBuildText(name)) { + textDivs.push(node); + } + childHtml.append(node); } } - container.style.left = `${100 * (rect[0] - pageX) / pageWidth}%`; - container.style.top = `${100 * (rect[1] - pageY) / pageHeight}%`; + for (const el of rootDiv.querySelectorAll(".xfaNonInteractive input, .xfaNonInteractive textarea")) { + el.setAttribute("readOnly", true); + } + return { + textDivs + }; + } + static update(parameters) { + const transform = `matrix(${parameters.viewport.transform.join(",")})`; + parameters.div.style.transform = transform; + parameters.div.hidden = false; + } + static getPageViewport(xfaPage, { + scale = 1, + rotation = 0 + }) { const { + width, + height + } = xfaPage.attributes.style; + return new PageViewport({ + viewBox: [0, 0, parseInt(width, 10), parseInt(height, 10)], + userUnit: 1, + scale, rotation - } = data; - if (data.hasOwnCanvas || rotation === 0) { - container.style.width = `${100 * width / pageWidth}%`; - container.style.height = `${100 * height / pageHeight}%`; - } else { - this.setRotation(rotation, container); + }); + } +} + +;// ./src/display/display_utils.js + + + + +class PixelsPerInch { + static CSS = 96.0; + static PDF = 72.0; + static PDF_TO_CSS_UNITS = this.CSS / this.PDF; +} +async function fetchData(url, type = "text") { + if (isValidFetchUrl(url, document.baseURI)) { + const response = await fetch(url); + if (!response.ok) { + throw new Error(response.statusText); } - return container; + switch (type) { + case "blob": + return response.blob(); + case "bytes": + return response.bytes(); + case "json": + return response.json(); + } + return response.text(); } - setRotation(angle, container = this.container) { - if (!this.data.rect) { - return; + return new Promise((resolve, reject) => { + const request = new XMLHttpRequest(); + request.open("GET", url, true); + request.responseType = type === "bytes" ? "arraybuffer" : type; + request.onreadystatechange = () => { + if (request.readyState !== XMLHttpRequest.DONE) { + return; + } + if (request.status === 200 || request.status === 0) { + switch (type) { + case "bytes": + resolve(new Uint8Array(request.response)); + return; + case "blob": + case "json": + resolve(request.response); + return; + } + resolve(request.responseText); + return; + } + reject(new Error(request.statusText)); + }; + request.send(null); + }); +} +class RenderingCancelledException extends BaseException { + constructor(msg, extraDelay = 0) { + super(msg, "RenderingCancelledException"); + this.extraDelay = extraDelay; + } +} +function isDataScheme(url) { + const ii = url.length; + let i = 0; + while (i < ii && url[i].trim() === "") { + i++; + } + return url.substring(i, i + 5).toLowerCase() === "data:"; +} +function isPdfFile(filename) { + return typeof filename === "string" && /\.pdf$/i.test(filename); +} +function getFilenameFromUrl(url) { + [url] = url.split(/[#?]/, 1); + return stripPath(url); +} +function getPdfFilenameFromUrl(url, defaultFilename = "document.pdf") { + if (typeof url !== "string") { + return defaultFilename; + } + if (isDataScheme(url)) { + warn('getPdfFilenameFromUrl: ignore "data:"-URL for performance reasons.'); + return defaultFilename; + } + const getURL = urlString => { + try { + return new URL(urlString); + } catch {} + try { + return new URL(decodeURIComponent(urlString)); + } catch {} + try { + return new URL(urlString, "https://foo.bar"); + } catch {} + try { + return new URL(decodeURIComponent(urlString), "https://foo.bar"); + } catch {} + return null; + }; + const newURL = getURL(url); + if (!newURL) { + return defaultFilename; + } + const decode = name => { + try { + let decoded = decodeURIComponent(name); + if (decoded.includes("/")) { + decoded = stripPath(decoded); + if (decoded.length === 4 && pdfRegex.test(decoded)) { + return name; + } + } + return decoded; + } catch { + return name; + } + }; + const pdfRegex = /\.pdf$/i; + const filename = stripPath(newURL.pathname); + if (pdfRegex.test(filename)) { + return decode(filename); + } + if (newURL.searchParams.size > 0) { + const getLast = iterator => [...iterator].findLast(v => pdfRegex.test(v)); + const name = getLast(newURL.searchParams.values()) ?? getLast(newURL.searchParams.keys()); + if (name) { + return decode(name); + } + } + if (newURL.hash) { + const reFilename = /[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i; + const hashFilename = reFilename.exec(newURL.hash); + if (hashFilename) { + return decode(hashFilename[0]); + } + } + return defaultFilename; +} +class StatTimer { + #started = new Map(); + times = []; + time(name) { + if (this.#started.has(name)) { + warn(`Timer is already running for ${name}`); } + this.#started.set(name, Date.now()); + } + timeEnd(name) { + if (!this.#started.has(name)) { + warn(`Timer has not been started for ${name}`); + } + this.times.push({ + name, + start: this.#started.get(name), + end: Date.now() + }); + this.#started.delete(name); + } + toString() { + const longest = Math.max(...this.times.map(t => t.name.length)); + return this.times.map(t => `${t.name.padEnd(longest)} ${t.end - t.start}ms\n`).join(""); + } +} +function isValidFetchUrl(url, baseUrl) { + const res = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url); + return /https?:/.test(res?.protocol ?? ""); +} +function noContextMenu(e) { + e.preventDefault(); +} +function stopEvent(e) { + e.preventDefault(); + e.stopPropagation(); +} +function deprecated(details) { + console.log("Deprecated API usage: " + details); +} +class PDFDateString { + static #regex; + static toDateObject(input) { + if (input instanceof Date) { + return input; + } + if (!input || typeof input !== "string") { + return null; + } + this.#regex ||= new RegExp("^D:" + "(\\d{4})" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "([Z|+\\-])?" + "(\\d{2})?" + "'?" + "(\\d{2})?" + "'?"); + const matches = this.#regex.exec(input); + if (!matches) { + return null; + } + const year = parseInt(matches[1], 10); + let month = parseInt(matches[2], 10); + month = month >= 1 && month <= 12 ? month - 1 : 0; + let day = parseInt(matches[3], 10); + day = day >= 1 && day <= 31 ? day : 1; + let hour = parseInt(matches[4], 10); + hour = hour >= 0 && hour <= 23 ? hour : 0; + let minute = parseInt(matches[5], 10); + minute = minute >= 0 && minute <= 59 ? minute : 0; + let second = parseInt(matches[6], 10); + second = second >= 0 && second <= 59 ? second : 0; + const universalTimeRelation = matches[7] || "Z"; + let offsetHour = parseInt(matches[8], 10); + offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0; + let offsetMinute = parseInt(matches[9], 10) || 0; + offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0; + if (universalTimeRelation === "-") { + hour += offsetHour; + minute += offsetMinute; + } else if (universalTimeRelation === "+") { + hour -= offsetHour; + minute -= offsetMinute; + } + return new Date(Date.UTC(year, month, day, hour, minute, second)); + } +} +function getRGBA(color) { + if (color.startsWith("#")) { + const hex = color.slice(1); + return [parseInt(hex.slice(0, 2), 16), parseInt(hex.slice(2, 4), 16), parseInt(hex.slice(4, 6), 16), hex.length >= 8 ? parseInt(hex.slice(6, 8), 16) / 255 : 1]; + } + if (color.startsWith("rgb(")) { + const [r, g, b] = color.slice(4, -1).split(",").map(x => parseInt(x, 10)); + return [r, g, b, 1]; + } + if (color.startsWith("rgba(")) { + const parts = color.slice(5, -1).split(","); + return [parseInt(parts[0], 10), parseInt(parts[1], 10), parseInt(parts[2], 10), parseFloat(parts[3])]; + } + const m = color.match(/^color\(srgb\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)(?:\s*\/\s*([\d.]+|none))?\)$/); + if (m) { + return [Math.round(parseFloat(m[1]) * 255), Math.round(parseFloat(m[2]) * 255), Math.round(parseFloat(m[3]) * 255), m[4] !== undefined && m[4] !== "none" ? parseFloat(m[4]) : 1]; + } + return null; +} +function getRGB(color) { + const rgba = getRGBA(color); + if (!rgba) { + warn(`Not a valid color format: "${color}"`); + return [0, 0, 0]; + } + return rgba.slice(0, 3); +} +function getColorValues(colors) { + const span = document.createElement("span"); + span.style.visibility = "hidden"; + span.style.colorScheme = "only light"; + document.body.append(span); + for (const name of colors.keys()) { + span.style.color = name; + const computedColor = window.getComputedStyle(span).color; + colors.set(name, getRGB(computedColor)); + } + span.remove(); +} +function getCurrentTransform(ctx) { + const { + a, + b, + c, + d, + e, + f + } = ctx.getTransform(); + return [a, b, c, d, e, f]; +} +function getCurrentTransformInverse(ctx) { + const { + a, + b, + c, + d, + e, + f + } = ctx.getTransform().invertSelf(); + return [a, b, c, d, e, f]; +} +function setLayerDimensions(div, viewport, mustFlip = false, mustRotate = true) { + if (viewport instanceof PageViewport) { const { pageWidth, pageHeight - } = this.parent.viewport.rawDims; + } = viewport.rawDims; const { - width, - height - } = getRectDims(this.data.rect); - let elementWidth, elementHeight; - if (angle % 180 === 0) { - elementWidth = 100 * width / pageWidth; - elementHeight = 100 * height / pageHeight; + style + } = div; + const widthStr = `round(down, var(--total-scale-factor) * ${pageWidth}px, var(--scale-round-x))`, + heightStr = `round(down, var(--total-scale-factor) * ${pageHeight}px, var(--scale-round-y))`; + if (!mustFlip || viewport.rotation % 180 === 0) { + style.width = widthStr; + style.height = heightStr; } else { - elementWidth = 100 * height / pageWidth; - elementHeight = 100 * width / pageHeight; + style.width = heightStr; + style.height = widthStr; } - container.style.width = `${elementWidth}%`; - container.style.height = `${elementHeight}%`; - container.setAttribute("data-main-rotation", (360 - angle) % 360); } - get _commonActions() { - const setColor = (jsName, styleName, event) => { - const color = event.detail[jsName]; - const colorType = color[0]; - const colorArray = color.slice(1); - event.target.style[styleName] = ColorConverters[`${colorType}_HTML`](colorArray); - this.annotationStorage.setValue(this.data.id, { - [styleName]: ColorConverters[`${colorType}_rgb`](colorArray) - }); - }; - return (0,util.shadow)(this, "_commonActions", { - display: event => { - const { - display - } = event.detail; - const hidden = display % 2 === 1; - this.container.style.visibility = hidden ? "hidden" : "visible"; - this.annotationStorage.setValue(this.data.id, { - noView: hidden, - noPrint: display === 1 || display === 2 - }); - }, - print: event => { - this.annotationStorage.setValue(this.data.id, { - noPrint: !event.detail.print - }); - }, - hidden: event => { - const { - hidden - } = event.detail; - this.container.style.visibility = hidden ? "hidden" : "visible"; - this.annotationStorage.setValue(this.data.id, { - noPrint: hidden, - noView: hidden - }); - }, - focus: event => { - setTimeout(() => event.target.focus({ - preventScroll: false - }), 0); - }, - userName: event => { - event.target.title = event.detail.userName; - }, - readonly: event => { - event.target.disabled = event.detail.readonly; - }, - required: event => { - this._setRequired(event.target, event.detail.required); - }, - bgColor: event => { - setColor("bgColor", "backgroundColor", event); - }, - fillColor: event => { - setColor("fillColor", "backgroundColor", event); - }, - fgColor: event => { - setColor("fgColor", "color", event); - }, - textColor: event => { - setColor("textColor", "color", event); - }, - borderColor: event => { - setColor("borderColor", "borderColor", event); - }, - strokeColor: event => { - setColor("strokeColor", "borderColor", event); - }, - rotation: event => { - const angle = event.detail.rotation; - this.setRotation(angle); - this.annotationStorage.setValue(this.data.id, { - rotation: angle - }); + if (mustRotate) { + div.setAttribute("data-main-rotation", viewport.rotation); + } +} +class OutputScale { + constructor() { + const { + pixelRatio + } = OutputScale; + this.sx = pixelRatio; + this.sy = pixelRatio; + } + get scaled() { + return this.sx !== 1 || this.sy !== 1; + } + get symmetric() { + return this.sx === this.sy; + } + limitCanvas(width, height, maxPixels, maxDim, capAreaFactor = -1) { + let maxAreaScale = Infinity, + maxWidthScale = Infinity, + maxHeightScale = Infinity; + maxPixels = OutputScale.capPixels(maxPixels, capAreaFactor); + if (maxPixels > 0) { + maxAreaScale = Math.sqrt(maxPixels / (width * height)); + } + if (maxDim !== -1) { + maxWidthScale = maxDim / width; + maxHeightScale = maxDim / height; + } + const maxScale = Math.min(maxAreaScale, maxWidthScale, maxHeightScale); + if (this.sx > maxScale || this.sy > maxScale) { + this.sx = maxScale; + this.sy = maxScale; + return true; + } + return false; + } + static get pixelRatio() { + return globalThis.devicePixelRatio || 1; + } + static capPixels(maxPixels, capAreaFactor) { + if (capAreaFactor >= 0) { + const winPixels = Math.ceil(window.screen.availWidth * window.screen.availHeight * this.pixelRatio ** 2 * (1 + capAreaFactor / 100)); + return maxPixels > 0 ? Math.min(maxPixels, winPixels) : winPixels; + } + return maxPixels; + } +} +const SupportedImageMimeTypes = ["image/apng", "image/avif", "image/bmp", "image/gif", "image/jpeg", "image/png", "image/svg+xml", "image/webp", "image/x-icon"]; +class ColorScheme { + static get isDarkMode() { + return shadow(this, "isDarkMode", !!window?.matchMedia?.("(prefers-color-scheme: dark)").matches); + } +} +class CSSConstants { + static get commentForegroundColor() { + const element = document.createElement("span"); + element.classList.add("comment", "sidebar"); + const { + style + } = element; + style.width = style.height = "0"; + style.display = "none"; + style.color = "var(--comment-fg-color)"; + document.body.append(element); + const { + color + } = window.getComputedStyle(element); + element.remove(); + return shadow(this, "commentForegroundColor", getRGB(color)); + } +} +function applyOpacity(color, opacity) { + opacity = MathClamp(opacity ?? 1, 0, 1); + const white = 255 * (1 - opacity); + return color.map(c => Math.round(c * opacity + white)); +} +function RGBToHSL(rgb, output) { + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + const l = (max + min) / 2; + if (max === min) { + output[0] = output[1] = 0; + } else { + const d = max - min; + output[1] = l < 0.5 ? d / (max + min) : d / (2 - max - min); + switch (max) { + case r: + output[0] = ((g - b) / d + (g < b ? 6 : 0)) * 60; + break; + case g: + output[0] = ((b - r) / d + 2) * 60; + break; + case b: + output[0] = ((r - g) / d + 4) * 60; + break; + } + } + output[2] = l; +} +function HSLToRGB(hsl, output) { + const h = hsl[0]; + const s = hsl[1]; + const l = hsl[2]; + const c = (1 - Math.abs(2 * l - 1)) * s; + const x = c * (1 - Math.abs(h / 60 % 2 - 1)); + const m = l - c / 2; + switch (Math.floor(h / 60)) { + case 0: + output[0] = c + m; + output[1] = x + m; + output[2] = m; + break; + case 1: + output[0] = x + m; + output[1] = c + m; + output[2] = m; + break; + case 2: + output[0] = m; + output[1] = c + m; + output[2] = x + m; + break; + case 3: + output[0] = m; + output[1] = x + m; + output[2] = c + m; + break; + case 4: + output[0] = x + m; + output[1] = m; + output[2] = c + m; + break; + case 5: + case 6: + output[0] = c + m; + output[1] = m; + output[2] = x + m; + break; + } +} +function computeLuminance(x) { + return x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4; +} +function contrastRatio(hsl1, hsl2, output) { + HSLToRGB(hsl1, output); + output.map(computeLuminance); + const lum1 = 0.2126 * output[0] + 0.7152 * output[1] + 0.0722 * output[2]; + HSLToRGB(hsl2, output); + output.map(computeLuminance); + const lum2 = 0.2126 * output[0] + 0.7152 * output[1] + 0.0722 * output[2]; + return lum1 > lum2 ? (lum1 + 0.05) / (lum2 + 0.05) : (lum2 + 0.05) / (lum1 + 0.05); +} +const contrastCache = new Map(); +function findContrastColor(baseColor, fixedColor) { + const key = baseColor[0] + baseColor[1] * 0x100 + baseColor[2] * 0x10000 + fixedColor[0] * 0x1000000 + fixedColor[1] * 0x100000000 + fixedColor[2] * 0x10000000000; + let cachedValue = contrastCache.get(key); + if (cachedValue) { + return cachedValue; + } + const array = new Float32Array(9); + const output = array.subarray(0, 3); + const baseHSL = array.subarray(3, 6); + RGBToHSL(baseColor, baseHSL); + const fixedHSL = array.subarray(6, 9); + RGBToHSL(fixedColor, fixedHSL); + const isFixedColorDark = fixedHSL[2] < 0.5; + const minContrast = isFixedColorDark ? 12 : 4.5; + baseHSL[2] = isFixedColorDark ? Math.sqrt(baseHSL[2]) : 1 - Math.sqrt(1 - baseHSL[2]); + if (contrastRatio(baseHSL, fixedHSL, output) < minContrast) { + let start, end; + if (isFixedColorDark) { + start = baseHSL[2]; + end = 1; + } else { + start = 0; + end = baseHSL[2]; + } + const PRECISION = 0.005; + while (end - start > PRECISION) { + const mid = baseHSL[2] = (start + end) / 2; + if (isFixedColorDark === contrastRatio(baseHSL, fixedHSL, output) < minContrast) { + start = mid; + } else { + end = mid; } + } + baseHSL[2] = isFixedColorDark ? end : start; + } + HSLToRGB(baseHSL, output); + cachedValue = Util.makeHexColor(Math.round(output[0] * 255), Math.round(output[1] * 255), Math.round(output[2] * 255)); + contrastCache.set(key, cachedValue); + return cachedValue; +} +function renderRichText({ + html, + dir, + className +}, container) { + const fragment = document.createDocumentFragment(); + if (typeof html === "string") { + const p = document.createElement("p"); + p.dir = dir || "auto"; + const lines = html.split(/\r\n?|\n/); + for (let i = 0, ii = lines.length; i < ii; ++i) { + const line = lines[i]; + p.append(document.createTextNode(line)); + if (i < ii - 1) { + p.append(document.createElement("br")); + } + } + fragment.append(p); + } else { + XfaLayer.render({ + xfaHtml: html, + div: fragment, + intent: "richText" }); } - _dispatchEventFromSandbox(actions, jsEvent) { - const commonActions = this._commonActions; - for (const name of Object.keys(jsEvent.detail)) { - const action = actions[name] || commonActions[name]; - action?.(jsEvent); + fragment.firstElementChild.classList.add("richText", className); + container.append(fragment); +} +function makePathFromDrawOPS(data) { + const path = new Path2D(); + if (!data) { + return path; + } + for (let i = 0, ii = data.length; i < ii;) { + switch (data[i++]) { + case DrawOPS.moveTo: + path.moveTo(data[i++], data[i++]); + break; + case DrawOPS.lineTo: + path.lineTo(data[i++], data[i++]); + break; + case DrawOPS.curveTo: + path.bezierCurveTo(data[i++], data[i++], data[i++], data[i++], data[i++], data[i++]); + break; + case DrawOPS.quadraticCurveTo: + path.quadraticCurveTo(data[i++], data[i++], data[i++], data[i++]); + break; + case DrawOPS.closePath: + path.closePath(); + break; + default: + warn(`Unrecognized drawing path operator: ${data[i - 1]}`); + break; } } - _setDefaultPropertiesFromJS(element) { - if (!this.enableScripting) { + return path; +} + +;// ./src/display/editor/toolbar.js + +class EditorToolbar { + #toolbar = null; + #colorPicker = null; + #editor; + #buttons = null; + #altText = null; + #comment = null; + #commentButtonDivider = null; + #signatureDescriptionButton = null; + static #l10nRemove = null; + constructor(editor) { + this.#editor = editor; + EditorToolbar.#l10nRemove ||= Object.freeze({ + freetext: "pdfjs-editor-remove-freetext-button", + highlight: "pdfjs-editor-remove-highlight-button", + ink: "pdfjs-editor-remove-ink-button", + stamp: "pdfjs-editor-remove-stamp-button", + signature: "pdfjs-editor-remove-signature-button" + }); + } + render() { + const editToolbar = this.#toolbar = document.createElement("div"); + editToolbar.classList.add("editToolbar", "hidden"); + editToolbar.setAttribute("role", "toolbar"); + const signal = this.#editor._uiManager._signal; + if (signal instanceof AbortSignal && !signal.aborted) { + editToolbar.addEventListener("contextmenu", noContextMenu, { + signal + }); + editToolbar.addEventListener("pointerdown", EditorToolbar.#pointerDown, { + signal + }); + } + const buttons = this.#buttons = document.createElement("div"); + buttons.className = "buttons"; + editToolbar.append(buttons); + const position = this.#editor.toolbarPosition; + if (position) { + const { + style + } = editToolbar; + const x = this.#editor._uiManager.direction === "ltr" ? 1 - position[0] : position[0]; + style.insetInlineEnd = `${100 * x}%`; + style.top = `calc(${100 * position[1]}% + var(--editor-toolbar-vert-offset))`; + } + return editToolbar; + } + get div() { + return this.#toolbar; + } + static #pointerDown(e) { + e.stopPropagation(); + } + #focusIn(e) { + this.#editor._focusEventsAllowed = false; + stopEvent(e); + } + #focusOut(e) { + this.#editor._focusEventsAllowed = true; + stopEvent(e); + } + #addListenersToElement(element) { + const signal = this.#editor._uiManager._signal; + if (!(signal instanceof AbortSignal) || signal.aborted) { + return false; + } + element.addEventListener("focusin", this.#focusIn.bind(this), { + capture: true, + signal + }); + element.addEventListener("focusout", this.#focusOut.bind(this), { + capture: true, + signal + }); + element.addEventListener("contextmenu", noContextMenu, { + signal + }); + return true; + } + hide() { + this.#toolbar.classList.add("hidden"); + this.#colorPicker?.hideDropdown(); + } + show() { + this.#toolbar.classList.remove("hidden"); + this.#altText?.shown(); + this.#comment?.shown(); + } + addDeleteButton() { + const { + editorType, + _uiManager + } = this.#editor; + const button = document.createElement("button"); + button.classList.add("basic", "deleteButton"); + button.tabIndex = 0; + button.setAttribute("data-l10n-id", EditorToolbar.#l10nRemove[editorType]); + if (this.#addListenersToElement(button)) { + button.addEventListener("click", e => { + _uiManager.delete(); + }, { + signal: _uiManager._signal + }); + } + this.#buttons.append(button); + } + get #divider() { + const divider = document.createElement("div"); + divider.className = "divider"; + return divider; + } + async addAltText(altText) { + const button = await altText.render(); + this.#addListenersToElement(button); + this.#buttons.append(button, this.#divider); + this.#altText = altText; + } + addComment(comment, beforeElement = null) { + if (this.#comment) { return; } - const storedData = this.annotationStorage.getRawValue(this.data.id); - if (!storedData) { + const button = comment.renderForToolbar(); + if (!button) { return; } - const commonActions = this._commonActions; - for (const [actionName, detail] of Object.entries(storedData)) { - const action = commonActions[actionName]; - if (action) { - const eventProxy = { - detail: { - [actionName]: detail - }, - target: element - }; - action(eventProxy); - delete storedData[actionName]; - } + this.#addListenersToElement(button); + const divider = this.#commentButtonDivider = this.#divider; + if (!beforeElement) { + this.#buttons.append(button, divider); + } else { + this.#buttons.insertBefore(button, beforeElement); + this.#buttons.insertBefore(divider, beforeElement); } + this.#comment = comment; + comment.toolbar = this; } - _createQuadrilaterals() { - if (!this.container) { + addColorPicker(colorPicker) { + if (this.#colorPicker) { return; } - const { - quadPoints - } = this.data; - if (!quadPoints) { + this.#colorPicker = colorPicker; + const button = colorPicker.renderButton(); + this.#addListenersToElement(button); + this.#buttons.append(button, this.#divider); + } + async addEditSignatureButton(signatureManager) { + const button = this.#signatureDescriptionButton = await signatureManager.renderEditButton(this.#editor); + this.#addListenersToElement(button); + this.#buttons.append(button, this.#divider); + } + removeButton(name) { + switch (name) { + case "comment": + this.#comment?.removeToolbarCommentButton(); + this.#comment = null; + this.#commentButtonDivider?.remove(); + this.#commentButtonDivider = null; + break; + } + } + async addButton(name, tool) { + switch (name) { + case "colorPicker": + if (tool) { + this.addColorPicker(tool); + } + break; + case "altText": + if (tool) { + await this.addAltText(tool); + } + break; + case "editSignature": + if (tool) { + await this.addEditSignatureButton(tool); + } + break; + case "delete": + this.addDeleteButton(); + break; + case "comment": + if (tool) { + this.addComment(tool); + } + break; + } + } + async addButtonBefore(name, tool, beforeSelector) { + if (!tool && name === "comment") { return; } - const [rectBlX, rectBlY, rectTrX, rectTrY] = this.data.rect; - if (quadPoints.length === 1) { - const [, { - x: trX, - y: trY - }, { - x: blX, - y: blY - }] = quadPoints[0]; - if (rectTrX === trX && rectTrY === trY && rectBlX === blX && rectBlY === blY) { - return; + const beforeElement = this.#buttons.querySelector(beforeSelector); + if (!beforeElement) { + return; + } + if (name === "comment") { + this.addComment(tool, beforeElement); + } + } + updateEditSignatureButton(description) { + if (this.#signatureDescriptionButton) { + this.#signatureDescriptionButton.title = description; + } + } + remove() { + this.#toolbar.remove(); + this.#colorPicker?.destroy(); + this.#colorPicker = null; + } +} +class FloatingToolbar { + #buttons = null; + #toolbar = null; + #uiManager; + constructor(uiManager) { + this.#uiManager = uiManager; + } + #render() { + const editToolbar = this.#toolbar = document.createElement("div"); + editToolbar.className = "editToolbar"; + editToolbar.setAttribute("role", "toolbar"); + const signal = this.#uiManager._signal; + if (signal instanceof AbortSignal && !signal.aborted) { + editToolbar.addEventListener("contextmenu", noContextMenu, { + signal + }); + } + const buttons = this.#buttons = document.createElement("div"); + buttons.className = "buttons"; + editToolbar.append(buttons); + if (this.#uiManager.hasCommentManager()) { + this.#makeButton("commentButton", `pdfjs-comment-floating-button`, "pdfjs-comment-floating-button-label", () => { + this.#uiManager.commentSelection("floating_button"); + }); + } + this.#makeButton("highlightButton", `pdfjs-highlight-floating-button1`, "pdfjs-highlight-floating-button-label", () => { + this.#uiManager.highlightSelection("floating_button"); + }); + return editToolbar; + } + #getLastPoint(boxes, isLTR) { + let lastY = 0; + let lastX = 0; + for (const box of boxes) { + const y = box.y + box.height; + if (y < lastY) { + continue; + } + const x = box.x + (isLTR ? box.width : 0); + if (y > lastY) { + lastX = x; + lastY = y; + continue; + } + if (isLTR) { + if (x > lastX) { + lastX = x; + } + } else if (x < lastX) { + lastX = x; } } + return [isLTR ? 1 - lastX : lastX, lastY]; + } + show(parent, boxes, isLTR) { + const [x, y] = this.#getLastPoint(boxes, isLTR); const { style - } = this.container; - let svgBuffer; - if (this.#hasBorder) { + } = this.#toolbar ||= this.#render(); + parent.append(this.#toolbar); + style.insetInlineEnd = `${100 * x}%`; + style.top = `calc(${100 * y}% + var(--editor-toolbar-vert-offset))`; + } + hide() { + this.#toolbar.remove(); + } + #makeButton(buttonClass, l10nId, labelL10nId, clickHandler) { + const button = document.createElement("button"); + button.classList.add("basic", buttonClass); + button.tabIndex = 0; + button.setAttribute("data-l10n-id", l10nId); + const span = document.createElement("span"); + button.append(span); + span.className = "visuallyHidden"; + span.setAttribute("data-l10n-id", labelL10nId); + const signal = this.#uiManager._signal; + if (signal instanceof AbortSignal && !signal.aborted) { + button.addEventListener("contextmenu", noContextMenu, { + signal + }); + button.addEventListener("click", clickHandler, { + signal + }); + } + this.#buttons.append(button); + } +} + +;// ./src/shared/internal_evt.js +const INTERNAL_EVT = "d3d019bf-c73b-49f4-94f3-e62eb099fd62"; +const internalOpt = Object.freeze({ + internal: INTERNAL_EVT +}); + +;// ./src/display/editor/tools.js + + + + +function bindEvents(obj, element, names) { + for (const name of names) { + element.addEventListener(name, obj[name].bind(obj)); + } +} +class CurrentPointers { + static #pointerId = NaN; + static #pointerIds = null; + static #moveTimestamp = NaN; + static #pointerType = null; + static initializeAndAddPointerId(pointerId) { + (CurrentPointers.#pointerIds ||= new Set()).add(pointerId); + } + static setPointer(pointerType, pointerId) { + CurrentPointers.#pointerId ||= pointerId; + CurrentPointers.#pointerType ??= pointerType; + } + static setTimeStamp(timeStamp) { + CurrentPointers.#moveTimestamp = timeStamp; + } + static isSamePointerId(pointerId) { + return CurrentPointers.#pointerId === pointerId; + } + static isSamePointerIdOrRemove(pointerId) { + if (CurrentPointers.#pointerId === pointerId) { + return true; + } + CurrentPointers.#pointerIds?.delete(pointerId); + return false; + } + static isSamePointerType(pointerType) { + return CurrentPointers.#pointerType === pointerType; + } + static isInitializedAndDifferentPointerType(pointerType) { + return CurrentPointers.#pointerType !== null && !CurrentPointers.isSamePointerType(pointerType); + } + static isSameTimeStamp(timeStamp) { + return CurrentPointers.#moveTimestamp === timeStamp; + } + static isUsingMultiplePointers() { + return CurrentPointers.#pointerIds?.size >= 1; + } + static clearPointerType() { + CurrentPointers.#pointerType = null; + } + static clearPointerIds() { + CurrentPointers.#pointerId = NaN; + CurrentPointers.#pointerIds = null; + } + static clearTimeStamp() { + CurrentPointers.#moveTimestamp = NaN; + } +} +class IdManager { + #id = 0; + get id() { + return `${AnnotationEditorPrefix}${this.#id++}`; + } +} +class ImageManager { + #baseId = getUuid(); + #id = 0; + #cache = null; + static get _isSVGFittingCanvas() { + const svg = `data:image/svg+xml;charset=UTF-8,`; + const canvas = new OffscreenCanvas(1, 3); + const ctx = canvas.getContext("2d", { + willReadFrequently: true + }); + const image = new Image(); + image.src = svg; + const promise = image.decode().then(() => { + ctx.drawImage(image, 0, 0, 1, 1, 0, 0, 1, 3); + return new Uint32Array(ctx.getImageData(0, 0, 1, 1).data.buffer)[0] === 0; + }); + return shadow(this, "_isSVGFittingCanvas", promise); + } + async #get(key, rawData) { + this.#cache ||= new Map(); + let data = this.#cache.get(key); + if (data === null) { + return null; + } + if (data?.bitmap) { + data.refCounter += 1; + return data; + } + try { + data ||= { + bitmap: null, + id: `image_${this.#baseId}_${this.#id++}`, + refCounter: 0, + isSvg: false + }; + let image; + if (typeof rawData === "string") { + data.url = rawData; + image = await fetchData(rawData, "blob"); + } else if (rawData instanceof File) { + image = data.file = rawData; + } else if (rawData instanceof Blob) { + image = rawData; + } + if (image.type === "image/svg+xml") { + const mustRemoveAspectRatioPromise = ImageManager._isSVGFittingCanvas; + const fileReader = new FileReader(); + const imageElement = new Image(); + const imagePromise = new Promise((resolve, reject) => { + imageElement.onload = () => { + data.bitmap = imageElement; + data.isSvg = true; + resolve(); + }; + fileReader.onload = async () => { + const url = data.svgUrl = fileReader.result; + imageElement.src = (await mustRemoveAspectRatioPromise) ? `${url}#svgView(preserveAspectRatio(none))` : url; + }; + imageElement.onerror = fileReader.onerror = reject; + }); + fileReader.readAsDataURL(image); + await imagePromise; + } else { + data.bitmap = await createImageBitmap(image); + } + data.refCounter = 1; + } catch (e) { + warn(e); + data = null; + } + this.#cache.set(key, data); + if (data) { + this.#cache.set(data.id, data); + } + return data; + } + async getFromFile(file) { + const { + lastModified, + name, + size, + type + } = file; + return this.#get(`${lastModified}_${name}_${size}_${type}`, file); + } + async getFromUrl(url) { + return this.#get(url, url); + } + async getFromBlob(id, blobPromise) { + const blob = await blobPromise; + return this.#get(id, blob); + } + async getFromId(id) { + this.#cache ||= new Map(); + const data = this.#cache.get(id); + if (!data) { + return null; + } + if (data.bitmap) { + data.refCounter += 1; + return data; + } + if (data.file) { + return this.getFromFile(data.file); + } + if (data.blobPromise) { const { - borderColor, - borderWidth - } = style; - style.borderWidth = 0; - svgBuffer = ["url('data:image/svg+xml;utf8,", ``, ``]; - this.container.classList.add("hasBorder"); + blobPromise + } = data; + delete data.blobPromise; + return this.getFromBlob(data.id, blobPromise); + } + return this.getFromUrl(data.url); + } + getFromCanvas(id, canvas) { + this.#cache ||= new Map(); + let data = this.#cache.get(id); + if (data?.bitmap) { + data.refCounter += 1; + return data; + } + const offscreen = new OffscreenCanvas(canvas.width, canvas.height); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(canvas, 0, 0); + data = { + bitmap: offscreen.transferToImageBitmap(), + id: `image_${this.#baseId}_${this.#id++}`, + refCounter: 1, + isSvg: false + }; + this.#cache.set(id, data); + this.#cache.set(data.id, data); + return data; + } + getSvgUrl(id) { + const data = this.#cache.get(id); + if (!data?.isSvg) { + return null; + } + return data.svgUrl; + } + deleteId(id) { + this.#cache ||= new Map(); + const data = this.#cache.get(id); + if (!data) { + return; + } + data.refCounter -= 1; + if (data.refCounter !== 0) { + return; } - const width = rectTrX - rectBlX; - const height = rectTrY - rectBlY; const { - svgFactory - } = this; - const svg = svgFactory.createElement("svg"); - svg.classList.add("quadrilateralsContainer"); - svg.setAttribute("width", 0); - svg.setAttribute("height", 0); - const defs = svgFactory.createElement("defs"); - svg.append(defs); - const clipPath = svgFactory.createElement("clipPath"); - const id = `clippath_${this.data.id}`; - clipPath.setAttribute("id", id); - clipPath.setAttribute("clipPathUnits", "objectBoundingBox"); - defs.append(clipPath); - for (const [, { - x: trX, - y: trY - }, { - x: blX, - y: blY - }] of quadPoints) { - const rect = svgFactory.createElement("rect"); - const x = (blX - rectBlX) / width; - const y = (rectTrY - trY) / height; - const rectWidth = (trX - blX) / width; - const rectHeight = (trY - blY) / height; - rect.setAttribute("x", x); - rect.setAttribute("y", y); - rect.setAttribute("width", rectWidth); - rect.setAttribute("height", rectHeight); - clipPath.append(rect); - svgBuffer?.push(``); + bitmap + } = data; + if (!data.url && !data.file) { + const canvas = new OffscreenCanvas(bitmap.width, bitmap.height); + const ctx = canvas.getContext("bitmaprenderer"); + ctx.transferFromImageBitmap(bitmap); + data.blobPromise = canvas.convertToBlob(); } - if (this.#hasBorder) { - svgBuffer.push(`')`); - style.backgroundImage = svgBuffer.join(""); + bitmap.close?.(); + data.bitmap = null; + } + isValidId(id) { + return id.startsWith(`image_${this.#baseId}_`); + } +} +class CommandManager { + #commands = []; + #locked = false; + #maxSize; + #position = -1; + constructor(maxSize = 128) { + this.#maxSize = maxSize; + } + add({ + cmd, + undo, + post, + mustExec, + type = NaN, + overwriteIfSameType = false, + keepUndo = false + }) { + if (mustExec) { + cmd(); } - this.container.append(svg); - this.container.style.clipPath = `url(#${id})`; + if (this.#locked) { + return; + } + const save = { + cmd, + undo, + post, + type + }; + if (this.#position === -1) { + if (this.#commands.length > 0) { + this.#commands.length = 0; + } + this.#position = 0; + this.#commands.push(save); + return; + } + if (overwriteIfSameType && this.#commands[this.#position].type === type) { + if (keepUndo) { + save.undo = this.#commands[this.#position].undo; + } + this.#commands[this.#position] = save; + return; + } + const next = this.#position + 1; + if (next === this.#maxSize) { + this.#commands.splice(0, 1); + } else { + this.#position = next; + if (next < this.#commands.length) { + this.#commands.splice(next); + } + } + this.#commands.push(save); } - _createPopup() { + undo() { + if (this.#position === -1) { + return; + } + this.#locked = true; const { - container, - data - } = this; - container.setAttribute("aria-haspopup", "dialog"); - const popup = new PopupAnnotationElement({ - data: { - color: data.color, - titleObj: data.titleObj, - modificationDate: data.modificationDate, - contentsObj: data.contentsObj, - richText: data.richText, - parentRect: data.rect, - borderStyle: 0, - id: `popup_${data.id}`, - rotation: data.rotation - }, - parent: this.parent, - elements: [this] - }); - this.parent.div.append(popup.render()); + undo, + post + } = this.#commands[this.#position]; + undo(); + post?.(); + this.#locked = false; + this.#position -= 1; } - render() { - (0,util.unreachable)("Abstract method `AnnotationElement.render` called"); + redo() { + if (this.#position < this.#commands.length - 1) { + this.#position += 1; + this.#locked = true; + const { + cmd, + post + } = this.#commands[this.#position]; + cmd(); + post?.(); + this.#locked = false; + } } - _getElementsByName(name, skipId = null) { - const fields = []; - if (this._fieldObjects) { - const fieldObj = this._fieldObjects[name]; - if (fieldObj) { - for (const { - page, - id, - exportValues - } of fieldObj) { - if (page === -1) { - continue; - } - if (id === skipId) { + hasSomethingToUndo() { + return this.#position !== -1; + } + hasSomethingToRedo() { + return this.#position < this.#commands.length - 1; + } + cleanType(type) { + if (this.#position === -1) { + return; + } + for (let i = this.#position; i >= 0; i--) { + if (this.#commands[i].type !== type) { + this.#commands.splice(i + 1, this.#position - i); + this.#position = i; + return; + } + } + this.#commands.length = 0; + this.#position = -1; + } + destroy() { + this.#commands = null; + } +} +class KeyboardManager { + static ALT = 0x1; + static CTRL = 0x2; + static META = 0x4; + static SHIFT = 0x8; + constructor(callbacks) { + this.callbacks = new Map(); + const { + isMac + } = FeatureTest.platform; + for (const [keys, callback, options = {}] of callbacks) { + const hasMacOverride = keys.some(k => k.startsWith("mac+")); + for (const key of keys) { + let shortcut = key; + if (hasMacOverride) { + const isMacKey = key.startsWith("mac+"); + if (isMac !== isMacKey) { continue; } - const exportValue = typeof exportValues === "string" ? exportValues : null; - const domElement = document.querySelector(`[data-element-id="${id}"]`); - if (domElement && !GetElementsByNameSet.has(domElement)) { - (0,util.warn)(`_getElementsByName - element not allowed: ${id}`); - continue; + if (isMacKey) { + shortcut = key.slice(4); } - fields.push({ - id, - exportValue, - domElement - }); } + const [keyName, modifiers] = KeyboardManager.#parseShortcut(shortcut); + if (keyName === null) { + continue; + } + this.callbacks.getOrInsertComputed(keyName, makeArr).push({ + callback, + options, + modifiers + }); } - return fields; } - for (const domElement of document.getElementsByName(name)) { - const { - exportValue - } = domElement; - const id = domElement.getAttribute("data-element-id"); - if (id === skipId) { + } + static #parseShortcut(value) { + let keyPart = null; + let modifiers = 0; + for (let part of value.split("+")) { + part = part.trim(); + if (!part) { continue; } - if (!GetElementsByNameSet.has(domElement)) { + const upper = part.toUpperCase(); + const modifier = KeyboardManager[upper]; + if (modifier) { + modifiers |= modifier; continue; } - fields.push({ - id, - exportValue, - domElement - }); + if (keyPart !== null) { + warn(`KeyboardManager: multiple keys in shortcut "${value}"`); + break; + } + keyPart = upper === "SPACE" ? " " : part; } - return fields; - } - show() { - if (this.container) { - this.container.hidden = false; + if (keyPart === null) { + warn(`KeyboardManager: no key found in shortcut "${value}"`); } - this.popup?.maybeShow(); + return [keyPart, modifiers]; } - hide() { - if (this.container) { - this.container.hidden = true; + static #codeToKey(code) { + const match = /^(?:Key([A-Z])|(?:Digit|Numpad)(\d))$/.exec(code); + if (!match) { + return null; } - this.popup?.forceHide(); + return match[1]?.toLowerCase() ?? match[2]; } - getElementsToTriggerPopup() { - return this.container; - } - addHighlightArea() { - const triggers = this.getElementsToTriggerPopup(); - if (Array.isArray(triggers)) { - for (const element of triggers) { - element.classList.add("highlightArea"); + exec(self, event) { + let shortcuts = this.callbacks.get(event.key); + if (!shortcuts) { + if (/^[a-z]$/i.test(event.key)) { + return; + } + const fallback = KeyboardManager.#codeToKey(event.code); + if (fallback === null || fallback === event.key) { + return; + } + shortcuts = this.callbacks.get(fallback); + if (!shortcuts) { + return; } - } else { - triggers.classList.add("highlightArea"); } - } - get _isEditable() { - return false; - } - _editOnDoubleClick() { - if (!this._isEditable) { + const eventModifiers = (event.altKey ? KeyboardManager.ALT : 0) | (event.ctrlKey ? KeyboardManager.CTRL : 0) | (event.metaKey ? KeyboardManager.META : 0) | (event.shiftKey ? KeyboardManager.SHIFT : 0); + const info = shortcuts.find(shortcut => shortcut.modifiers === eventModifiers); + if (!info) { return; } const { - annotationEditorType: mode, - data: { - id: editId + callback, + options: { + bubbles = false, + args = [], + checker = null } - } = this; - this.container.addEventListener("dblclick", () => { - this.linkService.eventBus?.dispatch("switchannotationeditormode", { - source: this, - mode, - editId - }); - }); + } = info; + if (checker && !checker(self, event)) { + return; + } + callback.bind(self, ...args, event)(); + if (!bubbles) { + stopEvent(event); + } } } -class LinkAnnotationElement extends AnnotationElement { - constructor(parameters, options = null) { - super(parameters, { - isRenderable: true, - ignoreBorder: !!options?.ignoreBorder, - createQuadrilaterals: true +class ColorManager { + static _colorsMapping = new Map([["CanvasText", [0, 0, 0]], ["Canvas", [255, 255, 255]]]); + get _colors() { + const colors = new Map([["CanvasText", null], ["Canvas", null]]); + getColorValues(colors); + return shadow(this, "_colors", colors); + } + convert(color) { + const rgb = getRGB(color); + if (!window.matchMedia("(forced-colors: active)").matches) { + return rgb; + } + for (const [name, RGB] of this._colors) { + if (RGB.every((x, i) => x === rgb[i])) { + return ColorManager._colorsMapping.get(name); + } + } + return rgb; + } + getHexCode(name) { + const rgb = this._colors.get(name); + if (!rgb) { + return name; + } + return Util.makeHexColor(...rgb); + } +} +class AnnotationEditorUIManager { + #abortController = new AbortController(); + #activeEditor = null; + #allEditableAnnotations = null; + #allEditors = new Map(); + #allLayers = new Map(); + #savedAllLayers = null; + #altTextManager = null; + #annotationStorage = null; + #changedExistingAnnotations = null; + #commandManager = new CommandManager(); + #commentManager = null; + #copyPasteAC = null; + #currentDrawingSession = null; + #currentPageIndex = 0; + #deletedAnnotationsElementIds = new Set(); + #draggingEditors = null; + #editorTypes = null; + #editorsToRescale = new Set(); + _editorUndoBar = null; + #enableHighlightFloatingButton = false; + #enableUpdatedAddImage = false; + #enableNewAltTextWhenAddingImage = false; + #filterFactory = null; + #focusMainContainerTimeoutId = null; + #focusManagerAC = null; + #highlightColors = null; + #highlightWhenShiftUp = false; + #floatingToolbar = null; + #idManager = new IdManager(); + #isEnabled = false; + #isPointerDown = false; + #isWaiting = false; + #keyboardManagerAC = null; + #lastActiveElement = null; + #mainHighlightColorPicker = null; + #missingCanvases = null; + #mlManager = null; + #mode = AnnotationEditorType.NONE; + #selectedEditors = new Set(); + #selectedTextNode = null; + #signatureManager = null; + #pageColors = null; + #showAllStates = null; + #pdfDocument = null; + #previousStates = { + isEditing: false, + isEmpty: true, + hasSomethingToUndo: false, + hasSomethingToRedo: false, + hasSelectedEditor: false, + hasSelectedText: false + }; + #translation = [0, 0]; + #translationTimeoutId = null; + #container = null; + #viewer = null; + #viewerAlert = null; + #updateModeCapability = null; + static TRANSLATE_SMALL = 1; + static TRANSLATE_BIG = 10; + static get _keyboardManager() { + const proto = AnnotationEditorUIManager.prototype; + const arrowChecker = self => self.#container.contains(document.activeElement) && document.activeElement.tagName !== "BUTTON" && self.hasSomethingToControl(); + const textInputChecker = (_self, { + target: el + }) => { + if (el instanceof HTMLInputElement) { + const { + type + } = el; + return type !== "text" && type !== "number"; + } + return true; + }; + const small = this.TRANSLATE_SMALL; + const big = this.TRANSLATE_BIG; + return shadow(this, "_keyboardManager", new KeyboardManager([[["ctrl+a", "mac+meta+a"], proto.selectAll, { + checker: textInputChecker + }], [["ctrl+z", "mac+meta+z"], proto.undo, { + checker: textInputChecker + }], [["ctrl+y", "ctrl+shift+z", "mac+meta+shift+z", "ctrl+shift+Z", "mac+meta+shift+Z"], proto.redo, { + checker: textInputChecker + }], [["Backspace", "alt+Backspace", "ctrl+Backspace", "shift+Backspace", "mac+Backspace", "mac+alt+Backspace", "mac+ctrl+Backspace", "Delete", "ctrl+Delete", "shift+Delete", "mac+Delete"], proto.delete, { + checker: textInputChecker + }], [["Enter"], proto.addNewEditorFromKeyboard, { + checker: (self, { + target: el + }) => !(el instanceof HTMLButtonElement) && self.#container.contains(el) && !self.isEnterHandled + }], [["Space"], proto.addNewEditorFromKeyboard, { + checker: (self, { + target: el + }) => !(el instanceof HTMLButtonElement) && self.#container.contains(document.activeElement) + }], [["Escape"], proto.unselectAll], [["ArrowLeft"], proto.translateSelectedEditors, { + args: [-small, 0], + checker: arrowChecker + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto.translateSelectedEditors, { + args: [-big, 0], + checker: arrowChecker + }], [["ArrowRight"], proto.translateSelectedEditors, { + args: [small, 0], + checker: arrowChecker + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto.translateSelectedEditors, { + args: [big, 0], + checker: arrowChecker + }], [["ArrowUp"], proto.translateSelectedEditors, { + args: [0, -small], + checker: arrowChecker + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto.translateSelectedEditors, { + args: [0, -big], + checker: arrowChecker + }], [["ArrowDown"], proto.translateSelectedEditors, { + args: [0, small], + checker: arrowChecker + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto.translateSelectedEditors, { + args: [0, big], + checker: arrowChecker + }]])); + } + constructor(container, viewer, viewerAlert, altTextManager, commentManager, signatureManager, eventBus, pdfDocument, pageColors, highlightColors, enableHighlightFloatingButton, enableUpdatedAddImage, enableNewAltTextWhenAddingImage, mlManager, editorUndoBar, supportsPinchToZoom) { + const signal = this._signal = this.#abortController.signal; + this.#container = container; + this.#viewer = viewer; + this.#viewerAlert = viewerAlert; + this.#altTextManager = altTextManager; + this.#commentManager = commentManager; + this.#signatureManager = signatureManager; + this.#pdfDocument = pdfDocument; + this._eventBus = eventBus; + const evtOpts = { + signal, + ...internalOpt + }; + eventBus.on("editingaction", this.onEditingAction.bind(this), evtOpts); + eventBus.on("pagechanging", this.onPageChanging.bind(this), evtOpts); + eventBus.on("scalechanging", this.onScaleChanging.bind(this), evtOpts); + eventBus.on("rotationchanging", this.onRotationChanging.bind(this), evtOpts); + eventBus.on("setpreference", this.onSetPreference.bind(this), evtOpts); + eventBus.on("switchannotationeditorparams", evt => this.updateParams(evt.type, evt.value), evtOpts); + window.addEventListener("pointerdown", () => { + this.#isPointerDown = true; + }, { + capture: true, + signal }); - this.isTooltipOnly = parameters.data.isTooltipOnly; + window.addEventListener("pointerup", () => { + this.#isPointerDown = false; + }, { + capture: true, + signal + }); + window.addEventListener("beforeunload", this.#beforeUnload.bind(this), { + capture: true, + signal + }); + this.#addSelectionListener(); + this.#addDragAndDropListeners(); + this.#addKeyboardManager(); + this.#annotationStorage = pdfDocument.annotationStorage; + this.#filterFactory = pdfDocument.filterFactory; + this.#pageColors = pageColors; + this.#highlightColors = highlightColors || null; + this.#enableHighlightFloatingButton = enableHighlightFloatingButton; + this.#enableUpdatedAddImage = enableUpdatedAddImage; + this.#enableNewAltTextWhenAddingImage = enableNewAltTextWhenAddingImage; + this.#mlManager = mlManager || null; + this.viewParameters = { + realScale: PixelsPerInch.PDF_TO_CSS_UNITS, + rotation: 0 + }; + this.isShiftKeyDown = false; + this._editorUndoBar = editorUndoBar || null; + this._supportsPinchToZoom = supportsPinchToZoom !== false; + commentManager?.setSidebarUiManager(this); } - render() { + destroy() { + this.#updateModeCapability?.resolve(); + this.#updateModeCapability = null; + this.#abortController?.abort(); + this.#abortController = null; + this._signal = null; + for (const layer of this.#allLayers.values()) { + layer.destroy(); + } + this.#allLayers.clear(); + this.#allEditors.clear(); + this.#editorsToRescale.clear(); + this.#missingCanvases?.clear(); + this.#activeEditor = null; + this.#selectedEditors.clear(); + this.#commandManager.destroy(); + this.#altTextManager?.destroy(); + this.#commentManager?.destroy(); + this.#signatureManager?.destroy(); + this.#floatingToolbar?.hide(); + this.#floatingToolbar = null; + this.#mainHighlightColorPicker?.destroy(); + this.#mainHighlightColorPicker = null; + this.#allEditableAnnotations = null; + if (this.#focusMainContainerTimeoutId) { + clearTimeout(this.#focusMainContainerTimeoutId); + this.#focusMainContainerTimeoutId = null; + } + if (this.#translationTimeoutId) { + clearTimeout(this.#translationTimeoutId); + this.#translationTimeoutId = null; + } + this._editorUndoBar?.destroy(); + this.#pdfDocument = null; + } + combinedSignal(ac) { + return AbortSignal.any([this._signal, ac.signal]); + } + get mlManager() { + return this.#mlManager; + } + get useNewAltTextFlow() { + return this.#enableUpdatedAddImage; + } + get useNewAltTextWhenAddingImage() { + return this.#enableNewAltTextWhenAddingImage; + } + get hcmFilter() { + return shadow(this, "hcmFilter", this.#pageColors ? this.#filterFactory.addHCMFilter(this.#pageColors.foreground, this.#pageColors.background) : "none"); + } + get direction() { + return shadow(this, "direction", getComputedStyle(this.#container).direction); + } + get _highlightColors() { + return shadow(this, "_highlightColors", this.#highlightColors ? new Map(this.#highlightColors.split(",").map(pair => { + pair = pair.split("=").map(x => x.trim()); + pair[1] = pair[1].toUpperCase(); + return pair; + })) : null); + } + get highlightColors() { const { - data, - linkService + _highlightColors } = this; - const link = document.createElement("a"); - link.setAttribute("data-element-id", data.id); - let isBound = false; - if (data.url) { - linkService.addLinkAttributes(link, data.url, data.newWindow); - isBound = true; - } else if (data.action) { - this._bindNamedAction(link, data.action); - isBound = true; - } else if (data.attachment) { - this.#bindAttachment(link, data.attachment, data.attachmentDest); - isBound = true; - } else if (data.setOCGState) { - this.#bindSetOCGState(link, data.setOCGState); - isBound = true; - } else if (data.dest) { - this._bindLink(link, data.dest); - isBound = true; - } else { - if (data.actions && (data.actions.Action || data.actions["Mouse Up"] || data.actions["Mouse Down"]) && this.enableScripting && this.hasJSActions) { - this._bindJSAction(link, data); - isBound = true; + if (!_highlightColors) { + return shadow(this, "highlightColors", null); + } + const map = new Map(); + const hasHCM = !!this.#pageColors; + for (const [name, color] of _highlightColors) { + const isNameForHCM = name.endsWith("_HCM"); + if (hasHCM && isNameForHCM) { + map.set(name.replace("_HCM", ""), color); + continue; } - if (data.resetForm) { - this._bindResetFormAction(link, data.resetForm); - isBound = true; - } else if (this.isTooltipOnly && !isBound) { - this._bindLink(link, ""); - isBound = true; + if (!hasHCM && !isNameForHCM) { + map.set(name, color); } } - this.container.classList.add("linkAnnotation"); - if (isBound) { - this.container.append(link); + return shadow(this, "highlightColors", map); + } + get highlightColorNames() { + return shadow(this, "highlightColorNames", this.highlightColors ? new Map(Array.from(this.highlightColors, e => e.reverse())) : null); + } + getNonHCMColor(color) { + if (!this._highlightColors) { + return color; } - return this.container; + const colorName = this.highlightColorNames.get(color); + return this._highlightColors.get(colorName) || color; } - #setInternalLink() { - this.container.setAttribute("data-internal-link", ""); + getNonHCMColorName(color) { + return this.highlightColorNames.get(color) || color; } - _bindLink(link, destination) { - link.href = this.linkService.getDestinationHash(destination); - link.onclick = () => { - if (destination) { - this.linkService.goToDestination(destination); - } - return false; - }; - if (destination || destination === "") { - this.#setInternalLink(); + setCurrentDrawingSession(layer) { + if (layer) { + this.unselectAll(); + this.disableUserSelect(true); + } else { + this.disableUserSelect(false); } + this.#currentDrawingSession = layer; } - _bindNamedAction(link, action) { - link.href = this.linkService.getAnchorUrl(""); - link.onclick = () => { - this.linkService.executeNamedAction(action); - return false; - }; - this.#setInternalLink(); + setMainHighlightColorPicker(colorPicker) { + this.#mainHighlightColorPicker = colorPicker; } - #bindAttachment(link, attachment, dest = null) { - link.href = this.linkService.getAnchorUrl(""); - link.onclick = () => { - this.downloadManager?.openOrDownloadData(attachment.content, attachment.filename, dest); - return false; + editAltText(editor, firstTime = false) { + this.#altTextManager?.editAltText(this, editor, firstTime); + } + hasCommentManager() { + return !!this.#commentManager; + } + editComment(editor, posX, posY, options) { + this.#commentManager?.showDialog(this, editor, posX, posY, options); + } + selectComment(pageIndex, uid) { + const layer = this.#allLayers.get(pageIndex); + const editor = layer?.getEditorByUID(uid); + editor?.toggleComment(true, true); + } + updateComment(editor) { + this.#commentManager?.updateComment(editor.getData()); + } + updatePopupColor(editor) { + this.#commentManager?.updatePopupColor(editor); + } + removeComment(editor) { + this.#commentManager?.removeComments([editor.uid]); + } + deleteComment(editor, savedData) { + const undo = () => { + editor.comment = savedData; }; - this.#setInternalLink(); + const cmd = () => { + this._editorUndoBar?.show(undo, "comment"); + this.toggleComment(null); + editor.comment = null; + }; + this.addCommands({ + cmd, + undo, + mustExec: true + }); } - #bindSetOCGState(link, action) { - link.href = this.linkService.getAnchorUrl(""); - link.onclick = () => { - this.linkService.executeSetOCGState(action); - return false; + toggleComment(editor, isSelected, visibility = undefined) { + this.#commentManager?.toggleCommentPopup(editor, isSelected, visibility); + } + makeCommentColor(color, opacity) { + return color && this.#commentManager?.makeCommentColor(color, opacity) || null; + } + getCommentDialogElement() { + return this.#commentManager?.dialogElement || null; + } + async waitForEditorsRendered(pageNumber) { + if (this.#allLayers.has(pageNumber - 1)) { + return; + } + const { + resolve, + promise + } = Promise.withResolvers(); + const onEditorsRendered = evt => { + if (evt.pageNumber === pageNumber) { + this._eventBus.off("editorsrendered", onEditorsRendered); + resolve(); + } }; - this.#setInternalLink(); + this._eventBus.on("editorsrendered", onEditorsRendered, internalOpt); + await promise; } - _bindJSAction(link, data) { - link.href = this.linkService.getAnchorUrl(""); - const map = new Map([["Action", "onclick"], ["Mouse Up", "onmouseup"], ["Mouse Down", "onmousedown"]]); - for (const name of Object.keys(data.actions)) { - const jsName = map.get(name); - if (!jsName) { - continue; + getSignature(editor) { + this.#signatureManager?.getSignature({ + uiManager: this, + editor + }); + } + get signatureManager() { + return this.#signatureManager; + } + switchToMode(mode, callback) { + this._eventBus.on("annotationeditormodechanged", callback, { + once: true, + signal: this._signal, + ...internalOpt + }); + this._eventBus.dispatch("showannotationeditorui", { + source: this, + mode + }); + } + setPreference(name, value) { + this._eventBus.dispatch("setpreference", { + source: this, + name, + value + }); + } + onSetPreference({ + name, + value + }) { + switch (name) { + case "enableNewAltTextWhenAddingImage": + this.#enableNewAltTextWhenAddingImage = value; + break; + } + } + onPageChanging({ + pageNumber + }) { + this.#currentPageIndex = pageNumber - 1; + } + deletePage(id) { + for (const editor of this.getEditors(id)) { + editor.remove(); + } + this.#allLayers.delete(id); + if (this.#currentPageIndex === id) { + this.#currentPageIndex = 0; + } + } + focusMainContainer() { + this.#container.focus(); + } + findParent(x, y) { + for (const layer of this.#allLayers.values()) { + const { + x: layerX, + y: layerY, + width, + height + } = layer.div.getBoundingClientRect(); + if (x >= layerX && x <= layerX + width && y >= layerY && y <= layerY + height) { + return layer; } - link[jsName] = () => { - this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { - source: this, - detail: { - id: data.id, - name - } - }); - return false; - }; } - if (!link.onclick) { - link.onclick = () => false; + return null; + } + disableUserSelect(value = false) { + this.#viewer.classList.toggle("noUserSelect", value); + } + addShouldRescale(editor) { + this.#editorsToRescale.add(editor); + } + removeShouldRescale(editor) { + this.#editorsToRescale.delete(editor); + } + onScaleChanging({ + scale + }) { + this.commitOrRemove(); + this.viewParameters.realScale = scale * PixelsPerInch.PDF_TO_CSS_UNITS; + for (const editor of this.#editorsToRescale) { + editor.onScaleChanging(); } - this.#setInternalLink(); + this.#currentDrawingSession?.onScaleChanging(); } - _bindResetFormAction(link, resetForm) { - const otherClickAction = link.onclick; - if (!otherClickAction) { - link.href = this.linkService.getAnchorUrl(""); + onRotationChanging({ + pagesRotation + }) { + this.commitOrRemove(); + this.viewParameters.rotation = pagesRotation; + } + #getAnchorElementForSelection({ + anchorNode + }) { + return anchorNode.nodeType === Node.TEXT_NODE ? anchorNode.parentElement : anchorNode; + } + #getLayerForTextLayer(textLayer) { + const { + currentLayer + } = this; + if (currentLayer.hasTextLayer(textLayer)) { + return currentLayer; } - this.#setInternalLink(); - if (!this._fieldObjects) { - (0,util.warn)(`_bindResetFormAction - "resetForm" action not supported, ` + "ensure that the `fieldObjects` parameter is provided."); - if (!otherClickAction) { - link.onclick = () => false; + for (const layer of this.#allLayers.values()) { + if (layer.hasTextLayer(textLayer)) { + return layer; } + } + return null; + } + highlightSelection(methodOfCreation = "", comment = false) { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { return; } - link.onclick = () => { - otherClickAction?.(); - const { - fields: resetFormFields, - refs: resetFormRefs, - include - } = resetForm; - const allFields = []; - if (resetFormFields.length !== 0 || resetFormRefs.length !== 0) { - const fieldIds = new Set(resetFormRefs); - for (const fieldName of resetFormFields) { - const fields = this._fieldObjects[fieldName] || []; - for (const { - id - } of fields) { - fieldIds.add(id); - } - } - for (const fields of Object.values(this._fieldObjects)) { - for (const field of fields) { - if (fieldIds.has(field.id) === include) { - allFields.push(field); - } - } - } - } else { - for (const fields of Object.values(this._fieldObjects)) { - allFields.push(...fields); - } - } - const storage = this.annotationStorage; - const allIds = []; - for (const field of allFields) { - const { - id - } = field; - allIds.push(id); - switch (field.type) { - case "text": - { - const value = field.defaultValue || ""; - storage.setValue(id, { - value - }); - break; - } - case "checkbox": - case "radiobutton": - { - const value = field.defaultValue === field.exportValues; - storage.setValue(id, { - value - }); - break; - } - case "combobox": - case "listbox": - { - const value = field.defaultValue || ""; - storage.setValue(id, { - value - }); - break; - } - default: - continue; - } - const domElement = document.querySelector(`[data-element-id="${id}"]`); - if (!domElement) { - continue; - } else if (!GetElementsByNameSet.has(domElement)) { - (0,util.warn)(`_bindResetFormAction - element not allowed: ${id}`); - continue; - } - domElement.dispatchEvent(new Event("resetform")); + const { + anchorNode, + anchorOffset, + focusNode, + focusOffset + } = selection; + const text = selection.toString(); + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + const boxes = this.getSelectionBoxes(textLayer); + if (!boxes) { + return; + } + selection.empty(); + const layer = this.#getLayerForTextLayer(textLayer); + const isNoneMode = this.#mode === AnnotationEditorType.NONE; + const callback = () => { + const editor = layer?.createAndAddNewEditor({ + x: 0, + y: 0 + }, false, { + methodOfCreation, + boxes, + anchorNode, + anchorOffset, + focusNode, + focusOffset, + text + }); + if (isNoneMode) { + this.showAllEditors("highlight", true, true); } - if (this.enableScripting) { - this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { - source: this, - detail: { - id: "app", - ids: allIds, - name: "ResetForm" - } - }); + if (comment) { + editor?.editComment(); } - return false; }; + if (isNoneMode) { + this.switchToMode(AnnotationEditorType.HIGHLIGHT, callback); + return; + } + callback(); } -} -class TextAnnotationElement extends AnnotationElement { - constructor(parameters) { - super(parameters, { - isRenderable: true - }); + commentSelection(methodOfCreation = "") { + this.highlightSelection(methodOfCreation, true); } - render() { - this.container.classList.add("textAnnotation"); - const image = document.createElement("img"); - image.src = this.imageResourcesPath + "annotation-" + this.data.name.toLowerCase() + ".svg"; - image.setAttribute("data-l10n-id", "pdfjs-text-annotation-type"); - image.setAttribute("data-l10n-args", JSON.stringify({ - type: this.data.name - })); - if (!this.data.popupRef && this.hasPopupData) { - this._createPopup(); + #beforeUnload(e) { + this.commitOrRemove(); + this.currentLayer?.endDrawingSession(false); + } + #displayFloatingToolbar() { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + return; } - this.container.append(image); - return this.container; + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + const boxes = this.getSelectionBoxes(textLayer); + if (!boxes) { + return; + } + this.#floatingToolbar ||= new FloatingToolbar(this); + this.#floatingToolbar.show(textLayer, boxes, this.direction === "ltr"); } -} -class WidgetAnnotationElement extends AnnotationElement { - render() { - return this.container; + getAndRemoveDataFromAnnotationStorage(annotationId) { + if (!this.#annotationStorage) { + return null; + } + const key = `${AnnotationEditorPrefix}${annotationId}`; + const storedValue = this.#annotationStorage.getRawValue(key); + if (storedValue) { + this.#annotationStorage.remove(key); + } + return storedValue; } - showElementAndHideCanvas(element) { - if (this.data.hasOwnCanvas) { - if (element.previousSibling?.nodeName === "CANVAS") { - element.previousSibling.hidden = true; - } - element.hidden = false; + addToAnnotationStorage(editor) { + if (!editor.isEmpty() && this.#annotationStorage && !this.#annotationStorage.has(editor.id)) { + this.#annotationStorage.setValue(editor.id, editor); } } - _getKeyModifier(event) { - return util.FeatureTest.platform.isMac ? event.metaKey : event.ctrlKey; + a11yAlert(messageId, args = null) { + const viewerAlert = this.#viewerAlert; + if (!viewerAlert) { + return; + } + viewerAlert.setAttribute("data-l10n-id", messageId); + if (args) { + viewerAlert.setAttribute("data-l10n-args", JSON.stringify(args)); + } else { + viewerAlert.removeAttribute("data-l10n-args"); + } } - _setEventListener(element, elementData, baseName, eventName, valueGetter) { - if (baseName.includes("mouse")) { - element.addEventListener(baseName, event => { - this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { - source: this, - detail: { - id: this.data.id, - name: eventName, - value: valueGetter(event), - shift: event.shiftKey, - modifier: this._getKeyModifier(event) - } + #selectionChange() { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + if (this.#selectedTextNode) { + this.#floatingToolbar?.hide(); + this.#selectedTextNode = null; + this.#dispatchUpdateStates({ + hasSelectedText: false }); - }); - } else { - element.addEventListener(baseName, event => { - if (baseName === "blur") { - if (!elementData.focused || !event.relatedTarget) { + } + return; + } + const { + anchorNode + } = selection; + if (anchorNode === this.#selectedTextNode) { + return; + } + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + if (!textLayer) { + if (this.#selectedTextNode) { + this.#floatingToolbar?.hide(); + this.#selectedTextNode = null; + this.#dispatchUpdateStates({ + hasSelectedText: false + }); + } + return; + } + this.#floatingToolbar?.hide(); + this.#selectedTextNode = anchorNode; + this.#dispatchUpdateStates({ + hasSelectedText: true + }); + if (this.#mode !== AnnotationEditorType.HIGHLIGHT && this.#mode !== AnnotationEditorType.NONE) { + return; + } + if (this.#mode === AnnotationEditorType.HIGHLIGHT) { + this.showAllEditors("highlight", true, true); + } + this.#highlightWhenShiftUp = this.isShiftKeyDown; + if (!this.isShiftKeyDown) { + const activeLayer = this.#mode === AnnotationEditorType.HIGHLIGHT ? this.#getLayerForTextLayer(textLayer) : null; + activeLayer?.toggleDrawing(); + if (this.#isPointerDown) { + const ac = new AbortController(); + const signal = this.combinedSignal(ac); + const pointerup = e => { + if (e.type === "pointerup" && e.button !== 0) { return; } - elementData.focused = false; - } else if (baseName === "focus") { - if (elementData.focused) { - return; + ac.abort(); + activeLayer?.toggleDrawing(true); + if (e.type === "pointerup") { + this.#onSelectEnd("main_toolbar"); } - elementData.focused = true; + }; + window.addEventListener("pointerup", pointerup, { + signal + }); + window.addEventListener("blur", pointerup, { + signal + }); + } else { + activeLayer?.toggleDrawing(true); + this.#onSelectEnd("main_toolbar"); + } + } + } + #onSelectEnd(methodOfCreation = "") { + if (this.#mode === AnnotationEditorType.HIGHLIGHT) { + this.highlightSelection(methodOfCreation); + } else if (this.#enableHighlightFloatingButton) { + this.#displayFloatingToolbar(); + } + } + #addSelectionListener() { + document.addEventListener("selectionchange", this.#selectionChange.bind(this), { + signal: this._signal + }); + } + #addFocusManager() { + if (this.#focusManagerAC) { + return; + } + this.#focusManagerAC = new AbortController(); + const signal = this.combinedSignal(this.#focusManagerAC); + window.addEventListener("focus", this.focus.bind(this), { + signal + }); + window.addEventListener("blur", this.blur.bind(this), { + signal + }); + } + #removeFocusManager() { + this.#focusManagerAC?.abort(); + this.#focusManagerAC = null; + } + blur() { + this.isShiftKeyDown = false; + if (this.#highlightWhenShiftUp) { + this.#highlightWhenShiftUp = false; + this.#onSelectEnd("main_toolbar"); + } + if (!this.hasSelection) { + return; + } + const { + activeElement + } = document; + for (const editor of this.#selectedEditors) { + if (editor.div.contains(activeElement)) { + this.#lastActiveElement = [editor, activeElement]; + editor._focusEventsAllowed = false; + break; + } + } + } + focus() { + if (!this.#lastActiveElement) { + return; + } + const [lastEditor, lastActiveElement] = this.#lastActiveElement; + this.#lastActiveElement = null; + lastActiveElement.addEventListener("focusin", () => { + lastEditor._focusEventsAllowed = true; + }, { + once: true, + signal: this._signal + }); + lastActiveElement.focus(); + } + #addKeyboardManager() { + if (this.#keyboardManagerAC) { + return; + } + this.#keyboardManagerAC = new AbortController(); + const signal = this.combinedSignal(this.#keyboardManagerAC); + window.addEventListener("keydown", this.keydown.bind(this), { + signal + }); + window.addEventListener("keyup", this.keyup.bind(this), { + signal + }); + } + #removeKeyboardManager() { + this.#keyboardManagerAC?.abort(); + this.#keyboardManagerAC = null; + } + #addCopyPasteListeners() { + if (this.#copyPasteAC) { + return; + } + this.#copyPasteAC = new AbortController(); + const signal = this.combinedSignal(this.#copyPasteAC); + document.addEventListener("copy", this.copy.bind(this), { + signal + }); + document.addEventListener("cut", this.cut.bind(this), { + signal + }); + document.addEventListener("paste", this.paste.bind(this), { + signal + }); + } + #removeCopyPasteListeners() { + this.#copyPasteAC?.abort(); + this.#copyPasteAC = null; + } + #addDragAndDropListeners() { + const signal = this._signal; + document.addEventListener("dragover", this.dragOver.bind(this), { + signal + }); + document.addEventListener("drop", this.drop.bind(this), { + signal + }); + } + addEditListeners() { + this.#addKeyboardManager(); + this.setEditingState(true); + } + removeEditListeners() { + this.#removeKeyboardManager(); + this.setEditingState(false); + } + dragOver(event) { + for (const { + type + } of event.dataTransfer.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(type)) { + event.dataTransfer.dropEffect = "copy"; + event.preventDefault(); + return; } - if (!valueGetter) { + } + } + } + drop(event) { + for (const item of event.dataTransfer.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(item.type)) { + editorType.paste(item, this.currentLayer); + event.preventDefault(); return; } - this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { - source: this, - detail: { - id: this.data.id, - name: eventName, - value: valueGetter(event) - } - }); - }); + } } } - _setEventListeners(element, elementData, names, getter) { - for (const [baseName, eventName] of names) { - if (eventName === "Action" || this.data.actions?.[eventName]) { - if (eventName === "Focus" || eventName === "Blur") { - elementData ||= { - focused: false - }; + copy(event) { + event.preventDefault(); + this.#activeEditor?.commitOrRemove(); + if (!this.hasSelection) { + return; + } + const editors = []; + for (const editor of this.#selectedEditors) { + const serialized = editor.serialize(true); + if (serialized) { + editors.push(serialized); + } + } + if (editors.length === 0) { + return; + } + event.clipboardData.setData("application/pdfjs", JSON.stringify(editors)); + } + cut(event) { + this.copy(event); + this.delete(); + } + async paste(event) { + event.preventDefault(); + const { + clipboardData + } = event; + for (const item of clipboardData.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(item.type)) { + editorType.paste(item, this.currentLayer); + return; } - this._setEventListener(element, elementData, baseName, eventName, getter); - if (eventName === "Focus" && !this.data.actions?.Blur) { - this._setEventListener(element, elementData, "blur", "Blur", null); - } else if (eventName === "Blur" && !this.data.actions?.Focus) { - this._setEventListener(element, elementData, "focus", "Focus", null); + } + } + let data = clipboardData.getData("application/pdfjs"); + if (!data) { + return; + } + try { + data = JSON.parse(data); + } catch (ex) { + warn(`paste: "${ex.message}".`); + return; + } + if (!Array.isArray(data)) { + return; + } + this.unselectAll(); + const layer = this.currentLayer; + try { + const newEditors = []; + for (const editor of data) { + const deserializedEditor = await layer.deserialize(editor); + if (!deserializedEditor) { + return; } + newEditors.push(deserializedEditor); } + const cmd = () => { + for (const editor of newEditors) { + this.#addEditorToLayer(editor); + } + this.#selectEditors(newEditors); + }; + const undo = () => { + for (const editor of newEditors) { + editor.remove(); + } + }; + this.addCommands({ + cmd, + undo, + mustExec: true + }); + } catch (ex) { + warn(`paste: "${ex.message}".`); } } - _setBackgroundColor(element) { - const color = this.data.backgroundColor || null; - element.style.backgroundColor = color === null ? "transparent" : util.Util.makeHexColor(color[0], color[1], color[2]); + keydown(event) { + if (!this.isShiftKeyDown && event.key === "Shift") { + this.isShiftKeyDown = true; + } + if (this.#mode !== AnnotationEditorType.NONE && !this.isEditorHandlingKeyboard) { + AnnotationEditorUIManager._keyboardManager.exec(this, event); + } } - _setTextStyle(element) { - const TEXT_ALIGNMENT = ["left", "center", "right"]; - const { - fontColor - } = this.data.defaultAppearanceData; - const fontSize = this.data.defaultAppearanceData.fontSize || DEFAULT_FONT_SIZE; - const style = element.style; - let computedFontSize; - const BORDER_SIZE = 2; - const roundToOneDecimal = x => Math.round(10 * x) / 10; - if (this.data.multiLine) { - const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE); - const numberOfLines = Math.round(height / (util.LINE_FACTOR * fontSize)) || 1; - const lineHeight = height / numberOfLines; - computedFontSize = Math.min(fontSize, roundToOneDecimal(lineHeight / util.LINE_FACTOR)); - } else { - const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE); - computedFontSize = Math.min(fontSize, roundToOneDecimal(height / util.LINE_FACTOR)); + keyup(event) { + if (this.isShiftKeyDown && event.key === "Shift") { + this.isShiftKeyDown = false; + if (this.#highlightWhenShiftUp) { + this.#highlightWhenShiftUp = false; + this.#onSelectEnd("main_toolbar"); + } } - style.fontSize = `calc(${computedFontSize}px * var(--scale-factor))`; - style.color = util.Util.makeHexColor(fontColor[0], fontColor[1], fontColor[2]); - if (this.data.textAlignment !== null) { - style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment]; + } + onEditingAction({ + name + }) { + switch (name) { + case "undo": + case "redo": + case "delete": + case "selectAll": + this[name](); + break; + case "highlightSelection": + this.highlightSelection("context_menu"); + break; + case "commentSelection": + this.commentSelection("context_menu"); + break; } } - _setRequired(element, isRequired) { - if (isRequired) { - element.setAttribute("required", true); - } else { - element.removeAttribute("required"); + updatePageIndex(oldPageIndex, newPageIndex) { + for (const editor of this.getEditors(oldPageIndex)) { + editor.pageIndex = newPageIndex; + } + const layer = this.#savedAllLayers.get(oldPageIndex); + if (layer) { + layer.pageIndex = newPageIndex; + this.#allLayers.set(newPageIndex, layer); + if (this.#isEnabled) { + layer.enable(); + } else { + layer.disable(); + } } - element.setAttribute("aria-required", isRequired); } -} -class TextWidgetAnnotationElement extends WidgetAnnotationElement { - constructor(parameters) { - const isRenderable = parameters.renderForms || parameters.data.hasOwnCanvas || !parameters.data.hasAppearance && !!parameters.data.fieldValue; - super(parameters, { - isRenderable - }); + startUpdatePages() { + this.#savedAllLayers = new Map(this.#allLayers); + this.#allLayers.clear(); } - setPropertyOnSiblings(base, key, value, keyInStorage) { - const storage = this.annotationStorage; - for (const element of this._getElementsByName(base.name, base.id)) { - if (element.domElement) { - element.domElement[key] = value; + endUpdatePages() { + this.#savedAllLayers = null; + } + clonePage(pageIndex, newPageIndex) { + for (const editor of this.getEditors(pageIndex)) { + const serialized = editor.serialize(editor.mode !== AnnotationEditorType.HIGHLIGHT); + if (!serialized) { + continue; } - storage.setValue(element.id, { - [keyInStorage]: value + serialized.pageIndex = newPageIndex; + serialized.id = this.getId(); + serialized.isClone = true; + delete serialized.popupRef; + this.#annotationStorage.setValue(serialized.id, serialized); + } + } + findClonesForPage(layer) { + const promises = []; + const { + pageIndex + } = layer; + for (const [id, editor] of this.#annotationStorage) { + if (editor.pageIndex === pageIndex && editor.isClone) { + this.#annotationStorage.remove(id); + promises.push(layer.deserialize(editor).then(deserializedEditor => { + if (deserializedEditor) { + deserializedEditor.isClone = true; + layer.addOrRebuild(deserializedEditor); + } + })); + } + } + return Promise.all(promises); + } + #dispatchUpdateStates(details) { + const hasChanged = Object.entries(details).some(([key, value]) => this.#previousStates[key] !== value); + if (hasChanged) { + this._eventBus.dispatch("editingstateschanged", { + source: this, + details: Object.assign(this.#previousStates, details) }); + if (this.#mode === AnnotationEditorType.HIGHLIGHT && details.hasSelectedEditor === false) { + this.#dispatchUpdateUI([[AnnotationEditorParamsType.HIGHLIGHT_FREE, true]]); + } } } - render() { - const storage = this.annotationStorage; - const id = this.data.id; - this.container.classList.add("textWidgetAnnotation"); - let element = null; - if (this.renderForms) { - const storedData = storage.getValue(id, { - value: this.data.fieldValue + #dispatchUpdateUI(details) { + this._eventBus.dispatch("annotationeditorparamschanged", { + source: this, + details + }); + } + setEditingState(isEditing) { + if (isEditing) { + this.#addFocusManager(); + this.#addCopyPasteListeners(); + this.#dispatchUpdateStates({ + isEditing: this.#mode !== AnnotationEditorType.NONE, + isEmpty: this.#isEmpty(), + hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(), + hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(), + hasSelectedEditor: false }); - let textContent = storedData.value || ""; - const maxLen = storage.getValue(id, { - charLimit: this.data.maxLen - }).charLimit; - if (maxLen && textContent.length > maxLen) { - textContent = textContent.slice(0, maxLen); + } else { + this.#removeFocusManager(); + this.#removeCopyPasteListeners(); + this.#dispatchUpdateStates({ + isEditing: false + }); + this.disableUserSelect(false); + } + } + registerEditorTypes(types) { + if (this.#editorTypes) { + return; + } + this.#editorTypes = types; + for (const editorType of this.#editorTypes) { + this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate); + } + } + getId() { + return this.#idManager.id; + } + get currentLayer() { + return this.#allLayers.get(this.#currentPageIndex); + } + getLayer(pageIndex) { + return this.#allLayers.get(pageIndex); + } + get currentPageIndex() { + return this.#currentPageIndex; + } + addLayer(layer) { + this.#allLayers.set(layer.pageIndex, layer); + if (this.#isEnabled) { + layer.enable(); + } else { + layer.disable(); + } + } + removeLayer(layer) { + this.#allLayers.delete(layer.pageIndex); + } + async updateMode(mode, editId = null, isFromUser = false, isFromKeyboard = false, mustEnterInEditMode = false, editComment = false) { + if (this.#mode === mode) { + return; + } + if (this.#updateModeCapability) { + await this.#updateModeCapability.promise; + if (!this.#updateModeCapability) { + return; } - let fieldFormattedValues = storedData.formattedValue || this.data.textContent?.join("\n") || null; - if (fieldFormattedValues && this.data.comb) { - fieldFormattedValues = fieldFormattedValues.replaceAll(/\s+/g, ""); + } + this.#updateModeCapability = Promise.withResolvers(); + this.#currentDrawingSession?.commitOrRemove(); + if (this.#mode === AnnotationEditorType.POPUP) { + this.#commentManager?.hideSidebar(); + } + this.#commentManager?.destroyPopup(); + this.#mode = mode; + if (mode === AnnotationEditorType.NONE) { + this.setEditingState(false); + this.#disableAll(); + for (const editor of this.#allEditors.values()) { + editor.hideStandaloneCommentButton(); } - const elementData = { - userValue: textContent, - formattedValue: fieldFormattedValues, - lastCommittedValue: null, - commitKey: 1, - focused: false - }; - if (this.data.multiLine) { - element = document.createElement("textarea"); - element.textContent = fieldFormattedValues ?? textContent; - if (this.data.doNotScroll) { - element.style.overflowY = "hidden"; + this._editorUndoBar?.hide(); + this.toggleComment(null); + this.#updateModeCapability.resolve(); + return; + } + for (const editor of this.#allEditors.values()) { + editor.addStandaloneCommentButton(); + } + if (mode === AnnotationEditorType.SIGNATURE) { + await this.#signatureManager?.loadSignatures(); + } + if (isFromUser) { + CurrentPointers.clearPointerType(); + } + this.setEditingState(true); + await this.#enableAll(); + this.unselectAll(); + for (const layer of this.#allLayers.values()) { + layer.updateMode(mode); + } + if (mode === AnnotationEditorType.POPUP) { + this.#allEditableAnnotations ||= await this.#pdfDocument.getAnnotationsByType(new Set(this.#editorTypes.map(editorClass => editorClass._editorType))); + const elementIds = new Set(); + const allComments = []; + for (const editor of this.#allEditors.values()) { + const { + annotationElementId, + hasComment, + deleted + } = editor; + if (annotationElementId) { + elementIds.add(annotationElementId); } - } else { - element = document.createElement("input"); - element.type = "text"; - element.setAttribute("value", fieldFormattedValues ?? textContent); - if (this.data.doNotScroll) { - element.style.overflowX = "hidden"; + if (hasComment && !deleted) { + allComments.push(editor.getData()); } } - if (this.data.hasOwnCanvas) { - element.hidden = true; + for (const annotation of this.#allEditableAnnotations) { + const { + id, + popupRef, + contentsObj + } = annotation; + if (popupRef && contentsObj?.str && !elementIds.has(id) && !this.#deletedAnnotationsElementIds.has(id)) { + allComments.push(annotation); + } } - GetElementsByNameSet.add(element); - element.setAttribute("data-element-id", id); - element.disabled = this.data.readOnly; - element.name = this.data.fieldName; - element.tabIndex = DEFAULT_TAB_INDEX; - this._setRequired(element, this.data.required); - if (maxLen) { - element.maxLength = maxLen; + this.#commentManager?.showSidebar(allComments); + } + if (!editId) { + if (isFromKeyboard) { + this.addNewEditorFromKeyboard(); } - element.addEventListener("input", event => { - storage.setValue(id, { - value: event.target.value - }); - this.setPropertyOnSiblings(element, "value", event.target.value, "value"); - elementData.formattedValue = null; - }); - element.addEventListener("resetform", event => { - const defaultValue = this.data.defaultFieldValue ?? ""; - element.value = elementData.userValue = defaultValue; - elementData.formattedValue = null; - }); - let blurListener = event => { - const { - formattedValue - } = elementData; - if (formattedValue !== null && formattedValue !== undefined) { - event.target.value = formattedValue; + this.#updateModeCapability.resolve(); + return; + } + for (const editor of this.#allEditors.values()) { + if (editor.uid === editId) { + this.setSelected(editor); + if (editComment) { + editor.editComment(); + } else if (mustEnterInEditMode) { + editor.enterInEditMode(); + } else { + editor.focus(); } - event.target.scrollLeft = 0; - }; - if (this.enableScripting && this.hasJSActions) { - element.addEventListener("focus", event => { - if (elementData.focused) { - return; - } - const { - target - } = event; - if (elementData.userValue) { - target.value = elementData.userValue; - } - elementData.lastCommittedValue = target.value; - elementData.commitKey = 1; - if (!this.data.actions?.Focus) { - elementData.focused = true; - } - }); - element.addEventListener("updatefromsandbox", jsEvent => { - this.showElementAndHideCanvas(jsEvent.target); - const actions = { - value(event) { - elementData.userValue = event.detail.value ?? ""; - storage.setValue(id, { - value: elementData.userValue.toString() - }); - event.target.value = elementData.userValue; - }, - formattedValue(event) { - const { - formattedValue - } = event.detail; - elementData.formattedValue = formattedValue; - if (formattedValue !== null && formattedValue !== undefined && event.target !== document.activeElement) { - event.target.value = formattedValue; - } - storage.setValue(id, { - formattedValue - }); - }, - selRange(event) { - event.target.setSelectionRange(...event.detail.selRange); - }, - charLimit: event => { - const { - charLimit - } = event.detail; - const { - target - } = event; - if (charLimit === 0) { - target.removeAttribute("maxLength"); - return; - } - target.setAttribute("maxLength", charLimit); - let value = elementData.userValue; - if (!value || value.length <= charLimit) { - return; - } - value = value.slice(0, charLimit); - target.value = elementData.userValue = value; - storage.setValue(id, { - value - }); - this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { - source: this, - detail: { - id, - name: "Keystroke", - value, - willCommit: true, - commitKey: 1, - selStart: target.selectionStart, - selEnd: target.selectionEnd - } - }); - } - }; - this._dispatchEventFromSandbox(actions, jsEvent); - }); - element.addEventListener("keydown", event => { - elementData.commitKey = 1; - let commitKey = -1; - if (event.key === "Escape") { - commitKey = 0; - } else if (event.key === "Enter" && !this.data.multiLine) { - commitKey = 2; - } else if (event.key === "Tab") { - elementData.commitKey = 3; - } - if (commitKey === -1) { - return; - } - const { - value - } = event.target; - if (elementData.lastCommittedValue === value) { - return; - } - elementData.lastCommittedValue = value; - elementData.userValue = value; - this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { - source: this, - detail: { - id, - name: "Keystroke", - value, - willCommit: true, - commitKey, - selStart: event.target.selectionStart, - selEnd: event.target.selectionEnd + } else { + editor.unselect(); + } + } + this.#updateModeCapability.resolve(); + } + addNewEditorFromKeyboard() { + if (this.currentLayer.canCreateNewEmptyEditor()) { + this.currentLayer.addNewEditor(); + } + } + updateToolbar(options) { + if (options.mode === this.#mode) { + return; + } + this._eventBus.dispatch("switchannotationeditormode", { + source: this, + ...options + }); + } + updateParams(type, value) { + if (!this.#editorTypes) { + return; + } + switch (type) { + case AnnotationEditorParamsType.CREATE: + this.currentLayer.addNewEditor(value); + return; + case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL: + this._eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data: { + type: "highlight", + action: "toggle_visibility" } - }); - }); - const _blurListener = blurListener; - blurListener = null; - element.addEventListener("blur", event => { - if (!elementData.focused || !event.relatedTarget) { - return; - } - if (!this.data.actions?.Blur) { - elementData.focused = false; - } - const { - value - } = event.target; - elementData.userValue = value; - if (elementData.lastCommittedValue !== value) { - this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { - source: this, - detail: { - id, - name: "Keystroke", - value, - willCommit: true, - commitKey: elementData.commitKey, - selStart: event.target.selectionStart, - selEnd: event.target.selectionEnd - } - }); } - _blurListener(event); }); - if (this.data.actions?.Keystroke) { - element.addEventListener("beforeinput", event => { - elementData.lastCommittedValue = null; - const { - data, - target - } = event; - const { - value, - selectionStart, - selectionEnd - } = target; - let selStart = selectionStart, - selEnd = selectionEnd; - switch (event.inputType) { - case "deleteWordBackward": - { - const match = value.substring(0, selectionStart).match(/\w*[^\w]*$/); - if (match) { - selStart -= match[0].length; - } - break; - } - case "deleteWordForward": - { - const match = value.substring(selectionStart).match(/^[^\w]*\w*/); - if (match) { - selEnd += match[0].length; - } - break; - } - case "deleteContentBackward": - if (selectionStart === selectionEnd) { - selStart -= 1; - } - break; - case "deleteContentForward": - if (selectionStart === selectionEnd) { - selEnd += 1; - } - break; - } - event.preventDefault(); - this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { - source: this, - detail: { - id, - name: "Keystroke", - value, - change: data || "", - willCommit: false, - selStart, - selEnd - } - }); - }); - } - this._setEventListeners(element, elementData, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.value); - } - if (blurListener) { - element.addEventListener("blur", blurListener); - } - if (this.data.comb) { - const fieldWidth = this.data.rect[2] - this.data.rect[0]; - const combWidth = fieldWidth / maxLen; - element.classList.add("comb"); - element.style.letterSpacing = `calc(${combWidth}px * var(--scale-factor) - 1ch)`; + (this.#showAllStates ||= new Map()).set(type, value); + this.showAllEditors("highlight", value); + break; + } + if (this.hasSelection) { + for (const editor of this.#selectedEditors) { + editor.updateParams(type, value); } } else { - element = document.createElement("div"); - element.textContent = this.data.fieldValue; - element.style.verticalAlign = "middle"; - element.style.display = "table-cell"; - if (this.data.hasOwnCanvas) { - element.hidden = true; + for (const editorType of this.#editorTypes) { + editorType.updateDefaultParams(type, value); } } - this._setTextStyle(element); - this._setBackgroundColor(element); - this._setDefaultPropertiesFromJS(element); - this.container.append(element); - return this.container; } -} -class SignatureWidgetAnnotationElement extends WidgetAnnotationElement { - constructor(parameters) { - super(parameters, { - isRenderable: !!parameters.data.hasOwnCanvas - }); + showAllEditors(type, visible, updateButton = false) { + for (const editor of this.#allEditors.values()) { + if (editor.editorType === type) { + editor.show(visible); + } + } + const state = this.#showAllStates?.get(AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL) ?? true; + if (state !== visible) { + this.#dispatchUpdateUI([[AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL, visible]]); + } } -} -class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement { - constructor(parameters) { - super(parameters, { - isRenderable: parameters.renderForms - }); + enableWaiting(mustWait = false) { + if (this.#isWaiting === mustWait) { + return; + } + this.#isWaiting = mustWait; + for (const layer of this.#allLayers.values()) { + if (mustWait) { + layer.disableClick(); + } else { + layer.enableClick(); + } + layer.div.classList.toggle("waiting", mustWait); + } } - render() { - const storage = this.annotationStorage; - const data = this.data; - const id = data.id; - let value = storage.getValue(id, { - value: data.exportValue === data.fieldValue - }).value; - if (typeof value === "string") { - value = value !== "Off"; - storage.setValue(id, { - value - }); + async #enableAll() { + if (!this.#isEnabled) { + this.#isEnabled = true; + const promises = []; + for (const layer of this.#allLayers.values()) { + promises.push(layer.enable()); + } + await Promise.all(promises); + for (const editor of this.#allEditors.values()) { + editor.enable(); + } } - this.container.classList.add("buttonWidgetAnnotation", "checkBox"); - const element = document.createElement("input"); - GetElementsByNameSet.add(element); - element.setAttribute("data-element-id", id); - element.disabled = data.readOnly; - this._setRequired(element, this.data.required); - element.type = "checkbox"; - element.name = data.fieldName; - if (value) { - element.setAttribute("checked", true); + } + #disableAll() { + this.unselectAll(); + if (this.#isEnabled) { + this.#isEnabled = false; + for (const layer of this.#allLayers.values()) { + layer.disable(); + } + for (const editor of this.#allEditors.values()) { + editor.disable(); + } } - element.setAttribute("exportValue", data.exportValue); - element.tabIndex = DEFAULT_TAB_INDEX; - element.addEventListener("change", event => { - const { - name, - checked - } = event.target; - for (const checkbox of this._getElementsByName(name, id)) { - const curChecked = checked && checkbox.exportValue === data.exportValue; - if (checkbox.domElement) { - checkbox.domElement.checked = curChecked; - } - storage.setValue(checkbox.id, { - value: curChecked - }); + } + *getEditors(pageIndex) { + for (const editor of this.#allEditors.values()) { + if (editor.pageIndex === pageIndex) { + yield editor; } - storage.setValue(id, { - value: checked + } + } + getEditor(id) { + return this.#allEditors.get(id); + } + addEditor(editor) { + this.#allEditors.set(editor.id, editor); + } + removeEditor(editor) { + if (editor.div.contains(document.activeElement)) { + if (this.#focusMainContainerTimeoutId) { + clearTimeout(this.#focusMainContainerTimeoutId); + } + this.#focusMainContainerTimeoutId = setTimeout(() => { + this.focusMainContainer(); + this.#focusMainContainerTimeoutId = null; + }, 0); + } + this.#allEditors.delete(editor.id); + if (editor.annotationElementId) { + this.#missingCanvases?.delete(editor.annotationElementId); + } + this.unselect(editor); + if (!editor.annotationElementId || !this.#deletedAnnotationsElementIds.has(editor.annotationElementId)) { + this.#annotationStorage?.remove(editor.id); + } + } + addDeletedAnnotationElement(editor) { + this.#deletedAnnotationsElementIds.add(editor.annotationElementId); + this.addChangedExistingAnnotation(editor); + editor.deleted = true; + } + isDeletedAnnotationElement(annotationElementId) { + return this.#deletedAnnotationsElementIds.has(annotationElementId); + } + removeDeletedAnnotationElement(editor) { + this.#deletedAnnotationsElementIds.delete(editor.annotationElementId); + this.removeChangedExistingAnnotation(editor); + editor.deleted = false; + } + #addEditorToLayer(editor) { + const layer = this.#allLayers.get(editor.pageIndex); + if (layer) { + layer.addOrRebuild(editor); + } else { + this.addEditor(editor); + this.addToAnnotationStorage(editor); + } + } + setActiveEditor(editor) { + if (this.#activeEditor === editor) { + return; + } + this.#activeEditor = editor; + if (editor) { + this.#dispatchUpdateUI(editor.propertiesToUpdate); + } + } + get #lastSelectedEditor() { + let ed = null; + for (ed of this.#selectedEditors) {} + return ed; + } + updateUI(editor) { + if (this.#lastSelectedEditor === editor) { + this.#dispatchUpdateUI(editor.propertiesToUpdate); + } + } + updateUIForDefaultProperties(editorType) { + this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate); + } + toggleSelected(editor) { + if (this.#selectedEditors.has(editor)) { + this.#selectedEditors.delete(editor); + editor.unselect(); + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection }); + return; + } + this.#selectedEditors.add(editor); + editor.select(); + this.#dispatchUpdateUI(editor.propertiesToUpdate); + this.#dispatchUpdateStates({ + hasSelectedEditor: true }); - element.addEventListener("resetform", event => { - const defaultValue = data.defaultFieldValue || "Off"; - event.target.checked = defaultValue === data.exportValue; + } + setSelected(editor) { + this.updateToolbar({ + mode: editor.mode, + editId: editor.uid }); - if (this.enableScripting && this.hasJSActions) { - element.addEventListener("updatefromsandbox", jsEvent => { - const actions = { - value(event) { - event.target.checked = event.detail.value !== "Off"; - storage.setValue(id, { - value: event.target.checked - }); - } - }; - this._dispatchEventFromSandbox(actions, jsEvent); - }); - this._setEventListeners(element, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); + this.#currentDrawingSession?.commitOrRemove(); + for (const ed of this.#selectedEditors) { + if (ed !== editor) { + ed.unselect(); + } } - this._setBackgroundColor(element); - this._setDefaultPropertiesFromJS(element); - this.container.append(element); - return this.container; + this.#commentManager?.destroyPopup(); + this.#selectedEditors.clear(); + this.#selectedEditors.add(editor); + editor.select(); + this.#dispatchUpdateUI(editor.propertiesToUpdate); + this.#dispatchUpdateStates({ + hasSelectedEditor: true + }); } -} -class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement { - constructor(parameters) { - super(parameters, { - isRenderable: parameters.renderForms + get firstSelectedEditor() { + return this.#selectedEditors.values().next().value; + } + unselect(editor) { + editor.unselect(); + this.#selectedEditors.delete(editor); + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection }); } - render() { - this.container.classList.add("buttonWidgetAnnotation", "radioButton"); - const storage = this.annotationStorage; - const data = this.data; - const id = data.id; - let value = storage.getValue(id, { - value: data.fieldValue === data.buttonValue - }).value; - if (typeof value === "string") { - value = value !== data.buttonValue; - storage.setValue(id, { - value - }); + get hasSelection() { + return this.#selectedEditors.size !== 0; + } + get isEnterHandled() { + return this.#selectedEditors.size === 1 && this.firstSelectedEditor.isEnterHandled; + } + undo() { + this.#commandManager.undo(); + this.#dispatchUpdateStates({ + hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(), + hasSomethingToRedo: true, + isEmpty: this.#isEmpty() + }); + this._editorUndoBar?.hide(); + } + redo() { + this.#commandManager.redo(); + this.#dispatchUpdateStates({ + hasSomethingToUndo: true, + hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(), + isEmpty: this.#isEmpty() + }); + } + addCommands(params) { + this.#commandManager.add(params); + this.#dispatchUpdateStates({ + hasSomethingToUndo: true, + hasSomethingToRedo: false, + isEmpty: this.#isEmpty() + }); + } + cleanUndoStack(type) { + this.#commandManager.cleanType(type); + } + #isEmpty() { + if (this.#allEditors.size === 0) { + return true; } - if (value) { - for (const radio of this._getElementsByName(data.fieldName, id)) { - storage.setValue(radio.id, { - value: false - }); + if (this.#allEditors.size === 1) { + for (const editor of this.#allEditors.values()) { + return editor.isEmpty(); } } - const element = document.createElement("input"); - GetElementsByNameSet.add(element); - element.setAttribute("data-element-id", id); - element.disabled = data.readOnly; - this._setRequired(element, this.data.required); - element.type = "radio"; - element.name = data.fieldName; - if (value) { - element.setAttribute("checked", true); + return false; + } + delete() { + this.commitOrRemove(); + const drawingEditor = this.currentLayer?.endDrawingSession(true); + if (!this.hasSelection && !drawingEditor) { + return; } - element.tabIndex = DEFAULT_TAB_INDEX; - element.addEventListener("change", event => { - const { - name, - checked - } = event.target; - for (const radio of this._getElementsByName(name, id)) { - storage.setValue(radio.id, { - value: false - }); + const editors = drawingEditor ? [drawingEditor] : [...this.#selectedEditors]; + const cmd = () => { + this._editorUndoBar?.show(undo, editors.length === 1 ? editors[0].editorType : editors.length); + for (const editor of editors) { + editor.remove(); } - storage.setValue(id, { - value: checked - }); + }; + const undo = () => { + for (const editor of editors) { + this.#addEditorToLayer(editor); + } + }; + this.addCommands({ + cmd, + undo, + mustExec: true }); - element.addEventListener("resetform", event => { - const defaultValue = data.defaultFieldValue; - event.target.checked = defaultValue !== null && defaultValue !== undefined && defaultValue === data.buttonValue; + } + commitOrRemove() { + this.#activeEditor?.commitOrRemove(); + } + hasSomethingToControl() { + return this.#activeEditor || this.hasSelection; + } + #selectEditors(editors) { + for (const editor of this.#selectedEditors) { + editor.unselect(); + } + this.#selectedEditors.clear(); + for (const editor of editors) { + if (editor.isEmpty()) { + continue; + } + this.#selectedEditors.add(editor); + editor.select(); + } + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection }); - if (this.enableScripting && this.hasJSActions) { - const pdfButtonValue = data.buttonValue; - element.addEventListener("updatefromsandbox", jsEvent => { - const actions = { - value: event => { - const checked = pdfButtonValue === event.detail.value; - for (const radio of this._getElementsByName(event.target.name)) { - const curChecked = checked && radio.id === id; - if (radio.domElement) { - radio.domElement.checked = curChecked; - } - storage.setValue(radio.id, { - value: curChecked - }); + } + selectAll() { + for (const editor of this.#selectedEditors) { + editor.commit(); + } + this.#selectEditors(this.#allEditors.values()); + } + unselectAll() { + if (this.#activeEditor) { + this.#activeEditor.commitOrRemove(); + if (this.#mode !== AnnotationEditorType.NONE) { + return; + } + } + if (this.#currentDrawingSession?.commitOrRemove()) { + return; + } + this.#commentManager?.destroyPopup(); + if (!this.hasSelection) { + return; + } + for (const editor of this.#selectedEditors) { + editor.unselect(); + } + this.#selectedEditors.clear(); + this.#dispatchUpdateStates({ + hasSelectedEditor: false + }); + } + translateSelectedEditors(x, y, noCommit = false) { + if (!noCommit) { + this.commitOrRemove(); + } + if (!this.hasSelection) { + return; + } + this.#translation[0] += x; + this.#translation[1] += y; + const [totalX, totalY] = this.#translation; + const editors = [...this.#selectedEditors]; + const TIME_TO_WAIT = 1000; + if (this.#translationTimeoutId) { + clearTimeout(this.#translationTimeoutId); + } + this.#translationTimeoutId = setTimeout(() => { + this.#translationTimeoutId = null; + this.#translation[0] = this.#translation[1] = 0; + this.addCommands({ + cmd: () => { + for (const editor of editors) { + if (this.#allEditors.has(editor.id)) { + editor.translateInPage(totalX, totalY); + editor.translationDone(); } } - }; - this._dispatchEventFromSandbox(actions, jsEvent); + }, + undo: () => { + for (const editor of editors) { + if (this.#allEditors.has(editor.id)) { + editor.translateInPage(-totalX, -totalY); + editor.translationDone(); + } + } + }, + mustExec: false }); - this._setEventListeners(element, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); + }, TIME_TO_WAIT); + for (const editor of editors) { + editor.translateInPage(x, y); + editor.translationDone(); } - this._setBackgroundColor(element); - this._setDefaultPropertiesFromJS(element); - this.container.append(element); - return this.container; } -} -class PushButtonWidgetAnnotationElement extends LinkAnnotationElement { - constructor(parameters) { - super(parameters, { - ignoreBorder: parameters.data.hasAppearance + setUpDragSession() { + if (!this.hasSelection) { + return; + } + this.disableUserSelect(true); + this.#draggingEditors = new Map(); + for (const editor of this.#selectedEditors) { + this.#draggingEditors.set(editor, { + savedX: editor.x, + savedY: editor.y, + savedPageIndex: editor.pageIndex, + newX: 0, + newY: 0, + newPageIndex: -1 + }); + } + } + endDragSession() { + if (!this.#draggingEditors) { + return false; + } + this.disableUserSelect(false); + const map = this.#draggingEditors; + this.#draggingEditors = null; + let mustBeAddedInUndoStack = false; + for (const [{ + x, + y, + pageIndex + }, value] of map) { + value.newX = x; + value.newY = y; + value.newPageIndex = pageIndex; + mustBeAddedInUndoStack ||= x !== value.savedX || y !== value.savedY || pageIndex !== value.savedPageIndex; + } + if (!mustBeAddedInUndoStack) { + return false; + } + const move = (editor, x, y, pageIndex) => { + if (this.#allEditors.has(editor.id)) { + const parent = this.#allLayers.get(pageIndex); + if (parent) { + editor._setParentAndPosition(parent, x, y); + } else { + editor.pageIndex = pageIndex; + editor.x = x; + editor.y = y; + } + } + }; + this.addCommands({ + cmd: () => { + for (const [editor, { + newX, + newY, + newPageIndex + }] of map) { + move(editor, newX, newY, newPageIndex); + } + }, + undo: () => { + for (const [editor, { + savedX, + savedY, + savedPageIndex + }] of map) { + move(editor, savedX, savedY, savedPageIndex); + } + }, + mustExec: true }); + return true; } - render() { - const container = super.render(); - container.classList.add("buttonWidgetAnnotation", "pushButton"); - const linkElement = container.lastChild; - if (this.enableScripting && this.hasJSActions && linkElement) { - this._setDefaultPropertiesFromJS(linkElement); - linkElement.addEventListener("updatefromsandbox", jsEvent => { - this._dispatchEventFromSandbox({}, jsEvent); - }); + dragSelectedEditors(tx, ty) { + if (!this.#draggingEditors) { + return; } - return container; + for (const editor of this.#draggingEditors.keys()) { + editor.drag(tx, ty); + } + } + rebuild(editor) { + if (editor.parent === null) { + const parent = this.getLayer(editor.pageIndex); + if (parent) { + parent.changeParent(editor); + parent.addOrRebuild(editor); + } else { + this.addEditor(editor); + this.addToAnnotationStorage(editor); + editor.rebuild(); + } + } else { + editor.parent.addOrRebuild(editor); + } + } + get isEditorHandlingKeyboard() { + return this.getActive()?.shouldGetKeyboardEvents() || this.#selectedEditors.size === 1 && this.firstSelectedEditor.shouldGetKeyboardEvents(); + } + isActive(editor) { + return this.#activeEditor === editor; + } + getActive() { + return this.#activeEditor; + } + getMode() { + return this.#mode; + } + isEditingMode() { + return this.#mode !== AnnotationEditorType.NONE; + } + get imageManager() { + return shadow(this, "imageManager", new ImageManager()); + } + getSelectionBoxes(textLayer) { + if (!textLayer) { + return null; + } + const selection = document.getSelection(); + for (let i = 0, ii = selection.rangeCount; i < ii; i++) { + if (!textLayer.contains(selection.getRangeAt(i).commonAncestorContainer)) { + return null; + } + } + const { + x: layerX, + y: layerY, + width: parentWidth, + height: parentHeight + } = textLayer.getBoundingClientRect(); + let rotator; + switch (textLayer.getAttribute("data-main-rotation")) { + case "90": + rotator = (x, y, w, h) => ({ + x: (y - layerY) / parentHeight, + y: 1 - (x + w - layerX) / parentWidth, + width: h / parentHeight, + height: w / parentWidth + }); + break; + case "180": + rotator = (x, y, w, h) => ({ + x: 1 - (x + w - layerX) / parentWidth, + y: 1 - (y + h - layerY) / parentHeight, + width: w / parentWidth, + height: h / parentHeight + }); + break; + case "270": + rotator = (x, y, w, h) => ({ + x: 1 - (y + h - layerY) / parentHeight, + y: (x - layerX) / parentWidth, + width: h / parentHeight, + height: w / parentWidth + }); + break; + default: + rotator = (x, y, w, h) => ({ + x: (x - layerX) / parentWidth, + y: (y - layerY) / parentHeight, + width: w / parentWidth, + height: h / parentHeight + }); + break; + } + const boxes = []; + for (let i = 0, ii = selection.rangeCount; i < ii; i++) { + const range = selection.getRangeAt(i); + if (range.collapsed) { + continue; + } + for (const { + x, + y, + width, + height + } of range.getClientRects()) { + if (width === 0 || height === 0) { + continue; + } + boxes.push(rotator(x, y, width, height)); + } + } + return boxes.length === 0 ? null : boxes; + } + addChangedExistingAnnotation({ + annotationElementId, + id + }) { + (this.#changedExistingAnnotations ||= new Map()).set(annotationElementId, id); + } + removeChangedExistingAnnotation({ + annotationElementId + }) { + this.#changedExistingAnnotations?.delete(annotationElementId); + } + renderAnnotationElement(annotation) { + const editorId = this.#changedExistingAnnotations?.get(annotation.data.id); + if (!editorId) { + return; + } + const editor = this.#annotationStorage.getRawValue(editorId); + if (!editor) { + return; + } + if (this.#mode === AnnotationEditorType.NONE && !editor.hasBeenModified) { + return; + } + editor.renderAnnotationElement(annotation); + } + setMissingCanvas(annotationId, annotationElementId, canvas) { + const editor = this.#missingCanvases?.get(annotationId); + if (!editor) { + return; + } + editor.setCanvas(annotationElementId, canvas); + this.#missingCanvases.delete(annotationId); + } + addMissingCanvas(annotationId, editor) { + (this.#missingCanvases ||= new Map()).set(annotationId, editor); } } -class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement { - constructor(parameters) { - super(parameters, { - isRenderable: parameters.renderForms + +;// ./src/display/editor/alt_text.js + +class AltText { + #altText = null; + #altTextDecorative = false; + #altTextButton = null; + #altTextButtonLabel = null; + #altTextTooltip = null; + #altTextTooltipTimeout = null; + #altTextWasFromKeyBoard = false; + #badge = null; + #editor = null; + #guessedText = null; + #textWithDisclaimer = null; + #useNewAltTextFlow = false; + static #l10nNewButton = null; + static _l10n = null; + constructor(editor) { + this.#editor = editor; + this.#useNewAltTextFlow = editor._uiManager.useNewAltTextFlow; + AltText.#l10nNewButton ||= Object.freeze({ + added: "pdfjs-editor-new-alt-text-added-button", + "added-label": "pdfjs-editor-new-alt-text-added-button-label", + missing: "pdfjs-editor-new-alt-text-missing-button", + "missing-label": "pdfjs-editor-new-alt-text-missing-button-label", + review: "pdfjs-editor-new-alt-text-to-review-button", + "review-label": "pdfjs-editor-new-alt-text-to-review-button-label" }); } - render() { - this.container.classList.add("choiceWidgetAnnotation"); - const storage = this.annotationStorage; - const id = this.data.id; - const storedData = storage.getValue(id, { - value: this.data.fieldValue + static initialize(l10n) { + AltText._l10n ??= l10n; + } + async render() { + const altText = this.#altTextButton = document.createElement("button"); + altText.className = "altText"; + altText.tabIndex = "0"; + const label = this.#altTextButtonLabel = document.createElement("span"); + altText.append(label); + if (this.#useNewAltTextFlow) { + altText.classList.add("new"); + altText.setAttribute("data-l10n-id", AltText.#l10nNewButton.missing); + label.setAttribute("data-l10n-id", AltText.#l10nNewButton["missing-label"]); + } else { + altText.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button"); + label.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button-label"); + } + const signal = this.#editor._uiManager._signal; + altText.addEventListener("contextmenu", noContextMenu, { + signal }); - const selectElement = document.createElement("select"); - GetElementsByNameSet.add(selectElement); - selectElement.setAttribute("data-element-id", id); - selectElement.disabled = this.data.readOnly; - this._setRequired(selectElement, this.data.required); - selectElement.name = this.data.fieldName; - selectElement.tabIndex = DEFAULT_TAB_INDEX; - let addAnEmptyEntry = this.data.combo && this.data.options.length > 0; - if (!this.data.combo) { - selectElement.size = this.data.options.length; - if (this.data.multiSelect) { - selectElement.multiple = true; - } - } - selectElement.addEventListener("resetform", event => { - const defaultValue = this.data.defaultFieldValue; - for (const option of selectElement.options) { - option.selected = option.value === defaultValue; + altText.addEventListener("pointerdown", event => event.stopPropagation(), { + signal + }); + const onClick = event => { + event.preventDefault(); + this.#editor._uiManager.editAltText(this.#editor); + if (this.#useNewAltTextFlow) { + this.#editor._reportTelemetry({ + action: "pdfjs.image.alt_text.image_status_label_clicked", + data: { + label: this.#label + } + }); } + }; + altText.addEventListener("click", onClick, { + capture: true, + signal }); - for (const option of this.data.options) { - const optionElement = document.createElement("option"); - optionElement.textContent = option.displayValue; - optionElement.value = option.exportValue; - if (storedData.value.includes(option.exportValue)) { - optionElement.setAttribute("selected", true); - addAnEmptyEntry = false; + altText.addEventListener("keydown", event => { + if (event.target === altText && event.key === "Enter") { + this.#altTextWasFromKeyBoard = true; + onClick(event); } - selectElement.append(optionElement); + }, { + signal + }); + await this.#setState(); + return altText; + } + get #label() { + return this.#altText && "added" || this.#altText === null && this.guessedText && "review" || "missing"; + } + finish() { + if (!this.#altTextButton) { + return; } - let removeEmptyEntry = null; - if (addAnEmptyEntry) { - const noneOptionElement = document.createElement("option"); - noneOptionElement.value = " "; - noneOptionElement.setAttribute("hidden", true); - noneOptionElement.setAttribute("selected", true); - selectElement.prepend(noneOptionElement); - removeEmptyEntry = () => { - noneOptionElement.remove(); - selectElement.removeEventListener("input", removeEmptyEntry); - removeEmptyEntry = null; - }; - selectElement.addEventListener("input", removeEmptyEntry); + this.#altTextButton.focus({ + focusVisible: this.#altTextWasFromKeyBoard + }); + this.#altTextWasFromKeyBoard = false; + } + isEmpty() { + if (this.#useNewAltTextFlow) { + return this.#altText === null; } - const getValue = isExport => { - const name = isExport ? "value" : "textContent"; - const { - options, - multiple - } = selectElement; - if (!multiple) { - return options.selectedIndex === -1 ? null : options[options.selectedIndex][name]; - } - return Array.prototype.filter.call(options, option => option.selected).map(option => option[name]); + return !this.#altText && !this.#altTextDecorative; + } + hasData() { + if (this.#useNewAltTextFlow) { + return this.#altText !== null || !!this.#guessedText; + } + return this.isEmpty(); + } + get guessedText() { + return this.#guessedText; + } + async setGuessedText(guessedText) { + if (this.#altText !== null) { + return; + } + this.#guessedText = guessedText; + this.#textWithDisclaimer = await AltText._l10n.get("pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer", { + generatedAltText: guessedText + }); + this.#setState(); + } + toggleAltTextBadge(visibility = false) { + if (!this.#useNewAltTextFlow || this.#altText) { + this.#badge?.remove(); + this.#badge = null; + return; + } + if (!this.#badge) { + const badge = this.#badge = document.createElement("div"); + badge.className = "noAltTextBadge"; + this.#editor.div.append(badge); + } + this.#badge.classList.toggle("hidden", !visibility); + } + serialize(isForCopying) { + let altText = this.#altText; + if (!isForCopying && this.#guessedText === altText) { + altText = this.#textWithDisclaimer; + } + return { + altText, + decorative: this.#altTextDecorative, + guessedText: this.#guessedText, + textWithDisclaimer: this.#textWithDisclaimer }; - let selectedValues = getValue(false); - const getItems = event => { - const options = event.target.options; - return Array.prototype.map.call(options, option => ({ - displayValue: option.textContent, - exportValue: option.value - })); + } + get data() { + return { + altText: this.#altText, + decorative: this.#altTextDecorative }; - if (this.enableScripting && this.hasJSActions) { - selectElement.addEventListener("updatefromsandbox", jsEvent => { - const actions = { - value(event) { - removeEmptyEntry?.(); - const value = event.detail.value; - const values = new Set(Array.isArray(value) ? value : [value]); - for (const option of selectElement.options) { - option.selected = values.has(option.value); - } - storage.setValue(id, { - value: getValue(true) - }); - selectedValues = getValue(false); - }, - multipleSelection(event) { - selectElement.multiple = true; - }, - remove(event) { - const options = selectElement.options; - const index = event.detail.remove; - options[index].selected = false; - selectElement.remove(index); - if (options.length > 0) { - const i = Array.prototype.findIndex.call(options, option => option.selected); - if (i === -1) { - options[0].selected = true; - } - } - storage.setValue(id, { - value: getValue(true), - items: getItems(event) - }); - selectedValues = getValue(false); - }, - clear(event) { - while (selectElement.length !== 0) { - selectElement.remove(0); - } - storage.setValue(id, { - value: null, - items: [] - }); - selectedValues = getValue(false); - }, - insert(event) { - const { - index, - displayValue, - exportValue - } = event.detail.insert; - const selectChild = selectElement.children[index]; - const optionElement = document.createElement("option"); - optionElement.textContent = displayValue; - optionElement.value = exportValue; - if (selectChild) { - selectChild.before(optionElement); - } else { - selectElement.append(optionElement); - } - storage.setValue(id, { - value: getValue(true), - items: getItems(event) - }); - selectedValues = getValue(false); - }, - items(event) { - const { - items - } = event.detail; - while (selectElement.length !== 0) { - selectElement.remove(0); - } - for (const item of items) { - const { - displayValue, - exportValue - } = item; - const optionElement = document.createElement("option"); - optionElement.textContent = displayValue; - optionElement.value = exportValue; - selectElement.append(optionElement); - } - if (selectElement.options.length > 0) { - selectElement.options[0].selected = true; - } - storage.setValue(id, { - value: getValue(true), - items: getItems(event) - }); - selectedValues = getValue(false); - }, - indices(event) { - const indices = new Set(event.detail.indices); - for (const option of event.target.options) { - option.selected = indices.has(option.index); - } - storage.setValue(id, { - value: getValue(true) - }); - selectedValues = getValue(false); - }, - editable(event) { - event.target.disabled = !event.detail.editable; - } - }; - this._dispatchEventFromSandbox(actions, jsEvent); + } + set data({ + altText, + decorative, + guessedText, + textWithDisclaimer, + cancel = false + }) { + if (guessedText) { + this.#guessedText = guessedText; + this.#textWithDisclaimer = textWithDisclaimer; + } + if (this.#altText === altText && this.#altTextDecorative === decorative) { + return; + } + if (!cancel) { + this.#altText = altText; + this.#altTextDecorative = decorative; + } + this.#setState(); + } + toggle(enabled = false) { + if (!this.#altTextButton) { + return; + } + if (!enabled && this.#altTextTooltipTimeout) { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + } + this.#altTextButton.disabled = !enabled; + } + shown() { + this.#editor._reportTelemetry({ + action: "pdfjs.image.alt_text.image_status_label_displayed", + data: { + label: this.#label + } + }); + } + destroy() { + this.#altTextButton?.remove(); + this.#altTextButton = null; + this.#altTextButtonLabel = null; + this.#altTextTooltip = null; + this.#badge?.remove(); + this.#badge = null; + } + async #setState() { + const button = this.#altTextButton; + if (!button) { + return; + } + if (this.#useNewAltTextFlow) { + button.classList.toggle("done", !!this.#altText); + button.setAttribute("data-l10n-id", AltText.#l10nNewButton[this.#label]); + this.#altTextButtonLabel?.setAttribute("data-l10n-id", AltText.#l10nNewButton[`${this.#label}-label`]); + if (!this.#altText) { + this.#altTextTooltip?.remove(); + return; + } + } else { + if (!this.#altText && !this.#altTextDecorative) { + button.classList.remove("done"); + this.#altTextTooltip?.remove(); + return; + } + button.classList.add("done"); + button.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-edit-button"); + } + let tooltip = this.#altTextTooltip; + if (!tooltip) { + this.#altTextTooltip = tooltip = document.createElement("span"); + tooltip.className = "tooltip"; + tooltip.setAttribute("role", "tooltip"); + tooltip.id = `alt-text-tooltip-${this.#editor.id}`; + const DELAY_TO_SHOW_TOOLTIP = 100; + const signal = this.#editor._uiManager._signal; + signal.addEventListener("abort", () => { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + }, { + once: true }); - selectElement.addEventListener("input", event => { - const exportValue = getValue(true); - storage.setValue(id, { - value: exportValue - }); - event.preventDefault(); - this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { - source: this, - detail: { - id, - name: "Keystroke", - value: selectedValues, - changeEx: exportValue, - willCommit: false, - commitKey: 1, - keyDown: false - } - }); + button.addEventListener("mouseenter", () => { + this.#altTextTooltipTimeout = setTimeout(() => { + this.#altTextTooltipTimeout = null; + this.#altTextTooltip.classList.add("show"); + this.#editor._reportTelemetry({ + action: "alt_text_tooltip" + }); + }, DELAY_TO_SHOW_TOOLTIP); + }, { + signal }); - this._setEventListeners(selectElement, null, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"], ["input", "Action"], ["input", "Validate"]], event => event.target.value); - } else { - selectElement.addEventListener("input", function (event) { - storage.setValue(id, { - value: getValue(true) - }); + button.addEventListener("mouseleave", () => { + if (this.#altTextTooltipTimeout) { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + } + this.#altTextTooltip?.classList.remove("show"); + }, { + signal }); } - if (this.data.combo) { - this._setTextStyle(selectElement); - } else {} - this._setBackgroundColor(selectElement); - this._setDefaultPropertiesFromJS(selectElement); - this.container.append(selectElement); - return this.container; + if (this.#altTextDecorative) { + tooltip.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-decorative-tooltip"); + } else { + tooltip.removeAttribute("data-l10n-id"); + tooltip.textContent = this.#altText; + } + if (!tooltip.parentNode) { + button.append(tooltip); + } + const element = this.#editor.getElementForAltText(); + element?.setAttribute("aria-describedby", tooltip.id); } } -class PopupAnnotationElement extends AnnotationElement { - constructor(parameters) { + +;// ./src/display/editor/comment.js + +class Comment { + #commentStandaloneButton = null; + #commentToolbarButton = null; + #commentWasFromKeyBoard = false; + #editor = null; + #initialText = null; + #richText = null; + #text = null; + #date = null; + #deleted = false; + #popupPosition = null; + constructor(editor) { + this.#editor = editor; + } + renderForToolbar() { + const button = this.#commentToolbarButton = document.createElement("button"); + button.className = "comment"; + return this.#render(button, false); + } + renderForStandalone() { + const button = this.#commentStandaloneButton = document.createElement("button"); + button.className = "annotationCommentButton"; + const position = this.#editor.commentButtonPosition; + if (position) { + const { + style + } = button; + style.insetInlineEnd = `calc(${100 * (this.#editor._uiManager.direction === "ltr" ? 1 - position[0] : position[0])}% - var(--comment-button-dim))`; + style.top = `calc(${100 * position[1]}% - var(--comment-button-dim))`; + const color = this.#editor.commentButtonColor; + if (color) { + style.backgroundColor = color; + } + } + return this.#render(button, true); + } + focusButton() { + setTimeout(() => { + (this.#commentStandaloneButton ?? this.#commentToolbarButton)?.focus(); + }, 0); + } + onUpdatedColor() { + if (!this.#commentStandaloneButton) { + return; + } + const color = this.#editor.commentButtonColor; + if (color) { + this.#commentStandaloneButton.style.backgroundColor = color; + } + this.#editor._uiManager.updatePopupColor(this.#editor); + } + get commentButtonWidth() { + return (this.#commentStandaloneButton?.getBoundingClientRect().width ?? 0) / this.#editor.parent.boundingClientRect.width; + } + get commentPopupPositionInLayer() { + if (this.#popupPosition) { + return this.#popupPosition; + } + if (!this.#commentStandaloneButton) { + return null; + } const { - data, - elements - } = parameters; - super(parameters, { - isRenderable: AnnotationElement._hasPopupData(data) + x, + y, + height + } = this.#commentStandaloneButton.getBoundingClientRect(); + const { + x: parentX, + y: parentY, + width: parentWidth, + height: parentHeight + } = this.#editor.parent.boundingClientRect; + return [(x - parentX) / parentWidth, (y + height - parentY) / parentHeight]; + } + set commentPopupPositionInLayer(pos) { + this.#popupPosition = pos; + } + hasDefaultPopupPosition() { + return this.#popupPosition === null; + } + removeStandaloneCommentButton() { + this.#commentStandaloneButton?.remove(); + this.#commentStandaloneButton = null; + } + removeToolbarCommentButton() { + this.#commentToolbarButton?.remove(); + this.#commentToolbarButton = null; + } + setCommentButtonStates({ + selected, + hasPopup + }) { + if (!this.#commentStandaloneButton) { + return; + } + this.#commentStandaloneButton.classList.toggle("selected", selected); + this.#commentStandaloneButton.ariaExpanded = hasPopup; + } + #render(comment, isStandalone) { + if (!this.#editor._uiManager.hasCommentManager()) { + return null; + } + comment.tabIndex = "0"; + comment.ariaHasPopup = "dialog"; + if (isStandalone) { + comment.ariaControls = "commentPopup"; + comment.setAttribute("data-l10n-id", "pdfjs-show-comment-button"); + } else { + comment.ariaControlsElements = [this.#editor._uiManager.getCommentDialogElement()]; + comment.setAttribute("data-l10n-id", "pdfjs-editor-add-comment-button"); + } + const signal = this.#editor._uiManager._signal; + if (!(signal instanceof AbortSignal) || signal.aborted) { + return comment; + } + comment.addEventListener("contextmenu", noContextMenu, { + signal + }); + if (isStandalone) { + comment.addEventListener("focusin", e => { + this.#editor._focusEventsAllowed = false; + stopEvent(e); + }, { + capture: true, + signal + }); + comment.addEventListener("focusout", e => { + this.#editor._focusEventsAllowed = true; + stopEvent(e); + }, { + capture: true, + signal + }); + } + comment.addEventListener("pointerdown", event => event.stopPropagation(), { + signal }); - this.elements = elements; + const onClick = event => { + event.preventDefault(); + if (comment === this.#commentToolbarButton) { + this.edit(); + } else { + this.#editor.toggleComment(true); + } + }; + comment.addEventListener("click", onClick, { + capture: true, + signal + }); + comment.addEventListener("keydown", event => { + if (event.target === comment && event.key === "Enter") { + this.#commentWasFromKeyBoard = true; + onClick(event); + } + }, { + signal + }); + comment.addEventListener("pointerenter", () => { + this.#editor.toggleComment(false, true); + }, { + signal + }); + comment.addEventListener("pointerleave", () => { + this.#editor.toggleComment(false, false); + }, { + signal + }); + return comment; } - render() { - this.container.classList.add("popupAnnotation"); - const popup = new PopupElement({ - container: this.container, - color: this.data.color, - titleObj: this.data.titleObj, - modificationDate: this.data.modificationDate, - contentsObj: this.data.contentsObj, - richText: this.data.richText, - rect: this.data.rect, - parentRect: this.data.parentRect || null, - parent: this.parent, - elements: this.elements, - open: this.data.open + edit(options) { + const position = this.commentPopupPositionInLayer; + let posX, posY; + if (position) { + [posX, posY] = position; + } else { + [posX, posY] = this.#editor.commentButtonPosition; + const { + width, + height, + x, + y + } = this.#editor; + posX = x + posX * width; + posY = y + posY * height; + } + const parentDimensions = this.#editor.parent.boundingClientRect; + const { + x: parentX, + y: parentY, + width: parentWidth, + height: parentHeight + } = parentDimensions; + this.#editor._uiManager.editComment(this.#editor, parentX + posX * parentWidth, parentY + posY * parentHeight, { + ...options, + parentDimensions }); - const elementIds = []; - for (const element of this.elements) { - element.popup = popup; - elementIds.push(element.data.id); - element.addHighlightArea(); + } + finish() { + if (!this.#commentToolbarButton) { + return; } - this.container.setAttribute("aria-controls", elementIds.map(id => `${util.AnnotationPrefix}${id}`).join(",")); - return this.container; + this.#commentToolbarButton.focus({ + focusVisible: this.#commentWasFromKeyBoard + }); + this.#commentWasFromKeyBoard = false; + } + isDeleted() { + return this.#deleted || this.#text === ""; + } + isEmpty() { + return this.#text === null; + } + hasBeenEdited() { + return this.isDeleted() || this.#text !== this.#initialText; + } + serialize() { + return this.data; + } + get data() { + return { + text: this.#text, + richText: this.#richText, + date: this.#date, + deleted: this.isDeleted() + }; + } + set data(text) { + if (text !== this.#text) { + this.#richText = null; + } + if (text === null) { + this.#text = ""; + this.#deleted = true; + return; + } + this.#text = text; + this.#date = new Date(); + this.#deleted = false; + } + restoreData({ + text, + richText, + date + }) { + this.#text = text; + this.#richText = richText; + this.#date = date; + this.#deleted = false; + } + setInitialText(text, richText = null) { + this.#initialText = text; + this.data = text; + this.#date = null; + this.#richText = richText; + } + shown() {} + destroy() { + this.#commentToolbarButton?.remove(); + this.#commentToolbarButton = null; + this.#commentStandaloneButton?.remove(); + this.#commentStandaloneButton = null; + this.#text = ""; + this.#richText = null; + this.#date = null; + this.#editor = null; + this.#commentWasFromKeyBoard = false; + this.#deleted = false; } } -class PopupElement { - #boundKeyDown = this.#keyDown.bind(this); - #boundHide = this.#hide.bind(this); - #boundShow = this.#show.bind(this); - #boundToggle = this.#toggle.bind(this); - #color = null; - #container = null; - #contentsObj = null; - #dateObj = null; - #elements = null; - #parent = null; - #parentRect = null; - #pinned = false; - #popup = null; - #rect = null; - #richText = null; - #titleObj = null; - #wasVisible = false; + +;// ./src/display/touch_manager.js + +class TouchManager { + #container; + #isPinching = false; + #isPinchingStopped = null; + #isPinchingDisabled; + #onPinchStart; + #onPinching; + #onPinchEnd; + #pointerDownAC = null; + #signal; + #touchInfo = null; + #touchManagerAC; + #touchMoveAC = null; constructor({ container, - color, - elements, - titleObj, - modificationDate, - contentsObj, - richText, - parent, - rect, - parentRect, - open + isPinchingDisabled = null, + isPinchingStopped = null, + onPinchStart = null, + onPinching = null, + onPinchEnd = null, + signal }) { this.#container = container; - this.#titleObj = titleObj; - this.#contentsObj = contentsObj; - this.#richText = richText; - this.#parent = parent; - this.#color = color; - this.#rect = rect; - this.#parentRect = parentRect; - this.#elements = elements; - this.#dateObj = display_utils.PDFDateString.toDateObject(modificationDate); - this.trigger = elements.flatMap(e => e.getElementsToTriggerPopup()); - for (const element of this.trigger) { - element.addEventListener("click", this.#boundToggle); - element.addEventListener("mouseenter", this.#boundShow); - element.addEventListener("mouseleave", this.#boundHide); - element.classList.add("popupTriggerArea"); + this.#isPinchingStopped = isPinchingStopped; + this.#isPinchingDisabled = isPinchingDisabled; + this.#onPinchStart = onPinchStart; + this.#onPinching = onPinching; + this.#onPinchEnd = onPinchEnd; + this.#touchManagerAC = new AbortController(); + this.#signal = AbortSignal.any([signal, this.#touchManagerAC.signal]); + container.addEventListener("touchstart", this.#onTouchStart.bind(this), { + passive: false, + signal: this.#signal + }); + } + get MIN_TOUCH_DISTANCE_TO_PINCH() { + return 35 / OutputScale.pixelRatio; + } + #onTouchStart(evt) { + if (this.#isPinchingDisabled?.()) { + return; } - for (const element of elements) { - element.container?.addEventListener("keydown", this.#boundKeyDown); + if (evt.touches.length === 1) { + if (this.#pointerDownAC) { + return; + } + const pointerDownAC = this.#pointerDownAC = new AbortController(); + const signal = AbortSignal.any([this.#signal, pointerDownAC.signal]); + const container = this.#container; + const opts = { + capture: true, + signal, + passive: false + }; + const cancelPointerDown = e => { + if (e.pointerType === "touch") { + this.#pointerDownAC?.abort(); + this.#pointerDownAC = null; + } + }; + container.addEventListener("pointerdown", e => { + if (e.pointerType === "touch") { + stopEvent(e); + cancelPointerDown(e); + } + }, opts); + container.addEventListener("pointerup", cancelPointerDown, opts); + container.addEventListener("pointercancel", cancelPointerDown, opts); + return; + } + if (!this.#touchMoveAC) { + this.#touchMoveAC = new AbortController(); + const signal = AbortSignal.any([this.#signal, this.#touchMoveAC.signal]); + const container = this.#container; + const opt = { + signal, + capture: false, + passive: false + }; + container.addEventListener("touchmove", this.#onTouchMove.bind(this), opt); + const onTouchEnd = this.#onTouchEnd.bind(this); + container.addEventListener("touchend", onTouchEnd, opt); + container.addEventListener("touchcancel", onTouchEnd, opt); + opt.capture = true; + container.addEventListener("pointerdown", stopEvent, opt); + container.addEventListener("pointermove", stopEvent, opt); + container.addEventListener("pointercancel", stopEvent, opt); + container.addEventListener("pointerup", stopEvent, opt); + this.#onPinchStart?.(); } - this.#container.hidden = true; - if (open) { - this.#toggle(); + stopEvent(evt); + if (evt.touches.length !== 2 || this.#isPinchingStopped?.()) { + this.#touchInfo = null; + return; + } + let [touch0, touch1] = evt.touches; + if (touch0.identifier > touch1.identifier) { + [touch0, touch1] = [touch1, touch0]; } + this.#touchInfo = { + touch0X: touch0.screenX, + touch0Y: touch0.screenY, + touch1X: touch1.screenX, + touch1Y: touch1.screenY + }; } - render() { - if (this.#popup) { + #onTouchMove(evt) { + if (!this.#touchInfo || evt.touches.length !== 2) { return; } + stopEvent(evt); + let [touch0, touch1] = evt.touches; + if (touch0.identifier > touch1.identifier) { + [touch0, touch1] = [touch1, touch0]; + } const { - page: { - view - }, - viewport: { - rawDims: { - pageWidth, - pageHeight, - pageX, - pageY - } - } - } = this.#parent; - const popup = this.#popup = document.createElement("div"); - popup.className = "popup"; - if (this.#color) { - const baseColor = popup.style.outlineColor = util.Util.makeHexColor(...this.#color); - if (CSS.supports("background-color", "color-mix(in srgb, red 30%, white)")) { - popup.style.backgroundColor = `color-mix(in srgb, ${baseColor} 30%, white)`; - } else { - const BACKGROUND_ENLIGHT = 0.7; - popup.style.backgroundColor = util.Util.makeHexColor(...this.#color.map(c => Math.floor(BACKGROUND_ENLIGHT * (255 - c) + c))); - } + screenX: screen0X, + screenY: screen0Y + } = touch0; + const { + screenX: screen1X, + screenY: screen1Y + } = touch1; + const touchInfo = this.#touchInfo; + const { + touch0X: pTouch0X, + touch0Y: pTouch0Y, + touch1X: pTouch1X, + touch1Y: pTouch1Y + } = touchInfo; + const prevGapX = pTouch1X - pTouch0X; + const prevGapY = pTouch1Y - pTouch0Y; + const currGapX = screen1X - screen0X; + const currGapY = screen1Y - screen0Y; + const distance = Math.hypot(currGapX, currGapY) || 1; + const pDistance = Math.hypot(prevGapX, prevGapY) || 1; + if (!this.#isPinching && Math.abs(pDistance - distance) <= TouchManager.MIN_TOUCH_DISTANCE_TO_PINCH) { + return; } - const header = document.createElement("span"); - header.className = "header"; - const title = document.createElement("h1"); - header.append(title); - ({ - dir: title.dir, - str: title.textContent - } = this.#titleObj); - popup.append(header); - if (this.#dateObj) { - const modificationDate = document.createElement("span"); - modificationDate.classList.add("popupDate"); - modificationDate.setAttribute("data-l10n-id", "pdfjs-annotation-date-string"); - modificationDate.setAttribute("data-l10n-args", JSON.stringify({ - date: this.#dateObj.toLocaleDateString(), - time: this.#dateObj.toLocaleTimeString() - })); - header.append(modificationDate); + touchInfo.touch0X = screen0X; + touchInfo.touch0Y = screen0Y; + touchInfo.touch1X = screen1X; + touchInfo.touch1Y = screen1Y; + if (!this.#isPinching) { + this.#isPinching = true; + return; } - const contentsObj = this.#contentsObj; - const richText = this.#richText; - if (richText?.str && (!contentsObj?.str || contentsObj.str === richText.str)) { - xfa_layer.XfaLayer.render({ - xfaHtml: richText.html, - intent: "richText", - div: popup - }); - popup.lastChild.classList.add("richText", "popupContent"); - } else { - const contents = this._formatContents(contentsObj); - popup.append(contents); + const origin = [(screen0X + screen1X) / 2, (screen0Y + screen1Y) / 2]; + this.#onPinching?.(origin, pDistance, distance); + } + #onTouchEnd(evt) { + if (evt.touches.length >= 2) { + return; } - let useParentRect = !!this.#parentRect; - let rect = useParentRect ? this.#parentRect : this.#rect; - for (const element of this.#elements) { - if (!rect || util.Util.intersect(element.data.rect, rect) !== null) { - rect = element.data.rect; - useParentRect = true; - break; - } + if (this.#touchMoveAC) { + this.#touchMoveAC.abort(); + this.#touchMoveAC = null; + this.#onPinchEnd?.(); } - const normalizedRect = util.Util.normalizeRect([rect[0], view[3] - rect[1] + view[1], rect[2], view[3] - rect[3] + view[1]]); - const HORIZONTAL_SPACE_AFTER_ANNOTATION = 5; - const parentWidth = useParentRect ? rect[2] - rect[0] + HORIZONTAL_SPACE_AFTER_ANNOTATION : 0; - const popupLeft = normalizedRect[0] + parentWidth; - const popupTop = normalizedRect[1]; - const { - style - } = this.#container; - style.left = `${100 * (popupLeft - pageX) / pageWidth}%`; - style.top = `${100 * (popupTop - pageY) / pageHeight}%`; - this.#container.append(popup); + if (!this.#touchInfo) { + return; + } + stopEvent(evt); + this.#touchInfo = null; + this.#isPinching = false; } - _formatContents({ - str, - dir - }) { - const p = document.createElement("p"); - p.classList.add("popupContent"); - p.dir = dir; - const lines = str.split(/(?:\r\n?|\n)/); - for (let i = 0, ii = lines.length; i < ii; ++i) { - const line = lines[i]; - p.append(document.createTextNode(line)); - if (i < ii - 1) { - p.append(document.createElement("br")); + destroy() { + this.#touchManagerAC?.abort(); + this.#touchManagerAC = null; + this.#pointerDownAC?.abort(); + this.#pointerDownAC = null; + } +} + +;// ./src/display/editor/editor.js + + + + + + + + +class AnnotationEditor { + #accessibilityData = null; + #allResizerDivs = null; + #altText = null; + #comment = null; + #commentStandaloneButton = null; + #disabled = false; + #dragPointerId = null; + #dragPointerType = ""; + #resizersDiv = null; + #lastPointerCoords = null; + #savedDimensions = null; + #fakeAnnotation = null; + #focusAC = null; + #focusedResizerName = ""; + #hasBeenClicked = false; + #initialRect = null; + #isEditing = false; + #isInEditMode = false; + #isResizerEnabledForKeyboard = false; + #moveInDOMTimeout = null; + #prevDragX = 0; + #prevDragY = 0; + #telemetryTimeouts = null; + #touchManager = null; + isSelected = false; + _isCopy = false; + _editToolbar = null; + _initialOptions = Object.create(null); + _initialData = null; + _isVisible = true; + _uiManager = null; + _focusEventsAllowed = true; + static _l10n = null; + static _l10nAlert = null; + static _l10nResizer = null; + #isDraggable = false; + #zIndex = AnnotationEditor._zIndex++; + static _borderLineWidth = -1; + static _colorManager = new ColorManager(); + static _zIndex = 1; + static _telemetryTimeout = 1000; + static get _resizerKeyboardManager() { + const resize = AnnotationEditor.prototype._resizeWithKeyboard; + const small = AnnotationEditorUIManager.TRANSLATE_SMALL; + const big = AnnotationEditorUIManager.TRANSLATE_BIG; + return shadow(this, "_resizerKeyboardManager", new KeyboardManager([[["ArrowLeft"], resize, { + args: [-small, 0] + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], resize, { + args: [-big, 0] + }], [["ArrowRight"], resize, { + args: [small, 0] + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], resize, { + args: [big, 0] + }], [["ArrowUp"], resize, { + args: [0, -small] + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], resize, { + args: [0, -big] + }], [["ArrowDown"], resize, { + args: [0, small] + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], resize, { + args: [0, big] + }], [["Escape"], AnnotationEditor.prototype._stopResizingWithKeyboard]])); + } + constructor(parameters) { + this.parent = parameters.parent; + this.id = parameters.id; + this.width = this.height = null; + this.pageIndex = parameters.parent.pageIndex; + this.name = parameters.name; + this.div = null; + this._uiManager = parameters.uiManager; + this.annotationElementId = null; + this._willKeepAspectRatio = false; + this._initialOptions.isCentered = parameters.isCentered; + this._structTreeParentId = null; + this.annotationElementId = parameters.annotationElementId || null; + this.creationDate = parameters.creationDate || new Date(); + this.modificationDate = parameters.modificationDate || null; + this.canAddComment = true; + const { + rotation, + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY } - } - return p; + } = this.parent.viewport; + this.rotation = rotation; + this.pageRotation = (360 + rotation - this._uiManager.viewParameters.rotation) % 360; + this.pageDimensions = [pageWidth, pageHeight]; + this.pageTranslation = [pageX, pageY]; + const [width, height] = this.parentDimensions; + this.x = parameters.x / width; + this.y = parameters.y / height; + this.isAttachedToDOM = false; + this.deleted = false; } - #keyDown(event) { - if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) { + updatePageIndex(newPageIndex) { + this.pageIndex = newPageIndex; + } + get editorType() { + return Object.getPrototypeOf(this).constructor._type; + } + get mode() { + return Object.getPrototypeOf(this).constructor._editorType; + } + static get isDrawer() { + return false; + } + static get _defaultLineColor() { + return shadow(this, "_defaultLineColor", this._colorManager.getHexCode("CanvasText")); + } + static deleteAnnotationElement(editor) { + const fakeEditor = new FakeEditor({ + id: editor._uiManager.getId(), + parent: editor.parent, + uiManager: editor._uiManager + }); + fakeEditor.annotationElementId = editor.annotationElementId; + fakeEditor.deleted = true; + fakeEditor._uiManager.addToAnnotationStorage(fakeEditor); + } + static initialize(l10n, _uiManager) { + AnnotationEditor._l10n ??= l10n; + AnnotationEditor._l10nAlert ??= Object.freeze({ + highlight: "pdfjs-editor-highlight-added-alert", + freetext: "pdfjs-editor-freetext-added-alert", + ink: "pdfjs-editor-ink-added-alert", + stamp: "pdfjs-editor-stamp-added-alert", + signature: "pdfjs-editor-signature-added-alert" + }); + AnnotationEditor._l10nResizer ??= Object.freeze({ + topLeft: "pdfjs-editor-resizer-top-left", + topMiddle: "pdfjs-editor-resizer-top-middle", + topRight: "pdfjs-editor-resizer-top-right", + middleRight: "pdfjs-editor-resizer-middle-right", + bottomRight: "pdfjs-editor-resizer-bottom-right", + bottomMiddle: "pdfjs-editor-resizer-bottom-middle", + bottomLeft: "pdfjs-editor-resizer-bottom-left", + middleLeft: "pdfjs-editor-resizer-middle-left" + }); + if (AnnotationEditor._borderLineWidth !== -1) { return; } - if (event.key === "Enter" || event.key === "Escape" && this.#pinned) { - this.#toggle(); + const style = getComputedStyle(document.documentElement); + AnnotationEditor._borderLineWidth = parseFloat(style.getPropertyValue("--outline-width")) || 0; + } + static updateDefaultParams(_type, _value) {} + static get defaultPropertiesToUpdate() { + return []; + } + static isHandlingMimeForPasting(mime) { + return false; + } + static paste(item, parent) { + unreachable("Not implemented"); + } + get propertiesToUpdate() { + return []; + } + get _isDraggable() { + return this.#isDraggable; + } + set _isDraggable(value) { + this.#isDraggable = value; + this.div?.classList.toggle("draggable", value); + } + get uid() { + return this.annotationElementId || this.id; + } + get isEnterHandled() { + return true; + } + center() { + const [pageWidth, pageHeight] = this.pageDimensions; + switch (this.parentRotation) { + case 90: + this.x -= this.height * pageHeight / (pageWidth * 2); + this.y += this.width * pageWidth / (pageHeight * 2); + break; + case 180: + this.x += this.width / 2; + this.y += this.height / 2; + break; + case 270: + this.x += this.height * pageHeight / (pageWidth * 2); + this.y -= this.width * pageWidth / (pageHeight * 2); + break; + default: + this.x -= this.width / 2; + this.y -= this.height / 2; + break; } + this.fixAndSetPosition(); } - #toggle() { - this.#pinned = !this.#pinned; - if (this.#pinned) { - this.#show(); - this.#container.addEventListener("click", this.#boundToggle); - this.#container.addEventListener("keydown", this.#boundKeyDown); + addCommands(params) { + this._uiManager.addCommands(params); + } + get currentLayer() { + return this._uiManager.currentLayer; + } + setInBackground() { + this.div.style.zIndex = 0; + } + setInForeground() { + this.div.style.zIndex = this.#zIndex; + } + setParent(parent) { + if (parent !== null) { + this.pageIndex = parent.pageIndex; + this.pageDimensions = parent.pageDimensions; } else { - this.#hide(); - this.#container.removeEventListener("click", this.#boundToggle); - this.#container.removeEventListener("keydown", this.#boundKeyDown); + this.#stopResizing(); + this.#fakeAnnotation?.remove(); + this.#fakeAnnotation = null; } + this.parent = parent; } - #show() { - if (!this.#popup) { - this.render(); + focusin(event) { + if (!this._focusEventsAllowed) { + return; } - if (!this.isVisible) { - this.#container.hidden = false; - this.#container.style.zIndex = parseInt(this.#container.style.zIndex) + 1000; - } else if (this.#pinned) { - this.#container.classList.add("focused"); + if (!this.#hasBeenClicked) { + this.parent.setSelected(this); + } else { + this.#hasBeenClicked = false; } } - #hide() { - this.#container.classList.remove("focused"); - if (this.#pinned || !this.isVisible) { + focusout(event) { + if (!this._focusEventsAllowed) { return; } - this.#container.hidden = true; - this.#container.style.zIndex = parseInt(this.#container.style.zIndex) - 1000; + if (!this.isAttachedToDOM) { + return; + } + const target = event.relatedTarget; + if (target?.closest(`#${this.id}`)) { + return; + } + event.preventDefault(); + if (!this.parent?.isMultipleSelection) { + this.commitOrRemove(); + } } - forceHide() { - this.#wasVisible = this.isVisible; - if (!this.#wasVisible) { + commitOrRemove() { + if (this.isEmpty()) { + this.remove(); + } else { + this.commit(); + } + } + commit() { + if (!this.isInEditMode()) { return; } - this.#container.hidden = true; + this.addToAnnotationStorage(); } - maybeShow() { - if (!this.#wasVisible) { + addToAnnotationStorage() { + this._uiManager.addToAnnotationStorage(this); + } + setAt(x, y, tx, ty) { + const [width, height] = this.parentDimensions; + [tx, ty] = this.screenToPageTranslation(tx, ty); + this.x = (x + tx) / width; + this.y = (y + ty) / height; + this.fixAndSetPosition(); + } + _moveAfterPaste(baseX, baseY) { + if (this.isClone) { + delete this.isClone; return; } - this.#wasVisible = false; - this.#container.hidden = false; + const [parentWidth, parentHeight] = this.parentDimensions; + this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight); + this._onTranslated(); } - get isVisible() { - return this.#container.hidden === false; + #translate([width, height], x, y) { + [x, y] = this.screenToPageTranslation(x, y); + this.x += x / width; + this.y += y / height; + this._onTranslating(this.x, this.y); + this.fixAndSetPosition(); } -} -class FreeTextAnnotationElement extends AnnotationElement { - constructor(parameters) { - super(parameters, { - isRenderable: true, - ignoreBorder: true + translate(x, y) { + this.#translate(this.parentDimensions, x, y); + } + translateInPage(x, y) { + this.#initialRect ||= [this.x, this.y, this.width, this.height]; + this.#translate(this.pageDimensions, x, y); + this.div.scrollIntoView({ + block: "nearest" }); - this.textContent = parameters.data.textContent; - this.textPosition = parameters.data.textPosition; - this.annotationEditorType = util.AnnotationEditorType.FREETEXT; } - render() { - this.container.classList.add("freeTextAnnotation"); - if (this.textContent) { - const content = document.createElement("div"); - content.classList.add("annotationTextContent"); - content.setAttribute("role", "comment"); - for (const line of this.textContent) { - const lineSpan = document.createElement("span"); - lineSpan.textContent = line; - content.append(lineSpan); + translationDone() { + this._onTranslated(this.x, this.y); + } + drag(tx, ty) { + this.#initialRect ||= [this.x, this.y, this.width, this.height]; + const { + div, + parentDimensions: [parentWidth, parentHeight] + } = this; + this.x += tx / parentWidth; + this.y += ty / parentHeight; + if (this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) { + const { + x, + y + } = this.div.getBoundingClientRect(); + if (this.parent.findNewParent(this, x, y)) { + this.x -= Math.floor(this.x); + this.y -= Math.floor(this.y); } - this.container.append(content); } - if (!this.data.popupRef && this.hasPopupData) { - this._createPopup(); - } - this._editOnDoubleClick(); - return this.container; + let { + x, + y + } = this; + const [bx, by] = this.getBaseTranslation(); + x += bx; + y += by; + const { + style + } = div; + style.left = `${(100 * x).toFixed(2)}%`; + style.top = `${(100 * y).toFixed(2)}%`; + this._onTranslating(x, y); + div.scrollIntoView({ + block: "nearest" + }); } - get _isEditable() { - return this.data.hasOwnCanvas; + _onTranslating(x, y) {} + _onTranslated(x, y) {} + get _hasBeenMoved() { + return !!this.#initialRect && (this.#initialRect[0] !== this.x || this.#initialRect[1] !== this.y); } -} -class LineAnnotationElement extends AnnotationElement { - #line = null; - constructor(parameters) { - super(parameters, { - isRenderable: true, - ignoreBorder: true - }); + get _hasBeenResized() { + return !!this.#initialRect && (this.#initialRect[2] !== this.width || this.#initialRect[3] !== this.height); } - render() { - this.container.classList.add("lineAnnotation"); - const data = this.data; + getBaseTranslation() { + const [parentWidth, parentHeight] = this.parentDimensions; const { + _borderLineWidth + } = AnnotationEditor; + const x = _borderLineWidth / parentWidth; + const y = _borderLineWidth / parentHeight; + switch (this.rotation) { + case 90: + return [-x, y]; + case 180: + return [x, y]; + case 270: + return [x, -y]; + default: + return [-x, -y]; + } + } + get _mustFixPosition() { + return true; + } + fixAndSetPosition(rotation = this.rotation) { + const { + div: { + style + }, + pageDimensions: [pageWidth, pageHeight] + } = this; + let { + x, + y, width, height - } = getRectDims(data.rect); - const svg = this.svgFactory.create(width, height, true); - const line = this.#line = this.svgFactory.createElement("svg:line"); - line.setAttribute("x1", data.rect[2] - data.lineCoordinates[0]); - line.setAttribute("y1", data.rect[3] - data.lineCoordinates[1]); - line.setAttribute("x2", data.rect[2] - data.lineCoordinates[2]); - line.setAttribute("y2", data.rect[3] - data.lineCoordinates[3]); - line.setAttribute("stroke-width", data.borderStyle.width || 1); - line.setAttribute("stroke", "transparent"); - line.setAttribute("fill", "transparent"); - svg.append(line); - this.container.append(svg); - if (!data.popupRef && this.hasPopupData) { - this._createPopup(); + } = this; + width *= pageWidth; + height *= pageHeight; + x *= pageWidth; + y *= pageHeight; + if (this._mustFixPosition) { + switch (rotation) { + case 0: + x = MathClamp(x, 0, pageWidth - width); + y = MathClamp(y, 0, pageHeight - height); + break; + case 90: + x = MathClamp(x, 0, pageWidth - height); + y = MathClamp(y, width, pageHeight); + break; + case 180: + x = MathClamp(x, width, pageWidth); + y = MathClamp(y, height, pageHeight); + break; + case 270: + x = MathClamp(x, height, pageWidth); + y = MathClamp(y, 0, pageHeight - width); + break; + } } - return this.container; + this.x = x /= pageWidth; + this.y = y /= pageHeight; + const [bx, by] = this.getBaseTranslation(); + x += bx; + y += by; + style.left = `${(100 * x).toFixed(2)}%`; + style.top = `${(100 * y).toFixed(2)}%`; + this.moveInDOM(); } - getElementsToTriggerPopup() { - return this.#line; + static #rotatePoint(x, y, angle) { + switch (angle) { + case 90: + return [y, -x]; + case 180: + return [-x, -y]; + case 270: + return [-y, x]; + default: + return [x, y]; + } } - addHighlightArea() { - this.container.classList.add("highlightArea"); + screenToPageTranslation(x, y) { + return AnnotationEditor.#rotatePoint(x, y, this.parentRotation); } -} -class SquareAnnotationElement extends AnnotationElement { - #square = null; - constructor(parameters) { - super(parameters, { - isRenderable: true, - ignoreBorder: true - }); + pageTranslationToScreen(x, y) { + return AnnotationEditor.#rotatePoint(x, y, 360 - this.parentRotation); } - render() { - this.container.classList.add("squareAnnotation"); - const data = this.data; - const { - width, - height - } = getRectDims(data.rect); - const svg = this.svgFactory.create(width, height, true); - const borderWidth = data.borderStyle.width; - const square = this.#square = this.svgFactory.createElement("svg:rect"); - square.setAttribute("x", borderWidth / 2); - square.setAttribute("y", borderWidth / 2); - square.setAttribute("width", width - borderWidth); - square.setAttribute("height", height - borderWidth); - square.setAttribute("stroke-width", borderWidth || 1); - square.setAttribute("stroke", "transparent"); - square.setAttribute("fill", "transparent"); - svg.append(square); - this.container.append(svg); - if (!data.popupRef && this.hasPopupData) { - this._createPopup(); + #getRotationMatrix(rotation) { + switch (rotation) { + case 90: + { + const [pageWidth, pageHeight] = this.pageDimensions; + return [0, -pageWidth / pageHeight, pageHeight / pageWidth, 0]; + } + case 180: + return [-1, 0, 0, -1]; + case 270: + { + const [pageWidth, pageHeight] = this.pageDimensions; + return [0, pageWidth / pageHeight, -pageHeight / pageWidth, 0]; + } + default: + return [1, 0, 0, 1]; } - return this.container; } - getElementsToTriggerPopup() { - return this.#square; + get parentScale() { + return this._uiManager.viewParameters.realScale; } - addHighlightArea() { - this.container.classList.add("highlightArea"); + get parentRotation() { + return (this._uiManager.viewParameters.rotation + this.pageRotation) % 360; } -} -class CircleAnnotationElement extends AnnotationElement { - #circle = null; - constructor(parameters) { - super(parameters, { - isRenderable: true, - ignoreBorder: true - }); + get parentDimensions() { + const { + parentScale, + pageDimensions: [pageWidth, pageHeight] + } = this; + return [pageWidth * parentScale, pageHeight * parentScale]; } - render() { - this.container.classList.add("circleAnnotation"); - const data = this.data; + setDims() { const { + div: { + style + }, width, height - } = getRectDims(data.rect); - const svg = this.svgFactory.create(width, height, true); - const borderWidth = data.borderStyle.width; - const circle = this.#circle = this.svgFactory.createElement("svg:ellipse"); - circle.setAttribute("cx", width / 2); - circle.setAttribute("cy", height / 2); - circle.setAttribute("rx", width / 2 - borderWidth / 2); - circle.setAttribute("ry", height / 2 - borderWidth / 2); - circle.setAttribute("stroke-width", borderWidth || 1); - circle.setAttribute("stroke", "transparent"); - circle.setAttribute("fill", "transparent"); - svg.append(circle); - this.container.append(svg); - if (!data.popupRef && this.hasPopupData) { - this._createPopup(); + } = this; + style.width = `${(100 * width).toFixed(2)}%`; + style.height = `${(100 * height).toFixed(2)}%`; + } + getInitialTranslation() { + return [0, 0]; + } + #createResizers() { + if (this.#resizersDiv) { + return; } - return this.container; + this.#resizersDiv = document.createElement("div"); + this.#resizersDiv.classList.add("resizers"); + const classes = this._willKeepAspectRatio ? ["topLeft", "topRight", "bottomRight", "bottomLeft"] : ["topLeft", "topMiddle", "topRight", "middleRight", "bottomRight", "bottomMiddle", "bottomLeft", "middleLeft"]; + const signal = this._uiManager._signal; + for (const name of classes) { + const div = document.createElement("div"); + this.#resizersDiv.append(div); + div.classList.add("resizer", name); + div.setAttribute("data-resizer-name", name); + div.addEventListener("pointerdown", this.#resizerPointerdown.bind(this, name), { + signal + }); + div.addEventListener("contextmenu", noContextMenu, { + signal + }); + div.tabIndex = -1; + } + this.div.prepend(this.#resizersDiv); } - getElementsToTriggerPopup() { - return this.#circle; + #resizerPointerdown(name, event) { + event.preventDefault(); + const { + isMac + } = FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + this.#altText?.toggle(false); + const savedDraggable = this._isDraggable; + this._isDraggable = false; + this.#lastPointerCoords = [event.screenX, event.screenY]; + const ac = new AbortController(); + const signal = this._uiManager.combinedSignal(ac); + this.parent.togglePointerEvents(false); + window.addEventListener("pointermove", this.#resizerPointermove.bind(this, name), { + passive: true, + capture: true, + signal + }); + window.addEventListener("touchmove", stopEvent, { + passive: false, + signal + }); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + this.#savedDimensions = { + savedX: this.x, + savedY: this.y, + savedWidth: this.width, + savedHeight: this.height + }; + const savedParentCursor = this.parent.div.style.cursor; + const savedCursor = this.div.style.cursor; + this.div.style.cursor = this.parent.div.style.cursor = window.getComputedStyle(event.target).cursor; + const pointerUpCallback = () => { + ac.abort(); + this.parent.togglePointerEvents(true); + this.#altText?.toggle(true); + this._isDraggable = savedDraggable; + this.parent.div.style.cursor = savedParentCursor; + this.div.style.cursor = savedCursor; + this.#addResizeToUndoStack(); + }; + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("blur", pointerUpCallback, { + signal + }); } - addHighlightArea() { - this.container.classList.add("highlightArea"); + #resize(x, y, width, height) { + this.width = width; + this.height = height; + this.x = x; + this.y = y; + this.setDims(); + this.fixAndSetPosition(); + this._onResized(); } -} -class PolylineAnnotationElement extends AnnotationElement { - #polyline = null; - constructor(parameters) { - super(parameters, { - isRenderable: true, - ignoreBorder: true + _onResized() {} + #addResizeToUndoStack() { + if (!this.#savedDimensions) { + return; + } + const { + savedX, + savedY, + savedWidth, + savedHeight + } = this.#savedDimensions; + this.#savedDimensions = null; + const newX = this.x; + const newY = this.y; + const newWidth = this.width; + const newHeight = this.height; + if (newX === savedX && newY === savedY && newWidth === savedWidth && newHeight === savedHeight) { + return; + } + this.addCommands({ + cmd: this.#resize.bind(this, newX, newY, newWidth, newHeight), + undo: this.#resize.bind(this, savedX, savedY, savedWidth, savedHeight), + mustExec: true }); - this.containerClassName = "polylineAnnotation"; - this.svgElementName = "svg:polyline"; } - render() { - this.container.classList.add(this.containerClassName); - const data = this.data; + static _round(x) { + return Math.round(x * 10000) / 10000; + } + #resizerPointermove(name, event) { + const [parentWidth, parentHeight] = this.parentDimensions; + const savedX = this.x; + const savedY = this.y; + const savedWidth = this.width; + const savedHeight = this.height; + const minWidth = AnnotationEditor.MIN_SIZE / parentWidth; + const minHeight = AnnotationEditor.MIN_SIZE / parentHeight; + const rotationMatrix = this.#getRotationMatrix(this.rotation); + const transf = (x, y) => [rotationMatrix[0] * x + rotationMatrix[2] * y, rotationMatrix[1] * x + rotationMatrix[3] * y]; + const invRotationMatrix = this.#getRotationMatrix(360 - this.rotation); + const invTransf = (x, y) => [invRotationMatrix[0] * x + invRotationMatrix[2] * y, invRotationMatrix[1] * x + invRotationMatrix[3] * y]; + let getPoint; + let getOpposite; + let isDiagonal = false; + let isHorizontal = false; + switch (name) { + case "topLeft": + isDiagonal = true; + getPoint = (w, h) => [0, 0]; + getOpposite = (w, h) => [w, h]; + break; + case "topMiddle": + getPoint = (w, h) => [w / 2, 0]; + getOpposite = (w, h) => [w / 2, h]; + break; + case "topRight": + isDiagonal = true; + getPoint = (w, h) => [w, 0]; + getOpposite = (w, h) => [0, h]; + break; + case "middleRight": + isHorizontal = true; + getPoint = (w, h) => [w, h / 2]; + getOpposite = (w, h) => [0, h / 2]; + break; + case "bottomRight": + isDiagonal = true; + getPoint = (w, h) => [w, h]; + getOpposite = (w, h) => [0, 0]; + break; + case "bottomMiddle": + getPoint = (w, h) => [w / 2, h]; + getOpposite = (w, h) => [w / 2, 0]; + break; + case "bottomLeft": + isDiagonal = true; + getPoint = (w, h) => [0, h]; + getOpposite = (w, h) => [w, 0]; + break; + case "middleLeft": + isHorizontal = true; + getPoint = (w, h) => [0, h / 2]; + getOpposite = (w, h) => [w, h / 2]; + break; + } + const point = getPoint(savedWidth, savedHeight); + const oppositePoint = getOpposite(savedWidth, savedHeight); + let transfOppositePoint = transf(...oppositePoint); + const oppositeX = AnnotationEditor._round(savedX + transfOppositePoint[0]); + const oppositeY = AnnotationEditor._round(savedY + transfOppositePoint[1]); + let ratioX = 1; + let ratioY = 1; + let deltaX, deltaY; + if (!event.fromKeyboard) { + const { + screenX, + screenY + } = event; + const [lastScreenX, lastScreenY] = this.#lastPointerCoords; + [deltaX, deltaY] = this.screenToPageTranslation(screenX - lastScreenX, screenY - lastScreenY); + this.#lastPointerCoords[0] = screenX; + this.#lastPointerCoords[1] = screenY; + } else { + ({ + deltaX, + deltaY + } = event); + } + [deltaX, deltaY] = invTransf(deltaX / parentWidth, deltaY / parentHeight); + if (isDiagonal) { + const oldDiag = Math.hypot(savedWidth, savedHeight); + ratioX = ratioY = Math.max(Math.min(Math.hypot(oppositePoint[0] - point[0] - deltaX, oppositePoint[1] - point[1] - deltaY) / oldDiag, 1 / savedWidth, 1 / savedHeight), minWidth / savedWidth, minHeight / savedHeight); + } else if (isHorizontal) { + ratioX = MathClamp(Math.abs(oppositePoint[0] - point[0] - deltaX), minWidth, 1) / savedWidth; + } else { + ratioY = MathClamp(Math.abs(oppositePoint[1] - point[1] - deltaY), minHeight, 1) / savedHeight; + } + const newWidth = AnnotationEditor._round(savedWidth * ratioX); + const newHeight = AnnotationEditor._round(savedHeight * ratioY); + transfOppositePoint = transf(...getOpposite(newWidth, newHeight)); + const newX = oppositeX - transfOppositePoint[0]; + const newY = oppositeY - transfOppositePoint[1]; + this.#initialRect ||= [this.x, this.y, this.width, this.height]; + this.width = newWidth; + this.height = newHeight; + this.x = newX; + this.y = newY; + this.setDims(); + this.fixAndSetPosition(); + this._onResizing(); + } + _onResizing() {} + altTextFinish() { + this.#altText?.finish(); + } + get toolbarButtons() { + return null; + } + async addEditToolbar() { + if (this._editToolbar || this.#isInEditMode) { + return this._editToolbar; + } + this._editToolbar = new EditorToolbar(this); + this.div.append(this._editToolbar.render()); const { - width, - height - } = getRectDims(data.rect); - const svg = this.svgFactory.create(width, height, true); - let points = []; - for (const coordinate of data.vertices) { - const x = coordinate.x - data.rect[0]; - const y = data.rect[3] - coordinate.y; - points.push(x + "," + y); + toolbarButtons + } = this; + if (toolbarButtons) { + for (const [name, tool] of toolbarButtons) { + await this._editToolbar.addButton(name, tool); + } } - points = points.join(" "); - const polyline = this.#polyline = this.svgFactory.createElement(this.svgElementName); - polyline.setAttribute("points", points); - polyline.setAttribute("stroke-width", data.borderStyle.width || 1); - polyline.setAttribute("stroke", "transparent"); - polyline.setAttribute("fill", "transparent"); - svg.append(polyline); - this.container.append(svg); - if (!data.popupRef && this.hasPopupData) { - this._createPopup(); + if (!this.hasComment) { + this._editToolbar.addButton("comment", this.addCommentButton()); } - return this.container; + this._editToolbar.addButton("delete"); + return this._editToolbar; } - getElementsToTriggerPopup() { - return this.#polyline; + addCommentButtonInToolbar() { + this._editToolbar?.addButtonBefore("comment", this.addCommentButton(), ".deleteButton"); } - addHighlightArea() { - this.container.classList.add("highlightArea"); + removeCommentButtonFromToolbar() { + this._editToolbar?.removeButton("comment"); } -} -class PolygonAnnotationElement extends PolylineAnnotationElement { - constructor(parameters) { - super(parameters); - this.containerClassName = "polygonAnnotation"; - this.svgElementName = "svg:polygon"; + removeEditToolbar() { + this._editToolbar?.remove(); + this._editToolbar = null; + this.#altText?.destroy(); } -} -class CaretAnnotationElement extends AnnotationElement { - constructor(parameters) { - super(parameters, { - isRenderable: true, - ignoreBorder: true - }); + addContainer(container) { + const editToolbarDiv = this._editToolbar?.div; + if (editToolbarDiv) { + editToolbarDiv.before(container); + } else { + this.div.append(container); + } } - render() { - this.container.classList.add("caretAnnotation"); - if (!this.data.popupRef && this.hasPopupData) { - this._createPopup(); + getClientDimensions() { + return this.div.getBoundingClientRect(); + } + createAltText() { + if (!this.#altText) { + AltText.initialize(AnnotationEditor._l10n); + this.#altText = new AltText(this); + if (this.#accessibilityData) { + this.#altText.data = this.#accessibilityData; + this.#accessibilityData = null; + } } - return this.container; + return this.#altText; } -} -class InkAnnotationElement extends AnnotationElement { - #polylines = []; - constructor(parameters) { - super(parameters, { - isRenderable: true, - ignoreBorder: true - }); - this.containerClassName = "inkAnnotation"; - this.svgElementName = "svg:polyline"; - this.annotationEditorType = util.AnnotationEditorType.INK; + get altTextData() { + return this.#altText?.data; } - render() { - this.container.classList.add(this.containerClassName); - const data = this.data; - const { - width, - height - } = getRectDims(data.rect); - const svg = this.svgFactory.create(width, height, true); - for (const inkList of data.inkLists) { - let points = []; - for (const coordinate of inkList) { - const x = coordinate.x - data.rect[0]; - const y = data.rect[3] - coordinate.y; - points.push(`${x},${y}`); + set altTextData(data) { + if (!this.#altText) { + return; + } + this.#altText.data = data; + } + get guessedAltText() { + return this.#altText?.guessedText; + } + async setGuessedAltText(text) { + await this.#altText?.setGuessedText(text); + } + serializeAltText(isForCopying) { + return this.#altText?.serialize(isForCopying); + } + hasAltText() { + return !!this.#altText && !this.#altText.isEmpty(); + } + hasAltTextData() { + return this.#altText?.hasData() ?? false; + } + focusCommentButton() { + this.#comment?.focusButton(); + } + addCommentButton() { + return this.canAddComment ? this.#comment ||= new Comment(this) : null; + } + addStandaloneCommentButton() { + if (!this._uiManager.hasCommentManager()) { + return; + } + if (this.#commentStandaloneButton) { + if (this._uiManager.isEditingMode()) { + this.#commentStandaloneButton.classList.remove("hidden"); } - points = points.join(" "); - const polyline = this.svgFactory.createElement(this.svgElementName); - this.#polylines.push(polyline); - polyline.setAttribute("points", points); - polyline.setAttribute("stroke-width", data.borderStyle.width || 1); - polyline.setAttribute("stroke", "transparent"); - polyline.setAttribute("fill", "transparent"); - if (!data.popupRef && this.hasPopupData) { - this._createPopup(); + return; + } + if (!this.hasComment) { + return; + } + this.#commentStandaloneButton = this.#comment.renderForStandalone(); + this.div.append(this.#commentStandaloneButton); + } + removeStandaloneCommentButton() { + this.#comment.removeStandaloneCommentButton(); + this.#commentStandaloneButton = null; + } + hideStandaloneCommentButton() { + this.#commentStandaloneButton?.classList.add("hidden"); + } + get comment() { + if (!this.#comment) { + return null; + } + const { + data: { + richText, + text, + date, + deleted } - svg.append(polyline); + } = this.#comment; + return { + text, + richText, + date, + deleted, + color: this.getNonHCMColor(), + opacity: this.opacity ?? 1 + }; + } + set comment(value) { + this.#comment ||= new Comment(this); + if (typeof value === "object" && value !== null) { + this.#comment.restoreData(value); + } else { + this.#comment.data = value; + } + if (this.hasComment) { + this.removeCommentButtonFromToolbar(); + this.addStandaloneCommentButton(); + this._uiManager.updateComment(this); + } else { + this.addCommentButtonInToolbar(); + this.removeStandaloneCommentButton(); + this._uiManager.removeComment(this); + } + } + setCommentData({ + comment, + popupRef, + richText + }) { + if (!popupRef) { + return; + } + this.#comment ||= new Comment(this); + this.#comment.setInitialText(comment, richText); + if (!this.annotationElementId) { + return; + } + const storedData = this._uiManager.getAndRemoveDataFromAnnotationStorage(this.annotationElementId); + if (storedData) { + this.updateFromAnnotationLayer(storedData); } - this.container.append(svg); - return this.container; } - getElementsToTriggerPopup() { - return this.#polylines; + get hasEditedComment() { + return this.#comment?.hasBeenEdited(); } - addHighlightArea() { - this.container.classList.add("highlightArea"); + get hasDeletedComment() { + return this.#comment?.isDeleted(); } -} -class HighlightAnnotationElement extends AnnotationElement { - constructor(parameters) { - super(parameters, { - isRenderable: true, - ignoreBorder: true, - createQuadrilaterals: true - }); + get hasComment() { + return !!this.#comment && !this.#comment.isEmpty() && !this.#comment.isDeleted(); } - render() { - if (!this.data.popupRef && this.hasPopupData) { - this._createPopup(); + async editComment(options) { + this.#comment ||= new Comment(this); + this.#comment.edit(options); + } + toggleComment(isSelected, visibility = undefined) { + if (this.hasComment) { + this._uiManager.toggleComment(this, isSelected, visibility); } - this.container.classList.add("highlightAnnotation"); - return this.container; } -} -class UnderlineAnnotationElement extends AnnotationElement { - constructor(parameters) { - super(parameters, { - isRenderable: true, - ignoreBorder: true, - createQuadrilaterals: true - }); + setSelectedCommentButton(selected) { + this.#comment.setSelectedButton(selected); } - render() { - if (!this.data.popupRef && this.hasPopupData) { - this._createPopup(); + addComment(serialized) { + if (this.hasEditedComment) { + const DEFAULT_POPUP_WIDTH = 180; + const DEFAULT_POPUP_HEIGHT = 100; + const [,,, trY] = serialized.rect; + const [pageWidth] = this.pageDimensions; + const [pageX] = this.pageTranslation; + const blX = pageX + pageWidth + 1; + const blY = trY - DEFAULT_POPUP_HEIGHT; + const trX = blX + DEFAULT_POPUP_WIDTH; + serialized.popup = { + contents: this.comment.text, + deleted: this.comment.deleted, + rect: [blX, blY, trX, trY] + }; } - this.container.classList.add("underlineAnnotation"); - return this.container; } -} -class SquigglyAnnotationElement extends AnnotationElement { - constructor(parameters) { - super(parameters, { - isRenderable: true, - ignoreBorder: true, - createQuadrilaterals: true - }); + updateFromAnnotationLayer({ + popup: { + contents, + deleted + } + }) { + this.#comment.data = deleted ? null : contents; + } + get parentBoundingClientRect() { + return this.parent.boundingClientRect; } render() { - if (!this.data.popupRef && this.hasPopupData) { - this._createPopup(); + const div = this.div = document.createElement("div"); + div.setAttribute("data-editor-rotation", (360 - this.rotation) % 360); + div.className = this.name; + div.setAttribute("id", this.id); + div.tabIndex = this.#disabled ? -1 : 0; + div.setAttribute("role", "application"); + if (this.defaultL10nId) { + div.setAttribute("data-l10n-id", this.defaultL10nId); } - this.container.classList.add("squigglyAnnotation"); - return this.container; + if (!this._isVisible) { + div.classList.add("hidden"); + } + this.setInForeground(); + this.#addFocusListeners(); + const [parentWidth, parentHeight] = this.parentDimensions; + if (this.parentRotation % 180 !== 0) { + div.style.maxWidth = `${(100 * parentHeight / parentWidth).toFixed(2)}%`; + div.style.maxHeight = `${(100 * parentWidth / parentHeight).toFixed(2)}%`; + } + const [tx, ty] = this.getInitialTranslation(); + this.translate(tx, ty); + bindEvents(this, div, ["keydown", "pointerdown", "dblclick"]); + if (this.isResizable && this._uiManager._supportsPinchToZoom) { + this.#touchManager ||= new TouchManager({ + container: div, + isPinchingDisabled: () => !this.isSelected, + onPinchStart: this.#touchPinchStartCallback.bind(this), + onPinching: this.#touchPinchCallback.bind(this), + onPinchEnd: this.#touchPinchEndCallback.bind(this), + signal: this._uiManager._signal + }); + } + this.addStandaloneCommentButton(); + this._uiManager._editorUndoBar?.hide(); + return div; } -} -class StrikeOutAnnotationElement extends AnnotationElement { - constructor(parameters) { - super(parameters, { - isRenderable: true, - ignoreBorder: true, - createQuadrilaterals: true - }); + #touchPinchStartCallback() { + this.#savedDimensions = { + savedX: this.x, + savedY: this.y, + savedWidth: this.width, + savedHeight: this.height + }; + this.#altText?.toggle(false); + this.parent.togglePointerEvents(false); } - render() { - if (!this.data.popupRef && this.hasPopupData) { - this._createPopup(); + #touchPinchCallback(_origin, prevDistance, distance) { + const slowDownFactor = 0.7; + let factor = slowDownFactor * (distance / prevDistance) + 1 - slowDownFactor; + if (factor === 1) { + return; } - this.container.classList.add("strikeoutAnnotation"); - return this.container; + const rotationMatrix = this.#getRotationMatrix(this.rotation); + const transf = (x, y) => [rotationMatrix[0] * x + rotationMatrix[2] * y, rotationMatrix[1] * x + rotationMatrix[3] * y]; + const [parentWidth, parentHeight] = this.parentDimensions; + const savedX = this.x; + const savedY = this.y; + const savedWidth = this.width; + const savedHeight = this.height; + const minWidth = AnnotationEditor.MIN_SIZE / parentWidth; + const minHeight = AnnotationEditor.MIN_SIZE / parentHeight; + factor = Math.max(Math.min(factor, 1 / savedWidth, 1 / savedHeight), minWidth / savedWidth, minHeight / savedHeight); + const newWidth = AnnotationEditor._round(savedWidth * factor); + const newHeight = AnnotationEditor._round(savedHeight * factor); + if (newWidth === savedWidth && newHeight === savedHeight) { + return; + } + this.#initialRect ||= [savedX, savedY, savedWidth, savedHeight]; + const transfCenterPoint = transf(savedWidth / 2, savedHeight / 2); + const centerX = AnnotationEditor._round(savedX + transfCenterPoint[0]); + const centerY = AnnotationEditor._round(savedY + transfCenterPoint[1]); + const newTransfCenterPoint = transf(newWidth / 2, newHeight / 2); + this.x = centerX - newTransfCenterPoint[0]; + this.y = centerY - newTransfCenterPoint[1]; + this.width = newWidth; + this.height = newHeight; + this.setDims(); + this.fixAndSetPosition(); + this._onResizing(); } -} -class StampAnnotationElement extends AnnotationElement { - constructor(parameters) { - super(parameters, { - isRenderable: true, - ignoreBorder: true - }); + #touchPinchEndCallback() { + this.#altText?.toggle(true); + this.parent.togglePointerEvents(true); + this.#addResizeToUndoStack(); } - render() { - this.container.classList.add("stampAnnotation"); - if (!this.data.popupRef && this.hasPopupData) { - this._createPopup(); + pointerdown(event) { + const { + isMac + } = FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + event.preventDefault(); + return; } - return this.container; + this.#hasBeenClicked = true; + if (this._isDraggable) { + this.#setUpDragSession(event); + return; + } + this.#selectOnPointerEvent(event); } -} -class FileAttachmentAnnotationElement extends AnnotationElement { - #trigger = null; - constructor(parameters) { - super(parameters, { - isRenderable: true - }); + #selectOnPointerEvent(event) { const { - filename, - content - } = this.data.file; - this.filename = (0,display_utils.getFilenameFromUrl)(filename, true); - this.content = content; - this.linkService.eventBus?.dispatch("fileattachmentannotation", { - source: this, - filename, - content - }); + isMac + } = FeatureTest.platform; + if (event.ctrlKey && !isMac || event.shiftKey || event.metaKey && isMac) { + this.parent.toggleSelected(this); + } else { + this.parent.setSelected(this); + } } - render() { - this.container.classList.add("fileAttachmentAnnotation"); + #setUpDragSession(event) { const { - container, - data + isSelected } = this; - let trigger; - if (data.hasAppearance || data.fillAlpha === 0) { - trigger = document.createElement("div"); - } else { - trigger = document.createElement("img"); - trigger.src = `${this.imageResourcesPath}annotation-${/paperclip/i.test(data.name) ? "paperclip" : "pushpin"}.svg`; - if (data.fillAlpha && data.fillAlpha < 1) { - trigger.style = `filter: opacity(${Math.round(data.fillAlpha * 100)}%);`; + this._uiManager.setUpDragSession(); + let hasDraggingStarted = false; + const ac = new AbortController(); + const signal = this._uiManager.combinedSignal(ac); + const opts = { + capture: true, + passive: false, + signal + }; + const cancelDrag = e => { + ac.abort(); + this.#dragPointerId = null; + this.#hasBeenClicked = false; + if (!this._uiManager.endDragSession()) { + this.#selectOnPointerEvent(e); } + if (hasDraggingStarted) { + this._onStopDragging(); + } + }; + if (isSelected) { + this.#prevDragX = event.clientX; + this.#prevDragY = event.clientY; + this.#dragPointerId = event.pointerId; + this.#dragPointerType = event.pointerType; + window.addEventListener("pointermove", e => { + if (!hasDraggingStarted) { + hasDraggingStarted = true; + this._uiManager.toggleComment(this, true, false); + this._onStartDragging(); + } + const { + clientX: x, + clientY: y, + pointerId + } = e; + if (pointerId !== this.#dragPointerId) { + stopEvent(e); + return; + } + const [tx, ty] = this.screenToPageTranslation(x - this.#prevDragX, y - this.#prevDragY); + this.#prevDragX = x; + this.#prevDragY = y; + this._uiManager.dragSelectedEditors(tx, ty); + }, opts); + window.addEventListener("touchmove", stopEvent, opts); + window.addEventListener("pointerdown", e => { + if (e.pointerType === this.#dragPointerType) { + if (this.#touchManager || e.isPrimary) { + cancelDrag(e); + } + } + stopEvent(e); + }, opts); } - trigger.addEventListener("dblclick", this.#download.bind(this)); - this.#trigger = trigger; - const { - isMac - } = util.FeatureTest.platform; - container.addEventListener("keydown", evt => { - if (evt.key === "Enter" && (isMac ? evt.metaKey : evt.ctrlKey)) { - this.#download(); + const pointerUpCallback = e => { + if (!this.#dragPointerId || this.#dragPointerId === e.pointerId) { + cancelDrag(e); + return; } + stopEvent(e); + }; + window.addEventListener("pointerup", pointerUpCallback, { + signal }); - if (!data.popupRef && this.hasPopupData) { - this._createPopup(); - } else { - trigger.classList.add("popupTriggerArea"); + window.addEventListener("blur", pointerUpCallback, { + signal + }); + } + _onStartDragging() {} + _onStopDragging() {} + moveInDOM() { + if (this.#moveInDOMTimeout) { + clearTimeout(this.#moveInDOMTimeout); } - container.append(trigger); - return container; + this.#moveInDOMTimeout = setTimeout(() => { + this.#moveInDOMTimeout = null; + this.parent?.moveEditorInDOM(this); + }, 0); } - getElementsToTriggerPopup() { - return this.#trigger; + _setParentAndPosition(parent, x, y) { + parent.changeParent(this); + this.x = x; + this.y = y; + this.fixAndSetPosition(); + this._onTranslated(); } - addHighlightArea() { - this.container.classList.add("highlightArea"); + getRect(tx, ty, rotation = this.rotation) { + const scale = this.parentScale; + const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; + const shiftX = tx / scale; + const shiftY = ty / scale; + const x = this.x * pageWidth; + const y = this.y * pageHeight; + const width = this.width * pageWidth; + const height = this.height * pageHeight; + switch (rotation) { + case 0: + return [x + shiftX + pageX, pageHeight - y - shiftY - height + pageY, x + shiftX + width + pageX, pageHeight - y - shiftY + pageY]; + case 90: + return [x + shiftY + pageX, pageHeight - y + shiftX + pageY, x + shiftY + height + pageX, pageHeight - y + shiftX + width + pageY]; + case 180: + return [x - shiftX - width + pageX, pageHeight - y + shiftY + pageY, x - shiftX + pageX, pageHeight - y + shiftY + height + pageY]; + case 270: + return [x - shiftY - height + pageX, pageHeight - y - shiftX - width + pageY, x - shiftY + pageX, pageHeight - y - shiftX + pageY]; + default: + throw new Error("Invalid rotation"); + } } - #download() { - this.downloadManager?.openOrDownloadData(this.content, this.filename); + getRectInCurrentCoords(rect, pageHeight) { + const [x1, y1, x2, y2] = rect; + const width = x2 - x1; + const height = y2 - y1; + switch (this.rotation) { + case 0: + return [x1, pageHeight - y2, width, height]; + case 90: + return [x1, pageHeight - y1, height, width]; + case 180: + return [x2, pageHeight - y1, width, height]; + case 270: + return [x2, pageHeight - y2, height, width]; + default: + throw new Error("Invalid rotation"); + } } -} -class AnnotationLayer { - #accessibilityManager = null; - #annotationCanvasMap = null; - #editableAnnotations = new Map(); - constructor({ - div, - accessibilityManager, - annotationCanvasMap, - page, - viewport - }) { - this.div = div; - this.#accessibilityManager = accessibilityManager; - this.#annotationCanvasMap = annotationCanvasMap; - this.page = page; - this.viewport = viewport; - this.zIndex = 0; + getPDFRect() { + return this.getRect(0, 0); } - #appendElement(element, id) { - const contentElement = element.firstChild || element; - contentElement.id = `${util.AnnotationPrefix}${id}`; - this.div.append(element); - this.#accessibilityManager?.moveElementInDOM(this.div, element, contentElement, false); + getNonHCMColor() { + return this.color && AnnotationEditor._colorManager.convert(this._uiManager.getNonHCMColor(this.color)); } - async render(params) { + onUpdatedColor() { + this.#comment?.onUpdatedColor(); + } + getData() { const { - annotations - } = params; - const layer = this.div; - (0,display_utils.setLayerDimensions)(layer, this.viewport); - const popupToElements = new Map(); - const elementParams = { - data: null, - layer, - linkService: params.linkService, - downloadManager: params.downloadManager, - imageResourcesPath: params.imageResourcesPath || "", - renderForms: params.renderForms !== false, - svgFactory: new display_utils.DOMSVGFactory(), - annotationStorage: params.annotationStorage || new annotation_storage.AnnotationStorage(), - enableScripting: params.enableScripting === true, - hasJSActions: params.hasJSActions, - fieldObjects: params.fieldObjects, - parent: this, - elements: null + comment: { + text: str, + color, + date, + opacity, + deleted, + richText + }, + uid: id, + pageIndex, + creationDate, + modificationDate + } = this; + return { + id, + pageIndex, + rect: this.getPDFRect(), + richText, + contentsObj: { + str + }, + creationDate, + modificationDate: date || modificationDate, + popupRef: !deleted, + color, + opacity }; - for (const data of annotations) { - if (data.noHTML) { - continue; + } + onceAdded(focus) {} + isEmpty() { + return false; + } + enableEditMode() { + if (this.isInEditMode()) { + return false; + } + this.parent.setEditingState(false); + this.#isInEditMode = true; + return true; + } + disableEditMode() { + if (!this.isInEditMode()) { + return false; + } + this.parent.setEditingState(true); + this.#isInEditMode = false; + return true; + } + isInEditMode() { + return this.#isInEditMode; + } + shouldGetKeyboardEvents() { + return this.#isResizerEnabledForKeyboard; + } + needsToBeRebuilt() { + return this.div && !this.isAttachedToDOM; + } + get isOnScreen() { + const { + top, + left, + bottom, + right + } = this.getClientDimensions(); + const { + innerHeight, + innerWidth + } = window; + return left < innerWidth && right > 0 && top < innerHeight && bottom > 0; + } + #addFocusListeners() { + if (this.#focusAC || !this.div) { + return; + } + this.#focusAC = new AbortController(); + const signal = this._uiManager.combinedSignal(this.#focusAC); + this.div.addEventListener("focusin", this.focusin.bind(this), { + signal + }); + this.div.addEventListener("focusout", this.focusout.bind(this), { + signal + }); + } + rebuild() { + this.#addFocusListeners(); + } + rotate(_angle) {} + resize() {} + serializeDeleted() { + return { + id: this.annotationElementId, + deleted: true, + pageIndex: this.pageIndex, + popupRef: this._initialData?.popupRef || "" + }; + } + serialize(isForCopying = false, context = null) { + return { + annotationType: this.mode, + pageIndex: this.pageIndex, + rect: this.getPDFRect(), + rotation: this.rotation, + structTreeParentId: this._structTreeParentId, + popupRef: this._initialData?.popupRef || "" + }; + } + static async deserialize(data, parent, uiManager) { + const editor = new this.prototype.constructor({ + parent, + id: uiManager.getId(), + uiManager, + annotationElementId: data.annotationElementId, + creationDate: data.creationDate, + modificationDate: data.modificationDate + }); + editor.rotation = data.rotation; + editor.#accessibilityData = data.accessibilityData; + editor._isCopy = data.isCopy || false; + const [pageWidth, pageHeight] = editor.pageDimensions; + const [x, y, width, height] = editor.getRectInCurrentCoords(data.rect, pageHeight); + editor.x = x / pageWidth; + editor.y = y / pageHeight; + editor.width = width / pageWidth; + editor.height = height / pageHeight; + return editor; + } + get hasBeenModified() { + return !!this.annotationElementId && (this.deleted || this.serialize() !== null); + } + remove() { + this.#focusAC?.abort(); + this.#focusAC = null; + if (!this.isEmpty()) { + this.commit(); + } + if (this.parent) { + this.parent.remove(this); + } else { + this._uiManager.removeEditor(this); + } + this.hideCommentPopup(); + if (this.#moveInDOMTimeout) { + clearTimeout(this.#moveInDOMTimeout); + this.#moveInDOMTimeout = null; + } + this.#stopResizing(); + this.removeEditToolbar(); + if (this.#telemetryTimeouts) { + for (const timeout of this.#telemetryTimeouts.values()) { + clearTimeout(timeout); } - const isPopupAnnotation = data.annotationType === util.AnnotationType.POPUP; - if (!isPopupAnnotation) { - const { - width, - height - } = getRectDims(data.rect); - if (width <= 0 || height <= 0) { - continue; - } - } else { - const elements = popupToElements.get(data.id); - if (!elements) { - continue; - } - elementParams.elements = elements; + this.#telemetryTimeouts = null; + } + this.parent = null; + this.#touchManager?.destroy(); + this.#touchManager = null; + this.#fakeAnnotation?.remove(); + this.#fakeAnnotation = null; + } + get isResizable() { + return false; + } + makeResizable() { + if (this.isResizable) { + this.#createResizers(); + this.#resizersDiv.classList.remove("hidden"); + } + } + get toolbarPosition() { + return null; + } + get commentButtonPosition() { + return this._uiManager.direction === "ltr" ? [1, 0] : [0, 0]; + } + get commentButtonPositionInPage() { + const { + commentButtonPosition: [posX, posY] + } = this; + const [blX, blY, trX, trY] = this.getPDFRect(); + return [AnnotationEditor._round(blX + (trX - blX) * posX), AnnotationEditor._round(blY + (trY - blY) * (1 - posY))]; + } + get commentButtonColor() { + return this._uiManager.makeCommentColor(this.getNonHCMColor(), this.opacity); + } + get commentPopupPosition() { + return this.#comment.commentPopupPositionInLayer; + } + set commentPopupPosition(pos) { + this.#comment.commentPopupPositionInLayer = pos; + } + hasDefaultPopupPosition() { + return this.#comment.hasDefaultPopupPosition(); + } + get commentButtonWidth() { + return this.#comment.commentButtonWidth; + } + get elementBeforePopup() { + return this.div; + } + setCommentButtonStates(options) { + this.#comment?.setCommentButtonStates(options); + } + keydown(event) { + if (!this.isResizable || event.target !== this.div || event.key !== "Enter") { + return; + } + this._uiManager.setSelected(this); + this.#savedDimensions = { + savedX: this.x, + savedY: this.y, + savedWidth: this.width, + savedHeight: this.height + }; + const children = this.#resizersDiv.children; + if (!this.#allResizerDivs) { + this.#allResizerDivs = Array.from(children); + const boundResizerKeydown = this.#resizerKeydown.bind(this); + const boundResizerBlur = this.#resizerBlur.bind(this); + const signal = this._uiManager._signal; + for (const div of this.#allResizerDivs) { + const name = div.getAttribute("data-resizer-name"); + div.setAttribute("role", "spinbutton"); + div.addEventListener("keydown", boundResizerKeydown, { + signal + }); + div.addEventListener("blur", boundResizerBlur, { + signal + }); + div.addEventListener("focus", this.#resizerFocus.bind(this, name), { + signal + }); + div.setAttribute("data-l10n-id", AnnotationEditor._l10nResizer[name]); } - elementParams.data = data; - const element = AnnotationElementFactory.create(elementParams); - if (!element.isRenderable) { - continue; + } + const first = this.#allResizerDivs[0]; + let firstPosition = 0; + for (const div of children) { + if (div === first) { + break; } - if (!isPopupAnnotation && data.popupRef) { - const elements = popupToElements.get(data.popupRef); - if (!elements) { - popupToElements.set(data.popupRef, [element]); - } else { - elements.push(element); + firstPosition++; + } + const nextFirstPosition = (360 - this.rotation + this.parentRotation) % 360 / 90 * (this.#allResizerDivs.length / 4); + if (nextFirstPosition !== firstPosition) { + if (nextFirstPosition < firstPosition) { + for (let i = 0; i < firstPosition - nextFirstPosition; i++) { + this.#resizersDiv.append(this.#resizersDiv.firstElementChild); + } + } else if (nextFirstPosition > firstPosition) { + for (let i = 0; i < nextFirstPosition - firstPosition; i++) { + this.#resizersDiv.firstElementChild.before(this.#resizersDiv.lastElementChild); } } - if (element.annotationEditorType > 0) { - this.#editableAnnotations.set(element.data.id, element); - } - const rendered = element.render(); - if (data.hidden) { - rendered.style.visibility = "hidden"; + let i = 0; + for (const child of children) { + const div = this.#allResizerDivs[i++]; + const name = div.getAttribute("data-resizer-name"); + child.setAttribute("data-l10n-id", AnnotationEditor._l10nResizer[name]); } - this.#appendElement(rendered, data.id); } - this.#setAnnotationCanvasMap(); + this.#setResizerTabIndex(0); + this.#isResizerEnabledForKeyboard = true; + this.#resizersDiv.firstElementChild.focus({ + focusVisible: true + }); + event.preventDefault(); + event.stopImmediatePropagation(); } - update({ - viewport - }) { - const layer = this.div; - this.viewport = viewport; - (0,display_utils.setLayerDimensions)(layer, { - rotation: viewport.rotation + #resizerKeydown(event) { + AnnotationEditor._resizerKeyboardManager.exec(this, event); + } + #resizerBlur(event) { + if (this.#isResizerEnabledForKeyboard && event.relatedTarget?.parentNode !== this.#resizersDiv) { + this.#stopResizing(); + } + } + #resizerFocus(name) { + this.#focusedResizerName = this.#isResizerEnabledForKeyboard ? name : ""; + } + #setResizerTabIndex(value) { + if (!this.#allResizerDivs) { + return; + } + for (const div of this.#allResizerDivs) { + div.tabIndex = value; + } + } + _resizeWithKeyboard(x, y) { + if (!this.#isResizerEnabledForKeyboard) { + return; + } + this.#resizerPointermove(this.#focusedResizerName, { + deltaX: x, + deltaY: y, + fromKeyboard: true }); - this.#setAnnotationCanvasMap(); - layer.hidden = false; } - #setAnnotationCanvasMap() { - if (!this.#annotationCanvasMap) { + #stopResizing() { + this.#isResizerEnabledForKeyboard = false; + this.#setResizerTabIndex(-1); + this.#addResizeToUndoStack(); + } + _stopResizingWithKeyboard() { + this.#stopResizing(); + this.div.focus(); + } + select() { + if (this.isSelected && this._editToolbar) { + this._editToolbar.show(); return; } - const layer = this.div; - for (const [id, canvas] of this.#annotationCanvasMap) { - const element = layer.querySelector(`[data-annotation-id="${id}"]`); - if (!element) { - continue; - } + this.isSelected = true; + this.makeResizable(); + this.div?.classList.add("selectedEditor"); + if (!this._editToolbar) { + this.addEditToolbar().then(() => { + if (this.div?.classList.contains("selectedEditor")) { + this._editToolbar?.show(); + } + }); + return; + } + this._editToolbar?.show(); + this.#altText?.toggleAltTextBadge(false); + } + focus() { + if (this.div && !this.div.contains(document.activeElement)) { + setTimeout(() => this.div?.focus({ + preventScroll: true + }), 0); + } + } + unselect() { + if (!this.isSelected) { + return; + } + this.isSelected = false; + this.#resizersDiv?.classList.add("hidden"); + this.div?.classList.remove("selectedEditor"); + if (this.div?.contains(document.activeElement)) { + this._uiManager.currentLayer.div.focus({ + preventScroll: true + }); + } + this._editToolbar?.hide(); + this.#altText?.toggleAltTextBadge(true); + this.hideCommentPopup(); + } + hideCommentPopup() { + if (this.hasComment) { + this._uiManager.toggleComment(null); + } + } + updateParams(type, value) {} + disableEditing() {} + enableEditing() {} + get canChangeContent() { + return false; + } + enterInEditMode() { + if (!this.canChangeContent) { + return; + } + this.enableEditMode(); + this.div.focus(); + } + dblclick(event) { + if (event.target.nodeName === "BUTTON") { + return; + } + this.enterInEditMode(); + this.parent.updateToolbar({ + mode: this.constructor._editorType, + editId: this.uid + }); + } + getElementForAltText() { + return this.div; + } + get contentDiv() { + return this.div; + } + get isEditing() { + return this.#isEditing; + } + set isEditing(value) { + this.#isEditing = value; + if (!this.parent) { + return; + } + if (value) { + this.parent.setSelected(this); + this.parent.setActiveEditor(this); + } else { + this.parent.setActiveEditor(null); + } + } + static get MIN_SIZE() { + return 16; + } + static canCreateNewEmptyEditor() { + return true; + } + get telemetryInitialData() { + return { + action: "added" + }; + } + get telemetryFinalData() { + return null; + } + _reportTelemetry(data, mustWait = false) { + if (mustWait) { + this.#telemetryTimeouts ||= new Map(); const { - firstChild - } = element; - if (!firstChild) { - element.append(canvas); - } else if (firstChild.nodeName === "CANVAS") { - firstChild.replaceWith(canvas); - } else { - firstChild.before(canvas); + action + } = data; + let timeout = this.#telemetryTimeouts.get(action); + if (timeout) { + clearTimeout(timeout); } + timeout = setTimeout(() => { + this._reportTelemetry(data); + this.#telemetryTimeouts.delete(action); + if (this.#telemetryTimeouts.size === 0) { + this.#telemetryTimeouts = null; + } + }, AnnotationEditor._telemetryTimeout); + this.#telemetryTimeouts.set(action, timeout); + return; } - this.#annotationCanvasMap.clear(); + data.type ||= this.editorType; + this._uiManager._eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data + } + }); } - getEditableAnnotations() { - return Array.from(this.#editableAnnotations.values()); + show(visible = this._isVisible) { + this.div.classList.toggle("hidden", !visible); + this._isVisible = visible; } - getEditableAnnotation(id) { - return this.#editableAnnotations.get(id); + enable() { + if (this.div) { + this.div.tabIndex = 0; + } + this.#disabled = false; + } + disable() { + if (this.div) { + this.div.tabIndex = -1; + } + this.#disabled = true; + } + updateFakeAnnotationElement(annotationLayer) { + if (!this.#fakeAnnotation && !this.deleted) { + this.#fakeAnnotation = annotationLayer.addFakeAnnotation(this); + return; + } + if (this.deleted) { + this.#fakeAnnotation.remove(); + this.#fakeAnnotation = null; + return; + } + if (this.hasEditedComment || this._hasBeenMoved || this._hasBeenResized) { + this.#fakeAnnotation.updateEdited({ + rect: this.getPDFRect(), + popup: this.comment + }); + } + } + renderAnnotationElement(annotation) { + if (this.deleted) { + annotation.hide(); + return null; + } + let content = annotation.container.querySelector(".annotationContent"); + if (!content) { + content = document.createElement("div"); + content.classList.add("annotationContent", this.editorType); + annotation.container.prepend(content); + } else if (content.nodeName === "CANVAS") { + const canvas = content; + content = document.createElement("div"); + content.classList.add("annotationContent", this.editorType); + canvas.before(content); + } + return content; + } + resetAnnotationElement(annotation) { + const { + firstElementChild + } = annotation.container; + if (firstElementChild?.nodeName === "DIV" && firstElementChild.classList.contains("annotationContent")) { + firstElementChild.remove(); + } + } +} +class FakeEditor extends AnnotationEditor { + constructor(params) { + super(params); + this.annotationElementId = params.annotationElementId; + this.deleted = true; + } + serialize() { + return this.serializeDeleted(); } } +;// ./src/shared/murmurhash3.js +const SEED = 0xc3d2e1f0; +const MASK_HIGH = 0xffff0000; +const MASK_LOW = 0xffff; +class MurmurHash3_64 { + constructor(seed) { + this.h1 = seed ? seed & 0xffffffff : SEED; + this.h2 = seed ? seed & 0xffffffff : SEED; + } + update(input) { + let data, length; + if (typeof input === "string") { + data = new Uint8Array(input.length * 2); + length = 0; + for (let i = 0, ii = input.length; i < ii; i++) { + const code = input.charCodeAt(i); + if (code <= 0xff) { + data[length++] = code; + } else { + data[length++] = code >>> 8; + data[length++] = code & 0xff; + } + } + } else if (ArrayBuffer.isView(input)) { + data = input.slice(); + length = data.byteLength; + } else { + throw new Error("Invalid data format, must be a string or TypedArray."); + } + const blockCounts = length >> 2; + const tailLength = length - blockCounts * 4; + const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts); + let k1 = 0, + k2 = 0; + let h1 = this.h1, + h2 = this.h2; + const C1 = 0xcc9e2d51, + C2 = 0x1b873593; + const C1_LOW = C1 & MASK_LOW, + C2_LOW = C2 & MASK_LOW; + for (let i = 0; i < blockCounts; i++) { + if (i & 1) { + k1 = dataUint32[i]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + h1 ^= k1; + h1 = h1 << 13 | h1 >>> 19; + h1 = h1 * 5 + 0xe6546b64; + } else { + k2 = dataUint32[i]; + k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW; + k2 = k2 << 15 | k2 >>> 17; + k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW; + h2 ^= k2; + h2 = h2 << 13 | h2 >>> 19; + h2 = h2 * 5 + 0xe6546b64; + } + } + k1 = 0; + switch (tailLength) { + case 3: + k1 ^= data[blockCounts * 4 + 2] << 16; + case 2: + k1 ^= data[blockCounts * 4 + 1] << 8; + case 1: + k1 ^= data[blockCounts * 4]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + if (blockCounts & 1) { + h1 ^= k1; + } else { + h2 ^= k1; + } + } + this.h1 = h1; + this.h2 = h2; + } + hexdigest() { + let h1 = this.h1, + h2 = this.h2; + h1 ^= h2 >>> 1; + h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW; + h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW; + h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0"); + } +} -/***/ }), - -/***/ 792: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ AnnotationStorage: () => (/* binding */ AnnotationStorage), -/* harmony export */ PrintAnnotationStorage: () => (/* binding */ PrintAnnotationStorage), -/* harmony export */ SerializableEmpty: () => (/* binding */ SerializableEmpty) -/* harmony export */ }); -/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(292); -/* harmony import */ var _editor_editor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(310); -/* harmony import */ var _shared_murmurhash3_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(651); +;// ./src/display/annotation_storage.js @@ -2518,12 +6700,12 @@ }); class AnnotationStorage { #modified = false; + #modifiedIds = null; + #editorsMap = null; #storage = new Map(); - constructor() { - this.onSetModified = null; - this.onResetModified = null; - this.onAnnotationEditor = null; - } + onSetModified = null; + onResetModified = null; + onAnnotationEditor = null; getValue(key, defaultValue) { const value = this.#storage.get(key); if (value === undefined) { @@ -2535,18 +6717,21 @@ return this.#storage.get(key); } remove(key) { + const storedValue = this.#storage.get(key); + if (storedValue === undefined) { + return; + } + if (storedValue instanceof AnnotationEditor) { + this.#editorsMap.delete(storedValue.annotationElementId); + } this.#storage.delete(key); if (this.#storage.size === 0) { this.resetModified(); } - if (typeof this.onAnnotationEditor === "function") { - for (const value of this.#storage.values()) { - if (value instanceof _editor_editor_js__WEBPACK_IMPORTED_MODULE_1__.AnnotationEditor) { - return; - } - } - this.onAnnotationEditor(null); + if (this.#storage.values().some(v => v instanceof AnnotationEditor)) { + return; } + this.onAnnotationEditor?.(null); } setValue(key, value) { const obj = this.#storage.get(key); @@ -2565,38 +6750,27 @@ if (modified) { this.#setModified(); } - if (value instanceof _editor_editor_js__WEBPACK_IMPORTED_MODULE_1__.AnnotationEditor && typeof this.onAnnotationEditor === "function") { - this.onAnnotationEditor(value.constructor._type); + if (value instanceof AnnotationEditor) { + (this.#editorsMap ||= new Map()).set(value.annotationElementId, value); + this.onAnnotationEditor?.(value.constructor._type); } } has(key) { return this.#storage.has(key); } - getAll() { - return this.#storage.size > 0 ? (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.objectFromMap)(this.#storage) : null; - } - setAll(obj) { - for (const [key, val] of Object.entries(obj)) { - this.setValue(key, val); - } - } get size() { return this.#storage.size; } #setModified() { if (!this.#modified) { this.#modified = true; - if (typeof this.onSetModified === "function") { - this.onSetModified(); - } + this.onSetModified?.(); } } resetModified() { if (this.#modified) { this.#modified = false; - if (typeof this.onResetModified === "function") { - this.onResetModified(); - } + this.onResetModified?.(); } } get print() { @@ -2607,12 +6781,16 @@ return SerializableEmpty; } const map = new Map(), - hash = new _shared_murmurhash3_js__WEBPACK_IMPORTED_MODULE_2__.MurmurHash3_64(), + hash = new MurmurHash3_64(), transfer = []; const context = Object.create(null); let hasBitmap = false; for (const [key, val] of this.#storage) { - const serialized = val instanceof _editor_editor_js__WEBPACK_IMPORTED_MODULE_1__.AnnotationEditor ? val.serialize(false, context) : val; + const serialized = val instanceof AnnotationEditor ? val.serialize(false, context) : val; + if (val.page) { + val.pageIndex = val.page._pageIndex; + delete val.page; + } if (serialized) { map.set(key, serialized); hash.update(`${key}:${JSON.stringify(serialized)}`); @@ -2635,10 +6813,24 @@ get editorStats() { let stats = null; const typeToEditor = new Map(); + let numberOfEditedComments = 0; + let numberOfDeletedComments = 0; for (const value of this.#storage.values()) { - if (!(value instanceof _editor_editor_js__WEBPACK_IMPORTED_MODULE_1__.AnnotationEditor)) { + if (!(value instanceof AnnotationEditor)) { + if (value.popup) { + if (value.popup.deleted) { + numberOfDeletedComments += 1; + } else { + numberOfEditedComments += 1; + } + } continue; } + if (value.isCommentDeleted) { + numberOfDeletedComments += 1; + } else if (value.hasEditedComment) { + numberOfEditedComments += 1; + } const editorStats = value.telemetryFinalData; if (!editorStats) { continue; @@ -2646,1990 +6838,2147 @@ const { type } = editorStats; - if (!typeToEditor.has(type)) { - typeToEditor.set(type, Object.getPrototypeOf(value).constructor); - } + typeToEditor.getOrInsertComputed(type, () => Object.getPrototypeOf(value).constructor); stats ||= Object.create(null); const map = stats[type] ||= new Map(); for (const [key, val] of Object.entries(editorStats)) { if (key === "type") { continue; } - let counters = map.get(key); - if (!counters) { - counters = new Map(); - map.set(key, counters); - } - const count = counters.get(val) ?? 0; - counters.set(val, count + 1); + const counters = map.getOrInsertComputed(key, makeMap); + counters.set(val, (counters.get(val) ?? 0) + 1); } } + if (numberOfDeletedComments > 0 || numberOfEditedComments > 0) { + stats ||= Object.create(null); + stats.comments = { + deleted: numberOfDeletedComments, + edited: numberOfEditedComments + }; + } + if (!stats) { + return null; + } for (const [type, editor] of typeToEditor) { stats[type] = editor.computeTelemetryFinalData(stats[type]); } return stats; } + resetModifiedIds() { + this.#modifiedIds = null; + } + updateEditor(annotationId, data) { + const value = this.#editorsMap?.get(annotationId); + if (value) { + value.updateFromAnnotationLayer(data); + return true; + } + return false; + } + getEditor(annotationId) { + return this.#editorsMap?.get(annotationId) || null; + } + get modifiedIds() { + if (this.#modifiedIds) { + return this.#modifiedIds; + } + const ids = []; + if (this.#editorsMap) { + for (const value of this.#editorsMap.values()) { + if (!value.serialize()) { + continue; + } + ids.push(value.annotationElementId); + } + } + let hash = ""; + if (ids.length) { + const h = new MurmurHash3_64(); + h.update(ids.join(",")); + hash = h.hexdigest(); + } + return this.#modifiedIds = { + ids: new Set(ids), + hash + }; + } + [Symbol.iterator]() { + return this.#storage.entries(); + } } class PrintAnnotationStorage extends AnnotationStorage { - #serializable; + #serializable = SerializableEmpty; constructor(parent) { super(); const { + serializable + } = parent; + if (serializable === SerializableEmpty) { + return; + } + const { map, hash, transfer - } = parent.serializable; + } = serializable; const clone = structuredClone(map, transfer ? { transfer } : null); this.#serializable = { map: clone, hash, - transfer + transfer: [] }; } get print() { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.unreachable)("Should not call PrintAnnotationStorage.print"); + unreachable("Should not call PrintAnnotationStorage.print"); } get serializable() { return this.#serializable; } + get modifiedIds() { + return shadow(this, "modifiedIds", { + ids: new Set(), + hash: "" + }); + } } - -/***/ }), - -/***/ 831: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFDataRangeTransport: () => (/* binding */ PDFDataRangeTransport), -/* harmony export */ PDFWorker: () => (/* binding */ PDFWorker), -/* harmony export */ build: () => (/* binding */ build), -/* harmony export */ getDocument: () => (/* binding */ getDocument), -/* harmony export */ version: () => (/* binding */ version) -/* harmony export */ }); -/* unused harmony exports DefaultCanvasFactory, DefaultCMapReaderFactory, DefaultFilterFactory, DefaultStandardFontDataFactory, LoopbackPort, PDFDocumentLoadingTask, PDFDocumentProxy, PDFPageProxy, PDFWorkerUtil, RenderTask */ -/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(292); -/* harmony import */ var _annotation_storage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(792); -/* harmony import */ var _display_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(419); -/* harmony import */ var _font_loader_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(10); -/* harmony import */ var display_node_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(573); -/* harmony import */ var _canvas_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(923); -/* harmony import */ var _text_layer_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(814); -/* harmony import */ var _worker_options_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(164); -/* harmony import */ var _shared_message_handler_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(178); -/* harmony import */ var _metadata_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(62); -/* harmony import */ var _optional_content_config_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(626); -/* harmony import */ var _transport_stream_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(585); -/* harmony import */ var display_fetch_stream__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(94); -/* harmony import */ var display_network__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(457); -/* harmony import */ var display_node_stream__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(786); -/* harmony import */ var _xfa_text_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(50); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([display_node_utils__WEBPACK_IMPORTED_MODULE_4__, display_node_stream__WEBPACK_IMPORTED_MODULE_13__]); -([display_node_utils__WEBPACK_IMPORTED_MODULE_4__, display_node_stream__WEBPACK_IMPORTED_MODULE_13__] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__); - - - - +;// ./src/display/canvas_dependency_tracker.js - - - - - - - - - -const DEFAULT_RANGE_CHUNK_SIZE = 65536; -const RENDERING_CANCELLED_TIMEOUT = 100; -const DELAYED_CLEANUP_TIMEOUT = 5000; -const DefaultCanvasFactory = _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.isNodeJS ? display_node_utils__WEBPACK_IMPORTED_MODULE_4__.NodeCanvasFactory : _display_utils_js__WEBPACK_IMPORTED_MODULE_2__.DOMCanvasFactory; -const DefaultCMapReaderFactory = _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.isNodeJS ? display_node_utils__WEBPACK_IMPORTED_MODULE_4__.NodeCMapReaderFactory : _display_utils_js__WEBPACK_IMPORTED_MODULE_2__.DOMCMapReaderFactory; -const DefaultFilterFactory = _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.isNodeJS ? display_node_utils__WEBPACK_IMPORTED_MODULE_4__.NodeFilterFactory : _display_utils_js__WEBPACK_IMPORTED_MODULE_2__.DOMFilterFactory; -const DefaultStandardFontDataFactory = _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.isNodeJS ? display_node_utils__WEBPACK_IMPORTED_MODULE_4__.NodeStandardFontDataFactory : _display_utils_js__WEBPACK_IMPORTED_MODULE_2__.DOMStandardFontDataFactory; -function getDocument(src) { - if (typeof src === "string" || src instanceof URL) { - src = { - url: src - }; - } else if (src instanceof ArrayBuffer || ArrayBuffer.isView(src)) { - src = { - data: src - }; - } - if (typeof src !== "object") { - throw new Error("Invalid parameter in getDocument, need parameter object."); - } - if (!src.url && !src.data && !src.range) { - throw new Error("Invalid parameter object: need either .data, .range or .url"); - } - const task = new PDFDocumentLoadingTask(); - const { - docId - } = task; - const url = src.url ? getUrlProp(src.url) : null; - const data = src.data ? getDataProp(src.data) : null; - const httpHeaders = src.httpHeaders || null; - const withCredentials = src.withCredentials === true; - const password = src.password ?? null; - const rangeTransport = src.range instanceof PDFDataRangeTransport ? src.range : null; - const rangeChunkSize = Number.isInteger(src.rangeChunkSize) && src.rangeChunkSize > 0 ? src.rangeChunkSize : DEFAULT_RANGE_CHUNK_SIZE; - let worker = src.worker instanceof PDFWorker ? src.worker : null; - const verbosity = src.verbosity; - const docBaseUrl = typeof src.docBaseUrl === "string" && !(0,_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.isDataScheme)(src.docBaseUrl) ? src.docBaseUrl : null; - const cMapUrl = typeof src.cMapUrl === "string" ? src.cMapUrl : null; - const cMapPacked = src.cMapPacked !== false; - const CMapReaderFactory = src.CMapReaderFactory || DefaultCMapReaderFactory; - const standardFontDataUrl = typeof src.standardFontDataUrl === "string" ? src.standardFontDataUrl : null; - const StandardFontDataFactory = src.StandardFontDataFactory || DefaultStandardFontDataFactory; - const ignoreErrors = src.stopAtErrors !== true; - const maxImageSize = Number.isInteger(src.maxImageSize) && src.maxImageSize > -1 ? src.maxImageSize : -1; - const isEvalSupported = src.isEvalSupported !== false; - const isOffscreenCanvasSupported = typeof src.isOffscreenCanvasSupported === "boolean" ? src.isOffscreenCanvasSupported : !_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.isNodeJS; - const canvasMaxAreaInBytes = Number.isInteger(src.canvasMaxAreaInBytes) ? src.canvasMaxAreaInBytes : -1; - const disableFontFace = typeof src.disableFontFace === "boolean" ? src.disableFontFace : _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.isNodeJS; - const fontExtraProperties = src.fontExtraProperties === true; - const enableXfa = src.enableXfa === true; - const ownerDocument = src.ownerDocument || globalThis.document; - const disableRange = src.disableRange === true; - const disableStream = src.disableStream === true; - const disableAutoFetch = src.disableAutoFetch === true; - const pdfBug = src.pdfBug === true; - const length = rangeTransport ? rangeTransport.length : src.length ?? NaN; - const useSystemFonts = typeof src.useSystemFonts === "boolean" ? src.useSystemFonts : !_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.isNodeJS && !disableFontFace; - const useWorkerFetch = typeof src.useWorkerFetch === "boolean" ? src.useWorkerFetch : CMapReaderFactory === _display_utils_js__WEBPACK_IMPORTED_MODULE_2__.DOMCMapReaderFactory && StandardFontDataFactory === _display_utils_js__WEBPACK_IMPORTED_MODULE_2__.DOMStandardFontDataFactory && cMapUrl && standardFontDataUrl && (0,_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.isValidFetchUrl)(cMapUrl, document.baseURI) && (0,_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.isValidFetchUrl)(standardFontDataUrl, document.baseURI); - const canvasFactory = src.canvasFactory || new DefaultCanvasFactory({ - ownerDocument - }); - const filterFactory = src.filterFactory || new DefaultFilterFactory({ - docId, - ownerDocument - }); - const styleElement = null; - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.setVerbosityLevel)(verbosity); - const transportFactory = { - canvasFactory, - filterFactory - }; - if (!useWorkerFetch) { - transportFactory.cMapReaderFactory = new CMapReaderFactory({ - baseUrl: cMapUrl, - isCompressed: cMapPacked - }); - transportFactory.standardFontDataFactory = new StandardFontDataFactory({ - baseUrl: standardFontDataUrl - }); +const FORCED_DEPENDENCY_LABEL = "__forcedDependency"; +const { + floor, + ceil +} = Math; +function expandBBox(array, index, minX, minY, maxX, maxY) { + array[index * 4 + 0] = Math.min(array[index * 4 + 0], minX); + array[index * 4 + 1] = Math.min(array[index * 4 + 1], minY); + array[index * 4 + 2] = Math.max(array[index * 4 + 2], maxX); + array[index * 4 + 3] = Math.max(array[index * 4 + 3], maxY); +} +function scaleCharBBox(scaleX, scaleY, x, y, bbox) { + let temp; + if (scaleX) { + if (scaleX < 0) { + temp = bbox[0]; + bbox[0] = bbox[2]; + bbox[2] = temp; + } + bbox[0] *= scaleX; + bbox[2] *= scaleX; + if (scaleY < 0) { + temp = bbox[1]; + bbox[1] = bbox[3]; + bbox[3] = temp; + } + bbox[1] *= scaleY; + bbox[3] *= scaleY; + } else { + bbox.fill(0); } - if (!worker) { - const workerParams = { - verbosity, - port: _worker_options_js__WEBPACK_IMPORTED_MODULE_14__.GlobalWorkerOptions.workerPort - }; - worker = workerParams.port ? PDFWorker.fromPort(workerParams) : new PDFWorker(workerParams); - task._worker = worker; + bbox[0] += x; + bbox[1] += y; + bbox[2] += x; + bbox[3] += y; +} +const EMPTY_BBOX = new Uint32Array(new Uint8Array([255, 255, 0, 0]).buffer)[0]; +class BBoxReader { + #bboxes; + #coords; + constructor(bboxes, coords) { + this.#bboxes = bboxes; + this.#coords = coords; + } + get length() { + return this.#bboxes.length; + } + isEmpty(i) { + return this.#bboxes[i] === EMPTY_BBOX; + } + minX(i) { + return this.#coords[i * 4 + 0] / 256; + } + minY(i) { + return this.#coords[i * 4 + 1] / 256; + } + maxX(i) { + return (this.#coords[i * 4 + 2] + 1) / 256; + } + maxY(i) { + return (this.#coords[i * 4 + 3] + 1) / 256; + } +} +const ensureDebugMetadata = (map, key) => map?.getOrInsertComputed(key, () => ({ + dependencies: new Set(), + isRenderingOperation: false +})); +class CanvasBBoxTracker { + #baseTransformStack = [[1, 0, 0, 1, 0, 0]]; + #clipBox = [-Infinity, -Infinity, Infinity, Infinity]; + #pendingBBox = new Float64Array(BBOX_INIT); + _pendingBBoxIdx = -1; + #canvasWidth; + #canvasHeight; + #bboxesCoords; + #bboxes; + _savesStack = []; + _markedContentStack = []; + constructor(canvas, operationsCount) { + this.#canvasWidth = canvas.width; + this.#canvasHeight = canvas.height; + this.#initializeBBoxes(operationsCount); + } + growOperationsCount(operationsCount) { + if (operationsCount >= this.#bboxes.length) { + this.#initializeBBoxes(operationsCount, this.#bboxes); + } + } + #initializeBBoxes(operationsCount, oldBBoxes) { + const buffer = new ArrayBuffer(operationsCount * 4); + this.#bboxesCoords = new Uint8ClampedArray(buffer); + this.#bboxes = new Uint32Array(buffer); + if (oldBBoxes && oldBBoxes.length > 0) { + this.#bboxes.set(oldBBoxes); + this.#bboxes.fill(EMPTY_BBOX, oldBBoxes.length); + } else { + this.#bboxes.fill(EMPTY_BBOX); + } + } + get clipBox() { + return this.#clipBox; + } + save(opIdx) { + this.#clipBox = { + __proto__: this.#clipBox + }; + this._savesStack.push(opIdx); + return this; + } + restore(opIdx, onSavePopped) { + const previous = Object.getPrototypeOf(this.#clipBox); + if (previous === null) { + return this; + } + this.#clipBox = previous; + const lastSave = this._savesStack.pop(); + if (lastSave !== undefined) { + onSavePopped?.(lastSave, opIdx); + this.#bboxes[opIdx] = this.#bboxes[lastSave]; + } + return this; + } + recordOpenMarker(idx) { + this._savesStack.push(idx); + return this; } - const fetchDocParams = { - docId, - apiVersion: "4.1.392", - data, - password, - disableAutoFetch, - rangeChunkSize, - length, - docBaseUrl, - enableXfa, - evaluatorOptions: { - maxImageSize, - disableFontFace, - ignoreErrors, - isEvalSupported, - isOffscreenCanvasSupported, - canvasMaxAreaInBytes, - fontExtraProperties, - useSystemFonts, - cMapUrl: useWorkerFetch ? cMapUrl : null, - standardFontDataUrl: useWorkerFetch ? standardFontDataUrl : null + getOpenMarker() { + if (this._savesStack.length === 0) { + return null; } - }; - const transportParams = { - ignoreErrors, - isEvalSupported, - disableFontFace, - fontExtraProperties, - enableXfa, - ownerDocument, - disableAutoFetch, - pdfBug, - styleElement - }; - worker.promise.then(function () { - if (task.destroyed) { - throw new Error("Loading aborted"); - } - const workerIdPromise = _fetchDocument(worker, fetchDocParams); - const networkStreamPromise = new Promise(function (resolve) { - let networkStream; - if (rangeTransport) { - networkStream = new _transport_stream_js__WEBPACK_IMPORTED_MODULE_10__.PDFDataTransportStream(rangeTransport, { - disableRange, - disableStream - }); - } else if (!data) { - const createPDFNetworkStream = params => { - if (_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.isNodeJS) { - const isFetchSupported = function () { - return typeof fetch !== "undefined" && typeof Response !== "undefined" && "body" in Response.prototype; - }; - return isFetchSupported() && (0,_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.isValidFetchUrl)(params.url) ? new display_fetch_stream__WEBPACK_IMPORTED_MODULE_11__.PDFFetchStream(params) : new display_node_stream__WEBPACK_IMPORTED_MODULE_13__.PDFNodeStream(params); + return this._savesStack.at(-1); + } + recordCloseMarker(opIdx, onSavePopped) { + const lastSave = this._savesStack.pop(); + if (lastSave !== undefined) { + onSavePopped?.(lastSave, opIdx); + this.#bboxes[opIdx] = this.#bboxes[lastSave]; + } + return this; + } + beginMarkedContent(opIdx) { + this._markedContentStack.push(opIdx); + return this; + } + endMarkedContent(opIdx, onSavePopped) { + const lastSave = this._markedContentStack.pop(); + if (lastSave !== undefined) { + onSavePopped?.(lastSave, opIdx); + this.#bboxes[opIdx] = this.#bboxes[lastSave]; + } + return this; + } + pushBaseTransform(ctx) { + this.#baseTransformStack.push(Util.multiplyByDOMMatrix(this.#baseTransformStack.at(-1), ctx.getTransform())); + return this; + } + popBaseTransform() { + if (this.#baseTransformStack.length > 1) { + this.#baseTransformStack.pop(); + } + return this; + } + resetBBox(idx) { + if (this._pendingBBoxIdx !== idx) { + this._pendingBBoxIdx = idx; + this.#pendingBBox.set(BBOX_INIT, 0); + } + return this; + } + recordClipBox(idx, ctx, minX, maxX, minY, maxY) { + const transform = Util.multiplyByDOMMatrix(this.#baseTransformStack.at(-1), ctx.getTransform()); + const clipBox = BBOX_INIT.slice(); + Util.axialAlignedBoundingBox([minX, minY, maxX, maxY], transform, clipBox); + const intersection = Util.intersect(this.#clipBox, clipBox); + if (intersection) { + this.#clipBox[0] = intersection[0]; + this.#clipBox[1] = intersection[1]; + this.#clipBox[2] = intersection[2]; + this.#clipBox[3] = intersection[3]; + } else { + this.#clipBox[0] = this.#clipBox[1] = Infinity; + this.#clipBox[2] = this.#clipBox[3] = -Infinity; + } + return this; + } + recordBBox(idx, ctx, minX, maxX, minY, maxY) { + const clipBox = this.#clipBox; + if (clipBox[0] === Infinity) { + return this; + } + const transform = Util.multiplyByDOMMatrix(this.#baseTransformStack.at(-1), ctx.getTransform()); + if (clipBox[0] === -Infinity) { + Util.axialAlignedBoundingBox([minX, minY, maxX, maxY], transform, this.#pendingBBox); + return this; + } + const bbox = BBOX_INIT.slice(); + Util.axialAlignedBoundingBox([minX, minY, maxX, maxY], transform, bbox); + this.#pendingBBox[0] = MathClamp(bbox[0], clipBox[0], this.#pendingBBox[0]); + this.#pendingBBox[1] = MathClamp(bbox[1], clipBox[1], this.#pendingBBox[1]); + this.#pendingBBox[2] = MathClamp(bbox[2], this.#pendingBBox[2], clipBox[2]); + this.#pendingBBox[3] = MathClamp(bbox[3], this.#pendingBBox[3], clipBox[3]); + return this; + } + recordFullPageBBox(idx) { + this.#pendingBBox[0] = Math.max(0, this.#clipBox[0]); + this.#pendingBBox[1] = Math.max(0, this.#clipBox[1]); + this.#pendingBBox[2] = Math.min(this.#canvasWidth, this.#clipBox[2]); + this.#pendingBBox[3] = Math.min(this.#canvasHeight, this.#clipBox[3]); + return this; + } + recordOperation(idx, preserve = false, dependencyLists) { + if (this._pendingBBoxIdx !== idx) { + return this; + } + const minX = floor(this.#pendingBBox[0] * 256 / this.#canvasWidth); + const minY = floor(this.#pendingBBox[1] * 256 / this.#canvasHeight); + const maxX = ceil(this.#pendingBBox[2] * 256 / this.#canvasWidth); + const maxY = ceil(this.#pendingBBox[3] * 256 / this.#canvasHeight); + expandBBox(this.#bboxesCoords, idx, minX, minY, maxX, maxY); + if (dependencyLists) { + for (const dependencies of dependencyLists) { + for (const depIdx of dependencies) { + if (depIdx !== idx) { + expandBBox(this.#bboxesCoords, depIdx, minX, minY, maxX, maxY); } - return (0,_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.isValidFetchUrl)(params.url) ? new display_fetch_stream__WEBPACK_IMPORTED_MODULE_11__.PDFFetchStream(params) : new display_network__WEBPACK_IMPORTED_MODULE_12__.PDFNetworkStream(params); - }; - networkStream = createPDFNetworkStream({ - url, - length, - httpHeaders, - withCredentials, - rangeChunkSize, - disableRange, - disableStream - }); - } - resolve(networkStream); - }); - return Promise.all([workerIdPromise, networkStreamPromise]).then(function ([workerId, networkStream]) { - if (task.destroyed) { - throw new Error("Loading aborted"); + } } - const messageHandler = new _shared_message_handler_js__WEBPACK_IMPORTED_MODULE_7__.MessageHandler(docId, workerId, worker.port); - const transport = new WorkerTransport(messageHandler, task, networkStream, transportParams, transportFactory); - task._transport = transport; - messageHandler.send("Ready", null); - }); - }).catch(task._capability.reject); - return task; -} -async function _fetchDocument(worker, source) { - if (worker.destroyed) { - throw new Error("Worker was destroyed"); - } - const workerId = await worker.messageHandler.sendWithPromise("GetDocRequest", source, source.data ? [source.data.buffer] : null); - if (worker.destroyed) { - throw new Error("Worker was destroyed"); - } - return workerId; -} -function getUrlProp(val) { - if (val instanceof URL) { - return val.href; - } - try { - return new URL(val, window.location).href; - } catch { - if (_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.isNodeJS && typeof val === "string") { - return val; } + if (!preserve) { + this._pendingBBoxIdx = -1; + } + return this; } - throw new Error("Invalid PDF url data: " + "either string or URL-object is expected in the url property."); -} -function getDataProp(val) { - if (_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.isNodeJS && typeof Buffer !== "undefined" && val instanceof Buffer) { - throw new Error("Please provide binary data as `Uint8Array`, rather than `Buffer`."); - } - if (val instanceof Uint8Array && val.byteLength === val.buffer.byteLength) { - return val; + bboxToClipBoxDropOperation(idx) { + if (this._pendingBBoxIdx === idx) { + this._pendingBBoxIdx = -1; + this.#clipBox[0] = Math.max(this.#clipBox[0], this.#pendingBBox[0]); + this.#clipBox[1] = Math.max(this.#clipBox[1], this.#pendingBBox[1]); + this.#clipBox[2] = Math.min(this.#clipBox[2], this.#pendingBBox[2]); + this.#clipBox[3] = Math.min(this.#clipBox[3], this.#pendingBBox[3]); + } + return this; } - if (typeof val === "string") { - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.stringToBytes)(val); + take() { + return new BBoxReader(this.#bboxes, this.#bboxesCoords); } - if (val instanceof ArrayBuffer || ArrayBuffer.isView(val) || typeof val === "object" && !isNaN(val?.length)) { - return new Uint8Array(val); + takeDebugMetadata() { + throw new Error("Unreachable"); } - throw new Error("Invalid PDF binary data: either TypedArray, " + "string, or array-like object is expected in the data property."); -} -class PDFDocumentLoadingTask { - static #docId = 0; - constructor() { - this._capability = Promise.withResolvers(); - this._transport = null; - this._worker = null; - this.docId = `d${PDFDocumentLoadingTask.#docId++}`; - this.destroyed = false; - this.onPassword = null; - this.onProgress = null; + recordSimpleData(name, idx) { + return this; } - get promise() { - return this._capability.promise; + recordIncrementalData(name, idx) { + return this; } - async destroy() { - this.destroyed = true; - try { - if (this._worker?.port) { - this._worker._pendingDestroy = true; - } - await this._transport?.destroy(); - } catch (ex) { - if (this._worker?.port) { - delete this._worker._pendingDestroy; - } - throw ex; - } - this._transport = null; - if (this._worker) { - this._worker.destroy(); - this._worker = null; - } + resetIncrementalData(name, idx) { + return this; } -} -class PDFDataRangeTransport { - constructor(length, initialData, progressiveDone = false, contentDispositionFilename = null) { - this.length = length; - this.initialData = initialData; - this.progressiveDone = progressiveDone; - this.contentDispositionFilename = contentDispositionFilename; - this._rangeListeners = []; - this._progressListeners = []; - this._progressiveReadListeners = []; - this._progressiveDoneListeners = []; - this._readyCapability = Promise.withResolvers(); - } - addRangeListener(listener) { - this._rangeListeners.push(listener); + recordNamedData(name, idx) { + return this; } - addProgressListener(listener) { - this._progressListeners.push(listener); + recordSimpleDataFromNamed(name, depName, fallbackIdx) { + return this; } - addProgressiveReadListener(listener) { - this._progressiveReadListeners.push(listener); + recordFutureForcedDependency(name, idx) { + return this; } - addProgressiveDoneListener(listener) { - this._progressiveDoneListeners.push(listener); + inheritSimpleDataAsFutureForcedDependencies(names) { + return this; } - onDataRange(begin, chunk) { - for (const listener of this._rangeListeners) { - listener(begin, chunk); - } + inheritPendingDependenciesAsFutureForcedDependencies() { + return this; } - onDataProgress(loaded, total) { - this._readyCapability.promise.then(() => { - for (const listener of this._progressListeners) { - listener(loaded, total); - } - }); + recordCharacterBBox(idx, ctx, font, scale = 1, x = 0, y = 0, getMeasure) { + return this; } - onDataProgressiveRead(chunk) { - this._readyCapability.promise.then(() => { - for (const listener of this._progressiveReadListeners) { - listener(chunk); - } - }); + getSimpleIndex(dependencyName) { + return undefined; } - onDataProgressiveDone() { - this._readyCapability.promise.then(() => { - for (const listener of this._progressiveDoneListeners) { - listener(); - } - }); + recordDependencies(idx, dependencyNames) { + return this; } - transportReady() { - this._readyCapability.resolve(); + recordNamedDependency(idx, name) { + return this; } - requestDataRange(begin, end) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.unreachable)("Abstract method PDFDataRangeTransport.requestDataRange"); + recordShowTextOperation(idx, preserve = false) { + return this; } - abort() {} } -class PDFDocumentProxy { - constructor(pdfInfo, transport) { - this._pdfInfo = pdfInfo; - this._transport = transport; +class CanvasDependencyTracker { + #simple = { + __proto__: null + }; + #incremental = { + __proto__: null, + transform: [], + moveText: [], + sameLineText: [], + [FORCED_DEPENDENCY_LABEL]: [] + }; + #namedDependencies = new Map(); + #pendingDependencies = new Set(); + #fontBBoxTrustworthy = new Map(); + #debugMetadata; + #recordDebugMetadataDepenencyAfterRestore; + #bboxTracker; + constructor(bboxTracker, recordDebugMetadata = false) { + this.#bboxTracker = bboxTracker; + if (recordDebugMetadata) { + this.#debugMetadata = new Map(); + this.#recordDebugMetadataDepenencyAfterRestore = (lastSave, opIdx) => { + ensureDebugMetadata(this.#debugMetadata, opIdx).dependencies.add(lastSave); + }; + } } - get annotationStorage() { - return this._transport.annotationStorage; + get clipBox() { + return this.#bboxTracker.clipBox; } - get filterFactory() { - return this._transport.filterFactory; + growOperationsCount(operationsCount) { + this.#bboxTracker.growOperationsCount(operationsCount); } - get numPages() { - return this._pdfInfo.numPages; + save(opIdx) { + this.#simple = { + __proto__: this.#simple + }; + this.#incremental = { + __proto__: this.#incremental, + transform: { + __proto__: this.#incremental.transform + }, + moveText: { + __proto__: this.#incremental.moveText + }, + sameLineText: { + __proto__: this.#incremental.sameLineText + }, + [FORCED_DEPENDENCY_LABEL]: { + __proto__: this.#incremental[FORCED_DEPENDENCY_LABEL] + } + }; + this.#bboxTracker.save(opIdx); + return this; } - get fingerprints() { - return this._pdfInfo.fingerprints; + restore(opIdx) { + this.#bboxTracker.restore(opIdx, this.#recordDebugMetadataDepenencyAfterRestore); + const previous = Object.getPrototypeOf(this.#simple); + if (previous === null) { + return this; + } + this.#simple = previous; + this.#incremental = Object.getPrototypeOf(this.#incremental); + return this; } - get isPureXfa() { - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "isPureXfa", !!this._transport._htmlForXfa); + recordOpenMarker(opIdx) { + this.#bboxTracker.recordOpenMarker(opIdx, this.#recordDebugMetadataDepenencyAfterRestore); + return this; } - get allXfaHtml() { - return this._transport._htmlForXfa; + getOpenMarker() { + return this.#bboxTracker.getOpenMarker(); } - getPage(pageNumber) { - return this._transport.getPage(pageNumber); + recordCloseMarker(opIdx) { + this.#bboxTracker.recordCloseMarker(opIdx, this.#recordDebugMetadataDepenencyAfterRestore); + return this; } - getPageIndex(ref) { - return this._transport.getPageIndex(ref); + beginMarkedContent(opIdx) { + this.#bboxTracker.beginMarkedContent(opIdx); + return this; } - getDestinations() { - return this._transport.getDestinations(); + endMarkedContent(opIdx) { + this.#bboxTracker.endMarkedContent(opIdx, this.#recordDebugMetadataDepenencyAfterRestore); + return this; } - getDestination(id) { - return this._transport.getDestination(id); + pushBaseTransform(ctx) { + this.#bboxTracker.pushBaseTransform(ctx); + return this; } - getPageLabels() { - return this._transport.getPageLabels(); + popBaseTransform() { + this.#bboxTracker.popBaseTransform(); + return this; } - getPageLayout() { - return this._transport.getPageLayout(); + recordSimpleData(name, idx) { + this.#simple[name] = idx; + return this; } - getPageMode() { - return this._transport.getPageMode(); + recordIncrementalData(name, idx) { + this.#incremental[name].push(idx); + return this; } - getViewerPreferences() { - return this._transport.getViewerPreferences(); + resetIncrementalData(name, idx) { + this.#incremental[name].length = 0; + return this; } - getOpenAction() { - return this._transport.getOpenAction(); + recordNamedData(name, idx) { + this.#namedDependencies.set(name, idx); + return this; } - getAttachments() { - return this._transport.getAttachments(); + recordSimpleDataFromNamed(name, depName, fallbackIdx) { + this.#simple[name] = this.#namedDependencies.get(depName) ?? fallbackIdx; } - getJSActions() { - return this._transport.getDocJSActions(); + recordFutureForcedDependency(name, idx) { + this.recordIncrementalData(FORCED_DEPENDENCY_LABEL, idx); + return this; } - getOutline() { - return this._transport.getOutline(); + inheritSimpleDataAsFutureForcedDependencies(names) { + for (const name of names) { + if (name in this.#simple) { + this.recordFutureForcedDependency(name, this.#simple[name]); + } + } + return this; } - getOptionalContentConfig({ - intent = "display" - } = {}) { - const { - renderingIntent - } = this._transport.getRenderingIntent(intent); - return this._transport.getOptionalContentConfig(renderingIntent); + inheritPendingDependenciesAsFutureForcedDependencies() { + for (const dep of this.#pendingDependencies) { + this.recordFutureForcedDependency(FORCED_DEPENDENCY_LABEL, dep); + } + return this; } - getPermissions() { - return this._transport.getPermissions(); + resetBBox(idx) { + this.#bboxTracker.resetBBox(idx); + return this; } - getMetadata() { - return this._transport.getMetadata(); + recordClipBox(idx, ctx, minX, maxX, minY, maxY) { + this.#bboxTracker.recordClipBox(idx, ctx, minX, maxX, minY, maxY); + return this; } - getMarkInfo() { - return this._transport.getMarkInfo(); + recordBBox(idx, ctx, minX, maxX, minY, maxY) { + this.#bboxTracker.recordBBox(idx, ctx, minX, maxX, minY, maxY); + return this; } - getData() { - return this._transport.getData(); + recordCharacterBBox(idx, ctx, font, scale = 1, x = 0, y = 0, getMeasure) { + const fontBBox = font.bbox; + let isBBoxTrustworthy; + let computedBBox; + if (fontBBox) { + isBBoxTrustworthy = fontBBox[2] !== fontBBox[0] && fontBBox[3] !== fontBBox[1] && this.#fontBBoxTrustworthy.get(font); + if (isBBoxTrustworthy !== false) { + computedBBox = [0, 0, 0, 0]; + Util.axialAlignedBoundingBox(fontBBox, font.fontMatrix, computedBBox); + if (scale !== 1 || x !== 0 || y !== 0) { + scaleCharBBox(scale, -scale, x, y, computedBBox); + } + if (isBBoxTrustworthy) { + return this.recordBBox(idx, ctx, computedBBox[0], computedBBox[2], computedBBox[1], computedBBox[3]); + } + } + } + if (!getMeasure) { + return this.recordFullPageBBox(idx); + } + const measure = getMeasure(); + if (fontBBox && computedBBox && isBBoxTrustworthy === undefined) { + isBBoxTrustworthy = computedBBox[0] <= x - measure.actualBoundingBoxLeft && computedBBox[2] >= x + measure.actualBoundingBoxRight && computedBBox[1] <= y - measure.actualBoundingBoxAscent && computedBBox[3] >= y + measure.actualBoundingBoxDescent; + this.#fontBBoxTrustworthy.set(font, isBBoxTrustworthy); + if (isBBoxTrustworthy) { + return this.recordBBox(idx, ctx, computedBBox[0], computedBBox[2], computedBBox[1], computedBBox[3]); + } + } + return this.recordBBox(idx, ctx, x - measure.actualBoundingBoxLeft, x + measure.actualBoundingBoxRight, y - measure.actualBoundingBoxAscent, y + measure.actualBoundingBoxDescent); } - saveDocument() { - return this._transport.saveDocument(); + recordFullPageBBox(idx) { + this.#bboxTracker.recordFullPageBBox(idx); + return this; } - getDownloadInfo() { - return this._transport.downloadInfoCapability.promise; + getSimpleIndex(dependencyName) { + return this.#simple[dependencyName]; } - cleanup(keepLoadedFonts = false) { - return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa); + recordDependencies(idx, dependencyNames) { + const pendingDependencies = this.#pendingDependencies; + const simple = this.#simple; + const incremental = this.#incremental; + for (const name of dependencyNames) { + if (name in this.#simple) { + pendingDependencies.add(simple[name]); + } else if (name in incremental) { + incremental[name].forEach(pendingDependencies.add, pendingDependencies); + } + } + return this; } - destroy() { - return this.loadingTask.destroy(); + recordNamedDependency(idx, name) { + if (this.#namedDependencies.has(name)) { + this.#pendingDependencies.add(this.#namedDependencies.get(name)); + } + return this; } - get loadingParams() { - return this._transport.loadingParams; + recordOperation(idx, preserve = false) { + this.recordDependencies(idx, [FORCED_DEPENDENCY_LABEL]); + if (this.#debugMetadata) { + const metadata = ensureDebugMetadata(this.#debugMetadata, idx); + const { + dependencies + } = metadata; + this.#pendingDependencies.forEach(dependencies.add, dependencies); + this.#bboxTracker._savesStack.forEach(dependencies.add, dependencies); + this.#bboxTracker._markedContentStack.forEach(dependencies.add, dependencies); + dependencies.delete(idx); + metadata.isRenderingOperation = true; + } + const needsCleanup = !preserve && idx === this.#bboxTracker._pendingBBoxIdx; + this.#bboxTracker.recordOperation(idx, preserve, [this.#pendingDependencies, this.#bboxTracker._savesStack, this.#bboxTracker._markedContentStack]); + if (needsCleanup) { + this.#pendingDependencies.clear(); + } + return this; } - get loadingTask() { - return this._transport.loadingTask; + recordShowTextOperation(idx, preserve = false) { + const deps = Array.from(this.#pendingDependencies); + this.recordOperation(idx, preserve); + this.recordIncrementalData("sameLineText", idx); + for (const dep of deps) { + this.recordIncrementalData("sameLineText", dep); + } + return this; } - getFieldObjects() { - return this._transport.getFieldObjects(); + bboxToClipBoxDropOperation(idx, preserve = false) { + const needsCleanup = !preserve && idx === this.#bboxTracker._pendingBBoxIdx; + this.#bboxTracker.bboxToClipBoxDropOperation(idx); + if (needsCleanup) { + this.#pendingDependencies.clear(); + } + return this; } - hasJSActions() { - return this._transport.hasJSActions(); + take() { + this.#fontBBoxTrustworthy.clear(); + return this.#bboxTracker.take(); } - getCalculationOrderIds() { - return this._transport.getCalculationOrderIds(); + takeDebugMetadata() { + return this.#debugMetadata; } } -class PDFPageProxy { - #delayedCleanupTimeout = null; - #pendingCleanup = false; - constructor(pageIndex, pageInfo, transport, pdfBug = false) { - this._pageIndex = pageIndex; - this._pageInfo = pageInfo; - this._transport = transport; - this._stats = pdfBug ? new _display_utils_js__WEBPACK_IMPORTED_MODULE_2__.StatTimer() : null; - this._pdfBug = pdfBug; - this.commonObjs = transport.commonObjs; - this.objs = new PDFObjects(); - this._maybeCleanupAfterRender = false; - this._intentStates = new Map(); - this.destroyed = false; +class CanvasNestedDependencyTracker { + #dependencyTracker; + #opIdx; + #ignoreBBoxes; + #nestingLevel = 0; + #savesLevel = 0; + constructor(dependencyTracker, opIdx, ignoreBBoxes) { + if (dependencyTracker instanceof CanvasNestedDependencyTracker && dependencyTracker.#ignoreBBoxes === !!ignoreBBoxes) { + return dependencyTracker; + } + this.#dependencyTracker = dependencyTracker; + this.#opIdx = opIdx; + this.#ignoreBBoxes = !!ignoreBBoxes; } - get pageNumber() { - return this._pageIndex + 1; + get clipBox() { + return this.#dependencyTracker.clipBox; } - get rotate() { - return this._pageInfo.rotate; + growOperationsCount() { + throw new Error("Unreachable"); } - get ref() { - return this._pageInfo.ref; + save(opIdx) { + this.#savesLevel++; + this.#dependencyTracker.save(this.#opIdx); + return this; } - get userUnit() { - return this._pageInfo.userUnit; + restore(opIdx) { + if (this.#savesLevel > 0) { + this.#dependencyTracker.restore(this.#opIdx); + this.#savesLevel--; + } + return this; } - get view() { - return this._pageInfo.view; + recordOpenMarker(idx) { + this.#nestingLevel++; + return this; } - getViewport({ - scale, - rotation = this.rotate, - offsetX = 0, - offsetY = 0, - dontFlip = false - } = {}) { - return new _display_utils_js__WEBPACK_IMPORTED_MODULE_2__.PageViewport({ - viewBox: this.view, - scale, - rotation, - offsetX, - offsetY, - dontFlip - }); + getOpenMarker() { + return this.#nestingLevel > 0 ? this.#opIdx : this.#dependencyTracker.getOpenMarker(); } - getAnnotations({ - intent = "display" - } = {}) { - const { - renderingIntent - } = this._transport.getRenderingIntent(intent); - return this._transport.getAnnotations(this._pageIndex, renderingIntent); + recordCloseMarker(idx) { + this.#nestingLevel--; + return this; } - getJSActions() { - return this._transport.getPageJSActions(this._pageIndex); + beginMarkedContent(opIdx) { + return this; } - get filterFactory() { - return this._transport.filterFactory; + endMarkedContent(opIdx) { + return this; } - get isPureXfa() { - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "isPureXfa", !!this._transport._htmlForXfa); + pushBaseTransform(ctx) { + this.#dependencyTracker.pushBaseTransform(ctx); + return this; } - async getXfa() { - return this._transport._htmlForXfa?.children[this._pageIndex] || null; + popBaseTransform() { + this.#dependencyTracker.popBaseTransform(); + return this; } - render({ - canvasContext, - viewport, - intent = "display", - annotationMode = _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationMode.ENABLE, - transform = null, - background = null, - optionalContentConfigPromise = null, - annotationCanvasMap = null, - pageColors = null, - printAnnotationStorage = null - }) { - this._stats?.time("Overall"); - const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage); - const { - renderingIntent, - cacheKey - } = intentArgs; - this.#pendingCleanup = false; - this.#abortDelayedCleanup(); - optionalContentConfigPromise ||= this._transport.getOptionalContentConfig(renderingIntent); - let intentState = this._intentStates.get(cacheKey); - if (!intentState) { - intentState = Object.create(null); - this._intentStates.set(cacheKey, intentState); - } - if (intentState.streamReaderCancelTimeout) { - clearTimeout(intentState.streamReaderCancelTimeout); - intentState.streamReaderCancelTimeout = null; - } - const intentPrint = !!(renderingIntent & _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.RenderingIntentFlag.PRINT); - if (!intentState.displayReadyCapability) { - intentState.displayReadyCapability = Promise.withResolvers(); - intentState.operatorList = { - fnArray: [], - argsArray: [], - lastChunk: false, - separateAnnots: null - }; - this._stats?.time("Page Request"); - this._pumpOperatorList(intentArgs); - } - const complete = error => { - intentState.renderTasks.delete(internalRenderTask); - if (this._maybeCleanupAfterRender || intentPrint) { - this.#pendingCleanup = true; - } - this.#tryCleanup(!intentPrint); - if (error) { - internalRenderTask.capability.reject(error); - this._abortOperatorList({ - intentState, - reason: error instanceof Error ? error : new Error(error) - }); - } else { - internalRenderTask.capability.resolve(); - } - this._stats?.timeEnd("Rendering"); - this._stats?.timeEnd("Overall"); - }; - const internalRenderTask = new InternalRenderTask({ - callback: complete, - params: { - canvasContext, - viewport, - transform, - background - }, - objs: this.objs, - commonObjs: this.commonObjs, - annotationCanvasMap, - operatorList: intentState.operatorList, - pageIndex: this._pageIndex, - canvasFactory: this._transport.canvasFactory, - filterFactory: this._transport.filterFactory, - useRequestAnimationFrame: !intentPrint, - pdfBug: this._pdfBug, - pageColors - }); - (intentState.renderTasks ||= new Set()).add(internalRenderTask); - const renderTask = internalRenderTask.task; - Promise.all([intentState.displayReadyCapability.promise, optionalContentConfigPromise]).then(([transparency, optionalContentConfig]) => { - if (this.destroyed) { - complete(); - return; - } - this._stats?.time("Rendering"); - if (!(optionalContentConfig.renderingIntent & renderingIntent)) { - throw new Error("Must use the same `intent`-argument when calling the `PDFPageProxy.render` " + "and `PDFDocumentProxy.getOptionalContentConfig` methods."); - } - internalRenderTask.initializeGraphics({ - transparency, - optionalContentConfig - }); - internalRenderTask.operatorListChanged(); - }).catch(complete); - return renderTask; + recordSimpleData(name, idx) { + this.#dependencyTracker.recordSimpleData(name, this.#opIdx); + return this; } - getOperatorList({ - intent = "display", - annotationMode = _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationMode.ENABLE, - printAnnotationStorage = null - } = {}) { - function operatorListChanged() { - if (intentState.operatorList.lastChunk) { - intentState.opListReadCapability.resolve(intentState.operatorList); - intentState.renderTasks.delete(opListTask); - } - } - const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, true); - let intentState = this._intentStates.get(intentArgs.cacheKey); - if (!intentState) { - intentState = Object.create(null); - this._intentStates.set(intentArgs.cacheKey, intentState); - } - let opListTask; - if (!intentState.opListReadCapability) { - opListTask = Object.create(null); - opListTask.operatorListChanged = operatorListChanged; - intentState.opListReadCapability = Promise.withResolvers(); - (intentState.renderTasks ||= new Set()).add(opListTask); - intentState.operatorList = { - fnArray: [], - argsArray: [], - lastChunk: false, - separateAnnots: null - }; - this._stats?.time("Page Request"); - this._pumpOperatorList(intentArgs); - } - return intentState.opListReadCapability.promise; + recordIncrementalData(name, idx) { + this.#dependencyTracker.recordIncrementalData(name, this.#opIdx); + return this; } - streamTextContent({ - includeMarkedContent = false, - disableNormalization = false - } = {}) { - const TEXT_CONTENT_CHUNK_SIZE = 100; - return this._transport.messageHandler.sendWithStream("GetTextContent", { - pageIndex: this._pageIndex, - includeMarkedContent: includeMarkedContent === true, - disableNormalization: disableNormalization === true - }, { - highWaterMark: TEXT_CONTENT_CHUNK_SIZE, - size(textContent) { - return textContent.items.length; - } - }); + resetIncrementalData(name, idx) { + this.#dependencyTracker.resetIncrementalData(name, this.#opIdx); + return this; } - getTextContent(params = {}) { - if (this._transport._htmlForXfa) { - return this.getXfa().then(xfa => _xfa_text_js__WEBPACK_IMPORTED_MODULE_15__.XfaText.textContent(xfa)); - } - const readableStream = this.streamTextContent(params); - return new Promise(function (resolve, reject) { - function pump() { - reader.read().then(function ({ - value, - done - }) { - if (done) { - resolve(textContent); - return; - } - Object.assign(textContent.styles, value.styles); - textContent.items.push(...value.items); - pump(); - }, reject); - } - const reader = readableStream.getReader(); - const textContent = { - items: [], - styles: Object.create(null) - }; - pump(); - }); + recordNamedData(name, idx) { + return this; } - getStructTree() { - return this._transport.getStructTree(this._pageIndex); + recordSimpleDataFromNamed(name, depName, fallbackIdx) { + this.#dependencyTracker.recordSimpleDataFromNamed(name, depName, this.#opIdx); + return this; } - _destroy() { - this.destroyed = true; - const waitOn = []; - for (const intentState of this._intentStates.values()) { - this._abortOperatorList({ - intentState, - reason: new Error("Page was destroyed."), - force: true - }); - if (intentState.opListReadCapability) { - continue; - } - for (const internalRenderTask of intentState.renderTasks) { - waitOn.push(internalRenderTask.completed); - internalRenderTask.cancel(); - } - } - this.objs.clear(); - this.#pendingCleanup = false; - this.#abortDelayedCleanup(); - return Promise.all(waitOn); + recordFutureForcedDependency(name, idx) { + this.#dependencyTracker.recordFutureForcedDependency(name, this.#opIdx); + return this; } - cleanup(resetStats = false) { - this.#pendingCleanup = true; - const success = this.#tryCleanup(false); - if (resetStats && success) { - this._stats &&= new _display_utils_js__WEBPACK_IMPORTED_MODULE_2__.StatTimer(); - } - return success; + inheritSimpleDataAsFutureForcedDependencies(names) { + this.#dependencyTracker.inheritSimpleDataAsFutureForcedDependencies(names); + return this; } - #tryCleanup(delayed = false) { - this.#abortDelayedCleanup(); - if (!this.#pendingCleanup || this.destroyed) { - return false; - } - if (delayed) { - this.#delayedCleanupTimeout = setTimeout(() => { - this.#delayedCleanupTimeout = null; - this.#tryCleanup(false); - }, DELAYED_CLEANUP_TIMEOUT); - return false; - } - for (const { - renderTasks, - operatorList - } of this._intentStates.values()) { - if (renderTasks.size > 0 || !operatorList.lastChunk) { - return false; - } - } - this._intentStates.clear(); - this.objs.clear(); - this.#pendingCleanup = false; - return true; + inheritPendingDependenciesAsFutureForcedDependencies() { + this.#dependencyTracker.inheritPendingDependenciesAsFutureForcedDependencies(); + return this; } - #abortDelayedCleanup() { - if (this.#delayedCleanupTimeout) { - clearTimeout(this.#delayedCleanupTimeout); - this.#delayedCleanupTimeout = null; + resetBBox(idx) { + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.resetBBox(this.#opIdx); } + return this; } - _startRenderPage(transparency, cacheKey) { - const intentState = this._intentStates.get(cacheKey); - if (!intentState) { - return; + recordClipBox(idx, ctx, minX, maxX, minY, maxY) { + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.recordClipBox(this.#opIdx, ctx, minX, maxX, minY, maxY); } - this._stats?.timeEnd("Page Request"); - intentState.displayReadyCapability?.resolve(transparency); + return this; } - _renderPageChunk(operatorListChunk, intentState) { - for (let i = 0, ii = operatorListChunk.length; i < ii; i++) { - intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]); - intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]); - } - intentState.operatorList.lastChunk = operatorListChunk.lastChunk; - intentState.operatorList.separateAnnots = operatorListChunk.separateAnnots; - for (const internalRenderTask of intentState.renderTasks) { - internalRenderTask.operatorListChanged(); - } - if (operatorListChunk.lastChunk) { - this.#tryCleanup(true); + recordBBox(idx, ctx, minX, maxX, minY, maxY) { + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.recordBBox(this.#opIdx, ctx, minX, maxX, minY, maxY); } + return this; } - _pumpOperatorList({ - renderingIntent, - cacheKey, - annotationStorageSerializable - }) { - const { - map, - transfer - } = annotationStorageSerializable; - const readableStream = this._transport.messageHandler.sendWithStream("GetOperatorList", { - pageIndex: this._pageIndex, - intent: renderingIntent, - cacheKey, - annotationStorage: map - }, transfer); - const reader = readableStream.getReader(); - const intentState = this._intentStates.get(cacheKey); - intentState.streamReader = reader; - const pump = () => { - reader.read().then(({ - value, - done - }) => { - if (done) { - intentState.streamReader = null; - return; - } - if (this._transport.destroyed) { - return; - } - this._renderPageChunk(value, intentState); - pump(); - }, reason => { - intentState.streamReader = null; - if (this._transport.destroyed) { - return; - } - if (intentState.operatorList) { - intentState.operatorList.lastChunk = true; - for (const internalRenderTask of intentState.renderTasks) { - internalRenderTask.operatorListChanged(); - } - this.#tryCleanup(true); - } - if (intentState.displayReadyCapability) { - intentState.displayReadyCapability.reject(reason); - } else if (intentState.opListReadCapability) { - intentState.opListReadCapability.reject(reason); - } else { - throw reason; - } - }); - }; - pump(); - } - _abortOperatorList({ - intentState, - reason, - force = false - }) { - if (!intentState.streamReader) { - return; - } - if (intentState.streamReaderCancelTimeout) { - clearTimeout(intentState.streamReaderCancelTimeout); - intentState.streamReaderCancelTimeout = null; + recordCharacterBBox(idx, ctx, font, scale, x, y, getMeasure) { + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.recordCharacterBBox(this.#opIdx, ctx, font, scale, x, y, getMeasure); } - if (!force) { - if (intentState.renderTasks.size > 0) { - return; - } - if (reason instanceof _display_utils_js__WEBPACK_IMPORTED_MODULE_2__.RenderingCancelledException) { - let delay = RENDERING_CANCELLED_TIMEOUT; - if (reason.extraDelay > 0 && reason.extraDelay < 1000) { - delay += reason.extraDelay; - } - intentState.streamReaderCancelTimeout = setTimeout(() => { - intentState.streamReaderCancelTimeout = null; - this._abortOperatorList({ - intentState, - reason, - force: true - }); - }, delay); - return; - } - } - intentState.streamReader.cancel(new _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AbortException(reason.message)).catch(() => {}); - intentState.streamReader = null; - if (this._transport.destroyed) { - return; - } - for (const [curCacheKey, curIntentState] of this._intentStates) { - if (curIntentState === intentState) { - this._intentStates.delete(curCacheKey); - break; - } + return this; + } + recordFullPageBBox(idx) { + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.recordFullPageBBox(this.#opIdx); } - this.cleanup(); + return this; } - get stats() { - return this._stats; + getSimpleIndex(dependencyName) { + return this.#dependencyTracker.getSimpleIndex(dependencyName); } -} -class LoopbackPort { - #listeners = new Set(); - #deferred = Promise.resolve(); - postMessage(obj, transfer) { - const event = { - data: structuredClone(obj, transfer ? { - transfer - } : null) - }; - this.#deferred.then(() => { - for (const listener of this.#listeners) { - listener.call(this, event); - } - }); - } - addEventListener(name, listener) { - this.#listeners.add(listener); + recordDependencies(idx, dependencyNames) { + this.#dependencyTracker.recordDependencies(this.#opIdx, dependencyNames); + return this; } - removeEventListener(name, listener) { - this.#listeners.delete(listener); + recordNamedDependency(idx, name) { + this.#dependencyTracker.recordNamedDependency(this.#opIdx, name); + return this; } - terminate() { - this.#listeners.clear(); + recordOperation(idx) { + this.#dependencyTracker.recordOperation(this.#opIdx, true); + return this; } -} -const PDFWorkerUtil = { - isWorkerDisabled: false, - fakeWorkerId: 0 -}; -{ - if (_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.isNodeJS) { - PDFWorkerUtil.isWorkerDisabled = true; - _worker_options_js__WEBPACK_IMPORTED_MODULE_14__.GlobalWorkerOptions.workerSrc ||= "./pdf.worker.mjs"; + recordShowTextOperation(idx) { + this.#dependencyTracker.recordShowTextOperation(this.#opIdx, true); + return this; } - PDFWorkerUtil.isSameOrigin = function (baseUrl, otherUrl) { - let base; - try { - base = new URL(baseUrl); - if (!base.origin || base.origin === "null") { - return false; - } - } catch { - return false; - } - const other = new URL(otherUrl, base); - return base.origin === other.origin; - }; - PDFWorkerUtil.createCDNWrapper = function (url) { - const wrapper = `await import("${url}");`; - return URL.createObjectURL(new Blob([wrapper], { - type: "text/javascript" - })); - }; -} -class PDFWorker { - static #workerPorts; - constructor({ - name = null, - port = null, - verbosity = (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.getVerbosityLevel)() - } = {}) { - this.name = name; - this.destroyed = false; - this.verbosity = verbosity; - this._readyCapability = Promise.withResolvers(); - this._port = null; - this._webWorker = null; - this._messageHandler = null; - if (port) { - if (PDFWorker.#workerPorts?.has(port)) { - throw new Error("Cannot use more than one PDFWorker per port."); - } - (PDFWorker.#workerPorts ||= new WeakMap()).set(port, this); - this._initializeFromPort(port); - return; + bboxToClipBoxDropOperation(idx) { + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.bboxToClipBoxDropOperation(this.#opIdx, true); } - this._initialize(); - } - get promise() { - return this._readyCapability.promise; + return this; } - get port() { - return this._port; - } - get messageHandler() { - return this._messageHandler; + take() { + throw new Error("Unreachable"); } - _initializeFromPort(port) { - this._port = port; - this._messageHandler = new _shared_message_handler_js__WEBPACK_IMPORTED_MODULE_7__.MessageHandler("main", "worker", port); - this._messageHandler.on("ready", function () {}); - this._readyCapability.resolve(); - this._messageHandler.send("configure", { - verbosity: this.verbosity - }); - } - _initialize() { - if (!PDFWorkerUtil.isWorkerDisabled && !PDFWorker.#mainThreadWorkerMessageHandler) { - let { - workerSrc - } = PDFWorker; - try { - if (!PDFWorkerUtil.isSameOrigin(window.location.href, workerSrc)) { - workerSrc = PDFWorkerUtil.createCDNWrapper(new URL(workerSrc, window.location).href); - } - const worker = new Worker(workerSrc, { - type: "module" - }); - const messageHandler = new _shared_message_handler_js__WEBPACK_IMPORTED_MODULE_7__.MessageHandler("main", "worker", worker); - const terminateEarly = () => { - worker.removeEventListener("error", onWorkerError); - messageHandler.destroy(); - worker.terminate(); - if (this.destroyed) { - this._readyCapability.reject(new Error("Worker was destroyed")); - } else { - this._setupFakeWorker(); - } - }; - const onWorkerError = () => { - if (!this._webWorker) { - terminateEarly(); - } - }; - worker.addEventListener("error", onWorkerError); - messageHandler.on("test", data => { - worker.removeEventListener("error", onWorkerError); - if (this.destroyed) { - terminateEarly(); - return; - } - if (data) { - this._messageHandler = messageHandler; - this._port = worker; - this._webWorker = worker; - this._readyCapability.resolve(); - messageHandler.send("configure", { - verbosity: this.verbosity - }); - } else { - this._setupFakeWorker(); - messageHandler.destroy(); - worker.terminate(); - } - }); - messageHandler.on("ready", data => { - worker.removeEventListener("error", onWorkerError); - if (this.destroyed) { - terminateEarly(); - return; - } - try { - sendTest(); - } catch { - this._setupFakeWorker(); - } - }); - const sendTest = () => { - const testObj = new Uint8Array(); - messageHandler.send("test", testObj, [testObj.buffer]); - }; - sendTest(); - return; - } catch { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.info)("The worker has been disabled."); - } - } - this._setupFakeWorker(); + takeDebugMetadata() { + throw new Error("Unreachable"); } - _setupFakeWorker() { - if (!PDFWorkerUtil.isWorkerDisabled) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)("Setting up fake worker."); - PDFWorkerUtil.isWorkerDisabled = true; - } - PDFWorker._setupFakeWorkerGlobal.then(WorkerMessageHandler => { - if (this.destroyed) { - this._readyCapability.reject(new Error("Worker was destroyed")); +} +const Dependencies = { + stroke: ["path", "transform", "filter", "strokeColor", "strokeAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "dash"], + fill: ["path", "transform", "filter", "fillColor", "fillAlpha", "globalCompositeOperation", "SMask"], + imageXObject: ["transform", "SMask", "filter", "fillAlpha", "strokeAlpha", "globalCompositeOperation"], + rawFillPath: ["filter", "fillColor", "fillAlpha"], + showText: ["transform", "leading", "charSpacing", "wordSpacing", "hScale", "textRise", "moveText", "textMatrix", "font", "fontObj", "filter", "fillColor", "textRenderingMode", "SMask", "fillAlpha", "strokeAlpha", "globalCompositeOperation", "sameLineText"], + transform: ["transform"], + transformAndFill: ["transform", "fillColor"] +}; +class CanvasImagesTracker { + #canvasWidth; + #canvasHeight; + #capacity = 4; + #count = 0; + #coords = new CanvasImagesTracker.#CoordsArray(this.#capacity * 6); + static #CoordsArray = FeatureTest.isFloat16ArraySupported ? Float16Array : Float32Array; + constructor(canvas) { + this.#canvasWidth = canvas.width; + this.#canvasHeight = canvas.height; + } + record(ctx, width, height, clipBox) { + if (this.#count === this.#capacity) { + this.#capacity *= 2; + const newCoords = new CanvasImagesTracker.#CoordsArray(this.#capacity * 6); + newCoords.set(this.#coords); + this.#coords = newCoords; + } + const transform = getCurrentTransform(ctx); + let coords; + if (clipBox[0] !== Infinity) { + const bbox = BBOX_INIT.slice(); + Util.axialAlignedBoundingBox([0, -height, width, 0], transform, bbox); + const finalBBox = Util.intersect(clipBox, bbox); + if (!finalBBox) { return; } - const port = new LoopbackPort(); - this._port = port; - const id = `fake${PDFWorkerUtil.fakeWorkerId++}`; - const workerHandler = new _shared_message_handler_js__WEBPACK_IMPORTED_MODULE_7__.MessageHandler(id + "_worker", id, port); - WorkerMessageHandler.setup(workerHandler, port); - const messageHandler = new _shared_message_handler_js__WEBPACK_IMPORTED_MODULE_7__.MessageHandler(id, id + "_worker", port); - this._messageHandler = messageHandler; - this._readyCapability.resolve(); - messageHandler.send("configure", { - verbosity: this.verbosity - }); - }).catch(reason => { - this._readyCapability.reject(new Error(`Setting up fake worker failed: "${reason.message}".`)); - }); - } - destroy() { - this.destroyed = true; - if (this._webWorker) { - this._webWorker.terminate(); - this._webWorker = null; - } - PDFWorker.#workerPorts?.delete(this._port); - this._port = null; - if (this._messageHandler) { - this._messageHandler.destroy(); - this._messageHandler = null; - } - } - static fromPort(params) { - if (!params?.port) { - throw new Error("PDFWorker.fromPort - invalid method signature."); - } - const cachedPort = this.#workerPorts?.get(params.port); - if (cachedPort) { - if (cachedPort._pendingDestroy) { - throw new Error("PDFWorker.fromPort - the worker is being destroyed.\n" + "Please remember to await `PDFDocumentLoadingTask.destroy()`-calls."); + const [minX, minY, maxX, maxY] = finalBBox; + if (minX !== bbox[0] || minY !== bbox[1] || maxX !== bbox[2] || maxY !== bbox[3]) { + const rotationAngle = Math.atan2(transform[1], transform[0]); + const sin = Math.abs(Math.sin(rotationAngle)); + const cos = Math.abs(Math.cos(rotationAngle)); + if (sin < 1e-6 || cos < 1e-6 || Math.abs(sin - cos) < 1e-6) { + coords = [minX, minY, minX, maxY, maxX, minY]; + } else { + const finalBBoxWidth = maxX - minX; + const finalBBoxHeight = maxY - minY; + const sin2 = sin * sin; + const cos2 = cos * cos; + const cosSin = cos * sin; + const denom = cos2 - sin2; + const a = (finalBBoxHeight * cos2 - finalBBoxWidth * cosSin) / denom; + const b = (finalBBoxHeight * cosSin - finalBBoxWidth * sin2) / denom; + coords = [minX + b, minY, minX, minY + a, maxX, maxY - a]; + } } - return cachedPort; } - return new PDFWorker(params); + if (!coords) { + coords = [0, -height, 0, 0, width, -height]; + Util.applyTransform(coords, transform, 0); + Util.applyTransform(coords, transform, 2); + Util.applyTransform(coords, transform, 4); + } + coords[0] /= this.#canvasWidth; + coords[1] /= this.#canvasHeight; + coords[2] /= this.#canvasWidth; + coords[3] /= this.#canvasHeight; + coords[4] /= this.#canvasWidth; + coords[5] /= this.#canvasHeight; + this.#coords.set(coords, this.#count * 6); + this.#count++; } - static get workerSrc() { - if (_worker_options_js__WEBPACK_IMPORTED_MODULE_14__.GlobalWorkerOptions.workerSrc) { - return _worker_options_js__WEBPACK_IMPORTED_MODULE_14__.GlobalWorkerOptions.workerSrc; - } - throw new Error('No "GlobalWorkerOptions.workerSrc" specified.'); - } - static get #mainThreadWorkerMessageHandler() { - try { - return globalThis.pdfjsWorker?.WorkerMessageHandler || null; - } catch { - return null; - } - } - static get _setupFakeWorkerGlobal() { - const loader = async () => { - if (this.#mainThreadWorkerMessageHandler) { - return this.#mainThreadWorkerMessageHandler; - } - const worker = await import( /*webpackIgnore: true*/this.workerSrc); - return worker.WorkerMessageHandler; - }; - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "_setupFakeWorkerGlobal", loader()); + take() { + return this.#coords.subarray(0, this.#count * 6); } } -class WorkerTransport { - #methodPromises = new Map(); - #pageCache = new Map(); - #pagePromises = new Map(); - #passwordCapability = null; - constructor(messageHandler, loadingTask, networkStream, params, factory) { - this.messageHandler = messageHandler; - this.loadingTask = loadingTask; - this.commonObjs = new PDFObjects(); - this.fontLoader = new _font_loader_js__WEBPACK_IMPORTED_MODULE_3__.FontLoader({ - ownerDocument: params.ownerDocument, - styleElement: params.styleElement - }); - this._params = params; - this.canvasFactory = factory.canvasFactory; - this.filterFactory = factory.filterFactory; - this.cMapReaderFactory = factory.cMapReaderFactory; - this.standardFontDataFactory = factory.standardFontDataFactory; - this.destroyed = false; - this.destroyCapability = null; - this._networkStream = networkStream; - this._fullReader = null; - this._lastProgress = null; - this.downloadInfoCapability = Promise.withResolvers(); - this.setupMessageHandler(); + +;// ./src/display/font_loader.js + + +class FontLoader { + #systemFonts = new Set(); + #styleSheet = null; + constructor({ + ownerDocument = globalThis.document, + styleElement = null + }) { + this._document = ownerDocument; + this.nativeFontFaces = new Set(); + this.styleElement = null; + this.loadingRequests = []; + this.loadTestFontId = 0; } - #cacheSimpleMethod(name, data = null) { - const cachedPromise = this.#methodPromises.get(name); - if (cachedPromise) { - return cachedPromise; - } - const promise = this.messageHandler.sendWithPromise(name, data); - this.#methodPromises.set(name, promise); - return promise; + addNativeFontFace(nativeFontFace) { + this.nativeFontFaces.add(nativeFontFace); + this._document.fonts.add(nativeFontFace); } - get annotationStorage() { - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "annotationStorage", new _annotation_storage_js__WEBPACK_IMPORTED_MODULE_1__.AnnotationStorage()); + removeNativeFontFace(nativeFontFace) { + this.nativeFontFaces.delete(nativeFontFace); + this._document.fonts.delete(nativeFontFace); } - getRenderingIntent(intent, annotationMode = _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationMode.ENABLE, printAnnotationStorage = null, isOpList = false) { - let renderingIntent = _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.RenderingIntentFlag.DISPLAY; - let annotationStorageSerializable = _annotation_storage_js__WEBPACK_IMPORTED_MODULE_1__.SerializableEmpty; - switch (intent) { - case "any": - renderingIntent = _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.RenderingIntentFlag.ANY; - break; - case "display": - break; - case "print": - renderingIntent = _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.RenderingIntentFlag.PRINT; - break; - default: - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`getRenderingIntent - invalid intent: ${intent}`); + insertRule(rule) { + const styleSheet = this.#getStyleSheet(); + styleSheet.insertRule(rule, styleSheet.cssRules.length); + } + #getStyleSheet() { + if (this.#styleSheet) { + return this.#styleSheet; } - switch (annotationMode) { - case _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationMode.DISABLE: - renderingIntent += _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.RenderingIntentFlag.ANNOTATIONS_DISABLE; - break; - case _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationMode.ENABLE: - break; - case _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationMode.ENABLE_FORMS: - renderingIntent += _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.RenderingIntentFlag.ANNOTATIONS_FORMS; - break; - case _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationMode.ENABLE_STORAGE: - renderingIntent += _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.RenderingIntentFlag.ANNOTATIONS_STORAGE; - const annotationStorage = renderingIntent & _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.RenderingIntentFlag.PRINT && printAnnotationStorage instanceof _annotation_storage_js__WEBPACK_IMPORTED_MODULE_1__.PrintAnnotationStorage ? printAnnotationStorage : this.annotationStorage; - annotationStorageSerializable = annotationStorage.serializable; - break; - default: - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`getRenderingIntent - invalid annotationMode: ${annotationMode}`); + const StyleSheet = this._document.defaultView?.CSSStyleSheet || globalThis.CSSStyleSheet; + if (!this.styleElement && StyleSheet) { + const { + adoptedStyleSheets + } = this._document; + if (adoptedStyleSheets) { + const styleSheet = new StyleSheet(); + adoptedStyleSheets.push(styleSheet); + return this.#styleSheet = styleSheet; + } } - if (isOpList) { - renderingIntent += _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.RenderingIntentFlag.OPLIST; + if (!this.styleElement) { + this.styleElement = this._document.createElement("style"); + this._document.documentElement.getElementsByTagName("head")[0].append(this.styleElement); } - return { - renderingIntent, - cacheKey: `${renderingIntent}_${annotationStorageSerializable.hash}`, - annotationStorageSerializable - }; + return this.#styleSheet = this.styleElement.sheet; } - destroy() { - if (this.destroyCapability) { - return this.destroyCapability.promise; + clear() { + for (const nativeFontFace of this.nativeFontFaces) { + this._document.fonts.delete(nativeFontFace); } - this.destroyed = true; - this.destroyCapability = Promise.withResolvers(); - this.#passwordCapability?.reject(new Error("Worker was destroyed during onPassword callback")); - const waitOn = []; - for (const page of this.#pageCache.values()) { - waitOn.push(page._destroy()); + this.nativeFontFaces.clear(); + this.#systemFonts.clear(); + if (this.#styleSheet) { + const { + adoptedStyleSheets + } = this._document; + if (adoptedStyleSheets?.includes(this.#styleSheet)) { + this._document.adoptedStyleSheets = adoptedStyleSheets.filter(styleSheet => styleSheet !== this.#styleSheet); + } + this.#styleSheet = null; } - this.#pageCache.clear(); - this.#pagePromises.clear(); - if (this.hasOwnProperty("annotationStorage")) { - this.annotationStorage.resetModified(); + if (this.styleElement) { + this.styleElement.remove(); + this.styleElement = null; } - const terminated = this.messageHandler.sendWithPromise("Terminate", null); - waitOn.push(terminated); - Promise.all(waitOn).then(() => { - this.commonObjs.clear(); - this.fontLoader.clear(); - this.#methodPromises.clear(); - this.filterFactory.destroy(); - (0,_text_layer_js__WEBPACK_IMPORTED_MODULE_6__.cleanupTextLayer)(); - this._networkStream?.cancelAllRequests(new _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AbortException("Worker was terminated.")); - if (this.messageHandler) { - this.messageHandler.destroy(); - this.messageHandler = null; - } - this.destroyCapability.resolve(); - }, this.destroyCapability.reject); - return this.destroyCapability.promise; - } - setupMessageHandler() { - const { - messageHandler, - loadingTask - } = this; - messageHandler.on("GetReader", (data, sink) => { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.assert)(this._networkStream, "GetReader - no `IPDFStream` instance available."); - this._fullReader = this._networkStream.getFullReader(); - this._fullReader.onProgress = evt => { - this._lastProgress = { - loaded: evt.loaded, - total: evt.total - }; - }; - sink.onPull = () => { - this._fullReader.read().then(function ({ - value, - done - }) { - if (done) { - sink.close(); - return; - } - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.assert)(value instanceof ArrayBuffer, "GetReader - expected an ArrayBuffer."); - sink.enqueue(new Uint8Array(value), 1, [value]); - }).catch(reason => { - sink.error(reason); - }); - }; - sink.onCancel = reason => { - this._fullReader.cancel(reason); - sink.ready.catch(readyReason => { - if (this.destroyed) { - return; - } - throw readyReason; - }); - }; - }); - messageHandler.on("ReaderHeadersReady", data => { - const headersCapability = Promise.withResolvers(); - const fullReader = this._fullReader; - fullReader.headersReady.then(() => { - if (!fullReader.isStreamingSupported || !fullReader.isRangeSupported) { - if (this._lastProgress) { - loadingTask.onProgress?.(this._lastProgress); - } - fullReader.onProgress = evt => { - loadingTask.onProgress?.({ - loaded: evt.loaded, - total: evt.total - }); - }; - } - headersCapability.resolve({ - isStreamingSupported: fullReader.isStreamingSupported, - isRangeSupported: fullReader.isRangeSupported, - contentLength: fullReader.contentLength - }); - }, headersCapability.reject); - return headersCapability.promise; - }); - messageHandler.on("GetRangeReader", (data, sink) => { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.assert)(this._networkStream, "GetRangeReader - no `IPDFStream` instance available."); - const rangeReader = this._networkStream.getRangeReader(data.begin, data.end); - if (!rangeReader) { - sink.close(); - return; - } - sink.onPull = () => { - rangeReader.read().then(function ({ - value, - done - }) { - if (done) { - sink.close(); - return; - } - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.assert)(value instanceof ArrayBuffer, "GetRangeReader - expected an ArrayBuffer."); - sink.enqueue(new Uint8Array(value), 1, [value]); - }).catch(reason => { - sink.error(reason); - }); - }; - sink.onCancel = reason => { - rangeReader.cancel(reason); - sink.ready.catch(readyReason => { - if (this.destroyed) { - return; - } - throw readyReason; - }); - }; - }); - messageHandler.on("GetDoc", ({ - pdfInfo - }) => { - this._numPages = pdfInfo.numPages; - this._htmlForXfa = pdfInfo.htmlForXfa; - delete pdfInfo.htmlForXfa; - loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this)); - }); - messageHandler.on("DocException", function (ex) { - let reason; - switch (ex.name) { - case "PasswordException": - reason = new _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.PasswordException(ex.message, ex.code); - break; - case "InvalidPDFException": - reason = new _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.InvalidPDFException(ex.message); - break; - case "MissingPDFException": - reason = new _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.MissingPDFException(ex.message); - break; - case "UnexpectedResponseException": - reason = new _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.UnexpectedResponseException(ex.message, ex.status); - break; - case "UnknownErrorException": - reason = new _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.UnknownErrorException(ex.message, ex.details); - break; - default: - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.unreachable)("DocException - expected a valid Error."); - } - loadingTask._capability.reject(reason); - }); - messageHandler.on("PasswordRequest", exception => { - this.#passwordCapability = Promise.withResolvers(); - if (loadingTask.onPassword) { - const updatePassword = password => { - if (password instanceof Error) { - this.#passwordCapability.reject(password); - } else { - this.#passwordCapability.resolve({ - password - }); - } - }; - try { - loadingTask.onPassword(updatePassword, exception.code); - } catch (ex) { - this.#passwordCapability.reject(ex); - } - } else { - this.#passwordCapability.reject(new _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.PasswordException(exception.message, exception.code)); - } - return this.#passwordCapability.promise; - }); - messageHandler.on("DataLoaded", data => { - loadingTask.onProgress?.({ - loaded: data.length, - total: data.length - }); - this.downloadInfoCapability.resolve(data); - }); - messageHandler.on("StartRenderPage", data => { - if (this.destroyed) { - return; - } - const page = this.#pageCache.get(data.pageIndex); - page._startRenderPage(data.transparency, data.cacheKey); - }); - messageHandler.on("commonobj", ([id, type, exportedData]) => { - if (this.destroyed) { - return null; - } - if (this.commonObjs.has(id)) { - return null; - } - switch (type) { - case "Font": - const params = this._params; - if ("error" in exportedData) { - const exportedError = exportedData.error; - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Error during font loading: ${exportedError}`); - this.commonObjs.resolve(id, exportedError); - break; - } - const inspectFont = params.pdfBug && globalThis.FontInspector?.enabled ? (font, url) => globalThis.FontInspector.fontAdded(font, url) : null; - const font = new _font_loader_js__WEBPACK_IMPORTED_MODULE_3__.FontFaceObject(exportedData, { - isEvalSupported: params.isEvalSupported, - disableFontFace: params.disableFontFace, - ignoreErrors: params.ignoreErrors, - inspectFont - }); - this.fontLoader.bind(font).catch(() => messageHandler.sendWithPromise("FontFallback", { - id - })).finally(() => { - if (!params.fontExtraProperties && font.data) { - font.data = null; - } - this.commonObjs.resolve(id, font); - }); - break; - case "CopyLocalImage": - const { - imageRef - } = exportedData; - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.assert)(imageRef, "The imageRef must be defined."); - for (const pageProxy of this.#pageCache.values()) { - for (const [, data] of pageProxy.objs) { - if (data.ref !== imageRef) { - continue; - } - if (!data.dataLen) { - return null; - } - this.commonObjs.resolve(id, structuredClone(data)); - return data.dataLen; - } - } - break; - case "FontPath": - case "Image": - case "Pattern": - this.commonObjs.resolve(id, exportedData); - break; - default: - throw new Error(`Got unknown common object type ${type}`); - } - return null; - }); - messageHandler.on("obj", ([id, pageIndex, type, imageData]) => { - if (this.destroyed) { - return; - } - const pageProxy = this.#pageCache.get(pageIndex); - if (pageProxy.objs.has(id)) { - return; - } - if (pageProxy._intentStates.size === 0) { - imageData?.bitmap?.close(); - return; + } + async loadSystemFont({ + systemFontInfo: info, + disableFontFace, + _inspectFont + }) { + if (!info || this.#systemFonts.has(info.loadedName)) { + return; + } + assert(!disableFontFace, "loadSystemFont shouldn't be called when `disableFontFace` is set."); + if (this.isFontLoadingAPISupported) { + const { + loadedName, + src, + style + } = info; + const fontFace = new FontFace(loadedName, src, style); + this.addNativeFontFace(fontFace); + try { + await fontFace.load(); + this.#systemFonts.add(loadedName); + _inspectFont?.(info); + } catch { + warn(`Cannot load system font: ${info.baseFontName}, installing it could help to improve PDF rendering.`); + this.removeNativeFontFace(fontFace); } - switch (type) { - case "Image": - pageProxy.objs.resolve(id, imageData); - if (imageData?.dataLen > _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.MAX_IMAGE_SIZE_TO_CACHE) { - pageProxy._maybeCleanupAfterRender = true; - } - break; - case "Pattern": - pageProxy.objs.resolve(id, imageData); - break; - default: - throw new Error(`Got unknown object type ${type}`); + return; + } + unreachable("Not implemented: loadSystemFont without the Font Loading API."); + } + async bind(font) { + if (font.attached || font.missingFile && !font.systemFontInfo) { + return; + } + font.attached = true; + if (font.systemFontInfo) { + await this.loadSystemFont(font); + return; + } + if (this.isFontLoadingAPISupported) { + const nativeFontFace = font.createNativeFontFace(); + if (nativeFontFace) { + this.addNativeFontFace(nativeFontFace); + try { + await nativeFontFace.loaded; + } catch (ex) { + warn(`Failed to load font '${nativeFontFace.family}': '${ex}'.`); + font.disableFontFace = true; + throw ex; + } } - }); - messageHandler.on("DocProgress", data => { - if (this.destroyed) { + return; + } + const rule = font.createFontFaceRule(); + if (rule) { + this.insertRule(rule); + if (this.isSyncFontLoadingSupported) { return; } - loadingTask.onProgress?.({ - loaded: data.loaded, - total: data.total + await new Promise(resolve => { + const request = this._queueLoadingCallback(resolve); + this._prepareFontLoadEvent(font, request); }); - }); - messageHandler.on("FetchBuiltInCMap", data => { - if (this.destroyed) { - return Promise.reject(new Error("Worker was destroyed.")); - } - if (!this.cMapReaderFactory) { - return Promise.reject(new Error("CMapReaderFactory not initialized, see the `useWorkerFetch` parameter.")); + } + } + get isFontLoadingAPISupported() { + const hasFonts = !!this._document?.fonts; + return shadow(this, "isFontLoadingAPISupported", hasFonts); + } + get isSyncFontLoadingSupported() { + return shadow(this, "isSyncFontLoadingSupported", isNodeJS || FeatureTest.platform.isFirefox); + } + _queueLoadingCallback(callback) { + function completeRequest() { + assert(!request.done, "completeRequest() cannot be called twice."); + request.done = true; + while (loadingRequests.length > 0 && loadingRequests[0].done) { + const otherRequest = loadingRequests.shift(); + setTimeout(otherRequest.callback, 0); } - return this.cMapReaderFactory.fetch(data); - }); - messageHandler.on("FetchStandardFontData", data => { - if (this.destroyed) { - return Promise.reject(new Error("Worker was destroyed.")); + } + const { + loadingRequests + } = this; + const request = { + done: false, + complete: completeRequest, + callback + }; + loadingRequests.push(request); + return request; + } + get _loadTestFont() { + const testFont = atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA" + "FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA" + "ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA" + "AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1" + "AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD" + "6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM" + "AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D" + "IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA" + "AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA" + "AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB" + "AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY" + "AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA" + "AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA" + "AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC" + "AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3" + "Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj" + "FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA=="); + return shadow(this, "_loadTestFont", testFont); + } + _prepareFontLoadEvent(font, request) { + function int32(data, offset) { + return data.charCodeAt(offset) << 24 | data.charCodeAt(offset + 1) << 16 | data.charCodeAt(offset + 2) << 8 | data.charCodeAt(offset + 3) & 0xff; + } + function string32(value) { + return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); + } + function spliceString(s, offset, remove, insert) { + const chunk1 = s.substring(0, offset); + const chunk2 = s.substring(offset + remove); + return chunk1 + insert + chunk2; + } + let i, ii; + const canvas = this._document.createElement("canvas"); + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext("2d"); + let called = 0; + function isFontReady(name, callback) { + if (++called > 30) { + warn("Load test font never loaded."); + callback(); + return; } - if (!this.standardFontDataFactory) { - return Promise.reject(new Error("StandardFontDataFactory not initialized, see the `useWorkerFetch` parameter.")); + ctx.font = "30px " + name; + ctx.fillText(".", 0, 20); + const imageData = ctx.getImageData(0, 0, 1, 1); + if (imageData.data[3] > 0) { + callback(); + return; } - return this.standardFontDataFactory.fetch(data); + setTimeout(isFontReady.bind(null, name, callback)); + } + const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`; + let data = this._loadTestFont; + const COMMENT_OFFSET = 976; + data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId); + const CFF_CHECKSUM_OFFSET = 16; + const XXXX_VALUE = 0x58585858; + let checksum = int32(data, CFF_CHECKSUM_OFFSET); + for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) { + checksum = checksum - XXXX_VALUE + int32(loadTestFontId, i) | 0; + } + if (i < loadTestFontId.length) { + checksum = checksum - XXXX_VALUE + int32(loadTestFontId + "XXX", i) | 0; + } + data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum)); + const url = `url(data:font/opentype;base64,${btoa(data)});`; + const rule = `@font-face {font-family:"${loadTestFontId}";src:${url}}`; + this.insertRule(rule); + const div = this._document.createElement("div"); + div.style.visibility = "hidden"; + div.style.width = div.style.height = "10px"; + div.style.position = "absolute"; + div.style.top = div.style.left = "0px"; + for (const name of [font.loadedName, loadTestFontId]) { + const span = this._document.createElement("span"); + span.textContent = "Hi"; + span.style.fontFamily = name; + div.append(span); + } + this._document.body.append(div); + isFontReady(loadTestFontId, () => { + div.remove(); + request.complete(); }); } - getData() { - return this.messageHandler.sendWithPromise("GetData", null); - } - saveDocument() { - if (this.annotationStorage.size <= 0) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)("saveDocument called while `annotationStorage` is empty, " + "please use the getData-method instead."); +} +class FontFaceObject { + compiledGlyphs = Object.create(null); + #fontData; + constructor(translatedData, inspectFont = null, charProcOperatorList, extra) { + this.#fontData = translatedData; + this._inspectFont = inspectFont; + if (charProcOperatorList) { + this.charProcOperatorList = charProcOperatorList; + } + if (extra) { + Object.assign(this, extra); } - const { - map, - transfer - } = this.annotationStorage.serializable; - return this.messageHandler.sendWithPromise("SaveDocument", { - isPureXfa: !!this._htmlForXfa, - numPages: this._numPages, - annotationStorage: map, - filename: this._fullReader?.filename ?? null - }, transfer).finally(() => { - this.annotationStorage.resetModified(); - }); } - getPage(pageNumber) { - if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this._numPages) { - return Promise.reject(new Error("Invalid page request.")); + createNativeFontFace() { + if (!this.data || this.disableFontFace) { + return null; } - const pageIndex = pageNumber - 1, - cachedPromise = this.#pagePromises.get(pageIndex); - if (cachedPromise) { - return cachedPromise; + let nativeFontFace; + if (!this.cssFontInfo) { + nativeFontFace = new FontFace(this.loadedName, this.data, {}); + } else { + const css = { + weight: this.cssFontInfo.fontWeight + }; + if (this.cssFontInfo.italicAngle) { + css.style = `oblique ${this.cssFontInfo.italicAngle}deg`; + } + nativeFontFace = new FontFace(this.cssFontInfo.fontFamily, this.data, css); } - const promise = this.messageHandler.sendWithPromise("GetPage", { - pageIndex - }).then(pageInfo => { - if (this.destroyed) { - throw new Error("Transport destroyed"); + this._inspectFont?.(this); + return nativeFontFace; + } + createFontFaceRule() { + if (!this.data || this.disableFontFace) { + return null; + } + const url = `url(data:${this.mimetype};base64,${this.data.toBase64()});`; + let rule; + if (!this.cssFontInfo) { + rule = `@font-face {font-family:"${this.loadedName}";src:${url}}`; + } else { + let css = `font-weight: ${this.cssFontInfo.fontWeight};`; + if (this.cssFontInfo.italicAngle) { + css += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`; } - const page = new PDFPageProxy(pageIndex, pageInfo, this, this._params.pdfBug); - this.#pageCache.set(pageIndex, page); - return page; - }); - this.#pagePromises.set(pageIndex, promise); - return promise; + rule = `@font-face {font-family:"${this.cssFontInfo.fontFamily}";${css}src:${url}}`; + } + this._inspectFont?.(this, url); + return rule; } - getPageIndex(ref) { - if (typeof ref !== "object" || ref === null || !Number.isInteger(ref.num) || ref.num < 0 || !Number.isInteger(ref.gen) || ref.gen < 0) { - return Promise.reject(new Error("Invalid pageIndex request.")); + getPathGenerator(objs, character) { + if (this.compiledGlyphs[character] !== undefined) { + return this.compiledGlyphs[character]; } - return this.messageHandler.sendWithPromise("GetPageIndex", { - num: ref.num, - gen: ref.gen - }); + const objId = this.loadedName + "_path_" + character; + let cmds; + try { + cmds = objs.get(objId); + } catch (ex) { + warn(`getPathGenerator - ignoring character: "${ex}".`); + } + const path = makePathFromDrawOPS(cmds?.path); + if (!this.fontExtraProperties) { + objs.delete(objId); + } + return this.compiledGlyphs[character] = path; } - getAnnotations(pageIndex, intent) { - return this.messageHandler.sendWithPromise("GetAnnotations", { - pageIndex, - intent - }); + get black() { + return this.#fontData.black; } - getFieldObjects() { - return this.#cacheSimpleMethod("GetFieldObjects"); + get bold() { + return this.#fontData.bold; } - hasJSActions() { - return this.#cacheSimpleMethod("HasJSActions"); + get disableFontFace() { + return this.#fontData.disableFontFace; } - getCalculationOrderIds() { - return this.messageHandler.sendWithPromise("GetCalculationOrderIds", null); + set disableFontFace(value) { + shadow(this, "disableFontFace", !!value); } - getDestinations() { - return this.messageHandler.sendWithPromise("GetDestinations", null); + get fontExtraProperties() { + return this.#fontData.fontExtraProperties; } - getDestination(id) { - if (typeof id !== "string") { - return Promise.reject(new Error("Invalid destination request.")); - } - return this.messageHandler.sendWithPromise("GetDestination", { - id - }); + get isInvalidPDFjsFont() { + return this.#fontData.isInvalidPDFjsFont; } - getPageLabels() { - return this.messageHandler.sendWithPromise("GetPageLabels", null); + get isType3Font() { + return this.#fontData.isType3Font; } - getPageLayout() { - return this.messageHandler.sendWithPromise("GetPageLayout", null); + get italic() { + return this.#fontData.italic; } - getPageMode() { - return this.messageHandler.sendWithPromise("GetPageMode", null); + get missingFile() { + return this.#fontData.missingFile; } - getViewerPreferences() { - return this.messageHandler.sendWithPromise("GetViewerPreferences", null); + get remeasure() { + return this.#fontData.remeasure; } - getOpenAction() { - return this.messageHandler.sendWithPromise("GetOpenAction", null); + get vertical() { + return this.#fontData.vertical; } - getAttachments() { - return this.messageHandler.sendWithPromise("GetAttachments", null); + get ascent() { + return this.#fontData.ascent; } - getDocJSActions() { - return this.#cacheSimpleMethod("GetDocJSActions"); + get defaultWidth() { + return this.#fontData.defaultWidth; } - getPageJSActions(pageIndex) { - return this.messageHandler.sendWithPromise("GetPageJSActions", { - pageIndex - }); + get descent() { + return this.#fontData.descent; } - getStructTree(pageIndex) { - return this.messageHandler.sendWithPromise("GetStructTree", { - pageIndex - }); + get bbox() { + return this.#fontData.bbox; } - getOutline() { - return this.messageHandler.sendWithPromise("GetOutline", null); + get fontMatrix() { + return this.#fontData.fontMatrix; } - getOptionalContentConfig(renderingIntent) { - return this.#cacheSimpleMethod("GetOptionalContentConfig").then(data => new _optional_content_config_js__WEBPACK_IMPORTED_MODULE_9__.OptionalContentConfig(data, renderingIntent)); + get fallbackName() { + return this.#fontData.fallbackName; } - getPermissions() { - return this.messageHandler.sendWithPromise("GetPermissions", null); + get loadedName() { + return this.#fontData.loadedName; } - getMetadata() { - const name = "GetMetadata", - cachedPromise = this.#methodPromises.get(name); - if (cachedPromise) { - return cachedPromise; + get mimetype() { + return this.#fontData.mimetype; + } + get name() { + return this.#fontData.name; + } + get data() { + return this.#fontData.data; + } + clearData() { + this.#fontData.clearData(); + } + get cssFontInfo() { + return this.#fontData.cssFontInfo; + } + get systemFontInfo() { + return this.#fontData.systemFontInfo; + } + get defaultVMetrics() { + return this.#fontData.defaultVMetrics; + } +} + +;// ./src/shared/obj_bin_transform_utils.js +class CSS_FONT_INFO { + static strings = ["fontFamily", "fontWeight", "italicAngle"]; +} +class SYSTEM_FONT_INFO { + static strings = ["css", "loadedName", "baseFontName", "src"]; +} +class FONT_INFO { + static bools = ["black", "bold", "disableFontFace", "fontExtraProperties", "isInvalidPDFjsFont", "isType3Font", "italic", "missingFile", "remeasure", "vertical"]; + static numbers = ["ascent", "defaultWidth", "descent"]; + static strings = ["fallbackName", "loadedName", "mimetype", "name"]; + static OFFSET_NUMBERS = Math.ceil(this.bools.length * 2 / 8); + static OFFSET_BBOX = this.OFFSET_NUMBERS + this.numbers.length * 8; + static OFFSET_FONT_MATRIX = this.OFFSET_BBOX + 1 + 2 * 4; + static OFFSET_DEFAULT_VMETRICS = this.OFFSET_FONT_MATRIX + 1 + 8 * 6; + static OFFSET_STRINGS = this.OFFSET_DEFAULT_VMETRICS + 1 + 2 * 3; +} +class PATTERN_INFO { + static KIND = 0; + static HAS_BBOX = 1; + static HAS_BACKGROUND = 2; + static SHADING_TYPE = 3; + static N_COORD = 4; + static N_COLOR = 8; + static N_STOP = 12; + static N_FIGURES = 16; +} + +;// ./src/display/obj_bin_transform_display.js + + +class CssFontInfo { + #buffer; + #decoder = new TextDecoder(); + #view; + constructor(buffer) { + this.#buffer = buffer; + this.#view = new DataView(buffer); + } + #readString(index) { + assert(index < CSS_FONT_INFO.strings.length, "Invalid string index"); + let offset = 0; + for (let i = 0; i < index; i++) { + offset += this.#view.getUint32(offset) + 4; } - const promise = this.messageHandler.sendWithPromise(name, null).then(results => ({ - info: results[0], - metadata: results[1] ? new _metadata_js__WEBPACK_IMPORTED_MODULE_8__.Metadata(results[1]) : null, - contentDispositionFilename: this._fullReader?.filename ?? null, - contentLength: this._fullReader?.contentLength ?? null - })); - this.#methodPromises.set(name, promise); - return promise; + const length = this.#view.getUint32(offset); + return this.#decoder.decode(new Uint8Array(this.#buffer, offset + 4, length)); } - getMarkInfo() { - return this.messageHandler.sendWithPromise("GetMarkInfo", null); + get fontFamily() { + return this.#readString(0); } - async startCleanup(keepLoadedFonts = false) { - if (this.destroyed) { - return; + get fontWeight() { + return this.#readString(1); + } + get italicAngle() { + return this.#readString(2); + } +} +class SystemFontInfo { + #buffer; + #decoder = new TextDecoder(); + #view; + constructor(buffer) { + this.#buffer = buffer; + this.#view = new DataView(buffer); + } + get guessFallback() { + return this.#view.getUint8(0) !== 0; + } + #readString(index) { + assert(index < SYSTEM_FONT_INFO.strings.length, "Invalid string index"); + let offset = 5; + for (let i = 0; i < index; i++) { + offset += this.#view.getUint32(offset) + 4; } - await this.messageHandler.sendWithPromise("Cleanup", null); - for (const page of this.#pageCache.values()) { - const cleanupSuccessful = page.cleanup(); - if (!cleanupSuccessful) { - throw new Error(`startCleanup: Page ${page.pageNumber} is currently rendering.`); - } + const length = this.#view.getUint32(offset); + return this.#decoder.decode(new Uint8Array(this.#buffer, offset + 4, length)); + } + get css() { + return this.#readString(0); + } + get loadedName() { + return this.#readString(1); + } + get baseFontName() { + return this.#readString(2); + } + get src() { + return this.#readString(3); + } + get style() { + let offset = 1; + offset += 4 + this.#view.getUint32(offset); + const styleLength = this.#view.getUint32(offset); + const style = this.#decoder.decode(new Uint8Array(this.#buffer, offset + 4, styleLength)); + offset += 4 + styleLength; + const weightLength = this.#view.getUint32(offset); + const weight = this.#decoder.decode(new Uint8Array(this.#buffer, offset + 4, weightLength)); + return { + style, + weight + }; + } +} +class FontInfo { + #buffer; + #decoder = new TextDecoder(); + #view; + constructor({ + buffer, + extra + }) { + this.#buffer = buffer; + this.#view = new DataView(buffer); + if (extra) { + Object.assign(this, extra); } - this.commonObjs.clear(); - if (!keepLoadedFonts) { - this.fontLoader.clear(); + } + #readBoolean(index) { + assert(index < FONT_INFO.bools.length, "Invalid boolean index"); + const byteOffset = Math.floor(index / 4); + const bitOffset = index * 2 % 8; + const value = this.#view.getUint8(byteOffset) >> bitOffset & 0x03; + return value === 0x00 ? undefined : value === 0x02; + } + get black() { + return this.#readBoolean(0); + } + get bold() { + return this.#readBoolean(1); + } + get disableFontFace() { + return this.#readBoolean(2); + } + get fontExtraProperties() { + return this.#readBoolean(3); + } + get isInvalidPDFjsFont() { + return this.#readBoolean(4); + } + get isType3Font() { + return this.#readBoolean(5); + } + get italic() { + return this.#readBoolean(6); + } + get missingFile() { + return this.#readBoolean(7); + } + get remeasure() { + return this.#readBoolean(8); + } + get vertical() { + return this.#readBoolean(9); + } + #readNumber(index) { + assert(index < FONT_INFO.numbers.length, "Invalid number index"); + return this.#view.getFloat64(FONT_INFO.OFFSET_NUMBERS + index * 8); + } + get ascent() { + return this.#readNumber(0); + } + get defaultWidth() { + return this.#readNumber(1); + } + get descent() { + return this.#readNumber(2); + } + #readArray(offset, arrLen, lookupName, increment) { + const len = this.#view.getUint8(offset); + if (len === 0) { + return undefined; } - this.#methodPromises.clear(); - this.filterFactory.destroy(true); - (0,_text_layer_js__WEBPACK_IMPORTED_MODULE_6__.cleanupTextLayer)(); + assert(len === arrLen, "Invalid array length."); + offset += 1; + const arr = new Array(len); + for (let i = 0; i < len; i++) { + arr[i] = this.#view[lookupName](offset, true); + offset += increment; + } + return arr; + } + get bbox() { + return this.#readArray(FONT_INFO.OFFSET_BBOX, 4, "getInt16", 2); + } + get fontMatrix() { + return this.#readArray(FONT_INFO.OFFSET_FONT_MATRIX, 6, "getFloat64", 8); + } + get defaultVMetrics() { + return this.#readArray(FONT_INFO.OFFSET_DEFAULT_VMETRICS, 3, "getInt16", 2); + } + #readString(index) { + assert(index < FONT_INFO.strings.length, "Invalid string index"); + let offset = FONT_INFO.OFFSET_STRINGS + 4; + for (let i = 0; i < index; i++) { + offset += this.#view.getUint32(offset) + 4; + } + const length = this.#view.getUint32(offset); + return this.#decoder.decode(new Uint8Array(this.#buffer, offset + 4, length)); } - get loadingParams() { - const { - disableAutoFetch, - enableXfa - } = this._params; - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "loadingParams", { - disableAutoFetch, - enableXfa - }); + get fallbackName() { + return this.#readString(0); } -} -const INITIAL_DATA = Symbol("INITIAL_DATA"); -class PDFObjects { - #objs = Object.create(null); - #ensureObj(objId) { - return this.#objs[objId] ||= { - ...Promise.withResolvers(), - data: INITIAL_DATA + get loadedName() { + return this.#readString(1); + } + get mimetype() { + return this.#readString(2); + } + get name() { + return this.#readString(3); + } + #getDataOffsets() { + let offset = FONT_INFO.OFFSET_STRINGS; + const stringsLength = this.#view.getUint32(offset); + offset += 4 + stringsLength; + const systemFontInfoLength = this.#view.getUint32(offset); + offset += 4 + systemFontInfoLength; + const cssFontInfoLength = this.#view.getUint32(offset); + offset += 4 + cssFontInfoLength; + const length = this.#view.getUint32(offset); + return { + offset, + length }; } - get(objId, callback = null) { - if (callback) { - const obj = this.#ensureObj(objId); - obj.promise.then(() => callback(obj.data)); + get data() { + const { + offset, + length + } = this.#getDataOffsets(); + return length === 0 ? undefined : new Uint8Array(this.#buffer, offset + 4, length); + } + clearData() { + const { + offset, + length + } = this.#getDataOffsets(); + if (length === 0) { + return; + } + this.#view.setUint32(offset, 0); + this.#buffer = new Uint8Array(this.#buffer, 0, offset + 4).slice().buffer; + this.#view = new DataView(this.#buffer); + } + get cssFontInfo() { + let offset = FONT_INFO.OFFSET_STRINGS; + const stringsLength = this.#view.getUint32(offset); + offset += 4 + stringsLength; + const systemFontInfoLength = this.#view.getUint32(offset); + offset += 4 + systemFontInfoLength; + const cssFontInfoLength = this.#view.getUint32(offset); + if (cssFontInfoLength === 0) { return null; } - const obj = this.#objs[objId]; - if (!obj || obj.data === INITIAL_DATA) { - throw new Error(`Requesting object that isn't resolved yet ${objId}.`); + const cssFontInfoData = new Uint8Array(cssFontInfoLength); + cssFontInfoData.set(new Uint8Array(this.#buffer, offset + 4, cssFontInfoLength)); + return new CssFontInfo(cssFontInfoData.buffer); + } + get systemFontInfo() { + let offset = FONT_INFO.OFFSET_STRINGS; + const stringsLength = this.#view.getUint32(offset); + offset += 4 + stringsLength; + const systemFontInfoLength = this.#view.getUint32(offset); + if (systemFontInfoLength === 0) { + return null; } - return obj.data; - } - has(objId) { - const obj = this.#objs[objId]; - return !!obj && obj.data !== INITIAL_DATA; + const systemFontInfoData = new Uint8Array(systemFontInfoLength); + systemFontInfoData.set(new Uint8Array(this.#buffer, offset + 4, systemFontInfoLength)); + return new SystemFontInfo(systemFontInfoData.buffer); + } +} +class PatternInfo { + constructor(buffer) { + this.buffer = buffer; + this.view = new DataView(buffer); + this.data = new Uint8Array(buffer); + } + getIR() { + const dataView = this.view; + const kind = this.data[PATTERN_INFO.KIND]; + const hasBBox = !!this.data[PATTERN_INFO.HAS_BBOX]; + const hasBackground = !!this.data[PATTERN_INFO.HAS_BACKGROUND]; + const nCoord = dataView.getUint32(PATTERN_INFO.N_COORD, true); + const nColor = dataView.getUint32(PATTERN_INFO.N_COLOR, true); + const nStop = dataView.getUint32(PATTERN_INFO.N_STOP, true); + let offset = 20; + const coords = new Float32Array(this.buffer, offset, nCoord * 2); + offset += nCoord * 8; + const colors = new Uint8Array(this.buffer, offset, nColor * 4); + offset += nColor * 4; + const stops = []; + for (let i = 0; i < nStop; ++i) { + const p = dataView.getFloat32(offset, true); + offset += 4; + const rgb = dataView.getUint32(offset, true); + offset += 4; + stops.push([p, `#${rgb.toString(16).padStart(6, "0")}`]); + } + let bbox = null; + if (hasBBox) { + bbox = []; + for (let i = 0; i < 4; ++i) { + bbox.push(dataView.getFloat32(offset, true)); + offset += 4; + } + } + let background = null; + if (hasBackground) { + background = new Uint8Array(this.buffer, offset, 3); + offset += 3; + } + if (kind === 1) { + return ["RadialAxial", "axial", bbox, stops, Array.from(coords.slice(0, 2)), Array.from(coords.slice(2, 4)), null, null]; + } + if (kind === 2) { + return ["RadialAxial", "radial", bbox, stops, [coords[0], coords[1]], [coords[3], coords[4]], coords[2], coords[5]]; + } + if (kind === 3) { + const shadingType = this.data[PATTERN_INFO.SHADING_TYPE]; + let bounds = null; + if (coords.length > 0) { + bounds = BBOX_INIT.slice(); + for (let i = 0, ii = coords.length; i < ii; i += 2) { + Util.pointBoundingBox(coords[i], coords[i + 1], bounds); + } + } + return ["Mesh", shadingType, coords, colors, nCoord, bounds, bbox, background]; + } + throw new Error(`Unsupported pattern kind: ${kind}`); + } +} +class FontPathInfo { + #buffer; + constructor(buffer) { + this.#buffer = buffer; + } + get path() { + if (FeatureTest.isFloat16ArraySupported) { + return new Float16Array(this.#buffer); + } + return new Float32Array(this.#buffer); } - resolve(objId, data = null) { - const obj = this.#ensureObj(objId); - obj.data = data; - obj.resolve(); +} + +;// ./src/display/api_utils.js + +function getUrlProp(val) { + if (val instanceof URL) { + return val; } - clear() { - for (const objId in this.#objs) { - const { - data - } = this.#objs[objId]; - data?.bitmap?.close(); + if (typeof val === "string") { + if (isNodeJS) { + if (/^[a-z][a-z0-9\-+.]+:/i.test(val)) { + return new URL(val); + } + const url = process.getBuiltinModule("url"); + return new URL(url.pathToFileURL(val)); + } + const url = URL.parse(val, window.location); + if (url) { + return url; } - this.#objs = Object.create(null); } - *[Symbol.iterator]() { - for (const objId in this.#objs) { - const { - data - } = this.#objs[objId]; - if (data === INITIAL_DATA) { - continue; - } - yield [objId, data]; - } + throw new Error("Invalid PDF url data: " + "either string or URL-object is expected in the url property."); +} +function getDataProp(val) { + if (isNodeJS && typeof Buffer !== "undefined" && val instanceof Buffer) { + throw new Error("Please provide binary data as `Uint8Array`, rather than `Buffer`."); + } + if (val instanceof Uint8Array && val.byteLength === val.buffer.byteLength) { + return val; + } + if (typeof val === "string") { + return stringToBytes(val); + } + if (val instanceof ArrayBuffer || ArrayBuffer.isView(val) || typeof val === "object" && !isNaN(val?.length)) { + return new Uint8Array(val); } + throw new Error("Invalid PDF binary data: either TypedArray, " + "string, or array-like object is expected in the data property."); } -class RenderTask { - #internalRenderTask = null; - constructor(internalRenderTask) { - this.#internalRenderTask = internalRenderTask; - this.onContinue = null; +function getFactoryUrlProp(val) { + if (typeof val !== "string") { + return null; } - get promise() { - return this.#internalRenderTask.capability.promise; + if (val.endsWith("/")) { + return val; } - cancel(extraDelay = 0) { - this.#internalRenderTask.cancel(null, extraDelay); + throw new Error(`Invalid factory url: "${val}" must include trailing slash.`); +} +const isRefProxy = v => typeof v === "object" && Number.isInteger(v?.num) && v.num >= 0 && Number.isInteger(v?.gen) && v.gen >= 0; +const isNameProxy = v => typeof v === "object" && typeof v?.name === "string"; +const isValidExplicitDest = _isValidExplicitDest.bind(null, isRefProxy, isNameProxy); +class LoopbackPort { + #listeners = new Map(); + #deferred = Promise.resolve(); + postMessage(obj, transfer) { + const event = { + data: structuredClone(obj, transfer ? { + transfer + } : null) + }; + this.#deferred.then(() => { + for (const [listener] of this.#listeners) { + listener.call(this, event); + } + }); } - get separateAnnots() { - const { - separateAnnots - } = this.#internalRenderTask.operatorList; - if (!separateAnnots) { - return false; + addEventListener(name, listener, options = null) { + let rmAbort = null; + if (options?.signal instanceof AbortSignal) { + const { + signal + } = options; + if (signal.aborted) { + warn("LoopbackPort - cannot use an `aborted` signal."); + return; + } + const onAbort = () => this.removeEventListener(name, listener); + rmAbort = () => signal.removeEventListener("abort", onAbort); + signal.addEventListener("abort", onAbort); } - const { - annotationCanvasMap - } = this.#internalRenderTask; - return separateAnnots.form || separateAnnots.canvas && annotationCanvasMap?.size > 0; + this.#listeners.set(listener, rmAbort); + } + removeEventListener(name, listener) { + const rmAbort = this.#listeners.get(listener); + rmAbort?.(); + this.#listeners.delete(listener); + } + terminate() { + for (const [, rmAbort] of this.#listeners) { + rmAbort?.(); + } + this.#listeners.clear(); } } -class InternalRenderTask { - static #canvasInUse = new WeakSet(); - constructor({ - callback, - params, - objs, - commonObjs, - annotationCanvasMap, - operatorList, - pageIndex, - canvasFactory, - filterFactory, - useRequestAnimationFrame = false, - pdfBug = false, - pageColors = null - }) { - this.callback = callback; - this.params = params; - this.objs = objs; - this.commonObjs = commonObjs; - this.annotationCanvasMap = annotationCanvasMap; - this.operatorListIdx = null; - this.operatorList = operatorList; - this._pageIndex = pageIndex; - this.canvasFactory = canvasFactory; - this.filterFactory = filterFactory; - this._pdfBug = pdfBug; - this.pageColors = pageColors; - this.running = false; - this.graphicsReadyCallback = null; - this.graphicsReady = false; - this._useRequestAnimationFrame = useRequestAnimationFrame === true && typeof window !== "undefined"; - this.cancelled = false; - this.capability = Promise.withResolvers(); - this.task = new RenderTask(this); - this._cancelBound = this.cancel.bind(this); - this._continueBound = this._continue.bind(this); - this._scheduleNextBound = this._scheduleNext.bind(this); - this._nextBound = this._next.bind(this); - this._canvas = params.canvasContext.canvas; + +;// ./src/shared/message_handler.js + +const CallbackKind = { + DATA: 1, + ERROR: 2 +}; +const StreamKind = { + CANCEL: 1, + CANCEL_COMPLETE: 2, + CLOSE: 3, + ENQUEUE: 4, + ERROR: 5, + PULL: 6, + PULL_COMPLETE: 7, + START_COMPLETE: 8 +}; +function onFn() {} +function wrapReason(ex) { + if (ex instanceof AbortException || ex instanceof InvalidPDFException || ex instanceof PasswordException || ex instanceof ResponseException || ex instanceof UnknownErrorException) { + return ex; } - get completed() { - return this.capability.promise.catch(function () {}); + if (!(ex instanceof Error || typeof ex === "object" && ex !== null)) { + unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.'); } - initializeGraphics({ - transparency = false, - optionalContentConfig + switch (ex.name) { + case "AbortException": + return new AbortException(ex.message); + case "InvalidPDFException": + return new InvalidPDFException(ex.message); + case "PasswordException": + return new PasswordException(ex.message, ex.code); + case "ResponseException": + return new ResponseException(ex.message, ex.status, ex.missing); + case "UnknownErrorException": + return new UnknownErrorException(ex.message, ex.details); + } + return new UnknownErrorException(ex.message, ex.toString()); +} +class MessageHandler { + #messageAC = new AbortController(); + constructor(sourceName, targetName, comObj) { + this.sourceName = sourceName; + this.targetName = targetName; + this.comObj = comObj; + this.callbackId = 1; + this.streamId = 1; + this.streamSinks = Object.create(null); + this.streamControllers = Object.create(null); + this.callbackCapabilities = Object.create(null); + this.actionHandler = Object.create(null); + comObj.addEventListener("message", this.#onMessage.bind(this), { + signal: this.#messageAC.signal + }); + } + #onMessage({ + data }) { - if (this.cancelled) { + if (data.targetName !== this.sourceName) { return; } - if (this._canvas) { - if (InternalRenderTask.#canvasInUse.has(this._canvas)) { - throw new Error("Cannot use the same canvas during multiple render() operations. " + "Use different canvas or ensure previous operations were " + "cancelled or completed."); + if (data.stream) { + this.#processStreamMessage(data); + return; + } + if (data.callback) { + const callbackId = data.callbackId; + const capability = this.callbackCapabilities[callbackId]; + if (!capability) { + throw new Error(`Cannot resolve callback ${callbackId}`); } - InternalRenderTask.#canvasInUse.add(this._canvas); + delete this.callbackCapabilities[callbackId]; + if (data.callback === CallbackKind.DATA) { + capability.resolve(data.data); + } else if (data.callback === CallbackKind.ERROR) { + capability.reject(wrapReason(data.reason)); + } else { + throw new Error("Unexpected callback case"); + } + return; } - if (this._pdfBug && globalThis.StepperManager?.enabled) { - this.stepper = globalThis.StepperManager.create(this._pageIndex); - this.stepper.init(this.operatorList); - this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint(); + const action = this.actionHandler[data.action]; + if (!action) { + throw new Error(`Unknown action from worker: ${data.action}`); } - const { - canvasContext, - viewport, - transform, - background - } = this.params; - this.gfx = new _canvas_js__WEBPACK_IMPORTED_MODULE_5__.CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, { - optionalContentConfig - }, this.annotationCanvasMap, this.pageColors); - this.gfx.beginDrawing({ - transform, - viewport, - transparency, - background - }); - this.operatorListIdx = 0; - this.graphicsReady = true; - this.graphicsReadyCallback?.(); - } - cancel(error = null, extraDelay = 0) { - this.running = false; - this.cancelled = true; - this.gfx?.endDrawing(); - InternalRenderTask.#canvasInUse.delete(this._canvas); - this.callback(error || new _display_utils_js__WEBPACK_IMPORTED_MODULE_2__.RenderingCancelledException(`Rendering cancelled, page ${this._pageIndex + 1}`, extraDelay)); - } - operatorListChanged() { - if (!this.graphicsReady) { - this.graphicsReadyCallback ||= this._continueBound; + if (data.callbackId) { + const sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + Promise.try(action, data.data).then(function (result) { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.DATA, + callbackId: data.callbackId, + data: result + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.ERROR, + callbackId: data.callbackId, + reason: wrapReason(reason) + }); + }); return; } - this.stepper?.updateOperatorList(this.operatorList); - if (this.running) { + if (data.streamId) { + this.#createStreamSink(data); return; } - this._continue(); + action(data.data); } - _continue() { - this.running = true; - if (this.cancelled) { - return; - } - if (this.task.onContinue) { - this.task.onContinue(this._scheduleNextBound); - } else { - this._scheduleNext(); + on(actionName, handler) { + const ah = this.actionHandler; + if (ah[actionName]) { + throw new Error(`There is already an actionName called "${actionName}"`); } + ah[actionName] = handler; } - _scheduleNext() { - if (this._useRequestAnimationFrame) { - window.requestAnimationFrame(() => { - this._nextBound().catch(this._cancelBound); - }); - } else { - Promise.resolve().then(this._nextBound).catch(this._cancelBound); - } + send(actionName, data, transfers) { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + data + }, transfers); } - async _next() { - if (this.cancelled) { - return; + sendWithPromise(actionName, data, transfers) { + const callbackId = this.callbackId++; + const capability = Promise.withResolvers(); + this.callbackCapabilities[callbackId] = capability; + try { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + callbackId, + data + }, transfers); + } catch (ex) { + capability.reject(ex); } - this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper); - if (this.operatorListIdx === this.operatorList.argsArray.length) { - this.running = false; - if (this.operatorList.lastChunk) { - this.gfx.endDrawing(); - InternalRenderTask.#canvasInUse.delete(this._canvas); - this.callback(); + return capability.promise; + } + sendWithStream(actionName, data, queueingStrategy, transfers) { + const streamId = this.streamId++, + sourceName = this.sourceName, + targetName = this.targetName, + comObj = this.comObj; + return new ReadableStream({ + start: controller => { + const startCapability = Promise.withResolvers(); + this.streamControllers[streamId] = { + controller, + startCall: startCapability, + pullCall: null, + cancelCall: null, + isClosed: false + }; + comObj.postMessage({ + sourceName, + targetName, + action: actionName, + streamId, + data, + desiredSize: controller.desiredSize + }, transfers); + return startCapability.promise; + }, + pull: controller => { + const pullCapability = Promise.withResolvers(); + this.streamControllers[streamId].pullCall = pullCapability; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL, + streamId, + desiredSize: controller.desiredSize + }); + return pullCapability.promise; + }, + cancel: reason => { + assert(reason instanceof Error, "cancel must have a valid reason"); + const cancelCapability = Promise.withResolvers(); + this.streamControllers[streamId].cancelCall = cancelCapability; + this.streamControllers[streamId].isClosed = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL, + streamId, + reason: wrapReason(reason) + }); + return cancelCapability.promise; } + }, queueingStrategy); + } + #createStreamSink(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const self = this, + action = this.actionHandler[data.action]; + const streamSink = { + enqueue(chunk, size = 1, transfers) { + if (this.isCancelled) { + return; + } + const lastDesiredSize = this.desiredSize; + this.desiredSize -= size; + if (lastDesiredSize > 0 && this.desiredSize <= 0) { + this.sinkCapability = Promise.withResolvers(); + this.ready = this.sinkCapability.promise; + } + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ENQUEUE, + streamId, + chunk + }, transfers); + }, + close() { + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CLOSE, + streamId + }); + delete self.streamSinks[streamId]; + }, + error(reason) { + assert(reason instanceof Error, "error must have a valid reason"); + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ERROR, + streamId, + reason: wrapReason(reason) + }); + }, + sinkCapability: Promise.withResolvers(), + onPull: null, + onCancel: null, + isCancelled: false, + desiredSize: data.desiredSize, + ready: null + }; + streamSink.sinkCapability.resolve(); + streamSink.ready = streamSink.sinkCapability.promise; + this.streamSinks[streamId] = streamSink; + Promise.try(action, data.data, streamSink).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + } + #processStreamMessage(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const streamController = this.streamControllers[streamId], + streamSink = this.streamSinks[streamId]; + switch (data.stream) { + case StreamKind.START_COMPLETE: + if (data.success) { + streamController.startCall.resolve(); + } else { + streamController.startCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL_COMPLETE: + if (data.success) { + streamController.pullCall.resolve(); + } else { + streamController.pullCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL: + if (!streamSink) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + break; + } + if (streamSink.desiredSize <= 0 && data.desiredSize > 0) { + streamSink.sinkCapability.resolve(); + } + streamSink.desiredSize = data.desiredSize; + Promise.try(streamSink.onPull || onFn).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + break; + case StreamKind.ENQUEUE: + assert(streamController, "enqueue should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.controller.enqueue(data.chunk); + break; + case StreamKind.CLOSE: + assert(streamController, "close should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.isClosed = true; + streamController.controller.close(); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.ERROR: + assert(streamController, "error should have stream controller"); + streamController.controller.error(wrapReason(data.reason)); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL_COMPLETE: + if (data.success) { + streamController.cancelCall.resolve(); + } else { + streamController.cancelCall.reject(wrapReason(data.reason)); + } + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL: + if (!streamSink) { + break; + } + const dataReason = wrapReason(data.reason); + Promise.try(streamSink.onCancel || onFn, dataReason).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + streamSink.sinkCapability.reject(dataReason); + streamSink.isCancelled = true; + delete this.streamSinks[streamId]; + break; + default: + throw new Error("Unexpected stream case"); } } + async #deleteStreamController(streamController, streamId) { + await Promise.allSettled([streamController.startCall?.promise, streamController.pullCall?.promise, streamController.cancelCall?.promise]); + delete this.streamControllers[streamId]; + } + destroy() { + this.#messageAC?.abort(); + this.#messageAC = null; + } } -const version = "4.1.392"; -const build = "fcb76a78d"; - -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); -/***/ }), +;// ./src/display/binary_data_factory.js -/***/ 583: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ BaseCMapReaderFactory: () => (/* binding */ BaseCMapReaderFactory), -/* harmony export */ BaseCanvasFactory: () => (/* binding */ BaseCanvasFactory), -/* harmony export */ BaseFilterFactory: () => (/* binding */ BaseFilterFactory), -/* harmony export */ BaseSVGFactory: () => (/* binding */ BaseSVGFactory), -/* harmony export */ BaseStandardFontDataFactory: () => (/* binding */ BaseStandardFontDataFactory) -/* harmony export */ }); -/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(292); -class BaseFilterFactory { - constructor() { - if (this.constructor === BaseFilterFactory) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.unreachable)("Cannot initialize BaseFilterFactory."); - } +class BaseBinaryDataFactory { + #errorStr = Object.freeze({ + cMapUrl: "CMap", + standardFontDataUrl: "font", + wasmUrl: "wasm" + }); + constructor({ + cMapUrl = null, + standardFontDataUrl = null, + wasmUrl = null + }) { + this.cMapUrl = cMapUrl; + this.standardFontDataUrl = standardFontDataUrl; + this.wasmUrl = wasmUrl; } - addFilter(maps) { - return "none"; + async fetch({ + kind, + filename + }) { + switch (kind) { + case "cMapUrl": + case "standardFontDataUrl": + case "wasmUrl": + break; + default: + unreachable(`Not implemented: ${kind}`); + } + const baseUrl = this[kind]; + if (!baseUrl) { + throw new Error(`Ensure that the \`${kind}\` API parameter is provided.`); + } + const url = `${baseUrl}${filename}`; + return this._fetch(url, kind).catch(reason => { + throw new Error(`Unable to load ${this.#errorStr[kind]} data at: ${url}`); + }); } - addHCMFilter(fgColor, bgColor) { - return "none"; + async _fetch(url, kind) { + unreachable("Abstract method `_fetch` called."); } - addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) { - return "none"; +} +class DOMBinaryDataFactory extends BaseBinaryDataFactory { + async _fetch(url, kind) { + const type = kind === "cMapUrl" && !url.endsWith(".bcmap") ? "text" : "bytes"; + const data = await fetchData(url, type); + return data instanceof Uint8Array ? data : stringToBytes(data); } - destroy(keepHCM = false) {} } + +;// ./src/display/canvas_factory.js + class BaseCanvasFactory { - constructor() { - if (this.constructor === BaseCanvasFactory) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.unreachable)("Cannot initialize BaseCanvasFactory."); - } + #enableHWA = false; + constructor({ + enableHWA = false + }) { + this.#enableHWA = enableHWA; } create(width, height) { if (width <= 0 || height <= 0) { @@ -4638,137 +8987,803 @@ const canvas = this._createCanvas(width, height); return { canvas, - context: canvas.getContext("2d") + context: canvas.getContext("2d", { + willReadFrequently: !this.#enableHWA + }) }; } - reset(canvasAndContext, width, height) { - if (!canvasAndContext.canvas) { + reset({ + canvas + }, width, height) { + if (!canvas) { throw new Error("Canvas is not specified"); } if (width <= 0 || height <= 0) { throw new Error("Invalid canvas size"); } - canvasAndContext.canvas.width = width; - canvasAndContext.canvas.height = height; + canvas.width = width; + canvas.height = height; } destroy(canvasAndContext) { - if (!canvasAndContext.canvas) { + const { + canvas + } = canvasAndContext; + if (!canvas) { throw new Error("Canvas is not specified"); } - canvasAndContext.canvas.width = 0; - canvasAndContext.canvas.height = 0; + canvas.width = canvas.height = 0; canvasAndContext.canvas = null; canvasAndContext.context = null; } _createCanvas(width, height) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.unreachable)("Abstract method `_createCanvas` called."); + unreachable("Abstract method `_createCanvas` called."); } } -class BaseCMapReaderFactory { +class DOMCanvasFactory extends BaseCanvasFactory { constructor({ - baseUrl = null, - isCompressed = true - }) { - if (this.constructor === BaseCMapReaderFactory) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.unreachable)("Cannot initialize BaseCMapReaderFactory."); - } - this.baseUrl = baseUrl; - this.isCompressed = isCompressed; - } - async fetch({ - name + ownerDocument = globalThis.document, + enableHWA = false }) { - if (!this.baseUrl) { - throw new Error('The CMap "baseUrl" parameter must be specified, ensure that ' + 'the "cMapUrl" and "cMapPacked" API parameters are provided.'); - } - if (!name) { - throw new Error("CMap name must be specified."); - } - const url = this.baseUrl + name + (this.isCompressed ? ".bcmap" : ""); - const compressionType = this.isCompressed ? _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.CMapCompressionType.BINARY : _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.CMapCompressionType.NONE; - return this._fetchData(url, compressionType).catch(reason => { - throw new Error(`Unable to load ${this.isCompressed ? "binary " : ""}CMap at: ${url}`); + super({ + enableHWA }); + this._document = ownerDocument; + } + _createCanvas(width, height) { + const canvas = this._document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + return canvas; + } +} + +;// ./src/display/filter_factory.js + + +class BaseFilterFactory { + addFilter(maps) { + return "none"; + } + addHCMFilter(fgColor, bgColor) { + return "none"; + } + addAlphaFilter(map) { + return "none"; + } + addLuminosityFilter(map) { + return "none"; + } + addKnockoutFilter(alpha = 0) { + return "none"; + } + addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) { + return "none"; + } + addSelectionHCMFilter(fgColor, bgColor) { + return "none"; + } + addSelectionFilter() { + return "none"; } - _fetchData(url, compressionType) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.unreachable)("Abstract method `_fetchData` called."); + createSelectionStyle(pageColors = null) { + return null; } + destroy(keepHCM = false) {} } -class BaseStandardFontDataFactory { +class DOMFilterFactory extends BaseFilterFactory { + #baseUrl; + #_cache; + #_defs; + #docId; + #document; + #_hcmCache; + #id = 0; constructor({ - baseUrl = null + docId, + ownerDocument = globalThis.document }) { - if (this.constructor === BaseStandardFontDataFactory) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.unreachable)("Cannot initialize BaseStandardFontDataFactory."); + super(); + this.#docId = docId; + this.#document = ownerDocument; + } + get #cache() { + return this.#_cache ||= new Map(); + } + get #hcmCache() { + return this.#_hcmCache ||= new Map(); + } + get #defs() { + if (!this.#_defs) { + const div = this.#document.createElement("div"); + const { + style + } = div; + style.colorScheme = "only light"; + style.visibility = "hidden"; + style.contain = "strict"; + style.width = style.height = 0; + style.position = "absolute"; + style.top = style.left = 0; + style.zIndex = -1; + const svg = this.#document.createElementNS(SVG_NS, "svg"); + svg.setAttribute("width", 0); + svg.setAttribute("height", 0); + this.#_defs = this.#document.createElementNS(SVG_NS, "defs"); + div.append(svg); + svg.append(this.#_defs); + this.#document.body.append(div); } - this.baseUrl = baseUrl; + return this.#_defs; } - async fetch({ - filename - }) { - if (!this.baseUrl) { - throw new Error('The standard font "baseUrl" parameter must be specified, ensure that ' + 'the "standardFontDataUrl" API parameter is provided.'); + #createTables(maps) { + if (maps.length === 1) { + const mapR = maps[0]; + const buffer = new Array(256); + for (let i = 0; i < 256; i++) { + buffer[i] = mapR[i] / 255; + } + const table = buffer.join(","); + return [table, table, table]; } - if (!filename) { - throw new Error("Font filename must be specified."); + const [mapR, mapG, mapB] = maps; + const bufferR = new Array(256); + const bufferG = new Array(256); + const bufferB = new Array(256); + for (let i = 0; i < 256; i++) { + bufferR[i] = mapR[i] / 255; + bufferG[i] = mapG[i] / 255; + bufferB[i] = mapB[i] / 255; + } + return [bufferR.join(","), bufferG.join(","), bufferB.join(",")]; + } + #createUrl(id) { + if (this.#baseUrl === undefined) { + this.#baseUrl = ""; + const url = this.#document.URL; + if (url !== this.#document.baseURI) { + if (isDataScheme(url)) { + warn('#createUrl: ignore "data:"-URL for performance reasons.'); + } else { + this.#baseUrl = updateUrlHash(url, ""); + } + } } - const url = `${this.baseUrl}${filename}`; - return this._fetchData(url).catch(reason => { - throw new Error(`Unable to load font data at: ${url}`); - }); + return `url(${this.#baseUrl}#${id})`; } - _fetchData(url) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.unreachable)("Abstract method `_fetchData` called."); + addFilter(maps) { + if (!maps) { + return "none"; + } + let value = this.#cache.get(maps); + if (value) { + return value; + } + const [tableR, tableG, tableB] = this.#createTables(maps); + const key = maps.length === 1 ? tableR : `${tableR}${tableG}${tableB}`; + value = this.#cache.get(key); + if (value) { + this.#cache.set(maps, value); + return value; + } + const id = `g_${this.#docId}_transfer_map_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(maps, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addTransferMapConversion(tableR, tableG, tableB, filter); + return url; } -} -class BaseSVGFactory { - constructor() { - if (this.constructor === BaseSVGFactory) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.unreachable)("Cannot initialize BaseSVGFactory."); + addHCMFilter(fgColor, bgColor) { + const key = `${fgColor}-${bgColor}`; + const filterName = "base"; + let info = this.#hcmCache.get(filterName); + if (info?.key === key) { + return info.url; + } + if (info) { + info.filter?.remove(); + info.key = key; + info.url = "none"; + info.filter = null; + } else { + info = { + key, + url: "none", + filter: null + }; + this.#hcmCache.set(filterName, info); + } + if (!fgColor || !bgColor) { + return info.url; + } + const fgRGB = this.#getRGB(fgColor); + fgColor = Util.makeHexColor(...fgRGB); + const bgRGB = this.#getRGB(bgColor); + bgColor = Util.makeHexColor(...bgRGB); + this.#defs.style.color = ""; + if (fgColor === "#000000" && bgColor === "#ffffff" || fgColor === bgColor) { + return info.url; + } + const map = new Array(256); + for (let i = 0; i <= 255; i++) { + const x = i / 255; + map[i] = x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4; } + const table = map.join(","); + const id = `g_${this.#docId}_hcm_filter`; + const filter = info.filter = this.#createFilter(id); + this.#addTransferMapConversion(table, table, table, filter); + this.#addGrayConversion(filter); + const getSteps = (c, n) => { + const start = fgRGB[c] / 255; + const end = bgRGB[c] / 255; + const arr = new Array(n + 1); + for (let i = 0; i <= n; i++) { + arr[i] = start + i / n * (end - start); + } + return arr.join(","); + }; + this.#addTransferMapConversion(getSteps(0, 5), getSteps(1, 5), getSteps(2, 5), filter); + info.url = this.#createUrl(id); + return info.url; } - create(width, height, skipDimensions = false) { - if (width <= 0 || height <= 0) { - throw new Error("Invalid SVG dimensions"); + addSelectionHCMFilter(fgColor, bgColor) { + return this.addHighlightHCMFilter("selection", fgColor, bgColor, "HighlightText", "Highlight"); + } + addSelectionFilter() { + return this.addHighlightHCMFilter("selection_default", "black", "white", "HighlightText", "Highlight"); + } + createSelectionStyle(pageColors = null) { + const filter = pageColors ? this.addSelectionHCMFilter(pageColors.foreground, pageColors.background) : this.addSelectionFilter(); + if (filter === "none" || !FeatureTest.platform.isFirefox) { + return null; } - const svg = this._createSVG("svg:svg"); - svg.setAttribute("version", "1.1"); - if (!skipDimensions) { - svg.setAttribute("width", `${width}px`); - svg.setAttribute("height", `${height}px`); + return { + "backdrop-filter": filter, + "background-color": "transparent" + }; + } + addAlphaFilter(map) { + let value = this.#cache.get(map); + if (value) { + return value; } - svg.setAttribute("preserveAspectRatio", "none"); - svg.setAttribute("viewBox", `0 0 ${width} ${height}`); - return svg; + const [tableA] = this.#createTables([map]); + const key = `alpha_${tableA}`; + value = this.#cache.get(key); + if (value) { + this.#cache.set(map, value); + return value; + } + const id = `g_${this.#docId}_alpha_map_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(map, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addTransferMapAlphaConversion(tableA, filter); + return url; } - createElement(type) { - if (typeof type !== "string") { - throw new Error("Invalid SVG element type"); + addLuminosityFilter(map) { + let value = this.#cache.get(map || "luminosity"); + if (value) { + return value; } - return this._createSVG(type); + let tableA, key; + if (map) { + [tableA] = this.#createTables([map]); + key = `luminosity_${tableA}`; + } else { + key = "luminosity"; + } + value = this.#cache.get(key); + if (value) { + this.#cache.set(map, value); + return value; + } + const id = `g_${this.#docId}_luminosity_map_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(map, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addLuminosityConversion(filter); + if (map) { + this.#addTransferMapAlphaConversion(tableA, filter); + } + return url; } - _createSVG(type) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.unreachable)("Abstract method `_createSVG` called."); + addKnockoutFilter(alpha = 0) { + const slope = alpha > 0 ? Math.min(1 / alpha, 1e6) : 1e6; + const key = `knockout_${slope}`; + const value = this.#cache.get(key); + if (value) { + return value; + } + const id = `g_${this.#docId}_knockout_filter_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); + filter.append(feComponentTransfer); + const feFuncA = this.#document.createElementNS(SVG_NS, "feFuncA"); + feFuncA.setAttribute("type", "linear"); + feFuncA.setAttribute("slope", `${slope}`); + feFuncA.setAttribute("intercept", "0"); + feComponentTransfer.append(feFuncA); + return url; + } + addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) { + const key = `${fgColor}-${bgColor}-${newFgColor}-${newBgColor}`; + let info = this.#hcmCache.get(filterName); + if (info?.key === key) { + return info.url; + } + if (info) { + info.filter?.remove(); + info.key = key; + info.url = "none"; + info.filter = null; + } else { + info = { + key, + url: "none", + filter: null + }; + this.#hcmCache.set(filterName, info); + } + if (!fgColor || !bgColor) { + return info.url; + } + const [fgRGB, bgRGB] = [fgColor, bgColor].map(this.#getRGB.bind(this)); + let fgGray = Math.round(0.2126 * fgRGB[0] + 0.7152 * fgRGB[1] + 0.0722 * fgRGB[2]); + let bgGray = Math.round(0.2126 * bgRGB[0] + 0.7152 * bgRGB[1] + 0.0722 * bgRGB[2]); + let [newFgRGB, newBgRGB] = [newFgColor, newBgColor].map(this.#getOpaqueTextColor.bind(this)); + if (bgGray < fgGray) { + [fgGray, bgGray, newFgRGB, newBgRGB] = [bgGray, fgGray, newBgRGB, newFgRGB]; + } + this.#defs.style.color = ""; + const getSteps = (fg, bg, n) => { + const arr = new Array(256); + const step = (bgGray - fgGray) / n; + const newStart = fg / 255; + const newStep = (bg - fg) / (255 * n); + let prev = 0; + for (let i = 0; i <= n; i++) { + const k = Math.round(fgGray + i * step); + const value = newStart + i * newStep; + for (let j = prev; j <= k; j++) { + arr[j] = value; + } + prev = k + 1; + } + for (let i = prev; i < 256; i++) { + arr[i] = arr[prev - 1]; + } + return arr.join(","); + }; + const id = `g_${this.#docId}_hcm_${filterName}_filter`; + const filter = info.filter = this.#createFilter(id); + this.#addGrayConversion(filter); + this.#addTransferMapConversion(getSteps(newFgRGB[0], newBgRGB[0], 5), getSteps(newFgRGB[1], newBgRGB[1], 5), getSteps(newFgRGB[2], newBgRGB[2], 5), filter); + info.url = this.#createUrl(id); + return info.url; + } + destroy(keepHCM = false) { + if (keepHCM && this.#_hcmCache?.size) { + return; + } + this.#_defs?.parentNode.parentNode.remove(); + this.#_defs = null; + this.#_cache?.clear(); + this.#_cache = null; + this.#_hcmCache?.clear(); + this.#_hcmCache = null; + this.#id = 0; + } + #addLuminosityConversion(filter) { + const feColorMatrix = this.#document.createElementNS(SVG_NS, "feColorMatrix"); + feColorMatrix.setAttribute("type", "matrix"); + feColorMatrix.setAttribute("values", "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.59 0.11 0 0"); + filter.append(feColorMatrix); + } + #addGrayConversion(filter) { + const feColorMatrix = this.#document.createElementNS(SVG_NS, "feColorMatrix"); + feColorMatrix.setAttribute("type", "matrix"); + feColorMatrix.setAttribute("values", "0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0"); + filter.append(feColorMatrix); + } + #createFilter(id) { + const filter = this.#document.createElementNS(SVG_NS, "filter"); + filter.setAttribute("color-interpolation-filters", "sRGB"); + filter.setAttribute("id", id); + this.#defs.append(filter); + return filter; + } + #appendFeFunc(feComponentTransfer, func, table) { + const feFunc = this.#document.createElementNS(SVG_NS, func); + feFunc.setAttribute("type", "discrete"); + feFunc.setAttribute("tableValues", table); + feComponentTransfer.append(feFunc); + } + #addTransferMapConversion(rTable, gTable, bTable, filter) { + const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); + filter.append(feComponentTransfer); + this.#appendFeFunc(feComponentTransfer, "feFuncR", rTable); + this.#appendFeFunc(feComponentTransfer, "feFuncG", gTable); + this.#appendFeFunc(feComponentTransfer, "feFuncB", bTable); + } + #addTransferMapAlphaConversion(aTable, filter) { + const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); + filter.append(feComponentTransfer); + this.#appendFeFunc(feComponentTransfer, "feFuncA", aTable); + } + #getRGB(color) { + this.#defs.style.color = color; + return getRGB(getComputedStyle(this.#defs).getPropertyValue("color")); + } + #getRGBA(color) { + this.#defs.style.color = color; + return getRGBA(getComputedStyle(this.#defs).getPropertyValue("color")); + } + #getOpaqueTextColor(color) { + const [r, g, b, alpha] = this.#getRGBA(color); + if (alpha === 1) { + return [r, g, b]; + } + const [canvasR, canvasG, canvasB] = this.#getRGB("Canvas"); + return [blend(r, canvasR, alpha), blend(g, canvasG, alpha), blend(b, canvasB, alpha)]; } } +function blend(fg, bg, alpha) { + return Math.round(alpha * fg + (1 - alpha) * bg); +} +;// ./src/display/node_utils.js -/***/ }), -/***/ 923: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { -// EXPORTS -__webpack_require__.d(__webpack_exports__, { - CanvasGraphics: () => (/* binding */ CanvasGraphics) -}); +if (isNodeJS) { + warn("Please use the `legacy` build in Node.js environments."); +} +async function node_utils_fetchData(url) { + const fs = process.getBuiltinModule("fs/promises"); + const data = await fs.readFile(url); + return new Uint8Array(data); +} +class NodeFilterFactory extends BaseFilterFactory {} +class NodeCanvasFactory extends BaseCanvasFactory { + _createCanvas(width, height) { + const require = process.getBuiltinModule("module").createRequire(import.meta.url); + const canvas = require("@napi-rs/canvas"); + return canvas.createCanvas(width, height); + } +} +class NodeBinaryDataFactory extends BaseBinaryDataFactory { + async _fetch(url, kind) { + return node_utils_fetchData(url); + } +} + +;// ./src/shared/image_utils.js +/* unused harmony import specifier */ var image_utils_ImageKind; +/* unused harmony import specifier */ var image_utils_FeatureTest; + +function convertToRGBA(params) { + switch (params.kind) { + case image_utils_ImageKind.GRAYSCALE_1BPP: + return convertBlackAndWhiteToRGBA(params); + case image_utils_ImageKind.RGB_24BPP: + return convertRGBToRGBA(params); + } + return null; +} +function convertBlackAndWhiteToRGBA({ + src, + srcPos = 0, + dest, + width, + height, + nonBlackColor = 0xffffffff, + inverseDecode = false +}) { + const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor]; + const widthInSource = width >> 3; + const widthRemainder = width & 7; + const xorMask = zeroMapping ^ oneMapping; + const srcLength = src.length; + dest = new Uint32Array(dest.buffer); + let destPos = 0; + for (let i = 0; i < height; ++i) { + for (const max = srcPos + widthInSource; srcPos < max; ++srcPos, destPos += 8) { + const elem = src[srcPos]; + dest[destPos] = zeroMapping ^ -(elem >> 7 & 1) & xorMask; + dest[destPos + 1] = zeroMapping ^ -(elem >> 6 & 1) & xorMask; + dest[destPos + 2] = zeroMapping ^ -(elem >> 5 & 1) & xorMask; + dest[destPos + 3] = zeroMapping ^ -(elem >> 4 & 1) & xorMask; + dest[destPos + 4] = zeroMapping ^ -(elem >> 3 & 1) & xorMask; + dest[destPos + 5] = zeroMapping ^ -(elem >> 2 & 1) & xorMask; + dest[destPos + 6] = zeroMapping ^ -(elem >> 1 & 1) & xorMask; + dest[destPos + 7] = zeroMapping ^ -(elem & 1) & xorMask; + } + if (widthRemainder === 0) { + continue; + } + const elem = srcPos < srcLength ? src[srcPos++] : 255; + for (let j = 0; j < widthRemainder; ++j, ++destPos) { + dest[destPos] = zeroMapping ^ -(elem >> 7 - j & 1) & xorMask; + } + } + return { + srcPos, + destPos + }; +} +function convertRGBToRGBA({ + src, + srcPos = 0, + dest, + destPos = 0, + width, + height +}) { + let i = 0; + const len = width * height * 3; + const len32 = len >> 2; + const src32 = new Uint32Array(src.buffer, srcPos, len32); + const alphaMask = FeatureTest.isLittleEndian ? 0xff000000 : 0xff; + if (FeatureTest.isLittleEndian) { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i], + s2 = src32[i + 1], + s3 = src32[i + 2]; + dest[destPos] = s1 | alphaMask; + dest[destPos + 1] = s1 >>> 24 | s2 << 8 | alphaMask; + dest[destPos + 2] = s2 >>> 16 | s3 << 16 | alphaMask; + dest[destPos + 3] = s3 >>> 8 | alphaMask; + } + for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | alphaMask; + } + } else { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i], + s2 = src32[i + 1], + s3 = src32[i + 2]; + dest[destPos] = s1 | alphaMask; + dest[destPos + 1] = s1 << 24 | s2 >>> 8 | alphaMask; + dest[destPos + 2] = s2 << 16 | s3 >>> 16 | alphaMask; + dest[destPos + 3] = s3 << 8 | alphaMask; + } + for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | alphaMask; + } + } + return { + srcPos: srcPos + len, + destPos + }; +} +function grayToRGBA(src, dest) { + if (image_utils_FeatureTest.isLittleEndian) { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x10101 | 0xff000000; + } + } else { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x1010100 | 0x000000ff; + } + } +} + +;// ./src/display/webgpu.js +const MESH_WGSL = ` +struct Uniforms { + offsetX : f32, + offsetY : f32, + scaleX : f32, + scaleY : f32, + paddedWidth : f32, + paddedHeight : f32, + borderSize : f32, + _pad : f32, +}; + +@group(0) @binding(0) var u : Uniforms; + +struct VertexInput { + @location(0) position : vec2, + @location(1) color : vec4, +}; + +struct VertexOutput { + @builtin(position) position : vec4, + @location(0) color : vec3, +}; + +@vertex +fn vs_main(in : VertexInput) -> VertexOutput { + var out : VertexOutput; + let cx = (in.position.x + u.offsetX) * u.scaleX; + let cy = (in.position.y + u.offsetY) * u.scaleY; + out.position = vec4( + ((cx + u.borderSize) / u.paddedWidth) * 2.0 - 1.0, + 1.0 - ((cy + u.borderSize) / u.paddedHeight) * 2.0, + 0.0, + 1.0 + ); + out.color = in.color.rgb; + return out; +} + +@fragment +fn fs_main(in : VertexOutput) -> @location(0) vec4 { + return vec4(in.color, 1.0); +} +`; +class WebGPU { + #initPromise = null; + #device = null; + #meshPipeline = null; + #preferredFormat = null; + async #initGPU() { + if (!globalThis.navigator?.gpu) { + return false; + } + try { + const adapter = await navigator.gpu.requestAdapter(); + if (!adapter) { + return false; + } + this.#preferredFormat = navigator.gpu.getPreferredCanvasFormat(); + this.#device = await adapter.requestDevice(); + return true; + } catch { + return false; + } + } + init() { + return this.#initPromise ||= this.#initGPU(); + } + get isReady() { + return this.#device !== null; + } + loadMeshShader() { + if (!this.#device || this.#meshPipeline) { + return; + } + const shaderModule = this.#device.createShaderModule({ + code: MESH_WGSL + }); + this.#meshPipeline = this.#device.createRenderPipeline({ + layout: "auto", + vertex: { + module: shaderModule, + entryPoint: "vs_main", + buffers: [{ + arrayStride: 2 * 4, + attributes: [{ + shaderLocation: 0, + offset: 0, + format: "float32x2" + }] + }, { + arrayStride: 4, + attributes: [{ + shaderLocation: 1, + offset: 0, + format: "unorm8x4" + }] + }] + }, + fragment: { + module: shaderModule, + entryPoint: "fs_main", + targets: [{ + format: this.#preferredFormat + }] + }, + primitive: { + topology: "triangle-list" + } + }); + } + draw(posData, colData, vertexCount, context, backgroundColor, paddedWidth, paddedHeight, borderSize) { + this.loadMeshShader(); + const device = this.#device; + const { + offsetX, + offsetY, + scaleX, + scaleY + } = context; + const posBuffer = device.createBuffer({ + size: Math.max(posData.byteLength, 4), + usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST + }); + if (posData.byteLength > 0) { + device.queue.writeBuffer(posBuffer, 0, posData); + } + const colBuffer = device.createBuffer({ + size: Math.max(colData.byteLength, 4), + usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST + }); + if (colData.byteLength > 0) { + device.queue.writeBuffer(colBuffer, 0, colData); + } + const uniformBuffer = device.createBuffer({ + size: 8 * 4, + usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST + }); + device.queue.writeBuffer(uniformBuffer, 0, new Float32Array([offsetX, offsetY, scaleX, scaleY, paddedWidth, paddedHeight, borderSize, 0])); + const bindGroup = device.createBindGroup({ + layout: this.#meshPipeline.getBindGroupLayout(0), + entries: [{ + binding: 0, + resource: { + buffer: uniformBuffer + } + }] + }); + const offscreen = new OffscreenCanvas(paddedWidth, paddedHeight); + const gpuCtx = offscreen.getContext("webgpu"); + gpuCtx.configure({ + device, + format: this.#preferredFormat, + alphaMode: backgroundColor ? "opaque" : "premultiplied" + }); + const clearValue = backgroundColor ? { + r: backgroundColor[0] / 255, + g: backgroundColor[1] / 255, + b: backgroundColor[2] / 255, + a: 1 + } : { + r: 0, + g: 0, + b: 0, + a: 0 + }; + const commandEncoder = device.createCommandEncoder(); + const renderPass = commandEncoder.beginRenderPass({ + colorAttachments: [{ + view: gpuCtx.getCurrentTexture().createView(), + clearValue, + loadOp: "clear", + storeOp: "store" + }] + }); + if (vertexCount > 0) { + renderPass.setPipeline(this.#meshPipeline); + renderPass.setBindGroup(0, bindGroup); + renderPass.setVertexBuffer(0, posBuffer); + renderPass.setVertexBuffer(1, colBuffer); + renderPass.draw(vertexCount); + } + renderPass.end(); + device.queue.submit([commandEncoder.finish()]); + posBuffer.destroy(); + colBuffer.destroy(); + uniformBuffer.destroy(); + return offscreen.transferToImageBitmap(); + } +} +const _webGPU = new WebGPU(); +function initGPU() { + return _webGPU.init(); +} +function isGPUReady() { + return _webGPU.isReady; +} +function loadMeshShader() { + _webGPU.loadMeshShader(); +} +function drawMeshWithGPU(posData, colData, vertexCount, context, backgroundColor, paddedWidth, paddedHeight, borderSize) { + return _webGPU.draw(posData, colData, vertexCount, context, backgroundColor, paddedWidth, paddedHeight, borderSize); +} + +;// ./src/display/pattern_helper.js + -// EXTERNAL MODULE: ./src/shared/util.js -var util = __webpack_require__(292); -// EXTERNAL MODULE: ./src/display/display_utils.js -var display_utils = __webpack_require__(419); -;// CONCATENATED MODULE: ./src/display/pattern_helper.js const PathType = { @@ -4787,13 +9802,11 @@ ctx.clip(region); } class BaseShadingPattern { - constructor() { - if (this.constructor === BaseShadingPattern) { - (0,util.unreachable)("Cannot initialize BaseShadingPattern."); - } + isModifyingCurrentTransform() { + return false; } getPattern() { - (0,util.unreachable)("Abstract method `getPattern` called."); + unreachable("Abstract method `getPattern` called."); } } class RadialAxialShadingPattern extends BaseShadingPattern { @@ -4808,42 +9821,126 @@ this._r1 = IR[7]; this.matrix = null; } - _createGradient(ctx) { + isOriginBased() { + return this._p0[0] === 0 && this._p0[1] === 0 && (!this.isRadial() || this._p1[0] === 0 && this._p1[1] === 0); + } + isRadial() { + return this._type === "radial"; + } + areConic() { + if (!this.isRadial()) { + return false; + } + const dist = Math.hypot(this._p0[0] - this._p1[0], this._p0[1] - this._p1[1]); + return dist + this._r1 > this._r0 && dist + this._r0 > this._r1; + } + _createGradient(ctx, transform = null) { let grad; + let firstPoint = this._p0; + let secondPoint = this._p1; + if (transform) { + firstPoint = firstPoint.slice(); + secondPoint = secondPoint.slice(); + Util.applyTransform(firstPoint, transform); + Util.applyTransform(secondPoint, transform); + } if (this._type === "axial") { - grad = ctx.createLinearGradient(this._p0[0], this._p0[1], this._p1[0], this._p1[1]); + grad = ctx.createLinearGradient(firstPoint[0], firstPoint[1], secondPoint[0], secondPoint[1]); } else if (this._type === "radial") { - grad = ctx.createRadialGradient(this._p0[0], this._p0[1], this._r0, this._p1[0], this._p1[1], this._r1); + let r0 = this._r0; + let r1 = this._r1; + if (transform) { + const scale = new Float32Array(2); + Util.singularValueDecompose2dScale(transform, scale); + r0 *= scale[0]; + r1 *= scale[0]; + } + grad = ctx.createRadialGradient(firstPoint[0], firstPoint[1], r0, secondPoint[0], secondPoint[1], r1); } for (const colorStop of this._colorStops) { grad.addColorStop(colorStop[0], colorStop[1]); } return grad; } + _createReversedGradient(ctx, transform = null) { + let firstPoint = this._p1; + let secondPoint = this._p0; + if (transform) { + firstPoint = firstPoint.slice(); + secondPoint = secondPoint.slice(); + Util.applyTransform(firstPoint, transform); + Util.applyTransform(secondPoint, transform); + } + let r0 = this._r1; + let r1 = this._r0; + if (transform) { + const scale = new Float32Array(2); + Util.singularValueDecompose2dScale(transform, scale); + r0 *= scale[0]; + r1 *= scale[0]; + } + const grad = ctx.createRadialGradient(firstPoint[0], firstPoint[1], r0, secondPoint[0], secondPoint[1], r1); + const reversedStops = this._colorStops.map(([t, c]) => [1 - t, c]).reverse(); + for (const [t, c] of reversedStops) { + grad.addColorStop(t, c); + } + return grad; + } getPattern(ctx, owner, inverse, pathType) { let pattern; if (pathType === PathType.STROKE || pathType === PathType.FILL) { - const ownerBBox = owner.current.getClippedPathBoundingBox(pathType, (0,display_utils.getCurrentTransform)(ctx)) || [0, 0, 0, 0]; + if (this.isOriginBased()) { + let transf = Util.transform(inverse, owner.baseTransform); + if (this.matrix) { + transf = Util.transform(transf, this.matrix); + } + const precision = 1e-3; + const n1 = Math.hypot(transf[0], transf[1]); + const n2 = Math.hypot(transf[2], transf[3]); + const ps = (transf[0] * transf[2] + transf[1] * transf[3]) / (n1 * n2); + if (Math.abs(ps) < precision) { + if (this.isRadial()) { + if (Math.abs(n1 - n2) < precision) { + return this._createGradient(ctx, transf); + } + } else { + return this._createGradient(ctx, transf); + } + } + } + const ownerBBox = owner.current.getClippedPathBoundingBox(pathType, getCurrentTransform(ctx)) || [0, 0, 0, 0]; const width = Math.ceil(ownerBBox[2] - ownerBBox[0]) || 1; const height = Math.ceil(ownerBBox[3] - ownerBBox[1]) || 1; - const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", width, height, true); + const tmpCanvas = owner.canvasFactory.create(width, height); const tmpCtx = tmpCanvas.context; tmpCtx.clearRect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height); tmpCtx.beginPath(); tmpCtx.rect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height); tmpCtx.translate(-ownerBBox[0], -ownerBBox[1]); - inverse = util.Util.transform(inverse, [1, 0, 0, 1, ownerBBox[0], ownerBBox[1]]); + inverse = Util.transform(inverse, [1, 0, 0, 1, ownerBBox[0], ownerBBox[1]]); tmpCtx.transform(...owner.baseTransform); if (this.matrix) { tmpCtx.transform(...this.matrix); } applyBoundingBox(tmpCtx, this._bbox); + if (this.areConic()) { + tmpCtx.fillStyle = this._createReversedGradient(tmpCtx); + tmpCtx.fill(); + } tmpCtx.fillStyle = this._createGradient(tmpCtx); tmpCtx.fill(); pattern = ctx.createPattern(tmpCanvas.canvas, "no-repeat"); + owner.canvasFactory.destroy(tmpCanvas); const domMatrix = new DOMMatrix(inverse); pattern.setTransform(domMatrix); } else { + if (this.areConic()) { + ctx.save(); + applyBoundingBox(ctx, this._bbox); + ctx.fillStyle = this._createReversedGradient(ctx); + ctx.fillRect(-1e10, -1e10, 2e10, 2e10); + ctx.restore(); + } applyBoundingBox(ctx, this._bbox); pattern = this._createGradient(ctx); } @@ -4856,7 +9953,7 @@ const bytes = data.data, rowSize = data.width * 4; let tmp; - if (coords[p1 + 1] > coords[p2 + 1]) { + if (coords[p1 * 2 + 1] > coords[p2 * 2 + 1]) { tmp = p1; p1 = p2; p2 = tmp; @@ -4864,7 +9961,7 @@ c1 = c2; c2 = tmp; } - if (coords[p2 + 1] > coords[p3 + 1]) { + if (coords[p2 * 2 + 1] > coords[p3 * 2 + 1]) { tmp = p2; p2 = p3; p3 = tmp; @@ -4872,7 +9969,7 @@ c2 = c3; c3 = tmp; } - if (coords[p1 + 1] > coords[p2 + 1]) { + if (coords[p1 * 2 + 1] > coords[p2 * 2 + 1]) { tmp = p1; p1 = p2; p2 = tmp; @@ -4880,24 +9977,24 @@ c1 = c2; c2 = tmp; } - const x1 = (coords[p1] + context.offsetX) * context.scaleX; - const y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY; - const x2 = (coords[p2] + context.offsetX) * context.scaleX; - const y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY; - const x3 = (coords[p3] + context.offsetX) * context.scaleX; - const y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY; + const x1 = (coords[p1 * 2] + context.offsetX) * context.scaleX; + const y1 = (coords[p1 * 2 + 1] + context.offsetY) * context.scaleY; + const x2 = (coords[p2 * 2] + context.offsetX) * context.scaleX; + const y2 = (coords[p2 * 2 + 1] + context.offsetY) * context.scaleY; + const x3 = (coords[p3 * 2] + context.offsetX) * context.scaleX; + const y3 = (coords[p3 * 2 + 1] + context.offsetY) * context.scaleY; if (y1 >= y3) { return; } - const c1r = colors[c1], - c1g = colors[c1 + 1], - c1b = colors[c1 + 2]; - const c2r = colors[c2], - c2g = colors[c2 + 1], - c2b = colors[c2 + 2]; - const c3r = colors[c3], - c3g = colors[c3 + 1], - c3b = colors[c3 + 2]; + const c1r = colors[c1 * 4], + c1g = colors[c1 * 4 + 1], + c1b = colors[c1 * 4 + 2]; + const c2r = colors[c2 * 4], + c2g = colors[c2 * 4 + 1], + c2b = colors[c2 * 4 + 2]; + const c3r = colors[c3 * 4], + c3g = colors[c3 * 4 + 1], + c3b = colors[c3 * 4 + 2]; const minY = Math.round(y1), maxY = Math.round(y3); let xa, car, cag, cab; @@ -4952,44 +10049,19 @@ } } } -function drawFigure(data, figure, context) { - const ps = figure.coords; - const cs = figure.colors; - let i, ii; - switch (figure.type) { - case "lattice": - const verticesPerRow = figure.verticesPerRow; - const rows = Math.floor(ps.length / verticesPerRow) - 1; - const cols = verticesPerRow - 1; - for (i = 0; i < rows; i++) { - let q = i * verticesPerRow; - for (let j = 0; j < cols; j++, q++) { - drawTriangle(data, context, ps[q], ps[q + 1], ps[q + verticesPerRow], cs[q], cs[q + 1], cs[q + verticesPerRow]); - drawTriangle(data, context, ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]); - } - } - break; - case "triangles": - for (i = 0, ii = ps.length; i < ii; i += 3) { - drawTriangle(data, context, ps[i], ps[i + 1], ps[i + 2], cs[i], cs[i + 1], cs[i + 2]); - } - break; - default: - throw new Error("illegal figure"); - } -} class MeshShadingPattern extends BaseShadingPattern { constructor(IR) { super(); - this._coords = IR[2]; - this._colors = IR[3]; - this._figures = IR[4]; + this._posData = IR[2]; + this._colData = IR[3]; + this._vertexCount = IR[4]; this._bounds = IR[5]; - this._bbox = IR[7]; - this._background = IR[8]; + this._bbox = IR[6]; + this._background = IR[7]; this.matrix = null; + loadMeshShader(); } - _createMeshCanvas(combinedScale, backgroundColor, cachedCanvases) { + _createMeshCanvas(combinedScale, backgroundColor, canvasFactory) { const EXPECTED_SCALE = 1.1; const MAX_PATTERN_SIZE = 3000; const BORDER_SIZE = 2; @@ -4997,13 +10069,13 @@ const offsetY = Math.floor(this._bounds[1]); const boundsWidth = Math.ceil(this._bounds[2]) - offsetX; const boundsHeight = Math.ceil(this._bounds[3]) - offsetY; - const width = Math.min(Math.ceil(Math.abs(boundsWidth * combinedScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); - const height = Math.min(Math.ceil(Math.abs(boundsHeight * combinedScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); - const scaleX = boundsWidth / width; - const scaleY = boundsHeight / height; + const width = Math.min(Math.ceil(Math.abs(boundsWidth * combinedScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE) || 1; + const height = Math.min(Math.ceil(Math.abs(boundsHeight * combinedScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE) || 1; + const scaleX = boundsWidth ? boundsWidth / width : 1; + const scaleY = boundsHeight ? boundsHeight / height : 1; const context = { - coords: this._coords, - colors: this._colors, + coords: this._posData, + colors: this._colData, offsetX: -offsetX, offsetY: -offsetY, scaleX: 1 / scaleX, @@ -5011,44 +10083,51 @@ }; const paddedWidth = width + BORDER_SIZE * 2; const paddedHeight = height + BORDER_SIZE * 2; - const tmpCanvas = cachedCanvases.getCanvas("mesh", paddedWidth, paddedHeight, false); - const tmpCtx = tmpCanvas.context; - const data = tmpCtx.createImageData(width, height); - if (backgroundColor) { - const bytes = data.data; - for (let i = 0, ii = bytes.length; i < ii; i += 4) { - bytes[i] = backgroundColor[0]; - bytes[i + 1] = backgroundColor[1]; - bytes[i + 2] = backgroundColor[2]; - bytes[i + 3] = 255; + const tmpCanvas = canvasFactory.create(paddedWidth, paddedHeight); + if (isGPUReady() && this._vertexCount > 48) { + tmpCanvas.context.drawImage(drawMeshWithGPU(this._posData, this._colData, this._vertexCount, context, backgroundColor, paddedWidth, paddedHeight, BORDER_SIZE), 0, 0); + } else { + const data = tmpCanvas.context.createImageData(width, height); + if (backgroundColor) { + const bytes = data.data; + for (let i = 0, ii = bytes.length; i < ii; i += 4) { + bytes[i] = backgroundColor[0]; + bytes[i + 1] = backgroundColor[1]; + bytes[i + 2] = backgroundColor[2]; + bytes[i + 3] = 255; + } } + for (let i = 0, ii = this._vertexCount; i < ii; i += 3) { + drawTriangle(data, context, i, i + 1, i + 2, i, i + 1, i + 2); + } + tmpCanvas.context.putImageData(data, BORDER_SIZE, BORDER_SIZE); } - for (const figure of this._figures) { - drawFigure(data, figure, context); - } - tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE); - const canvas = tmpCanvas.canvas; return { - canvas, + canvas: tmpCanvas.canvas, offsetX: offsetX - BORDER_SIZE * scaleX, offsetY: offsetY - BORDER_SIZE * scaleY, scaleX, scaleY }; } + isModifyingCurrentTransform() { + return true; + } getPattern(ctx, owner, inverse, pathType) { applyBoundingBox(ctx, this._bbox); - let scale; + const scale = new Float32Array(2); if (pathType === PathType.SHADING) { - scale = util.Util.singularValueDecompose2dScale((0,display_utils.getCurrentTransform)(ctx)); + Util.singularValueDecompose2dScale(getCurrentTransform(ctx), scale); + } else if (this.matrix) { + Util.singularValueDecompose2dScale(this.matrix, scale); + const [matrixScaleX, matrixScaleY] = scale; + Util.singularValueDecompose2dScale(owner.baseTransform, scale); + scale[0] *= matrixScaleX; + scale[1] *= matrixScaleY; } else { - scale = util.Util.singularValueDecompose2dScale(owner.baseTransform); - if (this.matrix) { - const matrixScale = util.Util.singularValueDecompose2dScale(this.matrix); - scale = [scale[0] * matrixScale[0], scale[1] * matrixScale[1]]; - } + Util.singularValueDecompose2dScale(owner.baseTransform, scale); } - const temporaryPatternCanvas = this._createMeshCanvas(scale, pathType === PathType.SHADING ? null : this._background, owner.cachedCanvases); + const temporaryPatternCanvas = this._createMeshCanvas(scale, pathType === PathType.SHADING ? null : this._background, owner.canvasFactory); if (pathType !== PathType.SHADING) { ctx.setTransform(...owner.baseTransform); if (this.matrix) { @@ -5057,7 +10136,9 @@ } ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY); ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY); - return ctx.createPattern(temporaryPatternCanvas.canvas, "no-repeat"); + const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, "no-repeat"); + owner.canvasFactory.destroy(temporaryPatternCanvas); + return pattern; } } class DummyShadingPattern extends BaseShadingPattern { @@ -5082,72 +10163,177 @@ }; class TilingPattern { static MAX_PATTERN_SIZE = 3000; - constructor(IR, color, ctx, canvasGraphicsFactory, baseTransform) { + constructor(IR, ctx, canvasGraphicsFactory, baseTransform) { + this.color = IR[1]; this.operatorList = IR[2]; - this.matrix = IR[3] || [1, 0, 0, 1, 0, 0]; + this.matrix = IR[3]; this.bbox = IR[4]; this.xstep = IR[5]; this.ystep = IR[6]; this.paintType = IR[7]; this.tilingType = IR[8]; - this.color = color; + this.needsIsolation = IR[9] ?? true; this.ctx = ctx; this.canvasGraphicsFactory = canvasGraphicsFactory; this.baseTransform = baseTransform; + this.patternBaseMatrix = this.matrix ? Util.transform(baseTransform, this.matrix) : baseTransform; } - createPatternCanvas(owner) { - const operatorList = this.operatorList; - const bbox = this.bbox; - const xstep = this.xstep; - const ystep = this.ystep; - const paintType = this.paintType; - const tilingType = this.tilingType; - const color = this.color; - const canvasGraphicsFactory = this.canvasGraphicsFactory; - (0,util.info)("TilingType: " + tilingType); - const x0 = bbox[0], - y0 = bbox[1], - x1 = bbox[2], - y1 = bbox[3]; - const matrixScale = util.Util.singularValueDecompose2dScale(this.matrix); - const curMatrixScale = util.Util.singularValueDecompose2dScale(this.baseTransform); - const combinedScale = [matrixScale[0] * curMatrixScale[0], matrixScale[1] * curMatrixScale[1]]; - const dimx = this.getSizeAndScale(xstep, this.ctx.canvas.width, combinedScale[0]); - const dimy = this.getSizeAndScale(ystep, this.ctx.canvas.height, combinedScale[1]); - const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", dimx.size, dimy.size, true); + canSkipPatternCanvas([width, height, offsetX, offsetY]) { + const [x0, y0, x1, y1] = this.bbox; + const absXStep = Math.abs(this.xstep); + const absYStep = Math.abs(this.ystep); + if (width > absXStep + 1e-6 || height > absYStep + 1e-6) { + return null; + } + const nXFirst = Math.floor((offsetX - x1) / absXStep) + 1; + const nXLast = Math.ceil((offsetX + width - x0) / absXStep) - 1; + const nYFirst = Math.floor((offsetY - y1) / absYStep) + 1; + const nYLast = Math.ceil((offsetY + height - y0) / absYStep) - 1; + return nXLast <= nXFirst && nYLast <= nYFirst ? [nXFirst, nYFirst] : null; + } + updatePatternDims(clippedBBox, dims) { + const inv = Util.inverseTransform(this.patternBaseMatrix); + const c1 = [clippedBBox[0], clippedBBox[1]]; + const c2 = [clippedBBox[2], clippedBBox[3]]; + Util.applyTransform(c1, inv); + Util.applyTransform(c2, inv); + dims[0] = Math.abs(c2[0] - c1[0]); + dims[1] = Math.abs(c2[1] - c1[1]); + dims[2] = Math.min(c1[0], c2[0]); + dims[3] = Math.min(c1[1], c2[1]); + } + _renderTileCanvas(owner, opIdx, dimx, dimy) { + const [x0, y0, x1, y1] = this.bbox; + const tmpCanvas = owner.canvasFactory.create(dimx.size, dimy.size); const tmpCtx = tmpCanvas.context; - const graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx); + const graphics = this.canvasGraphicsFactory.createCanvasGraphics(tmpCtx, opIdx); graphics.groupLevel = owner.groupLevel; - this.setFillAndStrokeStyleToContext(graphics, paintType, color); - let adjustedX0 = x0; - let adjustedY0 = y0; - let adjustedX1 = x1; - let adjustedY1 = y1; - if (x0 < 0) { - adjustedX0 = 0; - adjustedX1 += Math.abs(x0); - } - if (y0 < 0) { - adjustedY0 = 0; - adjustedY1 += Math.abs(y0); - } - tmpCtx.translate(-(dimx.scale * adjustedX0), -(dimy.scale * adjustedY0)); - graphics.transform(dimx.scale, 0, 0, dimy.scale, 0, 0); + this.setFillAndStrokeStyleToContext(graphics, this.paintType, this.color); + tmpCtx.translate(-dimx.scale * x0, -dimy.scale * y0); + graphics.transform(0, dimx.scale, 0, 0, dimy.scale, 0, 0); tmpCtx.save(); - this.clipBbox(graphics, adjustedX0, adjustedY0, adjustedX1, adjustedY1); - graphics.baseTransform = (0,display_utils.getCurrentTransform)(graphics.ctx); - graphics.executeOperatorList(operatorList); + graphics.dependencyTracker?.save(); + this.clipBbox(graphics, x0, y0, x1, y1); + graphics.baseTransform = getCurrentTransform(graphics.ctx); + graphics.executeOperatorList(this.operatorList); graphics.endDrawing(); + graphics.dependencyTracker?.restore(); + tmpCtx.restore(); + return tmpCanvas; + } + _getCombinedScales() { + const scale = new Float32Array(2); + Util.singularValueDecompose2dScale(this.matrix, scale); + const [matrixScaleX, matrixScaleY] = scale; + Util.singularValueDecompose2dScale(this.baseTransform, scale); + return [matrixScaleX * scale[0], matrixScaleY * scale[1]]; + } + drawPattern(owner, path, useEOFill = false, [n, m], opIdx) { + const [x0, y0, x1, y1] = this.bbox; + const dependencyTracker = owner.dependencyTracker; + if (dependencyTracker) { + owner.dependencyTracker = new CanvasNestedDependencyTracker(dependencyTracker, opIdx); + } + owner.save(); + if (useEOFill) { + owner.ctx.clip(path, "evenodd"); + } else { + owner.ctx.clip(path); + } + owner.ctx.setTransform(...this.patternBaseMatrix); + owner.ctx.translate(n * this.xstep, m * this.ystep); + if (this.needsIsolation || owner.ctx.globalAlpha !== 1 || owner.ctx.globalCompositeOperation !== "source-over" || owner.inSMaskMode) { + const bboxWidth = x1 - x0; + const bboxHeight = y1 - y0; + const [combinedScaleX, combinedScaleY] = this._getCombinedScales(); + const dimx = this.getSizeAndScale(bboxWidth, this.ctx.canvas.width, combinedScaleX); + const dimy = this.getSizeAndScale(bboxHeight, this.ctx.canvas.height, combinedScaleY); + const tmpCanvas = this._renderTileCanvas(owner, opIdx, dimx, dimy); + owner.ctx.drawImage(tmpCanvas.canvas, x0, y0, bboxWidth, bboxHeight); + owner.canvasFactory.destroy(tmpCanvas); + } else { + this.setFillAndStrokeStyleToContext(owner, this.paintType, this.color); + this.clipBbox(owner, x0, y0, x1, y1); + owner.baseTransformStack.push(owner.baseTransform); + owner.baseTransform = getCurrentTransform(owner.ctx); + owner.executeOperatorList(this.operatorList); + owner.baseTransform = owner.baseTransformStack.pop(); + } + owner.restore(); + if (dependencyTracker) { + owner.dependencyTracker = dependencyTracker; + } + } + createPatternCanvas(owner, opIdx) { + const [x0, y0, x1, y1] = this.bbox; + const width = x1 - x0; + const height = y1 - y0; + let { + xstep, + ystep + } = this; + xstep = Math.abs(xstep); + ystep = Math.abs(ystep); + info("TilingType: " + this.tilingType); + const [combinedScaleX, combinedScaleY] = this._getCombinedScales(); + let canvasWidth = width, + canvasHeight = height, + redrawHorizontally = false, + redrawVertically = false; + if (Math.ceil(xstep * combinedScaleX) >= Math.ceil(width * combinedScaleX)) { + canvasWidth = xstep; + } else { + redrawHorizontally = true; + } + if (Math.ceil(ystep * combinedScaleY) >= Math.ceil(height * combinedScaleY)) { + canvasHeight = ystep; + } else { + redrawVertically = true; + } + const dimx = this.getSizeAndScale(canvasWidth, this.ctx.canvas.width, combinedScaleX); + const dimy = this.getSizeAndScale(canvasHeight, this.ctx.canvas.height, combinedScaleY); + const tmpCanvas = this._renderTileCanvas(owner, opIdx, dimx, dimy); + if (redrawHorizontally || redrawVertically) { + const image = tmpCanvas.canvas; + if (redrawHorizontally) { + canvasWidth = xstep; + } + if (redrawVertically) { + canvasHeight = ystep; + } + const dimx2 = this.getSizeAndScale(canvasWidth, this.ctx.canvas.width, combinedScaleX); + const dimy2 = this.getSizeAndScale(canvasHeight, this.ctx.canvas.height, combinedScaleY); + const xSize = dimx2.size; + const ySize = dimy2.size; + const tmpCanvas2 = owner.canvasFactory.create(xSize, ySize); + const tmpCtx2 = tmpCanvas2.context; + const ii = redrawHorizontally ? Math.floor(width / xstep) : 0; + const jj = redrawVertically ? Math.floor(height / ystep) : 0; + for (let i = 0; i <= ii; i++) { + for (let j = 0; j <= jj; j++) { + tmpCtx2.drawImage(image, xSize * i, ySize * j, xSize, ySize, 0, 0, xSize, ySize); + } + } + owner.canvasFactory.destroy(tmpCanvas); + return { + canvas: tmpCanvas2.canvas, + canvasEntry: tmpCanvas2, + scaleX: dimx2.scale, + scaleY: dimy2.scale, + offsetX: x0, + offsetY: y0 + }; + } return { canvas: tmpCanvas.canvas, + canvasEntry: tmpCanvas, scaleX: dimx.scale, scaleY: dimy.scale, - offsetX: adjustedX0, - offsetY: adjustedY0 + offsetX: x0, + offsetY: y0 }; } getSizeAndScale(step, realOutputSize, scale) { - step = Math.abs(step); const maxSize = Math.max(TilingPattern.MAX_PATTERN_SIZE, realOutputSize); let size = Math.ceil(step * scale); if (size >= maxSize) { @@ -5163,297 +10349,88 @@ clipBbox(graphics, x0, y0, x1, y1) { const bboxWidth = x1 - x0; const bboxHeight = y1 - y0; - graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight); - graphics.current.updateRectMinMax((0,display_utils.getCurrentTransform)(graphics.ctx), [x0, y0, x1, y1]); - graphics.clip(); - graphics.endPath(); + const clip = new Path2D(); + clip.rect(x0, y0, bboxWidth, bboxHeight); + Util.axialAlignedBoundingBox([x0, y0, x1, y1], getCurrentTransform(graphics.ctx), graphics.current.minMax); + graphics.ctx.clip(clip); + graphics.current.updateClipFromPath(); } setFillAndStrokeStyleToContext(graphics, paintType, color) { const context = graphics.ctx, current = graphics.current; + current.patternFill = current.patternStroke = false; switch (paintType) { case PaintType.COLORED: - const ctx = this.ctx; - context.fillStyle = ctx.fillStyle; - context.strokeStyle = ctx.strokeStyle; - current.fillColor = ctx.fillStyle; - current.strokeColor = ctx.strokeStyle; + const { + fillStyle, + strokeStyle + } = this.ctx; + context.fillStyle = current.fillColor = fillStyle; + context.strokeStyle = current.strokeColor = strokeStyle; break; case PaintType.UNCOLORED: - const cssColor = util.Util.makeHexColor(color[0], color[1], color[2]); - context.fillStyle = cssColor; - context.strokeStyle = cssColor; - current.fillColor = cssColor; - current.strokeColor = cssColor; + context.fillStyle = context.strokeStyle = color; + current.fillColor = current.strokeColor = color; break; default: - throw new util.FormatError(`Unsupported paint type: ${paintType}`); + throw new FormatError(`Unsupported paint type: ${paintType}`); } } - getPattern(ctx, owner, inverse, pathType) { - let matrix = inverse; - if (pathType !== PathType.SHADING) { - matrix = util.Util.transform(matrix, owner.baseTransform); - if (this.matrix) { - matrix = util.Util.transform(matrix, this.matrix); - } - } - const temporaryPatternCanvas = this.createPatternCanvas(owner); + isModifyingCurrentTransform() { + return false; + } + getPattern(ctx, owner, inverse, pathType, opIdx) { + const matrix = pathType !== PathType.SHADING ? Util.transform(inverse, this.patternBaseMatrix) : inverse; + const temporaryPatternCanvas = this.createPatternCanvas(owner, opIdx); let domMatrix = new DOMMatrix(matrix); domMatrix = domMatrix.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY); domMatrix = domMatrix.scale(1 / temporaryPatternCanvas.scaleX, 1 / temporaryPatternCanvas.scaleY); const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, "repeat"); + owner.canvasFactory.destroy(temporaryPatternCanvas.canvasEntry); pattern.setTransform(domMatrix); return pattern; } } -;// CONCATENATED MODULE: ./src/shared/image_utils.js +;// ./src/display/canvas.js -function convertToRGBA(params) { - switch (params.kind) { - case ImageKind.GRAYSCALE_1BPP: - return convertBlackAndWhiteToRGBA(params); - case ImageKind.RGB_24BPP: - return convertRGBToRGBA(params); - } - return null; -} -function convertBlackAndWhiteToRGBA({ - src, - srcPos = 0, - dest, - width, - height, - nonBlackColor = 0xffffffff, - inverseDecode = false -}) { - const black = util.FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; - const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor]; - const widthInSource = width >> 3; - const widthRemainder = width & 7; - const srcLength = src.length; - dest = new Uint32Array(dest.buffer); - let destPos = 0; - for (let i = 0; i < height; i++) { - for (const max = srcPos + widthInSource; srcPos < max; srcPos++) { - const elem = srcPos < srcLength ? src[srcPos] : 255; - dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping; - } - if (widthRemainder === 0) { - continue; - } - const elem = srcPos < srcLength ? src[srcPos++] : 255; - for (let j = 0; j < widthRemainder; j++) { - dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping; - } - } - return { - srcPos, - destPos - }; -} -function convertRGBToRGBA({ - src, - srcPos = 0, - dest, - destPos = 0, - width, - height -}) { - let i = 0; - const len32 = src.length >> 2; - const src32 = new Uint32Array(src.buffer, srcPos, len32); - if (FeatureTest.isLittleEndian) { - for (; i < len32 - 2; i += 3, destPos += 4) { - const s1 = src32[i]; - const s2 = src32[i + 1]; - const s3 = src32[i + 2]; - dest[destPos] = s1 | 0xff000000; - dest[destPos + 1] = s1 >>> 24 | s2 << 8 | 0xff000000; - dest[destPos + 2] = s2 >>> 16 | s3 << 16 | 0xff000000; - dest[destPos + 3] = s3 >>> 8 | 0xff000000; - } - for (let j = i * 4, jj = src.length; j < jj; j += 3) { - dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | 0xff000000; - } - } else { - for (; i < len32 - 2; i += 3, destPos += 4) { - const s1 = src32[i]; - const s2 = src32[i + 1]; - const s3 = src32[i + 2]; - dest[destPos] = s1 | 0xff; - dest[destPos + 1] = s1 << 24 | s2 >>> 8 | 0xff; - dest[destPos + 2] = s2 << 16 | s3 >>> 16 | 0xff; - dest[destPos + 3] = s3 << 8 | 0xff; - } - for (let j = i * 4, jj = src.length; j < jj; j += 3) { - dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | 0xff; - } - } - return { - srcPos, - destPos - }; -} -function grayToRGBA(src, dest) { - if (FeatureTest.isLittleEndian) { - for (let i = 0, ii = src.length; i < ii; i++) { - dest[i] = src[i] * 0x10101 | 0xff000000; - } - } else { - for (let i = 0, ii = src.length; i < ii; i++) { - dest[i] = src[i] * 0x1010100 | 0x000000ff; - } - } -} -;// CONCATENATED MODULE: ./src/display/canvas.js const MIN_FONT_SIZE = 16; const MAX_FONT_SIZE = 100; -const MAX_GROUP_SIZE = 4096; const EXECUTION_TIME = 15; const EXECUTION_STEPS = 10; -const MAX_SIZE_TO_COMPILE = 1000; const FULL_CHUNK_HEIGHT = 16; +const SCALE_MATRIX = new DOMMatrix(); +const XY = new Float32Array(2); function mirrorContextOperations(ctx, destCtx) { if (ctx._removeMirroring) { throw new Error("Context is already forwarding operations."); } - ctx.__originalSave = ctx.save; - ctx.__originalRestore = ctx.restore; - ctx.__originalRotate = ctx.rotate; - ctx.__originalScale = ctx.scale; - ctx.__originalTranslate = ctx.translate; - ctx.__originalTransform = ctx.transform; - ctx.__originalSetTransform = ctx.setTransform; - ctx.__originalResetTransform = ctx.resetTransform; - ctx.__originalClip = ctx.clip; - ctx.__originalMoveTo = ctx.moveTo; - ctx.__originalLineTo = ctx.lineTo; - ctx.__originalBezierCurveTo = ctx.bezierCurveTo; - ctx.__originalRect = ctx.rect; - ctx.__originalClosePath = ctx.closePath; - ctx.__originalBeginPath = ctx.beginPath; - ctx._removeMirroring = () => { - ctx.save = ctx.__originalSave; - ctx.restore = ctx.__originalRestore; - ctx.rotate = ctx.__originalRotate; - ctx.scale = ctx.__originalScale; - ctx.translate = ctx.__originalTranslate; - ctx.transform = ctx.__originalTransform; - ctx.setTransform = ctx.__originalSetTransform; - ctx.resetTransform = ctx.__originalResetTransform; - ctx.clip = ctx.__originalClip; - ctx.moveTo = ctx.__originalMoveTo; - ctx.lineTo = ctx.__originalLineTo; - ctx.bezierCurveTo = ctx.__originalBezierCurveTo; - ctx.rect = ctx.__originalRect; - ctx.closePath = ctx.__originalClosePath; - ctx.beginPath = ctx.__originalBeginPath; - delete ctx._removeMirroring; - }; - ctx.save = function ctxSave() { - destCtx.save(); - this.__originalSave(); - }; - ctx.restore = function ctxRestore() { - destCtx.restore(); - this.__originalRestore(); - }; - ctx.translate = function ctxTranslate(x, y) { - destCtx.translate(x, y); - this.__originalTranslate(x, y); - }; - ctx.scale = function ctxScale(x, y) { - destCtx.scale(x, y); - this.__originalScale(x, y); - }; - ctx.transform = function ctxTransform(a, b, c, d, e, f) { - destCtx.transform(a, b, c, d, e, f); - this.__originalTransform(a, b, c, d, e, f); - }; - ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) { - destCtx.setTransform(a, b, c, d, e, f); - this.__originalSetTransform(a, b, c, d, e, f); - }; - ctx.resetTransform = function ctxResetTransform() { - destCtx.resetTransform(); - this.__originalResetTransform(); - }; - ctx.rotate = function ctxRotate(angle) { - destCtx.rotate(angle); - this.__originalRotate(angle); - }; - ctx.clip = function ctxRotate(rule) { - destCtx.clip(rule); - this.__originalClip(rule); - }; - ctx.moveTo = function (x, y) { - destCtx.moveTo(x, y); - this.__originalMoveTo(x, y); - }; - ctx.lineTo = function (x, y) { - destCtx.lineTo(x, y); - this.__originalLineTo(x, y); - }; - ctx.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) { - destCtx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); - this.__originalBezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); - }; - ctx.rect = function (x, y, width, height) { - destCtx.rect(x, y, width, height); - this.__originalRect(x, y, width, height); - }; - ctx.closePath = function () { - destCtx.closePath(); - this.__originalClosePath(); - }; - ctx.beginPath = function () { - destCtx.beginPath(); - this.__originalBeginPath(); - }; -} -class CachedCanvases { - constructor(canvasFactory) { - this.canvasFactory = canvasFactory; - this.cache = Object.create(null); - } - getCanvas(id, width, height) { - let canvasEntry; - if (this.cache[id] !== undefined) { - canvasEntry = this.cache[id]; - this.canvasFactory.reset(canvasEntry, width, height); - } else { - canvasEntry = this.canvasFactory.create(width, height); - this.cache[id] = canvasEntry; + const originalMethods = new Map(); + for (const name of ["save", "restore", "rotate", "scale", "translate", "transform", "setTransform", "resetTransform", "clip", "moveTo", "lineTo", "bezierCurveTo", "quadraticCurveTo", "arc", "arcTo", "ellipse", "rect", "roundRect", "closePath", "beginPath"]) { + const original = ctx[name]; + if (typeof original !== "function" || typeof destCtx[name] !== "function") { + continue; } - return canvasEntry; - } - delete(id) { - delete this.cache[id]; + originalMethods.set(name, original); + ctx[name] = function (...args) { + destCtx[name](...args); + return original.apply(this, args); + }; } - clear() { - for (const id in this.cache) { - const canvasEntry = this.cache[id]; - this.canvasFactory.destroy(canvasEntry); - delete this.cache[id]; + ctx._removeMirroring = () => { + for (const [name, original] of originalMethods) { + ctx[name] = original; } - } + delete ctx._removeMirroring; + }; } function drawImageAtIntegerCoords(ctx, srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH) { - const [a, b, c, d, tx, ty] = (0,display_utils.getCurrentTransform)(ctx); + const [a, b, c, d, tx, ty] = getCurrentTransform(ctx); if (b === 0 && c === 0) { const tlX = destX * a + tx; const rTlX = Math.round(tlX); @@ -5487,213 +10464,53 @@ const scaleY = Math.hypot(c, d); return [scaleX * destW, scaleY * destH]; } -function compileType3Glyph(imgData) { - const { - width, - height - } = imgData; - if (width > MAX_SIZE_TO_COMPILE || height > MAX_SIZE_TO_COMPILE) { - return null; - } - const POINT_TO_PROCESS_LIMIT = 1000; - const POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]); - const width1 = width + 1; - let points = new Uint8Array(width1 * (height + 1)); - let i, j, j0; - const lineSize = width + 7 & ~7; - let data = new Uint8Array(lineSize * height), - pos = 0; - for (const elem of imgData.data) { - let mask = 128; - while (mask > 0) { - data[pos++] = elem & mask ? 0 : 255; - mask >>= 1; - } - } - let count = 0; - pos = 0; - if (data[pos] !== 0) { - points[0] = 1; - ++count; - } - for (j = 1; j < width; j++) { - if (data[pos] !== data[pos + 1]) { - points[j] = data[pos] ? 2 : 1; - ++count; - } - pos++; - } - if (data[pos] !== 0) { - points[j] = 2; - ++count; - } - for (i = 1; i < height; i++) { - pos = i * lineSize; - j0 = i * width1; - if (data[pos - lineSize] !== data[pos]) { - points[j0] = data[pos] ? 1 : 8; - ++count; - } - let sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0); - for (j = 1; j < width; j++) { - sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0); - if (POINT_TYPES[sum]) { - points[j0 + j] = POINT_TYPES[sum]; - ++count; - } - pos++; - } - if (data[pos - lineSize] !== data[pos]) { - points[j0 + j] = data[pos] ? 2 : 4; - ++count; - } - if (count > POINT_TO_PROCESS_LIMIT) { - return null; - } - } - pos = lineSize * (height - 1); - j0 = i * width1; - if (data[pos] !== 0) { - points[j0] = 8; - ++count; - } - for (j = 1; j < width; j++) { - if (data[pos] !== data[pos + 1]) { - points[j0 + j] = data[pos] ? 4 : 8; - ++count; - } - pos++; - } - if (data[pos] !== 0) { - points[j0 + j] = 4; - ++count; - } - if (count > POINT_TO_PROCESS_LIMIT) { - return null; - } - const steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]); - const path = new Path2D(); - for (i = 0; count && i <= height; i++) { - let p = i * width1; - const end = p + width; - while (p < end && !points[p]) { - p++; - } - if (p === end) { - continue; - } - path.moveTo(p % width1, i); - const p0 = p; - let type = points[p]; - do { - const step = steps[type]; - do { - p += step; - } while (!points[p]); - const pp = points[p]; - if (pp !== 5 && pp !== 10) { - type = pp; - points[p] = 0; - } else { - type = pp & 0x33 * type >> 4; - points[p] &= type >> 2 | type << 2; - } - path.lineTo(p % width1, p / width1 | 0); - if (!points[p]) { - --count; - } - } while (p0 !== p); - --i; - } - data = null; - points = null; - const drawOutline = function (c) { - c.save(); - c.scale(1 / width, -1 / height); - c.translate(0, -height); - c.fill(path); - c.beginPath(); - c.restore(); - }; - return drawOutline; -} class CanvasExtraState { + alphaIsShape = false; + fontSize = 0; + fontSizeScale = 1; + textMatrix = null; + textMatrixScale = 1; + fontMatrix = FONT_IDENTITY_MATRIX; + leading = 0; + x = 0; + y = 0; + lineX = 0; + lineY = 0; + charSpacing = 0; + wordSpacing = 0; + textHScale = 1; + textRenderingMode = TextRenderingMode.FILL; + textRise = 0; + fillColor = "#000000"; + strokeColor = "#000000"; + tilingPatternDims = null; + patternFill = false; + patternStroke = false; + fillAlpha = 1; + strokeAlpha = 1; + lineWidth = 1; + activeSMask = null; + transferMaps = "none"; + minMax = F32_BBOX_INIT.slice(); constructor(width, height) { - this.alphaIsShape = false; - this.fontSize = 0; - this.fontSizeScale = 1; - this.textMatrix = util.IDENTITY_MATRIX; - this.textMatrixScale = 1; - this.fontMatrix = util.FONT_IDENTITY_MATRIX; - this.leading = 0; - this.x = 0; - this.y = 0; - this.lineX = 0; - this.lineY = 0; - this.charSpacing = 0; - this.wordSpacing = 0; - this.textHScale = 1; - this.textRenderingMode = util.TextRenderingMode.FILL; - this.textRise = 0; - this.fillColor = "#000000"; - this.strokeColor = "#000000"; - this.patternFill = false; - this.fillAlpha = 1; - this.strokeAlpha = 1; - this.lineWidth = 1; - this.activeSMask = null; - this.transferMaps = "none"; - this.startNewPathAndClipBox([0, 0, width, height]); + this.clipBox = new Float32Array([0, 0, width, height]); } clone() { const clone = Object.create(this); clone.clipBox = this.clipBox.slice(); + clone.minMax = this.minMax.slice(); + clone.tilingPatternDims = this.tilingPatternDims?.slice(); return clone; } - setCurrentPoint(x, y) { - this.x = x; - this.y = y; - } - updatePathMinMax(transform, x, y) { - [x, y] = util.Util.applyTransform([x, y], transform); - this.minX = Math.min(this.minX, x); - this.minY = Math.min(this.minY, y); - this.maxX = Math.max(this.maxX, x); - this.maxY = Math.max(this.maxY, y); - } - updateRectMinMax(transform, rect) { - const p1 = util.Util.applyTransform(rect, transform); - const p2 = util.Util.applyTransform(rect.slice(2), transform); - const p3 = util.Util.applyTransform([rect[0], rect[3]], transform); - const p4 = util.Util.applyTransform([rect[2], rect[1]], transform); - this.minX = Math.min(this.minX, p1[0], p2[0], p3[0], p4[0]); - this.minY = Math.min(this.minY, p1[1], p2[1], p3[1], p4[1]); - this.maxX = Math.max(this.maxX, p1[0], p2[0], p3[0], p4[0]); - this.maxY = Math.max(this.maxY, p1[1], p2[1], p3[1], p4[1]); - } - updateScalingPathMinMax(transform, minMax) { - util.Util.scaleMinMax(transform, minMax); - this.minX = Math.min(this.minX, minMax[0]); - this.minY = Math.min(this.minY, minMax[1]); - this.maxX = Math.max(this.maxX, minMax[2]); - this.maxY = Math.max(this.maxY, minMax[3]); - } - updateCurvePathMinMax(transform, x0, y0, x1, y1, x2, y2, x3, y3, minMax) { - const box = util.Util.bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax); - if (minMax) { - return; - } - this.updateRectMinMax(transform, box); - } getPathBoundingBox(pathType = PathType.FILL, transform = null) { - const box = [this.minX, this.minY, this.maxX, this.maxY]; + const box = this.minMax.slice(); if (pathType === PathType.STROKE) { if (!transform) { - (0,util.unreachable)("Stroke bounding box must include transform."); + unreachable("Stroke bounding box must include transform."); } - const scale = util.Util.singularValueDecompose2dScale(transform); - const xStrokePad = scale[0] * this.lineWidth / 2; - const yStrokePad = scale[1] * this.lineWidth / 2; + Util.singularValueDecompose2dScale(transform, XY); + const xStrokePad = XY[0] * this.lineWidth / 2; + const yStrokePad = XY[1] * this.lineWidth / 2; box[0] -= xStrokePad; box[1] -= yStrokePad; box[2] += xStrokePad; @@ -5702,84 +10519,50 @@ return box; } updateClipFromPath() { - const intersect = util.Util.intersect(this.clipBox, this.getPathBoundingBox()); + const intersect = Util.intersect(this.clipBox, this.getPathBoundingBox()); this.startNewPathAndClipBox(intersect || [0, 0, 0, 0]); } isEmptyClip() { - return this.minX === Infinity; + return this.minMax[0] === Infinity; } startNewPathAndClipBox(box) { - this.clipBox = box; - this.minX = Infinity; - this.minY = Infinity; - this.maxX = 0; - this.maxY = 0; + this.clipBox.set(box, 0); + this.minMax.set(F32_BBOX_INIT, 0); } getClippedPathBoundingBox(pathType = PathType.FILL, transform = null) { - return util.Util.intersect(this.clipBox, this.getPathBoundingBox(pathType, transform)); + return Util.intersect(this.clipBox, this.getPathBoundingBox(pathType, transform)); } } function putBinaryImageData(ctx, imgData) { - if (typeof ImageData !== "undefined" && imgData instanceof ImageData) { - ctx.putImageData(imgData, 0, 0); - return; - } - const height = imgData.height, - width = imgData.width; + const { + width, + height, + kind + } = imgData; const partialChunkHeight = height % FULL_CHUNK_HEIGHT; const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); - let srcPos = 0, - destPos; + let srcPos = 0; const src = imgData.data; const dest = chunkImgData.data; - let i, j, thisChunkHeight, elemsInThisChunk; - if (imgData.kind === util.ImageKind.GRAYSCALE_1BPP) { - const srcLength = src.byteLength; - const dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2); - const dest32DataLength = dest32.length; - const fullSrcDiff = width + 7 >> 3; - const white = 0xffffffff; - const black = util.FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + let i; + if (kind === ImageKind.GRAYSCALE_1BPP) { for (i = 0; i < totalChunks; i++) { - thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; - destPos = 0; - for (j = 0; j < thisChunkHeight; j++) { - const srcDiff = srcLength - srcPos; - let k = 0; - const kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7; - const kEndUnrolled = kEnd & ~7; - let mask = 0; - let srcByte = 0; - for (; k < kEndUnrolled; k += 8) { - srcByte = src[srcPos++]; - dest32[destPos++] = srcByte & 128 ? white : black; - dest32[destPos++] = srcByte & 64 ? white : black; - dest32[destPos++] = srcByte & 32 ? white : black; - dest32[destPos++] = srcByte & 16 ? white : black; - dest32[destPos++] = srcByte & 8 ? white : black; - dest32[destPos++] = srcByte & 4 ? white : black; - dest32[destPos++] = srcByte & 2 ? white : black; - dest32[destPos++] = srcByte & 1 ? white : black; - } - for (; k < kEnd; k++) { - if (mask === 0) { - srcByte = src[srcPos++]; - mask = 128; - } - dest32[destPos++] = srcByte & mask ? white : black; - mask >>= 1; - } - } - while (destPos < dest32DataLength) { - dest32[destPos++] = 0; - } + ({ + srcPos + } = convertBlackAndWhiteToRGBA({ + src, + srcPos, + dest, + width, + height: i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight + })); ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); } - } else if (imgData.kind === util.ImageKind.RGBA_32BPP) { - j = 0; - elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4; + } else if (kind === ImageKind.RGBA_32BPP) { + let j = 0; + let elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4; for (i = 0; i < fullChunks; i++) { dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); srcPos += elemsInThisChunk; @@ -5791,25 +10574,21 @@ dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); ctx.putImageData(chunkImgData, 0, j); } - } else if (imgData.kind === util.ImageKind.RGB_24BPP) { - thisChunkHeight = FULL_CHUNK_HEIGHT; - elemsInThisChunk = width * thisChunkHeight; + } else if (kind === ImageKind.RGB_24BPP) { for (i = 0; i < totalChunks; i++) { - if (i >= fullChunks) { - thisChunkHeight = partialChunkHeight; - elemsInThisChunk = width * thisChunkHeight; - } - destPos = 0; - for (j = elemsInThisChunk; j--;) { - dest[destPos++] = src[srcPos++]; - dest[destPos++] = src[srcPos++]; - dest[destPos++] = src[srcPos++]; - dest[destPos++] = 255; - } + ({ + srcPos + } = convertRGBToRGBA({ + src, + srcPos, + dest: new Uint32Array(dest.buffer), + width, + height: i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight + })); ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); } } else { - throw new Error(`bad image kind: ${imgData.kind}`); + throw new Error(`bad image kind: ${kind}`); } } function putBinaryImageMask(ctx, imgData) { @@ -5817,8 +10596,10 @@ ctx.drawImage(imgData.bitmap, 0, 0); return; } - const height = imgData.height, - width = imgData.width; + const { + width, + height + } = imgData; const partialChunkHeight = height % FULL_CHUNK_HEIGHT; const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; @@ -5827,7 +10608,6 @@ const src = imgData.data; const dest = chunkImgData.data; for (let i = 0; i < totalChunks; i++) { - const thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; ({ srcPos } = convertBlackAndWhiteToRGBA({ @@ -5835,7 +10615,7 @@ srcPos, dest, width, - height: thisChunkHeight, + height: i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight, nonBlackColor: 0 })); ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); @@ -5867,126 +10647,65 @@ ctx.setLineDash([]); ctx.lineDashOffset = 0; } - if (!util.isNodeJS) { - const { - filter - } = ctx; - if (filter !== "none" && filter !== "") { - ctx.filter = "none"; - } - } -} -function composeSMaskBackdrop(bytes, r0, g0, b0) { - const length = bytes.length; - for (let i = 3; i < length; i += 4) { - const alpha = bytes[i]; - if (alpha === 0) { - bytes[i - 3] = r0; - bytes[i - 2] = g0; - bytes[i - 1] = b0; - } else if (alpha < 255) { - const alpha_ = 255 - alpha; - bytes[i - 3] = bytes[i - 3] * alpha + r0 * alpha_ >> 8; - bytes[i - 2] = bytes[i - 2] * alpha + g0 * alpha_ >> 8; - bytes[i - 1] = bytes[i - 1] * alpha + b0 * alpha_ >> 8; - } - } -} -function composeSMaskAlpha(maskData, layerData, transferMap) { - const length = maskData.length; - const scale = 1 / 255; - for (let i = 3; i < length; i += 4) { - const alpha = transferMap ? transferMap[maskData[i]] : maskData[i]; - layerData[i] = layerData[i] * alpha * scale | 0; - } -} -function composeSMaskLuminosity(maskData, layerData, transferMap) { - const length = maskData.length; - for (let i = 3; i < length; i += 4) { - const y = maskData[i - 3] * 77 + maskData[i - 2] * 152 + maskData[i - 1] * 28; - layerData[i] = transferMap ? layerData[i] * transferMap[y >> 8] >> 8 : layerData[i] * y >> 16; - } -} -function genericComposeSMask(maskCtx, layerCtx, width, height, subtype, backdrop, transferMap, layerOffsetX, layerOffsetY, maskOffsetX, maskOffsetY) { - const hasBackdrop = !!backdrop; - const r0 = hasBackdrop ? backdrop[0] : 0; - const g0 = hasBackdrop ? backdrop[1] : 0; - const b0 = hasBackdrop ? backdrop[2] : 0; - const composeFn = subtype === "Luminosity" ? composeSMaskLuminosity : composeSMaskAlpha; - const PIXELS_TO_PROCESS = 1048576; - const chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width)); - for (let row = 0; row < height; row += chunkSize) { - const chunkHeight = Math.min(chunkSize, height - row); - const maskData = maskCtx.getImageData(layerOffsetX - maskOffsetX, row + (layerOffsetY - maskOffsetY), width, chunkHeight); - const layerData = layerCtx.getImageData(layerOffsetX, row + layerOffsetY, width, chunkHeight); - if (hasBackdrop) { - composeSMaskBackdrop(maskData.data, r0, g0, b0); - } - composeFn(maskData.data, layerData.data, transferMap); - layerCtx.putImageData(layerData, layerOffsetX, row + layerOffsetY); - } -} -function composeSMask(ctx, smask, layerCtx, layerBox) { - const layerOffsetX = layerBox[0]; - const layerOffsetY = layerBox[1]; - const layerWidth = layerBox[2] - layerOffsetX; - const layerHeight = layerBox[3] - layerOffsetY; - if (layerWidth === 0 || layerHeight === 0) { - return; + const { + filter + } = ctx; + if (filter !== "none" && filter !== "") { + ctx.filter = "none"; } - genericComposeSMask(smask.context, layerCtx, layerWidth, layerHeight, smask.subtype, smask.backdrop, smask.transferMap, layerOffsetX, layerOffsetY, smask.offsetX, smask.offsetY); - ctx.save(); - ctx.globalAlpha = 1; - ctx.globalCompositeOperation = "source-over"; - ctx.setTransform(1, 0, 0, 1, 0, 0); - ctx.drawImage(layerCtx.canvas, 0, 0); - ctx.restore(); } function getImageSmoothingEnabled(transform, interpolate) { - const scale = util.Util.singularValueDecompose2dScale(transform); - scale[0] = Math.fround(scale[0]); - scale[1] = Math.fround(scale[1]); - const actualScale = Math.fround((globalThis.devicePixelRatio || 1) * display_utils.PixelsPerInch.PDF_TO_CSS_UNITS); - if (interpolate !== undefined) { - return interpolate; - } else if (scale[0] <= actualScale || scale[1] <= actualScale) { + if (interpolate) { return true; } - return false; + Util.singularValueDecompose2dScale(transform, XY); + const actualScale = Math.fround(OutputScale.pixelRatio * PixelsPerInch.PDF_TO_CSS_UNITS); + return XY[0] <= actualScale && XY[1] <= actualScale; } const LINE_CAP_STYLES = ["butt", "round", "square"]; const LINE_JOIN_STYLES = ["miter", "round", "bevel"]; const NORMAL_CLIP = {}; const EO_CLIP = {}; class CanvasGraphics { + #knockoutGroupLevel = 0; + #knockoutElementDepth = 0; + #knockoutTempCanvasEntry = null; + #knockoutSavedCtx = null; + #knockoutSavedSMaskCtx = null; + #knockoutSavedGCO = null; + #knockoutElementAlpha = 1; + #knockoutFilterCache; + #knockoutElementGroupMeta = null; + #groupStackMeta = []; constructor(canvasCtx, commonObjs, objs, canvasFactory, filterFactory, { optionalContentConfig, markedContentStack = null - }, annotationCanvasMap, pageColors) { + }, annotationCanvasMap, pageColors, dependencyTracker, imagesTracker) { this.ctx = canvasCtx; this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height); this.stateStack = []; this.pendingClip = null; this.pendingEOFill = false; - this.res = null; - this.xobjs = null; this.commonObjs = commonObjs; this.objs = objs; this.canvasFactory = canvasFactory; this.filterFactory = filterFactory; this.groupStack = []; - this.processingType3 = null; this.baseTransform = null; this.baseTransformStack = []; this.groupLevel = 0; this.smaskStack = []; - this.smaskCounter = 0; this.tempSMask = null; + this.smaskGroupCanvases = []; + this.smaskPreparedEntry = null; + this.smaskPreparedFor = null; + this.smaskPreparedOffsetX = 0; + this.smaskPreparedOffsetY = 0; + this.smaskPreparedOOBAlpha = null; this.suspendedCtx = null; this.contentVisible = true; this.markedContentStack = markedContentStack || []; this.optionalContentConfig = optionalContentConfig; - this.cachedCanvases = new CachedCanvases(this.canvasFactory); this.cachedPatterns = new Map(); this.annotationCanvasMap = annotationCanvasMap; this.viewportScale = 1; @@ -5996,9 +10715,12 @@ this._cachedScaleForStroking = [-1, 0]; this._cachedGetSinglePixelWidth = null; this._cachedBitmapsMap = new Map(); + this.dependencyTracker = dependencyTracker ?? null; + this.imagesTracker = imagesTracker ?? null; } - getObject(data, fallback = null) { + getObject(opIdx, data, fallback = null) { if (typeof data === "string") { + this.dependencyTracker?.recordNamedDependency(opIdx, data); return data.startsWith("g_") ? this.commonObjs.get(data) : this.objs.get(data); } return fallback; @@ -6016,25 +10738,27 @@ this.ctx.fillRect(0, 0, width, height); this.ctx.fillStyle = savedFillStyle; if (transparency) { - const transparentCanvas = this.cachedCanvases.getCanvas("transparent", width, height); + const transparentCanvas = this.transparentCanvasEntry = this.canvasFactory.create(width, height); this.compositeCtx = this.ctx; - this.transparentCanvas = transparentCanvas.canvas; - this.ctx = transparentCanvas.context; + ({ + canvas: this.transparentCanvas, + context: this.ctx + } = transparentCanvas); this.ctx.save(); - this.ctx.transform(...(0,display_utils.getCurrentTransform)(this.compositeCtx)); + this.ctx.transform(...getCurrentTransform(this.compositeCtx)); } this.ctx.save(); resetCtxToDefault(this.ctx); if (transform) { this.ctx.transform(...transform); this.outputScaleX = transform[0]; - this.outputScaleY = transform[0]; + this.outputScaleY = transform[3]; } this.ctx.transform(...viewport.transform); this.viewportScale = viewport.scale; - this.baseTransform = (0,display_utils.getCurrentTransform)(this.ctx); + this.baseTransform = getCurrentTransform(this.ctx); } - executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper) { + executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper, operationsFilter) { const argsArray = operatorList.argsArray; const fnArray = operatorList.fnArray; let i = executionStartIdx || 0; @@ -6047,22 +10771,38 @@ let steps = 0; const commonObjs = this.commonObjs; const objs = this.objs; - let fnId; + let fnId, fnArgs; while (true) { - if (stepper !== undefined && i === stepper.nextBreakPoint) { - stepper.breakIt(i, continueCallback); - return i; - } - fnId = fnArray[i]; - if (fnId !== util.OPS.dependency) { - this[fnId].apply(this, argsArray[i]); - } else { - for (const depObjId of argsArray[i]) { - const objsPool = depObjId.startsWith("g_") ? commonObjs : objs; - if (!objsPool.has(depObjId)) { - objsPool.get(depObjId, continueCallback); + if (stepper !== undefined) { + if (i === stepper.nextBreakPoint) { + stepper.breakIt(i, continueCallback); + return i; + } + if (stepper.shouldSkip(i)) { + if (++i === argsArrayLen) { return i; } + continue; + } + } + if (!operationsFilter || operationsFilter(i)) { + fnId = fnArray[i]; + fnArgs = argsArray[i] ?? null; + if (fnId !== OPS.dependency) { + if (fnArgs === null) { + this[fnId](i); + } else { + this[fnId](i, ...fnArgs); + } + } else { + for (const depObjId of fnArgs) { + this.dependencyTracker?.recordNamedData(depObjId, i); + const objsPool = depObjId.startsWith("g_") ? commonObjs : objs; + if (!objsPool.has(depObjId)) { + objsPool.get(depObjId, continueCallback); + return i; + } + } } } i++; @@ -6082,6 +10822,7 @@ while (this.stateStack.length || this.inSMaskMode) { this.restore(); } + this.current.activeSMask = null; this.ctx.restore(); if (this.transparentCanvas) { this.ctx = this.compositeCtx; @@ -6089,12 +10830,32 @@ this.ctx.setTransform(1, 0, 0, 1, 0, 0); this.ctx.drawImage(this.transparentCanvas, 0, 0); this.ctx.restore(); + this.canvasFactory.destroy(this.transparentCanvasEntry); this.transparentCanvas = null; + this.transparentCanvasEntry = null; } } endDrawing() { this.#restoreInitialState(); - this.cachedCanvases.clear(); + for (const canvas of this.smaskGroupCanvases) { + this.canvasFactory.destroy(canvas); + } + this.smaskGroupCanvases.length = 0; + this._clearPreparedSMask(); + this.tempSMask = null; + this.smaskStack.length = 0; + for (const meta of this.#groupStackMeta) { + this.#destroyKnockoutPools(meta); + } + this.#groupStackMeta.length = 0; + this.#knockoutTempCanvasEntry = null; + this.#knockoutSavedCtx = null; + this.#knockoutSavedSMaskCtx = null; + this.#knockoutSavedGCO = null; + this.#knockoutElementAlpha = 1; + this.#knockoutElementGroupMeta = null; + this.#knockoutElementDepth = 0; + this.#knockoutGroupLevel = 0; this.cachedPatterns.clear(); for (const cache of this._cachedBitmapsMap.values()) { for (const canvas of cache.values()) { @@ -6119,41 +10880,80 @@ } } _scaleImage(img, inverseTransform) { - const width = img.width; - const height = img.height; - let widthScale = Math.max(Math.hypot(inverseTransform[0], inverseTransform[1]), 1); - let heightScale = Math.max(Math.hypot(inverseTransform[2], inverseTransform[3]), 1); + const width = img.width ?? img.displayWidth; + const height = img.height ?? img.displayHeight; + const widthScale = Math.max(Math.hypot(inverseTransform[0], inverseTransform[1]), 1); + const heightScale = Math.max(Math.hypot(inverseTransform[2], inverseTransform[3]), 1); + const scaleSteps = []; + let ws = widthScale, + hs = heightScale, + pw = width, + ph = height; + while (ws > 2 && pw > 1 || hs > 2 && ph > 1) { + let nw = pw, + nh = ph; + if (ws > 2 && pw > 1) { + nw = Math.ceil(pw / 2); + ws /= pw / nw; + } + if (hs > 2 && ph > 1) { + nh = Math.ceil(ph / 2); + hs /= ph / nh; + } + scaleSteps.push({ + newWidth: nw, + newHeight: nh + }); + pw = nw; + ph = nh; + } + if (scaleSteps.length === 0) { + return { + img, + paintWidth: width, + paintHeight: height, + tmpCanvas: null + }; + } + if (scaleSteps.length === 1) { + const { + newWidth, + newHeight + } = scaleSteps[0]; + const tmpCanvas = this.canvasFactory.create(newWidth, newHeight); + tmpCanvas.context.drawImage(img, 0, 0, width, height, 0, 0, newWidth, newHeight); + return { + img: tmpCanvas.canvas, + paintWidth: newWidth, + paintHeight: newHeight, + tmpCanvas + }; + } + let readEntry = this.canvasFactory.create(1, 1); + let writeEntry = this.canvasFactory.create(1, 1); let paintWidth = width, paintHeight = height; - let tmpCanvasId = "prescale1"; - let tmpCanvas, tmpCtx; - while (widthScale > 2 && paintWidth > 1 || heightScale > 2 && paintHeight > 1) { - let newWidth = paintWidth, - newHeight = paintHeight; - if (widthScale > 2 && paintWidth > 1) { - newWidth = paintWidth >= 16384 ? Math.floor(paintWidth / 2) - 1 || 1 : Math.ceil(paintWidth / 2); - widthScale /= paintWidth / newWidth; - } - if (heightScale > 2 && paintHeight > 1) { - newHeight = paintHeight >= 16384 ? Math.floor(paintHeight / 2) - 1 || 1 : Math.ceil(paintHeight) / 2; - heightScale /= paintHeight / newHeight; - } - tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight); - tmpCtx = tmpCanvas.context; - tmpCtx.clearRect(0, 0, newWidth, newHeight); - tmpCtx.drawImage(img, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight); - img = tmpCanvas.canvas; + let source = img; + for (const { + newWidth, + newHeight + } of scaleSteps) { + this.canvasFactory.reset(writeEntry, newWidth, newHeight); + writeEntry.context.drawImage(source, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight); + [readEntry, writeEntry] = [writeEntry, readEntry]; + source = readEntry.canvas; paintWidth = newWidth; paintHeight = newHeight; - tmpCanvasId = tmpCanvasId === "prescale1" ? "prescale2" : "prescale1"; } + this.canvasFactory.destroy(writeEntry); return { - img, + img: readEntry.canvas, paintWidth, - paintHeight + paintHeight, + tmpCanvas: readEntry }; } - _createMaskCanvas(img) { + _createMaskCanvas(opIdx, img) { const ctx = this.ctx; const { width, @@ -6161,20 +10961,17 @@ } = img; const fillColor = this.current.fillColor; const isPatternFill = this.current.patternFill; - const currentTransform = (0,display_utils.getCurrentTransform)(ctx); + const currentTransform = getCurrentTransform(ctx); let cache, cacheKey, scaled, maskCanvas; if ((img.bitmap || img.data) && img.count > 1) { const mainKey = img.bitmap || img.data.buffer; cacheKey = JSON.stringify(isPatternFill ? currentTransform : [currentTransform.slice(0, 4), fillColor]); - cache = this._cachedBitmapsMap.get(mainKey); - if (!cache) { - cache = new Map(); - this._cachedBitmapsMap.set(mainKey, cache); - } + cache = this._cachedBitmapsMap.getOrInsertComputed(mainKey, makeMap); const cachedImage = cache.get(cacheKey); if (cachedImage && !isPatternFill) { const offsetX = Math.round(Math.min(currentTransform[0], currentTransform[2]) + currentTransform[4]); const offsetY = Math.round(Math.min(currentTransform[1], currentTransform[3]) + currentTransform[5]); + this.dependencyTracker?.recordDependencies(opIdx, Dependencies.transformAndFill); return { canvas: cachedImage, offsetX, @@ -6184,111 +10981,140 @@ scaled = cachedImage; } if (!scaled) { - maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); + maskCanvas = this.canvasFactory.create(width, height); putBinaryImageMask(maskCanvas.context, img); } - let maskToCanvas = util.Util.transform(currentTransform, [1 / width, 0, 0, -1 / height, 0, 0]); - maskToCanvas = util.Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]); - const [minX, minY, maxX, maxY] = util.Util.getAxialAlignedBoundingBox([0, 0, width, height], maskToCanvas); + let maskToCanvas = Util.transform(currentTransform, [1 / width, 0, 0, -1 / height, 0, 0]); + maskToCanvas = Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]); + const minMax = F32_BBOX_INIT.slice(); + Util.axialAlignedBoundingBox([0, 0, width, height], maskToCanvas, minMax); + const [minX, minY, maxX, maxY] = minMax; const drawnWidth = Math.round(maxX - minX) || 1; const drawnHeight = Math.round(maxY - minY) || 1; - const fillCanvas = this.cachedCanvases.getCanvas("fillCanvas", drawnWidth, drawnHeight); + const fillCanvas = this.canvasFactory.create(drawnWidth, drawnHeight); const fillCtx = fillCanvas.context; const offsetX = minX; const offsetY = minY; fillCtx.translate(-offsetX, -offsetY); fillCtx.transform(...maskToCanvas); + let scaledEntry = null; if (!scaled) { - scaled = this._scaleImage(maskCanvas.canvas, (0,display_utils.getCurrentTransformInverse)(fillCtx)); - scaled = scaled.img; + const scaleResult = this._scaleImage(maskCanvas.canvas, getCurrentTransformInverse(fillCtx)); + scaled = scaleResult.img; + scaledEntry = scaleResult.tmpCanvas; + if (scaled !== maskCanvas.canvas) { + this.canvasFactory.destroy(maskCanvas); + maskCanvas = null; + } if (cache && isPatternFill) { cache.set(cacheKey, scaled); + scaledEntry = null; + maskCanvas = null; } } - fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled((0,display_utils.getCurrentTransform)(fillCtx), img.interpolate); + fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(fillCtx), img.interpolate); drawImageAtIntegerCoords(fillCtx, scaled, 0, 0, scaled.width, scaled.height, 0, 0, width, height); + if (scaledEntry) { + this.canvasFactory.destroy(scaledEntry); + } + if (maskCanvas) { + this.canvasFactory.destroy(maskCanvas); + } fillCtx.globalCompositeOperation = "source-in"; - const inverse = util.Util.transform((0,display_utils.getCurrentTransformInverse)(fillCtx), [1, 0, 0, 1, -offsetX, -offsetY]); - fillCtx.fillStyle = isPatternFill ? fillColor.getPattern(ctx, this, inverse, PathType.FILL) : fillColor; + const inverse = Util.transform(getCurrentTransformInverse(fillCtx), [1, 0, 0, 1, -offsetX, -offsetY]); + fillCtx.fillStyle = isPatternFill ? fillColor.getPattern(ctx, this, inverse, PathType.FILL, opIdx) : fillColor; fillCtx.fillRect(0, 0, width, height); if (cache && !isPatternFill) { - this.cachedCanvases.delete("fillCanvas"); cache.set(cacheKey, fillCanvas.canvas); } + this.dependencyTracker?.recordDependencies(opIdx, Dependencies.transformAndFill); return { canvas: fillCanvas.canvas, + canvasEntry: cache && !isPatternFill ? null : fillCanvas, offsetX: Math.round(offsetX), offsetY: Math.round(offsetY) }; } - setLineWidth(width) { + setLineWidth(opIdx, width) { + this.dependencyTracker?.recordSimpleData("lineWidth", opIdx); if (width !== this.current.lineWidth) { this._cachedScaleForStroking[0] = -1; } this.current.lineWidth = width; this.ctx.lineWidth = width; } - setLineCap(style) { + setLineCap(opIdx, style) { + this.dependencyTracker?.recordSimpleData("lineCap", opIdx); this.ctx.lineCap = LINE_CAP_STYLES[style]; } - setLineJoin(style) { + setLineJoin(opIdx, style) { + this.dependencyTracker?.recordSimpleData("lineJoin", opIdx); this.ctx.lineJoin = LINE_JOIN_STYLES[style]; } - setMiterLimit(limit) { + setMiterLimit(opIdx, limit) { + this.dependencyTracker?.recordSimpleData("miterLimit", opIdx); this.ctx.miterLimit = limit; } - setDash(dashArray, dashPhase) { + setDash(opIdx, dashArray, dashPhase) { + this.dependencyTracker?.recordSimpleData("dash", opIdx); const ctx = this.ctx; if (ctx.setLineDash !== undefined) { ctx.setLineDash(dashArray); ctx.lineDashOffset = dashPhase; } } - setRenderingIntent(intent) {} - setFlatness(flatness) {} - setGState(states) { + setRenderingIntent(opIdx, intent) {} + setFlatness(opIdx, flatness) {} + setGState(opIdx, states) { for (const [key, value] of states) { switch (key) { case "LW": - this.setLineWidth(value); + this.setLineWidth(opIdx, value); break; case "LC": - this.setLineCap(value); + this.setLineCap(opIdx, value); break; case "LJ": - this.setLineJoin(value); + this.setLineJoin(opIdx, value); break; case "ML": - this.setMiterLimit(value); + this.setMiterLimit(opIdx, value); break; case "D": - this.setDash(value[0], value[1]); + this.setDash(opIdx, value[0], value[1]); break; case "RI": - this.setRenderingIntent(value); + this.setRenderingIntent(opIdx, value); break; case "FL": - this.setFlatness(value); + this.setFlatness(opIdx, value); break; case "Font": - this.setFont(value[0], value[1]); + this.setFont(opIdx, value[0], value[1]); break; case "CA": + this.dependencyTracker?.recordSimpleData("strokeAlpha", opIdx); this.current.strokeAlpha = value; break; case "ca": - this.current.fillAlpha = value; - this.ctx.globalAlpha = value; + this.dependencyTracker?.recordSimpleData("fillAlpha", opIdx); + this.ctx.globalAlpha = this.current.fillAlpha = value; break; case "BM": + this.dependencyTracker?.recordSimpleData("globalCompositeOperation", opIdx); this.ctx.globalCompositeOperation = value; break; case "SMask": + this.dependencyTracker?.recordSimpleData("SMask", opIdx); this.current.activeSMask = value ? this.tempSMask : null; + if (this.current.activeSMask) { + this.current.activeSMask.blendMode = this.ctx.globalCompositeOperation; + } this.tempSMask = null; - this.checkSMaskState(); + this.checkSMaskState(opIdx); break; case "TR": + this.dependencyTracker?.recordSimpleData("filter", opIdx); this.ctx.filter = this.current.transferMaps = this.filterFactory.addFilter(value); break; } @@ -6297,29 +11123,146 @@ get inSMaskMode() { return !!this.suspendedCtx; } - checkSMaskState() { + _clearPreparedSMask() { + if (this.smaskPreparedEntry) { + this.canvasFactory.destroy(this.smaskPreparedEntry); + this.smaskPreparedEntry = null; + } + this.smaskPreparedFor = null; + this.smaskPreparedOffsetX = 0; + this.smaskPreparedOffsetY = 0; + this.smaskPreparedOOBAlpha = null; + } + _ensurePreparedSMask(smask) { + if (smask === this.smaskPreparedFor) { + return; + } + this._clearPreparedSMask(); + this._prepareSMaskCanvas(smask); + } + checkSMaskState(opIdx) { const inSMaskMode = this.inSMaskMode; if (this.current.activeSMask && !inSMaskMode) { - this.beginSMaskMode(); + this.beginSMaskMode(opIdx); } else if (!this.current.activeSMask && inSMaskMode) { this.endSMaskMode(); + } else if (this.current.activeSMask && inSMaskMode) { + this._ensurePreparedSMask(this.current.activeSMask); + } + } + _prepareSMaskCanvas(smask) { + const { + canvas: maskCanvas, + subtype, + backdrop, + transferMap + } = smask; + const hasFilter = subtype === "Luminosity" || subtype === "Alpha" && transferMap; + if (!hasFilter && !(subtype === "Luminosity" && backdrop)) { + this.smaskPreparedFor = smask; + return; + } + let filteredOOBAlpha; + if (subtype === "Luminosity" && backdrop) { + const [r, g, b] = getRGBA(backdrop); + const inputAlpha = Math.round(0.3 * r + 0.59 * g + 0.11 * b); + filteredOOBAlpha = transferMap?.[inputAlpha] ?? inputAlpha; + } else { + filteredOOBAlpha = transferMap?.[0] ?? 0; + } + const SMASK_LAYER_TO_MASK_AREA_RATIO = 4; + const { + width: layerW, + height: layerH + } = this.ctx.canvas; + const maskArea = maskCanvas.width * maskCanvas.height; + const useLayerSize = layerW * layerH < SMASK_LAYER_TO_MASK_AREA_RATIO * maskArea; + const filterSpec = hasFilter ? { + url: subtype === "Alpha" ? this.filterFactory.addAlphaFilter(transferMap) : this.filterFactory.addLuminosityFilter(transferMap), + subtype, + transferMap + } : null; + const bakedBackdrop = subtype === "Luminosity" ? backdrop : null; + let preparedEntry, offsetX, offsetY; + if (useLayerSize) { + preparedEntry = this._bakeSMaskCanvas(maskCanvas, smask.offsetX, smask.offsetY, layerW, layerH, bakedBackdrop, filterSpec); + offsetX = 0; + offsetY = 0; + } else { + preparedEntry = this._bakeSMaskCanvas(maskCanvas, 0, 0, maskCanvas.width, maskCanvas.height, bakedBackdrop, filterSpec); + offsetX = smask.offsetX; + offsetY = smask.offsetY; + } + this.smaskPreparedEntry = preparedEntry; + this.smaskPreparedFor = smask; + this.smaskPreparedOffsetX = offsetX; + this.smaskPreparedOffsetY = offsetY; + this.smaskPreparedOOBAlpha = !useLayerSize && filteredOOBAlpha !== 0 ? filteredOOBAlpha : null; + } + _bakeSMaskCanvas(maskCanvas, drawX, drawY, w, h, backdrop, filterSpec) { + if (!backdrop && !filterSpec) { + unreachable("_bakeSMaskCanvas with neither backdrop nor filter"); + } + const srcEntry = this.canvasFactory.create(w, h); + const sCtx = srcEntry.context; + sCtx.drawImage(maskCanvas, drawX, drawY); + if (backdrop) { + sCtx.globalCompositeOperation = "destination-atop"; + sCtx.fillStyle = backdrop; + sCtx.fillRect(0, 0, w, h); + } + if (!filterSpec) { + return srcEntry; + } + const preparedEntry = this.canvasFactory.create(w, h); + const pCtx = preparedEntry.context; + pCtx.filter = filterSpec.url; + const filterApplied = FeatureTest.isCanvasFilterSupported && pCtx.filter !== "none" && pCtx.filter !== ""; + pCtx.drawImage(srcEntry.canvas, 0, 0); + if (FeatureTest.isCanvasFilterSupported) { + pCtx.filter = "none"; + } + if (!filterApplied) { + const img = pCtx.getImageData(0, 0, w, h); + const { + data + } = img; + const { + transferMap + } = filterSpec; + if (filterSpec.subtype === "Luminosity") { + for (let i = 0, ii = data.length; i < ii; i += 4) { + const a = 0.3 * data[i] + 0.59 * data[i + 1] + 0.11 * data[i + 2] + 0.5 | 0; + data[i] = data[i + 1] = data[i + 2] = 0; + data[i + 3] = transferMap?.[a] ?? a; + } + } else { + for (let i = 3, ii = data.length; i < ii; i += 4) { + data[i] = transferMap[data[i]]; + } + } + pCtx.putImageData(img, 0, 0); } + this.canvasFactory.destroy(srcEntry); + return preparedEntry; } - beginSMaskMode() { + beginSMaskMode(opIdx) { if (this.inSMaskMode) { throw new Error("beginSMaskMode called while already in smask mode"); } - const drawnWidth = this.ctx.canvas.width; - const drawnHeight = this.ctx.canvas.height; - const cacheId = "smaskGroupAt" + this.groupLevel; - const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight); + const { + width: drawnWidth, + height: drawnHeight + } = this.ctx.canvas; + const scratchCanvas = this.canvasFactory.create(drawnWidth, drawnHeight); + this.smaskScratchCanvas = scratchCanvas; this.suspendedCtx = this.ctx; - this.ctx = scratchCanvas.context; - const ctx = this.ctx; - ctx.setTransform(...(0,display_utils.getCurrentTransform)(this.suspendedCtx)); + const ctx = this.ctx = scratchCanvas.context; + ctx.setTransform(this.suspendedCtx.getTransform()); copyCtxState(this.suspendedCtx, ctx); mirrorContextOperations(ctx, this.suspendedCtx); - this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]); + this._ensurePreparedSMask(this.current.activeSMask); + this.setGState(opIdx, [["BM", "source-over"]]); } endSMaskMode() { if (!this.inSMaskMode) { @@ -6329,274 +11272,547 @@ copyCtxState(this.ctx, this.suspendedCtx); this.ctx = this.suspendedCtx; this.suspendedCtx = null; + this.canvasFactory.destroy(this.smaskScratchCanvas); + this.smaskScratchCanvas = null; + this._clearPreparedSMask(); + } + #createKnockoutMaskCanvas(sourceCanvas, reuseEntry = null, alpha = 1) { + const { + width, + height + } = sourceCanvas; + const maskEntry = reuseEntry ?? this.canvasFactory.create(width, height); + const maskCtx = maskEntry.context; + alpha = Math.round(alpha * 255) / 255; + const needsAlphaScaling = alpha < 1; + if (needsAlphaScaling && this.#knockoutFilterCache === undefined) { + this.#knockoutFilterCache = FeatureTest.isCanvasFilterSupported ? new Map() : "none"; + } + let knockoutFilter = "none"; + if (needsAlphaScaling && this.#knockoutFilterCache instanceof Map) { + knockoutFilter = this.#knockoutFilterCache.getOrInsertComputed(alpha, () => this.filterFactory.addKnockoutFilter(alpha)); + } + if (!needsAlphaScaling || knockoutFilter !== "none") { + if (reuseEntry) { + maskCtx.save(); + maskCtx.setTransform(1, 0, 0, 1, 0, 0); + maskCtx.clearRect(0, 0, width, height); + maskCtx.restore(); + } + maskCtx.filter = knockoutFilter; + maskCtx.drawImage(sourceCanvas, 0, 0); + maskCtx.filter = "none"; + return maskEntry; + } + const sourceData = sourceCanvas.getContext("2d", { + willReadFrequently: true + }).getImageData(0, 0, width, height); + const maskData = maskCtx.createImageData(width, height); + const sourcePixels = sourceData.data, + maskPixels = maskData.data; + const alphaScale = alpha > 0 ? 1 / alpha : 1e6; + for (let i = 3, ii = sourcePixels.length; i < ii; i += 4) { + maskPixels[i] = Math.min(Math.round(sourcePixels[i] * alphaScale), 255); + } + maskCtx.putImageData(maskData, 0, 0); + return maskEntry; + } + #getOrCreatePooledEntry(meta, key, width, height) { + let entry = meta?.[key] ?? null; + if (entry && (entry.canvas.width !== width || entry.canvas.height !== height)) { + this.canvasFactory.destroy(entry); + entry = null; + } + if (!entry) { + entry = this.canvasFactory.create(width, height); + if (meta) { + meta[key] = entry; + } + return entry; + } + const ctx = entry.context; + ctx.save(); + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.clearRect(0, 0, width, height); + ctx.restore(); + return entry; + } + #compositeKnockoutSurface(destCtx, surfaceCanvas, options = {}) { + const { + backdropCanvas = null, + destTransform = [1, 0, 0, 1, 0, 0], + backdropOffset = [0, 0], + reuseMaskEntry = null, + poolMeta = null, + sourceAlpha = 1, + sourceFilter = "none", + knockoutAlpha = 1 + } = options; + const { + width, + height + } = surfaceCanvas; + const knockoutMaskEntry = this.#createKnockoutMaskCanvas(surfaceCanvas, reuseMaskEntry, knockoutAlpha); + const sourceCompositeOperation = destCtx.globalCompositeOperation; + destCtx.save(); + destCtx.setTransform(...destTransform); + destCtx.globalAlpha = 1; + if (FeatureTest.isCanvasFilterSupported) { + destCtx.filter = "none"; + } + destCtx.globalCompositeOperation = "destination-out"; + destCtx.drawImage(knockoutMaskEntry.canvas, 0, 0); + if (backdropCanvas) { + const [bx, by] = backdropOffset; + const backdropEntry = this.#getOrCreatePooledEntry(poolMeta, "knockoutBackdropEntry", width, height); + const backdropCtx = backdropEntry.context; + backdropCtx.drawImage(backdropCanvas, bx, by, width, height, 0, 0, width, height); + backdropCtx.globalCompositeOperation = "destination-in"; + backdropCtx.drawImage(knockoutMaskEntry.canvas, 0, 0); + backdropCtx.globalCompositeOperation = "source-over"; + destCtx.globalCompositeOperation = "destination-over"; + destCtx.drawImage(backdropEntry.canvas, 0, 0); + if (!poolMeta) { + this.canvasFactory.destroy(backdropEntry); + } + } + destCtx.globalCompositeOperation = sourceCompositeOperation; + destCtx.globalAlpha = sourceAlpha; + if (FeatureTest.isCanvasFilterSupported) { + destCtx.filter = sourceFilter ?? "none"; + } + destCtx.drawImage(surfaceCanvas, 0, 0); + destCtx.restore(); + if (!reuseMaskEntry) { + this.canvasFactory.destroy(knockoutMaskEntry); + } + } + #beginKnockoutElement(alpha = 1) { + if (this.#knockoutGroupLevel === 0 || this.#knockoutElementDepth > 0 || !this.contentVisible) { + return false; + } + this.#knockoutElementDepth++; + this.#knockoutElementAlpha = alpha; + const groupMeta = this.#groupStackMeta.at(-1); + const { + canvas + } = this.ctx; + const tempEntry = this.#getOrCreatePooledEntry(groupMeta, "knockoutTempEntry", canvas.width, canvas.height); + this.#knockoutTempCanvasEntry = tempEntry; + const tempCtx = tempEntry.context; + tempCtx.save(); + tempCtx.setTransform(this.ctx.getTransform()); + copyCtxState(this.ctx, tempCtx); + this.#knockoutSavedGCO = tempCtx.globalCompositeOperation; + tempCtx.globalCompositeOperation = "source-over"; + mirrorContextOperations(tempCtx, this.ctx); + this.#knockoutElementGroupMeta = groupMeta; + this.#knockoutSavedCtx = this.ctx; + this.#knockoutSavedSMaskCtx = this.suspendedCtx; + this.ctx = tempCtx; + if (this.inSMaskMode) { + this.suspendedCtx = tempCtx; + } + return true; + } + #endKnockoutElement(started) { + if (!started) { + return; + } + const tempEntry = this.#knockoutTempCanvasEntry; + const savedCtx = this.#knockoutSavedCtx; + const savedSMaskCtx = this.#knockoutSavedSMaskCtx; + const tempCtx = tempEntry.context; + this.#knockoutTempCanvasEntry = null; + this.#knockoutSavedCtx = null; + this.#knockoutSavedSMaskCtx = null; + if (this.inSMaskMode && this.suspendedCtx === tempCtx && this.ctx !== tempCtx) { + this.endSMaskMode(); + } + if (this.inSMaskMode) { + this.suspendedCtx = savedSMaskCtx; + } + this.ctx._removeMirroring(); + this.ctx.globalCompositeOperation = this.#knockoutSavedGCO; + this.#knockoutSavedGCO = null; + copyCtxState(this.ctx, savedCtx); + this.ctx = savedCtx; + const groupMeta = this.#knockoutElementGroupMeta; + this.#knockoutElementGroupMeta = null; + const knockoutAlpha = this.#knockoutElementAlpha; + this.#knockoutElementAlpha = 1; + try { + this.#compositeKnockoutSurface(savedSMaskCtx ?? savedCtx, tempEntry.canvas, { + backdropCanvas: groupMeta?.backdropCtx?.canvas ?? null, + backdropOffset: groupMeta?.backdropCtx ? [groupMeta.offsetX, groupMeta.offsetY] : [0, 0], + reuseMaskEntry: groupMeta?.knockoutMaskEntry ?? null, + poolMeta: groupMeta, + knockoutAlpha + }); + } finally { + tempCtx.restore(); + this.#knockoutElementDepth--; + if (!groupMeta) { + this.canvasFactory.destroy(tempEntry); + } + } } compose(dirtyBox) { if (!this.current.activeSMask) { return; } - if (!dirtyBox) { - dirtyBox = [0, 0, this.ctx.canvas.width, this.ctx.canvas.height]; - } else { - dirtyBox[0] = Math.floor(dirtyBox[0]); - dirtyBox[1] = Math.floor(dirtyBox[1]); - dirtyBox[2] = Math.ceil(dirtyBox[2]); - dirtyBox[3] = Math.ceil(dirtyBox[3]); - } + dirtyBox = dirtyBox ? [Math.floor(dirtyBox[0]), Math.floor(dirtyBox[1]), Math.ceil(dirtyBox[2]), Math.ceil(dirtyBox[3])] : [0, 0, this.ctx.canvas.width, this.ctx.canvas.height]; const smask = this.current.activeSMask; const suspendedCtx = this.suspendedCtx; - composeSMask(suspendedCtx, smask, this.ctx, dirtyBox); + const applySMaskInPlace = this.#knockoutElementDepth > 0 && suspendedCtx === this.ctx; + this.composeSMask(applySMaskInPlace ? null : suspendedCtx, smask, this.ctx, dirtyBox); + if (applySMaskInPlace) { + return; + } this.ctx.save(); this.ctx.setTransform(1, 0, 0, 1, 0, 0); this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); this.ctx.restore(); } - save() { + composeSMask(ctx, smask, layerCtx, layerBox) { + const layerOffsetX = layerBox[0]; + const layerOffsetY = layerBox[1]; + const layerWidth = layerBox[2] - layerOffsetX; + const layerHeight = layerBox[3] - layerOffsetY; + if (layerWidth === 0 || layerHeight === 0) { + return; + } + const preparedEntry = this.smaskPreparedEntry; + if (preparedEntry) { + let clipX = layerOffsetX; + let clipY = layerOffsetY; + let clipW = layerWidth; + let clipH = layerHeight; + const oobAlpha = this.smaskPreparedOOBAlpha; + const hasOOBAlpha = oobAlpha !== null; + if (hasOOBAlpha) { + clipX = Math.max(layerOffsetX, smask.offsetX); + clipY = Math.max(layerOffsetY, smask.offsetY); + const x1 = Math.min(layerOffsetX + layerWidth, smask.offsetX + smask.canvas.width); + const y1 = Math.min(layerOffsetY + layerHeight, smask.offsetY + smask.canvas.height); + clipW = x1 - clipX; + clipH = y1 - clipY; + } + if (clipW > 0 && clipH > 0) { + const srcX = clipX - this.smaskPreparedOffsetX; + const srcY = clipY - this.smaskPreparedOffsetY; + layerCtx.save(); + layerCtx.globalAlpha = 1; + layerCtx.setTransform(1, 0, 0, 1, 0, 0); + const clip = new Path2D(); + clip.rect(clipX, clipY, clipW, clipH); + layerCtx.clip(clip); + layerCtx.globalCompositeOperation = "destination-in"; + layerCtx.drawImage(preparedEntry.canvas, srcX, srcY, clipW, clipH, clipX, clipY, clipW, clipH); + layerCtx.restore(); + } + if (hasOOBAlpha && oobAlpha < 255) { + this._applySMaskOOBAlpha(layerCtx, layerOffsetX, layerOffsetY, layerWidth, layerHeight, clipX, clipY, clipX + clipW, clipY + clipH, oobAlpha); + } + } else { + this.genericComposeSMask(smask, layerCtx, layerWidth, layerHeight, layerOffsetX, layerOffsetY); + } + if (!ctx) { + return; + } + ctx.save(); + ctx.globalAlpha = 1; + ctx.globalCompositeOperation = smask.blendMode || "source-over"; + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.drawImage(layerCtx.canvas, layerOffsetX, layerOffsetY, layerWidth, layerHeight, layerOffsetX, layerOffsetY, layerWidth, layerHeight); + ctx.restore(); + } + _applySMaskOOBAlpha(layerCtx, layerOffsetX, layerOffsetY, layerWidth, layerHeight, maskX0, maskY0, maskX1, maskY1, alpha) { + const hasInnerCutout = maskX0 < maskX1 && maskY0 < maskY1; + if (hasInnerCutout && maskX0 === layerOffsetX && maskY0 === layerOffsetY && maskX1 === layerOffsetX + layerWidth && maskY1 === layerOffsetY + layerHeight) { + return; + } + const path = new Path2D(); + path.rect(layerOffsetX, layerOffsetY, layerWidth, layerHeight); + if (hasInnerCutout) { + path.rect(maskX0, maskY0, maskX1 - maskX0, maskY1 - maskY0); + } + layerCtx.save(); + layerCtx.globalAlpha = alpha / 255; + layerCtx.setTransform(1, 0, 0, 1, 0, 0); + layerCtx.clip(path, "evenodd"); + layerCtx.globalCompositeOperation = "destination-in"; + layerCtx.fillStyle = "#000000"; + layerCtx.fillRect(layerOffsetX, layerOffsetY, layerWidth, layerHeight); + layerCtx.restore(); + } + genericComposeSMask(smask, layerCtx, width, height, layerOffsetX, layerOffsetY) { + const { + context: maskCtx, + offsetX: maskOffsetX, + offsetY: maskOffsetY + } = smask; + layerCtx.save(); + layerCtx.globalAlpha = 1; + layerCtx.setTransform(1, 0, 0, 1, 0, 0); + const clip = new Path2D(); + clip.rect(layerOffsetX, layerOffsetY, width, height); + layerCtx.clip(clip); + layerCtx.globalCompositeOperation = "destination-in"; + layerCtx.drawImage(maskCtx.canvas, layerOffsetX - maskOffsetX, layerOffsetY - maskOffsetY, width, height, layerOffsetX, layerOffsetY, width, height); + layerCtx.restore(); + } + save(opIdx) { if (this.inSMaskMode) { copyCtxState(this.ctx, this.suspendedCtx); - this.suspendedCtx.save(); - } else { - this.ctx.save(); } + this.ctx.save(); const old = this.current; this.stateStack.push(old); this.current = old.clone(); + this.dependencyTracker?.save(opIdx); } - restore() { - if (this.stateStack.length === 0 && this.inSMaskMode) { - this.endSMaskMode(); - } - if (this.stateStack.length !== 0) { - this.current = this.stateStack.pop(); + restore(opIdx) { + this.dependencyTracker?.restore(opIdx); + if (this.stateStack.length === 0) { if (this.inSMaskMode) { - this.suspendedCtx.restore(); - copyCtxState(this.suspendedCtx, this.ctx); - } else { - this.ctx.restore(); + this.endSMaskMode(); } - this.checkSMaskState(); - this.pendingClip = null; - this._cachedScaleForStroking[0] = -1; - this._cachedGetSinglePixelWidth = null; + return; + } + this.current = this.stateStack.pop(); + this.ctx.restore(); + if (this.inSMaskMode) { + copyCtxState(this.suspendedCtx, this.ctx); + this.ctx.setTransform(this.suspendedCtx.getTransform()); } + this.checkSMaskState(opIdx); + this.pendingClip = null; + this._cachedScaleForStroking[0] = -1; + this._cachedGetSinglePixelWidth = null; } - transform(a, b, c, d, e, f) { + transform(opIdx, a, b, c, d, e, f) { + this.dependencyTracker?.recordIncrementalData("transform", opIdx); this.ctx.transform(a, b, c, d, e, f); this._cachedScaleForStroking[0] = -1; this._cachedGetSinglePixelWidth = null; } - constructPath(ops, args, minMax) { - const ctx = this.ctx; - const current = this.current; - let x = current.x, - y = current.y; - let startX, startY; - const currentTransform = (0,display_utils.getCurrentTransform)(ctx); - const isScalingMatrix = currentTransform[0] === 0 && currentTransform[3] === 0 || currentTransform[1] === 0 && currentTransform[2] === 0; - const minMaxForBezier = isScalingMatrix ? minMax.slice(0) : null; - for (let i = 0, j = 0, ii = ops.length; i < ii; i++) { - switch (ops[i] | 0) { - case util.OPS.rectangle: - x = args[j++]; - y = args[j++]; - const width = args[j++]; - const height = args[j++]; - const xw = x + width; - const yh = y + height; - ctx.moveTo(x, y); - if (width === 0 || height === 0) { - ctx.lineTo(xw, yh); - } else { - ctx.lineTo(xw, y); - ctx.lineTo(xw, yh); - ctx.lineTo(x, yh); - } - if (!isScalingMatrix) { - current.updateRectMinMax(currentTransform, [x, y, xw, yh]); - } - ctx.closePath(); - break; - case util.OPS.moveTo: - x = args[j++]; - y = args[j++]; - ctx.moveTo(x, y); - if (!isScalingMatrix) { - current.updatePathMinMax(currentTransform, x, y); - } - break; - case util.OPS.lineTo: - x = args[j++]; - y = args[j++]; - ctx.lineTo(x, y); - if (!isScalingMatrix) { - current.updatePathMinMax(currentTransform, x, y); - } - break; - case util.OPS.curveTo: - startX = x; - startY = y; - x = args[j + 4]; - y = args[j + 5]; - ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], x, y); - current.updateCurvePathMinMax(currentTransform, startX, startY, args[j], args[j + 1], args[j + 2], args[j + 3], x, y, minMaxForBezier); - j += 6; - break; - case util.OPS.curveTo2: - startX = x; - startY = y; - ctx.bezierCurveTo(x, y, args[j], args[j + 1], args[j + 2], args[j + 3]); - current.updateCurvePathMinMax(currentTransform, startX, startY, x, y, args[j], args[j + 1], args[j + 2], args[j + 3], minMaxForBezier); - x = args[j + 2]; - y = args[j + 3]; - j += 4; - break; - case util.OPS.curveTo3: - startX = x; - startY = y; - x = args[j + 2]; - y = args[j + 3]; - ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y); - current.updateCurvePathMinMax(currentTransform, startX, startY, args[j], args[j + 1], x, y, x, y, minMaxForBezier); - j += 4; - break; - case util.OPS.closePath: - ctx.closePath(); - break; + constructPath(opIdx, op, data, minMax) { + let [path] = data; + if (!minMax) { + path ||= data[0] = new Path2D(); + if (op !== OPS.stroke && op !== OPS.closeStroke) { + this.current.tilingPatternDims = null; + } + this[op](opIdx, path); + return; + } + if (this.dependencyTracker !== null) { + const outerExtraSize = op === OPS.stroke ? this.current.lineWidth / 2 : 0; + this.dependencyTracker.resetBBox(opIdx).recordBBox(opIdx, this.ctx, minMax[0] - outerExtraSize, minMax[2] + outerExtraSize, minMax[1] - outerExtraSize, minMax[3] + outerExtraSize).recordDependencies(opIdx, ["transform"]); + } + if (!(path instanceof Path2D)) { + path = data[0] = makePathFromDrawOPS(path); + } + Util.axialAlignedBoundingBox(minMax, getCurrentTransform(this.ctx), this.current.minMax); + const tilingDims = this.current.tilingPatternDims; + if (tilingDims && op !== OPS.stroke && op !== OPS.closeStroke && this.current.fillColor instanceof TilingPattern) { + const clippedBBox = Util.intersect(this.current.clipBox, this.current.minMax); + if (!clippedBBox) { + this.current.tilingPatternDims = null; + } else { + this.current.fillColor.updatePatternDims(clippedBBox, tilingDims); } } - if (isScalingMatrix) { - current.updateScalingPathMinMax(currentTransform, minMaxForBezier); - } - current.setCurrentPoint(x, y); + this[op](opIdx, path); + this._pathStartIdx = opIdx; } - closePath() { + closePath(opIdx) { this.ctx.closePath(); } - stroke(consumePath = true) { + stroke(opIdx, path, consumePath = true) { + const started = consumePath && this.#beginKnockoutElement(this.current.strokeAlpha); const ctx = this.ctx; const strokeColor = this.current.strokeColor; ctx.globalAlpha = this.current.strokeAlpha; if (this.contentVisible) { if (typeof strokeColor === "object" && strokeColor?.getPattern) { + const baseTransform = strokeColor.isModifyingCurrentTransform() ? ctx.getTransform() : null; ctx.save(); - ctx.strokeStyle = strokeColor.getPattern(ctx, this, (0,display_utils.getCurrentTransformInverse)(ctx), PathType.STROKE); - this.rescaleAndStroke(false); + ctx.strokeStyle = strokeColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.STROKE, opIdx); + if (baseTransform) { + const newPath = new Path2D(); + newPath.addPath(path, ctx.getTransform().invertSelf().multiplySelf(baseTransform)); + path = newPath; + } + this.rescaleAndStroke(path, false); ctx.restore(); } else { - this.rescaleAndStroke(true); + this.rescaleAndStroke(path, true); } } + this.dependencyTracker?.recordDependencies(opIdx, Dependencies.stroke); if (consumePath) { - this.consumePath(this.current.getClippedPathBoundingBox()); + this.consumePath(opIdx, path, this.current.getClippedPathBoundingBox(PathType.STROKE, getCurrentTransform(this.ctx))); } ctx.globalAlpha = this.current.fillAlpha; + this.#endKnockoutElement(started); } - closeStroke() { - this.closePath(); - this.stroke(); + closeStroke(opIdx, path) { + this.stroke(opIdx, path); } - fill(consumePath = true) { + fill(opIdx, path, consumePath = true) { + const started = consumePath && this.#beginKnockoutElement(this.current.fillAlpha); const ctx = this.ctx; const fillColor = this.current.fillColor; const isPatternFill = this.current.patternFill; let needRestore = false; + const intersect = this.current.getClippedPathBoundingBox(); + this.dependencyTracker?.recordDependencies(opIdx, Dependencies.fill); if (isPatternFill) { + const dims = this.current.tilingPatternDims; + const tileIdx = dims && fillColor.canSkipPatternCanvas(dims); + if (tileIdx) { + fillColor.drawPattern(this, path, this.pendingEOFill, tileIdx, opIdx); + this.pendingEOFill = false; + if (consumePath) { + this.consumePath(opIdx, path, intersect); + } + this.current.tilingPatternDims = null; + this.#endKnockoutElement(started); + return; + } + const baseTransform = fillColor.isModifyingCurrentTransform() ? ctx.getTransform() : null; + this.dependencyTracker?.save(opIdx); ctx.save(); - ctx.fillStyle = fillColor.getPattern(ctx, this, (0,display_utils.getCurrentTransformInverse)(ctx), PathType.FILL); + ctx.fillStyle = fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL, opIdx); + if (baseTransform) { + const newPath = new Path2D(); + newPath.addPath(path, ctx.getTransform().invertSelf().multiplySelf(baseTransform)); + path = newPath; + } needRestore = true; } - const intersect = this.current.getClippedPathBoundingBox(); if (this.contentVisible && intersect !== null) { if (this.pendingEOFill) { - ctx.fill("evenodd"); + ctx.fill(path, "evenodd"); this.pendingEOFill = false; } else { - ctx.fill(); + ctx.fill(path); } } if (needRestore) { ctx.restore(); + this.dependencyTracker?.restore(opIdx); } if (consumePath) { - this.consumePath(intersect); + this.consumePath(opIdx, path, intersect); } + this.#endKnockoutElement(started); } - eoFill() { + eoFill(opIdx, path) { this.pendingEOFill = true; - this.fill(); + this.fill(opIdx, path); } - fillStroke() { - this.fill(false); - this.stroke(false); - this.consumePath(); + fillStroke(opIdx, path) { + const started = this.#beginKnockoutElement(Math.min(this.current.fillAlpha, this.current.strokeAlpha)); + this.fill(opIdx, path, false); + this.stroke(opIdx, path, false); + this.consumePath(opIdx, path); + this.#endKnockoutElement(started); } - eoFillStroke() { + eoFillStroke(opIdx, path) { this.pendingEOFill = true; - this.fillStroke(); + this.fillStroke(opIdx, path); } - closeFillStroke() { - this.closePath(); - this.fillStroke(); + closeFillStroke(opIdx, path) { + this.fillStroke(opIdx, path); } - closeEOFillStroke() { + closeEOFillStroke(opIdx, path) { this.pendingEOFill = true; - this.closePath(); - this.fillStroke(); + this.fillStroke(opIdx, path); } - endPath() { - this.consumePath(); + endPath(opIdx, path) { + this.consumePath(opIdx, path); } - clip() { + rawFillPath(opIdx, path) { + const started = this.#beginKnockoutElement(this.current.fillAlpha); + this.ctx.fill(path); + this.dependencyTracker?.recordDependencies(opIdx, Dependencies.rawFillPath).recordOperation(opIdx); + this.#endKnockoutElement(started); + } + clip(opIdx) { + this.dependencyTracker?.recordFutureForcedDependency("clipMode", opIdx); this.pendingClip = NORMAL_CLIP; } - eoClip() { + eoClip(opIdx) { + this.dependencyTracker?.recordFutureForcedDependency("clipMode", opIdx); this.pendingClip = EO_CLIP; } - beginText() { - this.current.textMatrix = util.IDENTITY_MATRIX; + beginText(opIdx) { + this.current.textMatrix = null; this.current.textMatrixScale = 1; this.current.x = this.current.lineX = 0; this.current.y = this.current.lineY = 0; + this.dependencyTracker?.recordOpenMarker(opIdx).resetIncrementalData("sameLineText").resetIncrementalData("moveText", opIdx); } - endText() { + endText(opIdx) { const paths = this.pendingTextPaths; const ctx = this.ctx; - if (paths === undefined) { - ctx.beginPath(); - return; + if (this.dependencyTracker) { + const { + dependencyTracker + } = this; + if (paths !== undefined) { + dependencyTracker.recordFutureForcedDependency("textClip", dependencyTracker.getOpenMarker()).recordFutureForcedDependency("textClip", opIdx); + } + dependencyTracker.recordCloseMarker(opIdx); } - ctx.save(); - ctx.beginPath(); - for (const path of paths) { - ctx.setTransform(...path.transform); - ctx.translate(path.x, path.y); - path.addToPath(ctx, path.fontSize); + if (paths !== undefined) { + const newPath = new Path2D(); + const invTransf = ctx.getTransform().invertSelf(); + for (const { + transform, + x, + y, + fontSize, + path + } of paths) { + if (!path) { + continue; + } + newPath.addPath(path, new DOMMatrix(transform).preMultiplySelf(invTransf).translate(x, y).scale(fontSize, -fontSize)); + } + ctx.clip(newPath); } - ctx.restore(); - ctx.clip(); - ctx.beginPath(); delete this.pendingTextPaths; } - setCharSpacing(spacing) { + setCharSpacing(opIdx, spacing) { + this.dependencyTracker?.recordSimpleData("charSpacing", opIdx); this.current.charSpacing = spacing; } - setWordSpacing(spacing) { + setWordSpacing(opIdx, spacing) { + this.dependencyTracker?.recordSimpleData("wordSpacing", opIdx); this.current.wordSpacing = spacing; } - setHScale(scale) { + setHScale(opIdx, scale) { + this.dependencyTracker?.recordSimpleData("hScale", opIdx); this.current.textHScale = scale / 100; } - setLeading(leading) { + setLeading(opIdx, leading) { + this.dependencyTracker?.recordSimpleData("leading", opIdx); this.current.leading = -leading; } - setFont(fontRefName, size) { + setFont(opIdx, fontRefName, size) { + this.dependencyTracker?.recordSimpleData("font", opIdx).recordSimpleDataFromNamed("fontObj", fontRefName, opIdx); const fontObj = this.commonObjs.get(fontRefName); const current = this.current; if (!fontObj) { throw new Error(`Can't find font for ${fontRefName}`); } - current.fontMatrix = fontObj.fontMatrix || util.FONT_IDENTITY_MATRIX; + current.fontMatrix = fontObj.fontMatrix || FONT_IDENTITY_MATRIX; if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) { - (0,util.warn)("Invalid font matrix for font " + fontRefName); + warn("Invalid font matrix for font " + fontRefName); } if (size < 0) { size = -size; @@ -6618,92 +11834,128 @@ bold = "bold"; } const italic = fontObj.italic ? "italic" : "normal"; - let browserFontSize = size; - if (size < MIN_FONT_SIZE) { - browserFontSize = MIN_FONT_SIZE; - } else if (size > MAX_FONT_SIZE) { - browserFontSize = MAX_FONT_SIZE; - } + const browserFontSize = MathClamp(size, MIN_FONT_SIZE, MAX_FONT_SIZE); this.current.fontSizeScale = size / browserFontSize; this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`; } - setTextRenderingMode(mode) { + setTextRenderingMode(opIdx, mode) { + this.dependencyTracker?.recordSimpleData("textRenderingMode", opIdx); this.current.textRenderingMode = mode; } - setTextRise(rise) { + setTextRise(opIdx, rise) { + this.dependencyTracker?.recordSimpleData("textRise", opIdx); this.current.textRise = rise; } - moveText(x, y) { + moveText(opIdx, x, y) { + this.dependencyTracker?.resetIncrementalData("sameLineText").recordIncrementalData("moveText", opIdx); this.current.x = this.current.lineX += x; this.current.y = this.current.lineY += y; } - setLeadingMoveText(x, y) { - this.setLeading(-y); - this.moveText(x, y); - } - setTextMatrix(a, b, c, d, e, f) { - this.current.textMatrix = [a, b, c, d, e, f]; - this.current.textMatrixScale = Math.hypot(a, b); - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; + setLeadingMoveText(opIdx, x, y) { + this.setLeading(opIdx, -y); + this.moveText(opIdx, x, y); } - nextLine() { - this.moveText(0, this.current.leading); + setTextMatrix(opIdx, matrix) { + this.dependencyTracker?.resetIncrementalData("sameLineText").recordSimpleData("textMatrix", opIdx); + const { + current + } = this; + current.textMatrix = matrix; + current.textMatrixScale = Math.hypot(matrix[0], matrix[1]); + current.x = current.lineX = 0; + current.y = current.lineY = 0; + } + nextLine(opIdx) { + this.moveText(opIdx, 0, this.current.leading); + this.dependencyTracker?.recordIncrementalData("moveText", this.dependencyTracker.getSimpleIndex("leading") ?? opIdx); + } + #getScaledPath(path, currentTransform, transform) { + const newPath = new Path2D(); + newPath.addPath(path, new DOMMatrix(transform).invertSelf().multiplySelf(currentTransform)); + return newPath; } - paintChar(character, x, y, patternTransform) { + paintChar(opIdx, character, x, y, patternFillTransform, patternStrokeTransform) { const ctx = this.ctx; const current = this.current; const font = current.font; const textRenderingMode = current.textRenderingMode; const fontSize = current.fontSize / current.fontSizeScale; - const fillStrokeMode = textRenderingMode & util.TextRenderingMode.FILL_STROKE_MASK; - const isAddToPathSet = !!(textRenderingMode & util.TextRenderingMode.ADD_TO_PATH_FLAG); + const fillStrokeMode = textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; + const isAddToPathSet = !!(textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG); const patternFill = current.patternFill && !font.missingFile; - let addToPath; - if (font.disableFontFace || isAddToPathSet || patternFill) { - addToPath = font.getPathGenerator(this.commonObjs, character); + const patternStroke = current.patternStroke && !font.missingFile; + let path; + if ((font.disableFontFace || isAddToPathSet || patternFill || patternStroke) && !font.missingFile) { + path = font.getPathGenerator(this.commonObjs, character); } - if (font.disableFontFace || patternFill) { + if (path && (font.disableFontFace || patternFill || patternStroke)) { ctx.save(); ctx.translate(x, y); - ctx.beginPath(); - addToPath(ctx, fontSize); - if (patternTransform) { - ctx.setTransform(...patternTransform); - } - if (fillStrokeMode === util.TextRenderingMode.FILL || fillStrokeMode === util.TextRenderingMode.FILL_STROKE) { - ctx.fill(); + ctx.scale(fontSize, -fontSize); + this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font); + let currentTransform; + if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + if (patternFillTransform) { + currentTransform = ctx.getTransform(); + ctx.setTransform(...patternFillTransform); + const scaledPath = this.#getScaledPath(path, currentTransform, patternFillTransform); + ctx.fill(scaledPath); + } else { + ctx.fill(path); + } } - if (fillStrokeMode === util.TextRenderingMode.STROKE || fillStrokeMode === util.TextRenderingMode.FILL_STROKE) { - ctx.stroke(); + if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + if (patternStrokeTransform) { + currentTransform ||= ctx.getTransform(); + ctx.setTransform(...patternStrokeTransform); + const { + a, + b, + c, + d + } = currentTransform; + const invPatternTransform = Util.inverseTransform(patternStrokeTransform); + const transf = Util.transform([a, b, c, d, 0, 0], invPatternTransform); + Util.singularValueDecompose2dScale(transf, XY); + ctx.lineWidth *= Math.max(XY[0], XY[1]) / fontSize; + ctx.stroke(this.#getScaledPath(path, currentTransform, patternStrokeTransform)); + } else { + ctx.lineWidth /= fontSize; + ctx.stroke(path); + } } ctx.restore(); } else { - if (fillStrokeMode === util.TextRenderingMode.FILL || fillStrokeMode === util.TextRenderingMode.FILL_STROKE) { + if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) { ctx.fillText(character, x, y); + this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font, fontSize, x, y, () => ctx.measureText(character)); } - if (fillStrokeMode === util.TextRenderingMode.STROKE || fillStrokeMode === util.TextRenderingMode.FILL_STROKE) { + if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + if (this.dependencyTracker) { + this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font, fontSize, x, y, () => ctx.measureText(character)).recordDependencies(opIdx, Dependencies.stroke); + } ctx.strokeText(character, x, y); } } if (isAddToPathSet) { const paths = this.pendingTextPaths ||= []; paths.push({ - transform: (0,display_utils.getCurrentTransform)(ctx), + transform: getCurrentTransform(ctx), x, y, fontSize, - addToPath + path }); + this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font, fontSize, x, y); } } get isFontSubpixelAAEnabled() { - const { - context: ctx - } = this.cachedCanvases.getCanvas("isFontSubpixelAAEnabled", 10, 10); + const tmpCanvas = this.canvasFactory.create(10, 10); + const ctx = tmpCanvas.context; ctx.scale(1.5, 1); ctx.fillText("I", 0, 10); const data = ctx.getImageData(0, 0, 10, 10).data; + this.canvasFactory.destroy(tmpCanvas); let enabled = false; for (let i = 3; i < data.length; i += 4) { if (data[i] > 0 && data[i] < 255) { @@ -6711,18 +11963,30 @@ break; } } - return (0,util.shadow)(this, "isFontSubpixelAAEnabled", enabled); + return shadow(this, "isFontSubpixelAAEnabled", enabled); } - showText(glyphs) { + showText(opIdx, glyphs) { + if (this.dependencyTracker) { + this.dependencyTracker.recordDependencies(opIdx, Dependencies.showText).resetBBox(opIdx); + if (this.current.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG) { + this.dependencyTracker.recordFutureForcedDependency("textClip", opIdx).inheritPendingDependenciesAsFutureForcedDependencies(); + } + } const current = this.current; const font = current.font; if (font.isType3Font) { - return this.showType3Text(glyphs); + const started = this.#beginKnockoutElement(current.fillAlpha); + this.showType3Text(opIdx, glyphs); + this.dependencyTracker?.recordShowTextOperation(opIdx); + this.#endKnockoutElement(started); + return; } const fontSize = current.fontSize; if (fontSize === 0) { - return undefined; + this.dependencyTracker?.recordOperation(opIdx); + return; } + const started = this.#beginKnockoutElement(current.fillAlpha); const ctx = this.ctx; const fontSizeScale = current.fontSizeScale; const charSpacing = current.charSpacing; @@ -6734,28 +11998,25 @@ const spacingDir = vertical ? 1 : -1; const defaultVMetrics = font.defaultVMetrics; const widthAdvanceScale = fontSize * current.fontMatrix[0]; - const simpleFillText = current.textRenderingMode === util.TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill; + const simpleFillText = current.textRenderingMode === TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill; ctx.save(); - ctx.transform(...current.textMatrix); + if (current.textMatrix) { + ctx.transform(...current.textMatrix); + } ctx.translate(current.x, current.y + current.textRise); if (fontDirection > 0) { ctx.scale(textHScale, -1); } else { ctx.scale(textHScale, 1); } - let patternTransform; - if (current.patternFill) { - ctx.save(); - const pattern = current.fillColor.getPattern(ctx, this, (0,display_utils.getCurrentTransformInverse)(ctx), PathType.FILL); - patternTransform = (0,display_utils.getCurrentTransform)(ctx); - ctx.restore(); - ctx.fillStyle = pattern; - } + let patternFillTransform, patternStrokeTransform; + const fillStrokeMode = current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; + const needsFill = fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE; + const needsStroke = fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE; let lineWidth = current.lineWidth; const scale = current.textMatrixScale; if (scale === 0 || lineWidth === 0) { - const fillStrokeMode = current.textRenderingMode & util.TextRenderingMode.FILL_STROKE_MASK; - if (fillStrokeMode === util.TextRenderingMode.STROKE || fillStrokeMode === util.TextRenderingMode.FILL_STROKE) { + if (needsStroke) { lineWidth = this.getSinglePixelWidth(); } } else { @@ -6766,6 +12027,20 @@ lineWidth /= fontSizeScale; } ctx.lineWidth = lineWidth; + if (needsFill && current.patternFill) { + ctx.save(); + const pattern = current.fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL, opIdx); + patternFillTransform = getCurrentTransform(ctx); + ctx.restore(); + ctx.fillStyle = pattern; + } + if (needsStroke && current.patternStroke) { + ctx.save(); + const pattern = current.strokeColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.STROKE, opIdx); + patternStrokeTransform = getCurrentTransform(ctx); + ctx.restore(); + ctx.strokeStyle = pattern; + } if (font.isInvalidPDFjsFont) { const chars = []; let width = 0; @@ -6773,11 +12048,17 @@ chars.push(glyph.unicode); width += glyph.width; } - ctx.fillText(chars.join(""), 0, 0); + const joinedChars = chars.join(""); + ctx.fillText(joinedChars, 0, 0); + if (this.dependencyTracker !== null) { + const measure = ctx.measureText(joinedChars); + this.dependencyTracker.recordBBox(opIdx, this.ctx, -measure.actualBoundingBoxLeft, measure.actualBoundingBoxRight, -measure.actualBoundingBoxAscent, measure.actualBoundingBoxDescent).recordShowTextOperation(opIdx); + } current.x += width * widthAdvanceScale * textHScale; ctx.restore(); this.compose(); - return undefined; + this.#endKnockoutElement(started); + return; } let x = 0, i; @@ -6804,8 +12085,10 @@ scaledX = x / fontSizeScale; scaledY = 0; } + let measure; if (font.remeasure && width > 0) { - const measuredWidth = ctx.measureText(character).width * 1000 / fontSize * fontSizeScale; + measure = ctx.measureText(character); + const measuredWidth = measure.width * 1000 / fontSize * fontSizeScale; if (width < measuredWidth && this.isFontSubpixelAAEnabled) { const characterScaleX = width / measuredWidth; restoreNeeded = true; @@ -6819,12 +12102,15 @@ if (this.contentVisible && (glyph.isInFont || font.missingFile)) { if (simpleFillText && !accent) { ctx.fillText(character, scaledX, scaledY); + this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, measure ? { + bbox: null + } : font, fontSize / fontSizeScale, scaledX, scaledY, () => measure ?? ctx.measureText(character)); } else { - this.paintChar(character, scaledX, scaledY, patternTransform); + this.paintChar(opIdx, character, scaledX, scaledY, patternFillTransform, patternStrokeTransform); if (accent) { const scaledAccentX = scaledX + fontSize * accent.offset.x / fontSizeScale; const scaledAccentY = scaledY - fontSize * accent.offset.y / fontSizeScale; - this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY, patternTransform); + this.paintChar(opIdx, accent.fontChar, scaledAccentX, scaledAccentY, patternFillTransform, patternStrokeTransform); } } } @@ -6841,9 +12127,10 @@ } ctx.restore(); this.compose(); - return undefined; + this.dependencyTracker?.recordShowTextOperation(opIdx); + this.#endKnockoutElement(started); } - showType3Text(glyphs) { + showType3Text(opIdx, glyphs) { const ctx = this.ctx; const current = this.current; const font = current.font; @@ -6853,9 +12140,9 @@ const charSpacing = current.charSpacing; const wordSpacing = current.wordSpacing; const textHScale = current.textHScale * fontDirection; - const fontMatrix = current.fontMatrix || util.FONT_IDENTITY_MATRIX; + const fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX; const glyphsLength = glyphs.length; - const isTextInvisible = current.textRenderingMode === util.TextRenderingMode.INVISIBLE; + const isTextInvisible = current.textRenderingMode === TextRenderingMode.INVISIBLE; let i, glyph, width, spacingLength; if (isTextInvisible || fontSize === 0) { return; @@ -6863,9 +12150,13 @@ this._cachedScaleForStroking[0] = -1; this._cachedGetSinglePixelWidth = null; ctx.save(); - ctx.transform(...current.textMatrix); - ctx.translate(current.x, current.y); + if (current.textMatrix) { + ctx.transform(...current.textMatrix); + } + ctx.translate(current.x, current.y + current.textRise); ctx.scale(textHScale, fontDirection); + const dependencyTracker = this.dependencyTracker; + this.dependencyTracker = dependencyTracker ? new CanvasNestedDependencyTracker(dependencyTracker, opIdx) : null; for (i = 0; i < glyphsLength; ++i) { glyph = glyphs[i]; if (typeof glyph === "number") { @@ -6877,72 +12168,92 @@ const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; const operatorList = font.charProcOperatorList[glyph.operatorListId]; if (!operatorList) { - (0,util.warn)(`Type3 character "${glyph.operatorListId}" is not available.`); - continue; - } - if (this.contentVisible) { - this.processingType3 = glyph; + warn(`Type3 character "${glyph.operatorListId}" is not available.`); + } else if (this.contentVisible) { this.save(); + if (operatorList.fnArray[0] === OPS.setCharWidth) { + current.fillAlpha = current.strokeAlpha = 1; + ctx.globalAlpha = 1; + } ctx.scale(fontSize, fontSize); ctx.transform(...fontMatrix); this.executeOperatorList(operatorList); this.restore(); } - const transformed = util.Util.applyTransform([glyph.width, 0], fontMatrix); - width = transformed[0] * fontSize + spacing; + const p = [glyph.width, 0]; + Util.applyTransform(p, fontMatrix); + width = p[0] * fontSize + spacing; ctx.translate(width, 0); current.x += width * textHScale; } ctx.restore(); - this.processingType3 = null; + if (dependencyTracker) { + this.dependencyTracker = dependencyTracker; + } } - setCharWidth(xWidth, yWidth) {} - setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) { - this.ctx.rect(llx, lly, urx - llx, ury - lly); - this.ctx.clip(); - this.endPath(); + setCharWidth(opIdx, xWidth, yWidth) {} + setCharWidthAndBounds(opIdx, xWidth, yWidth, llx, lly, urx, ury) { + const clip = new Path2D(); + clip.rect(llx, lly, urx - llx, ury - lly); + this.ctx.clip(clip); + this.dependencyTracker?.recordBBox(opIdx, this.ctx, llx, urx, lly, ury).recordClipBox(opIdx, this.ctx, llx, urx, lly, ury); + this.endPath(opIdx); } - getColorN_Pattern(IR) { + getColorN_Pattern(opIdx, IR) { let pattern; if (IR[0] === "TilingPattern") { - const color = IR[1]; - const baseTransform = this.baseTransform || (0,display_utils.getCurrentTransform)(this.ctx); + const baseTransform = this.baseTransform || getCurrentTransform(this.ctx); const canvasGraphicsFactory = { - createCanvasGraphics: ctx => new CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, { + createCanvasGraphics: (ctx, renderingOpIdx) => new CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, { optionalContentConfig: this.optionalContentConfig, markedContentStack: this.markedContentStack - }) + }, undefined, undefined, this.dependencyTracker ? new CanvasNestedDependencyTracker(this.dependencyTracker, renderingOpIdx, true) : null) }; - pattern = new TilingPattern(IR, color, this.ctx, canvasGraphicsFactory, baseTransform); + pattern = new TilingPattern(IR, this.ctx, canvasGraphicsFactory, baseTransform); } else { - pattern = this._getPattern(IR[1], IR[2]); + pattern = this._getPattern(opIdx, IR[1], IR[2]); } return pattern; } - setStrokeColorN() { - this.current.strokeColor = this.getColorN_Pattern(arguments); - } - setFillColorN() { - this.current.fillColor = this.getColorN_Pattern(arguments); + setStrokeColorN(opIdx, ...args) { + this.dependencyTracker?.recordSimpleData("strokeColor", opIdx); + this.current.strokeColor = this.getColorN_Pattern(opIdx, args); + this.current.patternStroke = true; + } + setFillColorN(opIdx, ...args) { + this.dependencyTracker?.recordSimpleData("fillColor", opIdx); + const pattern = this.current.fillColor = this.getColorN_Pattern(opIdx, args); this.current.patternFill = true; + this.current.tilingPatternDims = pattern instanceof TilingPattern ? [0, 0, 0, 0] : null; } - setStrokeRGBColor(r, g, b) { - const color = util.Util.makeHexColor(r, g, b); - this.ctx.strokeStyle = color; - this.current.strokeColor = color; - } - setFillRGBColor(r, g, b) { - const color = util.Util.makeHexColor(r, g, b); - this.ctx.fillStyle = color; - this.current.fillColor = color; + setStrokeRGBColor(opIdx, color) { + this.dependencyTracker?.recordSimpleData("strokeColor", opIdx); + this.ctx.strokeStyle = this.current.strokeColor = color; + this.current.patternStroke = false; + } + setStrokeTransparent(opIdx) { + this.dependencyTracker?.recordSimpleData("strokeColor", opIdx); + this.ctx.strokeStyle = this.current.strokeColor = "transparent"; + this.current.patternStroke = false; + } + setFillRGBColor(opIdx, color) { + this.dependencyTracker?.recordSimpleData("fillColor", opIdx); + this.ctx.fillStyle = this.current.fillColor = color; this.current.patternFill = false; + this.current.tilingPatternDims = null; } - _getPattern(objId, matrix = null) { + setFillTransparent(opIdx) { + this.dependencyTracker?.recordSimpleData("fillColor", opIdx); + this.ctx.fillStyle = this.current.fillColor = "transparent"; + this.current.patternFill = false; + this.current.tilingPatternDims = null; + } + _getPattern(opIdx, objId, matrix = null) { let pattern; if (this.cachedPatterns.has(objId)) { pattern = this.cachedPatterns.get(objId); } else { - pattern = getShadingPattern(this.getObject(objId)); + pattern = getShadingPattern(this.getObject(opIdx, objId)); this.cachedPatterns.set(objId, pattern); } if (matrix) { @@ -6950,168 +12261,333 @@ } return pattern; } - shadingFill(objId) { + shadingFill(opIdx, objId) { if (!this.contentVisible) { return; } + const started = this.#beginKnockoutElement(this.current.fillAlpha); const ctx = this.ctx; - this.save(); - const pattern = this._getPattern(objId); - ctx.fillStyle = pattern.getPattern(ctx, this, (0,display_utils.getCurrentTransformInverse)(ctx), PathType.SHADING); - const inv = (0,display_utils.getCurrentTransformInverse)(ctx); + this.save(opIdx); + const pattern = this._getPattern(opIdx, objId); + ctx.fillStyle = pattern.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.SHADING, opIdx); + const inv = getCurrentTransformInverse(ctx); if (inv) { const { width, height } = ctx.canvas; - const [x0, y0, x1, y1] = util.Util.getAxialAlignedBoundingBox([0, 0, width, height], inv); + const minMax = F32_BBOX_INIT.slice(); + Util.axialAlignedBoundingBox([0, 0, width, height], inv, minMax); + const [x0, y0, x1, y1] = minMax; this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0); } else { this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10); } + this.dependencyTracker?.resetBBox(opIdx).recordFullPageBBox(opIdx).recordDependencies(opIdx, Dependencies.transform).recordDependencies(opIdx, Dependencies.fill).recordOperation(opIdx); this.compose(this.current.getClippedPathBoundingBox()); - this.restore(); + this.restore(opIdx); + this.#endKnockoutElement(started); } beginInlineImage() { - (0,util.unreachable)("Should not call beginInlineImage"); + unreachable("Should not call beginInlineImage"); } beginImageData() { - (0,util.unreachable)("Should not call beginImageData"); + unreachable("Should not call beginImageData"); } - paintFormXObjectBegin(matrix, bbox) { + paintFormXObjectBegin(opIdx, matrix, bbox) { if (!this.contentVisible) { return; } - this.save(); + this.save(opIdx); this.baseTransformStack.push(this.baseTransform); - if (Array.isArray(matrix) && matrix.length === 6) { - this.transform(...matrix); + if (matrix) { + this.transform(opIdx, ...matrix); } - this.baseTransform = (0,display_utils.getCurrentTransform)(this.ctx); + this.baseTransform = getCurrentTransform(this.ctx); if (bbox) { - const width = bbox[2] - bbox[0]; - const height = bbox[3] - bbox[1]; - this.ctx.rect(bbox[0], bbox[1], width, height); - this.current.updateRectMinMax((0,display_utils.getCurrentTransform)(this.ctx), bbox); - this.clip(); - this.endPath(); + Util.axialAlignedBoundingBox(bbox, this.baseTransform, this.current.minMax); + const [x0, y0, x1, y1] = bbox; + const clip = new Path2D(); + clip.rect(x0, y0, x1 - x0, y1 - y0); + this.ctx.clip(clip); + this.dependencyTracker?.recordClipBox(opIdx, this.ctx, x0, x1, y0, y1); + this.endPath(opIdx); } } - paintFormXObjectEnd() { + paintFormXObjectEnd(opIdx) { if (!this.contentVisible) { return; } - this.restore(); + this.restore(opIdx); this.baseTransform = this.baseTransformStack.pop(); } - beginGroup(group) { + beginGroup(opIdx, group) { if (!this.contentVisible) { return; } - this.save(); - if (this.inSMaskMode) { + this.save(opIdx); + const { + inSMaskMode + } = this; + if (inSMaskMode) { this.endSMaskMode(); this.current.activeSMask = null; } const currentCtx = this.ctx; - if (!group.isolated) { - (0,util.info)("TODO: Support non-isolated groups."); + if ((!group.needsIsolation || !group.isolated && !group.hasSoftMask) && !group.knockout && !group.isGray && this.#knockoutGroupLevel === 0 && currentCtx.globalAlpha === 1 && currentCtx.globalCompositeOperation === "source-over" && !inSMaskMode) { + if (group.bbox) { + let clip = new Path2D(); + const [x0, y0, x1, y1] = group.bbox; + clip.rect(x0, y0, x1 - x0, y1 - y0); + if (group.matrix) { + const path = new Path2D(); + path.addPath(clip, new DOMMatrix(group.matrix)); + clip = path; + } + currentCtx.clip(clip); + } + this.groupStack.push(null); + this.#groupStackMeta.push(null); + this.groupLevel++; + return; } - if (group.knockout) { - (0,util.warn)("Knockout groups not supported."); + if (!group.isolated && !group.knockout && this.#knockoutGroupLevel === 0) { + info("TODO: Fully support non-isolated non-knockout groups."); } - const currentTransform = (0,display_utils.getCurrentTransform)(currentCtx); + const currentTransform = getCurrentTransform(currentCtx); if (group.matrix) { currentCtx.transform(...group.matrix); } - if (!group.bbox) { - throw new Error("Bounding box is required."); - } - let bounds = util.Util.getAxialAlignedBoundingBox(group.bbox, (0,display_utils.getCurrentTransform)(currentCtx)); const canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height]; - bounds = util.Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0]; + let bounds; + if (group.bbox) { + bounds = F32_BBOX_INIT.slice(); + Util.axialAlignedBoundingBox(group.bbox, getCurrentTransform(currentCtx), bounds); + bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0]; + } else { + bounds = canvasBounds; + } const offsetX = Math.floor(bounds[0]); const offsetY = Math.floor(bounds[1]); - let drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1); - let drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1); - let scaleX = 1, - scaleY = 1; - if (drawnWidth > MAX_GROUP_SIZE) { - scaleX = drawnWidth / MAX_GROUP_SIZE; - drawnWidth = MAX_GROUP_SIZE; - } - if (drawnHeight > MAX_GROUP_SIZE) { - scaleY = drawnHeight / MAX_GROUP_SIZE; - drawnHeight = MAX_GROUP_SIZE; - } + const drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1); + const drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1); this.current.startNewPathAndClipBox([0, 0, drawnWidth, drawnHeight]); - let cacheId = "groupAt" + this.groupLevel; + const scratchCanvas = this.canvasFactory.create(drawnWidth, drawnHeight); if (group.smask) { - cacheId += "_smask_" + this.smaskCounter++ % 2; + this.smaskGroupCanvases.push(scratchCanvas); } - const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight); const groupCtx = scratchCanvas.context; - groupCtx.scale(1 / scaleX, 1 / scaleY); + const backdropCtx = group.knockout && !group.isolated ? currentCtx : null; + const hasInnerBackdrop = !group.isolated && !group.knockout && !group.smask && group.needsIsolation && this.#knockoutGroupLevel > 0; + const knockoutMaskEntry = group.knockout ? this.canvasFactory.create(drawnWidth, drawnHeight) : null; + const savedKnockoutLevel = this.#knockoutGroupLevel; + if (group.knockout) { + this.#knockoutGroupLevel++; + } else { + this.#knockoutGroupLevel = 0; + } groupCtx.translate(-offsetX, -offsetY); groupCtx.transform(...currentTransform); + if (!group.isolated && !group.smask && inSMaskMode && group.needsIsolation) { + groupCtx.save(); + groupCtx.setTransform(1, 0, 0, 1, 0, 0); + groupCtx.drawImage(currentCtx.canvas, -offsetX, -offsetY); + groupCtx.restore(); + } + if (group.bbox) { + let clip = new Path2D(); + const [x0, y0, x1, y1] = group.bbox; + clip.rect(x0, y0, x1 - x0, y1 - y0); + if (group.matrix) { + const path = new Path2D(); + path.addPath(clip, new DOMMatrix(group.matrix)); + clip = path; + } + groupCtx.clip(clip); + } if (group.smask) { this.smaskStack.push({ canvas: scratchCanvas.canvas, context: groupCtx, offsetX, offsetY, - scaleX, - scaleY, subtype: group.smask.subtype, backdrop: group.smask.backdrop, - transferMap: group.smask.transferMap || null, - startTransformInverse: null + transferMap: group.smask.transferMap || null }); - } else { + } + if (!group.smask || this.dependencyTracker) { currentCtx.setTransform(1, 0, 0, 1, 0, 0); currentCtx.translate(offsetX, offsetY); - currentCtx.scale(scaleX, scaleY); currentCtx.save(); } copyCtxState(currentCtx, groupCtx); this.ctx = groupCtx; - this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]); + this.dependencyTracker?.inheritSimpleDataAsFutureForcedDependencies(["fillAlpha", "strokeAlpha", "globalCompositeOperation"]).pushBaseTransform(currentCtx); + this.setGState(opIdx, [["BM", "source-over"], ["ca", 1], ["CA", 1], ["TR", null]]); this.groupStack.push(currentCtx); + this.#groupStackMeta.push({ + backdropCtx, + savedKnockoutLevel, + offsetX, + offsetY, + hasInnerBackdrop, + knockoutMaskEntry, + knockoutTempEntry: null, + knockoutBackdropEntry: null + }); this.groupLevel++; } - endGroup(group) { + endGroup(opIdx, group) { if (!this.contentVisible) { return; } this.groupLevel--; const groupCtx = this.ctx; const ctx = this.groupStack.pop(); + const groupMeta = this.#groupStackMeta.pop(); + if (groupMeta) { + this.#knockoutGroupLevel = groupMeta.savedKnockoutLevel; + } + if (ctx === null) { + this.restore(opIdx); + return; + } + if (group.isGray) { + this.#convertGroupToGray(groupCtx); + } this.ctx = ctx; this.ctx.imageSmoothingEnabled = false; + this.dependencyTracker?.popBaseTransform(); if (group.smask) { this.tempSMask = this.smaskStack.pop(); - this.restore(); + this.restore(opIdx); + if (this.dependencyTracker) { + this.ctx.restore(); + if (this.inSMaskMode) { + this.ctx.setTransform(this.suspendedCtx.getTransform()); + } + } + this.#destroyKnockoutPools(groupMeta); } else { this.ctx.restore(); - const currentMtx = (0,display_utils.getCurrentTransform)(this.ctx); - this.restore(); + const currentMtx = getCurrentTransform(this.ctx); + this.restore(opIdx); this.ctx.save(); this.ctx.setTransform(...currentMtx); - const dirtyBox = util.Util.getAxialAlignedBoundingBox([0, 0, groupCtx.canvas.width, groupCtx.canvas.height], currentMtx); - this.ctx.drawImage(groupCtx.canvas, 0, 0); + const dirtyBox = F32_BBOX_INIT.slice(); + Util.axialAlignedBoundingBox([0, 0, groupCtx.canvas.width, groupCtx.canvas.height], currentMtx, dirtyBox); + const parentGroupMeta = this.#groupStackMeta.at(-1); + if (this.#knockoutGroupLevel > 0) { + if (groupMeta.hasInnerBackdrop) { + const { + width, + height + } = groupCtx.canvas; + const colorEntry = this.canvasFactory.create(width, height); + const colorCtx = colorEntry.context; + colorCtx.drawImage(ctx.canvas, groupMeta.offsetX, groupMeta.offsetY, width, height, 0, 0, width, height); + colorCtx.globalCompositeOperation = "source-over"; + colorCtx.drawImage(groupCtx.canvas, 0, 0); + const shapeMaskEntry = this.#createKnockoutMaskCanvas(groupCtx.canvas); + colorCtx.globalCompositeOperation = "destination-in"; + colorCtx.drawImage(shapeMaskEntry.canvas, 0, 0); + const sourceCompositeOperation = this.ctx.globalCompositeOperation; + const sourceAlpha = this.ctx.globalAlpha; + const sourceFilter = this.ctx.filter; + this.ctx.save(); + this.ctx.setTransform(...currentMtx); + this.ctx.globalAlpha = 1; + if (FeatureTest.isCanvasFilterSupported) { + this.ctx.filter = "none"; + } + this.ctx.globalCompositeOperation = "destination-out"; + this.ctx.drawImage(shapeMaskEntry.canvas, 0, 0); + this.ctx.globalCompositeOperation = sourceCompositeOperation; + this.ctx.globalAlpha = sourceAlpha; + if (FeatureTest.isCanvasFilterSupported) { + this.ctx.filter = sourceFilter ?? "none"; + } + this.ctx.drawImage(colorEntry.canvas, 0, 0); + this.ctx.restore(); + this.canvasFactory.destroy(shapeMaskEntry); + this.canvasFactory.destroy(colorEntry); + } else { + const backdropCtx = parentGroupMeta?.backdropCtx ?? null; + this.#compositeKnockoutSurface(this.ctx, groupCtx.canvas, { + backdropCanvas: backdropCtx?.canvas ?? null, + destTransform: currentMtx, + backdropOffset: backdropCtx ? [parentGroupMeta.offsetX + groupMeta.offsetX, parentGroupMeta.offsetY + groupMeta.offsetY] : [0, 0], + sourceAlpha: this.ctx.globalAlpha, + sourceFilter: this.ctx.filter + }); + } + } else { + this.ctx.drawImage(groupCtx.canvas, 0, 0); + } this.ctx.restore(); + this.canvasFactory.destroy({ + canvas: groupCtx.canvas, + context: groupCtx + }); + this.#destroyKnockoutPools(groupMeta); this.compose(dirtyBox); } } - beginAnnotation(id, rect, transform, matrix, hasOwnCanvas) { + #convertGroupToGray(groupCtx) { + const { + canvas + } = groupCtx; + const { + width, + height + } = canvas; + if (FeatureTest.isCanvasFilterSupported) { + groupCtx.save(); + groupCtx.setTransform(1, 0, 0, 1, 0, 0); + groupCtx.filter = "grayscale(1)"; + groupCtx.globalAlpha = 1; + groupCtx.globalCompositeOperation = "copy"; + groupCtx.drawImage(canvas, 0, 0); + groupCtx.restore(); + return; + } + const imageData = groupCtx.getImageData(0, 0, width, height); + const { + data + } = imageData; + for (let i = 0, ii = data.length; i < ii; i += 4) { + const gray = data[i] * 0.2126 + data[i + 1] * 0.7152 + data[i + 2] * 0.0722 + 0.5 | 0; + data[i] = data[i + 1] = data[i + 2] = gray; + } + groupCtx.putImageData(imageData, 0, 0); + } + #destroyKnockoutPools(groupMeta) { + if (!groupMeta) { + return; + } + if (groupMeta.knockoutMaskEntry) { + this.canvasFactory.destroy(groupMeta.knockoutMaskEntry); + groupMeta.knockoutMaskEntry = null; + } + if (groupMeta.knockoutTempEntry) { + this.canvasFactory.destroy(groupMeta.knockoutTempEntry); + groupMeta.knockoutTempEntry = null; + } + if (groupMeta.knockoutBackdropEntry) { + this.canvasFactory.destroy(groupMeta.knockoutBackdropEntry); + groupMeta.knockoutBackdropEntry = null; + } + } + beginAnnotation(opIdx, id, rect, transform, matrix, hasOwnCanvas, canvasName) { this.#restoreInitialState(); resetCtxToDefault(this.ctx); this.ctx.save(); - this.save(); + this.save(opIdx); if (this.baseTransform) { this.ctx.setTransform(...this.baseTransform); } - if (Array.isArray(rect) && rect.length === 4) { + if (rect) { const width = rect[2] - rect[0]; const height = rect[3] - rect[1]; if (hasOwnCanvas && this.annotationCanvasMap) { @@ -7122,7 +12598,7 @@ rect[0] = rect[1] = 0; rect[2] = width; rect[3] = height; - const [scaleX, scaleY] = util.Util.singularValueDecompose2dScale((0,display_utils.getCurrentTransform)(this.ctx)); + Util.singularValueDecompose2dScale(getCurrentTransform(this.ctx), XY); const { viewportScale } = this; @@ -7133,24 +12609,38 @@ canvas, context } = this.annotationCanvas; - this.annotationCanvasMap.set(id, canvas); + if (canvasName) { + const canvases = this.annotationCanvasMap.getOrInsertComputed(id, makeArr); + canvas.setAttribute("data-canvas-name", canvasName); + const index = canvases.findIndex(c => c.getAttribute("data-canvas-name") === canvasName); + if (index === -1) { + canvases.push(canvas); + } else { + canvases[index] = canvas; + } + } else { + this.annotationCanvasMap.set(id, canvas); + } this.annotationCanvas.savedCtx = this.ctx; this.ctx = context; this.ctx.save(); - this.ctx.setTransform(scaleX, 0, 0, -scaleY, 0, height * scaleY); + this.ctx.setTransform(XY[0], 0, 0, -XY[1], 0, height * XY[1]); resetCtxToDefault(this.ctx); } else { resetCtxToDefault(this.ctx); - this.ctx.rect(rect[0], rect[1], width, height); - this.ctx.clip(); - this.endPath(); + this.endPath(opIdx); + const clip = new Path2D(); + clip.rect(rect[0], rect[1], width, height); + this.ctx.clip(clip); } } this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height); - this.transform(...transform); - this.transform(...matrix); + this.baseTransformStack.push(this.baseTransform); + this.transform(opIdx, ...transform); + this.transform(opIdx, ...matrix); + this.baseTransform = getCurrentTransform(this.ctx); } - endAnnotation() { + endAnnotation(opIdx) { if (this.annotationCanvas) { this.ctx.restore(); this.#drawFilter(); @@ -7158,59 +12648,65 @@ delete this.annotationCanvas.savedCtx; delete this.annotationCanvas; } + this.baseTransform = this.baseTransformStack.pop(); } - paintImageMaskXObject(img) { + paintImageMaskXObject(opIdx, img) { if (!this.contentVisible) { return; } const count = img.count; - img = this.getObject(img.data, img); + img = this.getObject(opIdx, img.data, img); img.count = count; + const started = this.#beginKnockoutElement(this.current.fillAlpha); const ctx = this.ctx; - const glyph = this.processingType3; - if (glyph) { - if (glyph.compiled === undefined) { - glyph.compiled = compileType3Glyph(img); - } - if (glyph.compiled) { - glyph.compiled(ctx); - return; - } - } - const mask = this._createMaskCanvas(img); + const mask = this._createMaskCanvas(opIdx, img); const maskCanvas = mask.canvas; ctx.save(); ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.drawImage(maskCanvas, mask.offsetX, mask.offsetY); + this.dependencyTracker?.resetBBox(opIdx).recordBBox(opIdx, this.ctx, mask.offsetX, mask.offsetX + maskCanvas.width, mask.offsetY, mask.offsetY + maskCanvas.height).recordOperation(opIdx); ctx.restore(); + if (mask.canvasEntry) { + this.canvasFactory.destroy(mask.canvasEntry); + } this.compose(); + this.#endKnockoutElement(started); } - paintImageMaskXObjectRepeat(img, scaleX, skewX = 0, skewY = 0, scaleY, positions) { + paintImageMaskXObjectRepeat(opIdx, img, scaleX, skewX = 0, skewY = 0, scaleY, positions) { if (!this.contentVisible) { return; } - img = this.getObject(img.data, img); + img = this.getObject(opIdx, img.data, img); + const started = this.#beginKnockoutElement(this.current.fillAlpha); const ctx = this.ctx; ctx.save(); - const currentTransform = (0,display_utils.getCurrentTransform)(ctx); + const currentTransform = getCurrentTransform(ctx); ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0); - const mask = this._createMaskCanvas(img); + const mask = this._createMaskCanvas(opIdx, img); ctx.setTransform(1, 0, 0, 1, mask.offsetX - currentTransform[4], mask.offsetY - currentTransform[5]); + this.dependencyTracker?.resetBBox(opIdx); for (let i = 0, ii = positions.length; i < ii; i += 2) { - const trans = util.Util.transform(currentTransform, [scaleX, skewX, skewY, scaleY, positions[i], positions[i + 1]]); - const [x, y] = util.Util.applyTransform([0, 0], trans); - ctx.drawImage(mask.canvas, x, y); + const trans = Util.transform(currentTransform, [scaleX, skewX, skewY, scaleY, positions[i], positions[i + 1]]); + ctx.drawImage(mask.canvas, trans[4], trans[5]); + this.dependencyTracker?.recordBBox(opIdx, this.ctx, trans[4], trans[4] + mask.canvas.width, trans[5], trans[5] + mask.canvas.height); } ctx.restore(); + if (mask.canvasEntry) { + this.canvasFactory.destroy(mask.canvasEntry); + } this.compose(); + this.dependencyTracker?.recordOperation(opIdx); + this.#endKnockoutElement(started); } - paintImageMaskXObjectGroup(images) { + paintImageMaskXObjectGroup(opIdx, images) { if (!this.contentVisible) { return; } + const started = this.#beginKnockoutElement(this.current.fillAlpha); const ctx = this.ctx; const fillColor = this.current.fillColor; const isPatternFill = this.current.patternFill; + this.dependencyTracker?.resetBBox(opIdx).recordDependencies(opIdx, Dependencies.transformAndFill); for (const image of images) { const { data, @@ -7218,41 +12714,45 @@ height, transform } = image; - const maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); + const maskCanvas = this.canvasFactory.create(width, height); const maskCtx = maskCanvas.context; maskCtx.save(); - const img = this.getObject(data, image); + const img = this.getObject(opIdx, data, image); putBinaryImageMask(maskCtx, img); maskCtx.globalCompositeOperation = "source-in"; - maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this, (0,display_utils.getCurrentTransformInverse)(ctx), PathType.FILL) : fillColor; + maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this, getCurrentTransformInverse(ctx), PathType.FILL, opIdx) : fillColor; maskCtx.fillRect(0, 0, width, height); maskCtx.restore(); ctx.save(); ctx.transform(...transform); ctx.scale(1, -1); drawImageAtIntegerCoords(ctx, maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1); + this.canvasFactory.destroy(maskCanvas); + this.dependencyTracker?.recordBBox(opIdx, ctx, 0, width, 0, height); ctx.restore(); } this.compose(); + this.dependencyTracker?.recordOperation(opIdx); + this.#endKnockoutElement(started); } - paintImageXObject(objId) { + paintImageXObject(opIdx, objId) { if (!this.contentVisible) { return; } - const imgData = this.getObject(objId); + const imgData = this.getObject(opIdx, objId); if (!imgData) { - (0,util.warn)("Dependent image isn't ready yet"); + warn("Dependent image isn't ready yet"); return; } - this.paintInlineImageXObject(imgData); + this.paintInlineImageXObject(opIdx, imgData); } - paintImageXObjectRepeat(objId, scaleX, scaleY, positions) { + paintImageXObjectRepeat(opIdx, objId, scaleX, scaleY, positions) { if (!this.contentVisible) { return; } - const imgData = this.getObject(objId); + const imgData = this.getObject(opIdx, objId); if (!imgData) { - (0,util.warn)("Dependent image isn't ready yet"); + warn("Dependent image isn't ready yet"); return; } const width = imgData.width; @@ -7267,7 +12767,7 @@ h: height }); } - this.paintInlineImageXObjectGroup(imgData, map); + this.paintInlineImageXObjectGroup(opIdx, imgData, map); } applyTransferMapsToCanvas(ctx) { if (this.current.transferMaps !== "none") { @@ -7279,94 +12779,125 @@ } applyTransferMapsToBitmap(imgData) { if (this.current.transferMaps === "none") { - return imgData.bitmap; + return { + img: imgData.bitmap, + canvasEntry: null + }; } const { bitmap, width, height } = imgData; - const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height); + const tmpCanvas = this.canvasFactory.create(width, height); const tmpCtx = tmpCanvas.context; tmpCtx.filter = this.current.transferMaps; tmpCtx.drawImage(bitmap, 0, 0); tmpCtx.filter = "none"; - return tmpCanvas.canvas; + return { + img: tmpCanvas.canvas, + canvasEntry: tmpCanvas + }; } - paintInlineImageXObject(imgData) { + paintInlineImageXObject(opIdx, imgData) { if (!this.contentVisible) { return; } const width = imgData.width; const height = imgData.height; + const started = this.#beginKnockoutElement(this.current.fillAlpha); const ctx = this.ctx; - this.save(); - if (!util.isNodeJS) { - const { - filter - } = ctx; - if (filter !== "none" && filter !== "") { - ctx.filter = "none"; - } + this.save(opIdx); + const { + filter + } = ctx; + if (filter !== "none" && filter !== "") { + ctx.filter = "none"; } ctx.scale(1 / width, -1 / height); let imgToPaint; + let inlineImgCanvas = null; if (imgData.bitmap) { - imgToPaint = this.applyTransferMapsToBitmap(imgData); - } else if (typeof HTMLElement === "function" && imgData instanceof HTMLElement || !imgData.data) { - imgToPaint = imgData; - } else { - const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height); - const tmpCtx = tmpCanvas.context; - putBinaryImageData(tmpCtx, imgData); - imgToPaint = this.applyTransferMapsToCanvas(tmpCtx); + const result = this.applyTransferMapsToBitmap(imgData); + imgToPaint = result.img; + inlineImgCanvas = result.canvasEntry; + } else { + const tmpCanvas = this.canvasFactory.create(width, height); + putBinaryImageData(tmpCanvas.context, imgData); + imgToPaint = this.applyTransferMapsToCanvas(tmpCanvas.context); + inlineImgCanvas = tmpCanvas; + } + const scaled = this._scaleImage(imgToPaint, getCurrentTransformInverse(ctx)); + ctx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(ctx), imgData.interpolate); + if (this.dependencyTracker) { + this.dependencyTracker.resetBBox(opIdx).recordBBox(opIdx, ctx, 0, width, -height, 0).recordDependencies(opIdx, Dependencies.imageXObject).recordOperation(opIdx); + this.imagesTracker?.record(ctx, width, height, this.dependencyTracker.clipBox); } - const scaled = this._scaleImage(imgToPaint, (0,display_utils.getCurrentTransformInverse)(ctx)); - ctx.imageSmoothingEnabled = getImageSmoothingEnabled((0,display_utils.getCurrentTransform)(ctx), imgData.interpolate); drawImageAtIntegerCoords(ctx, scaled.img, 0, 0, scaled.paintWidth, scaled.paintHeight, 0, -height, width, height); + if (scaled.tmpCanvas) { + this.canvasFactory.destroy(scaled.tmpCanvas); + } + if (inlineImgCanvas) { + this.canvasFactory.destroy(inlineImgCanvas); + } this.compose(); - this.restore(); + this.restore(opIdx); + this.#endKnockoutElement(started); } - paintInlineImageXObjectGroup(imgData, map) { + paintInlineImageXObjectGroup(opIdx, imgData, map) { if (!this.contentVisible) { return; } + const started = this.#beginKnockoutElement(this.current.fillAlpha); const ctx = this.ctx; let imgToPaint; + let inlineImgCanvas = null; if (imgData.bitmap) { imgToPaint = imgData.bitmap; } else { const w = imgData.width; const h = imgData.height; - const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", w, h); - const tmpCtx = tmpCanvas.context; - putBinaryImageData(tmpCtx, imgData); - imgToPaint = this.applyTransferMapsToCanvas(tmpCtx); + const tmpCanvas = this.canvasFactory.create(w, h); + putBinaryImageData(tmpCanvas.context, imgData); + imgToPaint = this.applyTransferMapsToCanvas(tmpCanvas.context); + inlineImgCanvas = tmpCanvas; } + this.dependencyTracker?.resetBBox(opIdx); for (const entry of map) { ctx.save(); ctx.transform(...entry.transform); ctx.scale(1, -1); drawImageAtIntegerCoords(ctx, imgToPaint, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1); + this.dependencyTracker?.recordBBox(opIdx, ctx, 0, 1, -1, 0); ctx.restore(); } + if (inlineImgCanvas) { + this.canvasFactory.destroy(inlineImgCanvas); + } + this.dependencyTracker?.recordOperation(opIdx); this.compose(); + this.#endKnockoutElement(started); } - paintSolidColorImageMask() { + paintSolidColorImageMask(opIdx) { if (!this.contentVisible) { return; } + const started = this.#beginKnockoutElement(this.current.fillAlpha); + this.dependencyTracker?.resetBBox(opIdx).recordBBox(opIdx, this.ctx, 0, 1, 0, 1).recordDependencies(opIdx, Dependencies.fill).recordOperation(opIdx); this.ctx.fillRect(0, 0, 1, 1); this.compose(); + this.#endKnockoutElement(started); } - markPoint(tag) {} - markPointProps(tag, properties) {} - beginMarkedContent(tag) { + markPoint(opIdx, tag) {} + markPointProps(opIdx, tag, properties) {} + beginMarkedContent(opIdx, tag) { + this.dependencyTracker?.beginMarkedContent(opIdx); this.markedContentStack.push({ visible: true }); } - beginMarkedContentProps(tag, properties) { + beginMarkedContentProps(opIdx, tag, properties) { + this.dependencyTracker?.beginMarkedContent(opIdx); if (tag === "OC") { this.markedContentStack.push({ visible: this.optionalContentConfig.isVisible(properties) @@ -7378,13 +12909,14 @@ } this.contentVisible = this.isContentVisible(); } - endMarkedContent() { + endMarkedContent(opIdx) { + this.dependencyTracker?.endMarkedContent(opIdx); this.markedContentStack.pop(); this.contentVisible = this.isContentVisible(); } - beginCompat() {} - endCompat() {} - consumePath(clipBox) { + beginCompat(opIdx) {} + endCompat(opIdx) {} + consumePath(opIdx, path, clipBox) { const isEmpty = this.current.isEmptyClip(); if (this.pendingClip) { this.current.updateClipFromPath(); @@ -7396,19 +12928,21 @@ if (this.pendingClip) { if (!isEmpty) { if (this.pendingClip === EO_CLIP) { - ctx.clip("evenodd"); + ctx.clip(path, "evenodd"); } else { - ctx.clip(); + ctx.clip(path); } } this.pendingClip = null; + this.dependencyTracker?.bboxToClipBoxDropOperation(opIdx).recordFutureForcedDependency("clipPath", opIdx); + } else { + this.dependencyTracker?.recordOperation(opIdx); } this.current.startNewPathAndClipBox(this.current.clipBox); - ctx.beginPath(); } getSinglePixelWidth() { if (!this._cachedGetSinglePixelWidth) { - const m = (0,display_utils.getCurrentTransform)(this.ctx); + const m = getCurrentTransform(this.ctx); if (m[1] === 0 && m[2] === 0) { this._cachedGetSinglePixelWidth = 1 / Math.min(Math.abs(m[0]), Math.abs(m[3])); } else { @@ -7469,17 +13003,17 @@ } return this._cachedScaleForStroking; } - rescaleAndStroke(saveRestore) { + rescaleAndStroke(path, saveRestore) { const { - ctx + ctx, + current: { + lineWidth + } } = this; - const { - lineWidth - } = this.current; const [scaleX, scaleY] = this.getScaleForStroking(); - ctx.lineWidth = lineWidth || 1; - if (scaleX === 1 && scaleY === 1) { - ctx.stroke(); + if (scaleX === scaleY) { + ctx.lineWidth = (lineWidth || 1) * scaleX; + ctx.stroke(path); return; } const dashes = ctx.getLineDash(); @@ -7487,12 +13021,17 @@ ctx.save(); } ctx.scale(scaleX, scaleY); + SCALE_MATRIX.a = 1 / scaleX; + SCALE_MATRIX.d = 1 / scaleY; + const newPath = new Path2D(); + newPath.addPath(path, SCALE_MATRIX); if (dashes.length > 0) { const scale = Math.max(scaleX, scaleY); ctx.setLineDash(dashes.map(x => x / scale)); ctx.lineDashOffset /= scale; } - ctx.stroke(); + ctx.lineWidth = lineWidth || 1; + ctx.stroke(newPath); if (saveRestore) { ctx.restore(); } @@ -7506,3944 +13045,3895 @@ return true; } } -for (const op in util.OPS) { +for (const op in OPS) { if (CanvasGraphics.prototype[op] !== undefined) { - CanvasGraphics.prototype[util.OPS[op]] = CanvasGraphics.prototype[op]; + CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op]; } } +;// ./src/shared/base_pdf_stream.js -/***/ }), - -/***/ 419: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ DOMCMapReaderFactory: () => (/* binding */ DOMCMapReaderFactory), -/* harmony export */ DOMCanvasFactory: () => (/* binding */ DOMCanvasFactory), -/* harmony export */ DOMFilterFactory: () => (/* binding */ DOMFilterFactory), -/* harmony export */ DOMSVGFactory: () => (/* binding */ DOMSVGFactory), -/* harmony export */ DOMStandardFontDataFactory: () => (/* binding */ DOMStandardFontDataFactory), -/* harmony export */ PDFDateString: () => (/* binding */ PDFDateString), -/* harmony export */ PageViewport: () => (/* binding */ PageViewport), -/* harmony export */ PixelsPerInch: () => (/* binding */ PixelsPerInch), -/* harmony export */ RenderingCancelledException: () => (/* binding */ RenderingCancelledException), -/* harmony export */ StatTimer: () => (/* binding */ StatTimer), -/* harmony export */ fetchData: () => (/* binding */ fetchData), -/* harmony export */ getColorValues: () => (/* binding */ getColorValues), -/* harmony export */ getCurrentTransform: () => (/* binding */ getCurrentTransform), -/* harmony export */ getCurrentTransformInverse: () => (/* binding */ getCurrentTransformInverse), -/* harmony export */ getFilenameFromUrl: () => (/* binding */ getFilenameFromUrl), -/* harmony export */ getPdfFilenameFromUrl: () => (/* binding */ getPdfFilenameFromUrl), -/* harmony export */ getRGB: () => (/* binding */ getRGB), -/* harmony export */ getXfaPageViewport: () => (/* binding */ getXfaPageViewport), -/* harmony export */ isDataScheme: () => (/* binding */ isDataScheme), -/* harmony export */ isPdfFile: () => (/* binding */ isPdfFile), -/* harmony export */ isValidFetchUrl: () => (/* binding */ isValidFetchUrl), -/* harmony export */ noContextMenu: () => (/* binding */ noContextMenu), -/* harmony export */ setLayerDimensions: () => (/* binding */ setLayerDimensions) -/* harmony export */ }); -/* unused harmony export deprecated */ -/* harmony import */ var _base_factory_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(583); -/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(292); - - -const SVG_NS = "http://www.w3.org/2000/svg"; -class PixelsPerInch { - static CSS = 96.0; - static PDF = 72.0; - static PDF_TO_CSS_UNITS = this.CSS / this.PDF; -} -class DOMFilterFactory extends _base_factory_js__WEBPACK_IMPORTED_MODULE_0__.BaseFilterFactory { - #_cache; - #_defs; - #docId; - #document; - #_hcmCache; - #id = 0; - constructor({ - docId, - ownerDocument = globalThis.document - } = {}) { - super(); - this.#docId = docId; - this.#document = ownerDocument; +class BasePDFStream { + #PDFStreamReader = null; + #PDFStreamRangeReader = null; + _fullReader = null; + _rangeReaders = new Set(); + _source = null; + constructor(source, PDFStreamReader, PDFStreamRangeReader) { + this._source = source; + this.#PDFStreamReader = PDFStreamReader; + this.#PDFStreamRangeReader = PDFStreamRangeReader; } - get #cache() { - return this.#_cache ||= new Map(); + get _progressiveDataLength() { + return this._fullReader?._loaded ?? 0; } - get #hcmCache() { - return this.#_hcmCache ||= new Map(); + getFullReader() { + assert(!this._fullReader, "BasePDFStream.getFullReader can only be called once."); + return this._fullReader = new this.#PDFStreamReader(this); } - get #defs() { - if (!this.#_defs) { - const div = this.#document.createElement("div"); - const { - style - } = div; - style.visibility = "hidden"; - style.contain = "strict"; - style.width = style.height = 0; - style.position = "absolute"; - style.top = style.left = 0; - style.zIndex = -1; - const svg = this.#document.createElementNS(SVG_NS, "svg"); - svg.setAttribute("width", 0); - svg.setAttribute("height", 0); - this.#_defs = this.#document.createElementNS(SVG_NS, "defs"); - div.append(svg); - svg.append(this.#_defs); - this.#document.body.append(div); + getRangeReader(begin, end) { + if (end <= this._progressiveDataLength) { + return null; } - return this.#_defs; + const reader = new this.#PDFStreamRangeReader(this, begin, end); + this._rangeReaders.add(reader); + return reader; } - addFilter(maps) { - if (!maps) { - return "none"; - } - let value = this.#cache.get(maps); - if (value) { - return value; - } - let tableR, tableG, tableB, key; - if (maps.length === 1) { - const mapR = maps[0]; - const buffer = new Array(256); - for (let i = 0; i < 256; i++) { - buffer[i] = mapR[i] / 255; - } - key = tableR = tableG = tableB = buffer.join(","); - } else { - const [mapR, mapG, mapB] = maps; - const bufferR = new Array(256); - const bufferG = new Array(256); - const bufferB = new Array(256); - for (let i = 0; i < 256; i++) { - bufferR[i] = mapR[i] / 255; - bufferG[i] = mapG[i] / 255; - bufferB[i] = mapB[i] / 255; - } - tableR = bufferR.join(","); - tableG = bufferG.join(","); - tableB = bufferB.join(","); - key = `${tableR}${tableG}${tableB}`; - } - value = this.#cache.get(key); - if (value) { - this.#cache.set(maps, value); - return value; + cancelAllRequests(reason) { + this._fullReader?.cancel(reason); + for (const reader of new Set(this._rangeReaders)) { + reader.cancel(reason); } - const id = `g_${this.#docId}_transfer_map_${this.#id++}`; - const url = `url(#${id})`; - this.#cache.set(maps, url); - this.#cache.set(key, url); - const filter = this.#createFilter(id); - this.#addTransferMapConversion(tableR, tableG, tableB, filter); - return url; } - addHCMFilter(fgColor, bgColor) { - const key = `${fgColor}-${bgColor}`; - const filterName = "base"; - let info = this.#hcmCache.get(filterName); - if (info?.key === key) { - return info.url; - } - if (info) { - info.filter?.remove(); - info.key = key; - info.url = "none"; - info.filter = null; - } else { - info = { - key, - url: "none", - filter: null - }; - this.#hcmCache.set(filterName, info); - } - if (!fgColor || !bgColor) { - return info.url; - } - const fgRGB = this.#getRGB(fgColor); - fgColor = _shared_util_js__WEBPACK_IMPORTED_MODULE_1__.Util.makeHexColor(...fgRGB); - const bgRGB = this.#getRGB(bgColor); - bgColor = _shared_util_js__WEBPACK_IMPORTED_MODULE_1__.Util.makeHexColor(...bgRGB); - this.#defs.style.color = ""; - if (fgColor === "#000000" && bgColor === "#ffffff" || fgColor === bgColor) { - return info.url; - } - const map = new Array(256); - for (let i = 0; i <= 255; i++) { - const x = i / 255; - map[i] = x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4; - } - const table = map.join(","); - const id = `g_${this.#docId}_hcm_filter`; - const filter = info.filter = this.#createFilter(id); - this.#addTransferMapConversion(table, table, table, filter); - this.#addGrayConversion(filter); - const getSteps = (c, n) => { - const start = fgRGB[c] / 255; - const end = bgRGB[c] / 255; - const arr = new Array(n + 1); - for (let i = 0; i <= n; i++) { - arr[i] = start + i / n * (end - start); - } - return arr.join(","); - }; - this.#addTransferMapConversion(getSteps(0, 5), getSteps(1, 5), getSteps(2, 5), filter); - info.url = `url(#${id})`; - return info.url; +} +class BasePDFStreamReader { + onProgress = null; + _contentLength = 0; + _filename = null; + _headersCapability = Promise.withResolvers(); + _isRangeSupported = false; + _isStreamingSupported = false; + _loaded = 0; + _stream = null; + constructor(stream) { + this._stream = stream; } - addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) { - const key = `${fgColor}-${bgColor}-${newFgColor}-${newBgColor}`; - let info = this.#hcmCache.get(filterName); - if (info?.key === key) { - return info.url; - } - if (info) { - info.filter?.remove(); - info.key = key; - info.url = "none"; - info.filter = null; - } else { - info = { - key, - url: "none", - filter: null - }; - this.#hcmCache.set(filterName, info); - } - if (!fgColor || !bgColor) { - return info.url; - } - const [fgRGB, bgRGB] = [fgColor, bgColor].map(this.#getRGB.bind(this)); - let fgGray = Math.round(0.2126 * fgRGB[0] + 0.7152 * fgRGB[1] + 0.0722 * fgRGB[2]); - let bgGray = Math.round(0.2126 * bgRGB[0] + 0.7152 * bgRGB[1] + 0.0722 * bgRGB[2]); - let [newFgRGB, newBgRGB] = [newFgColor, newBgColor].map(this.#getRGB.bind(this)); - if (bgGray < fgGray) { - [fgGray, bgGray, newFgRGB, newBgRGB] = [bgGray, fgGray, newBgRGB, newFgRGB]; - } - this.#defs.style.color = ""; - const getSteps = (fg, bg, n) => { - const arr = new Array(256); - const step = (bgGray - fgGray) / n; - const newStart = fg / 255; - const newStep = (bg - fg) / (255 * n); - let prev = 0; - for (let i = 0; i <= n; i++) { - const k = Math.round(fgGray + i * step); - const value = newStart + i * newStep; - for (let j = prev; j <= k; j++) { - arr[j] = value; - } - prev = k + 1; - } - for (let i = prev; i < 256; i++) { - arr[i] = arr[prev - 1]; - } - return arr.join(","); - }; - const id = `g_${this.#docId}_hcm_${filterName}_filter`; - const filter = info.filter = this.#createFilter(id); - this.#addGrayConversion(filter); - this.#addTransferMapConversion(getSteps(newFgRGB[0], newBgRGB[0], 5), getSteps(newFgRGB[1], newBgRGB[1], 5), getSteps(newFgRGB[2], newBgRGB[2], 5), filter); - info.url = `url(#${id})`; - return info.url; + _callOnProgress() { + this.onProgress?.({ + loaded: this._loaded, + total: this._contentLength + }); } - destroy(keepHCM = false) { - if (keepHCM && this.#hcmCache.size !== 0) { - return; - } - if (this.#_defs) { - this.#_defs.parentNode.parentNode.remove(); - this.#_defs = null; - } - if (this.#_cache) { - this.#_cache.clear(); - this.#_cache = null; - } - this.#id = 0; + get headersReady() { + return this._headersCapability.promise; } - #addGrayConversion(filter) { - const feColorMatrix = this.#document.createElementNS(SVG_NS, "feColorMatrix"); - feColorMatrix.setAttribute("type", "matrix"); - feColorMatrix.setAttribute("values", "0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0"); - filter.append(feColorMatrix); + get filename() { + return this._filename; } - #createFilter(id) { - const filter = this.#document.createElementNS(SVG_NS, "filter"); - filter.setAttribute("color-interpolation-filters", "sRGB"); - filter.setAttribute("id", id); - this.#defs.append(filter); - return filter; + get contentLength() { + return this._contentLength; } - #appendFeFunc(feComponentTransfer, func, table) { - const feFunc = this.#document.createElementNS(SVG_NS, func); - feFunc.setAttribute("type", "discrete"); - feFunc.setAttribute("tableValues", table); - feComponentTransfer.append(feFunc); + get isRangeSupported() { + return this._isRangeSupported; } - #addTransferMapConversion(rTable, gTable, bTable, filter) { - const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); - filter.append(feComponentTransfer); - this.#appendFeFunc(feComponentTransfer, "feFuncR", rTable); - this.#appendFeFunc(feComponentTransfer, "feFuncG", gTable); - this.#appendFeFunc(feComponentTransfer, "feFuncB", bTable); + get isStreamingSupported() { + return this._isStreamingSupported; } - #getRGB(color) { - this.#defs.style.color = color; - return getRGB(getComputedStyle(this.#defs).getPropertyValue("color")); + async read() { + unreachable("Abstract method `read` called"); + } + cancel(reason) { + unreachable("Abstract method `cancel` called"); } } -class DOMCanvasFactory extends _base_factory_js__WEBPACK_IMPORTED_MODULE_0__.BaseCanvasFactory { - constructor({ - ownerDocument = globalThis.document - } = {}) { - super(); - this._document = ownerDocument; +class BasePDFStreamRangeReader { + _stream = null; + constructor(stream, begin, end) { + this._stream = stream; } - _createCanvas(width, height) { - const canvas = this._document.createElement("canvas"); - canvas.width = width; - canvas.height = height; - return canvas; + async read() { + unreachable("Abstract method `read` called"); + } + cancel(reason) { + unreachable("Abstract method `cancel` called"); } } -async function fetchData(url, type = "text") { - if (isValidFetchUrl(url, document.baseURI)) { - const response = await fetch(url); - if (!response.ok) { - throw new Error(response.statusText); - } - switch (type) { - case "arraybuffer": - return response.arrayBuffer(); - case "blob": - return response.blob(); - case "json": - return response.json(); + +;// ./src/display/content_disposition.js + +function getFilenameFromContentDispositionHeader(contentDisposition) { + let needsEncodingFixup = true; + let tmp = toParamRegExp("filename\\*", "i").exec(contentDisposition); + if (tmp) { + tmp = tmp[1]; + let filename = rfc2616unquote(tmp); + filename = unescape(filename); + filename = rfc5987decode(filename); + filename = rfc2047decode(filename); + return fixupEncoding(filename); + } + tmp = rfc2231getparam(contentDisposition); + if (tmp) { + const filename = rfc2047decode(tmp); + return fixupEncoding(filename); + } + tmp = toParamRegExp("filename", "i").exec(contentDisposition); + if (tmp) { + tmp = tmp[1]; + let filename = rfc2616unquote(tmp); + filename = rfc2047decode(filename); + return fixupEncoding(filename); + } + function toParamRegExp(attributePattern, flags) { + return new RegExp("(?:^|;)\\s*" + attributePattern + "\\s*=\\s*" + "(" + '[^";\\s][^;\\s]*' + "|" + '"(?:[^"\\\\]|\\\\"?)+"?' + ")", flags); + } + function textdecode(encoding, value) { + if (encoding) { + if (!/^[\x00-\xFF]+$/.test(value)) { + return value; + } + try { + const decoder = new TextDecoder(encoding, { + fatal: true + }); + const buffer = stringToBytes(value); + value = decoder.decode(buffer); + needsEncodingFixup = false; + } catch {} } - return response.text(); + return value; } - return new Promise((resolve, reject) => { - const request = new XMLHttpRequest(); - request.open("GET", url, true); - request.responseType = type; - request.onreadystatechange = () => { - if (request.readyState !== XMLHttpRequest.DONE) { - return; + function fixupEncoding(value) { + if (needsEncodingFixup && /[\x80-\xff]/.test(value)) { + value = textdecode("utf-8", value); + if (needsEncodingFixup) { + value = textdecode("iso-8859-1", value); } - if (request.status === 200 || request.status === 0) { - switch (type) { - case "arraybuffer": - case "blob": - case "json": - resolve(request.response); - return; + } + return value; + } + function rfc2231getparam(contentDispositionStr) { + const matches = []; + let match; + const iter = toParamRegExp("filename\\*((?!0\\d)\\d+)(\\*?)", "ig"); + while ((match = iter.exec(contentDispositionStr)) !== null) { + let [, n, quot, part] = match; + n = parseInt(n, 10); + if (n in matches) { + if (n === 0) { + break; } - resolve(request.responseText); - return; + continue; } - reject(new Error(request.statusText)); - }; - request.send(null); - }); -} -class DOMCMapReaderFactory extends _base_factory_js__WEBPACK_IMPORTED_MODULE_0__.BaseCMapReaderFactory { - _fetchData(url, compressionType) { - return fetchData(url, this.isCompressed ? "arraybuffer" : "text").then(data => ({ - cMapData: data instanceof ArrayBuffer ? new Uint8Array(data) : (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_1__.stringToBytes)(data), - compressionType - })); - } -} -class DOMStandardFontDataFactory extends _base_factory_js__WEBPACK_IMPORTED_MODULE_0__.BaseStandardFontDataFactory { - _fetchData(url) { - return fetchData(url, "arraybuffer").then(data => new Uint8Array(data)); - } -} -class DOMSVGFactory extends _base_factory_js__WEBPACK_IMPORTED_MODULE_0__.BaseSVGFactory { - _createSVG(type) { - return document.createElementNS(SVG_NS, type); - } -} -class PageViewport { - constructor({ - viewBox, - scale, - rotation, - offsetX = 0, - offsetY = 0, - dontFlip = false - }) { - this.viewBox = viewBox; - this.scale = scale; - this.rotation = rotation; - this.offsetX = offsetX; - this.offsetY = offsetY; - const centerX = (viewBox[2] + viewBox[0]) / 2; - const centerY = (viewBox[3] + viewBox[1]) / 2; - let rotateA, rotateB, rotateC, rotateD; - rotation %= 360; - if (rotation < 0) { - rotation += 360; + matches[n] = [quot, part]; } - switch (rotation) { - case 180: - rotateA = -1; - rotateB = 0; - rotateC = 0; - rotateD = 1; - break; - case 90: - rotateA = 0; - rotateB = 1; - rotateC = 1; - rotateD = 0; - break; - case 270: - rotateA = 0; - rotateB = -1; - rotateC = -1; - rotateD = 0; - break; - case 0: - rotateA = 1; - rotateB = 0; - rotateC = 0; - rotateD = -1; + const parts = []; + for (let n = 0; n < matches.length; ++n) { + if (!(n in matches)) { break; - default: - throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees."); - } - if (dontFlip) { - rotateC = -rotateC; - rotateD = -rotateD; + } + let [quot, part] = matches[n]; + part = rfc2616unquote(part); + if (quot) { + part = unescape(part); + if (n === 0) { + part = rfc5987decode(part); + } + } + parts.push(part); } - let offsetCanvasX, offsetCanvasY; - let width, height; - if (rotateA === 0) { - offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; - offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; - width = (viewBox[3] - viewBox[1]) * scale; - height = (viewBox[2] - viewBox[0]) * scale; - } else { - offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; - offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; - width = (viewBox[2] - viewBox[0]) * scale; - height = (viewBox[3] - viewBox[1]) * scale; + return parts.join(""); + } + function rfc2616unquote(value) { + if (value.startsWith('"')) { + const parts = value.slice(1).split('\\"'); + for (let i = 0; i < parts.length; ++i) { + const quotindex = parts[i].indexOf('"'); + if (quotindex !== -1) { + parts[i] = parts[i].slice(0, quotindex); + parts.length = i + 1; + } + parts[i] = parts[i].replaceAll(/\\(.)/g, "$1"); + } + value = parts.join('"'); } - this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY]; - this.width = width; - this.height = height; + return value; } - get rawDims() { - const { - viewBox - } = this; - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_1__.shadow)(this, "rawDims", { - pageWidth: viewBox[2] - viewBox[0], - pageHeight: viewBox[3] - viewBox[1], - pageX: viewBox[0], - pageY: viewBox[1] - }); + function rfc5987decode(extvalue) { + const encodingend = extvalue.indexOf("'"); + if (encodingend === -1) { + return extvalue; + } + const encoding = extvalue.slice(0, encodingend); + const langvalue = extvalue.slice(encodingend + 1); + const value = langvalue.replace(/^[^']*'/, ""); + return textdecode(encoding, value); } - clone({ - scale = this.scale, - rotation = this.rotation, - offsetX = this.offsetX, - offsetY = this.offsetY, - dontFlip = false - } = {}) { - return new PageViewport({ - viewBox: this.viewBox.slice(), - scale, - rotation, - offsetX, - offsetY, - dontFlip + function rfc2047decode(value) { + if (!value.startsWith("=?") || /[\x00-\x19\x80-\xff]/.test(value)) { + return value; + } + return value.replaceAll(/=\?([\w-]*)\?([QB])\?((?:[^?]|\?(?!=))*)\?=/gi, function (matches, charset, encoding, text) { + if (encoding === "q" || encoding === "Q") { + text = text.replaceAll("_", " "); + text = text.replaceAll(/=([0-9a-f]{2})/gi, function (match, hex) { + return String.fromCharCode(parseInt(hex, 16)); + }); + return textdecode(charset, text); + } + try { + text = atob(text); + } catch {} + return textdecode(charset, text); }); } - convertToViewportPoint(x, y) { - return _shared_util_js__WEBPACK_IMPORTED_MODULE_1__.Util.applyTransform([x, y], this.transform); - } - convertToViewportRectangle(rect) { - const topLeft = _shared_util_js__WEBPACK_IMPORTED_MODULE_1__.Util.applyTransform([rect[0], rect[1]], this.transform); - const bottomRight = _shared_util_js__WEBPACK_IMPORTED_MODULE_1__.Util.applyTransform([rect[2], rect[3]], this.transform); - return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]]; - } - convertToPdfPoint(x, y) { - return _shared_util_js__WEBPACK_IMPORTED_MODULE_1__.Util.applyInverseTransform([x, y], this.transform); - } + return ""; } -class RenderingCancelledException extends _shared_util_js__WEBPACK_IMPORTED_MODULE_1__.BaseException { - constructor(msg, extraDelay = 0) { - super(msg, "RenderingCancelledException"); - this.extraDelay = extraDelay; + +;// ./src/display/network_utils.js + + + +function createHeaders(isHttp, httpHeaders) { + const headers = new Headers(); + if (!isHttp || !httpHeaders || typeof httpHeaders !== "object") { + return headers; } -} -function isDataScheme(url) { - const ii = url.length; - let i = 0; - while (i < ii && url[i].trim() === "") { - i++; + for (const key in httpHeaders) { + const val = httpHeaders[key]; + if (val !== undefined) { + headers.append(key, val); + } } - return url.substring(i, i + 5).toLowerCase() === "data:"; -} -function isPdfFile(filename) { - return typeof filename === "string" && /\.pdf$/i.test(filename); + return headers; } -function getFilenameFromUrl(url, onlyStripPath = false) { - if (!onlyStripPath) { - [url] = url.split(/[#?]/, 1); - } - return url.substring(url.lastIndexOf("/") + 1); +function getResponseOrigin(url) { + return URL.parse(url)?.origin ?? null; } -function getPdfFilenameFromUrl(url, defaultFilename = "document.pdf") { - if (typeof url !== "string") { - return defaultFilename; +function validateRangeRequestCapabilities({ + responseHeaders, + isHttp, + rangeChunkSize, + disableRange +}) { + const rv = { + contentLength: 0, + isRangeSupported: false + }; + const length = parseInt(responseHeaders.get("Content-Length"), 10); + if (!Number.isInteger(length)) { + return rv; } - if (isDataScheme(url)) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_1__.warn)('getPdfFilenameFromUrl: ignore "data:"-URL for performance reasons.'); - return defaultFilename; + rv.contentLength = length; + if (length <= 2 * rangeChunkSize) { + return rv; } - const reURI = /^(?:(?:[^:]+:)?\/\/[^/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/; - const reFilename = /[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i; - const splitURI = reURI.exec(url); - let suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]); - if (suggestedFilename) { - suggestedFilename = suggestedFilename[0]; - if (suggestedFilename.includes("%")) { - try { - suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0]; - } catch {} - } + if (disableRange || !isHttp) { + return rv; } - return suggestedFilename || defaultFilename; -} -class StatTimer { - started = Object.create(null); - times = []; - time(name) { - if (name in this.started) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_1__.warn)(`Timer is already running for ${name}`); - } - this.started[name] = Date.now(); + if (responseHeaders.get("Accept-Ranges") !== "bytes") { + return rv; } - timeEnd(name) { - if (!(name in this.started)) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_1__.warn)(`Timer has not been started for ${name}`); - } - this.times.push({ - name, - start: this.started[name], - end: Date.now() - }); - delete this.started[name]; + const contentEncoding = responseHeaders.get("Content-Encoding") || "identity"; + if (contentEncoding === "identity") { + rv.isRangeSupported = true; } - toString() { - const outBuf = []; - let longest = 0; - for (const { - name - } of this.times) { - longest = Math.max(name.length, longest); + return rv; +} +function extractFilenameFromHeader(responseHeaders) { + const contentDisposition = responseHeaders.get("Content-Disposition"); + if (contentDisposition) { + let filename = getFilenameFromContentDispositionHeader(contentDisposition); + if (filename.includes("%")) { + try { + filename = decodeURIComponent(filename); + } catch {} } - for (const { - name, - start, - end - } of this.times) { - outBuf.push(`${name.padEnd(longest)} ${end - start}ms\n`); + if (isPdfFile(filename)) { + return filename; } - return outBuf.join(""); - } -} -function isValidFetchUrl(url, baseUrl) { - try { - const { - protocol - } = baseUrl ? new URL(url, baseUrl) : new URL(url); - return protocol === "http:" || protocol === "https:"; - } catch { - return false; } + return null; } -function noContextMenu(e) { - e.preventDefault(); -} -function deprecated(details) { - console.log("Deprecated API usage: " + details); +function createResponseError(status, url) { + return new ResponseException(`Unexpected server response (${status}) while retrieving PDF "${url.href}".`, status, status === 404 || status === 0 && url.protocol === "file:"); } -let pdfDateStringRegex; -class PDFDateString { - static toDateObject(input) { - if (!input || typeof input !== "string") { - return null; - } - pdfDateStringRegex ||= new RegExp("^D:" + "(\\d{4})" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "([Z|+|-])?" + "(\\d{2})?" + "'?" + "(\\d{2})?" + "'?"); - const matches = pdfDateStringRegex.exec(input); - if (!matches) { - return null; - } - const year = parseInt(matches[1], 10); - let month = parseInt(matches[2], 10); - month = month >= 1 && month <= 12 ? month - 1 : 0; - let day = parseInt(matches[3], 10); - day = day >= 1 && day <= 31 ? day : 1; - let hour = parseInt(matches[4], 10); - hour = hour >= 0 && hour <= 23 ? hour : 0; - let minute = parseInt(matches[5], 10); - minute = minute >= 0 && minute <= 59 ? minute : 0; - let second = parseInt(matches[6], 10); - second = second >= 0 && second <= 59 ? second : 0; - const universalTimeRelation = matches[7] || "Z"; - let offsetHour = parseInt(matches[8], 10); - offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0; - let offsetMinute = parseInt(matches[9], 10) || 0; - offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0; - if (universalTimeRelation === "-") { - hour += offsetHour; - minute += offsetMinute; - } else if (universalTimeRelation === "+") { - hour -= offsetHour; - minute -= offsetMinute; - } - return new Date(Date.UTC(year, month, day, hour, minute, second)); +function ensureResponseOrigin(rangeOrigin, origin) { + if (rangeOrigin !== origin) { + throw new Error(`Expected range response-origin "${rangeOrigin}" to match "${origin}".`); } } -function getXfaPageViewport(xfaPage, { - scale = 1, - rotation = 0 -}) { - const { - width, - height - } = xfaPage.attributes.style; - const viewBox = [0, 0, parseInt(width), parseInt(height)]; - return new PageViewport({ - viewBox, - scale, - rotation + +;// ./src/display/fetch_stream.js + + + +function fetchUrl(url, headers, withCredentials, abortController) { + return fetch(url, { + method: "GET", + headers, + signal: abortController.signal, + mode: "cors", + credentials: withCredentials ? "include" : "same-origin", + redirect: "follow" }); } -function getRGB(color) { - if (color.startsWith("#")) { - const colorRGB = parseInt(color.slice(1), 16); - return [(colorRGB & 0xff0000) >> 16, (colorRGB & 0x00ff00) >> 8, colorRGB & 0x0000ff]; +function ensureResponseStatus(status, url) { + if (status !== 200 && status !== 206) { + throw createResponseError(status, url); } - if (color.startsWith("rgb(")) { - return color.slice(4, -1).split(",").map(x => parseInt(x)); +} +function getArrayBuffer(val) { + if (val instanceof Uint8Array) { + return val.buffer; } - if (color.startsWith("rgba(")) { - return color.slice(5, -1).split(",").map(x => parseInt(x)).slice(0, 3); + if (val instanceof ArrayBuffer) { + return val; } - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_1__.warn)(`Not a valid color format: "${color}"`); - return [0, 0, 0]; + throw new Error(`getArrayBuffer - unexpected data: ${val}`); } -function getColorValues(colors) { - const span = document.createElement("span"); - span.style.visibility = "hidden"; - document.body.append(span); - for (const name of colors.keys()) { - span.style.color = name; - const computedColor = window.getComputedStyle(span).color; - colors.set(name, getRGB(computedColor)); +class PDFFetchStream extends BasePDFStream { + _responseOrigin = null; + constructor(source) { + super(source, PDFFetchStreamReader, PDFFetchStreamRangeReader); + const { + httpHeaders, + url + } = source; + assert(/https?:/.test(url.protocol), "PDFFetchStream only supports http(s):// URLs."); + this.headers = createHeaders(true, httpHeaders); } - span.remove(); -} -function getCurrentTransform(ctx) { - const { - a, - b, - c, - d, - e, - f - } = ctx.getTransform(); - return [a, b, c, d, e, f]; } -function getCurrentTransformInverse(ctx) { - const { - a, - b, - c, - d, - e, - f - } = ctx.getTransform().invertSelf(); - return [a, b, c, d, e, f]; +class PDFFetchStreamReader extends BasePDFStreamReader { + _abortController = new AbortController(); + _reader = null; + constructor(stream) { + super(stream); + const { + disableRange, + disableStream, + rangeChunkSize, + url, + withCredentials + } = stream._source; + this._isStreamingSupported = !disableStream; + const headers = new Headers(stream.headers); + fetchUrl(url, headers, withCredentials, this._abortController).then(response => { + stream._responseOrigin = getResponseOrigin(response.url); + ensureResponseStatus(response.status, url); + this._reader = response.body.getReader(); + const responseHeaders = response.headers; + const { + contentLength, + isRangeSupported + } = validateRangeRequestCapabilities({ + responseHeaders, + isHttp: true, + rangeChunkSize, + disableRange + }); + this._contentLength = contentLength; + this._isRangeSupported = isRangeSupported; + this._filename = extractFilenameFromHeader(responseHeaders); + if (!this._isStreamingSupported && this._isRangeSupported) { + this.cancel(new AbortException("Streaming is disabled.")); + } + this._headersCapability.resolve(); + }).catch(this._headersCapability.reject); + } + async read() { + await this._headersCapability.promise; + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value, + done + }; + } + this._loaded += value.byteLength; + this._callOnProgress(); + return { + value: getArrayBuffer(value), + done: false + }; + } + cancel(reason) { + this._reader?.cancel(reason); + this._abortController.abort(); + } } -function setLayerDimensions(div, viewport, mustFlip = false, mustRotate = true) { - if (viewport instanceof PageViewport) { +class PDFFetchStreamRangeReader extends BasePDFStreamRangeReader { + _abortController = new AbortController(); + _readCapability = Promise.withResolvers(); + _reader = null; + constructor(stream, begin, end) { + super(stream, begin, end); const { - pageWidth, - pageHeight - } = viewport.rawDims; + url, + withCredentials + } = stream._source; + const headers = new Headers(stream.headers); + headers.append("Range", `bytes=${begin}-${end - 1}`); + fetchUrl(url, headers, withCredentials, this._abortController).then(response => { + const responseOrigin = getResponseOrigin(response.url); + ensureResponseOrigin(responseOrigin, stream._responseOrigin); + ensureResponseStatus(response.status, url); + this._reader = response.body.getReader(); + this._readCapability.resolve(); + }).catch(this._readCapability.reject); + } + async read() { + await this._readCapability.promise; const { - style - } = div; - const useRound = _shared_util_js__WEBPACK_IMPORTED_MODULE_1__.FeatureTest.isCSSRoundSupported; - const w = `var(--scale-factor) * ${pageWidth}px`, - h = `var(--scale-factor) * ${pageHeight}px`; - const widthStr = useRound ? `round(${w}, 1px)` : `calc(${w})`, - heightStr = useRound ? `round(${h}, 1px)` : `calc(${h})`; - if (!mustFlip || viewport.rotation % 180 === 0) { - style.width = widthStr; - style.height = heightStr; - } else { - style.width = heightStr; - style.height = widthStr; + value, + done + } = await this._reader.read(); + if (done) { + return { + value, + done + }; } + return { + value: getArrayBuffer(value), + done: false + }; } - if (mustRotate) { - div.setAttribute("data-main-rotation", viewport.rotation); + cancel(reason) { + this._reader?.cancel(reason); + this._abortController.abort(); } } +;// ./src/display/transport_stream.js -/***/ }), - -/***/ 47: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ DrawLayer: () => (/* binding */ DrawLayer) -/* harmony export */ }); -/* harmony import */ var _display_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(419); -/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(292); - -class DrawLayer { - #parent = null; - #id = 0; - #mapping = new Map(); - #toUpdate = new Map(); - constructor({ - pageIndex - }) { - this.pageIndex = pageIndex; +function transport_stream_getArrayBuffer(val) { + return val instanceof Uint8Array && val.byteLength === val.buffer.byteLength ? val.buffer : new Uint8Array(val).buffer; +} +function endRequests() { + for (const capability of this._requests) { + capability.resolve({ + value: undefined, + done: true + }); } - setParent(parent) { - if (!this.#parent) { - this.#parent = parent; - return; + this._requests.length = 0; +} +class PDFDataTransportStream extends BasePDFStream { + _progressiveDone = false; + _queuedChunks = []; + constructor(source) { + super(source, PDFDataTransportStreamReader, PDFDataTransportStreamRangeReader); + const { + pdfDataRangeTransport + } = source; + const { + initialData, + progressiveDone + } = pdfDataRangeTransport; + if (initialData?.length > 0) { + const buffer = transport_stream_getArrayBuffer(initialData); + this._queuedChunks.push(buffer); } - if (this.#parent !== parent) { - if (this.#mapping.size > 0) { - for (const root of this.#mapping.values()) { - root.remove(); - parent.append(root); - } + this._progressiveDone = progressiveDone; + const listener = args => { + switch (args.type) { + case "range": + case "progressiveRead": + this.#onReceiveData(args.begin, args.chunk); + break; + case "progressiveDone": + this._fullReader?.progressiveDone(); + this._progressiveDone = true; + break; } - this.#parent = parent; - } + }; + pdfDataRangeTransport.transportReady(listener); } - static get _svgFactory() { - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_1__.shadow)(this, "_svgFactory", new _display_utils_js__WEBPACK_IMPORTED_MODULE_0__.DOMSVGFactory()); + #onReceiveData(begin, chunk) { + const buffer = transport_stream_getArrayBuffer(chunk); + if (begin === undefined) { + if (this._fullReader) { + this._fullReader._enqueue(buffer); + } else { + this._queuedChunks.push(buffer); + } + } else { + const rangeReader = this._rangeReaders.keys().find(r => r._begin === begin); + assert(rangeReader, "#onReceiveData - no `PDFDataTransportStreamRangeReader` instance found."); + rangeReader._enqueue(buffer); + } } - static #setBox(element, { - x = 0, - y = 0, - width = 1, - height = 1 - } = {}) { - const { - style - } = element; - style.top = `${100 * y}%`; - style.left = `${100 * x}%`; - style.width = `${100 * width}%`; - style.height = `${100 * height}%`; + getFullReader() { + const reader = super.getFullReader(); + this._queuedChunks = null; + return reader; } - #createSVG(box) { - const svg = DrawLayer._svgFactory.create(1, 1, true); - this.#parent.append(svg); - svg.setAttribute("aria-hidden", true); - DrawLayer.#setBox(svg, box); - return svg; + getRangeReader(begin, end) { + const reader = super.getRangeReader(begin, end); + if (reader) { + reader.onDone = () => this._rangeReaders.delete(reader); + this._source.pdfDataRangeTransport.requestDataRange(begin, end); + } + return reader; } - #createClipPath(defs, pathId) { - const clipPath = DrawLayer._svgFactory.createElement("clipPath"); - defs.append(clipPath); - const clipPathId = `clip_${pathId}`; - clipPath.setAttribute("id", clipPathId); - clipPath.setAttribute("clipPathUnits", "objectBoundingBox"); - const clipPathUse = DrawLayer._svgFactory.createElement("use"); - clipPath.append(clipPathUse); - clipPathUse.setAttribute("href", `#${pathId}`); - clipPathUse.classList.add("clip"); - return clipPathId; + cancelAllRequests(reason) { + super.cancelAllRequests(reason); + this._source.pdfDataRangeTransport.abort(); } - highlight(outlines, color, opacity, isPathUpdatable = false) { - const id = this.#id++; - const root = this.#createSVG(outlines.box); - root.classList.add("highlight"); - if (outlines.free) { - root.classList.add("free"); +} +class PDFDataTransportStreamReader extends BasePDFStreamReader { + #endRequests = endRequests.bind(this); + _done = false; + _queuedChunks = null; + _requests = []; + constructor(stream) { + super(stream); + const { + pdfDataRangeTransport, + disableRange, + disableStream + } = stream._source; + const { + length, + contentDispositionFilename + } = pdfDataRangeTransport; + this._queuedChunks = stream._queuedChunks || []; + for (const chunk of this._queuedChunks) { + this._loaded += chunk.byteLength; } - const defs = DrawLayer._svgFactory.createElement("defs"); - root.append(defs); - const path = DrawLayer._svgFactory.createElement("path"); - defs.append(path); - const pathId = `path_p${this.pageIndex}_${id}`; - path.setAttribute("id", pathId); - path.setAttribute("d", outlines.toSVGPath()); - if (isPathUpdatable) { - this.#toUpdate.set(id, path); + this._done = stream._progressiveDone; + this._contentLength = length; + this._isStreamingSupported = !disableStream; + this._isRangeSupported = !disableRange; + if (isPdfFile(contentDispositionFilename)) { + this._filename = contentDispositionFilename; } - const clipPathId = this.#createClipPath(defs, pathId); - const use = DrawLayer._svgFactory.createElement("use"); - root.append(use); - root.setAttribute("fill", color); - root.setAttribute("fill-opacity", opacity); - use.setAttribute("href", `#${pathId}`); - this.#mapping.set(id, root); - return { - id, - clipPathId: `url(#${clipPathId})` - }; + this._headersCapability.resolve(); + const loaded = this._loaded; + Promise.resolve().then(() => { + if (loaded > 0 && this._loaded === loaded) { + this._callOnProgress(); + } + }); } - highlightOutline(outlines) { - const id = this.#id++; - const root = this.#createSVG(outlines.box); - root.classList.add("highlightOutline"); - const defs = DrawLayer._svgFactory.createElement("defs"); - root.append(defs); - const path = DrawLayer._svgFactory.createElement("path"); - defs.append(path); - const pathId = `path_p${this.pageIndex}_${id}`; - path.setAttribute("id", pathId); - path.setAttribute("d", outlines.toSVGPath()); - path.setAttribute("vector-effect", "non-scaling-stroke"); - let maskId; - if (outlines.free) { - root.classList.add("free"); - const mask = DrawLayer._svgFactory.createElement("mask"); - defs.append(mask); - maskId = `mask_p${this.pageIndex}_${id}`; - mask.setAttribute("id", maskId); - mask.setAttribute("maskUnits", "objectBoundingBox"); - const rect = DrawLayer._svgFactory.createElement("rect"); - mask.append(rect); - rect.setAttribute("width", "1"); - rect.setAttribute("height", "1"); - rect.setAttribute("fill", "white"); - const use = DrawLayer._svgFactory.createElement("use"); - mask.append(use); - use.setAttribute("href", `#${pathId}`); - use.setAttribute("stroke", "none"); - use.setAttribute("fill", "black"); - use.setAttribute("fill-rule", "nonzero"); - use.classList.add("mask"); + _enqueue(chunk) { + if (this._done) { + return; } - const use1 = DrawLayer._svgFactory.createElement("use"); - root.append(use1); - use1.setAttribute("href", `#${pathId}`); - if (maskId) { - use1.setAttribute("mask", `url(#${maskId})`); + if (this._requests.length > 0) { + const capability = this._requests.shift(); + capability.resolve({ + value: chunk, + done: false + }); + } else { + this._queuedChunks.push(chunk); } - const use2 = use1.cloneNode(); - root.append(use2); - use1.classList.add("mainOutline"); - use2.classList.add("secondaryOutline"); - this.#mapping.set(id, root); - return id; - } - finalizeLine(id, line) { - const path = this.#toUpdate.get(id); - this.#toUpdate.delete(id); - this.updateBox(id, line.box); - path.setAttribute("d", line.toSVGPath()); - } - updateLine(id, line) { - const root = this.#mapping.get(id); - const defs = root.firstChild; - const path = defs.firstChild; - path.setAttribute("d", line.toSVGPath()); - } - removeFreeHighlight(id) { - this.remove(id); - this.#toUpdate.delete(id); - } - updatePath(id, line) { - this.#toUpdate.get(id).setAttribute("d", line.toSVGPath()); - } - updateBox(id, box) { - DrawLayer.#setBox(this.#mapping.get(id), box); - } - show(id, visible) { - this.#mapping.get(id).classList.toggle("hidden", !visible); - } - rotate(id, angle) { - this.#mapping.get(id).setAttribute("data-main-rotation", angle); + this._loaded += chunk.byteLength; + this._callOnProgress(); } - changeColor(id, color) { - this.#mapping.get(id).setAttribute("fill", color); + async read() { + if (this._queuedChunks.length > 0) { + const chunk = this._queuedChunks.shift(); + return { + value: chunk, + done: false + }; + } + if (this._done) { + return { + value: undefined, + done: true + }; + } + const capability = Promise.withResolvers(); + this._requests.push(capability); + return capability.promise; } - changeOpacity(id, opacity) { - this.#mapping.get(id).setAttribute("fill-opacity", opacity); + cancel(reason) { + this._done = true; + this.#endRequests(); } - addClass(id, className) { - this.#mapping.get(id).classList.add(className); + progressiveDone() { + this._done ||= true; + if (this._queuedChunks.length === 0) { + this.#endRequests(); + } } - removeClass(id, className) { - this.#mapping.get(id).classList.remove(className); +} +class PDFDataTransportStreamRangeReader extends BasePDFStreamRangeReader { + #endRequests = endRequests.bind(this); + onDone = null; + _begin = -1; + _done = false; + _queuedChunk = null; + _requests = []; + constructor(stream, begin, end) { + super(stream, begin, end); + this._begin = begin; } - remove(id) { - if (this.#parent === null) { + _enqueue(chunk) { + if (this._done) { return; } - this.#mapping.get(id).remove(); - this.#mapping.delete(id); + if (this._requests.length === 0) { + this._queuedChunk = chunk; + } else { + const capability = this._requests.shift(); + capability.resolve({ + value: chunk, + done: false + }); + this.#endRequests(); + } + this._done = true; + this.onDone?.(); } - destroy() { - this.#parent = null; - for (const root of this.#mapping.values()) { - root.remove(); + async read() { + if (this._queuedChunk) { + const chunk = this._queuedChunk; + this._queuedChunk = null; + return { + value: chunk, + done: false + }; } - this.#mapping.clear(); + if (this._done) { + return { + value: undefined, + done: true + }; + } + const capability = Promise.withResolvers(); + this._requests.push(capability); + return capability.promise; + } + cancel(reason) { + this._done = true; + this.#endRequests(); + this.onDone?.(); } } +;// ./src/display/network.js -/***/ }), -/***/ 731: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { -// EXPORTS -__webpack_require__.d(__webpack_exports__, { - AnnotationEditorLayer: () => (/* binding */ AnnotationEditorLayer) -}); - -// EXTERNAL MODULE: ./src/shared/util.js -var util = __webpack_require__(292); -// EXTERNAL MODULE: ./src/display/editor/editor.js + 1 modules -var editor_editor = __webpack_require__(310); -// EXTERNAL MODULE: ./src/display/editor/tools.js -var tools = __webpack_require__(830); -// EXTERNAL MODULE: ./src/display/annotation_layer.js + 1 modules -var annotation_layer = __webpack_require__(976); -;// CONCATENATED MODULE: ./src/display/editor/freetext.js - - - - -const EOL_PATTERN = /\r\n?|\n/g; -class FreeTextEditor extends editor_editor.AnnotationEditor { - #boundEditorDivBlur = this.editorDivBlur.bind(this); - #boundEditorDivFocus = this.editorDivFocus.bind(this); - #boundEditorDivInput = this.editorDivInput.bind(this); - #boundEditorDivKeydown = this.editorDivKeydown.bind(this); - #boundEditorDivPaste = this.editorDivPaste.bind(this); - #color; - #content = ""; - #editorDivId = `${this.id}-editor`; - #fontSize; - #initialData = null; - static _freeTextDefaultContent = ""; - static _internalPadding = 0; - static _defaultColor = null; - static _defaultFontSize = 10; - static get _keyboardManager() { - const proto = FreeTextEditor.prototype; - const arrowChecker = self => self.isEmpty(); - const small = tools.AnnotationEditorUIManager.TRANSLATE_SMALL; - const big = tools.AnnotationEditorUIManager.TRANSLATE_BIG; - return (0,util.shadow)(this, "_keyboardManager", new tools.KeyboardManager([[["ctrl+s", "mac+meta+s", "ctrl+p", "mac+meta+p"], proto.commitOrRemove, { - bubbles: true - }], [["ctrl+Enter", "mac+meta+Enter", "Escape", "mac+Escape"], proto.commitOrRemove], [["ArrowLeft", "mac+ArrowLeft"], proto._translateEmpty, { - args: [-small, 0], - checker: arrowChecker - }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto._translateEmpty, { - args: [-big, 0], - checker: arrowChecker - }], [["ArrowRight", "mac+ArrowRight"], proto._translateEmpty, { - args: [small, 0], - checker: arrowChecker - }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto._translateEmpty, { - args: [big, 0], - checker: arrowChecker - }], [["ArrowUp", "mac+ArrowUp"], proto._translateEmpty, { - args: [0, -small], - checker: arrowChecker - }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto._translateEmpty, { - args: [0, -big], - checker: arrowChecker - }], [["ArrowDown", "mac+ArrowDown"], proto._translateEmpty, { - args: [0, small], - checker: arrowChecker - }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto._translateEmpty, { - args: [0, big], - checker: arrowChecker - }]])); - } - static _type = "freetext"; - static _editorType = util.AnnotationEditorType.FREETEXT; - constructor(params) { - super({ - ...params, - name: "freeTextEditor" - }); - this.#color = params.color || FreeTextEditor._defaultColor || editor_editor.AnnotationEditor._defaultLineColor; - this.#fontSize = params.fontSize || FreeTextEditor._defaultFontSize; - } - static initialize(l10n, uiManager) { - editor_editor.AnnotationEditor.initialize(l10n, uiManager, { - strings: ["pdfjs-free-text-default-content"] - }); - const style = getComputedStyle(document.documentElement); - this._internalPadding = parseFloat(style.getPropertyValue("--freetext-padding")); +const OK_RESPONSE = 200; +const PARTIAL_CONTENT_RESPONSE = 206; +function network_getArrayBuffer(val) { + return typeof val !== "string" ? val : stringToBytes(val).buffer; +} +class PDFNetworkStream extends BasePDFStream { + #pendingRequests = new WeakMap(); + _responseOrigin = null; + constructor(source) { + super(source, PDFNetworkStreamReader, PDFNetworkStreamRangeReader); + const { + httpHeaders, + url + } = source; + this.url = url; + this.isHttp = /https?:/.test(url.protocol); + this.headers = createHeaders(this.isHttp, httpHeaders); } - static updateDefaultParams(type, value) { - switch (type) { - case util.AnnotationEditorParamsType.FREETEXT_SIZE: - FreeTextEditor._defaultFontSize = value; - break; - case util.AnnotationEditorParamsType.FREETEXT_COLOR: - FreeTextEditor._defaultColor = value; - break; + _request(args) { + const xhr = new XMLHttpRequest(); + const pendingRequest = { + validateStatus: null, + onHeadersReceived: args.onHeadersReceived, + onDone: args.onDone, + onError: args.onError, + onProgress: args.onProgress + }; + this.#pendingRequests.set(xhr, pendingRequest); + xhr.open("GET", this.url); + xhr.withCredentials = this._source.withCredentials; + for (const [key, val] of this.headers) { + xhr.setRequestHeader(key, val); } - } - updateParams(type, value) { - switch (type) { - case util.AnnotationEditorParamsType.FREETEXT_SIZE: - this.#updateFontSize(value); - break; - case util.AnnotationEditorParamsType.FREETEXT_COLOR: - this.#updateColor(value); - break; + if (this.isHttp && "begin" in args && "end" in args) { + xhr.setRequestHeader("Range", `bytes=${args.begin}-${args.end - 1}`); + pendingRequest.validateStatus = status => status === PARTIAL_CONTENT_RESPONSE || status === OK_RESPONSE; + } else { + pendingRequest.validateStatus = status => status === OK_RESPONSE; } + xhr.responseType = "arraybuffer"; + assert(args.onError, "Expected `onError` callback to be provided."); + xhr.onerror = () => args.onError(xhr.status); + xhr.onreadystatechange = this.#onStateChange.bind(this, xhr); + xhr.onprogress = this.#onProgress.bind(this, xhr); + xhr.send(null); + return xhr; } - static get defaultPropertiesToUpdate() { - return [[util.AnnotationEditorParamsType.FREETEXT_SIZE, FreeTextEditor._defaultFontSize], [util.AnnotationEditorParamsType.FREETEXT_COLOR, FreeTextEditor._defaultColor || editor_editor.AnnotationEditor._defaultLineColor]]; - } - get propertiesToUpdate() { - return [[util.AnnotationEditorParamsType.FREETEXT_SIZE, this.#fontSize], [util.AnnotationEditorParamsType.FREETEXT_COLOR, this.#color]]; - } - #updateFontSize(fontSize) { - const setFontsize = size => { - this.editorDiv.style.fontSize = `calc(${size}px * var(--scale-factor))`; - this.translate(0, -(size - this.#fontSize) * this.parentScale); - this.#fontSize = size; - this.#setEditorDimensions(); - }; - const savedFontsize = this.#fontSize; - this.addCommands({ - cmd: setFontsize.bind(this, fontSize), - undo: setFontsize.bind(this, savedFontsize), - post: this._uiManager.updateUI.bind(this._uiManager, this), - mustExec: true, - type: util.AnnotationEditorParamsType.FREETEXT_SIZE, - overwriteIfSameType: true, - keepUndo: true - }); - } - #updateColor(color) { - const setColor = col => { - this.#color = this.editorDiv.style.color = col; - }; - const savedColor = this.#color; - this.addCommands({ - cmd: setColor.bind(this, color), - undo: setColor.bind(this, savedColor), - post: this._uiManager.updateUI.bind(this._uiManager, this), - mustExec: true, - type: util.AnnotationEditorParamsType.FREETEXT_COLOR, - overwriteIfSameType: true, - keepUndo: true - }); - } - _translateEmpty(x, y) { - this._uiManager.translateSelectedEditors(x, y, true); - } - getInitialTranslation() { - const scale = this.parentScale; - return [-FreeTextEditor._internalPadding * scale, -(FreeTextEditor._internalPadding + this.#fontSize) * scale]; + #onProgress(xhr, evt) { + const pendingRequest = this.#pendingRequests.get(xhr); + pendingRequest?.onProgress?.(evt); } - rebuild() { - if (!this.parent) { - return; - } - super.rebuild(); - if (this.div === null) { + #onStateChange(xhr, evt) { + const pendingRequest = this.#pendingRequests.get(xhr); + if (!pendingRequest) { return; } - if (!this.isAttachedToDOM) { - this.parent.add(this); + if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) { + pendingRequest.onHeadersReceived(); + delete pendingRequest.onHeadersReceived; } - } - enableEditMode() { - if (this.isInEditMode()) { + if (xhr.readyState !== 4) { return; } - this.parent.setEditingState(false); - this.parent.updateToolbar(util.AnnotationEditorType.FREETEXT); - super.enableEditMode(); - this.overlayDiv.classList.remove("enabled"); - this.editorDiv.contentEditable = true; - this._isDraggable = false; - this.div.removeAttribute("aria-activedescendant"); - this.editorDiv.addEventListener("keydown", this.#boundEditorDivKeydown); - this.editorDiv.addEventListener("focus", this.#boundEditorDivFocus); - this.editorDiv.addEventListener("blur", this.#boundEditorDivBlur); - this.editorDiv.addEventListener("input", this.#boundEditorDivInput); - this.editorDiv.addEventListener("paste", this.#boundEditorDivPaste); - } - disableEditMode() { - if (!this.isInEditMode()) { + if (!this.#pendingRequests.has(xhr)) { return; } - this.parent.setEditingState(true); - super.disableEditMode(); - this.overlayDiv.classList.add("enabled"); - this.editorDiv.contentEditable = false; - this.div.setAttribute("aria-activedescendant", this.#editorDivId); - this._isDraggable = true; - this.editorDiv.removeEventListener("keydown", this.#boundEditorDivKeydown); - this.editorDiv.removeEventListener("focus", this.#boundEditorDivFocus); - this.editorDiv.removeEventListener("blur", this.#boundEditorDivBlur); - this.editorDiv.removeEventListener("input", this.#boundEditorDivInput); - this.editorDiv.removeEventListener("paste", this.#boundEditorDivPaste); - this.div.focus({ - preventScroll: true - }); - this.isEditing = false; - this.parent.div.classList.add("freetextEditing"); - } - focusin(event) { - if (!this._focusEventsAllowed) { + this.#pendingRequests.delete(xhr); + if (xhr.status === 0 && this.isHttp) { + pendingRequest.onError(xhr.status); return; } - super.focusin(event); - if (event.target !== this.editorDiv) { - this.editorDiv.focus(); - } - } - onceAdded() { - if (this.width) { + const xhrStatus = xhr.status || OK_RESPONSE; + if (!pendingRequest.validateStatus(xhrStatus)) { + pendingRequest.onError(xhr.status); return; } - this.enableEditMode(); - this.editorDiv.focus(); - if (this._initialOptions?.isCentered) { - this.center(); + const chunk = network_getArrayBuffer(xhr.response); + if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { + const rangeHeader = xhr.getResponseHeader("Content-Range"); + if (/bytes \d+-\d+\/\d+/.test(rangeHeader)) { + pendingRequest.onDone(chunk); + } else { + warn(`Missing or invalid "Content-Range" header.`); + pendingRequest.onError(0); + } + } else if (chunk) { + pendingRequest.onDone(chunk); + } else { + pendingRequest.onError(xhr.status); } - this._initialOptions = null; - } - isEmpty() { - return !this.editorDiv || this.editorDiv.innerText.trim() === ""; } - remove() { - this.isEditing = false; - if (this.parent) { - this.parent.setEditingState(true); - this.parent.div.classList.add("freetextEditing"); + _abortRequest(xhr) { + if (this.#pendingRequests.has(xhr)) { + this.#pendingRequests.delete(xhr); + xhr.abort(); } - super.remove(); } - #extractText() { - const buffer = []; - this.editorDiv.normalize(); - for (const child of this.editorDiv.childNodes) { - buffer.push(FreeTextEditor.#getNodeContent(child)); + getRangeReader(begin, end) { + const reader = super.getRangeReader(begin, end); + if (reader) { + reader.onClosed = () => this._rangeReaders.delete(reader); } - return buffer.join("\n"); + return reader; } - #setEditorDimensions() { - const [parentWidth, parentHeight] = this.parentDimensions; - let rect; - if (this.isAttachedToDOM) { - rect = this.div.getBoundingClientRect(); - } else { - const { - currentLayer, - div - } = this; - const savedDisplay = div.style.display; - div.style.display = "hidden"; - currentLayer.div.append(this.div); - rect = div.getBoundingClientRect(); - div.remove(); - div.style.display = savedDisplay; - } - if (this.rotation % 180 === this.parentRotation % 180) { - this.width = rect.width / parentWidth; - this.height = rect.height / parentHeight; - } else { - this.width = rect.height / parentWidth; - this.height = rect.width / parentHeight; +} +class PDFNetworkStreamReader extends BasePDFStreamReader { + #endRequests = endRequests.bind(this); + _cachedChunks = []; + _done = false; + _requests = []; + _storedError = null; + constructor(stream) { + super(stream); + this._fullRequestXhr = stream._request({ + onHeadersReceived: this.#onHeadersReceived.bind(this), + onDone: this.#onDone.bind(this), + onError: this.#onError.bind(this), + onProgress: this.#onProgress.bind(this) + }); + } + #onHeadersReceived() { + const stream = this._stream; + const { + disableRange, + rangeChunkSize + } = stream._source; + const fullRequestXhr = this._fullRequestXhr; + stream._responseOrigin = getResponseOrigin(fullRequestXhr.responseURL); + const rawResponseHeaders = fullRequestXhr.getAllResponseHeaders(); + const responseHeaders = new Headers(rawResponseHeaders ? rawResponseHeaders.trimStart().replace(/[^\S ]+$/, "").split(/[\r\n]+/).map(x => { + const [key, ...val] = x.split(": "); + return [key, val.join(": ")]; + }) : []); + const { + contentLength, + isRangeSupported + } = validateRangeRequestCapabilities({ + responseHeaders, + isHttp: stream.isHttp, + rangeChunkSize, + disableRange + }); + this._contentLength = contentLength; + this._isRangeSupported = isRangeSupported; + this._filename = extractFilenameFromHeader(responseHeaders); + if (this._isRangeSupported) { + stream._abortRequest(fullRequestXhr); } - this.fixAndSetPosition(); + this._headersCapability.resolve(); } - commit() { - if (!this.isInEditMode()) { - return; + #onDone(chunk) { + if (this._requests.length > 0) { + const capability = this._requests.shift(); + capability.resolve({ + value: chunk, + done: false + }); + } else { + this._cachedChunks.push(chunk); } - super.commit(); - this.disableEditMode(); - const savedText = this.#content; - const newText = this.#content = this.#extractText().trimEnd(); - if (savedText === newText) { - return; + this._done = true; + if (this._cachedChunks.length === 0) { + this.#endRequests(); } - const setText = text => { - this.#content = text; - if (!text) { - this.remove(); - return; - } - this.#setContent(); - this._uiManager.rebuild(this); - this.#setEditorDimensions(); - }; - this.addCommands({ - cmd: () => { - setText(newText); - }, - undo: () => { - setText(savedText); - }, - mustExec: false - }); - this.#setEditorDimensions(); - } - shouldGetKeyboardEvents() { - return this.isInEditMode(); } - enterInEditMode() { - this.enableEditMode(); - this.editorDiv.focus(); - } - dblclick(event) { - this.enterInEditMode(); - } - keydown(event) { - if (event.target === this.div && event.key === "Enter") { - this.enterInEditMode(); - event.preventDefault(); + #onError(status) { + this._storedError = createResponseError(status, this._stream.url); + this._headersCapability.reject(this._storedError); + for (const capability of this._requests) { + capability.reject(this._storedError); } + this._requests.length = 0; + this._cachedChunks.length = 0; } - editorDivKeydown(event) { - FreeTextEditor._keyboardManager.exec(this, event); - } - editorDivFocus(event) { - this.isEditing = true; - } - editorDivBlur(event) { - this.isEditing = false; - } - editorDivInput(event) { - this.parent.div.classList.toggle("freetextEditing", this.isEmpty()); - } - disableEditing() { - this.editorDiv.setAttribute("role", "comment"); - this.editorDiv.removeAttribute("aria-multiline"); - } - enableEditing() { - this.editorDiv.setAttribute("role", "textbox"); - this.editorDiv.setAttribute("aria-multiline", true); + #onProgress(evt) { + this.onProgress?.({ + loaded: evt.loaded, + total: evt.lengthComputable ? evt.total : this._contentLength + }); } - render() { - if (this.div) { - return this.div; + async read() { + await this._headersCapability.promise; + if (this._storedError) { + throw this._storedError; } - let baseX, baseY; - if (this.width) { - baseX = this.x; - baseY = this.y; + if (this._cachedChunks.length > 0) { + const chunk = this._cachedChunks.shift(); + return { + value: chunk, + done: false + }; } - super.render(); - this.editorDiv = document.createElement("div"); - this.editorDiv.className = "internal"; - this.editorDiv.setAttribute("id", this.#editorDivId); - this.editorDiv.setAttribute("data-l10n-id", "pdfjs-free-text"); - this.enableEditing(); - editor_editor.AnnotationEditor._l10nPromise.get("pdfjs-free-text-default-content").then(msg => this.editorDiv?.setAttribute("default-content", msg)); - this.editorDiv.contentEditable = true; - const { - style - } = this.editorDiv; - style.fontSize = `calc(${this.#fontSize}px * var(--scale-factor))`; - style.color = this.#color; - this.div.append(this.editorDiv); - this.overlayDiv = document.createElement("div"); - this.overlayDiv.classList.add("overlay", "enabled"); - this.div.append(this.overlayDiv); - (0,tools.bindEvents)(this, this.div, ["dblclick", "keydown"]); - if (this.width) { - const [parentWidth, parentHeight] = this.parentDimensions; - if (this.annotationElementId) { - const { - position - } = this.#initialData; - let [tx, ty] = this.getInitialTranslation(); - [tx, ty] = this.pageTranslationToScreen(tx, ty); - const [pageWidth, pageHeight] = this.pageDimensions; - const [pageX, pageY] = this.pageTranslation; - let posX, posY; - switch (this.rotation) { - case 0: - posX = baseX + (position[0] - pageX) / pageWidth; - posY = baseY + this.height - (position[1] - pageY) / pageHeight; - break; - case 90: - posX = baseX + (position[0] - pageX) / pageWidth; - posY = baseY - (position[1] - pageY) / pageHeight; - [tx, ty] = [ty, -tx]; - break; - case 180: - posX = baseX - this.width + (position[0] - pageX) / pageWidth; - posY = baseY - (position[1] - pageY) / pageHeight; - [tx, ty] = [-tx, -ty]; - break; - case 270: - posX = baseX + (position[0] - pageX - this.height * pageHeight) / pageWidth; - posY = baseY + (position[1] - pageY - this.width * pageWidth) / pageHeight; - [tx, ty] = [-ty, tx]; - break; - } - this.setAt(posX * parentWidth, posY * parentHeight, tx, ty); - } else { - this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight); - } - this.#setContent(); - this._isDraggable = true; - this.editorDiv.contentEditable = false; - } else { - this._isDraggable = false; - this.editorDiv.contentEditable = true; + if (this._done) { + return { + value: undefined, + done: true + }; } - return this.div; + const capability = Promise.withResolvers(); + this._requests.push(capability); + return capability.promise; } - static #getNodeContent(node) { - return (node.nodeType === Node.TEXT_NODE ? node.nodeValue : node.innerText).replaceAll(EOL_PATTERN, ""); + cancel(reason) { + this._done = true; + this._headersCapability.reject(reason); + this.#endRequests(); + this._stream._abortRequest(this._fullRequestXhr); + this._fullRequestXhr = null; } - editorDivPaste(event) { - const clipboardData = event.clipboardData || window.clipboardData; - const { - types - } = clipboardData; - if (types.length === 1 && types[0] === "text/plain") { - return; - } - event.preventDefault(); - const paste = FreeTextEditor.#deserializeContent(clipboardData.getData("text") || "").replaceAll(EOL_PATTERN, "\n"); - if (!paste) { - return; - } - const selection = window.getSelection(); - if (!selection.rangeCount) { - return; - } - this.editorDiv.normalize(); - selection.deleteFromDocument(); - const range = selection.getRangeAt(0); - if (!paste.includes("\n")) { - range.insertNode(document.createTextNode(paste)); - this.editorDiv.normalize(); - selection.collapseToStart(); - return; - } - const { - startContainer, - startOffset - } = range; - const bufferBefore = []; - const bufferAfter = []; - if (startContainer.nodeType === Node.TEXT_NODE) { - const parent = startContainer.parentElement; - bufferAfter.push(startContainer.nodeValue.slice(startOffset).replaceAll(EOL_PATTERN, "")); - if (parent !== this.editorDiv) { - let buffer = bufferBefore; - for (const child of this.editorDiv.childNodes) { - if (child === parent) { - buffer = bufferAfter; - continue; - } - buffer.push(FreeTextEditor.#getNodeContent(child)); - } - } - bufferBefore.push(startContainer.nodeValue.slice(0, startOffset).replaceAll(EOL_PATTERN, "")); - } else if (startContainer === this.editorDiv) { - let buffer = bufferBefore; - let i = 0; - for (const child of this.editorDiv.childNodes) { - if (i++ === startOffset) { - buffer = bufferAfter; - } - buffer.push(FreeTextEditor.#getNodeContent(child)); - } - } - this.#content = `${bufferBefore.join("\n")}${paste}${bufferAfter.join("\n")}`; - this.#setContent(); - const newRange = new Range(); - let beforeLength = bufferBefore.reduce((acc, line) => acc + line.length, 0); - for (const { - firstChild - } of this.editorDiv.childNodes) { - if (firstChild.nodeType === Node.TEXT_NODE) { - const length = firstChild.nodeValue.length; - if (beforeLength <= length) { - newRange.setStart(firstChild, beforeLength); - newRange.setEnd(firstChild, beforeLength); - break; - } - beforeLength -= length; - } - } - selection.removeAllRanges(); - selection.addRange(newRange); +} +class PDFNetworkStreamRangeReader extends BasePDFStreamRangeReader { + #endRequests = endRequests.bind(this); + onClosed = null; + _done = false; + _queuedChunk = null; + _requests = []; + _storedError = null; + constructor(stream, begin, end) { + super(stream, begin, end); + this._requestXhr = stream._request({ + begin, + end, + onHeadersReceived: this.#onHeadersReceived.bind(this), + onDone: this.#onDone.bind(this), + onError: this.#onError.bind(this), + onProgress: null + }); } - #setContent() { - this.editorDiv.replaceChildren(); - if (!this.#content) { - return; - } - for (const line of this.#content.split("\n")) { - const div = document.createElement("div"); - div.append(line ? document.createTextNode(line) : document.createElement("br")); - this.editorDiv.append(div); + #onHeadersReceived() { + const responseOrigin = getResponseOrigin(this._requestXhr?.responseURL); + try { + ensureResponseOrigin(responseOrigin, this._stream._responseOrigin); + } catch (ex) { + this._storedError = ex; + this.#onError(0); } } - #serializeContent() { - return this.#content.replaceAll("\xa0", " "); - } - static #deserializeContent(content) { - return content.replaceAll(" ", "\xa0"); - } - get contentDiv() { - return this.editorDiv; + #onDone(chunk) { + if (this._requests.length > 0) { + const capability = this._requests.shift(); + capability.resolve({ + value: chunk, + done: false + }); + } else { + this._queuedChunk = chunk; + } + this._done = true; + this.#endRequests(); + this.onClosed?.(); } - static deserialize(data, parent, uiManager) { - let initialData = null; - if (data instanceof annotation_layer.FreeTextAnnotationElement) { - const { - data: { - defaultAppearanceData: { - fontSize, - fontColor - }, - rect, - rotation, - id - }, - textContent, - textPosition, - parent: { - page: { - pageNumber - } - } - } = data; - if (!textContent || textContent.length === 0) { - return null; - } - initialData = data = { - annotationType: util.AnnotationEditorType.FREETEXT, - color: Array.from(fontColor), - fontSize, - value: textContent.join("\n"), - position: textPosition, - pageIndex: pageNumber - 1, - rect, - rotation, - id, - deleted: false - }; + #onError(status) { + this._storedError ??= createResponseError(status, this._stream.url); + for (const capability of this._requests) { + capability.reject(this._storedError); } - const editor = super.deserialize(data, parent, uiManager); - editor.#fontSize = data.fontSize; - editor.#color = util.Util.makeHexColor(...data.color); - editor.#content = FreeTextEditor.#deserializeContent(data.value); - editor.annotationElementId = data.id || null; - editor.#initialData = initialData; - return editor; + this._requests.length = 0; + this._queuedChunk = null; } - serialize(isForCopying = false) { - if (this.isEmpty()) { - return null; + async read() { + if (this._storedError) { + throw this._storedError; } - if (this.deleted) { + if (this._queuedChunk !== null) { + const chunk = this._queuedChunk; + this._queuedChunk = null; return { - pageIndex: this.pageIndex, - id: this.annotationElementId, - deleted: true + value: chunk, + done: false }; } - const padding = FreeTextEditor._internalPadding * this.parentScale; - const rect = this.getRect(padding, padding); - const color = editor_editor.AnnotationEditor._colorManager.convert(this.isAttachedToDOM ? getComputedStyle(this.editorDiv).color : this.#color); - const serialized = { - annotationType: util.AnnotationEditorType.FREETEXT, - color, - fontSize: this.#fontSize, - value: this.#serializeContent(), - pageIndex: this.pageIndex, - rect, - rotation: this.rotation, - structTreeParentId: this._structTreeParentId - }; - if (isForCopying) { - return serialized; - } - if (this.annotationElementId && !this.#hasElementChanged(serialized)) { - return null; + if (this._done) { + return { + value: undefined, + done: true + }; } - serialized.id = this.annotationElementId; - return serialized; + const capability = Promise.withResolvers(); + this._requests.push(capability); + return capability.promise; } - #hasElementChanged(serialized) { - const { - value, - fontSize, - color, - pageIndex - } = this.#initialData; - return this._hasBeenMoved || serialized.value !== value || serialized.fontSize !== fontSize || serialized.color.some((c, i) => c !== color[i]) || serialized.pageIndex !== pageIndex; + cancel(reason) { + this._done = true; + this.#endRequests(); + this._stream._abortRequest(this._requestXhr); + this.onClosed?.(); } } -// EXTERNAL MODULE: ./src/display/editor/outliner.js -var editor_outliner = __webpack_require__(61); -// EXTERNAL MODULE: ./src/display/editor/color_picker.js -var color_picker = __webpack_require__(259); -// EXTERNAL MODULE: ./src/display/display_utils.js -var display_utils = __webpack_require__(419); -;// CONCATENATED MODULE: ./src/display/editor/highlight.js +;// ./src/display/node_stream.js - - -class HighlightEditor extends editor_editor.AnnotationEditor { - #anchorNode = null; - #anchorOffset = 0; - #boxes; - #clipPathId = null; - #colorPicker = null; - #focusOutlines = null; - #focusNode = null; - #focusOffset = 0; - #highlightDiv = null; - #highlightOutlines = null; - #id = null; - #isFreeHighlight = false; - #boundKeydown = this.#keydown.bind(this); - #lastPoint = null; - #opacity; - #outlineId = null; - #text = ""; - #thickness; - #methodOfCreation = ""; - static _defaultColor = null; - static _defaultOpacity = 1; - static _defaultThickness = 12; - static _l10nPromise; - static _type = "highlight"; - static _editorType = util.AnnotationEditorType.HIGHLIGHT; - static _freeHighlightId = -1; - static _freeHighlight = null; - static _freeHighlightClipId = ""; - static get _keyboardManager() { - const proto = HighlightEditor.prototype; - return (0,util.shadow)(this, "_keyboardManager", new tools.KeyboardManager([[["ArrowLeft", "mac+ArrowLeft"], proto._moveCaret, { - args: [0] - }], [["ArrowRight", "mac+ArrowRight"], proto._moveCaret, { - args: [1] - }], [["ArrowUp", "mac+ArrowUp"], proto._moveCaret, { - args: [2] - }], [["ArrowDown", "mac+ArrowDown"], proto._moveCaret, { - args: [3] - }]])); +function getReadableStream(url, opts = null) { + const fs = process.getBuiltinModule("fs"); + const { + Readable + } = process.getBuiltinModule("stream"); + const readStream = fs.createReadStream(url, opts); + return Readable.toWeb(readStream); +} +class PDFNodeStream extends BasePDFStream { + constructor(source) { + super(source, PDFNodeStreamReader, PDFNodeStreamRangeReader); + const { + url + } = source; + assert(url.protocol === "file:", "PDFNodeStream only supports file:// URLs."); } - constructor(params) { - super({ - ...params, - name: "highlightEditor" +} +class PDFNodeStreamReader extends BasePDFStreamReader { + _reader = null; + constructor(stream) { + super(stream); + const { + disableRange, + disableStream, + rangeChunkSize, + url + } = stream._source; + this._isStreamingSupported = !disableStream; + const fs = process.getBuiltinModule("fs/promises"); + fs.lstat(url).then(stat => { + const readableStream = getReadableStream(url); + this._reader = readableStream.getReader(); + const { + size + } = stat; + this._contentLength = size; + this._isRangeSupported = !disableRange && size > 2 * rangeChunkSize; + if (!this._isStreamingSupported && this._isRangeSupported) { + this.cancel(new AbortException("Streaming is disabled.")); + } + this._headersCapability.resolve(); + }).catch(error => { + if (error.code === "ENOENT") { + error = createResponseError(0, url); + } + this._headersCapability.reject(error); }); - this.color = params.color || HighlightEditor._defaultColor; - this.#thickness = params.thickness || HighlightEditor._defaultThickness; - this.#opacity = params.opacity || HighlightEditor._defaultOpacity; - this.#boxes = params.boxes || null; - this.#methodOfCreation = params.methodOfCreation || ""; - this.#text = params.text || ""; - this._isDraggable = false; - if (params.highlightId > -1) { - this.#isFreeHighlight = true; - this.#createFreeOutlines(params); - this.#addToDrawLayer(); - } else { - this.#anchorNode = params.anchorNode; - this.#anchorOffset = params.anchorOffset; - this.#focusNode = params.focusNode; - this.#focusOffset = params.focusOffset; - this.#createOutlines(); - this.#addToDrawLayer(); - this.rotate(this.rotation); - } - } - get telemetryInitialData() { - return { - action: "added", - type: this.#isFreeHighlight ? "free_highlight" : "highlight", - color: this._uiManager.highlightColorNames.get(this.color), - thickness: this.#thickness, - methodOfCreation: this.#methodOfCreation - }; } - get telemetryFinalData() { + async read() { + await this._headersCapability.promise; + const { + value, + done + } = await this._reader.read(); + if (done) { + return { + value, + done + }; + } + this._loaded += value.byteLength; + this._callOnProgress(); return { - type: "highlight", - color: this._uiManager.highlightColorNames.get(this.color) + value: getArrayBuffer(value), + done: false }; } - static computeTelemetryFinalData(data) { - return { - numberOfColors: data.get("color").size - }; + cancel(reason) { + this._reader?.cancel(reason); } - #createOutlines() { - const outliner = new editor_outliner.Outliner(this.#boxes, 0.001); - this.#highlightOutlines = outliner.getOutlines(); - ({ - x: this.x, - y: this.y, - width: this.width, - height: this.height - } = this.#highlightOutlines.box); - const outlinerForOutline = new editor_outliner.Outliner(this.#boxes, 0.0025, 0.001, this._uiManager.direction === "ltr"); - this.#focusOutlines = outlinerForOutline.getOutlines(); +} +class PDFNodeStreamRangeReader extends BasePDFStreamRangeReader { + _readCapability = Promise.withResolvers(); + _reader = null; + constructor(stream, begin, end) { + super(stream, begin, end); const { - lastPoint - } = this.#focusOutlines.box; - this.#lastPoint = [(lastPoint[0] - this.x) / this.width, (lastPoint[1] - this.y) / this.height]; - } - #createFreeOutlines({ - highlightOutlines, - highlightId, - clipPathId - }) { - this.#highlightOutlines = highlightOutlines; - const extraThickness = 1.5; - this.#focusOutlines = highlightOutlines.getNewOutline(this.#thickness / 2 + extraThickness, 0.0025); - if (highlightId >= 0) { - this.#id = highlightId; - this.#clipPathId = clipPathId; - this.parent.drawLayer.finalizeLine(highlightId, highlightOutlines); - this.#outlineId = this.parent.drawLayer.highlightOutline(this.#focusOutlines); - } else if (this.parent) { - const angle = this.parent.viewport.rotation; - this.parent.drawLayer.updateLine(this.#id, highlightOutlines); - this.parent.drawLayer.updateBox(this.#id, HighlightEditor.#rotateBbox(this.#highlightOutlines.box, (angle - this.rotation + 360) % 360)); - this.parent.drawLayer.updateLine(this.#outlineId, this.#focusOutlines); - this.parent.drawLayer.updateBox(this.#outlineId, HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle)); + url + } = stream._source; + try { + const readableStream = getReadableStream(url, { + start: begin, + end: end - 1 + }); + this._reader = readableStream.getReader(); + this._readCapability.resolve(); + } catch (error) { + this._readCapability.reject(error); } + } + async read() { + await this._readCapability.promise; const { - x, - y, - width, - height - } = highlightOutlines.box; - switch (this.rotation) { - case 0: - this.x = x; - this.y = y; - this.width = width; - this.height = height; - break; - case 90: - { - const [pageWidth, pageHeight] = this.parentDimensions; - this.x = y; - this.y = 1 - x; - this.width = width * pageHeight / pageWidth; - this.height = height * pageWidth / pageHeight; - break; - } - case 180: - this.x = 1 - x; - this.y = 1 - y; - this.width = width; - this.height = height; - break; - case 270: - { - const [pageWidth, pageHeight] = this.parentDimensions; - this.x = 1 - y; - this.y = x; - this.width = width * pageHeight / pageWidth; - this.height = height * pageWidth / pageHeight; - break; - } + value, + done + } = await this._reader.read(); + if (done) { + return { + value, + done + }; } - const { - lastPoint - } = this.#focusOutlines.box; - this.#lastPoint = [(lastPoint[0] - x) / width, (lastPoint[1] - y) / height]; - } - static initialize(l10n, uiManager) { - editor_editor.AnnotationEditor.initialize(l10n, uiManager); - HighlightEditor._defaultColor ||= uiManager.highlightColors?.values().next().value || "#fff066"; + return { + value: getArrayBuffer(value), + done: false + }; } - static updateDefaultParams(type, value) { - switch (type) { - case util.AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR: - HighlightEditor._defaultColor = value; - break; - case util.AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: - HighlightEditor._defaultThickness = value; - break; - } + cancel(reason) { + this._reader?.cancel(reason); } - translateInPage(x, y) {} - get toolbarPosition() { - return this.#lastPoint; +} + +;// ./src/display/network_stream.js + + + + + +function getNetworkStream(url) { + return isValidFetchUrl(url) ? PDFFetchStream : isNodeJS ? PDFNodeStream : PDFNetworkStream; +} + +;// ./src/display/worker_options.js +class GlobalWorkerOptions { + static #port = null; + static #src = ""; + static get workerPort() { + return this.#port; } - updateParams(type, value) { - switch (type) { - case util.AnnotationEditorParamsType.HIGHLIGHT_COLOR: - this.#updateColor(value); - break; - case util.AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: - this.#updateThickness(value); - break; + static set workerPort(val) { + if (!(typeof Worker !== "undefined" && val instanceof Worker) && val !== null) { + throw new Error("Invalid `workerPort` type."); } + this.#port = val; } - static get defaultPropertiesToUpdate() { - return [[util.AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR, HighlightEditor._defaultColor], [util.AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, HighlightEditor._defaultThickness]]; - } - get propertiesToUpdate() { - return [[util.AnnotationEditorParamsType.HIGHLIGHT_COLOR, this.color || HighlightEditor._defaultColor], [util.AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, this.#thickness || HighlightEditor._defaultThickness], [util.AnnotationEditorParamsType.HIGHLIGHT_FREE, this.#isFreeHighlight]]; - } - #updateColor(color) { - const setColor = col => { - this.color = col; - this.parent?.drawLayer.changeColor(this.#id, col); - this.#colorPicker?.updateColor(col); - }; - const savedColor = this.color; - this.addCommands({ - cmd: setColor.bind(this, color), - undo: setColor.bind(this, savedColor), - post: this._uiManager.updateUI.bind(this._uiManager, this), - mustExec: true, - type: util.AnnotationEditorParamsType.HIGHLIGHT_COLOR, - overwriteIfSameType: true, - keepUndo: true - }); - this._reportTelemetry({ - action: "color_changed", - color: this._uiManager.highlightColorNames.get(color) - }, true); - } - #updateThickness(thickness) { - const savedThickness = this.#thickness; - const setThickness = th => { - this.#thickness = th; - this.#changeThickness(th); - }; - this.addCommands({ - cmd: setThickness.bind(this, thickness), - undo: setThickness.bind(this, savedThickness), - post: this._uiManager.updateUI.bind(this._uiManager, this), - mustExec: true, - type: util.AnnotationEditorParamsType.INK_THICKNESS, - overwriteIfSameType: true, - keepUndo: true - }); - this._reportTelemetry({ - action: "thickness_changed", - thickness - }, true); + static get workerSrc() { + return this.#src; } - async addEditToolbar() { - const toolbar = await super.addEditToolbar(); - if (!toolbar) { - return null; - } - if (this._uiManager.highlightColors) { - this.#colorPicker = new color_picker.ColorPicker({ - editor: this - }); - toolbar.addColorPicker(this.#colorPicker); + static set workerSrc(val) { + if (typeof val !== "string") { + throw new Error("Invalid `workerSrc` type."); } - return toolbar; - } - disableEditing() { - super.disableEditing(); - this.div.classList.toggle("disabled", true); - } - enableEditing() { - super.enableEditing(); - this.div.classList.toggle("disabled", false); - } - fixAndSetPosition() { - return super.fixAndSetPosition(this.#getRotation()); + this.#src = val; } - getBaseTranslation() { - return [0, 0]; +} + +;// ./src/display/metadata.js +class Metadata { + #map; + #data; + constructor({ + parsedData, + rawData + }) { + this.#map = parsedData; + this.#data = rawData; } - getRect(tx, ty) { - return super.getRect(tx, ty, this.#getRotation()); + getRaw() { + return this.#data; } - onceAdded() { - this.parent.addUndoableEditor(this); - this.div.focus(); + get(name) { + return this.#map.get(name) ?? null; } - remove() { - this.#cleanDrawLayer(); - this._reportTelemetry({ - action: "deleted" - }); - super.remove(); + [Symbol.iterator]() { + return this.#map.entries(); } - rebuild() { - if (!this.parent) { - return; - } - super.rebuild(); - if (this.div === null) { - return; - } - this.#addToDrawLayer(); - if (!this.isAttachedToDOM) { - this.parent.add(this); - } +} + +;// ./src/display/optional_content_config.js + + +const INTERNAL = Symbol("INTERNAL"); +class OptionalContentGroup { + #isDisplay = false; + #isPrint = false; + #userSet = false; + #visible = true; + constructor(renderingIntent, { + name, + intent, + usage, + rbGroups + }) { + this.#isDisplay = !!(renderingIntent & RenderingIntentFlag.DISPLAY); + this.#isPrint = !!(renderingIntent & RenderingIntentFlag.PRINT); + this.name = name; + this.intent = intent; + this.usage = usage; + this.rbGroups = rbGroups; } - setParent(parent) { - let mustBeSelected = false; - if (this.parent && !parent) { - this.#cleanDrawLayer(); - } else if (parent) { - this.#addToDrawLayer(parent); - mustBeSelected = !this.parent && this.div?.classList.contains("selectedEditor"); - } - super.setParent(parent); - this.show(this._isVisible); - if (mustBeSelected) { - this.select(); + get visible() { + if (this.#userSet) { + return this.#visible; } - } - #changeThickness(thickness) { - if (!this.#isFreeHighlight) { - return; + if (!this.#visible) { + return false; } - this.#createFreeOutlines({ - highlightOutlines: this.#highlightOutlines.getNewOutline(thickness / 2) - }); - this.fixAndSetPosition(); - const [parentWidth, parentHeight] = this.parentDimensions; - this.setDims(this.width * parentWidth, this.height * parentHeight); - } - #cleanDrawLayer() { - if (this.#id === null || !this.parent) { - return; + const { + print, + view + } = this.usage; + if (this.#isDisplay) { + return view?.viewState !== "OFF"; + } else if (this.#isPrint) { + return print?.printState !== "OFF"; } - this.parent.drawLayer.remove(this.#id); - this.#id = null; - this.parent.drawLayer.remove(this.#outlineId); - this.#outlineId = null; + return true; } - #addToDrawLayer(parent = this.parent) { - if (this.#id !== null) { - return; - } - ({ - id: this.#id, - clipPathId: this.#clipPathId - } = parent.drawLayer.highlight(this.#highlightOutlines, this.color, this.#opacity)); - this.#outlineId = parent.drawLayer.highlightOutline(this.#focusOutlines); - if (this.#highlightDiv) { - this.#highlightDiv.style.clipPath = this.#clipPathId; + _setVisible(internal, visible, userSet = false) { + if (internal !== INTERNAL) { + unreachable("Internal method `_setVisible` called."); } + this.#userSet = userSet; + this.#visible = visible; } - static #rotateBbox({ - x, - y, - width, - height - }, angle) { - switch (angle) { - case 90: - return { - x: 1 - y - height, - y: x, - width: height, - height: width - }; - case 180: - return { - x: 1 - x - width, - y: 1 - y - height, - width, - height - }; - case 270: - return { - x: y, - y: 1 - x - width, - width: height, - height: width - }; - } + get serializable() { return { - x, - y, - width, - height + userSet: this.#userSet, + visible: this.#visible }; } - rotate(angle) { - const { - drawLayer - } = this.parent; - let box; - if (this.#isFreeHighlight) { - angle = (angle - this.rotation + 360) % 360; - box = HighlightEditor.#rotateBbox(this.#highlightOutlines.box, angle); - } else { - box = HighlightEditor.#rotateBbox(this, angle); - } - drawLayer.rotate(this.#id, angle); - drawLayer.rotate(this.#outlineId, angle); - drawLayer.updateBox(this.#id, box); - drawLayer.updateBox(this.#outlineId, HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle)); - } - render() { - if (this.div) { - return this.div; +} +class OptionalContentConfig { + #cachedGetHash = null; + #groups = new Map(); + #initialHash = null; + #order = null; + #rawData; + creator = null; + name = null; + constructor(data, renderingIntent = RenderingIntentFlag.DISPLAY, groupState = null) { + this.#rawData = data; + this.renderingIntent = renderingIntent; + if (data === null) { + return; } - const div = super.render(); - if (this.#text) { - div.setAttribute("aria-label", this.#text); - div.setAttribute("role", "mark"); + this.name = data.name; + this.creator = data.creator; + this.#order = data.order; + for (const group of data.groups) { + this.#groups.set(group.id, new OptionalContentGroup(renderingIntent, group)); } - if (this.#isFreeHighlight) { - div.classList.add("free"); + if (groupState) { + if (groupState.size !== this.#groups.size) { + unreachable("Incorrect serialized groupState."); + } + for (const [id, group] of groupState) { + this.#groups.get(id)._setVisible(INTERNAL, group.visible, group.userSet); + } } else { - this.div.addEventListener("keydown", this.#boundKeydown); - } - const highlightDiv = this.#highlightDiv = document.createElement("div"); - div.append(highlightDiv); - highlightDiv.setAttribute("aria-hidden", "true"); - highlightDiv.className = "internal"; - highlightDiv.style.clipPath = this.#clipPathId; - const [parentWidth, parentHeight] = this.parentDimensions; - this.setDims(this.width * parentWidth, this.height * parentHeight); - (0,tools.bindEvents)(this, this.#highlightDiv, ["pointerover", "pointerleave"]); - this.enableEditing(); - return div; - } - pointerover() { - this.parent.drawLayer.addClass(this.#outlineId, "hovered"); - } - pointerleave() { - this.parent.drawLayer.removeClass(this.#outlineId, "hovered"); - } - #keydown(event) { - HighlightEditor._keyboardManager.exec(this, event); - } - _moveCaret(direction) { - this.parent.unselect(this); - switch (direction) { - case 0: - case 2: - this.#setCaret(true); - break; - case 1: - case 3: - this.#setCaret(false); - break; + if (data.baseState === "OFF") { + for (const group of this.#groups.values()) { + group._setVisible(INTERNAL, false); + } + } + for (const on of data.on) { + this.#groups.get(on)._setVisible(INTERNAL, true); + } + for (const off of data.off) { + this.#groups.get(off)._setVisible(INTERNAL, false); + } } + this.#initialHash = this.getHash(); } - #setCaret(start) { - if (!this.#anchorNode) { - return; - } - const selection = window.getSelection(); - if (start) { - selection.setPosition(this.#anchorNode, this.#anchorOffset); - } else { - selection.setPosition(this.#focusNode, this.#focusOffset); + #evaluateVisibilityExpression(array) { + const length = array.length; + if (length < 2) { + return true; } - } - select() { - super.select(); - if (!this.#outlineId) { - return; + const operator = array[0]; + for (let i = 1; i < length; i++) { + const element = array[i]; + let state; + if (Array.isArray(element)) { + state = this.#evaluateVisibilityExpression(element); + } else if (this.#groups.has(element)) { + state = this.#groups.get(element).visible; + } else { + warn(`Optional content group not found: ${element}`); + return true; + } + switch (operator) { + case "And": + if (!state) { + return false; + } + break; + case "Or": + if (state) { + return true; + } + break; + case "Not": + return !state; + default: + return true; + } } - this.parent?.drawLayer.removeClass(this.#outlineId, "hovered"); - this.parent?.drawLayer.addClass(this.#outlineId, "selected"); + return operator === "And"; } - unselect() { - super.unselect(); - if (!this.#outlineId) { - return; + isVisible(group) { + if (this.#groups.size === 0) { + return true; } - this.parent?.drawLayer.removeClass(this.#outlineId, "selected"); - if (!this.#isFreeHighlight) { - this.#setCaret(false); + if (!group) { + info("Optional content group not defined."); + return true; } - } - get _mustFixPosition() { - return !this.#isFreeHighlight; - } - show(visible = this._isVisible) { - super.show(visible); - if (this.parent) { - this.parent.drawLayer.show(this.#id, visible); - this.parent.drawLayer.show(this.#outlineId, visible); + if (group.type === "OCG") { + if (!this.#groups.has(group.id)) { + warn(`Optional content group not found: ${group.id}`); + return true; + } + return this.#groups.get(group.id).visible; + } else if (group.type === "OCMD") { + if (group.expression) { + return this.#evaluateVisibilityExpression(group.expression); + } + if (!group.policy || group.policy === "AnyOn") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (this.#groups.get(id).visible) { + return true; + } + } + return false; + } else if (group.policy === "AllOn") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (!this.#groups.get(id).visible) { + return false; + } + } + return true; + } else if (group.policy === "AnyOff") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (!this.#groups.get(id).visible) { + return true; + } + } + return false; + } else if (group.policy === "AllOff") { + for (const id of group.ids) { + if (!this.#groups.has(id)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (this.#groups.get(id).visible) { + return false; + } + } + return true; + } + warn(`Unknown optional content policy ${group.policy}.`); + return true; } + warn(`Unknown group type ${group.type}.`); + return true; } - #getRotation() { - return this.#isFreeHighlight ? this.rotation : 0; - } - #serializeBoxes() { - if (this.#isFreeHighlight) { - return null; + setVisibility(id, visible = true, preserveRB = true) { + const group = this.#groups.get(id); + if (!group) { + warn(`Optional content group not found: ${id}`); + return; } - const [pageWidth, pageHeight] = this.pageDimensions; - const boxes = this.#boxes; - const quadPoints = new Array(boxes.length * 8); - let i = 0; - for (const { - x, - y, - width, - height - } of boxes) { - const sx = x * pageWidth; - const sy = (1 - y - height) * pageHeight; - quadPoints[i] = quadPoints[i + 4] = sx; - quadPoints[i + 1] = quadPoints[i + 3] = sy; - quadPoints[i + 2] = quadPoints[i + 6] = sx + width * pageWidth; - quadPoints[i + 5] = quadPoints[i + 7] = sy + height * pageHeight; - i += 8; + if (preserveRB && visible && group.rbGroups.length) { + for (const rbGroup of group.rbGroups) { + for (const otherId of rbGroup) { + if (otherId !== id) { + this.#groups.get(otherId)?._setVisible(INTERNAL, false, true); + } + } + } } - return quadPoints; - } - #serializeOutlines(rect) { - return this.#highlightOutlines.serialize(rect, this.#getRotation()); + group._setVisible(INTERNAL, !!visible, true); + this.#cachedGetHash = null; } - static startHighlighting(parent, isLTR, { - target: textLayer, - x, - y + setOCGState({ + state, + preserveRB }) { - const { - x: layerX, - y: layerY, - width: parentWidth, - height: parentHeight - } = textLayer.getBoundingClientRect(); - const pointerMove = e => { - this.#highlightMove(parent, e); - }; - const pointerDownOptions = { - capture: true, - passive: false - }; - const pointerDown = e => { - e.preventDefault(); - e.stopPropagation(); - }; - const pointerUpCallback = e => { - textLayer.removeEventListener("pointermove", pointerMove); - window.removeEventListener("blur", pointerUpCallback); - window.removeEventListener("pointerup", pointerUpCallback); - window.removeEventListener("pointerdown", pointerDown, pointerDownOptions); - window.removeEventListener("contextmenu", display_utils.noContextMenu); - this.#endHighlight(parent, e); - }; - window.addEventListener("blur", pointerUpCallback); - window.addEventListener("pointerup", pointerUpCallback); - window.addEventListener("pointerdown", pointerDown, pointerDownOptions); - window.addEventListener("contextmenu", display_utils.noContextMenu); - textLayer.addEventListener("pointermove", pointerMove); - this._freeHighlight = new editor_outliner.FreeOutliner({ - x, - y - }, [layerX, layerY, parentWidth, parentHeight], parent.scale, this._defaultThickness / 2, isLTR, 0.001); - ({ - id: this._freeHighlightId, - clipPathId: this._freeHighlightClipId - } = parent.drawLayer.highlight(this._freeHighlight, this._defaultColor, this._defaultOpacity, true)); - } - static #highlightMove(parent, event) { - if (this._freeHighlight.add(event)) { - parent.drawLayer.updatePath(this._freeHighlightId, this._freeHighlight); - } - } - static #endHighlight(parent, event) { - if (!this._freeHighlight.isEmpty()) { - parent.createAndAddNewEditor(event, false, { - highlightId: this._freeHighlightId, - highlightOutlines: this._freeHighlight.getOutlines(), - clipPathId: this._freeHighlightClipId, - methodOfCreation: "main_toolbar" - }); - } else { - parent.drawLayer.removeFreeHighlight(this._freeHighlightId); - } - this._freeHighlightId = -1; - this._freeHighlight = null; - this._freeHighlightClipId = ""; - } - static deserialize(data, parent, uiManager) { - const editor = super.deserialize(data, parent, uiManager); - const { - rect: [blX, blY, trX, trY], - color, - quadPoints - } = data; - editor.color = util.Util.makeHexColor(...color); - editor.#opacity = data.opacity; - const [pageWidth, pageHeight] = editor.pageDimensions; - editor.width = (trX - blX) / pageWidth; - editor.height = (trY - blY) / pageHeight; - const boxes = editor.#boxes = []; - for (let i = 0; i < quadPoints.length; i += 8) { - boxes.push({ - x: (quadPoints[4] - trX) / pageWidth, - y: (trY - (1 - quadPoints[i + 5])) / pageHeight, - width: (quadPoints[i + 2] - quadPoints[i]) / pageWidth, - height: (quadPoints[i + 5] - quadPoints[i + 1]) / pageHeight - }); - } - editor.#createOutlines(); - return editor; - } - serialize(isForCopying = false) { - if (this.isEmpty() || isForCopying) { - return null; - } - const rect = this.getRect(0, 0); - const color = editor_editor.AnnotationEditor._colorManager.convert(this.color); - return { - annotationType: util.AnnotationEditorType.HIGHLIGHT, - color, - opacity: this.#opacity, - thickness: this.#thickness, - quadPoints: this.#serializeBoxes(), - outlines: this.#serializeOutlines(rect), - pageIndex: this.pageIndex, - rect, - rotation: this.#getRotation(), - structTreeParentId: this._structTreeParentId - }; - } - static canCreateNewEmptyEditor() { - return false; - } -} - -;// CONCATENATED MODULE: ./src/display/editor/ink.js - - - - - -class InkEditor extends editor_editor.AnnotationEditor { - #baseHeight = 0; - #baseWidth = 0; - #boundCanvasPointermove = this.canvasPointermove.bind(this); - #boundCanvasPointerleave = this.canvasPointerleave.bind(this); - #boundCanvasPointerup = this.canvasPointerup.bind(this); - #boundCanvasPointerdown = this.canvasPointerdown.bind(this); - #canvasContextMenuTimeoutId = null; - #currentPath2D = new Path2D(); - #disableEditing = false; - #hasSomethingToDraw = false; - #isCanvasInitialized = false; - #observer = null; - #realWidth = 0; - #realHeight = 0; - #requestFrameCallback = null; - static _defaultColor = null; - static _defaultOpacity = 1; - static _defaultThickness = 1; - static _type = "ink"; - static _editorType = util.AnnotationEditorType.INK; - constructor(params) { - super({ - ...params, - name: "inkEditor" - }); - this.color = params.color || null; - this.thickness = params.thickness || null; - this.opacity = params.opacity || null; - this.paths = []; - this.bezierPath2D = []; - this.allRawPaths = []; - this.currentPath = []; - this.scaleFactor = 1; - this.translationX = this.translationY = 0; - this.x = 0; - this.y = 0; - this._willKeepAspectRatio = true; - } - static initialize(l10n, uiManager) { - editor_editor.AnnotationEditor.initialize(l10n, uiManager); - } - static updateDefaultParams(type, value) { - switch (type) { - case util.AnnotationEditorParamsType.INK_THICKNESS: - InkEditor._defaultThickness = value; - break; - case util.AnnotationEditorParamsType.INK_COLOR: - InkEditor._defaultColor = value; - break; - case util.AnnotationEditorParamsType.INK_OPACITY: - InkEditor._defaultOpacity = value / 100; - break; + let operator; + for (const elem of state) { + switch (elem) { + case "ON": + case "OFF": + case "Toggle": + operator = elem; + continue; + } + const group = this.#groups.get(elem); + if (!group) { + continue; + } + switch (operator) { + case "ON": + this.setVisibility(elem, true, preserveRB); + break; + case "OFF": + this.setVisibility(elem, false, preserveRB); + break; + case "Toggle": + this.setVisibility(elem, !group.visible, preserveRB); + break; + } } + this.#cachedGetHash = null; } - updateParams(type, value) { - switch (type) { - case util.AnnotationEditorParamsType.INK_THICKNESS: - this.#updateThickness(value); - break; - case util.AnnotationEditorParamsType.INK_COLOR: - this.#updateColor(value); - break; - case util.AnnotationEditorParamsType.INK_OPACITY: - this.#updateOpacity(value); - break; + get hasInitialVisibility() { + return this.#initialHash === null || this.getHash() === this.#initialHash; + } + getOrder() { + if (!this.#groups.size) { + return null; } + if (this.#order) { + return this.#order.slice(); + } + return [...this.#groups.keys()]; } - static get defaultPropertiesToUpdate() { - return [[util.AnnotationEditorParamsType.INK_THICKNESS, InkEditor._defaultThickness], [util.AnnotationEditorParamsType.INK_COLOR, InkEditor._defaultColor || editor_editor.AnnotationEditor._defaultLineColor], [util.AnnotationEditorParamsType.INK_OPACITY, Math.round(InkEditor._defaultOpacity * 100)]]; + getGroup(id) { + return this.#groups.get(id) || null; } - get propertiesToUpdate() { - return [[util.AnnotationEditorParamsType.INK_THICKNESS, this.thickness || InkEditor._defaultThickness], [util.AnnotationEditorParamsType.INK_COLOR, this.color || InkEditor._defaultColor || editor_editor.AnnotationEditor._defaultLineColor], [util.AnnotationEditorParamsType.INK_OPACITY, Math.round(100 * (this.opacity ?? InkEditor._defaultOpacity))]]; + getHash() { + if (this.#cachedGetHash !== null) { + return this.#cachedGetHash; + } + const hash = new MurmurHash3_64(); + for (const [id, group] of this.#groups) { + hash.update(`${id}:${group.visible}`); + } + return this.#cachedGetHash = hash.hexdigest(); } - #updateThickness(thickness) { - const setThickness = th => { - this.thickness = th; - this.#fitToContent(); - }; - const savedThickness = this.thickness; - this.addCommands({ - cmd: setThickness.bind(this, thickness), - undo: setThickness.bind(this, savedThickness), - post: this._uiManager.updateUI.bind(this._uiManager, this), - mustExec: true, - type: util.AnnotationEditorParamsType.INK_THICKNESS, - overwriteIfSameType: true, - keepUndo: true - }); + [Symbol.iterator]() { + return this.#groups.entries(); } - #updateColor(color) { - const setColor = col => { - this.color = col; - this.#redraw(); + get serializable() { + const groupState = new Map(); + for (const [id, group] of this.#groups) { + groupState.set(id, group.serializable); + } + return { + data: this.#rawData, + renderingIntent: this.renderingIntent, + groupState }; - const savedColor = this.color; - this.addCommands({ - cmd: setColor.bind(this, color), - undo: setColor.bind(this, savedColor), - post: this._uiManager.updateUI.bind(this._uiManager, this), - mustExec: true, - type: util.AnnotationEditorParamsType.INK_COLOR, - overwriteIfSameType: true, - keepUndo: true - }); } - #updateOpacity(opacity) { - const setOpacity = op => { - this.opacity = op; - this.#redraw(); - }; - opacity /= 100; - const savedOpacity = this.opacity; - this.addCommands({ - cmd: setOpacity.bind(this, opacity), - undo: setOpacity.bind(this, savedOpacity), - post: this._uiManager.updateUI.bind(this._uiManager, this), - mustExec: true, - type: util.AnnotationEditorParamsType.INK_OPACITY, - overwriteIfSameType: true, - keepUndo: true - }); + static fromSerializable({ + data, + renderingIntent, + groupState + }) { + return new OptionalContentConfig(data, renderingIntent, groupState); } - rebuild() { - if (!this.parent) { +} + +;// ./src/display/pages_mapper.js + + +class PagesMapper { + #pageNumberToId = null; + #prevPageNumbers = null; + #pagesNumber = 0; + #clipboard = null; + #savedData = null; + get pagesNumber() { + return this.#pagesNumber; + } + set pagesNumber(n) { + if (this.#pagesNumber === n) { return; } - super.rebuild(); - if (this.div === null) { + this.#pagesNumber = n; + this.#pageNumberToId = null; + this.#prevPageNumbers = null; + } + #ensureInit() { + if (this.#pageNumberToId) { return; } - if (!this.canvas) { - this.#createCanvas(); - this.#createObserver(); + const n = this.#pagesNumber; + const pageNumberToId = this.#pageNumberToId = new Uint32Array(n); + for (let i = 0; i < n; i++) { + pageNumberToId[i] = i + 1; } - if (!this.isAttachedToDOM) { - this.parent.add(this); - this.#setCanvasDims(); + this.#prevPageNumbers = new Int32Array(pageNumberToId); + } + #buildIdToPageNumber() { + const idToPageNumber = new Map(); + const pageNumberToId = this.#pageNumberToId; + for (let i = 0, ii = this.#pagesNumber; i < ii; i++) { + const id = pageNumberToId[i]; + const pageNumbers = idToPageNumber.get(id); + if (pageNumbers) { + pageNumbers.push(i + 1); + } else { + idToPageNumber.set(id, [i + 1]); + } } - this.#fitToContent(); + return idToPageNumber; } - remove() { - if (this.canvas === null) { - return; + movePages(selectedPages, pagesToMove, index) { + this.#ensureInit(); + const pageNumberToId = this.#pageNumberToId; + const prevIdToPageNumber = this.#buildIdToPageNumber(); + const movedCount = pagesToMove.length; + const mappedPagesToMove = new Uint32Array(movedCount); + let removedBeforeTarget = 0; + for (let i = 0; i < movedCount; i++) { + const pageIndex = pagesToMove[i] - 1; + mappedPagesToMove[i] = pageNumberToId[pageIndex]; + if (pageIndex < index) { + removedBeforeTarget++; + } + } + const pagesNumber = this.#pagesNumber; + const remainingLen = pagesNumber - movedCount; + const adjustedTarget = MathClamp(index - removedBeforeTarget, 0, remainingLen); + for (let i = 0, r = 0; i < pagesNumber; i++) { + if (!selectedPages.has(i + 1)) { + pageNumberToId[r++] = pageNumberToId[i]; + } + } + pageNumberToId.copyWithin(adjustedTarget + movedCount, adjustedTarget, remainingLen); + pageNumberToId.set(mappedPagesToMove, adjustedTarget); + this.#updatePrevPageNumbers(prevIdToPageNumber); + if (pageNumberToId.every((id, i) => id === i + 1)) { + this.#pageNumberToId = null; + } + } + deletePages(pagesToDelete) { + this.#ensureInit(); + const pageNumberToId = this.#pageNumberToId; + const prevIdToPageNumber = this.#buildIdToPageNumber(); + this.#savedData = { + pageNumberToId: pageNumberToId.slice(), + pagesNumber: this.#pagesNumber, + prevPageNumbers: this.#prevPageNumbers.slice() + }; + const newN = this.#pagesNumber - pagesToDelete.length; + this.#pagesNumber = newN; + const newPageNumberToId = this.#pageNumberToId = new Uint32Array(newN); + this.#prevPageNumbers = new Int32Array(newN); + let sourceIndex = 0; + let destIndex = 0; + for (const pageNumber of pagesToDelete) { + const pageIndex = pageNumber - 1; + if (pageIndex !== sourceIndex) { + newPageNumberToId.set(pageNumberToId.subarray(sourceIndex, pageIndex), destIndex); + destIndex += pageIndex - sourceIndex; + } + sourceIndex = pageIndex + 1; + } + if (sourceIndex < pageNumberToId.length) { + newPageNumberToId.set(pageNumberToId.subarray(sourceIndex), destIndex); + } + this.#updatePrevPageNumbers(prevIdToPageNumber, new Set(pagesToDelete)); + } + cancelDelete() { + if (this.#savedData) { + this.#pageNumberToId = this.#savedData.pageNumberToId; + this.#pagesNumber = this.#savedData.pagesNumber; + this.#prevPageNumbers = this.#savedData.prevPageNumbers; + this.#savedData = null; + } + } + cleanSavedData() { + this.#savedData = null; + } + copyPages(pagesToCopy) { + this.#ensureInit(); + this.#clipboard = { + pageNumbers: pagesToCopy, + pageIds: pagesToCopy.map(n => this.#pageNumberToId[n - 1]) + }; + } + cancelCopy() { + this.#clipboard = null; + } + pastePages(index) { + this.#ensureInit(); + const pageNumberToId = this.#pageNumberToId; + const prevIdToPageNumber = this.#buildIdToPageNumber(); + const { + pageNumbers: copiedPageNumbers, + pageIds: copiedPageIds + } = this.#clipboard; + const newN = this.#pagesNumber + copiedPageNumbers.length; + this.#pagesNumber = newN; + const newPageNumberToId = this.#pageNumberToId = new Uint32Array(newN); + this.#prevPageNumbers = new Int32Array(newN); + newPageNumberToId.set(pageNumberToId.subarray(0, index), 0); + newPageNumberToId.set(copiedPageIds, index); + newPageNumberToId.set(pageNumberToId.subarray(index), index + copiedPageNumbers.length); + this.#updatePrevPageNumbers(prevIdToPageNumber, null, index, copiedPageNumbers); + this.#clipboard = null; + } + #updatePrevPageNumbers(prevIdToPageNumber, deletedPageNumbers = null, pasteIndex = -1, copiedPageNumbers = null) { + const prevPageNumbers = this.#prevPageNumbers; + const newPageNumberToId = this.#pageNumberToId; + const pasteEnd = pasteIndex + (copiedPageNumbers?.length ?? 0); + const idsIndices = new Map(); + for (let i = 0, ii = this.#pagesNumber; i < ii; i++) { + if (i >= pasteIndex && i < pasteEnd) { + prevPageNumbers[i] = -copiedPageNumbers[i - pasteIndex]; + continue; + } + const id = newPageNumberToId[i]; + const oldPositions = prevIdToPageNumber.get(id); + let j = idsIndices.get(id) || 0; + if (deletedPageNumbers && oldPositions) { + while (j < oldPositions.length && deletedPageNumbers.has(oldPositions[j])) { + j++; + } + } + prevPageNumbers[i] = oldPositions?.[j]; + idsIndices.set(id, j + 1); + } + } + hasBeenAltered() { + return this.#pageNumberToId !== null; + } + getPageMappingForSaving(idToPageNumber = null) { + idToPageNumber ??= this.#buildIdToPageNumber(); + let nCopy = 0; + for (const pageNumbers of idToPageNumber.values()) { + nCopy = Math.max(nCopy, pageNumbers.length); + } + const extractParams = new Array(nCopy); + for (let i = 0; i < nCopy; i++) { + extractParams[i] = { + document: null, + pageIndices: [], + includePages: [] + }; } - if (!this.isEmpty()) { - this.commit(); + for (const [id, pageNumbers] of idToPageNumber) { + for (let i = 0, ii = pageNumbers.length; i < ii; i++) { + extractParams[i].includePages.push([id - 1, pageNumbers[i] - 1]); + } } - this.canvas.width = this.canvas.height = 0; - this.canvas.remove(); - this.canvas = null; - if (this.#canvasContextMenuTimeoutId) { - clearTimeout(this.#canvasContextMenuTimeoutId); - this.#canvasContextMenuTimeoutId = null; + for (const { + includePages, + pageIndices + } of extractParams) { + includePages.sort((a, b) => a[0] - b[0]); + for (let i = 0, ii = includePages.length; i < ii; i++) { + pageIndices.push(includePages[i][1]); + includePages[i] = includePages[i][0]; + } } - this.#observer.disconnect(); - this.#observer = null; - super.remove(); + return extractParams; } - setParent(parent) { - if (!this.parent && parent) { - this._uiManager.removeShouldRescale(this); - } else if (this.parent && parent === null) { - this._uiManager.addShouldRescale(this); + extractPages(extractedPageNumbers) { + extractedPageNumbers = Array.from(extractedPageNumbers).sort((a, b) => a - b); + const usedIds = new Map(); + for (let i = 0, ii = extractedPageNumbers.length; i < ii; i++) { + const id = this.getPageId(extractedPageNumbers[i]); + const usedPageNumbers = usedIds.getOrInsertComputed(id, makeArr); + usedPageNumbers.push(i + 1); } - super.setParent(parent); + return this.getPageMappingForSaving(usedIds); } - onScaleChanging() { - const [parentWidth, parentHeight] = this.parentDimensions; - const width = this.width * parentWidth; - const height = this.height * parentHeight; - this.setDimensions(width, height); + getPrevPageNumber(pageNumber) { + return this.#prevPageNumbers?.[pageNumber - 1] ?? 0; } - enableEditMode() { - if (this.#disableEditing || this.canvas === null) { - return; + getPageNumber(id) { + if (!this.#pageNumberToId) { + return id; } - super.enableEditMode(); - this._isDraggable = false; - this.canvas.addEventListener("pointerdown", this.#boundCanvasPointerdown); - } - disableEditMode() { - if (!this.isInEditMode() || this.canvas === null) { - return; + const pageNumberToId = this.#pageNumberToId; + for (let i = 0, ii = this.#pagesNumber; i < ii; i++) { + if (pageNumberToId[i] === id) { + return i + 1; + } } - super.disableEditMode(); - this._isDraggable = !this.isEmpty(); - this.div.classList.remove("editing"); - this.canvas.removeEventListener("pointerdown", this.#boundCanvasPointerdown); - } - onceAdded() { - this._isDraggable = !this.isEmpty(); - } - isEmpty() { - return this.paths.length === 0 || this.paths.length === 1 && this.paths[0].length === 0; + return 0; } - #getInitialBBox() { - const { - parentRotation, - parentDimensions: [width, height] - } = this; - switch (parentRotation) { - case 90: - return [0, height, height, width]; - case 180: - return [width, height, width, height]; - case 270: - return [width, 0, height, width]; - default: - return [0, 0, width, height]; - } + getPageId(pageNumber) { + return this.#pageNumberToId?.[pageNumber - 1] ?? pageNumber; } - #setStroke() { - const { - ctx, - color, - opacity, - thickness, - parentScale, - scaleFactor - } = this; - ctx.lineWidth = thickness * parentScale / scaleFactor; - ctx.lineCap = "round"; - ctx.lineJoin = "round"; - ctx.miterLimit = 10; - ctx.strokeStyle = `${color}${(0,tools.opacityToHex)(opacity)}`; - } - #startDrawing(x, y) { - this.canvas.addEventListener("contextmenu", display_utils.noContextMenu); - this.canvas.addEventListener("pointerleave", this.#boundCanvasPointerleave); - this.canvas.addEventListener("pointermove", this.#boundCanvasPointermove); - this.canvas.addEventListener("pointerup", this.#boundCanvasPointerup); - this.canvas.removeEventListener("pointerdown", this.#boundCanvasPointerdown); - this.isEditing = true; - if (!this.#isCanvasInitialized) { - this.#isCanvasInitialized = true; - this.#setCanvasDims(); - this.thickness ||= InkEditor._defaultThickness; - this.color ||= InkEditor._defaultColor || editor_editor.AnnotationEditor._defaultLineColor; - this.opacity ??= InkEditor._defaultOpacity; - } - this.currentPath.push([x, y]); - this.#hasSomethingToDraw = false; - this.#setStroke(); - this.#requestFrameCallback = () => { - this.#drawPoints(); - if (this.#requestFrameCallback) { - window.requestAnimationFrame(this.#requestFrameCallback); - } - }; - window.requestAnimationFrame(this.#requestFrameCallback); - } - #draw(x, y) { - const [lastX, lastY] = this.currentPath.at(-1); - if (this.currentPath.length > 1 && x === lastX && y === lastY) { - return; - } - const currentPath = this.currentPath; - let path2D = this.#currentPath2D; - currentPath.push([x, y]); - this.#hasSomethingToDraw = true; - if (currentPath.length <= 2) { - path2D.moveTo(...currentPath[0]); - path2D.lineTo(x, y); - return; - } - if (currentPath.length === 3) { - this.#currentPath2D = path2D = new Path2D(); - path2D.moveTo(...currentPath[0]); - } - this.#makeBezierCurve(path2D, ...currentPath.at(-3), ...currentPath.at(-2), x, y); - } - #endPath() { - if (this.currentPath.length === 0) { - return; - } - const lastPoint = this.currentPath.at(-1); - this.#currentPath2D.lineTo(...lastPoint); - } - #stopDrawing(x, y) { - this.#requestFrameCallback = null; - x = Math.min(Math.max(x, 0), this.canvas.width); - y = Math.min(Math.max(y, 0), this.canvas.height); - this.#draw(x, y); - this.#endPath(); - let bezier; - if (this.currentPath.length !== 1) { - bezier = this.#generateBezierPoints(); - } else { - const xy = [x, y]; - bezier = [[xy, xy.slice(), xy.slice(), xy]]; - } - const path2D = this.#currentPath2D; - const currentPath = this.currentPath; - this.currentPath = []; - this.#currentPath2D = new Path2D(); - const cmd = () => { - this.allRawPaths.push(currentPath); - this.paths.push(bezier); - this.bezierPath2D.push(path2D); - this._uiManager.rebuild(this); - }; - const undo = () => { - this.allRawPaths.pop(); - this.paths.pop(); - this.bezierPath2D.pop(); - if (this.paths.length === 0) { - this.remove(); - } else { - if (!this.canvas) { - this.#createCanvas(); - this.#createObserver(); - } - this.#fitToContent(); - } - }; - this.addCommands({ - cmd, - undo, - mustExec: true - }); + getMapping() { + return this.#pageNumberToId?.subarray(0, this.pagesNumber); } - #drawPoints() { - if (!this.#hasSomethingToDraw) { - return; +} + +;// ./src/display/pdf_objects.js +const INITIAL_DATA = Symbol("INITIAL_DATA"); +const dataObj = () => ({ + ...Promise.withResolvers(), + data: INITIAL_DATA +}); +class PDFObjects { + #objs = new Map(); + get(objId, callback = null) { + if (callback) { + const obj = this.#objs.getOrInsertComputed(objId, dataObj); + obj.promise.then(() => callback(obj.data)); + return null; } - this.#hasSomethingToDraw = false; - const thickness = Math.ceil(this.thickness * this.parentScale); - const lastPoints = this.currentPath.slice(-3); - const x = lastPoints.map(xy => xy[0]); - const y = lastPoints.map(xy => xy[1]); - const xMin = Math.min(...x) - thickness; - const xMax = Math.max(...x) + thickness; - const yMin = Math.min(...y) - thickness; - const yMax = Math.max(...y) + thickness; - const { - ctx - } = this; - ctx.save(); - ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); - for (const path of this.bezierPath2D) { - ctx.stroke(path); + const obj = this.#objs.get(objId); + if (!obj || obj.data === INITIAL_DATA) { + throw new Error(`Requesting object that isn't resolved yet ${objId}.`); } - ctx.stroke(this.#currentPath2D); - ctx.restore(); + return obj.data; } - #makeBezierCurve(path2D, x0, y0, x1, y1, x2, y2) { - const prevX = (x0 + x1) / 2; - const prevY = (y0 + y1) / 2; - const x3 = (x1 + x2) / 2; - const y3 = (y1 + y2) / 2; - path2D.bezierCurveTo(prevX + 2 * (x1 - prevX) / 3, prevY + 2 * (y1 - prevY) / 3, x3 + 2 * (x1 - x3) / 3, y3 + 2 * (y1 - y3) / 3, x3, y3); - } - #generateBezierPoints() { - const path = this.currentPath; - if (path.length <= 2) { - return [[path[0], path[0], path.at(-1), path.at(-1)]]; - } - const bezierPoints = []; - let i; - let [x0, y0] = path[0]; - for (i = 1; i < path.length - 2; i++) { - const [x1, y1] = path[i]; - const [x2, y2] = path[i + 1]; - const x3 = (x1 + x2) / 2; - const y3 = (y1 + y2) / 2; - const control1 = [x0 + 2 * (x1 - x0) / 3, y0 + 2 * (y1 - y0) / 3]; - const control2 = [x3 + 2 * (x1 - x3) / 3, y3 + 2 * (y1 - y3) / 3]; - bezierPoints.push([[x0, y0], control1, control2, [x3, y3]]); - [x0, y0] = [x3, y3]; - } - const [x1, y1] = path[i]; - const [x2, y2] = path[i + 1]; - const control1 = [x0 + 2 * (x1 - x0) / 3, y0 + 2 * (y1 - y0) / 3]; - const control2 = [x2 + 2 * (x1 - x2) / 3, y2 + 2 * (y1 - y2) / 3]; - bezierPoints.push([[x0, y0], control1, control2, [x2, y2]]); - return bezierPoints; + has(objId) { + const obj = this.#objs.get(objId); + return !!obj && obj.data !== INITIAL_DATA; } - #redraw() { - if (this.isEmpty()) { - this.#updateTransform(); - return; - } - this.#setStroke(); - const { - canvas, - ctx - } = this; - ctx.setTransform(1, 0, 0, 1, 0, 0); - ctx.clearRect(0, 0, canvas.width, canvas.height); - this.#updateTransform(); - for (const path of this.bezierPath2D) { - ctx.stroke(path); + delete(objId) { + const obj = this.#objs.get(objId); + if (!obj || obj.data === INITIAL_DATA) { + return false; } + this.#objs.delete(objId); + return true; } - commit() { - if (this.#disableEditing) { - return; + resolve(objId, data = null) { + const obj = this.#objs.getOrInsertComputed(objId, dataObj); + if (obj.data !== INITIAL_DATA) { + throw new Error(`Object already resolved ${objId}.`); } - super.commit(); - this.isEditing = false; - this.disableEditMode(); - this.setInForeground(); - this.#disableEditing = true; - this.div.classList.add("disabled"); - this.#fitToContent(true); - this.select(); - this.parent.addInkEditorIfNeeded(true); - this.moveInDOM(); - this.div.focus({ - preventScroll: true - }); + obj.data = data; + obj.resolve(); } - focusin(event) { - if (!this._focusEventsAllowed) { - return; + clear() { + for (const { + data + } of this.#objs.values()) { + data?.bitmap?.close(); } - super.focusin(event); - this.enableEditMode(); + this.#objs.clear(); } - canvasPointerdown(event) { - if (event.button !== 0 || !this.isInEditMode() || this.#disableEditing) { - return; + *[Symbol.iterator]() { + for (const [objId, { + data + }] of this.#objs) { + if (data !== INITIAL_DATA) { + yield [objId, data]; + } } - this.setInForeground(); - event.preventDefault(); - if (!this.div.contains(document.activeElement)) { - this.div.focus({ - preventScroll: true + } +} + +;// ./src/display/text_layer.js + + +const MAX_TEXT_DIVS_TO_RENDER = 100000; +const DEFAULT_FONT_SIZE = 30; +class TextLayer { + #capability = Promise.withResolvers(); + #container = null; + #disableProcessItems = false; + #fontInspectorEnabled = !!globalThis.FontInspector?.enabled; + #imagesHandler = null; + #lang = null; + #layoutTextParams = null; + #pageHeight = 0; + #pageWidth = 0; + #reader = null; + #rootContainer = null; + #rotation = 0; + #scale = 0; + #styleCache = Object.create(null); + #textContentItemsStr = []; + #textContentSource = null; + #textDivs = []; + #textDivProperties = new WeakMap(); + #transform = null; + static #ascentCache = new Map(); + static #canvasContexts = new Map(); + static #canvasCtxFonts = new WeakMap(); + static #minFontSize = null; + static #pendingTextLayers = new Set(); + constructor({ + textContentSource, + images, + container, + viewport + }) { + if (textContentSource instanceof ReadableStream) { + this.#textContentSource = textContentSource; + } else if (typeof textContentSource === "object") { + this.#textContentSource = new ReadableStream({ + start(controller) { + controller.enqueue(textContentSource); + controller.close(); + } }); + } else { + throw new Error('No "textContentSource" parameter specified.'); } - this.#startDrawing(event.offsetX, event.offsetY); + this.#container = this.#rootContainer = container; + this.#imagesHandler = images; + this.#scale = viewport.scale * OutputScale.pixelRatio; + this.#rotation = viewport.rotation; + this.#layoutTextParams = { + div: null, + properties: null, + ctx: null + }; + const { + pageWidth, + pageHeight, + pageX, + pageY + } = viewport.rawDims; + this.#transform = [1, 0, 0, -1, -pageX, pageY + pageHeight]; + this.#pageWidth = pageWidth; + this.#pageHeight = pageHeight; + TextLayer.#ensureMinFontSizeComputed(); + container.style.setProperty("--min-font-size", TextLayer.#minFontSize); + setLayerDimensions(container, viewport); + this.#capability.promise.finally(() => { + TextLayer.#pendingTextLayers.delete(this); + this.#layoutTextParams = null; + this.#styleCache = null; + }).catch(() => {}); } - canvasPointermove(event) { - event.preventDefault(); - this.#draw(event.offsetX, event.offsetY); + static get fontFamilyMap() { + const { + isWindows, + isFirefox + } = FeatureTest.platform; + return shadow(this, "fontFamilyMap", new Map([["sans-serif", `${isWindows && isFirefox ? "Calibri, " : ""}sans-serif`], ["monospace", `${isWindows && isFirefox ? "Lucida Console, " : ""}monospace`]])); } - canvasPointerup(event) { - event.preventDefault(); - this.#endDrawing(event); + render() { + if (this.#imagesHandler) { + this.#container.append(this.#imagesHandler.render()); + } + const pump = () => { + this.#reader.read().then(({ + value, + done + }) => { + if (done) { + this.#capability.resolve(); + return; + } + this.#lang ??= value.lang; + Object.assign(this.#styleCache, value.styles); + this.#processItems(value.items); + pump(); + }, this.#capability.reject); + }; + this.#reader = this.#textContentSource.getReader(); + TextLayer.#pendingTextLayers.add(this); + pump(); + return this.#capability.promise; } - canvasPointerleave(event) { - this.#endDrawing(event); + update({ + viewport, + onBefore = null + }) { + const scale = viewport.scale * OutputScale.pixelRatio; + const rotation = viewport.rotation; + if (rotation !== this.#rotation) { + onBefore?.(); + this.#rotation = rotation; + setLayerDimensions(this.#rootContainer, { + rotation + }); + } + if (scale !== this.#scale) { + onBefore?.(); + this.#scale = scale; + const params = { + div: null, + properties: null, + ctx: TextLayer.#getCtx(this.#lang) + }; + for (const div of this.#textDivs) { + params.properties = this.#textDivProperties.get(div); + params.div = div; + this.#layout(params); + } + } } - #endDrawing(event) { - this.canvas.removeEventListener("pointerleave", this.#boundCanvasPointerleave); - this.canvas.removeEventListener("pointermove", this.#boundCanvasPointermove); - this.canvas.removeEventListener("pointerup", this.#boundCanvasPointerup); - this.canvas.addEventListener("pointerdown", this.#boundCanvasPointerdown); - if (this.#canvasContextMenuTimeoutId) { - clearTimeout(this.#canvasContextMenuTimeoutId); - } - this.#canvasContextMenuTimeoutId = setTimeout(() => { - this.#canvasContextMenuTimeoutId = null; - this.canvas.removeEventListener("contextmenu", display_utils.noContextMenu); - }, 10); - this.#stopDrawing(event.offsetX, event.offsetY); - this.addToAnnotationStorage(); - this.setInBackground(); + cancel() { + const abortEx = new AbortException("TextLayer task cancelled."); + this.#reader?.cancel(abortEx).catch(() => {}); + this.#reader = null; + this.#capability.reject(abortEx); } - #createCanvas() { - this.canvas = document.createElement("canvas"); - this.canvas.width = this.canvas.height = 0; - this.canvas.className = "inkEditorCanvas"; - this.canvas.setAttribute("data-l10n-id", "pdfjs-ink-canvas"); - this.div.append(this.canvas); - this.ctx = this.canvas.getContext("2d"); - } - #createObserver() { - this.#observer = new ResizeObserver(entries => { - const rect = entries[0].contentRect; - if (rect.width && rect.height) { - this.setDimensions(rect.width, rect.height); - } - }); - this.#observer.observe(this.div); + get textDivs() { + return this.#textDivs; } - get isResizable() { - return !this.isEmpty() && this.#disableEditing; + get textContentItemsStr() { + return this.#textContentItemsStr; } - render() { - if (this.div) { - return this.div; - } - let baseX, baseY; - if (this.width) { - baseX = this.x; - baseY = this.y; + #processItems(items) { + if (this.#disableProcessItems) { + return; } - super.render(); - this.div.setAttribute("data-l10n-id", "pdfjs-ink"); - const [x, y, w, h] = this.#getInitialBBox(); - this.setAt(x, y, 0, 0); - this.setDims(w, h); - this.#createCanvas(); - if (this.width) { - const [parentWidth, parentHeight] = this.parentDimensions; - this.setAspectRatio(this.width * parentWidth, this.height * parentHeight); - this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight); - this.#isCanvasInitialized = true; - this.#setCanvasDims(); - this.setDims(this.width * parentWidth, this.height * parentHeight); - this.#redraw(); - this.div.classList.add("disabled"); - } else { - this.div.classList.add("editing"); - this.enableEditMode(); + this.#layoutTextParams.ctx ??= TextLayer.#getCtx(this.#lang); + const textDivs = this.#textDivs, + textContentItemsStr = this.#textContentItemsStr; + for (const item of items) { + if (textDivs.length > MAX_TEXT_DIVS_TO_RENDER) { + warn("Ignoring additional textDivs for performance reasons."); + this.#disableProcessItems = true; + return; + } + if (item.str === undefined) { + if (item.type === "beginMarkedContentProps" || item.type === "beginMarkedContent") { + const parent = this.#container; + this.#container = document.createElement("span"); + this.#container.classList.add("markedContent"); + if (item.id) { + this.#container.setAttribute("id", `${item.id}`); + } + if (item.tag === "Artifact") { + this.#container.ariaHidden = true; + } + parent.append(this.#container); + } else if (item.type === "endMarkedContent") { + this.#container = this.#container.parentNode; + } + continue; + } + textContentItemsStr.push(item.str); + this.#appendText(item); } - this.#createObserver(); - return this.div; } - #setCanvasDims() { - if (!this.#isCanvasInitialized) { - return; - } - const [parentWidth, parentHeight] = this.parentDimensions; - this.canvas.width = Math.ceil(this.width * parentWidth); - this.canvas.height = Math.ceil(this.height * parentHeight); - this.#updateTransform(); - } - setDimensions(width, height) { - const roundedWidth = Math.round(width); - const roundedHeight = Math.round(height); - if (this.#realWidth === roundedWidth && this.#realHeight === roundedHeight) { - return; + #appendText(geom) { + const textDiv = document.createElement("span"); + const textDivProperties = { + angle: 0, + canvasWidth: 0, + hasText: geom.str !== "", + hasEOL: geom.hasEOL, + fontSize: 0 + }; + this.#textDivs.push(textDiv); + const tx = Util.transform(this.#transform, geom.transform); + let angle = Math.atan2(tx[1], tx[0]); + const style = this.#styleCache[geom.fontName]; + if (style.vertical) { + angle += Math.PI / 2; + } + let fontFamily = this.#fontInspectorEnabled && style.fontSubstitution || style.fontFamily; + fontFamily = TextLayer.fontFamilyMap.get(fontFamily) || fontFamily; + const fontHeight = Math.hypot(tx[2], tx[3]); + const fontAscent = fontHeight * TextLayer.#getAscent(fontFamily, style, this.#lang); + let left, top; + if (angle === 0) { + left = tx[4]; + top = tx[5] - fontAscent; + } else { + left = tx[4] + fontAscent * Math.sin(angle); + top = tx[5] - fontAscent * Math.cos(angle); + } + const divStyle = textDiv.style; + divStyle.left = `${(100 * left / this.#pageWidth).toFixed(2)}%`; + divStyle.top = `${(100 * top / this.#pageHeight).toFixed(2)}%`; + divStyle.setProperty("--font-height", `${fontHeight.toFixed(2)}px`); + divStyle.fontFamily = fontFamily; + textDivProperties.fontSize = fontHeight; + textDiv.setAttribute("role", "presentation"); + textDiv.textContent = geom.str; + textDiv.dir = geom.dir; + if (this.#fontInspectorEnabled) { + textDiv.dataset.fontName = style.fontSubstitutionLoadedName || geom.fontName; } - this.#realWidth = roundedWidth; - this.#realHeight = roundedHeight; - this.canvas.style.visibility = "hidden"; - const [parentWidth, parentHeight] = this.parentDimensions; - this.width = width / parentWidth; - this.height = height / parentHeight; - this.fixAndSetPosition(); - if (this.#disableEditing) { - this.#setScaleFactor(width, height); + if (angle !== 0) { + textDivProperties.angle = angle * (180 / Math.PI); } - this.#setCanvasDims(); - this.#redraw(); - this.canvas.style.visibility = "visible"; - this.fixDims(); - } - #setScaleFactor(width, height) { - const padding = this.#getPadding(); - const scaleFactorW = (width - padding) / this.#baseWidth; - const scaleFactorH = (height - padding) / this.#baseHeight; - this.scaleFactor = Math.min(scaleFactorW, scaleFactorH); - } - #updateTransform() { - const padding = this.#getPadding() / 2; - this.ctx.setTransform(this.scaleFactor, 0, 0, this.scaleFactor, this.translationX * this.scaleFactor + padding, this.translationY * this.scaleFactor + padding); - } - static #buildPath2D(bezier) { - const path2D = new Path2D(); - for (let i = 0, ii = bezier.length; i < ii; i++) { - const [first, control1, control2, second] = bezier[i]; - if (i === 0) { - path2D.moveTo(...first); + let shouldScaleText = false; + if (geom.str.length > 1) { + shouldScaleText = true; + } else if (geom.str !== " " && geom.transform[0] !== geom.transform[3]) { + const absScaleX = Math.abs(geom.transform[0]), + absScaleY = Math.abs(geom.transform[3]); + if (absScaleX !== absScaleY && Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5) { + shouldScaleText = true; } - path2D.bezierCurveTo(control1[0], control1[1], control2[0], control2[1], second[0], second[1]); } - return path2D; - } - static #toPDFCoordinates(points, rect, rotation) { - const [blX, blY, trX, trY] = rect; - switch (rotation) { - case 0: - for (let i = 0, ii = points.length; i < ii; i += 2) { - points[i] += blX; - points[i + 1] = trY - points[i + 1]; - } - break; - case 90: - for (let i = 0, ii = points.length; i < ii; i += 2) { - const x = points[i]; - points[i] = points[i + 1] + blX; - points[i + 1] = x + blY; - } - break; - case 180: - for (let i = 0, ii = points.length; i < ii; i += 2) { - points[i] = trX - points[i]; - points[i + 1] += blY; - } - break; - case 270: - for (let i = 0, ii = points.length; i < ii; i += 2) { - const x = points[i]; - points[i] = trX - points[i + 1]; - points[i + 1] = trY - x; - } - break; - default: - throw new Error("Invalid rotation"); + if (shouldScaleText) { + textDivProperties.canvasWidth = style.vertical ? geom.height : geom.width; + } + this.#textDivProperties.set(textDiv, textDivProperties); + this.#layoutTextParams.div = textDiv; + this.#layoutTextParams.properties = textDivProperties; + this.#layout(this.#layoutTextParams); + if (textDivProperties.hasText) { + this.#container.append(textDiv); } - return points; - } - static #fromPDFCoordinates(points, rect, rotation) { - const [blX, blY, trX, trY] = rect; - switch (rotation) { - case 0: - for (let i = 0, ii = points.length; i < ii; i += 2) { - points[i] -= blX; - points[i + 1] = trY - points[i + 1]; - } - break; - case 90: - for (let i = 0, ii = points.length; i < ii; i += 2) { - const x = points[i]; - points[i] = points[i + 1] - blY; - points[i + 1] = x - blX; - } - break; - case 180: - for (let i = 0, ii = points.length; i < ii; i += 2) { - points[i] = trX - points[i]; - points[i + 1] -= blY; - } - break; - case 270: - for (let i = 0, ii = points.length; i < ii; i += 2) { - const x = points[i]; - points[i] = trY - points[i + 1]; - points[i + 1] = trX - x; - } - break; - default: - throw new Error("Invalid rotation"); + if (textDivProperties.hasEOL) { + const br = document.createElement("br"); + br.setAttribute("role", "presentation"); + this.#container.append(br); } - return points; } - #serializePaths(s, tx, ty, rect) { - const paths = []; - const padding = this.thickness / 2; - const shiftX = s * tx + padding; - const shiftY = s * ty + padding; - for (const bezier of this.paths) { - const buffer = []; - const points = []; - for (let j = 0, jj = bezier.length; j < jj; j++) { - const [first, control1, control2, second] = bezier[j]; - if (first[0] === second[0] && first[1] === second[1] && jj === 1) { - const p0 = s * first[0] + shiftX; - const p1 = s * first[1] + shiftY; - buffer.push(p0, p1); - points.push(p0, p1); - break; - } - const p10 = s * first[0] + shiftX; - const p11 = s * first[1] + shiftY; - const p20 = s * control1[0] + shiftX; - const p21 = s * control1[1] + shiftY; - const p30 = s * control2[0] + shiftX; - const p31 = s * control2[1] + shiftY; - const p40 = s * second[0] + shiftX; - const p41 = s * second[1] + shiftY; - if (j === 0) { - buffer.push(p10, p11); - points.push(p10, p11); - } - buffer.push(p20, p21, p30, p31, p40, p41); - points.push(p20, p21); - if (j === jj - 1) { - points.push(p40, p41); - } + #layout(params) { + const { + div, + properties, + ctx + } = params; + const { + style + } = div; + if (properties.canvasWidth !== 0 && properties.hasText) { + const { + fontFamily + } = style; + const { + canvasWidth, + fontSize + } = properties; + TextLayer.#ensureCtxFont(ctx, fontSize * this.#scale, fontFamily); + const { + width + } = ctx.measureText(div.textContent); + if (width > 0) { + style.setProperty("--scale-x", canvasWidth * this.#scale / width); } - paths.push({ - bezier: InkEditor.#toPDFCoordinates(buffer, rect, this.rotation), - points: InkEditor.#toPDFCoordinates(points, rect, this.rotation) - }); } - return paths; - } - #getBbox() { - let xMin = Infinity; - let xMax = -Infinity; - let yMin = Infinity; - let yMax = -Infinity; - for (const path of this.paths) { - for (const [first, control1, control2, second] of path) { - const bbox = util.Util.bezierBoundingBox(...first, ...control1, ...control2, ...second); - xMin = Math.min(xMin, bbox[0]); - yMin = Math.min(yMin, bbox[1]); - xMax = Math.max(xMax, bbox[2]); - yMax = Math.max(yMax, bbox[3]); - } + if (properties.angle !== 0) { + style.setProperty("--rotate", `${properties.angle}deg`); } - return [xMin, yMin, xMax, yMax]; } - #getPadding() { - return this.#disableEditing ? Math.ceil(this.thickness * this.parentScale) : 0; - } - #fitToContent(firstTime = false) { - if (this.isEmpty()) { + static cleanup() { + if (this.#pendingTextLayers.size > 0) { return; } - if (!this.#disableEditing) { - this.#redraw(); - return; + this.#ascentCache.clear(); + for (const { + canvas + } of this.#canvasContexts.values()) { + canvas.remove(); + } + this.#canvasContexts.clear(); + } + static #getCtx(lang = null) { + let ctx = this.#canvasContexts.get(lang ||= ""); + if (!ctx) { + const canvas = document.createElement("canvas"); + canvas.style.cssText = "position:absolute;top:0;left:0;width:0;height:0;display:none;" + "letter-spacing:normal;word-spacing:normal"; + canvas.lang = lang; + document.body.append(canvas); + ctx = canvas.getContext("2d", { + alpha: false, + willReadFrequently: true + }); + this.#canvasContexts.set(lang, ctx); + this.#canvasCtxFonts.set(ctx, { + size: 0, + family: "" + }); } - const bbox = this.#getBbox(); - const padding = this.#getPadding(); - this.#baseWidth = Math.max(editor_editor.AnnotationEditor.MIN_SIZE, bbox[2] - bbox[0]); - this.#baseHeight = Math.max(editor_editor.AnnotationEditor.MIN_SIZE, bbox[3] - bbox[1]); - const width = Math.ceil(padding + this.#baseWidth * this.scaleFactor); - const height = Math.ceil(padding + this.#baseHeight * this.scaleFactor); - const [parentWidth, parentHeight] = this.parentDimensions; - this.width = width / parentWidth; - this.height = height / parentHeight; - this.setAspectRatio(width, height); - const prevTranslationX = this.translationX; - const prevTranslationY = this.translationY; - this.translationX = -bbox[0]; - this.translationY = -bbox[1]; - this.#setCanvasDims(); - this.#redraw(); - this.#realWidth = width; - this.#realHeight = height; - this.setDims(width, height); - const unscaledPadding = firstTime ? padding / this.scaleFactor / 2 : 0; - this.translate(prevTranslationX - this.translationX - unscaledPadding, prevTranslationY - this.translationY - unscaledPadding); + return ctx; } - static deserialize(data, parent, uiManager) { - if (data instanceof annotation_layer.InkAnnotationElement) { - return null; + static #ensureCtxFont(ctx, size, family) { + const cached = this.#canvasCtxFonts.get(ctx); + if (size === cached.size && family === cached.family) { + return; } - const editor = super.deserialize(data, parent, uiManager); - editor.thickness = data.thickness; - editor.color = util.Util.makeHexColor(...data.color); - editor.opacity = data.opacity; - const [pageWidth, pageHeight] = editor.pageDimensions; - const width = editor.width * pageWidth; - const height = editor.height * pageHeight; - const scaleFactor = editor.parentScale; - const padding = data.thickness / 2; - editor.#disableEditing = true; - editor.#realWidth = Math.round(width); - editor.#realHeight = Math.round(height); - const { - paths, - rect, - rotation - } = data; - for (let { - bezier - } of paths) { - bezier = InkEditor.#fromPDFCoordinates(bezier, rect, rotation); - const path = []; - editor.paths.push(path); - let p0 = scaleFactor * (bezier[0] - padding); - let p1 = scaleFactor * (bezier[1] - padding); - for (let i = 2, ii = bezier.length; i < ii; i += 6) { - const p10 = scaleFactor * (bezier[i] - padding); - const p11 = scaleFactor * (bezier[i + 1] - padding); - const p20 = scaleFactor * (bezier[i + 2] - padding); - const p21 = scaleFactor * (bezier[i + 3] - padding); - const p30 = scaleFactor * (bezier[i + 4] - padding); - const p31 = scaleFactor * (bezier[i + 5] - padding); - path.push([[p0, p1], [p10, p11], [p20, p21], [p30, p31]]); - p0 = p30; - p1 = p31; - } - const path2D = this.#buildPath2D(path); - editor.bezierPath2D.push(path2D); - } - const bbox = editor.#getBbox(); - editor.#baseWidth = Math.max(editor_editor.AnnotationEditor.MIN_SIZE, bbox[2] - bbox[0]); - editor.#baseHeight = Math.max(editor_editor.AnnotationEditor.MIN_SIZE, bbox[3] - bbox[1]); - editor.#setScaleFactor(width, height); - return editor; + ctx.font = `${size}px ${family}`; + cached.size = size; + cached.family = family; } - serialize() { - if (this.isEmpty()) { - return null; + static #ensureMinFontSizeComputed() { + if (this.#minFontSize !== null) { + return; } - const rect = this.getRect(0, 0); - const color = editor_editor.AnnotationEditor._colorManager.convert(this.ctx.strokeStyle); - return { - annotationType: util.AnnotationEditorType.INK, - color, - thickness: this.thickness, - opacity: this.opacity, - paths: this.#serializePaths(this.scaleFactor / this.parentScale, this.translationX, this.translationY, rect), - pageIndex: this.pageIndex, - rect, - rotation: this.rotation, - structTreeParentId: this._structTreeParentId - }; + const div = document.createElement("div"); + div.style.opacity = 0; + div.style.lineHeight = 1; + div.style.fontSize = "1px"; + div.style.position = "absolute"; + div.textContent = "X"; + document.body.append(div); + this.#minFontSize = div.getBoundingClientRect().height; + div.remove(); + } + static #getAscent(fontFamily, style, lang) { + const cachedAscent = this.#ascentCache.get(fontFamily); + if (cachedAscent) { + return cachedAscent; + } + const ctx = this.#getCtx(lang); + ctx.canvas.width = ctx.canvas.height = DEFAULT_FONT_SIZE; + this.#ensureCtxFont(ctx, DEFAULT_FONT_SIZE, fontFamily); + const metrics = ctx.measureText(""); + const ascent = metrics.fontBoundingBoxAscent; + const descent = Math.abs(metrics.fontBoundingBoxDescent); + ctx.canvas.width = ctx.canvas.height = 0; + let ratio = 0.8; + if (ascent) { + ratio = ascent / (ascent + descent); + } else { + if (FeatureTest.platform.isFirefox) { + warn("Enable the `dom.textMetrics.fontBoundingBox.enabled` preference " + "in `about:config` to improve TextLayer rendering."); + } + if (style.ascent) { + ratio = style.ascent; + } else if (style.descent) { + ratio = 1 + style.descent; + } + } + this.#ascentCache.set(fontFamily, ratio); + return ratio; } } -;// CONCATENATED MODULE: ./src/display/editor/stamp.js +;// ./src/display/api.js -class StampEditor extends editor_editor.AnnotationEditor { - #bitmap = null; - #bitmapId = null; - #bitmapPromise = null; - #bitmapUrl = null; - #bitmapFile = null; - #bitmapFileName = ""; - #canvas = null; - #observer = null; - #resizeTimeoutId = null; - #isSvg = false; - #hasBeenAddedInUndoStack = false; - static _type = "stamp"; - static _editorType = util.AnnotationEditorType.STAMP; - constructor(params) { - super({ - ...params, - name: "stampEditor" - }); - this.#bitmapUrl = params.bitmapUrl; - this.#bitmapFile = params.bitmapFile; - } - static initialize(l10n, uiManager) { - editor_editor.AnnotationEditor.initialize(l10n, uiManager); - } - static get supportedTypes() { - const types = ["apng", "avif", "bmp", "gif", "jpeg", "png", "svg+xml", "webp", "x-icon"]; - return (0,util.shadow)(this, "supportedTypes", types.map(type => `image/${type}`)); - } - static get supportedTypesStr() { - return (0,util.shadow)(this, "supportedTypesStr", this.supportedTypes.join(",")); - } - static isHandlingMimeForPasting(mime) { - return this.supportedTypes.includes(mime); - } - static paste(item, parent) { - parent.pasteEditor(util.AnnotationEditorType.STAMP, { - bitmapFile: item.getAsFile() + + + + + + + + + + + + + + + + + + + + + +const RENDERING_CANCELLED_TIMEOUT = 100; +function getDocument(src = {}) { + const task = new PDFDocumentLoadingTask(); + const { + docId + } = task; + const url = src.url ? getUrlProp(src.url) : null; + const data = src.data ? getDataProp(src.data) : null; + const httpHeaders = src.httpHeaders || null; + const withCredentials = src.withCredentials === true; + const password = src.password ?? null; + const rangeTransport = src.range instanceof PDFDataRangeTransport ? src.range : null; + const rangeChunkSize = Number.isInteger(src.rangeChunkSize) && src.rangeChunkSize > 0 ? src.rangeChunkSize : 2 ** 16; + let worker = src.worker instanceof PDFWorker ? src.worker : null; + const verbosity = src.verbosity; + const docBaseUrl = typeof src.docBaseUrl === "string" && !isDataScheme(src.docBaseUrl) ? src.docBaseUrl : null; + const cMapUrl = getFactoryUrlProp(src.cMapUrl); + const cMapPacked = src.cMapPacked !== false; + const iccUrl = getFactoryUrlProp(src.iccUrl); + const standardFontDataUrl = getFactoryUrlProp(src.standardFontDataUrl); + const wasmUrl = getFactoryUrlProp(src.wasmUrl); + const ignoreErrors = src.stopAtErrors !== true; + const maxImageSize = Number.isInteger(src.maxImageSize) && src.maxImageSize > -1 ? src.maxImageSize : -1; + const isOffscreenCanvasSupported = typeof src.isOffscreenCanvasSupported === "boolean" ? src.isOffscreenCanvasSupported : !isNodeJS; + const isImageDecoderSupported = typeof src.isImageDecoderSupported === "boolean" ? src.isImageDecoderSupported : !isNodeJS; + const canvasMaxAreaInBytes = Number.isInteger(src.canvasMaxAreaInBytes) ? src.canvasMaxAreaInBytes : -1; + const disableFontFace = typeof src.disableFontFace === "boolean" ? src.disableFontFace : isNodeJS; + const fontExtraProperties = src.fontExtraProperties === true; + const enableXfa = src.enableXfa === true; + const ownerDocument = src.ownerDocument || globalThis.document; + const disableRange = src.disableRange === true; + const disableStream = src.disableStream === true; + const disableAutoFetch = src.disableAutoFetch === true; + const pdfBug = src.pdfBug === true; + const CanvasFactory = src.CanvasFactory || (isNodeJS ? NodeCanvasFactory : DOMCanvasFactory); + const FilterFactory = src.FilterFactory || (isNodeJS ? NodeFilterFactory : DOMFilterFactory); + const BinaryDataFactory = src.BinaryDataFactory || (isNodeJS ? NodeBinaryDataFactory : DOMBinaryDataFactory); + const enableHWA = src.enableHWA === true; + const enableWebGPU = src.enableWebGPU === true; + const gpuPromise = enableWebGPU ? initGPU() : Promise.resolve(false); + const useWasm = src.useWasm !== false; + const pagesMapper = src.pagesMapper || new PagesMapper(); + const useSystemFonts = typeof src.useSystemFonts === "boolean" ? src.useSystemFonts : !isNodeJS && !disableFontFace; + const useWorkerFetch = typeof src.useWorkerFetch === "boolean" ? src.useWorkerFetch : !!(BinaryDataFactory === DOMBinaryDataFactory && cMapUrl && cMapPacked && standardFontDataUrl && wasmUrl && isValidFetchUrl(cMapUrl, document.baseURI) && isValidFetchUrl(standardFontDataUrl, document.baseURI) && isValidFetchUrl(wasmUrl, document.baseURI)); + const styleElement = null; + setVerbosityLevel(verbosity); + const transportFactory = { + canvasFactory: new CanvasFactory({ + ownerDocument, + enableHWA + }), + filterFactory: new FilterFactory({ + docId, + ownerDocument + }), + binaryDataFactory: useWorkerFetch ? null : new BinaryDataFactory({ + cMapUrl, + standardFontDataUrl, + wasmUrl + }) + }; + if (!worker) { + worker = PDFWorker.create({ + verbosity, + port: GlobalWorkerOptions.workerPort }); + task._worker = worker; } - #getBitmapFetched(data, fromId = false) { - if (!data) { - this.remove(); - return; + const docParams = { + docId, + apiVersion: "6.1.200", + data, + password, + disableAutoFetch, + rangeChunkSize, + docBaseUrl, + enableXfa, + evaluatorOptions: { + maxImageSize, + disableFontFace, + ignoreErrors, + isOffscreenCanvasSupported, + isImageDecoderSupported, + canvasMaxAreaInBytes, + fontExtraProperties, + useSystemFonts, + useWasm, + useWorkerFetch, + cMapUrl, + cMapPacked, + iccUrl, + standardFontDataUrl, + wasmUrl, + hasGPU: false } - this.#bitmap = data.bitmap; - if (!fromId) { - this.#bitmapId = data.id; - this.#isSvg = data.isSvg; + }; + const transportParams = { + ownerDocument, + pdfBug, + styleElement, + enableHWA, + loadingParams: { + disableAutoFetch, + enableXfa } - if (data.file) { - this.#bitmapFileName = data.file.name; + }; + Promise.all([worker.promise, gpuPromise]).then(function ([, hasGPU]) { + if (worker.destroyed) { + throw new Error("Worker was destroyed"); + } + docParams.evaluatorOptions.hasGPU = hasGPU; + const workerIdPromise = worker.messageHandler.sendWithPromise("GetDocRequest", docParams, data ? [data.buffer] : null); + let networkStream; + if (data) {} else if (rangeTransport) { + networkStream = new PDFDataTransportStream({ + pdfDataRangeTransport: rangeTransport, + disableRange, + disableStream + }); + } else if (url) { + const NetworkStream = getNetworkStream(url); + networkStream = new NetworkStream({ + url, + httpHeaders, + withCredentials, + rangeChunkSize, + disableRange, + disableStream + }); + } else { + throw new Error("getDocument - expected either `data`, `range`, or `url` parameter."); } - this.#createCanvas(); + return workerIdPromise.then(workerId => { + if (worker.destroyed) { + throw new Error("Worker was destroyed"); + } + const messageHandler = new MessageHandler(docId, workerId, worker.port); + const transport = new WorkerTransport(messageHandler, task, networkStream, transportParams, transportFactory, pagesMapper); + task._transport = transport; + if (task.destroyed) { + throw new Error("Loading aborted"); + } + messageHandler.send("Ready", null); + }); + }).catch(task._capability.reject).finally(task._setupCapability.resolve); + return task; +} +class PDFDocumentLoadingTask { + static #docId = 0; + _capability = Promise.withResolvers(); + _setupCapability = Promise.withResolvers(); + _transport = null; + _worker = null; + docId = `d${PDFDocumentLoadingTask.#docId++}`; + destroyed = false; + onPassword = null; + onProgress = null; + get promise() { + return this._capability.promise; } - #getBitmapDone() { - this.#bitmapPromise = null; - this._uiManager.enableWaiting(false); - if (this.#canvas) { - this.div.focus(); + async destroy() { + this.destroyed = true; + this._capability.promise.catch(() => {}); + try { + if (this._worker?.port) { + this._worker._pendingDestroy = true; + } + await this._setupCapability.promise; + await this._transport?.destroy(); + } catch (ex) { + if (this._worker?.port) { + delete this._worker._pendingDestroy; + } + throw ex; } + this._transport = null; + this._worker?.destroy(); + this._worker = null; } - #getBitmap() { - if (this.#bitmapId) { - this._uiManager.enableWaiting(true); - this._uiManager.imageManager.getFromId(this.#bitmapId).then(data => this.#getBitmapFetched(data, true)).finally(() => this.#getBitmapDone()); - return; - } - if (this.#bitmapUrl) { - const url = this.#bitmapUrl; - this.#bitmapUrl = null; - this._uiManager.enableWaiting(true); - this.#bitmapPromise = this._uiManager.imageManager.getFromUrl(url).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone()); - return; - } - if (this.#bitmapFile) { - const file = this.#bitmapFile; - this.#bitmapFile = null; - this._uiManager.enableWaiting(true); - this.#bitmapPromise = this._uiManager.imageManager.getFromFile(file).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone()); - return; - } - const input = document.createElement("input"); - input.type = "file"; - input.accept = StampEditor.supportedTypesStr; - this.#bitmapPromise = new Promise(resolve => { - input.addEventListener("change", async () => { - if (!input.files || input.files.length === 0) { - this.remove(); - } else { - this._uiManager.enableWaiting(true); - const data = await this._uiManager.imageManager.getFromFile(input.files[0]); - this.#getBitmapFetched(data); - } - resolve(); + async getData() { + return this._transport.getData(); + } +} +class PDFDataRangeTransport { + #capability = Promise.withResolvers(); + #listener = null; + constructor(length, initialData, progressiveDone = false, contentDispositionFilename = null) { + this.length = length; + this.initialData = initialData; + this.progressiveDone = progressiveDone; + this.contentDispositionFilename = contentDispositionFilename; + } + onDataRange(begin, chunk) { + this.#listener({ + type: "range", + begin, + chunk + }); + } + onDataProgressiveRead(chunk) { + this.#capability.promise.then(() => { + this.#listener({ + type: "progressiveRead", + chunk }); - input.addEventListener("cancel", () => { - this.remove(); - resolve(); + }); + } + onDataProgressiveDone() { + this.#capability.promise.then(() => { + this.#listener({ + type: "progressiveDone" }); - }).finally(() => this.#getBitmapDone()); - input.click(); + }); } - remove() { - if (this.#bitmapId) { - this.#bitmap = null; - this._uiManager.imageManager.deleteId(this.#bitmapId); - this.#canvas?.remove(); - this.#canvas = null; - this.#observer?.disconnect(); - this.#observer = null; - if (this.#resizeTimeoutId) { - clearTimeout(this.#resizeTimeoutId); - this.#resizeTimeoutId = null; - } - } - super.remove(); + transportReady(listener) { + this.#listener = listener; + this.#capability.resolve(); } - rebuild() { - if (!this.parent) { - if (this.#bitmapId) { - this.#getBitmap(); - } - return; - } - super.rebuild(); - if (this.div === null) { - return; - } - if (this.#bitmapId && this.#canvas === null) { - this.#getBitmap(); - } - if (!this.isAttachedToDOM) { - this.parent.add(this); - } + requestDataRange(begin, end) { + unreachable("Abstract method PDFDataRangeTransport.requestDataRange"); } - onceAdded() { - this._isDraggable = true; - this.div.focus(); + abort() {} +} +class PDFDocumentProxy { + constructor(pdfInfo, transport) { + this._pdfInfo = pdfInfo; + this._transport = transport; } - isEmpty() { - return !(this.#bitmapPromise || this.#bitmap || this.#bitmapUrl || this.#bitmapFile || this.#bitmapId); + get pagesMapper() { + return this._transport.pagesMapper; } - get isResizable() { - return true; + get annotationStorage() { + return this._transport.annotationStorage; } - render() { - if (this.div) { - return this.div; + get canvasFactory() { + return this._transport.canvasFactory; + } + get filterFactory() { + return this._transport.filterFactory; + } + get numPages() { + return this._pdfInfo.numPages; + } + get fingerprints() { + return this._pdfInfo.fingerprints; + } + get isPureXfa() { + return shadow(this, "isPureXfa", !!this._transport._htmlForXfa); + } + get allXfaHtml() { + return this._transport._htmlForXfa; + } + getPage(pageNumber) { + return this._transport.getPage(pageNumber); + } + getPageIndex(ref) { + return this._transport.getPageIndex(ref); + } + getDestinations() { + return this._transport.getDestinations(); + } + getDestination(id) { + return this._transport.getDestination(id); + } + getPageLabels() { + return this._transport.getPageLabels(); + } + getPageLayout() { + return this._transport.getPageLayout(); + } + getPageMode() { + return this._transport.getPageMode(); + } + getViewerPreferences() { + return this._transport.getViewerPreferences(); + } + getOpenAction() { + return this._transport.getOpenAction(); + } + getAttachments() { + return this._transport.getAttachments(); + } + getAttachmentContent(id) { + return this._transport.getAttachmentContent(id); + } + getAnnotationsByType(types, pageIndexesToSkip) { + return this._transport.getAnnotationsByType(types, pageIndexesToSkip); + } + getJSActions() { + return this._transport.getDocJSActions(); + } + getOutline() { + return this._transport.getOutline(); + } + getOptionalContentConfig({ + intent = "display" + } = {}) { + const { + renderingIntent + } = this._transport.getRenderingIntent(intent); + return this._transport.getOptionalContentConfig(renderingIntent); + } + getPermissions() { + return this._transport.getPermissions(); + } + getMetadata() { + return this._transport.getMetadata(); + } + getMarkInfo() { + return this._transport.getMarkInfo(); + } + getData() { + return this._transport.getData(); + } + saveDocument() { + return this._transport.saveDocument(); + } + extractPages(pageInfos) { + return this._transport.extractPages(pageInfos); + } + getDownloadInfo() { + return this._transport.downloadInfoCapability.promise; + } + getRawData(data) { + return this._transport.getRawData(data); + } + cleanup(keepLoadedFonts = false) { + return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa); + } + cachedPageNumber(ref) { + return this._transport.cachedPageNumber(ref); + } + get loadingParams() { + return this._transport.loadingParams; + } + get loadingTask() { + return this._transport.loadingTask; + } + getFieldObjects() { + return this._transport.getFieldObjects(); + } + hasJSActions() { + return this._transport.hasJSActions(); + } + getCalculationOrderIds() { + return this._transport.getCalculationOrderIds(); + } +} +class PDFPageProxy { + #pendingCleanup = false; + #pagesMapper = null; + constructor(pageIndex, pageInfo, transport, pagesMapper, pdfBug = false) { + this._pageIndex = pageIndex; + this._pageInfo = pageInfo; + this._transport = transport; + this._stats = pdfBug ? new StatTimer() : null; + this._pdfBug = pdfBug; + this.commonObjs = transport.commonObjs; + this.objs = new PDFObjects(); + this._intentStates = new Map(); + this.destroyed = false; + this.recordedBBoxes = null; + this.#pagesMapper = pagesMapper; + this.imageCoordinates = null; + } + clone(id) { + const clone = new PDFPageProxy(id, this._pageInfo, this._transport, this.#pagesMapper, this._pdfBug); + clone.clonedFromIndex = this.clonedFromIndex ?? this._pageIndex; + this._transport.updatePage(clone); + return clone; + } + get pageNumber() { + return this._pageIndex + 1; + } + set pageNumber(value) { + this._pageIndex = value - 1; + this._transport.updatePage(this); + } + get rotate() { + return this._pageInfo.rotate; + } + get ref() { + return this._pageInfo.ref; + } + get userUnit() { + return this._pageInfo.userUnit; + } + get view() { + return this._pageInfo.view; + } + getViewport({ + scale, + rotation = this.rotate, + offsetX = 0, + offsetY = 0, + dontFlip = false + } = {}) { + return new PageViewport({ + viewBox: this.view, + userUnit: this.userUnit, + scale, + rotation, + offsetX, + offsetY, + dontFlip + }); + } + getAnnotations({ + intent = "display" + } = {}) { + const { + renderingIntent + } = this._transport.getRenderingIntent(intent); + return this._transport.getAnnotations(this._pageIndex, renderingIntent); + } + getJSActions() { + return this._transport.getPageJSActions(this._pageIndex); + } + get filterFactory() { + return this._transport.filterFactory; + } + get isPureXfa() { + return shadow(this, "isPureXfa", !!this._transport._htmlForXfa); + } + async getXfa() { + return this._transport._htmlForXfa?.children[this._pageIndex] || null; + } + render({ + canvasContext, + canvas = canvasContext.canvas, + viewport, + intent = "display", + annotationMode = AnnotationMode.ENABLE, + transform = null, + background = null, + optionalContentConfigPromise = null, + annotationCanvasMap = null, + pageColors = null, + printAnnotationStorage = null, + isEditing = false, + recordImages = false, + recordOperations = false, + operationsFilter = null + }) { + this._stats?.time("Overall"); + const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing); + const { + renderingIntent, + cacheKey + } = intentArgs; + this.#pendingCleanup = false; + optionalContentConfigPromise ||= this._transport.getOptionalContentConfig(renderingIntent); + const intentState = this._intentStates.getOrInsertComputed(cacheKey, makeObj); + if (intentState.streamReaderCancelTimeout) { + clearTimeout(intentState.streamReaderCancelTimeout); + intentState.streamReaderCancelTimeout = null; } - let baseX, baseY; - if (this.width) { - baseX = this.x; - baseY = this.y; + const intentPrint = !!(renderingIntent & RenderingIntentFlag.PRINT); + if (!intentState.displayReadyCapability) { + intentState.displayReadyCapability = Promise.withResolvers(); + intentState.operatorList = { + fnArray: [], + argsArray: [], + lastChunk: false, + separateAnnots: null + }; + this._stats?.time("Page Request"); + this._pumpOperatorList(intentArgs); } - super.render(); - this.div.hidden = true; - this.addAltTextButton(); - if (this.#bitmap) { - this.#createCanvas(); - } else { - this.#getBitmap(); + const recordForDebugger = !!(this._pdfBug && globalThis.StepperManager?.enabled); + const shouldRecordOperations = !!canvas && !this.recordedBBoxes && (recordOperations || recordForDebugger); + const shouldRecordImages = !!canvas && !this.imageCoordinates && recordImages; + const complete = error => { + intentState.renderTasks.delete(internalRenderTask); + if (shouldRecordOperations) { + const recordedBBoxes = internalRenderTask.gfx?.dependencyTracker.take(); + if (recordedBBoxes) { + internalRenderTask.stepper?.setOperatorBBoxes(recordedBBoxes, internalRenderTask.gfx.dependencyTracker.takeDebugMetadata()); + if (recordOperations) { + this.recordedBBoxes = recordedBBoxes; + } + } + } + if (shouldRecordImages && !error) { + this.imageCoordinates = internalRenderTask.gfx?.imagesTracker.take(); + } + if (intentPrint) { + this.#pendingCleanup = true; + } + this.#tryCleanup(); + if (error) { + internalRenderTask.capability.reject(error); + this._abortOperatorList({ + intentState, + reason: error instanceof Error ? error : new Error(error) + }); + } else { + internalRenderTask.capability.resolve(); + } + if (this._stats) { + this._stats.timeEnd("Rendering"); + this._stats.timeEnd("Overall"); + if (globalThis.Stats?.enabled) { + globalThis.Stats.add(this.pageNumber, this._stats); + } + } + }; + let dependencyTracker = null; + let bboxTracker = null; + if (shouldRecordOperations || shouldRecordImages) { + bboxTracker = new CanvasBBoxTracker(canvas, intentState.operatorList.length); } - if (this.width) { - const [parentWidth, parentHeight] = this.parentDimensions; - this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight); + if (shouldRecordOperations) { + dependencyTracker = new CanvasDependencyTracker(bboxTracker, recordForDebugger); } - return this.div; + const internalRenderTask = new InternalRenderTask({ + callback: complete, + params: { + canvas, + canvasContext, + dependencyTracker: dependencyTracker ?? bboxTracker, + imagesTracker: shouldRecordImages ? new CanvasImagesTracker(canvas) : null, + viewport, + transform, + background + }, + objs: this.objs, + commonObjs: this.commonObjs, + annotationCanvasMap, + operatorList: intentState.operatorList, + pageIndex: this._pageIndex, + canvasFactory: this._transport.canvasFactory, + filterFactory: this._transport.filterFactory, + useRequestAnimationFrame: !intentPrint, + pdfBug: this._pdfBug, + pageColors, + enableHWA: this._transport.enableHWA, + operationsFilter + }); + (intentState.renderTasks ||= new Set()).add(internalRenderTask); + const renderTask = internalRenderTask.task; + Promise.all([intentState.displayReadyCapability.promise, optionalContentConfigPromise]).then(([transparency, optionalContentConfig]) => { + if (this.destroyed) { + complete(); + return; + } + this._stats?.time("Rendering"); + if (!(optionalContentConfig.renderingIntent & renderingIntent)) { + throw new Error("Must use the same `intent`-argument when calling the `PDFPageProxy.render` " + "and `PDFDocumentProxy.getOptionalContentConfig` methods."); + } + internalRenderTask.initializeGraphics({ + transparency, + optionalContentConfig + }); + internalRenderTask.operatorListChanged(); + }).catch(complete); + return renderTask; } - #createCanvas() { - const { - div - } = this; - let { - width, - height - } = this.#bitmap; - const [pageWidth, pageHeight] = this.pageDimensions; - const MAX_RATIO = 0.75; - if (this.width) { - width = this.width * pageWidth; - height = this.height * pageHeight; - } else if (width > MAX_RATIO * pageWidth || height > MAX_RATIO * pageHeight) { - const factor = Math.min(MAX_RATIO * pageWidth / width, MAX_RATIO * pageHeight / height); - width *= factor; - height *= factor; + getOperatorList({ + intent = "display", + annotationMode = AnnotationMode.ENABLE, + printAnnotationStorage = null, + isEditing = false + } = {}) { + function operatorListChanged() { + if (intentState.operatorList.lastChunk) { + intentState.opListReadCapability.resolve(intentState.operatorList); + intentState.renderTasks.delete(opListTask); + } } - const [parentWidth, parentHeight] = this.parentDimensions; - this.setDims(width * parentWidth / pageWidth, height * parentHeight / pageHeight); - this._uiManager.enableWaiting(false); - const canvas = this.#canvas = document.createElement("canvas"); - div.append(canvas); - div.hidden = false; - this.#drawBitmap(width, height); - this.#createObserver(); - if (!this.#hasBeenAddedInUndoStack) { - this.parent.addUndoableEditor(this); - this.#hasBeenAddedInUndoStack = true; + const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing, true); + const intentState = this._intentStates.getOrInsertComputed(intentArgs.cacheKey, makeObj); + let opListTask; + if (!intentState.opListReadCapability) { + opListTask = Object.create(null); + opListTask.operatorListChanged = operatorListChanged; + intentState.opListReadCapability = Promise.withResolvers(); + (intentState.renderTasks ||= new Set()).add(opListTask); + intentState.operatorList = { + fnArray: [], + argsArray: [], + lastChunk: false, + separateAnnots: null + }; + this._stats?.time("Page Request"); + this._pumpOperatorList(intentArgs); } - this._reportTelemetry({ - action: "inserted_image" + return intentState.opListReadCapability.promise; + } + streamTextContent({ + includeMarkedContent = false, + disableNormalization = false + } = {}) { + const TEXT_CONTENT_CHUNK_SIZE = 100; + return this._transport.messageHandler.sendWithStream("GetTextContent", { + pageId: this.#pagesMapper.getPageId(this._pageIndex + 1) - 1, + pageIndex: this._pageIndex, + includeMarkedContent: includeMarkedContent === true, + disableNormalization: disableNormalization === true + }, { + highWaterMark: TEXT_CONTENT_CHUNK_SIZE, + size(textContent) { + return textContent.items.length; + } }); - if (this.#bitmapFileName) { - canvas.setAttribute("aria-label", this.#bitmapFileName); - } } - #setDimensions(width, height) { - const [parentWidth, parentHeight] = this.parentDimensions; - this.width = width / parentWidth; - this.height = height / parentHeight; - this.setDims(width, height); - if (this._initialOptions?.isCentered) { - this.center(); - } else { - this.fixAndSetPosition(); + async getTextContent(params = {}) { + if (this._transport._htmlForXfa) { + return this.getXfa().then(xfa => XfaText.textContent(xfa)); } - this._initialOptions = null; - if (this.#resizeTimeoutId !== null) { - clearTimeout(this.#resizeTimeoutId); + const readableStream = this.streamTextContent(params); + const textContent = { + items: [], + styles: Object.create(null), + lang: null + }; + for await (const value of readableStream) { + textContent.lang ??= value.lang; + Object.assign(textContent.styles, value.styles); + textContent.items.push(...value.items); } - const TIME_TO_WAIT = 200; - this.#resizeTimeoutId = setTimeout(() => { - this.#resizeTimeoutId = null; - this.#drawBitmap(width, height); - }, TIME_TO_WAIT); + return textContent; } - #scaleBitmap(width, height) { - const { - width: bitmapWidth, - height: bitmapHeight - } = this.#bitmap; - let newWidth = bitmapWidth; - let newHeight = bitmapHeight; - let bitmap = this.#bitmap; - while (newWidth > 2 * width || newHeight > 2 * height) { - const prevWidth = newWidth; - const prevHeight = newHeight; - if (newWidth > 2 * width) { - newWidth = newWidth >= 16384 ? Math.floor(newWidth / 2) - 1 : Math.ceil(newWidth / 2); + getStructTree() { + return this._transport.getStructTree(this._pageIndex); + } + _destroy() { + this.destroyed = true; + const waitOn = []; + for (const intentState of this._intentStates.values()) { + this._abortOperatorList({ + intentState, + reason: new Error("Page was destroyed."), + force: true + }); + if (intentState.opListReadCapability) { + continue; } - if (newHeight > 2 * height) { - newHeight = newHeight >= 16384 ? Math.floor(newHeight / 2) - 1 : Math.ceil(newHeight / 2); + for (const internalRenderTask of intentState.renderTasks) { + waitOn.push(internalRenderTask.completed); + internalRenderTask.cancel(); } - const offscreen = new OffscreenCanvas(newWidth, newHeight); - const ctx = offscreen.getContext("2d"); - ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight); - bitmap = offscreen.transferToImageBitmap(); } - return bitmap; + this.objs.clear(); + this.#pendingCleanup = false; + return Promise.all(waitOn); } - #drawBitmap(width, height) { - width = Math.ceil(width); - height = Math.ceil(height); - const canvas = this.#canvas; - if (!canvas || canvas.width === width && canvas.height === height) { - return; - } - canvas.width = width; - canvas.height = height; - const bitmap = this.#isSvg ? this.#bitmap : this.#scaleBitmap(width, height); - if (this._uiManager.hasMLManager && !this.hasAltText()) { - const offscreen = new OffscreenCanvas(width, height); - const ctx = offscreen.getContext("2d"); - ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, width, height); - offscreen.convertToBlob().then(blob => { - const fileReader = new FileReader(); - fileReader.onload = () => { - const url = fileReader.result; - this._uiManager.mlGuess({ - service: "image-to-text", - request: { - imageData: url - } - }).then(response => { - const altText = response?.output || ""; - if (this.parent && altText && !this.hasAltText()) { - this.altTextData = { - altText, - decorative: false - }; - } - }); - }; - fileReader.readAsDataURL(blob); - }); + cleanup(resetStats = false) { + this.#pendingCleanup = true; + const success = this.#tryCleanup(); + if (resetStats && success) { + this._stats &&= new StatTimer(); } - const ctx = canvas.getContext("2d"); - ctx.filter = this._uiManager.hcmFilter; - ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, width, height); - } - getImageForAltText() { - return this.#canvas; + return success; } - #serializeBitmap(toUrl) { - if (toUrl) { - if (this.#isSvg) { - const url = this._uiManager.imageManager.getSvgUrl(this.#bitmapId); - if (url) { - return url; - } - } - const canvas = document.createElement("canvas"); - ({ - width: canvas.width, - height: canvas.height - } = this.#bitmap); - const ctx = canvas.getContext("2d"); - ctx.drawImage(this.#bitmap, 0, 0); - return canvas.toDataURL(); + #tryCleanup() { + if (!this.#pendingCleanup || this.destroyed) { + return false; } - if (this.#isSvg) { - const [pageWidth, pageHeight] = this.pageDimensions; - const width = Math.round(this.width * pageWidth * display_utils.PixelsPerInch.PDF_TO_CSS_UNITS); - const height = Math.round(this.height * pageHeight * display_utils.PixelsPerInch.PDF_TO_CSS_UNITS); - const offscreen = new OffscreenCanvas(width, height); - const ctx = offscreen.getContext("2d"); - ctx.drawImage(this.#bitmap, 0, 0, this.#bitmap.width, this.#bitmap.height, 0, 0, width, height); - return offscreen.transferToImageBitmap(); + for (const { + renderTasks, + operatorList + } of this._intentStates.values()) { + if (renderTasks.size > 0 || !operatorList.lastChunk) { + return false; + } } - return structuredClone(this.#bitmap); + this._intentStates.clear(); + this.objs.clear(); + this.#pendingCleanup = false; + return true; } - #createObserver() { - this.#observer = new ResizeObserver(entries => { - const rect = entries[0].contentRect; - if (rect.width && rect.height) { - this.#setDimensions(rect.width, rect.height); - } - }); - this.#observer.observe(this.div); + _startRenderPage(transparency, cacheKey) { + const intentState = this._intentStates.get(cacheKey); + if (!intentState) { + return; + } + this._stats?.timeEnd("Page Request"); + intentState.displayReadyCapability?.resolve(transparency); } - static deserialize(data, parent, uiManager) { - if (data instanceof annotation_layer.StampAnnotationElement) { - return null; + _renderPageChunk(operatorListChunk, intentState) { + for (let i = 0, ii = operatorListChunk.length; i < ii; i++) { + intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]); + intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]); } - const editor = super.deserialize(data, parent, uiManager); - const { - rect, - bitmapUrl, - bitmapId, - isSvg, - accessibilityData - } = data; - if (bitmapId && uiManager.imageManager.isValidId(bitmapId)) { - editor.#bitmapId = bitmapId; - } else { - editor.#bitmapUrl = bitmapUrl; + intentState.operatorList.lastChunk = operatorListChunk.lastChunk; + intentState.operatorList.separateAnnots = operatorListChunk.separateAnnots; + for (const internalRenderTask of intentState.renderTasks) { + internalRenderTask.operatorListChanged(); } - editor.#isSvg = isSvg; - const [parentWidth, parentHeight] = editor.pageDimensions; - editor.width = (rect[2] - rect[0]) / parentWidth; - editor.height = (rect[3] - rect[1]) / parentHeight; - if (accessibilityData) { - editor.altTextData = accessibilityData; + if (operatorListChunk.lastChunk) { + this.#tryCleanup(); } - return editor; } - serialize(isForCopying = false, context = null) { - if (this.isEmpty()) { - return null; - } - const serialized = { - annotationType: util.AnnotationEditorType.STAMP, - bitmapId: this.#bitmapId, - pageIndex: this.pageIndex, - rect: this.getRect(0, 0), - rotation: this.rotation, - isSvg: this.#isSvg, - structTreeParentId: this._structTreeParentId + _pumpOperatorList({ + renderingIntent, + cacheKey, + annotationStorageSerializable, + modifiedIds + }) { + const { + map, + transfer + } = annotationStorageSerializable; + const readableStream = this._transport.messageHandler.sendWithStream("GetOperatorList", { + pageId: this.#pagesMapper.getPageId(this._pageIndex + 1) - 1, + pageIndex: this._pageIndex, + intent: renderingIntent, + cacheKey, + annotationStorage: map, + modifiedIds + }, undefined, transfer); + const reader = readableStream.getReader(); + const intentState = this._intentStates.get(cacheKey); + intentState.streamReader = reader; + const pump = () => { + reader.read().then(({ + value, + done + }) => { + if (done) { + intentState.streamReader = null; + return; + } + if (this._transport.destroyed) { + return; + } + this._renderPageChunk(value, intentState); + pump(); + }, reason => { + intentState.streamReader = null; + if (this._transport.destroyed) { + return; + } + if (intentState.operatorList) { + intentState.operatorList.lastChunk = true; + for (const internalRenderTask of intentState.renderTasks) { + internalRenderTask.operatorListChanged(); + } + this.#tryCleanup(); + } + if (intentState.displayReadyCapability) { + intentState.displayReadyCapability.reject(reason); + } else if (intentState.opListReadCapability) { + intentState.opListReadCapability.reject(reason); + } else { + throw reason; + } + }); }; - if (isForCopying) { - serialized.bitmapUrl = this.#serializeBitmap(true); - serialized.accessibilityData = this.altTextData; - return serialized; + pump(); + } + _abortOperatorList({ + intentState, + reason, + force = false + }) { + if (!intentState.streamReader) { + return; } - const { - decorative, - altText - } = this.altTextData; - if (!decorative && altText) { - serialized.accessibilityData = { - type: "Figure", - alt: altText - }; + if (intentState.streamReaderCancelTimeout) { + clearTimeout(intentState.streamReaderCancelTimeout); + intentState.streamReaderCancelTimeout = null; } - if (context === null) { - return serialized; + if (!force) { + if (intentState.renderTasks.size > 0) { + return; + } + if (reason instanceof RenderingCancelledException) { + let delay = RENDERING_CANCELLED_TIMEOUT; + if (reason.extraDelay > 0 && reason.extraDelay < 1000) { + delay += reason.extraDelay; + } + intentState.streamReaderCancelTimeout = setTimeout(() => { + intentState.streamReaderCancelTimeout = null; + this._abortOperatorList({ + intentState, + reason, + force: true + }); + }, delay); + return; + } } - context.stamps ||= new Map(); - const area = this.#isSvg ? (serialized.rect[2] - serialized.rect[0]) * (serialized.rect[3] - serialized.rect[1]) : null; - if (!context.stamps.has(this.#bitmapId)) { - context.stamps.set(this.#bitmapId, { - area, - serialized - }); - serialized.bitmap = this.#serializeBitmap(false); - } else if (this.#isSvg) { - const prevData = context.stamps.get(this.#bitmapId); - if (area > prevData.area) { - prevData.area = area; - prevData.serialized.bitmap.close(); - prevData.serialized.bitmap = this.#serializeBitmap(false); + intentState.streamReader.cancel(new AbortException(reason.message)).catch(() => {}); + intentState.streamReader = null; + if (this._transport.destroyed) { + return; + } + for (const [curCacheKey, curIntentState] of this._intentStates) { + if (curIntentState === intentState) { + this._intentStates.delete(curCacheKey); + break; } } - return serialized; + this.cleanup(); + } + get stats() { + return this._stats; } } - -;// CONCATENATED MODULE: ./src/display/editor/annotation_editor_layer.js - - - - - - - -class AnnotationEditorLayer { - #accessibilityManager; - #allowClick = false; - #annotationLayer = null; - #boundPointerup = null; - #boundPointerdown = null; - #boundTextLayerPointerDown = null; - #editorFocusTimeoutId = null; - #editors = new Map(); - #hadPointerDown = false; - #isCleaningUp = false; - #isDisabling = false; - #textLayer = null; - #uiManager; - static _initialized = false; - static #editorTypes = new Map([FreeTextEditor, InkEditor, StampEditor, HighlightEditor].map(type => [type._editorType, type])); +class PDFWorker { + #capability = Promise.withResolvers(); + #messageHandler = null; + #port = null; + #webWorker = null; + static #fakeWorkerId = 0; + static #isWorkerDisabled = false; + static #workerPorts = new WeakMap(); + static { + if (isNodeJS) { + this.#isWorkerDisabled = true; + GlobalWorkerOptions.workerSrc ||= "./pdf.worker.mjs"; + } + this._isSameOrigin = (baseUrl, otherUrl) => { + const base = URL.parse(baseUrl); + if (!base?.origin || base.origin === "null") { + return false; + } + const other = new URL(otherUrl, base); + return base.origin === other.origin; + }; + this._createCDNWrapper = url => { + const wrapper = `await import("${url}");`; + return URL.createObjectURL(new Blob([wrapper], { + type: "text/javascript" + })); + }; + } constructor({ - uiManager, - pageIndex, - div, - accessibilityManager, - annotationLayer, - drawLayer, - textLayer, - viewport, - l10n - }) { - const editorTypes = [...AnnotationEditorLayer.#editorTypes.values()]; - if (!AnnotationEditorLayer._initialized) { - AnnotationEditorLayer._initialized = true; - for (const editorType of editorTypes) { - editorType.initialize(l10n, uiManager); + name = null, + port = null, + verbosity = getVerbosityLevel() + } = {}) { + this.name = name; + this.destroyed = false; + this.verbosity = verbosity; + if (port) { + if (PDFWorker.#workerPorts.has(port)) { + throw new Error("Cannot use more than one PDFWorker per port."); } + PDFWorker.#workerPorts.set(port, this); + this.#initializeFromPort(port); + } else { + this.#initialize(); } - uiManager.registerEditorTypes(editorTypes); - this.#uiManager = uiManager; - this.pageIndex = pageIndex; - this.div = div; - this.#accessibilityManager = accessibilityManager; - this.#annotationLayer = annotationLayer; - this.viewport = viewport; - this.#textLayer = textLayer; - this.drawLayer = drawLayer; - this.#uiManager.addLayer(this); - } - get isEmpty() { - return this.#editors.size === 0; } - get isInvisible() { - return this.isEmpty && this.#uiManager.getMode() === util.AnnotationEditorType.NONE; + get promise() { + return this.#capability.promise; } - updateToolbar(mode) { - this.#uiManager.updateToolbar(mode); + #resolve() { + this.#capability.resolve(); + this.#messageHandler.send("configure", { + verbosity: this.verbosity + }); } - updateMode(mode = this.#uiManager.getMode()) { - this.#cleanup(); - switch (mode) { - case util.AnnotationEditorType.NONE: - this.disableTextSelection(); - this.togglePointerEvents(false); - this.toggleAnnotationLayerPointerEvents(true); - this.disableClick(); - return; - case util.AnnotationEditorType.INK: - this.addInkEditorIfNeeded(false); - this.disableTextSelection(); - this.togglePointerEvents(true); - this.disableClick(); - break; - case util.AnnotationEditorType.HIGHLIGHT: - this.enableTextSelection(); - this.togglePointerEvents(false); - this.disableClick(); - break; - default: - this.disableTextSelection(); - this.togglePointerEvents(true); - this.enableClick(); - } - this.toggleAnnotationLayerPointerEvents(false); - const { - classList - } = this.div; - for (const editorType of AnnotationEditorLayer.#editorTypes.values()) { - classList.toggle(`${editorType._type}Editing`, mode === editorType._editorType); - } - this.div.hidden = false; + get port() { + return this.#port; } - hasTextLayer(textLayer) { - return textLayer === this.#textLayer?.div; + get messageHandler() { + return this.#messageHandler; } - addInkEditorIfNeeded(isCommitting) { - if (this.#uiManager.getMode() !== util.AnnotationEditorType.INK) { + #initializeFromPort(port) { + this.#port = port; + this.#messageHandler = new MessageHandler("main", "worker", port); + this.#messageHandler.on("ready", () => {}); + this.#resolve(); + } + #initialize() { + if (PDFWorker.#isWorkerDisabled || PDFWorker.#mainThreadWorkerMessageHandler) { + this.#setupFakeWorker(); return; } - if (!isCommitting) { - for (const editor of this.#editors.values()) { - if (editor.isEmpty()) { - editor.setInBackground(); + let { + workerSrc + } = PDFWorker; + try { + if (!PDFWorker._isSameOrigin(window.location, workerSrc)) { + workerSrc = PDFWorker._createCDNWrapper(new URL(workerSrc, window.location).href); + } + const worker = new Worker(workerSrc, { + type: "module" + }); + const messageHandler = new MessageHandler("main", "worker", worker); + const terminateEarly = () => { + ac.abort(); + messageHandler.destroy(); + worker.terminate(); + if (this.destroyed) { + this.#capability.reject(new Error("Worker was destroyed")); + } else { + this.#setupFakeWorker(); + } + }; + const ac = new AbortController(); + worker.addEventListener("error", () => { + if (!this.#webWorker) { + terminateEarly(); + } + }, { + signal: ac.signal + }); + messageHandler.on("test", data => { + ac.abort(); + if (this.destroyed || !data) { + terminateEarly(); return; } - } + this.#messageHandler = messageHandler; + this.#port = worker; + this.#webWorker = worker; + this.#resolve(); + }); + messageHandler.on("ready", data => { + ac.abort(); + if (this.destroyed) { + terminateEarly(); + return; + } + try { + sendTest(); + } catch { + this.#setupFakeWorker(); + } + }); + const sendTest = () => { + const testObj = new Uint8Array(); + messageHandler.send("test", testObj, [testObj.buffer]); + }; + sendTest(); + return; + } catch { + info("The worker has been disabled."); } - const editor = this.createAndAddNewEditor({ - offsetX: 0, - offsetY: 0 - }, false); - editor.setInBackground(); + this.#setupFakeWorker(); } - setEditingState(isEditing) { - this.#uiManager.setEditingState(isEditing); - } - addCommands(params) { - this.#uiManager.addCommands(params); - } - togglePointerEvents(enabled = false) { - this.div.classList.toggle("disabled", !enabled); + #setupFakeWorker() { + if (!PDFWorker.#isWorkerDisabled) { + warn("Setting up fake worker."); + PDFWorker.#isWorkerDisabled = true; + } + PDFWorker._setupFakeWorkerGlobal.then(WorkerMessageHandler => { + if (this.destroyed) { + this.#capability.reject(new Error("Worker was destroyed")); + return; + } + const port = new LoopbackPort(); + this.#port = port; + const id = `fake${PDFWorker.#fakeWorkerId++}`; + const workerHandler = new MessageHandler(id + "_worker", id, port); + WorkerMessageHandler.setup(workerHandler, port); + this.#messageHandler = new MessageHandler(id, id + "_worker", port); + this.#resolve(); + }).catch(reason => { + this.#capability.reject(new Error(`Setting up fake worker failed: "${reason.message}".`)); + }); } - toggleAnnotationLayerPointerEvents(enabled = false) { - this.#annotationLayer?.div.classList.toggle("disabled", !enabled); + destroy() { + this.destroyed = true; + this.#webWorker?.terminate(); + this.#webWorker = null; + PDFWorker.#workerPorts.delete(this.#port); + this.#port = null; + this.#messageHandler?.destroy(); + this.#messageHandler = null; } - enable() { - this.div.tabIndex = 0; - this.togglePointerEvents(true); - const annotationElementIds = new Set(); - for (const editor of this.#editors.values()) { - editor.enableEditing(); - if (editor.annotationElementId) { - annotationElementIds.add(editor.annotationElementId); + static create(params) { + const cachedPort = this.#workerPorts.get(params?.port); + if (cachedPort) { + if (cachedPort._pendingDestroy) { + throw new Error("PDFWorker.create - the worker is being destroyed.\n" + "Please remember to await `PDFDocumentLoadingTask.destroy()`-calls."); } + return cachedPort; } - if (!this.#annotationLayer) { - return; + return new PDFWorker(params); + } + static get workerSrc() { + if (GlobalWorkerOptions.workerSrc) { + return GlobalWorkerOptions.workerSrc; } - const editables = this.#annotationLayer.getEditableAnnotations(); - for (const editable of editables) { - editable.hide(); - if (this.#uiManager.isDeletedAnnotationElement(editable.data.id)) { - continue; - } - if (annotationElementIds.has(editable.data.id)) { - continue; - } - const editor = this.deserialize(editable); - if (!editor) { - continue; - } - this.addOrRebuild(editor); - editor.enableEditing(); + throw new Error('No "GlobalWorkerOptions.workerSrc" specified.'); + } + static get #mainThreadWorkerMessageHandler() { + try { + return globalThis.pdfjsWorker?.WorkerMessageHandler || null; + } catch { + return null; } } - disable() { - this.#isDisabling = true; - this.div.tabIndex = -1; - this.togglePointerEvents(false); - const hiddenAnnotationIds = new Set(); - for (const editor of this.#editors.values()) { - editor.disableEditing(); - if (!editor.annotationElementId || editor.serialize() !== null) { - hiddenAnnotationIds.add(editor.annotationElementId); - continue; + static get _setupFakeWorkerGlobal() { + const loader = async () => { + if (this.#mainThreadWorkerMessageHandler) { + return this.#mainThreadWorkerMessageHandler; } - this.getEditableAnnotation(editor.annotationElementId)?.show(); - editor.remove(); + const worker = await import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + this.workerSrc); + return worker.WorkerMessageHandler; + }; + return shadow(this, "_setupFakeWorkerGlobal", loader()); + } +} +class WorkerTransport { + downloadInfoCapability = Promise.withResolvers(); + #fullReader = null; + #methodPromises = new Map(); + #networkStream = null; + #pageCache = new Map(); + #pagePromises = new Map(); + #pageRefCache = new Map(); + #passwordCapability = null; + constructor(messageHandler, loadingTask, networkStream, params, factory, pagesMapper) { + this.messageHandler = messageHandler; + this.loadingTask = loadingTask; + this.#networkStream = networkStream; + this.commonObjs = new PDFObjects(); + this.fontLoader = new FontLoader({ + ownerDocument: params.ownerDocument, + styleElement: params.styleElement + }); + this.enableHWA = params.enableHWA; + this.loadingParams = params.loadingParams; + this._params = params; + this.canvasFactory = factory.canvasFactory; + this.filterFactory = factory.filterFactory; + this.binaryDataFactory = factory.binaryDataFactory; + this.pagesMapper = pagesMapper; + this.destroyed = false; + this.destroyCapability = null; + this.setupMessageHandler(); + } + updatePage(page) { + const { + _pageIndex + } = page; + this.#pageCache.set(_pageIndex, page); + this.#pagePromises.set(_pageIndex, Promise.resolve(page)); + } + #cacheSimpleMethod(name, data = null) { + return this.#methodPromises.getOrInsertComputed(name, () => this.messageHandler.sendWithPromise(name, data)); + } + #onProgress({ + loaded, + total + }) { + this.loadingTask.onProgress?.({ + loaded, + total, + percent: total ? MathClamp(Math.round(loaded / total * 100), 0, 100) : NaN + }); + } + get annotationStorage() { + return shadow(this, "annotationStorage", new AnnotationStorage()); + } + getRenderingIntent(intent, annotationMode = AnnotationMode.ENABLE, printAnnotationStorage = null, isEditing = false, isOpList = false) { + let renderingIntent = RenderingIntentFlag.DISPLAY; + let annotationStorageSerializable = SerializableEmpty; + switch (intent) { + case "any": + renderingIntent = RenderingIntentFlag.ANY; + break; + case "display": + break; + case "print": + renderingIntent = RenderingIntentFlag.PRINT; + break; + default: + warn(`getRenderingIntent - invalid intent: ${intent}`); } - if (this.#annotationLayer) { - const editables = this.#annotationLayer.getEditableAnnotations(); - for (const editable of editables) { - const { - id - } = editable.data; - if (hiddenAnnotationIds.has(id) || this.#uiManager.isDeletedAnnotationElement(id)) { - continue; - } - editable.show(); - } + const annotationStorage = renderingIntent & RenderingIntentFlag.PRINT && printAnnotationStorage instanceof PrintAnnotationStorage ? printAnnotationStorage : this.annotationStorage; + switch (annotationMode) { + case AnnotationMode.DISABLE: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_DISABLE; + break; + case AnnotationMode.ENABLE: + break; + case AnnotationMode.ENABLE_FORMS: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_FORMS; + break; + case AnnotationMode.ENABLE_STORAGE: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_STORAGE; + annotationStorageSerializable = annotationStorage.serializable; + break; + default: + warn(`getRenderingIntent - invalid annotationMode: ${annotationMode}`); } - this.#cleanup(); - if (this.isEmpty) { - this.div.hidden = true; + if (isEditing) { + renderingIntent += RenderingIntentFlag.IS_EDITING; } - const { - classList - } = this.div; - for (const editorType of AnnotationEditorLayer.#editorTypes.values()) { - classList.remove(`${editorType._type}Editing`); + if (isOpList) { + renderingIntent += RenderingIntentFlag.OPLIST; } - this.disableTextSelection(); - this.toggleAnnotationLayerPointerEvents(true); - this.#isDisabling = false; - } - getEditableAnnotation(id) { - return this.#annotationLayer?.getEditableAnnotation(id) || null; + const { + ids: modifiedIds, + hash: modifiedIdsHash + } = annotationStorage.modifiedIds; + const cacheKeyBuf = [renderingIntent, annotationStorageSerializable.hash, modifiedIdsHash]; + return { + renderingIntent, + cacheKey: cacheKeyBuf.join("_"), + annotationStorageSerializable, + modifiedIds + }; } - setActiveEditor(editor) { - const currentActive = this.#uiManager.getActive(); - if (currentActive === editor) { - return; + destroy() { + if (this.destroyCapability) { + return this.destroyCapability.promise; } - this.#uiManager.setActiveEditor(editor); - } - enableTextSelection() { - this.div.tabIndex = -1; - if (this.#textLayer?.div && !this.#boundTextLayerPointerDown) { - this.#boundTextLayerPointerDown = this.#textLayerPointerDown.bind(this); - this.#textLayer.div.addEventListener("pointerdown", this.#boundTextLayerPointerDown); - this.#textLayer.div.classList.add("highlighting"); + this.destroyed = true; + this.destroyCapability = Promise.withResolvers(); + this.#passwordCapability?.reject(new Error("Worker was destroyed during onPassword callback")); + const waitOn = []; + for (const page of this.#pageCache.values()) { + waitOn.push(page._destroy()); } - } - disableTextSelection() { - this.div.tabIndex = 0; - if (this.#textLayer?.div && this.#boundTextLayerPointerDown) { - this.#textLayer.div.removeEventListener("pointerdown", this.#boundTextLayerPointerDown); - this.#boundTextLayerPointerDown = null; - this.#textLayer.div.classList.remove("highlighting"); + this.#pageCache.clear(); + this.#pagePromises.clear(); + this.#pageRefCache.clear(); + if (Object.hasOwn(this, "annotationStorage")) { + this.annotationStorage.resetModified(); } + const terminated = this.messageHandler.sendWithPromise("Terminate", null); + waitOn.push(terminated); + Promise.all(waitOn).then(() => { + this.commonObjs.clear(); + this.fontLoader.clear(); + this.#methodPromises.clear(); + this.filterFactory.destroy(); + TextLayer.cleanup(); + this.#networkStream?.cancelAllRequests(new AbortException("Worker was terminated.")); + this.messageHandler?.destroy(); + this.messageHandler = null; + this.destroyCapability.resolve(); + }, this.destroyCapability.reject); + return this.destroyCapability.promise; } - #textLayerPointerDown(event) { - this.#uiManager.unselectAll(); - if (event.target === this.#textLayer.div) { + setupMessageHandler() { + const { + messageHandler, + loadingTask + } = this; + messageHandler.on("GetReader", (data, sink) => { + assert(this.#networkStream, "GetReader - no `BasePDFStream` instance available."); + this.#fullReader = this.#networkStream.getFullReader(); + this.#fullReader.onProgress = evt => this.#onProgress(evt); + sink.onPull = () => { + this.#fullReader.read().then(function ({ + value, + done + }) { + if (done) { + sink.close(); + return; + } + assert(value instanceof ArrayBuffer, "GetReader - expected an ArrayBuffer."); + sink.enqueue(new Uint8Array(value), 1, [value]); + }).catch(reason => { + sink.error(reason); + }); + }; + sink.onCancel = reason => { + this.#fullReader.cancel(reason); + sink.ready.catch(readyReason => { + if (this.destroyed) { + return; + } + throw readyReason; + }); + }; + }); + messageHandler.on("ReaderHeadersReady", async data => { + await this.#fullReader.headersReady; const { - isMac - } = util.FeatureTest.platform; - if (event.button !== 0 || event.ctrlKey && isMac) { + isStreamingSupported, + isRangeSupported, + contentLength + } = this.#fullReader; + if (isStreamingSupported && isRangeSupported) { + this.#fullReader.onProgress = null; + } + return { + isStreamingSupported, + isRangeSupported, + contentLength + }; + }); + messageHandler.on("GetRangeReader", (data, sink) => { + assert(this.#networkStream, "GetRangeReader - no `BasePDFStream` instance available."); + const rangeReader = this.#networkStream.getRangeReader(data.begin, data.end); + if (!rangeReader) { + sink.close(); return; } - this.#uiManager.showAllEditors("highlight", true, true); - this.#textLayer.div.classList.add("free"); - HighlightEditor.startHighlighting(this, this.#uiManager.direction === "ltr", event); - this.#textLayer.div.addEventListener("pointerup", () => { - this.#textLayer.div.classList.remove("free"); - }, { - once: true + sink.onPull = () => { + rangeReader.read().then(function ({ + value, + done + }) { + if (done) { + sink.close(); + return; + } + assert(value instanceof ArrayBuffer, "GetRangeReader - expected an ArrayBuffer."); + sink.enqueue(new Uint8Array(value), 1, [value]); + }).catch(reason => { + sink.error(reason); + }); + }; + sink.onCancel = reason => { + rangeReader.cancel(reason); + sink.ready.catch(readyReason => { + if (this.destroyed) { + return; + } + throw readyReason; + }); + }; + }); + messageHandler.on("GetDoc", ({ + pdfInfo + }) => { + this.pagesMapper.pagesNumber = pdfInfo.numPages; + this._numPages = pdfInfo.numPages; + this._htmlForXfa = pdfInfo.htmlForXfa; + delete pdfInfo.htmlForXfa; + loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this)); + }); + messageHandler.on("DocException", ex => { + loadingTask._capability.reject(wrapReason(ex)); + }); + messageHandler.on("PasswordRequest", ex => { + this.#passwordCapability = Promise.withResolvers(); + try { + if (!loadingTask.onPassword) { + throw wrapReason(ex); + } + const updatePassword = password => { + if (password instanceof Error) { + this.#passwordCapability.reject(password); + } else { + this.#passwordCapability.resolve({ + password + }); + } + }; + loadingTask.onPassword(updatePassword, ex.code); + } catch (err) { + this.#passwordCapability.reject(err); + } + return this.#passwordCapability.promise; + }); + messageHandler.on("DataLoaded", data => { + this.#onProgress({ + loaded: data.length, + total: data.length }); - event.preventDefault(); - } + this.downloadInfoCapability.resolve(data); + }); + messageHandler.on("StartRenderPage", data => { + if (this.destroyed) { + return; + } + const page = this.#pageCache.get(data.pageIndex); + page._startRenderPage(data.transparency, data.cacheKey); + }); + messageHandler.on("commonobj", ([id, type, exportedData]) => { + if (this.destroyed) { + return null; + } + if (this.commonObjs.has(id)) { + return null; + } + switch (type) { + case "Font": + if ("error" in exportedData) { + const exportedError = exportedData.error; + warn(`Error during font loading: ${exportedError}`); + this.commonObjs.resolve(id, exportedError); + break; + } + const fontData = new FontInfo(exportedData); + const inspectFont = this._params.pdfBug && globalThis.FontInspector?.enabled ? (font, url) => globalThis.FontInspector.fontAdded(font, url) : null; + const font = new FontFaceObject(fontData, inspectFont, exportedData.charProcOperatorList, exportedData.extra); + this.fontLoader.bind(font).catch(() => messageHandler.sendWithPromise("FontFallback", { + id + })).finally(() => { + if (!font.fontExtraProperties) { + font.clearData(); + } + this.commonObjs.resolve(id, font); + }); + break; + case "CopyLocalImage": + const { + imageRef + } = exportedData; + assert(imageRef, "The imageRef must be defined."); + for (const pageProxy of this.#pageCache.values()) { + for (const [, data] of pageProxy.objs) { + if (data?.ref !== imageRef) { + continue; + } + if (!data.dataLen) { + return null; + } + const copy = structuredClone(data); + this.commonObjs.resolve(id, copy); + return data.dataLen; + } + } + break; + case "FontPath": + this.commonObjs.resolve(id, new FontPathInfo(exportedData)); + break; + case "Image": + this.commonObjs.resolve(id, exportedData); + break; + case "Pattern": + const pattern = new PatternInfo(exportedData); + this.commonObjs.resolve(id, pattern.getIR()); + break; + default: + throw new Error(`Got unknown common object type ${type}`); + } + return null; + }); + messageHandler.on("obj", ([id, pageIndex, type, imageData]) => { + if (this.destroyed) { + return; + } + const pageProxy = this.#pageCache.get(pageIndex); + if (pageProxy.objs.has(id)) { + return; + } + if (pageProxy._intentStates.size === 0) { + imageData?.bitmap?.close(); + return; + } + switch (type) { + case "Image": + case "Pattern": + pageProxy.objs.resolve(id, imageData); + break; + default: + throw new Error(`Got unknown object type ${type}`); + } + }); + messageHandler.on("DocProgress", data => { + if (this.destroyed) { + return; + } + this.#onProgress(data); + }); + messageHandler.on("FetchBinaryData", async data => { + if (this.destroyed) { + throw new Error("Worker was destroyed."); + } + if (!this.binaryDataFactory) { + throw new Error("`BinaryDataFactory` not initialized, see the `useWorkerFetch` parameter."); + } + return this.binaryDataFactory.fetch(data); + }); } - enableClick() { - if (this.#boundPointerdown) { - return; - } - this.#boundPointerdown = this.pointerdown.bind(this); - this.#boundPointerup = this.pointerup.bind(this); - this.div.addEventListener("pointerdown", this.#boundPointerdown); - this.div.addEventListener("pointerup", this.#boundPointerup); + getData() { + return this.messageHandler.sendWithPromise("GetData", null); } - disableClick() { - if (!this.#boundPointerdown) { - return; + saveDocument() { + if (this.annotationStorage.size <= 0) { + warn("saveDocument called while `annotationStorage` is empty, " + "please use the getData-method instead."); } - this.div.removeEventListener("pointerdown", this.#boundPointerdown); - this.div.removeEventListener("pointerup", this.#boundPointerup); - this.#boundPointerdown = null; - this.#boundPointerup = null; - } - attach(editor) { - this.#editors.set(editor.id, editor); const { - annotationElementId - } = editor; - if (annotationElementId && this.#uiManager.isDeletedAnnotationElement(annotationElementId)) { - this.#uiManager.removeDeletedAnnotationElement(editor); - } + map, + transfer + } = this.annotationStorage.serializable; + return this.messageHandler.sendWithPromise("SaveDocument", { + isPureXfa: !!this._htmlForXfa, + numPages: this._numPages, + annotationStorage: map, + filename: this.#fullReader?.filename ?? null + }, transfer).finally(() => { + this.annotationStorage.resetModified(); + }); } - detach(editor) { - this.#editors.delete(editor.id); - this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); - if (!this.#isDisabling && editor.annotationElementId) { - this.#uiManager.addDeletedAnnotationElement(editor); + extractPages(pageInfos) { + const params = { + pageInfos + }; + let transfer; + const ImageBitmapCtor = globalThis.ImageBitmap; + if (typeof ImageBitmapCtor === "function") { + const infos = Array.isArray(pageInfos) ? pageInfos : [pageInfos]; + for (const pageInfo of infos) { + if (pageInfo?.image instanceof ImageBitmapCtor) { + (transfer ||= []).push(pageInfo.image); + } + } } - } - remove(editor) { - this.detach(editor); - this.#uiManager.removeEditor(editor); - editor.div.remove(); - editor.isAttachedToDOM = false; - if (!this.#isCleaningUp) { - this.addInkEditorIfNeeded(false); + if (this.annotationStorage.size > 0) { + const serialized = this.annotationStorage.serializable; + let { + map + } = serialized; + if (serialized.transfer?.length) { + if (transfer) { + transfer.push(...serialized.transfer); + } else { + transfer = serialized.transfer; + } + } + const mapping = this.pagesMapper.getMapping(); + if (mapping) { + const remapped = new Map(); + for (const [k, v] of map) { + if (v?.pageIndex !== undefined && v.pageIndex >= 0 && v.pageIndex < mapping.length) { + const sourceIdx = mapping[v.pageIndex] - 1; + if (sourceIdx !== v.pageIndex) { + remapped.set(k, { + ...v, + pageIndex: sourceIdx + }); + continue; + } + } + remapped.set(k, v); + } + map = remapped; + } + params.annotationStorage = map; } + return this.messageHandler.sendWithPromise("ExtractPages", params, transfer).finally(() => { + this.annotationStorage.resetModified(); + }); } - changeParent(editor) { - if (editor.parent === this) { - return; - } - if (editor.annotationElementId) { - this.#uiManager.addDeletedAnnotationElement(editor.annotationElementId); - editor_editor.AnnotationEditor.deleteAnnotationElement(editor); - editor.annotationElementId = null; + getPage(pageNumber) { + if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this.pagesMapper.pagesNumber) { + return Promise.reject(new Error("Invalid page request.")); } - this.attach(editor); - editor.parent?.detach(editor); - editor.setParent(this); - if (editor.div && editor.isAttachedToDOM) { - editor.div.remove(); - this.div.append(editor.div); + const pageIndex = pageNumber - 1; + const newPageIndex = this.pagesMapper.getPageId(pageNumber) - 1; + const cachedPromise = this.#pagePromises.get(pageIndex); + if (cachedPromise) { + return cachedPromise; } + const promise = this.messageHandler.sendWithPromise("GetPage", { + pageIndex: newPageIndex + }).then(pageInfo => { + if (this.destroyed) { + throw new Error("Transport destroyed"); + } + if (pageInfo.refStr) { + this.#pageRefCache.set(pageInfo.refStr, newPageIndex); + } + const page = new PDFPageProxy(pageIndex, pageInfo, this, this.pagesMapper, this._params.pdfBug); + this.#pageCache.set(pageIndex, page); + return page; + }); + this.#pagePromises.set(pageIndex, promise); + return promise; } - add(editor) { - if (editor.parent === this && editor.isAttachedToDOM) { - return; + async getPageIndex(ref) { + if (!isRefProxy(ref)) { + throw new Error("Invalid pageIndex request."); } - this.changeParent(editor); - this.#uiManager.addEditor(editor); - this.attach(editor); - if (!editor.isAttachedToDOM) { - const div = editor.render(); - this.div.append(div); - editor.isAttachedToDOM = true; + const index = await this.messageHandler.sendWithPromise("GetPageIndex", { + num: ref.num, + gen: ref.gen + }); + const pageNumber = this.pagesMapper.getPageNumber(index + 1); + if (pageNumber === 0) { + throw new Error("GetPageIndex: page has been removed."); } - editor.fixAndSetPosition(); - editor.onceAdded(); - this.#uiManager.addToAnnotationStorage(editor); - editor._reportTelemetry(editor.telemetryInitialData); + return pageNumber - 1; } - moveEditorInDOM(editor) { - if (!editor.isAttachedToDOM) { - return; - } - const { - activeElement - } = document; - if (editor.div.contains(activeElement) && !this.#editorFocusTimeoutId) { - editor._focusEventsAllowed = false; - this.#editorFocusTimeoutId = setTimeout(() => { - this.#editorFocusTimeoutId = null; - if (!editor.div.contains(document.activeElement)) { - editor.div.addEventListener("focusin", () => { - editor._focusEventsAllowed = true; - }, { - once: true - }); - activeElement.focus(); - } else { - editor._focusEventsAllowed = true; - } - }, 0); - } - editor._structTreeParentId = this.#accessibilityManager?.moveElementInDOM(this.div, editor.div, editor.contentDiv, true); + getAnnotations(pageIndex, intent) { + return this.messageHandler.sendWithPromise("GetAnnotations", { + pageIndex: this.pagesMapper.getPageId(pageIndex + 1) - 1, + intent + }); } - addOrRebuild(editor) { - if (editor.needsToBeRebuilt()) { - editor.parent ||= this; - editor.rebuild(); - editor.show(); - } else { - this.add(editor); - } + getFieldObjects() { + return this.#cacheSimpleMethod("GetFieldObjects"); } - addUndoableEditor(editor) { - const cmd = () => editor._uiManager.rebuild(editor); - const undo = () => { - editor.remove(); - }; - this.addCommands({ - cmd, - undo, - mustExec: false + hasJSActions() { + return this.#cacheSimpleMethod("HasJSActions"); + } + getCalculationOrderIds() { + return this.messageHandler.sendWithPromise("GetCalculationOrderIds", null); + } + getDestinations() { + return this.messageHandler.sendWithPromise("GetDestinations", null); + } + getDestination(id) { + if (typeof id !== "string") { + return Promise.reject(new Error("Invalid destination request.")); + } + return this.messageHandler.sendWithPromise("GetDestination", { + id }); } - getNextId() { - return this.#uiManager.getId(); + getPageLabels() { + return this.messageHandler.sendWithPromise("GetPageLabels", null); } - get #currentEditorType() { - return AnnotationEditorLayer.#editorTypes.get(this.#uiManager.getMode()); + getPageLayout() { + return this.messageHandler.sendWithPromise("GetPageLayout", null); } - #createNewEditor(params) { - const editorType = this.#currentEditorType; - return editorType ? new editorType.prototype.constructor(params) : null; + getPageMode() { + return this.messageHandler.sendWithPromise("GetPageMode", null); } - canCreateNewEmptyEditor() { - return this.#currentEditorType?.canCreateNewEmptyEditor(); + getViewerPreferences() { + return this.messageHandler.sendWithPromise("GetViewerPreferences", null); } - pasteEditor(mode, params) { - this.#uiManager.updateToolbar(mode); - this.#uiManager.updateMode(mode); - const { - offsetX, - offsetY - } = this.#getCenterPoint(); - const id = this.getNextId(); - const editor = this.#createNewEditor({ - parent: this, - id, - x: offsetX, - y: offsetY, - uiManager: this.#uiManager, - isCentered: true, - ...params + getOpenAction() { + return this.messageHandler.sendWithPromise("GetOpenAction", null); + } + getAttachments() { + return this.messageHandler.sendWithPromise("GetAttachments", null); + } + getAttachmentContent(id) { + return this.messageHandler.sendWithPromise("GetAttachmentContent", id); + } + getAnnotationsByType(types, pageIndexesToSkip) { + return this.messageHandler.sendWithPromise("GetAnnotationsByType", { + types, + pageIndexesToSkip }); - if (editor) { - this.add(editor); - } } - deserialize(data) { - return AnnotationEditorLayer.#editorTypes.get(data.annotationType ?? data.annotationEditorType)?.deserialize(data, this, this.#uiManager) || null; + getDocJSActions() { + return this.#cacheSimpleMethod("GetDocJSActions"); } - createAndAddNewEditor(event, isCentered, data = {}) { - const id = this.getNextId(); - const editor = this.#createNewEditor({ - parent: this, - id, - x: event.offsetX, - y: event.offsetY, - uiManager: this.#uiManager, - isCentered, - ...data + getPageJSActions(pageIndex) { + return this.messageHandler.sendWithPromise("GetPageJSActions", { + pageIndex: this.pagesMapper.getPageId(pageIndex + 1) - 1 }); - if (editor) { - this.add(editor); - } - return editor; } - #getCenterPoint() { - const { - x, - y, - width, - height - } = this.div.getBoundingClientRect(); - const tlX = Math.max(0, x); - const tlY = Math.max(0, y); - const brX = Math.min(window.innerWidth, x + width); - const brY = Math.min(window.innerHeight, y + height); - const centerX = (tlX + brX) / 2 - x; - const centerY = (tlY + brY) / 2 - y; - const [offsetX, offsetY] = this.viewport.rotation % 180 === 0 ? [centerX, centerY] : [centerY, centerX]; - return { - offsetX, - offsetY - }; + getStructTree(pageIndex) { + return this.messageHandler.sendWithPromise("GetStructTree", { + pageIndex: this.pagesMapper.getPageId(pageIndex + 1) - 1 + }); } - addNewEditor() { - this.createAndAddNewEditor(this.#getCenterPoint(), true); + getOutline() { + return this.messageHandler.sendWithPromise("GetOutline", null); } - setSelected(editor) { - this.#uiManager.setSelected(editor); + getOptionalContentConfig(renderingIntent) { + return this.#cacheSimpleMethod("GetOptionalContentConfig").then(data => new OptionalContentConfig(data, renderingIntent)); } - toggleSelected(editor) { - this.#uiManager.toggleSelected(editor); + getPermissions() { + return this.messageHandler.sendWithPromise("GetPermissions", null); } - isSelected(editor) { - return this.#uiManager.isSelected(editor); + getMetadata() { + const name = "GetMetadata"; + return this.#methodPromises.getOrInsertComputed(name, () => this.messageHandler.sendWithPromise(name, null).then(results => ({ + info: results[0], + metadata: results[1] ? new Metadata(results[1]) : null, + contentDispositionFilename: this.#fullReader?.filename ?? null, + contentLength: this.#fullReader?.contentLength ?? null, + hasStructTree: results[2] + }))); } - unselect(editor) { - this.#uiManager.unselect(editor); + getMarkInfo() { + return this.messageHandler.sendWithPromise("GetMarkInfo", null); } - pointerup(event) { - const { - isMac - } = util.FeatureTest.platform; - if (event.button !== 0 || event.ctrlKey && isMac) { + getRawData(data) { + return this.messageHandler.sendWithPromise("GetRawData", data); + } + async startCleanup(keepLoadedFonts = false) { + if (this.destroyed) { return; } - if (event.target !== this.div) { - return; + await this.messageHandler.sendWithPromise("Cleanup", null); + for (const page of this.#pageCache.values()) { + const cleanupSuccessful = page.cleanup(); + if (!cleanupSuccessful) { + throw new Error(`startCleanup: Page ${page.pageNumber} is currently rendering.`); + } } - if (!this.#hadPointerDown) { - return; + this.commonObjs.clear(); + if (!keepLoadedFonts) { + this.fontLoader.clear(); } - this.#hadPointerDown = false; - if (!this.#allowClick) { - this.#allowClick = true; - return; + this.#methodPromises.clear(); + this.filterFactory.destroy(true); + TextLayer.cleanup(); + } + cachedPageNumber(ref) { + if (!isRefProxy(ref)) { + return null; } - if (this.#uiManager.getMode() === util.AnnotationEditorType.STAMP) { - this.#uiManager.unselectAll(); - return; + const refStr = ref.gen === 0 ? `${ref.num}R` : `${ref.num}R${ref.gen}`; + const pageIndex = this.#pageRefCache.get(refStr); + if (pageIndex >= 0) { + const pageNumber = this.pagesMapper.getPageNumber(pageIndex + 1); + if (pageNumber !== 0) { + return pageNumber; + } } - this.createAndAddNewEditor(event, false); + return null; } - pointerdown(event) { - if (this.#uiManager.getMode() === util.AnnotationEditorType.HIGHLIGHT) { - this.enableTextSelection(); - } - if (this.#hadPointerDown) { - this.#hadPointerDown = false; - return; +} +class RenderTask { + _internalRenderTask = null; + onContinue = null; + onError = null; + constructor(internalRenderTask) { + this._internalRenderTask = internalRenderTask; + } + get promise() { + return this._internalRenderTask.capability.promise; + } + cancel(extraDelay = 0) { + this._internalRenderTask.cancel(null, extraDelay); + } + get separateAnnots() { + const { + separateAnnots + } = this._internalRenderTask.operatorList; + if (!separateAnnots) { + return false; } const { - isMac - } = util.FeatureTest.platform; - if (event.button !== 0 || event.ctrlKey && isMac) { + annotationCanvasMap + } = this._internalRenderTask; + return separateAnnots.form || separateAnnots.canvas && annotationCanvasMap?.size > 0; + } + get imageCoordinates() { + return this._internalRenderTask.imageCoordinates || null; + } +} +class InternalRenderTask { + #rAF = null; + static #canvasInUse = new WeakSet(); + constructor({ + callback, + params, + objs, + commonObjs, + annotationCanvasMap, + operatorList, + pageIndex, + canvasFactory, + filterFactory, + useRequestAnimationFrame = false, + pdfBug = false, + pageColors = null, + enableHWA = false, + operationsFilter = null + }) { + this.callback = callback; + this.params = params; + this.objs = objs; + this.commonObjs = commonObjs; + this.annotationCanvasMap = annotationCanvasMap; + this.operatorListIdx = null; + this.operatorList = operatorList; + this._pageIndex = pageIndex; + this.canvasFactory = canvasFactory; + this.filterFactory = filterFactory; + this._pdfBug = pdfBug; + this.pageColors = pageColors; + this.running = false; + this.graphicsReadyCallback = null; + this.graphicsReady = false; + this._useRequestAnimationFrame = useRequestAnimationFrame === true && typeof window !== "undefined"; + this.cancelled = false; + this.capability = Promise.withResolvers(); + this.task = new RenderTask(this); + this._cancelBound = this.cancel.bind(this); + this._continueBound = this._continue.bind(this); + this._scheduleNextBound = this._scheduleNext.bind(this); + this._nextBound = this._next.bind(this); + this._canvas = params.canvas; + this._canvasContext = params.canvas ? null : params.canvasContext; + this._enableHWA = enableHWA; + this._dependencyTracker = params.dependencyTracker; + this._imagesTracker = params.imagesTracker; + this._operationsFilter = operationsFilter; + } + get completed() { + return this.capability.promise.catch(function () {}); + } + initializeGraphics({ + transparency = false, + optionalContentConfig + }) { + if (this.cancelled) { return; } - if (event.target !== this.div) { - return; + if (this._canvas) { + if (InternalRenderTask.#canvasInUse.has(this._canvas)) { + throw new Error("Cannot use the same canvas during multiple render() operations. " + "Use different canvas or ensure previous operations were " + "cancelled or completed."); + } + InternalRenderTask.#canvasInUse.add(this._canvas); } - this.#hadPointerDown = true; - const editor = this.#uiManager.getActive(); - this.#allowClick = !editor || editor.isEmpty(); - } - findNewParent(editor, x, y) { - const layer = this.#uiManager.findParent(x, y); - if (layer === null || layer === this) { - return false; + if (this._pdfBug && globalThis.StepperManager?.enabled) { + this.stepper = globalThis.StepperManager.create(this._pageIndex); + this.stepper.init(this.operatorList); + this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint(); } - layer.changeParent(editor); - return true; + const { + viewport, + transform, + background, + dependencyTracker, + imagesTracker + } = this.params; + const canvasContext = this._canvasContext || this._canvas.getContext("2d", { + alpha: false, + willReadFrequently: !this._enableHWA + }); + this.gfx = new CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, { + optionalContentConfig + }, this.annotationCanvasMap, this.pageColors, dependencyTracker, imagesTracker); + this.gfx.beginDrawing({ + transform, + viewport, + transparency, + background + }); + this.operatorListIdx = 0; + this.graphicsReady = true; + this.graphicsReadyCallback?.(); } - destroy() { - if (this.#uiManager.getActive()?.parent === this) { - this.#uiManager.commitOrRemove(); - this.#uiManager.setActiveEditor(null); + cancel(error = null, extraDelay = 0) { + this.running = false; + this.cancelled = true; + this.gfx?.endDrawing(); + if (this.#rAF) { + window.cancelAnimationFrame(this.#rAF); + this.#rAF = null; } - if (this.#editorFocusTimeoutId) { - clearTimeout(this.#editorFocusTimeoutId); - this.#editorFocusTimeoutId = null; + InternalRenderTask.#canvasInUse.delete(this._canvas); + error ||= new RenderingCancelledException(`Rendering cancelled, page ${this._pageIndex + 1}`, extraDelay); + this.callback(error); + this.task.onError?.(error); + } + operatorListChanged() { + if (!this.graphicsReady) { + this.graphicsReadyCallback ||= this._continueBound; + return; } - for (const editor of this.#editors.values()) { - this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); - editor.setParent(null); - editor.isAttachedToDOM = false; - editor.div.remove(); + this.gfx.dependencyTracker?.growOperationsCount(this.operatorList.fnArray.length); + this.stepper?.updateOperatorList(this.operatorList); + if (this.running) { + return; } - this.div = null; - this.#editors.clear(); - this.#uiManager.removeLayer(this); + this._continue(); } - #cleanup() { - this.#isCleaningUp = true; - for (const editor of this.#editors.values()) { - if (editor.isEmpty()) { - editor.remove(); - } + _continue() { + this.running = true; + if (this.cancelled) { + return; + } + if (this.task.onContinue) { + this.task.onContinue(this._scheduleNextBound); + } else { + this._scheduleNext(); } - this.#isCleaningUp = false; } - render({ - viewport - }) { - this.viewport = viewport; - (0,display_utils.setLayerDimensions)(this.div, viewport); - for (const editor of this.#uiManager.getEditors(this.pageIndex)) { - this.add(editor); - editor.rebuild(); + _scheduleNext() { + if (this._useRequestAnimationFrame) { + this.#rAF = window.requestAnimationFrame(() => { + this.#rAF = null; + this._nextBound().catch(this._cancelBound); + }); + } else { + Promise.resolve().then(this._nextBound).catch(this._cancelBound); } - this.updateMode(); } - update({ - viewport - }) { - this.#uiManager.commitOrRemove(); - this.#cleanup(); - const oldRotation = this.viewport.rotation; - const rotation = viewport.rotation; - this.viewport = viewport; - (0,display_utils.setLayerDimensions)(this.div, { - rotation - }); - if (oldRotation !== rotation) { - for (const editor of this.#editors.values()) { - editor.rotate(rotation); + async _next() { + if (this.cancelled) { + return; + } + this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper, this._operationsFilter); + if (this.operatorListIdx === this.operatorList.argsArray.length) { + this.running = false; + if (this.operatorList.lastChunk) { + this.gfx.endDrawing(); + InternalRenderTask.#canvasInUse.delete(this._canvas); + this.callback(); } } - this.addInkEditorIfNeeded(false); - } - get pageDimensions() { - const { - pageWidth, - pageHeight - } = this.viewport.rawDims; - return [pageWidth, pageHeight]; - } - get scale() { - return this.#uiManager.viewParameters.realScale; } } +const version = "6.1.200"; +const build = "6353acefe"; - -/***/ }), - -/***/ 259: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ ColorPicker: () => (/* binding */ ColorPicker) -/* harmony export */ }); -/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(292); -/* harmony import */ var _tools_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(830); -/* harmony import */ var _display_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(419); +;// ./src/display/editor/color_picker.js class ColorPicker { - #boundKeyDown = this.#keyDown.bind(this); - #boundPointerDown = this.#pointerDown.bind(this); #button = null; #buttonSwatch = null; #defaultColor; @@ -11452,10 +16942,11 @@ #isMainColorPicker = false; #editor = null; #eventBus; + #openDropdownAC = null; #uiManager = null; - #type; + static #l10nColor = null; static get _keyboardManager() { - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "_keyboardManager", new _tools_js__WEBPACK_IMPORTED_MODULE_1__.KeyboardManager([[["Escape", "mac+Escape"], ColorPicker.prototype._hideDropdownFromKeyboard], [[" ", "mac+ "], ColorPicker.prototype._colorSelectFromKeyboard], [["ArrowDown", "ArrowRight", "mac+ArrowDown", "mac+ArrowRight"], ColorPicker.prototype._moveToNext], [["ArrowUp", "ArrowLeft", "mac+ArrowUp", "mac+ArrowLeft"], ColorPicker.prototype._moveToPrevious], [["Home", "mac+Home"], ColorPicker.prototype._moveToBeginning], [["End", "mac+End"], ColorPicker.prototype._moveToEnd]])); + return shadow(this, "_keyboardManager", new KeyboardManager([[["Escape"], ColorPicker.prototype._hideDropdownFromKeyboard], [["Space"], ColorPicker.prototype._colorSelectFromKeyboard], [["ArrowDown", "ArrowRight"], ColorPicker.prototype._moveToNext], [["ArrowUp", "ArrowLeft"], ColorPicker.prototype._moveToPrevious], [["Home"], ColorPicker.prototype._moveToBeginning], [["End"], ColorPicker.prototype._moveToEnd]])); } constructor({ editor = null, @@ -11463,70 +16954,94 @@ }) { if (editor) { this.#isMainColorPicker = false; - this.#type = _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType.HIGHLIGHT_COLOR; this.#editor = editor; } else { this.#isMainColorPicker = true; - this.#type = _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR; } this.#uiManager = editor?._uiManager || uiManager; this.#eventBus = this.#uiManager._eventBus; - this.#defaultColor = editor?.color || this.#uiManager?.highlightColors.values().next().value || "#FFFF98"; + this.#defaultColor = editor?.color?.toUpperCase() || this.#uiManager?.highlightColors.values().next().value || "#FFFF98"; + ColorPicker.#l10nColor ||= Object.freeze({ + blue: "pdfjs-editor-colorpicker-blue", + green: "pdfjs-editor-colorpicker-green", + pink: "pdfjs-editor-colorpicker-pink", + red: "pdfjs-editor-colorpicker-red", + yellow: "pdfjs-editor-colorpicker-yellow" + }); } renderButton() { const button = this.#button = document.createElement("button"); button.className = "colorPicker"; button.tabIndex = "0"; button.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-button"); - button.setAttribute("aria-haspopup", true); - button.addEventListener("click", this.#openDropdown.bind(this)); - button.addEventListener("keydown", this.#boundKeyDown); + button.ariaHasPopup = "true"; + if (this.#editor) { + button.ariaControls = `${this.#editor.id}_colorpicker_dropdown`; + } + const signal = this.#uiManager._signal; + button.addEventListener("click", this.#openDropdown.bind(this), { + signal + }); + button.addEventListener("keydown", this.#keyDown.bind(this), { + signal + }); const swatch = this.#buttonSwatch = document.createElement("span"); swatch.className = "swatch"; - swatch.setAttribute("aria-hidden", true); + swatch.ariaHidden = "true"; swatch.style.backgroundColor = this.#defaultColor; button.append(swatch); return button; } renderMainDropdown() { const dropdown = this.#dropdown = this.#getDropdownRoot(); - dropdown.setAttribute("aria-orientation", "horizontal"); - dropdown.setAttribute("aria-labelledby", "highlightColorPickerLabel"); + dropdown.ariaOrientation = "horizontal"; + dropdown.ariaLabelledBy = "highlightColorPickerLabel"; return dropdown; } #getDropdownRoot() { const div = document.createElement("div"); - div.addEventListener("contextmenu", _display_utils_js__WEBPACK_IMPORTED_MODULE_2__.noContextMenu); + const signal = this.#uiManager._signal; + div.addEventListener("contextmenu", noContextMenu, { + signal + }); div.className = "dropdown"; div.role = "listbox"; - div.setAttribute("aria-multiselectable", false); - div.setAttribute("aria-orientation", "vertical"); + div.ariaMultiSelectable = "false"; + div.ariaOrientation = "vertical"; div.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-dropdown"); + if (this.#editor) { + div.id = `${this.#editor.id}_colorpicker_dropdown`; + } for (const [name, color] of this.#uiManager.highlightColors) { const button = document.createElement("button"); button.tabIndex = "0"; button.role = "option"; button.setAttribute("data-color", color); button.title = name; - button.setAttribute("data-l10n-id", `pdfjs-editor-colorpicker-${name}`); + button.setAttribute("data-l10n-id", ColorPicker.#l10nColor[name]); const swatch = document.createElement("span"); button.append(swatch); swatch.className = "swatch"; swatch.style.backgroundColor = color; - button.setAttribute("aria-selected", color === this.#defaultColor); - button.addEventListener("click", this.#colorSelect.bind(this, color)); + button.ariaSelected = color === this.#defaultColor; + button.addEventListener("click", this.#colorSelect.bind(this, color), { + signal + }); div.append(button); } - div.addEventListener("keydown", this.#boundKeyDown); + div.addEventListener("keydown", this.#keyDown.bind(this), { + signal + }); return div; } #colorSelect(color, event) { event.stopPropagation(); this.#eventBus.dispatch("switchannotationeditorparams", { source: this, - type: this.#type, + type: AnnotationEditorParamsType.HIGHLIGHT_COLOR, value: color }); + this.updateColor(color); } _colorSelectFromKeyboard(event) { if (event.target === this.#button) { @@ -11545,13 +17060,13 @@ return; } if (event.target === this.#button) { - this.#dropdown.firstChild?.focus(); + this.#dropdown.firstElementChild?.focus(); return; } event.target.nextSibling?.focus(); } _moveToPrevious(event) { - if (event.target === this.#dropdown?.firstChild || event.target === this.#button) { + if (event.target === this.#dropdown?.firstElementChild || event.target === this.#button) { if (this.#isDropdownVisible) { this._hideDropdownFromKeyboard(); } @@ -11567,14 +17082,14 @@ this.#openDropdown(event); return; } - this.#dropdown.firstChild?.focus(); + this.#dropdown.firstElementChild?.focus(); } _moveToEnd(event) { if (!this.#isDropdownVisible) { this.#openDropdown(event); return; } - this.#dropdown.lastChild?.focus(); + this.#dropdown.lastElementChild?.focus(); } #keyDown(event) { ColorPicker._keyboardManager.exec(this, event); @@ -11585,7 +17100,13 @@ return; } this.#dropdownWasFromKeyboard = event.detail === 0; - window.addEventListener("pointerdown", this.#boundPointerDown); + if (!this.#openDropdownAC) { + this.#openDropdownAC = new AbortController(); + window.addEventListener("pointerdown", this.#pointerDown.bind(this), { + signal: this.#uiManager.combinedSignal(this.#openDropdownAC) + }); + } + this.#button.ariaExpanded = "true"; if (this.#dropdown) { this.#dropdown.classList.remove("hidden"); return; @@ -11601,7 +17122,9 @@ } hideDropdown() { this.#dropdown?.classList.add("hidden"); - window.removeEventListener("pointerdown", this.#boundPointerDown); + this.#button.ariaExpanded = "false"; + this.#openDropdownAC?.abort(); + this.#openDropdownAC = null; } get #isDropdownVisible() { return this.#dropdown && !this.#dropdown.classList.contains("hidden"); @@ -11629,7 +17152,7 @@ } const i = this.#uiManager.highlightColors.values(); for (const child of this.#dropdown.children) { - child.setAttribute("aria-selected", i.next().value === color); + child.ariaSelected = i.next().value === color.toUpperCase(); } } destroy() { @@ -11640,1532 +17163,4483 @@ this.#dropdown = null; } } +class BasicColorPicker { + #input = null; + #hasAlpha = false; + #editor = null; + #uiManager = null; + static #l10nColor = null; + constructor(editor) { + this.#editor = editor; + this.#uiManager = editor._uiManager; + BasicColorPicker.#l10nColor ||= Object.freeze({ + freetext: "pdfjs-editor-color-picker-free-text-input", + ink: "pdfjs-editor-color-picker-ink-input" + }); + } + renderButton() { + if (this.#input) { + return this.#input; + } + const { + editorType, + colorType, + colorAndOpacityType, + opacityType, + color, + opacity + } = this.#editor; + const hasAlpha = this.#hasAlpha = FeatureTest.isAlphaColorInputSupported && opacityType !== undefined; + const input = this.#input = document.createElement("input"); + input.type = "color"; + if (hasAlpha) { + input.setAttribute("alpha", ""); + const alphaHex = Util.hexNums[Math.round((opacity ?? 1) * 255)]; + input.value = (color || "#000000") + alphaHex; + } else { + input.value = color || "#000000"; + } + input.className = "basicColorPicker"; + input.tabIndex = 0; + input.setAttribute("data-l10n-id", BasicColorPicker.#l10nColor[editorType]); + input.addEventListener("input", () => { + if (hasAlpha) { + const rgba = getRGBA(input.value); + if (!rgba) { + return; + } + const [r, g, b, op] = rgba; + const hex = Util.makeHexColor(r, g, b); + if (colorAndOpacityType !== undefined) { + this.#uiManager.updateParams(colorAndOpacityType, { + color: hex, + opacity: op + }); + } else { + this.#uiManager.updateParams(colorType, hex); + this.#uiManager.updateParams(opacityType, op); + } + } else { + this.#uiManager.updateParams(colorType, input.value); + } + }, { + signal: this.#uiManager._signal + }); + return input; + } + update(value) { + if (!this.#input) { + return; + } + if (this.#hasAlpha) { + const alphaHex = Util.hexNums[Math.round(this.#editor.opacity * 255)]; + this.#input.value = value + alphaHex; + } else { + this.#input.value = value; + } + } + updateOpacity(value) { + if (!this.#input || !this.#hasAlpha) { + return; + } + const alphaHex = Util.hexNums[Math.round(value * 255)]; + this.#input.value = this.#editor.color + alphaHex; + } + destroy() { + this.#input?.remove(); + this.#input = null; + } + hideDropdown() {} +} + +;// ./src/shared/scripting_utils.js + +function makeColorComp(n) { + return Math.floor(MathClamp(n, 0, 1) * 255).toString(16).padStart(2, "0"); +} +function scaleAndClamp(x) { + return MathClamp(x, 0, 1) * 255; +} +class ColorConverters { + static CMYK_G([c, y, m, k]) { + return ["G", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)]; + } + static G_CMYK([g]) { + return ["CMYK", 0, 0, 0, 1 - g]; + } + static G_RGB([g]) { + return ["RGB", g, g, g]; + } + static G_rgb([g]) { + g = scaleAndClamp(g); + return [g, g, g]; + } + static G_HTML([g]) { + const G = makeColorComp(g); + return `#${G}${G}${G}`; + } + static RGB_G([r, g, b]) { + return ["G", 0.3 * r + 0.59 * g + 0.11 * b]; + } + static RGB_rgb(color) { + return color.map(scaleAndClamp); + } + static RGB_HTML(color) { + return `#${color.map(makeColorComp).join("")}`; + } + static T_HTML() { + return "#00000000"; + } + static T_rgb() { + return [null]; + } + static CMYK_RGB([c, y, m, k]) { + return ["RGB", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)]; + } + static CMYK_rgb([c, y, m, k]) { + return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))]; + } + static CMYK_HTML(components) { + const rgb = this.CMYK_RGB(components).slice(1); + return this.RGB_HTML(rgb); + } + static RGB_CMYK([r, g, b]) { + const c = 1 - r; + const m = 1 - g; + const y = 1 - b; + const k = Math.min(c, m, y); + return ["CMYK", c, m, y, k]; + } +} +const DateFormats = (/* unused pure expression or super */ null && (["m/d", "m/d/yy", "mm/dd/yy", "mm/yy", "d-mmm", "d-mmm-yy", "dd-mmm-yy", "yy-mm-dd", "mmm-yy", "mmmm-yy", "mmm d, yyyy", "mmmm d, yyyy", "m/d/yy h:MM tt", "m/d/yy HH:MM"])); +const TimeFormats = (/* unused pure expression or super */ null && (["HH:MM", "h:MM tt", "HH:MM:ss", "h:MM:ss tt"])); + +;// ./src/display/svg_factory.js +class BaseSVGFactory { + create(width, height, skipDimensions = false) { + if (width <= 0 || height <= 0) { + throw new Error("Invalid SVG dimensions"); + } + const svg = this._createSVG("svg:svg"); + svg.setAttribute("version", "1.1"); + if (!skipDimensions) { + svg.setAttribute("width", `${width}px`); + svg.setAttribute("height", `${height}px`); + } + svg.setAttribute("preserveAspectRatio", "none"); + svg.setAttribute("viewBox", `0 0 ${width} ${height}`); + return svg; + } + createElement(type) { + if (typeof type !== "string") { + throw new Error("Invalid SVG element type"); + } + return this._createSVG(type); + } + _createSVG(type) { + unreachable("Abstract method `_createSVG` called."); + } +} +class DOMSVGFactory extends BaseSVGFactory { + _createSVG(type) { + return document.createElementNS(SVG_NS, type); + } +} -/***/ }), +;// ./src/display/annotation_layer.js -/***/ 310: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { -// EXPORTS -__webpack_require__.d(__webpack_exports__, { - AnnotationEditor: () => (/* binding */ AnnotationEditor) -}); -// EXTERNAL MODULE: ./src/display/editor/tools.js -var tools = __webpack_require__(830); -// EXTERNAL MODULE: ./src/shared/util.js -var util = __webpack_require__(292); -// EXTERNAL MODULE: ./src/display/display_utils.js -var display_utils = __webpack_require__(419); -;// CONCATENATED MODULE: ./src/display/editor/alt_text.js -class AltText { - #altText = ""; - #altTextDecorative = false; - #altTextButton = null; - #altTextTooltip = null; - #altTextTooltipTimeout = null; - #altTextWasFromKeyBoard = false; - #editor = null; - static _l10nPromise = null; - constructor(editor) { - this.#editor = editor; +const annotation_layer_DEFAULT_FONT_SIZE = 9; +const GetElementsByNameSet = new WeakSet(); +const TIMEZONE_OFFSET = new Date().getTimezoneOffset() * 60 * 1000; +class AnnotationElementFactory { + static create(parameters) { + const subtype = parameters.data.annotationType; + switch (subtype) { + case AnnotationType.LINK: + return new LinkAnnotationElement(parameters); + case AnnotationType.TEXT: + return new TextAnnotationElement(parameters); + case AnnotationType.WIDGET: + const fieldType = parameters.data.fieldType; + switch (fieldType) { + case "Tx": + return new TextWidgetAnnotationElement(parameters); + case "Btn": + if (parameters.data.radioButton) { + return new RadioButtonWidgetAnnotationElement(parameters); + } else if (parameters.data.checkBox) { + return new CheckboxWidgetAnnotationElement(parameters); + } + return new PushButtonWidgetAnnotationElement(parameters); + case "Ch": + return new ChoiceWidgetAnnotationElement(parameters); + case "Sig": + return new SignatureWidgetAnnotationElement(parameters); + } + return new WidgetAnnotationElement(parameters); + case AnnotationType.POPUP: + return new PopupAnnotationElement(parameters); + case AnnotationType.FREETEXT: + return new FreeTextAnnotationElement(parameters); + case AnnotationType.LINE: + return new LineAnnotationElement(parameters); + case AnnotationType.SQUARE: + return new SquareAnnotationElement(parameters); + case AnnotationType.CIRCLE: + return new CircleAnnotationElement(parameters); + case AnnotationType.POLYLINE: + return new PolylineAnnotationElement(parameters); + case AnnotationType.CARET: + return new CaretAnnotationElement(parameters); + case AnnotationType.INK: + return new InkAnnotationElement(parameters); + case AnnotationType.POLYGON: + return new PolygonAnnotationElement(parameters); + case AnnotationType.HIGHLIGHT: + return new HighlightAnnotationElement(parameters); + case AnnotationType.UNDERLINE: + return new UnderlineAnnotationElement(parameters); + case AnnotationType.SQUIGGLY: + return new SquigglyAnnotationElement(parameters); + case AnnotationType.STRIKEOUT: + return new StrikeOutAnnotationElement(parameters); + case AnnotationType.STAMP: + return new StampAnnotationElement(parameters); + case AnnotationType.FILEATTACHMENT: + return new FileAttachmentAnnotationElement(parameters); + case AnnotationType.RICHMEDIA: + case AnnotationType.SCREEN: + return new MediaAnnotationElement(parameters); + default: + return new AnnotationElement(parameters); + } + } +} +class AnnotationElement { + #updates = null; + #hasBorder = false; + #popupElement = null; + constructor(parameters, { + isRenderable = false, + ignoreBorder = false, + createQuadrilaterals = false + } = {}) { + this.isRenderable = isRenderable; + this.data = parameters.data; + this.layer = parameters.layer; + this.linkService = parameters.linkService; + this.downloadManager = parameters.downloadManager; + this.imageResourcesPath = parameters.imageResourcesPath; + this.renderForms = parameters.renderForms; + this.svgFactory = parameters.svgFactory; + this.annotationStorage = parameters.annotationStorage; + this.enableComment = parameters.enableComment; + this.enableScripting = parameters.enableScripting; + this.hasJSActions = parameters.hasJSActions; + this._fieldObjects = parameters.fieldObjects; + this.parent = parameters.parent; + this.hasOwnCommentButton = false; + if (isRenderable) { + this.contentElement = this.container = this._createContainer(ignoreBorder); + } + if (createQuadrilaterals) { + this._createQuadrilaterals(); + } } - static initialize(l10nPromise) { - AltText._l10nPromise ||= l10nPromise; + static _hasPopupData({ + contentsObj, + richText + }) { + return !!(contentsObj?.str || richText?.str); } - async render() { - const altText = this.#altTextButton = document.createElement("button"); - altText.className = "altText"; - const msg = await AltText._l10nPromise.get("pdfjs-editor-alt-text-button-label"); - altText.textContent = msg; - altText.setAttribute("aria-label", msg); - altText.tabIndex = "0"; - altText.addEventListener("contextmenu", display_utils.noContextMenu); - altText.addEventListener("pointerdown", event => event.stopPropagation()); - const onClick = event => { - event.preventDefault(); - this.#editor._uiManager.editAltText(this.#editor); + get _isEditable() { + return this.data.isEditable; + } + get hasPopupData() { + return AnnotationElement._hasPopupData(this.data) || this.enableComment && !!this.commentText; + } + get commentData() { + const { + data + } = this; + const editor = this.annotationStorage?.getEditor(data.id); + if (editor) { + return editor.getData(); + } + return data; + } + get hasCommentButton() { + return this.enableComment && this.hasPopupElement; + } + get commentButtonPosition() { + const editor = this.annotationStorage?.getEditor(this.data.id); + if (editor) { + return editor.commentButtonPositionInPage; + } + const { + quadPoints, + inkLists, + rect + } = this.data; + let maxX = -Infinity; + let maxY = -Infinity; + if (quadPoints?.length >= 8) { + for (let i = 0; i < quadPoints.length; i += 8) { + if (quadPoints[i + 1] > maxY) { + maxY = quadPoints[i + 1]; + maxX = quadPoints[i + 2]; + } else if (quadPoints[i + 1] === maxY) { + maxX = Math.max(maxX, quadPoints[i + 2]); + } + } + return [maxX, maxY]; + } + if (inkLists?.length >= 1) { + for (const inkList of inkLists) { + for (let i = 0, ii = inkList.length; i < ii; i += 2) { + if (inkList[i + 1] > maxY) { + maxY = inkList[i + 1]; + maxX = inkList[i]; + } else if (inkList[i + 1] === maxY) { + maxX = Math.max(maxX, inkList[i]); + } + } + } + if (maxX !== Infinity) { + return [maxX, maxY]; + } + } + if (rect) { + return [rect[2], rect[3]]; + } + return null; + } + _normalizePoint(point) { + const { + page: { + view + }, + viewport: { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } + } = this.parent; + point[1] = view[3] - point[1] + view[1]; + point[0] = 100 * (point[0] - pageX) / pageWidth; + point[1] = 100 * (point[1] - pageY) / pageHeight; + return point; + } + get commentText() { + const { + data + } = this; + return this.annotationStorage.getRawValue(`${AnnotationEditorPrefix}${data.id}`)?.popup?.contents || data.contentsObj?.str || ""; + } + set commentText(text) { + const { + data + } = this; + const popup = { + deleted: !text, + contents: text || "" + }; + if (!this.annotationStorage.updateEditor(data.id, { + popup + })) { + this.annotationStorage.setValue(`${AnnotationEditorPrefix}${data.id}`, { + id: data.id, + annotationType: data.annotationType, + page: this.parent.page, + popup, + popupRef: data.popupRef, + modificationDate: new Date() + }); + } + if (!text) { + this.removePopup(); + } + } + removePopup() { + (this.#popupElement?.popup || this.popup)?.remove(); + this.#popupElement = this.popup = null; + } + updateEdited(params) { + if (!this.container) { + return; + } + if (params.rect) { + this.#updates ||= { + rect: this.data.rect.slice(0) + }; + } + const { + rect, + popup: newPopup + } = params; + if (rect) { + this.#setRectEdited(rect); + } + let popup = this.#popupElement?.popup || this.popup; + if (!popup && newPopup?.text) { + this._createPopup(newPopup); + popup = this.#popupElement.popup; + } + if (!popup) { + return; + } + popup.updateEdited(params); + if (newPopup?.deleted) { + popup.remove(); + this.#popupElement = null; + this.popup = null; + } + } + resetEdited() { + if (!this.#updates) { + return; + } + this.#setRectEdited(this.#updates.rect); + this.#popupElement?.popup.resetEdited(); + this.#updates = null; + } + #setRectEdited(rect) { + const { + container: { + style + }, + data: { + rect: currentRect, + rotation + }, + parent: { + viewport: { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } + } + } = this; + currentRect?.splice(0, 4, ...rect); + style.left = `${100 * (rect[0] - pageX) / pageWidth}%`; + style.top = `${100 * (pageHeight - rect[3] + pageY) / pageHeight}%`; + if (rotation === 0) { + style.width = `${100 * (rect[2] - rect[0]) / pageWidth}%`; + style.height = `${100 * (rect[3] - rect[1]) / pageHeight}%`; + } else { + this.setRotation(rotation); + } + } + _createContainer(ignoreBorder) { + const { + data, + parent: { + page, + viewport + } + } = this; + const container = document.createElement("section"); + container.setAttribute("data-annotation-id", data.id); + if (!(this instanceof WidgetAnnotationElement) && !(this instanceof LinkAnnotationElement) && !(this instanceof MediaAnnotationElement)) { + container.tabIndex = 0; + } + const { + style + } = container; + style.zIndex = this.parent.zIndex; + this.parent.zIndex += 2; + if (data.alternativeText) { + container.title = data.alternativeText; + } + if (data.noRotate) { + container.classList.add("norotate"); + } + if (!data.rect || this instanceof PopupAnnotationElement) { + const { + rotation + } = data; + if (!data.hasOwnCanvas && rotation !== 0) { + this.setRotation(rotation, container); + } + return container; + } + const { + width, + height + } = this; + if (!ignoreBorder && data.borderStyle.width > 0) { + style.borderWidth = `${data.borderStyle.width}px`; + const horizontalRadius = data.borderStyle.horizontalCornerRadius; + const verticalRadius = data.borderStyle.verticalCornerRadius; + if (horizontalRadius > 0 || verticalRadius > 0) { + const radius = `calc(${horizontalRadius}px * var(--total-scale-factor)) / calc(${verticalRadius}px * var(--total-scale-factor))`; + style.borderRadius = radius; + } + switch (data.borderStyle.style) { + case AnnotationBorderStyleType.SOLID: + style.borderStyle = "solid"; + break; + case AnnotationBorderStyleType.DASHED: + style.borderStyle = "dashed"; + break; + case AnnotationBorderStyleType.BEVELED: + warn("Unimplemented border style: beveled"); + break; + case AnnotationBorderStyleType.INSET: + warn("Unimplemented border style: inset"); + break; + case AnnotationBorderStyleType.UNDERLINE: + style.borderBottomStyle = "solid"; + break; + default: + break; + } + const borderColor = data.borderColor || null; + if (borderColor) { + this.#hasBorder = true; + style.borderColor = Util.makeHexColor(...borderColor); + } else { + style.borderWidth = 0; + } + } + const rect = Util.normalizeRect([data.rect[0], page.view[3] - data.rect[1] + page.view[1], data.rect[2], page.view[3] - data.rect[3] + page.view[1]]); + const { + pageWidth, + pageHeight, + pageX, + pageY + } = viewport.rawDims; + style.left = `${100 * (rect[0] - pageX) / pageWidth}%`; + style.top = `${100 * (rect[1] - pageY) / pageHeight}%`; + const { + rotation + } = data; + if (data.hasOwnCanvas || rotation === 0) { + style.width = `${100 * width / pageWidth}%`; + style.height = `${100 * height / pageHeight}%`; + } else { + this.setRotation(rotation, container); + } + return container; + } + setRotation(angle, container = this.container) { + if (!this.data.rect) { + return; + } + const { + pageWidth, + pageHeight + } = this.parent.viewport.rawDims; + let { + width, + height + } = this; + if (angle % 180 !== 0) { + [width, height] = [height, width]; + } + container.style.width = `${100 * width / pageWidth}%`; + container.style.height = `${100 * height / pageHeight}%`; + container.setAttribute("data-main-rotation", (360 - angle) % 360); + } + get _commonActions() { + const setColor = (jsName, styleName, event) => { + const color = event.detail[jsName]; + const colorType = color[0]; + const colorArray = color.slice(1); + event.target.style[styleName] = ColorConverters[`${colorType}_HTML`](colorArray); + this.annotationStorage.setValue(this.data.id, { + [styleName]: ColorConverters[`${colorType}_rgb`](colorArray) + }); }; - altText.addEventListener("click", onClick, { - capture: true - }); - altText.addEventListener("keydown", event => { - if (event.target === altText && event.key === "Enter") { - this.#altTextWasFromKeyBoard = true; - onClick(event); + return shadow(this, "_commonActions", { + display: event => { + const { + display + } = event.detail; + const hidden = display % 2 === 1; + this.container.style.visibility = hidden ? "hidden" : "visible"; + this.annotationStorage.setValue(this.data.id, { + noView: hidden, + noPrint: display === 1 || display === 2 + }); + }, + print: event => { + this.annotationStorage.setValue(this.data.id, { + noPrint: !event.detail.print + }); + }, + hidden: event => { + const { + hidden + } = event.detail; + this.container.style.visibility = hidden ? "hidden" : "visible"; + this.annotationStorage.setValue(this.data.id, { + noPrint: hidden, + noView: hidden + }); + }, + focus: event => { + setTimeout(() => event.target.focus({ + preventScroll: false + }), 0); + }, + userName: event => { + event.target.title = event.detail.userName; + }, + readonly: event => { + event.target.disabled = event.detail.readonly; + }, + required: event => { + this._setRequired(event.target, event.detail.required); + }, + bgColor: event => { + setColor("bgColor", "backgroundColor", event); + }, + fillColor: event => { + setColor("fillColor", "backgroundColor", event); + }, + fgColor: event => { + setColor("fgColor", "color", event); + }, + textColor: event => { + setColor("textColor", "color", event); + }, + borderColor: event => { + setColor("borderColor", "borderColor", event); + }, + strokeColor: event => { + setColor("strokeColor", "borderColor", event); + }, + rotation: event => { + const angle = event.detail.rotation; + this.setRotation(angle); + this.annotationStorage.setValue(this.data.id, { + rotation: angle + }); } }); - await this.#setState(); - return altText; } - finish() { - if (!this.#altTextButton) { + _dispatchEventFromSandbox(actions, jsEvent) { + const commonActions = this._commonActions; + for (const name of Object.keys(jsEvent.detail)) { + const action = actions[name] || commonActions[name]; + action?.(jsEvent); + } + } + _setDefaultPropertiesFromJS(element) { + if (!this.enableScripting) { return; } - this.#altTextButton.focus({ - focusVisible: this.#altTextWasFromKeyBoard + const storedData = this.annotationStorage.getRawValue(this.data.id); + if (!storedData) { + return; + } + const commonActions = this._commonActions; + for (const [actionName, detail] of Object.entries(storedData)) { + const action = commonActions[actionName]; + if (action) { + const eventProxy = { + detail: { + [actionName]: detail + }, + target: element + }; + action(eventProxy); + delete storedData[actionName]; + } + } + } + _createQuadrilaterals() { + if (!this.container) { + return; + } + const { + quadPoints + } = this.data; + if (!quadPoints) { + return; + } + const [rectBlX, rectBlY, rectTrX, rectTrY] = this.data.rect.map(x => Math.fround(x)); + if (quadPoints.length === 8) { + const [trX, trY, blX, blY] = quadPoints.subarray(2, 6); + if (rectTrX === trX && rectTrY === trY && rectBlX === blX && rectBlY === blY) { + return; + } + } + const { + style + } = this.container; + let svgBuffer; + if (this.#hasBorder) { + const { + borderColor, + borderWidth + } = style; + style.borderWidth = 0; + svgBuffer = ["url('data:image/svg+xml;utf8,", ``, ``]; + this.container.classList.add("hasBorder"); + } + const width = rectTrX - rectBlX; + const height = rectTrY - rectBlY; + const { + svgFactory + } = this; + const svg = svgFactory.createElement("svg"); + svg.classList.add("quadrilateralsContainer"); + svg.setAttribute("width", 0); + svg.setAttribute("height", 0); + svg.role = "none"; + const defs = svgFactory.createElement("defs"); + svg.append(defs); + const clipPath = svgFactory.createElement("clipPath"); + const id = `clippath_${this.data.id}`; + clipPath.setAttribute("id", id); + clipPath.setAttribute("clipPathUnits", "objectBoundingBox"); + defs.append(clipPath); + for (let i = 2, ii = quadPoints.length; i < ii; i += 8) { + const trX = quadPoints[i]; + const trY = quadPoints[i + 1]; + const blX = quadPoints[i + 2]; + const blY = quadPoints[i + 3]; + const rect = svgFactory.createElement("rect"); + const x = (blX - rectBlX) / width; + const y = (rectTrY - trY) / height; + const rectWidth = (trX - blX) / width; + const rectHeight = (trY - blY) / height; + rect.setAttribute("x", x); + rect.setAttribute("y", y); + rect.setAttribute("width", rectWidth); + rect.setAttribute("height", rectHeight); + clipPath.append(rect); + svgBuffer?.push(``); + } + if (this.#hasBorder) { + svgBuffer.push(`')`); + style.backgroundImage = svgBuffer.join(""); + } + this.container.append(svg); + this.container.style.clipPath = `url(#${id})`; + } + _createPopup(popupData = null) { + const { + data + } = this; + let contentsObj, modificationDate; + if (popupData) { + contentsObj = { + str: popupData.text + }; + modificationDate = popupData.date; + } else { + contentsObj = data.contentsObj; + modificationDate = data.modificationDate; + } + this.#popupElement = new PopupAnnotationElement({ + data: { + color: data.color, + titleObj: data.titleObj, + modificationDate, + contentsObj, + richText: data.richText, + parentRect: data.rect, + borderStyle: 0, + id: `popup_${data.id}`, + rotation: data.rotation, + noRotate: true + }, + linkService: this.linkService, + parent: this.parent, + elements: [this] }); - this.#altTextWasFromKeyBoard = false; } - isEmpty() { - return !this.#altText && !this.#altTextDecorative; + get hasPopupElement() { + return !!(this.#popupElement || this.popup || this.data.popupRef); } - get data() { - return { - altText: this.#altText, - decorative: this.#altTextDecorative - }; + get extraPopupElement() { + return this.#popupElement; } - set data({ - altText, - decorative - }) { - if (this.#altText === altText && this.#altTextDecorative === decorative) { + render() { + unreachable("Abstract method `AnnotationElement.render` called"); + } + _getElementsByName(name, skipId = null) { + const fields = []; + if (this._fieldObjects) { + const fieldObj = this._fieldObjects[name]; + if (fieldObj) { + for (const { + page, + id, + exportValues + } of fieldObj) { + if (page === -1) { + continue; + } + if (id === skipId) { + continue; + } + const exportValue = typeof exportValues === "string" ? exportValues : null; + const domElement = document.querySelector(`[data-element-id="${id}"]`); + if (domElement && !GetElementsByNameSet.has(domElement)) { + warn(`_getElementsByName - element not allowed: ${id}`); + continue; + } + fields.push({ + id, + exportValue, + domElement + }); + } + } + return fields; + } + for (const domElement of document.getElementsByName(name)) { + const { + exportValue + } = domElement; + const id = domElement.getAttribute("data-element-id"); + if (id === skipId) { + continue; + } + if (!GetElementsByNameSet.has(domElement)) { + continue; + } + fields.push({ + id, + exportValue, + domElement + }); + } + return fields; + } + show() { + if (this.container) { + this.container.hidden = false; + } + this.popup?.maybeShow(); + } + hide() { + if (this.container) { + this.container.hidden = true; + } + this.popup?.forceHide(); + } + getElementsToTriggerPopup() { + return this.container; + } + addHighlightArea() { + const triggers = this.getElementsToTriggerPopup(); + if (Array.isArray(triggers)) { + for (const element of triggers) { + element.classList.add("highlightArea"); + } + } else { + triggers.classList.add("highlightArea"); + } + } + _editOnDoubleClick() { + if (!this._isEditable) { return; } - this.#altText = altText; - this.#altTextDecorative = decorative; - this.#setState(); + const { + annotationEditorType: mode, + data: { + id: editId + } + } = this; + this.container.addEventListener("dblclick", () => { + this.linkService.eventBus?.dispatch("switchannotationeditormode", { + source: this, + mode, + editId, + mustEnterInEditMode: true + }); + }); } - toggle(enabled = false) { - if (!this.#altTextButton) { + updateOC(optionalContentConfig) { + if (!this.data.oc || !optionalContentConfig) { return; } - if (!enabled && this.#altTextTooltipTimeout) { - clearTimeout(this.#altTextTooltipTimeout); - this.#altTextTooltipTimeout = null; + const isVisible = optionalContentConfig.isVisible(this.data.oc); + if (isVisible) { + this.show(); + } else { + this.hide(); } - this.#altTextButton.disabled = !enabled; } - destroy() { - this.#altTextButton?.remove(); - this.#altTextButton = null; - this.#altTextTooltip = null; + get width() { + return this.data.rect[2] - this.data.rect[0]; } - async #setState() { - const button = this.#altTextButton; - if (!button) { + get height() { + return this.data.rect[3] - this.data.rect[1]; + } + _setBackgroundColor(element) { + const color = this.data.backgroundColor || null; + element.style.backgroundColor = color === null ? "transparent" : Util.makeHexColor(...color); + } +} +class EditorAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.editor = parameters.editor; + } + render() { + this.container.className = "editorAnnotation"; + return this.container; + } + createOrUpdatePopup() { + const { + editor + } = this; + if (!editor.hasComment) { return; } - if (!this.#altText && !this.#altTextDecorative) { - button.classList.remove("done"); - this.#altTextTooltip?.remove(); + this._createPopup(editor.comment); + } + get hasCommentButton() { + return this.enableComment && this.editor.hasComment; + } + get commentButtonPosition() { + return this.editor.commentButtonPositionInPage; + } + get commentText() { + return this.editor.comment.text; + } + set commentText(text) { + this.editor.comment = text; + if (!text) { + this.removePopup(); + } + } + get commentData() { + return this.editor.getData(); + } + remove() { + this.parent.removeAnnotation(this.data.id); + this.container.remove(); + this.container = null; + this.removePopup(); + } +} +class LinkAnnotationElement extends AnnotationElement { + constructor(parameters, options = null) { + super(parameters, { + isRenderable: true, + ignoreBorder: !!options?.ignoreBorder, + createQuadrilaterals: true + }); + this.isTooltipOnly = parameters.data.isTooltipOnly; + } + render() { + const { + data, + linkService + } = this; + const link = document.createElement("a"); + link.setAttribute("data-element-id", data.id); + let isBound = false; + if (data.url) { + linkService.addLinkAttributes(link, data.url, data.newWindow); + isBound = true; + } else if (data.action) { + this._bindNamedAction(link, data.action, data.overlaidText); + isBound = true; + } else if (data.attachment) { + this.#bindAttachment(link, data.attachmentId, data.attachment, data.overlaidText, data.attachmentDest); + isBound = true; + } else if (data.setOCGState) { + this.#bindSetOCGState(link, data.setOCGState, data.overlaidText); + isBound = true; + } else if (data.dest) { + this._bindLink(link, data.dest, data.overlaidText); + isBound = true; + } else { + if (data.actions && (data.actions.Action || data.actions["Mouse Up"] || data.actions["Mouse Down"]) && this.enableScripting && this.hasJSActions) { + this._bindJSAction(link, data); + isBound = true; + } + if (data.resetForm) { + this._bindResetFormAction(link, data.resetForm); + isBound = true; + } else if (this.isTooltipOnly && !isBound) { + this._bindLink(link, ""); + isBound = true; + } + } + this.container.classList.add("linkAnnotation"); + if (isBound) { + this.contentElement = link; + this.container.append(link); + } + return this.container; + } + #setInternalLink() { + this.container.setAttribute("data-internal-link", ""); + } + _bindLink(link, destination, overlaidText = "") { + link.href = this.linkService.getDestinationHash(destination); + link.onclick = () => { + if (destination) { + this.linkService.goToDestination(destination); + } + return false; + }; + if (destination || destination === "") { + this.#setInternalLink(); + } + if (overlaidText) { + link.title = overlaidText; + } + } + _bindNamedAction(link, action, overlaidText = "") { + link.href = this.linkService.getAnchorUrl(""); + link.onclick = () => { + this.linkService.executeNamedAction(action); + return false; + }; + if (overlaidText) { + link.title = overlaidText; + } + this.#setInternalLink(); + } + #bindAttachment(link, attachmentId, attachment, overlaidText = "", dest = null) { + link.href = this.linkService.getAnchorUrl(""); + if (attachment.description) { + link.title = attachment.description; + } else if (overlaidText) { + link.title = overlaidText; + } + const openAttachment = async () => { + const content = await this.linkService.getAttachmentContent(attachmentId); + if (content) { + this.downloadManager?.openOrDownloadData(content, attachment.filename, dest); + } + }; + link.onclick = () => { + openAttachment(); + return false; + }; + this.#setInternalLink(); + } + #bindSetOCGState(link, action, overlaidText = "") { + link.href = this.linkService.getAnchorUrl(""); + link.onclick = () => { + this.linkService.executeSetOCGState(action); + return false; + }; + if (overlaidText) { + link.title = overlaidText; + } + this.#setInternalLink(); + } + _bindJSAction(link, data) { + link.href = this.linkService.getAnchorUrl(""); + const map = new Map([["Action", "onclick"], ["Mouse Up", "onmouseup"], ["Mouse Down", "onmousedown"]]); + for (const name of Object.keys(data.actions)) { + const jsName = map.get(name); + if (!jsName) { + continue; + } + link[jsName] = () => { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: data.id, + name + } + }); + return false; + }; + } + if (data.overlaidText) { + link.title = data.overlaidText; + } + if (!link.onclick) { + link.onclick = () => false; + } + this.#setInternalLink(); + } + _bindResetFormAction(link, resetForm) { + const otherClickAction = link.onclick; + if (!otherClickAction) { + link.href = this.linkService.getAnchorUrl(""); + } + this.#setInternalLink(); + if (!this._fieldObjects) { + warn(`_bindResetFormAction - "resetForm" action not supported, ` + "ensure that the `fieldObjects` parameter is provided."); + if (!otherClickAction) { + link.onclick = () => false; + } return; } - button.classList.add("done"); - AltText._l10nPromise.get("pdfjs-editor-alt-text-edit-button-label").then(msg => { - button.setAttribute("aria-label", msg); + link.onclick = () => { + otherClickAction?.(); + const { + fields: resetFormFields, + refs: resetFormRefs, + include + } = resetForm; + const allFields = []; + if (resetFormFields.length !== 0 || resetFormRefs.length !== 0) { + const fieldIds = new Set(resetFormRefs); + for (const fieldName of resetFormFields) { + const fields = this._fieldObjects[fieldName] || []; + for (const { + id + } of fields) { + fieldIds.add(id); + } + } + for (const fields of Object.values(this._fieldObjects)) { + for (const field of fields) { + if (fieldIds.has(field.id) === include) { + allFields.push(field); + } + } + } + } else { + for (const fields of Object.values(this._fieldObjects)) { + allFields.push(...fields); + } + } + const storage = this.annotationStorage; + const allIds = []; + for (const field of allFields) { + const { + id + } = field; + allIds.push(id); + switch (field.type) { + case "text": + { + const value = field.defaultValue || ""; + storage.setValue(id, { + value + }); + break; + } + case "checkbox": + case "radiobutton": + { + const value = field.defaultValue === field.exportValues; + storage.setValue(id, { + value + }); + break; + } + case "combobox": + case "listbox": + { + const value = field.defaultValue || ""; + storage.setValue(id, { + value + }); + break; + } + default: + continue; + } + const domElement = document.querySelector(`[data-element-id="${id}"]`); + if (!domElement) { + continue; + } else if (!GetElementsByNameSet.has(domElement)) { + warn(`_bindResetFormAction - element not allowed: ${id}`); + continue; + } + domElement.dispatchEvent(new Event("resetform")); + } + if (this.enableScripting) { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: "app", + ids: allIds, + name: "ResetForm" + } + }); + } + return false; + }; + } +} +class TextAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true + }); + } + render() { + this.container.classList.add("textAnnotation"); + const image = document.createElement("img"); + image.src = this.imageResourcesPath + "annotation-" + this.data.name.toLowerCase() + ".svg"; + image.setAttribute("data-l10n-id", "pdfjs-text-annotation-type"); + image.setAttribute("data-l10n-args", JSON.stringify({ + type: this.data.name + })); + if (!this.data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); + } + this.container.append(image); + return this.container; + } +} +class WidgetAnnotationElement extends AnnotationElement { + render() { + return this.container; + } + _getKeyModifier(event) { + return FeatureTest.platform.isMac ? event.metaKey : event.ctrlKey; + } + _setEventListener(element, elementData, baseName, eventName, valueGetter) { + if (baseName.includes("mouse")) { + element.addEventListener(baseName, event => { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: this.data.id, + name: eventName, + value: valueGetter(event), + shift: event.shiftKey, + modifier: this._getKeyModifier(event) + } + }); + }); + } else { + element.addEventListener(baseName, event => { + if (baseName === "blur") { + if (!elementData.focused || !event.relatedTarget) { + return; + } + elementData.focused = false; + } else if (baseName === "focus") { + if (elementData.focused) { + return; + } + elementData.focused = true; + } + if (!valueGetter) { + return; + } + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: this.data.id, + name: eventName, + value: valueGetter(event) + } + }); + }); + } + } + _setEventListeners(element, elementData, names, getter) { + for (const [baseName, eventName] of names) { + if (eventName === "Action" || this.data.actions?.[eventName]) { + if (eventName === "Focus" || eventName === "Blur") { + elementData ||= { + focused: false + }; + } + this._setEventListener(element, elementData, baseName, eventName, getter); + if (eventName === "Focus" && !this.data.actions?.Blur) { + this._setEventListener(element, elementData, "blur", "Blur", null); + } else if (eventName === "Blur" && !this.data.actions?.Focus) { + this._setEventListener(element, elementData, "focus", "Focus", null); + } + } + } + } + _setTextStyle(element) { + const TEXT_ALIGNMENT = ["left", "center", "right"]; + const { + fontColor + } = this.data.defaultAppearanceData; + const fontSize = this.data.defaultAppearanceData.fontSize || annotation_layer_DEFAULT_FONT_SIZE; + const style = element.style; + let computedFontSize; + const BORDER_SIZE = 2; + const roundToOneDecimal = x => Math.round(10 * x) / 10; + if (this.data.multiLine) { + const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE); + const numberOfLines = Math.round(height / (LINE_FACTOR * fontSize)) || 1; + const lineHeight = height / numberOfLines; + computedFontSize = Math.min(fontSize, roundToOneDecimal(lineHeight / LINE_FACTOR)); + } else { + const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE); + computedFontSize = Math.min(fontSize, roundToOneDecimal(height / LINE_FACTOR)); + } + style.fontSize = `calc(${computedFontSize}px * var(--total-scale-factor))`; + style.color = Util.makeHexColor(...fontColor); + if (this.data.textAlignment !== null && !this.data.comb) { + style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment]; + } + } + _setRequired(element, isRequired) { + if (isRequired) { + element.setAttribute("required", true); + } else { + element.removeAttribute("required"); + } + element.setAttribute("aria-required", isRequired); + } +} +class TextWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + const isRenderable = parameters.renderForms || parameters.data.hasOwnCanvas || !parameters.data.hasAppearance && !!parameters.data.fieldValue; + super(parameters, { + isRenderable }); - let tooltip = this.#altTextTooltip; - if (!tooltip) { - this.#altTextTooltip = tooltip = document.createElement("span"); - tooltip.className = "tooltip"; - tooltip.setAttribute("role", "tooltip"); - const id = tooltip.id = `alt-text-tooltip-${this.#editor.id}`; - button.setAttribute("aria-describedby", id); - const DELAY_TO_SHOW_TOOLTIP = 100; - button.addEventListener("mouseenter", () => { - this.#altTextTooltipTimeout = setTimeout(() => { - this.#altTextTooltipTimeout = null; - this.#altTextTooltip.classList.add("show"); - this.#editor._reportTelemetry({ - action: "alt_text_tooltip" + } + setPropertyOnSiblings(base, key, value, keyInStorage) { + const storage = this.annotationStorage; + for (const element of this._getElementsByName(base.name, base.id)) { + if (element.domElement) { + element.domElement[key] = value; + } + storage.setValue(element.id, { + [keyInStorage]: value + }); + } + } + render() { + const storage = this.annotationStorage; + const id = this.data.id; + this.container.classList.add("textWidgetAnnotation"); + let element = null; + if (this.renderForms) { + const storedData = storage.getValue(id, { + value: this.data.fieldValue + }); + let textContent = storedData.value || ""; + const maxLen = storage.getValue(id, { + charLimit: this.data.maxLen + }).charLimit; + if (maxLen && textContent.length > maxLen) { + textContent = textContent.slice(0, maxLen); + } + let fieldFormattedValues = storedData.formattedValue || this.data.textContent?.join("\n") || null; + if (fieldFormattedValues && this.data.comb) { + fieldFormattedValues = fieldFormattedValues.replaceAll(/\s+/g, ""); + } + const elementData = { + userValue: textContent, + formattedValue: fieldFormattedValues, + lastCommittedValue: null, + commitKey: 1, + focused: false + }; + if (this.data.multiLine) { + element = document.createElement("textarea"); + element.textContent = fieldFormattedValues ?? textContent; + if (this.data.doNotScroll) { + element.style.overflowY = "hidden"; + } + } else { + element = document.createElement("input"); + element.type = this.data.password ? "password" : "text"; + element.setAttribute("value", fieldFormattedValues ?? textContent); + if (this.data.doNotScroll) { + element.style.overflowX = "hidden"; + } + } + if (this.data.hasOwnCanvas) { + this.container.classList.add("hasOwnCanvas"); + if (storage.has(id)) { + this.container.classList.add("sandboxModified"); + } + } + GetElementsByNameSet.add(element); + this.contentElement = element; + element.setAttribute("data-element-id", id); + element.disabled = this.data.readOnly; + element.name = this.data.fieldName; + element.tabIndex = 0; + const { + datetimeFormat, + datetimeType, + timeStep + } = this.data; + const hasDateOrTime = !!datetimeType && this.enableScripting; + if (datetimeFormat) { + element.title = datetimeFormat; + } + this._setRequired(element, this.data.required); + if (maxLen) { + element.maxLength = maxLen; + } + element.addEventListener("input", event => { + storage.setValue(id, { + value: event.target.value + }); + this.setPropertyOnSiblings(element, "value", event.target.value, "value"); + elementData.formattedValue = null; + }); + element.addEventListener("resetform", event => { + const defaultValue = this.data.defaultFieldValue ?? ""; + element.value = elementData.userValue = defaultValue; + elementData.formattedValue = null; + }); + let blurListener = event => { + const { + formattedValue + } = elementData; + if (formattedValue !== null && formattedValue !== undefined) { + event.target.value = formattedValue; + } + event.target.scrollLeft = 0; + }; + if (this.enableScripting && this.hasJSActions) { + element.addEventListener("focus", event => { + if (elementData.focused) { + return; + } + const { + target + } = event; + if (hasDateOrTime) { + target.type = datetimeType; + if (timeStep) { + target.step = timeStep; + } + } + if (elementData.userValue) { + const value = elementData.userValue; + if (hasDateOrTime) { + if (datetimeType === "time") { + const date = new Date(value); + const parts = [date.getHours(), date.getMinutes(), date.getSeconds()]; + target.value = parts.map(v => v.toString().padStart(2, "0")).join(":"); + } else { + target.value = new Date(value - TIMEZONE_OFFSET).toISOString().split(datetimeType === "date" ? "T" : ".", 1)[0]; + } + } else { + target.value = value; + } + } + elementData.lastCommittedValue = target.value; + elementData.commitKey = 1; + if (!this.data.actions?.Focus) { + elementData.focused = true; + } + }); + element.addEventListener("updatefromsandbox", jsEvent => { + this.container.classList.add("sandboxModified"); + const actions = { + value(event) { + elementData.userValue = event.detail.value ?? ""; + if (!hasDateOrTime) { + storage.setValue(id, { + value: elementData.userValue.toString() + }); + } + event.target.value = elementData.userValue; + }, + formattedValue(event) { + const { + formattedValue + } = event.detail; + elementData.formattedValue = formattedValue; + if (formattedValue !== null && formattedValue !== undefined && event.target !== document.activeElement) { + event.target.value = formattedValue; + } + const data = { + formattedValue + }; + if (hasDateOrTime) { + data.value = formattedValue; + } + storage.setValue(id, data); + }, + selRange(event) { + event.target.setSelectionRange(...event.detail.selRange); + }, + charLimit: event => { + const { + charLimit + } = event.detail; + const { + target + } = event; + if (charLimit === 0) { + target.removeAttribute("maxLength"); + return; + } + target.setAttribute("maxLength", charLimit); + let value = elementData.userValue; + if (!value || value.length <= charLimit) { + return; + } + value = value.slice(0, charLimit); + target.value = elementData.userValue = value; + storage.setValue(id, { + value + }); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey: 1, + selStart: target.selectionStart, + selEnd: target.selectionEnd + } + }); + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + element.addEventListener("keydown", event => { + elementData.commitKey = 1; + let commitKey = -1; + if (event.key === "Escape") { + commitKey = 0; + } else if (event.key === "Enter" && !this.data.multiLine) { + commitKey = 2; + } else if (event.key === "Tab") { + elementData.commitKey = 3; + } + if (commitKey === -1) { + return; + } + const { + value + } = event.target; + if (elementData.lastCommittedValue === value) { + return; + } + elementData.lastCommittedValue = value; + elementData.userValue = value; + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey, + selStart: event.target.selectionStart, + selEnd: event.target.selectionEnd + } }); - }, DELAY_TO_SHOW_TOOLTIP); + }); + const _blurListener = blurListener; + blurListener = null; + element.addEventListener("blur", event => { + if (!elementData.focused || !event.relatedTarget) { + return; + } + if (!this.data.actions?.Blur) { + elementData.focused = false; + } + const { + target + } = event; + let { + value + } = target; + if (hasDateOrTime) { + if (value && datetimeType === "time") { + const parts = value.split(":").map(v => parseInt(v, 10)); + value = new Date(2000, 0, 1, parts[0], parts[1], parts[2] || 0).valueOf(); + target.step = ""; + } else { + if (!value.includes("T")) { + value = `${value}T00:00`; + } + value = new Date(value).valueOf(); + } + target.type = "text"; + } + elementData.userValue = value; + if (elementData.lastCommittedValue !== value) { + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + willCommit: true, + commitKey: elementData.commitKey, + selStart: event.target.selectionStart, + selEnd: event.target.selectionEnd + } + }); + } + _blurListener(event); + }); + if (this.data.actions?.Keystroke) { + element.addEventListener("beforeinput", event => { + elementData.lastCommittedValue = null; + const { + data, + target + } = event; + const { + value, + selectionStart, + selectionEnd + } = target; + let selStart = selectionStart, + selEnd = selectionEnd; + switch (event.inputType) { + case "deleteWordBackward": + { + const match = value.substring(0, selectionStart).match(/\w*\W*$/); + if (match) { + selStart -= match[0].length; + } + break; + } + case "deleteWordForward": + { + const match = value.substring(selectionStart).match(/^\W*\w*/); + if (match) { + selEnd += match[0].length; + } + break; + } + case "deleteContentBackward": + if (selectionStart === selectionEnd) { + selStart -= 1; + } + break; + case "deleteContentForward": + if (selectionStart === selectionEnd) { + selEnd += 1; + } + break; + } + event.preventDefault(); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value, + change: data || "", + willCommit: false, + selStart, + selEnd + } + }); + }); + } + this._setEventListeners(element, elementData, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.value); + } + if (blurListener) { + element.addEventListener("blur", blurListener); + } + if (this.data.comb) { + const fieldWidth = this.data.rect[2] - this.data.rect[0]; + const combWidth = fieldWidth / maxLen; + element.classList.add("comb"); + element.style.setProperty("--comb-width", `calc(${combWidth}px * var(--total-scale-factor))`); + const alignment = this.data.textAlignment; + if (alignment === 1 || alignment === 2) { + const setCombOffset = () => { + const free = maxLen - element.value.length; + element.style.setProperty("--comb-offset", `${alignment === 1 ? free >> 1 : free}`); + }; + setCombOffset(); + for (const evt of ["input", "blur", "resetform", "updatefromsandbox"]) { + element.addEventListener(evt, setCombOffset); + } + } + } + } else { + element = document.createElement("div"); + element.textContent = this.data.fieldValue; + element.style.verticalAlign = "middle"; + element.style.display = "table-cell"; + if (this.data.hasOwnCanvas) { + element.hidden = true; + } + } + this._setTextStyle(element); + this._setBackgroundColor(element); + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class SignatureWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: !!parameters.data.hasOwnCanvas + }); + } +} +class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + const storage = this.annotationStorage; + const data = this.data; + const id = data.id; + let value = storage.getValue(id, { + value: data.exportValue === data.fieldValue + }).value; + if (typeof value === "string") { + value = value !== "Off"; + storage.setValue(id, { + value }); - button.addEventListener("mouseleave", () => { - if (this.#altTextTooltipTimeout) { - clearTimeout(this.#altTextTooltipTimeout); - this.#altTextTooltipTimeout = null; + } + this.container.classList.add("buttonWidgetAnnotation", "checkBox"); + const element = document.createElement("input"); + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = data.readOnly; + this._setRequired(element, this.data.required); + element.type = "checkbox"; + element.name = data.fieldName; + if (value) { + element.setAttribute("checked", true); + } + element.setAttribute("exportValue", data.exportValue); + element.tabIndex = 0; + element.addEventListener("change", event => { + const { + name, + checked + } = event.target; + for (const checkbox of this._getElementsByName(name, id)) { + const curChecked = checked && checkbox.exportValue === data.exportValue; + if (checkbox.domElement) { + checkbox.domElement.checked = curChecked; } - this.#altTextTooltip?.classList.remove("show"); + storage.setValue(checkbox.id, { + value: curChecked + }); + } + storage.setValue(id, { + value: checked + }); + }); + element.addEventListener("resetform", event => { + const defaultValue = data.defaultFieldValue || "Off"; + event.target.checked = defaultValue === data.exportValue; + }); + if (this.enableScripting && this.hasJSActions) { + element.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value(event) { + event.target.checked = event.detail.value !== "Off"; + storage.setValue(id, { + value: event.target.checked + }); + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); }); + this._setEventListeners(element, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); } - tooltip.innerText = this.#altTextDecorative ? await AltText._l10nPromise.get("pdfjs-editor-alt-text-decorative-tooltip") : this.#altText; - if (!tooltip.parentNode) { - button.append(tooltip); + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + this.container.classList.add("buttonWidgetAnnotation", "radioButton"); + const storage = this.annotationStorage; + const data = this.data; + const id = data.id; + let value = storage.getValue(id, { + value: data.buttonValue !== null && data.fieldValue === data.buttonValue + }).value; + if (typeof value === "string") { + value = value !== data.buttonValue; + storage.setValue(id, { + value + }); } - const element = this.#editor.getImageForAltText(); - element?.setAttribute("aria-describedby", tooltip.id); + if (value) { + for (const radio of this._getElementsByName(data.fieldName, id)) { + storage.setValue(radio.id, { + value: false + }); + } + } + const element = document.createElement("input"); + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = data.readOnly; + this._setRequired(element, this.data.required); + element.type = "radio"; + element.name = data.fieldName; + if (value) { + element.setAttribute("checked", true); + } + element.tabIndex = 0; + element.addEventListener("change", event => { + const { + name, + checked + } = event.target; + for (const radio of this._getElementsByName(name, id)) { + storage.setValue(radio.id, { + value: false + }); + } + storage.setValue(id, { + value: checked + }); + }); + element.addEventListener("resetform", event => { + const defaultValue = data.defaultFieldValue; + event.target.checked = defaultValue !== null && defaultValue !== undefined && defaultValue === data.buttonValue; + }); + if (this.enableScripting && this.hasJSActions) { + const pdfButtonValue = data.buttonValue; + element.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value: event => { + const checked = pdfButtonValue === event.detail.value; + for (const radio of this._getElementsByName(event.target.name)) { + const curChecked = checked && radio.id === id; + if (radio.domElement) { + radio.domElement.checked = curChecked; + } + storage.setValue(radio.id, { + value: curChecked + }); + } + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + this._setEventListeners(element, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); + } + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; } } - -// EXTERNAL MODULE: ./src/display/editor/toolbar.js -var toolbar = __webpack_require__(362); -;// CONCATENATED MODULE: ./src/display/editor/editor.js - - - - - -class AnnotationEditor { - #allResizerDivs = null; - #altText = null; - #disabled = false; - #keepAspectRatio = false; - #resizersDiv = null; - #savedDimensions = null; - #boundFocusin = this.focusin.bind(this); - #boundFocusout = this.focusout.bind(this); - #editToolbar = null; - #focusedResizerName = ""; - #hasBeenClicked = false; - #initialPosition = null; - #isEditing = false; - #isInEditMode = false; - #isResizerEnabledForKeyboard = false; - #moveInDOMTimeout = null; - #prevDragX = 0; - #prevDragY = 0; - #telemetryTimeouts = null; - _initialOptions = Object.create(null); - _isVisible = true; - _uiManager = null; - _focusEventsAllowed = true; - _l10nPromise = null; - #isDraggable = false; - #zIndex = AnnotationEditor._zIndex++; - static _borderLineWidth = -1; - static _colorManager = new tools.ColorManager(); - static _zIndex = 1; - static _telemetryTimeout = 1000; - static get _resizerKeyboardManager() { - const resize = AnnotationEditor.prototype._resizeWithKeyboard; - const small = tools.AnnotationEditorUIManager.TRANSLATE_SMALL; - const big = tools.AnnotationEditorUIManager.TRANSLATE_BIG; - return (0,util.shadow)(this, "_resizerKeyboardManager", new tools.KeyboardManager([[["ArrowLeft", "mac+ArrowLeft"], resize, { - args: [-small, 0] - }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], resize, { - args: [-big, 0] - }], [["ArrowRight", "mac+ArrowRight"], resize, { - args: [small, 0] - }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], resize, { - args: [big, 0] - }], [["ArrowUp", "mac+ArrowUp"], resize, { - args: [0, -small] - }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], resize, { - args: [0, -big] - }], [["ArrowDown", "mac+ArrowDown"], resize, { - args: [0, small] - }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], resize, { - args: [0, big] - }], [["Escape", "mac+Escape"], AnnotationEditor.prototype._stopResizingWithKeyboard]])); +class PushButtonWidgetAnnotationElement extends LinkAnnotationElement { + constructor(parameters) { + super(parameters, { + ignoreBorder: parameters.data.hasAppearance + }); + } + render() { + const container = super.render(); + container.classList.add("buttonWidgetAnnotation", "pushButton"); + const linkElement = container.lastChild; + if (this.enableScripting && this.hasJSActions && linkElement) { + this._setDefaultPropertiesFromJS(linkElement); + linkElement.addEventListener("updatefromsandbox", jsEvent => { + this._dispatchEventFromSandbox({}, jsEvent); + }); + } + return container; + } +} +class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: parameters.renderForms + }); + } + render() { + this.container.classList.add("choiceWidgetAnnotation"); + const storage = this.annotationStorage; + const id = this.data.id; + const storedData = storage.getValue(id, { + value: this.data.fieldValue + }); + const selectElement = document.createElement("select"); + GetElementsByNameSet.add(selectElement); + selectElement.setAttribute("data-element-id", id); + selectElement.disabled = this.data.readOnly; + this._setRequired(selectElement, this.data.required); + selectElement.name = this.data.fieldName; + selectElement.tabIndex = 0; + let addAnEmptyEntry = this.data.combo && this.data.options.length > 0; + if (!this.data.combo) { + selectElement.size = this.data.options.length; + if (this.data.multiSelect) { + selectElement.multiple = true; + } + } + selectElement.addEventListener("resetform", event => { + const defaultValue = this.data.defaultFieldValue; + for (const option of selectElement.options) { + option.selected = option.value === defaultValue; + } + }); + const fixDisplayValue = (option, value) => { + const newValue = value.replaceAll(" ", "\u00A0"); + option.textContent = newValue; + if (newValue !== value) { + option.setAttribute("display-value", value); + } + }; + for (const option of this.data.options) { + const optionElement = document.createElement("option"); + fixDisplayValue(optionElement, option.displayValue); + optionElement.value = option.exportValue; + if (storedData.value.includes(option.exportValue)) { + optionElement.setAttribute("selected", true); + addAnEmptyEntry = false; + } + selectElement.append(optionElement); + } + let removeEmptyEntry = null; + if (addAnEmptyEntry) { + const noneOptionElement = document.createElement("option"); + noneOptionElement.value = " "; + noneOptionElement.setAttribute("hidden", true); + noneOptionElement.setAttribute("selected", true); + selectElement.prepend(noneOptionElement); + removeEmptyEntry = () => { + noneOptionElement.remove(); + selectElement.removeEventListener("input", removeEmptyEntry); + removeEmptyEntry = null; + }; + selectElement.addEventListener("input", removeEmptyEntry); + } + const getValue = isExport => { + const name = isExport ? "value" : "textContent"; + const { + options, + multiple + } = selectElement; + if (!multiple) { + return options.selectedIndex === -1 ? null : options[options.selectedIndex][name]; + } + return Array.prototype.filter.call(options, option => option.selected).map(option => option[name]); + }; + let selectedValues = getValue(false); + const getItems = event => { + const options = event.target.options; + return Array.prototype.map.call(options, option => ({ + displayValue: option.getAttribute("display-value") || option.textContent, + exportValue: option.value + })); + }; + if (this.enableScripting && this.hasJSActions) { + selectElement.addEventListener("updatefromsandbox", jsEvent => { + const actions = { + value(event) { + removeEmptyEntry?.(); + const value = event.detail.value; + const values = new Set(Array.isArray(value) ? value : [value]); + for (const option of selectElement.options) { + option.selected = values.has(option.value); + } + storage.setValue(id, { + value: getValue(true) + }); + selectedValues = getValue(false); + }, + multipleSelection(event) { + selectElement.multiple = true; + }, + remove(event) { + const options = selectElement.options; + const index = event.detail.remove; + options[index].selected = false; + selectElement.remove(index); + if (options.length > 0) { + const i = Array.prototype.findIndex.call(options, option => option.selected); + if (i === -1) { + options[0].selected = true; + } + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + clear(event) { + while (selectElement.length !== 0) { + selectElement.remove(0); + } + storage.setValue(id, { + value: null, + items: [] + }); + selectedValues = getValue(false); + }, + insert(event) { + const { + index, + displayValue, + exportValue + } = event.detail.insert; + const selectChild = selectElement.children[index]; + const optionElement = document.createElement("option"); + fixDisplayValue(optionElement, displayValue); + optionElement.value = exportValue; + if (selectChild) { + selectChild.before(optionElement); + } else { + selectElement.append(optionElement); + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + items(event) { + const { + items + } = event.detail; + while (selectElement.length !== 0) { + selectElement.remove(0); + } + for (const item of items) { + const { + displayValue, + exportValue + } = item; + const optionElement = document.createElement("option"); + fixDisplayValue(optionElement, displayValue); + optionElement.value = exportValue; + selectElement.append(optionElement); + } + if (selectElement.options.length > 0) { + selectElement.options[0].selected = true; + } + storage.setValue(id, { + value: getValue(true), + items: getItems(event) + }); + selectedValues = getValue(false); + }, + indices(event) { + const indices = new Set(event.detail.indices); + for (const option of event.target.options) { + option.selected = indices.has(option.index); + } + storage.setValue(id, { + value: getValue(true) + }); + selectedValues = getValue(false); + }, + editable(event) { + event.target.disabled = !event.detail.editable; + } + }; + this._dispatchEventFromSandbox(actions, jsEvent); + }); + selectElement.addEventListener("input", event => { + const exportValue = getValue(true); + const change = getValue(false); + storage.setValue(id, { + value: exportValue + }); + event.preventDefault(); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value: selectedValues, + change, + changeEx: exportValue, + willCommit: false, + commitKey: 1, + keyDown: false + } + }); + }); + this._setEventListeners(selectElement, null, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"], ["input", "Action"], ["input", "Validate"]], event => event.target.value); + } else { + selectElement.addEventListener("input", function (event) { + storage.setValue(id, { + value: getValue(true) + }); + }); + } + if (this.data.combo) { + this._setTextStyle(selectElement); + } else {} + this._setBackgroundColor(selectElement); + this._setDefaultPropertiesFromJS(selectElement); + this.container.append(selectElement); + return this.container; } +} +class PopupAnnotationElement extends AnnotationElement { constructor(parameters) { - if (this.constructor === AnnotationEditor) { - (0,util.unreachable)("Cannot initialize AnnotationEditor."); + const { + data, + elements, + parent + } = parameters; + const hasCommentManager = !!parent._commentManager; + super(parameters, { + isRenderable: !hasCommentManager && AnnotationElement._hasPopupData(data) + }); + this.elements = elements; + if (hasCommentManager && AnnotationElement._hasPopupData(data)) { + const popup = this.popup = this.#createPopup(); + for (const element of elements) { + element.popup = popup; + } + } else { + this.popup = null; + } + } + #createPopup() { + return new PopupElement({ + container: this.container, + color: this.data.color, + titleObj: this.data.titleObj, + modificationDate: this.data.modificationDate || this.data.creationDate, + contentsObj: this.data.contentsObj, + richText: this.data.richText, + rect: this.data.rect, + parentRect: this.data.parentRect || null, + parent: this.parent, + elements: this.elements, + open: this.data.open, + commentManager: this.parent._commentManager + }); + } + render() { + const { + container + } = this; + container.classList.add("popupAnnotation"); + container.role = "comment"; + const popup = this.popup = this.#createPopup(); + const elementIds = []; + for (const element of this.elements) { + element.popup = popup; + element.container.ariaHasPopup = "dialog"; + elementIds.push(element.data.id); + element.addHighlightArea(); + } + this.container.setAttribute("aria-controls", elementIds.map(id => `${AnnotationPrefix}${id}`).join(",")); + return this.container; + } +} +class PopupElement { + #commentManager = null; + #boundKeyDown = this.#keyDown.bind(this); + #boundHide = this.#hide.bind(this); + #boundShow = this.#show.bind(this); + #boundToggle = this.#toggle.bind(this); + #color = null; + #container = null; + #contentsObj = null; + #dateObj = null; + #elements = null; + #parent = null; + #parentRect = null; + #pinned = false; + #popup = null; + #popupAbortController = null; + #position = null; + #commentButton = null; + #commentButtonPosition = null; + #popupPosition = null; + #rect = null; + #richText = null; + #titleObj = null; + #updates = null; + #wasVisible = false; + #firstElement = null; + #commentText = null; + constructor({ + container, + color, + elements, + titleObj, + modificationDate, + contentsObj, + richText, + parent, + rect, + parentRect, + open, + commentManager = null + }) { + this.#container = container; + this.#titleObj = titleObj; + this.#contentsObj = contentsObj; + this.#richText = richText; + this.#parent = parent; + this.#color = color; + this.#rect = rect; + this.#parentRect = parentRect; + this.#elements = elements; + this.#commentManager = commentManager; + this.#firstElement = elements[0]; + this.#dateObj = PDFDateString.toDateObject(modificationDate); + this.trigger = elements.flatMap(e => e.getElementsToTriggerPopup()); + if (!commentManager) { + this.#addEventListeners(); + this.#container.hidden = true; + if (open) { + this.#toggle(); + } + } + } + #addEventListeners() { + if (this.#popupAbortController) { + return; + } + this.#popupAbortController = new AbortController(); + const { + signal + } = this.#popupAbortController; + for (const element of this.trigger) { + element.addEventListener("click", this.#boundToggle, { + signal + }); + element.addEventListener("pointerenter", this.#boundShow, { + signal + }); + element.addEventListener("pointerleave", this.#boundHide, { + signal + }); + element.classList.add("popupTriggerArea"); + } + for (const element of this.#elements) { + element.container?.addEventListener("keydown", this.#boundKeyDown, { + signal + }); + } + } + #setCommentButtonPosition() { + const element = this.#elements.find(e => e.hasCommentButton); + if (!element) { + return; + } + this.#commentButtonPosition = element._normalizePoint(element.commentButtonPosition); + } + renderCommentButton() { + if (this.#commentButton) { + if (!this.#commentButton.parentNode) { + this.#firstElement.container.after(this.#commentButton); + } + return; + } + if (!this.#commentButtonPosition) { + this.#setCommentButtonPosition(); + } + if (!this.#commentButtonPosition) { + return; } - this.parent = parameters.parent; - this.id = parameters.id; - this.width = this.height = null; - this.pageIndex = parameters.parent.pageIndex; - this.name = parameters.name; - this.div = null; - this._uiManager = parameters.uiManager; - this.annotationElementId = null; - this._willKeepAspectRatio = false; - this._initialOptions.isCentered = parameters.isCentered; - this._structTreeParentId = null; const { - rotation, - rawDims: { - pageWidth, - pageHeight, - pageX, - pageY + signal + } = this.#popupAbortController = new AbortController(); + const hasOwnButton = this.#firstElement.hasOwnCommentButton; + const togglePopup = () => { + this.#commentManager.toggleCommentPopup(this, true, undefined, !hasOwnButton); + }; + const showPopup = () => { + this.#commentManager.toggleCommentPopup(this, false, true, !hasOwnButton); + }; + const hidePopup = () => { + this.#commentManager.toggleCommentPopup(this, false, false); + }; + if (!hasOwnButton) { + const button = this.#commentButton = document.createElement("button"); + button.className = "annotationCommentButton"; + const parentContainer = this.#firstElement.container; + button.style.zIndex = parseInt(parentContainer.style.zIndex, 10) + 1; + button.tabIndex = 0; + button.ariaHasPopup = "dialog"; + button.ariaControls = "commentPopup"; + button.setAttribute("data-l10n-id", "pdfjs-show-comment-button"); + this.#updateColor(); + this.#updateCommentButtonPosition(); + button.addEventListener("keydown", this.#boundKeyDown, { + signal + }); + button.addEventListener("click", togglePopup, { + signal + }); + button.addEventListener("pointerenter", showPopup, { + signal + }); + button.addEventListener("pointerleave", hidePopup, { + signal + }); + parentContainer.after(button); + } else { + this.#commentButton = this.#firstElement.container; + for (const element of this.trigger) { + element.ariaHasPopup = "dialog"; + element.ariaControls = "commentPopup"; + element.addEventListener("keydown", this.#boundKeyDown, { + signal + }); + element.addEventListener("click", togglePopup, { + signal + }); + element.addEventListener("pointerenter", showPopup, { + signal + }); + element.addEventListener("pointerleave", hidePopup, { + signal + }); + element.classList.add("popupTriggerArea"); } - } = this.parent.viewport; - this.rotation = rotation; - this.pageRotation = (360 + rotation - this._uiManager.viewParameters.rotation) % 360; - this.pageDimensions = [pageWidth, pageHeight]; - this.pageTranslation = [pageX, pageY]; - const [width, height] = this.parentDimensions; - this.x = parameters.x / width; - this.y = parameters.y / height; - this.isAttachedToDOM = false; - this.deleted = false; + } } - get editorType() { - return Object.getPrototypeOf(this).constructor._type; + #updateCommentButtonPosition() { + if (this.#firstElement.extraPopupElement && !this.#firstElement.editor) { + return; + } + if (!this.#commentButton) { + this.renderCommentButton(); + } + const [x, y] = this.#commentButtonPosition; + const { + style + } = this.#commentButton; + style.left = `calc(${x}%)`; + style.top = `calc(${y}% - var(--comment-button-dim))`; } - static get _defaultLineColor() { - return (0,util.shadow)(this, "_defaultLineColor", this._colorManager.getHexCode("CanvasText")); + #updateColor() { + if (this.#firstElement.extraPopupElement) { + return; + } + if (!this.#commentButton) { + this.renderCommentButton(); + } + this.#commentButton.style.backgroundColor = this.commentButtonColor || ""; } - static deleteAnnotationElement(editor) { - const fakeEditor = new FakeEditor({ - id: editor.parent.getNextId(), - parent: editor.parent, - uiManager: editor._uiManager - }); - fakeEditor.annotationElementId = editor.annotationElementId; - fakeEditor.deleted = true; - fakeEditor._uiManager.addToAnnotationStorage(fakeEditor); + get commentButtonColor() { + const { + color, + opacity + } = this.#firstElement.commentData; + if (!color) { + return null; + } + return this.#parent._commentManager.makeCommentColor(color, opacity); } - static initialize(l10n, _uiManager, options) { - AnnotationEditor._l10nPromise ||= new Map(["pdfjs-editor-alt-text-button-label", "pdfjs-editor-alt-text-edit-button-label", "pdfjs-editor-alt-text-decorative-tooltip", "pdfjs-editor-resizer-label-topLeft", "pdfjs-editor-resizer-label-topMiddle", "pdfjs-editor-resizer-label-topRight", "pdfjs-editor-resizer-label-middleRight", "pdfjs-editor-resizer-label-bottomRight", "pdfjs-editor-resizer-label-bottomMiddle", "pdfjs-editor-resizer-label-bottomLeft", "pdfjs-editor-resizer-label-middleLeft"].map(str => [str, l10n.get(str.replaceAll(/([A-Z])/g, c => `-${c.toLowerCase()}`))])); - if (options?.strings) { - for (const str of options.strings) { - AnnotationEditor._l10nPromise.set(str, l10n.get(str)); - } + focusCommentButton() { + setTimeout(() => { + this.#commentButton?.focus(); + }, 0); + } + getData() { + const { + richText, + color, + opacity, + creationDate, + modificationDate + } = this.#firstElement.commentData; + return { + contentsObj: { + str: this.comment + }, + richText, + color, + opacity, + creationDate, + modificationDate + }; + } + get elementBeforePopup() { + return this.#commentButton; + } + get comment() { + this.#commentText ||= this.#firstElement.commentText; + return this.#commentText; + } + set comment(text) { + if (text === this.comment) { + return; } - if (AnnotationEditor._borderLineWidth !== -1) { + this.#firstElement.commentText = this.#commentText = text; + } + focus() { + this.#firstElement.container?.focus(); + } + get parentBoundingClientRect() { + return this.#firstElement.layer.getBoundingClientRect(); + } + setCommentButtonStates({ + selected, + hasPopup + }) { + if (!this.#commentButton) { return; } - const style = getComputedStyle(document.documentElement); - AnnotationEditor._borderLineWidth = parseFloat(style.getPropertyValue("--outline-width")) || 0; + this.#commentButton.classList.toggle("selected", selected); + this.#commentButton.ariaExpanded = hasPopup; } - static updateDefaultParams(_type, _value) {} - static get defaultPropertiesToUpdate() { - return []; + setSelectedCommentButton(selected) { + this.#commentButton.classList.toggle("selected", selected); } - static isHandlingMimeForPasting(mime) { - return false; + get commentPopupPosition() { + if (this.#popupPosition) { + return this.#popupPosition; + } + const { + x, + y, + height + } = this.#commentButton.getBoundingClientRect(); + const { + x: parentX, + y: parentY, + width: parentWidth, + height: parentHeight + } = this.#firstElement.layer.getBoundingClientRect(); + return [(x - parentX) / parentWidth, (y + height - parentY) / parentHeight]; } - static paste(item, parent) { - (0,util.unreachable)("Not implemented"); + set commentPopupPosition(pos) { + this.#popupPosition = pos; } - get propertiesToUpdate() { - return []; + hasDefaultPopupPosition() { + return this.#popupPosition === null; } - get _isDraggable() { - return this.#isDraggable; + get commentButtonPosition() { + return this.#commentButtonPosition; } - set _isDraggable(value) { - this.#isDraggable = value; - this.div?.classList.toggle("draggable", value); + get commentButtonWidth() { + return this.#commentButton.getBoundingClientRect().width / this.parentBoundingClientRect.width; } - get isEnterHandled() { - return true; + editComment(options) { + const [posX, posY] = this.#popupPosition || this.commentButtonPosition.map(x => x / 100); + const parentDimensions = this.parentBoundingClientRect; + const { + x: parentX, + y: parentY, + width: parentWidth, + height: parentHeight + } = parentDimensions; + this.#commentManager.showDialog(null, this, parentX + posX * parentWidth, parentY + posY * parentHeight, { + ...options, + parentDimensions + }); } - center() { - const [pageWidth, pageHeight] = this.pageDimensions; - switch (this.parentRotation) { - case 90: - this.x -= this.height * pageHeight / (pageWidth * 2); - this.y += this.width * pageWidth / (pageHeight * 2); - break; - case 180: - this.x += this.width / 2; - this.y += this.height / 2; - break; - case 270: - this.x += this.height * pageHeight / (pageWidth * 2); - this.y -= this.width * pageWidth / (pageHeight * 2); - break; - default: - this.x -= this.width / 2; - this.y -= this.height / 2; - break; + render() { + if (this.#popup) { + return; } - this.fixAndSetPosition(); - } - addCommands(params) { - this._uiManager.addCommands(params); + const popup = this.#popup = document.createElement("div"); + popup.className = "popup"; + if (this.#color) { + const baseColor = popup.style.outlineColor = Util.makeHexColor(...this.#color); + popup.style.backgroundColor = `color-mix(in srgb, ${baseColor} 30%, white)`; + } + const header = document.createElement("span"); + header.className = "header"; + if (this.#titleObj?.str) { + const title = document.createElement("span"); + title.className = "title"; + header.append(title); + ({ + dir: title.dir, + str: title.textContent + } = this.#titleObj); + } + popup.append(header); + if (this.#dateObj) { + const modificationDate = document.createElement("time"); + modificationDate.className = "popupDate"; + modificationDate.setAttribute("data-l10n-id", "pdfjs-annotation-date-time-string"); + modificationDate.setAttribute("data-l10n-args", JSON.stringify({ + dateObj: this.#dateObj.valueOf() + })); + modificationDate.dateTime = this.#dateObj.toISOString(); + header.append(modificationDate); + } + renderRichText({ + html: this.#html || this.#contentsObj.str, + dir: this.#contentsObj?.dir, + className: "popupContent" + }, popup); + this.#container.append(popup); } - get currentLayer() { - return this._uiManager.currentLayer; + get #html() { + const richText = this.#richText; + const contentsObj = this.#contentsObj; + if (richText?.str && (!contentsObj?.str || contentsObj.str === richText.str)) { + return this.#richText.html || null; + } + return null; } - setInBackground() { - this.div.style.zIndex = 0; + get #fontSize() { + return this.#html?.attributes?.style?.fontSize || 0; } - setInForeground() { - this.div.style.zIndex = this.#zIndex; + get #fontColor() { + return this.#html?.attributes?.style?.color || null; } - setParent(parent) { - if (parent !== null) { - this.pageIndex = parent.pageIndex; - this.pageDimensions = parent.pageDimensions; - } else { - this.#stopResizing(); + #makePopupContent(text) { + const popupLines = []; + const popupContent = { + str: text, + html: { + name: "div", + attributes: { + dir: "auto" + }, + children: [{ + name: "p", + children: popupLines + }] + } + }; + const lineAttributes = { + style: { + color: this.#fontColor, + fontSize: this.#fontSize ? `calc(${this.#fontSize}px * var(--total-scale-factor))` : "" + } + }; + for (const line of text.split("\n")) { + popupLines.push({ + name: "span", + value: line, + attributes: lineAttributes + }); } - this.parent = parent; + return popupContent; } - focusin(event) { - if (!this._focusEventsAllowed) { + #keyDown(event) { + if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) { return; } - if (!this.#hasBeenClicked) { - this.parent.setSelected(this); - } else { - this.#hasBeenClicked = false; + if (event.key === "Enter" || event.key === "Escape" && this.#pinned) { + this.#toggle(); } } - focusout(event) { - if (!this._focusEventsAllowed) { + updateEdited({ + rect, + popup, + deleted + }) { + if (this.#commentManager) { + if (deleted) { + this.remove(); + this.#commentText = null; + } else if (popup) { + if (popup.deleted) { + this.remove(); + } else { + this.#updateColor(); + this.#commentText = popup.text; + } + } + if (rect) { + this.#commentButtonPosition = null; + this.#setCommentButtonPosition(); + this.#updateCommentButtonPosition(); + } return; } - if (!this.isAttachedToDOM) { + if (deleted || popup?.deleted) { + this.remove(); return; } - const target = event.relatedTarget; - if (target?.closest(`#${this.id}`)) { + this.#addEventListeners(); + this.#updates ||= { + contentsObj: this.#contentsObj, + richText: this.#richText + }; + if (rect) { + this.#position = null; + } + if (popup && popup.text) { + this.#richText = this.#makePopupContent(popup.text); + this.#dateObj = PDFDateString.toDateObject(popup.date); + this.#contentsObj = null; + } + this.#popup?.remove(); + this.#popup = null; + } + resetEdited() { + if (!this.#updates) { return; } - event.preventDefault(); - if (!this.parent?.isMultipleSelection) { - this.commitOrRemove(); + ({ + contentsObj: this.#contentsObj, + richText: this.#richText + } = this.#updates); + this.#updates = null; + this.#popup?.remove(); + this.#popup = null; + this.#position = null; + } + remove() { + this.#popupAbortController?.abort(); + this.#popupAbortController = null; + this.#popup?.remove(); + this.#popup = null; + this.#wasVisible = false; + this.#pinned = false; + this.#commentButton?.remove(); + this.#commentButton = null; + if (this.trigger) { + for (const element of this.trigger) { + element.classList.remove("popupTriggerArea"); + } } } - commitOrRemove() { - if (this.isEmpty()) { - this.remove(); + #setPosition() { + if (this.#position !== null) { + return; + } + const { + page: { + view + }, + viewport: { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } + } = this.#parent; + let useParentRect = !!this.#parentRect; + let rect = useParentRect ? this.#parentRect : this.#rect; + for (const element of this.#elements) { + if (!rect || Util.intersect(element.data.rect, rect) !== null) { + rect = element.data.rect; + useParentRect = true; + break; + } + } + const normalizedRect = Util.normalizeRect([rect[0], view[3] - rect[1] + view[1], rect[2], view[3] - rect[3] + view[1]]); + const HORIZONTAL_SPACE_AFTER_ANNOTATION = 5; + const parentWidth = useParentRect ? rect[2] - rect[0] + HORIZONTAL_SPACE_AFTER_ANNOTATION : 0; + const popupLeft = normalizedRect[0] + parentWidth; + const popupTop = normalizedRect[1]; + this.#position = [100 * (popupLeft - pageX) / pageWidth, 100 * (popupTop - pageY) / pageHeight]; + const { + style + } = this.#container; + style.left = `${this.#position[0]}%`; + style.top = `${this.#position[1]}%`; + } + #toggle() { + if (this.#commentManager) { + this.#commentManager.toggleCommentPopup(this, false); + return; + } + this.#pinned = !this.#pinned; + if (this.#pinned) { + this.#show(); + this.#container.addEventListener("click", this.#boundToggle); + this.#container.addEventListener("keydown", this.#boundKeyDown); } else { - this.commit(); + this.#hide(); + this.#container.removeEventListener("click", this.#boundToggle); + this.#container.removeEventListener("keydown", this.#boundKeyDown); } } - commit() { - this.addToAnnotationStorage(); + #show() { + if (!this.#popup) { + this.render(); + } + if (!this.isVisible) { + this.#setPosition(); + this.#container.hidden = false; + this.#container.style.zIndex = parseInt(this.#container.style.zIndex, 10) + 1000; + } else if (this.#pinned) { + this.#container.classList.add("focused"); + } } - addToAnnotationStorage() { - this._uiManager.addToAnnotationStorage(this); + #hide() { + this.#container.classList.remove("focused"); + if (this.#pinned || !this.isVisible) { + return; + } + this.#container.hidden = true; + this.#container.style.zIndex = parseInt(this.#container.style.zIndex, 10) - 1000; } - setAt(x, y, tx, ty) { - const [width, height] = this.parentDimensions; - [tx, ty] = this.screenToPageTranslation(tx, ty); - this.x = (x + tx) / width; - this.y = (y + ty) / height; - this.fixAndSetPosition(); + forceHide() { + this.#wasVisible = this.isVisible; + if (!this.#wasVisible) { + return; + } + this.#container.hidden = true; } - #translate([width, height], x, y) { - [x, y] = this.screenToPageTranslation(x, y); - this.x += x / width; - this.y += y / height; - this.fixAndSetPosition(); + maybeShow() { + if (this.#commentManager) { + return; + } + this.#addEventListeners(); + if (!this.#wasVisible) { + return; + } + if (!this.#popup) { + this.#show(); + } + this.#wasVisible = false; + this.#container.hidden = false; } - translate(x, y) { - this.#translate(this.parentDimensions, x, y); + get isVisible() { + if (this.#commentManager) { + return false; + } + return this.#container.hidden === false; } - translateInPage(x, y) { - this.#initialPosition ||= [this.x, this.y]; - this.#translate(this.pageDimensions, x, y); - this.div.scrollIntoView({ - block: "nearest" +} +class FreeTextAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true }); + this.textContent = parameters.data.textContent; + this.textPosition = parameters.data.textPosition; + this.annotationEditorType = AnnotationEditorType.FREETEXT; } - drag(tx, ty) { - this.#initialPosition ||= [this.x, this.y]; - const [parentWidth, parentHeight] = this.parentDimensions; - this.x += tx / parentWidth; - this.y += ty / parentHeight; - if (this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) { - const { - x, - y - } = this.div.getBoundingClientRect(); - if (this.parent.findNewParent(this, x, y)) { - this.x -= Math.floor(this.x); - this.y -= Math.floor(this.y); + render() { + this.container.classList.add("freeTextAnnotation"); + if (this.textContent) { + const content = this.contentElement = document.createElement("div"); + content.classList.add("annotationTextContent"); + content.setAttribute("role", "comment"); + for (const line of this.textContent) { + const lineSpan = document.createElement("span"); + lineSpan.textContent = line; + content.append(lineSpan); } + this.container.append(content); } - let { - x, - y - } = this; - const [bx, by] = this.getBaseTranslation(); - x += bx; - y += by; - this.div.style.left = `${(100 * x).toFixed(2)}%`; - this.div.style.top = `${(100 * y).toFixed(2)}%`; - this.div.scrollIntoView({ - block: "nearest" - }); + if (!this.data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); + } + this._editOnDoubleClick(); + return this.container; } - get _hasBeenMoved() { - return !!this.#initialPosition && (this.#initialPosition[0] !== this.x || this.#initialPosition[1] !== this.y); +} +class LineAnnotationElement extends AnnotationElement { + #line = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); } - getBaseTranslation() { - const [parentWidth, parentHeight] = this.parentDimensions; + render() { + this.container.classList.add("lineAnnotation"); const { - _borderLineWidth - } = AnnotationEditor; - const x = _borderLineWidth / parentWidth; - const y = _borderLineWidth / parentHeight; - switch (this.rotation) { - case 90: - return [-x, y]; - case 180: - return [x, y]; - case 270: - return [x, -y]; - default: - return [-x, -y]; + data, + width, + height + } = this; + const svg = this.svgFactory.create(width, height, true); + const line = this.#line = this.svgFactory.createElement("svg:line"); + line.setAttribute("x1", data.rect[2] - data.lineCoordinates[0]); + line.setAttribute("y1", data.rect[3] - data.lineCoordinates[1]); + line.setAttribute("x2", data.rect[2] - data.lineCoordinates[2]); + line.setAttribute("y2", data.rect[3] - data.lineCoordinates[3]); + line.setAttribute("stroke-width", data.borderStyle.width || 1); + line.setAttribute("stroke", "transparent"); + line.setAttribute("fill", "transparent"); + svg.append(line); + this.container.append(svg); + if (!data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); } + return this.container; } - get _mustFixPosition() { - return true; + getElementsToTriggerPopup() { + return this.#line; } - fixAndSetPosition(rotation = this.rotation) { - const [pageWidth, pageHeight] = this.pageDimensions; - let { - x, - y, + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class SquareAnnotationElement extends AnnotationElement { + #square = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("squareAnnotation"); + const { + data, width, height } = this; - width *= pageWidth; - height *= pageHeight; - x *= pageWidth; - y *= pageHeight; - if (this._mustFixPosition) { - switch (rotation) { - case 0: - x = Math.max(0, Math.min(pageWidth - width, x)); - y = Math.max(0, Math.min(pageHeight - height, y)); - break; - case 90: - x = Math.max(0, Math.min(pageWidth - height, x)); - y = Math.min(pageHeight, Math.max(width, y)); - break; - case 180: - x = Math.min(pageWidth, Math.max(width, x)); - y = Math.min(pageHeight, Math.max(height, y)); - break; - case 270: - x = Math.min(pageWidth, Math.max(height, x)); - y = Math.max(0, Math.min(pageHeight - width, y)); - break; - } + const svg = this.svgFactory.create(width, height, true); + const borderWidth = data.borderStyle.width; + const square = this.#square = this.svgFactory.createElement("svg:rect"); + square.setAttribute("x", borderWidth / 2); + square.setAttribute("y", borderWidth / 2); + square.setAttribute("width", width - borderWidth); + square.setAttribute("height", height - borderWidth); + square.setAttribute("stroke-width", borderWidth || 1); + square.setAttribute("stroke", "transparent"); + square.setAttribute("fill", "transparent"); + svg.append(square); + this.container.append(svg); + if (!data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); } - this.x = x /= pageWidth; - this.y = y /= pageHeight; - const [bx, by] = this.getBaseTranslation(); - x += bx; - y += by; + return this.container; + } + getElementsToTriggerPopup() { + return this.#square; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class CircleAnnotationElement extends AnnotationElement { + #circle = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("circleAnnotation"); const { - style - } = this.div; - style.left = `${(100 * x).toFixed(2)}%`; - style.top = `${(100 * y).toFixed(2)}%`; - this.moveInDOM(); + data, + width, + height + } = this; + const svg = this.svgFactory.create(width, height, true); + const borderWidth = data.borderStyle.width; + const circle = this.#circle = this.svgFactory.createElement("svg:ellipse"); + circle.setAttribute("cx", width / 2); + circle.setAttribute("cy", height / 2); + circle.setAttribute("rx", width / 2 - borderWidth / 2); + circle.setAttribute("ry", height / 2 - borderWidth / 2); + circle.setAttribute("stroke-width", borderWidth || 1); + circle.setAttribute("stroke", "transparent"); + circle.setAttribute("fill", "transparent"); + svg.append(circle); + this.container.append(svg); + if (!data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); + } + return this.container; } - static #rotatePoint(x, y, angle) { - switch (angle) { - case 90: - return [y, -x]; - case 180: - return [-x, -y]; - case 270: - return [-y, x]; - default: - return [x, y]; + getElementsToTriggerPopup() { + return this.#circle; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class PolylineAnnotationElement extends AnnotationElement { + #polyline = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.containerClassName = "polylineAnnotation"; + this.svgElementName = "svg:polyline"; + } + render() { + this.container.classList.add(this.containerClassName); + const { + data: { + rect, + vertices, + borderStyle, + popupRef + }, + width, + height + } = this; + if (!vertices) { + return this.container; + } + const svg = this.svgFactory.create(width, height, true); + let points = []; + for (let i = 0, ii = vertices.length; i < ii; i += 2) { + const x = vertices[i] - rect[0]; + const y = rect[3] - vertices[i + 1]; + points.push(`${x},${y}`); + } + points = points.join(" "); + const polyline = this.#polyline = this.svgFactory.createElement(this.svgElementName); + polyline.setAttribute("points", points); + polyline.setAttribute("stroke-width", borderStyle.width || 1); + polyline.setAttribute("stroke", "transparent"); + polyline.setAttribute("fill", "transparent"); + svg.append(polyline); + this.container.append(svg); + if (!popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); } + return this.container; } - screenToPageTranslation(x, y) { - return AnnotationEditor.#rotatePoint(x, y, this.parentRotation); + getElementsToTriggerPopup() { + return this.#polyline; } - pageTranslationToScreen(x, y) { - return AnnotationEditor.#rotatePoint(x, y, 360 - this.parentRotation); + addHighlightArea() { + this.container.classList.add("highlightArea"); } - #getRotationMatrix(rotation) { +} +class PolygonAnnotationElement extends PolylineAnnotationElement { + constructor(parameters) { + super(parameters); + this.containerClassName = "polygonAnnotation"; + this.svgElementName = "svg:polygon"; + } +} +class CaretAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("caretAnnotation"); + if (!this.data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); + } + return this.container; + } +} +class InkAnnotationElement extends AnnotationElement { + #polylinesGroupElement = null; + #polylines = []; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.containerClassName = "inkAnnotation"; + this.svgElementName = "svg:polyline"; + this.annotationEditorType = this.data.it === "InkHighlight" ? AnnotationEditorType.HIGHLIGHT : AnnotationEditorType.INK; + } + #getTransform(rotation, rect) { switch (rotation) { case 90: - { - const [pageWidth, pageHeight] = this.pageDimensions; - return [0, -pageWidth / pageHeight, pageHeight / pageWidth, 0]; - } + return { + transform: `rotate(90) translate(${-rect[0]},${rect[1]}) scale(1,-1)`, + width: rect[3] - rect[1], + height: rect[2] - rect[0] + }; case 180: - return [-1, 0, 0, -1]; + return { + transform: `rotate(180) translate(${-rect[2]},${rect[1]}) scale(1,-1)`, + width: rect[2] - rect[0], + height: rect[3] - rect[1] + }; case 270: - { - const [pageWidth, pageHeight] = this.pageDimensions; - return [0, pageWidth / pageHeight, -pageHeight / pageWidth, 0]; - } + return { + transform: `rotate(270) translate(${-rect[2]},${rect[3]}) scale(1,-1)`, + width: rect[3] - rect[1], + height: rect[2] - rect[0] + }; default: - return [1, 0, 0, 1]; + return { + transform: `translate(${-rect[0]},${rect[3]}) scale(1,-1)`, + width: rect[2] - rect[0], + height: rect[3] - rect[1] + }; } } - get parentScale() { - return this._uiManager.viewParameters.realScale; - } - get parentRotation() { - return (this._uiManager.viewParameters.rotation + this.pageRotation) % 360; - } - get parentDimensions() { + render() { + this.container.classList.add(this.containerClassName); const { - parentScale, - pageDimensions: [pageWidth, pageHeight] + data: { + rect, + rotation, + inkLists, + borderStyle, + popupRef + } } = this; - const scaledWidth = pageWidth * parentScale; - const scaledHeight = pageHeight * parentScale; - return util.FeatureTest.isCSSRoundSupported ? [Math.round(scaledWidth), Math.round(scaledHeight)] : [scaledWidth, scaledHeight]; - } - setDims(width, height) { - const [parentWidth, parentHeight] = this.parentDimensions; - this.div.style.width = `${(100 * width / parentWidth).toFixed(2)}%`; - if (!this.#keepAspectRatio) { - this.div.style.height = `${(100 * height / parentHeight).toFixed(2)}%`; + const { + transform, + width, + height + } = this.#getTransform(rotation, rect); + const svg = this.svgFactory.create(width, height, true); + const g = this.#polylinesGroupElement = this.svgFactory.createElement("svg:g"); + svg.append(g); + g.setAttribute("stroke-width", borderStyle.width || 1); + g.setAttribute("stroke-linecap", "round"); + g.setAttribute("stroke-linejoin", "round"); + g.setAttribute("stroke-miterlimit", 10); + g.setAttribute("stroke", "transparent"); + g.setAttribute("fill", "transparent"); + g.setAttribute("transform", transform); + for (let i = 0, ii = inkLists.length; i < ii; i++) { + const polyline = this.svgFactory.createElement(this.svgElementName); + this.#polylines.push(polyline); + polyline.setAttribute("points", inkLists[i].join(",")); + g.append(polyline); + } + if (!popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); } + this.container.append(svg); + this._editOnDoubleClick(); + return this.container; } - fixDims() { + updateEdited(params) { + super.updateEdited(params); const { - style - } = this.div; - const { - height, - width - } = style; - const widthPercent = width.endsWith("%"); - const heightPercent = !this.#keepAspectRatio && height.endsWith("%"); - if (widthPercent && heightPercent) { - return; + thickness, + points, + rect + } = params; + const g = this.#polylinesGroupElement; + if (thickness >= 0) { + g.setAttribute("stroke-width", thickness || 1); } - const [parentWidth, parentHeight] = this.parentDimensions; - if (!widthPercent) { - style.width = `${(100 * parseFloat(width) / parentWidth).toFixed(2)}%`; + if (points) { + for (let i = 0, ii = this.#polylines.length; i < ii; i++) { + this.#polylines[i].setAttribute("points", points[i].join(",")); + } } - if (!this.#keepAspectRatio && !heightPercent) { - style.height = `${(100 * parseFloat(height) / parentHeight).toFixed(2)}%`; + if (rect) { + const { + transform, + width, + height + } = this.#getTransform(this.data.rotation, rect); + const root = g.parentElement; + root.setAttribute("viewBox", `0 0 ${width} ${height}`); + g.setAttribute("transform", transform); } } - getInitialTranslation() { - return [0, 0]; + getElementsToTriggerPopup() { + return this.#polylines; } - #createResizers() { - if (this.#resizersDiv) { - return; + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class HighlightAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + this.annotationEditorType = AnnotationEditorType.HIGHLIGHT; + } + render() { + const { + data: { + overlaidText, + popupRef + } + } = this; + if (!popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); } - this.#resizersDiv = document.createElement("div"); - this.#resizersDiv.classList.add("resizers"); - const classes = this._willKeepAspectRatio ? ["topLeft", "topRight", "bottomRight", "bottomLeft"] : ["topLeft", "topMiddle", "topRight", "middleRight", "bottomRight", "bottomMiddle", "bottomLeft", "middleLeft"]; - for (const name of classes) { - const div = document.createElement("div"); - this.#resizersDiv.append(div); - div.classList.add("resizer", name); - div.setAttribute("data-resizer-name", name); - div.addEventListener("pointerdown", this.#resizerPointerdown.bind(this, name)); - div.addEventListener("contextmenu", display_utils.noContextMenu); - div.tabIndex = -1; + this.container.classList.add("highlightAnnotation"); + this._editOnDoubleClick(); + if (overlaidText) { + const mark = document.createElement("mark"); + mark.classList.add("overlaidText"); + mark.textContent = overlaidText; + this.container.append(mark); } - this.div.prepend(this.#resizersDiv); + return this.container; } - #resizerPointerdown(name, event) { - event.preventDefault(); +} +class UnderlineAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { const { - isMac - } = util.FeatureTest.platform; - if (event.button !== 0 || event.ctrlKey && isMac) { - return; + data: { + overlaidText, + popupRef + } + } = this; + if (!popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); } - this.#altText?.toggle(false); - const boundResizerPointermove = this.#resizerPointermove.bind(this, name); - const savedDraggable = this._isDraggable; - this._isDraggable = false; - const pointerMoveOptions = { - passive: true, - capture: true - }; - this.parent.togglePointerEvents(false); - window.addEventListener("pointermove", boundResizerPointermove, pointerMoveOptions); - const savedX = this.x; - const savedY = this.y; - const savedWidth = this.width; - const savedHeight = this.height; - const savedParentCursor = this.parent.div.style.cursor; - const savedCursor = this.div.style.cursor; - this.div.style.cursor = this.parent.div.style.cursor = window.getComputedStyle(event.target).cursor; - const pointerUpCallback = () => { - this.parent.togglePointerEvents(true); - this.#altText?.toggle(true); - this._isDraggable = savedDraggable; - window.removeEventListener("pointerup", pointerUpCallback); - window.removeEventListener("blur", pointerUpCallback); - window.removeEventListener("pointermove", boundResizerPointermove, pointerMoveOptions); - this.parent.div.style.cursor = savedParentCursor; - this.div.style.cursor = savedCursor; - this.#addResizeToUndoStack(savedX, savedY, savedWidth, savedHeight); - }; - window.addEventListener("pointerup", pointerUpCallback); - window.addEventListener("blur", pointerUpCallback); - } - #addResizeToUndoStack(savedX, savedY, savedWidth, savedHeight) { - const newX = this.x; - const newY = this.y; - const newWidth = this.width; - const newHeight = this.height; - if (newX === savedX && newY === savedY && newWidth === savedWidth && newHeight === savedHeight) { - return; + this.container.classList.add("underlineAnnotation"); + if (overlaidText) { + const underline = document.createElement("u"); + underline.classList.add("overlaidText"); + underline.textContent = overlaidText; + this.container.append(underline); } - this.addCommands({ - cmd: () => { - this.width = newWidth; - this.height = newHeight; - this.x = newX; - this.y = newY; - const [parentWidth, parentHeight] = this.parentDimensions; - this.setDims(parentWidth * newWidth, parentHeight * newHeight); - this.fixAndSetPosition(); - }, - undo: () => { - this.width = savedWidth; - this.height = savedHeight; - this.x = savedX; - this.y = savedY; - const [parentWidth, parentHeight] = this.parentDimensions; - this.setDims(parentWidth * savedWidth, parentHeight * savedHeight); - this.fixAndSetPosition(); - }, - mustExec: true + return this.container; + } +} +class SquigglyAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true }); } - #resizerPointermove(name, event) { - const [parentWidth, parentHeight] = this.parentDimensions; - const savedX = this.x; - const savedY = this.y; - const savedWidth = this.width; - const savedHeight = this.height; - const minWidth = AnnotationEditor.MIN_SIZE / parentWidth; - const minHeight = AnnotationEditor.MIN_SIZE / parentHeight; - const round = x => Math.round(x * 10000) / 10000; - const rotationMatrix = this.#getRotationMatrix(this.rotation); - const transf = (x, y) => [rotationMatrix[0] * x + rotationMatrix[2] * y, rotationMatrix[1] * x + rotationMatrix[3] * y]; - const invRotationMatrix = this.#getRotationMatrix(360 - this.rotation); - const invTransf = (x, y) => [invRotationMatrix[0] * x + invRotationMatrix[2] * y, invRotationMatrix[1] * x + invRotationMatrix[3] * y]; - let getPoint; - let getOpposite; - let isDiagonal = false; - let isHorizontal = false; - switch (name) { - case "topLeft": - isDiagonal = true; - getPoint = (w, h) => [0, 0]; - getOpposite = (w, h) => [w, h]; - break; - case "topMiddle": - getPoint = (w, h) => [w / 2, 0]; - getOpposite = (w, h) => [w / 2, h]; - break; - case "topRight": - isDiagonal = true; - getPoint = (w, h) => [w, 0]; - getOpposite = (w, h) => [0, h]; - break; - case "middleRight": - isHorizontal = true; - getPoint = (w, h) => [w, h / 2]; - getOpposite = (w, h) => [0, h / 2]; - break; - case "bottomRight": - isDiagonal = true; - getPoint = (w, h) => [w, h]; - getOpposite = (w, h) => [0, 0]; - break; - case "bottomMiddle": - getPoint = (w, h) => [w / 2, h]; - getOpposite = (w, h) => [w / 2, 0]; - break; - case "bottomLeft": - isDiagonal = true; - getPoint = (w, h) => [0, h]; - getOpposite = (w, h) => [w, 0]; - break; - case "middleLeft": - isHorizontal = true; - getPoint = (w, h) => [0, h / 2]; - getOpposite = (w, h) => [w, h / 2]; - break; + render() { + const { + data: { + overlaidText, + popupRef + } + } = this; + if (!popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); } - const point = getPoint(savedWidth, savedHeight); - const oppositePoint = getOpposite(savedWidth, savedHeight); - let transfOppositePoint = transf(...oppositePoint); - const oppositeX = round(savedX + transfOppositePoint[0]); - const oppositeY = round(savedY + transfOppositePoint[1]); - let ratioX = 1; - let ratioY = 1; - let [deltaX, deltaY] = this.screenToPageTranslation(event.movementX, event.movementY); - [deltaX, deltaY] = invTransf(deltaX / parentWidth, deltaY / parentHeight); - if (isDiagonal) { - const oldDiag = Math.hypot(savedWidth, savedHeight); - ratioX = ratioY = Math.max(Math.min(Math.hypot(oppositePoint[0] - point[0] - deltaX, oppositePoint[1] - point[1] - deltaY) / oldDiag, 1 / savedWidth, 1 / savedHeight), minWidth / savedWidth, minHeight / savedHeight); - } else if (isHorizontal) { - ratioX = Math.max(minWidth, Math.min(1, Math.abs(oppositePoint[0] - point[0] - deltaX))) / savedWidth; - } else { - ratioY = Math.max(minHeight, Math.min(1, Math.abs(oppositePoint[1] - point[1] - deltaY))) / savedHeight; + this.container.classList.add("squigglyAnnotation"); + if (overlaidText) { + const underline = document.createElement("u"); + underline.classList.add("overlaidText"); + underline.textContent = overlaidText; + this.container.append(underline); } - const newWidth = round(savedWidth * ratioX); - const newHeight = round(savedHeight * ratioY); - transfOppositePoint = transf(...getOpposite(newWidth, newHeight)); - const newX = oppositeX - transfOppositePoint[0]; - const newY = oppositeY - transfOppositePoint[1]; - this.width = newWidth; - this.height = newHeight; - this.x = newX; - this.y = newY; - this.setDims(parentWidth * newWidth, parentHeight * newHeight); - this.fixAndSetPosition(); + return this.container; } - altTextFinish() { - this.#altText?.finish(); +} +class StrikeOutAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); } - async addEditToolbar() { - if (this.#editToolbar || this.#isInEditMode) { - return this.#editToolbar; + render() { + const { + data: { + overlaidText, + popupRef + } + } = this; + if (!popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); } - this.#editToolbar = new toolbar.EditorToolbar(this); - this.div.append(this.#editToolbar.render()); - if (this.#altText) { - this.#editToolbar.addAltTextButton(await this.#altText.render()); + this.container.classList.add("strikeoutAnnotation"); + if (overlaidText) { + const strikeout = document.createElement("s"); + strikeout.classList.add("overlaidText"); + strikeout.textContent = overlaidText; + this.container.append(strikeout); } - return this.#editToolbar; + return this.container; } - removeEditToolbar() { - if (!this.#editToolbar) { - return; +} +class StampAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.annotationEditorType = AnnotationEditorType.STAMP; + } + render() { + this.container.classList.add("stampAnnotation"); + this.container.setAttribute("role", "img"); + if (!this.data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); } - this.#editToolbar.remove(); - this.#editToolbar = null; - this.#altText?.destroy(); + this._editOnDoubleClick(); + return this.container; } - getClientDimensions() { - return this.div.getBoundingClientRect(); +} +class FileAttachmentAnnotationElement extends AnnotationElement { + #trigger = null; + constructor(parameters) { + super(parameters, { + isRenderable: true + }); + const { + fileId, + file + } = this.data; + this.filename = file.filename; + this.content = file.content; + this.fileId = fileId; + this.linkService.eventBus?.dispatch("fileattachmentannotation", { + source: this, + attachmentId: this.fileId, + ...file + }); } - async addAltTextButton() { - if (this.#altText) { - return; + render() { + this.container.classList.add("fileAttachmentAnnotation"); + const { + container, + data + } = this; + let trigger; + if (data.hasAppearance || data.fillAlpha === 0) { + trigger = document.createElement("div"); + } else { + trigger = document.createElement("img"); + trigger.src = `${this.imageResourcesPath}annotation-${/paperclip/i.test(data.name) ? "paperclip" : "pushpin"}.svg`; + if (data.fillAlpha && data.fillAlpha < 1) { + trigger.style = `filter: opacity(${Math.round(data.fillAlpha * 100)}%);`; + } + } + trigger.addEventListener("dblclick", this.#download.bind(this)); + this.#trigger = trigger; + const { + isMac + } = FeatureTest.platform; + container.addEventListener("keydown", evt => { + if (evt.key === "Enter" && (isMac ? evt.metaKey : evt.ctrlKey)) { + this.#download(); + } + }); + if (!data.popupRef && this.hasPopupData) { + this.hasOwnCommentButton = true; + this._createPopup(); + } else { + trigger.classList.add("popupTriggerArea"); } - AltText.initialize(AnnotationEditor._l10nPromise); - this.#altText = new AltText(this); - await this.addEditToolbar(); + container.append(trigger); + return container; } - get altTextData() { - return this.#altText?.data; + getElementsToTriggerPopup() { + return this.#trigger; } - set altTextData(data) { - if (!this.#altText) { - return; + addHighlightArea() { + this.container.classList.add("highlightArea"); + } + async #download() { + const { + fileId, + filename, + content: fallbackContent + } = this; + const content = (await this.linkService.getAttachmentContent(fileId)) || fallbackContent; + if (content) { + this.downloadManager?.openOrDownloadData(content, filename); } - this.#altText.data = data; } - hasAltText() { - return !this.#altText?.isEmpty(); +} +class MediaAnnotationElement extends AnnotationElement { + #abortController = new AbortController(); + #contentUrl = null; + #media = null; + constructor(parameters) { + super(parameters, { + isRenderable: !!parameters.data.richMedia + }); } render() { - this.div = document.createElement("div"); - this.div.setAttribute("data-editor-rotation", (360 - this.rotation) % 360); - this.div.className = this.name; - this.div.setAttribute("id", this.id); - this.div.tabIndex = this.#disabled ? -1 : 0; - if (!this._isVisible) { - this.div.classList.add("hidden"); - } - this.setInForeground(); - this.div.addEventListener("focusin", this.#boundFocusin); - this.div.addEventListener("focusout", this.#boundFocusout); - const [parentWidth, parentHeight] = this.parentDimensions; - if (this.parentRotation % 180 !== 0) { - this.div.style.maxWidth = `${(100 * parentHeight / parentWidth).toFixed(2)}%`; - this.div.style.maxHeight = `${(100 * parentWidth / parentHeight).toFixed(2)}%`; - } - const [tx, ty] = this.getInitialTranslation(); - this.translate(tx, ty); - (0,tools.bindEvents)(this, this.div, ["pointerdown"]); - return this.div; + this.container.classList.add("mediaAnnotation"); + const { + filename + } = this.data.richMedia; + const button = document.createElement("button"); + button.className = "mediaPlayButton"; + button.type = "button"; + button.title = button.ariaLabel = filename; + button.addEventListener("click", () => this.#load(button), { + signal: this.#abortController.signal + }); + this.container.append(button); + return this.container; } - pointerdown(event) { + async #load(button) { const { - isMac - } = util.FeatureTest.platform; - if (event.button !== 0 || event.ctrlKey && isMac) { - event.preventDefault(); + fileId, + filename, + contentType + } = this.data.richMedia; + button.disabled = true; + let content; + try { + content = await this.linkService.getAttachmentContent(fileId); + } catch { return; + } finally { + button.disabled = false; } - this.#hasBeenClicked = true; - if (this._isDraggable) { - this.#setUpDragSession(event); + if (!content || !button.isConnected) { return; } - this.#selectOnPointerEvent(event); - } - #selectOnPointerEvent(event) { const { - isMac - } = util.FeatureTest.platform; - if (event.ctrlKey && !isMac || event.shiftKey || event.metaKey && isMac) { - this.parent.toggleSelected(this); - } else { - this.parent.setSelected(this); - } - } - #setUpDragSession(event) { - const isSelected = this._uiManager.isSelected(this); - this._uiManager.setUpDragSession(); - let pointerMoveOptions, pointerMoveCallback; - if (isSelected) { - this.div.classList.add("moving"); - pointerMoveOptions = { - passive: true, - capture: true - }; - this.#prevDragX = event.clientX; - this.#prevDragY = event.clientY; - pointerMoveCallback = e => { - const { - clientX: x, - clientY: y - } = e; - const [tx, ty] = this.screenToPageTranslation(x - this.#prevDragX, y - this.#prevDragY); - this.#prevDragX = x; - this.#prevDragY = y; - this._uiManager.dragSelectedEditors(tx, ty); + signal + } = this.#abortController; + const url = URL.createObjectURL(new Blob([content], { + type: contentType + })); + this.#contentUrl = url; + const isAudio = contentType.startsWith("audio/"); + const media = document.createElement(isAudio ? "audio" : "video"); + this.#media = media; + media.className = "mediaContent"; + this._setBackgroundColor(media); + media.src = url; + media.title = filename; + media.controls = true; + media.autoplay = true; + media.tabIndex = 0; + if (isAudio) { + let hovered = false; + let focused = false; + const updateControls = () => { + media.controls = hovered || focused; }; - window.addEventListener("pointermove", pointerMoveCallback, pointerMoveOptions); - } - const pointerUpCallback = () => { - window.removeEventListener("pointerup", pointerUpCallback); - window.removeEventListener("blur", pointerUpCallback); - if (isSelected) { - this.div.classList.remove("moving"); - window.removeEventListener("pointermove", pointerMoveCallback, pointerMoveOptions); - } - this.#hasBeenClicked = false; - if (!this._uiManager.endDragSession()) { - this.#selectOnPointerEvent(event); - } - }; - window.addEventListener("pointerup", pointerUpCallback); - window.addEventListener("blur", pointerUpCallback); - } - moveInDOM() { - if (this.#moveInDOMTimeout) { - clearTimeout(this.#moveInDOMTimeout); + this.container.addEventListener("pointerenter", () => { + hovered = true; + updateControls(); + }, { + signal + }); + this.container.addEventListener("pointerleave", () => { + hovered = false; + updateControls(); + }, { + signal + }); + this.container.addEventListener("focusin", () => { + focused = true; + updateControls(); + }, { + signal + }); + this.container.addEventListener("focusout", () => { + focused = false; + updateControls(); + }, { + signal + }); } - this.#moveInDOMTimeout = setTimeout(() => { - this.#moveInDOMTimeout = null; - this.parent?.moveEditorInDOM(this); - }, 0); - } - _setParentAndPosition(parent, x, y) { - parent.changeParent(this); - this.x = x; - this.y = y; - this.fixAndSetPosition(); - } - getRect(tx, ty, rotation = this.rotation) { - const scale = this.parentScale; - const [pageWidth, pageHeight] = this.pageDimensions; - const [pageX, pageY] = this.pageTranslation; - const shiftX = tx / scale; - const shiftY = ty / scale; - const x = this.x * pageWidth; - const y = this.y * pageHeight; - const width = this.width * pageWidth; - const height = this.height * pageHeight; - switch (rotation) { - case 0: - return [x + shiftX + pageX, pageHeight - y - shiftY - height + pageY, x + shiftX + width + pageX, pageHeight - y - shiftY + pageY]; - case 90: - return [x + shiftY + pageX, pageHeight - y + shiftX + pageY, x + shiftY + height + pageX, pageHeight - y + shiftX + width + pageY]; - case 180: - return [x - shiftX - width + pageX, pageHeight - y + shiftY + pageY, x - shiftX + pageX, pageHeight - y + shiftY + height + pageY]; - case 270: - return [x - shiftY - height + pageX, pageHeight - y - shiftX - width + pageY, x - shiftY + pageX, pageHeight - y - shiftX + pageY]; - default: - throw new Error("Invalid rotation"); + media.addEventListener("emptied", () => this.#revokeContentUrl(url), { + once: true, + signal + }); + button.replaceWith(media); + media.play().catch(() => {}); + } + #revokeContentUrl(url = this.#contentUrl) { + if (url && url === this.#contentUrl) { + URL.revokeObjectURL(url); + this.#contentUrl = null; } } - getRectInCurrentCoords(rect, pageHeight) { - const [x1, y1, x2, y2] = rect; - const width = x2 - x1; - const height = y2 - y1; - switch (this.rotation) { - case 0: - return [x1, pageHeight - y2, width, height]; - case 90: - return [x1, pageHeight - y1, height, width]; - case 180: - return [x2, pageHeight - y1, width, height]; - case 270: - return [x2, pageHeight - y2, height, width]; - default: - throw new Error("Invalid rotation"); + destroy() { + this.#abortController.abort(); + if (this.#media) { + this.#media.pause(); + this.#media.removeAttribute("src"); + this.#media.load(); + this.#media = null; } + this.#revokeContentUrl(); } - onceAdded() {} - isEmpty() { - return false; - } - enableEditMode() { - this.#isInEditMode = true; - } - disableEditMode() { - this.#isInEditMode = false; - } - isInEditMode() { - return this.#isInEditMode; - } - shouldGetKeyboardEvents() { - return this.#isResizerEnabledForKeyboard; - } - needsToBeRebuilt() { - return this.div && !this.isAttachedToDOM; - } - rebuild() { - this.div?.addEventListener("focusin", this.#boundFocusin); - this.div?.addEventListener("focusout", this.#boundFocusout); +} +class AnnotationLayer { + #accessibilityManager = null; + #annotationCanvasMap = null; + #annotationStorage = null; + #editableAnnotations = new Map(); + #structTreeLayer = null; + #linkService = null; + #elements = []; + #hasAriaAttributesFromStructTree = false; + zIndex = 0; + constructor({ + div, + accessibilityManager, + annotationCanvasMap, + annotationEditorUIManager, + page, + viewport, + structTreeLayer, + commentManager, + linkService, + annotationStorage + }) { + this.div = div; + this.#accessibilityManager = accessibilityManager; + this.#annotationCanvasMap = annotationCanvasMap; + this.#structTreeLayer = structTreeLayer || null; + this.#linkService = linkService || null; + this.#annotationStorage = annotationStorage || new AnnotationStorage(); + this.page = page; + this.viewport = viewport; + this._annotationEditorUIManager = annotationEditorUIManager; + this._commentManager = commentManager || null; } - rotate(_angle) {} - serialize(isForCopying = false, context = null) { - (0,util.unreachable)("An editor must be serializable"); + hasEditableAnnotations() { + return this.#editableAnnotations.size > 0; } - static deserialize(data, parent, uiManager) { - const editor = new this.prototype.constructor({ - parent, - id: parent.getNextId(), - uiManager - }); - editor.rotation = data.rotation; - const [pageWidth, pageHeight] = editor.pageDimensions; - const [x, y, width, height] = editor.getRectInCurrentCoords(data.rect, pageHeight); - editor.x = x / pageWidth; - editor.y = y / pageHeight; - editor.width = width / pageWidth; - editor.height = height / pageHeight; - return editor; + async render(params) { + const { + annotations, + optionalContentConfig + } = params; + const layer = this.div; + setLayerDimensions(layer, this.viewport); + const popupToElements = new Map(); + const popupAnnotations = []; + const elementParams = { + data: null, + layer, + linkService: this.#linkService, + downloadManager: params.downloadManager, + imageResourcesPath: params.imageResourcesPath || "", + renderForms: params.renderForms !== false, + svgFactory: new DOMSVGFactory(), + annotationStorage: this.#annotationStorage, + enableComment: params.enableComment === true, + enableScripting: params.enableScripting === true, + hasJSActions: params.hasJSActions, + fieldObjects: params.fieldObjects, + parent: this, + elements: null + }; + for (const data of annotations) { + if (data.noHTML) { + continue; + } + const isPopupAnnotation = data.annotationType === AnnotationType.POPUP; + if (!isPopupAnnotation) { + if (data.rect[2] === data.rect[0] || data.rect[3] === data.rect[1]) { + continue; + } + } else { + const elements = popupToElements.get(data.id); + if (!elements) { + continue; + } + if (!this._commentManager) { + popupAnnotations.push(data); + continue; + } + elementParams.elements = elements; + } + elementParams.data = data; + const element = AnnotationElementFactory.create(elementParams); + if (!element.isRenderable) { + continue; + } + if (!isPopupAnnotation) { + this.#elements.push(element); + if (data.popupRef) { + popupToElements.getOrInsertComputed(data.popupRef, makeArr).push(element); + } + } + const rendered = element.render(); + if (data.hidden) { + rendered.style.visibility = "hidden"; + } + element.updateOC(optionalContentConfig); + if (element._isEditable) { + this.#editableAnnotations.set(element.data.id, element); + this._annotationEditorUIManager?.renderAnnotationElement(element); + } + } + await this.#addElementsToDOM(); + for (const data of popupAnnotations) { + const elements = elementParams.elements = popupToElements.get(data.id); + elementParams.data = data; + const element = AnnotationElementFactory.create(elementParams); + if (!element.isRenderable) { + continue; + } + const rendered = element.render(); + element.contentElement.id = `${AnnotationPrefix}${data.id}`; + if (data.hidden) { + rendered.style.visibility = "hidden"; + } + elements.at(-1).container.after(rendered); + } + this.#setAnnotationCanvasMap(); } - remove() { - this.div.removeEventListener("focusin", this.#boundFocusin); - this.div.removeEventListener("focusout", this.#boundFocusout); - if (!this.isEmpty()) { - this.commit(); + async #addElementsToDOM() { + if (this.#elements.length === 0) { + return; } - if (this.parent) { - this.parent.remove(this); - } else { - this._uiManager.removeEditor(this); + this.div.replaceChildren(); + const promises = []; + if (!this.#hasAriaAttributesFromStructTree) { + this.#hasAriaAttributesFromStructTree = true; + for (const { + contentElement, + data: { + id + } + } of this.#elements) { + const annotationId = contentElement.id = `${AnnotationPrefix}${id}`; + promises.push(this.#structTreeLayer?.getAriaAttributes(annotationId).then(ariaAttributes => { + if (ariaAttributes) { + for (const [key, value] of ariaAttributes) { + contentElement.setAttribute(key, value); + } + } + })); + } } - if (this.#moveInDOMTimeout) { - clearTimeout(this.#moveInDOMTimeout); - this.#moveInDOMTimeout = null; + this.#elements.sort(({ + data: { + rect: [a0, a1, a2, a3] + } + }, { + data: { + rect: [b0, b1, b2, b3] + } + }) => { + if (a0 === a2 && a1 === a3) { + return +1; + } + if (b0 === b2 && b1 === b3) { + return -1; + } + const top1 = a3; + const bot1 = a1; + const mid1 = (a1 + a3) / 2; + const top2 = b3; + const bot2 = b1; + const mid2 = (b1 + b3) / 2; + if (mid1 >= top2 && mid2 <= bot1) { + return -1; + } + if (mid2 >= top1 && mid1 <= bot2) { + return +1; + } + const centerX1 = (a0 + a2) / 2; + const centerX2 = (b0 + b2) / 2; + return centerX1 - centerX2; + }); + const fragment = document.createDocumentFragment(); + for (const element of this.#elements) { + fragment.append(element.container); + if (this._commentManager) { + (element.extraPopupElement?.popup || element.popup)?.renderCommentButton(); + } else if (element.extraPopupElement) { + fragment.append(element.extraPopupElement.render()); + } } - this.#stopResizing(); - this.removeEditToolbar(); - if (this.#telemetryTimeouts) { - for (const timeout of this.#telemetryTimeouts.values()) { - clearTimeout(timeout); + this.div.append(fragment); + await Promise.all(promises); + if (this.#accessibilityManager) { + for (const element of this.#elements) { + this.#accessibilityManager.addPointerInTextLayer(element.contentElement, false); } - this.#telemetryTimeouts = null; } - this.parent = null; } - get isResizable() { - return false; + async addLinkAnnotations(annotations) { + const elementParams = { + data: null, + layer: this.div, + linkService: this.#linkService, + svgFactory: new DOMSVGFactory(), + parent: this + }; + for (const data of annotations) { + data.borderStyle ||= AnnotationLayer._defaultBorderStyle; + elementParams.data = data; + const element = AnnotationElementFactory.create(elementParams); + if (!element.isRenderable) { + continue; + } + element.render(); + element.contentElement.id = `${AnnotationPrefix}${data.id}`; + this.#elements.push(element); + } + await this.#addElementsToDOM(); } - makeResizable() { - if (this.isResizable) { - this.#createResizers(); - this.#resizersDiv.classList.remove("hidden"); - (0,tools.bindEvents)(this, this.div, ["keydown"]); + update({ + viewport, + optionalContentConfig + }) { + const layer = this.div; + this.viewport = viewport; + setLayerDimensions(layer, { + rotation: viewport.rotation + }); + for (const element of this.#elements) { + element.updateOC(optionalContentConfig); } + this.#setAnnotationCanvasMap(); + layer.hidden = false; } - get toolbarPosition() { - return null; + destroy() { + for (const element of this.#elements) { + element.destroy?.(); + this.#accessibilityManager?.removePointerInTextLayer(element.contentElement); + } + this.#elements.length = 0; + this.#editableAnnotations.clear(); + this.div.replaceChildren(); } - keydown(event) { - if (!this.isResizable || event.target !== this.div || event.key !== "Enter") { + #setAnnotationCanvasMap() { + if (!this.#annotationCanvasMap) { return; } - this._uiManager.setSelected(this); - this.#savedDimensions = { - savedX: this.x, - savedY: this.y, - savedWidth: this.width, - savedHeight: this.height - }; - const children = this.#resizersDiv.children; - if (!this.#allResizerDivs) { - this.#allResizerDivs = Array.from(children); - const boundResizerKeydown = this.#resizerKeydown.bind(this); - const boundResizerBlur = this.#resizerBlur.bind(this); - for (const div of this.#allResizerDivs) { - const name = div.getAttribute("data-resizer-name"); - div.setAttribute("role", "spinbutton"); - div.addEventListener("keydown", boundResizerKeydown); - div.addEventListener("blur", boundResizerBlur); - div.addEventListener("focus", this.#resizerFocus.bind(this, name)); - AnnotationEditor._l10nPromise.get(`pdfjs-editor-resizer-label-${name}`).then(msg => div.setAttribute("aria-label", msg)); + const layer = this.div; + for (const [id, canvas] of this.#annotationCanvasMap) { + const element = layer.querySelector(`[data-annotation-id="${id}"]`); + if (!element) { + continue; } - } - const first = this.#allResizerDivs[0]; - let firstPosition = 0; - for (const div of children) { - if (div === first) { - break; + if (Array.isArray(canvas)) { + for (const cvs of canvas) { + cvs.className = "annotationContent"; + cvs.ariaHidden = true; + } + } else { + canvas.className = "annotationContent"; + canvas.ariaHidden = true; } - firstPosition++; - } - const nextFirstPosition = (360 - this.rotation + this.parentRotation) % 360 / 90 * (this.#allResizerDivs.length / 4); - if (nextFirstPosition !== firstPosition) { - if (nextFirstPosition < firstPosition) { - for (let i = 0; i < firstPosition - nextFirstPosition; i++) { - this.#resizersDiv.append(this.#resizersDiv.firstChild); + const toRemove = []; + for (const child of element.children) { + if (child.nodeName === "CANVAS") { + toRemove.push(child); } - } else if (nextFirstPosition > firstPosition) { - for (let i = 0; i < nextFirstPosition - firstPosition; i++) { - this.#resizersDiv.firstChild.before(this.#resizersDiv.lastChild); + } + for (const child of toRemove) { + child.remove(); + } + const firstCanvas = Array.isArray(canvas) ? canvas[0] : canvas; + const { + firstChild + } = element; + if (!firstChild) { + element.append(firstCanvas); + } else if (!firstChild.classList.contains("annotationContent")) { + firstChild.before(firstCanvas); + } else { + firstChild.after(firstCanvas); + } + if (Array.isArray(canvas)) { + let lastCanvas = firstCanvas; + for (let i = 1, ii = canvas.length; i < ii; i++) { + lastCanvas.after(canvas[i]); + lastCanvas = canvas[i]; } } - let i = 0; - for (const child of children) { - const div = this.#allResizerDivs[i++]; - const name = div.getAttribute("data-resizer-name"); - AnnotationEditor._l10nPromise.get(`pdfjs-editor-resizer-label-${name}`).then(msg => child.setAttribute("aria-label", msg)); + this.#annotationCanvasMap.delete(id); + const editableAnnotation = this.#editableAnnotations.get(id); + if (!editableAnnotation) { + continue; + } + if (editableAnnotation._hasNoCanvas) { + this._annotationEditorUIManager?.setMissingCanvas(id, element.id, canvas); + editableAnnotation._hasNoCanvas = false; + } else { + editableAnnotation.canvas = canvas; } } - this.#setResizerTabIndex(0); - this.#isResizerEnabledForKeyboard = true; - this.#resizersDiv.firstChild.focus({ - focusVisible: true - }); - event.preventDefault(); - event.stopImmediatePropagation(); } - #resizerKeydown(event) { - AnnotationEditor._resizerKeyboardManager.exec(this, event); + refreshCanvases() { + this.#setAnnotationCanvasMap(); } - #resizerBlur(event) { - if (this.#isResizerEnabledForKeyboard && event.relatedTarget?.parentNode !== this.#resizersDiv) { - this.#stopResizing(); - } + getEditableAnnotations() { + return this.#editableAnnotations.values(); } - #resizerFocus(name) { - this.#focusedResizerName = this.#isResizerEnabledForKeyboard ? name : ""; + getEditableAnnotation(id) { + return this.#editableAnnotations.get(id); } - #setResizerTabIndex(value) { - if (!this.#allResizerDivs) { + addFakeAnnotation(editor) { + const { + div + } = this; + const { + id, + rotation + } = editor; + const element = new EditorAnnotationElement({ + data: { + id, + rect: editor.getPDFRect(), + rotation + }, + editor, + layer: div, + parent: this, + enableComment: !!this._commentManager, + linkService: this.#linkService, + annotationStorage: this.#annotationStorage + }); + element.render(); + element.contentElement.id = `${AnnotationPrefix}${id}`; + element.createOrUpdatePopup(); + this.#elements.push(element); + return element; + } + removeAnnotation(id) { + const index = this.#elements.findIndex(el => el.data.id === id); + if (index < 0) { return; } - for (const div of this.#allResizerDivs) { - div.tabIndex = value; - } + const [element] = this.#elements.splice(index, 1); + this.#accessibilityManager?.removePointerInTextLayer(element.contentElement); } - _resizeWithKeyboard(x, y) { - if (!this.#isResizerEnabledForKeyboard) { + updateFakeAnnotations(editors) { + if (editors.length === 0) { return; } - this.#resizerPointermove(this.#focusedResizerName, { - movementX: x, - movementY: y - }); + for (const editor of editors) { + editor.updateFakeAnnotationElement(this); + } + this.#addElementsToDOM(); } - #stopResizing() { - this.#isResizerEnabledForKeyboard = false; - this.#setResizerTabIndex(-1); - if (this.#savedDimensions) { - const { - savedX, - savedY, - savedWidth, - savedHeight - } = this.#savedDimensions; - this.#addResizeToUndoStack(savedX, savedY, savedWidth, savedHeight); - this.#savedDimensions = null; + togglePointerEvents(enabled = false) { + this.div.classList.toggle("disabled", !enabled); + } + static get _defaultBorderStyle() { + return shadow(this, "_defaultBorderStyle", Object.freeze({ + width: 1, + rawWidth: 1, + style: AnnotationBorderStyleType.SOLID, + dashArray: [3], + horizontalCornerRadius: 0, + verticalCornerRadius: 0 + })); + } +} + +;// ./src/display/editor/freetext.js + + + + + +const EOL_PATTERN = /\r\n?|\n/g; +class FreeTextEditor extends AnnotationEditor { + #content = ""; + #editorDivId = `${this.id}-editor`; + #editModeAC = null; + #fontSize; + _colorPicker = null; + static _freeTextDefaultContent = ""; + static _internalPadding = 0; + static _defaultColor = null; + static _defaultFontSize = 10; + static get _keyboardManager() { + const proto = FreeTextEditor.prototype; + const arrowChecker = self => self.isEmpty(); + const small = AnnotationEditorUIManager.TRANSLATE_SMALL; + const big = AnnotationEditorUIManager.TRANSLATE_BIG; + return shadow(this, "_keyboardManager", new KeyboardManager([[["ctrl+s", "mac+meta+s", "ctrl+p", "mac+meta+p"], proto.commitOrRemove, { + bubbles: true + }], [["ctrl+Enter", "mac+meta+Enter"], proto.commitOrRemove], [["Escape"], proto.commitOrRemove], [["ArrowLeft"], proto._translateEmpty, { + args: [-small, 0], + checker: arrowChecker + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto._translateEmpty, { + args: [-big, 0], + checker: arrowChecker + }], [["ArrowRight"], proto._translateEmpty, { + args: [small, 0], + checker: arrowChecker + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto._translateEmpty, { + args: [big, 0], + checker: arrowChecker + }], [["ArrowUp"], proto._translateEmpty, { + args: [0, -small], + checker: arrowChecker + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto._translateEmpty, { + args: [0, -big], + checker: arrowChecker + }], [["ArrowDown"], proto._translateEmpty, { + args: [0, small], + checker: arrowChecker + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto._translateEmpty, { + args: [0, big], + checker: arrowChecker + }]])); + } + static _type = "freetext"; + static _editorType = AnnotationEditorType.FREETEXT; + constructor(params) { + super({ + ...params, + name: "freeTextEditor" + }); + this.color = params.color || FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor; + this.#fontSize = params.fontSize || FreeTextEditor._defaultFontSize; + if (!this.annotationElementId) { + this._uiManager.a11yAlert(AnnotationEditor._l10nAlert.freetext); } + this.canAddComment = false; } - _stopResizingWithKeyboard() { - this.#stopResizing(); - this.div.focus(); + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + const style = getComputedStyle(document.documentElement); + this._internalPadding = parseFloat(style.getPropertyValue("--freetext-padding")); } - select() { - this.makeResizable(); - this.div?.classList.add("selectedEditor"); - if (!this.#editToolbar) { - this.addEditToolbar().then(() => { - if (this.div?.classList.contains("selectedEditor")) { - this.#editToolbar?.show(); - } - }); - return; + static updateDefaultParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.FREETEXT_SIZE: + FreeTextEditor._defaultFontSize = value; + break; + case AnnotationEditorParamsType.FREETEXT_COLOR: + FreeTextEditor._defaultColor = value; + break; } - this.#editToolbar?.show(); } - unselect() { - this.#resizersDiv?.classList.add("hidden"); - this.div?.classList.remove("selectedEditor"); - if (this.div?.contains(document.activeElement)) { - this._uiManager.currentLayer.div.focus({ - preventScroll: true - }); + updateParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.FREETEXT_SIZE: + this.#updateFontSize(value); + break; + case AnnotationEditorParamsType.FREETEXT_COLOR: + this.#updateColor(value); + break; } - this.#editToolbar?.hide(); } - updateParams(type, value) {} - disableEditing() {} - enableEditing() {} - enterInEditMode() {} - getImageForAltText() { - return null; + static get defaultPropertiesToUpdate() { + return [[AnnotationEditorParamsType.FREETEXT_SIZE, FreeTextEditor._defaultFontSize], [AnnotationEditorParamsType.FREETEXT_COLOR, FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor]]; } - get contentDiv() { - return this.div; + get propertiesToUpdate() { + return [[AnnotationEditorParamsType.FREETEXT_SIZE, this.#fontSize], [AnnotationEditorParamsType.FREETEXT_COLOR, this.color]]; } - get isEditing() { - return this.#isEditing; + get toolbarButtons() { + this._colorPicker ||= new BasicColorPicker(this); + return [["colorPicker", this._colorPicker]]; } - set isEditing(value) { - this.#isEditing = value; + get colorType() { + return AnnotationEditorParamsType.FREETEXT_COLOR; + } + #updateFontSize(fontSize) { + const setFontsize = size => { + this.editorDiv.style.fontSize = `calc(${size}px * var(--total-scale-factor))`; + this.translate(0, -(size - this.#fontSize) * this.parentScale); + this.#fontSize = size; + this.#setEditorDimensions(); + }; + const savedFontsize = this.#fontSize; + this.addCommands({ + cmd: setFontsize.bind(this, fontSize), + undo: setFontsize.bind(this, savedFontsize), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.FREETEXT_SIZE, + overwriteIfSameType: true, + keepUndo: true + }); + } + onUpdatedColor() { + this.editorDiv.style.color = this.color; + this._colorPicker?.update(this.color); + super.onUpdatedColor(); + } + #updateColor(color) { + const setColor = col => { + this.color = col; + this.onUpdatedColor(); + }; + const savedColor = this.color; + this.addCommands({ + cmd: setColor.bind(this, color), + undo: setColor.bind(this, savedColor), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.FREETEXT_COLOR, + overwriteIfSameType: true, + keepUndo: true + }); + } + _translateEmpty(x, y) { + this._uiManager.translateSelectedEditors(x, y, true); + } + getInitialTranslation() { + const scale = this.parentScale; + return [-FreeTextEditor._internalPadding * scale, -(FreeTextEditor._internalPadding + this.#fontSize) * scale]; + } + rebuild() { if (!this.parent) { return; } - if (value) { - this.parent.setSelected(this); - this.parent.setActiveEditor(this); - } else { - this.parent.setActiveEditor(null); + super.rebuild(); + if (this.div === null) { + return; + } + if (!this.isAttachedToDOM) { + this.parent.add(this); } } - setAspectRatio(width, height) { - this.#keepAspectRatio = true; - const aspectRatio = width / height; - const { - style - } = this.div; - style.aspectRatio = aspectRatio; - style.height = "auto"; - } - static get MIN_SIZE() { - return 16; + enableEditMode() { + if (!super.enableEditMode()) { + return false; + } + this.overlayDiv.classList.remove("enabled"); + this.editorDiv.contentEditable = true; + this._isDraggable = false; + this.div.removeAttribute("aria-activedescendant"); + this.#editModeAC = new AbortController(); + const signal = this._uiManager.combinedSignal(this.#editModeAC); + this.editorDiv.addEventListener("keydown", this.editorDivKeydown.bind(this), { + signal + }); + this.editorDiv.addEventListener("focus", this.editorDivFocus.bind(this), { + signal + }); + this.editorDiv.addEventListener("blur", this.editorDivBlur.bind(this), { + signal + }); + this.editorDiv.addEventListener("input", this.editorDivInput.bind(this), { + signal + }); + this.editorDiv.addEventListener("paste", this.editorDivPaste.bind(this), { + signal + }); + return true; } - static canCreateNewEmptyEditor() { + disableEditMode() { + if (!super.disableEditMode()) { + return false; + } + this.overlayDiv.classList.add("enabled"); + this.editorDiv.contentEditable = false; + this.div.setAttribute("aria-activedescendant", this.#editorDivId); + this._isDraggable = true; + this.#editModeAC?.abort(); + this.#editModeAC = null; + this.div.focus({ + preventScroll: true + }); + this.isEditing = false; + this.parent.div.classList.add("freetextEditing"); return true; } - get telemetryInitialData() { - return { - action: "added" - }; + focusin(event) { + if (!this._focusEventsAllowed) { + return; + } + super.focusin(event); + if (event.target !== this.editorDiv) { + this.editorDiv.focus(); + } } - get telemetryFinalData() { - return null; + onceAdded(focus) { + if (this.width) { + return; + } + this.enableEditMode(); + if (focus) { + this.editorDiv.focus(); + } + if (this._initialOptions?.isCentered) { + this.center(); + } + this._initialOptions = null; } - _reportTelemetry(data, mustWait = false) { - if (mustWait) { - this.#telemetryTimeouts ||= new Map(); - const { - action - } = data; - let timeout = this.#telemetryTimeouts.get(action); - if (timeout) { - clearTimeout(timeout); + isEmpty() { + return !this.editorDiv || this.editorDiv.innerText.trim() === ""; + } + remove() { + this.isEditing = false; + if (this.parent) { + this.parent.setEditingState(true); + this.parent.div.classList.add("freetextEditing"); + } + super.remove(); + } + #extractText() { + const buffer = []; + this.editorDiv.normalize(); + let prevChild = null; + for (const child of this.editorDiv.childNodes) { + if (prevChild?.nodeType === Node.TEXT_NODE && child.nodeName === "BR") { + continue; } - timeout = setTimeout(() => { - this._reportTelemetry(data); - this.#telemetryTimeouts.delete(action); - if (this.#telemetryTimeouts.size === 0) { - this.#telemetryTimeouts = null; - } - }, AnnotationEditor._telemetryTimeout); - this.#telemetryTimeouts.set(action, timeout); + buffer.push(FreeTextEditor.#getNodeContent(child)); + prevChild = child; + } + return buffer.join("\n"); + } + #setEditorDimensions() { + const [parentWidth, parentHeight] = this.parentDimensions; + let rect; + if (this.isAttachedToDOM) { + rect = this.div.getBoundingClientRect(); + } else { + const { + currentLayer, + div + } = this; + const savedDisplay = div.style.display; + const savedVisibility = div.classList.contains("hidden"); + div.classList.remove("hidden"); + div.style.display = "hidden"; + currentLayer.div.append(this.div); + rect = div.getBoundingClientRect(); + div.remove(); + div.style.display = savedDisplay; + div.classList.toggle("hidden", savedVisibility); + } + if (this.rotation % 180 === this.parentRotation % 180) { + this.width = rect.width / parentWidth; + this.height = rect.height / parentHeight; + } else { + this.width = rect.height / parentWidth; + this.height = rect.width / parentHeight; + } + this.fixAndSetPosition(); + } + commit() { + if (!this.isInEditMode()) { return; } - data.type ||= this.editorType; - this._uiManager._eventBus.dispatch("reporttelemetry", { - source: this, - details: { - type: "editing", - data + super.commit(); + this.disableEditMode(); + const savedText = this.#content; + const newText = this.#content = this.#extractText().trimEnd(); + if (savedText === newText) { + return; + } + const setText = text => { + this.#content = text; + if (!text) { + this.remove(); + return; } + this.#setContent(); + this._uiManager.rebuild(this); + this.#setEditorDimensions(); + }; + this.addCommands({ + cmd: () => { + setText(newText); + }, + undo: () => { + setText(savedText); + }, + mustExec: false }); + this.#setEditorDimensions(); } - show(visible = this._isVisible) { - this.div.classList.toggle("hidden", !visible); - this._isVisible = visible; + shouldGetKeyboardEvents() { + return this.isInEditMode(); } - enable() { - if (this.div) { - this.div.tabIndex = 0; - } - this.#disabled = false; + enterInEditMode() { + this.enableEditMode(); + this.editorDiv.focus(); } - disable() { - if (this.div) { - this.div.tabIndex = -1; + keydown(event) { + if (event.target === this.div && event.key === "Enter") { + this.enterInEditMode(); + event.preventDefault(); } - this.#disabled = true; } -} -class FakeEditor extends AnnotationEditor { - constructor(params) { - super(params); - this.annotationElementId = params.annotationElementId; - this.deleted = true; + editorDivKeydown(event) { + FreeTextEditor._keyboardManager.exec(this, event); } - serialize() { - return { - id: this.annotationElementId, - deleted: true, - pageIndex: this.pageIndex - }; + editorDivFocus(event) { + this.isEditing = true; } -} - - -/***/ }), - -/***/ 61: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ FreeOutliner: () => (/* binding */ FreeOutliner), -/* harmony export */ Outliner: () => (/* binding */ Outliner) -/* harmony export */ }); -/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(292); - -class Outliner { - #box; - #verticalEdges = []; - #intervals = []; - constructor(boxes, borderWidth = 0, innerMargin = 0, isLTR = true) { - let minX = Infinity; - let maxX = -Infinity; - let minY = Infinity; - let maxY = -Infinity; - const NUMBER_OF_DIGITS = 4; - const EPSILON = 10 ** -NUMBER_OF_DIGITS; - for (const { - x, - y, - width, - height - } of boxes) { - const x1 = Math.floor((x - borderWidth) / EPSILON) * EPSILON; - const x2 = Math.ceil((x + width + borderWidth) / EPSILON) * EPSILON; - const y1 = Math.floor((y - borderWidth) / EPSILON) * EPSILON; - const y2 = Math.ceil((y + height + borderWidth) / EPSILON) * EPSILON; - const left = [x1, y1, y2, true]; - const right = [x2, y1, y2, false]; - this.#verticalEdges.push(left, right); - minX = Math.min(minX, x1); - maxX = Math.max(maxX, x2); - minY = Math.min(minY, y1); - maxY = Math.max(maxY, y2); - } - const bboxWidth = maxX - minX + 2 * innerMargin; - const bboxHeight = maxY - minY + 2 * innerMargin; - const shiftedMinX = minX - innerMargin; - const shiftedMinY = minY - innerMargin; - const lastEdge = this.#verticalEdges.at(isLTR ? -1 : -2); - const lastPoint = [lastEdge[0], lastEdge[2]]; - for (const edge of this.#verticalEdges) { - const [x, y1, y2] = edge; - edge[0] = (x - shiftedMinX) / bboxWidth; - edge[1] = (y1 - shiftedMinY) / bboxHeight; - edge[2] = (y2 - shiftedMinY) / bboxHeight; - } - this.#box = { - x: shiftedMinX, - y: shiftedMinY, - width: bboxWidth, - height: bboxHeight, - lastPoint - }; + editorDivBlur(event) { + this.isEditing = false; } - getOutlines() { - this.#verticalEdges.sort((a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2]); - const outlineVerticalEdges = []; - for (const edge of this.#verticalEdges) { - if (edge[3]) { - outlineVerticalEdges.push(...this.#breakEdge(edge)); - this.#insert(edge); + editorDivInput(event) { + this.parent.div.classList.toggle("freetextEditing", this.isEmpty()); + } + disableEditing() { + this.editorDiv.setAttribute("role", "comment"); + this.editorDiv.removeAttribute("aria-multiline"); + } + enableEditing() { + this.editorDiv.setAttribute("role", "textbox"); + this.editorDiv.setAttribute("aria-multiline", true); + } + get canChangeContent() { + return true; + } + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + if (this._isCopy || this.annotationElementId) { + baseX = this.x; + baseY = this.y; + } + super.render(); + this.editorDiv = document.createElement("div"); + this.editorDiv.className = "internal"; + this.editorDiv.setAttribute("id", this.#editorDivId); + this.editorDiv.setAttribute("data-l10n-id", "pdfjs-free-text2"); + this.editorDiv.setAttribute("data-l10n-attrs", "default-content"); + this.enableEditing(); + this.editorDiv.contentEditable = true; + const { + style + } = this.editorDiv; + style.fontSize = `calc(${this.#fontSize}px * var(--total-scale-factor))`; + style.color = this.color; + this.div.append(this.editorDiv); + this.overlayDiv = document.createElement("div"); + this.overlayDiv.classList.add("overlay", "enabled"); + this.div.append(this.overlayDiv); + if (this._isCopy || this.annotationElementId) { + const [parentWidth, parentHeight] = this.parentDimensions; + if (this.annotationElementId) { + const { + position + } = this._initialData; + let [tx, ty] = this.getInitialTranslation(); + [tx, ty] = this.pageTranslationToScreen(tx, ty); + const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; + let posX, posY; + switch (this.rotation) { + case 0: + posX = baseX + (position[0] - pageX) / pageWidth; + posY = baseY + this.height - (position[1] - pageY) / pageHeight; + break; + case 90: + posX = baseX + (position[0] - pageX) / pageWidth; + posY = baseY - (position[1] - pageY) / pageHeight; + [tx, ty] = [ty, -tx]; + break; + case 180: + posX = baseX - this.width + (position[0] - pageX) / pageWidth; + posY = baseY - (position[1] - pageY) / pageHeight; + [tx, ty] = [-tx, -ty]; + break; + case 270: + posX = baseX + (position[0] - pageX - this.height * pageHeight) / pageWidth; + posY = baseY + (position[1] - pageY - this.width * pageWidth) / pageHeight; + [tx, ty] = [-ty, tx]; + break; + } + this.setAt(posX * parentWidth, posY * parentHeight, tx, ty); } else { - this.#remove(edge); - outlineVerticalEdges.push(...this.#breakEdge(edge)); + this._moveAfterPaste(baseX, baseY); } + this.#setContent(); + this._isDraggable = true; + this.editorDiv.contentEditable = false; + } else { + this._isDraggable = false; + this.editorDiv.contentEditable = true; } - return this.#getOutlines(outlineVerticalEdges); + return this.div; } - #getOutlines(outlineVerticalEdges) { - const edges = []; - const allEdges = new Set(); - for (const edge of outlineVerticalEdges) { - const [x, y1, y2] = edge; - edges.push([x, y1, edge], [x, y2, edge]); + static #getNodeContent(node) { + return (node.nodeType === Node.TEXT_NODE ? node.nodeValue : node.innerText).replaceAll(EOL_PATTERN, ""); + } + editorDivPaste(event) { + const clipboardData = event.clipboardData || window.clipboardData; + const { + types + } = clipboardData; + if (types.length === 1 && types[0] === "text/plain") { + return; } - edges.sort((a, b) => a[1] - b[1] || a[0] - b[0]); - for (let i = 0, ii = edges.length; i < ii; i += 2) { - const edge1 = edges[i][2]; - const edge2 = edges[i + 1][2]; - edge1.push(edge2); - edge2.push(edge1); - allEdges.add(edge1); - allEdges.add(edge2); + event.preventDefault(); + const paste = FreeTextEditor.#deserializeContent(clipboardData.getData("text") || "").replaceAll(EOL_PATTERN, "\n"); + if (!paste) { + return; } - const outlines = []; - let outline; - while (allEdges.size > 0) { - const edge = allEdges.values().next().value; - let [x, y1, y2, edge1, edge2] = edge; - allEdges.delete(edge); - let lastPointX = x; - let lastPointY = y1; - outline = [x, y2]; - outlines.push(outline); - while (true) { - let e; - if (allEdges.has(edge1)) { - e = edge1; - } else if (allEdges.has(edge2)) { - e = edge2; - } else { - break; + const selection = window.getSelection(); + if (!selection.rangeCount) { + return; + } + this.editorDiv.normalize(); + selection.deleteFromDocument(); + const range = selection.getRangeAt(0); + if (!paste.includes("\n")) { + range.insertNode(document.createTextNode(paste)); + this.editorDiv.normalize(); + selection.collapseToStart(); + return; + } + const { + startContainer, + startOffset + } = range; + const bufferBefore = []; + const bufferAfter = []; + if (startContainer.nodeType === Node.TEXT_NODE) { + const parent = startContainer.parentElement; + bufferAfter.push(startContainer.nodeValue.slice(startOffset).replaceAll(EOL_PATTERN, "")); + if (parent !== this.editorDiv) { + let buffer = bufferBefore; + for (const child of this.editorDiv.childNodes) { + if (child === parent) { + buffer = bufferAfter; + continue; + } + buffer.push(FreeTextEditor.#getNodeContent(child)); } - allEdges.delete(e); - [x, y1, y2, edge1, edge2] = e; - if (lastPointX !== x) { - outline.push(lastPointX, lastPointY, x, lastPointY === y1 ? y1 : y2); - lastPointX = x; + } + bufferBefore.push(startContainer.nodeValue.slice(0, startOffset).replaceAll(EOL_PATTERN, "")); + } else if (startContainer === this.editorDiv) { + let buffer = bufferBefore; + let i = 0; + for (const child of this.editorDiv.childNodes) { + if (i++ === startOffset) { + buffer = bufferAfter; } - lastPointY = lastPointY === y1 ? y2 : y1; + buffer.push(FreeTextEditor.#getNodeContent(child)); } - outline.push(lastPointX, lastPointY); } - return new HighlightOutline(outlines, this.#box); - } - #binarySearch(y) { - const array = this.#intervals; - let start = 0; - let end = array.length - 1; - while (start <= end) { - const middle = start + end >> 1; - const y1 = array[middle][0]; - if (y1 === y) { - return middle; - } - if (y1 < y) { - start = middle + 1; - } else { - end = middle - 1; + this.#content = `${bufferBefore.join("\n")}${paste}${bufferAfter.join("\n")}`; + this.#setContent(); + const newRange = new Range(); + let beforeLength = Math.sumPrecise(bufferBefore.map(line => line.length)); + for (const { + firstChild + } of this.editorDiv.childNodes) { + if (firstChild.nodeType === Node.TEXT_NODE) { + const length = firstChild.nodeValue.length; + if (beforeLength <= length) { + newRange.setStart(firstChild, beforeLength); + newRange.setEnd(firstChild, beforeLength); + break; + } + beforeLength -= length; } } - return end + 1; - } - #insert([, y1, y2]) { - const index = this.#binarySearch(y1); - this.#intervals.splice(index, 0, [y1, y2]); + selection.removeAllRanges(); + selection.addRange(newRange); } - #remove([, y1, y2]) { - const index = this.#binarySearch(y1); - for (let i = index; i < this.#intervals.length; i++) { - const [start, end] = this.#intervals[i]; - if (start !== y1) { - break; - } - if (start === y1 && end === y2) { - this.#intervals.splice(i, 1); - return; - } + #setContent() { + this.editorDiv.replaceChildren(); + if (!this.#content) { + return; } - for (let i = index - 1; i >= 0; i--) { - const [start, end] = this.#intervals[i]; - if (start !== y1) { - break; - } - if (start === y1 && end === y2) { - this.#intervals.splice(i, 1); - return; - } + for (const line of this.#content.split("\n")) { + const div = document.createElement("div"); + div.append(line ? document.createTextNode(line) : document.createElement("br")); + this.editorDiv.append(div); } } - #breakEdge(edge) { - const [x, y1, y2] = edge; - const results = [[x, y1, y2]]; - const index = this.#binarySearch(y2); - for (let i = 0; i < index; i++) { - const [start, end] = this.#intervals[i]; - for (let j = 0, jj = results.length; j < jj; j++) { - const [, y3, y4] = results[j]; - if (end <= y3 || y4 <= start) { - continue; - } - if (y3 >= start) { - if (y4 > end) { - results[j][1] = end; - } else { - if (jj === 1) { - return []; - } - results.splice(j, 1); - j--; - jj--; + #serializeContent() { + return this.#content.replaceAll("\xa0", " "); + } + static #deserializeContent(content) { + return content.replaceAll(" ", "\xa0"); + } + get contentDiv() { + return this.editorDiv; + } + getPDFRect() { + const padding = FreeTextEditor._internalPadding * this.parentScale; + return this.getRect(padding, padding); + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof FreeTextAnnotationElement) { + const { + data: { + defaultAppearanceData: { + fontSize, + fontColor + }, + rect, + rotation, + id, + popupRef, + richText, + contentsObj, + creationDate, + modificationDate + }, + textContent, + textPosition, + parent: { + page: { + pageNumber } - continue; - } - results[j][2] = start; - if (y4 > end) { - results.push([x, end, y4]); } + } = data; + if (!textContent?.length) { + return null; } + initialData = data = { + annotationType: AnnotationEditorType.FREETEXT, + color: Array.from(fontColor), + fontSize, + value: textContent.join("\n"), + position: textPosition, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + annotationElementId: id, + id, + deleted: false, + popupRef, + comment: contentsObj?.str || null, + richText, + creationDate, + modificationDate + }; } - return results; + const editor = await super.deserialize(data, parent, uiManager); + editor.#fontSize = data.fontSize; + editor.color = Util.makeHexColor(...data.color); + editor.#content = FreeTextEditor.#deserializeContent(data.value); + editor._initialData = initialData; + if (data.comment) { + editor.setCommentData(data); + } + return editor; + } + serialize(isForCopying = false) { + if (this.isEmpty()) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const color = AnnotationEditor._colorManager.convert(this.isAttachedToDOM ? getComputedStyle(this.editorDiv).color : this.color); + const serialized = Object.assign(super.serialize(isForCopying), { + color, + fontSize: this.#fontSize, + value: this.#serializeContent() + }); + this.addComment(serialized); + if (isForCopying) { + serialized.isCopy = true; + return serialized; + } + if (this.annotationElementId && !this.#hasElementChanged(serialized)) { + return null; + } + serialized.id = this.annotationElementId; + return serialized; + } + #hasElementChanged(serialized) { + const { + value, + fontSize, + color, + pageIndex + } = this._initialData; + return this.hasEditedComment || this._hasBeenMoved || serialized.value !== value || serialized.fontSize !== fontSize || serialized.color.some((c, i) => c !== color[i]) || serialized.pageIndex !== pageIndex; + } + renderAnnotationElement(annotation) { + const content = super.renderAnnotationElement(annotation); + if (!content) { + return null; + } + const { + style + } = content; + style.fontSize = `calc(${this.#fontSize}px * var(--total-scale-factor))`; + style.color = this.color; + content.replaceChildren(); + for (const line of this.#content.split("\n")) { + const div = document.createElement("div"); + div.append(line ? document.createTextNode(line) : document.createElement("br")); + content.append(div); + } + annotation.updateEdited({ + rect: this.getPDFRect(), + popup: this._uiManager.hasCommentManager() || this.hasEditedComment ? this.comment : { + text: this.#content + } + }); + return content; + } + resetAnnotationElement(annotation) { + super.resetAnnotationElement(annotation); + annotation.resetEdited(); } } + +;// ./src/display/editor/drawers/outline.js + class Outline { + static PRECISION = 1e-4; toSVGPath() { - throw new Error("Abstract method `toSVGPath` must be implemented."); + unreachable("Abstract method `toSVGPath` must be implemented."); } get box() { - throw new Error("Abstract getter `box` must be implemented."); + unreachable("Abstract getter `box` must be implemented."); } serialize(_bbox, _rotation) { - throw new Error("Abstract method `serialize` must be implemented."); + unreachable("Abstract method `serialize` must be implemented."); } - get free() { - return this instanceof FreeHighlightOutline; + static _rescale(src, tx, ty, sx, sy, dest) { + dest ||= new Float32Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i] * sx; + dest[i + 1] = ty + src[i + 1] * sy; + } + return dest; } -} -class HighlightOutline extends Outline { - #box; - #outlines; - constructor(outlines, box) { - super(); - this.#outlines = outlines; - this.#box = box; + static _rescaleAndSwap(src, tx, ty, sx, sy, dest) { + dest ||= new Float32Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i + 1] * sx; + dest[i + 1] = ty + src[i] * sy; + } + return dest; } - toSVGPath() { - const buffer = []; - for (const polygon of this.#outlines) { - let [prevX, prevY] = polygon; - buffer.push(`M${prevX} ${prevY}`); - for (let i = 2; i < polygon.length; i += 2) { - const x = polygon[i]; - const y = polygon[i + 1]; - if (x === prevX) { - buffer.push(`V${y}`); - prevY = y; - } else if (y === prevY) { - buffer.push(`H${x}`); - prevX = x; - } - } - buffer.push("Z"); + static _translate(src, tx, ty, dest) { + dest ||= new Float32Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i]; + dest[i + 1] = ty + src[i + 1]; } - return buffer.join(" "); + return dest; } - serialize([blX, blY, trX, trY], _rotation) { - const outlines = []; - const width = trX - blX; - const height = trY - blY; - for (const outline of this.#outlines) { - const points = new Array(outline.length); - for (let i = 0; i < outline.length; i += 2) { - points[i] = blX + outline[i] * width; - points[i + 1] = trY - outline[i + 1] * height; - } - outlines.push(points); + static svgRound(x) { + return Math.round(x * 10000); + } + static _normalizePoint(x, y, parentWidth, parentHeight, rotation) { + switch (rotation) { + case 90: + return [1 - y / parentWidth, x / parentHeight]; + case 180: + return [1 - x / parentWidth, 1 - y / parentHeight]; + case 270: + return [y / parentWidth, 1 - x / parentHeight]; + default: + return [x / parentWidth, y / parentHeight]; } - return outlines; } - get box() { - return this.#box; + static createBezierPoints(x1, y1, x2, y2, x3, y3) { + return [(x1 + 5 * x2) / 6, (y1 + 5 * y2) / 6, (5 * x2 + x3) / 6, (5 * y2 + y3) / 6, (x2 + x3) / 2, (y2 + y3) / 2]; } } -class FreeOutliner { + +;// ./src/display/editor/drawers/freedraw.js + + +class FreeDrawOutliner { #box; #bottom = []; #innerMargin; #isLTR; #top = []; - #last = new Float64Array(18); + #last = new Float32Array(18); #lastX; #lastY; #min; @@ -13175,7 +21649,7 @@ #points = []; static #MIN_DIST = 8; static #MIN_DIFF = 2; - static #MIN = FreeOutliner.#MIN_DIST + FreeOutliner.#MIN_DIFF; + static #MIN = FreeDrawOutliner.#MIN_DIST + FreeDrawOutliner.#MIN_DIFF; constructor({ x, y @@ -13185,14 +21659,11 @@ this.#isLTR = isLTR; this.#last.set([NaN, NaN, NaN, NaN, x, y], 6); this.#innerMargin = innerMargin; - this.#min_dist = FreeOutliner.#MIN_DIST * scaleFactor; - this.#min = FreeOutliner.#MIN * scaleFactor; + this.#min_dist = FreeDrawOutliner.#MIN_DIST * scaleFactor; + this.#min = FreeDrawOutliner.#MIN * scaleFactor; this.#scaleFactor = scaleFactor; this.#points.push(x, y); } - get free() { - return true; - } isEmpty() { return isNaN(this.#last[8]); } @@ -13266,12 +21737,8 @@ } const top = this.#top; const bottom = this.#bottom; - const lastTop = this.#last.subarray(4, 6); - const lastBottom = this.#last.subarray(16, 18); - const [x, y, width, height] = this.#box; - const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); if (isNaN(this.#last[6]) && !this.isEmpty()) { - return `M${(this.#last[2] - x) / width} ${(this.#last[3] - y) / height} L${(this.#last[4] - x) / width} ${(this.#last[5] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(this.#last[16] - x) / width} ${(this.#last[17] - y) / height} L${(this.#last[14] - x) / width} ${(this.#last[15] - y) / height} Z`; + return this.#toSVGPathTwoPoints(); } const buffer = []; buffer.push(`M${top[4]} ${top[5]}`); @@ -13282,7 +21749,7 @@ buffer.push(`C${top[i]} ${top[i + 1]} ${top[i + 2]} ${top[i + 3]} ${top[i + 4]} ${top[i + 5]}`); } } - buffer.push(`L${(lastTop[0] - x) / width} ${(lastTop[1] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(lastBottom[0] - x) / width} ${(lastBottom[1] - y) / height}`); + this.#toSVGPathEnd(buffer); for (let i = bottom.length - 6; i >= 6; i -= 6) { if (isNaN(bottom[i])) { buffer.push(`L${bottom[i + 4]} ${bottom[i + 5]}`); @@ -13290,30 +21757,44 @@ buffer.push(`C${bottom[i]} ${bottom[i + 1]} ${bottom[i + 2]} ${bottom[i + 3]} ${bottom[i + 4]} ${bottom[i + 5]}`); } } - buffer.push(`L${bottom[4]} ${bottom[5]} Z`); + this.#toSVGPathStart(buffer); return buffer.join(" "); } + #toSVGPathTwoPoints() { + const [x, y, width, height] = this.#box; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + return `M${(this.#last[2] - x) / width} ${(this.#last[3] - y) / height} L${(this.#last[4] - x) / width} ${(this.#last[5] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(this.#last[16] - x) / width} ${(this.#last[17] - y) / height} L${(this.#last[14] - x) / width} ${(this.#last[15] - y) / height} Z`; + } + #toSVGPathStart(buffer) { + const bottom = this.#bottom; + buffer.push(`L${bottom[4]} ${bottom[5]} Z`); + } + #toSVGPathEnd(buffer) { + const [x, y, width, height] = this.#box; + const lastTop = this.#last.subarray(4, 6); + const lastBottom = this.#last.subarray(16, 18); + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + buffer.push(`L${(lastTop[0] - x) / width} ${(lastTop[1] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(lastBottom[0] - x) / width} ${(lastBottom[1] - y) / height}`); + } + newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) { + return new FreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR); + } getOutlines() { const top = this.#top; const bottom = this.#bottom; const last = this.#last; - const lastTop = last.subarray(4, 6); - const lastBottom = last.subarray(16, 18); const [layerX, layerY, layerWidth, layerHeight] = this.#box; - const points = new Float64Array((this.#points?.length ?? 0) + 2); + const points = new Float32Array((this.#points?.length ?? 0) + 2); for (let i = 0, ii = points.length - 2; i < ii; i += 2) { points[i] = (this.#points[i] - layerX) / layerWidth; points[i + 1] = (this.#points[i + 1] - layerY) / layerHeight; } points[points.length - 2] = (this.#lastX - layerX) / layerWidth; points[points.length - 1] = (this.#lastY - layerY) / layerHeight; - const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); if (isNaN(last[6]) && !this.isEmpty()) { - const outline = new Float64Array(36); - outline.set([NaN, NaN, NaN, NaN, (last[2] - layerX) / layerWidth, (last[3] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[4] - layerX) / layerWidth, (last[5] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (last[16] - layerX) / layerWidth, (last[17] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[14] - layerX) / layerWidth, (last[15] - layerY) / layerHeight], 0); - return new FreeHighlightOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR); + return this.#getOutlineTwoPoints(points); } - const outline = new Float64Array(this.#top.length + 24 + this.#bottom.length); + const outline = new Float32Array(this.#top.length + 24 + this.#bottom.length); let N = top.length; for (let i = 0; i < N; i += 2) { if (isNaN(top[i])) { @@ -13323,8 +21804,7 @@ outline[i] = top[i]; outline[i + 1] = top[i + 1]; } - outline.set([NaN, NaN, NaN, NaN, (lastTop[0] - layerX) / layerWidth, (lastTop[1] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (lastBottom[0] - layerX) / layerWidth, (lastBottom[1] - layerY) / layerHeight], N); - N += 24; + N = this.#getOutlineEnd(outline, N); for (let i = bottom.length - 6; i >= 6; i -= 6) { for (let j = 0; j < 6; j += 2) { if (isNaN(bottom[i + j])) { @@ -13337,13 +21817,34 @@ N += 2; } } - outline.set([NaN, NaN, NaN, NaN, bottom[4], bottom[5]], N); - return new FreeHighlightOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR); + this.#getOutlineStart(outline, N); + return this.newFreeDrawOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR); + } + #getOutlineTwoPoints(points) { + const last = this.#last; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + const outline = new Float32Array(36); + outline.set([NaN, NaN, NaN, NaN, (last[2] - layerX) / layerWidth, (last[3] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[4] - layerX) / layerWidth, (last[5] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (last[16] - layerX) / layerWidth, (last[17] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[14] - layerX) / layerWidth, (last[15] - layerY) / layerHeight], 0); + return this.newFreeDrawOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR); + } + #getOutlineStart(outline, pos) { + const bottom = this.#bottom; + outline.set([NaN, NaN, NaN, NaN, bottom[4], bottom[5]], pos); + return pos += 6; + } + #getOutlineEnd(outline, pos) { + const lastTop = this.#last.subarray(4, 6); + const lastBottom = this.#last.subarray(16, 18); + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + outline.set([NaN, NaN, NaN, NaN, (lastTop[0] - layerX) / layerWidth, (lastTop[1] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (lastBottom[0] - layerX) / layerWidth, (lastBottom[1] - layerY) / layerHeight], pos); + return pos += 24; } } -class FreeHighlightOutline extends Outline { +class FreeDrawOutline extends Outline { #box; - #bbox = null; + #bbox = new Float32Array(4); #innerMargin; #isLTR; #points; @@ -13357,13 +21858,10 @@ this.#scaleFactor = scaleFactor; this.#innerMargin = innerMargin; this.#isLTR = isLTR; + this.firstPoint = [NaN, NaN]; + this.lastPoint = [NaN, NaN]; this.#computeMinMax(isLTR); - const { - x, - y, - width, - height - } = this.#bbox; + const [x, y, width, height] = this.#bbox; for (let i = 0, ii = outline.length; i < ii; i += 2) { outline[i] = (outline[i] - x) / width; outline[i + 1] = (outline[i + 1] - y) / height; @@ -13392,20 +21890,20 @@ let points; switch (rotation) { case 0: - outline = this.#rescale(this.#outline, blX, trY, width, -height); - points = this.#rescale(this.#points, blX, trY, width, -height); + outline = Outline._rescale(this.#outline, blX, trY, width, -height); + points = Outline._rescale(this.#points, blX, trY, width, -height); break; case 90: - outline = this.#rescaleAndSwap(this.#outline, blX, blY, width, height); - points = this.#rescaleAndSwap(this.#points, blX, blY, width, height); + outline = Outline._rescaleAndSwap(this.#outline, blX, blY, width, height); + points = Outline._rescaleAndSwap(this.#points, blX, blY, width, height); break; case 180: - outline = this.#rescale(this.#outline, trX, blY, -width, height); - points = this.#rescale(this.#points, trX, blY, -width, height); + outline = Outline._rescale(this.#outline, trX, blY, -width, height); + points = Outline._rescale(this.#points, trX, blY, -width, height); break; case 270: - outline = this.#rescaleAndSwap(this.#outline, trX, trY, -width, -height); - points = this.#rescaleAndSwap(this.#points, trX, trY, -width, -height); + outline = Outline._rescaleAndSwap(this.#outline, trX, trY, -width, -height); + points = Outline._rescaleAndSwap(this.#points, trX, trY, -width, -height); break; } return { @@ -13413,89 +21911,76 @@ points: [Array.from(points)] }; } - #rescale(src, tx, ty, sx, sy) { - const dest = new Float64Array(src.length); - for (let i = 0, ii = src.length; i < ii; i += 2) { - dest[i] = tx + src[i] * sx; - dest[i + 1] = ty + src[i + 1] * sy; - } - return dest; - } - #rescaleAndSwap(src, tx, ty, sx, sy) { - const dest = new Float64Array(src.length); - for (let i = 0, ii = src.length; i < ii; i += 2) { - dest[i] = tx + src[i + 1] * sx; - dest[i + 1] = ty + src[i] * sy; - } - return dest; - } #computeMinMax(isLTR) { const outline = this.#outline; let lastX = outline[4]; let lastY = outline[5]; - let minX = lastX; - let minY = lastY; - let maxX = lastX; - let maxY = lastY; + const minMax = [lastX, lastY, lastX, lastY]; + let firstPointX = lastX; + let firstPointY = lastY; let lastPointX = lastX; let lastPointY = lastY; const ltrCallback = isLTR ? Math.max : Math.min; + const bezierBbox = new Float32Array(4); for (let i = 6, ii = outline.length; i < ii; i += 6) { + const x = outline[i + 4], + y = outline[i + 5]; if (isNaN(outline[i])) { - minX = Math.min(minX, outline[i + 4]); - minY = Math.min(minY, outline[i + 5]); - maxX = Math.max(maxX, outline[i + 4]); - maxY = Math.max(maxY, outline[i + 5]); - if (lastPointY < outline[i + 5]) { - lastPointX = outline[i + 4]; - lastPointY = outline[i + 5]; - } else if (lastPointY === outline[i + 5]) { - lastPointX = ltrCallback(lastPointX, outline[i + 4]); + Util.pointBoundingBox(x, y, minMax); + if (firstPointY > y) { + firstPointX = x; + firstPointY = y; + } else if (firstPointY === y) { + firstPointX = ltrCallback(firstPointX, x); + } + if (lastPointY < y) { + lastPointX = x; + lastPointY = y; + } else if (lastPointY === y) { + lastPointX = ltrCallback(lastPointX, x); } } else { - const bbox = _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.Util.bezierBoundingBox(lastX, lastY, ...outline.slice(i, i + 6)); - minX = Math.min(minX, bbox[0]); - minY = Math.min(minY, bbox[1]); - maxX = Math.max(maxX, bbox[2]); - maxY = Math.max(maxY, bbox[3]); - if (lastPointY < bbox[3]) { - lastPointX = bbox[2]; - lastPointY = bbox[3]; - } else if (lastPointY === bbox[3]) { - lastPointX = ltrCallback(lastPointX, bbox[2]); - } - } - lastX = outline[i + 4]; - lastY = outline[i + 5]; - } - const x = minX - this.#innerMargin, - y = minY - this.#innerMargin, - width = maxX - minX + 2 * this.#innerMargin, - height = maxY - minY + 2 * this.#innerMargin; - this.#bbox = { - x, - y, - width, - height, - lastPoint: [lastPointX, lastPointY] - }; + bezierBbox.set(BBOX_INIT, 0); + Util.bezierBoundingBox(lastX, lastY, ...outline.slice(i, i + 6), bezierBbox); + Util.rectBoundingBox(...bezierBbox, minMax); + if (firstPointY > bezierBbox[1]) { + firstPointX = bezierBbox[0]; + firstPointY = bezierBbox[1]; + } else if (firstPointY === bezierBbox[1]) { + firstPointX = ltrCallback(firstPointX, bezierBbox[0]); + } + if (lastPointY < bezierBbox[3]) { + lastPointX = bezierBbox[2]; + lastPointY = bezierBbox[3]; + } else if (lastPointY === bezierBbox[3]) { + lastPointX = ltrCallback(lastPointX, bezierBbox[2]); + } + } + lastX = x; + lastY = y; + } + const bbox = this.#bbox; + bbox[0] = minMax[0] - this.#innerMargin; + bbox[1] = minMax[1] - this.#innerMargin; + bbox[2] = minMax[2] - minMax[0] + 2 * this.#innerMargin; + bbox[3] = minMax[3] - minMax[1] + 2 * this.#innerMargin; + this.firstPoint = [firstPointX, firstPointY]; + this.lastPoint = [lastPointX, lastPointY]; } get box() { return this.#bbox; } + newOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin = 0) { + return new FreeDrawOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin); + } getNewOutline(thickness, innerMargin) { - const { - x, - y, - width, - height - } = this.#bbox; + const [x, y, width, height] = this.#bbox; const [layerX, layerY, layerWidth, layerHeight] = this.#box; const sx = width * layerWidth; const sy = height * layerHeight; const tx = x * layerWidth + layerX; const ty = y * layerHeight + layerY; - const outliner = new FreeOutliner({ + const outliner = this.newOutliner({ x: this.#points[0] * sx + tx, y: this.#points[1] * sy + ty }, this.#box, this.#scaleFactor, thickness, this.#isLTR, innerMargin ?? this.#innerMargin); @@ -13509,4583 +21994,4410 @@ } } +;// ./src/display/editor/drawers/highlight.js -/***/ }), - -/***/ 362: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ EditorToolbar: () => (/* binding */ EditorToolbar), -/* harmony export */ HighlightToolbar: () => (/* binding */ HighlightToolbar) -/* harmony export */ }); -/* harmony import */ var _display_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(419); -class EditorToolbar { - #toolbar = null; - #colorPicker = null; - #editor; - #buttons = null; - constructor(editor) { - this.#editor = editor; - } - render() { - const editToolbar = this.#toolbar = document.createElement("div"); - editToolbar.className = "editToolbar"; - editToolbar.setAttribute("role", "toolbar"); - editToolbar.addEventListener("contextmenu", _display_utils_js__WEBPACK_IMPORTED_MODULE_0__.noContextMenu); - editToolbar.addEventListener("pointerdown", EditorToolbar.#pointerDown); - const buttons = this.#buttons = document.createElement("div"); - buttons.className = "buttons"; - editToolbar.append(buttons); - const position = this.#editor.toolbarPosition; - if (position) { - const { - style - } = editToolbar; - const x = this.#editor._uiManager.direction === "ltr" ? 1 - position[0] : position[0]; - style.insetInlineEnd = `${100 * x}%`; - style.top = `calc(${100 * position[1]}% + var(--editor-toolbar-vert-offset))`; +class HighlightOutliner { + #box; + #firstPoint; + #lastPoint; + #verticalEdges = []; + #intervals = []; + constructor(boxes, borderWidth = 0, innerMargin = 0, isLTR = true) { + const minMax = BBOX_INIT.slice(); + const NUMBER_OF_DIGITS = 4; + const EPSILON = 10 ** -NUMBER_OF_DIGITS; + for (const { + x, + y, + width, + height + } of boxes) { + const x1 = Math.floor((x - borderWidth) / EPSILON) * EPSILON; + const x2 = Math.ceil((x + width + borderWidth) / EPSILON) * EPSILON; + const y1 = Math.floor((y - borderWidth) / EPSILON) * EPSILON; + const y2 = Math.ceil((y + height + borderWidth) / EPSILON) * EPSILON; + const left = [x1, y1, y2, true]; + const right = [x2, y1, y2, false]; + this.#verticalEdges.push(left, right); + Util.rectBoundingBox(x1, y1, x2, y2, minMax); } - this.#addDeleteButton(); - return editToolbar; - } - static #pointerDown(e) { - e.stopPropagation(); - } - #focusIn(e) { - this.#editor._focusEventsAllowed = false; - e.preventDefault(); - e.stopPropagation(); - } - #focusOut(e) { - this.#editor._focusEventsAllowed = true; - e.preventDefault(); - e.stopPropagation(); - } - #addListenersToElement(element) { - element.addEventListener("focusin", this.#focusIn.bind(this), { - capture: true - }); - element.addEventListener("focusout", this.#focusOut.bind(this), { - capture: true - }); - element.addEventListener("contextmenu", _display_utils_js__WEBPACK_IMPORTED_MODULE_0__.noContextMenu); - } - hide() { - this.#toolbar.classList.add("hidden"); - this.#colorPicker?.hideDropdown(); - } - show() { - this.#toolbar.classList.remove("hidden"); - } - #addDeleteButton() { - const button = document.createElement("button"); - button.className = "delete"; - button.tabIndex = 0; - button.setAttribute("data-l10n-id", `pdfjs-editor-remove-${this.#editor.editorType}-button`); - this.#addListenersToElement(button); - button.addEventListener("click", e => { - this.#editor._uiManager.delete(); - }); - this.#buttons.append(button); - } - get #divider() { - const divider = document.createElement("div"); - divider.className = "divider"; - return divider; - } - addAltTextButton(button) { - this.#addListenersToElement(button); - this.#buttons.prepend(button, this.#divider); - } - addColorPicker(colorPicker) { - this.#colorPicker = colorPicker; - const button = colorPicker.renderButton(); - this.#addListenersToElement(button); - this.#buttons.prepend(button, this.#divider); - } - remove() { - this.#toolbar.remove(); - this.#colorPicker?.destroy(); - this.#colorPicker = null; - } -} -class HighlightToolbar { - #buttons = null; - #toolbar = null; - #uiManager; - constructor(uiManager) { - this.#uiManager = uiManager; - } - #render() { - const editToolbar = this.#toolbar = document.createElement("div"); - editToolbar.className = "editToolbar"; - editToolbar.setAttribute("role", "toolbar"); - editToolbar.addEventListener("contextmenu", _display_utils_js__WEBPACK_IMPORTED_MODULE_0__.noContextMenu); - const buttons = this.#buttons = document.createElement("div"); - buttons.className = "buttons"; - editToolbar.append(buttons); - this.#addHighlightButton(); - return editToolbar; - } - #getLastPoint(boxes, isLTR) { - let lastY = 0; - let lastX = 0; - for (const box of boxes) { - const y = box.y + box.height; - if (y < lastY) { - continue; - } - const x = box.x + (isLTR ? box.width : 0); - if (y > lastY) { - lastX = x; - lastY = y; - continue; - } - if (isLTR) { - if (x > lastX) { - lastX = x; + const bboxWidth = minMax[2] - minMax[0] + 2 * innerMargin; + const bboxHeight = minMax[3] - minMax[1] + 2 * innerMargin; + const shiftedMinX = minMax[0] - innerMargin; + const shiftedMinY = minMax[1] - innerMargin; + let firstPointX = isLTR ? -Infinity : Infinity; + let firstPointY = Infinity; + const lastEdge = this.#verticalEdges.at(isLTR ? -1 : -2); + const lastPoint = [lastEdge[0], lastEdge[2]]; + for (const edge of this.#verticalEdges) { + const [x, y1, y2, left] = edge; + if (!left && isLTR) { + if (y1 < firstPointY) { + firstPointY = y1; + firstPointX = x; + } else if (y1 === firstPointY) { + firstPointX = Math.max(firstPointX, x); + } + } else if (left && !isLTR) { + if (y1 < firstPointY) { + firstPointY = y1; + firstPointX = x; + } else if (y1 === firstPointY) { + firstPointX = Math.min(firstPointX, x); } - } else if (x < lastX) { - lastX = x; } + edge[0] = (x - shiftedMinX) / bboxWidth; + edge[1] = (y1 - shiftedMinY) / bboxHeight; + edge[2] = (y2 - shiftedMinY) / bboxHeight; } - return [isLTR ? 1 - lastX : lastX, lastY]; - } - show(parent, boxes, isLTR) { - const [x, y] = this.#getLastPoint(boxes, isLTR); - const { - style - } = this.#toolbar ||= this.#render(); - parent.append(this.#toolbar); - style.insetInlineEnd = `${100 * x}%`; - style.top = `calc(${100 * y}% + var(--editor-toolbar-vert-offset))`; - } - hide() { - this.#toolbar.remove(); - } - #addHighlightButton() { - const button = document.createElement("button"); - button.className = "highlightButton"; - button.tabIndex = 0; - button.setAttribute("data-l10n-id", `pdfjs-highlight-floating-button1`); - const span = document.createElement("span"); - button.append(span); - span.className = "visuallyHidden"; - span.setAttribute("data-l10n-id", "pdfjs-highlight-floating-button-label"); - button.addEventListener("contextmenu", _display_utils_js__WEBPACK_IMPORTED_MODULE_0__.noContextMenu); - button.addEventListener("click", () => { - this.#uiManager.highlightSelection("floating_button"); - }); - this.#buttons.append(button); - } -} - - -/***/ }), - -/***/ 830: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ AnnotationEditorUIManager: () => (/* binding */ AnnotationEditorUIManager), -/* harmony export */ ColorManager: () => (/* binding */ ColorManager), -/* harmony export */ KeyboardManager: () => (/* binding */ KeyboardManager), -/* harmony export */ bindEvents: () => (/* binding */ bindEvents), -/* harmony export */ opacityToHex: () => (/* binding */ opacityToHex) -/* harmony export */ }); -/* unused harmony export CommandManager */ -/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(292); -/* harmony import */ var _display_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(419); -/* harmony import */ var _toolbar_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(362); - - - -function bindEvents(obj, element, names) { - for (const name of names) { - element.addEventListener(name, obj[name].bind(obj)); - } -} -function opacityToHex(opacity) { - return Math.round(Math.min(255, Math.max(1, 255 * opacity))).toString(16).padStart(2, "0"); -} -class IdManager { - #id = 0; - constructor() {} - get id() { - return `${_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorPrefix}${this.#id++}`; - } -} -class ImageManager { - #baseId = (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.getUuid)(); - #id = 0; - #cache = null; - static get _isSVGFittingCanvas() { - const svg = `data:image/svg+xml;charset=UTF-8,`; - const canvas = new OffscreenCanvas(1, 3); - const ctx = canvas.getContext("2d"); - const image = new Image(); - image.src = svg; - const promise = image.decode().then(() => { - ctx.drawImage(image, 0, 0, 1, 1, 0, 0, 1, 3); - return new Uint32Array(ctx.getImageData(0, 0, 1, 1).data.buffer)[0] === 0; - }); - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "_isSVGFittingCanvas", promise); + this.#box = new Float32Array([shiftedMinX, shiftedMinY, bboxWidth, bboxHeight]); + this.#firstPoint = [firstPointX, firstPointY]; + this.#lastPoint = lastPoint; } - async #get(key, rawData) { - this.#cache ||= new Map(); - let data = this.#cache.get(key); - if (data === null) { - return null; - } - if (data?.bitmap) { - data.refCounter += 1; - return data; - } - try { - data ||= { - bitmap: null, - id: `image_${this.#baseId}_${this.#id++}`, - refCounter: 0, - isSvg: false - }; - let image; - if (typeof rawData === "string") { - data.url = rawData; - image = await (0,_display_utils_js__WEBPACK_IMPORTED_MODULE_1__.fetchData)(rawData, "blob"); - } else { - image = data.file = rawData; - } - if (image.type === "image/svg+xml") { - const mustRemoveAspectRatioPromise = ImageManager._isSVGFittingCanvas; - const fileReader = new FileReader(); - const imageElement = new Image(); - const imagePromise = new Promise((resolve, reject) => { - imageElement.onload = () => { - data.bitmap = imageElement; - data.isSvg = true; - resolve(); - }; - fileReader.onload = async () => { - const url = data.svgUrl = fileReader.result; - imageElement.src = (await mustRemoveAspectRatioPromise) ? `${url}#svgView(preserveAspectRatio(none))` : url; - }; - imageElement.onerror = fileReader.onerror = reject; - }); - fileReader.readAsDataURL(image); - await imagePromise; + getOutlines() { + this.#verticalEdges.sort((a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2]); + const outlineVerticalEdges = []; + for (const edge of this.#verticalEdges) { + if (edge[3]) { + outlineVerticalEdges.push(...this.#breakEdge(edge)); + this.#insert(edge); } else { - data.bitmap = await createImageBitmap(image); + this.#remove(edge); + outlineVerticalEdges.push(...this.#breakEdge(edge)); } - data.refCounter = 1; - } catch (e) { - console.error(e); - data = null; - } - this.#cache.set(key, data); - if (data) { - this.#cache.set(data.id, data); } - return data; - } - async getFromFile(file) { - const { - lastModified, - name, - size, - type - } = file; - return this.#get(`${lastModified}_${name}_${size}_${type}`, file); - } - async getFromUrl(url) { - return this.#get(url, url); + return this.#getOutlines(outlineVerticalEdges); } - async getFromId(id) { - this.#cache ||= new Map(); - const data = this.#cache.get(id); - if (!data) { - return null; - } - if (data.bitmap) { - data.refCounter += 1; - return data; + #getOutlines(outlineVerticalEdges) { + const edges = []; + const allEdges = new Set(); + for (const edge of outlineVerticalEdges) { + const [x, y1, y2] = edge; + edges.push([x, y1, edge], [x, y2, edge]); } - if (data.file) { - return this.getFromFile(data.file); + edges.sort((a, b) => a[1] - b[1] || a[0] - b[0]); + for (let i = 0, ii = edges.length; i < ii; i += 2) { + const edge1 = edges[i][2]; + const edge2 = edges[i + 1][2]; + edge1.push(edge2); + edge2.push(edge1); + allEdges.add(edge1); + allEdges.add(edge2); } - return this.getFromUrl(data.url); - } - getSvgUrl(id) { - const data = this.#cache.get(id); - if (!data?.isSvg) { - return null; + const outlines = []; + let outline; + while (allEdges.size > 0) { + const edge = allEdges.values().next().value; + let [x, y1, y2, edge1, edge2] = edge; + allEdges.delete(edge); + let lastPointX = x; + let lastPointY = y1; + outline = [x, y2]; + outlines.push(outline); + while (true) { + let e; + if (allEdges.has(edge1)) { + e = edge1; + } else if (allEdges.has(edge2)) { + e = edge2; + } else { + break; + } + allEdges.delete(e); + [x, y1, y2, edge1, edge2] = e; + if (lastPointX !== x) { + outline.push(lastPointX, lastPointY, x, lastPointY === y1 ? y1 : y2); + lastPointX = x; + } + lastPointY = lastPointY === y1 ? y2 : y1; + } + outline.push(lastPointX, lastPointY); } - return data.svgUrl; + return new HighlightOutline(outlines, this.#box, this.#firstPoint, this.#lastPoint); } - deleteId(id) { - this.#cache ||= new Map(); - const data = this.#cache.get(id); - if (!data) { - return; - } - data.refCounter -= 1; - if (data.refCounter !== 0) { - return; + #binarySearch(y) { + const array = this.#intervals; + let start = 0; + let end = array.length - 1; + while (start <= end) { + const middle = start + end >> 1; + const y1 = array[middle][0]; + if (y1 === y) { + return middle; + } + if (y1 < y) { + start = middle + 1; + } else { + end = middle - 1; + } } - data.bitmap = null; - } - isValidId(id) { - return id.startsWith(`image_${this.#baseId}_`); + return end + 1; } -} -class CommandManager { - #commands = []; - #locked = false; - #maxSize; - #position = -1; - constructor(maxSize = 128) { - this.#maxSize = maxSize; + #insert([, y1, y2]) { + const index = this.#binarySearch(y1); + this.#intervals.splice(index, 0, [y1, y2]); } - add({ - cmd, - undo, - post, - mustExec, - type = NaN, - overwriteIfSameType = false, - keepUndo = false - }) { - if (mustExec) { - cmd(); - } - if (this.#locked) { - return; - } - const save = { - cmd, - undo, - post, - type - }; - if (this.#position === -1) { - if (this.#commands.length > 0) { - this.#commands.length = 0; + #remove([, y1, y2]) { + const index = this.#binarySearch(y1); + for (let i = index; i < this.#intervals.length; i++) { + const [start, end] = this.#intervals[i]; + if (start !== y1) { + break; } - this.#position = 0; - this.#commands.push(save); - return; - } - if (overwriteIfSameType && this.#commands[this.#position].type === type) { - if (keepUndo) { - save.undo = this.#commands[this.#position].undo; + if (start === y1 && end === y2) { + this.#intervals.splice(i, 1); + return; } - this.#commands[this.#position] = save; - return; } - const next = this.#position + 1; - if (next === this.#maxSize) { - this.#commands.splice(0, 1); - } else { - this.#position = next; - if (next < this.#commands.length) { - this.#commands.splice(next); + for (let i = index - 1; i >= 0; i--) { + const [start, end] = this.#intervals[i]; + if (start !== y1) { + break; + } + if (start === y1 && end === y2) { + this.#intervals.splice(i, 1); + return; } } - this.#commands.push(save); - } - undo() { - if (this.#position === -1) { - return; - } - this.#locked = true; - const { - undo, - post - } = this.#commands[this.#position]; - undo(); - post?.(); - this.#locked = false; - this.#position -= 1; } - redo() { - if (this.#position < this.#commands.length - 1) { - this.#position += 1; - this.#locked = true; - const { - cmd, - post - } = this.#commands[this.#position]; - cmd(); - post?.(); - this.#locked = false; + #breakEdge(edge) { + const [x, y1, y2] = edge; + const results = [[x, y1, y2]]; + const index = this.#binarySearch(y2); + for (let i = 0; i < index; i++) { + const [start, end] = this.#intervals[i]; + for (let j = 0, jj = results.length; j < jj; j++) { + const [, y3, y4] = results[j]; + if (end <= y3 || y4 <= start) { + continue; + } + if (y3 >= start) { + if (y4 > end) { + results[j][1] = end; + } else { + if (jj === 1) { + return []; + } + results.splice(j, 1); + j--; + jj--; + } + continue; + } + results[j][2] = start; + if (y4 > end) { + results.push([x, end, y4]); + } + } } - } - hasSomethingToUndo() { - return this.#position !== -1; - } - hasSomethingToRedo() { - return this.#position < this.#commands.length - 1; - } - destroy() { - this.#commands = null; + return results; } } -class KeyboardManager { - constructor(callbacks) { - this.buffer = []; - this.callbacks = new Map(); - this.allKeys = new Set(); - const { - isMac - } = _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.FeatureTest.platform; - for (const [keys, callback, options = {}] of callbacks) { - for (const key of keys) { - const isMacKey = key.startsWith("mac+"); - if (isMac && isMacKey) { - this.callbacks.set(key.slice(4), { - callback, - options - }); - this.allKeys.add(key.split("+").at(-1)); - } else if (!isMac && !isMacKey) { - this.callbacks.set(key, { - callback, - options - }); - this.allKeys.add(key.split("+").at(-1)); +class HighlightOutline extends Outline { + #box; + #outlines; + constructor(outlines, box, firstPoint, lastPoint) { + super(); + this.#outlines = outlines; + this.#box = box; + this.firstPoint = firstPoint; + this.lastPoint = lastPoint; + } + toSVGPath() { + const buffer = []; + for (const polygon of this.#outlines) { + let [prevX, prevY] = polygon; + buffer.push(`M${prevX} ${prevY}`); + for (let i = 2; i < polygon.length; i += 2) { + const x = polygon[i]; + const y = polygon[i + 1]; + if (x === prevX) { + buffer.push(`V${y}`); + prevY = y; + } else if (y === prevY) { + buffer.push(`H${x}`); + prevX = x; } } + buffer.push("Z"); } + return buffer.join(" "); } - #serialize(event) { - if (event.altKey) { - this.buffer.push("alt"); - } - if (event.ctrlKey) { - this.buffer.push("ctrl"); - } - if (event.metaKey) { - this.buffer.push("meta"); - } - if (event.shiftKey) { - this.buffer.push("shift"); - } - this.buffer.push(event.key); - const str = this.buffer.join("+"); - this.buffer.length = 0; - return str; - } - exec(self, event) { - if (!this.allKeys.has(event.key)) { - return; - } - const info = this.callbacks.get(this.#serialize(event)); - if (!info) { - return; - } - const { - callback, - options: { - bubbles = false, - args = [], - checker = null + serialize([blX, blY, trX, trY], _rotation) { + const outlines = []; + const width = trX - blX; + const height = trY - blY; + for (const outline of this.#outlines) { + const points = new Array(outline.length); + for (let i = 0; i < outline.length; i += 2) { + points[i] = blX + outline[i] * width; + points[i + 1] = trY - outline[i + 1] * height; } - } = info; - if (checker && !checker(self, event)) { - return; - } - callback.bind(self, ...args, event)(); - if (!bubbles) { - event.stopPropagation(); - event.preventDefault(); + outlines.push(points); } + return outlines; } -} -class ColorManager { - static _colorsMapping = new Map([["CanvasText", [0, 0, 0]], ["Canvas", [255, 255, 255]]]); - get _colors() { - const colors = new Map([["CanvasText", null], ["Canvas", null]]); - (0,_display_utils_js__WEBPACK_IMPORTED_MODULE_1__.getColorValues)(colors); - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "_colors", colors); + get box() { + return this.#box; } - convert(color) { - const rgb = (0,_display_utils_js__WEBPACK_IMPORTED_MODULE_1__.getRGB)(color); - if (!window.matchMedia("(forced-colors: active)").matches) { - return rgb; - } - for (const [name, RGB] of this._colors) { - if (RGB.every((x, i) => x === rgb[i])) { - return ColorManager._colorsMapping.get(name); - } - } - return rgb; +} +class FreeHighlightOutliner extends FreeDrawOutliner { + newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) { + return new FreeHighlightOutline(outline, points, box, scaleFactor, innerMargin, isLTR); } - getHexCode(name) { - const rgb = this._colors.get(name); - if (!rgb) { - return name; - } - return _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.Util.makeHexColor(...rgb); +} +class FreeHighlightOutline extends FreeDrawOutline { + newOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin = 0) { + return new FreeHighlightOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin); } } -class AnnotationEditorUIManager { - #activeEditor = null; - #allEditors = new Map(); - #allLayers = new Map(); - #altTextManager = null; - #annotationStorage = null; - #commandManager = new CommandManager(); - #currentPageIndex = 0; - #deletedAnnotationsElementIds = new Set(); - #draggingEditors = null; - #editorTypes = null; - #editorsToRescale = new Set(); - #enableHighlightFloatingButton = false; - #filterFactory = null; - #focusMainContainerTimeoutId = null; - #highlightColors = null; - #highlightWhenShiftUp = false; - #highlightToolbar = null; - #idManager = new IdManager(); - #isEnabled = false; - #isWaiting = false; - #lastActiveElement = null; - #mainHighlightColorPicker = null; - #mlManager = null; - #mode = _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.NONE; - #selectedEditors = new Set(); - #selectedTextNode = null; - #pageColors = null; - #showAllStates = null; - #boundBlur = this.blur.bind(this); - #boundFocus = this.focus.bind(this); - #boundCopy = this.copy.bind(this); - #boundCut = this.cut.bind(this); - #boundPaste = this.paste.bind(this); - #boundKeydown = this.keydown.bind(this); - #boundKeyup = this.keyup.bind(this); - #boundOnEditingAction = this.onEditingAction.bind(this); - #boundOnPageChanging = this.onPageChanging.bind(this); - #boundOnScaleChanging = this.onScaleChanging.bind(this); - #boundSelectionChange = this.#selectionChange.bind(this); - #boundOnRotationChanging = this.onRotationChanging.bind(this); - #previousStates = { - isEditing: false, - isEmpty: true, - hasSomethingToUndo: false, - hasSomethingToRedo: false, - hasSelectedEditor: false, - hasSelectedText: false - }; - #translation = [0, 0]; - #translationTimeoutId = null; - #container = null; - #viewer = null; - static TRANSLATE_SMALL = 1; - static TRANSLATE_BIG = 10; + +;// ./src/display/editor/highlight.js + + + + + + + +class HighlightEditor extends AnnotationEditor { + #anchorNode = null; + #anchorOffset = 0; + #boxes; + #clipPathId = null; + #colorPicker = null; + #focusOutlines = null; + #focusNode = null; + #focusOffset = 0; + #highlightDiv = null; + #highlightOutlines = null; + #id = null; + #isFreeHighlight = false; + #firstPoint = null; + #lastPoint = null; + #outlineId = null; + #text = ""; + #thickness; + #methodOfCreation = ""; + static _defaultColor = null; + static _defaultOpacity = 1; + static _defaultThickness = 12; + static _type = "highlight"; + static _editorType = AnnotationEditorType.HIGHLIGHT; + static _freeHighlightId = -1; + static _freeHighlight = null; + static _freeHighlightClipId = ""; static get _keyboardManager() { - const proto = AnnotationEditorUIManager.prototype; - const arrowChecker = self => self.#container.contains(document.activeElement) && document.activeElement.tagName !== "BUTTON" && self.hasSomethingToControl(); - const textInputChecker = (_self, { - target: el - }) => { - if (el instanceof HTMLInputElement) { - const { - type - } = el; - return type !== "text" && type !== "number"; - } - return true; - }; - const small = this.TRANSLATE_SMALL; - const big = this.TRANSLATE_BIG; - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "_keyboardManager", new KeyboardManager([[["ctrl+a", "mac+meta+a"], proto.selectAll, { - checker: textInputChecker - }], [["ctrl+z", "mac+meta+z"], proto.undo, { - checker: textInputChecker - }], [["ctrl+y", "ctrl+shift+z", "mac+meta+shift+z", "ctrl+shift+Z", "mac+meta+shift+Z"], proto.redo, { - checker: textInputChecker - }], [["Backspace", "alt+Backspace", "ctrl+Backspace", "shift+Backspace", "mac+Backspace", "mac+alt+Backspace", "mac+ctrl+Backspace", "Delete", "ctrl+Delete", "shift+Delete", "mac+Delete"], proto.delete, { - checker: textInputChecker - }], [["Enter", "mac+Enter"], proto.addNewEditorFromKeyboard, { - checker: (self, { - target: el - }) => !(el instanceof HTMLButtonElement) && self.#container.contains(el) && !self.isEnterHandled - }], [[" ", "mac+ "], proto.addNewEditorFromKeyboard, { - checker: (self, { - target: el - }) => !(el instanceof HTMLButtonElement) && self.#container.contains(document.activeElement) - }], [["Escape", "mac+Escape"], proto.unselectAll], [["ArrowLeft", "mac+ArrowLeft"], proto.translateSelectedEditors, { - args: [-small, 0], - checker: arrowChecker - }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto.translateSelectedEditors, { - args: [-big, 0], - checker: arrowChecker - }], [["ArrowRight", "mac+ArrowRight"], proto.translateSelectedEditors, { - args: [small, 0], - checker: arrowChecker - }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto.translateSelectedEditors, { - args: [big, 0], - checker: arrowChecker - }], [["ArrowUp", "mac+ArrowUp"], proto.translateSelectedEditors, { - args: [0, -small], - checker: arrowChecker - }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto.translateSelectedEditors, { - args: [0, -big], - checker: arrowChecker - }], [["ArrowDown", "mac+ArrowDown"], proto.translateSelectedEditors, { - args: [0, small], - checker: arrowChecker - }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto.translateSelectedEditors, { - args: [0, big], - checker: arrowChecker + const proto = HighlightEditor.prototype; + return shadow(this, "_keyboardManager", new KeyboardManager([[["ArrowLeft"], proto._moveCaret, { + args: [0] + }], [["ArrowRight"], proto._moveCaret, { + args: [1] + }], [["ArrowUp"], proto._moveCaret, { + args: [2] + }], [["ArrowDown"], proto._moveCaret, { + args: [3] }]])); } - constructor(container, viewer, altTextManager, eventBus, pdfDocument, pageColors, highlightColors, enableHighlightFloatingButton, mlManager) { - this.#container = container; - this.#viewer = viewer; - this.#altTextManager = altTextManager; - this._eventBus = eventBus; - this._eventBus._on("editingaction", this.#boundOnEditingAction); - this._eventBus._on("pagechanging", this.#boundOnPageChanging); - this._eventBus._on("scalechanging", this.#boundOnScaleChanging); - this._eventBus._on("rotationchanging", this.#boundOnRotationChanging); - this.#addSelectionListener(); - this.#addKeyboardManager(); - this.#annotationStorage = pdfDocument.annotationStorage; - this.#filterFactory = pdfDocument.filterFactory; - this.#pageColors = pageColors; - this.#highlightColors = highlightColors || null; - this.#enableHighlightFloatingButton = enableHighlightFloatingButton; - this.#mlManager = mlManager || null; - this.viewParameters = { - realScale: _display_utils_js__WEBPACK_IMPORTED_MODULE_1__.PixelsPerInch.PDF_TO_CSS_UNITS, - rotation: 0 - }; - this.isShiftKeyDown = false; - } - destroy() { - this.#removeKeyboardManager(); - this.#removeFocusManager(); - this._eventBus._off("editingaction", this.#boundOnEditingAction); - this._eventBus._off("pagechanging", this.#boundOnPageChanging); - this._eventBus._off("scalechanging", this.#boundOnScaleChanging); - this._eventBus._off("rotationchanging", this.#boundOnRotationChanging); - for (const layer of this.#allLayers.values()) { - layer.destroy(); - } - this.#allLayers.clear(); - this.#allEditors.clear(); - this.#editorsToRescale.clear(); - this.#activeEditor = null; - this.#selectedEditors.clear(); - this.#commandManager.destroy(); - this.#altTextManager?.destroy(); - this.#highlightToolbar?.hide(); - this.#highlightToolbar = null; - if (this.#focusMainContainerTimeoutId) { - clearTimeout(this.#focusMainContainerTimeoutId); - this.#focusMainContainerTimeoutId = null; - } - if (this.#translationTimeoutId) { - clearTimeout(this.#translationTimeoutId); - this.#translationTimeoutId = null; + constructor(params) { + super({ + ...params, + name: "highlightEditor" + }); + this.color = params.color || HighlightEditor._defaultColor; + this.#thickness = params.thickness || HighlightEditor._defaultThickness; + this.opacity = params.opacity || HighlightEditor._defaultOpacity; + this.#boxes = params.boxes || null; + this.#methodOfCreation = params.methodOfCreation || ""; + this.#text = params.text || ""; + this._isDraggable = false; + this.defaultL10nId = "pdfjs-editor-highlight-editor"; + if (params.highlightId > -1) { + this.#isFreeHighlight = true; + this.#createFreeOutlines(params); + this.#addToDrawLayer(); + } else if (this.#boxes) { + this.#anchorNode = params.anchorNode; + this.#anchorOffset = params.anchorOffset; + this.#focusNode = params.focusNode; + this.#focusOffset = params.focusOffset; + this.#createOutlines(); + this.#addToDrawLayer(); + this.rotate(this.rotation); } - this.#removeSelectionListener(); - } - async mlGuess(data) { - return this.#mlManager?.guess(data) || null; - } - get hasMLManager() { - return !!this.#mlManager; - } - get hcmFilter() { - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "hcmFilter", this.#pageColors ? this.#filterFactory.addHCMFilter(this.#pageColors.foreground, this.#pageColors.background) : "none"); - } - get direction() { - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "direction", getComputedStyle(this.#container).direction); - } - get highlightColors() { - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "highlightColors", this.#highlightColors ? new Map(this.#highlightColors.split(",").map(pair => pair.split("=").map(x => x.trim()))) : null); - } - get highlightColorNames() { - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "highlightColorNames", this.highlightColors ? new Map(Array.from(this.highlightColors, e => e.reverse())) : null); - } - setMainHighlightColorPicker(colorPicker) { - this.#mainHighlightColorPicker = colorPicker; - } - editAltText(editor) { - this.#altTextManager?.editAltText(this, editor); - } - onPageChanging({ - pageNumber - }) { - this.#currentPageIndex = pageNumber - 1; - } - focusMainContainer() { - this.#container.focus(); - } - findParent(x, y) { - for (const layer of this.#allLayers.values()) { - const { - x: layerX, - y: layerY, - width, - height - } = layer.div.getBoundingClientRect(); - if (x >= layerX && x <= layerX + width && y >= layerY && y <= layerY + height) { - return layer; - } + if (!this.annotationElementId) { + this._uiManager.a11yAlert(AnnotationEditor._l10nAlert.highlight); } - return null; } - disableUserSelect(value = false) { - this.#viewer.classList.toggle("noUserSelect", value); - } - addShouldRescale(editor) { - this.#editorsToRescale.add(editor); + get telemetryInitialData() { + return { + action: "added", + type: this.#isFreeHighlight ? "free_highlight" : "highlight", + color: this._uiManager.getNonHCMColorName(this.color), + thickness: this.#thickness, + methodOfCreation: this.#methodOfCreation + }; } - removeShouldRescale(editor) { - this.#editorsToRescale.delete(editor); + get telemetryFinalData() { + return { + type: "highlight", + color: this._uiManager.getNonHCMColorName(this.color) + }; } - onScaleChanging({ - scale - }) { - this.commitOrRemove(); - this.viewParameters.realScale = scale * _display_utils_js__WEBPACK_IMPORTED_MODULE_1__.PixelsPerInch.PDF_TO_CSS_UNITS; - for (const editor of this.#editorsToRescale) { - editor.onScaleChanging(); - } + static computeTelemetryFinalData(data) { + return { + numberOfColors: data.get("color").size + }; } - onRotationChanging({ - pagesRotation - }) { - this.commitOrRemove(); - this.viewParameters.rotation = pagesRotation; + #createOutlines() { + const outliner = new HighlightOutliner(this.#boxes, 0.001); + this.#highlightOutlines = outliner.getOutlines(); + [this.x, this.y, this.width, this.height] = this.#highlightOutlines.box; + const outlinerForOutline = new HighlightOutliner(this.#boxes, 0.0025, 0.001, this._uiManager.direction === "ltr"); + this.#focusOutlines = outlinerForOutline.getOutlines(); + const { + firstPoint + } = this.#highlightOutlines; + this.#firstPoint = [(firstPoint[0] - this.x) / this.width, (firstPoint[1] - this.y) / this.height]; + const { + lastPoint + } = this.#focusOutlines; + this.#lastPoint = [(lastPoint[0] - this.x) / this.width, (lastPoint[1] - this.y) / this.height]; } - #getAnchorElementForSelection({ - anchorNode + #createFreeOutlines({ + highlightOutlines, + highlightId, + clipPathId }) { - return anchorNode.nodeType === Node.TEXT_NODE ? anchorNode.parentElement : anchorNode; - } - highlightSelection(methodOfCreation = "") { - const selection = document.getSelection(); - if (!selection || selection.isCollapsed) { - return; - } - const { - anchorNode, - anchorOffset, - focusNode, - focusOffset - } = selection; - const text = selection.toString(); - const anchorElement = this.#getAnchorElementForSelection(selection); - const textLayer = anchorElement.closest(".textLayer"); - const boxes = this.getSelectionBoxes(textLayer); - if (!boxes) { - return; - } - selection.empty(); - if (this.#mode === _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.NONE) { - this._eventBus.dispatch("showannotationeditorui", { - source: this, - mode: _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.HIGHLIGHT + this.#highlightOutlines = highlightOutlines; + const extraThickness = 1.5; + this.#focusOutlines = highlightOutlines.getNewOutline(this.#thickness / 2 + extraThickness, 0.0025); + if (highlightId >= 0) { + this.#id = highlightId; + this.#clipPathId = clipPathId; + this.parent.drawLayer.finalizeDraw(highlightId, { + bbox: highlightOutlines.box, + path: { + d: highlightOutlines.toSVGPath() + } + }); + this.#outlineId = this.parent.drawLayer.drawOutline({ + rootClass: { + highlightOutline: true, + free: true + }, + bbox: this.#focusOutlines.box, + path: { + d: this.#focusOutlines.toSVGPath() + } + }, true); + } else if (this.parent) { + const angle = this.parent.viewport.rotation; + this.parent.drawLayer.updateProperties(this.#id, { + bbox: HighlightEditor.#rotateBbox(this.#highlightOutlines.box, (angle - this.rotation + 360) % 360), + path: { + d: highlightOutlines.toSVGPath() + } + }); + this.parent.drawLayer.updateProperties(this.#outlineId, { + bbox: HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle), + path: { + d: this.#focusOutlines.toSVGPath() + } }); - this.showAllEditors("highlight", true, true); } - for (const layer of this.#allLayers.values()) { - if (layer.hasTextLayer(textLayer)) { - layer.createAndAddNewEditor({ - x: 0, - y: 0 - }, false, { - methodOfCreation, - boxes, - anchorNode, - anchorOffset, - focusNode, - focusOffset, - text - }); + const [x, y, width, height] = highlightOutlines.box; + switch (this.rotation) { + case 0: + this.x = x; + this.y = y; + this.width = width; + this.height = height; break; - } - } - } - #displayHighlightToolbar() { - const selection = document.getSelection(); - if (!selection || selection.isCollapsed) { - return; - } - const anchorElement = this.#getAnchorElementForSelection(selection); - const textLayer = anchorElement.closest(".textLayer"); - const boxes = this.getSelectionBoxes(textLayer); - if (!boxes) { - return; - } - this.#highlightToolbar ||= new _toolbar_js__WEBPACK_IMPORTED_MODULE_2__.HighlightToolbar(this); - this.#highlightToolbar.show(textLayer, boxes, this.direction === "ltr"); - } - addToAnnotationStorage(editor) { - if (!editor.isEmpty() && this.#annotationStorage && !this.#annotationStorage.has(editor.id)) { - this.#annotationStorage.setValue(editor.id, editor); - } - } - #selectionChange() { - const selection = document.getSelection(); - if (!selection || selection.isCollapsed) { - if (this.#selectedTextNode) { - this.#highlightToolbar?.hide(); - this.#selectedTextNode = null; - this.#dispatchUpdateStates({ - hasSelectedText: false - }); - } - return; - } - const { - anchorNode - } = selection; - if (anchorNode === this.#selectedTextNode) { - return; - } - const anchorElement = this.#getAnchorElementForSelection(selection); - const textLayer = anchorElement.closest(".textLayer"); - if (!textLayer) { - if (this.#selectedTextNode) { - this.#highlightToolbar?.hide(); - this.#selectedTextNode = null; - this.#dispatchUpdateStates({ - hasSelectedText: false - }); - } - return; - } - this.#highlightToolbar?.hide(); - this.#selectedTextNode = anchorNode; - this.#dispatchUpdateStates({ - hasSelectedText: true - }); - if (this.#mode !== _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.HIGHLIGHT && this.#mode !== _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.NONE) { - return; - } - if (this.#mode === _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.HIGHLIGHT) { - this.showAllEditors("highlight", true, true); - } - this.#highlightWhenShiftUp = this.isShiftKeyDown; - if (!this.isShiftKeyDown) { - const pointerup = e => { - if (e.type === "pointerup" && e.button !== 0) { - return; + case 90: + { + const [pageWidth, pageHeight] = this.parentDimensions; + this.x = y; + this.y = 1 - x; + this.width = width * pageHeight / pageWidth; + this.height = height * pageWidth / pageHeight; + break; } - window.removeEventListener("pointerup", pointerup); - window.removeEventListener("blur", pointerup); - if (e.type === "pointerup") { - this.#onSelectEnd("main_toolbar"); + case 180: + this.x = 1 - x; + this.y = 1 - y; + this.width = width; + this.height = height; + break; + case 270: + { + const [pageWidth, pageHeight] = this.parentDimensions; + this.x = 1 - y; + this.y = x; + this.width = width * pageHeight / pageWidth; + this.height = height * pageWidth / pageHeight; + break; } - }; - window.addEventListener("pointerup", pointerup); - window.addEventListener("blur", pointerup); - } - } - #onSelectEnd(methodOfCreation = "") { - if (this.#mode === _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.HIGHLIGHT) { - this.highlightSelection(methodOfCreation); - } else if (this.#enableHighlightFloatingButton) { - this.#displayHighlightToolbar(); } + const { + firstPoint + } = highlightOutlines; + this.#firstPoint = [(firstPoint[0] - x) / width, (firstPoint[1] - y) / height]; + const { + lastPoint + } = this.#focusOutlines; + this.#lastPoint = [(lastPoint[0] - x) / width, (lastPoint[1] - y) / height]; } - #addSelectionListener() { - document.addEventListener("selectionchange", this.#boundSelectionChange); - } - #removeSelectionListener() { - document.removeEventListener("selectionchange", this.#boundSelectionChange); - } - #addFocusManager() { - window.addEventListener("focus", this.#boundFocus); - window.addEventListener("blur", this.#boundBlur); - } - #removeFocusManager() { - window.removeEventListener("focus", this.#boundFocus); - window.removeEventListener("blur", this.#boundBlur); + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + HighlightEditor._defaultColor ||= uiManager.highlightColors?.values().next().value || "#fff066"; } - blur() { - this.isShiftKeyDown = false; - if (this.#highlightWhenShiftUp) { - this.#highlightWhenShiftUp = false; - this.#onSelectEnd("main_toolbar"); - } - if (!this.hasSelection) { - return; - } - const { - activeElement - } = document; - for (const editor of this.#selectedEditors) { - if (editor.div.contains(activeElement)) { - this.#lastActiveElement = [editor, activeElement]; - editor._focusEventsAllowed = false; + static updateDefaultParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.HIGHLIGHT_COLOR: + HighlightEditor._defaultColor = value; + break; + case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: + HighlightEditor._defaultThickness = value; break; - } - } - } - focus() { - if (!this.#lastActiveElement) { - return; } - const [lastEditor, lastActiveElement] = this.#lastActiveElement; - this.#lastActiveElement = null; - lastActiveElement.addEventListener("focusin", () => { - lastEditor._focusEventsAllowed = true; - }, { - once: true - }); - lastActiveElement.focus(); } - #addKeyboardManager() { - window.addEventListener("keydown", this.#boundKeydown); - window.addEventListener("keyup", this.#boundKeyup); - } - #removeKeyboardManager() { - window.removeEventListener("keydown", this.#boundKeydown); - window.removeEventListener("keyup", this.#boundKeyup); - } - #addCopyPasteListeners() { - document.addEventListener("copy", this.#boundCopy); - document.addEventListener("cut", this.#boundCut); - document.addEventListener("paste", this.#boundPaste); - } - #removeCopyPasteListeners() { - document.removeEventListener("copy", this.#boundCopy); - document.removeEventListener("cut", this.#boundCut); - document.removeEventListener("paste", this.#boundPaste); - } - addEditListeners() { - this.#addKeyboardManager(); - this.#addCopyPasteListeners(); + translateInPage(x, y) {} + get toolbarPosition() { + return this.#lastPoint; } - removeEditListeners() { - this.#removeKeyboardManager(); - this.#removeCopyPasteListeners(); + get commentButtonPosition() { + return this.#firstPoint; } - copy(event) { - event.preventDefault(); - this.#activeEditor?.commitOrRemove(); - if (!this.hasSelection) { - return; - } - const editors = []; - for (const editor of this.#selectedEditors) { - const serialized = editor.serialize(true); - if (serialized) { - editors.push(serialized); - } - } - if (editors.length === 0) { - return; + updateParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.HIGHLIGHT_COLOR: + this.#updateColor(value); + break; + case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: + this.#updateThickness(value); + break; } - event.clipboardData.setData("application/pdfjs", JSON.stringify(editors)); - } - cut(event) { - this.copy(event); - this.delete(); } - paste(event) { - event.preventDefault(); - const { - clipboardData - } = event; - for (const item of clipboardData.items) { - for (const editorType of this.#editorTypes) { - if (editorType.isHandlingMimeForPasting(item.type)) { - editorType.paste(item, this.currentLayer); - return; - } - } - } - let data = clipboardData.getData("application/pdfjs"); - if (!data) { - return; - } - try { - data = JSON.parse(data); - } catch (ex) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`paste: "${ex.message}".`); - return; - } - if (!Array.isArray(data)) { - return; - } - this.unselectAll(); - const layer = this.currentLayer; - try { - const newEditors = []; - for (const editor of data) { - const deserializedEditor = layer.deserialize(editor); - if (!deserializedEditor) { - return; - } - newEditors.push(deserializedEditor); - } - const cmd = () => { - for (const editor of newEditors) { - this.#addEditorToLayer(editor); - } - this.#selectEditors(newEditors); - }; - const undo = () => { - for (const editor of newEditors) { - editor.remove(); - } - }; - this.addCommands({ - cmd, - undo, - mustExec: true - }); - } catch (ex) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`paste: "${ex.message}".`); - } + static get defaultPropertiesToUpdate() { + return [[AnnotationEditorParamsType.HIGHLIGHT_COLOR, HighlightEditor._defaultColor], [AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, HighlightEditor._defaultThickness]]; } - keydown(event) { - if (!this.isShiftKeyDown && event.key === "Shift") { - this.isShiftKeyDown = true; - } - if (this.#mode !== _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.NONE && !this.isEditorHandlingKeyboard) { - AnnotationEditorUIManager._keyboardManager.exec(this, event); - } + get propertiesToUpdate() { + return [[AnnotationEditorParamsType.HIGHLIGHT_COLOR, this.color || HighlightEditor._defaultColor], [AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, this.#thickness || HighlightEditor._defaultThickness], [AnnotationEditorParamsType.HIGHLIGHT_FREE, this.#isFreeHighlight]]; } - keyup(event) { - if (this.isShiftKeyDown && event.key === "Shift") { - this.isShiftKeyDown = false; - if (this.#highlightWhenShiftUp) { - this.#highlightWhenShiftUp = false; - this.#onSelectEnd("main_toolbar"); + onUpdatedColor() { + this.parent?.drawLayer.updateProperties(this.#id, { + root: { + fill: this.color, + "fill-opacity": this.opacity } - } - } - onEditingAction({ - name - }) { - switch (name) { - case "undo": - case "redo": - case "delete": - case "selectAll": - this[name](); - break; - case "highlightSelection": - this.highlightSelection("context_menu"); - break; - } + }); + this.#colorPicker?.updateColor(this.color); + super.onUpdatedColor(); } - #dispatchUpdateStates(details) { - const hasChanged = Object.entries(details).some(([key, value]) => this.#previousStates[key] !== value); - if (hasChanged) { - this._eventBus.dispatch("annotationeditorstateschanged", { - source: this, - details: Object.assign(this.#previousStates, details) - }); - if (this.#mode === _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.HIGHLIGHT && details.hasSelectedEditor === false) { - this.#dispatchUpdateUI([[_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType.HIGHLIGHT_FREE, true]]); - } - } + #updateColor(color) { + const setColorAndOpacity = (col, opa) => { + this.color = col; + this.opacity = opa; + this.onUpdatedColor(); + }; + const savedColor = this.color; + const savedOpacity = this.opacity; + this.addCommands({ + cmd: setColorAndOpacity.bind(this, color, HighlightEditor._defaultOpacity), + undo: setColorAndOpacity.bind(this, savedColor, savedOpacity), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.HIGHLIGHT_COLOR, + overwriteIfSameType: true, + keepUndo: true + }); + this._reportTelemetry({ + action: "color_changed", + color: this._uiManager.getNonHCMColorName(color) + }, true); } - #dispatchUpdateUI(details) { - this._eventBus.dispatch("annotationeditorparamschanged", { - source: this, - details + #updateThickness(thickness) { + const savedThickness = this.#thickness; + const setThickness = th => { + this.#thickness = th; + this.#changeThickness(th); + }; + this.addCommands({ + cmd: setThickness.bind(this, thickness), + undo: setThickness.bind(this, savedThickness), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.INK_THICKNESS, + overwriteIfSameType: true, + keepUndo: true }); + this._reportTelemetry({ + action: "thickness_changed", + thickness + }, true); } - setEditingState(isEditing) { - if (isEditing) { - this.#addFocusManager(); - this.#addCopyPasteListeners(); - this.#dispatchUpdateStates({ - isEditing: this.#mode !== _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.NONE, - isEmpty: this.#isEmpty(), - hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(), - hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(), - hasSelectedEditor: false - }); - } else { - this.#removeFocusManager(); - this.#removeCopyPasteListeners(); - this.#dispatchUpdateStates({ - isEditing: false + get toolbarButtons() { + if (this._uiManager.highlightColors) { + const colorPicker = this.#colorPicker = new ColorPicker({ + editor: this }); - this.disableUserSelect(false); + return [["colorPicker", colorPicker]]; } + return super.toolbarButtons; } - registerEditorTypes(types) { - if (this.#editorTypes) { - return; - } - this.#editorTypes = types; - for (const editorType of this.#editorTypes) { - this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate); - } + disableEditing() { + super.disableEditing(); + this.div.classList.toggle("disabled", true); } - getId() { - return this.#idManager.id; + enableEditing() { + super.enableEditing(); + this.div.classList.toggle("disabled", false); } - get currentLayer() { - return this.#allLayers.get(this.#currentPageIndex); + fixAndSetPosition() { + return super.fixAndSetPosition(this.#getRotation()); } - getLayer(pageIndex) { - return this.#allLayers.get(pageIndex); + getBaseTranslation() { + return [0, 0]; } - get currentPageIndex() { - return this.#currentPageIndex; + getRect(tx, ty) { + return super.getRect(tx, ty, this.#getRotation()); } - addLayer(layer) { - this.#allLayers.set(layer.pageIndex, layer); - if (this.#isEnabled) { - layer.enable(); - } else { - layer.disable(); + onceAdded(focus) { + if (!this.annotationElementId) { + this.parent.addUndoableEditor(this); + } + if (focus) { + this.div.focus(); } } - removeLayer(layer) { - this.#allLayers.delete(layer.pageIndex); + remove() { + this.#cleanDrawLayer(); + this._reportTelemetry({ + action: "deleted" + }); + super.remove(); } - updateMode(mode, editId = null, isFromKeyboard = false) { - if (this.#mode === mode) { - return; - } - this.#mode = mode; - if (mode === _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.NONE) { - this.setEditingState(false); - this.#disableAll(); - return; - } - this.setEditingState(true); - this.#enableAll(); - this.unselectAll(); - for (const layer of this.#allLayers.values()) { - layer.updateMode(mode); - } - if (!editId && isFromKeyboard) { - this.addNewEditorFromKeyboard(); + rebuild() { + if (!this.parent) { return; } - if (!editId) { + super.rebuild(); + if (this.div === null) { return; } - for (const editor of this.#allEditors.values()) { - if (editor.annotationElementId === editId) { - this.setSelected(editor); - editor.enterInEditMode(); - break; - } + this.#addToDrawLayer(); + if (!this.isAttachedToDOM) { + this.parent.add(this); } } - addNewEditorFromKeyboard() { - if (this.currentLayer.canCreateNewEmptyEditor()) { - this.currentLayer.addNewEditor(); + setParent(parent) { + let mustBeSelected = false; + if (this.parent && !parent) { + this.#cleanDrawLayer(); + } else if (parent) { + this.#addToDrawLayer(parent); + mustBeSelected = !this.parent && this.div?.classList.contains("selectedEditor"); + } + super.setParent(parent); + this.show(this._isVisible); + if (mustBeSelected) { + this.select(); } } - updateToolbar(mode) { - if (mode === this.#mode) { + #changeThickness(thickness) { + if (!this.#isFreeHighlight) { return; } - this._eventBus.dispatch("switchannotationeditormode", { - source: this, - mode + this.#createFreeOutlines({ + highlightOutlines: this.#highlightOutlines.getNewOutline(thickness / 2) }); + this.fixAndSetPosition(); + this.setDims(); } - updateParams(type, value) { - if (!this.#editorTypes) { + #cleanDrawLayer() { + if (this.#id === null || !this.parent) { return; } - switch (type) { - case _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType.CREATE: - this.currentLayer.addNewEditor(); - return; - case _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR: - this.#mainHighlightColorPicker?.updateColor(value); - break; - case _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL: - this._eventBus.dispatch("reporttelemetry", { - source: this, - details: { - type: "editing", - data: { - type: "highlight", - action: "toggle_visibility" - } - } - }); - (this.#showAllStates ||= new Map()).set(type, value); - this.showAllEditors("highlight", value); - break; - } - for (const editor of this.#selectedEditors) { - editor.updateParams(type, value); - } - for (const editorType of this.#editorTypes) { - editorType.updateDefaultParams(type, value); - } - } - showAllEditors(type, visible, updateButton = false) { - for (const editor of this.#allEditors.values()) { - if (editor.editorType === type) { - editor.show(visible); - } - } - const state = this.#showAllStates?.get(_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL) ?? true; - if (state !== visible) { - this.#dispatchUpdateUI([[_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL, visible]]); - } + this.parent.drawLayer.remove(this.#id); + this.#id = null; + this.parent.drawLayer.remove(this.#outlineId); + this.#outlineId = null; } - enableWaiting(mustWait = false) { - if (this.#isWaiting === mustWait) { + #addToDrawLayer(parent = this.parent) { + if (this.#id !== null) { return; } - this.#isWaiting = mustWait; - for (const layer of this.#allLayers.values()) { - if (mustWait) { - layer.disableClick(); - } else { - layer.enableClick(); - } - layer.div.classList.toggle("waiting", mustWait); - } - } - #enableAll() { - if (!this.#isEnabled) { - this.#isEnabled = true; - for (const layer of this.#allLayers.values()) { - layer.enable(); - } - for (const editor of this.#allEditors.values()) { - editor.enable(); - } - } - } - #disableAll() { - this.unselectAll(); - if (this.#isEnabled) { - this.#isEnabled = false; - for (const layer of this.#allLayers.values()) { - layer.disable(); - } - for (const editor of this.#allEditors.values()) { - editor.disable(); + ({ + id: this.#id, + clipPathId: this.#clipPathId + } = parent.drawLayer.draw({ + bbox: this.#highlightOutlines.box, + root: { + viewBox: "0 0 1 1", + fill: this.color, + "fill-opacity": this.opacity + }, + rootClass: { + highlight: true, + free: this.#isFreeHighlight + }, + path: { + d: this.#highlightOutlines.toSVGPath() } - } - } - getEditors(pageIndex) { - const editors = []; - for (const editor of this.#allEditors.values()) { - if (editor.pageIndex === pageIndex) { - editors.push(editor); + }, false, true)); + this.#outlineId = parent.drawLayer.drawOutline({ + rootClass: { + highlightOutline: true, + free: this.#isFreeHighlight + }, + bbox: this.#focusOutlines.box, + path: { + d: this.#focusOutlines.toSVGPath() } + }, this.#isFreeHighlight); + if (this.#highlightDiv) { + this.#highlightDiv.style.clipPath = this.#clipPathId; } - return editors; - } - getEditor(id) { - return this.#allEditors.get(id); - } - addEditor(editor) { - this.#allEditors.set(editor.id, editor); } - removeEditor(editor) { - if (editor.div.contains(document.activeElement)) { - if (this.#focusMainContainerTimeoutId) { - clearTimeout(this.#focusMainContainerTimeoutId); - } - this.#focusMainContainerTimeoutId = setTimeout(() => { - this.focusMainContainer(); - this.#focusMainContainerTimeoutId = null; - }, 0); - } - this.#allEditors.delete(editor.id); - this.unselect(editor); - if (!editor.annotationElementId || !this.#deletedAnnotationsElementIds.has(editor.annotationElementId)) { - this.#annotationStorage?.remove(editor.id); + static #rotateBbox([x, y, width, height], angle) { + switch (angle) { + case 90: + return [1 - y - height, x, height, width]; + case 180: + return [1 - x - width, 1 - y - height, width, height]; + case 270: + return [y, 1 - x - width, height, width]; } + return [x, y, width, height]; } - addDeletedAnnotationElement(editor) { - this.#deletedAnnotationsElementIds.add(editor.annotationElementId); - editor.deleted = true; - } - isDeletedAnnotationElement(annotationElementId) { - return this.#deletedAnnotationsElementIds.has(annotationElementId); - } - removeDeletedAnnotationElement(editor) { - this.#deletedAnnotationsElementIds.delete(editor.annotationElementId); - editor.deleted = false; - } - #addEditorToLayer(editor) { - const layer = this.#allLayers.get(editor.pageIndex); - if (layer) { - layer.addOrRebuild(editor); + rotate(angle) { + const { + drawLayer + } = this.parent; + let box; + if (this.#isFreeHighlight) { + angle = (angle - this.rotation + 360) % 360; + box = HighlightEditor.#rotateBbox(this.#highlightOutlines.box, angle); } else { - this.addEditor(editor); - this.addToAnnotationStorage(editor); + box = HighlightEditor.#rotateBbox([this.x, this.y, this.width, this.height], angle); } + drawLayer.updateProperties(this.#id, { + bbox: box, + root: { + "data-main-rotation": angle + } + }); + drawLayer.updateProperties(this.#outlineId, { + bbox: HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle), + root: { + "data-main-rotation": angle + } + }); } - setActiveEditor(editor) { - if (this.#activeEditor === editor) { - return; + render() { + if (this.div) { + return this.div; } - this.#activeEditor = editor; - if (editor) { - this.#dispatchUpdateUI(editor.propertiesToUpdate); + const div = super.render(); + if (this.#text) { + div.setAttribute("aria-label", this.#text); + div.setAttribute("role", "mark"); } - } - get #lastSelectedEditor() { - let ed = null; - for (ed of this.#selectedEditors) {} - return ed; - } - updateUI(editor) { - if (this.#lastSelectedEditor === editor) { - this.#dispatchUpdateUI(editor.propertiesToUpdate); + if (this.#isFreeHighlight) { + div.classList.add("free"); + } else { + this.div.addEventListener("keydown", this.#keydown.bind(this), { + signal: this._uiManager._signal + }); } + const highlightDiv = this.#highlightDiv = document.createElement("div"); + div.append(highlightDiv); + highlightDiv.setAttribute("aria-hidden", "true"); + highlightDiv.className = "internal"; + highlightDiv.style.clipPath = this.#clipPathId; + this.setDims(); + bindEvents(this, this.#highlightDiv, ["pointerover", "pointerleave"]); + this.enableEditing(); + return div; } - toggleSelected(editor) { - if (this.#selectedEditors.has(editor)) { - this.#selectedEditors.delete(editor); - editor.unselect(); - this.#dispatchUpdateStates({ - hasSelectedEditor: this.hasSelection + pointerover() { + if (!this.isSelected) { + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hovered: true + } }); - return; } - this.#selectedEditors.add(editor); - editor.select(); - this.#dispatchUpdateUI(editor.propertiesToUpdate); - this.#dispatchUpdateStates({ - hasSelectedEditor: true - }); } - setSelected(editor) { - for (const ed of this.#selectedEditors) { - if (ed !== editor) { - ed.unselect(); - } + pointerleave() { + if (!this.isSelected) { + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hovered: false + } + }); } - this.#selectedEditors.clear(); - this.#selectedEditors.add(editor); - editor.select(); - this.#dispatchUpdateUI(editor.propertiesToUpdate); - this.#dispatchUpdateStates({ - hasSelectedEditor: true - }); - } - isSelected(editor) { - return this.#selectedEditors.has(editor); - } - get firstSelectedEditor() { - return this.#selectedEditors.values().next().value; - } - unselect(editor) { - editor.unselect(); - this.#selectedEditors.delete(editor); - this.#dispatchUpdateStates({ - hasSelectedEditor: this.hasSelection - }); - } - get hasSelection() { - return this.#selectedEditors.size !== 0; - } - get isEnterHandled() { - return this.#selectedEditors.size === 1 && this.firstSelectedEditor.isEnterHandled; - } - undo() { - this.#commandManager.undo(); - this.#dispatchUpdateStates({ - hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(), - hasSomethingToRedo: true, - isEmpty: this.#isEmpty() - }); } - redo() { - this.#commandManager.redo(); - this.#dispatchUpdateStates({ - hasSomethingToUndo: true, - hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(), - isEmpty: this.#isEmpty() - }); + #keydown(event) { + HighlightEditor._keyboardManager.exec(this, event); } - addCommands(params) { - this.#commandManager.add(params); - this.#dispatchUpdateStates({ - hasSomethingToUndo: true, - hasSomethingToRedo: false, - isEmpty: this.#isEmpty() - }); + _moveCaret(direction) { + this.parent.unselect(this); + switch (direction) { + case 0: + case 2: + this.#setCaret(true); + break; + case 1: + case 3: + this.#setCaret(false); + break; + } } - #isEmpty() { - if (this.#allEditors.size === 0) { - return true; + #setCaret(start) { + if (!this.#anchorNode) { + return; } - if (this.#allEditors.size === 1) { - for (const editor of this.#allEditors.values()) { - return editor.isEmpty(); - } + const selection = window.getSelection(); + if (start) { + selection.setPosition(this.#anchorNode, this.#anchorOffset); + } else { + selection.setPosition(this.#focusNode, this.#focusOffset); } - return false; } - delete() { - this.commitOrRemove(); - if (!this.hasSelection) { + select() { + super.select(); + if (!this.#outlineId) { return; } - const editors = [...this.#selectedEditors]; - const cmd = () => { - for (const editor of editors) { - editor.remove(); - } - }; - const undo = () => { - for (const editor of editors) { - this.#addEditorToLayer(editor); + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hovered: false, + selected: true } - }; - this.addCommands({ - cmd, - undo, - mustExec: true }); } - commitOrRemove() { - this.#activeEditor?.commitOrRemove(); - } - hasSomethingToControl() { - return this.#activeEditor || this.hasSelection; - } - #selectEditors(editors) { - for (const editor of this.#selectedEditors) { - editor.unselect(); + unselect() { + super.unselect(); + if (!this.#outlineId) { + return; } - this.#selectedEditors.clear(); - for (const editor of editors) { - if (editor.isEmpty()) { - continue; + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + selected: false } - this.#selectedEditors.add(editor); - editor.select(); - } - this.#dispatchUpdateStates({ - hasSelectedEditor: this.hasSelection }); - } - selectAll() { - for (const editor of this.#selectedEditors) { - editor.commit(); + if (!this.#isFreeHighlight) { + this.#setCaret(false); } - this.#selectEditors(this.#allEditors.values()); } - unselectAll() { - if (this.#activeEditor) { - this.#activeEditor.commitOrRemove(); - if (this.#mode !== _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.NONE) { - return; - } - } - if (!this.hasSelection) { - return; - } - for (const editor of this.#selectedEditors) { - editor.unselect(); - } - this.#selectedEditors.clear(); - this.#dispatchUpdateStates({ - hasSelectedEditor: false - }); + get _mustFixPosition() { + return !this.#isFreeHighlight; } - translateSelectedEditors(x, y, noCommit = false) { - if (!noCommit) { - this.commitOrRemove(); - } - if (!this.hasSelection) { - return; - } - this.#translation[0] += x; - this.#translation[1] += y; - const [totalX, totalY] = this.#translation; - const editors = [...this.#selectedEditors]; - const TIME_TO_WAIT = 1000; - if (this.#translationTimeoutId) { - clearTimeout(this.#translationTimeoutId); - } - this.#translationTimeoutId = setTimeout(() => { - this.#translationTimeoutId = null; - this.#translation[0] = this.#translation[1] = 0; - this.addCommands({ - cmd: () => { - for (const editor of editors) { - if (this.#allEditors.has(editor.id)) { - editor.translateInPage(totalX, totalY); - } - } - }, - undo: () => { - for (const editor of editors) { - if (this.#allEditors.has(editor.id)) { - editor.translateInPage(-totalX, -totalY); - } - } - }, - mustExec: false + show(visible = this._isVisible) { + super.show(visible); + if (this.parent) { + this.parent.drawLayer.updateProperties(this.#id, { + rootClass: { + hidden: !visible + } }); - }, TIME_TO_WAIT); - for (const editor of editors) { - editor.translateInPage(x, y); - } - } - setUpDragSession() { - if (!this.hasSelection) { - return; - } - this.disableUserSelect(true); - this.#draggingEditors = new Map(); - for (const editor of this.#selectedEditors) { - this.#draggingEditors.set(editor, { - savedX: editor.x, - savedY: editor.y, - savedPageIndex: editor.pageIndex, - newX: 0, - newY: 0, - newPageIndex: -1 + this.parent.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hidden: !visible + } }); } } - endDragSession() { - if (!this.#draggingEditors) { - return false; + #getRotation() { + return this.#isFreeHighlight ? this.rotation : 0; + } + #serializeBoxes() { + if (this.#isFreeHighlight) { + return null; } - this.disableUserSelect(false); - const map = this.#draggingEditors; - this.#draggingEditors = null; - let mustBeAddedInUndoStack = false; - for (const [{ + const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; + const boxes = this.#boxes; + const quadPoints = new Float32Array(boxes.length * 8); + let i = 0; + for (const { x, y, - pageIndex - }, value] of map) { - value.newX = x; - value.newY = y; - value.newPageIndex = pageIndex; - mustBeAddedInUndoStack ||= x !== value.savedX || y !== value.savedY || pageIndex !== value.savedPageIndex; - } - if (!mustBeAddedInUndoStack) { - return false; + width, + height + } of boxes) { + const sx = x * pageWidth + pageX; + const sy = (1 - y) * pageHeight + pageY; + quadPoints[i] = quadPoints[i + 4] = sx; + quadPoints[i + 1] = quadPoints[i + 3] = sy; + quadPoints[i + 2] = quadPoints[i + 6] = sx + width * pageWidth; + quadPoints[i + 5] = quadPoints[i + 7] = sy - height * pageHeight; + i += 8; } - const move = (editor, x, y, pageIndex) => { - if (this.#allEditors.has(editor.id)) { - const parent = this.#allLayers.get(pageIndex); - if (parent) { - editor._setParentAndPosition(parent, x, y); - } else { - editor.pageIndex = pageIndex; - editor.x = x; - editor.y = y; - } - } + return quadPoints; + } + #serializeOutlines(rect) { + return this.#highlightOutlines.serialize(rect, this.#getRotation()); + } + static startHighlighting(parent, isLTR, { + target: textLayer, + x, + y + }) { + const { + x: layerX, + y: layerY, + width: parentWidth, + height: parentHeight + } = textLayer.getBoundingClientRect(); + const ac = new AbortController(); + const signal = parent.combinedSignal(ac); + const pointerUpCallback = e => { + ac.abort(); + this.#endHighlight(parent, e); }; - this.addCommands({ - cmd: () => { - for (const [editor, { - newX, - newY, - newPageIndex - }] of map) { - move(editor, newX, newY, newPageIndex); - } + window.addEventListener("blur", pointerUpCallback, { + signal + }); + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("pointerdown", stopEvent, { + capture: true, + passive: false, + signal + }); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + textLayer.addEventListener("pointermove", this.#highlightMove.bind(this, parent), { + signal + }); + this._freeHighlight = new FreeHighlightOutliner({ + x, + y + }, [layerX, layerY, parentWidth, parentHeight], parent.scale, this._defaultThickness / 2, isLTR, 0.001); + ({ + id: this._freeHighlightId, + clipPathId: this._freeHighlightClipId + } = parent.drawLayer.draw({ + bbox: [0, 0, 1, 1], + root: { + viewBox: "0 0 1 1", + fill: this._defaultColor, + "fill-opacity": this._defaultOpacity }, - undo: () => { - for (const [editor, { - savedX, - savedY, - savedPageIndex - }] of map) { - move(editor, savedX, savedY, savedPageIndex); - } + rootClass: { + highlight: true, + free: true }, - mustExec: true - }); - return true; + path: { + d: this._freeHighlight.toSVGPath() + } + }, true, true)); } - dragSelectedEditors(tx, ty) { - if (!this.#draggingEditors) { - return; - } - for (const editor of this.#draggingEditors.keys()) { - editor.drag(tx, ty); + static #highlightMove(parent, event) { + if (this._freeHighlight.add(event)) { + parent.drawLayer.updateProperties(this._freeHighlightId, { + path: { + d: this._freeHighlight.toSVGPath() + } + }); } } - rebuild(editor) { - if (editor.parent === null) { - const parent = this.getLayer(editor.pageIndex); - if (parent) { - parent.changeParent(editor); - parent.addOrRebuild(editor); - } else { - this.addEditor(editor); - this.addToAnnotationStorage(editor); - editor.rebuild(); - } + static #endHighlight(parent, event) { + if (!this._freeHighlight.isEmpty()) { + parent.createAndAddNewEditor(event, false, { + highlightId: this._freeHighlightId, + highlightOutlines: this._freeHighlight.getOutlines(), + clipPathId: this._freeHighlightClipId, + methodOfCreation: "main_toolbar" + }); } else { - editor.parent.addOrRebuild(editor); + parent.drawLayer.remove(this._freeHighlightId); } + this._freeHighlightId = -1; + this._freeHighlight = null; + this._freeHighlightClipId = ""; } - get isEditorHandlingKeyboard() { - return this.getActive()?.shouldGetKeyboardEvents() || this.#selectedEditors.size === 1 && this.firstSelectedEditor.shouldGetKeyboardEvents(); - } - isActive(editor) { - return this.#activeEditor === editor; - } - getActive() { - return this.#activeEditor; - } - getMode() { - return this.#mode; - } - get imageManager() { - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "imageManager", new ImageManager()); - } - getSelectionBoxes(textLayer) { - if (!textLayer) { - return null; - } - const selection = document.getSelection(); - for (let i = 0, ii = selection.rangeCount; i < ii; i++) { - if (!textLayer.contains(selection.getRangeAt(i).commonAncestorContainer)) { - return null; - } - } - const { - x: layerX, - y: layerY, - width: parentWidth, - height: parentHeight - } = textLayer.getBoundingClientRect(); - let rotator; - switch (textLayer.getAttribute("data-main-rotation")) { - case "90": - rotator = (x, y, w, h) => ({ - x: (y - layerY) / parentHeight, - y: 1 - (x + w - layerX) / parentWidth, - width: h / parentHeight, - height: w / parentWidth - }); - break; - case "180": - rotator = (x, y, w, h) => ({ - x: 1 - (x + w - layerX) / parentWidth, - y: 1 - (y + h - layerY) / parentHeight, - width: w / parentWidth, - height: h / parentHeight - }); - break; - case "270": - rotator = (x, y, w, h) => ({ - x: 1 - (y + h - layerY) / parentHeight, - y: (x - layerX) / parentWidth, - width: h / parentHeight, - height: w / parentWidth - }); - break; - default: - rotator = (x, y, w, h) => ({ - x: (x - layerX) / parentWidth, - y: (y - layerY) / parentHeight, - width: w / parentWidth, - height: h / parentHeight - }); - break; + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof HighlightAnnotationElement) { + const { + data: { + quadPoints, + rect, + rotation, + id, + color, + opacity, + popupRef, + richText, + contentsObj, + creationDate, + modificationDate + }, + parent: { + page: { + pageNumber + } + } + } = data; + initialData = data = { + annotationType: AnnotationEditorType.HIGHLIGHT, + color: Array.from(color), + opacity, + quadPoints, + boxes: null, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + annotationElementId: id, + id, + deleted: false, + popupRef, + richText, + comment: contentsObj?.str || null, + creationDate, + modificationDate + }; + } else if (data instanceof InkAnnotationElement) { + const { + data: { + inkLists, + rect, + rotation, + id, + color, + borderStyle: { + rawWidth: thickness + }, + popupRef, + richText, + contentsObj, + creationDate, + modificationDate + }, + parent: { + page: { + pageNumber + } + } + } = data; + initialData = data = { + annotationType: AnnotationEditorType.HIGHLIGHT, + color: Array.from(color), + thickness, + inkLists, + boxes: null, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + annotationElementId: id, + id, + deleted: false, + popupRef, + richText, + comment: contentsObj?.str || null, + creationDate, + modificationDate + }; } - const boxes = []; - for (let i = 0, ii = selection.rangeCount; i < ii; i++) { - const range = selection.getRangeAt(i); - if (range.collapsed) { - continue; + const { + color, + quadPoints, + inkLists, + outlines, + opacity + } = data; + const editor = await super.deserialize(data, parent, uiManager); + editor.color = Util.makeHexColor(...color); + editor.opacity = opacity || 1; + if (inkLists) { + editor.#thickness = data.thickness; + } + editor._initialData = initialData; + if (data.comment) { + editor.setCommentData(data); + } + const [pageWidth, pageHeight] = editor.pageDimensions; + const [pageX, pageY] = editor.pageTranslation; + if (quadPoints) { + const boxes = editor.#boxes = []; + for (let i = 0; i < quadPoints.length; i += 8) { + boxes.push({ + x: (quadPoints[i] - pageX) / pageWidth, + y: 1 - (quadPoints[i + 1] - pageY) / pageHeight, + width: (quadPoints[i + 2] - quadPoints[i]) / pageWidth, + height: (quadPoints[i + 1] - quadPoints[i + 5]) / pageHeight + }); } - for (const { - x, - y, - width, - height - } of range.getClientRects()) { - if (width === 0 || height === 0) { - continue; - } - boxes.push(rotator(x, y, width, height)); + editor.#createOutlines(); + editor.#addToDrawLayer(); + editor.rotate(editor.rotation); + } else if (inkLists || outlines) { + editor.#isFreeHighlight = true; + const points = (inkLists || outlines.points)[0]; + const point = { + x: points[0] - pageX, + y: pageHeight - (points[1] - pageY) + }; + const outliner = new FreeHighlightOutliner(point, [0, 0, pageWidth, pageHeight], 1, editor.#thickness / 2, true, 0.001); + for (let i = 0, ii = points.length; i < ii; i += 2) { + point.x = points[i] - pageX; + point.y = pageHeight - (points[i + 1] - pageY); + outliner.add(point); } + const { + id, + clipPathId + } = parent.drawLayer.draw({ + bbox: [0, 0, 1, 1], + root: { + viewBox: "0 0 1 1", + fill: editor.color, + "fill-opacity": editor._defaultOpacity + }, + rootClass: { + highlight: true, + free: true + }, + path: { + d: outliner.toSVGPath() + } + }, true, true); + editor.#createFreeOutlines({ + highlightOutlines: outliner.getOutlines(), + highlightId: id, + clipPathId + }); + editor.#addToDrawLayer(); + editor.rotate(editor.parentRotation); } - return boxes.length === 0 ? null : boxes; + return editor; + } + serialize(isForCopying = false) { + if (this.isEmpty() || isForCopying) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const color = AnnotationEditor._colorManager.convert(this._uiManager.getNonHCMColor(this.color)); + const serialized = super.serialize(isForCopying); + Object.assign(serialized, { + color, + opacity: this.opacity, + thickness: this.#thickness, + quadPoints: this.#serializeBoxes(), + outlines: this.#serializeOutlines(serialized.rect) + }); + this.addComment(serialized); + if (this.annotationElementId && !this.#hasElementChanged(serialized)) { + return null; + } + serialized.id = this.annotationElementId; + return serialized; + } + #hasElementChanged(serialized) { + const { + color + } = this._initialData; + return this.hasEditedComment || serialized.color.some((c, i) => c !== color[i]); + } + renderAnnotationElement(annotation) { + if (this.deleted) { + annotation.hide(); + return null; + } + annotation.updateEdited({ + rect: this.getPDFRect(), + popup: this.comment + }); + return null; + } + static canCreateNewEmptyEditor() { + return false; } } +;// ./src/display/editor/draw.js -/***/ }), - -/***/ 94: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFFetchStream: () => (/* binding */ PDFFetchStream) -/* harmony export */ }); -/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(292); -/* harmony import */ var _network_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(490); -function createFetchOptions(headers, withCredentials, abortController) { - return { - method: "GET", - headers, - signal: abortController.signal, - mode: "cors", - credentials: withCredentials ? "include" : "same-origin", - redirect: "follow" - }; -} -function createHeaders(httpHeaders) { - const headers = new Headers(); - for (const property in httpHeaders) { - const value = httpHeaders[property]; - if (value === undefined) { - continue; +class DrawingOptions { + #svgProperties = Object.create(null); + updateProperty(name, value) { + this[name] = value; + this.updateSVGProperty(name, value); + } + updateProperties(properties) { + if (!properties) { + return; + } + for (const [name, value] of Object.entries(properties)) { + if (!name.startsWith("_")) { + this.updateProperty(name, value); + } } - headers.append(property, value); } - return headers; -} -function getArrayBuffer(val) { - if (val instanceof Uint8Array) { - return val.buffer; + updateSVGProperty(name, value) { + this.#svgProperties[name] = value; } - if (val instanceof ArrayBuffer) { - return val; + toSVGProperties() { + const root = this.#svgProperties; + this.#svgProperties = Object.create(null); + return { + root + }; } - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`getArrayBuffer - unexpected data format: ${val}`); - return new Uint8Array(val).buffer; -} -class PDFFetchStream { - constructor(source) { - this.source = source; - this.isHttp = /^https?:/i.test(source.url); - this.httpHeaders = this.isHttp && source.httpHeaders || {}; - this._fullRequestReader = null; - this._rangeRequestReaders = []; + reset() { + this.#svgProperties = Object.create(null); } - get _progressiveDataLength() { - return this._fullRequestReader?._loaded ?? 0; + updateAll(options = this) { + this.updateProperties(options); } - getFullReader() { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.assert)(!this._fullRequestReader, "PDFFetchStream.getFullReader can only be called once."); - this._fullRequestReader = new PDFFetchStreamReader(this); - return this._fullRequestReader; + clone() { + unreachable("Not implemented"); } - getRangeReader(begin, end) { - if (end <= this._progressiveDataLength) { - return null; +} +class DrawingEditor extends AnnotationEditor { + #drawOutlines = null; + #mustBeCommitted; + _colorPicker = null; + _drawId = null; + static _currentDrawId = -1; + static _currentParent = null; + static #currentDraw = null; + static #currentDrawingAC = null; + static #currentDrawingOptions = null; + static _INNER_MARGIN = 3; + constructor(params) { + super(params); + this.#mustBeCommitted = params.mustBeCommitted || false; + this._addOutlines(params); + } + onUpdatedColor() { + this._colorPicker?.update(this.color); + super.onUpdatedColor(); + } + onUpdatedOpacity() { + this._colorPicker?.updateOpacity?.(this.opacity); + } + _addOutlines(params) { + if (params.drawOutlines) { + this.#createDrawOutlines(params); + this.#addToDrawLayer(); } - const reader = new PDFFetchStreamRangeReader(this, begin, end); - this._rangeRequestReaders.push(reader); - return reader; } - cancelAllRequests(reason) { - this._fullRequestReader?.cancel(reason); - for (const reader of this._rangeRequestReaders.slice(0)) { - reader.cancel(reason); + #createDrawOutlines({ + drawOutlines, + drawId, + drawingOptions + }) { + this.#drawOutlines = drawOutlines; + this._drawingOptions ||= drawingOptions; + if (!this.annotationElementId) { + this._uiManager.a11yAlert(AnnotationEditor._l10nAlert[this.editorType]); } + if (drawId >= 0) { + this._drawId = drawId; + this.parent.drawLayer.finalizeDraw(drawId, drawOutlines.defaultProperties); + } else { + this._drawId = this.#createDrawing(drawOutlines, this.parent); + } + this.#updateBbox(drawOutlines.box); } -} -class PDFFetchStreamReader { - constructor(stream) { - this._stream = stream; - this._reader = null; - this._loaded = 0; - this._filename = null; - const source = stream.source; - this._withCredentials = source.withCredentials || false; - this._contentLength = source.length; - this._headersCapability = Promise.withResolvers(); - this._disableRange = source.disableRange || false; - this._rangeChunkSize = source.rangeChunkSize; - if (!this._rangeChunkSize && !this._disableRange) { - this._disableRange = true; - } - this._abortController = new AbortController(); - this._isStreamingSupported = !source.disableStream; - this._isRangeSupported = !source.disableRange; - this._headers = createHeaders(this._stream.httpHeaders); - const url = source.url; - fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(response => { - if (!(0,_network_utils_js__WEBPACK_IMPORTED_MODULE_1__.validateResponseStatus)(response.status)) { - throw (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_1__.createResponseStatusError)(response.status, url); - } - this._reader = response.body.getReader(); - this._headersCapability.resolve(); - const getResponseHeader = name => response.headers.get(name); - const { - allowRangeRequests, - suggestedLength - } = (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_1__.validateRangeRequestCapabilities)({ - getResponseHeader, - isHttp: this._stream.isHttp, - rangeChunkSize: this._rangeChunkSize, - disableRange: this._disableRange - }); - this._isRangeSupported = allowRangeRequests; - this._contentLength = suggestedLength || this._contentLength; - this._filename = (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_1__.extractFilenameFromHeader)(getResponseHeader); - if (!this._isStreamingSupported && this._isRangeSupported) { - this.cancel(new _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AbortException("Streaming is disabled.")); + #createDrawing(drawOutlines, parent) { + const { + id + } = parent.drawLayer.draw(DrawingEditor._mergeSVGProperties(this._drawingOptions.toSVGProperties(), drawOutlines.defaultSVGProperties), false, false); + return id; + } + static _mergeSVGProperties(p1, p2) { + const p1Keys = new Set(Object.keys(p1)); + for (const [key, value] of Object.entries(p2)) { + if (p1Keys.has(key)) { + Object.assign(p1[key], value); + } else { + p1[key] = value; } - }).catch(this._headersCapability.reject); - this.onProgress = null; + } + return p1; } - get headersReady() { - return this._headersCapability.promise; + static getDefaultDrawingOptions(_options) { + unreachable("Not implemented"); } - get filename() { - return this._filename; + static get typesMap() { + unreachable("Not implemented"); } - get contentLength() { - return this._contentLength; + static get isDrawer() { + return true; } - get isRangeSupported() { - return this._isRangeSupported; + static get supportMultipleDrawings() { + return false; } - get isStreamingSupported() { - return this._isStreamingSupported; + static updateDefaultParams(type, value) { + const propertyName = this.typesMap.get(type); + if (propertyName) { + this._defaultDrawingOptions.updateProperty(propertyName, value); + } + if (this._currentParent) { + DrawingEditor.#currentDraw.updateProperty(propertyName, value); + this._currentParent.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties()); + } } - async read() { - await this._headersCapability.promise; + updateParams(type, value) { + const propertyName = this.constructor.typesMap.get(type); + if (propertyName) { + this._updateProperty(type, propertyName, value); + } + } + static get defaultPropertiesToUpdate() { + const properties = []; + const options = this._defaultDrawingOptions; + for (const [type, name] of this.typesMap) { + properties.push([type, options[name]]); + } + return properties; + } + get propertiesToUpdate() { + const properties = []; const { - value, - done - } = await this._reader.read(); - if (done) { - return { - value, - done - }; + _drawingOptions + } = this; + for (const [type, name] of this.constructor.typesMap) { + properties.push([type, _drawingOptions[name]]); } - this._loaded += value.byteLength; - this.onProgress?.({ - loaded: this._loaded, - total: this._contentLength + return properties; + } + _updateProperty(type, name, value) { + const options = this._drawingOptions; + const savedValue = options[name]; + const setter = val => { + options.updateProperty(name, val); + const bbox = this.#drawOutlines.updateProperty(name, val); + if (bbox) { + this.#updateBbox(bbox); + } + this.parent?.drawLayer.updateProperties(this._drawId, options.toSVGProperties()); + if (type === this.colorType) { + this.onUpdatedColor(); + } else if (type === this.opacityType) { + this.onUpdatedOpacity(); + } + }; + this.addCommands({ + cmd: setter.bind(this, value), + undo: setter.bind(this, savedValue), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type, + overwriteIfSameType: true, + keepUndo: true }); - return { - value: getArrayBuffer(value), - done: false + } + _updateColorAndOpacity(color, opacity) { + const colorName = this.constructor.typesMap.get(this.colorType); + const opacityName = this.constructor.typesMap.get(this.opacityType); + const options = this._drawingOptions; + const savedColor = options[colorName]; + const savedOpacity = options[opacityName]; + const setter = (c, op) => { + options.updateProperty(colorName, c); + options.updateProperty(opacityName, op); + this.#drawOutlines.updateProperty(colorName, c); + this.#drawOutlines.updateProperty(opacityName, op); + this.parent?.drawLayer.updateProperties(this._drawId, options.toSVGProperties()); + this.onUpdatedColor(); + this.onUpdatedOpacity(); }; + this.addCommands({ + cmd: setter.bind(this, color, opacity), + undo: setter.bind(this, savedColor, savedOpacity), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.INK_COLOR_AND_OPACITY, + overwriteIfSameType: true, + keepUndo: true + }); } - cancel(reason) { - this._reader?.cancel(reason); - this._abortController.abort(); + _onResizing() { + this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathResizingSVGProperties(this.#convertToDrawSpace()), { + bbox: this.#rotateBox() + })); } -} -class PDFFetchStreamRangeReader { - constructor(stream, begin, end) { - this._stream = stream; - this._reader = null; - this._loaded = 0; - const source = stream.source; - this._withCredentials = source.withCredentials || false; - this._readCapability = Promise.withResolvers(); - this._isStreamingSupported = !source.disableStream; - this._abortController = new AbortController(); - this._headers = createHeaders(this._stream.httpHeaders); - this._headers.append("Range", `bytes=${begin}-${end - 1}`); - const url = source.url; - fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(response => { - if (!(0,_network_utils_js__WEBPACK_IMPORTED_MODULE_1__.validateResponseStatus)(response.status)) { - throw (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_1__.createResponseStatusError)(response.status, url); - } - this._readCapability.resolve(); - this._reader = response.body.getReader(); - }).catch(this._readCapability.reject); - this.onProgress = null; + _onResized() { + this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathResizedSVGProperties(this.#convertToDrawSpace()), { + bbox: this.#rotateBox() + })); } - get isStreamingSupported() { - return this._isStreamingSupported; + _onTranslating(_x, _y) { + this.parent?.drawLayer.updateProperties(this._drawId, { + bbox: this.#rotateBox() + }); } - async read() { - await this._readCapability.promise; - const { - value, - done - } = await this._reader.read(); - if (done) { - return { - value, - done - }; - } - this._loaded += value.byteLength; - this.onProgress?.({ - loaded: this._loaded + _onTranslated() { + this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathTranslatedSVGProperties(this.#convertToDrawSpace(), this.parentDimensions), { + bbox: this.#rotateBox() + })); + } + _onStartDragging() { + this.parent?.drawLayer.updateProperties(this._drawId, { + rootClass: { + moving: true + } }); - return { - value: getArrayBuffer(value), - done: false - }; } - cancel(reason) { - this._reader?.cancel(reason); - this._abortController.abort(); + _onStopDragging() { + this.parent?.drawLayer.updateProperties(this._drawId, { + rootClass: { + moving: false + } + }); } -} - - -/***/ }), - -/***/ 10: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ FontFaceObject: () => (/* binding */ FontFaceObject), -/* harmony export */ FontLoader: () => (/* binding */ FontLoader) -/* harmony export */ }); -/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(292); - -class FontLoader { - #systemFonts = new Set(); - constructor({ - ownerDocument = globalThis.document, - styleElement = null - }) { - this._document = ownerDocument; - this.nativeFontFaces = new Set(); - this.styleElement = null; - this.loadingRequests = []; - this.loadTestFontId = 0; + commit() { + super.commit(); + this.disableEditMode(); + this.disableEditing(); } - addNativeFontFace(nativeFontFace) { - this.nativeFontFaces.add(nativeFontFace); - this._document.fonts.add(nativeFontFace); + disableEditing() { + super.disableEditing(); + this.div.classList.toggle("disabled", true); } - removeNativeFontFace(nativeFontFace) { - this.nativeFontFaces.delete(nativeFontFace); - this._document.fonts.delete(nativeFontFace); + enableEditing() { + super.enableEditing(); + this.div.classList.toggle("disabled", false); } - insertRule(rule) { - if (!this.styleElement) { - this.styleElement = this._document.createElement("style"); - this._document.documentElement.getElementsByTagName("head")[0].append(this.styleElement); - } - const styleSheet = this.styleElement.sheet; - styleSheet.insertRule(rule, styleSheet.cssRules.length); + getBaseTranslation() { + return [0, 0]; } - clear() { - for (const nativeFontFace of this.nativeFontFaces) { - this._document.fonts.delete(nativeFontFace); + get isResizable() { + return true; + } + onceAdded(focus) { + if (!this.annotationElementId) { + this.parent.addUndoableEditor(this); } - this.nativeFontFaces.clear(); - this.#systemFonts.clear(); - if (this.styleElement) { - this.styleElement.remove(); - this.styleElement = null; + this._isDraggable = true; + if (this.#mustBeCommitted) { + this.#mustBeCommitted = false; + this.commit(); + this.parent.setSelected(this); + if (focus && this.isOnScreen) { + this.div.focus(); + } } } - async loadSystemFont({ - systemFontInfo: info, - _inspectFont - }) { - if (!info || this.#systemFonts.has(info.loadedName)) { + remove() { + this.#cleanDrawLayer(); + super.remove(); + } + rebuild() { + if (!this.parent) { return; } - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.assert)(!this.disableFontFace, "loadSystemFont shouldn't be called when `disableFontFace` is set."); - if (this.isFontLoadingAPISupported) { - const { - loadedName, - src, - style - } = info; - const fontFace = new FontFace(loadedName, src, style); - this.addNativeFontFace(fontFace); - try { - await fontFace.load(); - this.#systemFonts.add(loadedName); - _inspectFont?.(info); - } catch { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Cannot load system font: ${info.baseFontName}, installing it could help to improve PDF rendering.`); - this.removeNativeFontFace(fontFace); - } + super.rebuild(); + if (this.div === null) { return; } - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.unreachable)("Not implemented: loadSystemFont without the Font Loading API."); + this.#addToDrawLayer(); + this.#updateBbox(this.#drawOutlines.box); + if (!this.isAttachedToDOM) { + this.parent.add(this); + } } - async bind(font) { - if (font.attached || font.missingFile && !font.systemFontInfo) { - return; + setParent(parent) { + let mustBeSelected = false; + if (this.parent && !parent) { + this._uiManager.removeShouldRescale(this); + this.#cleanDrawLayer(); + } else if (parent) { + this._uiManager.addShouldRescale(this); + this.#addToDrawLayer(parent); + mustBeSelected = !this.parent && this.div?.classList.contains("selectedEditor"); } - font.attached = true; - if (font.systemFontInfo) { - await this.loadSystemFont(font); + super.setParent(parent); + if (mustBeSelected) { + this.select(); + } + } + #cleanDrawLayer() { + if (this._drawId === null || !this.parent) { return; } - if (this.isFontLoadingAPISupported) { - const nativeFontFace = font.createNativeFontFace(); - if (nativeFontFace) { - this.addNativeFontFace(nativeFontFace); - try { - await nativeFontFace.loaded; - } catch (ex) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Failed to load font '${nativeFontFace.family}': '${ex}'.`); - font.disableFontFace = true; - throw ex; - } - } + this.parent.drawLayer.remove(this._drawId); + this._drawId = null; + this._drawingOptions.reset(); + } + #addToDrawLayer(parent = this.parent) { + if (this._drawId !== null && this.parent === parent) { return; } - const rule = font.createFontFaceRule(); - if (rule) { - this.insertRule(rule); - if (this.isSyncFontLoadingSupported) { - return; - } - await new Promise(resolve => { - const request = this._queueLoadingCallback(resolve); - this._prepareFontLoadEvent(font, request); - }); + if (this._drawId !== null) { + this.parent.drawLayer.updateParent(this._drawId, parent.drawLayer); + return; } + this._drawingOptions.updateAll(); + this._drawId = this.#createDrawing(this.#drawOutlines, parent); } - get isFontLoadingAPISupported() { - const hasFonts = !!this._document?.fonts; - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "isFontLoadingAPISupported", hasFonts); - } - get isSyncFontLoadingSupported() { - let supported = false; - if (_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.isNodeJS) { - supported = true; - } else if (typeof navigator !== "undefined" && typeof navigator?.userAgent === "string" && /Mozilla\/5.0.*?rv:\d+.*? Gecko/.test(navigator.userAgent)) { - supported = true; + #convertToParentSpace([x, y, width, height]) { + const { + parentDimensions: [pW, pH], + rotation + } = this; + switch (rotation) { + case 90: + return [y, 1 - x, width * (pH / pW), height * (pW / pH)]; + case 180: + return [1 - x, 1 - y, width, height]; + case 270: + return [1 - y, x, width * (pH / pW), height * (pW / pH)]; + default: + return [x, y, width, height]; } - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "isSyncFontLoadingSupported", supported); } - _queueLoadingCallback(callback) { - function completeRequest() { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.assert)(!request.done, "completeRequest() cannot be called twice."); - request.done = true; - while (loadingRequests.length > 0 && loadingRequests[0].done) { - const otherRequest = loadingRequests.shift(); - setTimeout(otherRequest.callback, 0); - } - } + #convertToDrawSpace() { const { - loadingRequests + x, + y, + width, + height, + parentDimensions: [pW, pH], + rotation } = this; - const request = { - done: false, - complete: completeRequest, - callback - }; - loadingRequests.push(request); - return request; + switch (rotation) { + case 90: + return [1 - y, x, width * (pW / pH), height * (pH / pW)]; + case 180: + return [1 - x, 1 - y, width, height]; + case 270: + return [y, 1 - x, width * (pW / pH), height * (pH / pW)]; + default: + return [x, y, width, height]; + } } - get _loadTestFont() { - const testFont = atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA" + "FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA" + "ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA" + "AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1" + "AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD" + "6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM" + "AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D" + "IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA" + "AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA" + "AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB" + "AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY" + "AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA" + "AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA" + "AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC" + "AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3" + "Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj" + "FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA=="); - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "_loadTestFont", testFont); + #updateBbox(bbox) { + [this.x, this.y, this.width, this.height] = this.#convertToParentSpace(bbox); + if (this.div) { + this.fixAndSetPosition(); + this.setDims(); + } + this._onResized(); } - _prepareFontLoadEvent(font, request) { - function int32(data, offset) { - return data.charCodeAt(offset) << 24 | data.charCodeAt(offset + 1) << 16 | data.charCodeAt(offset + 2) << 8 | data.charCodeAt(offset + 3) & 0xff; + #rotateBox() { + const { + x, + y, + width, + height, + rotation, + parentRotation, + parentDimensions: [pW, pH] + } = this; + switch ((rotation * 4 + parentRotation) / 90) { + case 1: + return [1 - y - height, x, height, width]; + case 2: + return [1 - x - width, 1 - y - height, width, height]; + case 3: + return [y, 1 - x - width, height, width]; + case 4: + return [x, y - width * (pW / pH), height * (pH / pW), width * (pW / pH)]; + case 5: + return [1 - y, x, width * (pW / pH), height * (pH / pW)]; + case 6: + return [1 - x - height * (pH / pW), 1 - y, height * (pH / pW), width * (pW / pH)]; + case 7: + return [y - width * (pW / pH), 1 - x - height * (pH / pW), width * (pW / pH), height * (pH / pW)]; + case 8: + return [x - width, y - height, width, height]; + case 9: + return [1 - y, x - width, height, width]; + case 10: + return [1 - x, 1 - y, width, height]; + case 11: + return [y - height, 1 - x, height, width]; + case 12: + return [x - height * (pH / pW), y, height * (pH / pW), width * (pW / pH)]; + case 13: + return [1 - y - width * (pW / pH), x - height * (pH / pW), width * (pW / pH), height * (pH / pW)]; + case 14: + return [1 - x, 1 - y - width * (pW / pH), height * (pH / pW), width * (pW / pH)]; + case 15: + return [y, 1 - x, width * (pW / pH), height * (pH / pW)]; + default: + return [x, y, width, height]; } - function spliceString(s, offset, remove, insert) { - const chunk1 = s.substring(0, offset); - const chunk2 = s.substring(offset + remove); - return chunk1 + insert + chunk2; + } + rotate() { + if (!this.parent) { + return; } - let i, ii; - const canvas = this._document.createElement("canvas"); - canvas.width = 1; - canvas.height = 1; - const ctx = canvas.getContext("2d"); - let called = 0; - function isFontReady(name, callback) { - if (++called > 30) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)("Load test font never loaded."); - callback(); - return; - } - ctx.font = "30px " + name; - ctx.fillText(".", 0, 20); - const imageData = ctx.getImageData(0, 0, 1, 1); - if (imageData.data[3] > 0) { - callback(); - return; - } - setTimeout(isFontReady.bind(null, name, callback)); + this.parent.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties({ + bbox: this.#rotateBox() + }, this.#drawOutlines.updateRotation((this.parentRotation - this.rotation + 360) % 360))); + } + onScaleChanging() { + if (!this.parent) { + return; } - const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`; - let data = this._loadTestFont; - const COMMENT_OFFSET = 976; - data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId); - const CFF_CHECKSUM_OFFSET = 16; - const XXXX_VALUE = 0x58585858; - let checksum = int32(data, CFF_CHECKSUM_OFFSET); - for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) { - checksum = checksum - XXXX_VALUE + int32(loadTestFontId, i) | 0; + this.#updateBbox(this.#drawOutlines.updateParentDimensions(this.parentDimensions, this.parent.scale)); + } + static onScaleChangingWhenDrawing() {} + render() { + if (this.div) { + return this.div; } - if (i < loadTestFontId.length) { - checksum = checksum - XXXX_VALUE + int32(loadTestFontId + "XXX", i) | 0; + let baseX, baseY; + if (this._isCopy) { + baseX = this.x; + baseY = this.y; } - data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.string32)(checksum)); - const url = `url(data:font/opentype;base64,${btoa(data)});`; - const rule = `@font-face {font-family:"${loadTestFontId}";src:${url}}`; - this.insertRule(rule); - const div = this._document.createElement("div"); - div.style.visibility = "hidden"; - div.style.width = div.style.height = "10px"; - div.style.position = "absolute"; - div.style.top = div.style.left = "0px"; - for (const name of [font.loadedName, loadTestFontId]) { - const span = this._document.createElement("span"); - span.textContent = "Hi"; - span.style.fontFamily = name; - div.append(span); + const div = super.render(); + div.classList.add("draw"); + const drawDiv = document.createElement("div"); + div.append(drawDiv); + drawDiv.setAttribute("aria-hidden", "true"); + drawDiv.className = "internal"; + this.setDims(); + this._uiManager.addShouldRescale(this); + this.disableEditing(); + if (this._isCopy) { + this._moveAfterPaste(baseX, baseY); } - this._document.body.append(div); - isFontReady(loadTestFontId, () => { - div.remove(); - request.complete(); - }); + return div; } -} -class FontFaceObject { - constructor(translatedData, { - isEvalSupported = true, - disableFontFace = false, - ignoreErrors = false, - inspectFont = null - }) { - this.compiledGlyphs = Object.create(null); - for (const i in translatedData) { - this[i] = translatedData[i]; - } - this.isEvalSupported = isEvalSupported !== false; - this.disableFontFace = disableFontFace === true; - this.ignoreErrors = ignoreErrors === true; - this._inspectFont = inspectFont; + static createDrawerInstance(_x, _y, _parentWidth, _parentHeight, _rotation) { + unreachable("Not implemented"); } - createNativeFontFace() { - if (!this.data || this.disableFontFace) { - return null; + static startDrawing(parent, uiManager, _isLTR, event) { + const { + target, + offsetX: x, + offsetY: y, + pointerId, + pointerType + } = event; + if (CurrentPointers.isInitializedAndDifferentPointerType(pointerType)) { + return; } - let nativeFontFace; - if (!this.cssFontInfo) { - nativeFontFace = new FontFace(this.loadedName, this.data, {}); - } else { - const css = { - weight: this.cssFontInfo.fontWeight - }; - if (this.cssFontInfo.italicAngle) { - css.style = `oblique ${this.cssFontInfo.italicAngle}deg`; + const { + viewport: { + rotation } - nativeFontFace = new FontFace(this.cssFontInfo.fontFamily, this.data, css); - } - this._inspectFont?.(this); - return nativeFontFace; - } - createFontFaceRule() { - if (!this.data || this.disableFontFace) { - return null; - } - const data = (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.bytesToString)(this.data); - const url = `url(data:${this.mimetype};base64,${btoa(data)});`; - let rule; - if (!this.cssFontInfo) { - rule = `@font-face {font-family:"${this.loadedName}";src:${url}}`; - } else { - let css = `font-weight: ${this.cssFontInfo.fontWeight};`; - if (this.cssFontInfo.italicAngle) { - css += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`; + } = parent; + const { + width: parentWidth, + height: parentHeight + } = target.getBoundingClientRect(); + const ac = DrawingEditor.#currentDrawingAC = new AbortController(); + const signal = parent.combinedSignal(ac); + CurrentPointers.setPointer(pointerType, pointerId); + window.addEventListener("pointerup", e => { + if (CurrentPointers.isSamePointerIdOrRemove(e.pointerId)) { + this._endDraw(e); } - rule = `@font-face {font-family:"${this.cssFontInfo.fontFamily}";${css}src:${url}}`; - } - this._inspectFont?.(this, url); - return rule; - } - getPathGenerator(objs, character) { - if (this.compiledGlyphs[character] !== undefined) { - return this.compiledGlyphs[character]; - } - let cmds; - try { - cmds = objs.get(this.loadedName + "_path_" + character); - } catch (ex) { - if (!this.ignoreErrors) { - throw ex; + }, { + signal + }); + window.addEventListener("pointercancel", e => { + if (CurrentPointers.isSamePointerIdOrRemove(e.pointerId)) { + this._currentParent.endDrawingSession(); } - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`getPathGenerator - ignoring character: "${ex}".`); - return this.compiledGlyphs[character] = function (c, size) {}; - } - if (this.isEvalSupported && _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.FeatureTest.isEvalSupported) { - const jsBuf = []; - for (const current of cmds) { - const args = current.args !== undefined ? current.args.join(",") : ""; - jsBuf.push("c.", current.cmd, "(", args, ");\n"); + }, { + signal + }); + window.addEventListener("pointerdown", e => { + if (!CurrentPointers.isSamePointerType(e.pointerType)) { + return; } - return this.compiledGlyphs[character] = new Function("c", "size", jsBuf.join("")); - } - return this.compiledGlyphs[character] = function (c, size) { - for (const current of cmds) { - if (current.cmd === "scale") { - current.args = [size, -size]; + CurrentPointers.initializeAndAddPointerId(e.pointerId); + if (DrawingEditor.#currentDraw.isCancellable()) { + DrawingEditor.#currentDraw.removeLastElement(); + if (DrawingEditor.#currentDraw.isEmpty()) { + this._currentParent.endDrawingSession(true); + } else { + this._endDraw(null); } - c[current.cmd].apply(c, current.args); } - }; - } -} - - -/***/ }), - -/***/ 62: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Metadata: () => (/* binding */ Metadata) -/* harmony export */ }); -/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(292); - -class Metadata { - #metadataMap; - #data; - constructor({ - parsedData, - rawData - }) { - this.#metadataMap = parsedData; - this.#data = rawData; - } - getRaw() { - return this.#data; - } - get(name) { - return this.#metadataMap.get(name) ?? null; - } - getAll() { - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.objectFromMap)(this.#metadataMap); - } - has(name) { - return this.#metadataMap.has(name); - } -} - - -/***/ }), - -/***/ 457: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFNetworkStream: () => (/* binding */ PDFNetworkStream) -/* harmony export */ }); -/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(292); -/* harmony import */ var _network_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(490); - - -const OK_RESPONSE = 200; -const PARTIAL_CONTENT_RESPONSE = 206; -function getArrayBuffer(xhr) { - const data = xhr.response; - if (typeof data !== "string") { - return data; - } - return (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.stringToBytes)(data).buffer; -} -class NetworkManager { - constructor(url, args = {}) { - this.url = url; - this.isHttp = /^https?:/i.test(url); - this.httpHeaders = this.isHttp && args.httpHeaders || Object.create(null); - this.withCredentials = args.withCredentials || false; - this.currXhrId = 0; - this.pendingRequests = Object.create(null); - } - requestRange(begin, end, listeners) { - const args = { - begin, - end - }; - for (const prop in listeners) { - args[prop] = listeners[prop]; - } - return this.request(args); - } - requestFull(listeners) { - return this.request(listeners); - } - request(args) { - const xhr = new XMLHttpRequest(); - const xhrId = this.currXhrId++; - const pendingRequest = this.pendingRequests[xhrId] = { - xhr - }; - xhr.open("GET", this.url); - xhr.withCredentials = this.withCredentials; - for (const property in this.httpHeaders) { - const value = this.httpHeaders[property]; - if (value === undefined) { - continue; + }, { + capture: true, + passive: false, + signal + }); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + target.addEventListener("pointermove", this._drawMove.bind(this), { + signal + }); + target.addEventListener("touchmove", e => { + if (CurrentPointers.isSameTimeStamp(e.timeStamp)) { + stopEvent(e); } - xhr.setRequestHeader(property, value); - } - if (this.isHttp && "begin" in args && "end" in args) { - xhr.setRequestHeader("Range", `bytes=${args.begin}-${args.end - 1}`); - pendingRequest.expectedStatus = PARTIAL_CONTENT_RESPONSE; - } else { - pendingRequest.expectedStatus = OK_RESPONSE; - } - xhr.responseType = "arraybuffer"; - if (args.onError) { - xhr.onerror = function (evt) { - args.onError(xhr.status); - }; - } - xhr.onreadystatechange = this.onStateChange.bind(this, xhrId); - xhr.onprogress = this.onProgress.bind(this, xhrId); - pendingRequest.onHeadersReceived = args.onHeadersReceived; - pendingRequest.onDone = args.onDone; - pendingRequest.onError = args.onError; - pendingRequest.onProgress = args.onProgress; - xhr.send(null); - return xhrId; - } - onProgress(xhrId, evt) { - const pendingRequest = this.pendingRequests[xhrId]; - if (!pendingRequest) { + }, { + signal + }); + parent.toggleDrawing(); + uiManager._editorUndoBar?.hide(); + if (DrawingEditor.#currentDraw) { + parent.drawLayer.updateProperties(this._currentDrawId, DrawingEditor.#currentDraw.startNew(x, y, parentWidth, parentHeight, rotation)); return; } - pendingRequest.onProgress?.(evt); + uiManager.updateUIForDefaultProperties(this); + DrawingEditor.#currentDraw = this.createDrawerInstance(x, y, parentWidth, parentHeight, rotation); + DrawingEditor.#currentDrawingOptions = this.getDefaultDrawingOptions(); + this._currentParent = parent; + ({ + id: this._currentDrawId + } = parent.drawLayer.draw(this._mergeSVGProperties(DrawingEditor.#currentDrawingOptions.toSVGProperties(), DrawingEditor.#currentDraw.defaultSVGProperties), true, false)); } - onStateChange(xhrId, evt) { - const pendingRequest = this.pendingRequests[xhrId]; - if (!pendingRequest) { + static _drawMove(event) { + CurrentPointers.isSameTimeStamp(event.timeStamp); + if (!DrawingEditor.#currentDraw) { return; } - const xhr = pendingRequest.xhr; - if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) { - pendingRequest.onHeadersReceived(); - delete pendingRequest.onHeadersReceived; - } - if (xhr.readyState !== 4) { + const { + offsetX, + offsetY, + pointerId + } = event; + if (!CurrentPointers.isSamePointerId(pointerId)) { return; } - if (!(xhrId in this.pendingRequests)) { + if (CurrentPointers.isUsingMultiplePointers()) { + this._endDraw(event); return; } - delete this.pendingRequests[xhrId]; - if (xhr.status === 0 && this.isHttp) { - pendingRequest.onError?.(xhr.status); - return; + this._currentParent.drawLayer.updateProperties(this._currentDrawId, DrawingEditor.#currentDraw.add(offsetX, offsetY)); + CurrentPointers.setTimeStamp(event.timeStamp); + stopEvent(event); + } + static _cleanup(all) { + if (all) { + this._currentDrawId = -1; + this._currentParent = null; + DrawingEditor.#currentDraw = null; + DrawingEditor.#currentDrawingOptions = null; + CurrentPointers.clearTimeStamp(); } - const xhrStatus = xhr.status || OK_RESPONSE; - const ok_response_on_range_request = xhrStatus === OK_RESPONSE && pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE; - if (!ok_response_on_range_request && xhrStatus !== pendingRequest.expectedStatus) { - pendingRequest.onError?.(xhr.status); + if (DrawingEditor.#currentDrawingAC) { + DrawingEditor.#currentDrawingAC.abort(); + DrawingEditor.#currentDrawingAC = null; + CurrentPointers.clearPointerIds(); + } + } + static _endDraw(event) { + const parent = this._currentParent; + if (!parent) { return; } - const chunk = getArrayBuffer(xhr); - if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { - const rangeHeader = xhr.getResponseHeader("Content-Range"); - const matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader); - pendingRequest.onDone({ - begin: parseInt(matches[1], 10), - chunk - }); - } else if (chunk) { - pendingRequest.onDone({ - begin: 0, - chunk + parent.toggleDrawing(true); + this._cleanup(false); + if (event?.target === parent.div) { + parent.drawLayer.updateProperties(this._currentDrawId, DrawingEditor.#currentDraw.end(event.offsetX, event.offsetY)); + } + if (this.supportMultipleDrawings) { + const draw = DrawingEditor.#currentDraw; + const drawId = this._currentDrawId; + const lastElement = draw.getLastElement(); + parent.addCommands({ + cmd: () => { + parent.drawLayer.updateProperties(drawId, draw.setLastElement(lastElement)); + }, + undo: () => { + parent.drawLayer.updateProperties(drawId, draw.removeLastElement()); + }, + mustExec: false, + type: AnnotationEditorParamsType.DRAW_STEP }); - } else { - pendingRequest.onError?.(xhr.status); + return; } + this.endDrawing(false); } - getRequestXhr(xhrId) { - return this.pendingRequests[xhrId].xhr; - } - isPendingRequest(xhrId) { - return xhrId in this.pendingRequests; - } - abortRequest(xhrId) { - const xhr = this.pendingRequests[xhrId].xhr; - delete this.pendingRequests[xhrId]; - xhr.abort(); - } -} -class PDFNetworkStream { - constructor(source) { - this._source = source; - this._manager = new NetworkManager(source.url, { - httpHeaders: source.httpHeaders, - withCredentials: source.withCredentials - }); - this._rangeChunkSize = source.rangeChunkSize; - this._fullRequestReader = null; - this._rangeRequestReaders = []; - } - _onRangeRequestReaderClosed(reader) { - const i = this._rangeRequestReaders.indexOf(reader); - if (i >= 0) { - this._rangeRequestReaders.splice(i, 1); + static endDrawing(isAborted) { + const parent = this._currentParent; + if (!parent) { + return null; } - } - getFullReader() { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.assert)(!this._fullRequestReader, "PDFNetworkStream.getFullReader can only be called once."); - this._fullRequestReader = new PDFNetworkStreamFullRequestReader(this._manager, this._source); - return this._fullRequestReader; - } - getRangeReader(begin, end) { - const reader = new PDFNetworkStreamRangeRequestReader(this._manager, begin, end); - reader.onClosed = this._onRangeRequestReaderClosed.bind(this); - this._rangeRequestReaders.push(reader); - return reader; - } - cancelAllRequests(reason) { - this._fullRequestReader?.cancel(reason); - for (const reader of this._rangeRequestReaders.slice(0)) { - reader.cancel(reason); + parent.toggleDrawing(true); + parent.cleanUndoStack(AnnotationEditorParamsType.DRAW_STEP); + if (!DrawingEditor.#currentDraw.isEmpty()) { + const { + pageDimensions: [pageWidth, pageHeight], + scale + } = parent; + const editor = parent.createAndAddNewEditor({ + offsetX: 0, + offsetY: 0 + }, false, { + drawId: this._currentDrawId, + drawOutlines: DrawingEditor.#currentDraw.getOutlines(pageWidth * scale, pageHeight * scale, scale, this._INNER_MARGIN), + drawingOptions: DrawingEditor.#currentDrawingOptions, + mustBeCommitted: !isAborted + }); + this._cleanup(true); + return editor; } + parent.drawLayer.remove(this._currentDrawId); + this._cleanup(true); + return null; } -} -class PDFNetworkStreamFullRequestReader { - constructor(manager, source) { - this._manager = manager; - const args = { - onHeadersReceived: this._onHeadersReceived.bind(this), - onDone: this._onDone.bind(this), - onError: this._onError.bind(this), - onProgress: this._onProgress.bind(this) - }; - this._url = source.url; - this._fullRequestId = manager.requestFull(args); - this._headersReceivedCapability = Promise.withResolvers(); - this._disableRange = source.disableRange || false; - this._contentLength = source.length; - this._rangeChunkSize = source.rangeChunkSize; - if (!this._rangeChunkSize && !this._disableRange) { - this._disableRange = true; - } - this._isStreamingSupported = false; - this._isRangeSupported = false; - this._cachedChunks = []; - this._requests = []; - this._done = false; - this._storedError = undefined; - this._filename = null; - this.onProgress = null; - } - _onHeadersReceived() { - const fullRequestXhrId = this._fullRequestId; - const fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId); - const getResponseHeader = name => fullRequestXhr.getResponseHeader(name); - const { - allowRangeRequests, - suggestedLength - } = (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_1__.validateRangeRequestCapabilities)({ - getResponseHeader, - isHttp: this._manager.isHttp, - rangeChunkSize: this._rangeChunkSize, - disableRange: this._disableRange - }); - if (allowRangeRequests) { - this._isRangeSupported = true; - } - this._contentLength = suggestedLength || this._contentLength; - this._filename = (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_1__.extractFilenameFromHeader)(getResponseHeader); - if (this._isRangeSupported) { - this._manager.abortRequest(fullRequestXhrId); - } - this._headersReceivedCapability.resolve(); + createDrawingOptions(_data) {} + static deserializeDraw(_pageX, _pageY, _pageWidth, _pageHeight, _innerWidth, _data) { + unreachable("Not implemented"); } - _onDone(data) { - if (data) { - if (this._requests.length > 0) { - const requestCapability = this._requests.shift(); - requestCapability.resolve({ - value: data.chunk, - done: false - }); - } else { - this._cachedChunks.push(data.chunk); + static async deserialize(data, parent, uiManager) { + const { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY } - } - this._done = true; - if (this._cachedChunks.length > 0) { - return; - } - for (const requestCapability of this._requests) { - requestCapability.resolve({ - value: undefined, - done: true - }); - } - this._requests.length = 0; + } = parent.viewport; + const drawOutlines = this.deserializeDraw(pageX, pageY, pageWidth, pageHeight, this._INNER_MARGIN, data); + const editor = await super.deserialize(data, parent, uiManager); + editor.createDrawingOptions(data); + editor.#createDrawOutlines({ + drawOutlines + }); + editor.#addToDrawLayer(); + editor.onScaleChanging(); + editor.rotate(); + return editor; } - _onError(status) { - this._storedError = (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_1__.createResponseStatusError)(status, this._url); - this._headersReceivedCapability.reject(this._storedError); - for (const requestCapability of this._requests) { - requestCapability.reject(this._storedError); - } - this._requests.length = 0; - this._cachedChunks.length = 0; + serializeDraw(isForCopying) { + const [pageX, pageY] = this.pageTranslation; + const [pageWidth, pageHeight] = this.pageDimensions; + return this.#drawOutlines.serialize([pageX, pageY, pageWidth, pageHeight], isForCopying); } - _onProgress(evt) { - this.onProgress?.({ - loaded: evt.loaded, - total: evt.lengthComputable ? evt.total : this._contentLength + renderAnnotationElement(annotation) { + annotation.updateEdited({ + rect: this.getPDFRect() }); + return null; } - get filename() { - return this._filename; + static canCreateNewEmptyEditor() { + return false; } - get isRangeSupported() { - return this._isRangeSupported; +} + +;// ./src/display/editor/drawers/inkdraw.js + + + +class InkDrawOutliner { + #last = new Float64Array(6); + #line; + #lines; + #rotation; + #thickness; + #points; + #lastSVGPath = ""; + #lastIndex = 0; + #outlines = new InkDrawOutline(); + #parentWidth; + #parentHeight; + constructor(x, y, parentWidth, parentHeight, rotation, thickness) { + this.#parentWidth = parentWidth; + this.#parentHeight = parentHeight; + this.#rotation = rotation; + this.#thickness = thickness; + [x, y] = this.#normalizePoint(x, y); + const line = this.#line = [NaN, NaN, NaN, NaN, x, y]; + this.#points = [x, y]; + this.#lines = [{ + line, + points: this.#points + }]; + this.#last.set(line, 0); + } + updateProperty(name, value) { + if (name === "stroke-width") { + this.#thickness = value; + } } - get isStreamingSupported() { - return this._isStreamingSupported; + #normalizePoint(x, y) { + return Outline._normalizePoint(x, y, this.#parentWidth, this.#parentHeight, this.#rotation); } - get contentLength() { - return this._contentLength; + isEmpty() { + return !this.#lines?.length; } - get headersReady() { - return this._headersReceivedCapability.promise; + isCancellable() { + return this.#points.length <= 10; } - async read() { - if (this._storedError) { - throw this._storedError; + add(x, y) { + [x, y] = this.#normalizePoint(x, y); + const [x1, y1, x2, y2] = this.#last.subarray(2, 6); + const diffX = x - x2; + const diffY = y - y2; + const d = Math.hypot(this.#parentWidth * diffX, this.#parentHeight * diffY); + if (d <= 2) { + return null; } - if (this._cachedChunks.length > 0) { - const chunk = this._cachedChunks.shift(); + this.#points.push(x, y); + if (isNaN(x1)) { + this.#last.set([x2, y2, x, y], 2); + this.#line.push(NaN, NaN, NaN, NaN, x, y); return { - value: chunk, - done: false + path: { + d: this.toSVGPath() + } }; } - if (this._done) { - return { - value: undefined, - done: true - }; + if (isNaN(this.#last[0])) { + this.#line.splice(6, 6); } - const requestCapability = Promise.withResolvers(); - this._requests.push(requestCapability); - return requestCapability.promise; + this.#last.set([x1, y1, x2, y2, x, y], 0); + this.#line.push(...Outline.createBezierPoints(x1, y1, x2, y2, x, y)); + return { + path: { + d: this.toSVGPath() + } + }; } - cancel(reason) { - this._done = true; - this._headersReceivedCapability.reject(reason); - for (const requestCapability of this._requests) { - requestCapability.resolve({ - value: undefined, - done: true - }); + end(x, y) { + const change = this.add(x, y); + if (change) { + return change; } - this._requests.length = 0; - if (this._manager.isPendingRequest(this._fullRequestId)) { - this._manager.abortRequest(this._fullRequestId); + if (this.#points.length === 2) { + return { + path: { + d: this.toSVGPath() + } + }; } - this._fullRequestReader = null; + return null; } -} -class PDFNetworkStreamRangeRequestReader { - constructor(manager, begin, end) { - this._manager = manager; - const args = { - onDone: this._onDone.bind(this), - onError: this._onError.bind(this), - onProgress: this._onProgress.bind(this) - }; - this._url = manager.url; - this._requestId = manager.requestRange(begin, end, args); - this._requests = []; - this._queuedChunk = null; - this._done = false; - this._storedError = undefined; - this.onProgress = null; - this.onClosed = null; + startNew(x, y, parentWidth, parentHeight, rotation) { + this.#parentWidth = parentWidth; + this.#parentHeight = parentHeight; + this.#rotation = rotation; + [x, y] = this.#normalizePoint(x, y); + const line = this.#line = [NaN, NaN, NaN, NaN, x, y]; + this.#points = [x, y]; + const last = this.#lines.at(-1); + if (last) { + last.line = new Float32Array(last.line); + last.points = new Float32Array(last.points); + } + this.#lines.push({ + line, + points: this.#points + }); + this.#last.set(line, 0); + this.#lastIndex = 0; + this.toSVGPath(); + return null; } - _close() { - this.onClosed?.(this); + getLastElement() { + return this.#lines.at(-1); } - _onDone(data) { - const chunk = data.chunk; - if (this._requests.length > 0) { - const requestCapability = this._requests.shift(); - requestCapability.resolve({ - value: chunk, - done: false - }); - } else { - this._queuedChunk = chunk; - } - this._done = true; - for (const requestCapability of this._requests) { - requestCapability.resolve({ - value: undefined, - done: true - }); - } - this._requests.length = 0; - this._close(); + setLastElement(element) { + if (!this.#lines) { + return this.#outlines.setLastElement(element); + } + this.#lines.push(element); + this.#line = element.line; + this.#points = element.points; + this.#lastIndex = 0; + return { + path: { + d: this.toSVGPath() + } + }; } - _onError(status) { - this._storedError = (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_1__.createResponseStatusError)(status, this._url); - for (const requestCapability of this._requests) { - requestCapability.reject(this._storedError); + removeLastElement() { + if (!this.#lines) { + return this.#outlines.removeLastElement(); } - this._requests.length = 0; - this._queuedChunk = null; - } - _onProgress(evt) { - if (!this.isStreamingSupported) { - this.onProgress?.({ - loaded: evt.loaded - }); + this.#lines.pop(); + this.#lastSVGPath = ""; + for (let i = 0, ii = this.#lines.length; i < ii; i++) { + const { + line, + points + } = this.#lines[i]; + this.#line = line; + this.#points = points; + this.#lastIndex = 0; + this.toSVGPath(); } + return { + path: { + d: this.#lastSVGPath + } + }; } - get isStreamingSupported() { - return false; - } - async read() { - if (this._storedError) { - throw this._storedError; - } - if (this._queuedChunk !== null) { - const chunk = this._queuedChunk; - this._queuedChunk = null; - return { - value: chunk, - done: false - }; - } - if (this._done) { - return { - value: undefined, - done: true - }; + toSVGPath() { + const firstX = Outline.svgRound(this.#line[4]); + const firstY = Outline.svgRound(this.#line[5]); + if (this.#points.length === 2) { + this.#lastSVGPath = `${this.#lastSVGPath} M ${firstX} ${firstY} Z`; + return this.#lastSVGPath; + } + if (this.#points.length <= 6) { + const i = this.#lastSVGPath.lastIndexOf("M"); + this.#lastSVGPath = `${this.#lastSVGPath.slice(0, i)} M ${firstX} ${firstY}`; + this.#lastIndex = 6; + } + if (this.#points.length === 4) { + const secondX = Outline.svgRound(this.#line[10]); + const secondY = Outline.svgRound(this.#line[11]); + this.#lastSVGPath = `${this.#lastSVGPath} L ${secondX} ${secondY}`; + this.#lastIndex = 12; + return this.#lastSVGPath; } - const requestCapability = Promise.withResolvers(); - this._requests.push(requestCapability); - return requestCapability.promise; + const buffer = []; + if (this.#lastIndex === 0) { + buffer.push(`M ${firstX} ${firstY}`); + this.#lastIndex = 6; + } + for (let i = this.#lastIndex, ii = this.#line.length; i < ii; i += 6) { + const [c1x, c1y, c2x, c2y, x, y] = this.#line.slice(i, i + 6).map(Outline.svgRound); + buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`); + } + this.#lastSVGPath += buffer.join(" "); + this.#lastIndex = this.#line.length; + return this.#lastSVGPath; + } + getOutlines(parentWidth, parentHeight, scale, innerMargin) { + const last = this.#lines.at(-1); + last.line = new Float32Array(last.line); + last.points = new Float32Array(last.points); + this.#outlines.build(this.#lines, parentWidth, parentHeight, scale, this.#rotation, this.#thickness, innerMargin); + this.#last = null; + this.#line = null; + this.#lines = null; + this.#lastSVGPath = null; + return this.#outlines; } - cancel(reason) { - this._done = true; - for (const requestCapability of this._requests) { - requestCapability.resolve({ - value: undefined, - done: true - }); - } - this._requests.length = 0; - if (this._manager.isPendingRequest(this._requestId)) { - this._manager.abortRequest(this._requestId); - } - this._close(); + get defaultSVGProperties() { + return { + root: { + viewBox: "0 0 10000 10000" + }, + rootClass: { + draw: true + }, + bbox: [0, 0, 1, 1] + }; } } - - -/***/ }), - -/***/ 490: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - - -// EXPORTS -__webpack_require__.d(__webpack_exports__, { - createResponseStatusError: () => (/* binding */ createResponseStatusError), - extractFilenameFromHeader: () => (/* binding */ extractFilenameFromHeader), - validateRangeRequestCapabilities: () => (/* binding */ validateRangeRequestCapabilities), - validateResponseStatus: () => (/* binding */ validateResponseStatus) -}); - -// EXTERNAL MODULE: ./src/shared/util.js -var util = __webpack_require__(292); -;// CONCATENATED MODULE: ./src/display/content_disposition.js - -function getFilenameFromContentDispositionHeader(contentDisposition) { - let needsEncodingFixup = true; - let tmp = toParamRegExp("filename\\*", "i").exec(contentDisposition); - if (tmp) { - tmp = tmp[1]; - let filename = rfc2616unquote(tmp); - filename = unescape(filename); - filename = rfc5987decode(filename); - filename = rfc2047decode(filename); - return fixupEncoding(filename); - } - tmp = rfc2231getparam(contentDisposition); - if (tmp) { - const filename = rfc2047decode(tmp); - return fixupEncoding(filename); - } - tmp = toParamRegExp("filename", "i").exec(contentDisposition); - if (tmp) { - tmp = tmp[1]; - let filename = rfc2616unquote(tmp); - filename = rfc2047decode(filename); - return fixupEncoding(filename); +class InkDrawOutline extends Outline { + #bbox; + #currentRotation = 0; + #innerMargin; + #lines; + #parentWidth; + #parentHeight; + #parentScale; + #rotation; + #thickness; + build(lines, parentWidth, parentHeight, parentScale, rotation, thickness, innerMargin) { + this.#parentWidth = parentWidth; + this.#parentHeight = parentHeight; + this.#parentScale = parentScale; + this.#rotation = rotation; + this.#thickness = thickness; + this.#innerMargin = innerMargin ?? 0; + this.#lines = lines; + this.#computeBbox(); } - function toParamRegExp(attributePattern, flags) { - return new RegExp("(?:^|;)\\s*" + attributePattern + "\\s*=\\s*" + "(" + '[^";\\s][^;\\s]*' + "|" + '"(?:[^"\\\\]|\\\\"?)+"?' + ")", flags); + get thickness() { + return this.#thickness; } - function textdecode(encoding, value) { - if (encoding) { - if (!/^[\x00-\xFF]+$/.test(value)) { - return value; + setLastElement(element) { + this.#lines.push(element); + return { + path: { + d: this.toSVGPath() } - try { - const decoder = new TextDecoder(encoding, { - fatal: true - }); - const buffer = (0,util.stringToBytes)(value); - value = decoder.decode(buffer); - needsEncodingFixup = false; - } catch {} - } - return value; + }; } - function fixupEncoding(value) { - if (needsEncodingFixup && /[\x80-\xff]/.test(value)) { - value = textdecode("utf-8", value); - if (needsEncodingFixup) { - value = textdecode("iso-8859-1", value); + removeLastElement() { + this.#lines.pop(); + return { + path: { + d: this.toSVGPath() } - } - return value; + }; } - function rfc2231getparam(contentDispositionStr) { - const matches = []; - let match; - const iter = toParamRegExp("filename\\*((?!0\\d)\\d+)(\\*?)", "ig"); - while ((match = iter.exec(contentDispositionStr)) !== null) { - let [, n, quot, part] = match; - n = parseInt(n, 10); - if (n in matches) { - if (n === 0) { - break; - } + toSVGPath() { + const buffer = []; + for (const { + line + } of this.#lines) { + buffer.push(`M${Outline.svgRound(line[4])} ${Outline.svgRound(line[5])}`); + if (line.length === 6) { + buffer.push("Z"); continue; } - matches[n] = [quot, part]; + if (line.length === 12 && isNaN(line[6])) { + buffer.push(`L${Outline.svgRound(line[10])} ${Outline.svgRound(line[11])}`); + continue; + } + for (let i = 6, ii = line.length; i < ii; i += 6) { + const [c1x, c1y, c2x, c2y, x, y] = line.subarray(i, i + 6).map(Outline.svgRound); + buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`); + } } - const parts = []; - for (let n = 0; n < matches.length; ++n) { - if (!(n in matches)) { + return buffer.join(""); + } + serialize([pageX, pageY, pageWidth, pageHeight], isForCopying) { + const serializedLines = []; + const serializedPoints = []; + const [x, y, width, height] = this.#getBBoxWithNoMargin(); + let tx, ty, sx, sy, x1, y1, x2, y2, rescaleFn; + switch (this.#rotation) { + case 0: + rescaleFn = Outline._rescale; + tx = pageX; + ty = pageY + pageHeight; + sx = pageWidth; + sy = -pageHeight; + x1 = pageX + x * pageWidth; + y1 = pageY + (1 - y - height) * pageHeight; + x2 = pageX + (x + width) * pageWidth; + y2 = pageY + (1 - y) * pageHeight; break; - } - let [quot, part] = matches[n]; - part = rfc2616unquote(part); - if (quot) { - part = unescape(part); - if (n === 0) { - part = rfc5987decode(part); + case 90: + rescaleFn = Outline._rescaleAndSwap; + tx = pageX; + ty = pageY; + sx = pageWidth; + sy = pageHeight; + x1 = pageX + y * pageWidth; + y1 = pageY + x * pageHeight; + x2 = pageX + (y + height) * pageWidth; + y2 = pageY + (x + width) * pageHeight; + break; + case 180: + rescaleFn = Outline._rescale; + tx = pageX + pageWidth; + ty = pageY; + sx = -pageWidth; + sy = pageHeight; + x1 = pageX + (1 - x - width) * pageWidth; + y1 = pageY + y * pageHeight; + x2 = pageX + (1 - x) * pageWidth; + y2 = pageY + (y + height) * pageHeight; + break; + case 270: + rescaleFn = Outline._rescaleAndSwap; + tx = pageX + pageWidth; + ty = pageY + pageHeight; + sx = -pageWidth; + sy = -pageHeight; + x1 = pageX + (1 - y - height) * pageWidth; + y1 = pageY + (1 - x - width) * pageHeight; + x2 = pageX + (1 - y) * pageWidth; + y2 = pageY + (1 - x) * pageHeight; + break; + } + for (const { + line, + points + } of this.#lines) { + serializedLines.push(rescaleFn(line, tx, ty, sx, sy, isForCopying ? new Array(line.length) : null)); + serializedPoints.push(rescaleFn(points, tx, ty, sx, sy, isForCopying ? new Array(points.length) : null)); + } + return { + lines: serializedLines, + points: serializedPoints, + rect: [x1, y1, x2, y2] + }; + } + static deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, { + paths: { + lines, + points + }, + rotation, + thickness + }) { + const newLines = []; + let tx, ty, sx, sy, rescaleFn; + switch (rotation) { + case 0: + rescaleFn = Outline._rescale; + tx = -pageX / pageWidth; + ty = pageY / pageHeight + 1; + sx = 1 / pageWidth; + sy = -1 / pageHeight; + break; + case 90: + rescaleFn = Outline._rescaleAndSwap; + tx = -pageY / pageHeight; + ty = -pageX / pageWidth; + sx = 1 / pageHeight; + sy = 1 / pageWidth; + break; + case 180: + rescaleFn = Outline._rescale; + tx = pageX / pageWidth + 1; + ty = -pageY / pageHeight; + sx = -1 / pageWidth; + sy = 1 / pageHeight; + break; + case 270: + rescaleFn = Outline._rescaleAndSwap; + tx = pageY / pageHeight + 1; + ty = pageX / pageWidth + 1; + sx = -1 / pageHeight; + sy = -1 / pageWidth; + break; + } + if (!lines) { + lines = []; + for (const point of points) { + const len = point.length; + if (len === 2) { + lines.push(new Float32Array([NaN, NaN, NaN, NaN, point[0], point[1]])); + continue; + } + if (len === 4) { + lines.push(new Float32Array([NaN, NaN, NaN, NaN, point[0], point[1], NaN, NaN, NaN, NaN, point[2], point[3]])); + continue; + } + const line = new Float32Array(3 * (len - 2)); + lines.push(line); + let [x1, y1, x2, y2] = point.subarray(0, 4); + line.set([NaN, NaN, NaN, NaN, x1, y1], 0); + for (let i = 4; i < len; i += 2) { + const x = point[i]; + const y = point[i + 1]; + line.set(Outline.createBezierPoints(x1, y1, x2, y2, x, y), (i - 2) * 3); + [x1, y1, x2, y2] = [x2, y2, x, y]; } } - parts.push(part); } - return parts.join(""); + for (let i = 0, ii = lines.length; i < ii; i++) { + newLines.push({ + line: rescaleFn(lines[i].map(x => x ?? NaN), tx, ty, sx, sy), + points: rescaleFn(points[i].map(x => x ?? NaN), tx, ty, sx, sy) + }); + } + const outlines = new this.prototype.constructor(); + outlines.build(newLines, pageWidth, pageHeight, 1, rotation, thickness, innerMargin); + return outlines; } - function rfc2616unquote(value) { - if (value.startsWith('"')) { - const parts = value.slice(1).split('\\"'); - for (let i = 0; i < parts.length; ++i) { - const quotindex = parts[i].indexOf('"'); - if (quotindex !== -1) { - parts[i] = parts[i].slice(0, quotindex); - parts.length = i + 1; + #getMarginComponents(thickness = this.#thickness) { + const margin = this.#innerMargin + thickness / 2 * this.#parentScale; + return this.#rotation % 180 === 0 ? [margin / this.#parentWidth, margin / this.#parentHeight] : [margin / this.#parentHeight, margin / this.#parentWidth]; + } + #getBBoxWithNoMargin() { + const [x, y, width, height] = this.#bbox; + const [marginX, marginY] = this.#getMarginComponents(0); + return [x + marginX, y + marginY, width - 2 * marginX, height - 2 * marginY]; + } + #computeBbox() { + const bbox = this.#bbox = F32_BBOX_INIT.slice(); + for (const { + line + } of this.#lines) { + if (line.length <= 12) { + for (let i = 4, ii = line.length; i < ii; i += 6) { + Util.pointBoundingBox(line[i], line[i + 1], bbox); } - parts[i] = parts[i].replaceAll(/\\(.)/g, "$1"); + continue; + } + let lastX = line[4], + lastY = line[5]; + for (let i = 6, ii = line.length; i < ii; i += 6) { + const [c1x, c1y, c2x, c2y, x, y] = line.subarray(i, i + 6); + Util.bezierBoundingBox(lastX, lastY, c1x, c1y, c2x, c2y, x, y, bbox); + lastX = x; + lastY = y; } - value = parts.join('"'); } - return value; + const [marginX, marginY] = this.#getMarginComponents(); + bbox[0] = MathClamp(bbox[0] - marginX, 0, 1); + bbox[1] = MathClamp(bbox[1] - marginY, 0, 1); + bbox[2] = MathClamp(bbox[2] + marginX, 0, 1); + bbox[3] = MathClamp(bbox[3] + marginY, 0, 1); + bbox[2] -= bbox[0]; + bbox[3] -= bbox[1]; } - function rfc5987decode(extvalue) { - const encodingend = extvalue.indexOf("'"); - if (encodingend === -1) { - return extvalue; - } - const encoding = extvalue.slice(0, encodingend); - const langvalue = extvalue.slice(encodingend + 1); - const value = langvalue.replace(/^[^']*'/, ""); - return textdecode(encoding, value); + get box() { + return this.#bbox; } - function rfc2047decode(value) { - if (!value.startsWith("=?") || /[\x00-\x19\x80-\xff]/.test(value)) { - return value; + updateProperty(name, value) { + if (name === "stroke-width") { + return this.#updateThickness(value); } - return value.replaceAll(/=\?([\w-]*)\?([QqBb])\?((?:[^?]|\?(?!=))*)\?=/g, function (matches, charset, encoding, text) { - if (encoding === "q" || encoding === "Q") { - text = text.replaceAll("_", " "); - text = text.replaceAll(/=([0-9a-fA-F]{2})/g, function (match, hex) { - return String.fromCharCode(parseInt(hex, 16)); - }); - return textdecode(charset, text); - } - try { - text = atob(text); - } catch {} - return textdecode(charset, text); - }); + return null; } - return ""; -} - -// EXTERNAL MODULE: ./src/display/display_utils.js -var display_utils = __webpack_require__(419); -;// CONCATENATED MODULE: ./src/display/network_utils.js - - - -function validateRangeRequestCapabilities({ - getResponseHeader, - isHttp, - rangeChunkSize, - disableRange -}) { - const returnValues = { - allowRangeRequests: false, - suggestedLength: undefined - }; - const length = parseInt(getResponseHeader("Content-Length"), 10); - if (!Number.isInteger(length)) { - return returnValues; + #updateThickness(thickness) { + const [oldMarginX, oldMarginY] = this.#getMarginComponents(); + this.#thickness = thickness; + const [newMarginX, newMarginY] = this.#getMarginComponents(); + const [diffMarginX, diffMarginY] = [newMarginX - oldMarginX, newMarginY - oldMarginY]; + const bbox = this.#bbox; + bbox[0] -= diffMarginX; + bbox[1] -= diffMarginY; + bbox[2] += 2 * diffMarginX; + bbox[3] += 2 * diffMarginY; + return bbox; + } + updateParentDimensions([width, height], scale) { + const [oldMarginX, oldMarginY] = this.#getMarginComponents(); + this.#parentWidth = width; + this.#parentHeight = height; + this.#parentScale = scale; + const [newMarginX, newMarginY] = this.#getMarginComponents(); + const diffMarginX = newMarginX - oldMarginX; + const diffMarginY = newMarginY - oldMarginY; + const bbox = this.#bbox; + bbox[0] -= diffMarginX; + bbox[1] -= diffMarginY; + bbox[2] += 2 * diffMarginX; + bbox[3] += 2 * diffMarginY; + return bbox; } - returnValues.suggestedLength = length; - if (length <= 2 * rangeChunkSize) { - return returnValues; + updateRotation(rotation) { + this.#currentRotation = rotation; + return { + path: { + transform: this.rotationTransform + } + }; } - if (disableRange || !isHttp) { - return returnValues; + get viewBox() { + return this.#bbox.map(Outline.svgRound).join(" "); + } + get defaultProperties() { + const [x, y] = this.#bbox; + return { + root: { + viewBox: this.viewBox + }, + path: { + "transform-origin": `${Outline.svgRound(x)} ${Outline.svgRound(y)}` + } + }; } - if (getResponseHeader("Accept-Ranges") !== "bytes") { - return returnValues; + get rotationTransform() { + const [,, width, height] = this.#bbox; + let a = 0, + b = 0, + c = 0, + d = 0, + e = 0, + f = 0; + switch (this.#currentRotation) { + case 90: + b = height / width; + c = -width / height; + e = width; + break; + case 180: + a = -1; + d = -1; + e = width; + f = height; + break; + case 270: + b = -height / width; + c = width / height; + f = height; + break; + default: + return ""; + } + return `matrix(${a} ${b} ${c} ${d} ${Outline.svgRound(e)} ${Outline.svgRound(f)})`; } - const contentEncoding = getResponseHeader("Content-Encoding") || "identity"; - if (contentEncoding !== "identity") { - return returnValues; + getPathResizingSVGProperties([newX, newY, newWidth, newHeight]) { + const [marginX, marginY] = this.#getMarginComponents(); + const [x, y, width, height] = this.#bbox; + if (Math.abs(width - marginX) <= Outline.PRECISION || Math.abs(height - marginY) <= Outline.PRECISION) { + const tx = newX + newWidth / 2 - (x + width / 2); + const ty = newY + newHeight / 2 - (y + height / 2); + return { + path: { + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`, + transform: `${this.rotationTransform} translate(${tx} ${ty})` + } + }; + } + const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX); + const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY); + const s2x = width / newWidth; + const s2y = height / newHeight; + return { + path: { + "transform-origin": `${Outline.svgRound(x)} ${Outline.svgRound(y)}`, + transform: `${this.rotationTransform} scale(${s2x} ${s2y}) ` + `translate(${Outline.svgRound(marginX)} ${Outline.svgRound(marginY)}) scale(${s1x} ${s1y}) ` + `translate(${Outline.svgRound(-marginX)} ${Outline.svgRound(-marginY)})` + } + }; } - returnValues.allowRangeRequests = true; - return returnValues; -} -function extractFilenameFromHeader(getResponseHeader) { - const contentDisposition = getResponseHeader("Content-Disposition"); - if (contentDisposition) { - let filename = getFilenameFromContentDispositionHeader(contentDisposition); - if (filename.includes("%")) { - try { - filename = decodeURIComponent(filename); - } catch {} + getPathResizedSVGProperties([newX, newY, newWidth, newHeight]) { + const [marginX, marginY] = this.#getMarginComponents(); + const bbox = this.#bbox; + const [x, y, width, height] = bbox; + bbox[0] = newX; + bbox[1] = newY; + bbox[2] = newWidth; + bbox[3] = newHeight; + if (Math.abs(width - marginX) <= Outline.PRECISION || Math.abs(height - marginY) <= Outline.PRECISION) { + const tx = newX + newWidth / 2 - (x + width / 2); + const ty = newY + newHeight / 2 - (y + height / 2); + for (const { + line, + points + } of this.#lines) { + Outline._translate(line, tx, ty, line); + Outline._translate(points, tx, ty, points); + } + return { + root: { + viewBox: this.viewBox + }, + path: { + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`, + transform: this.rotationTransform || null, + d: this.toSVGPath() + } + }; } - if ((0,display_utils.isPdfFile)(filename)) { - return filename; + const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX); + const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY); + const tx = -s1x * (x + marginX) + newX + marginX; + const ty = -s1y * (y + marginY) + newY + marginY; + if (s1x !== 1 || s1y !== 1 || tx !== 0 || ty !== 0) { + for (const { + line, + points + } of this.#lines) { + Outline._rescale(line, tx, ty, s1x, s1y, line); + Outline._rescale(points, tx, ty, s1x, s1y, points); + } } + return { + root: { + viewBox: this.viewBox + }, + path: { + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`, + transform: this.rotationTransform || null, + d: this.toSVGPath() + } + }; } - return null; -} -function createResponseStatusError(status, url) { - if (status === 404 || status === 0 && url.startsWith("file:")) { - return new util.MissingPDFException('Missing PDF "' + url + '".'); + getPathTranslatedSVGProperties([newX, newY], parentDimensions) { + const [newParentWidth, newParentHeight] = parentDimensions; + const bbox = this.#bbox; + const tx = newX - bbox[0]; + const ty = newY - bbox[1]; + if (this.#parentWidth === newParentWidth && this.#parentHeight === newParentHeight) { + for (const { + line, + points + } of this.#lines) { + Outline._translate(line, tx, ty, line); + Outline._translate(points, tx, ty, points); + } + } else { + const sx = this.#parentWidth / newParentWidth; + const sy = this.#parentHeight / newParentHeight; + this.#parentWidth = newParentWidth; + this.#parentHeight = newParentHeight; + for (const { + line, + points + } of this.#lines) { + Outline._rescale(line, tx, ty, sx, sy, line); + Outline._rescale(points, tx, ty, sx, sy, points); + } + bbox[2] *= sx; + bbox[3] *= sy; + } + bbox[0] = newX; + bbox[1] = newY; + return { + root: { + viewBox: this.viewBox + }, + path: { + d: this.toSVGPath(), + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}` + } + }; + } + get defaultSVGProperties() { + const bbox = this.#bbox; + return { + root: { + viewBox: this.viewBox + }, + rootClass: { + draw: true + }, + path: { + d: this.toSVGPath(), + "transform-origin": `${Outline.svgRound(bbox[0])} ${Outline.svgRound(bbox[1])}`, + transform: this.rotationTransform || null + }, + bbox + }; } - return new util.UnexpectedResponseException(`Unexpected server response (${status}) while retrieving PDF "${url}".`, status); -} -function validateResponseStatus(status) { - return status === 200 || status === 206; } +;// ./src/display/editor/ink.js -/***/ }), -/***/ 786: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFNodeStream: () => (/* binding */ PDFNodeStream) -/* harmony export */ }); -/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(292); -/* harmony import */ var _network_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(490); -let fs, http, https, url; -if (_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.isNodeJS) { - fs = await import( /*webpackIgnore: true*/"fs"); - http = await import( /*webpackIgnore: true*/"http"); - https = await import( /*webpackIgnore: true*/"https"); - url = await import( /*webpackIgnore: true*/"url"); -} -const fileUriRegex = /^file:\/\/\/[a-zA-Z]:\//; -function parseUrl(sourceUrl) { - const parsedUrl = url.parse(sourceUrl); - if (parsedUrl.protocol === "file:" || parsedUrl.host) { - return parsedUrl; - } - if (/^[a-z]:[/\\]/i.test(sourceUrl)) { - return url.parse(`file:///${sourceUrl}`); + +class InkDrawingOptions extends DrawingOptions { + constructor(viewerParameters) { + super(); + this._viewParameters = viewerParameters; + super.updateProperties({ + fill: "none", + stroke: AnnotationEditor._defaultLineColor, + "stroke-opacity": 1, + "stroke-width": 1, + "stroke-linecap": "round", + "stroke-linejoin": "round", + "stroke-miterlimit": 10 + }); + } + updateSVGProperty(name, value) { + if (name === "stroke-width") { + value ??= this["stroke-width"]; + value *= this._viewParameters.realScale; + } + super.updateSVGProperty(name, value); } - if (!parsedUrl.host) { - parsedUrl.protocol = "file:"; + clone() { + const clone = new InkDrawingOptions(this._viewParameters); + clone.updateAll(this); + return clone; } - return parsedUrl; } -class PDFNodeStream { - constructor(source) { - this.source = source; - this.url = parseUrl(source.url); - this.isHttp = this.url.protocol === "http:" || this.url.protocol === "https:"; - this.isFsUrl = this.url.protocol === "file:"; - this.httpHeaders = this.isHttp && source.httpHeaders || {}; - this._fullRequestReader = null; - this._rangeRequestReaders = []; +class InkEditor extends DrawingEditor { + static _type = "ink"; + static _editorType = AnnotationEditorType.INK; + static _defaultDrawingOptions = null; + constructor(params) { + super({ + ...params, + name: "inkEditor" + }); + this._willKeepAspectRatio = true; + this.defaultL10nId = "pdfjs-editor-ink-editor"; } - get _progressiveDataLength() { - return this._fullRequestReader?._loaded ?? 0; + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + this._defaultDrawingOptions = new InkDrawingOptions(uiManager.viewParameters); } - getFullReader() { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.assert)(!this._fullRequestReader, "PDFNodeStream.getFullReader can only be called once."); - this._fullRequestReader = this.isFsUrl ? new PDFNodeStreamFsFullReader(this) : new PDFNodeStreamFullReader(this); - return this._fullRequestReader; + static getDefaultDrawingOptions(options) { + const clone = this._defaultDrawingOptions.clone(); + clone.updateProperties(options); + return clone; } - getRangeReader(start, end) { - if (end <= this._progressiveDataLength) { - return null; - } - const rangeReader = this.isFsUrl ? new PDFNodeStreamFsRangeReader(this, start, end) : new PDFNodeStreamRangeReader(this, start, end); - this._rangeRequestReaders.push(rangeReader); - return rangeReader; + static get supportMultipleDrawings() { + return true; } - cancelAllRequests(reason) { - this._fullRequestReader?.cancel(reason); - for (const reader of this._rangeRequestReaders.slice(0)) { - reader.cancel(reason); - } + static get typesMap() { + return shadow(this, "typesMap", new Map([[AnnotationEditorParamsType.INK_THICKNESS, "stroke-width"], [AnnotationEditorParamsType.INK_COLOR, "stroke"], [AnnotationEditorParamsType.INK_OPACITY, "stroke-opacity"]])); } -} -class BaseFullReader { - constructor(stream) { - this._url = stream.url; - this._done = false; - this._storedError = null; - this.onProgress = null; - const source = stream.source; - this._contentLength = source.length; - this._loaded = 0; - this._filename = null; - this._disableRange = source.disableRange || false; - this._rangeChunkSize = source.rangeChunkSize; - if (!this._rangeChunkSize && !this._disableRange) { - this._disableRange = true; - } - this._isStreamingSupported = !source.disableStream; - this._isRangeSupported = !source.disableRange; - this._readableStream = null; - this._readCapability = Promise.withResolvers(); - this._headersCapability = Promise.withResolvers(); + static createDrawerInstance(x, y, parentWidth, parentHeight, rotation) { + return new InkDrawOutliner(x, y, parentWidth, parentHeight, rotation, this._defaultDrawingOptions["stroke-width"]); } - get headersReady() { - return this._headersCapability.promise; + static deserializeDraw(pageX, pageY, pageWidth, pageHeight, innerMargin, data) { + return InkDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data); } - get filename() { - return this._filename; + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof InkAnnotationElement) { + const { + data: { + inkLists, + rect, + rotation, + id, + color, + opacity, + borderStyle: { + rawWidth: thickness + }, + popupRef, + richText, + contentsObj, + creationDate, + modificationDate + }, + parent: { + page: { + pageNumber + } + } + } = data; + initialData = data = { + annotationType: AnnotationEditorType.INK, + color: Array.from(color), + thickness, + opacity, + paths: { + points: inkLists + }, + boxes: null, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + annotationElementId: id, + id, + deleted: false, + popupRef, + richText, + comment: contentsObj?.str || null, + creationDate, + modificationDate + }; + } + const editor = await super.deserialize(data, parent, uiManager); + editor._initialData = initialData; + if (data.comment) { + editor.setCommentData(data); + } + return editor; } - get contentLength() { - return this._contentLength; + get toolbarButtons() { + this._colorPicker ||= new BasicColorPicker(this); + return [["colorPicker", this._colorPicker]]; } - get isRangeSupported() { - return this._isRangeSupported; + get colorType() { + return AnnotationEditorParamsType.INK_COLOR; } - get isStreamingSupported() { - return this._isStreamingSupported; + get colorAndOpacityType() { + return AnnotationEditorParamsType.INK_COLOR_AND_OPACITY; } - async read() { - await this._readCapability.promise; - if (this._done) { - return { - value: undefined, - done: true - }; - } - if (this._storedError) { - throw this._storedError; - } - const chunk = this._readableStream.read(); - if (chunk === null) { - this._readCapability = Promise.withResolvers(); - return this.read(); - } - this._loaded += chunk.length; - this.onProgress?.({ - loaded: this._loaded, - total: this._contentLength - }); - const buffer = new Uint8Array(chunk).buffer; - return { - value: buffer, - done: false - }; + get opacityType() { + return AnnotationEditorParamsType.INK_OPACITY; } - cancel(reason) { - if (!this._readableStream) { - this._error(reason); + updateParams(type, value) { + if (type === AnnotationEditorParamsType.INK_COLOR_AND_OPACITY) { + this._updateColorAndOpacity(value.color, value.opacity); return; } - this._readableStream.destroy(reason); - } - _error(reason) { - this._storedError = reason; - this._readCapability.resolve(); + super.updateParams(type, value); } - _setReadableStream(readableStream) { - this._readableStream = readableStream; - readableStream.on("readable", () => { - this._readCapability.resolve(); - }); - readableStream.on("end", () => { - readableStream.destroy(); - this._done = true; - this._readCapability.resolve(); - }); - readableStream.on("error", reason => { - this._error(reason); - }); - if (!this._isStreamingSupported && this._isRangeSupported) { - this._error(new _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AbortException("streaming is disabled")); - } - if (this._storedError) { - this._readableStream.destroy(this._storedError); + static updateDefaultParams(type, value) { + if (type === AnnotationEditorParamsType.INK_COLOR_AND_OPACITY) { + super.updateDefaultParams(AnnotationEditorParamsType.INK_COLOR, value.color); + super.updateDefaultParams(AnnotationEditorParamsType.INK_OPACITY, value.opacity); + return; } + super.updateDefaultParams(type, value); } -} -class BaseRangeReader { - constructor(stream) { - this._url = stream.url; - this._done = false; - this._storedError = null; - this.onProgress = null; - this._loaded = 0; - this._readableStream = null; - this._readCapability = Promise.withResolvers(); - const source = stream.source; - this._isStreamingSupported = !source.disableStream; + get color() { + return this._drawingOptions.stroke; } - get isStreamingSupported() { - return this._isStreamingSupported; + get opacity() { + return this._drawingOptions["stroke-opacity"]; } - async read() { - await this._readCapability.promise; - if (this._done) { - return { - value: undefined, - done: true - }; - } - if (this._storedError) { - throw this._storedError; - } - const chunk = this._readableStream.read(); - if (chunk === null) { - this._readCapability = Promise.withResolvers(); - return this.read(); + onScaleChanging() { + if (!this.parent) { + return; } - this._loaded += chunk.length; - this.onProgress?.({ - loaded: this._loaded - }); - const buffer = new Uint8Array(chunk).buffer; - return { - value: buffer, - done: false - }; + super.onScaleChanging(); + const { + _drawId, + _drawingOptions, + parent + } = this; + _drawingOptions.updateSVGProperty("stroke-width"); + parent.drawLayer.updateProperties(_drawId, _drawingOptions.toSVGProperties()); } - cancel(reason) { - if (!this._readableStream) { - this._error(reason); + static onScaleChangingWhenDrawing() { + const parent = this._currentParent; + if (!parent) { return; } - this._readableStream.destroy(reason); - } - _error(reason) { - this._storedError = reason; - this._readCapability.resolve(); + super.onScaleChangingWhenDrawing(); + this._defaultDrawingOptions.updateSVGProperty("stroke-width"); + parent.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties()); } - _setReadableStream(readableStream) { - this._readableStream = readableStream; - readableStream.on("readable", () => { - this._readCapability.resolve(); - }); - readableStream.on("end", () => { - readableStream.destroy(); - this._done = true; - this._readCapability.resolve(); - }); - readableStream.on("error", reason => { - this._error(reason); + createDrawingOptions({ + color, + thickness, + opacity + }) { + this._drawingOptions = InkEditor.getDefaultDrawingOptions({ + stroke: Util.makeHexColor(...color), + "stroke-width": thickness, + "stroke-opacity": opacity }); - if (this._storedError) { - this._readableStream.destroy(this._storedError); - } } -} -function createRequestOptions(parsedUrl, headers) { - return { - protocol: parsedUrl.protocol, - auth: parsedUrl.auth, - host: parsedUrl.hostname, - port: parsedUrl.port, - path: parsedUrl.path, - method: "GET", - headers - }; -} -class PDFNodeStreamFullReader extends BaseFullReader { - constructor(stream) { - super(stream); - const handleResponse = response => { - if (response.statusCode === 404) { - const error = new _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.MissingPDFException(`Missing PDF "${this._url}".`); - this._storedError = error; - this._headersCapability.reject(error); - return; - } - this._headersCapability.resolve(); - this._setReadableStream(response); - const getResponseHeader = name => this._readableStream.headers[name.toLowerCase()]; - const { - allowRangeRequests, - suggestedLength - } = (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_1__.validateRangeRequestCapabilities)({ - getResponseHeader, - isHttp: stream.isHttp, - rangeChunkSize: this._rangeChunkSize, - disableRange: this._disableRange - }); - this._isRangeSupported = allowRangeRequests; - this._contentLength = suggestedLength || this._contentLength; - this._filename = (0,_network_utils_js__WEBPACK_IMPORTED_MODULE_1__.extractFilenameFromHeader)(getResponseHeader); - }; - this._request = null; - if (this._url.protocol === "http:") { - this._request = http.request(createRequestOptions(this._url, stream.httpHeaders), handleResponse); - } else { - this._request = https.request(createRequestOptions(this._url, stream.httpHeaders), handleResponse); + serialize(isForCopying = false) { + if (this.isEmpty()) { + return null; } - this._request.on("error", reason => { - this._storedError = reason; - this._headersCapability.reject(reason); - }); - this._request.end(); - } -} -class PDFNodeStreamRangeReader extends BaseRangeReader { - constructor(stream, start, end) { - super(stream); - this._httpHeaders = {}; - for (const property in stream.httpHeaders) { - const value = stream.httpHeaders[property]; - if (value === undefined) { - continue; - } - this._httpHeaders[property] = value; + if (this.deleted) { + return this.serializeDeleted(); } - this._httpHeaders.Range = `bytes=${start}-${end - 1}`; - const handleResponse = response => { - if (response.statusCode === 404) { - const error = new _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.MissingPDFException(`Missing PDF "${this._url}".`); - this._storedError = error; - return; + const { + lines, + points + } = this.serializeDraw(isForCopying); + const { + _drawingOptions: { + stroke, + "stroke-opacity": opacity, + "stroke-width": thickness } - this._setReadableStream(response); - }; - this._request = null; - if (this._url.protocol === "http:") { - this._request = http.request(createRequestOptions(this._url, this._httpHeaders), handleResponse); - } else { - this._request = https.request(createRequestOptions(this._url, this._httpHeaders), handleResponse); - } - this._request.on("error", reason => { - this._storedError = reason; - }); - this._request.end(); - } -} -class PDFNodeStreamFsFullReader extends BaseFullReader { - constructor(stream) { - super(stream); - let path = decodeURIComponent(this._url.path); - if (fileUriRegex.test(this._url.href)) { - path = path.replace(/^\//, ""); - } - fs.promises.lstat(path).then(stat => { - this._contentLength = stat.size; - this._setReadableStream(fs.createReadStream(path)); - this._headersCapability.resolve(); - }, error => { - if (error.code === "ENOENT") { - error = new _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.MissingPDFException(`Missing PDF "${path}".`); + } = this; + const serialized = Object.assign(super.serialize(isForCopying), { + color: AnnotationEditor._colorManager.convert(stroke), + opacity, + thickness, + paths: { + lines, + points } - this._storedError = error; - this._headersCapability.reject(error); }); + this.addComment(serialized); + if (isForCopying) { + serialized.isCopy = true; + return serialized; + } + if (this.annotationElementId && !this.#hasElementChanged(serialized)) { + return null; + } + serialized.id = this.annotationElementId; + return serialized; } -} -class PDFNodeStreamFsRangeReader extends BaseRangeReader { - constructor(stream, start, end) { - super(stream); - let path = decodeURIComponent(this._url.path); - if (fileUriRegex.test(this._url.href)) { - path = path.replace(/^\//, ""); - } - this._setReadableStream(fs.createReadStream(path, { - start, - end: end - 1 - })); + #hasElementChanged(serialized) { + const { + color, + thickness, + opacity, + pageIndex + } = this._initialData; + return this.hasEditedComment || this._hasBeenMoved || this._hasBeenResized || serialized.color.some((c, i) => c !== color[i]) || serialized.thickness !== thickness || serialized.opacity !== opacity || serialized.pageIndex !== pageIndex; + } + renderAnnotationElement(annotation) { + if (this.deleted) { + annotation.hide(); + return null; + } + const { + points, + rect + } = this.serializeDraw(false); + annotation.updateEdited({ + rect, + thickness: this._drawingOptions["stroke-width"], + points, + popup: this.comment + }); + return null; } } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }, 1); +;// ./src/display/editor/drawers/contour.js -/***/ }), - -/***/ 573: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ NodeCMapReaderFactory: () => (/* binding */ NodeCMapReaderFactory), -/* harmony export */ NodeCanvasFactory: () => (/* binding */ NodeCanvasFactory), -/* harmony export */ NodeFilterFactory: () => (/* binding */ NodeFilterFactory), -/* harmony export */ NodeStandardFontDataFactory: () => (/* binding */ NodeStandardFontDataFactory) -/* harmony export */ }); -/* harmony import */ var _base_factory_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(583); -/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(292); - - -let fs, canvas, path2d; -if (_shared_util_js__WEBPACK_IMPORTED_MODULE_1__.isNodeJS) { - fs = await import( /*webpackIgnore: true*/"fs"); - try { - canvas = await import( /*webpackIgnore: true*/"canvas"); - } catch {} - try { - path2d = await import( /*webpackIgnore: true*/"path2d"); - } catch {} -} -const fetchData = function (url) { - return fs.promises.readFile(url).then(data => new Uint8Array(data)); -}; -class NodeFilterFactory extends _base_factory_js__WEBPACK_IMPORTED_MODULE_0__.BaseFilterFactory {} -class NodeCanvasFactory extends _base_factory_js__WEBPACK_IMPORTED_MODULE_0__.BaseCanvasFactory { - _createCanvas(width, height) { - return canvas.createCanvas(width, height); - } -} -class NodeCMapReaderFactory extends _base_factory_js__WEBPACK_IMPORTED_MODULE_0__.BaseCMapReaderFactory { - _fetchData(url, compressionType) { - return fetchData(url).then(data => ({ - cMapData: data, - compressionType - })); - } -} -class NodeStandardFontDataFactory extends _base_factory_js__WEBPACK_IMPORTED_MODULE_0__.BaseStandardFontDataFactory { - _fetchData(url) { - return fetchData(url); +class ContourDrawOutline extends InkDrawOutline { + toSVGPath() { + let path = super.toSVGPath(); + if (!path.endsWith("Z")) { + path += "Z"; + } + return path; } } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }, 1); - -/***/ }), +;// ./src/display/editor/drawers/signaturedraw.js -/***/ 626: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ OptionalContentConfig: () => (/* binding */ OptionalContentConfig) -/* harmony export */ }); -/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(292); -/* harmony import */ var _shared_murmurhash3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(651); -const INTERNAL = Symbol("INTERNAL"); -class OptionalContentGroup { - #isDisplay = false; - #isPrint = false; - #userSet = false; - #visible = true; - constructor(renderingIntent, { - name, - intent, - usage - }) { - this.#isDisplay = !!(renderingIntent & _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.RenderingIntentFlag.DISPLAY); - this.#isPrint = !!(renderingIntent & _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.RenderingIntentFlag.PRINT); - this.name = name; - this.intent = intent; - this.usage = usage; - } - get visible() { - if (this.#userSet) { - return this.#visible; - } - if (!this.#visible) { - return false; - } - const { - print, - view - } = this.usage; - if (this.#isDisplay) { - return view?.viewState !== "OFF"; - } else if (this.#isPrint) { - return print?.printState !== "OFF"; - } - return true; - } - _setVisible(internal, visible, userSet = false) { - if (internal !== INTERNAL) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.unreachable)("Internal method `_setVisible` called."); - } - this.#userSet = userSet; - this.#visible = visible; - } -} -class OptionalContentConfig { - #cachedGetHash = null; - #groups = new Map(); - #initialHash = null; - #order = null; - constructor(data, renderingIntent = _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.RenderingIntentFlag.DISPLAY) { - this.renderingIntent = renderingIntent; - this.name = null; - this.creator = null; - if (data === null) { - return; - } - this.name = data.name; - this.creator = data.creator; - this.#order = data.order; - for (const group of data.groups) { - this.#groups.set(group.id, new OptionalContentGroup(renderingIntent, group)); - } - if (data.baseState === "OFF") { - for (const group of this.#groups.values()) { - group._setVisible(INTERNAL, false); - } - } - for (const on of data.on) { - this.#groups.get(on)._setVisible(INTERNAL, true); - } - for (const off of data.off) { - this.#groups.get(off)._setVisible(INTERNAL, false); - } - this.#initialHash = this.getHash(); - } - #evaluateVisibilityExpression(array) { - const length = array.length; - if (length < 2) { - return true; - } - const operator = array[0]; - for (let i = 1; i < length; i++) { - const element = array[i]; - let state; - if (Array.isArray(element)) { - state = this.#evaluateVisibilityExpression(element); - } else if (this.#groups.has(element)) { - state = this.#groups.get(element).visible; - } else { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Optional content group not found: ${element}`); - return true; - } - switch (operator) { - case "And": - if (!state) { - return false; - } - break; - case "Or": - if (state) { - return true; - } - break; - case "Not": - return !state; - default: - return true; - } - } - return operator === "And"; - } - isVisible(group) { - if (this.#groups.size === 0) { - return true; - } - if (!group) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.info)("Optional content group not defined."); - return true; - } - if (group.type === "OCG") { - if (!this.#groups.has(group.id)) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Optional content group not found: ${group.id}`); - return true; - } - return this.#groups.get(group.id).visible; - } else if (group.type === "OCMD") { - if (group.expression) { - return this.#evaluateVisibilityExpression(group.expression); - } - if (!group.policy || group.policy === "AnyOn") { - for (const id of group.ids) { - if (!this.#groups.has(id)) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Optional content group not found: ${id}`); - return true; +const BASE_HEADER_LENGTH = 8; +const POINTS_PROPERTIES_NUMBER = 3; +class SignatureExtractor { + static #PARAMETERS = { + maxDim: 512, + sigmaSFactor: 0.02, + sigmaR: 25, + kernelSize: 16 + }; + static #neighborIndexToId(i0, j0, i, j) { + i -= i0; + j -= j0; + if (i === 0) { + return j > 0 ? 0 : 4; + } + if (i === 1) { + return j + 6; + } + return 2 - j; + } + static #neighborIdToIndex = new Int32Array([0, 1, -1, 1, -1, 0, -1, -1, 0, -1, 1, -1, 1, 0, 1, 1]); + static #clockwiseNonZero(buf, width, i0, j0, i, j, offset) { + const id = this.#neighborIndexToId(i0, j0, i, j); + for (let k = 0; k < 8; k++) { + const kk = (-k + id - offset + 16) % 8; + const shiftI = this.#neighborIdToIndex[2 * kk]; + const shiftJ = this.#neighborIdToIndex[2 * kk + 1]; + if (buf[(i0 + shiftI) * width + (j0 + shiftJ)] !== 0) { + return kk; + } + } + return -1; + } + static #counterClockwiseNonZero(buf, width, i0, j0, i, j, offset) { + const id = this.#neighborIndexToId(i0, j0, i, j); + for (let k = 0; k < 8; k++) { + const kk = (k + id + offset + 16) % 8; + const shiftI = this.#neighborIdToIndex[2 * kk]; + const shiftJ = this.#neighborIdToIndex[2 * kk + 1]; + if (buf[(i0 + shiftI) * width + (j0 + shiftJ)] !== 0) { + return kk; + } + } + return -1; + } + static #findContours(buf, width, height, threshold) { + const N = buf.length; + const types = new Int32Array(N); + for (let i = 0; i < N; i++) { + types[i] = buf[i] <= threshold ? 1 : 0; + } + for (let i = 1; i < height - 1; i++) { + types[i * width] = types[i * width + width - 1] = 0; + } + for (let i = 0; i < width; i++) { + types[i] = types[width * height - 1 - i] = 0; + } + let nbd = 1; + let lnbd; + const contours = []; + for (let i = 1; i < height - 1; i++) { + lnbd = 1; + for (let j = 1; j < width - 1; j++) { + const ij = i * width + j; + const pix = types[ij]; + if (pix === 0) { + continue; + } + let i2 = i; + let j2 = j; + if (pix === 1 && types[ij - 1] === 0) { + nbd += 1; + j2 -= 1; + } else if (pix >= 1 && types[ij + 1] === 0) { + nbd += 1; + j2 += 1; + if (pix > 1) { + lnbd = pix; } - if (this.#groups.get(id).visible) { - return true; + } else { + if (pix !== 1) { + lnbd = Math.abs(pix); } + continue; } - return false; - } else if (group.policy === "AllOn") { - for (const id of group.ids) { - if (!this.#groups.has(id)) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Optional content group not found: ${id}`); - return true; + const points = [j, i]; + const isHole = j2 === j + 1; + const contour = { + isHole, + points, + id: nbd, + parent: 0 + }; + contours.push(contour); + let contour0; + for (const c of contours) { + if (c.id === lnbd) { + contour0 = c; + break; } - if (!this.#groups.get(id).visible) { - return false; + } + if (!contour0) { + contour.parent = isHole ? lnbd : 0; + } else if (contour0.isHole) { + contour.parent = isHole ? contour0.parent : lnbd; + } else { + contour.parent = isHole ? lnbd : contour0.parent; + } + const k = this.#clockwiseNonZero(types, width, i, j, i2, j2, 0); + if (k === -1) { + types[ij] = -nbd; + if (types[ij] !== 1) { + lnbd = Math.abs(types[ij]); } + continue; } - return true; - } else if (group.policy === "AnyOff") { - for (const id of group.ids) { - if (!this.#groups.has(id)) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Optional content group not found: ${id}`); - return true; + let shiftI = this.#neighborIdToIndex[2 * k]; + let shiftJ = this.#neighborIdToIndex[2 * k + 1]; + const i1 = i + shiftI; + const j1 = j + shiftJ; + i2 = i1; + j2 = j1; + let i3 = i; + let j3 = j; + while (true) { + const kk = this.#counterClockwiseNonZero(types, width, i3, j3, i2, j2, 1); + shiftI = this.#neighborIdToIndex[2 * kk]; + shiftJ = this.#neighborIdToIndex[2 * kk + 1]; + const i4 = i3 + shiftI; + const j4 = j3 + shiftJ; + points.push(j4, i4); + const ij3 = i3 * width + j3; + if (types[ij3 + 1] === 0) { + types[ij3] = -nbd; + } else if (types[ij3] === 1) { + types[ij3] = nbd; } - if (!this.#groups.get(id).visible) { - return true; + if (i4 === i && j4 === j && i3 === i1 && j3 === j1) { + if (types[ij] !== 1) { + lnbd = Math.abs(types[ij]); + } + break; + } else { + i2 = i3; + j2 = j3; + i3 = i4; + j3 = j4; } } - return false; - } else if (group.policy === "AllOff") { - for (const id of group.ids) { - if (!this.#groups.has(id)) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Optional content group not found: ${id}`); - return true; + } + } + return contours; + } + static #douglasPeuckerHelper(points, start, end, output) { + if (end - start <= 4) { + for (let i = start; i < end - 2; i += 2) { + output.push(points[i], points[i + 1]); + } + return; + } + const ax = points[start]; + const ay = points[start + 1]; + const abx = points[end - 4] - ax; + const aby = points[end - 3] - ay; + const dist = Math.hypot(abx, aby); + const nabx = abx / dist; + const naby = aby / dist; + const aa = nabx * ay - naby * ax; + const m = aby / abx; + const invS = 1 / dist; + const phi = Math.atan(m); + const cosPhi = Math.cos(phi); + const sinPhi = Math.sin(phi); + const tmax = invS * (Math.abs(cosPhi) + Math.abs(sinPhi)); + const poly = invS * (1 - tmax + tmax ** 2); + const partialPhi = Math.max(Math.atan(Math.abs(sinPhi + cosPhi) * poly), Math.atan(Math.abs(sinPhi - cosPhi) * poly)); + let dmax = 0; + let index = start; + for (let i = start + 2; i < end - 2; i += 2) { + const d = Math.abs(aa - nabx * points[i + 1] + naby * points[i]); + if (d > dmax) { + index = i; + dmax = d; + } + } + if (dmax > (dist * partialPhi) ** 2) { + this.#douglasPeuckerHelper(points, start, index + 2, output); + this.#douglasPeuckerHelper(points, index, end, output); + } else { + output.push(ax, ay); + } + } + static #douglasPeucker(points) { + const output = []; + const len = points.length; + this.#douglasPeuckerHelper(points, 0, len, output); + output.push(points[len - 2], points[len - 1]); + return output.length <= 4 ? null : output; + } + static #bilateralFilter(buf, width, height, sigmaS, sigmaR, kernelSize) { + const kernel = new Float32Array(kernelSize ** 2); + const sigmaS2 = -2 * sigmaS ** 2; + const halfSize = kernelSize >> 1; + for (let i = 0; i < kernelSize; i++) { + const x = (i - halfSize) ** 2; + for (let j = 0; j < kernelSize; j++) { + kernel[i * kernelSize + j] = Math.exp((x + (j - halfSize) ** 2) / sigmaS2); + } + } + const rangeValues = new Float32Array(256); + const sigmaR2 = -2 * sigmaR ** 2; + for (let i = 0; i < 256; i++) { + rangeValues[i] = Math.exp(i ** 2 / sigmaR2); + } + const N = buf.length; + const out = new Uint8Array(N); + const histogram = new Uint32Array(256); + for (let i = 0; i < height; i++) { + for (let j = 0; j < width; j++) { + const ij = i * width + j; + const center = buf[ij]; + let sum = 0; + let norm = 0; + for (let k = 0; k < kernelSize; k++) { + const y = i + k - halfSize; + if (y < 0 || y >= height) { + continue; } - if (this.#groups.get(id).visible) { - return false; + for (let l = 0; l < kernelSize; l++) { + const x = j + l - halfSize; + if (x < 0 || x >= width) { + continue; + } + const neighbour = buf[y * width + x]; + const w = kernel[k * kernelSize + l] * rangeValues[Math.abs(neighbour - center)]; + sum += neighbour * w; + norm += w; } } - return true; + const pix = out[ij] = Math.round(sum / norm); + histogram[pix]++; } - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Unknown optional content policy ${group.policy}.`); - return true; } - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Unknown group type ${group.type}.`); - return true; + return [out, histogram]; } - setVisibility(id, visible = true) { - const group = this.#groups.get(id); - if (!group) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.warn)(`Optional content group not found: ${id}`); - return; + static #getHistogram(buf) { + const histogram = new Uint32Array(256); + for (const g of buf) { + histogram[g]++; } - group._setVisible(INTERNAL, !!visible, true); - this.#cachedGetHash = null; + return histogram; } - setOCGState({ - state, - preserveRB + static #toUint8(buf) { + const N = buf.length; + const out = new Uint8ClampedArray(N >> 2); + let max = -Infinity; + let min = Infinity; + for (let i = 0, ii = out.length; i < ii; i++) { + const pix = out[i] = buf[i << 2]; + max = Math.max(max, pix); + min = Math.min(min, pix); + } + const ratio = 255 / (max - min); + for (let i = 0, ii = out.length; i < ii; i++) { + out[i] = (out[i] - min) * ratio; + } + return out; + } + static #guessThreshold(histogram) { + let i; + let M = -Infinity; + let L = -Infinity; + const min = histogram.findIndex(v => v !== 0); + let pos = min; + let spos = min; + for (i = min; i < 256; i++) { + const v = histogram[i]; + if (v > M) { + if (i - pos > L) { + L = i - pos; + spos = i - 1; + } + M = v; + pos = i; + } + } + for (i = spos - 1; i >= 0; i--) { + if (histogram[i] > histogram[i + 1]) { + break; + } + } + return i; + } + static #getGrayPixels(bitmap) { + const originalBitmap = bitmap; + const { + width, + height + } = bitmap; + const { + maxDim + } = this.#PARAMETERS; + let newWidth = width; + let newHeight = height; + if (width > maxDim || height > maxDim) { + let prevWidth = width; + let prevHeight = height; + let steps = Math.log2(Math.max(width, height) / maxDim); + const isteps = Math.floor(steps); + steps = steps === isteps ? isteps - 1 : isteps; + for (let i = 0; i < steps; i++) { + newWidth = Math.ceil(prevWidth / 2); + newHeight = Math.ceil(prevHeight / 2); + const offscreen = new OffscreenCanvas(newWidth, newHeight); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight); + prevWidth = newWidth; + prevHeight = newHeight; + if (bitmap !== originalBitmap) { + bitmap.close(); + } + bitmap = offscreen.transferToImageBitmap(); + } + const ratio = Math.min(maxDim / newWidth, maxDim / newHeight); + newWidth = Math.round(newWidth * ratio); + newHeight = Math.round(newHeight * ratio); + } + const offscreen = new OffscreenCanvas(newWidth, newHeight); + const ctx = offscreen.getContext("2d", { + willReadFrequently: true + }); + ctx.fillStyle = "white"; + ctx.fillRect(0, 0, newWidth, newHeight); + ctx.filter = "grayscale(1)"; + ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, newWidth, newHeight); + const grayImage = ctx.getImageData(0, 0, newWidth, newHeight).data; + const uint8Buf = this.#toUint8(grayImage); + return [uint8Buf, newWidth, newHeight]; + } + static extractContoursFromText(text, { + fontFamily, + fontStyle, + fontWeight + }, pageWidth, pageHeight, rotation, innerMargin) { + let canvas = new OffscreenCanvas(1, 1); + let ctx = canvas.getContext("2d", { + alpha: false + }); + const fontSize = 200; + const font = ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`; + const { + actualBoundingBoxLeft, + actualBoundingBoxRight, + actualBoundingBoxAscent, + actualBoundingBoxDescent, + fontBoundingBoxAscent, + fontBoundingBoxDescent, + width + } = ctx.measureText(text); + const SCALE = 1.5; + const canvasWidth = Math.ceil(Math.max(Math.abs(actualBoundingBoxLeft) + Math.abs(actualBoundingBoxRight) || 0, width) * SCALE); + const canvasHeight = Math.ceil(Math.max(Math.abs(actualBoundingBoxAscent) + Math.abs(actualBoundingBoxDescent) || fontSize, Math.abs(fontBoundingBoxAscent) + Math.abs(fontBoundingBoxDescent) || fontSize) * SCALE); + canvas = new OffscreenCanvas(canvasWidth, canvasHeight); + ctx = canvas.getContext("2d", { + alpha: true, + willReadFrequently: true + }); + ctx.font = font; + ctx.filter = "grayscale(1)"; + ctx.fillStyle = "white"; + ctx.fillRect(0, 0, canvasWidth, canvasHeight); + ctx.fillStyle = "black"; + ctx.fillText(text, canvasWidth * (SCALE - 1) / 2, canvasHeight * (3 - SCALE) / 2); + const uint8Buf = this.#toUint8(ctx.getImageData(0, 0, canvasWidth, canvasHeight).data); + const histogram = this.#getHistogram(uint8Buf); + const threshold = this.#guessThreshold(histogram); + const contourList = this.#findContours(uint8Buf, canvasWidth, canvasHeight, threshold); + return this.processDrawnLines({ + lines: { + curves: contourList, + width: canvasWidth, + height: canvasHeight + }, + pageWidth, + pageHeight, + rotation, + innerMargin, + mustSmooth: true, + areContours: true + }); + } + static process(bitmap, pageWidth, pageHeight, rotation, innerMargin) { + const [uint8Buf, width, height] = this.#getGrayPixels(bitmap); + const [buffer, histogram] = this.#bilateralFilter(uint8Buf, width, height, Math.hypot(width, height) * this.#PARAMETERS.sigmaSFactor, this.#PARAMETERS.sigmaR, this.#PARAMETERS.kernelSize); + const threshold = this.#guessThreshold(histogram); + const contourList = this.#findContours(buffer, width, height, threshold); + return this.processDrawnLines({ + lines: { + curves: contourList, + width, + height + }, + pageWidth, + pageHeight, + rotation, + innerMargin, + mustSmooth: true, + areContours: true + }); + } + static processDrawnLines({ + lines, + pageWidth, + pageHeight, + rotation, + innerMargin, + mustSmooth, + areContours }) { - let operator; - for (const elem of state) { - switch (elem) { - case "ON": - case "OFF": - case "Toggle": - operator = elem; - continue; + if (rotation % 180 !== 0) { + [pageWidth, pageHeight] = [pageHeight, pageWidth]; + } + const { + curves, + width, + height + } = lines; + const thickness = lines.thickness ?? 0; + const linesAndPoints = []; + const ratio = Math.min(pageWidth / width, pageHeight / height); + const xScale = ratio / pageWidth; + const yScale = ratio / pageHeight; + const newCurves = []; + for (const { + points + } of curves) { + const reducedPoints = mustSmooth ? this.#douglasPeucker(points) : points; + if (!reducedPoints) { + continue; } - const group = this.#groups.get(elem); - if (!group) { + newCurves.push(reducedPoints); + const len = reducedPoints.length; + const newPoints = new Float32Array(len); + const line = new Float32Array(3 * (len === 2 ? 2 : len - 2)); + linesAndPoints.push({ + line, + points: newPoints + }); + if (len === 2) { + newPoints[0] = reducedPoints[0] * xScale; + newPoints[1] = reducedPoints[1] * yScale; + line.set([NaN, NaN, NaN, NaN, newPoints[0], newPoints[1]], 0); continue; } - switch (operator) { - case "ON": - group._setVisible(INTERNAL, true); - break; - case "OFF": - group._setVisible(INTERNAL, false); - break; - case "Toggle": - group._setVisible(INTERNAL, !group.visible); - break; + let [x1, y1, x2, y2] = reducedPoints; + x1 *= xScale; + y1 *= yScale; + x2 *= xScale; + y2 *= yScale; + newPoints.set([x1, y1, x2, y2], 0); + line.set([NaN, NaN, NaN, NaN, x1, y1], 0); + for (let i = 4; i < len; i += 2) { + const x = newPoints[i] = reducedPoints[i] * xScale; + const y = newPoints[i + 1] = reducedPoints[i + 1] * yScale; + line.set(Outline.createBezierPoints(x1, y1, x2, y2, x, y), (i - 2) * 3); + [x1, y1, x2, y2] = [x2, y2, x, y]; } } - this.#cachedGetHash = null; - } - get hasInitialVisibility() { - return this.#initialHash === null || this.getHash() === this.#initialHash; - } - getOrder() { - if (!this.#groups.size) { + if (linesAndPoints.length === 0) { return null; } - if (this.#order) { - return this.#order.slice(); - } - return [...this.#groups.keys()]; - } - getGroups() { - return this.#groups.size > 0 ? (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.objectFromMap)(this.#groups) : null; + const outline = areContours ? new ContourDrawOutline() : new InkDrawOutline(); + outline.build(linesAndPoints, pageWidth, pageHeight, 1, rotation, areContours ? 0 : thickness, innerMargin); + return { + outline, + newCurves, + areContours, + thickness, + width, + height + }; } - getGroup(id) { - return this.#groups.get(id) || null; + static async compressSignature({ + outlines, + areContours, + thickness, + width, + height + }) { + let minDiff = Infinity; + let maxDiff = -Infinity; + let outlinesLength = 0; + for (const points of outlines) { + outlinesLength += points.length; + for (let i = 2, ii = points.length; i < ii; i++) { + const dx = points[i] - points[i - 2]; + minDiff = Math.min(minDiff, dx); + maxDiff = Math.max(maxDiff, dx); + } + } + let bufferType; + if (minDiff >= -128 && maxDiff <= 127) { + bufferType = Int8Array; + } else if (minDiff >= -32768 && maxDiff <= 32767) { + bufferType = Int16Array; + } else { + bufferType = Int32Array; + } + const len = outlines.length; + const headerLength = BASE_HEADER_LENGTH + POINTS_PROPERTIES_NUMBER * len; + const header = new Uint32Array(headerLength); + let offset = 0; + header[offset++] = headerLength * Uint32Array.BYTES_PER_ELEMENT + (outlinesLength - 2 * len) * bufferType.BYTES_PER_ELEMENT; + header[offset++] = 0; + header[offset++] = width; + header[offset++] = height; + header[offset++] = areContours ? 0 : 1; + header[offset++] = Math.max(0, Math.floor(thickness ?? 0)); + header[offset++] = len; + header[offset++] = bufferType.BYTES_PER_ELEMENT; + for (const points of outlines) { + header[offset++] = points.length - 2; + header[offset++] = points[0]; + header[offset++] = points[1]; + } + const cs = new CompressionStream("deflate-raw"); + const writer = cs.writable.getWriter(); + await writer.ready; + writer.write(header); + const BufferCtor = bufferType.prototype.constructor; + for (const points of outlines) { + const diffs = new BufferCtor(points.length - 2); + for (let i = 2, ii = points.length; i < ii; i++) { + diffs[i - 2] = points[i] - points[i - 2]; + } + writer.write(diffs); + } + writer.close(); + const bytes = await new Response(cs.readable).bytes(); + return bytes.toBase64(); } - getHash() { - if (this.#cachedGetHash !== null) { - return this.#cachedGetHash; - } - const hash = new _shared_murmurhash3_js__WEBPACK_IMPORTED_MODULE_1__.MurmurHash3_64(); - for (const [id, group] of this.#groups) { - hash.update(`${id}:${group.visible}`); + static async decompressSignature(signatureData) { + try { + const bytes = Uint8Array.fromBase64(signatureData); + const { + readable, + writable + } = new DecompressionStream("deflate-raw"); + const writer = writable.getWriter(); + await writer.ready; + writer.write(bytes).then(async () => { + await writer.ready; + await writer.close(); + }).catch(() => {}); + let data = null; + let offset = 0; + for await (const chunk of readable) { + data ||= new Uint8Array(new Uint32Array(chunk.buffer, 0, 4)[0]); + data.set(chunk, offset); + offset += chunk.length; + } + const header = new Uint32Array(data.buffer, 0, data.length >> 2); + const version = header[1]; + if (version !== 0) { + throw new Error(`Invalid version: ${version}`); + } + const width = header[2]; + const height = header[3]; + const areContours = header[4] === 0; + const thickness = header[5]; + const numberOfDrawings = header[6]; + const bufferType = header[7]; + const outlines = []; + const diffsOffset = (BASE_HEADER_LENGTH + POINTS_PROPERTIES_NUMBER * numberOfDrawings) * Uint32Array.BYTES_PER_ELEMENT; + let diffs; + switch (bufferType) { + case Int8Array.BYTES_PER_ELEMENT: + diffs = new Int8Array(data.buffer, diffsOffset); + break; + case Int16Array.BYTES_PER_ELEMENT: + diffs = new Int16Array(data.buffer, diffsOffset); + break; + case Int32Array.BYTES_PER_ELEMENT: + diffs = new Int32Array(data.buffer, diffsOffset); + break; + } + offset = 0; + for (let i = 0; i < numberOfDrawings; i++) { + const len = header[POINTS_PROPERTIES_NUMBER * i + BASE_HEADER_LENGTH]; + const points = new Float32Array(len + 2); + outlines.push(points); + for (let j = 0; j < POINTS_PROPERTIES_NUMBER - 1; j++) { + points[j] = header[POINTS_PROPERTIES_NUMBER * i + BASE_HEADER_LENGTH + j + 1]; + } + for (let j = 0; j < len; j++) { + points[j + 2] = points[j] + diffs[offset++]; + } + } + return { + areContours, + thickness, + outlines, + width, + height + }; + } catch (e) { + warn(`decompressSignature: ${e}`); + return null; } - return this.#cachedGetHash = hash.hexdigest(); } } +;// ./src/display/editor/signature.js -/***/ }), -/***/ 814: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ cleanupTextLayer: () => (/* binding */ cleanupTextLayer), -/* harmony export */ renderTextLayer: () => (/* binding */ renderTextLayer), -/* harmony export */ updateTextLayer: () => (/* binding */ updateTextLayer) -/* harmony export */ }); -/* unused harmony export TextLayerRenderTask */ -/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(292); -/* harmony import */ var _display_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(419); -const MAX_TEXT_DIVS_TO_RENDER = 100000; -const DEFAULT_FONT_SIZE = 30; -const DEFAULT_FONT_ASCENT = 0.8; -const ascentCache = new Map(); -let _canvasContext = null; -function getCtx() { - if (!_canvasContext) { - const canvas = document.createElement("canvas"); - canvas.className = "hiddenCanvasElement"; - document.body.append(canvas); - _canvasContext = canvas.getContext("2d", { - alpha: false + + +class SignatureOptions extends DrawingOptions { + constructor() { + super(); + super.updateProperties({ + fill: AnnotationEditor._defaultLineColor, + "stroke-width": 0 }); } - return _canvasContext; + clone() { + const clone = new SignatureOptions(); + clone.updateAll(this); + return clone; + } } -function cleanupTextLayer() { - _canvasContext?.canvas.remove(); - _canvasContext = null; -} -function getAscent(fontFamily) { - const cachedAscent = ascentCache.get(fontFamily); - if (cachedAscent) { - return cachedAscent; - } - const ctx = getCtx(); - const savedFont = ctx.font; - ctx.canvas.width = ctx.canvas.height = DEFAULT_FONT_SIZE; - ctx.font = `${DEFAULT_FONT_SIZE}px ${fontFamily}`; - const metrics = ctx.measureText(""); - let ascent = metrics.fontBoundingBoxAscent; - let descent = Math.abs(metrics.fontBoundingBoxDescent); - if (ascent) { - const ratio = ascent / (ascent + descent); - ascentCache.set(fontFamily, ratio); - ctx.canvas.width = ctx.canvas.height = 0; - ctx.font = savedFont; - return ratio; +class DrawnSignatureOptions extends InkDrawingOptions { + constructor(viewerParameters) { + super(viewerParameters); + super.updateProperties({ + stroke: AnnotationEditor._defaultLineColor, + "stroke-width": 1 + }); } - ctx.strokeStyle = "red"; - ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE); - ctx.strokeText("g", 0, 0); - let pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data; - descent = 0; - for (let i = pixels.length - 1 - 3; i >= 0; i -= 4) { - if (pixels[i] > 0) { - descent = Math.ceil(i / 4 / DEFAULT_FONT_SIZE); - break; - } + clone() { + const clone = new DrawnSignatureOptions(this._viewParameters); + clone.updateAll(this); + return clone; } - ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE); - ctx.strokeText("A", 0, DEFAULT_FONT_SIZE); - pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data; - ascent = 0; - for (let i = 0, ii = pixels.length; i < ii; i += 4) { - if (pixels[i] > 0) { - ascent = DEFAULT_FONT_SIZE - Math.floor(i / 4 / DEFAULT_FONT_SIZE); - break; - } +} +class SignatureEditor extends DrawingEditor { + #isExtracted = false; + #description = null; + #signatureData = null; + #signatureUUID = null; + static _type = "signature"; + static _editorType = AnnotationEditorType.SIGNATURE; + static _defaultDrawingOptions = null; + constructor(params) { + super({ + ...params, + mustBeCommitted: true, + name: "signatureEditor" + }); + this._willKeepAspectRatio = true; + this.#signatureData = params.signatureData || null; + this.#description = null; + this.defaultL10nId = "pdfjs-editor-signature-editor1"; } - ctx.canvas.width = ctx.canvas.height = 0; - ctx.font = savedFont; - if (ascent) { - const ratio = ascent / (ascent + descent); - ascentCache.set(fontFamily, ratio); - return ratio; + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + this._defaultDrawingOptions = new SignatureOptions(); + this._defaultDrawnSignatureOptions = new DrawnSignatureOptions(uiManager.viewParameters); + } + static getDefaultDrawingOptions(options) { + const clone = this._defaultDrawingOptions.clone(); + clone.updateProperties(options); + return clone; } - ascentCache.set(fontFamily, DEFAULT_FONT_ASCENT); - return DEFAULT_FONT_ASCENT; -} -function appendText(task, geom, styles) { - const textDiv = document.createElement("span"); - const textDivProperties = { - angle: 0, - canvasWidth: 0, - hasText: geom.str !== "", - hasEOL: geom.hasEOL, - fontSize: 0 - }; - task._textDivs.push(textDiv); - const tx = _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.Util.transform(task._transform, geom.transform); - let angle = Math.atan2(tx[1], tx[0]); - const style = styles[geom.fontName]; - if (style.vertical) { - angle += Math.PI / 2; - } - const fontFamily = task._fontInspectorEnabled && style.fontSubstitution || style.fontFamily; - const fontHeight = Math.hypot(tx[2], tx[3]); - const fontAscent = fontHeight * getAscent(fontFamily); - let left, top; - if (angle === 0) { - left = tx[4]; - top = tx[5] - fontAscent; - } else { - left = tx[4] + fontAscent * Math.sin(angle); - top = tx[5] - fontAscent * Math.cos(angle); + static get supportMultipleDrawings() { + return false; } - const scaleFactorStr = "calc(var(--scale-factor)*"; - const divStyle = textDiv.style; - if (task._container === task._rootContainer) { - divStyle.left = `${(100 * left / task._pageWidth).toFixed(2)}%`; - divStyle.top = `${(100 * top / task._pageHeight).toFixed(2)}%`; - } else { - divStyle.left = `${scaleFactorStr}${left.toFixed(2)}px)`; - divStyle.top = `${scaleFactorStr}${top.toFixed(2)}px)`; + static get typesMap() { + return shadow(this, "typesMap", new Map()); } - divStyle.fontSize = `${scaleFactorStr}${fontHeight.toFixed(2)}px)`; - divStyle.fontFamily = fontFamily; - textDivProperties.fontSize = fontHeight; - textDiv.setAttribute("role", "presentation"); - textDiv.textContent = geom.str; - textDiv.dir = geom.dir; - if (task._fontInspectorEnabled) { - textDiv.dataset.fontName = style.fontSubstitutionLoadedName || geom.fontName; - } - if (angle !== 0) { - textDivProperties.angle = angle * (180 / Math.PI); - } - let shouldScaleText = false; - if (geom.str.length > 1) { - shouldScaleText = true; - } else if (geom.str !== " " && geom.transform[0] !== geom.transform[3]) { - const absScaleX = Math.abs(geom.transform[0]), - absScaleY = Math.abs(geom.transform[3]); - if (absScaleX !== absScaleY && Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5) { - shouldScaleText = true; - } + static get isDrawer() { + return false; } - if (shouldScaleText) { - textDivProperties.canvasWidth = style.vertical ? geom.height : geom.width; + get telemetryFinalData() { + return { + type: "signature", + hasDescription: !!this.#description + }; } - task._textDivProperties.set(textDiv, textDivProperties); - if (task._isReadableStream) { - task._layoutText(textDiv); + static computeTelemetryFinalData(data) { + const hasDescriptionStats = data.get("hasDescription"); + return { + hasAltText: hasDescriptionStats.get(true) ?? 0, + hasNoAltText: hasDescriptionStats.get(false) ?? 0 + }; } -} -function layout(params) { - const { - div, - scale, - properties, - ctx, - prevFontSize, - prevFontFamily - } = params; - const { - style - } = div; - let transform = ""; - if (properties.canvasWidth !== 0 && properties.hasText) { - const { - fontFamily - } = style; - const { - canvasWidth, - fontSize - } = properties; - if (prevFontSize !== fontSize || prevFontFamily !== fontFamily) { - ctx.font = `${fontSize * scale}px ${fontFamily}`; - params.prevFontSize = fontSize; - params.prevFontFamily = fontFamily; + get isResizable() { + return true; + } + onScaleChanging() { + if (this._drawId === null) { + return; + } + super.onScaleChanging(); + } + render() { + if (this.div) { + return this.div; } + let baseX, baseY; const { - width - } = ctx.measureText(div.textContent); - if (width > 0) { - transform = `scaleX(${canvasWidth * scale / width})`; + _isCopy + } = this; + if (_isCopy) { + this._isCopy = false; + baseX = this.x; + baseY = this.y; } + super.render(); + if (this._drawId === null) { + if (this.#signatureData) { + const { + lines, + mustSmooth, + areContours, + description, + uuid, + heightInPage + } = this.#signatureData; + const { + rawDims: { + pageWidth, + pageHeight + }, + rotation + } = this.parent.viewport; + const outline = SignatureExtractor.processDrawnLines({ + lines, + pageWidth, + pageHeight, + rotation, + innerMargin: SignatureEditor._INNER_MARGIN, + mustSmooth, + areContours + }); + this.addSignature(outline, heightInPage, description, uuid); + } else { + this.div.setAttribute("data-l10n-args", JSON.stringify({ + description: "" + })); + this.div.hidden = true; + this._uiManager.getSignature(this); + } + } else { + this.div.setAttribute("data-l10n-args", JSON.stringify({ + description: this.#description || "" + })); + } + if (_isCopy) { + this._isCopy = true; + this._moveAfterPaste(baseX, baseY); + } + return this.div; } - if (properties.angle !== 0) { - transform = `rotate(${properties.angle}deg) ${transform}`; - } - if (transform.length > 0) { - style.transform = transform; + setUuid(uuid) { + this.#signatureUUID = uuid; + this.addEditToolbar(); } -} -function render(task) { - if (task._canceled) { - return; + getUuid() { + return this.#signatureUUID; } - const textDivs = task._textDivs; - const capability = task._capability; - const textDivsLength = textDivs.length; - if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) { - capability.resolve(); - return; + get description() { + return this.#description; } - if (!task._isReadableStream) { - for (const textDiv of textDivs) { - task._layoutText(textDiv); + set description(description) { + this.#description = description; + if (!this.div) { + return; } + this.div.setAttribute("data-l10n-args", JSON.stringify({ + description + })); + super.addEditToolbar().then(toolbar => { + toolbar?.updateEditSignatureButton(description); + }); } - capability.resolve(); -} -class TextLayerRenderTask { - constructor({ - textContentSource, - container, - viewport, - textDivs, - textDivProperties, - textContentItemsStr - }) { - this._textContentSource = textContentSource; - this._isReadableStream = textContentSource instanceof ReadableStream; - this._container = this._rootContainer = container; - this._textDivs = textDivs || []; - this._textContentItemsStr = textContentItemsStr || []; - this._fontInspectorEnabled = !!globalThis.FontInspector?.enabled; - this._reader = null; - this._textDivProperties = textDivProperties || new WeakMap(); - this._canceled = false; - this._capability = Promise.withResolvers(); - this._layoutTextParams = { - prevFontSize: null, - prevFontFamily: null, - div: null, - scale: viewport.scale * (globalThis.devicePixelRatio || 1), - properties: null, - ctx: getCtx() - }; + getSignaturePreview() { const { - pageWidth, - pageHeight, - pageX, - pageY - } = viewport.rawDims; - this._transform = [1, 0, 0, -1, -pageX, pageY + pageHeight]; - this._pageWidth = pageWidth; - this._pageHeight = pageHeight; - (0,_display_utils_js__WEBPACK_IMPORTED_MODULE_1__.setLayerDimensions)(container, viewport); - this._capability.promise.finally(() => { - this._layoutTextParams = null; - }).catch(() => {}); - } - get promise() { - return this._capability.promise; - } - cancel() { - this._canceled = true; - if (this._reader) { - this._reader.cancel(new _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AbortException("TextLayer task cancelled.")).catch(() => {}); - this._reader = null; - } - this._capability.reject(new _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AbortException("TextLayer task cancelled.")); + newCurves, + areContours, + thickness, + width, + height + } = this.#signatureData; + const maxDim = Math.max(width, height); + const outlineData = SignatureExtractor.processDrawnLines({ + lines: { + curves: newCurves.map(points => ({ + points + })), + thickness, + width, + height + }, + pageWidth: maxDim, + pageHeight: maxDim, + rotation: 0, + innerMargin: 0, + mustSmooth: false, + areContours + }); + return { + areContours, + outline: outlineData.outline + }; } - _processItems(items, styleCache) { - for (const item of items) { - if (item.str === undefined) { - if (item.type === "beginMarkedContentProps" || item.type === "beginMarkedContent") { - const parent = this._container; - this._container = document.createElement("span"); - this._container.classList.add("markedContent"); - if (item.id !== null) { - this._container.setAttribute("id", `${item.id}`); - } - parent.append(this._container); - } else if (item.type === "endMarkedContent") { - this._container = this._container.parentNode; - } - continue; - } - this._textContentItemsStr.push(item.str); - appendText(this, item, styleCache); + get toolbarButtons() { + if (this._uiManager.signatureManager) { + return [["editSignature", this._uiManager.signatureManager]]; } + return super.toolbarButtons; } - _layoutText(textDiv) { - const textDivProperties = this._layoutTextParams.properties = this._textDivProperties.get(textDiv); - this._layoutTextParams.div = textDiv; - layout(this._layoutTextParams); - if (textDivProperties.hasText) { - this._container.append(textDiv); + addSignature(data, heightInPage, description, uuid) { + const { + x: savedX, + y: savedY + } = this; + const { + outline + } = this.#signatureData = data; + this.#isExtracted = outline instanceof ContourDrawOutline; + this.description = description; + let drawingOptions; + if (this.#isExtracted) { + drawingOptions = SignatureEditor.getDefaultDrawingOptions(); + } else { + drawingOptions = SignatureEditor._defaultDrawnSignatureOptions.clone(); + drawingOptions.updateProperties({ + "stroke-width": outline.thickness + }); } - if (textDivProperties.hasEOL) { - const br = document.createElement("br"); - br.setAttribute("role", "presentation"); - this._container.append(br); + this._addOutlines({ + drawOutlines: outline, + drawingOptions + }); + const [, pageHeight] = this.pageDimensions; + let newHeight = heightInPage / pageHeight; + newHeight = newHeight >= 1 ? 0.5 : newHeight; + this.width *= newHeight / this.height; + if (this.width >= 1) { + newHeight *= 0.9 / this.width; + this.width = 0.9; } + this.height = newHeight; + this.setDims(); + this.x = savedX; + this.y = savedY; + this.center(); + this._onResized(); + this.onScaleChanging(); + this.rotate(); + this._uiManager.addToAnnotationStorage(this); + this.setUuid(uuid); + this._reportTelemetry({ + action: "pdfjs.signature.inserted", + data: { + hasBeenSaved: !!uuid, + hasDescription: !!description + } + }); + this.div.hidden = false; } - _render() { + getFromImage(bitmap) { const { - promise, - resolve, - reject - } = Promise.withResolvers(); - let styleCache = Object.create(null); - if (this._isReadableStream) { - const pump = () => { - this._reader.read().then(({ - value, - done - }) => { - if (done) { - resolve(); - return; - } - Object.assign(styleCache, value.styles); - this._processItems(value.items, styleCache); - pump(); - }, reject); - }; - this._reader = this._textContentSource.getReader(); - pump(); - } else if (this._textContentSource) { - const { - items, - styles - } = this._textContentSource; - this._processItems(items, styles); - resolve(); + rawDims: { + pageWidth, + pageHeight + }, + rotation + } = this.parent.viewport; + return SignatureExtractor.process(bitmap, pageWidth, pageHeight, rotation, SignatureEditor._INNER_MARGIN); + } + getFromText(text, fontInfo) { + const { + rawDims: { + pageWidth, + pageHeight + }, + rotation + } = this.parent.viewport; + return SignatureExtractor.extractContoursFromText(text, fontInfo, pageWidth, pageHeight, rotation, SignatureEditor._INNER_MARGIN); + } + getDrawnSignature(curves) { + const { + rawDims: { + pageWidth, + pageHeight + }, + rotation + } = this.parent.viewport; + return SignatureExtractor.processDrawnLines({ + lines: curves, + pageWidth, + pageHeight, + rotation, + innerMargin: SignatureEditor._INNER_MARGIN, + mustSmooth: false, + areContours: false + }); + } + createDrawingOptions({ + areContours, + thickness + }) { + if (areContours) { + this._drawingOptions = SignatureEditor.getDefaultDrawingOptions(); } else { - throw new Error('No "textContentSource" parameter specified.'); + this._drawingOptions = SignatureEditor._defaultDrawnSignatureOptions.clone(); + this._drawingOptions.updateProperties({ + "stroke-width": thickness + }); } - promise.then(() => { - styleCache = null; - render(this); - }, this._capability.reject); } -} -function renderTextLayer(params) { - const task = new TextLayerRenderTask(params); - task._render(); - return task; -} -function updateTextLayer({ - container, - viewport, - textDivs, - textDivProperties, - mustRotate = true, - mustRescale = true -}) { - if (mustRotate) { - (0,_display_utils_js__WEBPACK_IMPORTED_MODULE_1__.setLayerDimensions)(container, { - rotation: viewport.rotation + serialize(isForCopying = false) { + if (this.isEmpty()) { + return null; + } + const { + lines, + points + } = this.serializeDraw(isForCopying); + const { + _drawingOptions: { + "stroke-width": thickness + } + } = this; + const serialized = Object.assign(super.serialize(isForCopying), { + isSignature: true, + areContours: this.#isExtracted, + color: [0, 0, 0], + thickness: this.#isExtracted ? 0 : thickness }); - } - if (mustRescale) { - const ctx = getCtx(); - const scale = viewport.scale * (globalThis.devicePixelRatio || 1); - const params = { - prevFontSize: null, - prevFontFamily: null, - div: null, - scale, - properties: null, - ctx - }; - for (const div of textDivs) { - params.properties = textDivProperties.get(div); - params.div = div; - layout(params); + this.addComment(serialized); + if (isForCopying) { + serialized.paths = { + lines, + points + }; + serialized.uuid = this.#signatureUUID; + serialized.isCopy = true; + } else { + serialized.lines = lines; + } + if (this.#description) { + serialized.accessibilityData = { + type: "Figure", + alt: this.#description + }; } + return serialized; + } + static deserializeDraw(pageX, pageY, pageWidth, pageHeight, innerMargin, data) { + if (data.areContours) { + return ContourDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data); + } + return InkDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data); + } + static async deserialize(data, parent, uiManager) { + const editor = await super.deserialize(data, parent, uiManager); + editor.#isExtracted = data.areContours; + editor.description = data.accessibilityData?.alt || ""; + editor.#signatureUUID = data.uuid; + return editor; } } +;// ./src/display/editor/stamp.js -/***/ }), - -/***/ 585: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFDataTransportStream: () => (/* binding */ PDFDataTransportStream) -/* harmony export */ }); -/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(292); -/* harmony import */ var _display_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(419); -class PDFDataTransportStream { - constructor(pdfDataRangeTransport, { - disableRange = false, - disableStream = false - }) { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.assert)(pdfDataRangeTransport, 'PDFDataTransportStream - missing required "pdfDataRangeTransport" argument.'); - const { - length, - initialData, - progressiveDone, - contentDispositionFilename - } = pdfDataRangeTransport; - this._queuedChunks = []; - this._progressiveDone = progressiveDone; - this._contentDispositionFilename = contentDispositionFilename; - if (initialData?.length > 0) { - const buffer = initialData instanceof Uint8Array && initialData.byteLength === initialData.buffer.byteLength ? initialData.buffer : new Uint8Array(initialData).buffer; - this._queuedChunks.push(buffer); - } - this._pdfDataRangeTransport = pdfDataRangeTransport; - this._isStreamingSupported = !disableStream; - this._isRangeSupported = !disableRange; - this._contentLength = length; - this._fullRequestReader = null; - this._rangeReaders = []; - pdfDataRangeTransport.addRangeListener((begin, chunk) => { - this._onReceiveData({ - begin, - chunk - }); - }); - pdfDataRangeTransport.addProgressListener((loaded, total) => { - this._onProgress({ - loaded, - total - }); - }); - pdfDataRangeTransport.addProgressiveReadListener(chunk => { - this._onReceiveData({ - chunk - }); +class StampEditor extends AnnotationEditor { + #bitmap = null; + #bitmapId = null; + #bitmapPromise = null; + #bitmapUrl = null; + #bitmapFile = null; + #bitmapFileName = ""; + #canvas = null; + #missingCanvas = false; + #resizeTimeoutId = null; + #isSvg = false; + #hasBeenAddedInUndoStack = false; + static _type = "stamp"; + static _editorType = AnnotationEditorType.STAMP; + constructor(params) { + super({ + ...params, + name: "stampEditor" }); - pdfDataRangeTransport.addProgressiveDoneListener(() => { - this._onProgressiveDone(); + this.#bitmapUrl = params.bitmapUrl; + this.#bitmapFile = params.bitmapFile; + this.defaultL10nId = "pdfjs-editor-stamp-editor"; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + } + static isHandlingMimeForPasting(mime) { + return SupportedImageMimeTypes.includes(mime); + } + static paste(item, parent) { + parent.pasteEditor({ + mode: AnnotationEditorType.STAMP + }, { + bitmapFile: item.getAsFile() }); - pdfDataRangeTransport.transportReady(); } - _onReceiveData({ - begin, - chunk - }) { - const buffer = chunk instanceof Uint8Array && chunk.byteLength === chunk.buffer.byteLength ? chunk.buffer : new Uint8Array(chunk).buffer; - if (begin === undefined) { - if (this._fullRequestReader) { - this._fullRequestReader._enqueue(buffer); - } else { - this._queuedChunks.push(buffer); - } - } else { - const found = this._rangeReaders.some(function (rangeReader) { - if (rangeReader._begin !== begin) { - return false; - } - rangeReader._enqueue(buffer); - return true; - }); - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.assert)(found, "_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found."); + altTextFinish() { + if (this._uiManager.useNewAltTextFlow) { + this.div.hidden = false; } + super.altTextFinish(); } - get _progressiveDataLength() { - return this._fullRequestReader?._loaded ?? 0; + get telemetryFinalData() { + return { + type: "stamp", + hasAltText: !!this.altTextData?.altText + }; + } + static computeTelemetryFinalData(data) { + const hasAltTextStats = data.get("hasAltText"); + return { + hasAltText: hasAltTextStats.get(true) ?? 0, + hasNoAltText: hasAltTextStats.get(false) ?? 0 + }; + } + #getBitmapFetched(data, fromId = false) { + if (!data) { + this.remove(); + return; + } + this.#bitmap = data.bitmap; + if (!fromId) { + this.#bitmapId = data.id; + this.#isSvg = data.isSvg; + } + if (data.file) { + this.#bitmapFileName = data.file.name; + } + this.#createCanvas(); } - _onProgress(evt) { - if (evt.total === undefined) { - this._rangeReaders[0]?.onProgress?.({ - loaded: evt.loaded + #getBitmapDone() { + this.#bitmapPromise = null; + this._uiManager.enableWaiting(false); + if (!this.#canvas) { + return; + } + if (this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && this.#bitmap) { + this.addEditToolbar().then(() => { + this._editToolbar.hide(); + this._uiManager.editAltText(this, true); }); - } else { - this._fullRequestReader?.onProgress?.({ - loaded: evt.loaded, - total: evt.total + return; + } + if (!this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && this.#bitmap) { + this._reportTelemetry({ + action: "pdfjs.image.image_added", + data: { + alt_text_modal: false, + alt_text_type: "empty" + } }); + try { + this.mlGuessAltText(); + } catch {} } + this.div.focus(); } - _onProgressiveDone() { - this._fullRequestReader?.progressiveDone(); - this._progressiveDone = true; - } - _removeRangeReader(reader) { - const i = this._rangeReaders.indexOf(reader); - if (i >= 0) { - this._rangeReaders.splice(i, 1); + async mlGuessAltText(imageData = null, updateAltTextData = true) { + if (this.hasAltTextData()) { + return null; } - } - getFullReader() { - (0,_shared_util_js__WEBPACK_IMPORTED_MODULE_0__.assert)(!this._fullRequestReader, "PDFDataTransportStream.getFullReader can only be called once."); - const queuedChunks = this._queuedChunks; - this._queuedChunks = null; - return new PDFDataTransportStreamReader(this, queuedChunks, this._progressiveDone, this._contentDispositionFilename); - } - getRangeReader(begin, end) { - if (end <= this._progressiveDataLength) { + const { + mlManager + } = this._uiManager; + if (!mlManager) { + throw new Error("No ML."); + } + if (!(await mlManager.isEnabledFor("altText"))) { + throw new Error("ML isn't enabled for alt text."); + } + const { + data, + width, + height + } = imageData || this.copyCanvas(null, null, true).imageData; + const response = await mlManager.guess({ + name: "altText", + request: { + data, + width, + height, + channels: data.length / (width * height) + } + }); + if (!response) { + throw new Error("No response from the AI service."); + } + if (response.error) { + throw new Error("Error from the AI service."); + } + if (response.cancel) { return null; } - const reader = new PDFDataTransportStreamRangeReader(this, begin, end); - this._pdfDataRangeTransport.requestDataRange(begin, end); - this._rangeReaders.push(reader); - return reader; - } - cancelAllRequests(reason) { - this._fullRequestReader?.cancel(reason); - for (const reader of this._rangeReaders.slice(0)) { - reader.cancel(reason); + if (!response.output) { + throw new Error("No valid response from the AI service."); } - this._pdfDataRangeTransport.abort(); - } -} -class PDFDataTransportStreamReader { - constructor(stream, queuedChunks, progressiveDone = false, contentDispositionFilename = null) { - this._stream = stream; - this._done = progressiveDone || false; - this._filename = (0,_display_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPdfFile)(contentDispositionFilename) ? contentDispositionFilename : null; - this._queuedChunks = queuedChunks || []; - this._loaded = 0; - for (const chunk of this._queuedChunks) { - this._loaded += chunk.byteLength; + const altText = response.output; + await this.setGuessedAltText(altText); + if (updateAltTextData && !this.hasAltTextData()) { + this.altTextData = { + alt: altText, + decorative: false + }; } - this._requests = []; - this._headersReady = Promise.resolve(); - stream._fullRequestReader = this; - this.onProgress = null; + return altText; } - _enqueue(chunk) { - if (this._done) { + #getBitmap() { + if (this.#bitmapId) { + this._uiManager.enableWaiting(true); + this._uiManager.imageManager.getFromId(this.#bitmapId).then(data => this.#getBitmapFetched(data, true)).finally(() => this.#getBitmapDone()); return; } - if (this._requests.length > 0) { - const requestCapability = this._requests.shift(); - requestCapability.resolve({ - value: chunk, - done: false + if (this.#bitmapUrl) { + const url = this.#bitmapUrl; + this.#bitmapUrl = null; + this._uiManager.enableWaiting(true); + this.#bitmapPromise = this._uiManager.imageManager.getFromUrl(url).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone()); + return; + } + if (this.#bitmapFile) { + const file = this.#bitmapFile; + this.#bitmapFile = null; + this._uiManager.enableWaiting(true); + this.#bitmapPromise = this._uiManager.imageManager.getFromFile(file).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone()); + return; + } + const input = document.createElement("input"); + input.type = "file"; + input.accept = SupportedImageMimeTypes.join(","); + const signal = this._uiManager._signal; + this.#bitmapPromise = new Promise(resolve => { + input.addEventListener("change", async () => { + if (!input.files || input.files.length === 0) { + this.remove(); + } else { + this._uiManager.enableWaiting(true); + const data = await this._uiManager.imageManager.getFromFile(input.files[0]); + this._reportTelemetry({ + action: "pdfjs.image.image_selected", + data: { + alt_text_modal: this._uiManager.useNewAltTextFlow + } + }); + this.#getBitmapFetched(data); + } + resolve(); + }, { + signal }); - } else { - this._queuedChunks.push(chunk); + input.addEventListener("cancel", () => { + this.remove(); + resolve(); + }, { + signal + }); + }).finally(() => this.#getBitmapDone()); + input.click(); + } + remove() { + if (this.#bitmapId) { + this.#bitmap = null; + this._uiManager.imageManager.deleteId(this.#bitmapId); + this.#canvas?.remove(); + this.#canvas = null; + if (this.#resizeTimeoutId) { + clearTimeout(this.#resizeTimeoutId); + this.#resizeTimeoutId = null; + } } - this._loaded += chunk.byteLength; + super.remove(); } - get headersReady() { - return this._headersReady; + rebuild() { + if (!this.parent) { + if (this.#bitmapId) { + this.#getBitmap(); + } + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + if (this.#bitmapId && this.#canvas === null) { + this.#getBitmap(); + } + if (!this.isAttachedToDOM) { + this.parent.add(this); + } } - get filename() { - return this._filename; + onceAdded(focus) { + this._isDraggable = true; + if (focus) { + this.div.focus(); + } } - get isRangeSupported() { - return this._stream._isRangeSupported; + isEmpty() { + return !(this.#bitmapPromise || this.#bitmap || this.#bitmapUrl || this.#bitmapFile || this.#bitmapId || this.#missingCanvas); } - get isStreamingSupported() { - return this._stream._isStreamingSupported; + get toolbarButtons() { + return [["altText", this.createAltText()]]; } - get contentLength() { - return this._stream._contentLength; + get isResizable() { + return true; } - async read() { - if (this._queuedChunks.length > 0) { - const chunk = this._queuedChunks.shift(); - return { - value: chunk, - done: false - }; + render() { + if (this.div) { + return this.div; } - if (this._done) { - return { - value: undefined, - done: true - }; + let baseX, baseY; + if (this._isCopy) { + baseX = this.x; + baseY = this.y; } - const requestCapability = Promise.withResolvers(); - this._requests.push(requestCapability); - return requestCapability.promise; - } - cancel(reason) { - this._done = true; - for (const requestCapability of this._requests) { - requestCapability.resolve({ - value: undefined, - done: true - }); + super.render(); + this.div.hidden = true; + this.createAltText(); + if (!this.#missingCanvas) { + if (this.#bitmap) { + this.#createCanvas(); + } else { + this.#getBitmap(); + } } - this._requests.length = 0; + if (this._isCopy) { + this._moveAfterPaste(baseX, baseY); + } + this._uiManager.addShouldRescale(this); + return this.div; } - progressiveDone() { - if (this._done) { - return; + setCanvas(annotationElementId, canvas) { + const { + id: bitmapId, + bitmap + } = this._uiManager.imageManager.getFromCanvas(annotationElementId, canvas); + canvas.remove(); + if (bitmapId && this._uiManager.imageManager.isValidId(bitmapId)) { + this.#bitmapId = bitmapId; + if (bitmap) { + this.#bitmap = bitmap; + } + this.#missingCanvas = false; + this.#createCanvas(); } - this._done = true; } -} -class PDFDataTransportStreamRangeReader { - constructor(stream, begin, end) { - this._stream = stream; - this._begin = begin; - this._end = end; - this._queuedChunk = null; - this._requests = []; - this._done = false; - this.onProgress = null; + _onResized() { + this.onScaleChanging(); } - _enqueue(chunk) { - if (this._done) { + onScaleChanging() { + if (!this.parent) { return; } - if (this._requests.length === 0) { - this._queuedChunk = chunk; - } else { - const requestsCapability = this._requests.shift(); - requestsCapability.resolve({ - value: chunk, - done: false - }); - for (const requestCapability of this._requests) { - requestCapability.resolve({ - value: undefined, - done: true - }); - } - this._requests.length = 0; + if (this.#resizeTimeoutId !== null) { + clearTimeout(this.#resizeTimeoutId); } - this._done = true; - this._stream._removeRangeReader(this); - } - get isStreamingSupported() { - return false; + const TIME_TO_WAIT = 200; + this.#resizeTimeoutId = setTimeout(() => { + this.#resizeTimeoutId = null; + this.#drawBitmap(); + }, TIME_TO_WAIT); } - async read() { - if (this._queuedChunk) { - const chunk = this._queuedChunk; - this._queuedChunk = null; - return { - value: chunk, - done: false - }; + #createCanvas() { + const { + div + } = this; + let { + width, + height + } = this.#bitmap; + const [pageWidth, pageHeight] = this.pageDimensions; + const MAX_RATIO = 0.75; + if (this.width) { + width = this.width * pageWidth; + height = this.height * pageHeight; + } else if (width > MAX_RATIO * pageWidth || height > MAX_RATIO * pageHeight) { + const factor = Math.min(MAX_RATIO * pageWidth / width, MAX_RATIO * pageHeight / height); + width *= factor; + height *= factor; } - if (this._done) { - return { - value: undefined, - done: true - }; + this._uiManager.enableWaiting(false); + const canvas = this.#canvas = document.createElement("canvas"); + canvas.setAttribute("role", "img"); + this.addContainer(canvas); + this.width = width / pageWidth; + this.height = height / pageHeight; + this.setDims(); + if (this._initialOptions?.isCentered) { + this.center(); + } else { + this.fixAndSetPosition(); } - const requestCapability = Promise.withResolvers(); - this._requests.push(requestCapability); - return requestCapability.promise; - } - cancel(reason) { - this._done = true; - for (const requestCapability of this._requests) { - requestCapability.resolve({ - value: undefined, - done: true - }); + this._initialOptions = null; + if (!this._uiManager.useNewAltTextWhenAddingImage || !this._uiManager.useNewAltTextFlow || this.annotationElementId) { + div.hidden = false; } - this._requests.length = 0; - this._stream._removeRangeReader(this); - } -} - - -/***/ }), - -/***/ 164: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ GlobalWorkerOptions: () => (/* binding */ GlobalWorkerOptions) -/* harmony export */ }); -class GlobalWorkerOptions { - static #port = null; - static #src = ""; - static get workerPort() { - return this.#port; - } - static set workerPort(val) { - if (!(typeof Worker !== "undefined" && val instanceof Worker) && val !== null) { - throw new Error("Invalid `workerPort` type."); + this.#drawBitmap(); + if (!this.#hasBeenAddedInUndoStack) { + this.parent.addUndoableEditor(this); + this.#hasBeenAddedInUndoStack = true; } - this.#port = val; - } - static get workerSrc() { - return this.#src; - } - static set workerSrc(val) { - if (typeof val !== "string") { - throw new Error("Invalid `workerSrc` type."); + this._reportTelemetry({ + action: "inserted_image" + }); + if (this.#bitmapFileName) { + this.div.setAttribute("aria-description", this.#bitmapFileName); + } + if (!this.annotationElementId) { + this._uiManager.a11yAlert(AnnotationEditor._l10nAlert.stamp); } - this.#src = val; } -} - - -/***/ }), - -/***/ 284: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ XfaLayer: () => (/* binding */ XfaLayer) -/* harmony export */ }); -/* harmony import */ var _xfa_text_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(50); - -class XfaLayer { - static setupStorage(html, id, element, storage, intent) { - const storedData = storage.getValue(id, { - value: null - }); - switch (element.name) { - case "textarea": - if (storedData.value !== null) { - html.textContent = storedData.value; - } - if (intent === "print") { - break; - } - html.addEventListener("input", event => { - storage.setValue(id, { - value: event.target.value - }); - }); - break; - case "input": - if (element.attributes.type === "radio" || element.attributes.type === "checkbox") { - if (storedData.value === element.attributes.xfaOn) { - html.setAttribute("checked", true); - } else if (storedData.value === element.attributes.xfaOff) { - html.removeAttribute("checked"); - } - if (intent === "print") { - break; - } - html.addEventListener("change", event => { - storage.setValue(id, { - value: event.target.checked ? event.target.getAttribute("xfaOn") : event.target.getAttribute("xfaOff") - }); - }); - } else { - if (storedData.value !== null) { - html.setAttribute("value", storedData.value); - } - if (intent === "print") { - break; - } - html.addEventListener("input", event => { - storage.setValue(id, { - value: event.target.value - }); - }); - } - break; - case "select": - if (storedData.value !== null) { - html.setAttribute("value", storedData.value); - for (const option of element.children) { - if (option.attributes.value === storedData.value) { - option.attributes.selected = true; - } else if (option.attributes.hasOwnProperty("selected")) { - delete option.attributes.selected; - } + copyCanvas(maxDataDimension, maxPreviewDimension, createImageData = false) { + if (!maxDataDimension) { + maxDataDimension = 224; + } + const { + width: bitmapWidth, + height: bitmapHeight + } = this.#bitmap; + const outputScale = new OutputScale(); + let bitmap = this.#bitmap; + let width = bitmapWidth, + height = bitmapHeight; + let canvas = null; + if (maxPreviewDimension) { + if (bitmapWidth > maxPreviewDimension || bitmapHeight > maxPreviewDimension) { + const ratio = Math.min(maxPreviewDimension / bitmapWidth, maxPreviewDimension / bitmapHeight); + width = Math.floor(bitmapWidth * ratio); + height = Math.floor(bitmapHeight * ratio); + } + canvas = document.createElement("canvas"); + const scaledWidth = canvas.width = Math.ceil(width * outputScale.sx); + const scaledHeight = canvas.height = Math.ceil(height * outputScale.sy); + if (!this.#isSvg) { + bitmap = this.#scaleBitmap(scaledWidth, scaledHeight); + } + const ctx = canvas.getContext("2d"); + ctx.filter = this._uiManager.hcmFilter; + let white = "white", + black = "#cfcfd8"; + if (this._uiManager.hcmFilter !== "none") { + black = "black"; + } else if (ColorScheme.isDarkMode) { + white = "#8f8f9d"; + black = "#42414d"; + } + const boxDim = 15; + const boxDimWidth = boxDim * outputScale.sx; + const boxDimHeight = boxDim * outputScale.sy; + const pattern = new OffscreenCanvas(boxDimWidth * 2, boxDimHeight * 2); + const patternCtx = pattern.getContext("2d"); + patternCtx.fillStyle = white; + patternCtx.fillRect(0, 0, boxDimWidth * 2, boxDimHeight * 2); + patternCtx.fillStyle = black; + patternCtx.fillRect(0, 0, boxDimWidth, boxDimHeight); + patternCtx.fillRect(boxDimWidth, boxDimHeight, boxDimWidth, boxDimHeight); + ctx.fillStyle = ctx.createPattern(pattern, "repeat"); + ctx.fillRect(0, 0, scaledWidth, scaledHeight); + ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, scaledWidth, scaledHeight); + } + let imageData = null; + if (createImageData) { + let dataWidth, dataHeight; + if (outputScale.symmetric && bitmap.width < maxDataDimension && bitmap.height < maxDataDimension) { + dataWidth = bitmap.width; + dataHeight = bitmap.height; + } else { + bitmap = this.#bitmap; + if (bitmapWidth > maxDataDimension || bitmapHeight > maxDataDimension) { + const ratio = Math.min(maxDataDimension / bitmapWidth, maxDataDimension / bitmapHeight); + dataWidth = Math.floor(bitmapWidth * ratio); + dataHeight = Math.floor(bitmapHeight * ratio); + if (!this.#isSvg) { + bitmap = this.#scaleBitmap(dataWidth, dataHeight); } } - html.addEventListener("input", event => { - const options = event.target.options; - const value = options.selectedIndex === -1 ? "" : options[options.selectedIndex].value; - storage.setValue(id, { - value - }); - }); - break; + } + const offscreen = new OffscreenCanvas(dataWidth, dataHeight); + const offscreenCtx = offscreen.getContext("2d", { + willReadFrequently: true + }); + offscreenCtx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, dataWidth, dataHeight); + imageData = { + width: dataWidth, + height: dataHeight, + data: offscreenCtx.getImageData(0, 0, dataWidth, dataHeight).data + }; } + return { + canvas, + width, + height, + imageData + }; } - static setAttributes({ - html, - element, - storage = null, - intent, - linkService - }) { + #scaleBitmap(width, height) { const { - attributes - } = element; - const isHTMLAnchorElement = html instanceof HTMLAnchorElement; - if (attributes.type === "radio") { - attributes.name = `${attributes.name}-${intent}`; + width: bitmapWidth, + height: bitmapHeight + } = this.#bitmap; + let newWidth = bitmapWidth; + let newHeight = bitmapHeight; + let bitmap = this.#bitmap; + while (newWidth > 2 * width || newHeight > 2 * height) { + const prevWidth = newWidth; + const prevHeight = newHeight; + if (newWidth > 2 * width) { + newWidth = Math.ceil(newWidth / 2); + } + if (newHeight > 2 * height) { + newHeight = Math.ceil(newHeight / 2); + } + const offscreen = new OffscreenCanvas(newWidth, newHeight); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight); + bitmap = offscreen.transferToImageBitmap(); } - for (const [key, value] of Object.entries(attributes)) { - if (value === null || value === undefined) { - continue; + return bitmap; + } + #drawBitmap() { + const [parentWidth, parentHeight] = this.parentDimensions; + const { + width, + height + } = this; + const outputScale = new OutputScale(); + const scaledWidth = Math.ceil(width * parentWidth * outputScale.sx); + const scaledHeight = Math.ceil(height * parentHeight * outputScale.sy); + const canvas = this.#canvas; + if (!canvas || canvas.width === scaledWidth && canvas.height === scaledHeight) { + return; + } + canvas.width = scaledWidth; + canvas.height = scaledHeight; + const bitmap = this.#isSvg ? this.#bitmap : this.#scaleBitmap(scaledWidth, scaledHeight); + const ctx = canvas.getContext("2d"); + ctx.filter = this._uiManager.hcmFilter; + ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, scaledWidth, scaledHeight); + } + #serializeBitmap(toUrl) { + if (toUrl) { + if (this.#isSvg) { + const url = this._uiManager.imageManager.getSvgUrl(this.#bitmapId); + if (url) { + return url; + } } - switch (key) { - case "class": - if (value.length) { - html.setAttribute(key, value.join(" ")); - } - break; - case "dataId": - break; - case "id": - html.setAttribute("data-element-id", value); - break; - case "style": - Object.assign(html.style, value); - break; - case "textContent": - html.textContent = value; - break; - default: - if (!isHTMLAnchorElement || key !== "href" && key !== "newWindow") { - html.setAttribute(key, value); + const canvas = document.createElement("canvas"); + ({ + width: canvas.width, + height: canvas.height + } = this.#bitmap); + const ctx = canvas.getContext("2d"); + ctx.drawImage(this.#bitmap, 0, 0); + return canvas.toDataURL(); + } + if (this.#isSvg) { + const [pageWidth, pageHeight] = this.pageDimensions; + const width = Math.round(this.width * pageWidth * PixelsPerInch.PDF_TO_CSS_UNITS); + const height = Math.round(this.height * pageHeight * PixelsPerInch.PDF_TO_CSS_UNITS); + const offscreen = new OffscreenCanvas(width, height); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(this.#bitmap, 0, 0, this.#bitmap.width, this.#bitmap.height, 0, 0, width, height); + return offscreen.transferToImageBitmap(); + } + return structuredClone(this.#bitmap); + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + let missingCanvas = false; + if (data instanceof StampAnnotationElement) { + const { + data: { + rect, + rotation, + id, + structParent, + popupRef, + richText, + contentsObj, + creationDate, + modificationDate + }, + container, + parent: { + page: { + pageNumber } + }, + canvas + } = data; + let bitmapId, bitmap; + if (canvas) { + delete data.canvas; + ({ + id: bitmapId, + bitmap + } = uiManager.imageManager.getFromCanvas(container.id, canvas)); + canvas.remove(); + } else { + missingCanvas = true; + data._hasNoCanvas = true; } + const altText = (await parent._structTree.getAriaAttributes(`${AnnotationPrefix}${id}`))?.get("aria-label") || ""; + initialData = data = { + annotationType: AnnotationEditorType.STAMP, + bitmapId, + bitmap, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + annotationElementId: id, + id, + deleted: false, + accessibilityData: { + decorative: false, + altText + }, + isSvg: false, + structParent, + popupRef, + richText, + comment: contentsObj?.str || null, + creationDate, + modificationDate + }; } - if (isHTMLAnchorElement) { - linkService.addLinkAttributes(html, attributes.href, attributes.newWindow); + const editor = await super.deserialize(data, parent, uiManager); + const { + rect, + bitmap, + bitmapUrl, + bitmapId, + isSvg, + accessibilityData + } = data; + if (missingCanvas) { + uiManager.addMissingCanvas(data.id, editor); + editor.#missingCanvas = true; + } else if (bitmapId && uiManager.imageManager.isValidId(bitmapId)) { + editor.#bitmapId = bitmapId; + if (bitmap) { + editor.#bitmap = bitmap; + } + } else { + editor.#bitmapUrl = bitmapUrl; } - if (storage && attributes.dataId) { - this.setupStorage(html, attributes.dataId, element, storage); + editor.#isSvg = isSvg; + const [parentWidth, parentHeight] = editor.pageDimensions; + editor.width = (rect[2] - rect[0]) / parentWidth; + editor.height = (rect[3] - rect[1]) / parentHeight; + if (accessibilityData) { + editor.altTextData = accessibilityData; } + editor._initialData = initialData; + if (data.comment) { + editor.setCommentData(data); + } + editor.#hasBeenAddedInUndoStack = !!initialData; + return editor; } - static render(parameters) { - const storage = parameters.annotationStorage; - const linkService = parameters.linkService; - const root = parameters.xfaHtml; - const intent = parameters.intent || "display"; - const rootHtml = document.createElement(root.name); - if (root.attributes) { - this.setAttributes({ - html: rootHtml, - element: root, - intent, - linkService - }); + serialize(isForCopying = false, context = null) { + if (this.isEmpty()) { + return null; } - const isNotForRichText = intent !== "richText"; - const rootDiv = parameters.div; - rootDiv.append(rootHtml); - if (parameters.viewport) { - const transform = `matrix(${parameters.viewport.transform.join(",")})`; - rootDiv.style.transform = transform; + if (this.deleted) { + return this.serializeDeleted(); } - if (isNotForRichText) { - rootDiv.setAttribute("class", "xfaLayer xfaFont"); + const serialized = Object.assign(super.serialize(isForCopying), { + bitmapId: this.#bitmapId, + isSvg: this.#isSvg + }); + this.addComment(serialized); + if (isForCopying) { + serialized.bitmapUrl = this.#serializeBitmap(true); + serialized.accessibilityData = this.serializeAltText(true); + serialized.isCopy = true; + return serialized; } - const textDivs = []; - if (root.children.length === 0) { - if (root.value) { - const node = document.createTextNode(root.value); - rootHtml.append(node); - if (isNotForRichText && _xfa_text_js__WEBPACK_IMPORTED_MODULE_0__.XfaText.shouldBuildText(root.name)) { - textDivs.push(node); - } - } - return { - textDivs + const { + decorative, + altText + } = this.serializeAltText(false); + if (!decorative && altText) { + serialized.accessibilityData = { + type: "Figure", + alt: altText }; } - const stack = [[root, -1, rootHtml]]; - while (stack.length > 0) { - const [parent, i, html] = stack.at(-1); - if (i + 1 === parent.children.length) { - stack.pop(); - continue; - } - const child = parent.children[++stack.at(-1)[1]]; - if (child === null) { - continue; - } - const { - name - } = child; - if (name === "#text") { - const node = document.createTextNode(child.value); - textDivs.push(node); - html.append(node); - continue; - } - const childHtml = child?.attributes?.xmlns ? document.createElementNS(child.attributes.xmlns, name) : document.createElement(name); - html.append(childHtml); - if (child.attributes) { - this.setAttributes({ - html: childHtml, - element: child, - storage, - intent, - linkService - }); + if (this.annotationElementId) { + const changes = this.#hasElementChanged(serialized); + if (changes.isSame) { + return null; } - if (child.children?.length > 0) { - stack.push([child, -1, childHtml]); - } else if (child.value) { - const node = document.createTextNode(child.value); - if (isNotForRichText && _xfa_text_js__WEBPACK_IMPORTED_MODULE_0__.XfaText.shouldBuildText(name)) { - textDivs.push(node); - } - childHtml.append(node); + if (changes.isSameAltText) { + delete serialized.accessibilityData; + } else { + serialized.accessibilityData.structParent = this._initialData.structParent ?? -1; } + serialized.id = this.annotationElementId; + delete serialized.bitmapId; + return serialized; } - for (const el of rootDiv.querySelectorAll(".xfaNonInteractive input, .xfaNonInteractive textarea")) { - el.setAttribute("readOnly", true); + if (context === null) { + return serialized; + } + context.stamps ||= new Map(); + const area = this.#isSvg ? (serialized.rect[2] - serialized.rect[0]) * (serialized.rect[3] - serialized.rect[1]) : null; + if (!context.stamps.has(this.#bitmapId)) { + context.stamps.set(this.#bitmapId, { + area, + serialized + }); + serialized.bitmap = this.#serializeBitmap(false); + } else if (this.#isSvg) { + const prevData = context.stamps.get(this.#bitmapId); + if (area > prevData.area) { + prevData.area = area; + prevData.serialized.bitmap.close(); + prevData.serialized.bitmap = this.#serializeBitmap(false); + } } + return serialized; + } + #hasElementChanged(serialized) { + const { + pageIndex, + accessibilityData: { + altText + } + } = this._initialData; + const isSamePageIndex = serialized.pageIndex === pageIndex; + const isSameAltText = (serialized.accessibilityData?.alt || "") === altText; return { - textDivs + isSame: !this.hasEditedComment && !this._hasBeenMoved && !this._hasBeenResized && isSamePageIndex && isSameAltText, + isSameAltText }; } - static update(parameters) { - const transform = `matrix(${parameters.viewport.transform.join(",")})`; - parameters.div.style.transform = transform; - parameters.div.hidden = false; - } -} - - -/***/ }), - -/***/ 50: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ XfaText: () => (/* binding */ XfaText) -/* harmony export */ }); -class XfaText { - static textContent(xfa) { - const items = []; - const output = { - items, - styles: Object.create(null) - }; - function walk(node) { - if (!node) { - return; - } - let str = null; - const name = node.name; - if (name === "#text") { - str = node.value; - } else if (!XfaText.shouldBuildText(name)) { - return; - } else if (node?.attributes?.textContent) { - str = node.attributes.textContent; - } else if (node.value) { - str = node.value; - } - if (str !== null) { - items.push({ - str - }); - } - if (!node.children) { - return; - } - for (const child of node.children) { - walk(child); - } + renderAnnotationElement(annotation) { + if (this.deleted) { + annotation.hide(); + return null; } - walk(xfa); - return output; - } - static shouldBuildText(name) { - return !(name === "textarea" || name === "input" || name === "option" || name === "select"); + annotation.updateEdited({ + rect: this.getPDFRect(), + popup: this.comment + }); + return null; } } +;// ./src/display/editor/annotation_editor_layer.js -/***/ }), - -/***/ 228: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ AbortException: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AbortException), -/* harmony export */ AnnotationEditorLayer: () => (/* reexport safe */ _display_editor_annotation_editor_layer_js__WEBPACK_IMPORTED_MODULE_4__.AnnotationEditorLayer), -/* harmony export */ AnnotationEditorParamsType: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType), -/* harmony export */ AnnotationEditorType: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType), -/* harmony export */ AnnotationEditorUIManager: () => (/* reexport safe */ _display_editor_tools_js__WEBPACK_IMPORTED_MODULE_5__.AnnotationEditorUIManager), -/* harmony export */ AnnotationLayer: () => (/* reexport safe */ _display_annotation_layer_js__WEBPACK_IMPORTED_MODULE_6__.AnnotationLayer), -/* harmony export */ AnnotationMode: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.AnnotationMode), -/* harmony export */ CMapCompressionType: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.CMapCompressionType), -/* harmony export */ ColorPicker: () => (/* reexport safe */ _display_editor_color_picker_js__WEBPACK_IMPORTED_MODULE_7__.ColorPicker), -/* harmony export */ DOMSVGFactory: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.DOMSVGFactory), -/* harmony export */ DrawLayer: () => (/* reexport safe */ _display_draw_layer_js__WEBPACK_IMPORTED_MODULE_8__.DrawLayer), -/* harmony export */ FeatureTest: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.FeatureTest), -/* harmony export */ GlobalWorkerOptions: () => (/* reexport safe */ _display_worker_options_js__WEBPACK_IMPORTED_MODULE_10__.GlobalWorkerOptions), -/* harmony export */ ImageKind: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.ImageKind), -/* harmony export */ InvalidPDFException: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.InvalidPDFException), -/* harmony export */ MissingPDFException: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.MissingPDFException), -/* harmony export */ OPS: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.OPS), -/* harmony export */ Outliner: () => (/* reexport safe */ _display_editor_outliner_js__WEBPACK_IMPORTED_MODULE_9__.Outliner), -/* harmony export */ PDFDataRangeTransport: () => (/* reexport safe */ _display_api_js__WEBPACK_IMPORTED_MODULE_1__.PDFDataRangeTransport), -/* harmony export */ PDFDateString: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.PDFDateString), -/* harmony export */ PDFWorker: () => (/* reexport safe */ _display_api_js__WEBPACK_IMPORTED_MODULE_1__.PDFWorker), -/* harmony export */ PasswordResponses: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.PasswordResponses), -/* harmony export */ PermissionFlag: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.PermissionFlag), -/* harmony export */ PixelsPerInch: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.PixelsPerInch), -/* harmony export */ RenderingCancelledException: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.RenderingCancelledException), -/* harmony export */ UnexpectedResponseException: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.UnexpectedResponseException), -/* harmony export */ Util: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.Util), -/* harmony export */ VerbosityLevel: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.VerbosityLevel), -/* harmony export */ XfaLayer: () => (/* reexport safe */ _display_xfa_layer_js__WEBPACK_IMPORTED_MODULE_11__.XfaLayer), -/* harmony export */ build: () => (/* reexport safe */ _display_api_js__WEBPACK_IMPORTED_MODULE_1__.build), -/* harmony export */ createValidAbsoluteUrl: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.createValidAbsoluteUrl), -/* harmony export */ fetchData: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.fetchData), -/* harmony export */ getDocument: () => (/* reexport safe */ _display_api_js__WEBPACK_IMPORTED_MODULE_1__.getDocument), -/* harmony export */ getFilenameFromUrl: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.getFilenameFromUrl), -/* harmony export */ getPdfFilenameFromUrl: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.getPdfFilenameFromUrl), -/* harmony export */ getXfaPageViewport: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.getXfaPageViewport), -/* harmony export */ isDataScheme: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.isDataScheme), -/* harmony export */ isPdfFile: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.isPdfFile), -/* harmony export */ noContextMenu: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.noContextMenu), -/* harmony export */ normalizeUnicode: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.normalizeUnicode), -/* harmony export */ renderTextLayer: () => (/* reexport safe */ _display_text_layer_js__WEBPACK_IMPORTED_MODULE_3__.renderTextLayer), -/* harmony export */ setLayerDimensions: () => (/* reexport safe */ _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__.setLayerDimensions), -/* harmony export */ shadow: () => (/* reexport safe */ _shared_util_js__WEBPACK_IMPORTED_MODULE_0__.shadow), -/* harmony export */ updateTextLayer: () => (/* reexport safe */ _display_text_layer_js__WEBPACK_IMPORTED_MODULE_3__.updateTextLayer), -/* harmony export */ version: () => (/* reexport safe */ _display_api_js__WEBPACK_IMPORTED_MODULE_1__.version) -/* harmony export */ }); -/* harmony import */ var _shared_util_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(292); -/* harmony import */ var _display_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(831); -/* harmony import */ var _display_display_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(419); -/* harmony import */ var _display_text_layer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(814); -/* harmony import */ var _display_editor_annotation_editor_layer_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(731); -/* harmony import */ var _display_editor_tools_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(830); -/* harmony import */ var _display_annotation_layer_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(976); -/* harmony import */ var _display_editor_color_picker_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(259); -/* harmony import */ var _display_draw_layer_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(47); -/* harmony import */ var _display_worker_options_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(164); -/* harmony import */ var _display_editor_outliner_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(61); -/* harmony import */ var _display_xfa_layer_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(284); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_display_api_js__WEBPACK_IMPORTED_MODULE_1__]); -_display_api_js__WEBPACK_IMPORTED_MODULE_1__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; @@ -18093,1475 +26405,1520 @@ - - - - - -const pdfjsVersion = "4.1.392"; -const pdfjsBuild = "fcb76a78d"; - -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), - -/***/ 178: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ MessageHandler: () => (/* binding */ MessageHandler) -/* harmony export */ }); -/* harmony import */ var _util_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(292); - -const CallbackKind = { - UNKNOWN: 0, - DATA: 1, - ERROR: 2 -}; -const StreamKind = { - UNKNOWN: 0, - CANCEL: 1, - CANCEL_COMPLETE: 2, - CLOSE: 3, - ENQUEUE: 4, - ERROR: 5, - PULL: 6, - PULL_COMPLETE: 7, - START_COMPLETE: 8 -}; -function wrapReason(reason) { - if (!(reason instanceof Error || typeof reason === "object" && reason !== null)) { - (0,_util_js__WEBPACK_IMPORTED_MODULE_0__.unreachable)('wrapReason: Expected "reason" to be a (possibly cloned) Error.'); +class AnnotationEditorLayer { + #accessibilityManager; + #allowClick = false; + #annotationLayer = null; + #clickAC = null; + #editorFocusTimeoutId = null; + #editors = new Map(); + #hadPointerDown = false; + #isDisabling = false; + #isEnabling = false; + #drawingAC = null; + #focusedElement = null; + #textLayer = null; + #textSelectionAC = null; + #textLayerDblClickAC = null; + #lastPointerDownTimestamp = -1; + #uiManager; + static _initialized = false; + static #editorTypes = new Map([FreeTextEditor, InkEditor, StampEditor, HighlightEditor, SignatureEditor].map(type => [type._editorType, type])); + constructor({ + uiManager, + pageIndex, + div, + structTreeLayer, + accessibilityManager, + annotationLayer, + drawLayer, + textLayer, + viewport, + l10n + }) { + const editorTypes = [...AnnotationEditorLayer.#editorTypes.values()]; + if (!AnnotationEditorLayer._initialized) { + AnnotationEditorLayer._initialized = true; + for (const editorType of editorTypes) { + editorType.initialize(l10n, uiManager); + } + } + uiManager.registerEditorTypes(editorTypes); + this.#uiManager = uiManager; + this.pageIndex = pageIndex; + this.div = div; + this.#accessibilityManager = accessibilityManager; + this.#annotationLayer = annotationLayer; + this.viewport = viewport; + this.#textLayer = textLayer; + this.drawLayer = drawLayer; + this._structTree = structTreeLayer; + this.#uiManager.addLayer(this); } - switch (reason.name) { - case "AbortException": - return new _util_js__WEBPACK_IMPORTED_MODULE_0__.AbortException(reason.message); - case "MissingPDFException": - return new _util_js__WEBPACK_IMPORTED_MODULE_0__.MissingPDFException(reason.message); - case "PasswordException": - return new _util_js__WEBPACK_IMPORTED_MODULE_0__.PasswordException(reason.message, reason.code); - case "UnexpectedResponseException": - return new _util_js__WEBPACK_IMPORTED_MODULE_0__.UnexpectedResponseException(reason.message, reason.status); - case "UnknownErrorException": - return new _util_js__WEBPACK_IMPORTED_MODULE_0__.UnknownErrorException(reason.message, reason.details); - default: - return new _util_js__WEBPACK_IMPORTED_MODULE_0__.UnknownErrorException(reason.message, reason.toString()); + get isEmpty() { + return this.#editors.size === 0; } -} -class MessageHandler { - constructor(sourceName, targetName, comObj) { - this.sourceName = sourceName; - this.targetName = targetName; - this.comObj = comObj; - this.callbackId = 1; - this.streamId = 1; - this.streamSinks = Object.create(null); - this.streamControllers = Object.create(null); - this.callbackCapabilities = Object.create(null); - this.actionHandler = Object.create(null); - this._onComObjOnMessage = event => { - const data = event.data; - if (data.targetName !== this.sourceName) { - return; - } - if (data.stream) { - this.#processStreamMessage(data); - return; - } - if (data.callback) { - const callbackId = data.callbackId; - const capability = this.callbackCapabilities[callbackId]; - if (!capability) { - throw new Error(`Cannot resolve callback ${callbackId}`); - } - delete this.callbackCapabilities[callbackId]; - if (data.callback === CallbackKind.DATA) { - capability.resolve(data.data); - } else if (data.callback === CallbackKind.ERROR) { - capability.reject(wrapReason(data.reason)); - } else { - throw new Error("Unexpected callback case"); - } - return; - } - const action = this.actionHandler[data.action]; - if (!action) { - throw new Error(`Unknown action from worker: ${data.action}`); - } - if (data.callbackId) { - const cbSourceName = this.sourceName; - const cbTargetName = data.sourceName; - new Promise(function (resolve) { - resolve(action(data.data)); - }).then(function (result) { - comObj.postMessage({ - sourceName: cbSourceName, - targetName: cbTargetName, - callback: CallbackKind.DATA, - callbackId: data.callbackId, - data: result - }); - }, function (reason) { - comObj.postMessage({ - sourceName: cbSourceName, - targetName: cbTargetName, - callback: CallbackKind.ERROR, - callbackId: data.callbackId, - reason: wrapReason(reason) - }); - }); - return; - } - if (data.streamId) { - this.#createStreamSink(data); + get isInvisible() { + return this.isEmpty && this.#uiManager.getMode() === AnnotationEditorType.NONE; + } + updateToolbar(options) { + this.#uiManager.updateToolbar(options); + } + updateMode(mode = this.#uiManager.getMode()) { + this.#cleanup(); + switch (mode) { + case AnnotationEditorType.NONE: + this.div.classList.toggle("nonEditing", true); + this.disableTextSelection(); + this.togglePointerEvents(false); + this.toggleAnnotationLayerPointerEvents(true); + this.disableClick(); return; + case AnnotationEditorType.INK: + this.disableTextSelection(); + this.togglePointerEvents(true); + this.enableClick(); + break; + case AnnotationEditorType.HIGHLIGHT: + this.enableTextSelection(); + this.togglePointerEvents(false); + this.disableClick(); + break; + default: + this.disableTextSelection(); + this.togglePointerEvents(true); + this.enableClick(); + } + this.toggleAnnotationLayerPointerEvents(false); + const { + classList + } = this.div; + classList.toggle("nonEditing", false); + if (mode === AnnotationEditorType.POPUP) { + classList.toggle("commentEditing", true); + } else { + classList.toggle("commentEditing", false); + for (const editorType of AnnotationEditorLayer.#editorTypes.values()) { + classList.toggle(`${editorType._type}Editing`, mode === editorType._editorType); } - action(data.data); - }; - comObj.addEventListener("message", this._onComObjOnMessage); - } - on(actionName, handler) { - const ah = this.actionHandler; - if (ah[actionName]) { - throw new Error(`There is already an actionName called "${actionName}"`); } - ah[actionName] = handler; + this.div.hidden = false; } - send(actionName, data, transfers) { - this.comObj.postMessage({ - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - data - }, transfers); + hasTextLayer(textLayer) { + return textLayer === this.#textLayer?.div; } - sendWithPromise(actionName, data, transfers) { - const callbackId = this.callbackId++; - const capability = Promise.withResolvers(); - this.callbackCapabilities[callbackId] = capability; - try { - this.comObj.postMessage({ - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - callbackId, - data - }, transfers); - } catch (ex) { - capability.reject(ex); - } - return capability.promise; + setEditingState(isEditing) { + this.#uiManager.setEditingState(isEditing); } - sendWithStream(actionName, data, queueingStrategy, transfers) { - const streamId = this.streamId++, - sourceName = this.sourceName, - targetName = this.targetName, - comObj = this.comObj; - return new ReadableStream({ - start: controller => { - const startCapability = Promise.withResolvers(); - this.streamControllers[streamId] = { - controller, - startCall: startCapability, - pullCall: null, - cancelCall: null, - isClosed: false - }; - comObj.postMessage({ - sourceName, - targetName, - action: actionName, - streamId, - data, - desiredSize: controller.desiredSize - }, transfers); - return startCapability.promise; - }, - pull: controller => { - const pullCapability = Promise.withResolvers(); - this.streamControllers[streamId].pullCall = pullCapability; - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.PULL, - streamId, - desiredSize: controller.desiredSize - }); - return pullCapability.promise; - }, - cancel: reason => { - (0,_util_js__WEBPACK_IMPORTED_MODULE_0__.assert)(reason instanceof Error, "cancel must have a valid reason"); - const cancelCapability = Promise.withResolvers(); - this.streamControllers[streamId].cancelCall = cancelCapability; - this.streamControllers[streamId].isClosed = true; - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.CANCEL, - streamId, - reason: wrapReason(reason) - }); - return cancelCapability.promise; + addCommands(params) { + this.#uiManager.addCommands(params); + } + cleanUndoStack(type) { + this.#uiManager.cleanUndoStack(type); + } + toggleDrawing(enabled = false) { + this.div.classList.toggle("drawing", !enabled); + } + togglePointerEvents(enabled = false) { + this.div.classList.toggle("disabled", !enabled); + } + toggleAnnotationLayerPointerEvents(enabled = false) { + this.#annotationLayer?.togglePointerEvents(enabled); + } + get #allEditorsIterator() { + return this.#editors.size !== 0 ? this.#editors.values() : this.#uiManager.getEditors(this.pageIndex); + } + async enable() { + this.#isEnabling = true; + this.div.tabIndex = 0; + this.togglePointerEvents(true); + this.div.classList.toggle("nonEditing", false); + this.#textLayerDblClickAC?.abort(); + this.#textLayerDblClickAC = null; + const annotationElementIds = new Set(); + for (const editor of this.#allEditorsIterator) { + editor.enableEditing(); + editor.show(true); + if (editor.annotationElementId) { + this.#uiManager.removeChangedExistingAnnotation(editor); + annotationElementIds.add(editor.annotationElementId); } - }, queueingStrategy); + } + const annotationLayer = this.#annotationLayer; + if (annotationLayer) { + for (const editable of annotationLayer.getEditableAnnotations()) { + editable.hide(); + if (this.#uiManager.isDeletedAnnotationElement(editable.data.id)) { + continue; + } + if (annotationElementIds.has(editable.data.id)) { + continue; + } + const editor = await this.deserialize(editable); + if (!editor) { + continue; + } + this.addOrRebuild(editor); + editor.enableEditing(); + } + } + this.#isEnabling = false; + this.#uiManager._eventBus.dispatch("editorsrendered", { + source: this, + pageNumber: this.pageIndex + 1 + }); } - #createStreamSink(data) { - const streamId = data.streamId, - sourceName = this.sourceName, - targetName = data.sourceName, - comObj = this.comObj; - const self = this, - action = this.actionHandler[data.action]; - const streamSink = { - enqueue(chunk, size = 1, transfers) { - if (this.isCancelled) { + disable() { + this.#isDisabling = true; + this.div.tabIndex = -1; + this.togglePointerEvents(false); + this.div.classList.toggle("nonEditing", true); + if (this.#textLayer && !this.#textLayerDblClickAC) { + this.#textLayerDblClickAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#textLayerDblClickAC); + this.#textLayer.div.addEventListener("pointerdown", e => { + const DBL_CLICK_THRESHOLD = 500; + const { + clientX, + clientY, + timeStamp + } = e; + const lastPointerDownTimestamp = this.#lastPointerDownTimestamp; + if (timeStamp - lastPointerDownTimestamp > DBL_CLICK_THRESHOLD) { + this.#lastPointerDownTimestamp = timeStamp; return; } - const lastDesiredSize = this.desiredSize; - this.desiredSize -= size; - if (lastDesiredSize > 0 && this.desiredSize <= 0) { - this.sinkCapability = Promise.withResolvers(); - this.ready = this.sinkCapability.promise; - } - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.ENQUEUE, - streamId, - chunk - }, transfers); - }, - close() { - if (this.isCancelled) { + this.#lastPointerDownTimestamp = -1; + const { + classList + } = this.div; + classList.toggle("getElements", true); + const elements = document.elementsFromPoint(clientX, clientY); + classList.toggle("getElements", false); + if (!this.div.contains(elements[0])) { return; } - this.isCancelled = true; - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.CLOSE, - streamId - }); - delete self.streamSinks[streamId]; - }, - error(reason) { - (0,_util_js__WEBPACK_IMPORTED_MODULE_0__.assert)(reason instanceof Error, "error must have a valid reason"); - if (this.isCancelled) { + let id; + const regex = new RegExp(`^${AnnotationEditorPrefix}[0-9]+$`); + for (const element of elements) { + if (regex.test(element.id)) { + id = element.id; + break; + } + } + if (!id) { return; } - this.isCancelled = true; - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.ERROR, - streamId, - reason: wrapReason(reason) - }); - }, - sinkCapability: Promise.withResolvers(), - onPull: null, - onCancel: null, - isCancelled: false, - desiredSize: data.desiredSize, - ready: null - }; - streamSink.sinkCapability.resolve(); - streamSink.ready = streamSink.sinkCapability.promise; - this.streamSinks[streamId] = streamSink; - new Promise(function (resolve) { - resolve(action(data.data, streamSink)); - }).then(function () { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.START_COMPLETE, - streamId, - success: true - }); - }, function (reason) { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.START_COMPLETE, - streamId, - reason: wrapReason(reason) + const editor = this.#editors.get(id); + if (editor?.annotationElementId === null) { + stopEvent(e); + editor.dblclick(e); + } + }, { + signal, + capture: true }); - }); - } - #processStreamMessage(data) { - const streamId = data.streamId, - sourceName = this.sourceName, - targetName = data.sourceName, - comObj = this.comObj; - const streamController = this.streamControllers[streamId], - streamSink = this.streamSinks[streamId]; - switch (data.stream) { - case StreamKind.START_COMPLETE: - if (data.success) { - streamController.startCall.resolve(); - } else { - streamController.startCall.reject(wrapReason(data.reason)); + } + const annotationLayer = this.#annotationLayer; + const needFakeAnnotation = []; + if (annotationLayer) { + const changedAnnotations = new Map(); + const resetAnnotations = new Map(); + for (const editor of this.#allEditorsIterator) { + editor.disableEditing(); + if (!editor.annotationElementId) { + needFakeAnnotation.push(editor); + continue; } - break; - case StreamKind.PULL_COMPLETE: - if (data.success) { - streamController.pullCall.resolve(); + if (editor.serialize() !== null) { + changedAnnotations.set(editor.annotationElementId, editor); + continue; } else { - streamController.pullCall.reject(wrapReason(data.reason)); - } - break; - case StreamKind.PULL: - if (!streamSink) { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.PULL_COMPLETE, - streamId, - success: true - }); - break; + resetAnnotations.set(editor.annotationElementId, editor); } - if (streamSink.desiredSize <= 0 && data.desiredSize > 0) { - streamSink.sinkCapability.resolve(); - } - streamSink.desiredSize = data.desiredSize; - new Promise(function (resolve) { - resolve(streamSink.onPull?.()); - }).then(function () { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.PULL_COMPLETE, - streamId, - success: true - }); - }, function (reason) { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.PULL_COMPLETE, - streamId, - reason: wrapReason(reason) + this.getEditableAnnotation(editor.annotationElementId)?.show(); + editor.remove(); + } + for (const editable of annotationLayer.getEditableAnnotations()) { + const { + id + } = editable.data; + if (this.#uiManager.isDeletedAnnotationElement(id)) { + editable.updateEdited({ + deleted: true }); - }); - break; - case StreamKind.ENQUEUE: - (0,_util_js__WEBPACK_IMPORTED_MODULE_0__.assert)(streamController, "enqueue should have stream controller"); - if (streamController.isClosed) { - break; - } - streamController.controller.enqueue(data.chunk); - break; - case StreamKind.CLOSE: - (0,_util_js__WEBPACK_IMPORTED_MODULE_0__.assert)(streamController, "close should have stream controller"); - if (streamController.isClosed) { - break; + continue; } - streamController.isClosed = true; - streamController.controller.close(); - this.#deleteStreamController(streamController, streamId); - break; - case StreamKind.ERROR: - (0,_util_js__WEBPACK_IMPORTED_MODULE_0__.assert)(streamController, "error should have stream controller"); - streamController.controller.error(wrapReason(data.reason)); - this.#deleteStreamController(streamController, streamId); - break; - case StreamKind.CANCEL_COMPLETE: - if (data.success) { - streamController.cancelCall.resolve(); - } else { - streamController.cancelCall.reject(wrapReason(data.reason)); + let editor = resetAnnotations.get(id); + if (editor) { + editor.resetAnnotationElement(editable); + editor.show(false); + editable.show(); + continue; } - this.#deleteStreamController(streamController, streamId); - break; - case StreamKind.CANCEL: - if (!streamSink) { - break; + editor = changedAnnotations.get(id); + if (editor) { + this.#uiManager.addChangedExistingAnnotation(editor); + if (editor.renderAnnotationElement(editable)) { + editor.show(false); + } } - new Promise(function (resolve) { - resolve(streamSink.onCancel?.(wrapReason(data.reason))); - }).then(function () { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.CANCEL_COMPLETE, - streamId, - success: true - }); - }, function (reason) { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.CANCEL_COMPLETE, - streamId, - reason: wrapReason(reason) - }); - }); - streamSink.sinkCapability.reject(wrapReason(data.reason)); - streamSink.isCancelled = true; - delete this.streamSinks[streamId]; - break; - default: - throw new Error("Unexpected stream case"); + editable.show(); + } + } + this.#cleanup(); + if (this.isEmpty) { + this.div.hidden = true; + } + const { + classList + } = this.div; + for (const editorType of AnnotationEditorLayer.#editorTypes.values()) { + classList.remove(`${editorType._type}Editing`); } + this.disableTextSelection(); + this.toggleAnnotationLayerPointerEvents(true); + annotationLayer?.updateFakeAnnotations(needFakeAnnotation); + this.#isDisabling = false; } - async #deleteStreamController(streamController, streamId) { - await Promise.allSettled([streamController.startCall?.promise, streamController.pullCall?.promise, streamController.cancelCall?.promise]); - delete this.streamControllers[streamId]; + getEditableAnnotation(id) { + return this.#annotationLayer?.getEditableAnnotation(id) || null; } - destroy() { - this.comObj.removeEventListener("message", this._onComObjOnMessage); + setActiveEditor(editor) { + const currentActive = this.#uiManager.getActive(); + if (currentActive === editor) { + return; + } + this.#uiManager.setActiveEditor(editor); } -} - - -/***/ }), - -/***/ 651: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ MurmurHash3_64: () => (/* binding */ MurmurHash3_64) -/* harmony export */ }); -const SEED = 0xc3d2e1f0; -const MASK_HIGH = 0xffff0000; -const MASK_LOW = 0xffff; -class MurmurHash3_64 { - constructor(seed) { - this.h1 = seed ? seed & 0xffffffff : SEED; - this.h2 = seed ? seed & 0xffffffff : SEED; + enableTextSelection() { + this.div.tabIndex = -1; + if (this.#textLayer?.div && !this.#textSelectionAC) { + this.#textSelectionAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#textSelectionAC); + this.#textLayer.div.addEventListener("pointerdown", this.#textLayerPointerDown.bind(this), { + signal + }); + this.#textLayer.div.classList.add("highlighting"); + } } - update(input) { - let data, length; - if (typeof input === "string") { - data = new Uint8Array(input.length * 2); - length = 0; - for (let i = 0, ii = input.length; i < ii; i++) { - const code = input.charCodeAt(i); - if (code <= 0xff) { - data[length++] = code; + disableTextSelection() { + this.div.tabIndex = 0; + if (this.#textLayer?.div && this.#textSelectionAC) { + this.#textSelectionAC.abort(); + this.#textSelectionAC = null; + this.#textLayer.div.classList.remove("highlighting"); + } + } + #textLayerPointerDown(event) { + this.#uiManager.unselectAll(); + const { + target + } = event; + if (target === this.#textLayer.div || (target.getAttribute("role") === "img" || target.classList.contains("endOfContent") || target.classList.contains("textLayerImages") || target.classList.contains("textLayerImagePlaceholder")) && this.#textLayer.div.contains(target)) { + const { + isMac + } = FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + this.#uiManager.showAllEditors("highlight", true, true); + this.#textLayer.div.classList.add("free"); + this.toggleDrawing(); + HighlightEditor.startHighlighting(this, this.#uiManager.direction === "ltr", { + target: this.#textLayer.div, + x: event.x, + y: event.y + }); + this.#textLayer.div.addEventListener("pointerup", () => { + this.#textLayer.div.classList.remove("free"); + this.toggleDrawing(true); + }, { + once: true, + signal: this.#uiManager._signal + }); + event.preventDefault(); + } + } + enableClick() { + if (this.#clickAC) { + return; + } + this.#clickAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#clickAC); + this.div.addEventListener("pointerdown", this.pointerdown.bind(this), { + signal + }); + const pointerup = this.pointerup.bind(this); + this.div.addEventListener("pointerup", pointerup, { + signal + }); + this.div.addEventListener("pointercancel", pointerup, { + signal + }); + } + disableClick() { + this.#clickAC?.abort(); + this.#clickAC = null; + } + attach(editor) { + this.#editors.set(editor.id, editor); + const { + annotationElementId + } = editor; + if (annotationElementId && this.#uiManager.isDeletedAnnotationElement(annotationElementId)) { + this.#uiManager.removeDeletedAnnotationElement(editor); + } + } + detach(editor) { + this.#editors.delete(editor.id); + this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); + if (!this.#isDisabling && editor.annotationElementId) { + this.#uiManager.addDeletedAnnotationElement(editor); + } + } + remove(editor) { + this.detach(editor); + this.#uiManager.removeEditor(editor); + editor.div.remove(); + editor.isAttachedToDOM = false; + } + changeParent(editor) { + if (editor.parent === this) { + return; + } + if (editor.parent && editor.annotationElementId) { + this.#uiManager.addDeletedAnnotationElement(editor); + AnnotationEditor.deleteAnnotationElement(editor); + editor.annotationElementId = null; + } + this.attach(editor); + editor.parent?.detach(editor); + editor.setParent(this); + if (editor.div && editor.isAttachedToDOM) { + editor.div.remove(); + this.div.append(editor.div); + } + } + add(editor) { + if (editor.parent === this && editor.isAttachedToDOM) { + return; + } + this.changeParent(editor); + this.#uiManager.addEditor(editor); + this.attach(editor); + if (!editor.isAttachedToDOM) { + const div = editor.render(); + this.div.append(div); + editor.isAttachedToDOM = true; + } + editor.fixAndSetPosition(); + editor.onceAdded(!this.#isEnabling); + this.#uiManager.addToAnnotationStorage(editor); + editor._reportTelemetry(editor.telemetryInitialData); + } + moveEditorInDOM(editor) { + if (!editor.isAttachedToDOM) { + return; + } + const { + activeElement + } = document; + if (editor.div.contains(activeElement) && !this.#editorFocusTimeoutId) { + editor._focusEventsAllowed = false; + this.#editorFocusTimeoutId = setTimeout(() => { + this.#editorFocusTimeoutId = null; + if (!editor.div.contains(document.activeElement)) { + editor.div.addEventListener("focusin", () => { + editor._focusEventsAllowed = true; + }, { + once: true, + signal: this.#uiManager._signal + }); + activeElement.focus(); } else { - data[length++] = code >>> 8; - data[length++] = code & 0xff; + editor._focusEventsAllowed = true; } - } - } else if (ArrayBuffer.isView(input)) { - data = input.slice(); - length = data.byteLength; + }, 0); + } + editor._structTreeParentId = this.#accessibilityManager?.moveElementInDOM(this.div, editor.div, editor.contentDiv, true); + } + addOrRebuild(editor) { + if (editor.needsToBeRebuilt()) { + editor.parent ||= this; + editor.rebuild(); + editor.show(); } else { - throw new Error("Invalid data format, must be a string or TypedArray."); + this.add(editor); } - const blockCounts = length >> 2; - const tailLength = length - blockCounts * 4; - const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts); - let k1 = 0, - k2 = 0; - let h1 = this.h1, - h2 = this.h2; - const C1 = 0xcc9e2d51, - C2 = 0x1b873593; - const C1_LOW = C1 & MASK_LOW, - C2_LOW = C2 & MASK_LOW; - for (let i = 0; i < blockCounts; i++) { - if (i & 1) { - k1 = dataUint32[i]; - k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; - k1 = k1 << 15 | k1 >>> 17; - k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; - h1 ^= k1; - h1 = h1 << 13 | h1 >>> 19; - h1 = h1 * 5 + 0xe6546b64; - } else { - k2 = dataUint32[i]; - k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW; - k2 = k2 << 15 | k2 >>> 17; - k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW; - h2 ^= k2; - h2 = h2 << 13 | h2 >>> 19; - h2 = h2 * 5 + 0xe6546b64; + } + addUndoableEditor(editor) { + const cmd = () => editor._uiManager.rebuild(editor); + const undo = () => { + editor.remove(); + }; + this.addCommands({ + cmd, + undo, + mustExec: false + }); + } + getEditorByUID(uid) { + for (const editor of this.#editors.values()) { + if (editor.uid === uid) { + return editor; } } - k1 = 0; - switch (tailLength) { - case 3: - k1 ^= data[blockCounts * 4 + 2] << 16; - case 2: - k1 ^= data[blockCounts * 4 + 1] << 8; - case 1: - k1 ^= data[blockCounts * 4]; - k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; - k1 = k1 << 15 | k1 >>> 17; - k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; - if (blockCounts & 1) { - h1 ^= k1; - } else { - h2 ^= k1; - } + return null; + } + get #currentEditorType() { + return AnnotationEditorLayer.#editorTypes.get(this.#uiManager.getMode()); + } + combinedSignal(ac) { + return this.#uiManager.combinedSignal(ac); + } + #createNewEditor(params) { + const editorType = this.#currentEditorType; + return editorType ? new editorType.prototype.constructor(params) : null; + } + canCreateNewEmptyEditor() { + return this.#currentEditorType?.canCreateNewEmptyEditor(); + } + async pasteEditor(options, params) { + this.updateToolbar(options); + await this.#uiManager.updateMode(options.mode); + const { + offsetX, + offsetY + } = this.#getCenterPoint(); + const id = this.#uiManager.getId(); + const editor = this.#createNewEditor({ + parent: this, + id, + x: offsetX, + y: offsetY, + uiManager: this.#uiManager, + isCentered: true, + ...params + }); + if (editor) { + this.add(editor); } - this.h1 = h1; - this.h2 = h2; } - hexdigest() { - let h1 = this.h1, - h2 = this.h2; - h1 ^= h2 >>> 1; - h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW; - h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16; - h1 ^= h2 >>> 1; - h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW; - h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16; - h1 ^= h2 >>> 1; - return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0"); + async deserialize(data) { + return (await AnnotationEditorLayer.#editorTypes.get(data.annotationType ?? data.annotationEditorType)?.deserialize(data, this, this.#uiManager)) || null; } -} - - -/***/ }), - -/***/ 292: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ AbortException: () => (/* binding */ AbortException), -/* harmony export */ AnnotationBorderStyleType: () => (/* binding */ AnnotationBorderStyleType), -/* harmony export */ AnnotationEditorParamsType: () => (/* binding */ AnnotationEditorParamsType), -/* harmony export */ AnnotationEditorPrefix: () => (/* binding */ AnnotationEditorPrefix), -/* harmony export */ AnnotationEditorType: () => (/* binding */ AnnotationEditorType), -/* harmony export */ AnnotationMode: () => (/* binding */ AnnotationMode), -/* harmony export */ AnnotationPrefix: () => (/* binding */ AnnotationPrefix), -/* harmony export */ AnnotationType: () => (/* binding */ AnnotationType), -/* harmony export */ BaseException: () => (/* binding */ BaseException), -/* harmony export */ CMapCompressionType: () => (/* binding */ CMapCompressionType), -/* harmony export */ FONT_IDENTITY_MATRIX: () => (/* binding */ FONT_IDENTITY_MATRIX), -/* harmony export */ FeatureTest: () => (/* binding */ FeatureTest), -/* harmony export */ FormatError: () => (/* binding */ FormatError), -/* harmony export */ IDENTITY_MATRIX: () => (/* binding */ IDENTITY_MATRIX), -/* harmony export */ ImageKind: () => (/* binding */ ImageKind), -/* harmony export */ InvalidPDFException: () => (/* binding */ InvalidPDFException), -/* harmony export */ LINE_FACTOR: () => (/* binding */ LINE_FACTOR), -/* harmony export */ MAX_IMAGE_SIZE_TO_CACHE: () => (/* binding */ MAX_IMAGE_SIZE_TO_CACHE), -/* harmony export */ MissingPDFException: () => (/* binding */ MissingPDFException), -/* harmony export */ OPS: () => (/* binding */ OPS), -/* harmony export */ PasswordException: () => (/* binding */ PasswordException), -/* harmony export */ PasswordResponses: () => (/* binding */ PasswordResponses), -/* harmony export */ PermissionFlag: () => (/* binding */ PermissionFlag), -/* harmony export */ RenderingIntentFlag: () => (/* binding */ RenderingIntentFlag), -/* harmony export */ TextRenderingMode: () => (/* binding */ TextRenderingMode), -/* harmony export */ UnexpectedResponseException: () => (/* binding */ UnexpectedResponseException), -/* harmony export */ UnknownErrorException: () => (/* binding */ UnknownErrorException), -/* harmony export */ Util: () => (/* binding */ Util), -/* harmony export */ VerbosityLevel: () => (/* binding */ VerbosityLevel), -/* harmony export */ assert: () => (/* binding */ assert), -/* harmony export */ bytesToString: () => (/* binding */ bytesToString), -/* harmony export */ createValidAbsoluteUrl: () => (/* binding */ createValidAbsoluteUrl), -/* harmony export */ getUuid: () => (/* binding */ getUuid), -/* harmony export */ getVerbosityLevel: () => (/* binding */ getVerbosityLevel), -/* harmony export */ info: () => (/* binding */ info), -/* harmony export */ isNodeJS: () => (/* binding */ isNodeJS), -/* harmony export */ normalizeUnicode: () => (/* binding */ normalizeUnicode), -/* harmony export */ objectFromMap: () => (/* binding */ objectFromMap), -/* harmony export */ setVerbosityLevel: () => (/* binding */ setVerbosityLevel), -/* harmony export */ shadow: () => (/* binding */ shadow), -/* harmony export */ string32: () => (/* binding */ string32), -/* harmony export */ stringToBytes: () => (/* binding */ stringToBytes), -/* harmony export */ unreachable: () => (/* binding */ unreachable), -/* harmony export */ warn: () => (/* binding */ warn) -/* harmony export */ }); -/* unused harmony exports AnnotationActionEventType, AnnotationFieldFlag, AnnotationFlag, AnnotationReplyType, BASELINE_FACTOR, DocumentActionEventType, getModificationDate, isArrayEqual, LINE_DESCENT_FACTOR, objectSize, PageActionEventType, stringToPDFString, stringToUTF8String, utf8StringToString */ -const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); -const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; -const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; -const MAX_IMAGE_SIZE_TO_CACHE = 10e6; -const LINE_FACTOR = 1.35; -const LINE_DESCENT_FACTOR = 0.35; -const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR; -const RenderingIntentFlag = { - ANY: 0x01, - DISPLAY: 0x02, - PRINT: 0x04, - SAVE: 0x08, - ANNOTATIONS_FORMS: 0x10, - ANNOTATIONS_STORAGE: 0x20, - ANNOTATIONS_DISABLE: 0x40, - OPLIST: 0x100 -}; -const AnnotationMode = { - DISABLE: 0, - ENABLE: 1, - ENABLE_FORMS: 2, - ENABLE_STORAGE: 3 -}; -const AnnotationEditorPrefix = "pdfjs_internal_editor_"; -const AnnotationEditorType = { - DISABLE: -1, - NONE: 0, - FREETEXT: 3, - HIGHLIGHT: 9, - STAMP: 13, - INK: 15 -}; -const AnnotationEditorParamsType = { - RESIZE: 1, - CREATE: 2, - FREETEXT_SIZE: 11, - FREETEXT_COLOR: 12, - FREETEXT_OPACITY: 13, - INK_COLOR: 21, - INK_THICKNESS: 22, - INK_OPACITY: 23, - HIGHLIGHT_COLOR: 31, - HIGHLIGHT_DEFAULT_COLOR: 32, - HIGHLIGHT_THICKNESS: 33, - HIGHLIGHT_FREE: 34, - HIGHLIGHT_SHOW_ALL: 35 -}; -const PermissionFlag = { - PRINT: 0x04, - MODIFY_CONTENTS: 0x08, - COPY: 0x10, - MODIFY_ANNOTATIONS: 0x20, - FILL_INTERACTIVE_FORMS: 0x100, - COPY_FOR_ACCESSIBILITY: 0x200, - ASSEMBLE: 0x400, - PRINT_HIGH_QUALITY: 0x800 -}; -const TextRenderingMode = { - FILL: 0, - STROKE: 1, - FILL_STROKE: 2, - INVISIBLE: 3, - FILL_ADD_TO_PATH: 4, - STROKE_ADD_TO_PATH: 5, - FILL_STROKE_ADD_TO_PATH: 6, - ADD_TO_PATH: 7, - FILL_STROKE_MASK: 3, - ADD_TO_PATH_FLAG: 4 -}; -const ImageKind = { - GRAYSCALE_1BPP: 1, - RGB_24BPP: 2, - RGBA_32BPP: 3 -}; -const AnnotationType = { - TEXT: 1, - LINK: 2, - FREETEXT: 3, - LINE: 4, - SQUARE: 5, - CIRCLE: 6, - POLYGON: 7, - POLYLINE: 8, - HIGHLIGHT: 9, - UNDERLINE: 10, - SQUIGGLY: 11, - STRIKEOUT: 12, - STAMP: 13, - CARET: 14, - INK: 15, - POPUP: 16, - FILEATTACHMENT: 17, - SOUND: 18, - MOVIE: 19, - WIDGET: 20, - SCREEN: 21, - PRINTERMARK: 22, - TRAPNET: 23, - WATERMARK: 24, - THREED: 25, - REDACT: 26 -}; -const AnnotationReplyType = { - GROUP: "Group", - REPLY: "R" -}; -const AnnotationFlag = { - INVISIBLE: 0x01, - HIDDEN: 0x02, - PRINT: 0x04, - NOZOOM: 0x08, - NOROTATE: 0x10, - NOVIEW: 0x20, - READONLY: 0x40, - LOCKED: 0x80, - TOGGLENOVIEW: 0x100, - LOCKEDCONTENTS: 0x200 -}; -const AnnotationFieldFlag = { - READONLY: 0x0000001, - REQUIRED: 0x0000002, - NOEXPORT: 0x0000004, - MULTILINE: 0x0001000, - PASSWORD: 0x0002000, - NOTOGGLETOOFF: 0x0004000, - RADIO: 0x0008000, - PUSHBUTTON: 0x0010000, - COMBO: 0x0020000, - EDIT: 0x0040000, - SORT: 0x0080000, - FILESELECT: 0x0100000, - MULTISELECT: 0x0200000, - DONOTSPELLCHECK: 0x0400000, - DONOTSCROLL: 0x0800000, - COMB: 0x1000000, - RICHTEXT: 0x2000000, - RADIOSINUNISON: 0x2000000, - COMMITONSELCHANGE: 0x4000000 -}; -const AnnotationBorderStyleType = { - SOLID: 1, - DASHED: 2, - BEVELED: 3, - INSET: 4, - UNDERLINE: 5 -}; -const AnnotationActionEventType = { - E: "Mouse Enter", - X: "Mouse Exit", - D: "Mouse Down", - U: "Mouse Up", - Fo: "Focus", - Bl: "Blur", - PO: "PageOpen", - PC: "PageClose", - PV: "PageVisible", - PI: "PageInvisible", - K: "Keystroke", - F: "Format", - V: "Validate", - C: "Calculate" -}; -const DocumentActionEventType = { - WC: "WillClose", - WS: "WillSave", - DS: "DidSave", - WP: "WillPrint", - DP: "DidPrint" -}; -const PageActionEventType = { - O: "PageOpen", - C: "PageClose" -}; -const VerbosityLevel = { - ERRORS: 0, - WARNINGS: 1, - INFOS: 5 -}; -const CMapCompressionType = { - NONE: 0, - BINARY: 1 -}; -const OPS = { - dependency: 1, - setLineWidth: 2, - setLineCap: 3, - setLineJoin: 4, - setMiterLimit: 5, - setDash: 6, - setRenderingIntent: 7, - setFlatness: 8, - setGState: 9, - save: 10, - restore: 11, - transform: 12, - moveTo: 13, - lineTo: 14, - curveTo: 15, - curveTo2: 16, - curveTo3: 17, - closePath: 18, - rectangle: 19, - stroke: 20, - closeStroke: 21, - fill: 22, - eoFill: 23, - fillStroke: 24, - eoFillStroke: 25, - closeFillStroke: 26, - closeEOFillStroke: 27, - endPath: 28, - clip: 29, - eoClip: 30, - beginText: 31, - endText: 32, - setCharSpacing: 33, - setWordSpacing: 34, - setHScale: 35, - setLeading: 36, - setFont: 37, - setTextRenderingMode: 38, - setTextRise: 39, - moveText: 40, - setLeadingMoveText: 41, - setTextMatrix: 42, - nextLine: 43, - showText: 44, - showSpacedText: 45, - nextLineShowText: 46, - nextLineSetSpacingShowText: 47, - setCharWidth: 48, - setCharWidthAndBounds: 49, - setStrokeColorSpace: 50, - setFillColorSpace: 51, - setStrokeColor: 52, - setStrokeColorN: 53, - setFillColor: 54, - setFillColorN: 55, - setStrokeGray: 56, - setFillGray: 57, - setStrokeRGBColor: 58, - setFillRGBColor: 59, - setStrokeCMYKColor: 60, - setFillCMYKColor: 61, - shadingFill: 62, - beginInlineImage: 63, - beginImageData: 64, - endInlineImage: 65, - paintXObject: 66, - markPoint: 67, - markPointProps: 68, - beginMarkedContent: 69, - beginMarkedContentProps: 70, - endMarkedContent: 71, - beginCompat: 72, - endCompat: 73, - paintFormXObjectBegin: 74, - paintFormXObjectEnd: 75, - beginGroup: 76, - endGroup: 77, - beginAnnotation: 80, - endAnnotation: 81, - paintImageMaskXObject: 83, - paintImageMaskXObjectGroup: 84, - paintImageXObject: 85, - paintInlineImageXObject: 86, - paintInlineImageXObjectGroup: 87, - paintImageXObjectRepeat: 88, - paintImageMaskXObjectRepeat: 89, - paintSolidColorImageMask: 90, - constructPath: 91 -}; -const PasswordResponses = { - NEED_PASSWORD: 1, - INCORRECT_PASSWORD: 2 -}; -let verbosity = VerbosityLevel.WARNINGS; -function setVerbosityLevel(level) { - if (Number.isInteger(level)) { - verbosity = level; + createAndAddNewEditor(event, isCentered, data = {}) { + const id = this.#uiManager.getId(); + const editor = this.#createNewEditor({ + parent: this, + id, + x: event.offsetX, + y: event.offsetY, + uiManager: this.#uiManager, + isCentered, + ...data + }); + if (editor) { + this.add(editor); + } + return editor; } -} -function getVerbosityLevel() { - return verbosity; -} -function info(msg) { - if (verbosity >= VerbosityLevel.INFOS) { - console.log(`Info: ${msg}`); + get boundingClientRect() { + return this.div.getBoundingClientRect(); } -} -function warn(msg) { - if (verbosity >= VerbosityLevel.WARNINGS) { - console.log(`Warning: ${msg}`); + #getCenterPoint() { + const { + x, + y, + width, + height + } = this.boundingClientRect; + const tlX = Math.max(0, x); + const tlY = Math.max(0, y); + const brX = Math.min(window.innerWidth, x + width); + const brY = Math.min(window.innerHeight, y + height); + const centerX = (tlX + brX) / 2 - x; + const centerY = (tlY + brY) / 2 - y; + const [offsetX, offsetY] = this.viewport.rotation % 180 === 0 ? [centerX, centerY] : [centerY, centerX]; + return { + offsetX, + offsetY + }; } -} -function unreachable(msg) { - throw new Error(msg); -} -function assert(cond, msg) { - if (!cond) { - unreachable(msg); + addNewEditor(data = {}) { + this.createAndAddNewEditor(this.#getCenterPoint(), true, data); } -} -function _isValidProtocol(url) { - switch (url?.protocol) { - case "http:": - case "https:": - case "ftp:": - case "mailto:": - case "tel:": - return true; - default: - return false; + setSelected(editor) { + this.#uiManager.setSelected(editor); } -} -function createValidAbsoluteUrl(url, baseUrl = null, options = null) { - if (!url) { - return null; + toggleSelected(editor) { + this.#uiManager.toggleSelected(editor); } - try { - if (options && typeof url === "string") { - if (options.addDefaultProtocol && url.startsWith("www.")) { - const dots = url.match(/\./g); - if (dots?.length >= 2) { - url = `http://${url}`; - } + unselect(editor) { + this.#uiManager.unselect(editor); + } + pointerup(event) { + const { + isMac + } = FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + if (event.target !== this.div) { + return; + } + if (!this.#hadPointerDown) { + return; + } + this.#hadPointerDown = false; + if (this.#currentEditorType?.isDrawer && this.#currentEditorType.supportMultipleDrawings) { + return; + } + if (!this.#allowClick) { + this.#allowClick = true; + return; + } + const currentMode = this.#uiManager.getMode(); + if (currentMode === AnnotationEditorType.STAMP || currentMode === AnnotationEditorType.POPUP || currentMode === AnnotationEditorType.SIGNATURE) { + this.#uiManager.unselectAll(); + return; + } + this.createAndAddNewEditor(event, false); + } + pointerdown(event) { + if (this.#uiManager.getMode() === AnnotationEditorType.HIGHLIGHT) { + this.enableTextSelection(); + } + if (this.#hadPointerDown) { + this.#hadPointerDown = false; + return; + } + const { + isMac + } = FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + if (event.target !== this.div) { + return; + } + this.#hadPointerDown = true; + if (this.#currentEditorType?.isDrawer) { + this.startDrawingSession(event); + return; + } + const editor = this.#uiManager.getActive(); + this.#allowClick = !editor || editor.isEmpty(); + } + startDrawingSession(event) { + this.div.focus({ + preventScroll: true + }); + if (this.#drawingAC) { + this.#currentEditorType.startDrawing(this, this.#uiManager, false, event); + return; + } + this.#uiManager.setCurrentDrawingSession(this); + this.#drawingAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#drawingAC); + this.div.addEventListener("blur", ({ + relatedTarget + }) => { + if (relatedTarget && !this.div.contains(relatedTarget)) { + this.#focusedElement = null; + this.commitOrRemove(); } - if (options.tryConvertEncoding) { - try { - url = stringToUTF8String(url); - } catch {} + }, { + signal + }); + this.#currentEditorType.startDrawing(this, this.#uiManager, false, event); + } + pause(on) { + if (on) { + const { + activeElement + } = document; + if (this.div.contains(activeElement)) { + this.#focusedElement = activeElement; } + return; } - const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url); - if (_isValidProtocol(absoluteUrl)) { - return absoluteUrl; + if (this.#focusedElement) { + setTimeout(() => { + this.#focusedElement?.focus(); + this.#focusedElement = null; + }, 0); } - } catch {} - return null; -} -function shadow(obj, prop, value, nonSerializable = false) { - Object.defineProperty(obj, prop, { - value, - enumerable: !nonSerializable, - configurable: true, - writable: false - }); - return value; -} -const BaseException = function BaseExceptionClosure() { - function BaseException(message, name) { - if (this.constructor === BaseException) { - unreachable("Cannot initialize BaseException."); + } + endDrawingSession(isAborted = false) { + if (!this.#drawingAC) { + return null; } - this.message = message; - this.name = name; + this.#uiManager.setCurrentDrawingSession(null); + this.#drawingAC.abort(); + this.#drawingAC = null; + this.#focusedElement = null; + return this.#currentEditorType.endDrawing(isAborted); } - BaseException.prototype = new Error(); - BaseException.constructor = BaseException; - return BaseException; -}(); -class PasswordException extends BaseException { - constructor(msg, code) { - super(msg, "PasswordException"); - this.code = code; + findNewParent(editor, x, y) { + const layer = this.#uiManager.findParent(x, y); + if (layer === null || layer === this) { + return false; + } + layer.changeParent(editor); + return true; } -} -class UnknownErrorException extends BaseException { - constructor(msg, details) { - super(msg, "UnknownErrorException"); - this.details = details; + commitOrRemove() { + if (this.#drawingAC) { + this.endDrawingSession(); + return true; + } + return false; } -} -class InvalidPDFException extends BaseException { - constructor(msg) { - super(msg, "InvalidPDFException"); + onScaleChanging() { + if (!this.#drawingAC) { + return; + } + this.#currentEditorType.onScaleChangingWhenDrawing(this); } -} -class MissingPDFException extends BaseException { - constructor(msg) { - super(msg, "MissingPDFException"); + destroy() { + this.commitOrRemove(); + if (this.#uiManager.getActive()?.parent === this) { + this.#uiManager.commitOrRemove(); + this.#uiManager.setActiveEditor(null); + } + if (this.#editorFocusTimeoutId) { + clearTimeout(this.#editorFocusTimeoutId); + this.#editorFocusTimeoutId = null; + } + for (const editor of this.#editors.values()) { + this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); + editor.setParent(null); + editor.isAttachedToDOM = false; + editor.div.remove(); + } + this.div = null; + this.#editors.clear(); + this.#uiManager.removeLayer(this); } -} -class UnexpectedResponseException extends BaseException { - constructor(msg, status) { - super(msg, "UnexpectedResponseException"); - this.status = status; + #cleanup() { + for (const editor of this.#editors.values()) { + if (editor.isEmpty()) { + editor.remove(); + } + } } -} -class FormatError extends BaseException { - constructor(msg) { - super(msg, "FormatError"); + async render({ + viewport + }) { + this.viewport = viewport; + setLayerDimensions(this.div, viewport); + for (const editor of this.#uiManager.getEditors(this.pageIndex)) { + this.add(editor); + editor.rebuild(); + } + await this.#uiManager.findClonesForPage(this); + this.div.hidden = this.isEmpty; + this.updateMode(); } -} -class AbortException extends BaseException { - constructor(msg) { - super(msg, "AbortException"); + update({ + viewport + }) { + this.#uiManager.commitOrRemove(); + this.#cleanup(); + const oldRotation = this.viewport.rotation; + const rotation = viewport.rotation; + this.viewport = viewport; + setLayerDimensions(this.div, { + rotation + }); + if (oldRotation !== rotation) { + for (const editor of this.#editors.values()) { + editor.rotate(rotation); + } + } } -} -function bytesToString(bytes) { - if (typeof bytes !== "object" || bytes?.length === undefined) { - unreachable("Invalid argument for bytesToString"); + get pageDimensions() { + const { + pageWidth, + pageHeight + } = this.viewport.rawDims; + return [pageWidth, pageHeight]; } - const length = bytes.length; - const MAX_ARGUMENT_COUNT = 8192; - if (length < MAX_ARGUMENT_COUNT) { - return String.fromCharCode.apply(null, bytes); + get scale() { + return this.#uiManager.viewParameters.realScale; } - const strBuf = []; - for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) { - const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); - const chunk = bytes.subarray(i, chunkEnd); - strBuf.push(String.fromCharCode.apply(null, chunk)); +} + +;// ./src/display/draw_layer.js + + +function compareTextLayers(a, b) { + if (a === b) { + return 0; } - return strBuf.join(""); + return a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1; } -function stringToBytes(str) { - if (typeof str !== "string") { - unreachable("Invalid argument for stringToBytes"); +function getTextLayer(node) { + if (!node) { + return null; } - const length = str.length; - const bytes = new Uint8Array(length); - for (let i = 0; i < length; ++i) { - bytes[i] = str.charCodeAt(i) & 0xff; + if (node.nodeType === Node.ELEMENT_NODE) { + return node.closest(".textLayer"); } - return bytes; + return node.parentElement?.closest(".textLayer") || null; } -function string32(value) { - return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); -} -function objectSize(obj) { - return Object.keys(obj).length; -} -function objectFromMap(map) { - const obj = Object.create(null); - for (const [key, value] of map) { - obj[key] = value; - } - return obj; -} -function isLittleEndian() { - const buffer8 = new Uint8Array(4); - buffer8[0] = 1; - const view32 = new Uint32Array(buffer8.buffer, 0, 1); - return view32[0] === 1; -} -function isEvalSupported() { - try { - new Function(""); +function isPointBefore(nodeA, offsetA, nodeB, offsetB) { + if (nodeA === nodeB) { + return offsetA <= offsetB; + } + const relation = nodeA.compareDocumentPosition(nodeB); + if (relation & Node.DOCUMENT_POSITION_FOLLOWING) { return true; - } catch { + } + if (relation & Node.DOCUMENT_POSITION_PRECEDING) { return false; } + return null; } -class FeatureTest { - static get isLittleEndian() { - return shadow(this, "isLittleEndian", isLittleEndian()); +function normalizeEdgeBoundary(container, offset, textLayer) { + if (container.nodeType !== Node.ELEMENT_NODE || !container.classList.contains("textLayer") || offset !== container.childNodes.length) { + return { + container, + offset + }; } - static get isEvalSupported() { - return shadow(this, "isEvalSupported", isEvalSupported()); + let lastNode = container.lastChild; + if (lastNode?.nodeType === Node.ELEMENT_NODE && lastNode.classList.contains("endOfContent")) { + lastNode = lastNode.previousSibling; } - static get isOffscreenCanvasSupported() { - return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined"); + if (!lastNode || !textLayer.contains(lastNode)) { + return null; } - static get platform() { - if (typeof navigator !== "undefined" && typeof navigator?.platform === "string") { - return shadow(this, "platform", { - isMac: navigator.platform.includes("Mac") + if (lastNode.nodeType === Node.TEXT_NODE) { + return { + container: lastNode, + offset: lastNode.textContent.length + }; + } + return { + container: lastNode, + offset: lastNode.childNodes.length + }; +} +class DrawLayer { + #parent = null; + #mapping = new Map(); + #textLayer = null; + #filterFactory = null; + #pageColors = null; + #textLayerObserver = null; + #toUpdate = new Map(); + static #id = 0; + static #selectionId = 0; + static #selectionChangeAC = null; + static #selections = new Set(); + static #isSelecting = false; + static #textLayerSet = new Set(); + static #textLayers = new WeakMap(); + constructor({ + filterFactory = null, + pageColors = null, + pageIndex, + textLayer = null + }) { + this.pageIndex = pageIndex; + this.#filterFactory = filterFactory; + this.#pageColors = pageColors; + if (textLayer) { + const previousData = DrawLayer.#textLayers.get(textLayer); + if (previousData?.selectionDiv) { + previousData.selectionDiv.remove(); + DrawLayer.#selections.delete(previousData.selectionDiv); + } + DrawLayer.#textLayers.set(textLayer, { + drawLayer: this + }); + DrawLayer.#textLayerSet.add(textLayer); + this.#textLayer = textLayer; + this.#textLayerObserver = new MutationObserver(records => { + if (!this.#parent || !this.#textLayer?.isConnected || !DrawLayer.#hasSelection()) { + return; + } + for (const { + addedNodes + } of records) { + for (const node of addedNodes) { + if (node.nodeType === Node.ELEMENT_NODE && node.classList.contains("endOfContent")) { + DrawLayer.#selectionChange(); + return; + } + } + } + }); + this.#textLayerObserver.observe(textLayer, { + childList: true }); + if (DrawLayer.#selectionChangeAC === null) { + DrawLayer.#selectionChangeAC = new AbortController(); + const { + signal + } = DrawLayer.#selectionChangeAC; + document.addEventListener("selectionchange", DrawLayer.#selectionChange.bind(DrawLayer), { + signal + }); + document.addEventListener("pointerdown", () => { + DrawLayer.#isSelecting = true; + }, { + signal + }); + document.addEventListener("pointerup", () => { + DrawLayer.#isSelecting = false; + }, { + signal + }); + window.addEventListener("blur", () => { + DrawLayer.#isSelecting = false; + }, { + signal + }); + } + } + } + setParent(parent) { + if (!this.#parent) { + this.#parent = parent; + if (this.#textLayer?.isConnected && DrawLayer.#hasSelection()) { + DrawLayer.#selectionChange(); + } + return; + } + if (this.#parent !== parent) { + if (this.#mapping.size > 0) { + for (const root of this.#mapping.values()) { + root.remove(); + parent.append(root); + } + } + this.#parent = parent; } - return shadow(this, "platform", { - isMac: false - }); } - static get isCSSRoundSupported() { - return shadow(this, "isCSSRoundSupported", globalThis.CSS?.supports?.("width: round(1.5px, 1px)")); + static #cleanupTextLayerSelection(textLayer) { + const textLayerData = this.#textLayers.get(textLayer); + if (!textLayerData?.selectionDiv) { + return; + } + textLayerData.selectionDiv.remove(); + this.#selections.delete(textLayerData.selectionDiv); + textLayerData.selectionDiv = null; + textLayerData.path = null; } -} -const hexNumbers = Array.from(Array(256).keys(), n => n.toString(16).padStart(2, "0")); -class Util { - static makeHexColor(r, g, b) { - return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`; + static #hasSelection() { + const selection = document.getSelection(); + return !!selection && !selection.isCollapsed; } - static scaleMinMax(transform, minMax) { - let temp; - if (transform[0]) { - if (transform[0] < 0) { - temp = minMax[0]; - minMax[0] = minMax[2]; - minMax[2] = temp; - } - minMax[0] *= transform[0]; - minMax[2] *= transform[0]; - if (transform[3] < 0) { - temp = minMax[1]; - minMax[1] = minMax[3]; - minMax[3] = temp; - } - minMax[1] *= transform[3]; - minMax[3] *= transform[3]; - } else { - temp = minMax[0]; - minMax[0] = minMax[1]; - minMax[1] = temp; - temp = minMax[2]; - minMax[2] = minMax[3]; - minMax[3] = temp; - if (transform[1] < 0) { - temp = minMax[1]; - minMax[1] = minMax[3]; - minMax[3] = temp; - } - minMax[1] *= transform[1]; - minMax[3] *= transform[1]; - if (transform[2] < 0) { - temp = minMax[0]; - minMax[0] = minMax[2]; - minMax[2] = temp; - } - minMax[0] *= transform[2]; - minMax[2] *= transform[2]; - } - minMax[0] += transform[4]; - minMax[1] += transform[5]; - minMax[2] += transform[4]; - minMax[3] += transform[5]; + static #getOrderedTextLayers() { + return [...this.#textLayerSet].filter(textLayer => textLayer.isConnected).sort(compareTextLayers); } - static transform(m1, m2) { - return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]]; + static #selectionChange() { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + for (const root of this.#selections) { + root.remove(); + } + this.#selections.clear(); + return; + } + const rotators = new WeakMap(); + const orderedTextLayers = this.#getOrderedTextLayers(); + const ranges = []; + for (let i = 0, ii = selection.rangeCount; i < ii; i++) { + const range = selection.getRangeAt(i); + if (range.collapsed) { + continue; + } + let { + startContainer, + startOffset, + endContainer, + endOffset + } = range; + let startTextLayer = getTextLayer(startContainer); + let endTextLayer = getTextLayer(endContainer); + const startMissing = startTextLayer === null; + const endMissing = endTextLayer === null; + if (this.#isSelecting && startMissing !== endMissing) { + return; + } + if (selection.rangeCount === 1) { + const { + anchorNode, + anchorOffset, + focusNode, + focusOffset + } = selection; + const anchorLayer = getTextLayer(anchorNode); + const focusLayer = getTextLayer(focusNode); + const anchorBeforeFocus = isPointBefore(anchorNode, anchorOffset, focusNode, focusOffset); + if (anchorLayer && focusLayer && anchorBeforeFocus !== null) { + if (anchorBeforeFocus) { + startContainer = anchorNode; + startOffset = anchorOffset; + startTextLayer = anchorLayer; + endContainer = focusNode; + endOffset = focusOffset; + endTextLayer = focusLayer; + } else { + startContainer = focusNode; + startOffset = focusOffset; + startTextLayer = focusLayer; + endContainer = anchorNode; + endOffset = anchorOffset; + endTextLayer = anchorLayer; + } + } + } + const activeTextLayers = orderedTextLayers.filter(textLayer => range.intersectsNode(textLayer)); + if (activeTextLayers.length === 0) { + continue; + } + let boundarySubstituted = false; + if (!startTextLayer) { + startTextLayer = activeTextLayers[0]; + startContainer = startTextLayer; + startOffset = 0; + boundarySubstituted = true; + } + if (!endTextLayer) { + endTextLayer = activeTextLayers.at(-1); + endContainer = endTextLayer; + endOffset = endTextLayer.childNodes.length; + boundarySubstituted = true; + } + if (endContainer.nodeType === Node.ELEMENT_NODE) { + if (endContainer.classList.contains("endOfContent")) { + const previousNode = endContainer.previousSibling; + if (!previousNode) { + continue; + } + endContainer = previousNode; + endOffset = previousNode.nodeType === Node.TEXT_NODE ? previousNode.textContent.length : previousNode.childNodes.length; + } else if (endContainer.classList.contains("textLayer") && endContainer.childNodes.length === endOffset) { + const normalizedEnd = normalizeEdgeBoundary(endContainer, endOffset, endTextLayer); + if (!normalizedEnd) { + continue; + } + endContainer = normalizedEnd.container; + endOffset = normalizedEnd.offset; + } + } + if (startContainer.nodeType === Node.ELEMENT_NODE) { + const normalizedStart = normalizeEdgeBoundary(startContainer, startOffset, startTextLayer); + if (!normalizedStart) { + continue; + } + startContainer = normalizedStart.container; + startOffset = normalizedStart.offset; + } + if (startTextLayer === endTextLayer && !boundarySubstituted && activeTextLayers.includes(startTextLayer)) { + ranges.push([range, startTextLayer]); + continue; + } + for (const textLayer of activeTextLayers) { + const firstNode = textLayer.firstChild; + if (!firstNode) { + continue; + } + const subRange = document.createRange(); + if (textLayer === startTextLayer) { + subRange.setStart(startContainer, startOffset); + } else { + subRange.setStartBefore(firstNode); + } + if (textLayer === endTextLayer) { + subRange.setEnd(endContainer, endOffset); + } else { + const lastNode = textLayer.lastChild; + if (!lastNode) { + continue; + } + if (lastNode.nodeType === Node.ELEMENT_NODE && lastNode.classList.contains("endOfContent")) { + const lastTextNode = lastNode.previousSibling; + if (!lastTextNode) { + continue; + } + subRange.setEndAfter(lastTextNode); + } else { + subRange.setEndAfter(lastNode); + } + } + if (!subRange.collapsed) { + ranges.push([subRange, textLayer]); + } + } + } + const selectedTextLayers = new Set(ranges.map(range => range[1])); + for (const textLayer of this.#textLayerSet) { + if (!selectedTextLayers.has(textLayer)) { + this.#cleanupTextLayerSelection(textLayer); + } + } + for (const [range, textLayer] of ranges) { + const textLayerData = DrawLayer.#textLayers.get(textLayer); + if (!textLayerData) { + continue; + } + let rotator = rotators.get(textLayer); + if (!rotator) { + const clientRect = textLayer.getBoundingClientRect(); + rotator = (x, y, w, h) => ({ + x: (x - clientRect.x) / clientRect.width, + y: (y - clientRect.y) / clientRect.height, + width: w / clientRect.width, + height: h / clientRect.height + }); + rotators.set(textLayer, rotator); + } + const boxes = []; + for (let { + x, + y, + width, + height + } of range.getClientRects()) { + if (width === 0 || height === 0) { + continue; + } + ({ + x, + y, + width, + height + } = rotator(x, y, width, height)); + if (width === 1 && height === 1) { + continue; + } + boxes.push(`M${x} ${y} h${width} v${height} h-${width} Z`); + } + if (boxes.length === 0) { + continue; + } + const drawLayer = textLayerData.drawLayer; + let div = textLayerData.selectionDiv; + let path = textLayerData.path; + if (!div) { + const clipPathId = `clip_selection_${DrawLayer.#selectionId++}`; + div = document.createElement("div"); + div.className = "selection"; + div.style.clipPath = `url(#${clipPathId})`; + const selectionStyle = drawLayer.#filterFactory?.createSelectionStyle(drawLayer.#pageColors); + if (selectionStyle) { + for (const [name, value] of Object.entries(selectionStyle)) { + div.style.setProperty(name, value); + } + } + const svg = DrawLayer._svgFactory.create(1, 1, true); + svg.setAttribute("aria-hidden", "true"); + svg.setAttribute("width", "100%"); + svg.setAttribute("height", "100%"); + const clipPath = DrawLayer._svgFactory.createElement("clipPath"); + clipPath.setAttribute("id", clipPathId); + clipPath.setAttribute("clipPathUnits", "objectBoundingBox"); + path = DrawLayer._svgFactory.createElement("path"); + clipPath.append(path); + svg.append(clipPath); + div.append(svg); + textLayerData.path = path; + textLayerData.selectionDiv = div; + } + if (!div.parentNode && drawLayer.#parent) { + drawLayer.#parent.append(div); + this.#selections.add(div); + } + path.setAttribute("d", boxes.join(" ")); + } } - static applyTransform(p, m) { - const xt = p[0] * m[0] + p[1] * m[2] + m[4]; - const yt = p[0] * m[1] + p[1] * m[3] + m[5]; - return [xt, yt]; + static get _svgFactory() { + return shadow(this, "_svgFactory", new DOMSVGFactory()); } - static applyInverseTransform(p, m) { - const d = m[0] * m[3] - m[1] * m[2]; - const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; - const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; - return [xt, yt]; - } - static getAxialAlignedBoundingBox(r, m) { - const p1 = this.applyTransform(r, m); - const p2 = this.applyTransform(r.slice(2, 4), m); - const p3 = this.applyTransform([r[0], r[3]], m); - const p4 = this.applyTransform([r[2], r[1]], m); - return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])]; + static #setBox(element, [x, y, width, height]) { + const { + style + } = element; + style.top = `${100 * y}%`; + style.left = `${100 * x}%`; + style.width = `${100 * width}%`; + style.height = `${100 * height}%`; } - static inverseTransform(m) { - const d = m[0] * m[3] - m[1] * m[2]; - return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; + #createSVG() { + const svg = DrawLayer._svgFactory.create(1, 1, true); + this.#parent.append(svg); + svg.setAttribute("aria-hidden", "true"); + return svg; } - static singularValueDecompose2dScale(m) { - const transpose = [m[0], m[2], m[1], m[3]]; - const a = m[0] * transpose[0] + m[1] * transpose[2]; - const b = m[0] * transpose[1] + m[1] * transpose[3]; - const c = m[2] * transpose[0] + m[3] * transpose[2]; - const d = m[2] * transpose[1] + m[3] * transpose[3]; - const first = (a + d) / 2; - const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2; - const sx = first + second || 1; - const sy = first - second || 1; - return [Math.sqrt(sx), Math.sqrt(sy)]; + #createClipPath(defs, pathId) { + const clipPath = DrawLayer._svgFactory.createElement("clipPath"); + defs.append(clipPath); + const clipPathId = `clip_${pathId}`; + clipPath.setAttribute("id", clipPathId); + clipPath.setAttribute("clipPathUnits", "objectBoundingBox"); + const clipPathUse = DrawLayer._svgFactory.createElement("use"); + clipPath.append(clipPathUse); + clipPathUse.setAttribute("href", `#${pathId}`); + clipPathUse.classList.add("clip"); + return clipPathId; } - static normalizeRect(rect) { - const r = rect.slice(0); - if (rect[0] > rect[2]) { - r[0] = rect[2]; - r[2] = rect[0]; + #updateProperties(element, properties) { + for (const [key, value] of Object.entries(properties)) { + if (value === null) { + element.removeAttribute(key); + } else { + element.setAttribute(key, value); + } } - if (rect[1] > rect[3]) { - r[1] = rect[3]; - r[3] = rect[1]; + } + draw(properties, isPathUpdatable = false, hasClip = false) { + const id = DrawLayer.#id++; + const root = this.#createSVG(); + const defs = DrawLayer._svgFactory.createElement("defs"); + root.append(defs); + const path = DrawLayer._svgFactory.createElement("path"); + defs.append(path); + const pathId = `path_${id}`; + path.setAttribute("id", pathId); + path.setAttribute("vector-effect", "non-scaling-stroke"); + if (isPathUpdatable) { + this.#toUpdate.set(id, path); } - return r; + const clipPathId = hasClip ? this.#createClipPath(defs, pathId) : null; + const use = DrawLayer._svgFactory.createElement("use"); + root.append(use); + use.setAttribute("href", `#${pathId}`); + this.updateProperties(root, properties); + this.#mapping.set(id, root); + return { + id, + clipPathId: `url(#${clipPathId})` + }; } - static intersect(rect1, rect2) { - const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2])); - const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2])); - if (xLow > xHigh) { - return null; + drawOutline(properties, mustRemoveSelfIntersections) { + const id = DrawLayer.#id++; + const root = this.#createSVG(); + const defs = DrawLayer._svgFactory.createElement("defs"); + root.append(defs); + const path = DrawLayer._svgFactory.createElement("path"); + defs.append(path); + const pathId = `path_${id}`; + path.setAttribute("id", pathId); + path.setAttribute("vector-effect", "non-scaling-stroke"); + let maskId; + if (mustRemoveSelfIntersections) { + const mask = DrawLayer._svgFactory.createElement("mask"); + defs.append(mask); + maskId = `mask_${id}`; + mask.setAttribute("id", maskId); + mask.setAttribute("maskUnits", "objectBoundingBox"); + const rect = DrawLayer._svgFactory.createElement("rect"); + mask.append(rect); + rect.setAttribute("width", "1"); + rect.setAttribute("height", "1"); + rect.setAttribute("fill", "white"); + const use = DrawLayer._svgFactory.createElement("use"); + mask.append(use); + use.setAttribute("href", `#${pathId}`); + use.setAttribute("stroke", "none"); + use.setAttribute("fill", "black"); + use.setAttribute("fill-rule", "nonzero"); + use.classList.add("mask"); } - const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3])); - const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3])); - if (yLow > yHigh) { - return null; + const use1 = DrawLayer._svgFactory.createElement("use"); + root.append(use1); + use1.setAttribute("href", `#${pathId}`); + if (maskId) { + use1.setAttribute("mask", `url(#${maskId})`); } - return [xLow, yLow, xHigh, yHigh]; + const use2 = use1.cloneNode(); + root.append(use2); + use1.classList.add("mainOutline"); + use2.classList.add("secondaryOutline"); + this.updateProperties(root, properties); + this.#mapping.set(id, root); + return id; } - static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) { - if (t <= 0 || t >= 1) { - return; - } - const mt = 1 - t; - const tt = t * t; - const ttt = tt * t; - const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3; - const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3; - minMax[0] = Math.min(minMax[0], x); - minMax[1] = Math.min(minMax[1], y); - minMax[2] = Math.max(minMax[2], x); - minMax[3] = Math.max(minMax[3], y); + finalizeDraw(id, properties) { + this.#toUpdate.delete(id); + this.updateProperties(id, properties); } - static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) { - if (Math.abs(a) < 1e-12) { - if (Math.abs(b) >= 1e-12) { - this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, -c / b, minMax); - } + updateProperties(elementOrId, properties) { + if (!properties) { return; } - const delta = b ** 2 - 4 * c * a; - if (delta < 0) { + const { + root, + bbox, + rootClass, + path + } = properties; + const element = typeof elementOrId === "number" ? this.#mapping.get(elementOrId) : elementOrId; + if (!element) { return; } - const sqrtDelta = Math.sqrt(delta); - const a2 = 2 * a; - this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b + sqrtDelta) / a2, minMax); - this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b - sqrtDelta) / a2, minMax); - } - static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) { - if (minMax) { - minMax[0] = Math.min(minMax[0], x0, x3); - minMax[1] = Math.min(minMax[1], y0, y3); - minMax[2] = Math.max(minMax[2], x0, x3); - minMax[3] = Math.max(minMax[3], y0, y3); - } else { - minMax = [Math.min(x0, x3), Math.min(y0, y3), Math.max(x0, x3), Math.max(y0, y3)]; + if (root) { + this.#updateProperties(element, root); } - this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-x0 + 3 * (x1 - x2) + x3), 6 * (x0 - 2 * x1 + x2), 3 * (x1 - x0), minMax); - this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-y0 + 3 * (y1 - y2) + y3), 6 * (y0 - 2 * y1 + y2), 3 * (y1 - y0), minMax); - return minMax; - } -} -const PDFStringTranslateTable = (/* unused pure expression or super */ null && ([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8, 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d, 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac])); -function stringToPDFString(str) { - if (str[0] >= "\xEF") { - let encoding; - if (str[0] === "\xFE" && str[1] === "\xFF") { - encoding = "utf-16be"; - if (str.length % 2 === 1) { - str = str.slice(0, -1); - } - } else if (str[0] === "\xFF" && str[1] === "\xFE") { - encoding = "utf-16le"; - if (str.length % 2 === 1) { - str = str.slice(0, -1); - } - } else if (str[0] === "\xEF" && str[1] === "\xBB" && str[2] === "\xBF") { - encoding = "utf-8"; + if (bbox) { + DrawLayer.#setBox(element, bbox); } - if (encoding) { - try { - const decoder = new TextDecoder(encoding, { - fatal: true - }); - const buffer = stringToBytes(str); - const decoded = decoder.decode(buffer); - if (!decoded.includes("\x1b")) { - return decoded; - } - return decoded.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g, ""); - } catch (ex) { - warn(`stringToPDFString: "${ex}".`); + if (rootClass) { + const { + classList + } = element; + for (const [className, value] of Object.entries(rootClass)) { + classList.toggle(className, value); } } + if (path) { + const defs = element.firstElementChild; + const pathElement = defs.firstElementChild; + this.#updateProperties(pathElement, path); + } } - const strBuf = []; - for (let i = 0, ii = str.length; i < ii; i++) { - const charCode = str.charCodeAt(i); - if (charCode === 0x1b) { - while (++i < ii && str.charCodeAt(i) !== 0x1b) {} - continue; + updateParent(id, layer) { + if (layer === this) { + return; } - const code = PDFStringTranslateTable[charCode]; - strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); + const root = this.#mapping.get(id); + if (!root) { + return; + } + layer.#parent.append(root); + this.#mapping.delete(id); + layer.#mapping.set(id, root); } - return strBuf.join(""); -} -function stringToUTF8String(str) { - return decodeURIComponent(escape(str)); -} -function utf8StringToString(str) { - return unescape(encodeURIComponent(str)); -} -function isArrayEqual(arr1, arr2) { - if (arr1.length !== arr2.length) { - return false; + remove(id) { + this.#toUpdate.delete(id); + if (this.#parent === null) { + return; + } + this.#mapping.get(id).remove(); + this.#mapping.delete(id); } - for (let i = 0, ii = arr1.length; i < ii; i++) { - if (arr1[i] !== arr2[i]) { - return false; + destroy() { + this.#parent = null; + for (const root of this.#mapping.values()) { + root.remove(); + } + this.#mapping.clear(); + this.#toUpdate.clear(); + this.#textLayerObserver?.disconnect(); + this.#textLayerObserver = null; + if (this.#textLayer) { + const data = DrawLayer.#textLayers.get(this.#textLayer); + if (data?.drawLayer === this) { + DrawLayer.#cleanupTextLayerSelection(this.#textLayer); + DrawLayer.#textLayers.delete(this.#textLayer); + DrawLayer.#textLayerSet.delete(this.#textLayer); + if (DrawLayer.#textLayerSet.size === 0) { + DrawLayer.#selectionChangeAC?.abort(); + DrawLayer.#selectionChangeAC = null; + DrawLayer.#isSelecting = false; + } + } + this.#textLayer = null; } } - return true; } -function getModificationDate(date = new Date()) { - const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), date.getUTCDate().toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")]; - return buffer.join(""); -} -let NormalizeRegex = null; -let NormalizationMap = null; -function normalizeUnicode(str) { - if (!NormalizeRegex) { - NormalizeRegex = /([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu; - NormalizationMap = new Map([["ſt", "ſt"]]); + +;// ./src/display/text_layer_images.js + +function percentage(value) { + return `${(value * 100).toFixed(2)}%`; +} +class TextLayerImages { + #coordinates = []; + #coordinatesByElement = new Map(); + #getPageCanvas = null; + #minSize = 0; + #pageWidth = 0; + #pageHeight = 0; + static #activeImage = null; + constructor(minSize, coordinates, viewport, getPageCanvas) { + this.#minSize = minSize; + this.#coordinates = coordinates; + this.#pageWidth = viewport.rawDims.pageWidth; + this.#pageHeight = viewport.rawDims.pageHeight; + this.#getPageCanvas = getPageCanvas; } - return str.replaceAll(NormalizeRegex, (_, p1, p2) => p1 ? p1.normalize("NFKC") : NormalizationMap.get(p2)); -} -function getUuid() { - if (typeof crypto !== "undefined" && typeof crypto?.randomUUID === "function") { - return crypto.randomUUID(); + render() { + const container = document.createElement("div"); + container.className = "textLayerImages"; + for (let i = 0; i < this.#coordinates.length; i += 6) { + const el = this.#createImagePlaceholder(this.#coordinates.subarray(i, i + 6)); + if (el) { + container.append(el); + } + } + container.addEventListener("contextmenu", event => { + if (!(event.target instanceof HTMLCanvasElement)) { + return; + } + const imgElement = event.target; + const coords = this.#coordinatesByElement.get(imgElement); + if (!coords) { + return; + } + const activeImage = TextLayerImages.#activeImage?.deref(); + if (activeImage === imgElement) { + return; + } + if (activeImage) { + activeImage.width = 0; + activeImage.height = 0; + } + TextLayerImages.#activeImage = new WeakRef(imgElement); + const { + inverseTransform, + x1, + y1, + width, + height + } = coords; + const pageCanvas = this.#getPageCanvas(); + const imageX1 = Math.ceil(x1 * pageCanvas.width); + const imageY1 = Math.ceil(y1 * pageCanvas.height); + const imageX2 = Math.floor((x1 + width / this.#pageWidth) * pageCanvas.width); + const imageY2 = Math.floor((y1 + height / this.#pageHeight) * pageCanvas.height); + imgElement.width = imageX2 - imageX1; + imgElement.height = imageY2 - imageY1; + const ctx = imgElement.getContext("2d"); + ctx.setTransform(...inverseTransform); + ctx.translate(-imageX1, -imageY1); + ctx.drawImage(pageCanvas, 0, 0); + }); + return container; } - const buf = new Uint8Array(32); - if (typeof crypto !== "undefined" && typeof crypto?.getRandomValues === "function") { - crypto.getRandomValues(buf); - } else { - for (let i = 0; i < 32; i++) { - buf[i] = Math.floor(Math.random() * 255); + #createImagePlaceholder([x1, y1, x2, y2, x3, y3]) { + const width = Math.hypot((x3 - x1) * this.#pageWidth, (y3 - y1) * this.#pageHeight); + const height = Math.hypot((x2 - x1) * this.#pageWidth, (y2 - y1) * this.#pageHeight); + if (width < this.#minSize || height < this.#minSize) { + return null; } + const transform = [(x3 - x1) * this.#pageWidth / width, (y3 - y1) * this.#pageHeight / width, (x2 - x1) * this.#pageWidth / height, (y2 - y1) * this.#pageHeight / height, 0, 0]; + const inverseTransform = Util.inverseTransform(transform); + const imgElement = document.createElement("canvas"); + imgElement.className = "textLayerImagePlaceholder"; + imgElement.width = 0; + imgElement.height = 0; + Object.assign(imgElement.style, { + opacity: 0, + position: "absolute", + left: percentage(x1), + top: percentage(y1), + width: percentage(width / this.#pageWidth), + height: percentage(height / this.#pageHeight), + transformOrigin: "0% 0%", + transform: `matrix(${transform.join(",")})` + }); + this.#coordinatesByElement.set(imgElement, { + inverseTransform, + width, + height, + x1, + y1 + }); + return imgElement; } - return bytesToString(buf); } -const AnnotationPrefix = "pdfjs_internal_id_"; + +;// ./src/pdf.js + + + + -/***/ }) -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/async module */ -/******/ (() => { -/******/ var webpackQueues = typeof Symbol === "function" ? Symbol("webpack queues") : "__webpack_queues__"; -/******/ var webpackExports = typeof Symbol === "function" ? Symbol("webpack exports") : "__webpack_exports__"; -/******/ var webpackError = typeof Symbol === "function" ? Symbol("webpack error") : "__webpack_error__"; -/******/ var resolveQueue = (queue) => { -/******/ if(queue && queue.d < 1) { -/******/ queue.d = 1; -/******/ queue.forEach((fn) => (fn.r--)); -/******/ queue.forEach((fn) => (fn.r-- ? fn.r++ : fn())); -/******/ } -/******/ } -/******/ var wrapDeps = (deps) => (deps.map((dep) => { -/******/ if(dep !== null && typeof dep === "object") { -/******/ if(dep[webpackQueues]) return dep; -/******/ if(dep.then) { -/******/ var queue = []; -/******/ queue.d = 0; -/******/ dep.then((r) => { -/******/ obj[webpackExports] = r; -/******/ resolveQueue(queue); -/******/ }, (e) => { -/******/ obj[webpackError] = e; -/******/ resolveQueue(queue); -/******/ }); -/******/ var obj = {}; -/******/ obj[webpackQueues] = (fn) => (fn(queue)); -/******/ return obj; -/******/ } -/******/ } -/******/ var ret = {}; -/******/ ret[webpackQueues] = x => {}; -/******/ ret[webpackExports] = dep; -/******/ return ret; -/******/ })); -/******/ __webpack_require__.a = (module, body, hasAwait) => { -/******/ var queue; -/******/ hasAwait && ((queue = []).d = -1); -/******/ var depQueues = new Set(); -/******/ var exports = module.exports; -/******/ var currentDeps; -/******/ var outerResolve; -/******/ var reject; -/******/ var promise = new Promise((resolve, rej) => { -/******/ reject = rej; -/******/ outerResolve = resolve; -/******/ }); -/******/ promise[webpackExports] = exports; -/******/ promise[webpackQueues] = (fn) => (queue && fn(queue), depQueues.forEach(fn), promise["catch"](x => {})); -/******/ module.exports = promise; -/******/ body((deps) => { -/******/ currentDeps = wrapDeps(deps); -/******/ var fn; -/******/ var getResult = () => (currentDeps.map((d) => { -/******/ if(d[webpackError]) throw d[webpackError]; -/******/ return d[webpackExports]; -/******/ })) -/******/ var promise = new Promise((resolve) => { -/******/ fn = () => (resolve(getResult)); -/******/ fn.r = 0; -/******/ var fnQueue = (q) => (q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn)))); -/******/ currentDeps.map((dep) => (dep[webpackQueues](fnQueue))); -/******/ }); -/******/ return fn.r ? promise : getResult(); -/******/ }, (err) => ((err ? reject(promise[webpackError] = err) : outerResolve(exports)), resolveQueue(queue))); -/******/ queue && queue.d < 0 && (queue.d = 0); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module used 'module' so it can't be inlined -/******/ var __webpack_exports__ = __webpack_require__(228); -/******/ __webpack_exports__ = globalThis.pdfjsLib = await (globalThis.pdfjsLibPromise = __webpack_exports__); -/******/ var __webpack_exports__AbortException = __webpack_exports__.AbortException; -/******/ var __webpack_exports__AnnotationEditorLayer = __webpack_exports__.AnnotationEditorLayer; -/******/ var __webpack_exports__AnnotationEditorParamsType = __webpack_exports__.AnnotationEditorParamsType; -/******/ var __webpack_exports__AnnotationEditorType = __webpack_exports__.AnnotationEditorType; -/******/ var __webpack_exports__AnnotationEditorUIManager = __webpack_exports__.AnnotationEditorUIManager; -/******/ var __webpack_exports__AnnotationLayer = __webpack_exports__.AnnotationLayer; -/******/ var __webpack_exports__AnnotationMode = __webpack_exports__.AnnotationMode; -/******/ var __webpack_exports__CMapCompressionType = __webpack_exports__.CMapCompressionType; -/******/ var __webpack_exports__ColorPicker = __webpack_exports__.ColorPicker; -/******/ var __webpack_exports__DOMSVGFactory = __webpack_exports__.DOMSVGFactory; -/******/ var __webpack_exports__DrawLayer = __webpack_exports__.DrawLayer; -/******/ var __webpack_exports__FeatureTest = __webpack_exports__.FeatureTest; -/******/ var __webpack_exports__GlobalWorkerOptions = __webpack_exports__.GlobalWorkerOptions; -/******/ var __webpack_exports__ImageKind = __webpack_exports__.ImageKind; -/******/ var __webpack_exports__InvalidPDFException = __webpack_exports__.InvalidPDFException; -/******/ var __webpack_exports__MissingPDFException = __webpack_exports__.MissingPDFException; -/******/ var __webpack_exports__OPS = __webpack_exports__.OPS; -/******/ var __webpack_exports__Outliner = __webpack_exports__.Outliner; -/******/ var __webpack_exports__PDFDataRangeTransport = __webpack_exports__.PDFDataRangeTransport; -/******/ var __webpack_exports__PDFDateString = __webpack_exports__.PDFDateString; -/******/ var __webpack_exports__PDFWorker = __webpack_exports__.PDFWorker; -/******/ var __webpack_exports__PasswordResponses = __webpack_exports__.PasswordResponses; -/******/ var __webpack_exports__PermissionFlag = __webpack_exports__.PermissionFlag; -/******/ var __webpack_exports__PixelsPerInch = __webpack_exports__.PixelsPerInch; -/******/ var __webpack_exports__RenderingCancelledException = __webpack_exports__.RenderingCancelledException; -/******/ var __webpack_exports__UnexpectedResponseException = __webpack_exports__.UnexpectedResponseException; -/******/ var __webpack_exports__Util = __webpack_exports__.Util; -/******/ var __webpack_exports__VerbosityLevel = __webpack_exports__.VerbosityLevel; -/******/ var __webpack_exports__XfaLayer = __webpack_exports__.XfaLayer; -/******/ var __webpack_exports__build = __webpack_exports__.build; -/******/ var __webpack_exports__createValidAbsoluteUrl = __webpack_exports__.createValidAbsoluteUrl; -/******/ var __webpack_exports__fetchData = __webpack_exports__.fetchData; -/******/ var __webpack_exports__getDocument = __webpack_exports__.getDocument; -/******/ var __webpack_exports__getFilenameFromUrl = __webpack_exports__.getFilenameFromUrl; -/******/ var __webpack_exports__getPdfFilenameFromUrl = __webpack_exports__.getPdfFilenameFromUrl; -/******/ var __webpack_exports__getXfaPageViewport = __webpack_exports__.getXfaPageViewport; -/******/ var __webpack_exports__isDataScheme = __webpack_exports__.isDataScheme; -/******/ var __webpack_exports__isPdfFile = __webpack_exports__.isPdfFile; -/******/ var __webpack_exports__noContextMenu = __webpack_exports__.noContextMenu; -/******/ var __webpack_exports__normalizeUnicode = __webpack_exports__.normalizeUnicode; -/******/ var __webpack_exports__renderTextLayer = __webpack_exports__.renderTextLayer; -/******/ var __webpack_exports__setLayerDimensions = __webpack_exports__.setLayerDimensions; -/******/ var __webpack_exports__shadow = __webpack_exports__.shadow; -/******/ var __webpack_exports__updateTextLayer = __webpack_exports__.updateTextLayer; -/******/ var __webpack_exports__version = __webpack_exports__.version; -/******/ export { __webpack_exports__AbortException as AbortException, __webpack_exports__AnnotationEditorLayer as AnnotationEditorLayer, __webpack_exports__AnnotationEditorParamsType as AnnotationEditorParamsType, __webpack_exports__AnnotationEditorType as AnnotationEditorType, __webpack_exports__AnnotationEditorUIManager as AnnotationEditorUIManager, __webpack_exports__AnnotationLayer as AnnotationLayer, __webpack_exports__AnnotationMode as AnnotationMode, __webpack_exports__CMapCompressionType as CMapCompressionType, __webpack_exports__ColorPicker as ColorPicker, __webpack_exports__DOMSVGFactory as DOMSVGFactory, __webpack_exports__DrawLayer as DrawLayer, __webpack_exports__FeatureTest as FeatureTest, __webpack_exports__GlobalWorkerOptions as GlobalWorkerOptions, __webpack_exports__ImageKind as ImageKind, __webpack_exports__InvalidPDFException as InvalidPDFException, __webpack_exports__MissingPDFException as MissingPDFException, __webpack_exports__OPS as OPS, __webpack_exports__Outliner as Outliner, __webpack_exports__PDFDataRangeTransport as PDFDataRangeTransport, __webpack_exports__PDFDateString as PDFDateString, __webpack_exports__PDFWorker as PDFWorker, __webpack_exports__PasswordResponses as PasswordResponses, __webpack_exports__PermissionFlag as PermissionFlag, __webpack_exports__PixelsPerInch as PixelsPerInch, __webpack_exports__RenderingCancelledException as RenderingCancelledException, __webpack_exports__UnexpectedResponseException as UnexpectedResponseException, __webpack_exports__Util as Util, __webpack_exports__VerbosityLevel as VerbosityLevel, __webpack_exports__XfaLayer as XfaLayer, __webpack_exports__build as build, __webpack_exports__createValidAbsoluteUrl as createValidAbsoluteUrl, __webpack_exports__fetchData as fetchData, __webpack_exports__getDocument as getDocument, __webpack_exports__getFilenameFromUrl as getFilenameFromUrl, __webpack_exports__getPdfFilenameFromUrl as getPdfFilenameFromUrl, __webpack_exports__getXfaPageViewport as getXfaPageViewport, __webpack_exports__isDataScheme as isDataScheme, __webpack_exports__isPdfFile as isPdfFile, __webpack_exports__noContextMenu as noContextMenu, __webpack_exports__normalizeUnicode as normalizeUnicode, __webpack_exports__renderTextLayer as renderTextLayer, __webpack_exports__setLayerDimensions as setLayerDimensions, __webpack_exports__shadow as shadow, __webpack_exports__updateTextLayer as updateTextLayer, __webpack_exports__version as version }; -/******/ + + + + + + + + + + + +{ + globalThis._pdfjsTestingUtils = { + HighlightOutliner: HighlightOutliner + }; +} +globalThis.pdfjsLib = { + AbortException: AbortException, + AnnotationEditorLayer: AnnotationEditorLayer, + AnnotationEditorParamsType: AnnotationEditorParamsType, + AnnotationEditorType: AnnotationEditorType, + AnnotationEditorUIManager: AnnotationEditorUIManager, + AnnotationLayer: AnnotationLayer, + AnnotationMode: AnnotationMode, + AnnotationType: AnnotationType, + applyOpacity: applyOpacity, + build: build, + ColorPicker: ColorPicker, + createValidAbsoluteUrl: createValidAbsoluteUrl, + CSSConstants: CSSConstants, + DOMSVGFactory: DOMSVGFactory, + DrawLayer: DrawLayer, + FeatureTest: FeatureTest, + fetchData: fetchData, + findContrastColor: findContrastColor, + getDocument: getDocument, + getFilenameFromUrl: getFilenameFromUrl, + getPdfFilenameFromUrl: getPdfFilenameFromUrl, + getRGB: getRGB, + getRGBA: getRGBA, + getUuid: getUuid, + GlobalWorkerOptions: GlobalWorkerOptions, + ImageKind: ImageKind, + InvalidPDFException: InvalidPDFException, + isDataScheme: isDataScheme, + isPdfFile: isPdfFile, + isValidExplicitDest: isValidExplicitDest, + makeArr: makeArr, + makeMap: makeMap, + makeObj: makeObj, + MathClamp: MathClamp, + noContextMenu: noContextMenu, + normalizeUnicode: normalizeUnicode, + OPS: OPS, + OutputScale: OutputScale, + PasswordException: PasswordException, + PasswordResponses: PasswordResponses, + PDFDataRangeTransport: PDFDataRangeTransport, + PDFDateString: PDFDateString, + PDFWorker: PDFWorker, + PermissionFlag: PermissionFlag, + PixelsPerInch: PixelsPerInch, + RenderingCancelledException: RenderingCancelledException, + renderRichText: renderRichText, + ResponseException: ResponseException, + setLayerDimensions: setLayerDimensions, + shadow: shadow, + SignatureExtractor: SignatureExtractor, + stopEvent: stopEvent, + SupportedImageMimeTypes: SupportedImageMimeTypes, + TextLayer: TextLayer, + TextLayerImages: TextLayerImages, + TouchManager: TouchManager, + updateUrlHash: updateUrlHash, + Util: Util, + VerbosityLevel: VerbosityLevel, + version: version, + XfaLayer: XfaLayer +}; + +export { AbortException, AnnotationEditorLayer, AnnotationEditorParamsType, AnnotationEditorType, AnnotationEditorUIManager, AnnotationLayer, AnnotationMode, AnnotationType, CSSConstants, ColorPicker, DOMSVGFactory, DrawLayer, FeatureTest, GlobalWorkerOptions, ImageKind, InvalidPDFException, MathClamp, OPS, OutputScale, PDFDataRangeTransport, PDFDateString, PDFWorker, PasswordException, PasswordResponses, PermissionFlag, PixelsPerInch, RenderingCancelledException, ResponseException, SignatureExtractor, SupportedImageMimeTypes, TextLayer, TextLayerImages, TouchManager, Util, VerbosityLevel, XfaLayer, applyOpacity, build, createValidAbsoluteUrl, fetchData, findContrastColor, getDocument, getFilenameFromUrl, getPdfFilenameFromUrl, getRGB, getRGBA, getUuid, isDataScheme, isPdfFile, isValidExplicitDest, makeArr, makeMap, makeObj, noContextMenu, normalizeUnicode, renderRichText, setLayerDimensions, shadow, stopEvent, updateUrlHash, version }; //# sourceMappingURL=pdf.mjs.map \ No newline at end of file diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/build/pdf.sandbox.mjs webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/build/pdf.sandbox.mjs --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/build/pdf.sandbox.mjs 2026-01-20 14:08:39.304690000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/build/pdf.sandbox.mjs 2026-07-09 07:12:41.844802000 +0000 @@ -2,7 +2,7 @@ * @licstart The following is the entire license notice for the * JavaScript code in this page * - * Copyright 2023 Mozilla Foundation + * Copyright 2024 Mozilla Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,38 +20,12 @@ * JavaScript code in this page */ -/******/ // The require scope -/******/ var __webpack_require__ = {}; -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = globalThis.pdfjsSandbox = {}; - -// EXPORTS -__webpack_require__.d(__webpack_exports__, { - QuickJSSandbox: () => (/* binding */ QuickJSSandbox) -}); +/** + * pdfjsVersion = 6.1.200 + * pdfjsBuild = 6353acefe + */ -;// CONCATENATED MODULE: ./external/quickjs/quickjs-eval.js -var Module=(()=>{var _scriptDir=typeof document!=='undefined'&&document.currentScript?document.currentScript.src:undefined;return function(moduleArg={}){var d=moduleArg,k,n;d.ready=new Promise((a,b)=>{k=a;n=b;});var p=Object.assign({},d),q="";"undefined"!=typeof document&&document.currentScript&&(q=document.currentScript.src);_scriptDir&&(q=_scriptDir);q.startsWith("blob:")?q="":q=q.substr(0,q.replace(/[?#].*/,"").lastIndexOf("/")+1);var aa=d.print||console.log.bind(console),u=d.printErr||console.error.bind(console);Object.assign(d,p);p=null;var v;d.wasmBinary&&(v=d.wasmBinary);"object"!=typeof WebAssembly&&w("no native wasm support detected");var x,y=!1,z,A,B,C;function D(){var a=x.buffer;d.HEAP8=z=new Int8Array(a);d.HEAP16=new Int16Array(a);d.HEAPU8=A=new Uint8Array(a);d.HEAPU16=new Uint16Array(a);d.HEAP32=B=new Int32Array(a);d.HEAPU32=C=new Uint32Array(a);d.HEAPF32=new Float32Array(a);d.HEAPF64=new Float64Array(a);}var E=[],F=[],G=[];function ba(){var a=d.preRun.shift();E.unshift(a);}var H=0,I=null,J=null;function w(a){d.onAbort?.(a);a="Aborted("+a+")";u(a);y=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");n(a);throw a;}var K=a=>a.startsWith("data:application/octet-stream;base64,"),L;L="data:application/octet-stream;base64,AGFzbQEAAAABzgZtYAJ/fwBgA39/fwF/YAR/fn9/AX5gAn9/AX9gBX9+f39/AX5gAX8Bf2ADf39/AGAEf39/fwF/YAJ/fgF+YAF/AGABfAF8YAV/f39/fwF/YAJ/fgBgAn9+AX9gAn9/AX5gA39/fgF/YAN/fn8BfmAGf35/f39/AX5gA39+fwBgA39+fwF/YAZ/f39/f38Bf2AEf39/fwBgBn9+fn9/fwF+YAR/f35/AX9gA39+fgF+YAN/f38BfmADf35+AX9gBH9/f38BfmAFf35+fn4AYAJ8fAF8YAF/AX5gBH9/f34Bf2AFf35+f38BfmAFf39/f38AYAd/fn9+fn5/AX9gBX9/f35+AX9gB39/f39/f38Bf2AAAGAFf35/fn8Bf2AEf35+fwBgBH9+fn8BfmAFf35+fn8Bf2AFf39/f38BfmAEf39+fgF/YAF+AX9gBH9+f34BfmAEf35/fwBgBH9+fn8Bf2AJf39/f39/f39/AX9gCH9/f39/f39/AX9gA39+fgBgBH9+f38Bf2AGf35/fn5/AX9gBX9+fn9/AGABfgF+YAd/fn9/f39/AX5gAX8BfGADf39+AGAEf35/fgF/YAV/f35/fwF/YAR/fn5+AX9gBn9/f39/fwF+YAN+f38Bf2AHf39/f39/fwBgAnx/AXxgA39/fgF+YAJ+fwF/YAN8fH8BfGAEf39+fwBgBH9+fn4BfmAAAX9gBn98f39/fwF/YAABfGAFf35/fn8BfmAGf39+fn5+AX9gAn5/AGACf3wAYAV/f39/fgF+YAR/f35/AX5gBH9+f34AYAd/fn5+f39/AX5gBH5+fn4Bf2AKf39/f39/f39/fwF/YAd/f39/f39+AX5gBX9+f39/AGAHfH9/f39/fwBgBX98f39/AX5gAXwBf2AFf39+f38AYAZ/fn5+fn8Bf2AGf35/f39/AX9gBH98f38Bf2AGf39/f39/AGAEf39/fgF+YAV/fn9/fwF/YAV/fn5+fgF/YAJ/fwF8YAV/fn5/fwF/YAV/f35+fgF+YAV/f35+fwF/YAJ8fwF/YAJ8fAF/YAh/fn5+fn9+fgF+YAN/fnwBfmAAAX5gB39/f35+fn8Bf2ACfn4BfGADfn5+AX9gA39/fAACSQwBYQFhABUBYQFiACUBYQFjAAcBYQFkAAYBYQFlAEgBYQFmAAABYQFn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IAILLQEBfwJAIAAoAgAiAUUNACAAKAIQIgBFDQAgASgCACAAQQAgASgCBBEBABoLCzEAIAFBAE4EQCAAQbYBEA0gACABEDggACgCQCIAKAKkAiABQRRsaiAAKAKEAjYCBAsLJwEBfyMAQRBrIgIkACACIAE2AgwgACACQQxqQQQQchogAkEQaiQACxcAIAAgASACQoCAgIAwIAMgBEECENIBCxgBAX4gASkDACEDIAEgAjcDACAAIAMQDAszAQF/IAIEQCAAIQMDQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQQFrIgINAAsLIAALwQUCAn4GfyMAQeAAayIJJAAgA0EAIANBAEobIQsDQCAKIAtHBEAgACACIApBBHRqIgMoAgAQsAUhBiADLQAEIQdCgICAgDAhBAJAAkACQAJAAkACQAJAAkACQAJAIAMtAAUOCgECAgUHAwQIBQAGCyAAIAMoAggQsAUhCAJ+AkACQAJAIAMoAgxBAWoOAwIAAQkLIAAgACkDwAEiBCAIIARBABARDAILIAAgACgCKCkDECIEIAggBEEAEBEMAQsgACABIAggAUEAEBELIQQgACAIEBAgBkHLAUYEQEEBIQcMCAsgBkHUAUcNB0EAIQcMBwsCQCAGQcsBRgRAQQEhBwwBCyAGQdQBRw0AQQAhBwsgACABIAZBAiADIAcQgAMaDAcLIAAgASAGQoCAgIAwIAMoAggEfiAJIAMoAgA2AhAgCUEgaiIIQcAAQeEqIAlBEGoQSBogACADKAIIIAhBAEEKQQggAy0ABUECRhsgAy4BBhCCAQVCgICAgDALIgQgAygCDAR+IAkgAygCADYCACAJQSBqIghBwABB2iogCRBIGiAAIAMoAgwgCEEBQQtBCSADLQAFQQJGGyADLgEGEIIBBUKAgICAMAsiBSAHQYA6chBqGiAAIAQQDCAAIAUQDAwGCyADKQMIIgRCgICAgAh8Qv////8PWARAIARC/////w+DIQQMBQtCgICAgMB+IAS5vSIEQoCAgIDAgYD8/wB9IARC////////////AINCgICAgICAgPj/AFYbIQQMBAtCgICAgMB+IAMpAwgiBEKAgICAwIGA/P8AfSAEQv///////////wCDQoCAgICAgID4/wBWGyEEDAMLIAAgASAGQQIgAyAHEIADGgwDCxABAAsgAzUCCCEECyAAIAEgBiAEIAcQFRoLIAAgBhAQIApBAWohCgwBCwsgCUHgAGokAAuMAgICfgF/AkACQAJAAkACQAJAAkACQAJAQQcgAUIgiKciBCAEQQdrQW5JG0EKag4SAgAGBAAAAAAAAQMFAAAAAAEDAAsgAEGbHkEAEBJCgICAgOAADwsgBEF1SQ0GIAGnIgAgACgCAEEBajYCAAwGCyAAQSEQhgEhAgwECyAAQQQQhgEhAgwDCyAAIABBBRCGASICQTAgAacpAgRC/////weDQQAQFRoMAgsgAEEGEIYBIQIMAQsgAEEHEIYBIQILQoCAgIDgACEDIAJCgICAgHCDQoCAgIDgAFIEfiAEQXVPBEAgAaciBCAEKAIAQQFqNgIACyAAIAIgARC9ASACBUKAgICA4AALDwsgAQsyAQF/AkAgAUIgiKdBdUkNACABpyICIAIoAgAiAkEBazYCACACQQFKDQAgACABEJcFCwsLACAAQeweQQAQEgujBAELfyAAKAIAIQUjAEEQayIIIAI2AgxBfyEJAkADQAJAIAggAiIDQQRqIgI2AgwgAygCACIHQX9GDQAgACgCBCEKA0AgASIEIApODQMgBCAEIAVqIgwtAAAiBkECdEHgrgFqIg0tAABqIgEgCkoNAyAGQcYBRgRAIAwoAAEhCQwBCwsgBiAHRwRAIAdBGHYgBkYgBiAHQRB2Qf8BcUZyIAYgB0H/AXFGckUgBiAHQQh2Qf8BcUdxIAZFIAdBgAJJcnINAyAAIAY2AhALIARBAWohBAJAAkACQAJAAkACQAJAAkAgDS0AA0EFaw4YAAkACQkBCQkBCQkBAQECAgICBAUGBwkDCQsgBCAFai0AACEEIAggA0EIaiICNgIMIAMoAgQiA0F/RgRAIAAgBDYCFAwJCyADIARGDQgMCQsgBCAFai8AACEEIAggA0EIaiICNgIMIAMoAgQiA0F/RgRAIAAgBDYCFAwICyADIARGDQcMCAsgACAEIAVqKAAANgIYDAYLIAAgBCAFaiIDKAAANgIYIAAgAy8ABDYCHAwFCyAAIAQgBWooAAA2AiAMBAsgACAEIAVqIgMoAAA2AiAgACADLQAENgIcDAMLIAAgBCAFaiIDKAAANgIgIAAgAy8ABDYCHAwCCyAAIAQgBWoiAygAADYCICAAIAMoAAQ2AhggACADLQAINgIcDAELCyAAIAk2AgwgACABNgIIQQEhCwsgCwskAQF/IAAoAhAiAkEQaiABIAIoAgARAwAiAUUEQCAAEHALIAELCwAgACABQQAQjQQLJwEBfyMAQRBrIgIkACACIAE7AQ4gACACQQ5qQQIQchogAkEQaiQAC9QBAgR/An5BfyECAkACQAJAAkACQAJAAkAgAUIgiKciA0EKag4RAwUFAgUFBQUFBAABAQEFBQYFCyABp0EARw8LIAGnDwsgAacpAgQhByAAIAEQDCAHQv////8Hg0IAUg8LIAGnKAIMIQQgACABEAwgBEH/////B2pBfkkPCyABpywABSEFIAAgARAMIAVBAE4PCyADQQdrQW1NBEAgAUKAgICAwIGA/P8AfEL///////////8Ag0IBfUKAgICAgICA+P8AVA8LIAAgARAMQQEhAgsgAgs/AQJ/IwBBEGsiAiQAAn8gASAAKAIQRwRAIAIgATYCACAAQcyQASACEBNBfwwBCyAAEA8LIQMgAkEQaiQAIAMLCwAgACABQQEQ6QULGQAgAEEAEFAaIABCgICAgPD/////ADcCBAvDCgIFfxF+IwBB4ABrIgUkACAEQv///////z+DIQwgAiAEhUKAgICAgICAgIB/gyEKIAJC////////P4MiDUIgiCEOIARCMIinQf//AXEhBwJAAkAgAkIwiKdB//8BcSIJQf//AWtBgoB+TwRAIAdB//8Ba0GBgH5LDQELIAFQIAJC////////////AIMiC0KAgICAgIDA//8AVCALQoCAgICAgMD//wBRG0UEQCACQoCAgICAgCCEIQoMAgsgA1AgBEL///////////8AgyICQoCAgICAgMD//wBUIAJCgICAgICAwP//AFEbRQRAIARCgICAgICAIIQhCiADIQEMAgsgASALQoCAgICAgMD//wCFhFAEQCACIAOEUARAQoCAgICAgOD//wAhCkIAIQEMAwsgCkKAgICAgIDA//8AhCEKQgAhAQwCCyADIAJCgICAgICAwP//AIWEUARAIAEgC4QhGUIAIQEgGVAEQEKAgICAgIDg//8AIQoMAwsgCkKAgICAgIDA//8AhCEKDAILIAEgC4RQBEBCACEBDAILIAIgA4RQBEBCACEBDAILIAtC////////P1gEQCAFQdAAaiABIA0gASANIA1QIgYbeSAG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////B4OENwIEIABBADYCBCABrUKAgICAkH+ECwsPACAAKAJAQYACaiABEBsLEwAgACABIAIgAyABQYCAARDQAQsNACAAIAEgAkEGEMgCCx8BAX8gACgCJCIBIAEoAgBBAWo2AgAgACABQQIQ5wULZwECfwJ/IAAoAggiAiAAKAIMTgRAQX8gACACQQFqIAEQxAINARoLIAAgACgCCCIDQQFqNgIIIAAoAgRBEGohAgJAIAAoAhAEQCACIANBAXRqIAE7AQAMAQsgAiADaiABOgAAC0EACwt6AQN/AkACQCAAIgFBA3FFDQAgAS0AAEUEQEEADwsDQCABQQFqIgFBA3FFDQEgAS0AAA0ACwwBCwNAIAEiAkEEaiEBIAIoAgAiA0F/cyADQYGChAhrcUGAgYKEeHFFDQALA0AgAiIBQQFqIQIgAS0AAA0ACwsgASAAawsNACAAIAEgAkEAEJkDCywBAX8jAEEQayIDJAAgAyACNgIMIABB3ABqQYABIAEgAhDJAhogA0EQaiQAC+gDAQl/IwBBIGsiBSQAIAEgAiABKAIMIAIoAgxJIgYbIgcoAgQgAiABIAYbIggoAgRzIQoCQAJAIAcoAgwiAkUEQAJAIAgoAggiAUH/////B0cEQCAHKAIIIgJB/////wdHDQELIAAQKkEAIQIMAwsgAUH+////B0cgAkH+////B0dxRQRAAkAgAUH+////B0YEQCACQYCAgIB4Rg0BDAQLIAFBgICAgHhHIAJB/v///wdHcg0DCyAAECpBASECDAMLIAAgChCAAUEAIQIMAgsgCCgCDCILIQkgAiEGIARBB3FBBkYEQCACIANBIWpBBXYiASABIAJKGyEGIAsgASABIAtKGyEJCwJ/AkAgACAIRg0AIAAgB0YNACAADAELIAAoAgAhASAFQgA3AhggBUKAgICAgICAgIB/NwIQIAUgATYCDCAAIQwgBUEMagshASAHKAIQIQAgCCgCECENAn8gASAGIAlqEFAEQCABECpBIAwBCyABKAIQIA0gC0ECdGogCUECdGsgCSAAIAJBAnRqIAZBAnRrIAYQ8AEgASAKNgIEIAEgBygCCCAIKAIIajYCCCABIAMgBBCbAgshAiABIAVBDGoiAEcNASAMIAAQvwQMAQsgACAKEH9BACECCyAFQSBqJAAgAgsKACAAIAFBARBHCygB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ajAAAEL/////D4MPCyAEKAIoIANNDQggBCgCJCADajEAAA8LIAQoAiggA00NByAEKAIkIANBAXRqMgEAQv////8Pgw8LIAQoAiggA00NBiAEKAIkIANBAXRqMwEADwsgBCgCKCADTQ0FIAQoAiQgA0ECdGo1AgAPCyAEKAIoIANNDQQgBCgCJCADQQJ0aigCACIAQQBOBEAgAK0PC0KAgICAwH4gALi9IgFCgICAgMCBgPz/AH0gAUKAgICAgICA+P8AVhsPCyAEKAIoIANNDQMgACAEKAIkIANBA3RqKQMAEL8CDwsgBCgCKCADTQ0CIAAgBCgCJCADQQN0aikDABCIBA8LIAQoAiggA00NAUKAgICAwH4gBCgCJCADQQJ0aioCALu9IgFCgICAgMCBgPz/AH0gAUL///////////8Ag0KAgICAgICA+P8AVhsPCyAEKAIoIANNDQBCgICAgMB+IAQoAiQgA0EDdGopAwAiAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGw8LIAAgAhAwIQMgACACEAwgA0UEQEKAgICA4AAPCyAAIAEgAyABQQAQESEBIAAgAxAQCyABC4IDAgR/An4CQCAAKQNwIgVQRSAFIAApA3ggACgCBCIBIAAoAiwiAmusfCIGV3FFBEAjAEEQayICJABBfyEBAkACfyAAIAAoAkgiA0EBayADcjYCSCAAKAIUIAAoAhxHBEAgAEEAQQAgACgCJBEBABoLIABBADYCHCAAQgA3AxAgACgCACIDQQRxBEAgACADQSByNgIAQX8MAQsgACAAKAIsIAAoAjBqIgQ2AgggACAENgIEIANBG3RBH3ULDQAgACACQQ9qQQEgACgCIBEBAEEBRw0AIAItAA8hAQsgAkEQaiQAIAEiA0EATg0BIAAoAgQhASAAKAIsIQILIABCfzcDcCAAIAE2AmggACAGIAIgAWusfDcDeEF/DwsgBkIBfCEGIAAoAgQhASAAKAIIIQICQCAAKQNwIgVQDQAgBSAGfSIFIAIgAWusWQ0AIAEgBadqIQILIAAgAjYCaCAAIAYgACgCLCIAIAFrrHw3A3ggACABTwRAIAFBAWsgAzoAAAsgAwtPAQF/An9BACAAKAIMIAFGDQAaIAAoAgAiAigCACAAKAIQIAFBAnQgAigCBBEBACECIAEEQEF/IAJFDQEaCyAAIAE2AgwgACACNgIQQQALC9EBAQZ/IABBAWohBQJAAkAgAC0AACIDwCIHQQBOBEAgBSEBDAELQX8hBCAHQUBrQf8BcSIDQT1LDQEgA0ECdEGU9gFqKAIAIgYgAU4NASAGQQFrIQggACAGakEBaiEBIAcgBkHz9QFqLQAAcSEDQQAhAANAIAAgBkcEQCAFLAAAIgRBv39KBEBBfw8FIARBP3EgA0EGdHIhAyAAQQFqIQAgBUEBaiEFDAILAAsLQX8hBCADIAhBAnRBgPYBaigCAEkNAQsgAiABNgIAIAMhBAsgBAsLACAAIAFBABDpBQsJACAAQQEQrQELugEBAn8CQAJAIAJC/////wdYBEAgACABIAKnQYCAgIB4chBuIgRBAEwNASAAIAEgAhBOIgJCgICAgHCDQoCAgIDgAFINAkF/IQQMAgsgACACEIsDIgVFBEBBfyEEDAELAkAgACABIAUQbiIEQQBMBEBCgICAgDAhAgwBCyAAIAEgBSABQQAQESICQoCAgIBwg0KAgICA4ABSDQBBfyEECyAAIAUQEAwBC0KAgICAMCECCyADIAI3AwAgBAsbAQF/IAAgARA1BH9BAAUgAEH7OUEAEBJBfwsLYwEBfyACQiCIp0F1TwRAIAKnIgUgBSgCAEEBajYCAAsCQCAAIAEgAhDTBSIFDQACQCABKAIAIgBBAEgEQCAAIARqIgBBACAAQQBKGyEDDAELIAAgA0wNAQsgASADNgIACyAFCxgAIAAtAABBIHFFBEAgASACIAAQlwQaCwsPACAAKAJAQYACaiABEA4LrgIAAkACQAJAAkAgAkEDTARAAkACQAJAAkACQAJAAkACQAJAIAFB2ABrDgkAAQIDBAUGBwgKCyAAIAJBO2tB/wFxEA4PCyAAIAJBN2tB/wFxEA4PCyAAIAJBM2tB/wFxEA4PCyAAIAJBL2tB/wFxEA4PCyAAIAJBK2tB/wFxEA4PCyAAIAJBJ2tB/wFxEA4PCyAAIAJBI2tB/wFxEA4PCyAAIAJBH2tB/wFxEA4PCyAAIAJBG2tB/wFxEA4PCyACQf8BSw0BAkACQAJAIAFB2ABrDgMAAQIECyAAQcIBEA4MBQsgAEHDARAODAQLIABBxAEQDgwDCyABQSJGDQELIAAgAUH/AXEQDiAAIAJB//8DcRAmDwsgACACQRJrQf8BcRAODwsgACACQf8BcRAOCzgBAX8CQAJAIAFCgICAgHBUDQAgAaciAy8BBiACRw0AIAMoAiAiAw0BCyAAIAIQigNBACEDCyADC0EBAX8gAQRAA0AgAiADRkUEQCAAIAEgA0EDdGooAgQQECADQQFqIQMMAQsLIAAoAhAiAEEQaiABIAAoAgQRAAALCywBAX8gACgCECICQRBqIAEgAigCABEDACICBEAgAkEAIAEQLA8LIAAQcCACC20BAX8jAEGAAmsiBSQAIARBgMAEcSACIANMckUEQCAFIAFB/wFxIAIgA2siA0GAAiADQYACSSIBGxAsGiABRQRAA0AgACAFQYACEFcgA0GAAmsiA0H/AUsNAAsLIAAgBSADEFcLIAVBgAJqJAALvgECAn4BfwJAAkAgAUKAgICAcINCgICAgDBRBEAgACgCKCACQQN0aikDACIDQiCIp0F0Sw0BDAILIAAgAUE8IAFBABARIgNCgICAgHCDQoCAgIDgAFEEQCADDwsgA0L/////b1YNASAAIAMQDCAAIAEQ/AIiBUUEQEKAgICA4AAPCyAFKAIoIAJBA3RqKQMAIgNCIIinQXVJDQELIAOnIgUgBSgCAEEBajYCAAsgACADIAIQRyEEIAAgAxAMIAQLDAAgAEHZ6gBBABASCw0AIAAgASABED0Q6gELdQEBfiAAIAEgBH4gAiADfnwgA0IgiCICIAFCIIgiBH58IANC/////w+DIgMgAUL/////D4MiAX4iBUIgiCADIAR+fCIDQiCIfCABIAJ+IANC/////w+DfCIBQiCIfDcDCCAAIAVC/////w+DIAFCIIaENwMAC1ABAX4CQCADQcAAcQRAIAEgA0FAaq2GIQJCACEBDAELIANFDQAgAiADrSIEhiABQcAAIANrrYiEIQIgASAEhiEBCyAAIAE3AwAgACACNwMIC2QAAkACQCABQQBIDQAgACgCrAIgAUwNACAAKAKkAiABQRRsaiIAIAAoAgAgAmoiADYCACAAQQBIDQEgAA8LQdwXQajsAEHzpwFBr8MAEAAAC0HphQFBqOwAQfanAUGvwwAQAAALcAECfyAEIAMoAgBKBH8jAEEQayIFJAAgACABKAIAIAQgAygCAEEDbEECbSIAIAAgBEgbIgAgAmwgBUEMahCnASIEBH8gAyAFKAIMIAJu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EGsiBCQAAkAgAkIgiKciA0ECTQRAIAEgAqe3OQMAQQAhAwwBCyADQQdrQW1NBEAgASACQoCAgIDAgYD8/wB8NwMAQQAhAwwBCwJ/IAAgAhCWASICQoCAgIBwg0KAgICA4ABRBEBEAAAAAAAA+H8hBUF/DAELAnwCQAJAQQcgAkIgiKciAyADQQdrQW5JGyIDQXZHBEAgA0EHRg0CIAMNASACp7cMAwsgAqdBBGogBEEIahCxBCAAIAIQDCAEKwMIIQVBAAwDCxABAAsgAkKAgICAwIGA/P8AfL8LIQVBAAshAyABIAU5AwALIARBEGokACADC90BAQN/AkAgAUKAgICAcFoEQCABpyEDA0ACQCADLQAFQQRxRQ0AIAAoAhAoAkQgAy8BBkEYbGooAhQiBEUNACAEKAIQIgRFDQAgAyADKAIAQQFqNgIAIAAgA61CgICAgHCEIgEgAiAEERMAIQUgACABEAwgBQ8LIAMgAygCAEEBajYCACAAQQAgAyACEEMhBCAAIAOtQoCAgIBwhBAMIAQNAgJAIAMvAQZBFWtB//8DcUEKSw0AIAAgAhCTAyIERQ0AIARBH3UPCyADKAIQKAIsIgMNAAsLQQAhBAsgBAvNCQIEfwV+IwBB8ABrIgYkACAEQv///////////wCDIQkCQAJAIAFQIgUgAkL///////////8AgyIKQoCAgICAgMD//wB9QoCAgICAgMCAgH9UIApQG0UEQCADQgBSIAlCgICAgICAwP//AH0iC0KAgICAgIDAgIB/ViALQoCAgICAgMCAgH9RGw0BCyAFIApCgICAgICAwP//AFQgCkKAgICAgIDA//8AURtFBEAgAkKAgICAgIAghCEEIAEhAwwCCyADUCAJQoCAgICAgMD//wBUIAlCgICAgICAwP//AFEbRQRAIARCgICAgICAIIQhBAwCCyABIApCgICAgICAwP//AIWEUARAQoCAgICAgOD//wAgAiABIAOFIAIgBIVCgICAgICAgICAf4WEUCIFGyEEQgAgASAFGyEDDAILIAMgCUKAgICAgIDA//8AhYRQDQEgASAKhFAEQCADIAmEQgBSDQIgASADgyEDIAIgBIMhBAwCCyADIAmEUEUNACABIQMgAiEEDAELIAMgASABIANUIAkgClYgCSAKURsiCBshCiAEIAIgCBsiDEL/////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/wBWGwsQTgtTAQF/IAAoAhAiBEEQaiABIAIgBCgCCBEBACIBIAJFckUEQCAAEHAgAQ8LIAMEQCADIAEgACgCECgCDBEFACIAIAJrIgJBACAAIAJPGzYCAAsgAQsNACAAQQAgAUEAEJoDC/kBAgN+An8jAEEQayIFJAACfiABvSIEQv///////////wCDIgJCgICAgICAgAh9Qv/////////v/wBYBEAgAkI8hiEDIAJCBIhCgICAgICAgIA8fAwBCyACQoCAgICAgID4/wBaBEAgBEI8hiEDIARCBIhCgICAgICAwP//AIQMAQsgAlAEQEIADAELIAUgAkIAIAKnZ0EgaiACQiCIp2cgAkKAgICAEFQbIgZBMWoQYiAFKQMAIQMgBSkDCEKAgICAgIDAAIVBjPgAIAZrrUIwhoQLIQIgACADNwMAIAAgAiAEQoCAgICAgICAgH+DhDcDCCAFQRBqJAALKgEBfyMAQRBrIgMkACADIAI2AgwgACABIAJBpANBABCUBBogA0EQaiQAC0cAIAAgAUkEQCAAIAEgAhAeGg8LIAIEQCAAIAJqIQAgASACaiEBA0AgAEEBayIAIAFBAWsiAS0AADoAACACQQFrIgINAAsLCyABAX4gACAAIAIgASADQQRBABCCASIFIAEgBBC/ASAFC4sMAQZ/IwBBIGsiAyQAAkACQAJAAkACQAJ/IAAoAhAiAkGDf0cEQEEAIAJBV0cNARogACgCQCIELQBsQQFxRQRAIABBl+AAQQAQEwwDCyAEKAJkRQRAIABB6jtBABATDAMLQX8hBSAAEA8NBQJAAkACQAJAIAAoAhAiBEEpaw4EAgEBAgALIARB3QBGIARBOmtBAklyIARB/QBGcg0BCyAAKAIwDQBBACECIARBKkYEQCAAEA8NCEEBIQILIAAgARCtAUUNAQwHCyAAQQYQDUEAIQILIAAoAkAtAGwhASACBEAgABAtIQUgABAtIQIgAEGAAUH/ACABQQNGGxANIABBDhANIABBBhANIABBBhANIAAgBRAaIABBhgEQDSABQQNHIgdFBEAgAEGMARANCyAAQYMBEA0gAEHCABANIABB6gAQFyAAQesAQX8QGCEGIAAgAhAaQYoBIQQgACAHBH9BigEFIABBwQAQDSAAQcEAEBdBiwELEA0gAEEREA0gAEHrAEF/EBghBCAA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AqcQvAJFIQQMBgsgAacgAqdGIAVBeEZxIQQMBQsgBUF/Rw0EIAGnIAKnRiEEDAQLIAGntyEIIAVBB0cEQCAFDQQgAqe3DAILIAJCgICAgMCBgPz/AHy/DAELIAFCgICAgMCBgPz/AHy/IQggBQRAIAVBB0cNAyACQoCAgIDAgYD8/wB8vwwBCyACp7cLIQkCQCADBEACQAJAIAi9IgFC////////////AIMiAkKBgICAgICA+P8AWgRAIAm9Qv///////////wCDQoGAgICAgID4/wBUIQQMAQsgCb0iCkL///////////8Ag0KBgICAgICA+P8AVA0BCyAEIAJCgICAgICAgPj/AFZzIQQMBQsgA0ECRw0BCyAIIAlhIQQMAwsgASAKUSEEDAILIAVBdkcNACAAIAdBHGoiBiABEK0CIgMgACAHQQhqIAIQrQIiBRC9AiEEIAMgBkYEQCAGEBkLIAUgB0EIaiIDRw0AIAMQGQsgACABEAwgACACEAwLIAdBMGokACAECy8BAX8jAEHQAGsiAyQAIAMgACADQRBqIAEQgQE2AgAgACACIAMQEiADQdAAaiQACw0AIAAgASABED0QnQMLHQEBfyAAIAFB/wFxEA4gACgCBCEDIAAgAhAbIAMLEgAgACABIAIgAyAEQZQDELEDC1IBAX8gACgCDCIDRQRAQQAPCyAAIAAoAghB/////wNBgYCAgHwgASABQYGAgIB8TBsiASABQf////8DThtqNgIIIABB/////wMgAiADQQAQ3AILHwEBfyAAKAIMIgNFBEBBAA8LIAAgASACIANBABDcAgsgACABQgA3AgwgAUKAgICAgICAgIB/NwIEIAEgADYCAAtmAQF/An9BACAAKAIIIgIgAU8NABpBfyAAKAIMDQAaIAAoAhQgACgCACACQQNsQQF2IgIgASABIAJJGyIBIAAoAhARAQAiAkUEQCAAQQE2AgxBfw8LIAAgATYCCCAAIAI2AgBBAAsLZwECfwJAIAFCgICAgHBUDQAgAaciAy8BBkEEayIEQR1LQQEgBHRBz4CAgAJxRXINACAAIAMpAyAQDCADIAI3AyAPCyAAIAIQDCABQoCAgIBwg0KAgICA4ABSBEAgAEHu0gBBABASCwshAQF/IAAgASAAIAIQtgEiAiADIAQQFSEFIAAgAhAQIAULRwIBfgF/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PEdxRQRAIAAgBigCNBCeAQsgACAEEBoLIAAgBigCMCAGKAIsIAYoAjQgBigCPEEBIAwQwQELIAAoAhBB3QBGDQAgB0Glf0YEQEGQ0wAhCAwECyAAQSwQKEUNAQwFCwsgAEGFARANIAAoAkAiASABKAKwAigCADYCsAIgABAPDQMLAkAgBUUNACAAKAIQQT1HDQBBfyEHIABB7ABBfxAYIQEgABAPDQQgACAKEBogAwRAIABBDhANCyAAEFMNBCAAQewAIAsQGBogACABEBpBASEHDAQLIANFBEAgAEHDPUEAEBMMAwsgACgCQCgCgAIgDWpBswEgDiANaxAsGiAAKAJAKAKkAiAKQRRsaiIAIAAoAgBBAWs2AgBBACEHDAMLIAAgCEEAEBMMAQsgACgCACAGKAI0EBALQX8hBwsgBkFAayQAIAcLKwAgACgCQCgCpAFBAE4EQCAAQQYQDSAAQdkAEA0gACAAKAJALwGkARAUCwsTACAAIAEgAiADIARBAEEAEN0BC6YBAQF/IwBBEGsiAyQAIAMgAjcDCAJAIAAgAUGHASABQQAQESICQoCAgIBwg0KAgICA4ABRDQAgACACEDUEQCAAIAIgAUEBIANBCGoQNiICQv////9vViACQoCAgICwf4NCgICAgCBRcg0BIAAgAhAMIABBpcEAQQAQEkKAgICA4AAhAgwBCyAAIAIQDCAAIAEgACADQQhqEIoFIQILIANBEGokACACC6MBAgN/AX4gAEEQaiECIAEoAgAiBEEBaiEDAkAgACkCBCIFQoCAgIAIg1BFBEAgAiAEQQF0ai8BACIAQYD4A3FBgLADRyADIAWnQf////8HcU5yDQEgAiADQQF0ai8BACICQYD4A3FBgLgDRw0BIABBCnRBgPg/cSACQf8HcXJBgIAEaiEAIARBAmohAwwBCyACIARqLQAAIQALIAEgAzYCACAACxIAIAFB2AFOBEAgACABEIYFCwthACAAIAEgAkKAgICACHxC/////w9YBH4gAkL/////D4MFQoCAgIDAfiACub0iAkKAgICAwIGA/P8AfSACQv///////////wCDQoCAgICAgID4/wBWGwsgAyAEQQdyEJQBCzkAIABB/wBNBEAgAEEDdkH8////AXFBsP8BaigCACAAdkEBcQ8LIABBfnFBjMAARiAAEJYGQQBHcgs1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QfD//wFxayIYJAAgBSEVIAYEQCAHIAQgByAIGyIIQQAgCEEAShsiCGsiCUEAIAcgCU8bIREDQAJAIAggCkYEQANAIAggEUYNAiAYIAhBA3RqQoCAgIAwNwMAIAhBAWohCAwACwALIAUgCkEDdCIJaikDACIBQiCIp0F1TwRAIAGnIhUgFSgCAEEBajYCAAsgCSAYaiABNwMAIBFBAWohESAKQQFqIQoMAQsLIA4gBzYCVCAYIRULIA4gFTYCQCAOIBggBkEDdGoiETYCREEAIQgDQCAIIBdHBEAgESAIQQN0akKAgICAMDcDACAIQQFqIQgMAQsLIBIoAhQhBiAOIBYoAowBNgIwIBYgDkEwaiIUNgKMASASKAIwIQkgESAXQQN0aiIIIRcLQQAMAQtBAQshBwNAAkACQAJAAkAgB0UEQCAEQQN0ISMgA0KAgICAcIMhOyARQQhqIRogEUEQaiEbIBFBGGohHCAVQQhqIR0gFUEQaiEeIBVBGGohHyAUQRhqISQgAkIgiKciIEF+cSElIANCIIinISYgBK0hOiADpyEhIA5BMGohJyAOQegAaiEiIAghBwJAA0ACQCAGQQFqIQxCgICAgDAhNQJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJA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AAsgCCABNwMQIAhBGGohBwzeAQsgCCAIQQhrIgYpAwA3AwAgCEEQaykDACIBQiCIp0F1TwRAIAGnIgcgBygCAEEBajYCAAsgBiABNwMAIAhBCGohBwzdAQsgCCAIQQhrIgYpAwAiATcDACAGIAhBEGsiBikDADcDACABQiCIp0F1TwRAIAGnIgcgBygCAEEBajYCAAsgBiABNwMAIAhBCGohBwzcAQsgCCAIQQhrIgYpAwAiATcDACAIQRBrIgcpAwAhNSAHIAhBGGsiBykDADcDACAGIDU3AwAgAUIgiKdBdU8EQCABpyIGIAYoAgBBAWo2AgALIAcgATcDACAIQQhqIQcM2wELIAggCEEIayIGKQMAIgE3AwAgCEEQayIHKQMAITUgByAIQRhrIgcpAwA3AwAgBiA1NwMAIAcgCEEgayIGKQMANwMAIAFCIIinQXVPBEAgAaciByAHKAIAQQFqNgIACyAGIAE3AwAgCEEIaiEHDNoBCyAIQRBrIgYpAwAhASAGIAhBGGsiBikDADcDACAGIAE3AwAM0wELIAhBGGsiBikDACEBIAYgCEEQayIGKQMANwMAIAhBCGsiBykDACE1IAcgATcDACAGIDU3AwAM0gELIAhBIGsiBikDACEBIAYgCEEYayIGKQMANwMAIAhBEGsiBykDACE1IAcgCEEIayIHKQMANwMAIAYgNTcDACAHIAE3AwAM0QELIAhBKGsiBikDACEBIAYgCEEgayIGKQMANwMAIAhBGGsiBykDACE1IAcgCEEQayIHKQMANwMAIAYgNTcDACAHIAhBCGsiBikDADcDACAGIAE3AwAM0AELIAhBCGsiBikDACEBIAYgCEEQayIGKQMANwMAIAhBGGsiBykDACE1IAcgATcDACAGIDU3AwAMzwELIAhBEGsiBikDACEBIAYgCEEYayIGKQMANwMAIAhBIGsiBykDACE1IAcgATcDACAGIDU3AwAMzgELIAhBEGsiBikDACEBIAYgCEEYayIGKQMANwMAIAhBIGsiBykDACE1IAcgCEEoayIHKQMANwMAIAYgNTcDACAHIAE3AwAMzQELIAhBCGsiBikDACEBIAYgCEEQayIGKQMANwMAIAYgATcDAAzMAQsgCEEgayIGKQMAIQEgBiAIQRBrIgYpAwA3AwAgCEEIayIHKQMAITUgByAIQRhr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xH4iAUIAUg0EIA0gD3JBAE4NBSALQoCAgIDA/v8DNwMADA0LIAtCgICAgMB+IA+3IA23o70iAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGzcDAAwMCyANQQBKIA9BAE5xRQRAIAsCfiAPtyANtxCZBCI8vSIBAn8gPJlEAAAAAAAA4EFjBEAgPKoMAQtBgICAgHgLIgq3vVEEQCAKrQwBC0KAgICAwH4gAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGws3AwAMDAsgDyANcK0hAQwCCyAPtyE8IAsCfgJ8IA23Ij29QoCAgICAgID4/wCDQoCAgICAgID4/wBRBEBEAAAAAAAA+H8gPJlEAAAAAAAA8D9hDQEaCyA8ID0QowMLIjy9IgECfyA8mUQAAAAAAADgQWMEQCA8qgwBC0GAgICAeAsiCre9UQRAIAqtDAELQoCAgIDAfiABQoCAgIDAgYD8/wB9IAFC////////////AINCgICAgICAgPj/AFYbCzcDAAwKCyA1xCABxH0hAQsgAUKAgICACHxC/////w9WDQEgASE2CyA2Qv////8PgwwBC0KAgICAwH4gAbm9IgFCgICAgMCBgPz/AH0gAUL///////////8Ag0KAgICAgICA+P8AVhsLNwMADAULIBBBdkcgD0F2R3FFBEAgCSAKIAsgNSABIAkoAhAoAqwCESMADQcMBQsgCSAHQQhqIDUQbQ0FIAkgByABEG0NBgsCQAJAAkACQCAKQZsBaw4GAAECBAUDBAsgBysDCCAHKwMAogwFCyAHKwMIIAcrAwCjDAQLIAcrAwggBysDABCZBAwDCyAHKwMIITwgBysDACI9vUKAgICAgICA+P8Ag0KAgICAgICA+P8AUQRARAAAAAAAAPh/IDyZRAAAAAAAAPA/YQ0DGgsgPCA9EKMDDAILEAEACyAHKwMIIAcrAwChCyE8IAtCgICAgMB+IDy9IgFCgICAgMCBgPz/AH0gAUL///////////8Ag0KAgICAgICA+P8AVhs3AwALQQAMAgsgCSABEAwLIAtCgICAgDA3AwAgDUKAgICAMDcDAEF/CyEwIAdBEGokACAwDUsgCEEIayEHDEcLIAhBBGsoAgAiB0UgB0EHa0FuSXINQCAIIQcgCSAIQY4BEOEBRQ1GDEoLAkACfCAIQQhrIgcpAwAiAUIgiKciCkUEQEQAAAAAAAAAgCABpyIGRQ0BGkQAAAAAAADgQSAGQYCAgIB4Rg0BGiAHQgAgAX1C/////w+DNwMADEILIApBB2tBbUsNASABQoCAgIDA/v8Dfb8LITwgB0KAgICAwH4gPL0iAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGzcDAAxACyAIIQcgCSAIQY0BEOEBRQ1FDEkLIAhBCGsiBykDACIBQv////8PViABQv////8HUXJFBEAgByABQgF8Qv////8PgzcDAAw/CyAIIQcgCSAIQZABEOEBRQ1EDEgLIAhBCGsiBykDACIBQv////8PViABQoCAgIAIUXJFBEAgByABQgF9Qv////8PgzcDAAw+CyAIIQcgCSAIQY8BEOEBRQ1DDEcLIAkgCEEIayIHKQMAEGUiAUKAgICAcINCgICAgOAAUQRAIAdCgICAgDA3AwAMRwsgByABNwMAIAFCIIinQXVPBEAgAaciByAHKAIAQQFqNgIACyAIIAE3AwAgCSAIQQhqIgcgCkECaxDhAUUNQgxGCyAGQQJqIQwgESAGLQABQQN0aiIHKQMAIgFC/////w9WIAFC/////wdRckUEQCAHIAFCAXxC/////w+DNwMADDwLIAFCIIinQXVPBEAgAaciCiAKKAIAQQFqNgIACyAOIAE3A2AgCSAiQZABEOEBDUUgCSAHIA4pA2AQHQw7CyAGQQJqIQwgESAGLQABQQN0aiIHKQMAIgFC/////w9WIAFCgICAgAhRckUEQCAHIAFCAX1C/////w+DNwMADDsLIAFCIIinQXVPBEAgAaciCiAKKAIAQQFqNgIACyAOIAE3A2AgCSAiQY8BEOEBDUQgCSAHIA4pA2AQHQw6CyAIQQhrIgcpAwAiAUL/////D1gEQCAHIAFC/////w+FNwMADDoLIAghByMAQRBrIgokAAJ/AkACQCAJIAhBCGsiCykDABBlIgFCgICAgHCDIjVCgICAgOAAUQ0AIDVCgICAgOB+UQRAIAkgC0GWASABIAkoAhAoAqgCER8ADQEMAgsgCSAKQQxqIAEQlQENACALIAo1AgxC/////w+FNwMADAELIAtCgICAgDA3AwBBfwwBC0EACyExIApBEGok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//8AgyIGQoCAgICAgMD//wBWIAZCgICAgICAwP//AFEbDQAgACAChCAFIAaEhFAEQEEADwsgASADg0IAWQRAQX8hBCAAIAJUIAEgA1MgASADURsNASAAIAKFIAEgA4WEQgBSDwtBfyEEIAAgAlYgASADVSABIANRGw0AIAAgAoUgASADhYRCAFIhBAsgBAuhAgEFfwNAAkACQAJAAkACfyACIAdMIgkgBCAGTHJFBEAgASAHQQJ0aigCACIIIAMgBkECdGooAgAiCUkEQCAIDAILIAggCUcNAyAGQQFqIQYgB0EBaiEHIAghCQwECyAJDQEgASAHQQJ0aigCAAshCSAHQQFqIQcMAgsgBCAGTA0CIAMgBkECdGooAgAhCQsgBkEBaiEGCwJ/AkACQAJAAkAgBQ4DAwABAgsgBiAHcUEBcQwDCyAGIAdzQQFxDAILEAEACyAGIAdyQQFxCyAAKAIAIghBAXFGDQEgACgCBCAITARAIAAgCEEBahDRAgRAQX8PCyAAKAIAIQgLIAAgCEEBajYCACAAKAIIIAhBAnRqIAk2AgAMAQsLIAAQmAZBAAvmAQAgAAJ/IAEoAggiAEH+////B04EQEEAIAJBAXENARpB/////wcgAEH+////B0cNARogASgCBEH/////B2oMAQtBACAAQQBMDQAaIABBH00EQEEAIAEoAhAgASgCDEECdGpBBGsoAgBBICAAa3YiAGsgACABKAIEGwwBCyACQQFxRQRAQf////8HIAEoAgRFDQEaQYCAgIB4IABBIEcNARogASgCECABKAIMQQJ0akEEaygCABpBgICAgHgMAQtBACABKAIQIAEoAgwiAiACQQV0IABrEHEiAGsgACABKAIEGws2AgALEgAgACABIAIgAyAEQZMDELEDCw4AIABBACABQRByELoBC58BAgR/An4gAzUCACEJA0AgAiAFRkUEQCAAIAVBAnQiB2ogBq0gASAHajUCACAJfnwiCj4CACAFQQFqIQUgCkIgiKchBgwBCwsgACACQQJ0IgdqIAY2AgBBASAEIARBAU0bIQRBASEFA0AgBCAFRkUEQCAAIAVBAnQiBmoiCCAHaiAIIAEgAiADIAZqKAIAEL0ENgIAIAVBAWohBQwBCwsLWgEFfyADQQAgA0EAShshBgNAIAUgBkcEQCAAIAVBAnQiA2ogASAD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gICAgOAAUg0AIAEhAgwBCwJAIAKnIgUpAgQiCkL/////B4NQDQAgAaciAykCBCELAkAgAygCAEEBRyAKIAuFQoCAgIAIg0IAUnINACADIAAoAhAoAgwRBQAgBSkCBCIKpyIEQf////8HcSIHIAMpAgQiC6ciBkH/////B3EiCGogBEEfdnQgBkEfdiIJQRFzakkNACAFQRBqIQYgA0EQaiEEIAkEQCAEIAhBAXRqIAYgB0EBdBAeGiADIAMpAgQiCiAFKQIEfEL/////B4MgCkKAgICAeIOENwIEDAILIAQgCGogBiAHEB4aIAMgAykCBCIKIAUpAgR8Qv////8HgyILIApCgICAgHiDhDcCBCAEIAunakEAOgAADAELAn4CQAJAIAunQf////8HcSAKp0H/////B3FqIgdBgICAgARPBEAgAEHkyABBABA6DAELIAAgByAKIAuEpyIGQR92EOkBIggNAQtCgICAgOAADAELIAhBEGohBAJAIAZBAE4EQCAEIANBEGogAygCBEH/////B3EQHiIEIAMoAgRB/////wdxaiAFQRBqIAUoAgRB/////wdxEB4aIAQgB2pBADoAAAwBCyAEIAMgAygCBEH/////B3EQkwUgBCADKAIEQQF0aiAFIAUoAgRB/////wdxEJMFCyAIrUKAgICAkH+ECyEKIAAgARAMDAELIAEhCgsgACACEAwgCgsPACAAIAFCgICAgDAQggILCwAgAEGfCUEAEBILjgIBA38jAEEQayIFJAAgBSAAOQMIIAUgAUEBayIHNgIAIAZBgAFB9t8AIAUQSBogAyAGLQAAQS1GNgIAIAQgBi0AAToAACABQQJOBEAgBEEBaiAGQQNqIAcQHhoLIAEgBGpBADoAACACIQkgASAGaiABQQFKakECaiEBA0AgASICQQFqIQEgAiwAACIDEI8GDQALQQEhBAJAAkACQCADQf8BcUEraw4DAQIAAgtBACEECyABLAAAIQMgASECC0EAIQEgA0EwayIDQQlNBEADQCABQQpsIANrIQEgAiwAASEIIAJBAWohAiAIQTBrIgNBCkkNAAsLIAlBACABayABIAQbQQFqNgIAIAVBEGokAAuADAIHfwV+IwBBoANrIgUkAAJAIAG9IgxCgICAgICAgPj/AINCgICAgICAgPj/AFEEQCAMQv///////////wCDQoGAgICAgID4/wBaBEAgBUHOwrkCNgKgAgwCCyAFQaACaiICIQMgAUQAAAAAAAAAAGMEQCAFQS06AKACIAJBAXIhAwsgA0HZCy0AADoACCADQdELKQAANwAADAELAkACQAJAIARFBEACfiABmUQAAAAAAADgQ2MEQCABsAwBC0KAgICAgICAgIB/CyINQoCAgICAgIAQfUKBgICAgICAYFQgDbkgAWJyDQEgBUEAOgDlASANIA1CP4ciDIUgDH0hDCACrSEOIAVB5QFqIQIDQCACIgNBAWsiAiAMIAwgDoAiDyAOfn2nIgRBMHIgBEHXAGogBEEKSRs6AAAgDCAOWiELIA8hDCALDQALIA1CAFMEQCADQQJrIgJBLToAAAsgBUGgAmogAhCHBgwEC0QAAAAAAAAAACABIAFEAAAAAAAAAABhGyEBIARBAkYEQEEAIQICQCAFQaACaiIEIAEgA0EBaiIHQQAQiQMgBWotAJ8CQTVHDQAgBCABIAdBgAgQiQMiBiAFQaABaiIIIAEgB0GAEBCJA0cNACAEIAggBhBoDQBBgAhBgBAgBS0AoAJBLUYbIQILIAVBoAJqIAEgAyACEIkDGgwECyAEQQNxQQFGDQELIAVBnwFqIQZBESEHQQEhAgNAIAIgB08EQEEAIQJBFSEDDAMLIAEgAiAHakEBdiIDIAVBHGogBUEgaiAFQaABakEAIAVBoAJqIggQuQIgCBCABiABYQRAQQEgAyADQQBKGyEHA0AgA0ECSA0CIAMgBmotAABBMEcEQCADIQcMAwUgA0EBayEDDAELAAsABSADQQFqIQIMAQsACwALQQAhAiABIANBAWoiByAFQRxqIgkgBUEYaiIKIAVBoAFqIgZBACAFQaACaiIIELkCAkAgAyAGai0AAEE1Rw0AIAEgByAJIAogBkGACCAIELkCIAEgByAFQRRqIAVBEGogBUEgaiIJQYAQIAgQuQIgBiAJIAcQaA0AIAUoAhwgBSgCFEcNAEGACEGAECAFKAIYGyECCyADIQcLIAEgByAFQRxqIAVBIGogBUGgAWogAiAFQaACaiICELkCIAUoAiAEQCAFQS06AKACIAJBAXIhAgsgBSgCHCEGAkAgBEEEcQ0AIAMgBkggBkEATHJFBEAgBiAHTgRAQQAhAyAGIAdrIgRBACAEQQBKGyEEIAIgBUGgAWogBxAeIAdqIQIDQCADIARHBEAgAkEwOgAAIANBAWohAyACQQFqIQIMAQsLIAJBADoAAAwDCyACIAVBoAFqIAYQHiAGaiICQS46AABBACEDIAcgBmsiBEEAIARBAEobIQQDQCACQQFqIQIgAyAERwRAIAIgBUGgAWogAyAGamotAAA6AAAgA0EBaiEDDAELCyACQQA6AAAMAgsgBkEFakEFSw0AIAJBsNwAOwAAQQAhA0EAIAZrIQQgAkECaiECA0AgAyAERwRAIAJBMDoAACADQQFqIQMgAkEBaiECDAELCyACIAVBoAFqIAcQHiAHakEAOgAADAELIAIgBS0AoAE6AAACQCAHQQJIBEAgAkEBaiECDAELIAJBLjoAASACQQJqIQJBASEDA0AgAyAHRg0BIAIgBUGgAWogA2otAAA6AAAgA0EBaiEDIAJBAWohAgwACwALIAJB5QA6AAAgBkEBayEDIAZBAEwEfyACQQFqBSACQSs6AAEgAkECagshAiAFIAM2AgAjAEEQayIEJAAgBCAFNgIMIwBBoAFrIgMkACADQQhqIgdBgNIEQZABEB4aIAMgAjYCNCADIAI2AhwgA0H/////B0F+IAJrIgYgBkH/////B0sbIgY2AjggAyACIAZqIgY2AiQgAyAGNgIYIAdB7usAIAUQkwQgAkF+RwRAIAMoAhwiAiACIAMoAhhGa0EAOgAACyADQaABaiQAIARBEGokAAsgACAFQaACahBgIRAgBUGgA2okACAQCykBAX8gAUIgiKdBdU8EQCABpyIDIAMoAgBBAWo2AgALIAAgASACEJIBC00BAX8CQCAAIAEgACgCBEH/////B3EiACABKAIEQf////8HcSICIAAgAkgbEOoFIgENAEEAIQEgACACRg0AQX9BASAAIAJJGyEBCyABCwoAIAAgARC1A0ULiwMCA38BfCMAQSBrIgQkAAJAAkACQAJAAkAgAkIgiKciBUEDTwRAIAVBdkcNASAEQRxqIAKnQQRqIgNBARDtASAAKALYASAEQQhqIgUQuwEgBSAENQIcEDIaIAUgAxC9AiEGIAUQGSAAIAIQDCAGRQ0CDAQLIAKnIgNBAEgNASAEIAM2AhwMAwsgBUEHa0FtTQRAIAQCfyACQoCAgIDAgYD8/wB8vyIHRAAAAAAAAPBBYyAHRAAAAAAAAAAAZnEEQCAHqwwBC0EACyIDNgIcIAcgA7hhDQMMAQsgAwRAQX8hAyAAIAIQlgEiAkKAgICAcINCgICAgOAAUQ0EIAAgBEEcaiACQQEQvgJFDQMMBAsgACAEQRxqIAIQdQRAIAAgAhAMDAILQX8hAyAAIAIQlgEiAkKAgICAcINCgICAgOAAUQ0DIAAgBEEEaiACQQAQvgINAyAEKAIEIAQoAhxGDQILIABBiscAQQAQRAtBfyEDDAELIAEgBCgCHDYCAEEAIQMLIARBIGokACADC0ABAX4gABDiASICQoCAgIBwg0KAgICA4ABSBEAgAqdBBGogARCcAkUEQCACDwsgACACEAwgABBwC0KAgICA4AALMgEBfyMAQdAAayICJAAgAiAAIAJBEGogARCBATYCACAAQbzpACACEMMCIAJB0ABqJAALoAECAX8BfiMAQRBrIgUkACAFIAQ2AgxBfyEEIAAgASAFQQxqENMBRQRAIAMoAgAiAEF8cSABIAIgAygCBCAAQQNxQQJ0QYS3AWooAgARGwAhBiADEOAFIAUoAgwiACAAKAIAQf////8DcTYCACADQoCAgIAwIAYgBkKAgICAcINCgICAgOAAUSIAGzcDAEF/QQAgABshBAsgBUEQaiQAIAQLFQECfiAAIAEQ6AEhAyAAIAEQDCADCw0AIAAgASACQQIQyAIL1QEBA38jAEEQayIFJABBfyEDAkAgACgCFA0AAkACQCABQYCAgIAETgRAIAAoAgBB5MgAQQAQOgwBCyABIAAoAgxBA2xBAm0iBCABIARKGyEBIAAoAhAiBCACQYACSHJFBEAgACABEOADIQMMAwsgACgCACAAKAIEIAEgBHQgBGtBEWogBUEMahCnASICDQELIAAQ9wIMAQsgBSgCDCEDIAAgAjYCBCAAQf////8DIAMgACgCEHYgAWoiACAAQf////8DThs2AgxBACEDCyAFQRBqJAAgAwsqAQF/IAAoAhAiA0EQaiABIAIgAygCCBEBACIBIAJFckUEQCAAEHALIAELgQECAn8BfgJAIAEpAgQiBEL//////////79/VgRAIAEoAgwhAAwBCyAAKAI0IARCIIinIAAoAiRBAWtxQQJ0aiECIAAoAjghAwNAIAMgAigCACIAQQJ0aigCACICIAFGDQEgAkEMaiECIAANAAtBxocBQajsAEH/FEH4DhAAAAsgAAupBwIJfwF+AkACQAJAAn8gAkECTARAIAIgASkCBCIMQj6Ip0YEQCAAIAEQxgIiBEHXAUoNBSABIAEoAgBBAWs2AgAgBA8LIAAoAjQgACgCJEEBayABIAIQ6wVB/////wNxIgdxIgpBAnRqIQMgDKdB/////wdxIQUDQCACIAMoAgAiBEUNAhoCQCAAKAI4IARBAnRqKAIAIgMpAgQiDKdB/////wdxIAVHIAxCPoinIAJHciAMQiCIp0H/////A3EgB0dyDQAgAyABIAUQ6gUNACAEQdgBSA0EIAMgAygCAEEBajYCAAwECyADQQxqIQMMAAsACyACQQNHIQdBAwshBQJAIAAoAjwNAEEAIQQgAEEQaiILIAAoAjhB0wEgACgCLEEDbEECbSICIAJB0wFMGyICQQJ0IAAoAggRAQAiCEUNASAAKAIsIgkhAyAJRQRAIAtBECAAKAIAEQMAIgZFBEAgCyAIIAAoAgQRAAAMAwsgBkKAgICAgICAgEA3AgQgBkEBNgIAIAZBADYADCAIIAY2AgAgACAAKAIoQQFqNgIoQQEhAwsgACADNgI8IAAgCDYCOCAAIAI2AiwgCSACIAIgCUkbIQQgAkEBayEGA0AgAyAERg0BIAAoAjggA0ECdGpBASADQQFqIgJBAXRBAXIgAyAGRhs2AgAgAiEDDAALAAsCQCABBEAgASkCBCIMQv//////////P1gEQCABIAwgBa1CPoaENwIEDAILIABBEGogDKciAkEfdSACQf////8HcSACQR92dGpBEWogACgCABEDACICRQRAQQAhBAwECyACQQE2AgAgAiACKQIEQv////93gyABKQIEQoCAgIAIg4QiDDcCBCACIAxCgICAgHiDIAEpAgRC/////weDhDcCBCACQRBqIAFBEGogASgCBCIDQf////8HcSADQR92dCADQX9zQR92ahAeGiAAIAEQkAQgAiEBDAELIABBEGpBECAAKAIAEQMAIgFFBEBBAA8LIAFCgYCAgICAgICAfzcCAAsgACAAKAI4IAAoAjwiBEECdGoiAigCAEEBdjYCPCACIAE2AgAgASAENgIMIAEgATUCBCAHrUIghoQgBa1CPoaENwIEIAAgACgCKEEBajYCKCAFQQNGDQIgASAAKAI0IApBAnRqIgEoAgA2AgwgASAENgIAIAAo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QQAQEgwBCwJAIARFIAJBAExyRQRAIAAgBSAHQgAgAUF/EPMCDQIMAQsgASEICyACQQAgAkEAShutIQlCACEBA0AgASAJUgRAIAMgAadBA3RqKQMAIgdCIIinQXVPBEAgB6ciAiACKAIAQQFqNgIACyABIAh8IQogAUIBfCEBIAAgBSAKIAcQe0EATg0BDAILCyAAIAVBMCAGQoCAgIAIfCIIQv////8PWAR+IAZC/////w+DBUKAgICAwH4gBrm9IgFCgICAgMCBgPz/AH0gAUL///////////8Ag0KAgICAgICA+P8AVhsLEDlBAEgNACAAIAUQDCAGQv////8PgyAIQv////8PWA0BGkKAgICAwH4gBrm9IgFCgICAgMCBgPz/AH0gAUL///////////8Ag0KAgICAgICA+P8AVhsMAQsgACAFEAxCgICAgOAACyELIAxBEGokACALCxUBAn4gACABEIcFIQMgACABEAwgAwv5DgIKfgR/IwBBEGsiECQAIBAgAjcDCAJAAkACfgJAAkACQAJAAkACQAJAAkACQAJAQQcgAkIgiKciDiAOQQdrQW5JGyIOQQdqDg8EAwMDAwMABQUFAwMDAwECCwJAAkACQAJAIAKnIg4vAQYiD0EEaw4DAQACAwtCgICAgDAhByAAIAIQNCICQoCAgIBwg0KAgICA4ABRDQsgACACEO4DIgJCgICAgHCDQoCAgIDgAFENCyABKAIoIAIQhAEhDgwOC0KAgICAMCEHIAAgAhCWASICQoCAgIBwg0KAgICA4ABRDQogASgCKCACEIQBIQ4MDQsgASgCKCAOKQMgEI0BIQ4gACACEAwMDAsgD0EhRg0HQoCAgIAwIQYgACABKQMIQQEgEEEIahDxAyIEQoCAgIDwAINCgICAgOAAUQ0GIAAgBBAnBEAgAEHJ3wBBABASDAcLIANCIIinQXVPBEAgA6ciDiAOKAIAQQFqNgIACyABKQMYIgRCIIinQXVPBEAgBKciDiAOKAIAQQFqNgIACwJAAkACQAJAIAAgAyAEELYCIghCgICAgHCDQoCAgIDgAFEEQEKAgICAMCEHDAELIAEpAxgiBEKAgICAcINCgICAgJB/UQRAIASnKAIEQf////8HcUUNAwsgCEIgiKdBdU8EQCAIpyIOIA4oAgBBAWo2AgALIABB65YBIAhB7JYB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BEAgAiAANgIAC0EBC4cDAgN+BH8CQCABKAIIIgZB/v///wdOBEBBASEHIAJBAXENAUL///////////8AIQMgBkH+////B0cNASABNAIEQv///////////wB8IQMMAQsgBkEATARADAELIAZBP00EQCABKAIQIAEoAgwiCEECdGoiCUEEaygCACECQgAgBkEgTQR+IAJBICAGa3atBSAIQQJPBH4gCUEIazUCAAVCAAsgAq1CIIaEQcAAIAZrrYgLIgN9IAMgASgCBBshAwwBCyACQQFxRQRAIAEoAgRFBEBC////////////ACEDQQEhBwwCC0KAgICAgICAgIB/IQNBASEHIAZBwABHDQEgASgCECABKAIMIgFBAnRqIgJBBGs1AgBCIIYhBCABQQJPBH4gAkEIazUCAAVCAAsgBIRCgICAgICAgICAf1IhBwwBC0IAIAEoAhAiCCABKAIMIgIgAkEFdCAGayIGEHGtIAggAiAGQSBqEHGtQiCGhCIDfSADIAEoAgQbIQMLIAAgAzcDACAHC60CAgJ/An4jAEEgayICJAACQCAAKAIIQf////8HRgRAQoCAgICAgID8/wAhBAwBCyAAKAIAIQMgAkIANwIYIAJCgICAgICAgICAfzcCECACIAM2AgwgAkEMaiIDIAAQSRoCfiACKAIUIgBB/f///wdMBEAgA0E1QcgEELoBGiACKAIUIQALQoCAgICAgID4/wAgAEH+////B0YNABpCACAAQYCAgIB4Rg0AGiACKAIcIQMCfiACKAIYQQJGBEAgAykCAAwBCyADNQIAQiCGCyEEIABBgnhMBEAgBEGOeCAAa62IIQRCAAwBCyAEQguIQv////////8HgyEEIABB/gdqrUI0hgshBSAEIAWEIAI1AhBCP4aEIQQgAkEMahAZCyABIAQ3AwAgAkEgaiQACw0AIAAgASACQQIQsAMLIwACQAJAAkAgAg4CAAECCyAAIAFyDwsgACABcw8LIAAgAXEL4QgBEX8gAigCBCAFcyIFIAEoAgQiBnMhDQJAIAEgAhDyASIIIA1Fcg0AIAEoAghB/f///wdKDQAgACAEQQdxQQJGEIABQQAPCyAFIAYgCEEASCIGGyEFIAEgAiAGGyEKAkACQAJAIAIgASAGGyIIKAIMIgcEQCAKKAIMIgsNAQsgCCgCCCIBQf7///8H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CyAAIAsQDCAAIAgQDCAAIAoQDCAAIAEQDAwBCyABIQ0LIAVBIGokACANC0sBAn8gACABRwRAIAAoAhAiAgRAIAAoAgAiAygCACACQQAgAygCBBEBABoLIAAgASkCADcCACAAIAEoAhA2AhAgACABKQIINwIICwv0AQIDfgF/AkAgAykDACIEQoCAgIBwWgRAIAMpAwgiBUL/////b1YNAQsgABAiQoCAgIDgAA8LQoCAgIDgACEGIABCgICAgCBBLBBHIgFCgICAgHCDQoCAgIDgAFIEfiAAQRgQJCICRQRAIAAgARAMQoCAgIDgAA8LIASnIgMgAygCAEEBajYCACACIAQ3AwAgBaciByAHKAIAQQFqNgIAIAIgBTcDCCAAIAQQNSEAIAJBADoAESACIAA6ABAgAUKAgICAcFoEQCABpyIAIAI2AiAgACAALQAFQe8BcSADLQAFQRBxcjoABQsgAQVCgICAgOAACwsbACAAEBkgAEIANwIQIABCADcCCCAAQgA3AgALCQAgASACEPgFCxMAIABBEGogASACIAAoAggRAQALqAECAX8CfiAAvSIEQv///////////wCDQoGAgICAgID4/wBaBEAgAb1C////////////AINCgYCAgICAgPj/AFQPC0F/IQICQCAAIAFjDQAgAb0iA0L///////////8Ag0KAgICAgICA+P8AVg0AQQEhAiAAIAFkDQBBACECIABEAAAAAAAAAABiDQAgBEIAUwRAIANCP4enQX9zDwsgA0I/iKchAgsgAgvKBQIFfwN+IwBBMGsiAiQAIAIgATcDECACQQA2AgwgAiAANgIIIAIgAykDACIKNwMYAkACQCAKQoCAgIBwgyILQoCAgIAwUgRAQoCAgIDgACEJIAAgChBVDQELQoCAgIDgACEJIAAgARCKASIFQQBIDQACQCAFQQJJDQAgAaciAy8BBkEVayIEQf//A3FBC08NAiACIARBAnRB/P8PcSIEQZz1AWooAgA2AiBBASADLwEGQcqeAWotAAAiBnQhCCADKAIkIQcgC0KAgICAMFIEQCAAIAVBAnQQJCIERQ0CQQAhAwNAIAMgBUZFBEAgBCADQQJ0aiADNgIAIANBAWohAwwBCwsgAiAINgIoIAIgBzYCJCAEIAVBBEHLACACQQhqENcBAkACQAJAAkAgAigCDA4CAAEDCyAAIAUgBnQiAxAkIgYNAQsgACgCECIAQRBqIAQgACgCBBEAAAwECyAGIAcgAxAeIQZBACEDAkACQAJAAkACQCAIQQFrDggAAQkCCQkJAwkLA0AgAyAFRg0EIAMgB2ogBiAEIANBAnRqKAIAai0AADoAACADQQFqIQMMAAsACwNAIAMgBUYNAyAHIANBAXRqIAYgBCADQQJ0aigCAEEBdGovAQA7AQAgA0EBaiEDDAALAAsDQCADIAVGDQIgByADQQJ0IghqIAYgBCAIaigCAEECdGooAgA2AgAgA0EBaiEDDAALAAsDQCADIAVGDQEgByADQQN0aiAGIAQgA0ECdGooAgBBA3RqKQMANwMAIANBAWohAwwACwALIAAoAhAiA0EQaiAGIAMoAgQRAAALIAAoAhAiAEEQaiAEIAAoAgQRAAAMAQsgByAFIAggBEHI9QFqKAIAIAJBCGoQ1wEgAigCDA0BCyABQiCIp0F1TwRAIAGnIgAgACgCAEEBajYCAAsgASEJCyACQTBqJAAgCQ8LEAEAC+cCAQF+IAAgARCKASICQQBIBEBCgICAgOAADwsCQCACRQ0AAkACQAJAAkACQCABpyIALwEGQcqeAWotAAAOBAABAgMECyAAKAIkIgAgAmohAgNAIAAgAkEBayICTw0FIAAtAAAhAyAAIAItAAA6AAAgAiADOgAAIABBAWohAAwACwALIAAoAiQiACACQQF0aiECA0AgACACQQJrIgJPDQQgAC8BACEDIAAgAi8BADsBACACIAM7AQAgAEECaiEADAALAAsgACgCJCIAIAJBAnRqIQIDQCAAIAJBBGsiAk8NAyAAKAIAIQMgACACKAIANgIAIAIgAzYCACAAQQRqIQAMAAsACyAAKAIkIgAgAkEDdGohAgNAIAAgAkEIayICTw0CIAApAwAhBCAAIAIpAwA3AwAgAiAENwMAIABBCGohAAwACwALEAEACyABQiCIp0F1TwRAIAGnIgAgACgCAEEBajYCAAsgAQtRAgF/AX5CgICAgOAAIQQgACABIAIQayIDBH4gAygCICIDKAIMKAIgLQAEBEAgAkUEQEIADwsgABBfQoCAgIDgAA8LIAM1AhAFQoCAgIDgAAsLNwAgACABIAIQayIARQRAQoCAgIDgAA8LIAAoAiAoAgwiACAAKAIAQQFqNgIAIACtQoCAgIBwhAsMACAAKAIQIAEQ5wML2gEBAn4CQAJAIAJFBEAgAUKAgICAcIMhBSAAQS8QKSEEDAELAn4gAUKAgICAcIMiBUKAgICAMFIgAykDACIEQoCAgIBwg0KAgICAgH9SckUEQCAAQbmMASAAIAAoAhAgBKcQxgIQKUGrjAEQsgEMAQsgACAEECULIgRCgICAgHCDQoCAgIDgAFENAQsgBUKAgICAMFENACAAIAFBBRBeIgFCgICAgHCDQoCAgIDgAFIEQCAAIAEgBBC9ASAAIAFBMCAEpykCBEL/////B4NBABAVGgsgASEECyAEC0YBAX8CQCAAKAIIIAJqIgMgACgCDEoEQCAAIAMgARDEAg0BCwNAIAJBAEwEQEEADwsgAkEBayECIAAgARCHAUUNAAsLQX8LlQECBX8BfiABKQIEIginQf////8HcSIDRQRAIAIPCyAAKAIEQf////8HcSEHAn8gCEKAgICACINQRQRAIAEvARAMAQsgAS0AEAshBSADQQFrIQYgByADayEEAkADQCACIARKDQEgACAFIAIQoAEiA0EASCADIARKcg0BIAAgASADQQFqIgJBASAGELwDDQALIAMPC0F/C6cBAgN/AX4CQAJAIAAgARD2AyIDQQBIDQAgA0UNAUGbHiECIAAgACABQe4AIAFBABARIgVCgICAgHCDIgFCgICAgCBRIAFCgICAgDBRcgR/QZseBSABQoCAgIDgAFENASAAIAUQNCIBQoCAgIBwg0KAgICA4ABRDQFBACECIAGnQecAQQAQoAEhBCAAIAEQDCAEQQBODQJB2ssAC0EAEBILQX8hAgsgAguhAQIDfwF+AkACQCAAKQIEIgRCgICAgAiDUA0AIABBEGohAiAEp0H/////B3EhA0EAIQADQCAAIANODQECQCACIABBAXRqLwEAIgFBgPADcUGAsANHBEAgACEBDAELIAFB/7cDSw0DIABBAWoiASADTg0DIAIgAUEBdGovAQBBgEBrQf//A3FBgPgDSQ0DCyABQQFqIQAMAAsAC0F/IQALIAALVQEBfwJAAkACQCABQiCIp0EBag4DAAECAQsgAaciAi8BBkEGRw0AIAIpAyAiAUKAgICAcINCgICAgBBRDQELIABBlMAAQQAQEkKAgICA4AAhAQsgAQsQAEHOkQEgAEELEJICQQBHC4kB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ADcCECAAQRBqIAIgACgCBBEAAAwBCyACQoCAgIAwNwMoIAJCgICAgDA3AyAgAkEBNgIECyABIAEoAgxBAWs2AgwLC4YBACAAIAEgBEEiahBaIgJFBEBCgICAgOAADwsgACACIAMpAwAiAUIAIAFCIIinQQdrQW5PGyABIAFCgICAgMCBgPz/AHxC////////////AINQGxDyAiIARQRAQoCAgIAwDwsgACkDKCIBQiCIp0F1TwRAIAGnIgAgACgCAEEBajYCAAsgAQu7BQIDfgd/IwBBEGsiCyQAQoCAgIDgACEHAkAgACABIARBImoQWiICRQ0AIAIoAgBFIAMpAwAiBUIAIAVCIIinQQdrQW5PGyAFIAVCgICAgMCBgPz/AHxC////////////AINQGyIFQv////9vVnJFBEAgABAiDAELQoCAgIAwIQYgBEEBcUUEQCADKQMIIQYLAkAgACACIAUQ8gIiAwRAIAAgAykDKBAMDAELIABBMBAkIgNFDQEgAyACNgIIIANCATcDAAJAIAIoAgAEQCADIAWnIgQoAhg2AgwgBCADNgIYDAELIAVCIIinQXVJDQAgBaciBCAEKAIAQQFqNgIACyADIAU3AyAgAigCECIJIAIoAhQiBEEBayAFENkDcUEDdGoiCCgCACIKIANBGGoiDDYCBCADIAg2AhwgAyAKNgIYIAggDDYCACACKAIEIgggA0EQaiIKNgIEIAMgAkEEaiIMNgIUIAMgCDYCECACIAo2AgQgAiACKAIMQQFqIgg2AgwgCCACKAIYSQ0AIAAgCUEEIARBAXQgBEEBRhsiAEEDdCALQQxqEKcBIghFDQAgCygCDEEDdiAAaiEEQQAhAANAIAAgBEZFBEAgCCAAQQN0aiIJIAk2AgQgCSAJNgIAIABBAWohAAwBCwsgBEEBayEKIAJBCGohAANAIAwgACgCACIARwRAIABBDGsoAgBFBEAgCCAAKQMQENkDIApxQQN0aiIJKAIAIg0gAEEIaiIONgIEIAAgCTYCDCAAIA02AgggCSAONgIACyAAQQRqIQAMAQsLIAIgBDYCFCACIAg2AhAgAiAEQQF0NgIYCyAGQiCIp0F1TwRAIAanIgAgACgCAEEBajYCAAsgAyAGNwMoIAFCIIinQXVPBEAgAaciACAAKAIAQQFqNgIACyABIQcLIAtBEGok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AmoQI0UNDAJAIAMoAqgGIgVBAEgEQCADKALYBiEFDAELIAMgBTYC2AYLIAEgAygCxAYgBRAuIANBwAZqQfIBEA4gAygCrAZBAXMhBQwSCyADQX82AogDIANCw/aAgOABNwOAAyADQZwGaiAEIANBgANqECNFDQsCQCADKAKoBiICQQBIBEAgAygC2AYhAgwBCyADIAI2AtgGCyABIAMoAsQGIAIQLiADQcAGaiICIAMtAKwGEA4gAiADKAK8BhAbDBALIANBfzYCuAMgA0LZuP2CcDcDsAMgA0GcBmogBCADQbADahAjRQ0KIAMoAqgGIgJBAE4EQCADIAI2AtgGCyADQo6AgIBwNwOgAyADKAKsBiIFQQFqIQYCQCADQZwGaiADKAKkBiICIANBoANqECMEfyADKAKoBiICQQBOBEAgAyACNgLYBgsgAyADKAKwBjYClANBfyEEIANBfzYCmAMgAyAFQQFrNgKQAyADQZwGaiADKAKkBiICIANBkANqECNFDQEgAygCpAYhAiADKAKoBgVBfwshBCAGIQULIAEgAygCxAYgAygC2AYQLiADQcAGaiAFIAMoArAGEFkgBEEASA0TIAMgBDYC2AYMEwsgBi8AASICQf8BSw0JIANCjoCAgHA3AswEIAMgAjYCyAQgA0KRpYKAkAs3A8AEAkAgA0GcBmoiBiAEIANBwARqECNFBEAgA0KOgICAcDcDsAQgAyACNgKsBCADQdkANgKoBCADQo+hgoCQAjcDoAQgBiAEIANBoARqECNFDQELAkAgAygCqAYiBUEASARAIAMoAtgGIQUMAQsgAyAFNgLYBgsgASADKALEBiAFEC4gA0HABmoiBEGUAUGTASADKAKsBkF9cUGQAUYbEA4gBCACQf8BcRAODA8LIANCjoCAgHA3ApQEIAMgAjYCkAQgA0KRgICAkAs3A4gEIANChICAgOATNwOABCADQZwGaiAEIANBgARqECMEQAJAIAMoAqgGIgVBAEgEQCADKALYBiEFDAELIAMgBTYC2AYLIAEgAygCxAYgBRAuAkAgAygCvAZBL0YEQCADQcAGakHBARAODAELIANBwAZqIgRBBBAOIAQgAygCvAYQGwsgA0HABmoiBEGVARAOIAQgAkH/AXEQDgwPCyADQo6AgIBwNwL0AyADIAI2AvADIANCkYCAgJALNwPoAyADQoGAgIDgEzcD4AMgA0GcBmogBCADQeADahAjBEACQCADKAKoBiIFQQBIBEAgAygC2AYhBQwBCyADIAU2AtgGCyABIAMoAsQGIAUQLiADQcAGaiIEIAMoArQGEM4DIARBlQEQDiAEIAJB/wFxEA4MDwsgA0KOgICAcDcD2AMgAyACNgLUAyADQdkANgLQAyADQp6BgICQAjcDyAMgA0LYtvmCcDcDwAMgA0GcBmogBCADQcADahAjBEACQCADKAKoBiIFQQBIBEAgAygC2AYhBQwBCyADIAU2AtgGCyABIAMoAsQGIAUQLiADQcAGaiIEIAMoAqwGIAMoArAGEFkgBEGVARAOIAQgAkH/AXEQDgwPCyABIAMoAsQGIAMoAtgGEC4gA0HABmpB2AAgAhBZIAQhAgwSCyAGLwABIQIgASADKALEBiADKALYBhAuIANBwAZqIAUgAhBZIAQhAgwRCyADIAYvAAEiAjYC5AQgA0F/NgLoBCADIAVBAWs2AuAEIANBnAZqIAQgA0HgBGoQIwRAAkAgAygCqAYiBEEASARAIAMoAtgGIQQMAQsgAyAENgLYBgsgASADKALEBiAEEC4gA0HABmogBUEBaiACEFkMDQsgASADKALEBiADKALYBhAuIANBwAZqIAUgAhBZIAQhAgwQCyABIAogCCAEIANB2AZqEKUCIQQMBgsgASgC1AIhCyABKALMAiEGQQAhCUEAIQgDQAJAIAkgC0gEQEEDIQogBigCACICQeoAa0EDTwRAIAJB7QFHDQJBASEKCwJAIAEoAqQCIAYoAgxBFGxqKAIMIAYoAggiBWsiBEGAf0ggBCAKQf8AakpyRQRAIAZBATYCBCACQe0BRgRAQewBIQIgBkHsATYCAAwCCyAGIAJBgAFqIgI2AgAMAQsgAkHsAEcgBEGAgAJqQf//A0tyDQIgBkLtgYCAIDcCAEECIQpB7QEhAgsgAygCwAYgBWpBAWsgAjoAACAGKAIEIgIgAygCwAYgBWpqIgQgBCAKaiADKALEBiAFIApqIAJqaxCrASADIAMoAsQGIAprNgLEBkEAIQQgASgCrAIiAkEAIAJBAEobIQcgASgCpAIhAgNAIAQgB0YEQCABKALUAiELIAYhByAJIQQDQAJAIAsgBEEBaiIETARAQQAhAiABKALgAiIEQQAgBEEAShshBANAIAIgBEYNAiAFIAEoAtgCIAJBA3RqIgcoAgAiDEkEQCAHIAwgCms2AgALIAJBAWohAgwACwALIAciAkEQaiEHIAIoAhgiDCAFTA0BIAIgDCAKazYCGAwBCwsgCEEBaiEIDAMLIAUgAigCDCILSARAIAIgCyAKazYCDAsgAkEUaiECIARBAWohBAwACwALIAEoAswCIQIgCARAQQAhBQNAIAUgC0gEQCABKAKkAiACKAIMQRRsaigCDCACKAIIIgRrIQYCQAJAAkACQCACKAIEQQFrDgQAAQMCAwsgAygCwAYgBGogBjoAACABKALUAiELDAILIAMoAsAGIARqIAY7AAAMAQsgAygCwAYgBGogBjYAAAsgAkEQaiECIAVBAWohBQwBCwsgASgCzAIhAgsgACgCECIEQRBqIAIgBCgCBBEAACABQQA2AswCIAAoAhAiAkEQaiABKAKkAiACKAIEEQAAIAFBADYCpAIgASgC2AIhAgJAIAEtAG5BAnEEQCACIQUMAQtBACEFIAJFDQAgASgC8AIhByABKAIAIAFB9AJqIggQgwJBACECQQAhCgNAIAEoAtgCIQUgAiABKALgAk4NAQJAIAUgAkEDdGoiBigCBCIEQQBIIAQgB0ZyDQAgBigCACIGIAprIgVBAEgNAAJAIAQgB2siB0EBaiIKQQRLIAVBMktyRQRAIAggCiAFQQVsakEBakH/AXEQDgwBCyAIQQAQDiAIIAUQsQUgCCAHQQF0IAdBH3VzELEFCyAGIQogBCEHCyACQQFqIQIMAAsACyAAKAIQIgJBEGogBSACKAIEEQAAIAFBADYC2AIgDRCJASANIAMpAtAGNwIQIA0gAykCyAY3AgggDSADKQLABjcCACABQQE2AqACIAEoAowCBEAgABBwDCALIAEoAoACIQcgAyABKAKEAiIENgKcBiADIAAgBEEBdBAkIgY2AqQGIAZFDR9BACECIARBACAEQQBKGyEFA0AgAiAFRwRAIAYgAkEBdGpB//8DOwEAIAJBAWohAgwBCwsgA0EANgKsBiADIAAgBEECdBAkIgI2AqgGAkAgAkUNACADQgA3ArAGIANBADYCoAYgACADQZwGakEAQQBBAEF/ELABDQADQCADKAKsBiECAkACQAJAIAMoArAGIgRBAEoEQCADIARBAWsiBDYCsAYgByACIARBAnRq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IAIgCTYCSCACIAo2AkQgAkHBAEHQACAHQQxIGzYCTCACIAdBC2pBDG9BAWo2AkAgAkGQAmogA2pBwAAgA2tB5vQAIAJBQGsQSCADaiEDCyAAIAJBkAJqIAMQ6gEhEQsgAkHQAmokACARCzcCA38BfiMAQRBrIgAkACAAEI0GIAApAwAhAyAAKAIIIQIgAEEQaiQAIAJB6AdtrCADQugHfnwLhwEBAXwgACADKQMAEKgBIgJFBEBCgICAgOAADwsgAhAHIQQgACACEDEgBL0iAQJ/IASZRAAAAAAAAOBBYwRAIASqDAELQYCAgIB4CyIAt71RBEAgAK0PC0KAgICAwH4gAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGwvxAQIGfwF+IABBCBAkIgRFBEBBfw8LIARCATcCACACpyEGIAJCIIinQXVJIQgDQAJAAkAgA0ECRg0AIAAgACkDMCADQS5yEEciCUKAgICAcINCgICAgOAAUgRAIABBEBAkIgUNAiAAIAkQDAtBfyEHIANFDQAgACABKQMAEAwLIAAoAhAgBBD/BCAHDwsgBCAEKAIAQQFqNgIAIAUgBDYCCCAIRQRAIAYgBigCAEEBajYCAAsgBSACNwMAIAlCgICAgHBaBEAgCacgBTYCIAsgACAJQS9BARCYAyABIANBA3RqIAk3AwAgA0EBaiEDDAALAAt/AQV/IABBEGohBCABQQxqIQUgASgCECECA0AgAiAFRkUEQCACKAIEIQYgACACKQMQECEgACACKQMYECEgACACKQMgECEgACACKQMoECEgBCACIAAoAgQRAAAgBiECDAELCyABKAIIIgMEQCAAIAMQzgELIAQgASAAKAIEEQAAC+EDAgR/An4jAEFAaiICJAAgAiAAIAEQsQIiBjcDOAJAAkAgASgCIARAIAZCgICAgHCDQoCAgIDgAFENASAAIAEpAyhCgICAgDBBASACQThqEBwhBiAAIAIpAzgQDCAAIAYQDAwCCyACIAEoAmRBCGsiAykDADcDKCADQoCAgIAwNwMAIAAgBhAMQQAhAyAAIAApA1AgACACQShqQQAQ3gEhBiAAIAIpAygQDCAGQoCAgIBwg0KAgICA4ABRDQADQAJAIANBAkcEQCACQRBqIANBA3RqIAAgACkDMCADQTFqEEciBzcDACAHQoCAgIBwg0KAgICA4ABSDQEgA0EBRgRAIAAgAikDEBAMCyAAIAYQDAwDCyACQoCAgIAwNwMIIAJCgICAgDA3AwAgACAGIAJBEGogAhCpAiEFIAAgBhAMQQAhAwNAIANBAkZFBEAgACACQRBqIANBA3RqKQMAEAwgA0EBaiEDDAELCyAFDQIMAwsgASABKAIAQQFqNgIAIAenIAE2AiAgA0EBaiEDDAALAAsgACgCECIDKQOAASEGIANCgICAgCA3A4ABIAIgBjcDMCAAIAEpAzBCgICAgDBBASACQTBqEBwhBiAAIAIpAzAQDCAAIAYQDAsgAkFAayQAC5UDAgh/AX4jAEEwayIGJAACQCABQoCAgIBwVA0AIAGnIgQvAQZBLUcNACAEKAIgIgRFDQAgBCgCAA0AIAJCIIinQXVPBEAgAqciBSAFKAIAQQFqNgIACyAAIARBGGogAhAdIAQgA0EBaiIFNgIAAkAgBUECRw0AIAQoAhQNACAAKAIQIgUoApgBIgdFDQAgACABIAJBACAFKAKcASAHETUACyAEQQRqIgcgA0EDdGoiCCgCBCEEIANBAEetQoCAgIAQhCEBA0AgBCAIRkUEQCAEKAIEIQsgBiAEKQMINwMAIAYgBCkDEDcDCCAEKQMYIQwgBiACNwMgIAYgATcDGCAGIAw3AxAgAEE8QQUgBhD4AiAEKAIAIgkgBCgCBCIKNgIEIAogCTYCACAEQgA3AgAgACgCECAEEKgCIAshBAwBCwsgB0EBIANrQQN0aiIFKAIEIQQDQCAEIAVGDQEgBCgCACIHIAQoAgQiAzYCBCADIAc2AgAgBEIANwIAIAAoAhAgBBCoAiADIQQMAAsACyAGQTBqJAALigMCA34CfyMAQRBrIgIkAEKAgICAMCEGAkACQCAAIAJBCGogACABECAiARAvDQACQCACKQMIIgdCAFcEQAwBCyAHQgF9IQUCQAJAAkACQCABIAJBBGogAhCPAUUNACAHIAIoAgAiCK1SDQAgAachCSACKAIEIQMgBEUNASADKQMAIQYgAyADQQhqIAhBA3RBCGsQqwEMAgsCQCAEBEAgACABQgAQTiIGQoCAgIBwg0KAgICA4ABRDQYgACABQgBCASAFQQEQ8wJFDQEMBgsgACABIAUQbCIGQoCAgIBwg0KAgICA4ABRDQULIAAgASAFEIUCQQBODQIMBAsgAyAIQQN0akEIaykDACEGCyAJIAkoAihBAWs2AigLIAdCgYCAgAhUDQBCgICAgMB+IAW5vSIFQoCAgIDAgYD8/wB9IAVC////////////AINCgICAgICAgPj/AFYbIQULIAAgAUEwIAUQOUEATg0BCyAAIAYQDEKAgICA4AAhBgsgACABEAwgAkEQaiQAIAYLbgEEf0F/IQZBfyACKAIAIgRBAXYgBGogBEGp1arVeksbIQUCQAJAIAMgASgCACIHRgRAIAAgBRAkIgBFDQIgACADIAQQHhoMAQsgACAHIAUQxQIiAEUNAQsgASAANgIAIAIgBTYCAEEAIQYLIAYLfwEEfyABLQAAQdsARgRAIAFBAWoiAxA9QQFrIQIgACgCECgCOCEEQcsBIQEDQCABQdgBRwRAAkAgBCABQQJ0aigCACIFKAIEQf////8HcSACRw0AIAVBEGogAyACEGgNACAAIAEQFg8LIAFBAWohAQwBCwsQAQALIAAgARC2AQswAANAIAFBgAFJRQRAIAAgAUGAAXJB/wFxEA4gAUEHdiEBDAELCyAAIAFB/wFxEA4LFwAgACAAKQPAASABIAIgA0EAQX8QswULNQEBfyAAKALsASIHRQRAIABBjuUAQQAQEkKAgICA4AAPCyAAIAEgAiADIAQgBSAGIAcRNwALogYCBH8CfkKAgICAMCEJAkACQAJAAkACQCABKAJUIgVBGHZBAmsOBAIDAAABCyABLQCgAUUNAkF/IQIgASkDqAEiCUIgiKdBdUkNAiAJpyIAIAAoAgBBAWo2AgAMAgtBlv4AQajsAEH74AFB3ToQAAALIAFBADYCcCABIAI2AlwgASACNgJYIAEgBUGAgIAYcjYCVCABIAMoAgA2AmAgAyABNgIAIAJBAWohAgNAAkACQAJAAkACQAJAIAEoAhQgB0oEQCAAIAEoAhAgB0EDdGooAgQiBSACIAMgBBC0BSICQQBIDQkgBSgCVCIGQRh2QQNrQQNPDQEgBkGAgIB4cUGAgIAYRgRAIAEgASgCXCIGIAUoAlwiCCAGIAhIGzYCXAwHCyAFKAKAASIFKAJUQYCAgHBxQYCAgCBHDQIgBS0AoAFFDQZBfyECIAUpA6gBIglCIIinQXVJDQggCaciACAAKAIAQQFqNgIADAgLAkAgASgCcEEASgRAIAEoAnQNBCABQQE2AnQgACgCECIAIAApA7gBIgpCAXw3A7gBIAEgCjcDeAwBCyABLQBUBEAgASgCdA0FIAFBATYCdCAAKAIQIgUgBSkDuAEiCkIBfDcDuAEgASAKNwN4IAAgARCQBQwBCyAAIAEgBBCPBUEASA0JCyABKAJcIgAgASgCWCIFSg0EIAAgBUcNBwNAIAMgAygCACIAKAJgNgIAIAAgATYCgAEgAEEEQQUgACgCdBs6AFcgACABRw0ACwwHC0He+wBBqOwAQY7hAUHdOhAAAAtBuv0AQajsAEGV4QFB3ToQAAALQfg6QajsAEGm4QFB3ToQAAALQfg6QajsAEGr4QFB3ToQAAALQdIOQajsAEG14QFB3ToQAAALIAUoAnQEQCABIAEoAnBBAWo2AnAgACAFQeQAakEEIAVB7ABqIAUoAmhBAWoQZARAIAAoAhAiACkDgAEhCSAAQoCAgIAgNwOAAUF/IQIMAwsgBSAFKAJoIgZBAWo2AmggBSgCZCAGQQJ0aiABNgIACyAHQQFqIQcMAAsACyAEIAk3AwAgAg8LQX8L2AcCB38BfiMAQRBrIgYkAAJAIAEoAlQiCEEYdiIEQQVNQQBBASAEdEE2cRsNAAJAAkACQCAIQYCAgAhJBEAgASADNgJcIAEgAzYCWCABIAhBgICACHI2AlQgASACKAIANgJgIAIgATYCACADQQFqIQhBACEDA0ACQCABKAIUIANMBEBBACEDDAELIAAgASgCECADQQN0aigCBCIEIAIgCBC1BSIIQQBIDQUgBCgCVCIFQRh2IglBBUtBASAJdEE2cUVyDQMgBUGAgIB4cUGAgIAIRgRAIAEgASgCXCIFIAQoAlwiBCAEIAVKGzYCXAsgA0EBaiEDDAELCwJAA0AgAyABKAIgTg0BAkACQCABKAIcIANBFGxqIgQoAghBAUcNACAEKAIMIgVB/gBGDQAgACAGQQhqIAZBDGogASgCECAEKAIAQQN0aigCBCAFEN8DIgUNAQsgA0EBaiEDDAELCyAAIAUgASAEKAIQEN4DDAQLIAEoAlBFBEAgASgCSCgCJCEKQQAhA0EAIQUDQAJAIAEoAjggBUwEQANAIAMgASgCIE4NAiABKAIcIANBFGxqIgQoAghFBEAgCiAEKAIAQQJ0aigCACIFIAUoAgBBAWo2AgAgBCAFNgIECyADQQFqIQMMAAsACyABKAIQIAEoAjQgBUEMbGoiCSgCCEEDdGooAgQhBAJAIAkoAgQiB0H+AEYEQCAAIAQQ9gIiC0KAgICAcINCgICAgOAAUQ0IIAAgCiAJKAIAQQJ0aigCAEEYaiALEB0MAQsgACAGQQhqIAZBDGogBCAHEN8DIgcEQCAAIAcgBCAJKAIEEN4DDAgLAkAgBigCDCIHKAIMQf4ARgRAIAAgBigCCCgCECAHKAIAQQN0aigCBBD2AiILQoCAgIBwg0KAgICA4ABRDQkgAEEBENwDIgRFBEAgACALEAwMCgsgACAEQRhqIAsQHQwBCyAHKAIEIgRFBEAgBigCCCgCSCgCJCAHKAIAQQJ0aigCACEECyAEIAQoAgBBAWo2AgALIAogCSgCAEECdGogBDYCAAsgBUEBaiEFDAELC0F/IQMgACABKQNIQoGAgIAQQQBBABAcIgtCgICAgHCDQoCAgIDgAFENBSAAIAsQDAsgASgCXCIAIAEoAlgiA0oNAiAAIANGBEADQCACIAIoAgAiACgCYDYCACAAQQI6AFcgACABRw0ACwsgCCEDDAQLQbv+AEGo7ABBsNsBQfvKABAAAAtB5/wAQajsAEHC2wFB+8oAEAAAC0HSDkGo7ABBxNwBQfvKABAAAAtBfyEDCyAGQRBqJAAgAwv3AgIEfwJ+AkAgAS0AVg0AAkAgASgCUARAA0AgAiABKAIgTg0CIAEoAhwgAkEUbGoiAygCCEUEQCAAQQAQ3AMiBEUEQEF/DwsgAyAENgIECyACQQFqIQIMAAsACyABKQNIIQdBfyEDIAAgACkDMEENEEciBkKAgICAcINCgICAgOAAUQ0BIAanIgIgB6ciAzYCICADIAMoAgBBAWo2AgAgAkIANwIkAkAgAygCPCIERQ0AAkAgACAEQQJ0EFwiBEUNACACIAQ2AiRBACECA0AgAiADKAI8Tg0CIAMoAiQgAkEDdGotAAAiBUEBcQRAIAAgBUEDdkEBcRDcAyIFRQ0CIAQgAkECdGogBTYCAAsgAkEBaiECDAALAAsgACAGEAxBfw8LIAEgBjcDSCAAIAcQDAsgAUEBOgBWQQAhAgNAIAEoAhQgAkwEQEEADwsgAkEDdCEEQX8hAyACQQFqIQIgACAEIAEoAhBqKAIEELYFQQBODQALCyADC64IAQR/IwBBIGsiBSQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUIgiKdBA2oOAgEAAgsgACAAIAEgAyAEEIAEIAJBAEEAEDYhAgwCCyAAIAEQDEKAgICA4AAhAiAAIAGnIgMQtgVBAEgNASADKAJUIgRBgICACE8EQCAEQRh2IgRBBUtBASAEdEE0cUVyDQMLIAVBADYCECAAIAMgBUEQaiIEQQAQtQVBAEgEQCAEIQADQCAAKAIAIgBFDQMgACgCVCIDQYCAgHhxQYCAgAhHDQUgACADQf///wdxNgJUIABB4ABqIQAMAAsACyAFKAIQDQQgAygCVCIGQRh2IgRBBUtBASAEdEE0cUUiB3INBSAEQQVLIAdyDQYgBkGAgIBwcUGAgIAgRgRAIAMoAoABIQMLAkACQCADKQOIASIBQoCAgIBwg0KAgICAMFIEQCABQiCIp0F0Sw0BDAILIAMgACADQZABahC3AiICNwOIAUKAgICA4AAhASACQoCAgIBwg0KAgICA4ABRDQEgBUEANgIcAkAgACADQQAgBUEcaiIEIAVBEGoQtAVBAEgEQCAFKQMQIgGnIQYgAUIgiKdBdUkhBwNAIAQoAgAiBARAIAQoAlQiCEGAgIB4cUGAgIAYRw0NIARBAToAoAEgBCAIQf///wdxQYCAgChyNgJUIAdFBEAgBiAGKAIAQQFqNgIACyAEIAM2AoABIAQgATcDqAEgBEHgAGohBAwBCwsgACABEAwgAy0AV0EYdEGAgIAoRw0MIAMtAKABRQ0NIAAgACADKQOYAUKAgICAMEEBIANBqAFqEBwQDAwBCyADKAJUIgRBgICAcHFBgICAIEcNDSADLQCgAQ0OIAMoAnRFBEAgBEGAgIAocUGAgIAoRw0QIAVCgICAgDA3AwggACAAIAMpA5ABQoCAgIAwQQEgBUEIahAcEAwLIAUoAhwNEAsgAykDiAEiAUIgiKdBdUkNAQsgAaciACAAKAIAQQFqNgIAC0KAgICA4AAgASABQoCAgIBwg0KAgICA4ABRGyECDAELIAAgARAMIABBiuYAQQAQEkKAgICA4AAhAgsgBUEgaiQAIAIPC0Gy+gBBqOwAQefcAUG+1wAQAAALQfr3AEGo7ABB7NwBQb7XABAAAAtB+fQAQajsAEHy3AFBvtcAEAAAC0Hc+gBBqOwAQfXcAUG+1wAQAAALQdz6AEGo7ABB0+EBQc3XABAAAAtB0PcAQajsAEHj4QFBzdcAEAAAC0G2+wBBqOwAQevhAUHN1wAQAAALQec4QajsAEHs4QFBzdcAEAAAC0GE+wBBqOwAQfLhAUHN1wAQAAALQeY4QajsAEHz4QFBzdcAEAAAC0G2+wBBqOwAQfbhAUHN1wAQAAALQfn0AEGo7ABB/OEBQc3XABAAAAtTACMAQRBrIgQkAEKAgICAMCEBIAQgAkEASgR+IAMpAwAFQoCAgIAwCzcDCCAAIAAgBSkDCEKAgICAMEEBIARBCGoQHBAMIARBEGokAEKAgICAMAvuAwEFfyMAQRBrIgYkAAJAAkACQAJ/IAAoAhAiBCgCqAEiA0UEQCACLQAAQS5HBEAgACACIAIQPRCXAwwCCyABEIUGIQVBACEDIAAgAhA9IAUgAWtBACAFGyIFakECahAkIgdFDQQgByABIAUQHiIBIAVqQQA6AAACQANAAkAgAi0AAEEuRw0AQQIhAwJAAkAgAi0AAUEuaw4CAAECCyACLQACQS9HDQEgAS0AAEUNAyABEIUGIgNBAWogASADGyIDQYaIARCWBEUNASADQYWIARCWBEUNASADIAEgA0lrQQA6AABBAyEDCyACIANqIQIMAQsLIAEtAABFDQAgARA9IAFqQS87AAALIAEQPSABaiACEIcGIAEhAgwCCyAAIAEgAiAEKAKwASADEQcACyICRQ0BCyAAIAIQtgEiAUUEQCAAKAIQIgBBEGogAiAAKAIEEQAADAELIAAgARDPBSIDBEAgACgCECIEQRBqIAIgBCgCBBEAACAAIAEQEAwCCyAAIAEQECAEKAKsASIBRQRAIAYgAjYCACAAQeiOASAGEMMCIAAoAhAiAEEQaiACIAAoAgQRAAAMAQsgACACIAQoArABIAERAQAhAyAAKAIQIgBBEGogAiAAKAIEEQAADAELQQAhAwsgBkEQaiQAIAMLRQEEfyAAKAIgIgNBACADQQBKGyEDA0AgAiADRgRAQQAPCyACQRRsIQUgAkEBaiECIAUgACgCHGoiBCgCECABRw0ACyAEC1wBBH8gASEDAkADQCACIANNIARBBEtyDQEgAywAACIGQf8AcSAEQQdsdCAFciEFIARBAWohBCADQQFqIQMgBkEASA0ACyAAIAU2AgAgAyABaw8LIABBADYCAEF/C78BAgZ/AX4gAUEYaiEFIAEoAhwhAgNAIAIgBUcEQCACKAIEIQcgAigCCCIDBEAgACADEM4BCyACQRJrLwEAIQMCQAJAIAJBE2siBC0AAEECcQRAIAEoAhAgA0EDdGopAwAiCEIgiKdBdEsNAQwCCyABKAIUIANBA3RqKQMAIghCIIinQXVJDQELIAinIgMgAygCAEEBajYCAAsgAiAINwMAIAJBCGsgAjYCACAEIAQtAABBAXI6AAAgByECDAELCwsrAQF/IAFBEGsiAyAAIAMpAwAgAUEIaykDABCSBSACR61CgICAgBCENwMAC9YHAwR+Bn8CfCABQQhrIgspAwAhAyABQRBrIgopAwAhBQJAAkACQAJAAkACQAJAA0AgBUL/////D4MhBkEHIANCIIinIgkgCUEHa0FuSRsiB0F2RiEMAkACQAJAAkACQANAAkBBByAFIgRCIIinIgEgAUEHa0FuSRsiAUEKaiIIQRFLQQEgCHRBgYgIcUVyDQAgDEUEQCAHQQdGBEAgByEJDA4LIAcNAQsgASAHcg0MIASnIAOnRiEIDA4LIAEgB0YEQCAAIAQgA0EAELQBIQgMDgtBASEIIAFBAkYgB0EDRnEgB0ECRiABQQNGcXINDQJAAkACQAJAAkACQAJAIAFBeUYEQAJAIAcOAgYKAAtBeSEIIAchCSAHQQpqDgQBCwsPBAsgB0F5Rw0GQQAhCCAGIQUgAUEBag4JCwQHDw8PDw8EAQsgAUF5Rw0EIAAgBBCqAiIEQoCAgIBwg0KAgICA4H5SDQEMBAsgAUF2Rw0NIAAgAxCqAiIDQoCAgIBwg0KAgICA4H5RDQMLIAAgBBAMIAAgAxAMQQAhCAwRCyAHQQdHDQYLIAAgBBBlIgRCgICAgHCDQoCAgIDgAFENCyAEIQUgACADEGUiA0KAgICAcINCgICAgOAAUQ0MCyAAIAQgAxCSBSEIDA4LIAYhBSABQQFGDQALIAdBAUcNAQsgA0L/////D4MhAyAEIQUMBAsgASIIQX9HDQAgB0EKaiIBQRFNQQBBASABdEGBiAhxGw0BQX8hCCAHQX5xQXhGDQELIAdBf0cNASAIQX5xQXhGIAhBCmoiAUERTUEAQQEgAXRBgYgIcRtyDQBBfyEHDAELIAAgBEECEJIBIgVCgICAgHCDQoCAgIDgAFENBCAAIANBAhCSASIDQoCAgIBwg0KAgICA4ABSDQEMBQsLIAghCQsgB0F+cUECRiEIIAkhAQsCfyAEQoCAgIBwWgRAQQEgBKcsAAVBAEggCHENARoLQQAhByADQoCAgIBwWgR/IAOnLAAFQQBIBUEACyABQX5xQQJGcQshCCAAIAQQDCAAIAMQDAwECyADIQULIAAgBRAMDAELAkACfAJ8IAFBB0YEQCAJQQAgCUEHRxsNAyAEQoCAgIDAgYD8/wB8vyINIAlBB0YNARogA6e3DAILIAlBB0cgAXINAiAEp7cLIQ0gA0KAgICAwIGA/P8AfL8LIQ4gDSAOYSEIDAILIABBqgEgBCADIAAoAhAoArACESsAIghBAE4NAQsgCkKAgICAMDcDACALQoCAgIAwNwMAQX8PCyAKIAIgCEetQoCAgIAQhDcDAEEAC/QFAgJ+BH8jAEEQayIGJAACQAJAAkACQEEHIAFBEGsiBSkDACICQiCIpyIEIARBB2tBbkkbIgRBB0dBByABQQhrIgcpAwAiA0IgiKciASABQQdrQW5JGyIBQQdHckUEQCAFQoCAgIDAfiACQoCAgIDAgYD8/wB8vyADQoCAgIDAgYD8/wB8v6C9IgJCgICAgMCBgPz/AH0gAkL///////////8Ag0KAgICAgICA+P8AVhs3AwAMAQsgBEF/RyABQX9HcUUEQCAAIAJBAhCSASICQoCAgIBwg0KAgICA4ABRDQIgACADQQIQkgEiA0KAgICAcINCgICAgOAAUQRAIAAgAhAMDAQLQQcgAkIgiKciBCAEQQdrQW5JGyEEQQcgA0IgiKciASABQQdrQW5JGyEBCyAEQXlHIAFBeUdxRQRAIAUgACACIAMQtgIiAjcDAEEAIQEgAkKAgICAcINCgICAgOAAUQ0DDAQLIAAgAhBlIgJCgICAgHCDQoCAgIDgAFENASAAIAMQZSIDQoCAgIBwg0KAgICA4ABRBEAgACACEAwMAwtBByADQiCIpyIBIAFBB2tBbkkbIgFBByACQiCIpyIEIARBB2tBbkkbIgRyRQRAIAUCfiADxCACxHwiAkKAgICACHxC/////w9YBEAgAkL/////D4MMAQtCgICAgMB+IAK5vSICQoCAgIDAgYD8/wB9IAJC////////////AINCgICAgICAgPj/AFYbCzcDAAwBCyAEQXZHIAFBdkdxRQRAIABBngEgBSACIAMgACgCECgCrAIRIwANAwwBCyAAIAZBCGogAhBtBEAgACADEAwMAwsgACAGIAMQbQ0CIAVCgICAgMB+IAYrAwggBisDAKC9IgJCgICAgMCBgPz/AH0gAkL///////////8Ag0KAgICAgICA+P8AVhs3AwALQQAhAQwCCyAAIAMQDAsgBUKAgICAMDcDACAHQoCAgIAwNwMAQX8hAQsgBkEQaiQAIAELtAMBCH8jAEEQayIEJAAgACAAKQOAARAhIABBEGohAyAAQaABaiEFIAAoAqQBIQEDQCABIAVHBEAgASgCBCEIIAFBGGohB0EAIQIDQCABKAIQIAJKBEAgACAHIAJBA3RqKQMAECEgAkEBaiECDAELCyADIAEgACgCBBEAACAIIQEMAQsLIAAgBTYCpAEgACAAQaABajYCoAEgABCdBSAAKAJUIABB0ABqRgRAQQAhAgNAAkAgACgCRCEBIAIgACgCQE4NACABIAJBGGxqIgEoAgAEQCAAIAEoAgQQxwELIAJBAWohAgwBCwsgAyABIAAoAgQRAAAgAEHkAWoiAUEIahDBBCABQSBqEMEEQQAhAgNAAkAgACgCOCEBIAIgACgCLE4NACABIAJBAnRqKAIAIgFBAXFFBEAgAyABIAAoAgQRAAALIAJBAWohAgwBCwsgAyABIAAoAgQRAAAgAyAAKAI0IAAoAgQRAAAgAyAAKALgASAAKAIEEQAAIAQgAykCCDcDCCAEIAMpAgA3AwAgBCAAIAAoAgQRAAAgBEEQaiQADwtBuogBQajsAEHHD0Hd0wAQAAALjgMBC38jAEEwayIHJAACQCACQoCAgIBwVA0AQRMhBQJAIAKnIgotAAVBBHFFDQAgACgCECgCRCAKLwEGQRhsaigCFCIIRQ0AQQNBEyAIKAIEGyEFC0F/IQkgACAHQSxqIAdBKGogCiAFEH0NACADp0EAIANC/////29WGyEMIAcoAiwhCCAHKAIoIQsgBUEPSyENQQAhBQJAA0AgBSALRwRAAkACQCAMRQ0AIABBACAMIAggBUEDdGooAgQQQyIGRQ0AIAZBAE4NAQwECyANRQRAIAAgB0EIaiIOIAogCCAFQQN0aigCBBBDIgZBAEgNBCAGRQ0BIAcoAgghDyAAIA4QRiAPQQRxRQ0BCyAAIAIgCCAFQQN0aiIGKAIEIAJBABARIgNCgICAgHCDQoCAgIDgAFENAyAGKAIEIQYCfyAEBEAgACABIAYgAxA5DAELIAAgASAGIANBBxAVC0EASA0DCyAFQQFqIQUMAQsLIAAgCCALEFtBACEJDAELIAAgCCALEFsLIAdBMGokACAJC6YBAQF+AkACQAJ+IARBBHEEQEEpIQIgACABEEoMAQtBKCECIAAgARAgCyIBQoCAgIBwg0KAgICA4ABRDQAgACACEIYBIgVCgICAgHCDQoCAgIDgAFENACAAQRAQJCICBEAgAkEANgIMIAIgBEEDcTYCCCACIAE3AwAgBUKAgICAcFQNAiAFpyACNgIgDAILIAAgBRAMCyAAIAEQDEKAgICA4AAPCyAFC8QBAQR/IAGnIgUgAjYCICAFQgA3AiQCQCACKAI8IgZFDQACQCAAIAZBAnQQXCIIRQ0AIAUgCDYCJEEAIQUDQCAFIAIoAjxODQIgAigCJCAFQQN0aiIHLwECIQYCQCAHLQAAIgdBAXEEQCAAIAQgBiAHQQF2QQFxEP8DIgYNAQwDCyADIAZBAnRqKAIAIgYgBigCAEEBajYCAAsgCCAFQQJ0aiAGNgIAIAVBAWohBQwACwALIAAgARAMQoCAgIDgACEBCyABC4IBAQJ+IAAgARApIQICQCABQQBIDQAgACgCECgCOCABQQJ0aigCACkCBCIDp0GAgICAeEYgA0KAgICA8P///z+DUCADQv//////////v39WcSADQoCAgICAgICAQINCgICAgICAgICAf1FyRXINACAAQa/wACACQa3wABCyASECCyACC2QBAn8CQAJAIAFCgICAgHBUDQAgARCUBQ0AQX8hAyAAIAIQMCIERQ0BIAAgBBDEBSECIAAgBBAQIAJCgICAgHCDQoCAgIDgAFENASAAIAFBNyACQQEQFUEASA0BC0EAIQMLIAMLNQACQCACRSABQoCAgIBwVHINACABEJQFDQAgACABQTcgACACEClBARAVQQBODQBBfw8LQQALDAAgACABQbYVELUBC2gCAX8BfgJAIAAgAUHqACABQQAQESIEQoCAgIBwg0KAgICA4ABSBEAgACAEECchAyAAIAFBwQAgAUEAEBEiAUKAgICAcINCgICAgOAAUg0BC0EAIQNCgICAgOAAIQELIAIgAzYCACABCxQBAn4gACABECAhAyAAIAEQDCADC/sBAgR/AX4gACgCyAEiBSgCECIEQTBqIQYgBCAEKAIYIAFxQX9zQQJ0aigCACEEAkADQCAERQ0BIAEgBiAEQQFrIgdBA3RqIgQoAgRHBEAgBCgCAEH///8fcSEEDAELCyAFKAIUIAdBA3RqIQUCQCADQQFGDQAgBTUCBEIghkKAgICAwABRBEAgACACEAwgACAEKAIEENEBQX8PCyAELQADQQhxDQAgACACEAwgAEGAgAEgARDnAQ8LIAAgBSACEB1BAA8LIAAgACkDwAEiCCABIAIgCAJ/IAAoAhAoAowBIgMEQEGAgAYgAygCKEEBcQ0BGgtBgIACCxDQAQuKAQEBfwJAIAJCgICAgHCDQoCAgICQf1EgA0KAgICAcINCgICAgJB/UXFFBEAgAEGl5gBBABASDAELIAAgAUESEF4iAUKAgICAcINCgICAgOAAUQ0AIAGnIgQgAz4CJCAEIAI+AiAgACABQdYAQgBBAhAVGiABDwsgACADEAwgACACEAxCgICAgOAACw0AIAAgAUHMjQEQgQMLZwEBfwJAIAFBAE4EQCAAKAIQIgIoAiwgAU0NASACKAI4IAFBAnRqKAIAIgEgASgCAEEBajYCACAAIAFBBBDmAw8LQYaJAUGo7ABB1RdBycAAEAAAC0GQzgBBqOwAQdYXQcnAABAAAAuxAgEEfwJAAkACQAJAIAJCgICAgHBUDQAgAqciAy8BBhDgAUUNACADKAIoIgRFDQAgBCgCECIDQTBqIQUgAyADKAIYQX9zQQJ0QdR5cmooAgAhAwNAIANFDQMgBSADQQFrIgNBA3RqIgYoAgRBygFHBEAgBigCAEH///8fcSEDDAELCyABQoCAgIBwVA0AIAQoAhQgA0EDdGopAwAiAkKAgICAcINCgICAgIB/UQ0BCyAAECIMAgsgACACEIgCIQMgAacoAhAiAEEwaiEEIAAgAyAAKAIYcUF/c0ECdGooAgAhAANAIABFBEBBAA8LIAQgAEEDdGoiBUEIayEAIAMgBUEEaygCAEYEQCAAQQBHDwUgACgCAEH///8fcSEADAELAAsACyAAQZ3kAEEAEBILQX8LRAEBfyAAQeQBaiECIABB4AFqIQADfyAAIAIoAgAiAkYEQEEADwsgASACQQRrKAIARgR/IAJBCGsFIAJBBGohAgwBCwsLiQECA38BfgJAIAAoAhAoAowBIgJFDQADQCABQQBMBEADQCACKQMIIgRCgICAgHBUDQMgBKciAS8BBhDgAUUNAyABKAIgIgEvABEiA0GAwABxRQRAIANBgAhxRQ0EIAAgASgCQBAWDwsgAigCACICDQAMAwsACyABQQFrIQEgAigCACICDQALC0EACykBAX8gAkIgiKdBdU8EQCACpyIDIAMoAgBBAWo2AgALIAAgASACEIUEC/QBAwF+An8BfANAAkBBfyEEAkACQAJAQQcgAkIgiKciBSAFQQdrQW5JGw4IAAAAAAICAwECCyACxCEDQQAhBAwCC0EAIQQgAkKAgICAwIGA/P8AfCICQv///////////wCDQoCAgICAgID4/wBWDQFCgICAgICAgICAfyEDIAK/IgZEAAAAAAAA4MNjDQFC////////////ACEDIAZEAAAAAAAA4ENkDQEgBplEAAAAAAAA4ENjBEAgBrAhAwwCC0KAgICAgICAgIB/IQMMAQsgACACEJYBIgJCgICAgHCDQoCAgIDgAFINAQsLIAEgAzcDACAEC+YBAgN/AXwDQAJAQX8hBAJAAkACQEEHIAJCIIinIgUgBUEHa0FuSRsOCAAAAAACAgMBAgsgAqchA0EAIQQMAgtBACEEIAJCgICAgMCBgPz/AHwiAkL///////////8Ag0KAgICAgICA+P8AVgRADAILQYCAgIB4IQMgAr8iBkQAAAAAAADgwWMNAUH/////ByEDIAZEAADA////30FkDQEgBplEAAAAAAAA4EFjBEAgBqohAwwCC0GAgICAeCEDDAELIAAgAhCWASICQoCAgIBwg0KAgICA4ABSDQELCyABIAM2AgAgBAttAAJAAkACQAJAAkAgAkEEdkEDcUEBaw4DAAECAwsgASgCACICBEAgACACrUKAgICAcIQQIQsgASgCBCIBRQ0DIAAgAa1CgICAgHCEECEPCyAAIAEoAgAQ5QEPCyABEOAFDwsgACABKQMAECELC/UBAQl/QX8hAiABIAFBAWtxRQRAIABBEGoiCCABQQJ0IgMgACgCABEDACIFBH8gBUEAIAMQLCEGIAFB/////wNqQf////8DcSEJIAAoAjQhBwNAIAQgACgCJE9FBEAgByAEQQJ0aigCACECA0AgAgRAIAAoAjggAkECdGooAgAiAygC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QQpPBH8gAEHBAGsgA00EQCAAQTdrDwsgAiAAQdcAayAAQeEAayABTxsFIAQLC6IDAQJ/IAAgASgCBBAQA0AgASgCECEDIAIgASgCFE5FBEAgACADIAJBA3RqKAIAEBAgAkEBaiECDAELCyAAKAIQIgJBEGogAyACKAIEEQAAQQAhAgNAAkAgASgCHCEDIAIgASgCIE4NACADIAJBFGxqIgMoAghFBEAgACgCECADKAIEEOUBCyAAIAMoAhAQECAAIAMoAgwQECACQQFqIQIMAQsLIAAoAhAiAkEQaiADIAIoAgQRAAAgACgCECICQRBqIAEoAiggAigCBBEAAEEAIQIDQCABKAI0IQMgAiABKAI4TkUEQCAAIAMgAkEMbGooAgQQECACQQFqIQIMAQsLIAAoAhAiAkEQaiADIAIoAgQRAAAgACgCECICQRBqIAEoAmQgAigCBBEAACAAIAEpA0AQDCAAIAEpA0gQDCAAIAEpA6gBEAwgACABKQOwARAMIAAgASkDiAEQDCAAIAEpA5ABEAwgACABKQOYARAMIAEoAggiAiABKAIMIgM2AgQgAyACNgIAIAFCADcCCCAAKAIQIgBBEGogASAAKAIEEQAAC9IDAgJ+An8jAEEgayIEJAACQCABQv///////////wCDIgNCgICAgICAwIA8fSADQoCAgICAgMD/wwB9VARAIAFCBIYgAEI8iIQhAyAAQv//////////D4MiAEKBgICAgICAgAhaBEAgA0KBgICAgICAgMAAfCECDAILIANCgICAgICAgIBAfSECIABCgICAgICAgIAIUg0BIAIgA0IBg3whAgwBCyAAUCADQoCAgICAgMD//wBUIANCgICAgICAwP//AFEbRQRAIAFCBIYgAEI8iIRC/////////wODQoCAgICAgID8/wCEIQIMAQtCgICAgICAgPj/ACECIANC////////v//DAFYNAEIAIQIgA0IwiKciBUGR9wBJDQAgBEEQaiAAIAFC////////P4NCgICAgICAwACEIgIgBUGB9wBrEGIgBCAAIAJBgfgAIAVrEI0CIAQpAwhCBIYgBCkDACIAQjyIhCECIAQpAxAgBCkDGIRCAFKtIABC//////////8Pg4QiAEKBgICAgICAgAhaBEAgAkIBfCECDAELIABCgICAgICAgIAIUg0AIAJCAYMgAnwhAgsgBEEgaiQAIAIgAUKAgICAgICAgIB/g4S/C6oPAgV/D34jAEHQAmsiBSQAIARC////////P4MhCiACQv///////z+DIQsgAiAEhUKAgICAgICAgIB/gyEMIARCMIinQf//AXEhCAJAAkAgAkIwiKdB//8BcSIJQf//AWtBgoB+TwRAIAhB//8Ba0GBgH5LDQELIAFQIAJC////////////AIMiDUKAgICAgIDA//8AVCANQoCAgICAgMD//wBRG0UEQCACQoCAgICAgCCEIQwMAgsgA1AgBEL///////////8AgyICQoCAgICAgMD//wBUIAJCgICAgICAwP//AFEbRQRAIARCgICAgICAIIQhDCADIQEMAgsgASANQoCAgICAgMD//wCFhFAEQCADIAJCgICAgICAwP//AIWEUARAQgAhAUKAgICAgIDg//8AIQwMAwsgDEKAgICAgIDA//8AhCEMQgAhAQwCCyADIAJCgICAgICAwP//AIWEUARAQgAhAQwCCyABIA2EUARAQoCAgICAgOD//wAgDCACIAOEUBshDEIAIQEMAgsgAiADhFAEQCAMQoCAgICAgMD//wCEIQxCACEBDAILIA1C////////P1gEQCAFQcACaiABIAsgASALIAtQIgYbeSAGQQZ0rXynIgZBD2sQYkEQIAZrIQYgBSkDyAIhCyAFKQPAAiEBCyACQv///////z9WDQAgBUGwAmogAyAKIAMgCiAKUCIHG3kgB0EGdK18pyIHQQ9rEGIgBiAHakEQayEGIAUpA7gCIQogBSkDsAIhAwsgBUGgAmogCkKAgICAgIDAAIQiEkIPhiADQjGIhCICQgBCgICAgLDmvIL1ACACfSIEQgAQYSAFQZACakIAIAUpA6gCfUIAIARCABBhIAVBgAJqIAUpA5gCQgGGIAUpA5ACQj+IhCIEQgAgAkIAEGEgBUHwAWogBEIAQgAgBSkDiAJ9QgAQYSAFQeABaiAFKQP4AUIBhiAFKQPwAUI/iIQiBEIAIAJCABBhIAVB0AFqIARCAEIAIAUpA+gBfUIAEGEgBUHAAWogBSkD2AFCAYYgBSkD0AFCP4iEIgRCACACQgAQYSAFQbABaiAEQgBCACAFKQPIAX1CABBhIAVBoAFqIAJCACAFKQO4AUIBhiAFKQOwAUI/iIRCAX0iAkIA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IAUgA0E5ShshAwJAIBdCB1cEQCADIAdBBHRqIQcMAQsgF0IcWARAIAJBMGogAxB4IAJBIGogHCAYQgBCgICAgICAwP0/ECsgAkEQaiACKQMwIAIpAzggAikDICIcIAIpAygiGBArIAIgAikDECACKQMYIBkgGxBvIAIpAwghGyACKQMAIRkMAQsgA0UgCHINACACQdAAaiAcIBhCAEKAgICAgICA/z8QKyACQUBrIAIpA1AgAikDWCAZIBsQbyACKQNIIRtBASEIIAIpA0AhGQsgF0IBfCEXQQEhCQsgACgCBCIDIAAoAmhHBH8gACADQQFqNgIEIAMtAAAFIAAQTwshAwwBCwsCfiAJRQRAIAApA3BCAFkEQAJAIAAgACgCBCIDQQFrNgIEIAAgA0ECazYCBCABRQ0AIAAgA0EDazYCBAsLIAJB4ABqIAS3RAAAAAAAAAAAohCpASACKQNgIRkgAikDaAwBCyAXQgdXBEAgFyEYA0AgB0EEdCEHIBhCAXwiGEIIUg0ACwsCQAJAAkAgA0FfcUHQAEYEQCAAEIEGIhhCgICAgICAgICAf1INAyAAKQNwQgBZDQEMAgtCACEYIAApA3BCAFMNAgsgACAAKAIEQQFrNgIEC0IAIRgLIAdFBEAgAkHwAGogBLdEAAAAAAAAAACiEKkBIAIpA3AhGSACKQN4DAELIBogFyABG0IChiAYfEIgfSIXQQAgD2utVQRAQcTUBEHEADYCACACQaABaiAEEHggAkGQAWogAikDoAEgAikDqAFCf0L///////+///8AECsgAkGAAWogAikDkAEgAikDmAFCf0L///////+///8AECsgAikDgAEhGSACKQOIAQwBCyAPQeIBa6wgF1cEQCAHQQBOBEADQCACQaADaiAZIBtCAEKAgICAgIDA/79/EG8gGSAbQoCAgICAgID/PxD1BSEAIAJBkANqIBkgGyACKQOgAyAZIABBAE4iABsgAikDqAMgGyAAGxBvIBdCAX0hFyACKQOYAyEbIAIpA5ADIRkgB0EBdCAAciIHQQBODQALCwJ+IBcgD6x9QiB8IhinIgBBACAAQQBKGyANIBggDa1TGyIAQfEATgRAIAJBgANqIAQQeCACKQOIAyEaIAIpA4ADIRxCAAwBCyACQeACakQAAAAAAADwP0GQASAAaxDVARCpASACQdACaiAEEHggAkHwAmogAikD4AIgAikD6AIgAikD0AIiHCACKQPYAiIaEIQGIAIpA/gCIR0gAikD8AILIRggAkHAAmogByAHQQFxRSAZIBtCAEIAEOsBQQBHIABBIEhxcSIAchCOAiACQbACaiAcIBogAikDwAIgAikDyAIQKyACQZACaiACKQOwAiACKQO4AiAYIB0QbyACQaACaiAcIBpCACAZIAAbQgAgGyAAGxArIAJBgAJqIAIpA6ACIAIpA6gCIAIpA5ACIAIpA5gCEG8gAkHwAWogAikDgAIgAikDiAIgGCAdEJIEIAIpA/ABIhggAikD+AEiGkIAQgAQ6wFFBEBBxNQEQcQANgIACyACQeABaiAYIBogF6cQgwYgAikD4AEhGSACKQPoAQwBC0HE1ARBxAA2AgAgAkHQAWogBBB4IAJBwAFqIAIpA9ABIAIpA9gBQgBCgICAgICAwAAQKyACQbABaiACKQPAASACKQPIAUIAQoCAgICAgMAAECsgAikDsAEhGSACKQO4AQshFyALIBk3AxAgCyAXNwMYIAJBsANqJAAgCykDGCEXIAspAxAhGAwCCyAAKQNwQgBTDQAgACAAKAIEQQFrNgIECyAAIQIgAyEJQQAhBCMAQZDGAGsiASQAQQAgD2siDCANayEUAkACfwNAIAVBMEcEQAJAIAVBLkcNBCACKAIEIgAgAigCaEYNACACIABBAWo2AgQgAC0AAAwDCwUgAigCBCIAIAIoAmhHBH8gAiAAQQFqNgIEIAAtAAAFIAIQTwshBUEBIQQMAQsLIAIQTwshBUEBIQYgBUEwRw0AA0AgF0IBfSEXAn8gAigCBCIAIAIoAmhHBEAgAiAAQQFqNgIEIAAtAAAMAQsgAhBPCyIFQTBGDQALQQEhBAsgAUEANgKQBgJ+AkACQAJAIAVBLkYiACAFQTBrIgNBCU1yBEADQAJAIABBAXEEQCAGRQRAIBghF0EBIQYMAgsgBEUhAAwECyAYQgF8IRggB0H8D0wEQCAKIBinIAVBMEYbIQogAUGQBmogB0ECdGoiACAIBH8gBSAAKAIAQQpsakEwawUgAws2AgBBASEEQQAgCEEBaiIAIABBCUYiABshCCAAIAdqIQcMAQsgBUEwRg0AIAEgASgCgEZBAXI2AoBGQdyPASEKCwJ/IAIoAgQiACACKAJoRwRAIAIgAEEBajYCBCAALQAADAELIAIQTwsiBUEuRiIAIAVBMGsiA0EKSXINAAsLIBcgGCAGGyEXIARFIAVBX3FBxQBHckUEQAJAIAIQgQYiGUKAgICAgICAgIB/Ug0AQgAhGSACKQNwQgBTDQAgAiACKAIEQQFrNgIECyAXIBl8IRcMAwsgBEUhACAFQQBIDQELIAIpA3BCAFMNACACIAIoAgRBAWs2AgQLIABFDQBBxNQEQRw2AgAgAhCVBEIAIRdCAAwBCyABKAKQBiIARQRAIAEgCbdEAAAAAAAAAACiEKkBIAEpAwghFyABKQMADAELIBcgGFIgGEIJVXIgDUEeTEEAIAAgDXYbckUEQCABQTBqIAkQeCABQSBqIAAQjgIgAUEQaiABKQMwIAEpAzggASkDICABKQMoECsgASkDGCEXIAEpAxAMAQsgDEEBdq0gF1MEQEHE1ARBxAA2AgAgAUHgAGogCRB4IAFB0ABqIAEpA2AgASkDaEJ/Qv///////7///wAQKyABQUBrIAEpA1AgASkDWEJ/Qv///////7///wAQKyABKQNIIRcgASkDQAwBCyAPQeIBa6wgF1UEQEHE1ARBxAA2AgAgAUGQAWogCRB4IAFBgAFqIAEpA5ABIAEpA5gBQgBCgICAgICAwAAQKyABQfAAaiABKQOAASABKQOIAUIAQoCAgICAgMAAECsgASkDeCEXIAEpA3AMAQsgCARAIAhBCEwEQCABQZAGaiAHQQJ0aiIAKAIAIQYDQCAGQQpsIQYgCEEBaiIIQQlHDQALIAAgBjYCAAsgB0EBaiEHCwJAIBenIgggCkggCkEJTnIgCEERSnINACAIQQlGBEAgAUHAAWogCRB4IAFBsAFqIAEoApAGEI4CIAFBoAFqIAEpA8ABIAEpA8gBIAEpA7ABIAEpA7gBECsgASkDqAEhFyABKQOgAQwCCyAIQQhMBEAgAUGQAmogCRB4IAFBgAJqIAEoApAGEI4CIAFB8AFqIAEpA5ACIAEpA5gCIAEpA4ACIAEpA4gCECsgAUHgAWpBACAIa0ECdEGAzgRqKAIAEHggAUHQAWogASkD8AEgASkD+AEgASkD4AEgASkD6AEQ9AUgASkD2AEhFyABKQPQAQwCCyANIAhBfWxqQRtqIgBBHkxBACABKAKQBiIDIAB2Gw0AIAFB4AJqIAkQeCABQdACaiADEI4CIAFBwAJqIAEpA+ACIAEpA+gCIAEpA9ACIAEpA9gCECsgAUGwAmogCEECdEG4zQRqKAIAEHggAUGgAmogASkDwAIgASkDyAIgASkDsAIgASkDuAIQKyABKQOoAiEXIAEpA6ACDAELA0AgAUGQBmogByIAQQFrIgdBAnRqKAIARQ0AC0EAIQoCQCAIQQlvIgRFBEBBACEDDAELQQAhAyAEQQlqIAQgCEEASBshBAJAIABFBEBBACEADAELQYCU69wDQQAgBGtBAnRBgM4EaigCACICbSEHQQAhBUEAIQYDQCABQZAGaiIMIAZBAnRqIg4gBSAOKAIAIg4gAm4iEmoiBTYCACADQQFqQf8PcSADIAVFIAMgBkZxIgUbIQMgCEEJayAIIAUbIQggByAOIAIgEmxrbCEFIAZBAWoiBiAARw0ACyAFRQ0AIABBAnQgDGogBTYCACAAQQFqIQALIAggBGtBCWohCAsDQCABQZAGaiADQQJ0aiEMIAhBJEghDgJAA0AgDkUEQCAIQSRHDQIgDCgCAEHR6fkETw0CCyAAQf8PaiEHQQAhBANAIAAhAiAErSABQZAGaiAHQf8PcSIFQQJ0aiIANQIAQh2GfCIXQoGU69wDVAR/QQAFIBcgF0KAlOvcA4AiGEKAlOvcA359IRcgGKcLIQQgACAXpyIANgIAIAIgAiACIAUgABsgAyAFRhsgBSACQQFrQf8PcSIGRxshACAFQQFrIQcgAyAFRw0ACyAKQR1rIQogAiEAIARFDQALIANBAWtB/w9xIgMgAEYEQCABQZAGaiICIABB/g9qQf8PcUECdGoiACAAKAIAIAZBAnQgAmooAgByNgIAIAYhAAsgCEEJaiEIIAFBkAZqIANBAnRqIAQ2AgAMAQsLAkADQCAAQQFqQf8PcSECIAFBkAZqIABBAWtB/w9xQQJ0aiEFA0BBCUEBIAhBLUobIQcCQANAIAMhBEEAIQYCQANAAkAgBCAGakH/D3EiAyAARg0AIAFBkAZqIANBAnRqKAIAIgMgBkECdEHQzQRqKAIAIgxJDQAgAyAMSw0CIAZBAWoiBkEERw0BCwsgCEEkRw0AQgAhF0EAIQZCACEYA0AgACAEIAZqQf8PcSIDRgRAIABBAWpB/w9xIgBBAnQgAWpBADYCjAYLIAFBgAZqIAFBkAZqIANBAnRqKAIAEI4CIAFB8AVqIBcgGEIAQoCAgIDlmreOwAAQKyABQeAFaiABKQPwBSABKQP4BSABKQOABiABKQOIBhBvIAEpA+gFIRggASkD4AUhFyAGQQFqIgZBBEcNAAsgAUHQBWogCRB4IAFBwAVqIBcgGCABKQPQBSABKQPYBRArIAEpA8gFIRhCACEXIAEpA8AFIRkgCkHxAGoiByAPayICQQAgAkEAShsgDSACIA1IIgUbIgNB8ABMDQIMBQsgByAKaiEKIAQgACIDRg0AC0GAlOvcAyAHdiEMQX8gB3RBf3MhDkEAIQYgBCEDA0AgAUGQBmoiEiAEQQJ0aiITIAYgEygCACITIAd2aiIGNgIAIANBAWpB/w9xIAMgBkUgAyAERnEiBhshAyAIQQlrIAggBhshCCAOIBNxIAxsIQYgBEEBakH/D3EiBCAARw0ACyAGRQ0BIAIgA0cEQCAAQQJ0IBJqIAY2AgAgAiEADAMLIAUgBSgCAEEBcjYCAAwBCwsLIAFBkAVqRAAAAAAAAPA/QeEBIANrENUBEKkBIAFBsAVqIAEpA5AFIAEpA5gFIBkgGBCEBiABKQO4BSEbIAEpA7AFIRwgAUGABWpEAAAAAAAA8D9B8QAgA2sQ1QEQqQEgAUGgBWogGSAYIAEpA4AFIAEpA4gFEIIGIAFB8ARqIBkgGCABKQOgBSIXIAEpA6gFIhoQkgQgAUHgBGogHCAbIAEpA/AEIAEpA/gEEG8gASkD6AQhGCABKQPgBCEZCwJAIARBBGpB/w9xIgYgAEYNAAJAIAFBkAZqIAZBAnRqKAIAIgZB/8m17gFNBEAgBkUgBEEFakH/D3EgAEZxDQEgAUHwA2ogCbdEAAAAAAAA0D+iEKkBIAFB4ANqIBcgGiABKQPwAyABKQP4AxBvIAEpA+gDIRogASkD4AMhFwwBCyAGQYDKte4BRwRAIAFB0ARqIAm3RAAAAAAAAOg/ohCpASABQcAEaiAXIBogASkD0AQgASkD2AQQbyABKQPIBCEaIAEpA8AEIRcMAQsgCbchHiAAIARBBWpB/w9xRgRAIAFBkARqIB5EAAAAAAAA4D+iEKkBIAFBgARqIBcgGiABKQOQBCABKQOYBBBvIAEpA4gEIRogASkDgAQhFwwBCyABQbAEaiAeRAAAAAAAAOg/ohCpASABQaAEaiAXIBogASkDsAQgASkDuAQQbyABKQOoBCEaIAEpA6AEIRcLIANB7wBKDQAgAUHQA2ogFyAaQgBCgICAgICAwP8/EIIGIAEpA9ADIAEpA9gDQgBCABDrAQ0AIAFBwANqIBcgGkIAQoCAgICAgMD/PxBvIAEpA8gDIRogASkDwAMhFwsgAUGwA2ogGSAYIBcgGhBvIAFBoANqIAEpA7ADIAEpA7gDIBwgGxCSBCABKQOoAyEYIAEpA6ADIRkCQCAUQQJrIAdB/////wdxTg0AIAEgGEL///////////8AgzcDmAMgASAZNwOQAyABQYADaiAZIBhCAEKAgICAgICA/z8QKyABKQOQAyABKQOYA0KAgICAgICAuMAAEPUFIQAgASkDiAMgGCAAQQBOIgQbIRggASkDgAMgGSAEGyEZIAUgAiADRyAAQQBIcnEgFyAaQgBCABDrAUEAR3FFIBQgBCAKaiIKQe4Aak5xDQBBxNQEQcQANgIACyABQfACaiAZIBggChCDBiABKQP4AiEXIAEpA/ACCyEYIAsgFzcDKCALIBg3AyAgAUGQxgBqJAAgCykDKCEXIAspAyAhGAsgESAYNwMAIBEgFzcDCCALQTBqJAAgESkDACEXIBAgESkDCDcDCCAQIBc3AwAgEUGgAWokACAQKQMAIBApAwgQ8wUhHyAQQRBqJAAgHwv9AwIEfwF+AkACQAJ/AkACQAJ/IAAoAgQiASAAKAJoRwRAIAAgAUEBajYCBCABLQAADAELIAAQTwsiAUEraw4DAAEAAQsgAUEtRgJ/IAAoAgQiASAAKAJoRwRAIAAgAUEBajYCBCABLQAADAELIAAQTwsiAUE6ayICQXVLDQEaIAApA3BCAFMNAiAAIAAoAgRBAWs2AgQMAgsgAUE6ayECQQALIQMgAkF2SQ0AAkAgAUEwa0EKTw0AQQAhAgNAIAEgAkEKbGpBMGsiAkHMmbPmAEgCfyAAKAIEIgEgACgCaEcEQCAAIAFBAWo2AgQgAS0AAAwBCyAAEE8LIgFBMGsiBEEJTXENAAsgAqwhBSAEQQpPDQADQCABrSAFQgp+fCEFAn8gACgCBCIBIAAoAmhHBEAgACABQQFqNgIEIAEtAAAMAQsgABBPCyIBQTBrIgJBCU0gBUIwfSIFQq6PhdfHwuujAVNxDQALIAJBCk8NAANAAn8gACgCBCIBIAAoAmhHBEAgACABQQFqNgIEIAEtAAAMAQsgABBPC0Ewa0EKSQ0ACwsgACkDcEIAWQRAIAAgACgCBEEBazYCBAtCACAFfSAFIAMbIQUMAQtCgICAgICAgICAfyEFIAApA3BCAFMNACAAIAAoAgRBAWs2AgRCgICAgICAgICAfw8LIAULygYCBX8EfiMAQYABayIFJAACQAJAAkAgAyAEQgBCABDrAUUNAAJ/IARC////////P4MhCwJ/IARCMIinQf//AXEiBkH//wFHBEBBBCAGDQEaQQJBAyADIAuEUBsMAgsgAyALhFALCyEJIAJCMIinIghB//8BcSIHQf//AUYNACAJDQELIAVBEGogASACIAMgBBArIAUgBSkDECICIAUpAxgiASACIAEQ9AUgBSkDCCECIAUpAwAhBAwBCyABIAJC////////////AIMiCyADIARC////////////AIMiChDrAUEATARAIAEgCyADIAoQ6wEEQCABIQQMAgsgBUHwAGogASACQgBCABArIAUpA3ghAiAFKQNwIQQMAQsgBEIwiKdB//8BcSEGIAcEfiABBSAFQeAAaiABIAtCAEKAgICAgIDAu8AAECsgBSkDaCILQjCIp0H4AGshByAFKQNgCyEEIAZFBEAgBUHQAGogAyAKQgBCgICAgICAwLvAABArIAUpA1giCkIwiKdB+ABrIQYgBSkDUCEDCyAKQv///////z+DQoCAgICAgMAAhCEMIAtC////////P4NCgICAgICAwACEIQsgBiAHSARAA0ACfiALIAx9IAMgBFatfSIKQgBZBEAgCiAEIAN9IgSEUARAIAVBIGogASACQgBCABArIAUpAyghAiAFKQMgIQQMBQsgCkIBhiAEQj+IhAwBCyALQgGGIARCP4iECyELIARCAYYhBCAHQQFrIgcgBkoNAAsgBiEHCwJAIAsgDH0gAyAEVq19IgpCAFMEQCALIQoMAQsgCiAEIAN9IgSEQgBSDQAgBUEwaiABIAJCAEIAECsgBSkDOCECIAUpAzAhBAwBCyAKQv///////z9YBEADQCAEQj+IIQ0gB0EBayEHIARCAYYhBCANIApCAYaEIgpCgICAgICAwABUDQALCyAIQYCAAnEhBiAHQQBMBEAgBUFAayAEIApC////////P4MgB0H4AGogBnKtQjCGhEIAQoCAgICAgMDDPxAr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6e0AQdjsAEHUIUGzxAAQAAALCyAFQQxqEBkgBUEgaiQAQRALrwEBAn8jAEEgayIEJAAgACgCACEFIARBCGogA0EAEO0BIAAgASAEKAIIIgEgAUEfdSIBcyABayIBIAJBwAAgAUEBa2dBAXRrQQAgAUECTxtqQQhqIgJB4A8QrwMhASADKAIEBEAgBEIANwIYIARCgICAgICAgICAfzcCECAEIAU2AgwgBEEMaiIDQgEQMhogACADIAAgAkHgDxCIASABciEBIAMQGQsgBEEgaiQAIAELkAYCCH8BfiMAQfAAayIDJAAgACABRwRAIAAoAgAhBCADQgA3AmggA0KAgICAgICAgIB/NwJgIAMgBDYCXCADQdwAaiIFIAEQSRogA0IANwJUIANCgICAgICAgICAfzcCTCADIAQ2AkggAygCZCEGIANBADYCZCADQcgAaiIBQqrVqtUKEDIaIANBADYCUCAFIAEQrAIEQCADIAMoAmRBAWo2AmQgBkEBayEGCyADQcgAahAZIAJBAWpBAXYQuQQhBSADQgA3AlQgA0KAgICAgICAgIB/NwJMIAMgBDYCSCADQgA3AkAgA0KAgICAgICAgIB/NwI4IAMgBDYCNCADQdwAaiIBIAFCf0H/////A0EAEHoaIAVBACAFQQBKGyEJIAIgBWogAiAFQQF0bkEBaiIKQQF0akEgaiECQQAhAQNAIAEgCUZFBEAgA0HIAGoiByADQdwAaiIIQgEgAkEAEHoaIANBNGoiCyAHIAJBBhC1BCAHIAtCASACQQAQehogCCAIIAcgAkEAEIgBGiABQQFqIQEMAQsLIANCADcCLCADQoCAgICAgICAgH83AiQgAyAENgIgIANCADcCGCADQoCAgICAgICAgH83AhAgAyAENgIMIANBIGoiASADQdwAaiIEQgIgAkEAEHoaIAEgBCABIAJBABCIARogA0EMaiABIAEgAkEAEEAaIABCABAyGiAKrSEMA0AgDKdBAExFBEAgA0HIAGoiAUIBEDIaIANBNGoiBCAMQgGGQv7///8Pg0IBhBAyGiABIAEgBCACQQAQiAEaIAAgACABIAJBABC4ARogACAAIANBDGogAkEAEEAaIAxCAX0hDAwBCwsgACAAQgEgAkEAEHoaIAAgACADQSBqIgEgAkEAEEAaIAEQGSADQQxqEBkgA0E0ahAZ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C0KAgICAMCEFIAZCgICAgHCDQoCAgIAwUQ0DIAAgBkEBEJABGgwDC0KAgICAMCEJQoCAgIAwIQZCgICAgDAhBSAAIAQQICIHQoCAgIBwg0KAgICA4ABRDQILIAAgDUEIaiAHEC9BAEgNACANAn4gDSkDCCIEQoCAgIAIfEL/////D1gEQCAEQv////8PgwwBC0KAgICAwH4gBLm9IgVCgICAgMCBgPz/AH0gBUL///////////8Ag0KAgICAgICA+P8AVhsLIgg3AyAgACABQQEgDUEgahC/AyEFIAAgCBAMAkAgBUKAgICAcINCgICAgOAAUQ0AQgAhCCAEQgAgBEIAVRshDANAIAggDFENBCAAIAcgCBBsIgRCgICAgHCDQoCAgIDgAFENAQJAIA4EQCAEIQEMAQsgDSAENwMgIA0gCEL/////D4M3AyggACAKIAtBAiANQSBqEBwhASAAIAQQDCABQoCAgIBwg0KAgICA4ABRDQILIAAgBSAIIAEQeyERIAhCAXwhCCARQQBODQALCwwBC0KAgICAMCEFCyAAIAUQDEKAgICA4AAhBQsgACAHEAwgACAGEAwgACAJEAwgDUEwaiQAIAULDwAgACsDACABKwMAEMQECzkBAX5CgICAgMB+IAEpAwAiAkKAgICAwIGA/P8AfSACQv///////////wCDQoCAgICAgID4/wBWGwsRACAAKgIAuyABKgIAuxDEBAs7AQF+QoCAgIDAfiABKgIAu70iAkKAgICAwIGA/P8AfSACQv///////////wCDQoCAgICAgID4/wBWGwsZAQJ+IAEpAwAiAyAAKQMAIgRUIAMgBFZrCwwAIAAgASkDABCIBAsZAQJ+IAEpAwAiAyAAKQMAIgRTIAMgBFVrCwwAIAAgASkDABC/AgsXACABKAIAIgEgACgCACIASSAAIAFJaws9AQF+IAEoAgAiAEEATgRAIACtDwtCgICAgMB+IAC4vSICQoCAgIDAgYD8/wB9IAJCgICAgICAgPj/AFYbC9sFAwV/A34BfCMAQUBqIgUkAAJAAnwCQAJAAkACQAJAIAJBACABQoCAgIBwgyILQoCAgIAwUhsiAg4CAgABCwJAIAMpAwAiCUKAgICAcFQNACAJpyIELwEGQQpHDQAgBCkDICIKQiCIpyIEQQAgBEELakESSRsNACAAIAUg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IQULIAJBEGokACAFCx0AIAAgAUEAEGsiAEUEQEKAgICA4AAPCyAANQIoCz0BAX5CgICAgBAhASADKQMAIgRCgICAgHBaBH4gBKcvAQZBFWtB//8DcUEMSa1CgICAgBCEBUKAgICAEAsL7gMCBX4CfyMAQSBrIgokAEKAgICA4AAhBQJAIAAgASAEEFoiC0UNACALLQAEBEAgABBfDAELIAAgCkEYaiADKQMAQgAgCzQCACIGIAYQZg0AIAogBjcDECADKQMIIgdCgICAgHCDQoCAgIAwUgRAIAAgCkEQaiAHQgAgBiAGEGYNASAKKQMQIQYLIAopAxghCSAAIAFCgICAgDAQ/QEiB0KAgICAcIMiBUKAgICA4ABRBEAgByEFDAELIAYgCX0iBkIAIAZCAFUbIQgCQCAFQoCAgIAwUQRAIABCgICAgDAgCCAEEOUDIQUMAQsgCiAGQv////8HVwR+IAhC/////w+DBUKAgICAwH4gCLm9IgVCgICAgMCBgPz/AH0gBUL///////////8Ag0KAgICAgICA+P8AVhsLNwMIIAAgB0EBIApBCGoQowEhBSAAIAcQDCAAIAopAwgQDAsgBUKAgICAcINCgICAgOAAUQ0AAkAgACAFIAQQWiICRQ0AIAAgBSABEE0EQCAAQco0QQAQEgwBCwJAIAItAAQNACACNAIAIAhTBEAgAEHOwgBBABASDAILIAstAAQNACACKAIIIAsoAgggCadqIAinEB4aDAILIAAQXwsgACAFEAxCgICAgOAAIQULIApBIGokACAFC1EAIAAgASACEFoiAEUEQEKAgICA4AAPCyAAKAIAIgBBAE4EQCAArQ8LQoCAgIDAfiAAuL0iAUKAgICAwIGA/P8AfSABQoCAgICAgID4/wBWGwv/AwICfwF+AkACQAJAAkACQAJAIAFCgICAgHBaBEAgAaciAi8BBkErRg0BCyAEQQE2AgAMAQsgAigCICEGIARBATYCACAGDQELIABBsS1BABASDAELIAYoAgQhAgJAAkACQAJ/AkACQAJAAkAgBigCACIHQQFrDgQCAgcBAAsgBUUNAiAAIAYQyQQLQoCAgIAwIQEgBUEBaw4CAwQHCyADKQMAIgFCIIinQXVPBEAgAaciAyADKAIAQQFqNgIACwJAIAVBAkcNAEEBIQMgB0EBRw0AIAAgARCYASAGKAIEDAILIAIoAmQiAyAFrTcDACADQQhrIAE3AwAgAiADQQhqNgJkC0EAIQMgAgsiBSADNgIcIAZBAzYCACAAIAUQsQIhASAGQQE2AgAgBigCBCgCIARAIAAgBhDJBCABDwsgAUKAgICAEFoNBSACKAJkQQhrIgApAwAhCCAAQoCAgIAwNwMAIAFCAlEEQCAGQQI2AgAgBEECNgIAIAgPCyAEQQA2AgAgCA8LIAMpAwAiAUIgiKdBdUkNAyABpyIAIAAoAgBBAWo2AgAgAQ8LIAMpAwAiAUIgiKdBdU8EQCABpyICIAIoAgBBAWo2AgALIAAgARCYAQwBCyAAQY8tQQAQEgtCgICAgOAAIQELIAEPC0HW8QBBqOwAQaCUAUHEFBAAAAt3AQF+IAMpAwAiAUKAgICAcINCgICAgIB/UgRAIABBkcEAQQAQEkKAgICA4AAPC0KAgICAMCEEIAGnIgApAgRCgICAgICAgIBAg0KAgICAgICAgIB/UQR+IAAgACgCAEEBajYCACABQoCAgICQf4QFQoCAgIAwCws8AQF+QoCAgIDgACEBIAAgAykDABAlIgRCgICAgHCDQoCAgIDgAFIEfiAAIASnQQIQ5gMFQoCAgIDgAAsLVgIBfgF/IAAgARC7AyIBQoCAgIBwg0KAgICA4ABRBEAgAQ8LQoCAgIAwIQIgAaciAygCBEGAgICAeEcEQCAAIAAoAhAgAxDGAhApIQILIAAgARAMIAILCQAgACABELsDC1sBAX4jAEEQayICJAAgAiAAIAEQuwMiATcDCAJAIAFCgICAgHCDQoCAgIDgAFEEQCABIQQMAQsgAEKAgICAMEEBIAJBCGoQygQhBCAAIAEQDAsgAkEQaiQAIAQLLQBCgICAgOAAIAAgAykDACADKQMIQQAQiQIiAEEAR61CgICAgBCEIABBAEgbC6ABAQN+IAMpAwAiBSEEIAJBBE4EQCADKQMYIQQLIAVC/////29YBEAgABAiQoCAgIDgAA8LIAMpAxAhAUKAgICA4AAhBgJAIAAgAykDCBAwIgJFDQAgAUIgiKdBdU8EQCABpyIDIAMoAgBBAWo2AgALIAAgBSACIAEgBEEAENABIQMgACACEBAgA0EASA0AIANBAEetQoCAgIAQhCEGCyAGCyoAIAMpAwAiAUL/////b1gEQCAAECJCgICAgOAADwsgACABQQNBABCyAgtjAQF+IAMpAwAiBEL/////b1gEQCAAECJCgICAgOAADwtCgICAgOAAIQECQCAAIAMpAwgQMCICRQ0AIAAgBCACEG4hAyAAIAIQECADQQBIDQAgA0EAR61CgICAgBCEIQELIAELYwEDfgJAAkAgAykDACIBQv////9vWARAIAAQIgwBCyADKQMIIQUgASEEIAJBA04EQCADKQMQIQQLIAAgBRAwIgINAQtCgICAgOAADwsgACABIAIgBEEAEBEhBiAAIAIQECAGC2YBAX4gAykDACIEQv////9vWARAIAAQIkKAgICA4AAPC0KAgICA4AAhAQJAIAAgAykDCBAwIgJFDQAgACAEIAJBABDNASEDIAAgAhAQIANBAEgNACADQQBHrUKAgICAEIQhAQsgAQuaAQIBfwJ+IwBBEGsiBCQAIAMpAwghBSADKQMAIgYhAQJAAkACQAJAIAJBA0gNACADKQMQIgFCgICAgHBaBEAgAactAAVBEHENAQsgAEGdLEEAEBIMAQsgACAEQQxqIAUQ/QMiAg0BC0KAgICA4AAhAQwBCyAAIAYgASAEKAIMIgMgAhD+AiEBIAAgAiADEIYDCyAEQRBqJAAgAQt5AQF/IAFCgICAgHCDQoCAgIAwUgRAIABBnSxBABASQoCAgIDgAA8LAn4CQCACRQ0AIAMpAwAiAUKAgICAcINCgICAgDBRDQBCgICAgOAAIAAgARAlIgFCgICAgHCDQoCAgIDgAFENARogAachBAsgACAEQQMQ5gMLCxUAIAAgAykDACADIANBCGpBAhCIAws3ACMAQRBrIgIkACAAIAJBDGogAykDABB1IQAgAigCDCEDIAJBEGokAEKAgICA4AAgA2etIAAbC04AIwBBEGsiAiQAQoCAgIDgACEBAkAgACACQQxqIAMpAwAQdQ0AIAAgAkEIaiADKQMIEHUNACACKAIIIAIoAgxsrSEBCyACQRBqJAAgAQsGACAAtrsLfwAgACAAKQPQASIBQgyIIAGFIgFCGYYgAYUiAUIbiCABhSIBNwPQAUKAgICAwH4gAUKdurP7lJL9oiV+QgyIQoCAgICAgID4P4S/RAAAAAAAAPC/oL0iAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGwuIBAMFfAV/AX4jAEEQayIKJAAgCkIANwMIAkACQCACQQBMDQBCgICAgOAAIQEgACAKQQhqIAMpAwAQQg0BQQEhCyAKKwMIIQQgAkEBRwRAA0AgAiALRg0CIAAgCiADIAtBA3RqKQMAEEINAyALQQFqIQsgCisDACEFIwBBIGsiCSQAAkAgBJkiByAFmSIGIAe9IAa9VCIMGyIEvSIOQjSIpyINQf8PRg0AIAYgByAMGyEFAkAgDlANACAFvUI0iKciDEH/D0YNACAMIA1rQcEATgRAIAcgBqAhBAwCCwJ8IAxB/gtPBEAgBEQAAAAAAAAwFKIhBCAFRAAAAAAAADAUoiEFRAAAAAAAALBrDAELRAAAAAAAAPA/IA1BvARLDQAaIAREAAAAAAAAsGuiIQQgBUQAAAAAAACwa6IhBUQAAAAAAAAwFAshCCAJQRhqIAlBEGogBRCIBiAJQQhqIAkgBBCIBiAIIAkrAwAgCSsDEKAgCSsDCKAgCSsDGKCfoiEEDAELIAUhBAsgCUEgaiQADAALAAsgBJkhBAsgBL0iAQJ/IASZRAAAAAAAAOBBYwRAIASqDAELQYCAgIB4CyIAt71RBEAgAK0hAQwBC0KAgICAwH4gAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGyEBCyAKQRBqJAAgAQtOACAAIABEAAAAAAAA8L9EAAAAAAAA8D8gAEQAAAAAAAAAAGMbIAC9Qv///////////wCDQoCAgICAgID4/wBWGyAARAAAAAAAAAAAYRsLgwECAn4BfyAAvSIBQjSIp0H/D3EiA0H+B00EQCABQoCAgICAgICAgH+DIQIgA0H+B0cgAUKAgICAgICA8L9/UXJFBEAgAkKAgICAgICA+D+Evw8LIAK/DwsgA0GyCE0EfCABQj+HIAF8QgFBswggA2uthiIBQgGIfEIAIAF9g78FIAALC4IFAwJ8BX8CfiMAQRBrIgkkAAJ+QoCAgIDA/v/7/wBCgICAgMD+/3sgBBsgAkUNABoCfCADKQMAIgFC/////w9YBEBBASACIAJBAUwbIQogAachCEEBIQcDQCAHIApHBEAgCLcgAyAHQQN0aikDACIBQoCAgIAQWg0DGiAIIAGnIgsgCCALShsgCCALIAggC0gbIAQbIQggB0EBaiEHDAELCyAIrQwCC0KAgICA4AAgACAJQQhqIAEQQg0BGkEBIQcgCSsDCAshBSAHIAIgAiAHSBshAgNAIAIgB0cEQEKAgICA4AAgACAJIAMgB0EDdGopAwAQQg0CGgJAIAW9IgxC////////////AINCgICAgICAgPj/AFYNACAJKwMAIga9IgFC////////////AINCgICAgICAgPj/AFYEQCAGIQUMAQsgBUQAAAAAAAAAAGEgBkQAAAAAAAAAAGFxIQogBARAIAoEQCABIAyDvyEFDAILIAUgBSAGpSAGvUL///////////8Ag0KAgICAgICA+P8AVhsgBiAFvUL///////////8Ag0KAgICAgICA+P8AWBshBQwBCyAKBEAgASAMhL8hBQwBCyAFIAUgBqQgBr1C////////////AINCgICAgICAgPj/AFYbIAYgBb1C////////////AINCgICAgICAgPj/AFgbIQULIAdBAWohBwwBCwsgBb0iAQJ/IAWZRAAAAAAAAOBBYwRAIAWqDAELQYCAgIB4CyIAt71RBEAgAK0MAQtCgICAgMB+IAFCgICAgMCBgPz/AH0gAUL///////////8Ag0KAgICAgICA+P8AVhsLIQ0gCUEQaiQAIA0L4wECAX4CfyMAQRBrIgIkAAJAIAAgAUEpEFoiA0UEQCAEQQA2AgBCgICAgOAAIQEMAQtCgICAgDAhAQJAIAMpAwAiBkKAgICAcINCgICAgDBSBEAgAiADKAIMIgU2AgwgBSAGpyIHKAIEQf////8HcUkNASAAIAYQDCADQoCAgIAwNwMACyAEQQE2AgAMAQsgByACQQxqEMYBIQggAyACKAIMNgIMIARBADYCACAIQf//A00EQCAAIAhB//8DcRCUAyEBDAELIAAgByAFQQF0akEQakECEJIDIQELIAJBEGokACABC5EDAgN/An4jAEEgayICJABCgICAgOAAIQgCQCAAIAEQSiIBQoCAgIBwg0KAgICA4ABRDQAgACACQQhqIgVBBxA+GiAFQTwQPBogBSAEQQN0IgRB0OEBaigCACIGEIMBGiAEQdThAWooAgAiBARAIAVBIBA8GiAFIAQQgwEaIAVB2pEBEIMBGiAAIAMpAwAQSiIJQoCAgIBwg0KAgICA4ABRBEAgACABEAwgAigCCCgCECIAQRBqIAIoAgwgACgCBBEAAAwCCyAJpyIH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QdAAaiQAIAYLuAICA38DfiMAQSBrIgIkAEKAgICA4AAhBwJAAkACQCAAIAEQSiIBQoCAgIBwg0KAgICA4ABRDQAgACACIAMpAwAQ4wENACACKQMAIghCgICAgAhaBEAgAEHTGEEAEEQMAQsgCKciA0EBRg0BIAGnIgQpAgQiCaciBkH/////B3EiBUUNASAJQv////8HgyAIfkKAgICABFoEQCAAQeTIAEEAEDoMAQsgACACQQhqIAMgBWwgBkEfdhCZAw0AAkAgBUEBRwRAA0AgA0EATA0CIAJBCGogBEEAIAUQSxogA0EBayEDDAALAAsgAkEIagJ/IAQtAAdBgAFxBEAgBC8BEAwBCyAELQAQCyADEMsEGgsgACABEAwgAkEIahA3IQcMAgsgACABEAwMAQsgASEHCyACQSBqJAAgBwtYAQF+IAAgAykDABDkAUEAR61CgICAgBCEIQQgAUKAgICAcINCgICAgDBRBEAgBA8LIAAgAUEGEF4iAUKAgICAcINCgICAgOAAUgRAIAAgASAEEL0BCyABC8EBAgJ/An4jAEEQayIEJABCgICAgOAAIQYCQCAAIAEQSiIBQoCAgIBwg0KAgICA4ABRBEAgASEGDAELAkAgACAEQQxqIAMpAwAgAaciBSgCBEH/////B3EiAiACEFYNACAEIAI2AgggAykDCCIHQoCAgIBwg0KAgICAMFIEQCAAIARBCGogByACIAIQVg0BIAQoAgghAgsgACAFIAQoAgwiAyACIAMgAiADShsQjgEhBgsgACABEAwLIARBEGokACAGC8ABAgN/An4jAEEQayICJABCgICAgOAAIQcCQCAAIAEQSiIBQoCAgIBwg0KAgICA4ABRBEAgASEHDAELAkAgACACQQxqIAMpAwAgAaciBigCBEH/////B3EiBCAEEFYNACACIAQgAigCDCIFayIENgIIIAAgBiAFIAMpAwgiCEKAgICAcINCgICAgDBSBH8gACACQQhqIAggBEEAEFYNASACKAIIBSAECyAFahCOASEHCyAAIAEQDAsgAkEQaiQAIAcL0wECAn8CfiMAQRBrIgIkAEKAgICA4AAhBgJAIAAgARBKIgFCgICAgHCDQoCAgIDgAFEEQCABIQYMAQsCQCAAIAJBDGogAykDACABpyIFKAIEQf////8HcUEAEFYNACACIAUo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ABogAy0AAEEBcUUEQCADKAI4IQAgAygCNCIBBEAgASAANgI4CyAABEAgACABNgI0CyADQZjVBCgCAEYEQEGY1QQgADYCAAsgAygCYBDUASADENQBCyAMEAogDBDUAQsgB0HQAWokAAsJACAAIAEQzwQLLAAgACABEM8EIgFCgICAgHCDQoCAgIDgAFIEfiAAQQNBAiABpxsQKQUgAQsLkAECAXwBfiMAQRBrIgIkAAJ+IAMpAwAiAUIgiKciAwRAQoCAgIAQIANBC2pBEkkNARoLQoCAgIDgACAAIAJBCGogARBCDQAaIAIrAwgiBJlE////////P0NlIAS9QoCAgICAgID4/wCDQoCAgICAgID4/wBSIAScIARhcXGtQoCAgIAQhAshBSACQRBqJAAgBQsmAEKAgICA4AAgACADKQMAENkFIgBBAEetQoCAgIAQhCAAQQBIGwsvAQF+An4gAygCBCICBEBCgICAgBAiBCACQQtqQRJJDQEaCyAAIAQgAyADENIECwsvAQF+An4gAygCBCICBEBCgICAgBAiBCACQQtqQRJJDQEaCyAAIAQgAyADENMECwsJACAAIAEQngILowECAn4BfyMAQRBrIgIkAAJ+IAAgARCeAiIFQoCAgIBwg0KAgICA4ABRBEAgBQwBC0EKIQcCQAJAIAQNACADKQMAIgFCgICAgHCDQoCAgIAwUQ0AIAAgARDbBCIHQQBIDQELQoCAgIDgACAAIAJBCGogBRBtDQEaIAAgAisDCCAHQQBBABC6AgwBCyAAIAUQDEKAgICA4AALIQYgAkEQaiQAIAYLkAICAX4BfCMAQRBrIgIkAEKAgICA4AAhBAJAIAAgARCeAiIBQoCAgIBwg0KAgICA4ABRBEAgASEEDAELIAAgAiABEG0NAAJAAkAgAykDACIBQoCAgIBwg0KAgICAMFEEQCACKwMAIgW9IQEMAQsgACACQQxqIAEQswENAiACKwMAIgW9IgFCgICAgICAgPj/AINCgICAgICAgPj/AFINAQsgAEKAgICAwH4gAUKAgICAwIGA/P8AfSAFvUL///////////8Ag0KAgICAgICA+P8AVhsQNCEEDAELIAIoAgwiA0HlAGtBm39NBEAgAEHrIUEAEEQMAQsgACAFQQogA0EBELoCIQQLIAJBEGokACAEC80BAgF+AnwjAEEQayICJABCgICAgOAAIQQCQCAAIAEQngIiAUKAgICAcINCgICAgOAAUQRAIAEhBAwBCyAAIAIgARBtDQAgACACQQxqIAMpAwAQswENACACKAIMIgNB5QBPBEAgAEHrIUEAEEQMAQsgAisDACIFmSIGRFDv4tbkGktEZgRAIABCgICAgMB+IAW9QoCAgIDAgYD8/wB9IAa9QoCAgICAgID4/wBWGxA0IQQMAQsgACAFQQogA0ECELoCIQQLIAJBEGokACAEC4sCAwF+AX8BfCMAQRBrIgIkAEKAgICA4AAhBAJAIAAgARCeAiIBQoCAgIBwg0KAgICA4ABRBEAgASEEDAELIAAgAiABEG0NACAAIAJBDGogAykDABCzAQ0AIAIrAwAiBr0iAUKAgICAgICA+P8Ag0KAgICAgICA+P8AUQRAIABCgICAgMB+IAFCgICAgMCBgPz/AH0gAUL///////////8Ag0KAgICAgICA+P8AVhsQNCEEDAELAn8gAzUCBEIghkKAgICAMFEEQEEEDAELIAIoAgwiA0HlAE8EQCAAQeshQQAQRAwCCyADQQFqIQVBBQshAyAAIAZBCiAFIAMQugIhBAsgAkEQaiQAIAQLjgECAX4Cf0KAgICAMCEBAkAgAkEDa0F+SQ0AQoCAgIDgACEBIAAgAykDAEKAgICAMEKAgICAMBDyAyIEQoCAgIBwg0KAgICA4ABRBEAgBA8LIAAgBBCoASEFIAAgBBAMIAVFDQAgBSACQQJGBH8gACADKQMIEOQBBUEACxAFIAAgBRAxQoCAgIAwIQELIAELtwICAX4DfyMAQRBrIgUkACAFQQA6AA9CgICAgDAhAQJAIAJBA2tBfkkNAAJAIAAgAykDABCoASIGRQ0AAkAgAkECRw0AIAAgAykDCEKAgICAMEKAgICAMBDyAyIEQoCAgIBwg0KAgICA4ABRBEAgACAGEDEgBCEBDAMLIAAgBBCoASEHIAAgBBAMIAcNACAAIAYQMQwBCyAGIAcgBUEPahAGIQIgACAGEDEgACAHEDEgAkUNAQJAIAUtAA9FBEAgACACIAIQPUGHgAEQ8wMhAQwBC0KAgICA4AAhAQJAIABBAxCGASIEQoCAgIBwg0KAgICA4ABRBEBCgICAgCAhBAwBCyAAIARBMyAAIAIQYEEDEBUaCyAAIAQQmAELIAIQ1AEMAQtCgICAgOAAIQELIAVBEGokACABC80CAQd/IwBBIGsiBCQAIAAgAykDABAlIgFCgICAgHCDQoCAgIDgAFIEQCAAIARBCGpBABA+GiABpyIFQRBqIQYgBSgCBEH/////B3EiCEEDayEJIAhBBmshCkEAIQMDQCADIAhORQRAAkACfyAFKQIEQoCAgIAIg1AiB0UEQCAGIANBAXRqLwEADAELIAMgBmotAAALIgJBJUcNAAJAIAMgCkoNACADQQFqIQICfyAHRQRAIAYgAkEBdGovAQAMAQsgAiAGai0AAAtB9QBHDQAgBSADQQJqQQQQvQMiAkEASA0AIANBBWohAwwBC0ElIQIgAyAJSg0AIAUgA0EBakECEL0DIgJBJSACQQBOIgcbIQIgA0ECaiADIAcbIQMLIARBCGogAhCHARogA0EBaiEDDAELCyAAIAEQDCAEQQhqEDchAQsgBEEgaiQAIAEL5AEBBH8jAEEgayICJAAgACADKQMAECUiAUKAgICAcINCgICAgOAAUgRAIAAgAkEIaiABpyIFKAIEQf////8HcRA+GiAFQRBqIQYgBSgCBEH/////B3EhB0EAIQMDQCADIAdGRQRAAkACQAJAIAUtAAdBgAFxRQRAIAMgBmotAAAhBAwBCyAGIANBAXRqLwEAIgRB/wFLDQELQbDXASAEQcUAEJICRQ0AIAJBCGogBBCHARoMAQsgAkEIaiAEEPUBCyADQQFqIQMMAQsLIAAgARAMIAJBCGoQNyEBCyACQSBqJAAgAQvMBAIGfwF+IwBBIGsiBiQAAkAgACADKQMAECUiAUKAgICAcINCgICAgOAAUQ0AIAAgBkEIaiABpyIJKAIEQf////8HcRA+GiAJQRBqIQhBACECAkADQCAJKQIEIgunQf////8HcSIKIAJKBEAgAkEBaiEFAkACQCALQoCAgIAIgyILUARAIAIgCGotAAAhAwwBCyAIIAJBAXRqLwEAIgNB/wFLDQELAkAgA0Ewa0EKSSADQd//A3FBwQBrQRpJcg0AQaOMASADQQkQkgINACAEDQEgAxDQBEUNAQsgBkEIaiADEIcBGiAFIQIMAgsCfwJ/AkAgA0GA+ANxIgdBgLADRwRAIAdBgLgDRw0BQboxIQcMBgtB3y4hByAFIApODQUCfyALUEUEQCAIIAVBAXRqLwEADAELIAUgCGotAAALIgVBgMADa0GAeEkNBSAGQQhqIAVB/wdxIANBCnRBgPg/cXJBgIAEaiIDQRJ2QfABchD1ASADQQx2QT9xQYABciEHIAJBAmoMAQsgA0H/AE0EQCAGQQhqIAMQ9QEgBSECDAQLIANB/w9NBEAgBSECIANBBnZBwAFyDAILIANBDHZB4AFyIQcgBQshAiAGQQhqIAcQ9QEgA0EGdkE/cUGAAXILIQcgBkEIaiIFIAcQ9QEgBSADQT9xQYABchD1AQwBCwsgACABEAwgBkEIahA3IQEMAQsgACAHEL4DIAAgARAMIAYoAggoAhAiAEEQaiAGKAIMIAAoAgQRAABCgICAgOAAIQELIAZBIGokACABC6EEAgZ/AX4jAEEgayIFJAACQCAAIAMpAwAQJSIBQoCAgIBwg0KAgICA4ABRDQAgACAFQQhqQQAQPhogAaciCEEQaiEJQQAhAgNAAkACQAJAIAgpAgQiC6dB/////wdxIAJKBEACfyALQoCAgIAIg1BFBEAgCSACQQF0ai8BAAwBCyACIAlqLQAACyIDQSVGBEAgACAIIAIQ0QQiA0EASA0DIAJBA2ohBiADQf8ATQRAIAQEQCAGIQIMBgtBJSADIAMQ0AQiBxshAyACQQFqIAYgBxshAgwFCwJ/IANB4P///wdxQcABRgRAIANBH3EhA0GAASEHQQEMAQsgA0Hw////B3FB4AFGBEAgA0EPcSEDQYAQIQdBAgwBCyADQfj///8HcUHwAUcEQEEBIQdBACEDQQAMAQsgA0EHcSEDQYCABCEHQQMLIQIDQCACQQBMDQMgACAIIAYQ0QQiCkEASA0EIAZBA2ohBiAKQcABcUGAAUcEQEEAIQMMBAUgAkEBayECIApBP3EgA0EGdHIhAwwBCwALAAsgAkEBaiECDAMLIAAgARAMIAVBCGoQNyEBDAQLIAYhAiADIAdIIANB///DAEpyRSADQYBwcUGAsANHcQ0BIABB9IABEL4DCyAAIAEQDCAFKAIIKAIQIgBBEGogBSgCDCAAKAIEEQAAQoCAgIDgACEBDAILIAVBCGogAxCxARoMAAsACyAFQSBqJAAgAQs5AQF+IAAgAykDABCoASICRQRAQoCAgIDgAA8LIAAgAhD+ASACakEAQQpBABCAAiEEIAAgAhAxIAQLhwEBAX8jAEEQayICJAACQCAAIAMpAwAQqAEiBEUEQEKAgICA4AAhAQwBCwJ+QoCAgIDgACAAIAJBDGogAykDCBB1DQAaIAIoAgwiAwRAQoCAgIDAfiADQSVrQV1JDQEaCyAAIAQQ/gEgBGpBACADQYEIEIACCyEBIAAgBBAxCyACQRBqJAAgAQulAgIEfgN/IwBBEGsiCCQAQoCAgIDgACEFAkACfgJAIAFCgICAgHBUDQAgAactAAVBEHFFDQAgCCACrTcDCCAAIAFBASAIQQhqEKMBDAELIAAQOwsiBEKAgICAcINCgICAgOAAUQ0AIAJBACACQQBKG60hB0IAIQECQANAIAEgB1IEQCADIAGnQQN0aikDACIGQiCIp0F1TwRAIAanIgkgCSgCAEEBajYCAAsgACAEIAEgBkGAgAEQyAEhCiABQgF8IQEgCkEATg0BDAILCyAAIARBMCACQQBOBH4gAq0FQoCAgIDAfiACuL0iAUKAgICAwIGA/P8AfSABQoCAgICAgID4/wBWGwsQOUEASA0AIAQhBQwBCyAAIAQQDAsgCEEQaiQAIAULsQkCBH8IfiMAQTBrIgQkACADKQMAIQggBEKAgICAMDcDGEEBIQUCQAJAAn4gAkECSARAQoCAgIAwIQ5CgICAgDAMAQtCgICAgDAgAykDCCIOQoCAgIBwg0KAgICAMFENABpCgICAgDAhDEKAgICAMCEJQoCAgIAwIQtCgICAgDAhCiAAIA4QVQ0BQQAhBUKAgICAMCACQQJGDQAaIAMpAxALIQ8CQAJAAkACQCAAIAhBzAEgCEEAEBEiCkKAgICAcIMiCUKAgICAMFIEQAJAAkAgCUKAgICA4ABRBEBCgICAgDAhDEKAgICAMCEJQoCAgIAwIQsMAQsgACAKEAwCfgJAIAFCgICAgHBUDQAgAactAAVBEHFFDQAgACABQQBBABCjAQwBCyAAEDsLIgtCgICAgHCDQoCAgIDgAFEEQEKAgICAMCEMQoCAgIAwIQkMAQsgCEIgiKdBdU8EQCAIpyICIAIoAgBBAWo2AgALIAQgCDcDECAAIARBEGpBCHJBABCFAyEGIAQpAxghDCAEKQMQIQkgBkUNAQtCgICAgDAhCgwGC0IAIQEDQCAAIAkgDCAEQQhqEJEBIghCgICAgHCDQoCAgIDgAFENAiAEKAIIBEBCgICAgDAhCgwGCwJAIAUEQCAIIQoMAQsgBCAINwMgIAQgAUL/////D4M3AyggACAOIA9BAiAEQSBqEBwhCiAAIAgQDCAKQoCAgIBwg0KAgICA4ABRDQMLIAAgCyABIAoQZ0EASA0CIAFCAXwhAQwACwALIAAgCBAgIgpCgICAgHCDQoCAgIDgAFENAiAAIARBCGogChAvQQBIDQIgBAJ+IAQpAwgiCEKAgICACHxC/////w9YBEAgCEL/////D4MMAQtCgICAgMB+IAi5vSIJQoCAgIDAgYD8/wB9IAlC////////////AINCgICAgICAgPj/AFYbCyINNwMgAn4CQCABQoCAgIBwVA0AIAGnLQAFQRBxRQ0AIAAgAUEBIARBIGoQowEMAQsgAEKAgICAMEEBIARBIGoQ4AILIQsgACANEAwgC0KAgICAcINCgICAgOAAUQRAQoCAgIAwIQwMAgtCACENIAhCACAIQgBVGyEBA0AgASANUQRAQoCAgIAwIQxCgICAgDAhCQwFC0KAgICAMCEMIAAgCiANEGwiCEKAgICAcINCgICAgOAAUQ0CAkAgBQRAIAghCQwBCyAEIAg3AyAgBCANQv////8PgzcDKCAAIA4gD0ECIARBIGoQHCEJIAAgCBAMIAlCgICAgHCDQoCAgIDgAFENAwsgACALIA0gCRBnIQcgDUIBfCENIAdBAE4NAAsMAQtCgICAgDAhCiAJQoCAgIBwg0KAgICAMFENAyAAIAlBARCQARoMAwtCgICAgDAhCQwCC0KAgICAMCEMQoCAgIAwIQlCgICAgDAhCwwBCyAAIAtBMCABpyICQQBOBH4gAUL/////D4MFQoCAgIDAfiACuL0iAUKAgICAwIGA/P8AfSABQoCAgICAgID4/wBWGwsQOUEATg0BCyAAIAsQDEKAgICA4AAhCwsgACAKEAwgACAJEAwgACAMEAwgBEEwaiQAIAsLJgBCgICAgOAAIAAgAykDABDMASIAQQBHrUKAgICAEIQgAEEASBsLowICAX8EfiMAQRBrIgUkAEKAgICAMCEGAkACQCAAIAVBCGogACABECAiCRAvDQAgBUEBNgIEAkAgBARAIAMpAwAhCEKAgICAMCEHIAJBAk4EQCADKQMIIQcLIAAgCBBVRQ0BDAILIAJBAEwEQEKAgICAMCEIQoCAgIAwIQcMAQtCgICAgDAhCEKAgICAMCEHIAMpAwAiAUKAgICAcINCgICAgDBRDQAgACAFQQRqIAEQswFBAEgNAQsgACAJQgAQnwIiAUKAgICAcINCgICAgOAAUQRAIAEhBgwBCyABIQYgACABIAkgBSkDCEIAIAUoAgQgCCAHENQEQgBTDQAgCSEGDAELIAAgCRAMQoCAgIDgACEBCyAAIAYQDCAFQRBqJAAgAQv5AQIEfgF/IwBBIGsiCCQAAkACQCAAIAhBGGogACABECAiARAvDQAgACAIQQhqIAMpAwBCACAIKQMYIgQgBBBmDQAgACAIQRBqIAMpAwhCACAEIAQQZg0AIAggBDcDAAJ+IAQgAkEDSA0AGiAEIAMpAxAiBUKAgICAcINCgICAgDBRDQAaIAAgCCAFQgAgBCAEEGYNASAIKQMACyEGIAAgASAIKQMIIgUgCCkDECIHIAYgB30iBiAEIAV9IgQgBCAGVRsiBEEBQX9BASAFIAQgB3xTGyAFIAdXGxDzAkUNAQsgACABEAxCgICAgOAAIQELIAhBIGokACABC+UHAgR/CX4jAEEwayIFJABCgICAgOAAIQgCQAJAIAAgBUEgaiAAIAEQICIOEC8NACAFQgA3AxgCQCACQQBKBEAgACAFQRhqIAMpAwBCACAFKQMgIgsgCxBmDQIgBSALIAUpAxgiCn0iDDcDECACQQFGDQEgACAFQRBqIAMpAwhCACAMQgAQZg0CIAUpAxAhDAwBCyAFKQMgIQsLIAsgAkECa0EAIAJBAkobrSIPfCAMfSINQoCAgICAgIAQWQRAIABBiscAQQAQEgwBCyAAIA0Q4gIiAUKAgICAcINCgICAgOAAUQRAQQAhAkKAgICA4AAhCwwCCyANQgBXBEBBACECIAEhCEKAgICAMCELDAILIAGnKAIkIgQgDadBA3RqIQICQAJAAkACQCAOIAVBLGogBUEMahCPAQRAIAsgBTUCDFENAQsgCkIAIApCAFUbIQoMAQtCACEIIApCACAKQgBVGyEJIAUoAiwhBgNAAkAgCCAJUQRAIANBEGohA0IAIQgDQCAIIA9RDQIgAyAIp0EDdGopAwAiCkIgiKdBdU8EQCAKpyIHIAcoAgBBAWo2AgALIAQgCjcDACAEQQhqIQQgCEIBfCEIDAALAAsgBiAIp0EDdGopAwAiCkIgiKdBdU8EQCAKpyIHIAcoAgBBAWo2AgALIAQgCjcDACAEQQhqIQQgCEIBfCEIDAELCyAJIAx8IQgDQCAIIAtZDQIgBiAIp0EDdGopAwAiCUIgiKdBdU8EQCAJpyIDIAMoAgBBAWo2AgALIAQgCTcDACAEQQhqIQQgCEIBfCEIDAALAAsDQAJAIAkgClEEQCADQRBqIQNCACEJA0AgCSAPUQ0CIAMgCadBA3RqKQMAIhBCIIinQXVPBEAgEKciBiAGKAIAQQFqNgIACyAEIBA3AwAgBEEIaiEEIAlCAXwhCQwACwALIAAgDiAJIAQQVEF/Rg0DIARBCGohBCAJQgF8IQkMAQsLIAogDHwhCQNAIAkgC1kNASAAIA4gCSAEEFRBf0YNAiAEQQhqIQQgCUIBfCEJDAALAAsgAiAERgRAIAFCgICAgDAgACABQTAgDUKAgICACFoEfkKAgICAwH4gDbm9IghCgICAgMCBgPz/AH0gCEL///////////8Ag0KAgICAgICA+P8AVhsFIA0LEDlBAEgiAxshC0KAgICA4AAgASADGyEIIAIhBAwDC0GJFkGo7ABB4rkCQfHqABAAAAsgASELDAELQQAhAkKAgICAMCELCwNAIAIgBEZFBEAgBEKAgICAMDcDACAEQQhqIQQMAQsLIAAgCxAMIAAgDhAMIAVBMGokACAIC8gIAgl+A38jAEEwayIOJABCgICAgDAhBQJAAkAgACAOQSBqIAAgARAgIgoQLw0AIAAgDkEYaiADKQMAQgAgDikDICIGIAYQZg0AAkAgBARAAkACQAJAIAIOAgIAAQsgBiAOKQMYfSEHQQAhAgwBCyAAIA5BEGogAykDCEIAIAYgDikDGH1CABBmDQMgAkECayECIA4pAxAhBwsgBiACrXwgB31CgICAgICAgBBTDQEgAEH0yABBABASDAILIA4gBjcDECAGIQEgAykDCCINQoCAgIBwg0KAgICAMFIEfiAAIA5BEGogDUIAIAEgARBmDQIgDikDEAUgAQsgDikDGH0iAUIAIAFCAFUbIQdBACECCyAAIAogB0KAgICACHxC/////w9YBH4gB0L/////D4MFQoCAgIDAfiAHub0iAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGwsiBRCfAiEBIAAgBRAMAkAgAUKAgICAcINCgICAgOAAUQ0AIA4pAxgiDSAH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AiAAIAFBNyABQQAQESIBQoCAgIBwg0KAgICAMFEEfiAAQS8QKQUgAQtBnggQsgELC+EFAwN+B38DfAJAIAAgARBVDQAgACAAKQMwQQ4QRyIFQoCAgIBwg0KAgICA4ABRDQAgBaciCSABQoCAgIBwWgR/IAGnLQAFQRBxBUEACyAJLQAFQe8BcXI6AAUCQCAAQQEgAiACQQFMGyIKQQFrIghBA3RBGGoQJCIHRQ0AIAFCIIinQXVPBEAgAaciAiACKAIAQQFqNgIACyAHIAE3AwAgAykDACIEQiCIp0F1TwRAIASnIgIgAigCAEEBajYCAAsgByAINgIQIAcgBDcDCCAHQRhqIQtBACECA0AgAiAIRwRAIAMgAkEBaiIMQQN0aikDACIEQiCIp0F1TwRAIASnIg0gDSgCAEEBajYCAAsgCyACQQN0aiAENwMAIAwhAgwBCwsgCSAHNgIgAn8gAUL/////b1gEQCAAECJBfwwBCyAAQQAgAadBMBBDCyICQQBIDQACQCACRQ0AIAAgAUEwIAFBABARIgRCgICAgHCDQoCAgIDgAFENASAEQv////8PWARAIASnIgIgCGtBACACIApOG60hBgwBCyAEQiCIp0EHa0FtTQRAAkAgBEKAgICAwIGA/P8AfCIEQv///////////wCDQoCAgICAgID4/wBWDQAgBL+dIg8gCLciEGUNACAPIBChIQ4LIA69IgQCfyAOmUQAAAAAAADgQWMEQCAOqgwBC0GAgICAeAsiAre9UQRAIAKtIQYMAgtCgICAgMB+IARCgICAgMCBgPz/AH0gBEL///////////8Ag0KAgICAgICA+P8AVhshBgwBCyAAIAQQDAsgACAFQTAgBkEBEBUaIABBgJIBIAAgAUE3IAFBABARIgFCgICAgHCDIgRCgICAgJB/UgR+IARCgICAgOAAUQ0BIAAgARAMIABBLxApBSABC0HslgEQsgEiAUKAgICAcINCgICAgOAAUQ0AIAAgBUE3IAFBARAVGiAFDwsgACAFEAwLQoCAgIDgAAswACACQQBMBEAgACABQoCAgIAwQQBBABAcDwsgACABIAMpAwAgAkEBayADQQhqEBwLgwICAX4BfyMAQSBrIgIkAEKAgICA4AAhBQJAAkAgACABECAiAUKAgICAcINCgICAgOAAUQ0AIAAgAykDABAw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ARAgCzYAIAMpAwAiAUIgiKciAkF/RiAERSACQX5xQQJHcXJFBEAgABAiQoCAgIDgAA8LIAAgARDoAQuJAQEBfiADKQMAIgFC/////29WIAFCgICAgHCDQoCAgIAgUXJFBEAgAEHe0gBBABASQoCAgIDgAA8LAkAgACABEEEiAUKAgICAcINCgICAgOAAUgRAIAMpAwgiBEKAgICAcINCgICAgDBRDQEgACABIAQQ2gRFDQEgACABEAwLQoCAgIDgAA8LIAELnwIBA34gAUL/////b1gEQCAAECJCgICAgOAADwtCgICAgOAAIQUCfiAAIAFBNyABQQAQESIEQoCAgIBwg0KAgICAMFEEQCAAQZQBECkMAQsgACAEEDQLIgRCgICAgHCDIgZCgICAgOAAUgR+An4gACABQTMgAUEAEBEiAUKAgICAcINCgICAgDBRBEAgAEEvECkMAQsgACABEDQLIgFCgICAgHCDIgVCgICAgOAAUQRAIAAgBBAMQoCAgIDgAA8LAkAgBkKAgICAkH9RBEAgBKcoAgRB/////wdxRQ0BCyAFQoCAgICQf1EEQCABpygCBEH/////B3FFDQELIABB7JYBIARBpJIBELIBIQQLIAAgBCABELYCBUKAgICA4AALC5UCAgF+An8jAEEwayICJABCgICAgOAAIQECQCAAIAJBKGogAykDABCkAQ0AIAAQ4gEiBUKAgICAcINCgICAgOAAUQ0AIAAgAkEUaiADKQMIEK4CIgZFBEAgACAFEAwMAQsgACgC2AEgAhC7ASACQgEQMhogAiACKQMoIgGnIgdBARC5ARogAiACQn9B/////wNBARB6GiAFp0EEaiIDIAYgAhCyBBoCQCAERSABUHINACACQgEQMhogAiAHQQFrQQEQuQEaIAMgAhDyAUEASA0AIAJCARAyGiACIAdBARC5ARogAyADIAJB/////wNBARDuARoLIAIQGSAAIAYgAkEUahDmASAFEK8CIQELIAJBMGokACABCwkAIAAgARDcBAt0AgJ+AX8gACABENwEIgFCgICAgHCDQoCAgIDgAFEEQCABDwtBCiEGAn4CQCACRQ0AIAMpAwAiBEKAgICAcINCgICAgDBRDQAgACAEENsEIgZBAE4NAEKAgICA4AAMAQsgACABIAYQogULIQUgACABEAwgBQvOAQIBfwJ+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/////////wCDQoCAgICAgID4/wBWGwvvAQEDfiMAQRBrIgIkAEKAgICA4AAhBAJAIAAgACABECAiAUEBELsCIgVCgICAgHCDQoCAgIDgAFENACAFQiCIpyIDQQAgA0ELakESSRtFBEAgACACQQhqIAUQQkEASA0BQoCAgIAgIQQgAikDCEKAgICAgICA+P8Ag0KAgICAgICA+P8AUQ0BC0KAgICA4AAhBCAAIAFB48oAEIcCIgZCgICAgHCDQoCAgIDgAFENACAAIAYQNUUEQCAAQergAEEAEBIgACAGEAwMAQsgACAGIAFBAEEAEDYhBAsgACABEAwgACAFEAwgAkEQaiQAIAQLjAIDAXwBfgF/IwBBEGsiAiQAQoCAgIDgACEFAkAgACACQQhqIgYgARCmAg0AIAAgBiADKQMAEEINACACAn4gAisDCCIEvUKAgICAgICA+P8Ag0KAgICAgICA+P8AUgRAIASdIgREAAAAAACwnUCgIAQgBEQAAAAAAABZQGMbIAQgBEQAAAAAAAAAAGYbIQQLIAS9IgUCfyAEmUQAAAAAAADgQWMEQCAEqgwBC0GAgICAeAsiA7e9UQRAIAOtDAELQoCAgIDAfiAFQoCAgIDAgYD8/wB9IAVC////////////AINCgICAgICAgPj/AFYbCzcDACAAIAFBASACQREQ+AQhBQsgAkEQaiQAIAULigEDAX4BfAF/IwBBEGsiAiQAQoCAgIDgACEEAkAgACACQQhqIgYgARCmAg0AIAAgBiADKQMAEEINACAAIAEgAisDCCIFnUQAAAAAAAAAAKBEAAAAAAAA+H8gBUQAANzCCLI+Q2UbRAAAAAAAAPh/IAVEAADcwgiyPsNmGxD5BCEECyACQRBqJAAgBAvZAQIBfAF+IwBB0ABrIgIkAAJ+QoCAgIDgACAAIAEgAiAEQQ9xQQAQ1QMiAEEASA0AGkKAgICAwH4gAEUNABogBEGAAnEEQCACIAIrAwBEAAAAAACwncCgOQMACyACIARBBHZBD3FBA3RqKwMAIgW9IgECfyAFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAsiBLe9UQRAIAStDAELQoCAgIDAfiABQoCAgIDAgYD8/wB9IAFC////////////AINCgICAgICAgPj/AFYbCyEGIAJB0ABqJAAgBguHAQIBfAF+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IAMpAxAiBUIgiKdBdU8EQCAFpyIJIAkoAgBBAWo2AgALIAggBTcDCAJAIAQNACADKQMYIgVCIIinQXVJDQAgBaciCSAJKAIAQQFqNgIACyAIIAE3AxAgCCAFNwMAIAAgByAGQQMgCBAcIQUgACAIKQMAEAwgBEUEQCAAIAgpAwgQDAsgAygCBCEDIAAoAhAgAhDiAyAFQoCAgIBwg0KAgICA4ABRDQIgACAFEAwLDAALAAsgCEEgaiQAIAULVAAgACABIAJBImoQWiIARQRAQoCAgIDgAA8LIAAoAgwiAEEATgRAIACtDwtCgICAgMB+IAC4vSIBQoCAgIDAgYD8/wB9IAFCgICAgICAgPj/AFYbC1kBAX8gACABIARBImoQWiICRQRAQoCAgIDgAA8LIAJBBGohAyACKAIIIQQDfiADIARGBH5CgICAgDAFIARBEGshBSAEKAIEIQQgACgCECACIAUQgAUMAQsLC3UAIAAgASAEQSJqEFoiAkUEQEKAgICA4AAPCyAAIAIgAykDACIBQgAgAUIgiKdBB2tBbk8bIAEgAUKAgICAwIGA/P8AfEL///////////8Ag1AbEPICIgNFBEBCgICAgBAPCyAAKAIQIAIgAxCABUKBgICAEAthACAAIAEgBEEiahBaIgJFBEBCgICAgOAADwsgACACIAMpAwAiAUIAIAFCIIinQQdrQW5PGyABIAFCgICAgMCBgPz/AHxC////////////AINQGxDyAkEAR61CgICAgBCECwgAQoCAgIAwC0oAAkAgBSkDACIBQoCAgIBwVA0AIAGnIgIvAQZBLEcNACACKAIgIgJFDQAgAkEBOgARIAAgARAMIAVCgICAgCA3AwALQoCAgIAwC88BAQN+IwBBEGsiAiQAQoCAgIDgACEFAkACQAJ+QoCAgIAwIABCgICAgDAgACADEMAEIgRCgICAgHCDQoCAgIDgAFENABogAiAENwMIQoCAgIDgACAAQcMAQQBBAEEBIAJBCGoQhQEiBkKAgICAcINCgICAgOAAUQ0AGiAAEDMiAUKAgICAcINCgICAgOAAUg0BIAYLIQEgACAEEAwgACABEAwMAQsgACABQYQBIARBBxAVGiAAIAFBhQEgBkEHEBUaIAEhBQsgAkEQaiQAIAULswMCA38CfiMAQdAAayIGJABBfyEHAkAgACAG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QoCAgIBwg0KAgICA4ABRcg0AIAAgAykDCCIGEDVFDQBCgICAgOAAIQQCQCAAEDMiBUKAgICAcINCgICAgOAAUQRAIAEhBQwBCyAAIAVBLyABQQcQFUEASA0AIAAgBUEvIAYQhQUhBAsgACAFEAwMAQsgASEECyAHQRBqJAAgBAsQACAAIAMpAwBBESAEELICC6UDAQR+IwBBEGsiAyQAIAQCfwJAAkACQAJAIAAgAUEqEFoiAkUEQEKAgICAMCEBDAELIAIoAhgEQEKAgICAMCEBQQEMBQsgACACKQMAIgggAikDCCIGEMUBIgFCgICAgHCDIgdCgICAgOAAUg0BC0KAgICAMCEHDAELIAdCgICAgCBRBEAgAkEBNgIYQoCAgIAwIQFBAQwDCyACKAIQBEAgACAAIAFCABBOEDQiB0KAgICAcIMiCUKAgICA4ABRDQECQCAJQoCAgICQf1INACAHpygCBEH/////B3ENACAAIANBCGogACAIQdYAIAhBABAREKEBQQBIDQIgACAIQdYAAn4gBqcgAykDCCACKAIUEPQCIgZCgICAgAh8Qv////8PWARAIAZC/////w+DDAELQoCAgIDAfiAGub0iBkKAgICAwIGA/P8AfSAGQv///////////wCDQoCAgICAgID4/wBWGwsQOUEASA0CCyAAIAcQDAwCCyACQQE2AhgMAQsgACABEAwgACAHEAxCgICAgOAAIQELQQALNgIAIANBEGokACABCyAAIAFCIIinQXVPBEAgAaciACAAKAIAQQFqNgIACyABC/EHAgR/C34jAEEwayIEJAACQCABQv////9vWARAIAAQIkKAgICA4AAhAQwBC0KAgICAMCEIAkACQCAAIAMpAwAQJSIPQoCAgIBwg0KAgICA4ABRBEBCgICAgDAhDEKAgICAMCEBQoCAgIAwIQ1CgICAgDAhEAwBCyAAIAEgACkDSBD9ASIQQoCAgIBwg0KAgICA4ABRBEBCgICAgDAhDEKAgICAMCEBQoCAgIAwIQ0MAQsCQAJAIAAgACABQe4AIAFBABAREDQiDUKAgICAcINCgICAgOAAUQ0AIA2nIgJB9QBBABCgASEGIAJB+QBBABCgAUEASARAIABB7JYBIA1B0A4QsgEiDUKAgICAcINCgICAgOAAUQ0BCyAEIA03AyggBCABNwMgIAAgEEECIARBIGoQowEiDEKAgICAcINCgICAgOAAUQ0BIAAQOyIBQoCAgIBwg0KAgICA4ABRBEBCgICAgOAAIQEMAwtBfyECAkAgAykDCCIJQoCAgIBwg0KAgICAMFENACAAIARBHGogCRB1QQBIDQMgBCgCHCICDQAMBAsCQAJAIA+nIgcpAgQiCKdB/////wdxIgUEQCAGQX9zQR92IQYgCEL/////B4MhESACrSESQgAhCUKAgICAMCEIQQAhAgNAIAKtIQogAiEDA0AgAyAFTw0DIAAgDEHWACADrSIOEDlBAEgNByAAIAgQDAJAIAAgDCAPEMUBIghCgICAgHCDIgtCgICAgCBRDQAgC0KAgICA4ABRDQggACAEQRBqIAAgDEHWACAMQQAQERChAQ0IIAQgBCkDECILIBEgCyARUxsiCzcDECAKIAtRDQAgACAHIAIgAxCOASIKQoCAgIBwg0KAgICA4ABRDQggACABIAkgChBnQQBIDQggCUIBfCIKIBJRDQkgACAEQQhqIAgQLw0IIAunIQJCASELIAlCASAEKQMIIg4gDkIBVxt8IQkDQCAJIApRDQMgACAAIAggCxBsEDQiDkKAgICAcINCgICAgOAAUQ0JIAAgASAKIA4QZ0EASA0JIAtCAXwhCyAKQgF8IgogElINAAsMCQsgByAOIAYQ9AKnIQMMAAsACwALIAAgDCAPEMUBIghCgICAgHCDIglCgICAgCBSDQFCACEJQQAhAgsgACAHIAIgBSACIAVJGyAFEI4BIgpCgICAgHCDQoCAgIDgAFENAyAAIAEgCSAKEGdBAEgNAwwECyAJQoCAgIDgAFINAwwCC0KAgICAMCEMC0KAgICAMCEBCyAAIAEQDEKAgICA4AAhAQsgACAPEAwgACAQEAwgACAMEAwgACANEAwgACAIEAwLIARBMGokACABC+ACAQd+IAFC/////29YBEAgABAiQoCAgIDgAA8LQoCAgIDgACEIQoCAgIAwIQYCQAJAAkAgACADKQMAECUiB0KAgICAcINCgICAgOAAUQRAQoCAgIAwIQQMAQsgACABQdYAIAFBABARIgRCgICAgHCDQoCAgIDgAFENACAAIARCABBNRQRAIAAgAUHWAEIAEDlBAEgNAQsgACABIAcQxQEiBUKAgICAcIMiCUKAgICA4ABRDQEgACABQdYAIAFBABARIgZCgICAgHCDQoCAgIDgAFENAQJAIAAgBiAEEE0EQCAAIAQQDAwBCyAAIAFB1gAgBBA5QQBODQBCgICAgDAhBAwCCyAAIAcQDCAAIAYQDEL/////DyEIIAlCgICAgCBRDQIgACAFQdgAIAVBABARIQogACAFEAwgCg8LQoCAgIAwIQULIAAgBRAMIAAgBxAMIAAgBhAMIAAgBBAMCyAIC84EAgZ+AX8jAEEgayICJAACQCABQv////9vWARAIAAQIkKAgICA4AAhBwwBC0KAgICA4AAhB0KAgICAMCEIAkAgACADKQMAECUiCUKAgICAcINCgICAgOAAUQRAQoCAgIAwIQRCgICAgDAhBUKAgICAMCEGDAELAkACQCAAIAEgACkDSBD9ASIGQoCAgIBwg0KAgICA4ABRBEBCgICAgDAhBAwBCyAAIAAgAUHuACABQQAQERA0IgRCgICAgHCDQoCAgIDgAFINAQtCgICAgDAhBQwBCyACIAQ3AxggAiABNwMQIAAgBkECIAJBEGoQowEiBUKAgICAcINCgICAgOAAUQ0AIAAgAkEIaiAAIAFB1gAgAUEAEBEQoQENACAAIAVB1gACfiACKQMIIgFCgICAgAh8Qv////8PWARAIAFC/////w+DDAELQoCAgIDAfiABub0iAUKAgICAwIGA/P8AfSABQv///////////wCDQoCAgICAgID4/wBWGwsQOUEASA0AQoCAgIDgACEIIABBKhCGASIBQoCAgIBwg0KAgICA4ABRDQAgAEEgECQiA0UEQCABIQgMAQsgAyAJNwMIIAMgBTcDACADIASnIgpB5wBBABCgAUF/c0EfdjYCECAKQfUAQQAQoAEhCiADQQA2AhggAyAKQX9zQR92NgIUIAFCgICAgHBaBEAgAacgAzYCIAsgACAGEAwgACAEEAwgASEHDAELIAAgCRAMIAAgBhAMIAAgBBAMIAAgBRAMIAAgCBAMCyACQSBqJAAgBwv+BAIIfgJ/IwBBEGsiAiQAAkAgAUL/////b1gEQCAAECJCgICAgOAAIQcMAQtCgICAgOAAIQdCgICAgDAhBQJAAkACQCAAIAMpAwAQJSIJQoCAgIBwg0KAgICA4ABRBEBCgICAgDAhCAwBCyAAIAFB7gAgAUEAEBEiCEKAgICAcINCgICAgOAAUQ0AIAAgCBA0IghCgICAgHCDQoCAgIDgAFENACAIp0HnAEEAEKABQX9GBEAgACABIAkQxQEhBwwDCyAAIAAgAUHwACABQQAQERAnIgxBAEgNACAAIAFB1gBCABA5QQBIDQAgABA7IgZCgICAgHCDQoCAgIDgAFEEQEKAgICA4AAhBgwCCyAJpyENA0ACQCAAIAUQDCAAIAEgCRDFASIFQoCAgIBwgyIEQoCAgIAgUQ0AIARCgICAgOAAUQ0DAkAgACAAIAVCABBOEDQiBEKAgICAcIMiC0KAgICAkH9SBEBBACEDIAtCgICAgOAAUQ0FDAELIASnKAIEQf////8HcUUhAwsgACAGIAogBBB7QQBIDQMgCkIBfCEKIANFDQEgACACQQhqIAAgAUHWACABQQAQERChAUEASA0DIAAgAUHWAAJ+IA0gAikDCCAMEPQCIgRCgICAgAh8Qv////8PWARAIARC/////w+DDAELQoCAgIDAfiAEub0iBEKAgICAwIGA/P8AfSAEQv///////////wCDQoCAgICAgID4/wBWGwsQOUEATg0BDAMLCyAKpwRAIAYhBwwDCyAAIAYQDEKAgICAICEHDAILQoCAgIAwIQYLIAAgBhAMCyAAIAUQDCAAIAgQDCAAIAkQDAsgAkEQaiQAIAcLjgEBAn8gASgCACICQQBKBEAgASACQQFrIgI2AgACQCACDQAgAS0ABEHwAXFBEEcNACABKAIIIgIgASgCDCIDNgIEIAMgAjYCACABQQA2AgggACgCYCICIAFBCGoiAzYCBCABIABB4ABqNgIMIAEgAjYCCCAAIAM2AmALDwtB5oQBQajsAEHWLEHN4wAQAAAL8BQCDn8OfiMAQZABayIEJAACQCABQv////9vWARAIAAQIkKAgICA4AAhFQwBCyADKQMIIR4gACAEQThqQQAQPhogBEEANgIwIARCgICAgMAANwMoIAQgADYCACAEIARBCGoiBzYCBEKAgICA4AAhFUKAgICAMCEWQoCAgIAwIRdCgICAgDAhE0KAgICAMCEUQoCAgIAwIR1CgICAgDAhHAJAAkAgACADKQMAECUiGEKAgICAcINCgICAgOAAUQ0AIAAgHhA1IglFBEAgACAeECUiHUKAgICAcINCgICAgOAAUQ0BIB2nIQULAkACQCAAIAFB7gAgAUEAEBEiHEKAgICA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QQRqIQMMAAsACwuaAQEHfyABpygCICIDBEAgAEEQaiEEIANBBGohBiADKAIIIQIDQCACIAZHBEAgAigCBCEIIAJBEGshBSACQQxrKAIARQRAAkAgAygCAARAIAUQnAUMAQsgACACKQMQECELIAAgAikDGBAhCyAEIAUgACgCBBEAACAIIQIMAQsLIAQgAygCECAAKAIEEQAAIAQgAyAAKAIEEQAACwsbAQF/IAGnKAIgIgMEQCAAIAMoAgwgAhEAAAsLUgEDfyABpygCICICBEAgAigCBCIDBEAgAigCACIEIAM2AgQgAyAENgIAIAJCADcCAAsgACACNQIMQoCAgIBwhBAhIABBEGogAiAAKAIEEQAACwupAQEGfyABpygCICIDBEAgA0EMaiEFIAMoAhAhAgNAIAIgBUcEQCACKAIEIQcgAkIANwIAIAIoAgghBCAHIQIgBC8BBkEgRg0BIARCADcCJAwBCwsCQAJAIAMtAAVFDQAgACgCyAEiAkUNACAAKALQASADKAIIIAIRAAAMAQsgAygCGCICRQ0AIAAgAygCFCADKAIIIAIRBgALIABBEGogAyAAKAIEEQAACwspAQF/IAAgAaciAjUCJEKAgICAkH+EECEgACACNQIgQoCAgICQf4QQIQshACABpygCICkDACIBQoCAgIBgWgRAIAAgAacgAhEAAAsLaQEDfyAAIAGnKAIgIgIpAwAQISACLQARRQRAA0AgAigCFCEEIAMgAigCDE9FBEAgACAEIANBA3RqKAIEEMcBIANBAWohAwwBCwsgAEEQaiAEIAAoAgQRAAALIABBEGogAiAAKAIEEQAAC2wBA38CQCABQoCAgIBwVA0AIAGnIgMvAQZBD0cNACADKAIgIgRFDQAgBEEIaiEFQQAhAwNAIAMgBC0ABU8NASAFIANBA3RqKQMAIgFCgICAgGBaBEAgACABpyACEQAACyADQQFqIQMMAAsACwtqAQN/AkAgAUKAgICAcFQNACABpyICLwEGQQ9HDQAgAigCICIDRQ0AIANBCGohBEEAIQIDQCACIAMtAAVPRQRAIAAgBCACQQN0aikDABAhIAJBAWohAgwBCwsgAEEQaiADIAAoAgQRAAALC38BA38gAacoAiAiBCkDACIBQoCAgIBgWgRAIAAgAacgAhEAAAsgBCkDCCIBQoCAgIBgWgRAIAAgAacgAhEAAAsgBEEYaiEFA0AgBCgCECADSgRAIAUgA0EDdGopAwAiAUKAgICAYFoEQCAAIAGnIAIRAAALIANBAWohAwwBCwsLWQEDfyAAIAGnKAIgIgIpAwAQISAAIAIpAwgQISACQRhqIQQDQCADIAIoAhBORQRAIAAgBCADQQN0aikDABAhIANBAWohAwwBCwsgAEEQaiACIAAoAgQRAAALcgEEfyABpyIDKAIgIQQgAygCJCEFIAMoAigiAwRAIAAgAyACEQAACyAEBEACQCAFRQ0AQQAhAwNAIAMgBCgCPE4NASAFIANBAnRqKAIAIgYEQCAAIAYgAhEAAAsgA0EBaiEDDAALAAsgACAEIAIRAAALC3wBA38gAaciAigCKCIDBEAgACADrUKAgICAcIQQIQsgAigCICIDBEAgAigCJCIEBEBBACECA0AgAiADKAI8TkUEQCAAIAQgAkECdGooAgAQ5QEgAkEBaiECDAELCyAAQRBqIAQgACgCBBEAAAsgACADrUKAgICAYIQQIQsLEgAgAacoAiAiAARAIAAQngMLCx4AIAGnKQMgIgFCgICAgGBaBEAgACABpyACEQAACwsZACAAIAGnIgApAyAQISAAQoCAgIAwNwMgC0QBAn8gAachBANAIAQoAiggA0sEQCAEKAIkIANBA3RqKQMAIgFCgICAgGBaBEAgACABpyACEQAACyADQQFqIQMMAQsLC0YBA38gAachAwNAIAMoAiQhBCACIAMoAihPRQRAIAAgBCACQQN0aikDABAhIAJBAWohAgwBCwsgAEEQaiAEIAAoAgQRAAALEQAgAEEQaiACIAAoAgQRAAAL2wECAX8CfiMAQSBrIgMkACABQQNGBEAgAikDECEEIAIpAwghBQJAIAAgA0EQaiACKQMAEKoFQQBIBEBCgICAgOAAIQQMAQsgACAEIAVBAiADQRBqEBwiBEKAgICAcINCgICAgOAAUQRAIAAoAhAiASkDgAEhBCABQoCAgIAgNwOAASADIAQ3AwggACADKQMYQoCAgIAwQQEgA0EIahAcIQQgACADKQMIEAwLIAAgAykDEBAMIAAgAykDGBAMCyADQSBqJAAgBA8LQZuCAUGo7ABBy/UCQaDtABAAAAuIAQIBfgF/QQAhAkKAgICAMCEBA0ACQCACQQJHBH4gBSACQQN0IgRq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Y29kZV0KfQBjYW5ub3QgbWl4ID8/IHdpdGggJiYgb3IgfHwAcHJveHk6IHByb3BlcnR5IG5vdCBwcmVzZW50IGluIHRhcmdldCB3ZXJlIHJldHVybmVkIGJ5IG5vbiBleHRlbnNpYmxlIHByb3h5AHJldm9rZWQgcHJveHkAUHJveHkAYWRkX3Byb3BlcnR5AHByb3h5OiBjYW5ub3Qgc2V0IHByb3BlcnR5AG5vIHNldHRlciBmb3IgcHJvcGVydHkAdmFsdWUgaGFzIG5vIHByb3BlcnR5AGNvdWxkIG5vdCBkZWxldGUgcHJvcGVydHkAcHJveHk6IGR1cGxpY2F0ZSBwcm9wZXJ0eQBKU19EZWZpbmVBdXRvSW5pdFByb3BlcnR5AGhhc093blByb3BlcnR5AHByb3h5OiBpbmNvbnNpc3RlbnQgZGVsZXRlUHJvcGVydHkAcHJveHk6IGluY29uc2lzdGVudCBkZWZpbmVQcm9wZXJ0eQBKU19EZWZpbmVQcm9wZXJ0eQAhbXItPmVtcHR5AGluZmluaXR5AEluZmluaXR5AG91dCBvZiBtZW1vcnkAdW5rbm93biB1bmljb2RlIGdlbmVyYWwgY2F0ZWdvcnkAR2VuZXJhbF9DYXRlZ29yeQBldmVyeQBhbnkAYXBwbHkAJyVzJyBpcyByZWFkLW9ubHkAZXhwZWN0aW5nIGNhdGNoIG9yIGZpbmFsbHkAc3RpY2t5AGJpZ2ludCBhcmUgZm9yYmlkZGVuIGluIEpTT04uc3RyaW5naWZ5AHN1YmFycmF5AGVtcHR5IGFycmF5AG5vbiBpbnRlZ2VyIGluZGV4IGluIHR5cGVkIGFycmF5AG5lZ2F0aXZlIGluZGV4IGluIHR5cGVkIGFycmF5AG91dC1vZi1ib3VuZCBpbmRleCBpbiB0eXBlZCBhcnJheQBjYW5ub3QgY3JlYXRlIG51bWVyaWMgaW5kZXggaW4gdHlwZWQgYXJyYXkAaXNBcnJheQBUeXBlZEFycmF5AGdldERheQBnZXRVVENEYXkAZ3JvdXBCeQBtLT5kZnNfYW5jZXN0b3JfaW5kZXggPD0gbS0+ZGZzX2luZGV4AGpzX2dldF9hdG9tX2luZGV4AGludmFsaWQgYXJyYXkgaW5kZXgASlNfQXRvbUlzQXJyYXlJbmRleABmaW5kTGFzdEluZGV4AGZpbmRJbmRleABpbnZhbGlkIGV4cG9ydCBzeW50YXgAaW52YWxpZCBhc3NpZ25tZW50IHN5bnRheABtYXgAXHUlMDR4AGludmFsaWQgb3Bjb2RlOiBwYz0ldSBvcGNvZGU9MHglMDJ4AC0rICAgMFgweAAtMFgrMFggMFgtMHgrMHggMHgAbGluZSB0ZXJtaW5hdG9yIG5vdCBhbGxvd2VkIGFmdGVyIHRocm93AGJmX3BvdwBub3cAaW50ZWdlciBvdmVyZmxvdwBzdGFjayBvdmVyZmxvdwBtdXN0IGJlIGNhbGxlZCB3aXRoIG5ldwBpc1ZpZXcARGF0YVZpZXcAcmF3ACV1AGNsYXNzIGRlY2xhcmF0aW9ucyBjYW4ndCBhcHBlYXIgaW4gc2luZ2xlLXN0YXRlbWVudCBjb250ZXh0AGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBjYW4ndCBhcHBlYXIgaW4gc2luZ2xlLXN0YXRlbWVudCBjb250ZXh0AGxleGljYWwgZGVjbGFyYXRpb25zIGNhbid0IGFwcGVhciBpbiBzaW5nbGUtc3RhdGVtZW50IGNvbnRleHQAZHVwbGljYXRlIGFyZ3VtZW50IG5hbWVzIG5vdCBhbGxvd2VkIGluIHRoaXMgY29udGV4dABkdXBsaWNhdGUgcGFyYW1ldGVyIG5hbWVzIG5vdCBhbGxvd2VkIGluIHRoaXMgY29udGV4dABpbXBvcnQubWV0YSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgY29udGV4dABKU19GcmVlQ29udGV4dABKU0NvbnRleHQAanNfbWFwX2l0ZXJhdG9yX25leHQAanNfZ2VuZXJhdG9yX25leHQAanNfYXN5bmNfZ2VuZXJhdG9yX3Jlc3VtZV9uZXh0AHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0AHR0AGV4cG9ydGVkIHZhcmlhYmxlICclcycgZG9lcyBub3QgZXhpc3QAcHJpdmF0ZSBjbGFzcyBmaWVsZCAnJXMnIGRvZXMgbm90IGV4aXN0AHRlc3QAYXNzaWdubWVudCByZXN0IHByb3BlcnR5IG11c3QgYmUgbGFzdABwdmFsID09IGxhc3QAZmluZExhc3QAYmZfc3FydABzb3J0AGNicnQAdHJpbVN0YXJ0AHBhZFN0YXJ0AHVua25vd24gdW5pY29kZSBzY3JpcHQAU2NyaXB0AGh5cG90AGZyZWVfemVyb19yZWZjb3VudABzdHJfaW5kZXggPT0gbnVtX2tleXNfY291bnQgKyBzdHJfa2V5c19jb3VudABudW1faW5kZXggPT0gbnVtX2tleXNfY291bnQAc3ltX2luZGV4ID09IGF0b21fY291bnQAbGFiZWwgPj0gMCAmJiBsYWJlbCA8IHMtPmxhYmVsX2NvdW50AGxhYjEgPj0gMCAmJiBsYWIxIDwgcy0+bGFiZWxfY291bnQAdmFsIDwgcy0+Y2FwdHVyZV9jb3VudAB2YWwyIDwgcy0+Y2FwdHVyZV9jb3VudABpbnZhbGlkIHJlcGVhdCBjb3VudABpbnZhbGlkIHJlcGV0aXRpb24gY291bnQAZm9udABpbnZhbGlkIGNvZGUgcG9pbnQAZnJvbUNvZGVQb2ludABpbnZhbGlkIGhpbnQAY2Fubm90IGNvbnZlcnQgTmFOIG9yIEluZmluaXR5IHRvIGJpZ2ludABjYW5ub3QgY29udmVydCB0byBiaWdpbnQAYm90aCBvcGVyYW5kcyBtdXN0IGJlIGJpZ2ludABub3QgYSBiaWdpbnQAcHJpdmF0ZSBtZXRob2QgaXMgYWxyZWFkeSBwcmVzZW50AGVuY29kZVVSSUNvbXBvbmVudABkZWNvZGVVUklDb21wb25lbnQAdW5leHBlY3RlZCBlbmQgb2YgY29tbWVudABpbnZhbGlkIHN3aXRjaCBzdGF0ZW1lbnQAQmlnSW50AHBhcnNlSW50AGR1cGxpY2F0ZSBkZWZhdWx0AHNwbGl0AGV4cGVjdGluZyBoZXggZGlnaXQAdHJpbVJpZ2h0AHJlZHVjZVJpZ2h0AHVuc2hpZnQAdHJpbUxlZnQAaW52YWxpZCBvZmZzZXQAaW52YWxpZCBieXRlT2Zmc2V0AGdldFRpbWV6b25lT2Zmc2V0AHJlc29sdmluZyBmdW5jdGlvbiBhbHJlYWR5IHNldABwcm94eTogaW5jb25zaXN0ZW50IHNldABmaW5kX2p1bXBfdGFyZ2V0AGV4cGVjdGluZyB0YXJnZXQAaW52YWxpZCBkZXN0cnVjdHVyaW5nIHRhcmdldABwcm94eTogaW5jb25zaXN0ZW50IGdldABXZWFrU2V0AGNvbnN0cnVjdABKU19GcmVlQXRvbVN0cnVjdAB1c2Ugc3RyaWN0AFJlZmxlY3QAcmVqZWN0AG5vdCBhbiBBc3luY0dlbmVyYXRvciBvYmplY3QAY2Fubm90IGNvbnZlcnQgdG8gb2JqZWN0AGludmFsaWQgYnJhbmQgb24gb2JqZWN0AG9wZXJhbmQgJ3Byb3RvdHlwZScgcHJvcGVydHkgaXMgbm90IGFuIG9iamVjdABpdGVyYXRvciBtdXN0IHJldHVybiBhbiBvYmplY3QAbm90IGEgRGF0ZSBvYmplY3QAbm90IGEgb2JqZWN0AEpTT2JqZWN0AHBhcnNlRmxvYXQAZmxhdABub3RoaW5nIHRvIHJlcGVhdABjb25jYXQAY29kZVBvaW50QXQAY2hhckF0AGNoYXJDb2RlQXQAa2V5cwBwcm94eTogdGFyZ2V0IHByb3BlcnR5IG11c3QgYmUgcHJlc2VudCBpbiBwcm94eSBvd25LZXlzACAgZmFzdCBhcnJheXMAZXhwb3J0ICclcycgaW4gbW9kdWxlICclcycgaXMgYW1iaWd1b3VzAHByaXZhdGUgY2xhc3MgZmllbGQgJyVzJyBhbHJlYWR5IGV4aXN0cwB0b28gbWFueSBhcmd1bWVudHMAVG9vIG1hbnkgY2FsbCBhcmd1bWVudHMAdG9vIG1hbnkgZWxlbWVudHMAICBlbGVtZW50cwBpbnZhbGlkIG51bWJlciBvZiBkaWdpdHMAYmluYXJ5IG9iamVjdHMAaW52YWxpZCBwcm9wZXJ0eSBhY2Nlc3MAanNfb3BfZGVmaW5lX2NsYXNzAGZkLT5ieXRlX2NvZGUuYnVmW2RlZmluZV9jbGFzc19wb3NdID09IE9QX2RlZmluZV9jbGFzcwBfX2dldENsYXNzAHNldEhvdXJzAGdldEhvdXJzAHNldFVUQ0hvdXJzAGdldFVUQ0hvdXJzAGdhdGhlcl9hdmFpbGFibGVfYW5jZXN0b3JzAGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMAd2l0aFJlc29sdmVycwB0b28gbWFueSBpbWJyaWNhdGVkIHF1YW50aWZpZXJzAHVuaWNvZGVfcHJvcF9vcHMAYWNvcwBmb3IgYXdhaXQgaXMgb25seSB2YWxpZCBpbiBhc3luY2hyb25vdXMgZnVuY3Rpb25zAG5ldy50YXJnZXQgb25seSBhbGxvd2VkIHdpdGhpbiBmdW5jdGlvbnMAYnl0ZWNvZGUgZnVuY3Rpb25zAEMgZnVuY3Rpb25zAHByb3h5OiBpbmNvbnNpc3RlbnQgcHJldmVudEV4dGVuc2lvbnMAU2NyaXB0X0V4dGVuc2lvbnMAYXRvbXMAcHJveHk6IHByb3BlcnRpZXMgbXVzdCBiZSBzdHJpbmdzIG9yIHN5bWJvbHMAZ2V0T3duUHJvcGVydHlTeW1ib2xzAHJlc29sdmVfbGFiZWxzAEpTX0V2YWxUaGlzAHN0cmluZ3MAaW52YWxpZCBkZXNjcmlwdG9yIGZsYWdzAGludmFsaWQgcmVndWxhciBleHByZXNzaW9uIGZsYWdzAHZhbHVlcwBzZXRNaW51dGVzAGdldE1pbnV0ZXMAc2V0VVRDTWludXRlcwBnZXRVVENNaW51dGVzAHRvbyBtYW55IGNhcHR1cmVzACAgc2hhcGVzAGdldE93blByb3BlcnR5TmFtZXMAZ2NfZnJlZV9jeWNsZXMAYWRkX2V2YWxfdmFyaWFibGVzAHJlc29sdmVfdmFyaWFibGVzAHRvbyBtYW55IGxvY2FsIHZhcmlhYmxlcwB0b28gbWFueSBjbG9zdXJlIHZhcmlhYmxlcwBjb21wYWN0X3Byb3BlcnRpZXMAICBwcm9wZXJ0aWVzAGRlZmluZVByb3BlcnRpZXMAZW50cmllcwBmcm9tRW50cmllcwB0b28gbWFueSByYW5nZXMAaW5jbHVkZXMAaGFzSW5kaWNlcwBzZXRNaWxsaXNlY29uZHMAZ2V0TWlsbGlzZWNvbmRzAHNldFVUQ01pbGxpc2Vjb25kcwBnZXRVVENNaWxsaXNlY29uZHMAc2V0U2Vjb25kcwBnZXRTZWNvbmRzAHNldFVUQ1NlY29uZHMAZ2V0VVRDU2Vjb25kcwBpdGFsaWNzAGFicwBwcm94eTogaW5jb25zaXN0ZW50IGhhcwAlLipzACAoJXMAc2V0ICVzAGdldCAlcwAgICAgYXQgJXMAbm90IGEgJXMAdW5zdXBwb3J0ZWQga2V5d29yZDogJXMAc3Vic3RyAHByb3h5OiBpbmNvbnNpc3RlbnQgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yAHN1cGVyKCkgaXMgb25seSB2YWxpZCBpbiBhIGRlcml2ZWQgY2xhc3MgY29uc3RydWN0b3IAcGFyZW50IGNsYXNzIG11c3QgYmUgY29uc3RydWN0b3IAbm90IGEgY29uc3RydWN0b3IAQXJyYXkgSXRlcmF0b3IAU2V0IEl0ZXJhdG9yAE1hcCBJdGVyYXRvcgBSZWdFeHAgU3RyaW5nIEl0ZXJhdG9yAG5vdCBhbiBBc3luYy1mcm9tLVN5bmMgSXRlcmF0b3IAY2Fubm90IGludm9rZSBhIHJ1bm5pbmcgZ2VuZXJhdG9yAG5vdCBhIGdlbmVyYXRvcgBBc3luY0dlbmVyYXRvcgBzeW50YXggZXJyb3IAU3ludGF4RXJyb3IARXZhbEVycm9yAEludGVybmFsRXJyb3IAQWdncmVnYXRlRXJyb3IAVHlwZUVycm9yAFJhbmdlRXJyb3IAUmVmZXJlbmNlRXJyb3IAVVJJRXJyb3IAZmxvb3IAZm9udGNvbG9yAGFuY2hvcgBmb3IAa2V5Rm9yAGV4cGVjdGluZyBzdXJyb2dhdGUgcGFpcgBhIGRlY2xhcmF0aW9uIGluIHRoZSBoZWFkIG9mIGEgZm9yLSVzIGxvb3AgY2FuJ3QgaGF2ZSBhbiBpbml0aWFsaXplcgAnYXJndW1lbnRzJyBpZGVudGlmaWVyIGlzIG5vdCBhbGxvd2VkIGluIGNsYXNzIGZpZWxkIGluaXRpYWxpemVyAGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgZ2V0dGVyIG9yIHNldHRlcgBpbnZhbGlkIHNldHRlcgBpbnZhbGlkIGdldHRlcgBmaWx0ZXIAbWlzc2luZyBmb3JtYWwgcGFyYW1ldGVyACJ1c2Ugc3RyaWN0IiBub3QgYWxsb3dlZCBpbiBmdW5jdGlvbiB3aXRoIGRlZmF1bHQgb3IgZGVzdHJ1Y3R1cmluZyBwYXJhbWV0ZXIAaW52YWxpZCBjaGFyYWN0ZXIAdW5leHBlY3RlZCBjaGFyYWN0ZXIAcHJpdmF0ZSBjbGFzcyBmaWVsZCBmb3JiaWRkZW4gYWZ0ZXIgc3VwZXIAaW52YWxpZCByZWRlZmluaXRpb24gb2YgbGV4aWNhbCBpZGVudGlmaWVyACdsZXQnIGlzIG5vdCBhIHZhbGlkIGxleGljYWwgaWRlbnRpZmllcgBpbnZhbGlkIHJlZGVmaW5pdGlvbiBvZiBnbG9iYWwgaWRlbnRpZmllcgB5aWVsZCBpcyBhIHJlc2VydmVkIGlkZW50aWZpZXIAJyVzJyBpcyBhIHJlc2VydmVkIGlkZW50aWZpZXIAb3RoZXIAYXRvbTFfaXNfaW50ZWdlciAmJiBhdG9tMl9pc19pbnRlZ2VyAGNhbm5vdCBjb252ZXJ0IHRvIGJpZ2ludDogbm90IGFuIGludGVnZXIAaXNJbnRlZ2VyAGlzU2FmZUludGVnZXIAYnVmZmVyAFNoYXJlZEFycmF5QnVmZmVyAGNhbm5vdCB1c2UgaWRlbnRpY2FsIEFycmF5QnVmZmVyAGNhbm5vdCBjb252ZXJ0IGJpZ2ludCB0byBudW1iZXIAY2Fubm90IGNvbnZlcnQgc3ltYm9sIHRvIG51bWJlcgBub3QgYSBudW1iZXIAbGluZU51bWJlcgBtYWxmb3JtZWQgdW5pY29kZSBjaGFyAGNsZWFyAHNldFllYXIAZ2V0WWVhcgBzZXRGdWxsWWVhcgBnZXRGdWxsWWVhcgBzZXRVVENGdWxsWWVhcgBnZXRVVENGdWxsWWVhcgBxICE9IHIAdW5leHBlY3RlZCBsaW5lIHRlcm1pbmF0b3IgaW4gcmVnZXhwAHVuZXhwZWN0ZWQgZW5kIG9mIHJlZ2V4cABSZWdFeHAAc3VwAGludmFsaWQgZ3JvdXAAcG9wAGNvbnRpbnVlIG11c3QgYmUgaW5zaWRlIGxvb3AAYmZfbG9naWNfb3AAZHVtcABudW1fa2V5c19jbXAAdXNlIHN0cmlwAG1hcABmbGF0TWFwAFdlYWtNYXAAZXhwZWN0aW5nICd7JyBhZnRlciBccABsb2cxcABkaXZpc2lvbiBieSB6ZXJvADBvAGhhc093bgByZXR1cm4AcHJvbWlzZSBzZWxmIHJlc29sdXRpb24Ab3V0IG9mIG1lbW9yeSBpbiByZWdleHAgZXhlY3V0aW9uAGRlc2NyaXB0aW9uACFtLT5ldmFsX2hhc19leGNlcHRpb24AIW1vZHVsZS0+ZXZhbF9oYXNfZXhjZXB0aW9uAHByb3h5OiBkZWZpbmVQcm9wZXJ0eSBleGNlcHRpb24AanNfYXN5bmNfZ2VuZXJhdG9yX3Jlc29sdmVfZnVuY3Rpb24AanNfY3JlYXRlX2Z1bmN0aW9uAHNldC9hZGQgaXMgbm90IGEgZnVuY3Rpb24AcmV0dXJuIG5vdCBpbiBhIGZ1bmN0aW9uAEFzeW5jR2VuZXJhdG9yRnVuY3Rpb24AY2FsbEV4dGVybmFsRnVuY3Rpb24AQXN5bmNGdW5jdGlvbgBqc19pbm5lcl9tb2R1bGVfZXZhbHVhdGlvbgAhbS0+YXN5bmNfZXZhbHVhdGlvbgBtb2R1bGUtPmFzeW5jX2V2YWx1YXRpb24AaW52YWxpZCBvcGVyYXRpb24AdW5zdXBwb3J0ZWQgb3BlcmF0aW9uAGF3YWl0IGluIGRlZmF1bHQgZXhwcmVzc2lvbgB5aWVsZCBpbiBkZWZhdWx0IGV4cHJlc3Npb24AaW52YWxpZCBkZWNpbWFsIGVzY2FwZSBpbiByZWd1bGFyIGV4cHJlc3Npb24AYmFjayByZWZlcmVuY2Ugb3V0IG9mIHJhbmdlIGluIHJlZ3VsYXIgZXhwcmVzc2lvbgBpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBpbiByZWd1bGFyIGV4cHJlc3Npb24AZXhwZWN0ZWQgJ29mJyBvciAnaW4nIGluIGZvciBjb250cm9sIGV4cHJlc3Npb24AdG9vIGNvbXBsaWNhdGVkIGRlc3RydWN0dXJpbmcgZXhwcmVzc2lvbgBleHBlY3RlZCAnfScgYWZ0ZXIgdGVtcGxhdGUgZXhwcmVzc2lvbgB0b1ByZWNpc2lvbgBhc2luAGpvaW4AbWluAGNvcHlXaXRoaW4AdGVtcGxhdGUgbGl0ZXJhbCBjYW5ub3QgYXBwZWFyIGluIGFuIG9wdGlvbmFsIGNoYWluAGNpcmN1bGFyIHByb3RvdHlwZSBjaGFpbgBhc3NpZ24AIXktPnNpZ24AaXNGcm96ZW4AKHBvcyArIGxlbikgPD0gYmNfYnVmX2xlbgB1bmV4cGVjdGVkIGVsbGlwc2lzIHRva2VuAHRoZW4Ac2V0dGVyIGlzIGZvcmJpZGRlbgBudWxsIG9yIHVuZGVmaW5lZCBhcmUgZm9yYmlkZGVuAGF0YW4AbmFuAG5vdCBhIGJvb2xlYW4AQm9vbGVhbgBnY19zY2FuAGJhZCBub3JtYWxpemF0aW9uIGZvcm0ASlNfTmV3U3ltYm9sRnJvbUF0b20AZnJvbQByYW5kb20AdHJpbQBiZl9kaXZyZW0AbS0+Y3ljbGVfcm9vdCA9PSBtAGltdWwAbm90IGEgc3ltYm9sAFN5bWJvbABSZWdFeHAgZXhlYyBtZXRob2QgbXVzdCByZXR1cm4gYW4gb2JqZWN0IG9yIG51bGwAcGFyZW50IHByb3RvdHlwZSBtdXN0IGJlIGFuIG9iamVjdCBvciBudWxsAGNhbm5vdCBzZXQgcHJvcGVydHkgJyVzJyBvZiBudWxsAGNhbm5vdCByZWFkIHByb3BlcnR5ICclcycgb2YgbnVsbABOdWxsAGZpbGwAbmV3IEFycmF5QnVmZmVyIGlzIHRvbyBzbWFsbABUeXBlZEFycmF5IGxlbmd0aCBpcyB0b28gc21hbGwAY2FsbABkb3RBbGwAbWF0Y2hBbGwAcmVwbGFjZUFsbABjZWlsAHVwZGF0ZV9sYWJlbABiY19idWZbcG9zXSA9PSBPUF9sYWJlbABldmFsAGludmFsaWQgYmlnaW50IGxpdGVyYWwAaW52YWxpZCBudW1iZXIgbGl0ZXJhbABtYWxmb3JtZWQgZXNjYXBlIHNlcXVlbmNlIGluIHN0cmluZyBsaXRlcmFsAGJmX2V4cF9pbnRlcm5hbABiZl9sb2dfaW50ZXJuYWwAYmZfZnRvYV9pbnRlcm5hbABKU19TZXRQcm9wZXJ0eUludGVybmFsAEpTX0dldE93blByb3BlcnR5TmFtZXNJbnRlcm5hbABfX0pTX0V2YWxJbnRlcm5hbAB0b0V4cG9uZW50aWFsAHNlYWwAZ2xvYmFsAGJsaW5rAHJldHVybiBpbiBhIHN0YXRpYyBpbml0aWFsaXplciBibG9jawBzdGFjawBscmVfZXhlY19iYWNrdHJhY2sAcy0+aXNfd2VhawBiZl9wb3dfdWkAc2V0TW9udGgAZ2V0TW9udGgAc2V0VVRDTW9udGgAZ2V0VVRDTW9udGgAaW52YWxpZCBrZXl3b3JkOiB3aXRoAHN0YXJ0c1dpdGgAZW5kc1dpdGgAcHJvcCA9PSBKU19BVE9NX2xlbmd0aABpbnZhbGlkIGFycmF5IGxlbmd0aABpbnZhbGlkIGFycmF5IGJ1ZmZlciBsZW5ndGgAaW52YWxpZCBsZW5ndGgAaW52YWxpZCBieXRlTGVuZ3RoAE1hdGgAcHVzaABhY29zaABKU19SZXNpemVBdG9tSGFzaABhc2luaABhdGFuaABicmVhayBtdXN0IGJlIGluc2lkZSBsb29wIG9yIHN3aXRjaABtYXRjaABuaXBfY2F0Y2gAc2VhcmNoAGZvckVhY2gAYmZfbG9nAEFycmF5IHRvbyBsb25nAHN0cmluZyB0b28gbG9uZwBBcnJheSBsb28gbG9uZwBzdWJzdHJpbmcAY2Fubm90IGNvbnZlcnQgc3ltYm9sIHRvIHN0cmluZwB1bmV4cGVjdGVkIGVuZCBvZiBzdHJpbmcAbm90IGEgc3RyaW5nAGludmFsaWQgY2hhcmFjdGVyIGluIGEgSlNPTiBzdHJpbmcAdG9TdHJpbmcAdG9EYXRlU3RyaW5nAHRvTG9jYWxlRGF0ZVN0cmluZwB0b1RpbWVTdHJpbmcAdG9Mb2NhbGVUaW1lU3RyaW5nAHRvTG9jYWxlU3RyaW5nAHRvR01UU3RyaW5nAEpTU3RyaW5nAHRvSVNPU3RyaW5nAHRvVVRDU3RyaW5nAGpzX2lubmVyX21vZHVsZV9saW5raW5nAGR1cGxpY2F0ZSBpbXBvcnQgYmluZGluZwBpbnZhbGlkIGltcG9ydCBiaW5kaW5nAHByb21pc2UgaXMgcGVuZGluZwBiaWcAcmVnZXhwIG11c3QgaGF2ZSB0aGUgJ2cnIGZsYWcAb2YAaW5mAEluZgBkaWZmID09IChpbnQ4X3QpZGlmZgBkaWZmID09IChpbnQxNl90KWRpZmYAaHJlZgBnY19kZWNyZWYAZnJlZV92YXJfcmVmAG9wdGltaXplX3Njb3BlX21ha2VfZ2xvYmFsX3JlZgByZXNldF93ZWFrX3JlZgBkZWxldGVfd2Vha19yZWYAb3B0aW1pemVfc2NvcGVfbWFrZV9yZWYAaW5kZXhPZgBsYXN0SW5kZXhPZgB2YWx1ZU9mAHNldFByb3RvdHlwZU9mAGdldFByb3RvdHlwZU9mAGlzUHJvdG90eXBlT2YAJS4qZgBmb250c2l6ZQBuZXdfc2l6ZSA8PSBzaC0+cHJvcF9zaXplAGRlc2NyIDwgcnQtPmF0b21fc2l6ZQBhdG9tIDwgcnQtPmF0b21fc2l6ZQBjb21wdXRlX3N0YWNrX3NpemUAbiA8IGJ1Zl9zaXplAG5vcm1hbGl6ZQBjcl9yZWdleHBfY2Fub25pY2FsaXplAGZyZWV6ZQByZXNvbHZlAHRvUHJpbWl0aXZlAHB1dF9sdmFsdWUAdW5rbm93biB1bmljb2RlIHByb3BlcnR5IHZhbHVlAHJlc3QgZWxlbWVudCBjYW5ub3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUAaW52YWxpZCByZXQgdmFsdWUAX19KU19BdG9tVG9WYWx1ZQBfX3F1b3RlAGlzRmluaXRlAGRlbGV0ZQBjcmVhdGUAc2V0RGF0ZQBnZXREYXRlAHNldFVUQ0RhdGUAZ2V0VVRDRGF0ZQBJbnZhbGlkIERhdGUAcmV2ZXJzZQBwYXJzZQBwcm94eSBwcmV2ZW50RXh0ZW5zaW9ucyBoYW5kbGVyIHJldHVybmVkIGZhbHNlAG1vZHVsZSBuYW1lc3BhY2UgcHJvcGVydGllcyBoYXZlIHdyaXRhYmxlID0gZmFsc2UAUHJvbWlzZQB0b0xvd2VyQ2FzZQB0b0xvY2FsZUxvd2VyQ2FzZQB0b1VwcGVyQ2FzZQB0b0xvY2FsZVVwcGVyQ2FzZQBpZ25vcmVDYXNlAGxvY2FsZUNvbXBhcmUAcHJveHk6IGluY29uc2lzdGVudCBwcm90b3R5cGUAcHJveHk6IGJhZCBwcm90b3R5cGUAbm90IGEgcHJvdG90eXBlAGludmFsaWQgb2JqZWN0IHR5cGUAdW5lc2NhcGUAbm9uZQByZXN0IGVsZW1lbnQgbXVzdCBiZSB0aGUgbGFzdCBvbmUAbXVsdGlsaW5lACAgcGMybGluZQBhc3luY19mdW5jX3Jlc3VtZQBzb21lAEpTX0ZyZWVSdW50aW1lAEpTUnVudGltZQBzZXRUaW1lAGdldFRpbWUAYXN5bmNfZnVuY19mcmVlX2ZyYW1lAHNldF9vYmplY3RfbmFtZQBleHBlY3RpbmcgcHJvcGVydHkgbmFtZQB1bmtub3duIHVuaWNvZGUgcHJvcGVydHkgbmFtZQBpbnZhbGlkIHByb3BlcnR5IG5hbWUAZHVwbGljYXRlIF9fcHJvdG9fXyBwcm9wZXJ0eSBuYW1lAGludmFsaWQgcmVkZWZpbml0aW9uIG9mIHBhcmFtZXRlciBuYW1lAGV4cGVjdGluZyBncm91cCBuYW1lAGR1cGxpY2F0ZSBncm91cCBuYW1lAGludmFsaWQgZ3JvdXAgbmFtZQBkdXBsaWNhdGUgbGFiZWwgbmFtZQBpbnZhbGlkIGZpcnN0IGNoYXJhY3RlciBvZiBwcml2YXRlIG5hbWUAaW52YWxpZCBsZXhpY2FsIHZhcmlhYmxlIG5hbWUAaW52YWxpZCBtZXRob2QgbmFtZQBleHBlY3RpbmcgZmllbGQgbmFtZQBpbnZhbGlkIGZpZWxkIG5hbWUAY2xhc3Mgc3RhdGVtZW50IHJlcXVpcmVzIGEgbmFtZQBmaWxlTmFtZQBqc19saW5rX21vZHVsZQBqc19ldmFsdWF0ZV9tb2R1bGUAbW9kdWxlLT5jeWNsZV9yb290ID09IG1vZHVsZQBjb21waWxlAG9iamVjdCBpcyBub3QgZXh0ZW5zaWJsZQBwcm94eTogaW5jb25zaXN0ZW50IGlzRXh0ZW5zaWJsZQBjYW5ub3QgaGF2ZSBzZXR0ZXIvZ2V0dGVyIGFuZCB2YWx1ZSBvciB3cml0YWJsZQBwcm9wZXJ0eSBpcyBub3QgY29uZmlndXJhYmxlAHZhbHVlIGlzIG5vdCBpdGVyYWJsZQBwcm9wZXJ0eUlzRW51bWVyYWJsZQBtaXNzaW5nIGluaXRpYWxpemVyIGZvciBjb25zdCB2YXJpYWJsZQBsZXhpY2FsIHZhcmlhYmxlAGludmFsaWQgcmVkZWZpbml0aW9uIG9mIGEgdmFyaWFibGUAcmV2b2NhYmxlAHN0cmlrZQBtcF9kaXZub3JtX2xhcmdlAGludmFsaWQgY2xhc3MgcmFuZ2UAbWVzc2FnZQBpbnZhbGlkIGx2YWx1ZSBpbiBzdHJpY3QgbW9kZQBpbnZhbGlkIHZhcmlhYmxlIG5hbWUgaW4gc3RyaWN0IG1vZGUAY2Fubm90IGRlbGV0ZSBhIGRpcmVjdCByZWZlcmVuY2UgaW4gc3RyaWN0IG1vZGUAb2N0YWwgZXNjYXBlIHNlcXVlbmNlcyBhcmUgbm90IGFsbG93ZWQgaW4gc3RyaWN0IG1vZGUAb2N0YWwgbGl0ZXJhbHMgYXJlIGRlcHJlY2F0ZWQgaW4gc3RyaWN0IG1vZGUAdW5pY29kZQAgIGJ5dGVjb2RlAEpTRnVuY3Rpb25CeXRlY29kZQBza2lwX2RlYWRfY29kZQBpbnZhbGlkIGFyZ3VtZW50IG5hbWUgaW4gc3RyaWN0IGNvZGUAaW52YWxpZCBmdW5jdGlvbiBuYW1lIGluIHN0cmljdCBjb2RlAGludmFsaWQgcmVkZWZpbml0aW9uIG9mIGdsb2JhbCBpZGVudGlmaWVyIGluIG1vZHVsZSBjb2RlAGltcG9ydC5tZXRhIG9ubHkgdmFsaWQgaW4gbW9kdWxlIGNvZGUAZnJvbUNoYXJDb2RlAGludmFsaWQgZm9yIGluL29mIGxlZnQgaGFuZC1zaWRlAGludmFsaWQgYXNzaWdubWVudCBsZWZ0LWhhbmQgc2lkZQByZWR1Y2UAc291cmNlACd0aGlzJyBjYW4gYmUgaW5pdGlhbGl6ZWQgb25seSBvbmNlAHByb3BlcnR5IGNvbnN0cnVjdG9yIGFwcGVhcnMgbW9yZSB0aGFuIG9uY2UAaW52YWxpZCBVVEYtOCBzZXF1ZW5jZQBjaXJjdWxhciByZWZlcmVuY2UAc2xpY2UAc3BsaWNlAHJhY2UAcmVwbGFjZQAlKy4qZQB1bmV4cGVjdGVkICdhd2FpdCcga2V5d29yZAB1bmV4cGVjdGVkICd5aWVsZCcga2V5d29yZABtYXBfZGVjcmVmX3JlY29yZABpdGVyYXRvciBkb2VzIG5vdCBoYXZlIGEgdGhyb3cgbWV0aG9kAG9iamVjdCBuZWVkcyB0b0lTT1N0cmluZyBtZXRob2QAJ3N1cGVyJyBpcyBvbmx5IHZhbGlkIGluIGEgbWV0aG9kAGZyb3VuZABfX2JmX3JvdW5kAGJyZWFrL2NvbnRpbnVlIGxhYmVsIG5vdCBmb3VuZABvdXQgb2YgYm91bmQAZmluZABiaW5kAGludmFsaWQgaW5kZXggZm9yIGFwcGVuZABleHRyYW5lb3VzIGNoYXJhY3RlcnMgYXQgdGhlIGVuZAB1bmV4cGVjdGVkIGRhdGEgYXQgdGhlIGVuZAB1bmV4cGVjdGVkIGVuZABpbnZhbGlkIGluY3JlbWVudC9kZWNyZW1lbnQgb3BlcmFuZABpbnZhbGlkICdpbnN0YW5jZW9mJyByaWdodCBvcGVyYW5kAGludmFsaWQgJ2luJyBvcGVyYW5kAHRyaW1FbmQAcGFkRW5kAGJvbGQAJWxsZABnY19kZWNyZWZfY2hpbGQAcmVzb2x2ZV9zY29wZV9wcml2YXRlX2ZpZWxkAGNhbm5vdCBkZWxldGUgYSBwcml2YXRlIGNsYXNzIGZpZWxkAGV4cGVjdGluZyA8YnJhbmQ+IHByaXZhdGUgZmllbGQAJXMgaXMgbm90IGluaXRpYWxpemVkAGZpeGVkAHRvRml4ZWQAc2V0X29iamVjdF9uYW1lX2NvbXB1dGVkAHJlZ2V4IG5vdCBzdXBwb3J0ZWQAZXZhbCBpcyBub3Qgc3VwcG9ydGVkAFJlZ0V4cCBhcmUgbm90IHN1cHBvcnRlZAB0b1NvcnRlZABpbnRlcnJ1cHRlZAAhcy0+aXNfY29tcGxldGVkACVzIG9iamVjdCBleHBlY3RlZABpZGVudGlmaWVyIGV4cGVjdGVkAGJ5dGVjb2RlIGZ1bmN0aW9uIGV4cGVjdGVkAHN0cmluZyBleHBlY3RlZABmcm9tIGNsYXVzZSBleHBlY3RlZABmdW5jdGlvbiBuYW1lIGV4cGVjdGVkAHZhcmlhYmxlIG5hbWUgZXhwZWN0ZWQAbWV0YSBleHBlY3RlZABqc19hc3luY19tb2R1bGVfZXhlY3V0aW9uX3JlamVjdGVkAGpzX3NldF9tb2R1bGVfZXZhbHVhdGVkAG1lbW9yeSBhbGxvY2F0ZWQAbWVtb3J5IHVzZWQAdG9SZXZlcnNlZABkZXJpdmVkIGNsYXNzIGNvbnN0cnVjdG9yIG11c3QgcmV0dXJuIGFuIG9iamVjdCBvciB1bmRlZmluZWQAY2Fubm90IHNldCBwcm9wZXJ0eSAnJXMnIG9mIHVuZGVmaW5lZABjYW5ub3QgcmVhZCBwcm9wZXJ0eSAnJXMnIG9mIHVuZGVmaW5lZABmbGFncyBtdXN0IGJlIHVuZGVmaW5lZABVbmRlZmluZWQAcHJpdmF0ZSBjbGFzcyBmaWVsZCBpcyBhbHJlYWR5IGRlZmluZWQAJyVzJyBpcyBub3QgZGVmaW5lZABncm91cCBuYW1lIG5vdCBkZWZpbmVkAGlzV2VsbEZvcm1lZAB0b1dlbGxGb3JtZWQAYWxsU2V0dGxlZABqc19hc3luY19tb2R1bGVfZXhlY3V0aW9uX2Z1bGZpbGxlZABjYW5ub3QgYmUgY2FsbGVkAGlzU2VhbGVkACFzaC0+aXNfaGFzaGVkAEFycmF5QnVmZmVyIGlzIGRldGFjaGVkAGpzX2FycmF5X3RvU3BsaWNlZABhZGQAJSswN2QAJTA0ZAAlMDJkJTAyZABwJStkACVjJStkACUwMmQvJTAyZC8lMCpkACUuM3MgJS4zcyAlMDJkICUwKmQAcCVkACVjJWQAOiVkAGludmFsaWQgdGhyb3cgdmFyIHR5cGUgJWQAc2MAanNfZGVmX21hbGxvYwB0cnVuYwBnYwBleGVjAGJmX2ludGVnZXJfdG9fcmFkaXhfcmVjAC90bXAvcXVpY2tqcy9xdWlja2pzLmMAL3RtcC9xdWlja2pzL2xpYnJlZ2V4cC5jAC90bXAvcXVpY2tqcy9saWJiZi5jAC90bXAvcXVpY2tqcy9saWJ1bmljb2RlLmMAc3ViAHByb21pc2VfcmVhY3Rpb25fam9iAGpzX3Byb21pc2VfcmVzb2x2ZV90aGVuYWJsZV9qb2IAMGIAciAhPSBhICYmIHIgIT0gYgBxICE9IGEgJiYgcSAhPSBiAHJ3YQByICE9IGEAX19sb29rdXBTZXR0ZXJfXwBfX2RlZmluZVNldHRlcl9fAF9fbG9va3VwR2V0dGVyX18AX19kZWZpbmVHZXR0ZXJfXwBfX3Byb3RvX18AW1N5bWJvbC5zcGxpdF0AW1N5bWJvbC5zcGVjaWVzXQBbU3ltYm9sLml0ZXJhdG9yXQBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdAFtTeW1ib2wubWF0Y2hBbGxdAFtTeW1ib2wubWF0Y2hdAFtTeW1ib2wuc2VhcmNoXQBbU3ltYm9sLnRvU3RyaW5nVGFnXQBbU3ltYm9sLnRvUHJpbWl0aXZlXQBbdW5zdXBwb3J0ZWQgdHlwZV0AW2Z1bmN0aW9uIGJ5dGVjb2RlXQBbU3ltYm9sLmhhc0luc3RhbmNlXQBbU3ltYm9sLnJlcGxhY2VdAFsAJTAyZDolMDJkOiUwMmQuJTAzZFoAUE9TSVRJVkVfSU5GSU5JVFkATkVHQVRJVkVfSU5GSU5JVFkAcC0+Y2xhc3NfaWQgPT0gSlNfQ0xBU1NfQVJSQVkAc3RhY2tfbGVuIDwgUE9QX1NUQUNLX0xFTl9NQVgALSUwMmQtJTAyZFQASlNfQXRvbUdldFN0clJUAG9wY29kZSA8IFJFT1BfQ09VTlQASlNfVkFMVUVfR0VUX1RBRyhmdW5jX3JldCkgPT0gSlNfVEFHX0lOVABCWVRFU19QRVJfRUxFTUVOVAAlMDJkOiUwMmQ6JTAyZCBHTVQASlNfVkFMVUVfR0VUX1RBRyhzZi0+Y3VyX2Z1bmMpID09IEpTX1RBR19PQkpFQ1QAdmFyX2tpbmQgPT0gSlNfVkFSX1BSSVZBVEVfU0VUVEVSAE1BWF9TQUZFX0lOVEVHRVIATUlOX1NBRkVfSU5URUdFUgBhc1VpbnROAGFzSW50TgBpc05hTgBEYXRlIHZhbHVlIGlzIE5hTgB0b0pTT04ARVBTSUxPTgBwLT5nY19vYmpfdHlwZSA9PSBKU19HQ19PQkpfVFlQRV9KU19PQkpFQ1QgfHwgcC0+Z2Nfb2JqX3R5cGUgPT0gSlNfR0NfT0JKX1RZUEVfRlVOQ1RJT05fQllURUNPREUgfHwgcC0+Z2Nfb2JqX3R5cGUgPT0gSlNfR0NfT0JKX1RZUEVfQVNZTkNfRlVOQ1RJT04ATkFOACUwMmQ6JTAyZDolMDJkICVjTQBzdGFja190b3AgPT0gTlVMTABzLT5sYWJlbF9zbG90c1tsYWJlbF0uZmlyc3RfcmVsb2MgPT0gTlVMTABsYWJlbF9zbG90c1tpXS5maXJzdF9yZWxvYyA9PSBOVUxMAHBycyAhPSBOVUxMAHNmLT5jdXJfc3AgIT0gTlVMTABzZiAhPSBOVUxMAG1yMSAhPSBOVUxMAHZhcl9raW5kICE9IEpTX1ZBUl9OT1JNQUwAYi0+ZnVuY19raW5kID09IEpTX0ZVTkNfTk9STUFMAGVuY29kZVVSSQBkZWNvZGVVUkkAUEkAc3BlY2lhbCA9PSBQVVRfTFZBTFVFX05PS0VFUCB8fCBzcGVjaWFsID09IFBVVF9MVkFMVUVfTk9LRUVQX0RFUFRIAHMtPnN0YXRlID09IEpTX0FTWU5DX0dFTkVSQVRPUl9TVEFURV9FWEVDVVRJTkcAbTEtPnN0YXR1cyA9PSBKU19NT0RVTEVfU1RBVFVTX0VWQUxVQVRJTkcAbTEtPnN0YXR1cyA9PSBKU19NT0RVTEVfU1RBVFVTX0xJTktJTkcAcHJlYyAhPSBCRl9QUkVDX0lORgBwcmVjMSAhPSBCRl9QUkVDX0lORgAwMTIzNDU2Nzg5QUJDREVGAFNJWkUATUFYX1ZBTFVFAE1JTl9WQUxVRQBOQU1FAGV2YWxfdHlwZSA9PSBKU19FVkFMX1RZUEVfR0xPQkFMIHx8IGV2YWxfdHlwZSA9PSBKU19FVkFMX1RZUEVfTU9EVUxFAExPRzJFAExPRzEwRQBzLT5zdGF0ZSA9PSBKU19BU1lOQ19HRU5FUkFUT1JfU1RBVEVfQVdBSVRJTkdfUkVUVVJOIHx8IHMtPnN0YXRlID09IEpTX0FTWU5DX0dFTkVSQVRPUl9TVEFURV9DT01QTEVURUQAbS0+c3RhdHVzID09IEpTX01PRFVMRV9TVEFUVVNfVU5MSU5LRUQgfHwgbS0+c3RhdHVzID09IEpTX01PRFVMRV9TVEFUVVNfTElOS0VEIHx8IG0tPnN0YXR1cyA9PSBKU19NT0RVTEVfU1RBVFVTX0VWQUxVQVRJTkdfQVNZTkMgfHwgbS0+c3RhdHVzID09IEpTX01PRFVMRV9TVEFUVVNfRVZBTFVBVEVEAG0xLT5zdGF0dXMgPT0gSlNfTU9EVUxFX1NUQVRVU19FVkFMVUFUSU5HIHx8IG0xLT5zdGF0dXMgPT0gSlNfTU9EVUxFX1NUQVRVU19FVkFMVUFUSU5HX0FTWU5DIHx8IG0xLT5zdGF0dXMgPT0gSlNfTU9EVUxFX1NUQVRVU19FVkFMVUFURUQAbTEtPnN0YXR1cyA9PSBKU19NT0RVTEVfU1RBVFVTX0xJTktJTkcgfHwgbTEtPnN0YXR1cyA9PSBKU19NT0RVTEVfU1RBVFVTX0xJTktFRCB8fCBtMS0+c3RhdHVzID09IEpTX01PRFVMRV9TVEFUVVNfRVZBTFVBVElOR19BU1lOQyB8fCBtMS0+c3RhdHVzID09IEpTX01PRFVMRV9TVEFUVVNfRVZBTFVBVEVEAG0tPnN0YXR1cyA9PSBKU19NT0RVTEVfU1RBVFVTX0xJTktFRABtLT5zdGF0dXMgPT0gSlNfTU9EVUxFX1NUQVRVU19VTkxJTktFRABVVEMAbS0+c3RhdHVzID09IEpTX01PRFVMRV9TVEFUVVNfRVZBTFVBVElOR19BU1lOQwBtb2R1bGUtPnN0YXR1cyA9PSBKU19NT0RVTEVfU1RBVFVTX0VWQUxVQVRJTkdfQVNZTkMAPGlucHV0PgA8aW5pdFNjcmlwdD4APGV2YWxTY3JpcHQ+ADxzZXQ+ADxhbm9ueW1vdXM+ADxjb21tRnVuPgA8Y2FsbEV4dGVybmFsRnVuY3Rpb24+ADxudWxsPgBiaWdpbnQgb3BlcmFuZHMgYXJlIGZvcmJpZGRlbiBmb3IgPj4+ACZxdW90OwBzZXRVaW50OABnZXRVaW50OABzZXRJbnQ4AGdldEludDgAbWFsZm9ybWVkIFVURi04AHJhZGl4IG11c3QgYmUgYmV0d2VlbiAyIGFuZCAzNgBzZXRVaW50MTYAZ2V0VWludDE2AHNldEludDE2AGdldEludDE2AGFyZ2MgPT0gNQBzZXRCaWdVaW50NjQAZ2V0QmlnVWludDY0AHNldEJpZ0ludDY0AGdldEJpZ0ludDY0AHNldEZsb2F0NjQAZ2V0RmxvYXQ2NABhcmdjID09IDMAYXRhbjIAbG9nMgBTUVJUMV8yAFNRUlQyAExOMgBjbHozMgBzZXRVaW50MzIAZ2V0VWludDMyAHNldEludDMyAGdldEludDMyAHNldEZsb2F0MzIAZ2V0RmxvYXQzMgBzdGFja19sZW4gPj0gMgBKU19BdG9tSXNOdW1lcmljSW5kZXgxAGpzX2ZjdnQxAEpTX0NvbXBhY3RCaWdJbnQxAGV4cG0xAHIgIT0gYTEgJiYgciAhPSBiMQBscy0+YWRkciA9PSAtMQBucSA+PSAxAHN0YWNrX2xlbiA+PSAxAHAtPmhlYWRlci5yZWZfY291bnQgPT0gMQBwLT5zaGFwZS0+aGVhZGVyLnJlZl9jb3VudCA9PSAxAHN0YWNrX2xlbiA9PSAxAGpzX2ZyZWVfc2hhcGUwAGxvZzEwAExOMTAAcC0+cmVmX2NvdW50ID4gMAB2YXJfcmVmLT5oZWFkZXIucmVmX2NvdW50ID4gMABtLT5wZW5kaW5nX2FzeW5jX2RlcGVuZGVuY2llcyA+IDAAc3RhY2tfc2l6ZSA+IDAAY3Bvb2xfaWR4ID49IDAAcnQtPmF0b21fY291bnQgPj0gMABscy0+cmVmX2NvdW50ID49IDAAcy0+aXNfZXZhbCB8fCBzLT5jbG9zdXJlX3Zhcl9jb3VudCA9PSAwAHAtPnJlZl9jb3VudCA9PSAwAGN0eC0+aGVhZGVyLnJlZl9jb3VudCA9PSAwAHNoLT5oZWFkZXIucmVmX2NvdW50ID09IDAAcC0+bWFyayA9PSAwAChwci0+dS5pbml0LnJlYWxtX2FuZF9pZCAmIDMpID09IDAAKG5ld19oYXNoX3NpemUgJiAobmV3X2hhc2hfc2l6ZSAtIDEpKSA9PSAwAGkgIT0gMABzaXplICE9IDAAXiRcLiorPygpW117fXwvADwvADAuAG1pc3NpbmcgYmluZGluZyBwYXR0ZXJuLi4uAGJpZ2ludCBhcmd1bWVudCB3aXRoIHVuYXJ5ICsAYXN5bmMgZnVuY3Rpb24gKgAKfSkAbGlzdF9lbXB0eSgmcnQtPmdjX29ial9saXN0KQBqID09IChzaC0+cHJvcF9jb3VudCAtIHNoLT5kZWxldGVkX3Byb3BfY291bnQpACFfX0pTX0F0b21Jc1RhZ2dlZEludChkZXNjcikAIWF0b21faXNfZnJlZShwKQAobnVsbCkAIChuYXRpdmUpAGpzX2NsYXNzX2hhc19ieXRlY29kZShwLT5jbGFzc19pZCkAbmlwX2NhdGNoOiBubyBjYXRjaCBvcCAocGM9JWQpAGluY29uc2lzdGVudCBjYXRjaCBwb3NpdGlvbjogJWQgJWQgKHBjPSVkKQBpbmNvbnNpc3RlbnQgc3RhY2sgc2l6ZTogJWQgJWQgKHBjPSVkKQBieXRlY29kZSBidWZmZXIgb3ZlcmZsb3cgKG9wPSVkLCBwYz0lZCkAc3RhY2sgb3ZlcmZsb3cgKG9wPSVkLCBwYz0lZCkAc3RhY2sgdW5kZXJmbG93IChvcD0lZCwgcGM9JWQpAGludmFsaWQgb3Bjb2RlIChvcD0lZCwgcGM9JWQpACg/OikAaWR4IDwgY291bnRvZihjYXNlX2NvbnZfdGFibGUxKQBubyBmdW5jdGlvbiBmaWxlbmFtZSBmb3IgaW1wb3J0KCkALV8uIX4qJygpACBhbm9ueW1vdXMoAFN5bWJvbCgAZXhwZWN0aW5nICd9JwBjbGFzcyBjb25zdHJ1Y3RvcnMgbXVzdCBiZSBpbnZva2VkIHdpdGggJ25ldycAZXhwZWN0aW5nICdhcycAdW5leHBlY3RlZCB0b2tlbiBpbiBleHByZXNzaW9uOiAnJS4qcycAdW5leHBlY3RlZCB0b2tlbjogJyUuKnMnAHJlZGVjbGFyYXRpb24gb2YgJyVzJwBkdXBsaWNhdGUgZXhwb3J0ZWQgbmFtZSAn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XwAAcF8AAAwLBQQCAgAAuwAAAHoAAAB7AAAAvAAAAHwAAAB9AAAAvQAAAHwAAAB9AAAAvgAAAFIAAABTAAAAvwAAAH4AAAB/AAAAwAAAAH4AAAB/AAAALwAAAIAAAACBAAAAwQAAAFIAAABTAAAAwgAAAIIAAACDAAAAAAAAAOkWAAAaFwAAJRcAAN0WAAAQFwAANBcAAPMWAAABFwAAY29weVdpdGhpbgBlbnRyaWVzAGZpbGwAZmluZABmaW5kSW5kZXgAZmluZExhc3QAZmluZExhc3RJbmRleABmbGF0AGZsYXRNYXAAaW5jbHVkZXMAa2V5cwB0b1JldmVyc2VkAHRvU29ydGVkAHRvU3BsaWNlZAB2YWx1ZXMAAAAAAAEBAgIDAwIDAAAAAAAAbnVsbABmYWxzZQB0cnVlAGlmAGVsc2UAcmV0dXJuAHZhcgB0aGlzAGRlbGV0ZQB2b2lkAHR5cGVvZgBuZXcAaW4AaW5zdGFuY2VvZgBkbwB3aGlsZQBmb3IAYnJlYWsAY29udGludWUAc3dpdGNoAGNhc2UAZGVmYXVsdAB0aHJvdwB0cnkAY2F0Y2gAZmluYWxseQBmdW5jdGlvbgBkZWJ1Z2dlcgB3aXRoAGNsYXNzAGNvbnN0AGVudW0AZXhwb3J0AGV4dGVuZHMAaW1wb3J0AHN1cGVyAGltcGxlbWVudHMAaW50ZXJmYWNlAGxldABwYWNrYWdlAHByaXZhdGUAcHJvdGVjdGVkAHB1YmxpYwBzdGF0aWMAeWllbGQAYXdhaXQAAGxlbmd0aABmaWxlTmFtZQBsaW5lTnVtYmVyAG1lc3NhZ2UAY2F1c2UAZXJyb3JzAHN0YWNrAG5hbWUAdG9TdHJpbmcAdG9Mb2NhbGVTdHJpbmcAdmFsdWVPZgBldmFsAHByb3RvdHlwZQBjb25zdHJ1Y3RvcgBjb25maWd1cmFibGUAd3JpdGFibGUAZW51bWVyYWJsZQB2YWx1ZQBnZXQAc2V0AG9mAF9fcHJvdG9fXwB1bmRlZmluZWQAbnVtYmVyAGJvb2xlYW4Ac3RyaW5nAG9iamVjdABzeW1ib2wAaW50ZWdlcgB1bmtub3duAGFyZ3VtZW50cwBjYWxsZWUAY2FsbGVyADxldmFsPgA8cmV0PgA8dmFyPgA8YXJnX3Zhcj4APHdpdGg+AGxhc3RJbmRleAB0YXJnZXQAaW5kZXgAaW5wdXQAZGVmaW5lUHJvcGVydGllcwBhcHBseQBqb2luAGNvbmNhdABzcGxpdABjb25zdHJ1Y3QAZ2V0UHJvdG90eXBlT2YAc2V0UHJvdG90eXBlT2YAaXNFeHRlbnNpYmxlAHByZXZlbnRFeHRlbnNpb25zAGhhcwBkZWxldGVQcm9wZXJ0eQBkZWZpbmVQcm9wZXJ0eQBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IAb3duS2V5cwBhZGQAZG9uZQBuZXh0AHZhbHVlcwBzb3VyY2UAZmxhZ3MAZ2xvYmFsAHVuaWNvZGUAcmF3AG5ldy50YXJnZXQAdGhpcy5hY3RpdmVfZnVuYwA8aG9tZV9vYmplY3Q+ADxjb21wdXRlZF9maWVsZD4APHN0YXRpY19jb21wdXRlZF9maWVsZD4APGNsYXNzX2ZpZWxkc19pbml0PgA8YnJhbmQ+ACNjb25zdHJ1Y3RvcgBhcwBmcm9tAG1ldGEAKmRlZmF1bHQqACoATW9kdWxlAHRoZW4AcmVzb2x2ZQByZWplY3QAcHJvbWlzZQBwcm94eQByZXZva2UAYXN5bmMAZXhlYwBncm91cHMAaW5kaWNlcwBzdGF0dXMAcmVhc29uAGdsb2JhbFRoaXMAYmlnaW50AG5vdC1lcXVhbAB0aW1lZC1vdXQAb2sAdG9KU09OAE9iamVjdABBcnJheQBFcnJvcgBOdW1iZXIAU3RyaW5nAEJvb2xlYW4AU3ltYm9sAEFyZ3VtZW50cwBNYXRoAEpTT04ARGF0ZQBGdW5jdGlvbgBHZW5lcmF0b3JGdW5jdGlvbgBGb3JJbkl0ZXJhdG9yAFJlZ0V4cABBcnJheUJ1ZmZlcgBTaGFyZWRBcnJheUJ1ZmZlcgBVaW50OENsYW1wZWRBcnJheQBJbnQ4QXJyYXkAVWludDhBcnJheQBJbnQxNkFycmF5AFVpbnQxNkFycmF5AEludDMyQXJyYXkAVWludDMyQXJyYXkAQmlnSW50NjRBcnJheQBCaWdVaW50NjRBcnJheQBGbG9hdDMyQXJyYXkARmxvYXQ2NEFycmF5AERhdGFWaWV3AEJpZ0ludABNYXAAU2V0AFdlYWtNYXAAV2Vha1NldABNYXAgSXRlcmF0b3IAU2V0IEl0ZXJhdG9yAEFycmF5IEl0ZXJhdG9yAFN0cmluZyBJdGVyYXRvcgBSZWdFeHAgU3RyaW5nIEl0ZXJhdG9yAEdlbmVyYXRvcgBQcm94eQBQcm9taXNlAFByb21pc2VSZXNvbHZlRnVuY3Rpb24AUHJvbWlzZVJlamVjdEZ1bmN0aW9uAEFzeW5jRnVuY3Rpb24AQXN5bmNGdW5jdGlvblJlc29sdmUAQXN5bmNGdW5jdGlvblJlamVjdABBc3luY0dlbmVyYXRvckZ1bmN0aW9uAEFzeW5jR2VuZXJhdG9yAEV2YWxFcnJvcgBSYW5nZUVycm9yAFJlZmVyZW5jZUVycm9yAFN5bnRheEVycm9yAFR5cGVFcnJvcgBVUklFcnJvcgBJbnRlcm5hbEVycm9yADxicmFuZD4AU3ltYm9sLnRvUHJpbWl0aXZlAFN5bWJvbC5pdGVyYXRvcgBTeW1ib2wubWF0Y2gAU3ltYm9sLm1hdGNoQWxsAFN5bWJvbC5yZXBsYWNlAFN5bWJvbC5zZWFyY2gAU3ltYm9sLnNwbGl0AFN5bWJvbC50b1N0cmluZ1RhZwBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlAFN5bWJvbC5oYXNJbnN0YW5jZQBTeW1ib2wuc3BlY2llcwBTeW1ib2wudW5zY29wYWJsZXMAU3ltYm9sLmFzeW5jSXRlcmF0b3IAAAAAAAEAAAAFAAEUBQABFQUAARUFAAEXBQABFwEAAQABAAEAAQABAAEAAQABAAEAAQABAAIAAQUDAAEKAQEAAAECAQABAwIAAQECAAECAwABAgQAAQMGAAECAwABAwQAAQQFAAEDAwABBAQAAQUFAAECAgABBAQAAQMDAAEDAwABBAQAAQUFAAMCAQ0DAQENAwEADQMCAQ0DAgANAwABDQMDAQoBAQAAAQAAAAEBAgABAAAAAQICAAECAAABAQAAAQEAAAYAABgFAQEPAwIBCgECAQABAQEAAQEBAAUAARcFAAEXBQABFwUBABcFAQAXBQIAFwECAwABAwAABgAAGAYAABgGAQAYBQEBFwUBAhcFAgAXAQIBAAEDAAABAwEAAQIBAAECAgABAwAAAQMBAAEEAAAFAgEXBQEBFwECAgABAgEAAQICAAEDAgABAwIAAgMDBQYCARgCAwEFBgICGAYDAxgDAAEQAwEAEAMBARAD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BOOAQJ+GiIlBY4C8jUHxjUPVhuw0iVKViWwFBUDvAEGAowILhBP6BgBwCQDwCkBXDADwDWDHDyDqF0AFGwBBIAAMqIA3qiBQ/iA6DSF0EQFaFCFEGYFaHaH1aiFF0kGv4iHwAQ4AQWRsYW0sQWRsbQBBaG9tLEFob20AQW5hdG9saWFuX0hpZXJvZ2x5cGhzLEhsdXcAQXJhYmljLEFyYWIAQXJtZW5pYW4sQXJtbgBBdmVzdGFuLEF2c3QAQmFsaW5lc2UsQmFsaQBCYW11bSxCYW11AEJhc3NhX1ZhaCxCYXNzAEJhdGFrLEJhdGsAQmVuZ2FsaSxCZW5nAEJoYWlrc3VraSxCaGtzAEJvcG9tb2ZvLEJvcG8AQnJhaG1pLEJyYWgAQnJhaWxsZSxCcmFpAEJ1Z2luZXNlLEJ1Z2kAQnVoaWQsQnVoZABDYW5hZGlhbl9BYm9yaWdpbmFsLENhbnMAQ2FyaWFuLENhcmkAQ2F1Y2FzaWFuX0FsYmFuaWFuLEFnaGIAQ2hha21hLENha20AQ2hhbSxDaGFtAENoZXJva2VlLENoZXIAQ2hvcmFzbWlhbixDaHJzAENvbW1vbixaeXl5AENvcHRpYyxDb3B0LFFhYWMAQ3VuZWlmb3JtLFhzdXgAQ3lwcmlvdCxDcHJ0AEN5cmlsbGljLEN5cmwAQ3lwcm9fTWlub2FuLENwbW4ARGVzZXJldCxEc3J0AERldmFuYWdhcmksRGV2YQBEaXZlc19Ba3VydSxEaWFrAERvZ3JhLERvZ3IARHVwbG95YW4sRHVwbABFZ3lwdGlhbl9IaWVyb2dseXBocyxFZ3lwAEVsYmFzYW4sRWxiYQBFbHltYWljLEVseW0ARXRoaW9waWMsRXRoaQBHZW9yZ2lhbixHZW9yAEdsYWdvbGl0aWMsR2xhZwBHb3RoaWMsR290aABHcmFudGhhLEdyYW4AR3JlZWssR3JlawBHdWphcmF0aSxHdWpyAEd1bmphbGFfR29uZGksR29uZwBHdXJtdWtoaSxHdXJ1AEhhbixIYW5pAEhhbmd1bCxIYW5nAEhhbmlmaV9Sb2hpbmd5YSxSb2hnAEhhbnVub28sSGFubwBIYXRyYW4sSGF0cgBIZWJyZXcsSGVicgBIaXJhZ2FuYSxIaXJhAEltcGVyaWFsX0FyYW1haWMsQXJtaQBJbmhlcml0ZWQsWmluaCxRYWFpAEluc2NyaXB0aW9uYWxfUGFobGF2aSxQaGxpAEluc2NyaXB0aW9uYWxfUGFydGhpYW4sUHJ0aQBKYXZhbmVzZSxKYXZhAEthaXRoaSxLdGhpAEthbm5hZGEsS25kYQBLYXRha2FuYSxLYW5hAEthd2ksS2F3aQBLYXlhaF9MaSxLYWxpAEtoYXJvc2h0aGksS2hhcgBLaG1lcixLaG1yAEtob2praSxLaG9qAEtoaXRhbl9TbWFsbF9TY3JpcHQsS2l0cwBLaHVkYXdhZGksU2luZABMYW8sTGFvbwBMYXRpbixMYXRuAExlcGNoYSxMZXBjAExpbWJ1LExpbWIATGluZWFyX0EsTGluYQBMaW5lYXJfQixMaW5iAExpc3UsTGlzdQBMeWNpYW4sTHljaQBMeWRpYW4sTHlkaQBNYWthc2FyLE1ha2EATWFoYWphbmksTWFoagBNYWxheWFsYW0sTWx5bQBNYW5kYWljLE1hbmQATWFuaWNoYWVhbixNYW5pAE1hcmNoZW4sTWFyYwBNYXNhcmFtX0dvbmRpLEdvbm0ATWVkZWZhaWRyaW4sTWVkZgBNZWV0ZWlfTWF5ZWssTXRlaQBNZW5kZV9LaWtha3VpLE1lbmQATWVyb2l0aWNfQ3Vyc2l2ZSxNZXJjAE1lcm9pdGljX0hpZXJvZ2x5cGhzLE1lcm8ATWlhbyxQbHJkAE1vZGksTW9kaQBNb25nb2xpYW4sTW9uZwBNcm8sTXJvbwBNdWx0YW5pLE11bHQATXlhbm1hcixNeW1yAE5hYmF0YWVhbixOYmF0AE5hZ19NdW5kYXJpLE5hZ20ATmFuZGluYWdhcmksTmFuZABOZXdfVGFpX0x1ZSxUYWx1AE5ld2EsTmV3YQBOa28sTmtvbwBOdXNodSxOc2h1AE55aWFrZW5nX1B1YWNodWVfSG1vbmcsSG1ucABPZ2hhbSxPZ2FtAE9sX0NoaWtpLE9sY2sAT2xkX0h1bmdhcmlhbixIdW5nAE9sZF9JdGFsaWMsSXRhbABPbGRfTm9ydGhfQXJhYmlhbixOYXJiAE9sZF9QZXJtaWMsUGVybQBPbGRfUGVyc2lhbixYcGVvAE9sZF9Tb2dkaWFuLFNvZ28AT2xkX1NvdXRoX0FyYWJpYW4sU2FyYgBPbGRfVHVya2ljLE9ya2gAT2xkX1V5Z2h1cixPdWdyAE9yaXlhLE9yeWEAT3NhZ2UsT3NnZQBPc21hbnlhLE9zbWEAUGFoYXdoX0htb25nLEhtbmcAUGFsbXlyZW5lLFBhbG0AUGF1X0Npbl9IYXUsUGF1YwBQaGFnc19QYSxQaGFnAFBob2VuaWNpYW4sUGhueABQc2FsdGVyX1BhaGxhdmksUGhscABSZWphbmcsUmpuZwBSdW5pYyxSdW5yAFNhbWFyaXRhbixTYW1yAFNhdXJhc2h0cmEsU2F1cgBTaGFyYWRhLFNocmQAU2hhdmlhbixTaGF3AFNpZGRoYW0sU2lkZABTaWduV3JpdGluZyxTZ253AFNpbmhhbGEsU2luaABTb2dkaWFuLFNvZ2QAU29yYV9Tb21wZW5nLFNvcmEAU295b21ibyxTb3lvAFN1bmRhbmVzZSxTdW5kAFN5bG90aV9OYWdyaSxTeWxvAFN5cmlhYyxTeXJjAFRhZ2Fsb2csVGdsZwBUYWdiYW53YSxUYWdiAFRhaV9MZSxUYWxlAFRhaV9UaGFtLExhbmEAVGFpX1ZpZXQsVGF2dABUYWtyaSxUYWtyAFRhbWlsLFRhbWwAVGFuZ3V0LFRhbmcAVGVsdWd1LFRlbHUAVGhhYW5hLFRoYWEAVGhhaSxUaGFpAFRpYmV0YW4sVGlidABUaWZpbmFnaCxUZm5nAFRpcmh1dGEsVGlyaABUYW5nc2EsVG5zYQBUb3RvLFRvdG8AVWdhcml0aWMsVWdhcgBWYWksVmFpaQBWaXRoa3VxaSxWaXRoAFdhbmNobyxXY2hvAFdhcmFuZ19DaXRpLFdhcmEAWWV6aWRpLFllemkAWWksWWlpaQBaYW5hYmF6YXJfU3F1YXJlLFphbmIAQZC2AgvyIMAZmUeFGZlHrhmAR44ZgEeEGZZHgBmeR4AZ4WBHphmER4QZgQ2TGeAPOIMsgBmCLAGDLIAZgCwDgCyAGYAsgBmCLACALACTLAC+LI0ajyzgJB2BOOBIHQClBQGxBQGCBQC2NQeaNQOFNQqEBIAZhQSAGY0EgBmCBIAZnwSAGYkEijiZBIA44AsEgBmhBI2LALuLAYKLrwSxlQ26ZgGCZq1/AY5/AJtSAYBSAIqLBJ4EAIEEBckEgBmcBNAggziOIIEZmSCDCwCHCwGBCwGVCwCGCwCACwKDCwGI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eW1ib2wAU28sT3RoZXJfU3ltYm9sAFBjLENvbm5lY3Rvcl9QdW5jdHVhdGlvbgBQZCxEYXNoX1B1bmN0dWF0aW9uAFBzLE9wZW5fUHVuY3R1YXRpb24AUGUsQ2xvc2VfUHVuY3R1YXRpb24AUGksSW5pdGlhbF9QdW5jdHVhdGlvbgBQZixGaW5hbF9QdW5jdHVhdGlvbgBQbyxPdGhlcl9QdW5jdHVhdGlvbgBacyxTcGFjZV9TZXBhcmF0b3IAWmwsTGluZV9TZXBhcmF0b3IAWnAsUGFyYWdyYXBoX1NlcGFyYXRvcgBDYyxDb250cm9sLGNudHJsAENmLEZvcm1hdABDcyxTdXJyb2dhdGUAQ28sUHJpdmF0ZV9Vc2UATEMsQ2FzZWRfTGV0dGVyAEwsTGV0dGVyAE0sTWFyayxDb21iaW5pbmdfTWFyawBOLE51bWJlcgBTLFN5bWJvbABQLFB1bmN0dWF0aW9uLHB1bmN0AFosU2VwYXJhdG9yAEMsT3RoZXIAQZDXAguwCA4AAAA+AAAAwAEAAAAOAAAA8AAAAAB/AAAAgAMBAAA8QVNDSUlfSGV4X0RpZ2l0LEFIZXgAQmlkaV9Db250cm9sLEJpZGlfQwBEYXNoAERlcHJlY2F0ZWQsRGVwAERpYWNyaXRpYyxEaWEARXh0ZW5kZXIsRXh0AEhleF9EaWdpdCxIZXgASURTX0JpbmFyeV9PcGVyYXRvcixJRFNCAElEU19UcmluYXJ5X09wZXJhdG9yLElEU1QASWRlb2dyYXBoaWMsSWRlbwBKb2luX0NvbnRyb2wsSm9pbl9DAExvZ2ljYWxfT3JkZXJfRXhjZXB0aW9uLExPRQBOb25jaGFyYWN0ZXJfQ29kZV9Qb2ludCxOQ2hhcgBQYXR0ZXJuX1N5bnRheCxQYXRfU3luAFBhdHRlcm5fV2hpdGVfU3BhY2UsUGF0X1dTAFF1b3RhdGlvbl9NYXJrLFFNYXJrAFJhZGljYWwAUmVnaW9uYWxfSW5kaWNhdG9yLFJJAFNlbnRlbmNlX1Rlcm1pbmFsLFNUZXJtAFNvZnRfRG90dGVkLFNEAFRlcm1pbmFsX1B1bmN0dWF0aW9uLFRlcm0AVW5pZmllZF9JZGVvZ3JhcGgsVUlkZW8AVmFyaWF0aW9uX1NlbGVjdG9yLFZTAFdoaXRlX1NwYWNlLHNwYWNlAEJpZGlfTWlycm9yZWQsQmlkaV9NAEVtb2ppAEVtb2ppX0NvbXBvbmVudCxFQ29tcABFbW9qaV9Nb2RpZmllcixFTW9kAEVtb2ppX01vZGlmaWVyX0Jhc2UsRUJhc2UARW1vamlfUHJlc2VudGF0aW9uLEVQcmVzAEV4dGVuZGVkX1BpY3RvZ3JhcGhpYyxFeHRQaWN0AERlZmF1bHRfSWdub3JhYmxlX0NvZGVfUG9pbnQsREkASURfU3RhcnQsSURTAENhc2VfSWdub3JhYmxlLENJAEFTQ0lJAEFscGhhYmV0aWMsQWxwaGEAQW55AEFzc2lnbmVkAENhc2VkAENoYW5nZXNfV2hlbl9DYXNlZm9sZGVkLENXQ0YAQ2hhbmdlc19XaGVuX0Nhc2VtYXBwZWQsQ1dDTQBDaGFuZ2VzX1doZW5fTG93ZXJjYXNlZCxDV0wAQ2hhbmdlc19XaGVuX05GS0NfQ2FzZWZvbGRlZCxDV0tDRgBDaGFuZ2VzX1doZW5fVGl0bGVjYXNlZCxDV1QAQ2hhbmdlc19XaGVuX1VwcGVyY2FzZWQsQ1dVAEdyYXBoZW1lX0Jhc2UsR3JfQmFzZQBHcmFwaGVtZV9FeHRlbmQsR3JfRXh0AElEX0NvbnRpbnVlLElEQwBMb3dlcmNhc2UsTG93ZXIATWF0aABVcHBlcmNhc2UsVXBwZXIAWElEX0NvbnRpbnVlLFhJREMAWElEX1N0YXJ0LFhJRFMAQdDfAgvyAgEAnAYHTQMEEACPCwAAEQAIAFNKUQBSAFMAOlRVAFdZP11cAEZhY0JkAGYAaABqAGwAbgAAQAAAAAAaAJMAACA1ACcAIQAkIioAE2ttACYkJxQWGBscPh4/Hzk9IiFBHkAlJSYoICpILEMuSzBMMkRCmQAAlY99foOEEoCCdncSe6N8eHmKkpimoIUAmqGTdTOVAI4AdJmYl5YAAJ4AnAChoBUuLzC0tU+qqRIUHiEiIio0NaanNh9JAACXAVraHTYFAMTDxsXIx8rJzMvE1UXWQtdG2M7Q0tTa2e72/g4HD4CfACGAo+0AwEDGYOfb5pnAAAAGYNwp/RUSBhb43QYVEoQIxhb/3wPAQABGYN7gbTc4ORUUFxYAGhkcGwBft2VERwBPYk5QAABIAAAAo6SlAAAAAAC2AABaAEcAW1ZY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n4PLdYFAzXWfjM11gcDTdS0D1HWfiNV1gcDZdZ8D2nWBwNt1nwzcdYFA4nUtg+J1nwjkdYFA6HWfg+h1gUDqdZ+M6nWBwPB1LQTxdR+F83UfBfZ1H4X4dR8F+3Ufhf11nwQMeJ9BDnifBQ94A8IReK3QEngDARt4LQKAe61NgXsDQoh7gcCJey1FinsDBI17gYCQewPckXstBaB7rciie4NEqHutyKp7lwBAfCFFQHwlDUR8h4BKfBXBSnwXQUt8Hw1MfBeCUnyZgFN8l8BTfJeBWnyXAGR8LwGAfIGAgHwDFoR8wQSQfAMBlHwfBfx+rAEAvhDRAL6sRwm+EDkNviyHKb4sAi2+kDcuvpD/Sb4QvGm+AAAAACAAAABhAAIABAAGALwDCAAKAAwAFQCVAKUAuQDBAMMAxwDLANEA1wDdAOAA5gD4AAgBCgFzABABEgEUASABLAFEAU0BUwFiAWgBagF2AZIBlAGpAbsBxwHRAdUBuQLXATsA2QHbAbcA4QH8AQwCGAIdAiMCJwKjAzMCPwJCAksCTgJRAl0CYAJpAmwCbwJ1AngCgQKKApwCnwKjAq8CuQLFAskCzQLRAtUC5wLtAvEC9QL5Av0CBQMJAw0DEwMXAxsDIwMnAysDLwM1Az0DQQNJA00DUQMLD1cDWwNfA2MDZwNrA28DcwN5A30DgQOFA4kDjQORA5UDmQOdA6ED3BClA8kDzQPZA90D4QPvA/EDPQRPBJkE8AQCBUoFZAVsBXAFcwWaBfoF/gUHBgsGFAYYBh4GIgYoBo4GlAaYBp4GogarBqwD8watA/YGrgP5Bq8D/AbMA/8GzQMCB84DBQcJBw0HEQeGAzIHNQe5AzcHOweIA1MHiQNWB5ADaweKA3cHsAOJB44DmQefB6MHjAO4B48Duwe0AL4HwAfCBxAgywcuAM0HzwcgANIH1gfbB98H5AfqB/AHIAD2BxIiAQgFCAcIHQglCCcIQwAtCDAIkAE2CDkITgBFCEcITAhOCFEIWgCpA1oAUwhXCGAIaQBiCGUIbwh0CHoIfgiiCEkApAimCKkIVgCrCK0IsAi0CFgAtgi4CLsIwAjCCMUIdgDHCMkIzAjQCHgA0gjUCNcI2wjeCOQI5wjwCPMI9gj5CAIJBgkLCQ8JFAkXCRoJIwksCTsJPglBCUQJRwlKCVYJXAlgCWIJZAloCWoJ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";if(!K(L)){var M=L;L=d.locateFile?d.locateFile(M,q):q+M;}function ca(){var a=L;return Promise.resolve().then(()=>{if(a==L&&v)var b=new Uint8Array(v);else{if(K(a)){b=atob(a.slice(37));for(var c=new Uint8Array(b.length),e=0;eWebAssembly.instantiate(c,a)).then(c=>c).then(b,c=>{u(`failed to asynchronously prepare wasm: ${c}`);w(c);});}function ea(a,b){return da(a,b);}var N=a=>{for(;0{for(var c=b+NaN,e=b;a[e]&&!(e>=c);)++e;if(16f?c+=String.fromCharCode(f):(f-=65536,c+=String.fromCharCode(55296|f>>10,56320|f&1023));}}else c+=String.fromCharCode(f);}return c;},fa=[0,31,60,91,121,152,182,213,244,274,305,335],ha=[0,31,59,90,120,151,181,212,243,273,304,334],Q=a=>{for(var b=0,c=0;c=e?b++:2047>=e?b+=2:55296<=e&&57343>=e?(b+=4,++c):b+=3;}return b;},R=(a,b,c)=>{var e=A;if(0=g){var l=a.charCodeAt(++f);g=65536+((g&1023)<<10)|l&1023;}if(127>=g){if(b>=c)break;e[b++]=g;}else{if(2047>=g){if(b+1>=c)break;e[b++]=192|g>>6;}else{if(65535>=g){if(b+2>=c)break;e[b++]=224|g>>12;}else{if(b+3>=c)break;e[b++]=240|g>>18;e[b++]=128|g>>12&63;}e[b++]=128|g>>6&63;}e[b++]=128|g&63;}}e[b]=0;}},T=a=>{var b=Q(a)+1,c=S(b);c&&R(a,c,b);return c;};function U(){}var ia=[null,[],[]],ka=(a,b,c,e)=>{var f={string:h=>{var r=0;if(null!==h&&void 0!==h&&0!==h){r=Q(h)+1;var Y=V(r);R(h,Y,r);r=Y;}return r;},array:h=>{var r=V(h.length);z.set(h,r);return r;}};a=d["_"+a];var g=[],l=0;if(e)for(var m=0;m{a=a?P(A,a):"";b=null!==b?JSON.parse(b?P(A,b):""):[];try{const e=d.externalCall(a,b);return e?T(e):null;}catch(e){return d.HEAPU8[c]=1,T(e.message);}};var la={a:(a,b,c,e)=>{w(`Assertion failed: ${a?P(A,a):""}, at: `+[b?b?P(A,b):"":"unknown filename",c,e?e?P(A,e):"":"unknown function"]);},i:function(a,b,c){a=new Date(1E3*(b+2097152>>>0<4194305-!!a?(a>>>0)+4294967296*b:NaN));B[c>>2]=a.getSeconds();B[c+4>>2]=a.getMinutes();B[c+8>>2]=a.getHours();B[c+12>>2]=a.getDate();B[c+16>>2]=a.getMonth();B[c+20>>2]=a.getFullYear()-1900;B[c+24>>2]=a.getDay();b=a.getFullYear();B[c+28>>2]=(0!==b%4||0===b%100&&0!==b%400?ha:fa)[a.getMonth()]+a.getDate()-1|0;B[c+36>>2]=-(60*a.getTimezoneOffset());b=new Date(a.getFullYear(),6,1).getTimezoneOffset();var e=new Date(a.getFullYear(),0,1).getTimezoneOffset();B[c+32>>2]=(b!=e&&a.getTimezoneOffset()==Math.min(e,b))|0;},d:(a,b,c)=>{function e(t){return(t=t.toTimeString().match(/\(([A-Za-z ]+)\)$/))?t[1]:"GMT";}var f=new Date().getFullYear(),g=new Date(f,0,1),l=new Date(f,6,1);f=g.getTimezoneOffset();var m=l.getTimezoneOffset();C[a>>2]=60*Math.max(f,m);B[b>>2]=Number(f!=m);a=e(g);b=e(l);a=T(a);b=T(b);m>2]=a,C[c+4>>2]=b):(C[c>>2]=b,C[c+4>>2]=a);},b:()=>{w("");},g:U,f:function(a,b){a=a?P(A,a):"";let c;try{c=window.JSON.parse(a);}catch(e){c=a;}0!==b?window.alert(a):window.console.log("DUMP",c);},e:()=>Date.now(),j:a=>{var b=A.length;a>>>=0;if(2147483648=c;c*=2){var e=b*(1+.2/c);e=Math.min(e,a+100663296);var f=Math;e=Math.max(a,e);a:{f=(f.min.call(f,2147483648,e+(65536-e%65536)%65536)-x.buffer.byteLength+65535)/65536;try{x.grow(f);D();var g=1;break a;}catch(l){}g=void 0;}if(g)return!0;}return!1;},c:(a,b,c,e)=>{for(var f=0,g=0;g>2],m=C[b+4>>2];b+=8;for(var t=0;t>2]=f;return 0;},k:function(a){a=a?P(A,a):"";window.console.log(a);},h:function(a){a=a?P(A,a):"";return Date.parse(a);},l:function(a,b,c,e){a=a?P(A,a):"";b=b?P(A,b):"";c=c?P(A,c):"";c=`Quickjs -- ${a}: ${b}\n${c}`;0!==e?window.alert(c):window.console.error(c);}},X=function(){function a(c){X=c.exports;x=X.m;D();F.unshift(X.n);H--;d.monitorRunDependencies?.(H);0==H&&(null!==I&&(clearInterval(I),I=null),J&&(c=J,J=null,c()));return X;}var b={a:la};H++;d.monitorRunDependencies?.(H);if(d.instantiateWasm)try{return d.instantiateWasm(b,a);}catch(c){u(`Module.instantiateWasm callback failed with error: ${c}`),n(c);}ea(b,function(c){a(c.instance);}).catch(n);return{};}();d._evalInSandbox=(a,b)=>(d._evalInSandbox=X.o)(a,b);d._nukeSandbox=()=>(d._nukeSandbox=X.p)();d._init=(a,b)=>(d._init=X.q)(a,b);d._commFun=(a,b)=>(d._commFun=X.r)(a,b);d._dumpMemoryUse=()=>(d._dumpMemoryUse=X.s)();var S=a=>(S=X.t)(a);d._free=a=>(d._free=X.u)(a);var W=()=>(W=X.w)(),ja=a=>(ja=X.x)(a),V=a=>(V=X.y)(a);d.ccall=ka;d.cwrap=(a,b,c,e)=>{var f=!c||c.every(g=>"number"===g||"boolean"===g);return"string"!==b&&f&&!e?d["_"+a]:function(){return ka(a,b,c,arguments,e);};};d.stringToNewUTF8=T;var Z;J=function ma(){Z||na();Z||(J=ma);};function na(){function a(){if(!Z&&(Z=!0,d.calledRun=!0,!y)){N(F);k(d);if(d.onRuntimeInitialized)d.onRuntimeInitialized();if(d.postRun)for("function"==typeof d.postRun&&(d.postRun=[d.postRun]);d.postRun.length;){var b=d.postRun.shift();G.unshift(b);}N(G);}}if(!(0 typeof c === \"number\" && c >= 0 && c <= 1);\n }\n static _getCorrectColor(colorArray) {\n return Color._isValidColor(colorArray) ? colorArray : [\"G\", 0];\n }\n convert(colorArray, cColorSpace) {\n if (!Color._isValidSpace(cColorSpace)) {\n return this.black;\n }\n if (cColorSpace === \"T\") {\n return [\"T\"];\n }\n colorArray = Color._getCorrectColor(colorArray);\n if (colorArray[0] === cColorSpace) {\n return colorArray;\n }\n if (colorArray[0] === \"T\") {\n return this.convert(this.black, cColorSpace);\n }\n return ColorConverters[`${colorArray[0]}_${cColorSpace}`](colorArray.slice(1));\n }\n equal(colorArray1, colorArray2) {\n colorArray1 = Color._getCorrectColor(colorArray1);\n colorArray2 = Color._getCorrectColor(colorArray2);\n if (colorArray1[0] === \"T\" || colorArray2[0] === \"T\") {\n return colorArray1[0] === \"T\" && colorArray2[0] === \"T\";\n }\n if (colorArray1[0] !== colorArray2[0]) {\n colorArray2 = this.convert(colorArray2, colorArray1[0]);\n }\n return colorArray1.slice(1).every((c, i) => c === colorArray2[i + 1]);\n }\n}\n\n;// CONCATENATED MODULE: ./src/scripting_api/field.js\n\n\n\nclass Field extends PDFObject {\n constructor(data) {\n super(data);\n this.alignment = data.alignment || \"left\";\n this.borderStyle = data.borderStyle || \"\";\n this.buttonAlignX = data.buttonAlignX || 50;\n this.buttonAlignY = data.buttonAlignY || 50;\n this.buttonFitBounds = data.buttonFitBounds;\n this.buttonPosition = data.buttonPosition;\n this.buttonScaleHow = data.buttonScaleHow;\n this.ButtonScaleWhen = data.buttonScaleWhen;\n this.calcOrderIndex = data.calcOrderIndex;\n this.comb = data.comb;\n this.commitOnSelChange = data.commitOnSelChange;\n this.currentValueIndices = data.currentValueIndices;\n this.defaultStyle = data.defaultStyle;\n this.defaultValue = data.defaultValue;\n this.doNotScroll = data.doNotScroll;\n this.doNotSpellCheck = data.doNotSpellCheck;\n this.delay = data.delay;\n this.display = data.display;\n this.doc = data.doc.wrapped;\n this.editable = data.editable;\n this.exportValues = data.exportValues;\n this.fileSelect = data.fileSelect;\n this.hidden = data.hidden;\n this.highlight = data.highlight;\n this.lineWidth = data.lineWidth;\n this.multiline = data.multiline;\n this.multipleSelection = !!data.multipleSelection;\n this.name = data.name;\n this.password = data.password;\n this.print = data.print;\n this.radiosInUnison = data.radiosInUnison;\n this.readonly = data.readonly;\n this.rect = data.rect;\n this.required = data.required;\n this.richText = data.richText;\n this.richValue = data.richValue;\n this.style = data.style;\n this.submitName = data.submitName;\n this.textFont = data.textFont;\n this.textSize = data.textSize;\n this.type = data.type;\n this.userName = data.userName;\n this._actions = createActionsMap(data.actions);\n this._browseForFileToSubmit = data.browseForFileToSubmit || null;\n this._buttonCaption = null;\n this._buttonIcon = null;\n this._charLimit = data.charLimit;\n this._children = null;\n this._currentValueIndices = data.currentValueIndices || 0;\n this._document = data.doc;\n this._fieldPath = data.fieldPath;\n this._fillColor = data.fillColor || [\"T\"];\n this._isChoice = Array.isArray(data.items);\n this._items = data.items || [];\n this._hasValue = data.hasOwnProperty(\"value\");\n this._page = data.page || 0;\n this._strokeColor = data.strokeColor || [\"G\", 0];\n this._textColor = data.textColor || [\"G\", 0];\n this._value = null;\n this._kidIds = data.kidIds || null;\n this._fieldType = getFieldType(this._actions);\n this._siblings = data.siblings || null;\n this._rotation = data.rotation || 0;\n this._globalEval = data.globalEval;\n this._appObjects = data.appObjects;\n this.value = data.value || \"\";\n }\n get currentValueIndices() {\n if (!this._isChoice) {\n return 0;\n }\n return this._currentValueIndices;\n }\n set currentValueIndices(indices) {\n if (!this._isChoice) {\n return;\n }\n if (!Array.isArray(indices)) {\n indices = [indices];\n }\n if (!indices.every(i => typeof i === \"number\" && Number.isInteger(i) && i >= 0 && i < this.numItems)) {\n return;\n }\n indices.sort();\n if (this.multipleSelection) {\n this._currentValueIndices = indices;\n this._value = [];\n indices.forEach(i => {\n this._value.push(this._items[i].displayValue);\n });\n } else if (indices.length > 0) {\n indices = indices.splice(1, indices.length - 1);\n this._currentValueIndices = indices[0];\n this._value = this._items[this._currentValueIndices];\n }\n this._send({\n id: this._id,\n indices\n });\n }\n get fillColor() {\n return this._fillColor;\n }\n set fillColor(color) {\n if (Color._isValidColor(color)) {\n this._fillColor = color;\n }\n }\n get bgColor() {\n return this.fillColor;\n }\n set bgColor(color) {\n this.fillColor = color;\n }\n get charLimit() {\n return this._charLimit;\n }\n set charLimit(limit) {\n if (typeof limit !== \"number\") {\n throw new Error(\"Invalid argument value\");\n }\n this._charLimit = Math.max(0, Math.floor(limit));\n }\n get numItems() {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n return this._items.length;\n }\n set numItems(_) {\n throw new Error(\"field.numItems is read-only\");\n }\n get strokeColor() {\n return this._strokeColor;\n }\n set strokeColor(color) {\n if (Color._isValidColor(color)) {\n this._strokeColor = color;\n }\n }\n get borderColor() {\n return this.strokeColor;\n }\n set borderColor(color) {\n this.strokeColor = color;\n }\n get page() {\n return this._page;\n }\n set page(_) {\n throw new Error(\"field.page is read-only\");\n }\n get rotation() {\n return this._rotation;\n }\n set rotation(angle) {\n angle = Math.floor(angle);\n if (angle % 90 !== 0) {\n throw new Error(\"Invalid rotation: must be a multiple of 90\");\n }\n angle %= 360;\n if (angle < 0) {\n angle += 360;\n }\n this._rotation = angle;\n }\n get textColor() {\n return this._textColor;\n }\n set textColor(color) {\n if (Color._isValidColor(color)) {\n this._textColor = color;\n }\n }\n get fgColor() {\n return this.textColor;\n }\n set fgColor(color) {\n this.textColor = color;\n }\n get value() {\n return this._value;\n }\n set value(value) {\n if (this._isChoice) {\n this._setChoiceValue(value);\n return;\n }\n if (value === \"\" || typeof value !== \"string\" || this._fieldType >= FieldType.date) {\n this._originalValue = undefined;\n this._value = value;\n return;\n }\n this._originalValue = value;\n const _value = value.trim().replace(\",\", \".\");\n this._value = !isNaN(_value) ? parseFloat(_value) : value;\n }\n _getValue() {\n return this._originalValue ?? this.value;\n }\n _setChoiceValue(value) {\n if (this.multipleSelection) {\n if (!Array.isArray(value)) {\n value = [value];\n }\n const values = new Set(value);\n if (Array.isArray(this._currentValueIndices)) {\n this._currentValueIndices.length = 0;\n this._value.length = 0;\n } else {\n this._currentValueIndices = [];\n this._value = [];\n }\n this._items.forEach((item, i) => {\n if (values.has(item.exportValue)) {\n this._currentValueIndices.push(i);\n this._value.push(item.exportValue);\n }\n });\n } else {\n if (Array.isArray(value)) {\n value = value[0];\n }\n const index = this._items.findIndex(({\n exportValue\n }) => value === exportValue);\n if (index !== -1) {\n this._currentValueIndices = index;\n this._value = this._items[index].exportValue;\n }\n }\n }\n get valueAsString() {\n return (this._value ?? \"\").toString();\n }\n set valueAsString(_) {}\n browseForFileToSubmit() {\n if (this._browseForFileToSubmit) {\n this._browseForFileToSubmit();\n }\n }\n buttonGetCaption(nFace = 0) {\n if (this._buttonCaption) {\n return this._buttonCaption[nFace];\n }\n return \"\";\n }\n buttonGetIcon(nFace = 0) {\n if (this._buttonIcon) {\n return this._buttonIcon[nFace];\n }\n return null;\n }\n buttonImportIcon(cPath = null, nPave = 0) {}\n buttonSetCaption(cCaption, nFace = 0) {\n if (!this._buttonCaption) {\n this._buttonCaption = [\"\", \"\", \"\"];\n }\n this._buttonCaption[nFace] = cCaption;\n }\n buttonSetIcon(oIcon, nFace = 0) {\n if (!this._buttonIcon) {\n this._buttonIcon = [null, null, null];\n }\n this._buttonIcon[nFace] = oIcon;\n }\n checkThisBox(nWidget, bCheckIt = true) {}\n clearItems() {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n this._items = [];\n this._send({\n id: this._id,\n clear: null\n });\n }\n deleteItemAt(nIdx = null) {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n if (!this.numItems) {\n return;\n }\n if (nIdx === null) {\n nIdx = Array.isArray(this._currentValueIndices) ? this._currentValueIndices[0] : this._currentValueIndices;\n nIdx ||= 0;\n }\n if (nIdx < 0 || nIdx >= this.numItems) {\n nIdx = this.numItems - 1;\n }\n this._items.splice(nIdx, 1);\n if (Array.isArray(this._currentValueIndices)) {\n let index = this._currentValueIndices.findIndex(i => i >= nIdx);\n if (index !== -1) {\n if (this._currentValueIndices[index] === nIdx) {\n this._currentValueIndices.splice(index, 1);\n }\n for (const ii = this._currentValueIndices.length; index < ii; index++) {\n --this._currentValueIndices[index];\n }\n }\n } else if (this._currentValueIndices === nIdx) {\n this._currentValueIndices = this.numItems > 0 ? 0 : -1;\n } else if (this._currentValueIndices > nIdx) {\n --this._currentValueIndices;\n }\n this._send({\n id: this._id,\n remove: nIdx\n });\n }\n getItemAt(nIdx = -1, bExportValue = false) {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n if (nIdx < 0 || nIdx >= this.numItems) {\n nIdx = this.numItems - 1;\n }\n const item = this._items[nIdx];\n return bExportValue ? item.exportValue : item.displayValue;\n }\n getArray() {\n if (this._kidIds) {\n const array = [];\n const fillArrayWithKids = kidIds => {\n for (const id of kidIds) {\n const obj = this._appObjects[id];\n if (!obj) {\n continue;\n }\n if (obj.obj._hasValue) {\n array.push(obj.wrapped);\n }\n if (obj.obj._kidIds) {\n fillArrayWithKids(obj.obj._kidIds);\n }\n }\n };\n fillArrayWithKids(this._kidIds);\n return array;\n }\n if (this._children === null) {\n this._children = this._document.obj._getTerminalChildren(this._fieldPath);\n }\n return this._children;\n }\n getLock() {\n return undefined;\n }\n isBoxChecked(nWidget) {\n return false;\n }\n isDefaultChecked(nWidget) {\n return false;\n }\n insertItemAt(cName, cExport = undefined, nIdx = 0) {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n if (!cName) {\n return;\n }\n if (nIdx < 0 || nIdx > this.numItems) {\n nIdx = this.numItems;\n }\n if (this._items.some(({\n displayValue\n }) => displayValue === cName)) {\n return;\n }\n if (cExport === undefined) {\n cExport = cName;\n }\n const data = {\n displayValue: cName,\n exportValue: cExport\n };\n this._items.splice(nIdx, 0, data);\n if (Array.isArray(this._currentValueIndices)) {\n let index = this._currentValueIndices.findIndex(i => i >= nIdx);\n if (index !== -1) {\n for (const ii = this._currentValueIndices.length; index < ii; index++) {\n ++this._currentValueIndices[index];\n }\n }\n } else if (this._currentValueIndices >= nIdx) {\n ++this._currentValueIndices;\n }\n this._send({\n id: this._id,\n insert: {\n index: nIdx,\n ...data\n }\n });\n }\n setAction(cTrigger, cScript) {\n if (typeof cTrigger !== \"string\" || typeof cScript !== \"string\") {\n return;\n }\n if (!(cTrigger in this._actions)) {\n this._actions[cTrigger] = [];\n }\n this._actions[cTrigger].push(cScript);\n }\n setFocus() {\n this._send({\n id: this._id,\n focus: true\n });\n }\n setItems(oArray) {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n this._items.length = 0;\n for (const element of oArray) {\n let displayValue, exportValue;\n if (Array.isArray(element)) {\n displayValue = element[0]?.toString() || \"\";\n exportValue = element[1]?.toString() || \"\";\n } else {\n displayValue = exportValue = element?.toString() || \"\";\n }\n this._items.push({\n displayValue,\n exportValue\n });\n }\n this._currentValueIndices = 0;\n this._send({\n id: this._id,\n items: this._items\n });\n }\n setLock() {}\n signatureGetModifications() {}\n signatureGetSeedValue() {}\n signatureInfo() {}\n signatureSetSeedValue() {}\n signatureSign() {}\n signatureValidate() {}\n _isButton() {\n return false;\n }\n _reset() {\n this.value = this.defaultValue;\n }\n _runActions(event) {\n const eventName = event.name;\n if (!this._actions.has(eventName)) {\n return false;\n }\n const actions = this._actions.get(eventName);\n try {\n for (const action of actions) {\n this._globalEval(action);\n }\n } catch (error) {\n event.rc = false;\n throw error;\n }\n return true;\n }\n}\nclass RadioButtonField extends Field {\n constructor(otherButtons, data) {\n super(data);\n this.exportValues = [this.exportValues];\n this._radioIds = [this._id];\n this._radioActions = [this._actions];\n for (const radioData of otherButtons) {\n this.exportValues.push(radioData.exportValues);\n this._radioIds.push(radioData.id);\n this._radioActions.push(createActionsMap(radioData.actions));\n if (this._value === radioData.exportValues) {\n this._id = radioData.id;\n }\n }\n this._hasBeenInitialized = true;\n this._value = data.value || \"\";\n }\n get value() {\n return this._value;\n }\n set value(value) {\n if (!this._hasBeenInitialized) {\n return;\n }\n if (value === null || value === undefined) {\n this._value = \"\";\n }\n const i = this.exportValues.indexOf(value);\n if (0 <= i && i < this._radioIds.length) {\n this._id = this._radioIds[i];\n this._value = value;\n } else if (value === \"Off\" && this._radioIds.length === 2) {\n const nextI = (1 + this._radioIds.indexOf(this._id)) % 2;\n this._id = this._radioIds[nextI];\n this._value = this.exportValues[nextI];\n }\n }\n checkThisBox(nWidget, bCheckIt = true) {\n if (nWidget < 0 || nWidget >= this._radioIds.length || !bCheckIt) {\n return;\n }\n this._id = this._radioIds[nWidget];\n this._value = this.exportValues[nWidget];\n this._send({\n id: this._id,\n value: this._value\n });\n }\n isBoxChecked(nWidget) {\n return nWidget >= 0 && nWidget < this._radioIds.length && this._id === this._radioIds[nWidget];\n }\n isDefaultChecked(nWidget) {\n return nWidget >= 0 && nWidget < this.exportValues.length && this.defaultValue === this.exportValues[nWidget];\n }\n _getExportValue(state) {\n const i = this._radioIds.indexOf(this._id);\n return this.exportValues[i];\n }\n _runActions(event) {\n const i = this._radioIds.indexOf(this._id);\n this._actions = this._radioActions[i];\n return super._runActions(event);\n }\n _isButton() {\n return true;\n }\n}\nclass CheckboxField extends RadioButtonField {\n get value() {\n return this._value;\n }\n set value(value) {\n if (!value || value === \"Off\") {\n this._value = \"Off\";\n } else {\n super.value = value;\n }\n }\n _getExportValue(state) {\n return state ? super._getExportValue(state) : \"Off\";\n }\n isBoxChecked(nWidget) {\n if (this._value === \"Off\") {\n return false;\n }\n return super.isBoxChecked(nWidget);\n }\n isDefaultChecked(nWidget) {\n if (this.defaultValue === \"Off\") {\n return this._value === \"Off\";\n }\n return super.isDefaultChecked(nWidget);\n }\n checkThisBox(nWidget, bCheckIt = true) {\n if (nWidget < 0 || nWidget >= this._radioIds.length) {\n return;\n }\n this._id = this._radioIds[nWidget];\n this._value = bCheckIt ? this.exportValues[nWidget] : \"Off\";\n this._send({\n id: this._id,\n value: this._value\n });\n }\n}\n\n;// CONCATENATED MODULE: ./src/scripting_api/aform.js\n\nclass AForm {\n constructor(document, app, util, color) {\n this._document = document;\n this._app = app;\n this._util = util;\n this._color = color;\n this._dateFormats = [\"m/d\", \"m/d/yy\", \"mm/dd/yy\", \"mm/yy\", \"d-mmm\", \"d-mmm-yy\", \"dd-mmm-yy\", \"yy-mm-dd\", \"mmm-yy\", \"mmmm-yy\", \"mmm d, yyyy\", \"mmmm d, yyyy\", \"m/d/yy h:MM tt\", \"m/d/yy HH:MM\"];\n this._timeFormats = [\"HH:MM\", \"h:MM tt\", \"HH:MM:ss\", \"h:MM:ss tt\"];\n this._dateActionsCache = new Map();\n this._emailRegex = new RegExp(\"^[a-zA-Z0-9.!#$%&'*+\\\\/=?^_`{|}~-]+\" + \"@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\" + \"(?:\\\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$\");\n }\n _mkTargetName(event) {\n return event.target ? `[ ${event.target.name} ]` : \"\";\n }\n _tryToGuessDate(cFormat, cDate) {\n let actions = this._dateActionsCache.get(cFormat);\n if (!actions) {\n actions = [];\n this._dateActionsCache.set(cFormat, actions);\n cFormat.replaceAll(/(d+)|(m+)|(y+)|(H+)|(M+)|(s+)/g, function (match, d, m, y, H, M, s) {\n if (d) {\n actions.push((n, date) => {\n if (n >= 1 && n <= 31) {\n date.setDate(n);\n return true;\n }\n return false;\n });\n } else if (m) {\n actions.push((n, date) => {\n if (n >= 1 && n <= 12) {\n date.setMonth(n - 1);\n return true;\n }\n return false;\n });\n } else if (y) {\n actions.push((n, date) => {\n if (n < 50) {\n n += 2000;\n } else if (n < 100) {\n n += 1900;\n }\n date.setYear(n);\n return true;\n });\n } else if (H) {\n actions.push((n, date) => {\n if (n >= 0 && n <= 23) {\n date.setHours(n);\n return true;\n }\n return false;\n });\n } else if (M) {\n actions.push((n, date) => {\n if (n >= 0 && n <= 59) {\n date.setMinutes(n);\n return true;\n }\n return false;\n });\n } else if (s) {\n actions.push((n, date) => {\n if (n >= 0 && n <= 59) {\n date.setSeconds(n);\n return true;\n }\n return false;\n });\n }\n return \"\";\n });\n }\n const number = /\\d+/g;\n let i = 0;\n let array;\n const date = new Date();\n while ((array = number.exec(cDate)) !== null) {\n if (i < actions.length) {\n if (!actions[i++](parseInt(array[0]), date)) {\n return null;\n }\n } else {\n break;\n }\n }\n if (i === 0) {\n return null;\n }\n return date;\n }\n _parseDate(cFormat, cDate) {\n let date = null;\n try {\n date = this._util.scand(cFormat, cDate);\n } catch {}\n if (!date) {\n date = Date.parse(cDate);\n date = isNaN(date) ? this._tryToGuessDate(cFormat, cDate) : new Date(date);\n }\n return date;\n }\n AFMergeChange(event = globalThis.event) {\n if (event.willCommit) {\n return event.value.toString();\n }\n return this._app._eventDispatcher.mergeChange(event);\n }\n AFParseDateEx(cString, cOrder) {\n return this._parseDate(cOrder, cString);\n }\n AFExtractNums(str) {\n if (typeof str === \"number\") {\n return [str];\n }\n if (!str || typeof str !== \"string\") {\n return null;\n }\n const first = str.charAt(0);\n if (first === \".\" || first === \",\") {\n str = `0${str}`;\n }\n const numbers = str.match(/(\\d+)/g);\n if (numbers.length === 0) {\n return null;\n }\n return numbers;\n }\n AFMakeNumber(str) {\n if (typeof str === \"number\") {\n return str;\n }\n if (typeof str !== \"string\") {\n return null;\n }\n str = str.trim().replace(\",\", \".\");\n const number = parseFloat(str);\n if (isNaN(number) || !isFinite(number)) {\n return null;\n }\n return number;\n }\n AFMakeArrayFromList(string) {\n if (typeof string === \"string\") {\n return string.split(/, ?/g);\n }\n return string;\n }\n AFNumber_Format(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend) {\n const event = globalThis.event;\n let value = this.AFMakeNumber(event.value);\n if (value === null) {\n event.value = \"\";\n return;\n }\n const sign = Math.sign(value);\n const buf = [];\n let hasParen = false;\n if (sign === -1 && bCurrencyPrepend && negStyle === 0) {\n buf.push(\"-\");\n }\n if ((negStyle === 2 || negStyle === 3) && sign === -1) {\n buf.push(\"(\");\n hasParen = true;\n }\n if (bCurrencyPrepend) {\n buf.push(strCurrency);\n }\n sepStyle = Math.min(Math.max(0, Math.floor(sepStyle)), 4);\n buf.push(\"%,\", sepStyle, \".\", nDec.toString(), \"f\");\n if (!bCurrencyPrepend) {\n buf.push(strCurrency);\n }\n if (hasParen) {\n buf.push(\")\");\n }\n if (negStyle === 1 || negStyle === 3) {\n event.target.textColor = sign === 1 ? this._color.black : this._color.red;\n }\n if ((negStyle !== 0 || bCurrencyPrepend) && sign === -1) {\n value = -value;\n }\n const formatStr = buf.join(\"\");\n event.value = this._util.printf(formatStr, value);\n }\n AFNumber_Keystroke(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend) {\n const event = globalThis.event;\n let value = this.AFMergeChange(event);\n if (!value) {\n return;\n }\n value = value.trim();\n let pattern;\n if (sepStyle > 1) {\n pattern = event.willCommit ? /^[+-]?(\\d+(,\\d*)?|,\\d+)$/ : /^[+-]?\\d*,?\\d*$/;\n } else {\n pattern = event.willCommit ? /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)$/ : /^[+-]?\\d*\\.?\\d*$/;\n }\n if (!pattern.test(value)) {\n if (event.willCommit) {\n const err = `${GlobalConstants.IDS_INVALID_VALUE} ${this._mkTargetName(event)}`;\n this._app.alert(err);\n }\n event.rc = false;\n }\n if (event.willCommit && sepStyle > 1) {\n event.value = parseFloat(value.replace(\",\", \".\"));\n }\n }\n AFPercent_Format(nDec, sepStyle, percentPrepend = false) {\n if (typeof nDec !== \"number\") {\n return;\n }\n if (typeof sepStyle !== \"number\") {\n return;\n }\n if (nDec < 0) {\n throw new Error(\"Invalid nDec value in AFPercent_Format\");\n }\n const event = globalThis.event;\n if (nDec > 512) {\n event.value = \"%\";\n return;\n }\n nDec = Math.floor(nDec);\n sepStyle = Math.min(Math.max(0, Math.floor(sepStyle)), 4);\n let value = this.AFMakeNumber(event.value);\n if (value === null) {\n event.value = \"%\";\n return;\n }\n const formatStr = `%,${sepStyle}.${nDec}f`;\n value = this._util.printf(formatStr, value * 100);\n event.value = percentPrepend ? `%${value}` : `${value}%`;\n }\n AFPercent_Keystroke(nDec, sepStyle) {\n this.AFNumber_Keystroke(nDec, sepStyle, 0, 0, \"\", true);\n }\n AFDate_FormatEx(cFormat) {\n const event = globalThis.event;\n const value = event.value;\n if (!value) {\n return;\n }\n const date = this._parseDate(cFormat, value);\n if (date !== null) {\n event.value = this._util.printd(cFormat, date);\n }\n }\n AFDate_Format(pdf) {\n if (pdf >= 0 && pdf < this._dateFormats.length) {\n this.AFDate_FormatEx(this._dateFormats[pdf]);\n }\n }\n AFDate_KeystrokeEx(cFormat) {\n const event = globalThis.event;\n if (!event.willCommit) {\n return;\n }\n const value = this.AFMergeChange(event);\n if (!value) {\n return;\n }\n if (this._parseDate(cFormat, value) === null) {\n const invalid = GlobalConstants.IDS_INVALID_DATE;\n const invalid2 = GlobalConstants.IDS_INVALID_DATE2;\n const err = `${invalid} ${this._mkTargetName(event)}${invalid2}${cFormat}`;\n this._app.alert(err);\n event.rc = false;\n }\n }\n AFDate_Keystroke(pdf) {\n if (pdf >= 0 && pdf < this._dateFormats.length) {\n this.AFDate_KeystrokeEx(this._dateFormats[pdf]);\n }\n }\n AFRange_Validate(bGreaterThan, nGreaterThan, bLessThan, nLessThan) {\n const event = globalThis.event;\n if (!event.value) {\n return;\n }\n const value = this.AFMakeNumber(event.value);\n if (value === null) {\n return;\n }\n bGreaterThan = !!bGreaterThan;\n bLessThan = !!bLessThan;\n if (bGreaterThan) {\n nGreaterThan = this.AFMakeNumber(nGreaterThan);\n if (nGreaterThan === null) {\n return;\n }\n }\n if (bLessThan) {\n nLessThan = this.AFMakeNumber(nLessThan);\n if (nLessThan === null) {\n return;\n }\n }\n let err = \"\";\n if (bGreaterThan && bLessThan) {\n if (value < nGreaterThan || value > nLessThan) {\n err = this._util.printf(GlobalConstants.IDS_GT_AND_LT, nGreaterThan, nLessThan);\n }\n } else if (bGreaterThan) {\n if (value < nGreaterThan) {\n err = this._util.printf(GlobalConstants.IDS_GREATER_THAN, nGreaterThan);\n }\n } else if (value > nLessThan) {\n err = this._util.printf(GlobalConstants.IDS_LESS_THAN, nLessThan);\n }\n if (err) {\n this._app.alert(err);\n event.rc = false;\n }\n }\n AFSimple(cFunction, nValue1, nValue2) {\n const value1 = this.AFMakeNumber(nValue1);\n if (value1 === null) {\n throw new Error(\"Invalid nValue1 in AFSimple\");\n }\n const value2 = this.AFMakeNumber(nValue2);\n if (value2 === null) {\n throw new Error(\"Invalid nValue2 in AFSimple\");\n }\n switch (cFunction) {\n case \"AVG\":\n return (value1 + value2) / 2;\n case \"SUM\":\n return value1 + value2;\n case \"PRD\":\n return value1 * value2;\n case \"MIN\":\n return Math.min(value1, value2);\n case \"MAX\":\n return Math.max(value1, value2);\n }\n throw new Error(\"Invalid cFunction in AFSimple\");\n }\n AFSimple_Calculate(cFunction, cFields) {\n const actions = {\n AVG: args => args.reduce((acc, value) => acc + value, 0) / args.length,\n SUM: args => args.reduce((acc, value) => acc + value, 0),\n PRD: args => args.reduce((acc, value) => acc * value, 1),\n MIN: args => args.reduce((acc, value) => Math.min(acc, value), Number.MAX_VALUE),\n MAX: args => args.reduce((acc, value) => Math.max(acc, value), Number.MIN_VALUE)\n };\n if (!(cFunction in actions)) {\n throw new TypeError(\"Invalid function in AFSimple_Calculate\");\n }\n const event = globalThis.event;\n const values = [];\n cFields = this.AFMakeArrayFromList(cFields);\n for (const cField of cFields) {\n const field = this._document.getField(cField);\n if (!field) {\n continue;\n }\n for (const child of field.getArray()) {\n const number = this.AFMakeNumber(child.value);\n if (number !== null) {\n values.push(number);\n }\n }\n }\n if (values.length === 0) {\n event.value = cFunction === \"PRD\" ? 1 : 0;\n return;\n }\n const res = actions[cFunction](values);\n event.value = Math.round(1e6 * res) / 1e6;\n }\n AFSpecial_Format(psf) {\n const event = globalThis.event;\n if (!event.value) {\n return;\n }\n psf = this.AFMakeNumber(psf);\n let formatStr;\n switch (psf) {\n case 0:\n formatStr = \"99999\";\n break;\n case 1:\n formatStr = \"99999-9999\";\n break;\n case 2:\n formatStr = this._util.printx(\"9999999999\", event.value).length >= 10 ? \"(999) 999-9999\" : \"999-9999\";\n break;\n case 3:\n formatStr = \"999-99-9999\";\n break;\n default:\n throw new Error(\"Invalid psf in AFSpecial_Format\");\n }\n event.value = this._util.printx(formatStr, event.value);\n }\n AFSpecial_KeystrokeEx(cMask) {\n if (!cMask) {\n return;\n }\n const event = globalThis.event;\n const value = this.AFMergeChange(event);\n if (!value) {\n return;\n }\n const checkers = new Map([[\"9\", char => char >= \"0\" && char <= \"9\"], [\"A\", char => \"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\"], [\"O\", char => \"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\" || \"0\" <= char && char <= \"9\"], [\"X\", char => true]]);\n function _checkValidity(_value, _cMask) {\n for (let i = 0, ii = _value.length; i < ii; i++) {\n const mask = _cMask.charAt(i);\n const char = _value.charAt(i);\n const checker = checkers.get(mask);\n if (checker) {\n if (!checker(char)) {\n return false;\n }\n } else if (mask !== char) {\n return false;\n }\n }\n return true;\n }\n const err = `${GlobalConstants.IDS_INVALID_VALUE} = \"${cMask}\"`;\n if (value.length > cMask.length) {\n this._app.alert(err);\n event.rc = false;\n return;\n }\n if (event.willCommit) {\n if (value.length < cMask.length) {\n this._app.alert(err);\n event.rc = false;\n return;\n }\n if (!_checkValidity(value, cMask)) {\n this._app.alert(err);\n event.rc = false;\n return;\n }\n event.value += cMask.substring(value.length);\n return;\n }\n if (value.length < cMask.length) {\n cMask = cMask.substring(0, value.length);\n }\n if (!_checkValidity(value, cMask)) {\n this._app.alert(err);\n event.rc = false;\n }\n }\n AFSpecial_Keystroke(psf) {\n const event = globalThis.event;\n psf = this.AFMakeNumber(psf);\n let formatStr;\n switch (psf) {\n case 0:\n formatStr = \"99999\";\n break;\n case 1:\n formatStr = \"99999-9999\";\n break;\n case 2:\n const value = this.AFMergeChange(event);\n formatStr = value.length > 8 || value.startsWith(\"(\") ? \"(999) 999-9999\" : \"999-9999\";\n break;\n case 3:\n formatStr = \"999-99-9999\";\n break;\n default:\n throw new Error(\"Invalid psf in AFSpecial_Keystroke\");\n }\n this.AFSpecial_KeystrokeEx(formatStr);\n }\n AFTime_FormatEx(cFormat) {\n this.AFDate_FormatEx(cFormat);\n }\n AFTime_Format(pdf) {\n if (pdf >= 0 && pdf < this._timeFormats.length) {\n this.AFDate_FormatEx(this._timeFormats[pdf]);\n }\n }\n AFTime_KeystrokeEx(cFormat) {\n this.AFDate_KeystrokeEx(cFormat);\n }\n AFTime_Keystroke(pdf) {\n if (pdf >= 0 && pdf < this._timeFormats.length) {\n this.AFDate_KeystrokeEx(this._timeFormats[pdf]);\n }\n }\n eMailValidate(str) {\n return this._emailRegex.test(str);\n }\n AFExactMatch(rePatterns, str) {\n if (rePatterns instanceof RegExp) {\n return str.match(rePatterns)?.[0] === str || 0;\n }\n return rePatterns.findIndex(re => str.match(re)?.[0] === str) + 1;\n }\n}\n\n;// CONCATENATED MODULE: ./src/scripting_api/app_utils.js\nconst VIEWER_TYPE = \"PDF.js\";\nconst VIEWER_VARIATION = \"Full\";\nconst VIEWER_VERSION = 21.00720099;\nconst FORMS_VERSION = 21.00720099;\nconst USERACTIVATION_CALLBACKID = 0;\nconst USERACTIVATION_MAXTIME_VALIDITY = 5000;\nfunction serializeError(error) {\n const value = `${error.toString()}\\n${error.stack}`;\n return {\n command: \"error\",\n value\n };\n}\n\n;// CONCATENATED MODULE: ./src/scripting_api/event.js\n\nclass Event {\n constructor(data) {\n this.change = data.change || \"\";\n this.changeEx = data.changeEx || null;\n this.commitKey = data.commitKey || 0;\n this.fieldFull = data.fieldFull || false;\n this.keyDown = data.keyDown || false;\n this.modifier = data.modifier || false;\n this.name = data.name;\n this.rc = true;\n this.richChange = data.richChange || [];\n this.richChangeEx = data.richChangeEx || [];\n this.richValue = data.richValue || [];\n this.selEnd = data.selEnd ?? -1;\n this.selStart = data.selStart ?? -1;\n this.shift = data.shift || false;\n this.source = data.source || null;\n this.target = data.target || null;\n this.targetName = \"\";\n this.type = \"Field\";\n this.value = data.value || \"\";\n this.willCommit = data.willCommit || false;\n }\n}\nclass EventDispatcher {\n constructor(document, calculationOrder, objects, externalCall) {\n this._document = document;\n this._calculationOrder = calculationOrder;\n this._objects = objects;\n this._externalCall = externalCall;\n this._document.obj._eventDispatcher = this;\n this._isCalculating = false;\n }\n mergeChange(event) {\n let value = event.value;\n if (Array.isArray(value)) {\n return value;\n }\n if (typeof value !== \"string\") {\n value = value.toString();\n }\n const prefix = event.selStart >= 0 ? value.substring(0, event.selStart) : \"\";\n const postfix = event.selEnd >= 0 && event.selEnd <= value.length ? value.substring(event.selEnd) : \"\";\n return `${prefix}${event.change}${postfix}`;\n }\n userActivation() {\n this._document.obj._userActivation = true;\n this._externalCall(\"setTimeout\", [USERACTIVATION_CALLBACKID, USERACTIVATION_MAXTIME_VALIDITY]);\n }\n dispatch(baseEvent) {\n const id = baseEvent.id;\n if (!(id in this._objects)) {\n let event;\n if (id === \"doc\" || id === \"page\") {\n event = globalThis.event = new Event(baseEvent);\n event.source = event.target = this._document.wrapped;\n event.name = baseEvent.name;\n }\n if (id === \"doc\") {\n const eventName = event.name;\n if (eventName === \"Open\") {\n this.userActivation();\n this._document.obj._initActions();\n this.formatAll();\n }\n if (![\"DidPrint\", \"DidSave\", \"WillPrint\", \"WillSave\"].includes(eventName)) {\n this.userActivation();\n }\n this._document.obj._dispatchDocEvent(event.name);\n } else if (id === \"page\") {\n this.userActivation();\n this._document.obj._dispatchPageEvent(event.name, baseEvent.actions, baseEvent.pageNumber);\n } else if (id === \"app\" && baseEvent.name === \"ResetForm\") {\n this.userActivation();\n for (const fieldId of baseEvent.ids) {\n const obj = this._objects[fieldId];\n obj?.obj._reset();\n }\n }\n return;\n }\n const name = baseEvent.name;\n const source = this._objects[id];\n const event = globalThis.event = new Event(baseEvent);\n let savedChange;\n this.userActivation();\n if (source.obj._isButton()) {\n source.obj._id = id;\n event.value = source.obj._getExportValue(event.value);\n if (name === \"Action\") {\n source.obj._value = event.value;\n }\n }\n switch (name) {\n case \"Keystroke\":\n savedChange = {\n value: event.value,\n changeEx: event.changeEx,\n change: event.change,\n selStart: event.selStart,\n selEnd: event.selEnd\n };\n break;\n case \"Blur\":\n case \"Focus\":\n Object.defineProperty(event, \"value\", {\n configurable: false,\n writable: false,\n enumerable: true,\n value: event.value\n });\n break;\n case \"Validate\":\n this.runValidation(source, event);\n return;\n case \"Action\":\n this.runActions(source, source, event, name);\n this.runCalculate(source, event);\n return;\n }\n this.runActions(source, source, event, name);\n if (name !== \"Keystroke\") {\n return;\n }\n if (event.rc) {\n if (event.willCommit) {\n this.runValidation(source, event);\n } else {\n if (source.obj._isChoice) {\n source.obj.value = savedChange.changeEx;\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: source.obj.value\n });\n return;\n }\n const value = source.obj.value = this.mergeChange(event);\n let selStart, selEnd;\n if (event.selStart !== savedChange.selStart || event.selEnd !== savedChange.selEnd) {\n selStart = event.selStart;\n selEnd = event.selEnd;\n } else {\n selEnd = selStart = savedChange.selStart + event.change.length;\n }\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value,\n selRange: [selStart, selEnd]\n });\n }\n } else if (!event.willCommit) {\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: savedChange.value,\n selRange: [savedChange.selStart, savedChange.selEnd]\n });\n } else {\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: \"\",\n formattedValue: null,\n selRange: [0, 0]\n });\n }\n }\n formatAll() {\n const event = globalThis.event = new Event({});\n for (const source of Object.values(this._objects)) {\n event.value = source.obj._getValue();\n this.runActions(source, source, event, \"Format\");\n }\n }\n runValidation(source, event) {\n const didValidateRun = this.runActions(source, source, event, \"Validate\");\n if (event.rc) {\n source.obj.value = event.value;\n this.runCalculate(source, event);\n const savedValue = event.value = source.obj._getValue();\n let formattedValue = null;\n if (this.runActions(source, source, event, \"Format\")) {\n formattedValue = event.value?.toString?.();\n }\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: savedValue,\n formattedValue\n });\n event.value = savedValue;\n } else if (didValidateRun) {\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: \"\",\n formattedValue: null,\n selRange: [0, 0],\n focus: true\n });\n }\n }\n runActions(source, target, event, eventName) {\n event.source = source.wrapped;\n event.target = target.wrapped;\n event.name = eventName;\n event.targetName = target.obj.name;\n event.rc = true;\n return target.obj._runActions(event);\n }\n calculateNow() {\n if (!this._calculationOrder || this._isCalculating || !this._document.obj.calculate) {\n return;\n }\n this._isCalculating = true;\n const first = this._calculationOrder[0];\n const source = this._objects[first];\n globalThis.event = new Event({});\n try {\n this.runCalculate(source, globalThis.event);\n } catch (error) {\n this._isCalculating = false;\n throw error;\n }\n this._isCalculating = false;\n }\n runCalculate(source, event) {\n if (!this._calculationOrder || !this._document.obj.calculate) {\n return;\n }\n for (const targetId of this._calculationOrder) {\n if (!(targetId in this._objects)) {\n continue;\n }\n if (!this._document.obj.calculate) {\n break;\n }\n event.value = null;\n const target = this._objects[targetId];\n let savedValue = target.obj._getValue();\n this.runActions(source, target, event, \"Calculate\");\n if (!event.rc) {\n continue;\n }\n if (event.value !== null) {\n target.obj.value = event.value;\n } else {\n event.value = target.obj._getValue();\n }\n this.runActions(target, target, event, \"Validate\");\n if (!event.rc) {\n if (target.obj._getValue() !== savedValue) {\n target.wrapped.value = savedValue;\n }\n continue;\n }\n if (event.value === null) {\n event.value = target.obj._getValue();\n }\n savedValue = target.obj._getValue();\n let formattedValue = null;\n if (this.runActions(target, target, event, \"Format\")) {\n formattedValue = event.value?.toString?.();\n }\n target.obj._send({\n id: target.obj._id,\n siblings: target.obj._siblings,\n value: savedValue,\n formattedValue\n });\n }\n }\n}\n\n;// CONCATENATED MODULE: ./src/scripting_api/fullscreen.js\n\n\nclass FullScreen extends PDFObject {\n constructor(data) {\n super(data);\n this._backgroundColor = [];\n this._clickAdvances = true;\n this._cursor = Cursor.hidden;\n this._defaultTransition = \"\";\n this._escapeExits = true;\n this._isFullScreen = true;\n this._loop = false;\n this._timeDelay = 3600;\n this._usePageTiming = false;\n this._useTimer = false;\n }\n get backgroundColor() {\n return this._backgroundColor;\n }\n set backgroundColor(_) {}\n get clickAdvances() {\n return this._clickAdvances;\n }\n set clickAdvances(_) {}\n get cursor() {\n return this._cursor;\n }\n set cursor(_) {}\n get defaultTransition() {\n return this._defaultTransition;\n }\n set defaultTransition(_) {}\n get escapeExits() {\n return this._escapeExits;\n }\n set escapeExits(_) {}\n get isFullScreen() {\n return this._isFullScreen;\n }\n set isFullScreen(_) {}\n get loop() {\n return this._loop;\n }\n set loop(_) {}\n get timeDelay() {\n return this._timeDelay;\n }\n set timeDelay(_) {}\n get transitions() {\n return [\"Replace\", \"WipeRight\", \"WipeLeft\", \"WipeDown\", \"WipeUp\", \"SplitHorizontalIn\", \"SplitHorizontalOut\", \"SplitVerticalIn\", \"SplitVerticalOut\", \"BlindsHorizontal\", \"BlindsVertical\", \"BoxIn\", \"BoxOut\", \"GlitterRight\", \"GlitterDown\", \"GlitterRightDown\", \"Dissolve\", \"Random\"];\n }\n set transitions(_) {\n throw new Error(\"fullscreen.transitions is read-only\");\n }\n get usePageTiming() {\n return this._usePageTiming;\n }\n set usePageTiming(_) {}\n get useTimer() {\n return this._useTimer;\n }\n set useTimer(_) {}\n}\n\n;// CONCATENATED MODULE: ./src/scripting_api/thermometer.js\n\nclass Thermometer extends PDFObject {\n constructor(data) {\n super(data);\n this._cancelled = false;\n this._duration = 100;\n this._text = \"\";\n this._value = 0;\n }\n get cancelled() {\n return this._cancelled;\n }\n set cancelled(_) {\n throw new Error(\"thermometer.cancelled is read-only\");\n }\n get duration() {\n return this._duration;\n }\n set duration(val) {\n this._duration = val;\n }\n get text() {\n return this._text;\n }\n set text(val) {\n this._text = val;\n }\n get value() {\n return this._value;\n }\n set value(val) {\n this._value = val;\n }\n begin() {}\n end() {}\n}\n\n;// CONCATENATED MODULE: ./src/scripting_api/app.js\n\n\n\n\n\n\nclass App extends PDFObject {\n constructor(data) {\n super(data);\n this._constants = null;\n this._focusRect = true;\n this._fs = null;\n this._language = App._getLanguage(data.language);\n this._openInPlace = false;\n this._platform = App._getPlatform(data.platform);\n this._runtimeHighlight = false;\n this._runtimeHighlightColor = [\"T\"];\n this._thermometer = null;\n this._toolbar = false;\n this._document = data._document;\n this._proxyHandler = data.proxyHandler;\n this._objects = Object.create(null);\n this._eventDispatcher = new EventDispatcher(this._document, data.calculationOrder, this._objects, data.externalCall);\n this._timeoutIds = new WeakMap();\n if (typeof FinalizationRegistry !== \"undefined\") {\n this._timeoutIdsRegistry = new FinalizationRegistry(this._cleanTimeout.bind(this));\n } else {\n this._timeoutIdsRegistry = null;\n }\n this._timeoutCallbackIds = new Map();\n this._timeoutCallbackId = USERACTIVATION_CALLBACKID + 1;\n this._globalEval = data.globalEval;\n this._externalCall = data.externalCall;\n }\n _dispatchEvent(pdfEvent) {\n this._eventDispatcher.dispatch(pdfEvent);\n }\n _registerTimeoutCallback(cExpr) {\n const id = this._timeoutCallbackId++;\n this._timeoutCallbackIds.set(id, cExpr);\n return id;\n }\n _unregisterTimeoutCallback(id) {\n this._timeoutCallbackIds.delete(id);\n }\n _evalCallback({\n callbackId,\n interval\n }) {\n if (callbackId === USERACTIVATION_CALLBACKID) {\n this._document.obj._userActivation = false;\n return;\n }\n const expr = this._timeoutCallbackIds.get(callbackId);\n if (!interval) {\n this._unregisterTimeoutCallback(callbackId);\n }\n if (expr) {\n this._globalEval(expr);\n }\n }\n _registerTimeout(callbackId, interval) {\n const timeout = Object.create(null);\n const id = {\n callbackId,\n interval\n };\n this._timeoutIds.set(timeout, id);\n this._timeoutIdsRegistry?.register(timeout, id);\n return timeout;\n }\n _unregisterTimeout(timeout) {\n this._timeoutIdsRegistry?.unregister(timeout);\n const data = this._timeoutIds.get(timeout);\n if (!data) {\n return;\n }\n this._timeoutIds.delete(timeout);\n this._cleanTimeout(data);\n }\n _cleanTimeout({\n callbackId,\n interval\n }) {\n this._unregisterTimeoutCallback(callbackId);\n if (interval) {\n this._externalCall(\"clearInterval\", [callbackId]);\n } else {\n this._externalCall(\"clearTimeout\", [callbackId]);\n }\n }\n static _getPlatform(platform) {\n if (typeof platform === \"string\") {\n platform = platform.toLowerCase();\n if (platform.includes(\"win\")) {\n return \"WIN\";\n } else if (platform.includes(\"mac\")) {\n return \"MAC\";\n }\n }\n return \"UNIX\";\n }\n static _getLanguage(language) {\n const [main, sub] = language.toLowerCase().split(/[-_]/);\n switch (main) {\n case \"zh\":\n if (sub === \"cn\" || sub === \"sg\") {\n return \"CHS\";\n }\n return \"CHT\";\n case \"da\":\n return \"DAN\";\n case \"de\":\n return \"DEU\";\n case \"es\":\n return \"ESP\";\n case \"fr\":\n return \"FRA\";\n case \"it\":\n return \"ITA\";\n case \"ko\":\n return \"KOR\";\n case \"ja\":\n return \"JPN\";\n case \"nl\":\n return \"NLD\";\n case \"no\":\n return \"NOR\";\n case \"pt\":\n if (sub === \"br\") {\n return \"PTB\";\n }\n return \"ENU\";\n case \"fi\":\n return \"SUO\";\n case \"SV\":\n return \"SVE\";\n default:\n return \"ENU\";\n }\n }\n get activeDocs() {\n return [this._document.wrapped];\n }\n set activeDocs(_) {\n throw new Error(\"app.activeDocs is read-only\");\n }\n get calculate() {\n return this._document.obj.calculate;\n }\n set calculate(calculate) {\n this._document.obj.calculate = calculate;\n }\n get constants() {\n if (!this._constants) {\n this._constants = Object.freeze({\n align: Object.freeze({\n left: 0,\n center: 1,\n right: 2,\n top: 3,\n bottom: 4\n })\n });\n }\n return this._constants;\n }\n set constants(_) {\n throw new Error(\"app.constants is read-only\");\n }\n get focusRect() {\n return this._focusRect;\n }\n set focusRect(val) {\n this._focusRect = val;\n }\n get formsVersion() {\n return FORMS_VERSION;\n }\n set formsVersion(_) {\n throw new Error(\"app.formsVersion is read-only\");\n }\n get fromPDFConverters() {\n return [];\n }\n set fromPDFConverters(_) {\n throw new Error(\"app.fromPDFConverters is read-only\");\n }\n get fs() {\n if (this._fs === null) {\n this._fs = new Proxy(new FullScreen({\n send: this._send\n }), this._proxyHandler);\n }\n return this._fs;\n }\n set fs(_) {\n throw new Error(\"app.fs is read-only\");\n }\n get language() {\n return this._language;\n }\n set language(_) {\n throw new Error(\"app.language is read-only\");\n }\n get media() {\n return undefined;\n }\n set media(_) {\n throw new Error(\"app.media is read-only\");\n }\n get monitors() {\n return [];\n }\n set monitors(_) {\n throw new Error(\"app.monitors is read-only\");\n }\n get numPlugins() {\n return 0;\n }\n set numPlugins(_) {\n throw new Error(\"app.numPlugins is read-only\");\n }\n get openInPlace() {\n return this._openInPlace;\n }\n set openInPlace(val) {\n this._openInPlace = val;\n }\n get platform() {\n return this._platform;\n }\n set platform(_) {\n throw new Error(\"app.platform is read-only\");\n }\n get plugins() {\n return [];\n }\n set plugins(_) {\n throw new Error(\"app.plugins is read-only\");\n }\n get printColorProfiles() {\n return [];\n }\n set printColorProfiles(_) {\n throw new Error(\"app.printColorProfiles is read-only\");\n }\n get printerNames() {\n return [];\n }\n set printerNames(_) {\n throw new Error(\"app.printerNames is read-only\");\n }\n get runtimeHighlight() {\n return this._runtimeHighlight;\n }\n set runtimeHighlight(val) {\n this._runtimeHighlight = val;\n }\n get runtimeHighlightColor() {\n return this._runtimeHighlightColor;\n }\n set runtimeHighlightColor(val) {\n if (Color._isValidColor(val)) {\n this._runtimeHighlightColor = val;\n }\n }\n get thermometer() {\n if (this._thermometer === null) {\n this._thermometer = new Proxy(new Thermometer({\n send: this._send\n }), this._proxyHandler);\n }\n return this._thermometer;\n }\n set thermometer(_) {\n throw new Error(\"app.thermometer is read-only\");\n }\n get toolbar() {\n return this._toolbar;\n }\n set toolbar(val) {\n this._toolbar = val;\n }\n get toolbarHorizontal() {\n return this.toolbar;\n }\n set toolbarHorizontal(value) {\n this.toolbar = value;\n }\n get toolbarVertical() {\n return this.toolbar;\n }\n set toolbarVertical(value) {\n this.toolbar = value;\n }\n get viewerType() {\n return VIEWER_TYPE;\n }\n set viewerType(_) {\n throw new Error(\"app.viewerType is read-only\");\n }\n get viewerVariation() {\n return VIEWER_VARIATION;\n }\n set viewerVariation(_) {\n throw new Error(\"app.viewerVariation is read-only\");\n }\n get viewerVersion() {\n return VIEWER_VERSION;\n }\n set viewerVersion(_) {\n throw new Error(\"app.viewerVersion is read-only\");\n }\n addMenuItem() {}\n addSubMenu() {}\n addToolButton() {}\n alert(cMsg, nIcon = 0, nType = 0, cTitle = \"PDF.js\", oDoc = null, oCheckbox = null) {\n if (!this._document.obj._userActivation) {\n return 0;\n }\n this._document.obj._userActivation = false;\n if (cMsg && typeof cMsg === \"object\") {\n nType = cMsg.nType;\n cMsg = cMsg.cMsg;\n }\n cMsg = (cMsg || \"\").toString();\n nType = typeof nType !== \"number\" || isNaN(nType) || nType < 0 || nType > 3 ? 0 : nType;\n if (nType >= 2) {\n return this._externalCall(\"confirm\", [cMsg]) ? 4 : 3;\n }\n this._externalCall(\"alert\", [cMsg]);\n return 1;\n }\n beep() {}\n beginPriv() {}\n browseForDoc() {}\n clearInterval(oInterval) {\n this._unregisterTimeout(oInterval);\n }\n clearTimeOut(oTime) {\n this._unregisterTimeout(oTime);\n }\n endPriv() {}\n execDialog() {}\n execMenuItem(item) {\n if (!this._document.obj._userActivation) {\n return;\n }\n this._document.obj._userActivation = false;\n switch (item) {\n case \"SaveAs\":\n if (this._document.obj._disableSaving) {\n return;\n }\n this._send({\n command: item\n });\n break;\n case \"FirstPage\":\n case \"LastPage\":\n case \"NextPage\":\n case \"PrevPage\":\n case \"ZoomViewIn\":\n case \"ZoomViewOut\":\n this._send({\n command: item\n });\n break;\n case \"FitPage\":\n this._send({\n command: \"zoom\",\n value: \"page-fit\"\n });\n break;\n case \"Print\":\n if (this._document.obj._disablePrinting) {\n return;\n }\n this._send({\n command: \"print\"\n });\n break;\n }\n }\n getNthPlugInName() {}\n getPath() {}\n goBack() {}\n goForward() {}\n hideMenuItem() {}\n hideToolbarButton() {}\n launchURL() {}\n listMenuItems() {}\n listToolbarButtons() {}\n loadPolicyFile() {}\n mailGetAddrs() {}\n mailMsg() {}\n newDoc() {}\n newCollection() {}\n newFDF() {}\n openDoc() {}\n openFDF() {}\n popUpMenu() {}\n popUpMenuEx() {}\n removeToolButton() {}\n response(cQuestion, cTitle = \"\", cDefault = \"\", bPassword = \"\", cLabel = \"\") {\n if (cQuestion && typeof cQuestion === \"object\") {\n cDefault = cQuestion.cDefault;\n cQuestion = cQuestion.cQuestion;\n }\n cQuestion = (cQuestion || \"\").toString();\n cDefault = (cDefault || \"\").toString();\n return this._externalCall(\"prompt\", [cQuestion, cDefault || \"\"]);\n }\n setInterval(cExpr, nMilliseconds = 0) {\n if (cExpr && typeof cExpr === \"object\") {\n nMilliseconds = cExpr.nMilliseconds || 0;\n cExpr = cExpr.cExpr;\n }\n if (typeof cExpr !== \"string\") {\n throw new TypeError(\"First argument of app.setInterval must be a string\");\n }\n if (typeof nMilliseconds !== \"number\") {\n throw new TypeError(\"Second argument of app.setInterval must be a number\");\n }\n const callbackId = this._registerTimeoutCallback(cExpr);\n this._externalCall(\"setInterval\", [callbackId, nMilliseconds]);\n return this._registerTimeout(callbackId, true);\n }\n setTimeOut(cExpr, nMilliseconds = 0) {\n if (cExpr && typeof cExpr === \"object\") {\n nMilliseconds = cExpr.nMilliseconds || 0;\n cExpr = cExpr.cExpr;\n }\n if (typeof cExpr !== \"string\") {\n throw new TypeError(\"First argument of app.setTimeOut must be a string\");\n }\n if (typeof nMilliseconds !== \"number\") {\n throw new TypeError(\"Second argument of app.setTimeOut must be a number\");\n }\n const callbackId = this._registerTimeoutCallback(cExpr);\n this._externalCall(\"setTimeout\", [callbackId, nMilliseconds]);\n return this._registerTimeout(callbackId, false);\n }\n trustedFunction() {}\n trustPropagatorFunction() {}\n}\n\n;// CONCATENATED MODULE: ./src/scripting_api/console.js\n\nclass Console extends PDFObject {\n clear() {\n this._send({\n id: \"clear\"\n });\n }\n hide() {}\n println(msg) {\n if (typeof msg === \"string\") {\n this._send({\n command: \"println\",\n value: \"PDF.js Console:: \" + msg\n });\n }\n }\n show() {}\n}\n\n;// CONCATENATED MODULE: ./src/scripting_api/print_params.js\nclass PrintParams {\n constructor(data) {\n this.binaryOk = true;\n this.bitmapDPI = 150;\n this.booklet = {\n binding: 0,\n duplexMode: 0,\n subsetFrom: 0,\n subsetTo: -1\n };\n this.colorOverride = 0;\n this.colorProfile = \"\";\n this.constants = Object.freeze({\n bookletBindings: Object.freeze({\n Left: 0,\n Right: 1,\n LeftTall: 2,\n RightTall: 3\n }),\n bookletDuplexMode: Object.freeze({\n BothSides: 0,\n FrontSideOnly: 1,\n BasicSideOnly: 2\n }),\n colorOverrides: Object.freeze({\n auto: 0,\n gray: 1,\n mono: 2\n }),\n fontPolicies: Object.freeze({\n everyPage: 0,\n jobStart: 1,\n pageRange: 2\n }),\n handling: Object.freeze({\n none: 0,\n fit: 1,\n shrink: 2,\n tileAll: 3,\n tileLarge: 4,\n nUp: 5,\n booklet: 6\n }),\n interactionLevel: Object.freeze({\n automatic: 0,\n full: 1,\n silent: 2\n }),\n nUpPageOrders: Object.freeze({\n Horizontal: 0,\n HorizontalReversed: 1,\n Vertical: 2\n }),\n printContents: Object.freeze({\n doc: 0,\n docAndComments: 1,\n formFieldsOnly: 2\n }),\n flagValues: Object.freeze({\n applyOverPrint: 1,\n applySoftProofSettings: 1 << 1,\n applyWorkingColorSpaces: 1 << 2,\n emitHalftones: 1 << 3,\n emitPostScriptXObjects: 1 << 4,\n emitFormsAsPSForms: 1 << 5,\n maxJP2KRes: 1 << 6,\n setPageSize: 1 << 7,\n suppressBG: 1 << 8,\n suppressCenter: 1 << 9,\n suppressCJKFontSubst: 1 << 10,\n suppressCropClip: 1 << 1,\n suppressRotate: 1 << 12,\n suppressTransfer: 1 << 13,\n suppressUCR: 1 << 14,\n useTrapAnnots: 1 << 15,\n usePrintersMarks: 1 << 16\n }),\n rasterFlagValues: Object.freeze({\n textToOutline: 1,\n strokesToOutline: 1 << 1,\n allowComplexClip: 1 << 2,\n preserveOverprint: 1 << 3\n }),\n subsets: Object.freeze({\n all: 0,\n even: 1,\n odd: 2\n }),\n tileMarks: Object.freeze({\n none: 0,\n west: 1,\n east: 2\n }),\n usages: Object.freeze({\n auto: 0,\n use: 1,\n noUse: 2\n })\n });\n this.downloadFarEastFonts = false;\n this.fileName = \"\";\n this.firstPage = 0;\n this.flags = 0;\n this.fontPolicy = 0;\n this.gradientDPI = 150;\n this.interactive = 1;\n this.lastPage = data.lastPage;\n this.npUpAutoRotate = false;\n this.npUpNumPagesH = 2;\n this.npUpNumPagesV = 2;\n this.npUpPageBorder = false;\n this.npUpPageOrder = 0;\n this.pageHandling = 0;\n this.pageSubset = 0;\n this.printAsImage = false;\n this.printContent = 0;\n this.printerName = \"\";\n this.psLevel = 0;\n this.rasterFlags = 0;\n this.reversePages = false;\n this.tileLabel = false;\n this.tileMark = 0;\n this.tileOverlap = 0;\n this.tileScale = 1.0;\n this.transparencyLevel = 75;\n this.usePrinterCRD = 0;\n this.useT1Conversion = 0;\n }\n}\n\n;// CONCATENATED MODULE: ./src/scripting_api/doc.js\n\n\n\n\n\nconst DOC_EXTERNAL = false;\nclass InfoProxyHandler {\n static get(obj, prop) {\n return obj[prop.toLowerCase()];\n }\n static set(obj, prop, value) {\n throw new Error(`doc.info.${prop} is read-only`);\n }\n}\nclass Doc extends PDFObject {\n constructor(data) {\n super(data);\n this._expandos = globalThis;\n this._baseURL = data.baseURL || \"\";\n this._calculate = true;\n this._delay = false;\n this._dirty = false;\n this._disclosed = false;\n this._media = undefined;\n this._metadata = data.metadata || \"\";\n this._noautocomplete = undefined;\n this._nocache = undefined;\n this._spellDictionaryOrder = [];\n this._spellLanguageOrder = [];\n this._printParams = null;\n this._fields = new Map();\n this._fieldNames = [];\n this._event = null;\n this._author = data.Author || \"\";\n this._creator = data.Creator || \"\";\n this._creationDate = this._getDate(data.CreationDate) || null;\n this._docID = data.docID || [\"\", \"\"];\n this._documentFileName = data.filename || \"\";\n this._filesize = data.filesize || 0;\n this._keywords = data.Keywords || \"\";\n this._layout = data.layout || \"\";\n this._modDate = this._getDate(data.ModDate) || null;\n this._numFields = 0;\n this._numPages = data.numPages || 1;\n this._pageNum = data.pageNum || 0;\n this._producer = data.Producer || \"\";\n this._securityHandler = data.EncryptFilterName || null;\n this._subject = data.Subject || \"\";\n this._title = data.Title || \"\";\n this._URL = data.URL || \"\";\n this._info = new Proxy({\n title: this._title,\n author: this._author,\n authors: data.authors || [this._author],\n subject: this._subject,\n keywords: this._keywords,\n creator: this._creator,\n producer: this._producer,\n creationdate: this._creationDate,\n moddate: this._modDate,\n trapped: data.Trapped || \"Unknown\"\n }, InfoProxyHandler);\n this._zoomType = ZoomType.none;\n this._zoom = data.zoom || 100;\n this._actions = createActionsMap(data.actions);\n this._globalEval = data.globalEval;\n this._pageActions = new Map();\n this._userActivation = false;\n this._disablePrinting = false;\n this._disableSaving = false;\n }\n _initActions() {\n const dontRun = new Set([\"WillClose\", \"WillSave\", \"DidSave\", \"WillPrint\", \"DidPrint\", \"OpenAction\"]);\n this._disableSaving = true;\n for (const actionName of this._actions.keys()) {\n if (!dontRun.has(actionName)) {\n this._runActions(actionName);\n }\n }\n this._runActions(\"OpenAction\");\n this._disableSaving = false;\n }\n _dispatchDocEvent(name) {\n switch (name) {\n case \"Open\":\n this._disableSaving = true;\n this._runActions(\"OpenAction\");\n this._disableSaving = false;\n break;\n case \"WillPrint\":\n this._disablePrinting = true;\n try {\n this._runActions(name);\n } catch (error) {\n this._send(serializeError(error));\n }\n this._send({\n command: \"WillPrintFinished\"\n });\n this._disablePrinting = false;\n break;\n case \"WillSave\":\n this._disableSaving = true;\n this._runActions(name);\n this._disableSaving = false;\n break;\n default:\n this._runActions(name);\n }\n }\n _dispatchPageEvent(name, actions, pageNumber) {\n if (name === \"PageOpen\") {\n if (!this._pageActions.has(pageNumber)) {\n this._pageActions.set(pageNumber, createActionsMap(actions));\n }\n this._pageNum = pageNumber - 1;\n }\n actions = this._pageActions.get(pageNumber)?.get(name);\n if (actions) {\n for (const action of actions) {\n this._globalEval(action);\n }\n }\n }\n _runActions(name) {\n const actions = this._actions.get(name);\n if (actions) {\n for (const action of actions) {\n this._globalEval(action);\n }\n }\n }\n _addField(name, field) {\n this._fields.set(name, field);\n this._fieldNames.push(name);\n this._numFields++;\n }\n _getDate(date) {\n if (!date || date.length < 15 || !date.startsWith(\"D:\")) {\n return date;\n }\n date = date.substring(2);\n const year = date.substring(0, 4);\n const month = date.substring(4, 6);\n const day = date.substring(6, 8);\n const hour = date.substring(8, 10);\n const minute = date.substring(10, 12);\n const o = date.charAt(12);\n let second, offsetPos;\n if (o === \"Z\" || o === \"+\" || o === \"-\") {\n second = \"00\";\n offsetPos = 12;\n } else {\n second = date.substring(12, 14);\n offsetPos = 14;\n }\n const offset = date.substring(offsetPos).replaceAll(\"'\", \"\");\n return new Date(`${year}-${month}-${day}T${hour}:${minute}:${second}${offset}`);\n }\n get author() {\n return this._author;\n }\n set author(_) {\n throw new Error(\"doc.author is read-only\");\n }\n get baseURL() {\n return this._baseURL;\n }\n set baseURL(baseURL) {\n this._baseURL = baseURL;\n }\n get bookmarkRoot() {\n return undefined;\n }\n set bookmarkRoot(_) {\n throw new Error(\"doc.bookmarkRoot is read-only\");\n }\n get calculate() {\n return this._calculate;\n }\n set calculate(calculate) {\n this._calculate = calculate;\n }\n get creator() {\n return this._creator;\n }\n set creator(_) {\n throw new Error(\"doc.creator is read-only\");\n }\n get dataObjects() {\n return [];\n }\n set dataObjects(_) {\n throw new Error(\"doc.dataObjects is read-only\");\n }\n get delay() {\n return this._delay;\n }\n set delay(delay) {\n this._delay = delay;\n }\n get dirty() {\n return this._dirty;\n }\n set dirty(dirty) {\n this._dirty = dirty;\n }\n get disclosed() {\n return this._disclosed;\n }\n set disclosed(disclosed) {\n this._disclosed = disclosed;\n }\n get docID() {\n return this._docID;\n }\n set docID(_) {\n throw new Error(\"doc.docID is read-only\");\n }\n get documentFileName() {\n return this._documentFileName;\n }\n set documentFileName(_) {\n throw new Error(\"doc.documentFileName is read-only\");\n }\n get dynamicXFAForm() {\n return false;\n }\n set dynamicXFAForm(_) {\n throw new Error(\"doc.dynamicXFAForm is read-only\");\n }\n get external() {\n return DOC_EXTERNAL;\n }\n set external(_) {\n throw new Error(\"doc.external is read-only\");\n }\n get filesize() {\n return this._filesize;\n }\n set filesize(_) {\n throw new Error(\"doc.filesize is read-only\");\n }\n get hidden() {\n return false;\n }\n set hidden(_) {\n throw new Error(\"doc.hidden is read-only\");\n }\n get hostContainer() {\n return undefined;\n }\n set hostContainer(_) {\n throw new Error(\"doc.hostContainer is read-only\");\n }\n get icons() {\n return undefined;\n }\n set icons(_) {\n throw new Error(\"doc.icons is read-only\");\n }\n get info() {\n return this._info;\n }\n set info(_) {\n throw new Error(\"doc.info is read-only\");\n }\n get innerAppWindowRect() {\n return [0, 0, 0, 0];\n }\n set innerAppWindowRect(_) {\n throw new Error(\"doc.innerAppWindowRect is read-only\");\n }\n get innerDocWindowRect() {\n return [0, 0, 0, 0];\n }\n set innerDocWindowRect(_) {\n throw new Error(\"doc.innerDocWindowRect is read-only\");\n }\n get isModal() {\n return false;\n }\n set isModal(_) {\n throw new Error(\"doc.isModal is read-only\");\n }\n get keywords() {\n return this._keywords;\n }\n set keywords(_) {\n throw new Error(\"doc.keywords is read-only\");\n }\n get layout() {\n return this._layout;\n }\n set layout(value) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof value !== \"string\") {\n return;\n }\n if (value !== \"SinglePage\" && value !== \"OneColumn\" && value !== \"TwoColumnLeft\" && value !== \"TwoPageLeft\" && value !== \"TwoColumnRight\" && value !== \"TwoPageRight\") {\n value = \"SinglePage\";\n }\n this._send({\n command: \"layout\",\n value\n });\n this._layout = value;\n }\n get media() {\n return this._media;\n }\n set media(media) {\n this._media = media;\n }\n get metadata() {\n return this._metadata;\n }\n set metadata(metadata) {\n this._metadata = metadata;\n }\n get modDate() {\n return this._modDate;\n }\n set modDate(_) {\n throw new Error(\"doc.modDate is read-only\");\n }\n get mouseX() {\n return 0;\n }\n set mouseX(_) {\n throw new Error(\"doc.mouseX is read-only\");\n }\n get mouseY() {\n return 0;\n }\n set mouseY(_) {\n throw new Error(\"doc.mouseY is read-only\");\n }\n get noautocomplete() {\n return this._noautocomplete;\n }\n set noautocomplete(noautocomplete) {\n this._noautocomplete = noautocomplete;\n }\n get nocache() {\n return this._nocache;\n }\n set nocache(nocache) {\n this._nocache = nocache;\n }\n get numFields() {\n return this._numFields;\n }\n set numFields(_) {\n throw new Error(\"doc.numFields is read-only\");\n }\n get numPages() {\n return this._numPages;\n }\n set numPages(_) {\n throw new Error(\"doc.numPages is read-only\");\n }\n get numTemplates() {\n return 0;\n }\n set numTemplates(_) {\n throw new Error(\"doc.numTemplates is read-only\");\n }\n get outerAppWindowRect() {\n return [0, 0, 0, 0];\n }\n set outerAppWindowRect(_) {\n throw new Error(\"doc.outerAppWindowRect is read-only\");\n }\n get outerDocWindowRect() {\n return [0, 0, 0, 0];\n }\n set outerDocWindowRect(_) {\n throw new Error(\"doc.outerDocWindowRect is read-only\");\n }\n get pageNum() {\n return this._pageNum;\n }\n set pageNum(value) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof value !== \"number\" || value < 0 || value >= this._numPages) {\n return;\n }\n this._send({\n command: \"page-num\",\n value\n });\n this._pageNum = value;\n }\n get pageWindowRect() {\n return [0, 0, 0, 0];\n }\n set pageWindowRect(_) {\n throw new Error(\"doc.pageWindowRect is read-only\");\n }\n get path() {\n return \"\";\n }\n set path(_) {\n throw new Error(\"doc.path is read-only\");\n }\n get permStatusReady() {\n return true;\n }\n set permStatusReady(_) {\n throw new Error(\"doc.permStatusReady is read-only\");\n }\n get producer() {\n return this._producer;\n }\n set producer(_) {\n throw new Error(\"doc.producer is read-only\");\n }\n get requiresFullSave() {\n return false;\n }\n set requiresFullSave(_) {\n throw new Error(\"doc.requiresFullSave is read-only\");\n }\n get securityHandler() {\n return this._securityHandler;\n }\n set securityHandler(_) {\n throw new Error(\"doc.securityHandler is read-only\");\n }\n get selectedAnnots() {\n return [];\n }\n set selectedAnnots(_) {\n throw new Error(\"doc.selectedAnnots is read-only\");\n }\n get sounds() {\n return [];\n }\n set sounds(_) {\n throw new Error(\"doc.sounds is read-only\");\n }\n get spellDictionaryOrder() {\n return this._spellDictionaryOrder;\n }\n set spellDictionaryOrder(spellDictionaryOrder) {\n this._spellDictionaryOrder = spellDictionaryOrder;\n }\n get spellLanguageOrder() {\n return this._spellLanguageOrder;\n }\n set spellLanguageOrder(spellLanguageOrder) {\n this._spellLanguageOrder = spellLanguageOrder;\n }\n get subject() {\n return this._subject;\n }\n set subject(_) {\n throw new Error(\"doc.subject is read-only\");\n }\n get templates() {\n return [];\n }\n set templates(_) {\n throw new Error(\"doc.templates is read-only\");\n }\n get title() {\n return this._title;\n }\n set title(_) {\n throw new Error(\"doc.title is read-only\");\n }\n get URL() {\n return this._URL;\n }\n set URL(_) {\n throw new Error(\"doc.URL is read-only\");\n }\n get viewState() {\n return undefined;\n }\n set viewState(_) {\n throw new Error(\"doc.viewState is read-only\");\n }\n get xfa() {\n return this._xfa;\n }\n set xfa(_) {\n throw new Error(\"doc.xfa is read-only\");\n }\n get XFAForeground() {\n return false;\n }\n set XFAForeground(_) {\n throw new Error(\"doc.XFAForeground is read-only\");\n }\n get zoomType() {\n return this._zoomType;\n }\n set zoomType(type) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof type !== \"string\") {\n return;\n }\n switch (type) {\n case ZoomType.none:\n this._send({\n command: \"zoom\",\n value: 1\n });\n break;\n case ZoomType.fitP:\n this._send({\n command: \"zoom\",\n value: \"page-fit\"\n });\n break;\n case ZoomType.fitW:\n this._send({\n command: \"zoom\",\n value: \"page-width\"\n });\n break;\n case ZoomType.fitH:\n this._send({\n command: \"zoom\",\n value: \"page-height\"\n });\n break;\n case ZoomType.fitV:\n this._send({\n command: \"zoom\",\n value: \"auto\"\n });\n break;\n case ZoomType.pref:\n case ZoomType.refW:\n break;\n default:\n return;\n }\n this._zoomType = type;\n }\n get zoom() {\n return this._zoom;\n }\n set zoom(value) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof value !== \"number\" || value < 8.33 || value > 6400) {\n return;\n }\n this._send({\n command: \"zoom\",\n value: value / 100\n });\n }\n addAnnot() {}\n addField() {}\n addIcon() {}\n addLink() {}\n addRecipientListCryptFilter() {}\n addRequirement() {}\n addScript() {}\n addThumbnails() {}\n addWatermarkFromFile() {}\n addWatermarkFromText() {}\n addWeblinks() {}\n bringToFront() {}\n calculateNow() {\n this._eventDispatcher.calculateNow();\n }\n closeDoc() {}\n colorConvertPage() {}\n createDataObject() {}\n createTemplate() {}\n deletePages() {}\n deleteSound() {}\n embedDocAsDataObject() {}\n embedOutputIntent() {}\n encryptForRecipients() {}\n encryptUsingPolicy() {}\n exportAsFDF() {}\n exportAsFDFStr() {}\n exportAsText() {}\n exportAsXFDF() {}\n exportAsXFDFStr() {}\n exportDataObject() {}\n exportXFAData() {}\n extractPages() {}\n flattenPages() {}\n getAnnot() {}\n getAnnots() {}\n getAnnot3D() {}\n getAnnots3D() {}\n getColorConvertAction() {}\n getDataObject() {}\n getDataObjectContents() {}\n _getField(cName) {\n if (cName && typeof cName === \"object\") {\n cName = cName.cName;\n }\n if (typeof cName !== \"string\") {\n throw new TypeError(\"Invalid field name: must be a string\");\n }\n const searchedField = this._fields.get(cName);\n if (searchedField) {\n return searchedField;\n }\n const parts = cName.split(\"#\");\n let childIndex = NaN;\n if (parts.length === 2) {\n childIndex = Math.floor(parseFloat(parts[1]));\n cName = parts[0];\n }\n for (const [name, field] of this._fields.entries()) {\n if (name.endsWith(cName)) {\n if (!isNaN(childIndex)) {\n const children = this._getChildren(name);\n if (childIndex < 0 || childIndex >= children.length) {\n childIndex = 0;\n }\n if (childIndex < children.length) {\n this._fields.set(cName, children[childIndex]);\n return children[childIndex];\n }\n }\n this._fields.set(cName, field);\n return field;\n }\n }\n return null;\n }\n getField(cName) {\n const field = this._getField(cName);\n if (!field) {\n return null;\n }\n return field.wrapped;\n }\n _getChildren(fieldName) {\n const len = fieldName.length;\n const children = [];\n const pattern = /^\\.[^.]+$/;\n for (const [name, field] of this._fields.entries()) {\n if (name.startsWith(fieldName)) {\n const finalPart = name.slice(len);\n if (pattern.test(finalPart)) {\n children.push(field);\n }\n }\n }\n return children;\n }\n _getTerminalChildren(fieldName) {\n const children = [];\n const len = fieldName.length;\n for (const [name, field] of this._fields.entries()) {\n if (name.startsWith(fieldName)) {\n const finalPart = name.slice(len);\n if (field.obj._hasValue && (finalPart === \"\" || finalPart.startsWith(\".\"))) {\n children.push(field.wrapped);\n }\n }\n }\n return children;\n }\n getIcon() {}\n getLegalWarnings() {}\n getLinks() {}\n getNthFieldName(nIndex) {\n if (nIndex && typeof nIndex === \"object\") {\n nIndex = nIndex.nIndex;\n }\n if (typeof nIndex !== \"number\") {\n throw new TypeError(\"Invalid field index: must be a number\");\n }\n if (0 <= nIndex && nIndex < this.numFields) {\n return this._fieldNames[Math.trunc(nIndex)];\n }\n return null;\n }\n getNthTemplate() {\n return null;\n }\n getOCGs() {}\n getOCGOrder() {}\n getPageBox() {}\n getPageLabel() {}\n getPageNthWord() {}\n getPageNthWordQuads() {}\n getPageNumWords() {}\n getPageRotation() {}\n getPageTransition() {}\n getPrintParams() {\n return this._printParams ||= new PrintParams({\n lastPage: this._numPages - 1\n });\n }\n getSound() {}\n getTemplate() {}\n getURL() {}\n gotoNamedDest() {}\n importAnFDF() {}\n importAnXFDF() {}\n importDataObject() {}\n importIcon() {}\n importSound() {}\n importTextData() {}\n importXFAData() {}\n insertPages() {}\n mailDoc() {}\n mailForm() {}\n movePage() {}\n newPage() {}\n openDataObject() {}\n print(bUI = true, nStart = 0, nEnd = -1, bSilent = false, bShrinkToFit = false, bPrintAsImage = false, bReverse = false, bAnnotations = true, printParams = null) {\n if (this._disablePrinting || !this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (bUI && typeof bUI === \"object\") {\n nStart = bUI.nStart;\n nEnd = bUI.nEnd;\n bSilent = bUI.bSilent;\n bShrinkToFit = bUI.bShrinkToFit;\n bPrintAsImage = bUI.bPrintAsImage;\n bReverse = bUI.bReverse;\n bAnnotations = bUI.bAnnotations;\n printParams = bUI.printParams;\n bUI = bUI.bUI;\n }\n if (printParams) {\n nStart = printParams.firstPage;\n nEnd = printParams.lastPage;\n }\n nStart = typeof nStart === \"number\" ? Math.max(0, Math.trunc(nStart)) : 0;\n nEnd = typeof nEnd === \"number\" ? Math.max(0, Math.trunc(nEnd)) : -1;\n this._send({\n command: \"print\",\n start: nStart,\n end: nEnd\n });\n }\n removeDataObject() {}\n removeField() {}\n removeIcon() {}\n removeLinks() {}\n removeRequirement() {}\n removeScript() {}\n removeTemplate() {}\n removeThumbnails() {}\n removeWeblinks() {}\n replacePages() {}\n resetForm(aFields = null) {\n if (aFields && typeof aFields === \"object\" && !Array.isArray(aFields)) {\n aFields = aFields.aFields;\n }\n if (aFields && !Array.isArray(aFields)) {\n aFields = [aFields];\n }\n let mustCalculate = false;\n let fieldsToReset;\n if (aFields) {\n fieldsToReset = [];\n for (const fieldName of aFields) {\n if (!fieldName) {\n continue;\n }\n if (typeof fieldName !== \"string\") {\n fieldsToReset = null;\n break;\n }\n const field = this._getField(fieldName);\n if (!field) {\n continue;\n }\n fieldsToReset.push(field);\n mustCalculate = true;\n }\n }\n if (!fieldsToReset) {\n fieldsToReset = this._fields.values();\n mustCalculate = this._fields.size !== 0;\n }\n for (const field of fieldsToReset) {\n field.obj.value = field.obj.defaultValue;\n this._send({\n id: field.obj._id,\n siblings: field.obj._siblings,\n value: field.obj.defaultValue,\n formattedValue: null,\n selRange: [0, 0]\n });\n }\n if (mustCalculate) {\n this.calculateNow();\n }\n }\n saveAs() {}\n scroll() {}\n selectPageNthWord() {}\n setAction() {}\n setDataObjectContents() {}\n setOCGOrder() {}\n setPageAction() {}\n setPageBoxes() {}\n setPageLabels() {}\n setPageRotations() {}\n setPageTabOrder() {}\n setPageTransitions() {}\n spawnPageFromTemplate() {}\n submitForm() {}\n syncAnnotScan() {}\n}\n\n;// CONCATENATED MODULE: ./src/scripting_api/proxy.js\nclass ProxyHandler {\n constructor() {\n this.nosend = new Set([\"delay\"]);\n }\n get(obj, prop) {\n if (prop in obj._expandos) {\n const val = obj._expandos[prop];\n if (typeof val === \"function\") {\n return val.bind(obj);\n }\n return val;\n }\n if (typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj) {\n const val = obj[prop];\n if (typeof val === \"function\") {\n return val.bind(obj);\n }\n return val;\n }\n return undefined;\n }\n set(obj, prop, value) {\n if (obj._kidIds) {\n obj._kidIds.forEach(id => {\n obj._appObjects[id].wrapped[prop] = value;\n });\n }\n if (typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj) {\n const old = obj[prop];\n obj[prop] = value;\n if (!this.nosend.has(prop) && obj._send && obj._id !== null && typeof old !== \"function\") {\n const data = {\n id: obj._id\n };\n data[prop] = prop === \"value\" ? obj._getValue() : obj[prop];\n if (!obj._siblings) {\n obj._send(data);\n } else {\n data.siblings = obj._siblings;\n obj._send(data);\n }\n }\n } else {\n obj._expandos[prop] = value;\n }\n return true;\n }\n has(obj, prop) {\n return prop in obj._expandos || typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj;\n }\n getPrototypeOf(obj) {\n return null;\n }\n setPrototypeOf(obj, proto) {\n return false;\n }\n isExtensible(obj) {\n return true;\n }\n preventExtensions(obj) {\n return false;\n }\n getOwnPropertyDescriptor(obj, prop) {\n if (prop in obj._expandos) {\n return {\n configurable: true,\n enumerable: true,\n value: obj._expandos[prop]\n };\n }\n if (typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj) {\n return {\n configurable: true,\n enumerable: true,\n value: obj[prop]\n };\n }\n return undefined;\n }\n defineProperty(obj, key, descriptor) {\n Object.defineProperty(obj._expandos, key, descriptor);\n return true;\n }\n deleteProperty(obj, prop) {\n if (prop in obj._expandos) {\n delete obj._expandos[prop];\n }\n }\n ownKeys(obj) {\n const fromExpandos = Reflect.ownKeys(obj._expandos);\n const fromObj = Reflect.ownKeys(obj).filter(k => !k.startsWith(\"_\"));\n return fromExpandos.concat(fromObj);\n }\n}\n\n;// CONCATENATED MODULE: ./src/scripting_api/util.js\n\nclass Util extends PDFObject {\n constructor(data) {\n super(data);\n this._scandCache = new Map();\n this._months = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\n this._days = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n this.MILLISECONDS_IN_DAY = 86400000;\n this.MILLISECONDS_IN_WEEK = 604800000;\n this._externalCall = data.externalCall;\n }\n printf(...args) {\n if (args.length === 0) {\n throw new Error(\"Invalid number of params in printf\");\n }\n if (typeof args[0] !== \"string\") {\n throw new TypeError(\"First argument of printf must be a string\");\n }\n const pattern = /%(,[0-4])?([+ 0#]+)?(\\d+)?(\\.\\d+)?(.)/g;\n const PLUS = 1;\n const SPACE = 2;\n const ZERO = 4;\n const HASH = 8;\n let i = 0;\n return args[0].replaceAll(pattern, function (match, nDecSep, cFlags, nWidth, nPrecision, cConvChar) {\n if (cConvChar !== \"d\" && cConvChar !== \"f\" && cConvChar !== \"s\" && cConvChar !== \"x\") {\n const buf = [\"%\"];\n for (const str of [nDecSep, cFlags, nWidth, nPrecision, cConvChar]) {\n if (str) {\n buf.push(str);\n }\n }\n return buf.join(\"\");\n }\n i++;\n if (i === args.length) {\n throw new Error(\"Not enough arguments in printf\");\n }\n const arg = args[i];\n if (cConvChar === \"s\") {\n return arg.toString();\n }\n let flags = 0;\n if (cFlags) {\n for (const flag of cFlags) {\n switch (flag) {\n case \"+\":\n flags |= PLUS;\n break;\n case \" \":\n flags |= SPACE;\n break;\n case \"0\":\n flags |= ZERO;\n break;\n case \"#\":\n flags |= HASH;\n break;\n }\n }\n }\n cFlags = flags;\n if (nWidth) {\n nWidth = parseInt(nWidth);\n }\n let intPart = Math.trunc(arg);\n if (cConvChar === \"x\") {\n let hex = Math.abs(intPart).toString(16).toUpperCase();\n if (nWidth !== undefined) {\n hex = hex.padStart(nWidth, cFlags & ZERO ? \"0\" : \" \");\n }\n if (cFlags & HASH) {\n hex = `0x${hex}`;\n }\n return hex;\n }\n if (nPrecision) {\n nPrecision = parseInt(nPrecision.substring(1));\n }\n nDecSep = nDecSep ? nDecSep.substring(1) : \"0\";\n const separators = {\n 0: [\",\", \".\"],\n 1: [\"\", \".\"],\n 2: [\".\", \",\"],\n 3: [\"\", \",\"],\n 4: [\"'\", \".\"]\n };\n const [thousandSep, decimalSep] = separators[nDecSep];\n let decPart = \"\";\n if (cConvChar === \"f\") {\n decPart = nPrecision !== undefined ? Math.abs(arg - intPart).toFixed(nPrecision) : Math.abs(arg - intPart).toString();\n if (decPart.length > 2) {\n decPart = `${decimalSep}${decPart.substring(2)}`;\n } else {\n if (decPart === \"1\") {\n intPart += Math.sign(arg);\n }\n decPart = cFlags & HASH ? \".\" : \"\";\n }\n }\n let sign = \"\";\n if (intPart < 0) {\n sign = \"-\";\n intPart = -intPart;\n } else if (cFlags & PLUS) {\n sign = \"+\";\n } else if (cFlags & SPACE) {\n sign = \" \";\n }\n if (thousandSep && intPart >= 1000) {\n const buf = [];\n while (true) {\n buf.push((intPart % 1000).toString().padStart(3, \"0\"));\n intPart = Math.trunc(intPart / 1000);\n if (intPart < 1000) {\n buf.push(intPart.toString());\n break;\n }\n }\n intPart = buf.reverse().join(thousandSep);\n } else {\n intPart = intPart.toString();\n }\n let n = `${intPart}${decPart}`;\n if (nWidth !== undefined) {\n n = n.padStart(nWidth - sign.length, cFlags & ZERO ? \"0\" : \" \");\n }\n return `${sign}${n}`;\n });\n }\n iconStreamFromIcon() {}\n printd(cFormat, oDate) {\n switch (cFormat) {\n case 0:\n return this.printd(\"D:yyyymmddHHMMss\", oDate);\n case 1:\n return this.printd(\"yyyy.mm.dd HH:MM:ss\", oDate);\n case 2:\n return this.printd(\"m/d/yy h:MM:ss tt\", oDate);\n }\n const handlers = {\n mmmm: data => this._months[data.month],\n mmm: data => this._months[data.month].substring(0, 3),\n mm: data => (data.month + 1).toString().padStart(2, \"0\"),\n m: data => (data.month + 1).toString(),\n dddd: data => this._days[data.dayOfWeek],\n ddd: data => this._days[data.dayOfWeek].substring(0, 3),\n dd: data => data.day.toString().padStart(2, \"0\"),\n d: data => data.day.toString(),\n yyyy: data => data.year.toString(),\n yy: data => (data.year % 100).toString().padStart(2, \"0\"),\n HH: data => data.hours.toString().padStart(2, \"0\"),\n H: data => data.hours.toString(),\n hh: data => (1 + (data.hours + 11) % 12).toString().padStart(2, \"0\"),\n h: data => (1 + (data.hours + 11) % 12).toString(),\n MM: data => data.minutes.toString().padStart(2, \"0\"),\n M: data => data.minutes.toString(),\n ss: data => data.seconds.toString().padStart(2, \"0\"),\n s: data => data.seconds.toString(),\n tt: data => data.hours < 12 ? \"am\" : \"pm\",\n t: data => data.hours < 12 ? \"a\" : \"p\"\n };\n const data = {\n year: oDate.getFullYear(),\n month: oDate.getMonth(),\n day: oDate.getDate(),\n dayOfWeek: oDate.getDay(),\n hours: oDate.getHours(),\n minutes: oDate.getMinutes(),\n seconds: oDate.getSeconds()\n };\n const patterns = /(mmmm|mmm|mm|m|dddd|ddd|dd|d|yyyy|yy|HH|H|hh|h|MM|M|ss|s|tt|t|\\\\.)/g;\n return cFormat.replaceAll(patterns, function (match, pattern) {\n if (pattern in handlers) {\n return handlers[pattern](data);\n }\n return pattern.charCodeAt(1);\n });\n }\n printx(cFormat, cSource) {\n cSource = (cSource ?? \"\").toString();\n const handlers = [x => x, x => x.toUpperCase(), x => x.toLowerCase()];\n const buf = [];\n let i = 0;\n const ii = cSource.length;\n let currCase = handlers[0];\n let escaped = false;\n for (const command of cFormat) {\n if (escaped) {\n buf.push(command);\n escaped = false;\n continue;\n }\n if (i >= ii) {\n break;\n }\n switch (command) {\n case \"?\":\n buf.push(currCase(cSource.charAt(i++)));\n break;\n case \"X\":\n while (i < ii) {\n const char = cSource.charAt(i++);\n if (\"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\" || \"0\" <= char && char <= \"9\") {\n buf.push(currCase(char));\n break;\n }\n }\n break;\n case \"A\":\n while (i < ii) {\n const char = cSource.charAt(i++);\n if (\"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\") {\n buf.push(currCase(char));\n break;\n }\n }\n break;\n case \"9\":\n while (i < ii) {\n const char = cSource.charAt(i++);\n if (\"0\" <= char && char <= \"9\") {\n buf.push(char);\n break;\n }\n }\n break;\n case \"*\":\n while (i < ii) {\n buf.push(currCase(cSource.charAt(i++)));\n }\n break;\n case \"\\\\\":\n escaped = true;\n break;\n case \">\":\n currCase = handlers[1];\n break;\n case \"<\":\n currCase = handlers[2];\n break;\n case \"=\":\n currCase = handlers[0];\n break;\n default:\n buf.push(command);\n }\n }\n return buf.join(\"\");\n }\n scand(cFormat, cDate) {\n if (typeof cDate !== \"string\") {\n return new Date(cDate);\n }\n if (cDate === \"\") {\n return new Date();\n }\n switch (cFormat) {\n case 0:\n return this.scand(\"D:yyyymmddHHMMss\", cDate);\n case 1:\n return this.scand(\"yyyy.mm.dd HH:MM:ss\", cDate);\n case 2:\n return this.scand(\"m/d/yy h:MM:ss tt\", cDate);\n }\n if (!this._scandCache.has(cFormat)) {\n const months = this._months;\n const days = this._days;\n const handlers = {\n mmmm: {\n pattern: `(${months.join(\"|\")})`,\n action: (value, data) => {\n data.month = months.indexOf(value);\n }\n },\n mmm: {\n pattern: `(${months.map(month => month.substring(0, 3)).join(\"|\")})`,\n action: (value, data) => {\n data.month = months.findIndex(month => month.substring(0, 3) === value);\n }\n },\n mm: {\n pattern: `(\\\\d{2})`,\n action: (value, data) => {\n data.month = parseInt(value) - 1;\n }\n },\n m: {\n pattern: `(\\\\d{1,2})`,\n action: (value, data) => {\n data.month = parseInt(value) - 1;\n }\n },\n dddd: {\n pattern: `(${days.join(\"|\")})`,\n action: (value, data) => {\n data.day = days.indexOf(value);\n }\n },\n ddd: {\n pattern: `(${days.map(day => day.substring(0, 3)).join(\"|\")})`,\n action: (value, data) => {\n data.day = days.findIndex(day => day.substring(0, 3) === value);\n }\n },\n dd: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.day = parseInt(value);\n }\n },\n d: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.day = parseInt(value);\n }\n },\n yyyy: {\n pattern: \"(\\\\d{4})\",\n action: (value, data) => {\n data.year = parseInt(value);\n }\n },\n yy: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.year = 2000 + parseInt(value);\n }\n },\n HH: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n H: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n hh: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n h: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n MM: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.minutes = parseInt(value);\n }\n },\n M: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.minutes = parseInt(value);\n }\n },\n ss: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.seconds = parseInt(value);\n }\n },\n s: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.seconds = parseInt(value);\n }\n },\n tt: {\n pattern: \"([aApP][mM])\",\n action: (value, data) => {\n const char = value.charAt(0);\n data.am = char === \"a\" || char === \"A\";\n }\n },\n t: {\n pattern: \"([aApP])\",\n action: (value, data) => {\n data.am = value === \"a\" || value === \"A\";\n }\n }\n };\n const escapedFormat = cFormat.replaceAll(/[.*+\\-?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const patterns = /(mmmm|mmm|mm|m|dddd|ddd|dd|d|yyyy|yy|HH|H|hh|h|MM|M|ss|s|tt|t)/g;\n const actions = [];\n const re = escapedFormat.replaceAll(patterns, function (match, patternElement) {\n const {\n pattern,\n action\n } = handlers[patternElement];\n actions.push(action);\n return pattern;\n });\n this._scandCache.set(cFormat, [re, actions]);\n }\n const [re, actions] = this._scandCache.get(cFormat);\n const matches = new RegExp(`^${re}$`, \"g\").exec(cDate);\n if (!matches || matches.length !== actions.length + 1) {\n return null;\n }\n const data = {\n year: 2000,\n month: 0,\n day: 1,\n hours: 0,\n minutes: 0,\n seconds: 0,\n am: null\n };\n actions.forEach((action, i) => action(matches[i + 1], data));\n if (data.am !== null) {\n data.hours = data.hours % 12 + (data.am ? 0 : 12);\n }\n return new Date(data.year, data.month, data.day, data.hours, data.minutes, data.seconds);\n }\n spansToXML() {}\n stringFromStream() {}\n xmlToSpans() {}\n}\n\n;// CONCATENATED MODULE: ./src/scripting_api/initialization.js\n\n\n\n\n\n\n\n\n\n\nfunction initSandbox(params) {\n delete globalThis.pdfjsScripting;\n const externalCall = globalThis.callExternalFunction;\n delete globalThis.callExternalFunction;\n const globalEval = code => globalThis.eval(code);\n const send = data => externalCall(\"send\", [data]);\n const proxyHandler = new ProxyHandler();\n const {\n data\n } = params;\n const doc = new Doc({\n send,\n globalEval,\n ...data.docInfo\n });\n const _document = {\n obj: doc,\n wrapped: new Proxy(doc, proxyHandler)\n };\n const app = new App({\n send,\n globalEval,\n externalCall,\n _document,\n calculationOrder: data.calculationOrder,\n proxyHandler,\n ...data.appInfo\n });\n const util = new Util({\n externalCall\n });\n const appObjects = app._objects;\n if (data.objects) {\n const annotations = [];\n for (const [name, objs] of Object.entries(data.objects)) {\n annotations.length = 0;\n let container = null;\n for (const obj of objs) {\n if (obj.type !== \"\") {\n annotations.push(obj);\n } else {\n container = obj;\n }\n }\n let obj = container;\n if (annotations.length > 0) {\n obj = annotations[0];\n obj.send = send;\n }\n obj.globalEval = globalEval;\n obj.doc = _document;\n obj.fieldPath = name;\n obj.appObjects = appObjects;\n let field;\n switch (obj.type) {\n case \"radiobutton\":\n {\n const otherButtons = annotations.slice(1);\n field = new RadioButtonField(otherButtons, obj);\n break;\n }\n case \"checkbox\":\n {\n const otherButtons = annotations.slice(1);\n field = new CheckboxField(otherButtons, obj);\n break;\n }\n case \"text\":\n if (annotations.length <= 1) {\n field = new Field(obj);\n break;\n }\n obj.siblings = annotations.map(x => x.id).slice(1);\n field = new Field(obj);\n break;\n default:\n field = new Field(obj);\n }\n const wrapped = new Proxy(field, proxyHandler);\n const _object = {\n obj: field,\n wrapped\n };\n doc._addField(name, _object);\n for (const object of objs) {\n appObjects[object.id] = _object;\n }\n if (container) {\n appObjects[container.id] = _object;\n }\n }\n }\n const color = new Color();\n globalThis.event = null;\n globalThis.global = Object.create(null);\n globalThis.app = new Proxy(app, proxyHandler);\n globalThis.color = new Proxy(color, proxyHandler);\n globalThis.console = new Proxy(new Console({\n send\n }), proxyHandler);\n globalThis.util = new Proxy(util, proxyHandler);\n globalThis.border = Border;\n globalThis.cursor = Cursor;\n globalThis.display = Display;\n globalThis.font = Font;\n globalThis.highlight = Highlight;\n globalThis.position = Position;\n globalThis.scaleHow = ScaleHow;\n globalThis.scaleWhen = ScaleWhen;\n globalThis.style = Style;\n globalThis.trans = Trans;\n globalThis.zoomtype = ZoomType;\n globalThis.ADBE = {\n Reader_Value_Asked: true,\n Viewer_Value_Asked: true\n };\n const aform = new AForm(doc, app, util, color);\n for (const name of Object.getOwnPropertyNames(AForm.prototype)) {\n if (name !== \"constructor\" && !name.startsWith(\"_\")) {\n globalThis[name] = aform[name].bind(aform);\n }\n }\n for (const [name, value] of Object.entries(GlobalConstants)) {\n Object.defineProperty(globalThis, name, {\n value,\n writable: false\n });\n }\n Object.defineProperties(globalThis, {\n ColorConvert: {\n value: color.convert.bind(color),\n writable: true\n },\n ColorEqual: {\n value: color.equal.bind(color),\n writable: true\n }\n });\n const properties = Object.create(null);\n for (const name of Object.getOwnPropertyNames(Doc.prototype)) {\n if (name === \"constructor\" || name.startsWith(\"_\")) {\n continue;\n }\n const descriptor = Object.getOwnPropertyDescriptor(Doc.prototype, name);\n if (descriptor.get) {\n properties[name] = {\n get: descriptor.get.bind(doc),\n set: descriptor.set.bind(doc)\n };\n } else {\n properties[name] = {\n value: Doc.prototype[name].bind(doc)\n };\n }\n }\n Object.defineProperties(globalThis, properties);\n const functions = {\n dispatchEvent: app._dispatchEvent.bind(app),\n timeoutCb: app._evalCallback.bind(app)\n };\n return (name, args) => {\n try {\n functions[name](args);\n } catch (error) {\n send(serializeError(error));\n }\n };\n}\n\n;// CONCATENATED MODULE: ./src/pdf.scripting.js\n\nconst pdfjsVersion = \"4.1.392\";\nconst pdfjsBuild = \"fcb76a78d\";\nglobalThis.pdfjsScripting = {\n initSandbox: initSandbox\n};\n"]; + const code = ["\n;// ./src/scripting_api/constants.js\nconst Border = Object.freeze({\n s: \"solid\",\n d: \"dashed\",\n b: \"beveled\",\n i: \"inset\",\n u: \"underline\"\n});\nconst Cursor = Object.freeze({\n visible: 0,\n hidden: 1,\n delay: 2\n});\nconst Display = Object.freeze({\n visible: 0,\n hidden: 1,\n noPrint: 2,\n noView: 3\n});\nconst Font = Object.freeze({\n Times: \"Times-Roman\",\n TimesB: \"Times-Bold\",\n TimesI: \"Times-Italic\",\n TimesBI: \"Times-BoldItalic\",\n Helv: \"Helvetica\",\n HelvB: \"Helvetica-Bold\",\n HelvI: \"Helvetica-Oblique\",\n HelvBI: \"Helvetica-BoldOblique\",\n Cour: \"Courier\",\n CourB: \"Courier-Bold\",\n CourI: \"Courier-Oblique\",\n CourBI: \"Courier-BoldOblique\",\n Symbol: \"Symbol\",\n ZapfD: \"ZapfDingbats\",\n KaGo: \"HeiseiKakuGo-W5-UniJIS-UCS2-H\",\n KaMi: \"HeiseiMin-W3-UniJIS-UCS2-H\"\n});\nconst Highlight = Object.freeze({\n n: \"none\",\n i: \"invert\",\n p: \"push\",\n o: \"outline\"\n});\nconst Position = Object.freeze({\n textOnly: 0,\n iconOnly: 1,\n iconTextV: 2,\n textIconV: 3,\n iconTextH: 4,\n textIconH: 5,\n overlay: 6\n});\nconst ScaleHow = Object.freeze({\n proportional: 0,\n anamorphic: 1\n});\nconst ScaleWhen = Object.freeze({\n always: 0,\n never: 1,\n tooBig: 2,\n tooSmall: 3\n});\nconst Style = Object.freeze({\n ch: \"check\",\n cr: \"cross\",\n di: \"diamond\",\n ci: \"circle\",\n st: \"star\",\n sq: \"square\"\n});\nconst Trans = Object.freeze({\n blindsH: \"BlindsHorizontal\",\n blindsV: \"BlindsVertical\",\n boxI: \"BoxIn\",\n boxO: \"BoxOut\",\n dissolve: \"Dissolve\",\n glitterD: \"GlitterDown\",\n glitterR: \"GlitterRight\",\n glitterRD: \"GlitterRightDown\",\n random: \"Random\",\n replace: \"Replace\",\n splitHI: \"SplitHorizontalIn\",\n splitHO: \"SplitHorizontalOut\",\n splitVI: \"SplitVerticalIn\",\n splitVO: \"SplitVerticalOut\",\n wipeD: \"WipeDown\",\n wipeL: \"WipeLeft\",\n wipeR: \"WipeRight\",\n wipeU: \"WipeUp\"\n});\nconst ZoomType = Object.freeze({\n none: \"NoVary\",\n fitP: \"FitPage\",\n fitW: \"FitWidth\",\n fitH: \"FitHeight\",\n fitV: \"FitVisibleWidth\",\n pref: \"Preferred\",\n refW: \"ReflowWidth\"\n});\nconst GlobalConstants = Object.freeze({\n IDS_GREATER_THAN: \"Invalid value: must be greater than or equal to % s.\",\n IDS_GT_AND_LT: \"Invalid value: must be greater than or equal to % s \" + \"and less than or equal to % s.\",\n IDS_LESS_THAN: \"Invalid value: must be less than or equal to % s.\",\n IDS_INVALID_MONTH: \"** Invalid **\",\n IDS_INVALID_DATE: \"Invalid date / time: please ensure that the date / time exists. Field\",\n IDS_INVALID_DATE2: \" should match format \",\n IDS_INVALID_VALUE: \"The value entered does not match the format of the field\",\n IDS_AM: \"am\",\n IDS_PM: \"pm\",\n IDS_MONTH_INFO: \"January[1] February[2] March[3] April[4] May[5] \" + \"June[6] July[7] August[8] September[9] October[10] \" + \"November[11] December[12] Sept[9] Jan[1] Feb[2] Mar[3] \" + \"Apr[4] Jun[6] Jul[7] Aug[8] Sep[9] Oct[10] Nov[11] Dec[12]\",\n IDS_STARTUP_CONSOLE_MSG: \"** ^ _ ^ **\",\n RE_NUMBER_ENTRY_DOT_SEP: [\"[+-]?\\\\d*\\\\.?\\\\d*\"],\n RE_NUMBER_COMMIT_DOT_SEP: [\"[+-]?\\\\d+(\\\\.\\\\d+)?\", \"[+-]?\\\\.\\\\d+\", \"[+-]?\\\\d+\\\\.\"],\n RE_NUMBER_ENTRY_COMMA_SEP: [\"[+-]?\\\\d*,?\\\\d*\"],\n RE_NUMBER_COMMIT_COMMA_SEP: [\"[+-]?\\\\d+([.,]\\\\d+)?\", \"[+-]?[.,]\\\\d+\", \"[+-]?\\\\d+[.,]\"],\n RE_ZIP_ENTRY: [\"\\\\d{0,5}\"],\n RE_ZIP_COMMIT: [\"\\\\d{5}\"],\n RE_ZIP4_ENTRY: [\"\\\\d{0,5}(\\\\.|[- ])?\\\\d{0,4}\"],\n RE_ZIP4_COMMIT: [\"\\\\d{5}(\\\\.|[- ])?\\\\d{4}\"],\n RE_PHONE_ENTRY: [\"\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\", \"\\\\(\\\\d{0,3}\", \"\\\\(\\\\d{0,3}\\\\)(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\", \"\\\\(\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\", \"\\\\d{0,3}\\\\)(\\\\.|[- ])?\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,4}\", \"011(\\\\.|[- \\\\d])*\"],\n RE_PHONE_COMMIT: [\"\\\\d{3}(\\\\.|[- ])?\\\\d{4}\", \"\\\\d{3}(\\\\.|[- ])?\\\\d{3}(\\\\.|[- ])?\\\\d{4}\", \"\\\\(\\\\d{3}\\\\)(\\\\.|[- ])?\\\\d{3}(\\\\.|[- ])?\\\\d{4}\", \"011(\\\\.|[- \\\\d])*\"],\n RE_SSN_ENTRY: [\"\\\\d{0,3}(\\\\.|[- ])?\\\\d{0,2}(\\\\.|[- ])?\\\\d{0,4}\"],\n RE_SSN_COMMIT: [\"\\\\d{3}(\\\\.|[- ])?\\\\d{2}(\\\\.|[- ])?\\\\d{4}\"]\n});\n\n;// ./src/scripting_api/common.js\nconst FieldType = {\n none: 0,\n number: 1,\n percent: 2,\n date: 3,\n time: 4\n};\nfunction createActionsMap(actions) {\n return new Map(actions ? Object.entries(actions) : null);\n}\nfunction getFieldType(actions) {\n let format = actions.get(\"Format\");\n if (!format) {\n return FieldType.none;\n }\n format = format[0];\n format = format.trim();\n if (format.startsWith(\"AFNumber_\")) {\n return FieldType.number;\n }\n if (format.startsWith(\"AFPercent_\")) {\n return FieldType.percent;\n }\n if (format.startsWith(\"AFDate_\")) {\n return FieldType.date;\n }\n if (format.startsWith(\"AFTime_\")) {\n return FieldType.time;\n }\n return FieldType.none;\n}\n\n;// ./src/shared/math_clamp.js\nfunction MathClamp(v, min, max) {\n return Math.min(Math.max(v, min), max);\n}\n\n;// ./src/shared/scripting_utils.js\n\nfunction makeColorComp(n) {\n return Math.floor(MathClamp(n, 0, 1) * 255).toString(16).padStart(2, \"0\");\n}\nfunction scaleAndClamp(x) {\n return MathClamp(x, 0, 1) * 255;\n}\nclass ColorConverters {\n static CMYK_G([c, y, m, k]) {\n return [\"G\", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)];\n }\n static G_CMYK([g]) {\n return [\"CMYK\", 0, 0, 0, 1 - g];\n }\n static G_RGB([g]) {\n return [\"RGB\", g, g, g];\n }\n static G_rgb([g]) {\n g = scaleAndClamp(g);\n return [g, g, g];\n }\n static G_HTML([g]) {\n const G = makeColorComp(g);\n return `#${G}${G}${G}`;\n }\n static RGB_G([r, g, b]) {\n return [\"G\", 0.3 * r + 0.59 * g + 0.11 * b];\n }\n static RGB_rgb(color) {\n return color.map(scaleAndClamp);\n }\n static RGB_HTML(color) {\n return `#${color.map(makeColorComp).join(\"\")}`;\n }\n static T_HTML() {\n return \"#00000000\";\n }\n static T_rgb() {\n return [null];\n }\n static CMYK_RGB([c, y, m, k]) {\n return [\"RGB\", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)];\n }\n static CMYK_rgb([c, y, m, k]) {\n return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))];\n }\n static CMYK_HTML(components) {\n const rgb = this.CMYK_RGB(components).slice(1);\n return this.RGB_HTML(rgb);\n }\n static RGB_CMYK([r, g, b]) {\n const c = 1 - r;\n const m = 1 - g;\n const y = 1 - b;\n const k = Math.min(c, m, y);\n return [\"CMYK\", c, m, y, k];\n }\n}\nconst DateFormats = [\"m/d\", \"m/d/yy\", \"mm/dd/yy\", \"mm/yy\", \"d-mmm\", \"d-mmm-yy\", \"dd-mmm-yy\", \"yy-mm-dd\", \"mmm-yy\", \"mmmm-yy\", \"mmm d, yyyy\", \"mmmm d, yyyy\", \"m/d/yy h:MM tt\", \"m/d/yy HH:MM\"];\nconst TimeFormats = [\"HH:MM\", \"h:MM tt\", \"HH:MM:ss\", \"h:MM:ss tt\"];\n\n;// ./src/scripting_api/pdf_object.js\nclass PDFObject {\n constructor(data) {\n this._expandos = Object.create(null);\n this._send = data.send || null;\n this._id = data.id || null;\n }\n}\n\n;// ./src/scripting_api/color.js\n\n\nclass Color extends PDFObject {\n transparent = [\"T\"];\n black = [\"G\", 0];\n white = [\"G\", 1];\n red = [\"RGB\", 1, 0, 0];\n green = [\"RGB\", 0, 1, 0];\n blue = [\"RGB\", 0, 0, 1];\n cyan = [\"CMYK\", 1, 0, 0, 0];\n magenta = [\"CMYK\", 0, 1, 0, 0];\n yellow = [\"CMYK\", 0, 0, 1, 0];\n dkGray = [\"G\", 0.25];\n gray = [\"G\", 0.5];\n ltGray = [\"G\", 0.75];\n constructor() {\n super({});\n }\n static _isValidSpace(cColorSpace) {\n return typeof cColorSpace === \"string\" && (cColorSpace === \"T\" || cColorSpace === \"G\" || cColorSpace === \"RGB\" || cColorSpace === \"CMYK\");\n }\n static _isValidColor(colorArray) {\n if (!Array.isArray(colorArray) || colorArray.length === 0) {\n return false;\n }\n const space = colorArray[0];\n if (!Color._isValidSpace(space)) {\n return false;\n }\n switch (space) {\n case \"T\":\n if (colorArray.length !== 1) {\n return false;\n }\n break;\n case \"G\":\n if (colorArray.length !== 2) {\n return false;\n }\n break;\n case \"RGB\":\n if (colorArray.length !== 4) {\n return false;\n }\n break;\n case \"CMYK\":\n if (colorArray.length !== 5) {\n return false;\n }\n break;\n default:\n return false;\n }\n return colorArray.slice(1).every(c => typeof c === \"number\" && c >= 0 && c <= 1);\n }\n static _getCorrectColor(colorArray) {\n return Color._isValidColor(colorArray) ? colorArray : [\"G\", 0];\n }\n convert(colorArray, cColorSpace) {\n if (!Color._isValidSpace(cColorSpace)) {\n return this.black;\n }\n if (cColorSpace === \"T\") {\n return [\"T\"];\n }\n colorArray = Color._getCorrectColor(colorArray);\n if (colorArray[0] === cColorSpace) {\n return colorArray;\n }\n if (colorArray[0] === \"T\") {\n return this.convert(this.black, cColorSpace);\n }\n return ColorConverters[`${colorArray[0]}_${cColorSpace}`](colorArray.slice(1));\n }\n equal(colorArray1, colorArray2) {\n colorArray1 = Color._getCorrectColor(colorArray1);\n colorArray2 = Color._getCorrectColor(colorArray2);\n if (colorArray1[0] === \"T\" || colorArray2[0] === \"T\") {\n return colorArray1[0] === \"T\" && colorArray2[0] === \"T\";\n }\n if (colorArray1[0] !== colorArray2[0]) {\n colorArray2 = this.convert(colorArray2, colorArray1[0]);\n }\n return colorArray1.slice(1).every((c, i) => c === colorArray2[i + 1]);\n }\n}\n\n;// ./src/scripting_api/app_utils.js\nconst VIEWER_TYPE = \"PDF.js\";\nconst VIEWER_VARIATION = \"Full\";\nconst VIEWER_VERSION = 21.00720099;\nconst FORMS_VERSION = 21.00720099;\nconst USERACTIVATION_CALLBACKID = 0;\nconst USERACTIVATION_MAXTIME_VALIDITY = 5000;\nfunction serializeError(error) {\n const value = `${error.toString()}\\n${error.stack}`;\n return {\n command: \"error\",\n value\n };\n}\nconst makeArr = () => [];\nconst makeMap = () => new Map();\n\n;// ./src/scripting_api/field.js\n\n\n\n\nclass Field extends PDFObject {\n constructor(data) {\n super(data);\n this.alignment = data.alignment || \"left\";\n this.borderStyle = data.borderStyle || \"\";\n this.buttonAlignX = data.buttonAlignX || 50;\n this.buttonAlignY = data.buttonAlignY || 50;\n this.buttonFitBounds = data.buttonFitBounds;\n this.buttonPosition = data.buttonPosition;\n this.buttonScaleHow = data.buttonScaleHow;\n this.ButtonScaleWhen = data.buttonScaleWhen;\n this.calcOrderIndex = data.calcOrderIndex;\n this.comb = data.comb;\n this.commitOnSelChange = data.commitOnSelChange;\n this.currentValueIndices = data.currentValueIndices;\n this.defaultStyle = data.defaultStyle;\n this.defaultValue = data.defaultValue;\n this.doNotScroll = data.doNotScroll;\n this.doNotSpellCheck = data.doNotSpellCheck;\n this.delay = data.delay;\n this.display = data.display;\n this.doc = data.doc.wrapped;\n this.editable = data.editable;\n this.exportValues = data.exportValues;\n this.fileSelect = data.fileSelect;\n this.hidden = data.hidden;\n this.highlight = data.highlight;\n this.lineWidth = data.lineWidth;\n this.multiline = data.multiline;\n this.multipleSelection = !!data.multipleSelection;\n this.name = data.name;\n this.password = data.password;\n this.print = data.print;\n this.radiosInUnison = data.radiosInUnison;\n this.readonly = data.readonly;\n this.rect = data.rect;\n this.required = data.required;\n this.richText = data.richText;\n this.richValue = data.richValue;\n this.style = data.style;\n this.submitName = data.submitName;\n this.textFont = data.textFont;\n this.textSize = data.textSize;\n this.type = data.type;\n this.userName = data.userName;\n this._actions = createActionsMap(data.actions);\n this._browseForFileToSubmit = data.browseForFileToSubmit || null;\n this._buttonCaption = null;\n this._buttonIcon = null;\n this._charLimit = data.charLimit;\n this._children = null;\n this._currentValueIndices = data.currentValueIndices || 0;\n this._document = data.doc;\n this._fieldPath = data.fieldPath;\n this._fillColor = data.fillColor || [\"T\"];\n this._isChoice = Array.isArray(data.items);\n this._items = data.items || [];\n this._hasValue = Object.hasOwn(data, \"value\");\n this._page = data.page || 0;\n this._strokeColor = data.strokeColor || [\"G\", 0];\n this._textColor = data.textColor || [\"G\", 0];\n this._value = null;\n this._kidIds = data.kidIds || null;\n this._fieldType = getFieldType(this._actions);\n this._siblings = data.siblings || null;\n this._rotation = data.rotation || 0;\n this._datetimeFormat = data.datetimeFormat || null;\n this._hasDateOrTime = !!data.hasDatetimeHTML;\n this._util = data.util;\n this._globalEval = data.globalEval;\n this._appObjects = data.appObjects;\n this.value = data.value || \"\";\n }\n get currentValueIndices() {\n if (!this._isChoice) {\n return 0;\n }\n return this._currentValueIndices;\n }\n set currentValueIndices(indices) {\n if (!this._isChoice) {\n return;\n }\n if (!Array.isArray(indices)) {\n indices = [indices];\n }\n if (!indices.every(i => typeof i === \"number\" && Number.isInteger(i) && i >= 0 && i < this.numItems)) {\n return;\n }\n indices.sort();\n if (this.multipleSelection) {\n this._currentValueIndices = indices;\n this._value = [];\n indices.forEach(i => {\n this._value.push(this._items[i].displayValue);\n });\n } else if (indices.length > 0) {\n indices = indices.splice(1, indices.length - 1);\n this._currentValueIndices = indices[0];\n this._value = this._items[this._currentValueIndices];\n }\n this._send({\n id: this._id,\n indices\n });\n }\n get fillColor() {\n return this._fillColor;\n }\n set fillColor(color) {\n if (Color._isValidColor(color)) {\n this._fillColor = color;\n }\n }\n get bgColor() {\n return this.fillColor;\n }\n set bgColor(color) {\n this.fillColor = color;\n }\n get charLimit() {\n return this._charLimit;\n }\n set charLimit(limit) {\n if (typeof limit !== \"number\") {\n throw new Error(\"Invalid argument value\");\n }\n this._charLimit = Math.max(0, Math.floor(limit));\n }\n get numItems() {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n return this._items.length;\n }\n set numItems(_) {\n throw new Error(\"field.numItems is read-only\");\n }\n get strokeColor() {\n return this._strokeColor;\n }\n set strokeColor(color) {\n if (Color._isValidColor(color)) {\n this._strokeColor = color;\n }\n }\n get borderColor() {\n return this.strokeColor;\n }\n set borderColor(color) {\n this.strokeColor = color;\n }\n get page() {\n return this._page;\n }\n set page(_) {\n throw new Error(\"field.page is read-only\");\n }\n get rotation() {\n return this._rotation;\n }\n set rotation(angle) {\n angle = Math.floor(angle);\n if (angle % 90 !== 0) {\n throw new Error(\"Invalid rotation: must be a multiple of 90\");\n }\n angle %= 360;\n if (angle < 0) {\n angle += 360;\n }\n this._rotation = angle;\n }\n get textColor() {\n return this._textColor;\n }\n set textColor(color) {\n if (Color._isValidColor(color)) {\n this._textColor = color;\n }\n }\n get fgColor() {\n return this.textColor;\n }\n set fgColor(color) {\n this.textColor = color;\n }\n get value() {\n return this._value;\n }\n set value(value) {\n if (this._isChoice) {\n this._setChoiceValue(value);\n return;\n }\n if (this._hasDateOrTime && value) {\n const date = this._util.scand(this._datetimeFormat, value);\n if (date) {\n this._originalValue = date.valueOf();\n value = this._util.printd(this._datetimeFormat, date);\n this._value = !isNaN(value) ? parseFloat(value) : value;\n return;\n }\n }\n if (value === \"\" || typeof value !== \"string\" || this._fieldType >= FieldType.date) {\n this._originalValue = undefined;\n this._value = value;\n return;\n }\n this._originalValue = value;\n const _value = value.trim().replace(\",\", \".\");\n this._value = !isNaN(_value) ? parseFloat(_value) : value;\n }\n get _initialValue() {\n return this._hasDateOrTime && this._originalValue || null;\n }\n _getValue() {\n return this._originalValue ?? this.value;\n }\n _setChoiceValue(value) {\n if (this.multipleSelection) {\n if (!Array.isArray(value)) {\n value = [value];\n }\n const values = new Set(value);\n if (Array.isArray(this._currentValueIndices)) {\n this._currentValueIndices.length = 0;\n this._value.length = 0;\n } else {\n this._currentValueIndices = [];\n this._value = [];\n }\n this._items.forEach((item, i) => {\n if (values.has(item.exportValue)) {\n this._currentValueIndices.push(i);\n this._value.push(item.exportValue);\n }\n });\n } else {\n if (Array.isArray(value)) {\n value = value[0];\n }\n const index = this._items.findIndex(({\n exportValue\n }) => value === exportValue);\n if (index !== -1) {\n this._currentValueIndices = index;\n this._value = this._items[index].exportValue;\n }\n }\n }\n get valueAsString() {\n return (this._value ?? \"\").toString();\n }\n set valueAsString(_) {}\n browseForFileToSubmit() {\n if (this._browseForFileToSubmit) {\n this._browseForFileToSubmit();\n }\n }\n buttonGetCaption(nFace = 0) {\n if (this._buttonCaption) {\n return this._buttonCaption[nFace];\n }\n return \"\";\n }\n buttonGetIcon(nFace = 0) {\n if (this._buttonIcon) {\n return this._buttonIcon[nFace];\n }\n return null;\n }\n buttonImportIcon(cPath = null, nPave = 0) {}\n buttonSetCaption(cCaption, nFace = 0) {\n if (!this._buttonCaption) {\n this._buttonCaption = [\"\", \"\", \"\"];\n }\n this._buttonCaption[nFace] = cCaption;\n }\n buttonSetIcon(oIcon, nFace = 0) {\n if (!this._buttonIcon) {\n this._buttonIcon = [null, null, null];\n }\n this._buttonIcon[nFace] = oIcon;\n }\n checkThisBox(nWidget, bCheckIt = true) {}\n clearItems() {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n this._items = [];\n this._send({\n id: this._id,\n clear: null\n });\n }\n deleteItemAt(nIdx = null) {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n if (!this.numItems) {\n return;\n }\n if (nIdx === null) {\n nIdx = Array.isArray(this._currentValueIndices) ? this._currentValueIndices[0] : this._currentValueIndices;\n nIdx ||= 0;\n }\n if (nIdx < 0 || nIdx >= this.numItems) {\n nIdx = this.numItems - 1;\n }\n this._items.splice(nIdx, 1);\n if (Array.isArray(this._currentValueIndices)) {\n let index = this._currentValueIndices.findIndex(i => i >= nIdx);\n if (index !== -1) {\n if (this._currentValueIndices[index] === nIdx) {\n this._currentValueIndices.splice(index, 1);\n }\n for (const ii = this._currentValueIndices.length; index < ii; index++) {\n --this._currentValueIndices[index];\n }\n }\n } else if (this._currentValueIndices === nIdx) {\n this._currentValueIndices = this.numItems > 0 ? 0 : -1;\n } else if (this._currentValueIndices > nIdx) {\n --this._currentValueIndices;\n }\n this._send({\n id: this._id,\n remove: nIdx\n });\n }\n getItemAt(nIdx = -1, bExportValue = false) {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n if (nIdx < 0 || nIdx >= this.numItems) {\n nIdx = this.numItems - 1;\n }\n const item = this._items[nIdx];\n return bExportValue ? item.exportValue : item.displayValue;\n }\n getArray() {\n if (this._kidIds) {\n const array = [];\n const fillArrayWithKids = kidIds => {\n for (const id of kidIds) {\n const obj = this._appObjects[id];\n if (!obj) {\n continue;\n }\n if (obj.obj._hasValue) {\n array.push(obj.wrapped);\n }\n if (obj.obj._kidIds) {\n fillArrayWithKids(obj.obj._kidIds);\n }\n }\n };\n fillArrayWithKids(this._kidIds);\n return array;\n }\n return this._children ??= this._document.obj._getTerminalChildren(this._fieldPath);\n }\n getLock() {\n return undefined;\n }\n isBoxChecked(nWidget) {\n return false;\n }\n isDefaultChecked(nWidget) {\n return false;\n }\n insertItemAt(cName, cExport = undefined, nIdx = 0) {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n if (!cName) {\n return;\n }\n if (nIdx < 0 || nIdx > this.numItems) {\n nIdx = this.numItems;\n }\n if (this._items.some(({\n displayValue\n }) => displayValue === cName)) {\n return;\n }\n if (cExport === undefined) {\n cExport = cName;\n }\n const data = {\n displayValue: cName,\n exportValue: cExport\n };\n this._items.splice(nIdx, 0, data);\n if (Array.isArray(this._currentValueIndices)) {\n let index = this._currentValueIndices.findIndex(i => i >= nIdx);\n if (index !== -1) {\n for (const ii = this._currentValueIndices.length; index < ii; index++) {\n ++this._currentValueIndices[index];\n }\n }\n } else if (this._currentValueIndices >= nIdx) {\n ++this._currentValueIndices;\n }\n this._send({\n id: this._id,\n insert: {\n index: nIdx,\n ...data\n }\n });\n }\n setAction(cTrigger, cScript) {\n if (typeof cTrigger !== \"string\" || typeof cScript !== \"string\") {\n return;\n }\n if (!(cTrigger in this._actions)) {\n this._actions[cTrigger] = [];\n }\n this._actions[cTrigger].push(cScript);\n }\n setFocus() {\n this._send({\n id: this._id,\n focus: true\n });\n }\n setItems(oArray) {\n if (!this._isChoice) {\n throw new Error(\"Not a choice widget\");\n }\n this._items.length = 0;\n for (const element of oArray) {\n let displayValue, exportValue;\n if (Array.isArray(element)) {\n displayValue = element[0]?.toString() || \"\";\n exportValue = element[1]?.toString() || \"\";\n } else {\n displayValue = exportValue = element?.toString() || \"\";\n }\n this._items.push({\n displayValue,\n exportValue\n });\n }\n this._currentValueIndices = 0;\n this._send({\n id: this._id,\n items: this._items\n });\n }\n setLock() {}\n signatureGetModifications() {}\n signatureGetSeedValue() {}\n signatureInfo() {}\n signatureSetSeedValue() {}\n signatureSign() {}\n signatureValidate() {}\n _isButton() {\n return false;\n }\n _reset() {\n this.value = this.defaultValue;\n }\n _runActions(event) {\n const eventName = event.name;\n if (!this._actions.has(eventName)) {\n return false;\n }\n const actions = this._actions.get(eventName);\n for (const action of actions) {\n try {\n this._globalEval(action);\n } catch (error) {\n const serializedError = serializeError(error);\n serializedError.value = `Error when executing \"${eventName}\" for field \"${this._id}\"\\n${serializedError.value}`;\n this._send(serializedError);\n }\n }\n return true;\n }\n}\nclass RadioButtonField extends Field {\n constructor(otherButtons, data) {\n super(data);\n this.exportValues = [this.exportValues];\n this._radioIds = [this._id];\n this._radioActions = [this._actions];\n for (const radioData of otherButtons) {\n this.exportValues.push(radioData.exportValues);\n this._radioIds.push(radioData.id);\n this._radioActions.push(createActionsMap(radioData.actions));\n if (this._value === radioData.exportValues) {\n this._id = radioData.id;\n }\n }\n this._hasBeenInitialized = true;\n this._value = data.value || \"\";\n }\n get _siblings() {\n return this._radioIds.filter(id => id !== this._id);\n }\n set _siblings(_) {}\n get value() {\n return this._value;\n }\n set value(value) {\n if (!this._hasBeenInitialized) {\n return;\n }\n if (value === null || value === undefined) {\n this._value = \"\";\n }\n const i = this.exportValues.indexOf(value);\n if (0 <= i && i < this._radioIds.length) {\n this._id = this._radioIds[i];\n this._value = value;\n } else if (value === \"Off\" && this._radioIds.length === 2) {\n const nextI = (1 + this._radioIds.indexOf(this._id)) % 2;\n this._id = this._radioIds[nextI];\n this._value = this.exportValues[nextI];\n }\n }\n checkThisBox(nWidget, bCheckIt = true) {\n if (nWidget < 0 || nWidget >= this._radioIds.length || !bCheckIt) {\n return;\n }\n this._id = this._radioIds[nWidget];\n this._value = this.exportValues[nWidget];\n this._send({\n id: this._id,\n value: this._value\n });\n }\n isBoxChecked(nWidget) {\n return nWidget >= 0 && nWidget < this._radioIds.length && this._id === this._radioIds[nWidget];\n }\n isDefaultChecked(nWidget) {\n return nWidget >= 0 && nWidget < this.exportValues.length && this.defaultValue === this.exportValues[nWidget];\n }\n _getExportValue(state) {\n const i = this._radioIds.indexOf(this._id);\n return this.exportValues[i];\n }\n _runActions(event) {\n const i = this._radioIds.indexOf(this._id);\n this._actions = this._radioActions[i];\n return super._runActions(event);\n }\n _isButton() {\n return true;\n }\n}\nclass CheckboxField extends RadioButtonField {\n get value() {\n return this._value;\n }\n set value(value) {\n if (!value || value === \"Off\") {\n this._value = \"Off\";\n } else {\n super.value = value;\n }\n }\n _getExportValue(state) {\n return state ? super._getExportValue(state) : \"Off\";\n }\n isBoxChecked(nWidget) {\n if (this._value === \"Off\") {\n return false;\n }\n return super.isBoxChecked(nWidget);\n }\n isDefaultChecked(nWidget) {\n if (this.defaultValue === \"Off\") {\n return this._value === \"Off\";\n }\n return super.isDefaultChecked(nWidget);\n }\n checkThisBox(nWidget, bCheckIt = true) {\n if (nWidget < 0 || nWidget >= this._radioIds.length) {\n return;\n }\n this._id = this._radioIds[nWidget];\n this._value = bCheckIt ? this.exportValues[nWidget] : \"Off\";\n this._send({\n id: this._id,\n value: this._value\n });\n }\n}\n\n;// ./src/scripting_api/aform.js\n\n\n\nclass AForm {\n constructor(document, app, util, color) {\n this._document = document;\n this._app = app;\n this._util = util;\n this._color = color;\n this._emailRegex = new RegExp(\"^[\\\\w.!#$%&'*+/=?^`{|}~-]+\" + \"@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\" + \"(?:\\\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$\");\n }\n _mkTargetName(event) {\n return event.target ? `[ ${event.target.name} ]` : \"\";\n }\n _parseDate(cFormat, cDate) {\n let date = null;\n try {\n date = this._util._scand(cFormat, cDate, false);\n } catch {}\n if (date) {\n return date;\n }\n date = Date.parse(cDate);\n return isNaN(date) ? null : new Date(date);\n }\n AFMergeChange(event = globalThis.event) {\n if (event.willCommit) {\n return event.value.toString();\n }\n return this._app._eventDispatcher.mergeChange(event);\n }\n AFParseDateEx(cString, cOrder) {\n return this._parseDate(cOrder, cString);\n }\n AFExtractNums(str) {\n if (typeof str === \"number\") {\n return [str];\n }\n if (!str || typeof str !== \"string\") {\n return null;\n }\n const first = str.charAt(0);\n if (first === \".\" || first === \",\") {\n str = `0${str}`;\n }\n const numbers = str.match(/(\\d+)/g);\n if (numbers.length === 0) {\n return null;\n }\n return numbers;\n }\n AFMakeNumber(str) {\n if (typeof str === \"number\") {\n return str;\n }\n if (typeof str !== \"string\") {\n return null;\n }\n str = str.trim().replace(\",\", \".\");\n const number = parseFloat(str);\n if (isNaN(number) || !isFinite(number)) {\n return null;\n }\n return number;\n }\n AFMakeArrayFromList(string) {\n if (typeof string === \"string\") {\n return string.split(/, ?/g);\n }\n return string;\n }\n AFNumber_Format(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend) {\n const event = globalThis.event;\n let value = this.AFMakeNumber(event.value);\n if (value === null) {\n event.value = \"\";\n return;\n }\n const sign = Math.sign(value);\n const buf = [];\n let hasParen = false;\n if (sign === -1 && bCurrencyPrepend && negStyle === 0) {\n buf.push(\"-\");\n }\n if ((negStyle === 2 || negStyle === 3) && sign === -1) {\n buf.push(\"(\");\n hasParen = true;\n }\n if (bCurrencyPrepend) {\n buf.push(strCurrency);\n }\n sepStyle = MathClamp(Math.floor(sepStyle), 0, 4);\n buf.push(\"%,\", sepStyle, \".\", nDec.toString(), \"f\");\n if (!bCurrencyPrepend) {\n buf.push(strCurrency);\n }\n if (hasParen) {\n buf.push(\")\");\n }\n if (negStyle === 1 || negStyle === 3) {\n event.target.textColor = sign === 1 ? this._color.black : this._color.red;\n }\n if ((negStyle !== 0 || bCurrencyPrepend) && sign === -1) {\n value = -value;\n }\n const formatStr = buf.join(\"\");\n event.value = this._util.printf(formatStr, value);\n }\n AFNumber_Keystroke(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend) {\n const event = globalThis.event;\n let value = this.AFMergeChange(event);\n if (!value) {\n return;\n }\n value = value.trim();\n let pattern;\n if (sepStyle > 1) {\n pattern = event.willCommit ? /^[+-]?(\\d+(,\\d*)?|,\\d+)$/ : /^[+-]?\\d*(?:,\\d*)?$/;\n } else {\n pattern = event.willCommit ? /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)$/ : /^[+-]?\\d*(?:\\.\\d*)?$/;\n }\n if (!pattern.test(value)) {\n if (event.willCommit) {\n const err = `${GlobalConstants.IDS_INVALID_VALUE} ${this._mkTargetName(event)}`;\n this._app.alert(err);\n }\n event.rc = false;\n }\n if (event.willCommit && sepStyle > 1) {\n event.value = parseFloat(value.replace(\",\", \".\"));\n }\n }\n AFPercent_Format(nDec, sepStyle, percentPrepend = false) {\n if (typeof nDec !== \"number\") {\n return;\n }\n if (typeof sepStyle !== \"number\") {\n return;\n }\n if (nDec < 0) {\n throw new Error(\"Invalid nDec value in AFPercent_Format\");\n }\n const event = globalThis.event;\n if (nDec > 512) {\n event.value = \"%\";\n return;\n }\n nDec = Math.floor(nDec);\n sepStyle = MathClamp(Math.floor(sepStyle), 0, 4);\n let value = this.AFMakeNumber(event.value);\n if (value === null) {\n event.value = \"%\";\n return;\n }\n const formatStr = `%,${sepStyle}.${nDec}f`;\n value = this._util.printf(formatStr, value * 100);\n event.value = percentPrepend ? `%${value}` : `${value}%`;\n }\n AFPercent_Keystroke(nDec, sepStyle) {\n this.AFNumber_Keystroke(nDec, sepStyle, 0, 0, \"\", true);\n }\n AFDate_FormatEx(cFormat) {\n const event = globalThis.event;\n const value = event.value;\n if (!value) {\n return;\n }\n const date = this._parseDate(cFormat, value);\n if (date !== null) {\n event.value = this._util.printd(cFormat, date);\n }\n }\n AFDate_Format(pdf) {\n this.AFDate_FormatEx(DateFormats[pdf] ?? pdf);\n }\n AFDate_KeystrokeEx(cFormat) {\n const event = globalThis.event;\n if (!event.willCommit) {\n return;\n }\n const value = this.AFMergeChange(event);\n if (!value) {\n return;\n }\n if (this._parseDate(cFormat, value) === null) {\n const invalid = GlobalConstants.IDS_INVALID_DATE;\n const invalid2 = GlobalConstants.IDS_INVALID_DATE2;\n const err = `${invalid} ${this._mkTargetName(event)}${invalid2}${cFormat}`;\n this._app.alert(err);\n event.rc = false;\n }\n }\n AFDate_Keystroke(pdf) {\n if (pdf >= 0 && pdf < DateFormats.length) {\n this.AFDate_KeystrokeEx(DateFormats[pdf]);\n }\n }\n AFRange_Validate(bGreaterThan, nGreaterThan, bLessThan, nLessThan) {\n const event = globalThis.event;\n if (!event.value) {\n return;\n }\n const value = this.AFMakeNumber(event.value);\n if (value === null) {\n return;\n }\n bGreaterThan = !!bGreaterThan;\n bLessThan = !!bLessThan;\n if (bGreaterThan) {\n nGreaterThan = this.AFMakeNumber(nGreaterThan);\n if (nGreaterThan === null) {\n return;\n }\n }\n if (bLessThan) {\n nLessThan = this.AFMakeNumber(nLessThan);\n if (nLessThan === null) {\n return;\n }\n }\n let err = \"\";\n if (bGreaterThan && bLessThan) {\n if (value < nGreaterThan || value > nLessThan) {\n err = this._util.printf(GlobalConstants.IDS_GT_AND_LT, nGreaterThan, nLessThan);\n }\n } else if (bGreaterThan) {\n if (value < nGreaterThan) {\n err = this._util.printf(GlobalConstants.IDS_GREATER_THAN, nGreaterThan);\n }\n } else if (value > nLessThan) {\n err = this._util.printf(GlobalConstants.IDS_LESS_THAN, nLessThan);\n }\n if (err) {\n this._app.alert(err);\n event.rc = false;\n }\n }\n AFSimple(cFunction, nValue1, nValue2) {\n const value1 = this.AFMakeNumber(nValue1);\n if (value1 === null) {\n throw new Error(\"Invalid nValue1 in AFSimple\");\n }\n const value2 = this.AFMakeNumber(nValue2);\n if (value2 === null) {\n throw new Error(\"Invalid nValue2 in AFSimple\");\n }\n switch (cFunction) {\n case \"AVG\":\n return (value1 + value2) / 2;\n case \"SUM\":\n return value1 + value2;\n case \"PRD\":\n return value1 * value2;\n case \"MIN\":\n return Math.min(value1, value2);\n case \"MAX\":\n return Math.max(value1, value2);\n }\n throw new Error(\"Invalid cFunction in AFSimple\");\n }\n AFSimple_Calculate(cFunction, cFields) {\n const actions = {\n AVG: args => Math.sumPrecise(args) / args.length,\n SUM: args => Math.sumPrecise(args),\n PRD: args => args.reduce((acc, value) => acc * value, 1),\n MIN: args => Math.min(...args),\n MAX: args => Math.max(...args)\n };\n if (!(cFunction in actions)) {\n throw new TypeError(\"Invalid function in AFSimple_Calculate\");\n }\n const event = globalThis.event;\n const values = [];\n cFields = this.AFMakeArrayFromList(cFields);\n for (const cField of cFields) {\n const field = this._document.getField(cField);\n if (!field) {\n continue;\n }\n for (const child of field.getArray()) {\n const number = this.AFMakeNumber(child.value);\n values.push(number ?? 0);\n }\n }\n if (values.length === 0) {\n event.value = 0;\n return;\n }\n const res = actions[cFunction](values);\n event.value = Math.round(1e6 * res) / 1e6;\n }\n AFSpecial_Format(psf) {\n const event = globalThis.event;\n if (!event.value) {\n return;\n }\n psf = this.AFMakeNumber(psf);\n let formatStr;\n switch (psf) {\n case 0:\n formatStr = \"99999\";\n break;\n case 1:\n formatStr = \"99999-9999\";\n break;\n case 2:\n formatStr = this._util.printx(\"9999999999\", event.value).length >= 10 ? \"(999) 999-9999\" : \"999-9999\";\n break;\n case 3:\n formatStr = \"999-99-9999\";\n break;\n default:\n throw new Error(\"Invalid psf in AFSpecial_Format\");\n }\n event.value = this._util.printx(formatStr, event.value);\n }\n AFSpecial_KeystrokeEx(cMask) {\n const event = globalThis.event;\n const simplifiedFormatStr = cMask.replaceAll(/[^9AOX]/g, \"\");\n this.#AFSpecial_KeystrokeEx_helper(simplifiedFormatStr, null, false);\n if (event.rc) {\n return;\n }\n event.rc = true;\n this.#AFSpecial_KeystrokeEx_helper(cMask, null, true);\n }\n #AFSpecial_KeystrokeEx_helper(cMask, value, warn) {\n if (!cMask) {\n return;\n }\n const event = globalThis.event;\n value ||= this.AFMergeChange(event);\n if (!value) {\n return;\n }\n const checkers = new Map([[\"9\", char => char >= \"0\" && char <= \"9\"], [\"A\", char => \"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\"], [\"O\", char => \"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\" || \"0\" <= char && char <= \"9\"], [\"X\", char => true]]);\n function _checkValidity(_value, _cMask) {\n for (let i = 0, ii = _value.length; i < ii; i++) {\n const mask = _cMask.charAt(i);\n const char = _value.charAt(i);\n const checker = checkers.get(mask);\n if (checker) {\n if (!checker(char)) {\n return false;\n }\n } else if (mask !== char) {\n return false;\n }\n }\n return true;\n }\n const err = `${GlobalConstants.IDS_INVALID_VALUE} = \"${cMask}\"`;\n if (value.length > cMask.length) {\n if (warn) {\n this._app.alert(err);\n }\n event.rc = false;\n return;\n }\n if (event.willCommit) {\n if (value.length < cMask.length) {\n if (warn) {\n this._app.alert(err);\n }\n event.rc = false;\n return;\n }\n if (!_checkValidity(value, cMask)) {\n if (warn) {\n this._app.alert(err);\n }\n event.rc = false;\n return;\n }\n event.value += cMask.substring(value.length);\n return;\n }\n if (value.length < cMask.length) {\n cMask = cMask.substring(0, value.length);\n }\n if (!_checkValidity(value, cMask)) {\n if (warn) {\n this._app.alert(err);\n }\n event.rc = false;\n }\n }\n AFSpecial_Keystroke(psf) {\n const event = globalThis.event;\n psf = this.AFMakeNumber(psf);\n let value = this.AFMergeChange(event);\n let formatStr, secondFormatStr;\n switch (psf) {\n case 0:\n formatStr = \"99999\";\n break;\n case 1:\n formatStr = \"99999-9999\";\n break;\n case 2:\n formatStr = \"999-9999\";\n secondFormatStr = \"(999) 999-9999\";\n break;\n case 3:\n formatStr = \"999-99-9999\";\n break;\n default:\n throw new Error(\"Invalid psf in AFSpecial_Keystroke\");\n }\n const formats = secondFormatStr ? [formatStr, secondFormatStr] : [formatStr];\n for (const format of formats) {\n this.#AFSpecial_KeystrokeEx_helper(format, value, false);\n if (event.rc) {\n return;\n }\n event.rc = true;\n }\n const re = /[-()\\s]+/g;\n value = value.replaceAll(re, \"\");\n for (const format of formats) {\n this.#AFSpecial_KeystrokeEx_helper(format.replaceAll(re, \"\"), value, false);\n if (event.rc) {\n return;\n }\n event.rc = true;\n }\n this.AFSpecial_KeystrokeEx((secondFormatStr && value.match(/\\d/g) || []).length > 7 ? secondFormatStr : formatStr);\n }\n AFTime_FormatEx(cFormat) {\n this.AFDate_FormatEx(cFormat);\n }\n AFTime_Format(pdf) {\n this.AFDate_FormatEx(TimeFormats[pdf] ?? pdf);\n }\n AFTime_KeystrokeEx(cFormat) {\n this.AFDate_KeystrokeEx(cFormat);\n }\n AFTime_Keystroke(pdf) {\n if (pdf >= 0 && pdf < TimeFormats.length) {\n this.AFDate_KeystrokeEx(TimeFormats[pdf]);\n }\n }\n eMailValidate(str) {\n return this._emailRegex.test(str);\n }\n AFExactMatch(rePatterns, str) {\n if (rePatterns instanceof RegExp) {\n return str.match(rePatterns)?.[0] === str || 0;\n }\n return rePatterns.findIndex(re => str.match(re)?.[0] === str) + 1;\n }\n}\n\n;// ./src/scripting_api/event.js\n\nclass Event {\n constructor(data) {\n this.change = data.change || \"\";\n this.changeEx = data.changeEx || null;\n this.commitKey = data.commitKey || 0;\n this.fieldFull = data.fieldFull || false;\n this.keyDown = data.keyDown || false;\n this.modifier = data.modifier || false;\n this.name = data.name;\n this.rc = true;\n this.richChange = data.richChange || [];\n this.richChangeEx = data.richChangeEx || [];\n this.richValue = data.richValue || [];\n this.selEnd = data.selEnd ?? -1;\n this.selStart = data.selStart ?? -1;\n this.shift = data.shift || false;\n this.source = data.source || null;\n this.target = data.target || null;\n this.targetName = \"\";\n this.type = \"Field\";\n this.value = data.value || \"\";\n this.willCommit = data.willCommit || false;\n }\n}\nclass EventDispatcher {\n constructor(document, calculationOrder, objects, externalCall) {\n this._document = document;\n this._calculationOrder = calculationOrder;\n this._objects = objects;\n this._externalCall = externalCall;\n this._document.obj._eventDispatcher = this;\n this._isCalculating = false;\n }\n mergeChange(event) {\n let value = event.value;\n if (Array.isArray(value)) {\n return value;\n }\n if (typeof value !== \"string\") {\n value = value.toString();\n }\n const prefix = event.selStart >= 0 ? value.substring(0, event.selStart) : \"\";\n const postfix = event.selEnd >= 0 && event.selEnd <= value.length ? value.substring(event.selEnd) : \"\";\n return `${prefix}${event.change}${postfix}`;\n }\n userActivation() {\n this._document.obj._userActivation = true;\n this._externalCall(\"setTimeout\", [USERACTIVATION_CALLBACKID, USERACTIVATION_MAXTIME_VALIDITY]);\n }\n dispatch(baseEvent) {\n const id = baseEvent.id;\n if (!(id in this._objects)) {\n let event;\n if (id === \"doc\" || id === \"page\") {\n event = globalThis.event = new Event(baseEvent);\n event.source = event.target = this._document.wrapped;\n event.name = baseEvent.name;\n }\n if (id === \"doc\") {\n const eventName = event.name;\n if (eventName === \"Open\") {\n this.userActivation();\n this._document.obj._initActions();\n this.formatAll();\n }\n if (![\"DidPrint\", \"DidSave\", \"WillPrint\", \"WillSave\"].includes(eventName)) {\n this.userActivation();\n }\n this._document.obj._dispatchDocEvent(event.name);\n } else if (id === \"page\") {\n this.userActivation();\n this._document.obj._dispatchPageEvent(event.name, baseEvent.actions, baseEvent.pageNumber);\n } else if (id === \"app\" && baseEvent.name === \"ResetForm\") {\n this.userActivation();\n for (const fieldId of baseEvent.ids) {\n const obj = this._objects[fieldId];\n obj?.obj._reset();\n }\n }\n return;\n }\n const name = baseEvent.name;\n const source = this._objects[id];\n const event = globalThis.event = new Event(baseEvent);\n let savedChange;\n this.userActivation();\n if (source.obj._isButton()) {\n source.obj._id = id;\n event.value = source.obj._getExportValue(event.value);\n if (name === \"Action\") {\n source.obj._value = event.value;\n }\n }\n switch (name) {\n case \"Keystroke\":\n savedChange = {\n value: event.value,\n changeEx: event.changeEx,\n change: event.change,\n selStart: event.selStart,\n selEnd: event.selEnd\n };\n break;\n case \"Blur\":\n case \"Focus\":\n Object.defineProperty(event, \"value\", {\n configurable: false,\n writable: false,\n enumerable: true,\n value: event.value\n });\n break;\n case \"Validate\":\n this.runValidation(source, event);\n return;\n case \"Action\":\n this.runActions(source, source, event, name);\n this.runCalculate(source, event);\n return;\n }\n this.runActions(source, source, event, name);\n if (name !== \"Keystroke\") {\n return;\n }\n if (event.rc) {\n if (event.willCommit) {\n this.runValidation(source, event);\n } else {\n if (source.obj._isChoice) {\n source.obj.value = savedChange.changeEx;\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: source.obj.value\n });\n return;\n }\n const value = source.obj.value = this.mergeChange(event);\n let selStart, selEnd;\n if (event.selStart !== savedChange.selStart || event.selEnd !== savedChange.selEnd) {\n selStart = event.selStart;\n selEnd = event.selEnd;\n } else {\n selEnd = selStart = savedChange.selStart + event.change.length;\n }\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value,\n selRange: [selStart, selEnd]\n });\n }\n } else if (!event.willCommit) {\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: savedChange.value,\n selRange: [savedChange.selStart, savedChange.selEnd]\n });\n } else {\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: \"\",\n formattedValue: null,\n selRange: [0, 0]\n });\n }\n }\n formatAll() {\n const event = globalThis.event = new Event({});\n for (const source of Object.values(this._objects)) {\n event.value = source.obj._getValue();\n this.runActions(source, source, event, \"Format\");\n }\n }\n runValidation(source, event) {\n const didValidateRun = this.runActions(source, source, event, \"Validate\");\n if (event.rc) {\n source.obj.value = event.value;\n this.runCalculate(source, event);\n const savedValue = event.value = source.obj._getValue();\n const formattedValue = this.runActions(source, source, event, \"Format\") ? event.value?.toString?.() : null;\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: savedValue,\n formattedValue\n });\n event.value = savedValue;\n } else if (didValidateRun) {\n source.obj._send({\n id: source.obj._id,\n siblings: source.obj._siblings,\n value: \"\",\n formattedValue: null,\n selRange: [0, 0],\n focus: true\n });\n }\n }\n runActions(source, target, event, eventName) {\n event.source = source.wrapped;\n event.target = target.wrapped;\n event.name = eventName;\n event.targetName = target.obj.name;\n event.rc = true;\n return target.obj._runActions(event);\n }\n calculateNow() {\n if (!this._calculationOrder || this._isCalculating || !this._document.obj.calculate) {\n return;\n }\n this._isCalculating = true;\n const first = this._calculationOrder[0];\n const source = this._objects[first];\n globalThis.event = new Event({});\n this.runCalculate(source, globalThis.event);\n this._isCalculating = false;\n }\n runCalculate(source, event) {\n if (!this._calculationOrder || !this._document.obj.calculate) {\n return;\n }\n for (const targetId of this._calculationOrder) {\n if (!(targetId in this._objects)) {\n continue;\n }\n if (!this._document.obj.calculate) {\n break;\n }\n event.value = null;\n const target = this._objects[targetId];\n let savedValue = target.obj._getValue();\n this.runActions(source, target, event, \"Calculate\");\n if (!event.rc) {\n continue;\n }\n if (event.value !== null) {\n target.obj.value = event.value;\n } else {\n event.value = target.obj._getValue();\n }\n this.runActions(target, target, event, \"Validate\");\n if (!event.rc) {\n if (target.obj._getValue() !== savedValue) {\n target.wrapped.value = savedValue;\n }\n continue;\n }\n if (event.value === null) {\n event.value = target.obj._getValue();\n }\n savedValue = target.obj._getValue();\n const formattedValue = this.runActions(target, target, event, \"Format\") ? event.value?.toString?.() : null;\n target.obj._send({\n id: target.obj._id,\n siblings: target.obj._siblings,\n value: savedValue,\n formattedValue\n });\n }\n }\n}\n\n;// ./src/scripting_api/fullscreen.js\n\n\nclass FullScreen extends PDFObject {\n _backgroundColor = [];\n _clickAdvances = true;\n _cursor = Cursor.hidden;\n _defaultTransition = \"\";\n _escapeExits = true;\n _isFullScreen = true;\n _loop = false;\n _timeDelay = 3600;\n _usePageTiming = false;\n _useTimer = false;\n get backgroundColor() {\n return this._backgroundColor;\n }\n set backgroundColor(_) {}\n get clickAdvances() {\n return this._clickAdvances;\n }\n set clickAdvances(_) {}\n get cursor() {\n return this._cursor;\n }\n set cursor(_) {}\n get defaultTransition() {\n return this._defaultTransition;\n }\n set defaultTransition(_) {}\n get escapeExits() {\n return this._escapeExits;\n }\n set escapeExits(_) {}\n get isFullScreen() {\n return this._isFullScreen;\n }\n set isFullScreen(_) {}\n get loop() {\n return this._loop;\n }\n set loop(_) {}\n get timeDelay() {\n return this._timeDelay;\n }\n set timeDelay(_) {}\n get transitions() {\n return [\"Replace\", \"WipeRight\", \"WipeLeft\", \"WipeDown\", \"WipeUp\", \"SplitHorizontalIn\", \"SplitHorizontalOut\", \"SplitVerticalIn\", \"SplitVerticalOut\", \"BlindsHorizontal\", \"BlindsVertical\", \"BoxIn\", \"BoxOut\", \"GlitterRight\", \"GlitterDown\", \"GlitterRightDown\", \"Dissolve\", \"Random\"];\n }\n set transitions(_) {\n throw new Error(\"fullscreen.transitions is read-only\");\n }\n get usePageTiming() {\n return this._usePageTiming;\n }\n set usePageTiming(_) {}\n get useTimer() {\n return this._useTimer;\n }\n set useTimer(_) {}\n}\n\n;// ./src/scripting_api/thermometer.js\n\nclass Thermometer extends PDFObject {\n _cancelled = false;\n _duration = 100;\n _text = \"\";\n _value = 0;\n get cancelled() {\n return this._cancelled;\n }\n set cancelled(_) {\n throw new Error(\"thermometer.cancelled is read-only\");\n }\n get duration() {\n return this._duration;\n }\n set duration(val) {\n this._duration = val;\n }\n get text() {\n return this._text;\n }\n set text(val) {\n this._text = val;\n }\n get value() {\n return this._value;\n }\n set value(val) {\n this._value = val;\n }\n begin() {}\n end() {}\n}\n\n;// ./src/scripting_api/app.js\n\n\n\n\n\n\nclass App extends PDFObject {\n constructor(data) {\n super(data);\n this._constants = null;\n this._focusRect = true;\n this._fs = null;\n this._language = App._getLanguage(data.language);\n this._openInPlace = false;\n this._platform = App._getPlatform(data.platform);\n this._runtimeHighlight = false;\n this._runtimeHighlightColor = [\"T\"];\n this._thermometer = null;\n this._toolbar = false;\n this._document = data._document;\n this._proxyHandler = data.proxyHandler;\n this._objects = Object.create(null);\n this._eventDispatcher = new EventDispatcher(this._document, data.calculationOrder, this._objects, data.externalCall);\n this._timeoutIds = new WeakMap();\n this._timeoutIdsRegistry = new FinalizationRegistry(this._cleanTimeout.bind(this));\n this._timeoutCallbackIds = new Map();\n this._timeoutCallbackId = USERACTIVATION_CALLBACKID + 1;\n this._globalEval = data.globalEval;\n this._externalCall = data.externalCall;\n }\n _dispatchEvent(pdfEvent) {\n this._eventDispatcher.dispatch(pdfEvent);\n }\n _registerTimeoutCallback(cExpr) {\n const id = this._timeoutCallbackId++;\n this._timeoutCallbackIds.set(id, cExpr);\n return id;\n }\n _unregisterTimeoutCallback(id) {\n this._timeoutCallbackIds.delete(id);\n }\n _evalCallback({\n callbackId,\n interval\n }) {\n const documentObj = this._document.obj;\n if (callbackId === USERACTIVATION_CALLBACKID) {\n documentObj._userActivation = false;\n return;\n }\n const expr = this._timeoutCallbackIds.get(callbackId);\n if (!interval) {\n this._unregisterTimeoutCallback(callbackId);\n }\n if (expr) {\n const saveUserActivation = documentObj._userActivation;\n documentObj._userActivation = false;\n this._globalEval(expr);\n documentObj._userActivation = saveUserActivation;\n }\n }\n _registerTimeout(callbackId, interval) {\n const timeout = Object.create(null);\n const id = {\n callbackId,\n interval\n };\n this._timeoutIds.set(timeout, id);\n this._timeoutIdsRegistry.register(timeout, id);\n return timeout;\n }\n _unregisterTimeout(timeout) {\n this._timeoutIdsRegistry.unregister(timeout);\n const data = this._timeoutIds.get(timeout);\n if (!data) {\n return;\n }\n this._timeoutIds.delete(timeout);\n this._cleanTimeout(data);\n }\n _cleanTimeout({\n callbackId,\n interval\n }) {\n this._unregisterTimeoutCallback(callbackId);\n if (interval) {\n this._externalCall(\"clearInterval\", [callbackId]);\n } else {\n this._externalCall(\"clearTimeout\", [callbackId]);\n }\n }\n static _getPlatform(platform) {\n if (typeof platform === \"string\") {\n platform = platform.toLowerCase();\n if (platform.includes(\"win\")) {\n return \"WIN\";\n } else if (platform.includes(\"mac\")) {\n return \"MAC\";\n }\n }\n return \"UNIX\";\n }\n static _getLanguage(language) {\n const [main, sub] = language.toLowerCase().split(/[-_]/, 2);\n switch (main) {\n case \"zh\":\n return sub === \"cn\" || sub === \"sg\" ? \"CHS\" : \"CHT\";\n case \"da\":\n return \"DAN\";\n case \"de\":\n return \"DEU\";\n case \"es\":\n return \"ESP\";\n case \"fr\":\n return \"FRA\";\n case \"it\":\n return \"ITA\";\n case \"ko\":\n return \"KOR\";\n case \"ja\":\n return \"JPN\";\n case \"nl\":\n return \"NLD\";\n case \"no\":\n return \"NOR\";\n case \"pt\":\n return sub === \"br\" ? \"PTB\" : \"ENU\";\n case \"fi\":\n return \"SUO\";\n case \"SV\":\n return \"SVE\";\n default:\n return \"ENU\";\n }\n }\n get activeDocs() {\n return [this._document.wrapped];\n }\n set activeDocs(_) {\n throw new Error(\"app.activeDocs is read-only\");\n }\n get calculate() {\n return this._document.obj.calculate;\n }\n set calculate(calculate) {\n this._document.obj.calculate = calculate;\n }\n get constants() {\n return this._constants ??= Object.freeze({\n align: Object.freeze({\n left: 0,\n center: 1,\n right: 2,\n top: 3,\n bottom: 4\n })\n });\n }\n set constants(_) {\n throw new Error(\"app.constants is read-only\");\n }\n get focusRect() {\n return this._focusRect;\n }\n set focusRect(val) {\n this._focusRect = val;\n }\n get formsVersion() {\n return FORMS_VERSION;\n }\n set formsVersion(_) {\n throw new Error(\"app.formsVersion is read-only\");\n }\n get fromPDFConverters() {\n return [];\n }\n set fromPDFConverters(_) {\n throw new Error(\"app.fromPDFConverters is read-only\");\n }\n get fs() {\n return this._fs ??= new Proxy(new FullScreen({\n send: this._send\n }), this._proxyHandler);\n }\n set fs(_) {\n throw new Error(\"app.fs is read-only\");\n }\n get language() {\n return this._language;\n }\n set language(_) {\n throw new Error(\"app.language is read-only\");\n }\n get media() {\n return undefined;\n }\n set media(_) {\n throw new Error(\"app.media is read-only\");\n }\n get monitors() {\n return [];\n }\n set monitors(_) {\n throw new Error(\"app.monitors is read-only\");\n }\n get numPlugins() {\n return 0;\n }\n set numPlugins(_) {\n throw new Error(\"app.numPlugins is read-only\");\n }\n get openInPlace() {\n return this._openInPlace;\n }\n set openInPlace(val) {\n this._openInPlace = val;\n }\n get platform() {\n return this._platform;\n }\n set platform(_) {\n throw new Error(\"app.platform is read-only\");\n }\n get plugins() {\n return [];\n }\n set plugins(_) {\n throw new Error(\"app.plugins is read-only\");\n }\n get printColorProfiles() {\n return [];\n }\n set printColorProfiles(_) {\n throw new Error(\"app.printColorProfiles is read-only\");\n }\n get printerNames() {\n return [];\n }\n set printerNames(_) {\n throw new Error(\"app.printerNames is read-only\");\n }\n get runtimeHighlight() {\n return this._runtimeHighlight;\n }\n set runtimeHighlight(val) {\n this._runtimeHighlight = val;\n }\n get runtimeHighlightColor() {\n return this._runtimeHighlightColor;\n }\n set runtimeHighlightColor(val) {\n if (Color._isValidColor(val)) {\n this._runtimeHighlightColor = val;\n }\n }\n get thermometer() {\n return this._thermometer ??= new Proxy(new Thermometer({\n send: this._send\n }), this._proxyHandler);\n }\n set thermometer(_) {\n throw new Error(\"app.thermometer is read-only\");\n }\n get toolbar() {\n return this._toolbar;\n }\n set toolbar(val) {\n this._toolbar = val;\n }\n get toolbarHorizontal() {\n return this.toolbar;\n }\n set toolbarHorizontal(value) {\n this.toolbar = value;\n }\n get toolbarVertical() {\n return this.toolbar;\n }\n set toolbarVertical(value) {\n this.toolbar = value;\n }\n get viewerType() {\n return VIEWER_TYPE;\n }\n set viewerType(_) {\n throw new Error(\"app.viewerType is read-only\");\n }\n get viewerVariation() {\n return VIEWER_VARIATION;\n }\n set viewerVariation(_) {\n throw new Error(\"app.viewerVariation is read-only\");\n }\n get viewerVersion() {\n return VIEWER_VERSION;\n }\n set viewerVersion(_) {\n throw new Error(\"app.viewerVersion is read-only\");\n }\n addMenuItem() {}\n addSubMenu() {}\n addToolButton() {}\n alert(cMsg, nIcon = 0, nType = 0, cTitle = \"PDF.js\", oDoc = null, oCheckbox = null) {\n if (!this._document.obj._userActivation) {\n return 0;\n }\n this._document.obj._userActivation = false;\n if (cMsg && typeof cMsg === \"object\") {\n nType = cMsg.nType;\n cMsg = cMsg.cMsg;\n }\n cMsg = (cMsg || \"\").toString();\n if (!cMsg) {\n return 0;\n }\n nType = typeof nType !== \"number\" || isNaN(nType) || nType < 0 || nType > 3 ? 0 : nType;\n if (nType >= 2) {\n return this._externalCall(\"confirm\", [cMsg]) ? 4 : 3;\n }\n this._externalCall(\"alert\", [cMsg]);\n return 1;\n }\n beep() {}\n beginPriv() {}\n browseForDoc() {}\n clearInterval(oInterval) {\n this._unregisterTimeout(oInterval);\n }\n clearTimeOut(oTime) {\n this._unregisterTimeout(oTime);\n }\n endPriv() {}\n execDialog() {}\n execMenuItem(item) {\n if (!this._document.obj._userActivation) {\n return;\n }\n this._document.obj._userActivation = false;\n switch (item) {\n case \"SaveAs\":\n if (this._document.obj._disableSaving) {\n return;\n }\n this._send({\n command: item\n });\n break;\n case \"FirstPage\":\n case \"LastPage\":\n case \"NextPage\":\n case \"PrevPage\":\n case \"ZoomViewIn\":\n case \"ZoomViewOut\":\n this._send({\n command: item\n });\n break;\n case \"FitPage\":\n this._send({\n command: \"zoom\",\n value: \"page-fit\"\n });\n break;\n case \"Print\":\n if (this._document.obj._disablePrinting) {\n return;\n }\n this._send({\n command: \"print\"\n });\n break;\n }\n }\n getNthPlugInName() {}\n getPath() {}\n goBack() {}\n goForward() {}\n hideMenuItem() {}\n hideToolbarButton() {}\n launchURL() {}\n listMenuItems() {}\n listToolbarButtons() {}\n loadPolicyFile() {}\n mailGetAddrs() {}\n mailMsg() {}\n newDoc() {}\n newCollection() {}\n newFDF() {}\n openDoc() {}\n openFDF() {}\n popUpMenu() {}\n popUpMenuEx() {}\n removeToolButton() {}\n response(cQuestion, cTitle = \"\", cDefault = \"\", bPassword = \"\", cLabel = \"\") {\n if (!this._document.obj._userActivation) {\n return null;\n }\n this._document.obj._userActivation = false;\n if (cQuestion && typeof cQuestion === \"object\") {\n cDefault = cQuestion.cDefault;\n cQuestion = cQuestion.cQuestion;\n }\n cQuestion = (cQuestion || \"\").toString();\n cDefault = (cDefault || \"\").toString();\n return this._externalCall(\"prompt\", [cQuestion, cDefault || \"\"]);\n }\n setInterval(cExpr, nMilliseconds = 0) {\n if (cExpr && typeof cExpr === \"object\") {\n nMilliseconds = cExpr.nMilliseconds || 0;\n cExpr = cExpr.cExpr;\n }\n if (typeof cExpr !== \"string\") {\n throw new TypeError(\"First argument of app.setInterval must be a string\");\n }\n if (typeof nMilliseconds !== \"number\") {\n throw new TypeError(\"Second argument of app.setInterval must be a number\");\n }\n const callbackId = this._registerTimeoutCallback(cExpr);\n this._externalCall(\"setInterval\", [callbackId, nMilliseconds]);\n return this._registerTimeout(callbackId, true);\n }\n setTimeOut(cExpr, nMilliseconds = 0) {\n if (cExpr && typeof cExpr === \"object\") {\n nMilliseconds = cExpr.nMilliseconds || 0;\n cExpr = cExpr.cExpr;\n }\n if (typeof cExpr !== \"string\") {\n throw new TypeError(\"First argument of app.setTimeOut must be a string\");\n }\n if (typeof nMilliseconds !== \"number\") {\n throw new TypeError(\"Second argument of app.setTimeOut must be a number\");\n }\n const callbackId = this._registerTimeoutCallback(cExpr);\n this._externalCall(\"setTimeout\", [callbackId, nMilliseconds]);\n return this._registerTimeout(callbackId, false);\n }\n trustedFunction() {}\n trustPropagatorFunction() {}\n}\n\n;// ./src/scripting_api/console.js\n\nclass Console extends PDFObject {\n clear() {\n this._send({\n id: \"clear\"\n });\n }\n hide() {}\n println(msg) {\n if (typeof msg !== \"string\") {\n try {\n msg = JSON.stringify(msg);\n } catch {\n msg = msg.toString?.() || \"[Unserializable object]\";\n }\n }\n this._send({\n command: \"println\",\n value: \"PDF.js Console:: \" + msg\n });\n }\n show() {}\n}\n\n;// ./src/scripting_api/print_params.js\nclass PrintParams {\n binaryOk = true;\n bitmapDPI = 150;\n booklet = {\n binding: 0,\n duplexMode: 0,\n subsetFrom: 0,\n subsetTo: -1\n };\n colorOverride = 0;\n colorProfile = \"\";\n constants = Object.freeze({\n bookletBindings: Object.freeze({\n Left: 0,\n Right: 1,\n LeftTall: 2,\n RightTall: 3\n }),\n bookletDuplexMode: Object.freeze({\n BothSides: 0,\n FrontSideOnly: 1,\n BasicSideOnly: 2\n }),\n colorOverrides: Object.freeze({\n auto: 0,\n gray: 1,\n mono: 2\n }),\n fontPolicies: Object.freeze({\n everyPage: 0,\n jobStart: 1,\n pageRange: 2\n }),\n handling: Object.freeze({\n none: 0,\n fit: 1,\n shrink: 2,\n tileAll: 3,\n tileLarge: 4,\n nUp: 5,\n booklet: 6\n }),\n interactionLevel: Object.freeze({\n automatic: 0,\n full: 1,\n silent: 2\n }),\n nUpPageOrders: Object.freeze({\n Horizontal: 0,\n HorizontalReversed: 1,\n Vertical: 2\n }),\n printContents: Object.freeze({\n doc: 0,\n docAndComments: 1,\n formFieldsOnly: 2\n }),\n flagValues: Object.freeze({\n applyOverPrint: 1,\n applySoftProofSettings: 1 << 1,\n applyWorkingColorSpaces: 1 << 2,\n emitHalftones: 1 << 3,\n emitPostScriptXObjects: 1 << 4,\n emitFormsAsPSForms: 1 << 5,\n maxJP2KRes: 1 << 6,\n setPageSize: 1 << 7,\n suppressBG: 1 << 8,\n suppressCenter: 1 << 9,\n suppressCJKFontSubst: 1 << 10,\n suppressCropClip: 1 << 11,\n suppressRotate: 1 << 12,\n suppressTransfer: 1 << 13,\n suppressUCR: 1 << 14,\n useTrapAnnots: 1 << 15,\n usePrintersMarks: 1 << 16\n }),\n rasterFlagValues: Object.freeze({\n textToOutline: 1,\n strokesToOutline: 1 << 1,\n allowComplexClip: 1 << 2,\n preserveOverprint: 1 << 3\n }),\n subsets: Object.freeze({\n all: 0,\n even: 1,\n odd: 2\n }),\n tileMarks: Object.freeze({\n none: 0,\n west: 1,\n east: 2\n }),\n usages: Object.freeze({\n auto: 0,\n use: 1,\n noUse: 2\n })\n });\n downloadFarEastFonts = false;\n fileName = \"\";\n firstPage = 0;\n flags = 0;\n fontPolicy = 0;\n gradientDPI = 150;\n interactive = 1;\n npUpAutoRotate = false;\n npUpNumPagesH = 2;\n npUpNumPagesV = 2;\n npUpPageBorder = false;\n npUpPageOrder = 0;\n pageHandling = 0;\n pageSubset = 0;\n printAsImage = false;\n printContent = 0;\n printerName = \"\";\n psLevel = 0;\n rasterFlags = 0;\n reversePages = false;\n tileLabel = false;\n tileMark = 0;\n tileOverlap = 0;\n tileScale = 1.0;\n transparencyLevel = 75;\n usePrinterCRD = 0;\n useT1Conversion = 0;\n constructor(data) {\n this.lastPage = data.lastPage;\n }\n}\n\n;// ./src/scripting_api/doc.js\n\n\n\n\n\nconst DOC_EXTERNAL = false;\nclass InfoProxyHandler {\n static get(obj, prop) {\n return obj[prop.toLowerCase()];\n }\n static set(obj, prop, value) {\n throw new Error(`doc.info.${prop} is read-only`);\n }\n}\nclass Doc extends PDFObject {\n #pageActions = null;\n #otherPageActions = null;\n constructor(data) {\n super(data);\n this._expandos = globalThis;\n this._baseURL = data.baseURL || \"\";\n this._calculate = true;\n this._delay = false;\n this._dirty = false;\n this._disclosed = false;\n this._media = undefined;\n this._metadata = data.metadata || \"\";\n this._noautocomplete = undefined;\n this._nocache = undefined;\n this._spellDictionaryOrder = [];\n this._spellLanguageOrder = [];\n this._printParams = null;\n this._fields = new Map();\n this._fieldNames = [];\n this._event = null;\n this._author = data.Author || \"\";\n this._creator = data.Creator || \"\";\n this._creationDate = this._getDate(data.CreationDate) || null;\n this._docID = data.docID || [\"\", \"\"];\n this._documentFileName = data.filename || \"\";\n this._filesize = data.filesize || 0;\n this._keywords = data.Keywords || \"\";\n this._layout = data.layout || \"\";\n this._modDate = this._getDate(data.ModDate) || null;\n this._numFields = 0;\n this._numPages = data.numPages || 1;\n this._pageNum = data.pageNum || 0;\n this._producer = data.Producer || \"\";\n this._securityHandler = data.EncryptFilterName || null;\n this._subject = data.Subject || \"\";\n this._title = data.Title || \"\";\n this._URL = data.URL || \"\";\n this._info = new Proxy({\n title: this._title,\n author: this._author,\n authors: data.authors || [this._author],\n subject: this._subject,\n keywords: this._keywords,\n creator: this._creator,\n producer: this._producer,\n creationdate: this._creationDate,\n moddate: this._modDate,\n trapped: data.Trapped || \"Unknown\"\n }, InfoProxyHandler);\n this._zoomType = ZoomType.none;\n this._zoom = data.zoom || 100;\n this._actions = createActionsMap(data.actions);\n this._globalEval = data.globalEval;\n this._userActivation = false;\n this._disablePrinting = false;\n this._disableSaving = false;\n }\n _initActions() {\n for (const {\n obj\n } of this._fields.values()) {\n const initialValue = obj._initialValue;\n if (initialValue) {\n this._send({\n id: obj._id,\n siblings: obj._siblings,\n value: initialValue,\n formattedValue: obj.value.toString()\n });\n }\n }\n const dontRun = new Set([\"WillClose\", \"WillSave\", \"DidSave\", \"WillPrint\", \"DidPrint\", \"OpenAction\"]);\n this._disableSaving = true;\n for (const actionName of this._actions.keys()) {\n if (!dontRun.has(actionName)) {\n this._runActions(actionName);\n }\n }\n this._runActions(\"OpenAction\");\n this._disableSaving = false;\n }\n _dispatchDocEvent(name) {\n switch (name) {\n case \"Open\":\n this._disableSaving = true;\n this._runActions(\"OpenAction\");\n this._disableSaving = false;\n break;\n case \"WillPrint\":\n this._disablePrinting = true;\n try {\n this._runActions(name);\n } catch (error) {\n this._send(serializeError(error));\n }\n this._send({\n command: \"WillPrintFinished\"\n });\n this._disablePrinting = false;\n break;\n case \"WillSave\":\n this._disableSaving = true;\n this._runActions(name);\n this._disableSaving = false;\n break;\n default:\n this._runActions(name);\n }\n }\n _dispatchPageEvent(name, actions, pageNumber) {\n if (name === \"PageOpen\") {\n this.#pageActions ??= new Map();\n if (!this.#pageActions.has(pageNumber)) {\n this.#pageActions.set(pageNumber, createActionsMap(actions));\n }\n this._pageNum = pageNumber - 1;\n }\n for (const acts of [this.#pageActions, this.#otherPageActions]) {\n actions = acts?.get(pageNumber)?.get(name);\n if (actions) {\n for (const action of actions) {\n this._globalEval(action);\n }\n }\n }\n }\n _runActions(name) {\n const actions = this._actions.get(name);\n if (!actions) {\n return;\n }\n for (const action of actions) {\n try {\n this._globalEval(action);\n } catch (error) {\n const serializedError = serializeError(error);\n serializedError.value = `Error when executing \"${name}\" for document\\n${serializedError.value}`;\n this._send(serializedError);\n }\n }\n }\n _addField(name, field) {\n this._fields.set(name, field);\n this._fieldNames.push(name);\n this._numFields++;\n const po = field.obj._actions.get(\"PageOpen\");\n const pc = field.obj._actions.get(\"PageClose\");\n if (po || pc) {\n this.#otherPageActions ??= new Map();\n const actions = this.#otherPageActions.getOrInsertComputed(field.obj._page + 1, makeMap);\n if (po) {\n actions.getOrInsertComputed(\"PageOpen\", makeArr).push(...po);\n }\n if (pc) {\n actions.getOrInsertComputed(\"PageClose\", makeArr).push(...pc);\n }\n }\n }\n _getDate(date) {\n if (!date || date.length < 15 || !date.startsWith(\"D:\")) {\n return date;\n }\n date = date.substring(2);\n const year = date.substring(0, 4);\n const month = date.substring(4, 6);\n const day = date.substring(6, 8);\n const hour = date.substring(8, 10);\n const minute = date.substring(10, 12);\n const o = date.charAt(12);\n let second, offsetPos;\n if (o === \"Z\" || o === \"+\" || o === \"-\") {\n second = \"00\";\n offsetPos = 12;\n } else {\n second = date.substring(12, 14);\n offsetPos = 14;\n }\n const offset = date.substring(offsetPos).replaceAll(\"'\", \"\");\n return new Date(`${year}-${month}-${day}T${hour}:${minute}:${second}${offset}`);\n }\n get author() {\n return this._author;\n }\n set author(_) {\n throw new Error(\"doc.author is read-only\");\n }\n get baseURL() {\n return this._baseURL;\n }\n set baseURL(baseURL) {\n this._baseURL = baseURL;\n }\n get bookmarkRoot() {\n return undefined;\n }\n set bookmarkRoot(_) {\n throw new Error(\"doc.bookmarkRoot is read-only\");\n }\n get calculate() {\n return this._calculate;\n }\n set calculate(calculate) {\n this._calculate = calculate;\n }\n get creator() {\n return this._creator;\n }\n set creator(_) {\n throw new Error(\"doc.creator is read-only\");\n }\n get dataObjects() {\n return [];\n }\n set dataObjects(_) {\n throw new Error(\"doc.dataObjects is read-only\");\n }\n get delay() {\n return this._delay;\n }\n set delay(delay) {\n this._delay = delay;\n }\n get dirty() {\n return this._dirty;\n }\n set dirty(dirty) {\n this._dirty = dirty;\n }\n get disclosed() {\n return this._disclosed;\n }\n set disclosed(disclosed) {\n this._disclosed = disclosed;\n }\n get docID() {\n return this._docID;\n }\n set docID(_) {\n throw new Error(\"doc.docID is read-only\");\n }\n get documentFileName() {\n return this._documentFileName;\n }\n set documentFileName(_) {\n throw new Error(\"doc.documentFileName is read-only\");\n }\n get dynamicXFAForm() {\n return false;\n }\n set dynamicXFAForm(_) {\n throw new Error(\"doc.dynamicXFAForm is read-only\");\n }\n get external() {\n return DOC_EXTERNAL;\n }\n set external(_) {\n throw new Error(\"doc.external is read-only\");\n }\n get filesize() {\n return this._filesize;\n }\n set filesize(_) {\n throw new Error(\"doc.filesize is read-only\");\n }\n get hidden() {\n return false;\n }\n set hidden(_) {\n throw new Error(\"doc.hidden is read-only\");\n }\n get hostContainer() {\n return undefined;\n }\n set hostContainer(_) {\n throw new Error(\"doc.hostContainer is read-only\");\n }\n get icons() {\n return undefined;\n }\n set icons(_) {\n throw new Error(\"doc.icons is read-only\");\n }\n get info() {\n return this._info;\n }\n set info(_) {\n throw new Error(\"doc.info is read-only\");\n }\n get innerAppWindowRect() {\n return [0, 0, 0, 0];\n }\n set innerAppWindowRect(_) {\n throw new Error(\"doc.innerAppWindowRect is read-only\");\n }\n get innerDocWindowRect() {\n return [0, 0, 0, 0];\n }\n set innerDocWindowRect(_) {\n throw new Error(\"doc.innerDocWindowRect is read-only\");\n }\n get isModal() {\n return false;\n }\n set isModal(_) {\n throw new Error(\"doc.isModal is read-only\");\n }\n get keywords() {\n return this._keywords;\n }\n set keywords(_) {\n throw new Error(\"doc.keywords is read-only\");\n }\n get layout() {\n return this._layout;\n }\n set layout(value) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof value !== \"string\") {\n return;\n }\n if (value !== \"SinglePage\" && value !== \"OneColumn\" && value !== \"TwoColumnLeft\" && value !== \"TwoPageLeft\" && value !== \"TwoColumnRight\" && value !== \"TwoPageRight\") {\n value = \"SinglePage\";\n }\n this._send({\n command: \"layout\",\n value\n });\n this._layout = value;\n }\n get media() {\n return this._media;\n }\n set media(media) {\n this._media = media;\n }\n get metadata() {\n return this._metadata;\n }\n set metadata(metadata) {\n this._metadata = metadata;\n }\n get modDate() {\n return this._modDate;\n }\n set modDate(_) {\n throw new Error(\"doc.modDate is read-only\");\n }\n get mouseX() {\n return 0;\n }\n set mouseX(_) {\n throw new Error(\"doc.mouseX is read-only\");\n }\n get mouseY() {\n return 0;\n }\n set mouseY(_) {\n throw new Error(\"doc.mouseY is read-only\");\n }\n get noautocomplete() {\n return this._noautocomplete;\n }\n set noautocomplete(noautocomplete) {\n this._noautocomplete = noautocomplete;\n }\n get nocache() {\n return this._nocache;\n }\n set nocache(nocache) {\n this._nocache = nocache;\n }\n get numFields() {\n return this._numFields;\n }\n set numFields(_) {\n throw new Error(\"doc.numFields is read-only\");\n }\n get numPages() {\n return this._numPages;\n }\n set numPages(_) {\n throw new Error(\"doc.numPages is read-only\");\n }\n get numTemplates() {\n return 0;\n }\n set numTemplates(_) {\n throw new Error(\"doc.numTemplates is read-only\");\n }\n get outerAppWindowRect() {\n return [0, 0, 0, 0];\n }\n set outerAppWindowRect(_) {\n throw new Error(\"doc.outerAppWindowRect is read-only\");\n }\n get outerDocWindowRect() {\n return [0, 0, 0, 0];\n }\n set outerDocWindowRect(_) {\n throw new Error(\"doc.outerDocWindowRect is read-only\");\n }\n get pageNum() {\n return this._pageNum;\n }\n set pageNum(value) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof value !== \"number\" || value < 0 || value >= this._numPages) {\n return;\n }\n this._send({\n command: \"page-num\",\n value\n });\n this._pageNum = value;\n }\n get pageWindowRect() {\n return [0, 0, 0, 0];\n }\n set pageWindowRect(_) {\n throw new Error(\"doc.pageWindowRect is read-only\");\n }\n get path() {\n return \"\";\n }\n set path(_) {\n throw new Error(\"doc.path is read-only\");\n }\n get permStatusReady() {\n return true;\n }\n set permStatusReady(_) {\n throw new Error(\"doc.permStatusReady is read-only\");\n }\n get producer() {\n return this._producer;\n }\n set producer(_) {\n throw new Error(\"doc.producer is read-only\");\n }\n get requiresFullSave() {\n return false;\n }\n set requiresFullSave(_) {\n throw new Error(\"doc.requiresFullSave is read-only\");\n }\n get securityHandler() {\n return this._securityHandler;\n }\n set securityHandler(_) {\n throw new Error(\"doc.securityHandler is read-only\");\n }\n get selectedAnnots() {\n return [];\n }\n set selectedAnnots(_) {\n throw new Error(\"doc.selectedAnnots is read-only\");\n }\n get sounds() {\n return [];\n }\n set sounds(_) {\n throw new Error(\"doc.sounds is read-only\");\n }\n get spellDictionaryOrder() {\n return this._spellDictionaryOrder;\n }\n set spellDictionaryOrder(spellDictionaryOrder) {\n this._spellDictionaryOrder = spellDictionaryOrder;\n }\n get spellLanguageOrder() {\n return this._spellLanguageOrder;\n }\n set spellLanguageOrder(spellLanguageOrder) {\n this._spellLanguageOrder = spellLanguageOrder;\n }\n get subject() {\n return this._subject;\n }\n set subject(_) {\n throw new Error(\"doc.subject is read-only\");\n }\n get templates() {\n return [];\n }\n set templates(_) {\n throw new Error(\"doc.templates is read-only\");\n }\n get title() {\n return this._title;\n }\n set title(_) {\n throw new Error(\"doc.title is read-only\");\n }\n get URL() {\n return this._URL;\n }\n set URL(_) {\n throw new Error(\"doc.URL is read-only\");\n }\n get viewState() {\n return undefined;\n }\n set viewState(_) {\n throw new Error(\"doc.viewState is read-only\");\n }\n get xfa() {\n return this._xfa;\n }\n set xfa(_) {\n throw new Error(\"doc.xfa is read-only\");\n }\n get XFAForeground() {\n return false;\n }\n set XFAForeground(_) {\n throw new Error(\"doc.XFAForeground is read-only\");\n }\n get zoomType() {\n return this._zoomType;\n }\n set zoomType(type) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof type !== \"string\") {\n return;\n }\n switch (type) {\n case ZoomType.none:\n this._send({\n command: \"zoom\",\n value: 1\n });\n break;\n case ZoomType.fitP:\n this._send({\n command: \"zoom\",\n value: \"page-fit\"\n });\n break;\n case ZoomType.fitW:\n this._send({\n command: \"zoom\",\n value: \"page-width\"\n });\n break;\n case ZoomType.fitH:\n this._send({\n command: \"zoom\",\n value: \"page-height\"\n });\n break;\n case ZoomType.fitV:\n this._send({\n command: \"zoom\",\n value: \"auto\"\n });\n break;\n case ZoomType.pref:\n case ZoomType.refW:\n break;\n default:\n return;\n }\n this._zoomType = type;\n }\n get zoom() {\n return this._zoom;\n }\n set zoom(value) {\n if (!this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (typeof value !== \"number\" || value < 8.33 || value > 6400) {\n return;\n }\n this._send({\n command: \"zoom\",\n value: value / 100\n });\n }\n addAnnot() {}\n addField() {}\n addIcon() {}\n addLink() {}\n addRecipientListCryptFilter() {}\n addRequirement() {}\n addScript() {}\n addThumbnails() {}\n addWatermarkFromFile() {}\n addWatermarkFromText() {}\n addWeblinks() {}\n bringToFront() {}\n calculateNow() {\n this._eventDispatcher.calculateNow();\n }\n closeDoc() {}\n colorConvertPage() {}\n createDataObject() {}\n createTemplate() {}\n deletePages() {}\n deleteSound() {}\n embedDocAsDataObject() {}\n embedOutputIntent() {}\n encryptForRecipients() {}\n encryptUsingPolicy() {}\n exportAsFDF() {}\n exportAsFDFStr() {}\n exportAsText() {}\n exportAsXFDF() {}\n exportAsXFDFStr() {}\n exportDataObject() {}\n exportXFAData() {}\n extractPages() {}\n flattenPages() {}\n getAnnot() {}\n getAnnots() {}\n getAnnot3D() {}\n getAnnots3D() {}\n getColorConvertAction() {}\n getDataObject() {}\n getDataObjectContents() {}\n _getField(cName) {\n if (cName && typeof cName === \"object\") {\n cName = cName.cName;\n }\n if (typeof cName !== \"string\") {\n throw new TypeError(\"Invalid field name: must be a string\");\n }\n const searchedField = this._fields.get(cName);\n if (searchedField) {\n return searchedField;\n }\n const parts = cName.split(\"#\");\n let childIndex = NaN;\n if (parts.length === 2) {\n childIndex = Math.floor(parseFloat(parts[1]));\n cName = parts[0];\n }\n for (const [name, field] of this._fields) {\n if (name.endsWith(cName)) {\n if (!isNaN(childIndex)) {\n const children = this._getChildren(name);\n if (childIndex < 0 || childIndex >= children.length) {\n childIndex = 0;\n }\n if (childIndex < children.length) {\n this._fields.set(cName, children[childIndex]);\n return children[childIndex];\n }\n }\n this._fields.set(cName, field);\n return field;\n }\n }\n return null;\n }\n getField(cName) {\n const field = this._getField(cName);\n if (!field) {\n return null;\n }\n return field.wrapped;\n }\n _getChildren(fieldName) {\n const len = fieldName.length;\n const children = [];\n const pattern = /^\\.[^.]+$/;\n for (const [name, field] of this._fields) {\n if (name.startsWith(fieldName)) {\n const finalPart = name.slice(len);\n if (pattern.test(finalPart)) {\n children.push(field);\n }\n }\n }\n return children;\n }\n _getTerminalChildren(fieldName) {\n const children = [];\n const len = fieldName.length;\n for (const [name, field] of this._fields) {\n if (name.startsWith(fieldName)) {\n const finalPart = name.slice(len);\n if (field.obj._hasValue && (finalPart === \"\" || finalPart.startsWith(\".\"))) {\n children.push(field.wrapped);\n }\n }\n }\n return children;\n }\n getIcon() {}\n getLegalWarnings() {}\n getLinks() {}\n getNthFieldName(nIndex) {\n if (nIndex && typeof nIndex === \"object\") {\n nIndex = nIndex.nIndex;\n }\n if (typeof nIndex !== \"number\") {\n throw new TypeError(\"Invalid field index: must be a number\");\n }\n if (0 <= nIndex && nIndex < this.numFields) {\n return this._fieldNames[Math.trunc(nIndex)];\n }\n return null;\n }\n getNthTemplate() {\n return null;\n }\n getOCGs() {}\n getOCGOrder() {}\n getPageBox() {}\n getPageLabel() {}\n getPageNthWord() {}\n getPageNthWordQuads() {}\n getPageNumWords() {}\n getPageRotation() {}\n getPageTransition() {}\n getPrintParams() {\n return this._printParams ||= new PrintParams({\n lastPage: this._numPages - 1\n });\n }\n getSound() {}\n getTemplate() {}\n getURL() {}\n gotoNamedDest() {}\n importAnFDF() {}\n importAnXFDF() {}\n importDataObject() {}\n importIcon() {}\n importSound() {}\n importTextData() {}\n importXFAData() {}\n insertPages() {}\n mailDoc() {}\n mailForm() {}\n movePage() {}\n newPage() {}\n openDataObject() {}\n print(bUI = true, nStart = 0, nEnd = -1, bSilent = false, bShrinkToFit = false, bPrintAsImage = false, bReverse = false, bAnnotations = true, printParams = null) {\n if (this._disablePrinting || !this._userActivation) {\n return;\n }\n this._userActivation = false;\n if (bUI && typeof bUI === \"object\") {\n nStart = bUI.nStart;\n nEnd = bUI.nEnd;\n bSilent = bUI.bSilent;\n bShrinkToFit = bUI.bShrinkToFit;\n bPrintAsImage = bUI.bPrintAsImage;\n bReverse = bUI.bReverse;\n bAnnotations = bUI.bAnnotations;\n printParams = bUI.printParams;\n bUI = bUI.bUI;\n }\n if (printParams) {\n nStart = printParams.firstPage;\n nEnd = printParams.lastPage;\n }\n nStart = typeof nStart === \"number\" ? Math.max(0, Math.trunc(nStart)) : 0;\n nEnd = typeof nEnd === \"number\" ? Math.max(0, Math.trunc(nEnd)) : -1;\n this._send({\n command: \"print\",\n start: nStart,\n end: nEnd\n });\n }\n removeDataObject() {}\n removeField() {}\n removeIcon() {}\n removeLinks() {}\n removeRequirement() {}\n removeScript() {}\n removeTemplate() {}\n removeThumbnails() {}\n removeWeblinks() {}\n replacePages() {}\n resetForm(aFields = null) {\n if (aFields && typeof aFields === \"object\" && !Array.isArray(aFields)) {\n aFields = aFields.aFields;\n }\n if (aFields && !Array.isArray(aFields)) {\n aFields = [aFields];\n }\n let mustCalculate = false;\n let fieldsToReset;\n if (aFields) {\n fieldsToReset = [];\n for (const fieldName of aFields) {\n if (!fieldName) {\n continue;\n }\n if (typeof fieldName !== \"string\") {\n fieldsToReset = null;\n break;\n }\n const field = this._getField(fieldName);\n if (!field) {\n continue;\n }\n fieldsToReset.push(field);\n mustCalculate = true;\n }\n }\n if (!fieldsToReset) {\n fieldsToReset = this._fields.values();\n mustCalculate = this._fields.size !== 0;\n }\n for (const field of fieldsToReset) {\n field.obj.value = field.obj.defaultValue;\n this._send({\n id: field.obj._id,\n siblings: field.obj._siblings,\n value: field.obj.defaultValue,\n formattedValue: null,\n selRange: [0, 0]\n });\n }\n if (mustCalculate) {\n this.calculateNow();\n }\n }\n saveAs() {}\n scroll() {}\n selectPageNthWord() {}\n setAction() {}\n setDataObjectContents() {}\n setOCGOrder() {}\n setPageAction() {}\n setPageBoxes() {}\n setPageLabels() {}\n setPageRotations() {}\n setPageTabOrder() {}\n setPageTransitions() {}\n spawnPageFromTemplate() {}\n submitForm() {}\n syncAnnotScan() {}\n}\n\n;// ./src/scripting_api/proxy.js\nclass ProxyHandler {\n nosend = new Set([\"delay\"]);\n get(obj, prop) {\n if (prop in obj._expandos) {\n const val = obj._expandos[prop];\n if (typeof val === \"function\") {\n return val.bind(obj);\n }\n return val;\n }\n if (typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj) {\n const val = obj[prop];\n if (typeof val === \"function\") {\n return val.bind(obj);\n }\n return val;\n }\n return undefined;\n }\n set(obj, prop, value) {\n if (obj._kidIds) {\n obj._kidIds.forEach(id => {\n obj._appObjects[id].wrapped[prop] = value;\n });\n }\n if (typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj) {\n const old = obj[prop];\n obj[prop] = value;\n if (!this.nosend.has(prop) && obj._send && obj._id !== null && typeof old !== \"function\") {\n const data = {\n id: obj._id\n };\n data[prop] = prop === \"value\" ? obj._getValue() : obj[prop];\n if (!obj._siblings) {\n obj._send(data);\n } else {\n data.siblings = obj._siblings;\n obj._send(data);\n }\n }\n } else {\n obj._expandos[prop] = value;\n }\n return true;\n }\n has(obj, prop) {\n return prop in obj._expandos || typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj;\n }\n getPrototypeOf(obj) {\n return null;\n }\n setPrototypeOf(obj, proto) {\n return false;\n }\n isExtensible(obj) {\n return true;\n }\n preventExtensions(obj) {\n return false;\n }\n getOwnPropertyDescriptor(obj, prop) {\n if (prop in obj._expandos) {\n return {\n configurable: true,\n enumerable: true,\n value: obj._expandos[prop]\n };\n }\n if (typeof prop === \"string\" && !prop.startsWith(\"_\") && prop in obj) {\n return {\n configurable: true,\n enumerable: true,\n value: obj[prop]\n };\n }\n return undefined;\n }\n defineProperty(obj, key, descriptor) {\n Object.defineProperty(obj._expandos, key, descriptor);\n return true;\n }\n deleteProperty(obj, prop) {\n if (prop in obj._expandos) {\n delete obj._expandos[prop];\n }\n }\n ownKeys(obj) {\n const fromExpandos = Reflect.ownKeys(obj._expandos);\n const fromObj = Reflect.ownKeys(obj).filter(k => !k.startsWith(\"_\"));\n return fromExpandos.concat(fromObj);\n }\n}\n\n;// ./src/scripting_api/util.js\n\nclass Util extends PDFObject {\n #dateActionsCache = null;\n constructor(data) {\n super(data);\n this._scandCache = new Map();\n this._months = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\n this._days = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n this.MILLISECONDS_IN_DAY = 86400000;\n this.MILLISECONDS_IN_WEEK = 604800000;\n this._externalCall = data.externalCall;\n }\n printf(...args) {\n if (args.length === 0) {\n throw new Error(\"Invalid number of params in printf\");\n }\n if (typeof args[0] !== \"string\") {\n throw new TypeError(\"First argument of printf must be a string\");\n }\n const pattern = /%(,[0-4])?([+ 0#]+)?(\\d+)?(\\.\\d+)?(.)/g;\n const PLUS = 1;\n const SPACE = 2;\n const ZERO = 4;\n const HASH = 8;\n let i = 0;\n return args[0].replaceAll(pattern, function (match, nDecSep, cFlags, nWidth, nPrecision, cConvChar) {\n if (cConvChar !== \"d\" && cConvChar !== \"f\" && cConvChar !== \"s\" && cConvChar !== \"x\") {\n const buf = [\"%\"];\n for (const str of [nDecSep, cFlags, nWidth, nPrecision, cConvChar]) {\n if (str) {\n buf.push(str);\n }\n }\n return buf.join(\"\");\n }\n i++;\n if (i === args.length) {\n throw new Error(\"Not enough arguments in printf\");\n }\n const arg = args[i];\n if (cConvChar === \"s\") {\n return arg.toString();\n }\n let flags = 0;\n if (cFlags) {\n for (const flag of cFlags) {\n switch (flag) {\n case \"+\":\n flags |= PLUS;\n break;\n case \" \":\n flags |= SPACE;\n break;\n case \"0\":\n flags |= ZERO;\n break;\n case \"#\":\n flags |= HASH;\n break;\n }\n }\n }\n cFlags = flags;\n if (nWidth) {\n nWidth = parseInt(nWidth);\n }\n let intPart = Math.trunc(arg);\n if (cConvChar === \"x\") {\n let hex = Math.abs(intPart).toString(16).toUpperCase();\n if (nWidth !== undefined) {\n hex = hex.padStart(nWidth, cFlags & ZERO ? \"0\" : \" \");\n }\n if (cFlags & HASH) {\n hex = `0x${hex}`;\n }\n return hex;\n }\n if (nPrecision) {\n nPrecision = parseInt(nPrecision.substring(1));\n }\n nDecSep = nDecSep ? nDecSep.substring(1) : \"0\";\n const separators = {\n 0: [\",\", \".\"],\n 1: [\"\", \".\"],\n 2: [\".\", \",\"],\n 3: [\"\", \",\"],\n 4: [\"'\", \".\"]\n };\n const [thousandSep, decimalSep] = separators[nDecSep];\n let decPart = \"\";\n if (cConvChar === \"f\") {\n decPart = nPrecision !== undefined ? Math.abs(arg - intPart).toFixed(nPrecision) : Math.abs(arg - intPart).toString();\n if (decPart.length > 2) {\n if (/^1\\.0+$/.test(decPart)) {\n intPart += Math.sign(arg);\n decPart = `${decimalSep}${decPart.split(\".\")[1]}`;\n } else {\n decPart = `${decimalSep}${decPart.substring(2)}`;\n }\n } else {\n if (decPart === \"1\") {\n intPart += Math.sign(arg);\n }\n decPart = cFlags & HASH ? \".\" : \"\";\n }\n }\n let sign = \"\";\n if (intPart < 0) {\n sign = \"-\";\n intPart = -intPart;\n } else if (cFlags & PLUS) {\n sign = \"+\";\n } else if (cFlags & SPACE) {\n sign = \" \";\n }\n if (thousandSep && intPart >= 1000) {\n const buf = [];\n while (true) {\n buf.push((intPart % 1000).toString().padStart(3, \"0\"));\n intPart = Math.trunc(intPart / 1000);\n if (intPart < 1000) {\n buf.push(intPart.toString());\n break;\n }\n }\n intPart = buf.reverse().join(thousandSep);\n } else {\n intPart = intPart.toString();\n }\n let n = `${intPart}${decPart}`;\n if (nWidth !== undefined) {\n n = n.padStart(nWidth - sign.length, cFlags & ZERO ? \"0\" : \" \");\n }\n return `${sign}${n}`;\n });\n }\n iconStreamFromIcon() {}\n printd(cFormat, oDate) {\n switch (cFormat) {\n case 0:\n return this.printd(\"D:yyyymmddHHMMss\", oDate);\n case 1:\n return this.printd(\"yyyy.mm.dd HH:MM:ss\", oDate);\n case 2:\n return this.printd(\"m/d/yy h:MM:ss tt\", oDate);\n }\n const handlers = {\n mmmm: data => this._months[data.month],\n mmm: data => this._months[data.month].substring(0, 3),\n mm: data => (data.month + 1).toString().padStart(2, \"0\"),\n m: data => (data.month + 1).toString(),\n dddd: data => this._days[data.dayOfWeek],\n ddd: data => this._days[data.dayOfWeek].substring(0, 3),\n dd: data => data.day.toString().padStart(2, \"0\"),\n d: data => data.day.toString(),\n yyyy: data => data.year.toString().padStart(4, \"0\"),\n yy: data => (data.year % 100).toString().padStart(2, \"0\"),\n HH: data => data.hours.toString().padStart(2, \"0\"),\n H: data => data.hours.toString(),\n hh: data => (1 + (data.hours + 11) % 12).toString().padStart(2, \"0\"),\n h: data => (1 + (data.hours + 11) % 12).toString(),\n MM: data => data.minutes.toString().padStart(2, \"0\"),\n M: data => data.minutes.toString(),\n ss: data => data.seconds.toString().padStart(2, \"0\"),\n s: data => data.seconds.toString(),\n tt: data => data.hours < 12 ? \"am\" : \"pm\",\n t: data => data.hours < 12 ? \"a\" : \"p\"\n };\n const data = {\n year: oDate.getFullYear(),\n month: oDate.getMonth(),\n day: oDate.getDate(),\n dayOfWeek: oDate.getDay(),\n hours: oDate.getHours(),\n minutes: oDate.getMinutes(),\n seconds: oDate.getSeconds()\n };\n const patterns = /(mmmm|mmm|mm|m|dddd|ddd|dd|d|yyyy|yy|HH|H|hh|h|MM|M|ss|s|tt|t|\\\\.)/g;\n return cFormat.replaceAll(patterns, function (match, pattern) {\n if (pattern in handlers) {\n return handlers[pattern](data);\n }\n return pattern.charCodeAt(1);\n });\n }\n printx(cFormat, cSource) {\n cSource = (cSource ?? \"\").toString();\n const handlers = [x => x, x => x.toUpperCase(), x => x.toLowerCase()];\n const buf = [];\n let i = 0;\n const ii = cSource.length;\n let currCase = handlers[0];\n let escaped = false;\n for (const command of cFormat) {\n if (escaped) {\n buf.push(command);\n escaped = false;\n continue;\n }\n if (i >= ii) {\n break;\n }\n switch (command) {\n case \"?\":\n buf.push(currCase(cSource.charAt(i++)));\n break;\n case \"X\":\n while (i < ii) {\n const char = cSource.charAt(i++);\n if (\"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\" || \"0\" <= char && char <= \"9\") {\n buf.push(currCase(char));\n break;\n }\n }\n break;\n case \"A\":\n while (i < ii) {\n const char = cSource.charAt(i++);\n if (\"a\" <= char && char <= \"z\" || \"A\" <= char && char <= \"Z\") {\n buf.push(currCase(char));\n break;\n }\n }\n break;\n case \"9\":\n while (i < ii) {\n const char = cSource.charAt(i++);\n if (\"0\" <= char && char <= \"9\") {\n buf.push(char);\n break;\n }\n }\n break;\n case \"*\":\n while (i < ii) {\n buf.push(currCase(cSource.charAt(i++)));\n }\n break;\n case \"\\\\\":\n escaped = true;\n break;\n case \">\":\n currCase = handlers[1];\n break;\n case \"<\":\n currCase = handlers[2];\n break;\n case \"=\":\n currCase = handlers[0];\n break;\n default:\n buf.push(command);\n }\n }\n return buf.join(\"\");\n }\n #tryToGuessDate(cFormat, cDate) {\n let actions = (this.#dateActionsCache ||= new Map()).get(cFormat);\n if (!actions) {\n actions = [];\n this.#dateActionsCache.set(cFormat, actions);\n cFormat.replaceAll(/(d+)|(m+)|(y+)|(H+)|(M+)|(s+)/g, function (_match, d, m, y, H, M, s) {\n if (d) {\n actions.push((n, data) => {\n if (n >= 1 && n <= 31) {\n data.day = n;\n return true;\n }\n return false;\n });\n } else if (m) {\n actions.push((n, data) => {\n if (n >= 1 && n <= 12) {\n data.month = n - 1;\n return true;\n }\n return false;\n });\n } else if (y) {\n actions.push((n, data) => {\n if (n < 50) {\n n += 2000;\n } else if (n < 100) {\n n += 1900;\n }\n data.year = n;\n return true;\n });\n } else if (H) {\n actions.push((n, data) => {\n if (n >= 0 && n <= 23) {\n data.hours = n;\n return true;\n }\n return false;\n });\n } else if (M) {\n actions.push((n, data) => {\n if (n >= 0 && n <= 59) {\n data.minutes = n;\n return true;\n }\n return false;\n });\n } else if (s) {\n actions.push((n, data) => {\n if (n >= 0 && n <= 59) {\n data.seconds = n;\n return true;\n }\n return false;\n });\n }\n return \"\";\n });\n }\n const number = /\\d+/g;\n let i = 0;\n let array;\n const data = {\n year: new Date().getFullYear(),\n month: 0,\n day: 1,\n hours: 12,\n minutes: 0,\n seconds: 0\n };\n while ((array = number.exec(cDate)) !== null) {\n if (i < actions.length) {\n if (!actions[i++](parseInt(array[0]), data)) {\n return null;\n }\n } else {\n break;\n }\n }\n if (i === 0) {\n return null;\n }\n return new Date(data.year, data.month, data.day, data.hours, data.minutes, data.seconds);\n }\n scand(cFormat, cDate) {\n return this._scand(cFormat, cDate);\n }\n _scand(cFormat, cDate, strict = false) {\n if (typeof cDate !== \"string\") {\n return new Date(cDate);\n }\n if (cDate === \"\") {\n return new Date();\n }\n switch (cFormat) {\n case 0:\n return this.scand(\"D:yyyymmddHHMMss\", cDate);\n case 1:\n return this.scand(\"yyyy.mm.dd HH:MM:ss\", cDate);\n case 2:\n return this.scand(\"m/d/yy h:MM:ss tt\", cDate);\n }\n if (!this._scandCache.has(cFormat)) {\n const months = this._months;\n const days = this._days;\n const handlers = {\n mmmm: {\n pattern: `(${months.join(\"|\")})`,\n action: (value, data) => {\n data.month = months.indexOf(value);\n }\n },\n mmm: {\n pattern: `(${months.map(month => month.substring(0, 3)).join(\"|\")})`,\n action: (value, data) => {\n data.month = months.findIndex(month => month.substring(0, 3) === value);\n }\n },\n mm: {\n pattern: `(\\\\d{2})`,\n action: (value, data) => {\n data.month = parseInt(value) - 1;\n }\n },\n m: {\n pattern: `(\\\\d{1,2})`,\n action: (value, data) => {\n data.month = parseInt(value) - 1;\n }\n },\n dddd: {\n pattern: `(${days.join(\"|\")})`,\n action: (value, data) => {\n data.day = days.indexOf(value);\n }\n },\n ddd: {\n pattern: `(${days.map(day => day.substring(0, 3)).join(\"|\")})`,\n action: (value, data) => {\n data.day = days.findIndex(day => day.substring(0, 3) === value);\n }\n },\n dd: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.day = parseInt(value);\n }\n },\n d: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.day = parseInt(value);\n }\n },\n yyyy: {\n pattern: \"(\\\\d{4})\",\n action: (value, data) => {\n data.year = parseInt(value);\n }\n },\n yy: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.year = 2000 + parseInt(value);\n }\n },\n HH: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n H: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n hh: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n h: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.hours = parseInt(value);\n }\n },\n MM: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.minutes = parseInt(value);\n }\n },\n M: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.minutes = parseInt(value);\n }\n },\n ss: {\n pattern: \"(\\\\d{2})\",\n action: (value, data) => {\n data.seconds = parseInt(value);\n }\n },\n s: {\n pattern: \"(\\\\d{1,2})\",\n action: (value, data) => {\n data.seconds = parseInt(value);\n }\n },\n tt: {\n pattern: \"([aApP][mM])\",\n action: (value, data) => {\n const char = value.charAt(0);\n data.am = char === \"a\" || char === \"A\";\n }\n },\n t: {\n pattern: \"([aApP])\",\n action: (value, data) => {\n data.am = value === \"a\" || value === \"A\";\n }\n }\n };\n const escapedFormat = cFormat.replaceAll(/[.*+\\-?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const patterns = /(mmmm|mmm|mm|m|dddd|ddd|dd|d|yyyy|yy|HH|H|hh|h|MM|M|ss|s|tt|t)/g;\n const actions = [];\n const re = escapedFormat.replaceAll(patterns, function (match, patternElement) {\n const {\n pattern,\n action\n } = handlers[patternElement];\n actions.push(action);\n return pattern;\n });\n this._scandCache.set(cFormat, [re, actions]);\n }\n const [re, actions] = this._scandCache.get(cFormat);\n const matches = new RegExp(`^${re}$`, \"g\").exec(cDate);\n if (!matches || matches.length !== actions.length + 1) {\n return strict ? null : this.#tryToGuessDate(cFormat, cDate);\n }\n const data = {\n year: 2000,\n month: 0,\n day: 1,\n hours: 0,\n minutes: 0,\n seconds: 0,\n am: null\n };\n actions.forEach((action, i) => action(matches[i + 1], data));\n if (data.am !== null) {\n data.hours = data.hours % 12 + (data.am ? 0 : 12);\n }\n return new Date(data.year, data.month, data.day, data.hours, data.minutes, data.seconds);\n }\n spansToXML() {}\n stringFromStream() {}\n xmlToSpans() {}\n}\n\n;// ./src/scripting_api/initialization.js\n\n\n\n\n\n\n\n\n\n\nfunction initSandbox(params) {\n delete globalThis.pdfjsScripting;\n const externalCall = globalThis.callExternalFunction;\n delete globalThis.callExternalFunction;\n const globalEval = code => globalThis.eval(code);\n const send = data => externalCall(\"send\", [data]);\n const proxyHandler = new ProxyHandler();\n const {\n data\n } = params;\n const doc = new Doc({\n send,\n globalEval,\n ...data.docInfo\n });\n const _document = {\n obj: doc,\n wrapped: new Proxy(doc, proxyHandler)\n };\n const app = new App({\n send,\n globalEval,\n externalCall,\n _document,\n calculationOrder: data.calculationOrder,\n proxyHandler,\n ...data.appInfo\n });\n const util = new Util({\n externalCall\n });\n const appObjects = app._objects;\n if (data.objects) {\n const annotations = [];\n for (const [name, objs] of Object.entries(data.objects)) {\n annotations.length = 0;\n let container = null;\n for (const obj of objs) {\n if (obj.type !== \"\") {\n annotations.push(obj);\n } else {\n container = obj;\n }\n }\n let obj = container;\n if (annotations.length > 0) {\n obj = annotations[0];\n obj.send = send;\n }\n obj.globalEval = globalEval;\n obj.doc = _document;\n obj.fieldPath = name;\n obj.appObjects = appObjects;\n obj.util = util;\n const otherFields = annotations.slice(1);\n let field;\n switch (obj.type) {\n case \"radiobutton\":\n {\n field = new RadioButtonField(otherFields, obj);\n break;\n }\n case \"checkbox\":\n {\n field = new CheckboxField(otherFields, obj);\n break;\n }\n default:\n if (otherFields.length > 0) {\n obj.siblings = otherFields.map(x => x.id);\n }\n field = new Field(obj);\n }\n const wrapped = new Proxy(field, proxyHandler);\n const _object = {\n obj: field,\n wrapped\n };\n doc._addField(name, _object);\n for (const object of objs) {\n appObjects[object.id] = _object;\n }\n if (container) {\n appObjects[container.id] = _object;\n }\n }\n }\n const color = new Color();\n globalThis.event = null;\n globalThis.global = Object.create(null);\n globalThis.app = new Proxy(app, proxyHandler);\n globalThis.color = new Proxy(color, proxyHandler);\n globalThis.console = new Proxy(new Console({\n send\n }), proxyHandler);\n globalThis.util = new Proxy(util, proxyHandler);\n globalThis.border = Border;\n globalThis.cursor = Cursor;\n globalThis.display = Display;\n globalThis.font = Font;\n globalThis.highlight = Highlight;\n globalThis.position = Position;\n globalThis.scaleHow = ScaleHow;\n globalThis.scaleWhen = ScaleWhen;\n globalThis.style = Style;\n globalThis.trans = Trans;\n globalThis.zoomtype = ZoomType;\n globalThis.ADBE = {\n Reader_Value_Asked: true,\n Viewer_Value_Asked: true\n };\n const aform = new AForm(doc, app, util, color);\n for (const name of Object.getOwnPropertyNames(AForm.prototype)) {\n if (name !== \"constructor\" && !name.startsWith(\"_\")) {\n globalThis[name] = aform[name].bind(aform);\n }\n }\n for (const [name, value] of Object.entries(GlobalConstants)) {\n Object.defineProperty(globalThis, name, {\n value,\n writable: false\n });\n }\n Object.defineProperties(globalThis, {\n ColorConvert: {\n value: color.convert.bind(color),\n writable: true\n },\n ColorEqual: {\n value: color.equal.bind(color),\n writable: true\n }\n });\n const properties = Object.create(null);\n for (const name of Object.getOwnPropertyNames(Doc.prototype)) {\n if (name === \"constructor\" || name.startsWith(\"_\")) {\n continue;\n }\n const descriptor = Object.getOwnPropertyDescriptor(Doc.prototype, name);\n if (descriptor.get) {\n properties[name] = {\n get: descriptor.get.bind(doc),\n set: descriptor.set.bind(doc)\n };\n } else {\n properties[name] = {\n value: Doc.prototype[name].bind(doc)\n };\n }\n }\n Object.defineProperties(globalThis, properties);\n const functions = {\n dispatchEvent: app._dispatchEvent.bind(app),\n timeoutCb: app._evalCallback.bind(app)\n };\n return (name, args) => {\n try {\n functions[name](args);\n } catch (error) {\n send(serializeError(error));\n }\n };\n}\n\n;// ./src/pdf.scripting.js\n\nglobalThis.pdfjsScripting = {\n initSandbox: initSandbox\n};\n"]; code.push("delete dump;"); let success = false; let buf = 0; @@ -229,11 +203,20 @@ throw new Error("Not implemented: evalForTesting"); } } -function QuickJSSandbox() { - return quickjs_eval().then(module => new Sandbox(window, module)); +async function QuickJSSandbox(wasmUrl = "../web/wasm/") { + const { + default: ModuleLoader + } = await import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + `${wasmUrl}quickjs-eval.js`); + const module = await ModuleLoader(); + return new Sandbox(window, module); } +globalThis.pdfjsSandbox = { + QuickJSSandbox +}; -var __webpack_exports__QuickJSSandbox = __webpack_exports__.QuickJSSandbox; -export { __webpack_exports__QuickJSSandbox as QuickJSSandbox }; +export { QuickJSSandbox }; //# sourceMappingURL=pdf.sandbox.mjs.map \ No newline at end of file diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/build/pdf.worker.mjs webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/build/pdf.worker.mjs --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/build/pdf.worker.mjs 2026-01-20 14:08:39.312689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/build/pdf.worker.mjs 2026-07-09 07:12:41.852801600 +0000 @@ -2,7 +2,7 @@ * @licstart The following is the entire license notice for the * JavaScript code in this page * - * Copyright 2023 Mozilla Foundation + * Copyright 2024 Mozilla Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,43 +20,20 @@ * JavaScript code in this page */ -/******/ // The require scope -/******/ var __webpack_require__ = {}; -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = globalThis.pdfjsWorker = {}; - -// EXPORTS -__webpack_require__.d(__webpack_exports__, { - WorkerMessageHandler: () => (/* reexport */ WorkerMessageHandler) -}); +/** + * pdfjsVersion = 6.1.200 + * pdfjsBuild = 6353acefe + */ -;// CONCATENATED MODULE: ./src/shared/util.js +;// ./src/shared/util.js const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); -const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; +const BBOX_INIT = [Infinity, Infinity, -Infinity, -Infinity]; +const F32_BBOX_INIT = new Float32Array(BBOX_INIT); const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; -const MAX_IMAGE_SIZE_TO_CACHE = 10e6; const LINE_FACTOR = 1.35; const LINE_DESCENT_FACTOR = 0.35; const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR; +const SVG_NS = "http://www.w3.org/2000/svg"; const RenderingIntentFlag = { ANY: 0x01, DISPLAY: 0x02, @@ -65,14 +42,16 @@ ANNOTATIONS_FORMS: 0x10, ANNOTATIONS_STORAGE: 0x20, ANNOTATIONS_DISABLE: 0x40, + IS_EDITING: 0x80, OPLIST: 0x100 }; -const AnnotationMode = { +const AnnotationMode = (/* unused pure expression or super */ null && ({ DISABLE: 0, ENABLE: 1, ENABLE_FORMS: 2, ENABLE_STORAGE: 3 -}; +})); +const AnnotationPrefix = "pdfjs_internal_id_"; const AnnotationEditorPrefix = "pdfjs_internal_editor_"; const AnnotationEditorType = { DISABLE: -1, @@ -80,9 +59,12 @@ FREETEXT: 3, HIGHLIGHT: 9, STAMP: 13, - INK: 15 + INK: 15, + POPUP: 16, + SIGNATURE: 101, + COMMENT: 102 }; -const AnnotationEditorParamsType = { +const AnnotationEditorParamsType = (/* unused pure expression or super */ null && ({ RESIZE: 1, CREATE: 2, FREETEXT_SIZE: 11, @@ -91,12 +73,13 @@ INK_COLOR: 21, INK_THICKNESS: 22, INK_OPACITY: 23, + INK_COLOR_AND_OPACITY: 24, HIGHLIGHT_COLOR: 31, - HIGHLIGHT_DEFAULT_COLOR: 32, - HIGHLIGHT_THICKNESS: 33, - HIGHLIGHT_FREE: 34, - HIGHLIGHT_SHOW_ALL: 35 -}; + HIGHLIGHT_THICKNESS: 32, + HIGHLIGHT_FREE: 33, + HIGHLIGHT_SHOW_ALL: 34, + DRAW_STEP: 41 +})); const PermissionFlag = { PRINT: 0x04, MODIFY_CONTENTS: 0x08, @@ -107,6 +90,11 @@ ASSEMBLE: 0x400, PRINT_HIGH_QUALITY: 0x800 }; +const MeshFigureType = { + TRIANGLES: 1, + LATTICE: 2, + PATCH: 3 +}; const TextRenderingMode = { FILL: 0, STROKE: 1, @@ -150,12 +138,20 @@ TRAPNET: 23, WATERMARK: 24, THREED: 25, - REDACT: 26 + REDACT: 26, + RICHMEDIA: 27 }; const AnnotationReplyType = { GROUP: "Group", REPLY: "R" }; +const AnnotationRenditionOperation = { + PLAY_OR_RESUME: 0, + STOP: 1, + PAUSE: 2, + RESUME: 3, + PLAY: 4 +}; const AnnotationFlag = { INVISIBLE: 0x01, HIDDEN: 0x02, @@ -228,10 +224,6 @@ WARNINGS: 1, INFOS: 5 }; -const CMapCompressionType = { - NONE: 0, - BINARY: 1 -}; const OPS = { dependency: 1, setLineWidth: 2, @@ -320,7 +312,17 @@ paintImageXObjectRepeat: 88, paintImageMaskXObjectRepeat: 89, paintSolidColorImageMask: 90, - constructPath: 91 + constructPath: 91, + setStrokeTransparent: 92, + setFillTransparent: 93, + rawFillPath: 94 +}; +const DrawOPS = { + moveTo: 0, + lineTo: 1, + curveTo: 2, + quadraticCurveTo: 3, + closePath: 4 }; const PasswordResponses = { NEED_PASSWORD: 1, @@ -337,12 +339,12 @@ } function info(msg) { if (verbosity >= VerbosityLevel.INFOS) { - console.log(`Info: ${msg}`); + console.info(`Info: ${msg}`); } } function warn(msg) { if (verbosity >= VerbosityLevel.WARNINGS) { - console.log(`Warning: ${msg}`); + console.warn(`Warning: ${msg}`); } } function unreachable(msg) { @@ -369,26 +371,35 @@ if (!url) { return null; } - try { - if (options && typeof url === "string") { - if (options.addDefaultProtocol && url.startsWith("www.")) { - const dots = url.match(/\./g); - if (dots?.length >= 2) { - url = `http://${url}`; - } - } - if (options.tryConvertEncoding) { - try { - url = stringToUTF8String(url); - } catch {} + if (options && typeof url === "string") { + if (options.addDefaultProtocol && url.startsWith("www.")) { + const dots = url.match(/\./g); + if (dots?.length >= 2) { + url = `http://${url}`; } } - const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url); - if (_isValidProtocol(absoluteUrl)) { - return absoluteUrl; + if (options.tryConvertEncoding) { + try { + url = stringToUTF8String(url); + } catch {} } - } catch {} - return null; + } + const absoluteUrl = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url); + return _isValidProtocol(absoluteUrl) ? absoluteUrl : null; +} +function updateUrlHash(url, hash, allowRel = false) { + const res = URL.parse(url); + if (res) { + res.hash = hash; + return res.href; + } + if (allowRel && createValidAbsoluteUrl(url, "http://example.com")) { + return url.split("#", 1)[0] + `${hash ? `#${hash}` : ""}`; + } + return ""; +} +function stripPath(str) { + return str.substring(str.lastIndexOf("/") + 1); } function shadow(obj, prop, value, nonSerializable = false) { Object.defineProperty(obj, prop, { @@ -401,9 +412,6 @@ } const BaseException = function BaseExceptionClosure() { function BaseException(message, name) { - if (this.constructor === BaseException) { - unreachable("Cannot initialize BaseException."); - } this.message = message; this.name = name; } @@ -428,15 +436,11 @@ super(msg, "InvalidPDFException"); } } -class MissingPDFException extends BaseException { - constructor(msg) { - super(msg, "MissingPDFException"); - } -} -class UnexpectedResponseException extends BaseException { - constructor(msg, status) { - super(msg, "UnexpectedResponseException"); +class ResponseException extends BaseException { + constructor(msg, status, missing) { + super(msg, "ResponseException"); this.status = status; + this.missing = missing; } } class FormatError extends BaseException { @@ -477,142 +481,149 @@ } return bytes; } -function string32(value) { - return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); -} function objectSize(obj) { return Object.keys(obj).length; } -function objectFromMap(map) { - const obj = Object.create(null); - for (const [key, value] of map) { - obj[key] = value; - } - return obj; -} -function isLittleEndian() { - const buffer8 = new Uint8Array(4); - buffer8[0] = 1; - const view32 = new Uint32Array(buffer8.buffer, 0, 1); - return view32[0] === 1; -} -function isEvalSupported() { - try { - new Function(""); - return true; - } catch { - return false; - } -} class FeatureTest { static get isLittleEndian() { - return shadow(this, "isLittleEndian", isLittleEndian()); - } - static get isEvalSupported() { - return shadow(this, "isEvalSupported", isEvalSupported()); + const buffer8 = new Uint8Array(4); + buffer8[0] = 1; + const view32 = new Uint32Array(buffer8.buffer, 0, 1); + return shadow(this, "isLittleEndian", view32[0] === 1); } static get isOffscreenCanvasSupported() { return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined"); } + static get isImageDecoderSupported() { + return shadow(this, "isImageDecoderSupported", typeof ImageDecoder !== "undefined"); + } + static get isFloat16ArraySupported() { + return shadow(this, "isFloat16ArraySupported", typeof Float16Array !== "undefined"); + } + static get isSanitizerSupported() { + return shadow(this, "isSanitizerSupported", typeof Sanitizer !== "undefined"); + } static get platform() { - if (typeof navigator !== "undefined" && typeof navigator?.platform === "string") { - return shadow(this, "platform", { - isMac: navigator.platform.includes("Mac") - }); - } + const { + platform, + userAgent + } = navigator; return shadow(this, "platform", { - isMac: false + isAndroid: userAgent.includes("Android"), + isLinux: platform.includes("Linux"), + isMac: platform.includes("Mac"), + isWindows: platform.includes("Win"), + isFirefox: userAgent.includes("Firefox") }); } - static get isCSSRoundSupported() { - return shadow(this, "isCSSRoundSupported", globalThis.CSS?.supports?.("width: round(1.5px, 1px)")); + static get isCanvasFilterSupported() { + let ctx; + if (this.isOffscreenCanvasSupported) { + ctx = new OffscreenCanvas(1, 1).getContext("2d"); + } + return shadow(this, "isCanvasFilterSupported", ctx?.filter !== undefined); + } + static get isAlphaColorInputSupported() { + return shadow(this, "isAlphaColorInputSupported", false); + } + static get isBackdropFilterSupported() { + return shadow(this, "isBackdropFilterSupported", typeof CSS !== "undefined" && CSS.supports("backdrop-filter", "blur(1px)")); } } -const hexNumbers = Array.from(Array(256).keys(), n => n.toString(16).padStart(2, "0")); class Util { - static makeHexColor(r, g, b) { - return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`; + static get hexNums() { + return shadow(this, "hexNums", Array.from(Array(256).keys(), n => n.toString(16).padStart(2, "0"))); } - static scaleMinMax(transform, minMax) { - let temp; - if (transform[0]) { - if (transform[0] < 0) { - temp = minMax[0]; - minMax[0] = minMax[2]; - minMax[2] = temp; - } - minMax[0] *= transform[0]; - minMax[2] *= transform[0]; - if (transform[3] < 0) { - temp = minMax[1]; - minMax[1] = minMax[3]; - minMax[3] = temp; - } - minMax[1] *= transform[3]; - minMax[3] *= transform[3]; - } else { - temp = minMax[0]; - minMax[0] = minMax[1]; - minMax[1] = temp; - temp = minMax[2]; - minMax[2] = minMax[3]; - minMax[3] = temp; - if (transform[1] < 0) { - temp = minMax[1]; - minMax[1] = minMax[3]; - minMax[3] = temp; - } - minMax[1] *= transform[1]; - minMax[3] *= transform[1]; - if (transform[2] < 0) { - temp = minMax[0]; - minMax[0] = minMax[2]; - minMax[2] = temp; - } - minMax[0] *= transform[2]; - minMax[2] *= transform[2]; - } - minMax[0] += transform[4]; - minMax[1] += transform[5]; - minMax[2] += transform[4]; - minMax[3] += transform[5]; + static makeHexColor(r, g, b) { + return `#${this.hexNums[r]}${this.hexNums[g]}${this.hexNums[b]}`; } static transform(m1, m2) { return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]]; } - static applyTransform(p, m) { - const xt = p[0] * m[0] + p[1] * m[2] + m[4]; - const yt = p[0] * m[1] + p[1] * m[3] + m[5]; - return [xt, yt]; + static multiplyByDOMMatrix(m, md) { + return [m[0] * md.a + m[2] * md.b, m[1] * md.a + m[3] * md.b, m[0] * md.c + m[2] * md.d, m[1] * md.c + m[3] * md.d, m[0] * md.e + m[2] * md.f + m[4], m[1] * md.e + m[3] * md.f + m[5]]; + } + static applyTransform(p, m, pos = 0) { + const p0 = p[pos]; + const p1 = p[pos + 1]; + p[pos] = p0 * m[0] + p1 * m[2] + m[4]; + p[pos + 1] = p0 * m[1] + p1 * m[3] + m[5]; + } + static applyTransformToBezier(p, transform, pos = 0) { + const m0 = transform[0]; + const m1 = transform[1]; + const m2 = transform[2]; + const m3 = transform[3]; + const m4 = transform[4]; + const m5 = transform[5]; + for (let i = 0; i < 6; i += 2) { + const pI = p[pos + i]; + const pI1 = p[pos + i + 1]; + p[pos + i] = pI * m0 + pI1 * m2 + m4; + p[pos + i + 1] = pI * m1 + pI1 * m3 + m5; + } } static applyInverseTransform(p, m) { + const p0 = p[0]; + const p1 = p[1]; const d = m[0] * m[3] - m[1] * m[2]; - const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; - const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; - return [xt, yt]; - } - static getAxialAlignedBoundingBox(r, m) { - const p1 = this.applyTransform(r, m); - const p2 = this.applyTransform(r.slice(2, 4), m); - const p3 = this.applyTransform([r[0], r[3]], m); - const p4 = this.applyTransform([r[2], r[1]], m); - return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])]; + p[0] = (p0 * m[3] - p1 * m[2] + m[2] * m[5] - m[4] * m[3]) / d; + p[1] = (-p0 * m[1] + p1 * m[0] + m[4] * m[1] - m[5] * m[0]) / d; + } + static axialAlignedBoundingBox(rect, transform, output) { + const m0 = transform[0]; + const m1 = transform[1]; + const m2 = transform[2]; + const m3 = transform[3]; + const m4 = transform[4]; + const m5 = transform[5]; + const r0 = rect[0]; + const r1 = rect[1]; + const r2 = rect[2]; + const r3 = rect[3]; + let a0 = m0 * r0 + m4; + let a2 = a0; + let a1 = m0 * r2 + m4; + let a3 = a1; + let b0 = m3 * r1 + m5; + let b2 = b0; + let b1 = m3 * r3 + m5; + let b3 = b1; + if (m1 !== 0 || m2 !== 0) { + const m1r0 = m1 * r0; + const m1r2 = m1 * r2; + const m2r1 = m2 * r1; + const m2r3 = m2 * r3; + a0 += m2r1; + a3 += m2r1; + a1 += m2r3; + a2 += m2r3; + b0 += m1r0; + b3 += m1r0; + b1 += m1r2; + b2 += m1r2; + } + output[0] = Math.min(output[0], a0, a1, a2, a3); + output[1] = Math.min(output[1], b0, b1, b2, b3); + output[2] = Math.max(output[2], a0, a1, a2, a3); + output[3] = Math.max(output[3], b0, b1, b2, b3); } static inverseTransform(m) { const d = m[0] * m[3] - m[1] * m[2]; return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; } - static singularValueDecompose2dScale(m) { - const transpose = [m[0], m[2], m[1], m[3]]; - const a = m[0] * transpose[0] + m[1] * transpose[2]; - const b = m[0] * transpose[1] + m[1] * transpose[3]; - const c = m[2] * transpose[0] + m[3] * transpose[2]; - const d = m[2] * transpose[1] + m[3] * transpose[3]; - const first = (a + d) / 2; - const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2; - const sx = first + second || 1; - const sy = first - second || 1; - return [Math.sqrt(sx), Math.sqrt(sy)]; + static singularValueDecompose2dScale(matrix, output) { + const m0 = matrix[0]; + const m1 = matrix[1]; + const m2 = matrix[2]; + const m3 = matrix[3]; + const a = m0 ** 2 + m1 ** 2; + const b = m0 * m2 + m1 * m3; + const c = m2 ** 2 + m3 ** 2; + const first = (a + c) / 2; + const second = Math.sqrt(first ** 2 - (a * c - b ** 2)); + output[0] = Math.sqrt(first + second || 1); + output[1] = Math.sqrt(first - second || 1); } static normalizeRect(rect) { const r = rect.slice(0); @@ -639,6 +650,18 @@ } return [xLow, yLow, xHigh, yHigh]; } + static pointBoundingBox(x, y, minMax) { + minMax[0] = Math.min(minMax[0], x); + minMax[1] = Math.min(minMax[1], y); + minMax[2] = Math.max(minMax[2], x); + minMax[3] = Math.max(minMax[3], y); + } + static rectBoundingBox(x0, y0, x1, y1, minMax) { + minMax[0] = Math.min(minMax[0], x0, x1); + minMax[1] = Math.min(minMax[1], y0, y1); + minMax[2] = Math.max(minMax[2], x0, x1); + minMax[3] = Math.max(minMax[3], y0, y1); + } static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) { if (t <= 0 || t >= 1) { return; @@ -670,64 +693,14 @@ this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b - sqrtDelta) / a2, minMax); } static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) { - if (minMax) { - minMax[0] = Math.min(minMax[0], x0, x3); - minMax[1] = Math.min(minMax[1], y0, y3); - minMax[2] = Math.max(minMax[2], x0, x3); - minMax[3] = Math.max(minMax[3], y0, y3); - } else { - minMax = [Math.min(x0, x3), Math.min(y0, y3), Math.max(x0, x3), Math.max(y0, y3)]; - } + minMax[0] = Math.min(minMax[0], x0, x3); + minMax[1] = Math.min(minMax[1], y0, y3); + minMax[2] = Math.max(minMax[2], x0, x3); + minMax[3] = Math.max(minMax[3], y0, y3); this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-x0 + 3 * (x1 - x2) + x3), 6 * (x0 - 2 * x1 + x2), 3 * (x1 - x0), minMax); this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-y0 + 3 * (y1 - y2) + y3), 6 * (y0 - 2 * y1 + y2), 3 * (y1 - y0), minMax); - return minMax; } } -const PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8, 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d, 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac]; -function stringToPDFString(str) { - if (str[0] >= "\xEF") { - let encoding; - if (str[0] === "\xFE" && str[1] === "\xFF") { - encoding = "utf-16be"; - if (str.length % 2 === 1) { - str = str.slice(0, -1); - } - } else if (str[0] === "\xFF" && str[1] === "\xFE") { - encoding = "utf-16le"; - if (str.length % 2 === 1) { - str = str.slice(0, -1); - } - } else if (str[0] === "\xEF" && str[1] === "\xBB" && str[2] === "\xBF") { - encoding = "utf-8"; - } - if (encoding) { - try { - const decoder = new TextDecoder(encoding, { - fatal: true - }); - const buffer = stringToBytes(str); - const decoded = decoder.decode(buffer); - if (!decoded.includes("\x1b")) { - return decoded; - } - return decoded.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g, ""); - } catch (ex) { - warn(`stringToPDFString: "${ex}".`); - } - } - } - const strBuf = []; - for (let i = 0, ii = str.length; i < ii; i++) { - const charCode = str.charCodeAt(i); - if (charCode === 0x1b) { - while (++i < ii && str.charCodeAt(i) !== 0x1b) {} - continue; - } - const code = PDFStringTranslateTable[charCode]; - strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); - } - return strBuf.join(""); -} function stringToUTF8String(str) { return decodeURIComponent(escape(str)); } @@ -745,36 +718,75 @@ } return true; } -function getModificationDate(date = new Date()) { - const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), date.getUTCDate().toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")]; - return buffer.join(""); -} let NormalizeRegex = null; let NormalizationMap = null; function normalizeUnicode(str) { if (!NormalizeRegex) { - NormalizeRegex = /([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu; + NormalizeRegex = /([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu; NormalizationMap = new Map([["ſt", "ſt"]]); } return str.replaceAll(NormalizeRegex, (_, p1, p2) => p1 ? p1.normalize("NFKC") : NormalizationMap.get(p2)); } function getUuid() { - if (typeof crypto !== "undefined" && typeof crypto?.randomUUID === "function") { + if (typeof crypto.randomUUID === "function") { return crypto.randomUUID(); } const buf = new Uint8Array(32); - if (typeof crypto !== "undefined" && typeof crypto?.getRandomValues === "function") { - crypto.getRandomValues(buf); - } else { - for (let i = 0; i < 32; i++) { - buf[i] = Math.floor(Math.random() * 255); + crypto.getRandomValues(buf); + return bytesToString(buf); +} +function _isValidExplicitDest(validRef, validName, dest) { + if (!Array.isArray(dest) || dest.length < 2) { + return false; + } + const [page, zoom, ...args] = dest; + if (!validRef(page) && !Number.isInteger(page)) { + return false; + } + if (!validName(zoom)) { + return false; + } + const argsLen = args.length; + let allowNull = true; + switch (zoom.name) { + case "XYZ": + if (argsLen < 2 || argsLen > 3) { + return false; + } + break; + case "Fit": + case "FitB": + return argsLen === 0; + case "FitH": + case "FitBH": + case "FitV": + case "FitBV": + if (argsLen > 1) { + return false; + } + break; + case "FitR": + if (argsLen !== 4) { + return false; + } + allowNull = false; + break; + default: + return false; + } + for (const arg of args) { + if (typeof arg === "number" || allowNull && arg === null) { + continue; } + return false; } - return bytesToString(buf); + return true; } -const AnnotationPrefix = "pdfjs_internal_id_"; +const makeArr = () => []; +const makeMap = () => new Map(); +const makeObj = () => Object.create(null); -;// CONCATENATED MODULE: ./src/core/primitives.js +;// ./src/core/primitives.js const CIRCULAR_REF = Symbol("CIRCULAR_REF"); const EOF = Symbol("EOF"); @@ -806,56 +818,41 @@ return nonSerializable; }; class Dict { + __nonSerializable__ = nonSerializable; + #map = new Map(); + objId = null; + suppressEncryption = false; + xref; constructor(xref = null) { - this._map = Object.create(null); this.xref = xref; - this.objId = null; - this.suppressEncryption = false; - this.__nonSerializable__ = nonSerializable; } assignXref(newXref) { this.xref = newXref; } get size() { - return Object.keys(this._map).length; + return this.#map.size; } - get(key1, key2, key3) { - let value = this._map[key1]; + #getValue(isAsync, key1, key2, key3) { + let value = this.#map.get(key1); if (value === undefined && key2 !== undefined) { - value = this._map[key2]; + value = this.#map.get(key2); if (value === undefined && key3 !== undefined) { - value = this._map[key3]; + value = this.#map.get(key3); } } if (value instanceof Ref && this.xref) { - return this.xref.fetch(value, this.suppressEncryption); + return isAsync ? this.xref.fetchAsync(value, this.suppressEncryption) : this.xref.fetch(value, this.suppressEncryption); } return value; } + get(key1, key2, key3) { + return this.#getValue(false, key1, key2, key3); + } async getAsync(key1, key2, key3) { - let value = this._map[key1]; - if (value === undefined && key2 !== undefined) { - value = this._map[key2]; - if (value === undefined && key3 !== undefined) { - value = this._map[key3]; - } - } - if (value instanceof Ref && this.xref) { - return this.xref.fetchAsync(value, this.suppressEncryption); - } - return value; + return this.#getValue(true, key1, key2, key3); } getArray(key1, key2, key3) { - let value = this._map[key1]; - if (value === undefined && key2 !== undefined) { - value = this._map[key2]; - if (value === undefined && key3 !== undefined) { - value = this._map[key3]; - } - } - if (value instanceof Ref && this.xref) { - value = this.xref.fetch(value, this.suppressEncryption); - } + let value = this.#getValue(false, key1, key2, key3); if (Array.isArray(value)) { value = value.slice(); for (let i = 0, ii = value.length; i < ii; i++) { @@ -867,23 +864,58 @@ return value; } getRaw(key) { - return this._map[key]; + return this.#map.get(key); } getKeys() { - return Object.keys(this._map); + return this.#map.keys(); } getRawValues() { - return Object.values(this._map); + return this.#map.values(); + } + getRawEntries() { + return this.#map.entries(); } set(key, value) { - this._map[key] = value; + this.#map.set(key, value); + } + setIfNotExists(key, value) { + if (!this.has(key)) { + this.set(key, value); + } + } + setIfNumber(key, value) { + if (typeof value === "number") { + this.set(key, value); + } + } + setIfArray(key, value) { + if (Array.isArray(value) || ArrayBuffer.isView(value)) { + this.set(key, value); + } + } + setIfDefined(key, value) { + if (value !== undefined && value !== null) { + this.set(key, value); + } + } + setIfName(key, value) { + if (typeof value === "string") { + this.set(key, Name.get(value)); + } else if (value instanceof Name) { + this.set(key, value); + } + } + setIfDict(key, value) { + if (value instanceof Dict) { + this.set(key, value); + } } has(key) { - return this._map[key] !== undefined; + return this.#map.has(key); } - forEach(callback) { - for (const key in this._map) { - callback(key, this.get(key)); + *[Symbol.iterator]() { + for (const [key, value] of this.#map) { + yield [key, value instanceof Ref && this.xref ? this.xref.fetch(value, this.suppressEncryption) : value]; } } static get empty() { @@ -904,12 +936,9 @@ if (!(dict instanceof Dict)) { continue; } - for (const [key, value] of Object.entries(dict._map)) { - let property = properties.get(key); - if (property === undefined) { - property = []; - properties.set(key, property); - } else if (!mergeSubDicts || !(value instanceof Dict)) { + for (const [key, value] of dict.getRawEntries()) { + const property = properties.getOrInsertComputed(key, makeArr); + if (property.length && !(mergeSubDicts && value instanceof Dict)) { continue; } property.push(value); @@ -917,19 +946,17 @@ } for (const [name, values] of properties) { if (values.length === 1 || !(values[0] instanceof Dict)) { - mergedDict._map[name] = values[0]; + mergedDict.set(name, values[0]); continue; } const subDict = new Dict(xref); for (const dict of values) { - for (const [key, value] of Object.entries(dict._map)) { - if (subDict._map[key] === undefined) { - subDict._map[key] = value; - } + for (const [key, value] of dict.getRawEntries()) { + subDict.setIfNotExists(key, value); } } if (subDict.size > 0) { - mergedDict._map[name] = subDict; + mergedDict.set(name, subDict); } } properties.clear(); @@ -937,11 +964,14 @@ } clone() { const dict = new Dict(this.xref); - for (const key of this.getKeys()) { - dict.set(key, this.getRaw(key)); + for (const [key, value] of this.#map) { + dict.set(key, value); } return dict; } + delete(key) { + this.#map.delete(key); + } } class Ref { constructor(num, gen) { @@ -963,7 +993,7 @@ if (!m || m[1] === "0") { return null; } - return RefCache[str] = new Ref(parseInt(m[1]), !m[2] ? 0 : parseInt(m[2])); + return RefCache[str] = new Ref(parseInt(m[1], 10), !m[2] ? 0 : parseInt(m[2], 10)); } static get(num, gen) { const key = gen === 0 ? `${num}R` : `${num}R${gen}`; @@ -991,9 +1021,7 @@ } } class RefSetCache { - constructor() { - this._map = new Map(); - } + _map = new Map(); get size() { return this._map.size; } @@ -1015,6 +1043,19 @@ clear() { this._map.clear(); } + *values() { + yield* this._map.values(); + } + *items() { + for (const [ref, value] of this._map) { + yield [Ref.fromString(ref), value]; + } + } + *keys() { + for (const ref of this._map.keys()) { + yield Ref.fromString(ref); + } + } } function isName(v, name) { return v instanceof Name && (name === undefined || v.name === name); @@ -1029,14 +1070,9 @@ return v1.num === v2.num && v1.gen === v2.gen; } -;// CONCATENATED MODULE: ./src/core/base_stream.js +;// ./src/core/base_stream.js class BaseStream { - constructor() { - if (this.constructor === BaseStream) { - unreachable("Cannot initialize BaseStream."); - } - } get length() { unreachable("Abstract getter `length` accessed"); } @@ -1052,6 +1088,27 @@ getBytes(length) { unreachable("Abstract method `getBytes` called"); } + async getImageData(length, decoderOptions) { + return this.getBytes(length, decoderOptions); + } + async asyncGetBytes() { + unreachable("Abstract method `asyncGetBytes` called"); + } + get isAsync() { + return false; + } + get isAsyncDecoder() { + return false; + } + get isImageStream() { + return false; + } + get canAsyncDecodeImageFromBuffer() { + return false; + } + async getTransferableImage() { + return null; + } peekByte() { const peekedByte = this.getByte(); if (peekedByte !== -1) { @@ -1097,16 +1154,103 @@ makeSubStream(start, length, dict = null) { unreachable("Abstract method `makeSubStream` called"); } + clone() { + unreachable("Abstract method `clone` called"); + } getBaseStreams() { return null; } + getOriginalStream() { + return this.stream?.getOriginalStream() || this; + } +} + +;// ./src/core/string_utils.js + +function isAscii(str) { + return typeof str === "string" && (!str || /^[\x00-\x7F]*$/.test(str)); +} +function stringToAsciiOrUTF16BE(str) { + if (str === null || str === undefined) { + return str; + } + return isAscii(str) ? str : stringToUTF16String(str, true); +} +function stringToUTF16HexString(str) { + const buf = []; + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.charCodeAt(i); + buf.push(Util.hexNums[char >> 8 & 0xff], Util.hexNums[char & 0xff]); + } + return buf.join(""); +} +function stringToUTF16String(str, bigEndian = false) { + const buf = []; + if (bigEndian) { + buf.push("\xFE\xFF"); + } + for (let i = 0, ii = str.length; i < ii; i++) { + const char = str.charCodeAt(i); + buf.push(String.fromCharCode(char >> 8 & 0xff), String.fromCharCode(char & 0xff)); + } + return buf.join(""); +} +const PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8, 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d, 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac]; +function stringToPDFString(str, keepEscapeSequence = false) { + if (str[0] >= "\xEF") { + let encoding; + if (str[0] === "\xFE" && str[1] === "\xFF") { + encoding = "utf-16be"; + if (str.length % 2 === 1) { + str = str.slice(0, -1); + } + } else if (str[0] === "\xFF" && str[1] === "\xFE") { + encoding = "utf-16le"; + if (str.length % 2 === 1) { + str = str.slice(0, -1); + } + } else if (str[0] === "\xEF" && str[1] === "\xBB" && str[2] === "\xBF") { + encoding = "utf-8"; + } + if (encoding) { + try { + const decoder = new TextDecoder(encoding, { + fatal: true + }); + const buffer = stringToBytes(str); + const decoded = decoder.decode(buffer); + if (keepEscapeSequence || !decoded.includes("\x1b")) { + return decoded; + } + return decoded.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g, ""); + } catch (ex) { + warn(`stringToPDFString: "${ex}".`); + } + } + } + const strBuf = []; + for (let i = 0, ii = str.length; i < ii; i++) { + const charCode = str.charCodeAt(i); + if (!keepEscapeSequence && charCode === 0x1b) { + while (++i < ii && str.charCodeAt(i) !== 0x1b) {} + continue; + } + const code = PDFStringTranslateTable[charCode]; + strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); + } + return strBuf.join(""); } -;// CONCATENATED MODULE: ./src/core/core_utils.js +;// ./src/core/core_utils.js + const PDF_VERSION_REGEXP = /^[1-9]\.\d$/; +const MAX_INT_32 = 2 ** 31 - 1; +const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; +const RESOURCES_KEYS_OPERATOR_LIST = ["ColorSpace", "ExtGState", "Font", "Pattern", "Properties", "Shading", "XObject"]; +const RESOURCES_KEYS_TEXT_CONTENT = ["ExtGState", "Font", "Properties", "XObject"]; function getLookupTableFactory(initializer) { let lookup; return function () { @@ -1161,6 +1305,13 @@ } return data; } +async function fetchBinaryData(url) { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`Failed to fetch file "${url}" with "${response.statusText}".`); + } + return response.bytes(); +} function getInheritableProperty({ dict, key, @@ -1184,42 +1335,91 @@ } return values; } +function getParentToUpdate(dict, ref, xref) { + const visited = new RefSet(); + const firstDict = dict; + const result = { + dict: null, + ref: null + }; + while (dict instanceof Dict && !visited.has(ref)) { + visited.put(ref); + if (dict.has("T")) { + break; + } + ref = dict.getRaw("Parent"); + if (!(ref instanceof Ref)) { + return result; + } + dict = xref.fetch(ref); + } + if (dict instanceof Dict && dict !== firstDict) { + result.dict = dict; + result.ref = ref; + } + return result; +} +function deepCompare(a, b) { + if (a === b) { + return true; + } + if (a instanceof Ref && b instanceof Ref) { + return isRefsEqual(a, b); + } + if (a instanceof Name && b instanceof Name) { + return a.name === b.name; + } + if (a instanceof Dict && b instanceof Dict) { + if (a.size !== b.size) { + return false; + } + for (const [key, value1] of a.getRawEntries()) { + const value2 = b.getRaw(key); + if (value2 === undefined || !deepCompare(value1, value2)) { + return false; + } + } + return true; + } + if (Array.isArray(a) && Array.isArray(b)) { + if (a.length !== b.length) { + return false; + } + for (let i = 0, ii = a.length; i < ii; i++) { + if (!deepCompare(a[i], b[i])) { + return false; + } + } + return true; + } + return false; +} const ROMAN_NUMBER_MAP = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM", "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC", "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"]; function toRomanNumerals(number, lowerCase = false) { assert(Number.isInteger(number) && number > 0, "The number should be a positive integer."); - const romanBuf = []; - let pos; - while (number >= 1000) { - number -= 1000; - romanBuf.push("M"); - } - pos = number / 100 | 0; - number %= 100; - romanBuf.push(ROMAN_NUMBER_MAP[pos]); - pos = number / 10 | 0; - number %= 10; - romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]); - romanBuf.push(ROMAN_NUMBER_MAP[20 + number]); - const romanStr = romanBuf.join(""); - return lowerCase ? romanStr.toLowerCase() : romanStr; + const roman = "M".repeat(number / 1000 | 0) + ROMAN_NUMBER_MAP[number % 1000 / 100 | 0] + ROMAN_NUMBER_MAP[10 + (number % 100 / 10 | 0)] + ROMAN_NUMBER_MAP[20 + number % 10]; + return lowerCase ? roman.toLowerCase() : roman; } -function log2(x) { - if (x <= 0) { - return 0; - } - return Math.ceil(Math.log2(x)); +function isWhiteSpace(ch) { + return ch === 0x20 || ch === 0x09 || ch === 0x0d || ch === 0x0a; } -function readInt8(data, offset) { - return data[offset] << 24 >> 24; +function isBooleanArray(arr, len) { + return Array.isArray(arr) && (len === null || arr.length === len) && arr.every(x => typeof x === "boolean"); } -function readUint16(data, offset) { - return data[offset] << 8 | data[offset + 1]; +function isNumberArray(arr, len) { + if (Array.isArray(arr)) { + return (len === null || arr.length === len) && arr.every(x => typeof x === "number"); + } + return ArrayBuffer.isView(arr) && !(arr instanceof BigInt64Array || arr instanceof BigUint64Array) && (len === null || arr.length === len); } -function readUint32(data, offset) { - return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0; +function lookupMatrix(arr, fallback) { + return isNumberArray(arr, 6) ? arr : fallback; } -function isWhiteSpace(ch) { - return ch === 0x20 || ch === 0x09 || ch === 0x0d || ch === 0x0a; +function lookupRect(arr, fallback) { + return isNumberArray(arr, 4) ? arr : fallback; +} +function lookupNormalRect(arr, fallback) { + return isNumberArray(arr, 4) ? Util.normalizeRect(arr) : fallback; } function parseXFAPath(path) { const positionPattern = /(.+)\[(\d+)\]$/; @@ -1254,7 +1454,7 @@ return str; } if (start < str.length) { - buffer.push(str.substring(start, str.length)); + buffer.push(str.substring(start)); } return buffer.join(""); } @@ -1294,9 +1494,9 @@ } else if (typeof js === "string") { code = js; } - code &&= stringToPDFString(code).replaceAll("\x00", ""); + code &&= stringToPDFString(code, true).replaceAll("\x00", ""); if (code) { - list.push(code); + list.push(code.trim()); } } _collectJS(entry.getRaw("Next"), xref, list, parents); @@ -1318,15 +1518,14 @@ if (!(additionalActions instanceof Dict)) { continue; } - for (const key of additionalActions.getKeys()) { + for (const [key, rawActionDict] of additionalActions.getRawEntries()) { const action = eventType[key]; if (!action) { continue; } - const actionDict = additionalActions.getRaw(key); const parents = new RefSet(); const list = []; - _collectJS(actionDict, xref, list, parents); + _collectJS(rawActionDict, xref, list, parents); if (list.length > 0) { actions[action] = list; } @@ -1389,7 +1588,7 @@ return str; } if (start < str.length) { - buffer.push(str.substring(start, str.length)); + buffer.push(str.substring(start)); } return buffer.join(""); } @@ -1405,7 +1604,7 @@ } } else { for (const ident of fontFamily.split(/[ \t]+/)) { - if (/^(\d|(-(\d|-)))/.test(ident) || !/^[\w-\\]+$/.test(ident)) { + if (/^(?:\d|-[\d-])/.test(ident) || !/^[\w\\-]+$/.test(ident)) { if (mustWarn) { warn(`FontFamily contains invalid : ${fontFamily}.`); } @@ -1438,14 +1637,9 @@ const regex = new RegExp("^\\s*(" + URL_OPEN_METHODS.join("|").replaceAll(".", "\\.") + ")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))", "i"); const jsUrl = regex.exec(str); if (jsUrl?.[2]) { - const url = jsUrl[2]; - let newWindow = false; - if (jsUrl[3] === "true" && jsUrl[1] === "app.launchURL") { - newWindow = true; - } return { - url, - newWindow + url: jsUrl[2], + newWindow: jsUrl[1] === "app.launchURL" && jsUrl[3] === "true" }; } return null; @@ -1472,36 +1666,16 @@ if (!key.startsWith(AnnotationEditorPrefix)) { continue; } - let annotations = newAnnotationsByPage.get(value.pageIndex); - if (!annotations) { - annotations = []; - newAnnotationsByPage.set(value.pageIndex, annotations); - } - annotations.push(value); + newAnnotationsByPage.getOrInsertComputed(value.pageIndex, makeArr).push(value); } return newAnnotationsByPage.size > 0 ? newAnnotationsByPage : null; } -function isAscii(str) { - return /^[\x00-\x7F]*$/.test(str); -} -function stringToUTF16HexString(str) { - const buf = []; - for (let i = 0, ii = str.length; i < ii; i++) { - const char = str.charCodeAt(i); - buf.push((char >> 8 & 0xff).toString(16).padStart(2, "0"), (char & 0xff).toString(16).padStart(2, "0")); - } - return buf.join(""); -} -function stringToUTF16String(str, bigEndian = false) { - const buf = []; - if (bigEndian) { - buf.push("\xFE\xFF"); - } - for (let i = 0, ii = str.length; i < ii; i++) { - const char = str.charCodeAt(i); - buf.push(String.fromCharCode(char >> 8 & 0xff), String.fromCharCode(char & 0xff)); +function getModificationDate(date = new Date()) { + if (!(date instanceof Date)) { + date = new Date(date); } - return buf.join(""); + const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), date.getUTCDate().toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")]; + return buffer.join(""); } function getRotationMatrix(rotation, width, height) { switch (rotation) { @@ -1519,503 +1693,275 @@ return Math.ceil(Math.ceil(Math.log2(1 + x)) / 8); } -;// CONCATENATED MODULE: ./src/core/stream.js - - -class Stream extends BaseStream { - constructor(arrayBuffer, start, length, dict) { - super(); - this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer); - this.start = start || 0; - this.pos = this.start; - this.end = start + length || this.bytes.length; - this.dict = dict; - } - get length() { - return this.end - this.start; - } - get isEmpty() { - return this.length === 0; - } - getByte() { - if (this.pos >= this.end) { - return -1; +;// ./external/qcms/qcms_utils.js +class QCMS { + static #memoryArray = null; + static _memory = null; + static _mustAddAlpha = false; + static _destBuffer = null; + static _destOffset = 0; + static _destLength = 0; + static _cssColor = ""; + static _makeHexColor = null; + static get _memoryArray() { + const array = this.#memoryArray; + if (array?.byteLength) { + return array; } - return this.bytes[this.pos++]; + return this.#memoryArray = new Uint8Array(this._memory.buffer); } - getBytes(length) { - const bytes = this.bytes; - const pos = this.pos; - const strEnd = this.end; - if (!length) { - return bytes.subarray(pos, strEnd); - } - let end = pos + length; - if (end > strEnd) { - end = strEnd; - } - this.pos = end; - return bytes.subarray(pos, end); +} +function copy_result(ptr, len) { + const { + _mustAddAlpha, + _destBuffer, + _destOffset, + _destLength, + _memoryArray + } = QCMS; + if (len === _destLength) { + _destBuffer.set(_memoryArray.subarray(ptr, ptr + len), _destOffset); + return; } - getByteRange(begin, end) { - if (begin < 0) { - begin = 0; + if (_mustAddAlpha) { + for (let i = ptr, ii = ptr + len, j = _destOffset; i < ii; i += 3, j += 4) { + _destBuffer[j] = _memoryArray[i]; + _destBuffer[j + 1] = _memoryArray[i + 1]; + _destBuffer[j + 2] = _memoryArray[i + 2]; + _destBuffer[j + 3] = 255; } - if (end > this.end) { - end = this.end; + } else { + for (let i = ptr, ii = ptr + len, j = _destOffset; i < ii; i += 3, j += 4) { + _destBuffer[j] = _memoryArray[i]; + _destBuffer[j + 1] = _memoryArray[i + 1]; + _destBuffer[j + 2] = _memoryArray[i + 2]; } - return this.bytes.subarray(begin, end); - } - reset() { - this.pos = this.start; - } - moveStart() { - this.start = this.pos; - } - makeSubStream(start, length, dict = null) { - return new Stream(this.bytes.buffer, start, length, dict); } } -class StringStream extends Stream { - constructor(str) { - super(stringToBytes(str)); - } -} -class NullStream extends Stream { - constructor() { - super(new Uint8Array(0)); - } +function copy_rgb(ptr) { + const { + _destBuffer, + _destOffset, + _memoryArray + } = QCMS; + _destBuffer[_destOffset] = _memoryArray[ptr]; + _destBuffer[_destOffset + 1] = _memoryArray[ptr + 1]; + _destBuffer[_destOffset + 2] = _memoryArray[ptr + 2]; } - -;// CONCATENATED MODULE: ./src/core/chunked_stream.js - - - -class ChunkedStream extends Stream { - constructor(length, chunkSize, manager) { - super(new Uint8Array(length), 0, length, null); - this.chunkSize = chunkSize; - this._loadedChunks = new Set(); - this.numChunks = Math.ceil(length / chunkSize); - this.manager = manager; - this.progressiveDataLength = 0; - this.lastSuccessfulEnsureByteChunk = -1; - } - getMissingChunks() { - const chunks = []; - for (let chunk = 0, n = this.numChunks; chunk < n; ++chunk) { - if (!this._loadedChunks.has(chunk)) { - chunks.push(chunk); - } - } - return chunks; - } - get numChunksLoaded() { - return this._loadedChunks.size; - } - get isDataLoaded() { - return this.numChunksLoaded === this.numChunks; - } - onReceiveData(begin, chunk) { - const chunkSize = this.chunkSize; - if (begin % chunkSize !== 0) { - throw new Error(`Bad begin offset: ${begin}`); - } - const end = begin + chunk.byteLength; - if (end % chunkSize !== 0 && end !== this.bytes.length) { - throw new Error(`Bad end offset: ${end}`); - } - this.bytes.set(new Uint8Array(chunk), begin); - const beginChunk = Math.floor(begin / chunkSize); - const endChunk = Math.floor((end - 1) / chunkSize) + 1; - for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { - this._loadedChunks.add(curChunk); - } - } - onReceiveProgressiveData(data) { - let position = this.progressiveDataLength; - const beginChunk = Math.floor(position / this.chunkSize); - this.bytes.set(new Uint8Array(data), position); - position += data.byteLength; - this.progressiveDataLength = position; - const endChunk = position >= this.end ? this.numChunks : Math.floor(position / this.chunkSize); - for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { - this._loadedChunks.add(curChunk); - } - } - ensureByte(pos) { - if (pos < this.progressiveDataLength) { - return; - } - const chunk = Math.floor(pos / this.chunkSize); - if (chunk > this.numChunks) { - return; - } - if (chunk === this.lastSuccessfulEnsureByteChunk) { - return; - } - if (!this._loadedChunks.has(chunk)) { - throw new MissingDataException(pos, pos + 1); - } - this.lastSuccessfulEnsureByteChunk = chunk; - } - ensureRange(begin, end) { - if (begin >= end) { - return; - } - if (end <= this.progressiveDataLength) { - return; - } - const beginChunk = Math.floor(begin / this.chunkSize); - if (beginChunk > this.numChunks) { - return; - } - const endChunk = Math.min(Math.floor((end - 1) / this.chunkSize) + 1, this.numChunks); - for (let chunk = beginChunk; chunk < endChunk; ++chunk) { - if (!this._loadedChunks.has(chunk)) { - throw new MissingDataException(begin, end); - } - } - } - nextEmptyChunk(beginChunk) { - const numChunks = this.numChunks; - for (let i = 0; i < numChunks; ++i) { - const chunk = (beginChunk + i) % numChunks; - if (!this._loadedChunks.has(chunk)) { - return chunk; - } - } - return null; - } - hasChunk(chunk) { - return this._loadedChunks.has(chunk); - } - getByte() { - const pos = this.pos; - if (pos >= this.end) { - return -1; - } - if (pos >= this.progressiveDataLength) { - this.ensureByte(pos); - } - return this.bytes[this.pos++]; - } - getBytes(length) { - const bytes = this.bytes; - const pos = this.pos; - const strEnd = this.end; - if (!length) { - if (strEnd > this.progressiveDataLength) { - this.ensureRange(pos, strEnd); - } - return bytes.subarray(pos, strEnd); - } - let end = pos + length; - if (end > strEnd) { - end = strEnd; - } - if (end > this.progressiveDataLength) { - this.ensureRange(pos, end); - } - this.pos = end; - return bytes.subarray(pos, end); - } - getByteRange(begin, end) { - if (begin < 0) { - begin = 0; - } - if (end > this.end) { - end = this.end; - } - if (end > this.progressiveDataLength) { - this.ensureRange(begin, end); - } - return this.bytes.subarray(begin, end); - } - makeSubStream(start, length, dict = null) { - if (length) { - if (start + length > this.progressiveDataLength) { - this.ensureRange(start, start + length); - } - } else if (start >= this.progressiveDataLength) { - this.ensureByte(start); +function make_cssRGB(ptr) { + const { + _memoryArray + } = QCMS; + QCMS._cssColor = QCMS._makeHexColor(_memoryArray[ptr], _memoryArray[ptr + 1], _memoryArray[ptr + 2]); +} + +;// ./external/qcms/qcms.js + +const DataType = Object.freeze({ + RGB8: 0, + "0": "RGB8", + RGBA8: 1, + "1": "RGBA8", + BGRA8: 2, + "2": "BGRA8", + Gray8: 3, + "3": "Gray8", + GrayA8: 4, + "4": "GrayA8", + CMYK: 5, + "5": "CMYK" +}); +const Intent = Object.freeze({ + Perceptual: 0, + "0": "Perceptual", + RelativeColorimetric: 1, + "1": "RelativeColorimetric", + Saturation: 2, + "2": "Saturation", + AbsoluteColorimetric: 3, + "3": "AbsoluteColorimetric" +}); +function qcms_convert_array(transformer, src) { + const ptr0 = passArray8ToWasm0(src, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + wasm.qcms_convert_array(transformer, ptr0, len0); +} +function qcms_convert_four(transformer, src1, src2, src3, src4, css) { + wasm.qcms_convert_four(transformer, src1, src2, src3, src4, css); +} +function qcms_convert_one(transformer, src, css) { + wasm.qcms_convert_one(transformer, src, css); +} +function qcms_convert_three(transformer, src1, src2, src3, css) { + wasm.qcms_convert_three(transformer, src1, src2, src3, css); +} +function qcms_drop_transformer(transformer) { + wasm.qcms_drop_transformer(transformer); +} +function qcms_transformer_from_memory(mem, in_type, intent) { + const ptr0 = passArray8ToWasm0(mem, wasm.__wbindgen_malloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.qcms_transformer_from_memory(ptr0, len0, in_type, intent); + return ret >>> 0; +} +function __wbg_get_imports() { + const import0 = { + __proto__: null, + __wbg___wbindgen_throw_6b64449b9b9ed33c: function (arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }, + __wbg_copy_result_0d15f3bf9d9012ae: function (arg0, arg1) { + copy_result(arg0 >>> 0, arg1 >>> 0); + }, + __wbg_copy_rgb_0106d9d9464fce43: function (arg0) { + copy_rgb(arg0 >>> 0); + }, + __wbg_make_cssRGB_8e24b34f71f5363e: function (arg0) { + make_cssRGB(arg0 >>> 0); + }, + __wbindgen_init_externref_table: function () { + const table = wasm.__wbindgen_externrefs; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); } - function ChunkedStreamSubstream() {} - ChunkedStreamSubstream.prototype = Object.create(this); - ChunkedStreamSubstream.prototype.getMissingChunks = function () { - const chunkSize = this.chunkSize; - const beginChunk = Math.floor(this.start / chunkSize); - const endChunk = Math.floor((this.end - 1) / chunkSize) + 1; - const missingChunks = []; - for (let chunk = beginChunk; chunk < endChunk; ++chunk) { - if (!this._loadedChunks.has(chunk)) { - missingChunks.push(chunk); - } - } - return missingChunks; - }; - Object.defineProperty(ChunkedStreamSubstream.prototype, "isDataLoaded", { - get() { - if (this.numChunksLoaded === this.numChunks) { - return true; - } - return this.getMissingChunks().length === 0; - }, - configurable: true - }); - const subStream = new ChunkedStreamSubstream(); - subStream.pos = subStream.start = start; - subStream.end = start + length || this.end; - subStream.dict = dict; - return subStream; - } - getBaseStreams() { - return [this]; - } + }; + return { + __proto__: null, + "./qcms_bg.js": import0 + }; } -class ChunkedStreamManager { - constructor(pdfNetworkStream, args) { - this.length = args.length; - this.chunkSize = args.rangeChunkSize; - this.stream = new ChunkedStream(this.length, this.chunkSize, this); - this.pdfNetworkStream = pdfNetworkStream; - this.disableAutoFetch = args.disableAutoFetch; - this.msgHandler = args.msgHandler; - this.currRequestId = 0; - this._chunksNeededByRequest = new Map(); - this._requestsByChunk = new Map(); - this._promisesByRequest = new Map(); - this.progressiveDataLength = 0; - this.aborted = false; - this._loadedStreamCapability = Promise.withResolvers(); - } - sendRequest(begin, end) { - const rangeReader = this.pdfNetworkStream.getRangeReader(begin, end); - if (!rangeReader.isStreamingSupported) { - rangeReader.onProgress = this.onProgress.bind(this); - } - let chunks = [], - loaded = 0; - return new Promise((resolve, reject) => { - const readChunk = ({ - value, - done - }) => { - try { - if (done) { - const chunkData = arrayBuffersToBytes(chunks); - chunks = null; - resolve(chunkData); - return; - } - loaded += value.byteLength; - if (rangeReader.isStreamingSupported) { - this.onProgress({ - loaded - }); - } - chunks.push(value); - rangeReader.read().then(readChunk, reject); - } catch (e) { - reject(e); - } - }; - rangeReader.read().then(readChunk, reject); - }).then(data => { - if (this.aborted) { - return; - } - this.onReceiveData({ - chunk: data, - begin - }); - }); - } - requestAllChunks(noFetch = false) { - if (!noFetch) { - const missingChunks = this.stream.getMissingChunks(); - this._requestChunks(missingChunks); - } - return this._loadedStreamCapability.promise; - } - _requestChunks(chunks) { - const requestId = this.currRequestId++; - const chunksNeeded = new Set(); - this._chunksNeededByRequest.set(requestId, chunksNeeded); - for (const chunk of chunks) { - if (!this.stream.hasChunk(chunk)) { - chunksNeeded.add(chunk); - } - } - if (chunksNeeded.size === 0) { - return Promise.resolve(); - } - const capability = Promise.withResolvers(); - this._promisesByRequest.set(requestId, capability); - const chunksToRequest = []; - for (const chunk of chunksNeeded) { - let requestIds = this._requestsByChunk.get(chunk); - if (!requestIds) { - requestIds = []; - this._requestsByChunk.set(chunk, requestIds); - chunksToRequest.push(chunk); - } - requestIds.push(requestId); - } - if (chunksToRequest.length > 0) { - const groupedChunksToRequest = this.groupChunks(chunksToRequest); - for (const groupedChunk of groupedChunksToRequest) { - const begin = groupedChunk.beginChunk * this.chunkSize; - const end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length); - this.sendRequest(begin, end).catch(capability.reject); - } - } - return capability.promise.catch(reason => { - if (this.aborted) { - return; - } - throw reason; - }); - } - getStream() { - return this.stream; - } - requestRange(begin, end) { - end = Math.min(end, this.length); - const beginChunk = this.getBeginChunk(begin); - const endChunk = this.getEndChunk(end); - const chunks = []; - for (let chunk = beginChunk; chunk < endChunk; ++chunk) { - chunks.push(chunk); - } - return this._requestChunks(chunks); - } - requestRanges(ranges = []) { - const chunksToRequest = []; - for (const range of ranges) { - const beginChunk = this.getBeginChunk(range.begin); - const endChunk = this.getEndChunk(range.end); - for (let chunk = beginChunk; chunk < endChunk; ++chunk) { - if (!chunksToRequest.includes(chunk)) { - chunksToRequest.push(chunk); +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return decodeText(ptr, len); +} +let cachedUint8ArrayMemory0 = null; +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} +function passArray8ToWasm0(arg, malloc) { + const ptr = malloc(arg.length * 1, 1) >>> 0; + getUint8ArrayMemory0().set(arg, ptr / 1); + WASM_VECTOR_LEN = arg.length; + return ptr; +} +let cachedTextDecoder = new TextDecoder('utf-8', { + ignoreBOM: true, + fatal: true +}); +cachedTextDecoder.decode(); +const MAX_SAFARI_DECODE_BYTES = 2146435072; +let numBytesDecoded = 0; +function decodeText(ptr, len) { + numBytesDecoded += len; + if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) { + cachedTextDecoder = new TextDecoder('utf-8', { + ignoreBOM: true, + fatal: true + }); + cachedTextDecoder.decode(); + numBytesDecoded = len; + } + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} +let WASM_VECTOR_LEN = 0; +let wasmModule, wasm; +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + wasmModule = module; + cachedUint8ArrayMemory0 = null; + wasm.__wbindgen_start(); + return wasm; +} +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + } catch (e) { + const validResponse = module.ok && expectedResponseType(module.type); + if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + } else { + throw e; } } } - chunksToRequest.sort(function (a, b) { - return a - b; - }); - return this._requestChunks(chunksToRequest); - } - groupChunks(chunks) { - const groupedChunks = []; - let beginChunk = -1; - let prevChunk = -1; - for (let i = 0, ii = chunks.length; i < ii; ++i) { - const chunk = chunks[i]; - if (beginChunk < 0) { - beginChunk = chunk; - } - if (prevChunk >= 0 && prevChunk + 1 !== chunk) { - groupedChunks.push({ - beginChunk, - endChunk: prevChunk + 1 - }); - beginChunk = chunk; - } - if (i + 1 === chunks.length) { - groupedChunks.push({ - beginChunk, - endChunk: chunk + 1 - }); - } - prevChunk = chunk; - } - return groupedChunks; - } - onProgress(args) { - this.msgHandler.send("DocProgress", { - loaded: this.stream.numChunksLoaded * this.chunkSize + args.loaded, - total: this.length - }); - } - onReceiveData(args) { - const chunk = args.chunk; - const isProgressive = args.begin === undefined; - const begin = isProgressive ? this.progressiveDataLength : args.begin; - const end = begin + chunk.byteLength; - const beginChunk = Math.floor(begin / this.chunkSize); - const endChunk = end < this.length ? Math.floor(end / this.chunkSize) : Math.ceil(end / this.chunkSize); - if (isProgressive) { - this.stream.onReceiveProgressiveData(chunk); - this.progressiveDataLength = end; + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + } else { + const instance = await WebAssembly.instantiate(module, imports); + if (instance instanceof WebAssembly.Instance) { + return { + instance, + module + }; } else { - this.stream.onReceiveData(begin, chunk); - } - if (this.stream.isDataLoaded) { - this._loadedStreamCapability.resolve(this.stream); - } - const loadedRequests = []; - for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { - const requestIds = this._requestsByChunk.get(curChunk); - if (!requestIds) { - continue; - } - this._requestsByChunk.delete(curChunk); - for (const requestId of requestIds) { - const chunksNeeded = this._chunksNeededByRequest.get(requestId); - if (chunksNeeded.has(curChunk)) { - chunksNeeded.delete(curChunk); - } - if (chunksNeeded.size > 0) { - continue; - } - loadedRequests.push(requestId); - } - } - if (!this.disableAutoFetch && this._requestsByChunk.size === 0) { - let nextEmptyChunk; - if (this.stream.numChunksLoaded === 1) { - const lastChunk = this.stream.numChunks - 1; - if (!this.stream.hasChunk(lastChunk)) { - nextEmptyChunk = lastChunk; - } - } else { - nextEmptyChunk = this.stream.nextEmptyChunk(endChunk); - } - if (Number.isInteger(nextEmptyChunk)) { - this._requestChunks([nextEmptyChunk]); - } - } - for (const requestId of loadedRequests) { - const capability = this._promisesByRequest.get(requestId); - this._promisesByRequest.delete(requestId); - capability.resolve(); + return instance; } - this.msgHandler.send("DocProgress", { - loaded: this.stream.numChunksLoaded * this.chunkSize, - total: this.length - }); - } - onError(err) { - this._loadedStreamCapability.reject(err); - } - getBeginChunk(begin) { - return Math.floor(begin / this.chunkSize); } - getEndChunk(end) { - return Math.floor((end - 1) / this.chunkSize) + 1; - } - abort(reason) { - this.aborted = true; - this.pdfNetworkStream?.cancelAllRequests(reason); - for (const capability of this._promisesByRequest.values()) { - capability.reject(reason); + function expectedResponseType(type) { + switch (type) { + case 'basic': + case 'cors': + case 'default': + return true; } + return false; + } +} +function initSync(module) { + if (wasm !== undefined) return wasm; + if (module !== undefined) { + if (Object.getPrototypeOf(module) === Object.prototype) { + ({ + module + } = module); + } else { + console.warn('using deprecated parameters for `initSync()`; pass a single object instead'); + } + } + const imports = __wbg_get_imports(); + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + const instance = new WebAssembly.Instance(module, imports); + return __wbg_finalize_init(instance, module); +} +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + if (module_or_path !== undefined) { + if (Object.getPrototypeOf(module_or_path) === Object.prototype) { + ({ + module_or_path + } = module_or_path); + } else { + console.warn('using deprecated parameters for the initialization function; pass a single object instead'); + } + } + const imports = __wbg_get_imports(); + if (typeof module_or_path === 'string' || typeof Request === 'function' && module_or_path instanceof Request || typeof URL === 'function' && module_or_path instanceof URL) { + module_or_path = fetch(module_or_path); } + const { + instance, + module + } = await __wbg_load(await module_or_path, imports); + return __wbg_finalize_init(instance, module); } -;// CONCATENATED MODULE: ./src/core/colorspace.js +;// ./src/shared/math_clamp.js +function MathClamp(v, min, max) { + return Math.min(Math.max(v, min), max); +} +;// ./src/core/colorspace.js @@ -2042,18 +1988,86 @@ } } } +function resizeRgbaImage(src, dest, w1, h1, w2, h2, alpha01) { + const xRatio = w1 / w2; + const yRatio = h1 / h2; + let newIndex = 0; + const xScaled = new Uint16Array(w2); + if (alpha01 === 1) { + for (let i = 0; i < w2; i++) { + xScaled[i] = Math.floor(i * xRatio); + } + const src32 = new Uint32Array(src.buffer); + const dest32 = new Uint32Array(dest.buffer); + const rgbMask = FeatureTest.isLittleEndian ? 0x00ffffff : 0xffffff00; + for (let i = 0; i < h2; i++) { + const buf = src32.subarray(Math.floor(i * yRatio) * w1); + for (let j = 0; j < w2; j++) { + dest32[newIndex++] |= buf[xScaled[j]] & rgbMask; + } + } + } else { + const COMPONENTS = 4; + const w1Scanline = w1 * COMPONENTS; + for (let i = 0; i < w2; i++) { + xScaled[i] = Math.floor(i * xRatio) * COMPONENTS; + } + for (let i = 0; i < h2; i++) { + const buf = src.subarray(Math.floor(i * yRatio) * w1Scanline); + for (let j = 0; j < w2; j++) { + const oldIndex = xScaled[j]; + dest[newIndex++] = buf[oldIndex]; + dest[newIndex++] = buf[oldIndex + 1]; + dest[newIndex++] = buf[oldIndex + 2]; + } + } + } +} +function copyRgbaImage(src, dest, alpha01) { + if (alpha01 === 1) { + const src32 = new Uint32Array(src.buffer); + const dest32 = new Uint32Array(dest.buffer); + const rgbMask = FeatureTest.isLittleEndian ? 0x00ffffff : 0xffffff00; + for (let i = 0, ii = src32.length; i < ii; i++) { + dest32[i] |= src32[i] & rgbMask; + } + } else { + let j = 0; + for (let i = 0, ii = src.length; i < ii; i += 4) { + dest[j++] = src[i]; + dest[j++] = src[i + 1]; + dest[j++] = src[i + 2]; + } + } +} +function isDefaultDecodeHelper(decode, expectedLen) { + if (!Array.isArray(decode)) { + return true; + } + const decodeLen = decode.length; + if (decodeLen < expectedLen) { + warn("Decode map length is too short."); + return true; + } + if (decodeLen > expectedLen) { + info("Truncating too long decode map."); + decode.length = expectedLen; + } + return false; +} class ColorSpace { + static #rgbBuf = new Uint8ClampedArray(3); constructor(name, numComps) { - if (this.constructor === ColorSpace) { - unreachable("Cannot initialize ColorSpace."); - } this.name = name; this.numComps = numComps; } - getRgb(src, srcOffset) { - const rgb = new Uint8ClampedArray(3); - this.getRgbItem(src, srcOffset, rgb, 0); - return rgb; + getRgb(src, srcOffset, output = new Uint8ClampedArray(3)) { + this.getRgbItem(src, srcOffset, output, 0); + return output; + } + getRgbHex(src, srcOffset) { + const buffer = this.getRgb(src, srcOffset, ColorSpace.#rgbBuf); + return Util.makeHexColor(buffer[0], buffer[1], buffer[2]); } getRgbItem(src, srcOffset, dest, destOffset) { unreachable("Should not call ColorSpace.getRgbItem"); @@ -2067,8 +2081,8 @@ isPassthrough(bits) { return false; } - isDefaultDecode(decodeMap, bpc) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); + isDefaultDecode(decode, bpc) { + return ColorSpace.isDefaultDecode(decode, this.numComps); } fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) { const count = originalWidth * originalHeight; @@ -2127,191 +2141,8 @@ get usesZeroToOneRange() { return shadow(this, "usesZeroToOneRange", true); } - static _cache(cacheKey, xref, localColorSpaceCache, parsedColorSpace) { - if (!localColorSpaceCache) { - throw new Error('ColorSpace._cache - expected "localColorSpaceCache" argument.'); - } - if (!parsedColorSpace) { - throw new Error('ColorSpace._cache - expected "parsedColorSpace" argument.'); - } - let csName, csRef; - if (cacheKey instanceof Ref) { - csRef = cacheKey; - cacheKey = xref.fetch(cacheKey); - } - if (cacheKey instanceof Name) { - csName = cacheKey.name; - } - if (csName || csRef) { - localColorSpaceCache.set(csName, csRef, parsedColorSpace); - } - } - static getCached(cacheKey, xref, localColorSpaceCache) { - if (!localColorSpaceCache) { - throw new Error('ColorSpace.getCached - expected "localColorSpaceCache" argument.'); - } - if (cacheKey instanceof Ref) { - const localColorSpace = localColorSpaceCache.getByRef(cacheKey); - if (localColorSpace) { - return localColorSpace; - } - try { - cacheKey = xref.fetch(cacheKey); - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - } - } - if (cacheKey instanceof Name) { - const localColorSpace = localColorSpaceCache.getByName(cacheKey.name); - if (localColorSpace) { - return localColorSpace; - } - } - return null; - } - static async parseAsync({ - cs, - xref, - resources = null, - pdfFunctionFactory, - localColorSpaceCache - }) { - const parsedColorSpace = this._parse(cs, xref, resources, pdfFunctionFactory); - this._cache(cs, xref, localColorSpaceCache, parsedColorSpace); - return parsedColorSpace; - } - static parse({ - cs, - xref, - resources = null, - pdfFunctionFactory, - localColorSpaceCache - }) { - const cachedColorSpace = this.getCached(cs, xref, localColorSpaceCache); - if (cachedColorSpace) { - return cachedColorSpace; - } - const parsedColorSpace = this._parse(cs, xref, resources, pdfFunctionFactory); - this._cache(cs, xref, localColorSpaceCache, parsedColorSpace); - return parsedColorSpace; - } - static _parse(cs, xref, resources = null, pdfFunctionFactory) { - cs = xref.fetchIfRef(cs); - if (cs instanceof Name) { - switch (cs.name) { - case "G": - case "DeviceGray": - return this.singletons.gray; - case "RGB": - case "DeviceRGB": - return this.singletons.rgb; - case "CMYK": - case "DeviceCMYK": - return this.singletons.cmyk; - case "Pattern": - return new PatternCS(null); - default: - if (resources instanceof Dict) { - const colorSpaces = resources.get("ColorSpace"); - if (colorSpaces instanceof Dict) { - const resourcesCS = colorSpaces.get(cs.name); - if (resourcesCS) { - if (resourcesCS instanceof Name) { - return this._parse(resourcesCS, xref, resources, pdfFunctionFactory); - } - cs = resourcesCS; - break; - } - } - } - throw new FormatError(`Unrecognized ColorSpace: ${cs.name}`); - } - } - if (Array.isArray(cs)) { - const mode = xref.fetchIfRef(cs[0]).name; - let params, numComps, baseCS, whitePoint, blackPoint, gamma; - switch (mode) { - case "G": - case "DeviceGray": - return this.singletons.gray; - case "RGB": - case "DeviceRGB": - return this.singletons.rgb; - case "CMYK": - case "DeviceCMYK": - return this.singletons.cmyk; - case "CalGray": - params = xref.fetchIfRef(cs[1]); - whitePoint = params.getArray("WhitePoint"); - blackPoint = params.getArray("BlackPoint"); - gamma = params.get("Gamma"); - return new CalGrayCS(whitePoint, blackPoint, gamma); - case "CalRGB": - params = xref.fetchIfRef(cs[1]); - whitePoint = params.getArray("WhitePoint"); - blackPoint = params.getArray("BlackPoint"); - gamma = params.getArray("Gamma"); - const matrix = params.getArray("Matrix"); - return new CalRGBCS(whitePoint, blackPoint, gamma, matrix); - case "ICCBased": - const stream = xref.fetchIfRef(cs[1]); - const dict = stream.dict; - numComps = dict.get("N"); - const alt = dict.get("Alternate"); - if (alt) { - const altCS = this._parse(alt, xref, resources, pdfFunctionFactory); - if (altCS.numComps === numComps) { - return altCS; - } - warn("ICCBased color space: Ignoring incorrect /Alternate entry."); - } - if (numComps === 1) { - return this.singletons.gray; - } else if (numComps === 3) { - return this.singletons.rgb; - } else if (numComps === 4) { - return this.singletons.cmyk; - } - break; - case "Pattern": - baseCS = cs[1] || null; - if (baseCS) { - baseCS = this._parse(baseCS, xref, resources, pdfFunctionFactory); - } - return new PatternCS(baseCS); - case "I": - case "Indexed": - baseCS = this._parse(cs[1], xref, resources, pdfFunctionFactory); - const hiVal = xref.fetchIfRef(cs[2]) + 1; - const lookup = xref.fetchIfRef(cs[3]); - return new IndexedCS(baseCS, hiVal, lookup); - case "Separation": - case "DeviceN": - const name = xref.fetchIfRef(cs[1]); - numComps = Array.isArray(name) ? name.length : 1; - baseCS = this._parse(cs[2], xref, resources, pdfFunctionFactory); - const tintFn = pdfFunctionFactory.create(cs[3]); - return new AlternateCS(numComps, baseCS, tintFn); - case "Lab": - params = xref.fetchIfRef(cs[1]); - whitePoint = params.getArray("WhitePoint"); - blackPoint = params.getArray("BlackPoint"); - const range = params.getArray("Range"); - return new LabCS(whitePoint, blackPoint, range); - default: - throw new FormatError(`Unimplemented ColorSpace object: ${mode}`); - } - } - throw new FormatError(`Unrecognized ColorSpace object: ${cs}`); - } static isDefaultDecode(decode, numComps) { - if (!Array.isArray(decode)) { - return true; - } - if (numComps * 2 !== decode.length) { - warn("The decode map is not the correct length"); + if (isDefaultDecodeHelper(decode, numComps * 2)) { return true; } for (let i = 0, ii = decode.length; i < ii; i += 2) { @@ -2321,19 +2152,6 @@ } return true; } - static get singletons() { - return shadow(this, "singletons", { - get gray() { - return shadow(this, "gray", new DeviceGrayCS()); - }, - get rgb() { - return shadow(this, "rgb", new DeviceRgbCS()); - }, - get cmyk() { - return shadow(this, "cmyk", new DeviceCmykCS()); - } - }); - } } class AlternateCS extends ColorSpace { constructor(numComps, base, tintFn) { @@ -2387,7 +2205,7 @@ super("Pattern", null); this.base = baseCS; } - isDefaultDecode(decodeMap, bpc) { + isDefaultDecode(decode, bpc) { unreachable("Should not call PatternCS.isDefaultDecode"); } } @@ -2396,7 +2214,7 @@ super("Indexed", 1); this.base = base; this.highVal = highVal; - const length = base.numComps * highVal; + const length = base.numComps * (highVal + 1); this.lookup = new Uint8Array(length); if (lookup instanceof BaseStream) { const bytes = lookup.getBytes(length); @@ -2410,17 +2228,26 @@ } } getRgbItem(src, srcOffset, dest, destOffset) { - const numComps = this.base.numComps; - const start = src[srcOffset] * numComps; - this.base.getRgbBuffer(this.lookup, start, 1, dest, destOffset, 8, 0); + const { + base, + highVal, + lookup + } = this; + const start = MathClamp(Math.round(src[srcOffset]), 0, highVal) * base.numComps; + base.getRgbBuffer(lookup, start, 1, dest, destOffset, 8, 0); } getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { - const base = this.base; - const numComps = base.numComps; + const { + base, + highVal, + lookup + } = this; + const { + numComps + } = base; const outputDelta = base.getOutputLength(numComps, alpha01); - const lookup = this.lookup; for (let i = 0; i < count; ++i) { - const lookupPos = src[srcOffset++] * numComps; + const lookupPos = MathClamp(Math.round(src[srcOffset++]), 0, highVal) * numComps; base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01); destOffset += outputDelta; } @@ -2428,19 +2255,15 @@ getOutputLength(inputLength, alpha01) { return this.base.getOutputLength(inputLength * this.base.numComps, alpha01); } - isDefaultDecode(decodeMap, bpc) { - if (!Array.isArray(decodeMap)) { - return true; - } - if (decodeMap.length !== 2) { - warn("Decode map length is not correct"); + isDefaultDecode(decode, bpc) { + if (isDefaultDecodeHelper(decode, 2)) { return true; } if (!Number.isInteger(bpc) || bpc < 1) { warn("Bits per component is not correct"); return true; } - return decodeMap[0] === 0 && decodeMap[1] === (1 << bpc) - 1; + return decode[0] === 0 && decode[1] === (1 << bpc) - 1; } } class DeviceGrayCS extends ColorSpace { @@ -2498,6 +2321,24 @@ return bits === 8; } } +class DeviceRgbaCS extends ColorSpace { + constructor() { + super("DeviceRGBA", 4); + } + getOutputLength(inputLength, _alpha01) { + return inputLength * 4; + } + isPassthrough(bits) { + return bits === 8; + } + fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) { + if (originalHeight !== height || originalWidth !== width) { + resizeRgbaImage(comps, dest, originalWidth, originalHeight, width, height, alpha01); + } else { + copyRgbaImage(comps, dest, alpha01); + } + } +} class DeviceCmykCS extends ColorSpace { constructor() { super("DeviceCMYK", 4); @@ -2624,15 +2465,12 @@ } #sRGBTransferFunction(color) { if (color <= 0.0031308) { - return this.#adjustToRange(0, 1, 12.92 * color); + return MathClamp(12.92 * color, 0, 1); } if (color >= 0.99554525) { return 1; } - return this.#adjustToRange(0, 1, (1 + 0.055) * color ** (1 / 2.4) - 0.055); - } - #adjustToRange(min, max, value) { - return Math.max(min, Math.min(max, value)); + return MathClamp((1 + 0.055) * color ** (1 / 2.4) - 0.055, 0, 1); } #decodeL(L) { if (L < 0) { @@ -2688,9 +2526,9 @@ this.#matrixProduct(CalRGBCS.#BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result); } #toRgb(src, srcOffset, dest, destOffset, scale) { - const A = this.#adjustToRange(0, 1, src[srcOffset] * scale); - const B = this.#adjustToRange(0, 1, src[srcOffset + 1] * scale); - const C = this.#adjustToRange(0, 1, src[srcOffset + 2] * scale); + const A = MathClamp(src[srcOffset] * scale, 0, 1); + const B = MathClamp(src[srcOffset + 1] * scale, 0, 1); + const C = MathClamp(src[srcOffset + 2] * scale, 0, 1); const AGR = A === 1 ? 1 : A ** this.GR; const BGG = B === 1 ? 1 : B ** this.GG; const CGB = C === 1 ? 1 : C ** this.GB; @@ -2811,7 +2649,7 @@ getOutputLength(inputLength, alpha01) { return inputLength * (3 + alpha01) / 3 | 0; } - isDefaultDecode(decodeMap, bpc) { + isDefaultDecode(decode, bpc) { return true; } get usesZeroToOneRange() { @@ -2819,282 +2657,1104 @@ } } -;// CONCATENATED MODULE: ./src/core/binary_cmap.js +;// ./src/core/icc_colorspace.js -function hexToInt(a, size) { - let n = 0; - for (let i = 0; i <= size; i++) { - n = n << 8 | a[i]; + + + +function fetchSync(url) { + const xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return xhr.response; +} +class IccColorSpace extends ColorSpace { + #transformer; + #convertPixel; + static #useWasm = true; + static #wasmUrl = null; + static #finalizer = null; + constructor(iccProfile, name, numComps) { + if (!IccColorSpace.isUsable) { + throw new Error("No ICC color space support"); + } + super(name, numComps); + let inType; + switch (numComps) { + case 1: + inType = DataType.Gray8; + this.#convertPixel = (src, srcOffset, css) => qcms_convert_one(this.#transformer, src[srcOffset] * 255, css); + break; + case 3: + inType = DataType.RGB8; + this.#convertPixel = (src, srcOffset, css) => qcms_convert_three(this.#transformer, src[srcOffset] * 255, src[srcOffset + 1] * 255, src[srcOffset + 2] * 255, css); + break; + case 4: + inType = DataType.CMYK; + this.#convertPixel = (src, srcOffset, css) => qcms_convert_four(this.#transformer, src[srcOffset] * 255, src[srcOffset + 1] * 255, src[srcOffset + 2] * 255, src[srcOffset + 3] * 255, css); + break; + default: + throw new Error(`Unsupported number of components: ${numComps}`); + } + this.#transformer = qcms_transformer_from_memory(iccProfile, inType, Intent.Perceptual); + if (!this.#transformer) { + throw new Error("Failed to create ICC color space"); + } + IccColorSpace.#finalizer ||= new FinalizationRegistry(transformer => { + qcms_drop_transformer(transformer); + }); + IccColorSpace.#finalizer.register(this, this.#transformer); } - return n >>> 0; -} -function hexToStr(a, size) { - if (size === 1) { - return String.fromCharCode(a[0], a[1]); + getRgbHex(src, srcOffset) { + this.#convertPixel(src, srcOffset, true); + return QCMS._cssColor; } - if (size === 3) { - return String.fromCharCode(a[0], a[1], a[2], a[3]); + getRgbItem(src, srcOffset, dest, destOffset) { + QCMS._destBuffer = dest; + QCMS._destOffset = destOffset; + QCMS._destLength = 3; + this.#convertPixel(src, srcOffset, false); + QCMS._destBuffer = null; } - return String.fromCharCode(...a.subarray(0, size + 1)); -} -function addHex(a, b, size) { - let c = 0; - for (let i = size; i >= 0; i--) { - c += a[i] + b[i]; - a[i] = c & 255; - c >>= 8; + getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + src = src.subarray(srcOffset, srcOffset + count * this.numComps); + if (bits !== 8) { + const scale = 255 / ((1 << bits) - 1); + for (let i = 0, ii = src.length; i < ii; i++) { + src[i] *= scale; + } + } + QCMS._mustAddAlpha = alpha01 && dest.buffer === src.buffer; + QCMS._destBuffer = dest; + QCMS._destOffset = destOffset; + QCMS._destLength = count * (3 + alpha01); + qcms_convert_array(this.#transformer, src); + QCMS._mustAddAlpha = false; + QCMS._destBuffer = null; + } + getOutputLength(inputLength, alpha01) { + return inputLength / this.numComps * (3 + alpha01) | 0; + } + static setOptions({ + useWasm, + useWorkerFetch, + wasmUrl + }) { + if (!useWorkerFetch) { + this.#useWasm = false; + return; + } + this.#useWasm = useWasm; + this.#wasmUrl = wasmUrl; + } + static get isUsable() { + let isUsable = false; + if (this.#useWasm) { + if (this.#wasmUrl) { + try { + this._module = initSync({ + module: fetchSync(`${this.#wasmUrl}qcms_bg.wasm`) + }); + isUsable = !!this._module; + QCMS._memory = this._module.memory; + QCMS._makeHexColor = Util.makeHexColor.bind(Util); + } catch (e) { + warn(`ICCBased color space: "${e}".`); + } + } else { + warn("No ICC color space support due to missing `wasmUrl` API option"); + } + } + return shadow(this, "isUsable", isUsable); } } -function incHex(a, size) { - let c = 1; - for (let i = size; i >= 0 && c > 0; i--) { - c += a[i]; - a[i] = c & 255; - c >>= 8; +class CmykICCBasedCS extends IccColorSpace { + static #iccUrl; + constructor() { + const iccProfile = new Uint8Array(fetchSync(`${CmykICCBasedCS.#iccUrl}CGATS001Compat-v2-micro.icc`)); + super(iccProfile, "DeviceCMYK", 4); + } + static setOptions({ + iccUrl + }) { + this.#iccUrl = iccUrl; + } + static get isUsable() { + let isUsable = false; + if (IccColorSpace.isUsable) { + if (this.#iccUrl) { + isUsable = true; + } else { + warn("No CMYK ICC profile support due to missing `iccUrl` API option"); + } + } + return shadow(this, "isUsable", isUsable); } } -const MAX_NUM_SIZE = 16; -const MAX_ENCODED_NUM_SIZE = 19; -class BinaryCMapStream { - constructor(data) { - this.buffer = data; - this.pos = 0; - this.end = data.length; - this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE); + +;// ./src/core/stream.js + + +class Stream extends BaseStream { + constructor(arrayBuffer, start, length, dict) { + super(); + this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer); + this.start = start || 0; + this.pos = this.start; + this.end = start + length || this.bytes.length; + this.dict = dict; + } + get length() { + return this.end - this.start; + } + get isEmpty() { + return this.length === 0; } - readByte() { + getByte() { if (this.pos >= this.end) { return -1; } - return this.buffer[this.pos++]; + return this.bytes[this.pos++]; } - readNumber() { - let n = 0; - let last; - do { - const b = this.readByte(); - if (b < 0) { - throw new FormatError("unexpected EOF in bcmap"); + getBytes(length) { + const pos = this.pos; + const endPos = !length ? this.end : Math.min(pos + length, this.end); + this.pos = endPos; + return this.bytes.subarray(pos, endPos); + } + getByteRange(begin, end) { + if (begin < 0) { + begin = 0; + } + if (end > this.end) { + end = this.end; + } + return this.bytes.subarray(begin, end); + } + reset() { + this.pos = this.start; + } + moveStart() { + this.start = this.pos; + } + makeSubStream(start, length, dict = null) { + return new Stream(this.bytes.buffer, start, length, dict); + } + clone() { + return new Stream(this.bytes.buffer, this.start, this.length, this.dict?.clone()); + } +} +class StringStream extends Stream { + constructor(str, dict = null) { + super(stringToBytes(str), NaN, NaN, dict); + } +} +class NullStream extends Stream { + constructor() { + super(new Uint8Array(0)); + } +} + +;// ./src/core/chunked_stream.js + + + + +class ChunkedStream extends Stream { + progressiveDataLength = 0; + _lastSuccessfulEnsureByteChunk = -1; + _loadedChunks = new Set(); + constructor(length, chunkSize, manager) { + super(new Uint8Array(length), 0, length, null); + this.chunkSize = chunkSize; + this.numChunks = Math.ceil(length / chunkSize); + this.manager = manager; + } + getMissingChunks() { + const chunks = []; + for (let chunk = 0, n = this.numChunks; chunk < n; ++chunk) { + if (!this._loadedChunks.has(chunk)) { + chunks.push(chunk); } - last = !(b & 0x80); - n = n << 7 | b & 0x7f; - } while (!last); - return n; + } + return chunks; } - readSigned() { - const n = this.readNumber(); - return n & 1 ? ~(n >>> 1) : n >>> 1; + get numChunksLoaded() { + return this._loadedChunks.size; } - readHex(num, size) { - num.set(this.buffer.subarray(this.pos, this.pos + size + 1)); - this.pos += size + 1; + get isDataLoaded() { + return this.numChunksLoaded === this.numChunks; } - readHexNumber(num, size) { - let last; - const stack = this.tmpBuf; - let sp = 0; - do { - const b = this.readByte(); - if (b < 0) { - throw new FormatError("unexpected EOF in bcmap"); + onReceiveData(begin, chunk) { + const chunkSize = this.chunkSize; + if (begin % chunkSize !== 0) { + throw new Error(`Bad begin offset: ${begin}`); + } + const end = begin + chunk.byteLength; + if (end % chunkSize !== 0 && end !== this.bytes.length) { + throw new Error(`Bad end offset: ${end}`); + } + this.bytes.set(new Uint8Array(chunk), begin); + const beginChunk = Math.floor(begin / chunkSize); + const endChunk = Math.floor((end - 1) / chunkSize) + 1; + for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { + this._loadedChunks.add(curChunk); + } + } + onReceiveProgressiveData(data) { + let position = this.progressiveDataLength; + const beginChunk = Math.floor(position / this.chunkSize); + this.bytes.set(new Uint8Array(data), position); + position += data.byteLength; + this.progressiveDataLength = position; + const endChunk = position >= this.end ? this.numChunks : Math.floor(position / this.chunkSize); + for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { + this._loadedChunks.add(curChunk); + } + } + ensureByte(pos) { + if (pos < this.progressiveDataLength) { + return; + } + const chunk = Math.floor(pos / this.chunkSize); + if (chunk > this.numChunks) { + return; + } + if (chunk === this._lastSuccessfulEnsureByteChunk) { + return; + } + if (!this._loadedChunks.has(chunk)) { + throw new MissingDataException(pos, pos + 1); + } + this._lastSuccessfulEnsureByteChunk = chunk; + } + ensureRange(begin, end) { + if (begin >= end) { + return; + } + if (end <= this.progressiveDataLength) { + return; + } + const beginChunk = Math.floor(begin / this.chunkSize); + if (beginChunk > this.numChunks) { + return; + } + const endChunk = Math.min(Math.floor((end - 1) / this.chunkSize) + 1, this.numChunks); + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + if (!this._loadedChunks.has(chunk)) { + throw new MissingDataException(begin, end); } - last = !(b & 0x80); - stack[sp++] = b & 0x7f; - } while (!last); - let i = size, - buffer = 0, - bufferSize = 0; - while (i >= 0) { - while (bufferSize < 8 && stack.length > 0) { - buffer |= stack[--sp] << bufferSize; - bufferSize += 7; + } + } + nextEmptyChunk(beginChunk) { + const numChunks = this.numChunks; + for (let i = 0; i < numChunks; ++i) { + const chunk = (beginChunk + i) % numChunks; + if (!this._loadedChunks.has(chunk)) { + return chunk; } - num[i] = buffer & 255; - i--; - buffer >>= 8; - bufferSize -= 8; } + return null; } - readHexSigned(num, size) { - this.readHexNumber(num, size); - const sign = num[size] & 1 ? 255 : 0; - let c = 0; - for (let i = 0; i <= size; i++) { - c = (c & 1) << 8 | num[i]; - num[i] = c >> 1 ^ sign; + hasChunk(chunk) { + return this._loadedChunks.has(chunk); + } + getByte() { + const pos = this.pos; + if (pos >= this.end) { + return -1; + } + if (pos >= this.progressiveDataLength) { + this.ensureByte(pos); } + return this.bytes[this.pos++]; } - readString() { - const len = this.readNumber(), - buf = new Array(len); - for (let i = 0; i < len; i++) { - buf[i] = this.readNumber(); + getBytes(length) { + const pos = this.pos; + const endPos = !length ? this.end : Math.min(pos + length, this.end); + if (endPos > this.progressiveDataLength) { + this.ensureRange(pos, endPos); } - return String.fromCharCode(...buf); + this.pos = endPos; + return this.bytes.subarray(pos, endPos); + } + getByteRange(begin, end) { + if (begin < 0) { + begin = 0; + } + if (end > this.end) { + end = this.end; + } + if (end > this.progressiveDataLength) { + this.ensureRange(begin, end); + } + return this.bytes.subarray(begin, end); + } + makeSubStream(start, length, dict = null) { + if (length) { + if (start + length > this.progressiveDataLength) { + this.ensureRange(start, start + length); + } + } else if (start >= this.progressiveDataLength) { + this.ensureByte(start); + } + function ChunkedStreamSubstream() {} + ChunkedStreamSubstream.prototype = Object.create(this); + ChunkedStreamSubstream.prototype.getMissingChunks = function () { + const chunkSize = this.chunkSize; + const beginChunk = Math.floor(this.start / chunkSize); + const endChunk = Math.floor((this.end - 1) / chunkSize) + 1; + const missingChunks = []; + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + if (!this._loadedChunks.has(chunk)) { + missingChunks.push(chunk); + } + } + return missingChunks; + }; + Object.defineProperty(ChunkedStreamSubstream.prototype, "isDataLoaded", { + get() { + if (this.numChunksLoaded === this.numChunks) { + return true; + } + return this.getMissingChunks().length === 0; + }, + configurable: true + }); + const subStream = new ChunkedStreamSubstream(); + subStream.pos = subStream.start = start; + subStream.end = start + length || this.end; + subStream.dict = dict; + return subStream; + } + getBaseStreams() { + return [this]; } } -class BinaryCMapReader { - async process(data, cMap, extend) { - const stream = new BinaryCMapStream(data); - const header = stream.readByte(); - cMap.vertical = !!(header & 1); - let useCMap = null; - const start = new Uint8Array(MAX_NUM_SIZE); - const end = new Uint8Array(MAX_NUM_SIZE); - const char = new Uint8Array(MAX_NUM_SIZE); - const charCode = new Uint8Array(MAX_NUM_SIZE); - const tmp = new Uint8Array(MAX_NUM_SIZE); - let code; - let b; - while ((b = stream.readByte()) >= 0) { - const type = b >> 5; - if (type === 7) { - switch (b & 0x1f) { - case 0: - stream.readString(); - break; - case 1: - useCMap = stream.readString(); - break; +class ChunkedStreamManager { + #aborted = false; + currRequestId = 0; + _chunksNeededByRequest = new Map(); + #loadedStreamCapability = Promise.withResolvers(); + _promisesByRequest = new Map(); + _requestsByChunk = new Map(); + constructor(pdfStream, args) { + this.length = args.length; + this.chunkSize = args.rangeChunkSize; + this.stream = new ChunkedStream(this.length, this.chunkSize, this); + this.pdfStream = pdfStream; + this.disableAutoFetch = args.disableAutoFetch; + this.msgHandler = args.msgHandler; + } + async sendRequest(begin, end) { + const rangeReader = this.pdfStream.getRangeReader(begin, end); + let chunks = []; + while (true) { + const { + value, + done + } = await rangeReader.read(); + if (this.#aborted) { + chunks = null; + return; + } + if (done) { + break; + } + chunks.push(value); + } + if (chunks.length === 0 && this.disableAutoFetch) { + return; + } + const data = arrayBuffersToBytes(chunks); + chunks = null; + this.onReceiveData({ + chunk: data.buffer, + begin + }); + } + requestAllChunks(noFetch = false) { + if (!noFetch) { + const missingChunks = this.stream.getMissingChunks(); + this._requestChunks(missingChunks); + } + return this.#loadedStreamCapability.promise; + } + _requestChunks(chunks) { + const requestId = this.currRequestId++; + const chunksNeeded = new Set(); + this._chunksNeededByRequest.set(requestId, chunksNeeded); + for (const chunk of chunks) { + if (!this.stream.hasChunk(chunk)) { + chunksNeeded.add(chunk); + } + } + if (chunksNeeded.size === 0) { + return Promise.resolve(); + } + const capability = Promise.withResolvers(); + this._promisesByRequest.set(requestId, capability); + const chunksToRequest = []; + for (const chunk of chunksNeeded) { + const requestIds = this._requestsByChunk.getOrInsertComputed(chunk, () => { + chunksToRequest.push(chunk); + return []; + }); + requestIds.push(requestId); + } + if (chunksToRequest.length > 0) { + const groupedChunksToRequest = this.groupChunks(chunksToRequest); + for (const groupedChunk of groupedChunksToRequest) { + const begin = groupedChunk.beginChunk * this.chunkSize; + const end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length); + this.sendRequest(begin, end).catch(capability.reject); + } + } + return capability.promise.catch(reason => { + if (this.#aborted) { + return; + } + throw reason; + }); + } + getStream() { + return this.stream; + } + requestRange(begin, end) { + end = Math.min(end, this.length); + const beginChunk = this.getBeginChunk(begin); + const endChunk = this.getEndChunk(end); + const chunks = []; + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + chunks.push(chunk); + } + return this._requestChunks(chunks); + } + requestRanges(ranges = []) { + const chunksToRequest = []; + for (const range of ranges) { + const beginChunk = this.getBeginChunk(range.begin); + const endChunk = this.getEndChunk(range.end); + for (let chunk = beginChunk; chunk < endChunk; ++chunk) { + if (!chunksToRequest.includes(chunk)) { + chunksToRequest.push(chunk); } + } + } + chunksToRequest.sort((a, b) => a - b); + return this._requestChunks(chunksToRequest); + } + groupChunks(chunks) { + const groupedChunks = []; + let beginChunk = -1; + let prevChunk = -1; + for (let i = 0, ii = chunks.length; i < ii; ++i) { + const chunk = chunks[i]; + if (beginChunk < 0) { + beginChunk = chunk; + } + if (prevChunk >= 0 && prevChunk + 1 !== chunk) { + groupedChunks.push({ + beginChunk, + endChunk: prevChunk + 1 + }); + beginChunk = chunk; + } + if (i + 1 === chunks.length) { + groupedChunks.push({ + beginChunk, + endChunk: chunk + 1 + }); + } + prevChunk = chunk; + } + return groupedChunks; + } + onReceiveData(args) { + const { + chunkSize, + length, + stream + } = this; + const chunk = args.chunk; + const isProgressive = args.begin === undefined; + const begin = isProgressive ? stream.progressiveDataLength : args.begin; + const end = begin + chunk.byteLength; + const beginChunk = Math.floor(begin / chunkSize); + const endChunk = end < length ? Math.floor(end / chunkSize) : Math.ceil(end / chunkSize); + if (isProgressive) { + stream.onReceiveProgressiveData(chunk); + } else { + stream.onReceiveData(begin, chunk); + } + if (stream.isDataLoaded) { + this.#loadedStreamCapability.resolve(stream); + } + const loadedRequests = []; + for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { + const requestIds = this._requestsByChunk.get(curChunk); + if (!requestIds) { continue; } - const sequence = !!(b & 0x10); - const dataSize = b & 15; - if (dataSize + 1 > MAX_NUM_SIZE) { - throw new Error("BinaryCMapReader.process: Invalid dataSize."); + this._requestsByChunk.delete(curChunk); + for (const requestId of requestIds) { + const chunksNeeded = this._chunksNeededByRequest.get(requestId); + if (chunksNeeded.has(curChunk)) { + chunksNeeded.delete(curChunk); + } + if (chunksNeeded.size > 0) { + continue; + } + loadedRequests.push(requestId); } - const ucs2DataSize = 1; - const subitemsCount = stream.readNumber(); - switch (type) { - case 0: - stream.readHex(start, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); - for (let i = 1; i < subitemsCount; i++) { - incHex(end, dataSize); - stream.readHexNumber(start, dataSize); - addHex(start, end, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); - } - break; - case 1: - stream.readHex(start, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - stream.readNumber(); - for (let i = 1; i < subitemsCount; i++) { - incHex(end, dataSize); - stream.readHexNumber(start, dataSize); - addHex(start, end, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - stream.readNumber(); - } - break; - case 2: - stream.readHex(char, dataSize); - code = stream.readNumber(); - cMap.mapOne(hexToInt(char, dataSize), code); - for (let i = 1; i < subitemsCount; i++) { - incHex(char, dataSize); - if (!sequence) { - stream.readHexNumber(tmp, dataSize); - addHex(char, tmp, dataSize); - } - code = stream.readSigned() + (code + 1); - cMap.mapOne(hexToInt(char, dataSize), code); - } + } + if (!this.disableAutoFetch && this._requestsByChunk.size === 0) { + let nextEmptyChunk; + if (stream.numChunksLoaded === 1) { + const lastChunk = stream.numChunks - 1; + if (!stream.hasChunk(lastChunk)) { + nextEmptyChunk = lastChunk; + } + } else { + nextEmptyChunk = stream.nextEmptyChunk(endChunk); + } + if (Number.isInteger(nextEmptyChunk)) { + this._requestChunks([nextEmptyChunk]); + } + } + for (const requestId of loadedRequests) { + const capability = this._promisesByRequest.get(requestId); + this._promisesByRequest.delete(requestId); + capability.resolve(); + } + this.msgHandler.send("DocProgress", { + loaded: MathClamp(stream.numChunksLoaded * chunkSize, stream.progressiveDataLength, length), + total: length + }); + } + getBeginChunk(begin) { + return Math.floor(begin / this.chunkSize); + } + getEndChunk(end) { + return Math.floor((end - 1) / this.chunkSize) + 1; + } + abort(reason) { + this.#aborted = true; + this.pdfStream?.cancelAllRequests(reason); + for (const capability of this._promisesByRequest.values()) { + capability.reject(reason); + } + this.#loadedStreamCapability.reject(reason); + } +} + +;// ./src/shared/image_utils.js + +function convertToRGBA(params) { + switch (params.kind) { + case ImageKind.GRAYSCALE_1BPP: + return convertBlackAndWhiteToRGBA(params); + case ImageKind.RGB_24BPP: + return convertRGBToRGBA(params); + } + return null; +} +function convertBlackAndWhiteToRGBA({ + src, + srcPos = 0, + dest, + width, + height, + nonBlackColor = 0xffffffff, + inverseDecode = false +}) { + const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor]; + const widthInSource = width >> 3; + const widthRemainder = width & 7; + const xorMask = zeroMapping ^ oneMapping; + const srcLength = src.length; + dest = new Uint32Array(dest.buffer); + let destPos = 0; + for (let i = 0; i < height; ++i) { + for (const max = srcPos + widthInSource; srcPos < max; ++srcPos, destPos += 8) { + const elem = src[srcPos]; + dest[destPos] = zeroMapping ^ -(elem >> 7 & 1) & xorMask; + dest[destPos + 1] = zeroMapping ^ -(elem >> 6 & 1) & xorMask; + dest[destPos + 2] = zeroMapping ^ -(elem >> 5 & 1) & xorMask; + dest[destPos + 3] = zeroMapping ^ -(elem >> 4 & 1) & xorMask; + dest[destPos + 4] = zeroMapping ^ -(elem >> 3 & 1) & xorMask; + dest[destPos + 5] = zeroMapping ^ -(elem >> 2 & 1) & xorMask; + dest[destPos + 6] = zeroMapping ^ -(elem >> 1 & 1) & xorMask; + dest[destPos + 7] = zeroMapping ^ -(elem & 1) & xorMask; + } + if (widthRemainder === 0) { + continue; + } + const elem = srcPos < srcLength ? src[srcPos++] : 255; + for (let j = 0; j < widthRemainder; ++j, ++destPos) { + dest[destPos] = zeroMapping ^ -(elem >> 7 - j & 1) & xorMask; + } + } + return { + srcPos, + destPos + }; +} +function convertRGBToRGBA({ + src, + srcPos = 0, + dest, + destPos = 0, + width, + height +}) { + let i = 0; + const len = width * height * 3; + const len32 = len >> 2; + const src32 = new Uint32Array(src.buffer, srcPos, len32); + const alphaMask = FeatureTest.isLittleEndian ? 0xff000000 : 0xff; + if (FeatureTest.isLittleEndian) { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i], + s2 = src32[i + 1], + s3 = src32[i + 2]; + dest[destPos] = s1 | alphaMask; + dest[destPos + 1] = s1 >>> 24 | s2 << 8 | alphaMask; + dest[destPos + 2] = s2 >>> 16 | s3 << 16 | alphaMask; + dest[destPos + 3] = s3 >>> 8 | alphaMask; + } + for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | alphaMask; + } + } else { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i], + s2 = src32[i + 1], + s3 = src32[i + 2]; + dest[destPos] = s1 | alphaMask; + dest[destPos + 1] = s1 << 24 | s2 >>> 8 | alphaMask; + dest[destPos + 2] = s2 << 16 | s3 >>> 16 | alphaMask; + dest[destPos + 3] = s3 << 8 | alphaMask; + } + for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | alphaMask; + } + } + return { + srcPos: srcPos + len, + destPos + }; +} +function grayToRGBA(src, dest) { + if (FeatureTest.isLittleEndian) { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x10101 | 0xff000000; + } + } else { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x1010100 | 0x000000ff; + } + } +} + +;// ./src/core/image_resizer.js + + + +const MIN_IMAGE_DIM = 2048; +const MAX_IMAGE_DIM = 32768; +const MAX_ERROR = 128; +class ImageResizer { + static #goodSquareLength = MIN_IMAGE_DIM; + static #isImageDecoderSupported = FeatureTest.isImageDecoderSupported; + constructor(imgData, isMask) { + this._imgData = imgData; + this._isMask = isMask; + } + static get canUseImageDecoder() { + return shadow(this, "canUseImageDecoder", this.#isImageDecoderSupported ? ImageDecoder.isTypeSupported("image/bmp") : Promise.resolve(false)); + } + static needsToBeResized(width, height) { + if (width <= this.#goodSquareLength && height <= this.#goodSquareLength) { + return false; + } + const { + MAX_DIM + } = this; + if (width > MAX_DIM || height > MAX_DIM) { + return true; + } + const area = width * height; + if (this._hasMaxArea) { + return area > this.MAX_AREA; + } + if (area < this.#goodSquareLength ** 2) { + return false; + } + if (this._areGoodDims(width, height)) { + this.#goodSquareLength = Math.max(this.#goodSquareLength, Math.floor(Math.sqrt(width * height))); + return false; + } + this.#goodSquareLength = this._guessMax(this.#goodSquareLength, MAX_DIM, MAX_ERROR, 0); + const maxArea = this.MAX_AREA = this.#goodSquareLength ** 2; + return area > maxArea; + } + static getReducePowerForJPX(width, height, componentsCount) { + const area = width * height; + const maxJPXArea = 2 ** 30 / (componentsCount * 4); + if (!this.needsToBeResized(width, height)) { + if (area > maxJPXArea) { + return Math.ceil(Math.log2(area / maxJPXArea)); + } + return 0; + } + const { + MAX_DIM, + MAX_AREA + } = this; + const minFactor = Math.max(width / MAX_DIM, height / MAX_DIM, Math.sqrt(area / Math.min(maxJPXArea, MAX_AREA))); + return Math.ceil(Math.log2(minFactor)); + } + static get MAX_DIM() { + return shadow(this, "MAX_DIM", this._guessMax(MIN_IMAGE_DIM, MAX_IMAGE_DIM, 0, 1)); + } + static get MAX_AREA() { + this._hasMaxArea = true; + return shadow(this, "MAX_AREA", this._guessMax(this.#goodSquareLength, this.MAX_DIM, MAX_ERROR, 0) ** 2); + } + static set MAX_AREA(area) { + if (area >= 0) { + this._hasMaxArea = true; + shadow(this, "MAX_AREA", area); + } + } + static setOptions({ + canvasMaxAreaInBytes = -1, + isImageDecoderSupported = false + }) { + if (!this._hasMaxArea) { + this.MAX_AREA = canvasMaxAreaInBytes >> 2; + } + this.#isImageDecoderSupported = isImageDecoderSupported; + } + static _areGoodDims(width, height) { + try { + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d"); + ctx.fillRect(0, 0, 1, 1); + const opacity = ctx.getImageData(0, 0, 1, 1).data[3]; + canvas.width = canvas.height = 1; + return opacity !== 0; + } catch { + return false; + } + } + static _guessMax(start, end, tolerance, defaultHeight) { + while (start + tolerance + 1 < end) { + const middle = Math.floor((start + end) / 2); + const height = defaultHeight || middle; + if (this._areGoodDims(middle, height)) { + start = middle; + } else { + end = middle; + } + } + return start; + } + static async createImage(imgData, isMask = false) { + return new ImageResizer(imgData, isMask)._createImage(); + } + async _createImage() { + const { + _imgData: imgData + } = this; + const { + width, + height + } = imgData; + if (width * height * 4 > MAX_INT_32) { + const result = this.#rescaleImageData(); + if (result) { + return result; + } + } + const data = this._encodeBMP(); + let decoder, imagePromise; + if (await ImageResizer.canUseImageDecoder) { + decoder = new ImageDecoder({ + data, + type: "image/bmp", + preferAnimation: false, + transfer: [data.buffer] + }); + imagePromise = decoder.decode().catch(reason => { + warn(`BMP image decoding failed: ${reason}`); + return createImageBitmap(new Blob([this._encodeBMP().buffer], { + type: "image/bmp" + })); + }).finally(() => { + decoder.close(); + }); + } else { + imagePromise = createImageBitmap(new Blob([data.buffer], { + type: "image/bmp" + })); + } + const { + MAX_AREA, + MAX_DIM + } = ImageResizer; + const minFactor = Math.max(width / MAX_DIM, height / MAX_DIM, Math.sqrt(width * height / MAX_AREA)); + const firstFactor = Math.max(minFactor, 2); + const factor = Math.round(10 * (minFactor + 1.25)) / 10 / firstFactor; + const N = Math.floor(Math.log2(factor)); + const steps = new Array(N + 2).fill(2); + steps[0] = firstFactor; + steps.splice(-1, 1, factor / (1 << N)); + let newWidth = width; + let newHeight = height; + const result = await imagePromise; + let bitmap = result.image || result; + for (const step of steps) { + const prevWidth = newWidth; + const prevHeight = newHeight; + newWidth = Math.floor(newWidth / step); + newHeight = Math.floor(newHeight / step); + const canvas = new OffscreenCanvas(newWidth, newHeight); + const ctx = canvas.getContext("2d"); + ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight); + bitmap.close(); + bitmap = canvas.transferToImageBitmap(); + } + imgData.data = null; + imgData.bitmap = bitmap; + imgData.width = newWidth; + imgData.height = newHeight; + return imgData; + } + #rescaleImageData() { + const { + _imgData: imgData + } = this; + const { + data, + width, + height, + kind + } = imgData; + const rgbaSize = width * height * 4; + const K = Math.ceil(Math.log2(rgbaSize / MAX_INT_32)); + const newWidth = width >> K; + const newHeight = height >> K; + let rgbaData; + let maxHeight = height; + try { + rgbaData = new Uint8Array(rgbaSize); + } catch { + let n = Math.floor(Math.log2(rgbaSize + 1)); + while (true) { + try { + rgbaData = new Uint8Array(2 ** n - 1); break; - case 3: - stream.readHex(start, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); - for (let i = 1; i < subitemsCount; i++) { - incHex(end, dataSize); - if (!sequence) { - stream.readHexNumber(start, dataSize); - addHex(start, end, dataSize); - } else { - start.set(end); + } catch { + n -= 1; + } + } + maxHeight = Math.floor((2 ** n - 1) / (width * 4)); + const newSize = width * maxHeight * 4; + if (newSize < rgbaData.length) { + rgbaData = new Uint8Array(newSize); + } + } + const src32 = new Uint32Array(rgbaData.buffer); + const dest32 = new Uint32Array(newWidth * newHeight); + let srcPos = 0; + let newIndex = 0; + const step = Math.ceil(height / maxHeight); + const remainder = height % maxHeight === 0 ? height : height % maxHeight; + for (let k = 0; k < step; k++) { + const h = k < step - 1 ? maxHeight : remainder; + ({ + srcPos + } = convertToRGBA({ + kind, + src: data, + dest: src32, + width, + height: h, + inverseDecode: this._isMask, + srcPos + })); + for (let i = 0, ii = h >> K; i < ii; i++) { + const buf = src32.subarray((i << K) * width); + for (let j = 0; j < newWidth; j++) { + dest32[newIndex++] = buf[j << K]; + } + } + } + if (ImageResizer.needsToBeResized(newWidth, newHeight)) { + imgData.data = dest32; + imgData.width = newWidth; + imgData.height = newHeight; + imgData.kind = ImageKind.RGBA_32BPP; + return null; + } + const canvas = new OffscreenCanvas(newWidth, newHeight); + const ctx = canvas.getContext("2d", { + willReadFrequently: true + }); + ctx.putImageData(new ImageData(new Uint8ClampedArray(dest32.buffer), newWidth, newHeight), 0, 0); + imgData.data = null; + imgData.bitmap = canvas.transferToImageBitmap(); + imgData.width = newWidth; + imgData.height = newHeight; + return imgData; + } + _encodeBMP() { + const { + width, + height, + kind + } = this._imgData; + let data = this._imgData.data; + let bitPerPixel; + let colorTable = new Uint8Array(0); + let maskTable = colorTable; + let compression = 0; + switch (kind) { + case ImageKind.GRAYSCALE_1BPP: + { + bitPerPixel = 1; + colorTable = new Uint8Array(this._isMask ? [255, 255, 255, 255, 0, 0, 0, 0] : [0, 0, 0, 0, 255, 255, 255, 255]); + const rowLen = width + 7 >> 3; + const rowSize = rowLen + 3 & -4; + if (rowLen !== rowSize) { + const newData = new Uint8Array(rowSize * height); + let k = 0; + for (let i = 0, ii = height * rowLen; i < ii; i += rowLen, k += rowSize) { + newData.set(data.subarray(i, i + rowLen), k); } - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); + data = newData; } break; - case 4: - stream.readHex(char, ucs2DataSize); - stream.readHex(charCode, dataSize); - cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); - for (let i = 1; i < subitemsCount; i++) { - incHex(char, ucs2DataSize); - if (!sequence) { - stream.readHexNumber(tmp, ucs2DataSize); - addHex(char, tmp, ucs2DataSize); + } + case ImageKind.RGB_24BPP: + { + bitPerPixel = 24; + if (width & 3) { + const rowLen = 3 * width; + const rowSize = rowLen + 3 & -4; + const extraLen = rowSize - rowLen; + const newData = new Uint8Array(rowSize * height); + let k = 0; + for (let i = 0, ii = height * rowLen; i < ii; i += rowLen) { + const row = data.subarray(i, i + rowLen); + for (let j = 0; j < rowLen; j += 3) { + newData[k++] = row[j + 2]; + newData[k++] = row[j + 1]; + newData[k++] = row[j]; + } + k += extraLen; } - incHex(charCode, dataSize); - stream.readHexSigned(tmp, dataSize); - addHex(charCode, tmp, dataSize); - cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); - } - break; - case 5: - stream.readHex(start, ucs2DataSize); - stream.readHexNumber(end, ucs2DataSize); - addHex(end, start, ucs2DataSize); - stream.readHex(charCode, dataSize); - cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); - for (let i = 1; i < subitemsCount; i++) { - incHex(end, ucs2DataSize); - if (!sequence) { - stream.readHexNumber(start, ucs2DataSize); - addHex(start, end, ucs2DataSize); - } else { - start.set(end); + data = newData; + } else { + for (let i = 0, ii = data.length; i < ii; i += 3) { + const tmp = data[i]; + data[i] = data[i + 2]; + data[i + 2] = tmp; } - stream.readHexNumber(end, ucs2DataSize); - addHex(end, start, ucs2DataSize); - stream.readHex(charCode, dataSize); - cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); } break; - default: - throw new Error(`BinaryCMapReader.process - unknown type: ${type}`); - } - } - if (useCMap) { - return extend(useCMap); + } + case ImageKind.RGBA_32BPP: + bitPerPixel = 32; + compression = 3; + maskTable = new Uint8Array(4 + 4 + 4 + 4 + 52); + const view = new DataView(maskTable.buffer); + if (FeatureTest.isLittleEndian) { + view.setUint32(0, 0x000000ff, true); + view.setUint32(4, 0x0000ff00, true); + view.setUint32(8, 0x00ff0000, true); + view.setUint32(12, 0xff000000, true); + } else { + view.setUint32(0, 0xff000000, true); + view.setUint32(4, 0x00ff0000, true); + view.setUint32(8, 0x0000ff00, true); + view.setUint32(12, 0x000000ff, true); + } + break; + default: + throw new Error("invalid format"); } - return cMap; + let i = 0; + const headerLength = 40 + maskTable.length; + const fileLength = 14 + headerLength + colorTable.length + data.length; + const bmpData = new Uint8Array(fileLength); + const view = new DataView(bmpData.buffer); + view.setUint16(i, 0x4d42, true); + i += 2; + view.setUint32(i, fileLength, true); + i += 4; + view.setUint32(i, 0, true); + i += 4; + view.setUint32(i, 14 + headerLength + colorTable.length, true); + i += 4; + view.setUint32(i, headerLength, true); + i += 4; + view.setInt32(i, width, true); + i += 4; + view.setInt32(i, -height, true); + i += 4; + view.setUint16(i, 1, true); + i += 2; + view.setUint16(i, bitPerPixel, true); + i += 2; + view.setUint32(i, compression, true); + i += 4; + view.setUint32(i, 0, true); + i += 4; + view.setInt32(i, 0, true); + i += 4; + view.setInt32(i, 0, true); + i += 4; + view.setUint32(i, colorTable.length / 4, true); + i += 4; + view.setUint32(i, 0, true); + i += 4; + bmpData.set(maskTable, i); + i += maskTable.length; + bmpData.set(colorTable, i); + i += colorTable.length; + bmpData.set(data, i); + return bmpData; } } -;// CONCATENATED MODULE: ./src/core/decode_stream.js +;// ./src/core/decode_stream.js + const emptyBuffer = new Uint8Array(0); class DecodeStream extends BaseStream { + buffer = emptyBuffer; + bufferLength = 0; + eof = false; + minBufferLength = 512; + pos = 0; constructor(maybeMinBufferLength) { super(); this._rawMinBufferLength = maybeMinBufferLength || 0; - this.pos = 0; - this.bufferLength = 0; - this.eof = false; - this.buffer = emptyBuffer; - this.minBufferLength = 512; if (maybeMinBufferLength) { while (this.minBufferLength < maybeMinBufferLength) { this.minBufferLength *= 2; } } } + readBlock() { + unreachable("Abstract method `readBlock` called"); + } get isEmpty() { while (!this.eof && this.bufferLength === 0) { this.readBlock(); @@ -3124,14 +3784,14 @@ } return this.buffer[this.pos++]; } - getBytes(length) { + getBytes(length, decoderOptions = null) { const pos = this.pos; let end; if (length) { this.ensureBuffer(pos + length); end = pos + length; while (!this.eof && this.bufferLength < end) { - this.readBlock(); + this.readBlock(decoderOptions); } const bufEnd = this.bufferLength; if (end > bufEnd) { @@ -3139,13 +3799,60 @@ } } else { while (!this.eof) { - this.readBlock(); + this.readBlock(decoderOptions); } end = this.bufferLength; } this.pos = end; return this.buffer.subarray(pos, end); } + async getImageData(length, decoderOptions) { + if (!this.canAsyncDecodeImageFromBuffer) { + if (this.isAsyncDecoder) { + return this.decodeImage(null, length, decoderOptions); + } + return this.getBytes(length, decoderOptions); + } + const data = await this.stream.asyncGetBytes(); + return this.decodeImage(data, length, decoderOptions); + } + async asyncGetBytesFromDecompressionStream(name) { + this.stream.reset(); + const bytes = this.stream.isAsync ? await this.stream.asyncGetBytes() : this.stream.getBytes(); + try { + const { + readable, + writable + } = new DecompressionStream(name); + const writer = writable.getWriter(); + await writer.ready; + writer.write(bytes).then(async () => { + await writer.ready; + await writer.close(); + }).catch(() => {}); + const chunks = []; + let totalLength = 0; + for await (const chunk of readable) { + chunks.push(chunk); + totalLength += chunk.byteLength; + } + const data = new Uint8Array(totalLength); + let offset = 0; + for (const chunk of chunks) { + data.set(chunk, offset); + offset += chunk.byteLength; + } + return { + decompressed: data, + compressed: bytes + }; + } catch { + return { + decompressed: null, + compressed: bytes + }; + } + } reset() { this.pos = 0; } @@ -3162,12 +3869,19 @@ } return new Stream(this.buffer, start, length, dict); } + clone() { + while (!this.eof) { + this.readBlock(); + } + return new Stream(this.buffer, 0, this.bufferLength, this.dict?.clone()); + } getBaseStreams() { - return this.str ? this.str.getBaseStreams() : null; + return this.stream ? this.stream.getBaseStreams() : null; } } class StreamsSequenceStream extends DecodeStream { constructor(streams, onError = null) { + streams = streams.filter(s => s instanceof BaseStream && !s.isImageStream); let maybeLength = 0; for (const stream of streams) { maybeLength += stream instanceof DecodeStream ? stream._rawMinBufferLength : stream.length; @@ -3211,3162 +3925,250 @@ } } -;// CONCATENATED MODULE: ./src/core/ascii_85_stream.js - - -class Ascii85Stream extends DecodeStream { - constructor(str, maybeLength) { - if (maybeLength) { - maybeLength *= 0.8; - } - super(maybeLength); - this.str = str; - this.dict = str.dict; - this.input = new Uint8Array(5); - } - readBlock() { - const TILDA_CHAR = 0x7e; - const Z_LOWER_CHAR = 0x7a; - const EOF = -1; - const str = this.str; - let c = str.getByte(); - while (isWhiteSpace(c)) { - c = str.getByte(); - } - if (c === EOF || c === TILDA_CHAR) { - this.eof = true; - return; - } - const bufferLength = this.bufferLength; - let buffer, i; - if (c === Z_LOWER_CHAR) { - buffer = this.ensureBuffer(bufferLength + 4); - for (i = 0; i < 4; ++i) { - buffer[bufferLength + i] = 0; - } - this.bufferLength += 4; - } else { - const input = this.input; - input[0] = c; - for (i = 1; i < 5; ++i) { - c = str.getByte(); - while (isWhiteSpace(c)) { - c = str.getByte(); - } - input[i] = c; - if (c === EOF || c === TILDA_CHAR) { - break; - } - } - buffer = this.ensureBuffer(bufferLength + i - 1); - this.bufferLength += i - 1; - if (i < 5) { - for (; i < 5; ++i) { - input[i] = 0x21 + 84; - } - this.eof = true; - } - let t = 0; - for (i = 0; i < 5; ++i) { - t = t * 85 + (input[i] - 0x21); - } - for (i = 3; i >= 0; --i) { - buffer[bufferLength + i] = t & 0xff; - t >>= 8; - } - } - } -} - -;// CONCATENATED MODULE: ./src/core/ascii_hex_stream.js +;// ./src/core/colorspace_utils.js -class AsciiHexStream extends DecodeStream { - constructor(str, maybeLength) { - if (maybeLength) { - maybeLength *= 0.5; - } - super(maybeLength); - this.str = str; - this.dict = str.dict; - this.firstDigit = -1; - } - readBlock() { - const UPSTREAM_BLOCK_SIZE = 8000; - const bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE); - if (!bytes.length) { - this.eof = true; - return; - } - const maxDecodeLength = bytes.length + 1 >> 1; - const buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength); - let bufferLength = this.bufferLength; - let firstDigit = this.firstDigit; - for (const ch of bytes) { - let digit; - if (ch >= 0x30 && ch <= 0x39) { - digit = ch & 0x0f; - } else if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) { - digit = (ch & 0x0f) + 9; - } else if (ch === 0x3e) { - this.eof = true; - break; - } else { - continue; - } - if (firstDigit < 0) { - firstDigit = digit; - } else { - buffer[bufferLength++] = firstDigit << 4 | digit; - firstDigit = -1; - } - } - if (firstDigit >= 0 && this.eof) { - buffer[bufferLength++] = firstDigit << 4; - firstDigit = -1; - } - this.firstDigit = firstDigit; - this.bufferLength = bufferLength; - } -} -;// CONCATENATED MODULE: ./src/core/ccitt.js -const ccittEOL = -2; -const ccittEOF = -1; -const twoDimPass = 0; -const twoDimHoriz = 1; -const twoDimVert0 = 2; -const twoDimVertR1 = 3; -const twoDimVertL1 = 4; -const twoDimVertR2 = 5; -const twoDimVertL2 = 6; -const twoDimVertR3 = 7; -const twoDimVertL3 = 8; -const twoDimTable = [[-1, -1], [-1, -1], [7, twoDimVertL3], [7, twoDimVertR3], [6, twoDimVertL2], [6, twoDimVertL2], [6, twoDimVertR2], [6, twoDimVertR2], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0]]; -const whiteTable1 = [[-1, -1], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [12, 1984], [12, 2048], [12, 2112], [12, 2176], [12, 2240], [12, 2304], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [12, 2368], [12, 2432], [12, 2496], [12, 2560]]; -const whiteTable2 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [8, 29], [8, 29], [8, 30], [8, 30], [8, 45], [8, 45], [8, 46], [8, 46], [7, 22], [7, 22], [7, 22], [7, 22], [7, 23], [7, 23], [7, 23], [7, 23], [8, 47], [8, 47], [8, 48], [8, 48], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [7, 20], [7, 20], [7, 20], [7, 20], [8, 33], [8, 33], [8, 34], [8, 34], [8, 35], [8, 35], [8, 36], [8, 36], [8, 37], [8, 37], [8, 38], [8, 38], [7, 19], [7, 19], [7, 19], [7, 19], [8, 31], [8, 31], [8, 32], [8, 32], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [8, 53], [8, 53], [8, 54], [8, 54], [7, 26], [7, 26], [7, 26], [7, 26], [8, 39], [8, 39], [8, 40], [8, 40], [8, 41], [8, 41], [8, 42], [8, 42], [8, 43], [8, 43], [8, 44], [8, 44], [7, 21], [7, 21], [7, 21], [7, 21], [7, 28], [7, 28], [7, 28], [7, 28], [8, 61], [8, 61], [8, 62], [8, 62], [8, 63], [8, 63], [8, 0], [8, 0], [8, 320], [8, 320], [8, 384], [8, 384], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [7, 27], [7, 27], [7, 27], [7, 27], [8, 59], [8, 59], [8, 60], [8, 60], [9, 1472], [9, 1536], [9, 1600], [9, 1728], [7, 18], [7, 18], [7, 18], [7, 18], [7, 24], [7, 24], [7, 24], [7, 24], [8, 49], [8, 49], [8, 50], [8, 50], [8, 51], [8, 51], [8, 52], [8, 52], [7, 25], [7, 25], [7, 25], [7, 25], [8, 55], [8, 55], [8, 56], [8, 56], [8, 57], [8, 57], [8, 58], [8, 58], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [8, 448], [8, 448], [8, 512], [8, 512], [9, 704], [9, 768], [8, 640], [8, 640], [8, 576], [8, 576], [9, 832], [9, 896], [9, 960], [9, 1024], [9, 1088], [9, 1152], [9, 1216], [9, 1280], [9, 1344], [9, 1408], [7, 256], [7, 256], [7, 256], [7, 256], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7]]; -const blackTable1 = [[-1, -1], [-1, -1], [12, ccittEOL], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [11, 1792], [11, 1792], [12, 1984], [12, 1984], [12, 2048], [12, 2048], [12, 2112], [12, 2112], [12, 2176], [12, 2176], [12, 2240], [12, 2240], [12, 2304], [12, 2304], [11, 1856], [11, 1856], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [11, 1920], [11, 1920], [12, 2368], [12, 2368], [12, 2432], [12, 2432], [12, 2496], [12, 2496], [12, 2560], [12, 2560], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [12, 52], [12, 52], [13, 640], [13, 704], [13, 768], [13, 832], [12, 55], [12, 55], [12, 56], [12, 56], [13, 1280], [13, 1344], [13, 1408], [13, 1472], [12, 59], [12, 59], [12, 60], [12, 60], [13, 1536], [13, 1600], [11, 24], [11, 24], [11, 24], [11, 24], [11, 25], [11, 25], [11, 25], [11, 25], [13, 1664], [13, 1728], [12, 320], [12, 320], [12, 384], [12, 384], [12, 448], [12, 448], [13, 512], [13, 576], [12, 53], [12, 53], [12, 54], [12, 54], [13, 896], [13, 960], [13, 1024], [13, 1088], [13, 1152], [13, 1216], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64]]; -const blackTable2 = [[8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [11, 23], [11, 23], [12, 50], [12, 51], [12, 44], [12, 45], [12, 46], [12, 47], [12, 57], [12, 58], [12, 61], [12, 256], [10, 16], [10, 16], [10, 16], [10, 16], [10, 17], [10, 17], [10, 17], [10, 17], [12, 48], [12, 49], [12, 62], [12, 63], [12, 30], [12, 31], [12, 32], [12, 33], [12, 40], [12, 41], [11, 22], [11, 22], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [12, 128], [12, 192], [12, 26], [12, 27], [12, 28], [12, 29], [11, 19], [11, 19], [11, 20], [11, 20], [12, 34], [12, 35], [12, 36], [12, 37], [12, 38], [12, 39], [11, 21], [11, 21], [12, 42], [12, 43], [10, 0], [10, 0], [10, 0], [10, 0], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12]]; -const blackTable3 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [6, 9], [6, 8], [5, 7], [5, 7], [4, 6], [4, 6], [4, 6], [4, 6], [4, 5], [4, 5], [4, 5], [4, 5], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2]]; -class CCITTFaxDecoder { - constructor(source, options = {}) { - if (!source || typeof source.next !== "function") { - throw new Error('CCITTFaxDecoder - invalid "source" parameter.'); - } - this.source = source; - this.eof = false; - this.encoding = options.K || 0; - this.eoline = options.EndOfLine || false; - this.byteAlign = options.EncodedByteAlign || false; - this.columns = options.Columns || 1728; - this.rows = options.Rows || 0; - this.eoblock = options.EndOfBlock ?? true; - this.black = options.BlackIs1 || false; - this.codingLine = new Uint32Array(this.columns + 1); - this.refLine = new Uint32Array(this.columns + 2); - this.codingLine[0] = this.columns; - this.codingPos = 0; - this.row = 0; - this.nextLine2D = this.encoding < 0; - this.inputBits = 0; - this.inputBuf = 0; - this.outputBits = 0; - this.rowsDone = false; - let code1; - while ((code1 = this._lookBits(12)) === 0) { - this._eatBits(1); - } - if (code1 === 1) { - this._eatBits(12); - } - if (this.encoding > 0) { - this.nextLine2D = !this._lookBits(1); - this._eatBits(1); - } - } - readNextChar() { - if (this.eof) { - return -1; - } - const refLine = this.refLine; - const codingLine = this.codingLine; - const columns = this.columns; - let refPos, blackPixels, bits, i; - if (this.outputBits === 0) { - if (this.rowsDone) { - this.eof = true; - } - if (this.eof) { - return -1; - } - this.err = false; - let code1, code2, code3; - if (this.nextLine2D) { - for (i = 0; codingLine[i] < columns; ++i) { - refLine[i] = codingLine[i]; - } - refLine[i++] = columns; - refLine[i] = columns; - codingLine[0] = 0; - this.codingPos = 0; - refPos = 0; - blackPixels = 0; - while (codingLine[this.codingPos] < columns) { - code1 = this._getTwoDimCode(); - switch (code1) { - case twoDimPass: - this._addPixels(refLine[refPos + 1], blackPixels); - if (refLine[refPos + 1] < columns) { - refPos += 2; - } - break; - case twoDimHoriz: - code1 = code2 = 0; - if (blackPixels) { - do { - code1 += code3 = this._getBlackCode(); - } while (code3 >= 64); - do { - code2 += code3 = this._getWhiteCode(); - } while (code3 >= 64); - } else { - do { - code1 += code3 = this._getWhiteCode(); - } while (code3 >= 64); - do { - code2 += code3 = this._getBlackCode(); - } while (code3 >= 64); - } - this._addPixels(codingLine[this.codingPos] + code1, blackPixels); - if (codingLine[this.codingPos] < columns) { - this._addPixels(codingLine[this.codingPos] + code2, blackPixels ^ 1); - } - while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { - refPos += 2; - } - break; - case twoDimVertR3: - this._addPixels(refLine[refPos] + 3, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertR2: - this._addPixels(refLine[refPos] + 2, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertR1: - this._addPixels(refLine[refPos] + 1, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVert0: - this._addPixels(refLine[refPos], blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertL3: - this._addPixelsNeg(refLine[refPos] - 3, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - if (refPos > 0) { - --refPos; - } else { - ++refPos; - } - while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertL2: - this._addPixelsNeg(refLine[refPos] - 2, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - if (refPos > 0) { - --refPos; - } else { - ++refPos; - } - while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertL1: - this._addPixelsNeg(refLine[refPos] - 1, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - if (refPos > 0) { - --refPos; - } else { - ++refPos; - } - while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case ccittEOF: - this._addPixels(columns, 0); - this.eof = true; - break; - default: - info("bad 2d code"); - this._addPixels(columns, 0); - this.err = true; - } - } - } else { - codingLine[0] = 0; - this.codingPos = 0; - blackPixels = 0; - while (codingLine[this.codingPos] < columns) { - code1 = 0; - if (blackPixels) { - do { - code1 += code3 = this._getBlackCode(); - } while (code3 >= 64); - } else { - do { - code1 += code3 = this._getWhiteCode(); - } while (code3 >= 64); - } - this._addPixels(codingLine[this.codingPos] + code1, blackPixels); - blackPixels ^= 1; - } - } - let gotEOL = false; - if (this.byteAlign) { - this.inputBits &= ~7; - } - if (!this.eoblock && this.row === this.rows - 1) { - this.rowsDone = true; - } else { - code1 = this._lookBits(12); - if (this.eoline) { - while (code1 !== ccittEOF && code1 !== 1) { - this._eatBits(1); - code1 = this._lookBits(12); - } - } else { - while (code1 === 0) { - this._eatBits(1); - code1 = this._lookBits(12); - } - } - if (code1 === 1) { - this._eatBits(12); - gotEOL = true; - } else if (code1 === ccittEOF) { - this.eof = true; - } - } - if (!this.eof && this.encoding > 0 && !this.rowsDone) { - this.nextLine2D = !this._lookBits(1); - this._eatBits(1); - } - if (this.eoblock && gotEOL && this.byteAlign) { - code1 = this._lookBits(12); - if (code1 === 1) { - this._eatBits(12); - if (this.encoding > 0) { - this._lookBits(1); - this._eatBits(1); - } - if (this.encoding >= 0) { - for (i = 0; i < 4; ++i) { - code1 = this._lookBits(12); - if (code1 !== 1) { - info("bad rtc code: " + code1); - } - this._eatBits(12); - if (this.encoding > 0) { - this._lookBits(1); - this._eatBits(1); - } - } - } - this.eof = true; - } - } else if (this.err && this.eoline) { - while (true) { - code1 = this._lookBits(13); - if (code1 === ccittEOF) { - this.eof = true; - return -1; - } - if (code1 >> 1 === 1) { - break; - } - this._eatBits(1); - } - this._eatBits(12); - if (this.encoding > 0) { - this._eatBits(1); - this.nextLine2D = !(code1 & 1); - } - } - this.outputBits = codingLine[0] > 0 ? codingLine[this.codingPos = 0] : codingLine[this.codingPos = 1]; - this.row++; - } - let c; - if (this.outputBits >= 8) { - c = this.codingPos & 1 ? 0 : 0xff; - this.outputBits -= 8; - if (this.outputBits === 0 && codingLine[this.codingPos] < columns) { - this.codingPos++; - this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1]; - } - } else { - bits = 8; - c = 0; - do { - if (typeof this.outputBits !== "number") { - throw new FormatError('Invalid /CCITTFaxDecode data, "outputBits" must be a number.'); - } - if (this.outputBits > bits) { - c <<= bits; - if (!(this.codingPos & 1)) { - c |= 0xff >> 8 - bits; - } - this.outputBits -= bits; - bits = 0; - } else { - c <<= this.outputBits; - if (!(this.codingPos & 1)) { - c |= 0xff >> 8 - this.outputBits; - } - bits -= this.outputBits; - this.outputBits = 0; - if (codingLine[this.codingPos] < columns) { - this.codingPos++; - this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1]; - } else if (bits > 0) { - c <<= bits; - bits = 0; - } - } - } while (bits); - } - if (this.black) { - c ^= 0xff; - } - return c; - } - _addPixels(a1, blackPixels) { - const codingLine = this.codingLine; - let codingPos = this.codingPos; - if (a1 > codingLine[codingPos]) { - if (a1 > this.columns) { - info("row is wrong length"); - this.err = true; - a1 = this.columns; - } - if (codingPos & 1 ^ blackPixels) { - ++codingPos; - } - codingLine[codingPos] = a1; - } - this.codingPos = codingPos; - } - _addPixelsNeg(a1, blackPixels) { - const codingLine = this.codingLine; - let codingPos = this.codingPos; - if (a1 > codingLine[codingPos]) { - if (a1 > this.columns) { - info("row is wrong length"); - this.err = true; - a1 = this.columns; - } - if (codingPos & 1 ^ blackPixels) { - ++codingPos; - } - codingLine[codingPos] = a1; - } else if (a1 < codingLine[codingPos]) { - if (a1 < 0) { - info("invalid code"); - this.err = true; - a1 = 0; - } - while (codingPos > 0 && a1 < codingLine[codingPos - 1]) { - --codingPos; - } - codingLine[codingPos] = a1; - } - this.codingPos = codingPos; - } - _findTableCode(start, end, table, limit) { - const limitValue = limit || 0; - for (let i = start; i <= end; ++i) { - let code = this._lookBits(i); - if (code === ccittEOF) { - return [true, 1, false]; - } - if (i < end) { - code <<= end - i; - } - if (!limitValue || code >= limitValue) { - const p = table[code - limitValue]; - if (p[0] === i) { - this._eatBits(i); - return [true, p[1], true]; - } - } - } - return [false, 0, false]; - } - _getTwoDimCode() { - let code = 0; - let p; - if (this.eoblock) { - code = this._lookBits(7); - p = twoDimTable[code]; - if (p?.[0] > 0) { - this._eatBits(p[0]); - return p[1]; - } - } else { - const result = this._findTableCode(1, 7, twoDimTable); - if (result[0] && result[2]) { - return result[1]; - } - } - info("Bad two dim code"); - return ccittEOF; - } - _getWhiteCode() { - let code = 0; - let p; - if (this.eoblock) { - code = this._lookBits(12); - if (code === ccittEOF) { - return 1; - } - p = code >> 5 === 0 ? whiteTable1[code] : whiteTable2[code >> 3]; - if (p[0] > 0) { - this._eatBits(p[0]); - return p[1]; - } - } else { - let result = this._findTableCode(1, 9, whiteTable2); - if (result[0]) { - return result[1]; - } - result = this._findTableCode(11, 12, whiteTable1); - if (result[0]) { - return result[1]; - } - } - info("bad white code"); - this._eatBits(1); - return 1; - } - _getBlackCode() { - let code, p; - if (this.eoblock) { - code = this._lookBits(13); - if (code === ccittEOF) { - return 1; - } - if (code >> 7 === 0) { - p = blackTable1[code]; - } else if (code >> 9 === 0 && code >> 7 !== 0) { - p = blackTable2[(code >> 1) - 64]; - } else { - p = blackTable3[code >> 7]; - } - if (p[0] > 0) { - this._eatBits(p[0]); - return p[1]; - } - } else { - let result = this._findTableCode(2, 6, blackTable3); - if (result[0]) { - return result[1]; - } - result = this._findTableCode(7, 12, blackTable2, 64); - if (result[0]) { - return result[1]; - } - result = this._findTableCode(10, 13, blackTable1); - if (result[0]) { - return result[1]; - } - } - info("bad black code"); - this._eatBits(1); - return 1; - } - _lookBits(n) { - let c; - while (this.inputBits < n) { - if ((c = this.source.next()) === -1) { - if (this.inputBits === 0) { - return ccittEOF; - } - return this.inputBuf << n - this.inputBits & 0xffff >> 16 - n; - } - this.inputBuf = this.inputBuf << 8 | c; - this.inputBits += 8; - } - return this.inputBuf >> this.inputBits - n & 0xffff >> 16 - n; - } - _eatBits(n) { - if ((this.inputBits -= n) < 0) { - this.inputBits = 0; - } - } -} - -;// CONCATENATED MODULE: ./src/core/ccitt_stream.js -class CCITTFaxStream extends DecodeStream { - constructor(str, maybeLength, params) { - super(maybeLength); - this.str = str; - this.dict = str.dict; - if (!(params instanceof Dict)) { - params = Dict.empty; - } - const source = { - next() { - return str.getByte(); - } +class ColorSpaceUtils { + static parse({ + cs, + xref, + resources = null, + pdfFunctionFactory, + globalColorSpaceCache, + localColorSpaceCache, + asyncIfNotCached = false + }) { + const options = { + xref, + resources, + pdfFunctionFactory, + globalColorSpaceCache, + localColorSpaceCache }; - this.ccittFaxDecoder = new CCITTFaxDecoder(source, { - K: params.get("K"), - EndOfLine: params.get("EndOfLine"), - EncodedByteAlign: params.get("EncodedByteAlign"), - Columns: params.get("Columns"), - Rows: params.get("Rows"), - EndOfBlock: params.get("EndOfBlock"), - BlackIs1: params.get("BlackIs1") - }); - } - readBlock() { - while (!this.eof) { - const c = this.ccittFaxDecoder.readNextChar(); - if (c === -1) { - this.eof = true; - return; + let csName, csRef, parsedCS; + if (cs instanceof Ref) { + csRef = cs; + const cachedCS = globalColorSpaceCache.getByRef(csRef) || localColorSpaceCache.getByRef(csRef); + if (cachedCS) { + return cachedCS; } - this.ensureBuffer(this.bufferLength + 1); - this.buffer[this.bufferLength++] = c; - } - } -} - -;// CONCATENATED MODULE: ./src/core/flate_stream.js - - -const codeLenCodeMap = new Int32Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); -const lengthDecode = new Int32Array([0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102]); -const distDecode = new Int32Array([0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001]); -const fixedLitCodeTab = [new Int32Array([0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff]), 9]; -const fixedDistCodeTab = [new Int32Array([0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000]), 5]; -class FlateStream extends DecodeStream { - constructor(str, maybeLength) { - super(maybeLength); - this.str = str; - this.dict = str.dict; - const cmf = str.getByte(); - const flg = str.getByte(); - if (cmf === -1 || flg === -1) { - throw new FormatError(`Invalid header in flate stream: ${cmf}, ${flg}`); + cs = xref.fetch(cs); } - if ((cmf & 0x0f) !== 0x08) { - throw new FormatError(`Unknown compression method in flate stream: ${cmf}, ${flg}`); - } - if (((cmf << 8) + flg) % 31 !== 0) { - throw new FormatError(`Bad FCHECK in flate stream: ${cmf}, ${flg}`); - } - if (flg & 0x20) { - throw new FormatError(`FDICT bit set in flate stream: ${cmf}, ${flg}`); - } - this.codeSize = 0; - this.codeBuf = 0; - } - getBits(bits) { - const str = this.str; - let codeSize = this.codeSize; - let codeBuf = this.codeBuf; - let b; - while (codeSize < bits) { - if ((b = str.getByte()) === -1) { - throw new FormatError("Bad encoding in flate stream"); - } - codeBuf |= b << codeSize; - codeSize += 8; - } - b = codeBuf & (1 << bits) - 1; - this.codeBuf = codeBuf >> bits; - this.codeSize = codeSize -= bits; - return b; - } - getCode(table) { - const str = this.str; - const codes = table[0]; - const maxLen = table[1]; - let codeSize = this.codeSize; - let codeBuf = this.codeBuf; - let b; - while (codeSize < maxLen) { - if ((b = str.getByte()) === -1) { - break; - } - codeBuf |= b << codeSize; - codeSize += 8; - } - const code = codes[codeBuf & (1 << maxLen) - 1]; - const codeLen = code >> 16; - const codeVal = code & 0xffff; - if (codeLen < 1 || codeSize < codeLen) { - throw new FormatError("Bad encoding in flate stream"); - } - this.codeBuf = codeBuf >> codeLen; - this.codeSize = codeSize - codeLen; - return codeVal; - } - generateHuffmanTable(lengths) { - const n = lengths.length; - let maxLen = 0; - let i; - for (i = 0; i < n; ++i) { - if (lengths[i] > maxLen) { - maxLen = lengths[i]; - } - } - const size = 1 << maxLen; - const codes = new Int32Array(size); - for (let len = 1, code = 0, skip = 2; len <= maxLen; ++len, code <<= 1, skip <<= 1) { - for (let val = 0; val < n; ++val) { - if (lengths[val] === len) { - let code2 = 0; - let t = code; - for (i = 0; i < len; ++i) { - code2 = code2 << 1 | t & 1; - t >>= 1; - } - for (i = code2; i < size; i += skip) { - codes[i] = len << 16 | val; - } - ++code; - } - } - } - return [codes, maxLen]; - } - #endsStreamOnError(err) { - info(err); - this.eof = true; - } - readBlock() { - let buffer, len; - const str = this.str; - let hdr = this.getBits(3); - if (hdr & 1) { - this.eof = true; - } - hdr >>= 1; - if (hdr === 0) { - let b; - if ((b = str.getByte()) === -1) { - this.#endsStreamOnError("Bad block header in flate stream"); - return; - } - let blockLen = b; - if ((b = str.getByte()) === -1) { - this.#endsStreamOnError("Bad block header in flate stream"); - return; - } - blockLen |= b << 8; - if ((b = str.getByte()) === -1) { - this.#endsStreamOnError("Bad block header in flate stream"); - return; - } - let check = b; - if ((b = str.getByte()) === -1) { - this.#endsStreamOnError("Bad block header in flate stream"); - return; - } - check |= b << 8; - if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) { - throw new FormatError("Bad uncompressed block length in flate stream"); - } - this.codeBuf = 0; - this.codeSize = 0; - const bufferLength = this.bufferLength, - end = bufferLength + blockLen; - buffer = this.ensureBuffer(end); - this.bufferLength = end; - if (blockLen === 0) { - if (str.peekByte() === -1) { - this.eof = true; - } - } else { - const block = str.getBytes(blockLen); - buffer.set(block, bufferLength); - if (block.length < blockLen) { - this.eof = true; - } + if (cs instanceof Name) { + csName = cs.name; + const cachedCS = localColorSpaceCache.getByName(csName); + if (cachedCS) { + return cachedCS; } - return; } - let litCodeTable; - let distCodeTable; - if (hdr === 1) { - litCodeTable = fixedLitCodeTab; - distCodeTable = fixedDistCodeTab; - } else if (hdr === 2) { - const numLitCodes = this.getBits(5) + 257; - const numDistCodes = this.getBits(5) + 1; - const numCodeLenCodes = this.getBits(4) + 4; - const codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length); - let i; - for (i = 0; i < numCodeLenCodes; ++i) { - codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3); - } - const codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths); - len = 0; - i = 0; - const codes = numLitCodes + numDistCodes; - const codeLengths = new Uint8Array(codes); - let bitsLength, bitsOffset, what; - while (i < codes) { - const code = this.getCode(codeLenCodeTab); - if (code === 16) { - bitsLength = 2; - bitsOffset = 3; - what = len; - } else if (code === 17) { - bitsLength = 3; - bitsOffset = 3; - what = len = 0; - } else if (code === 18) { - bitsLength = 7; - bitsOffset = 11; - what = len = 0; - } else { - codeLengths[i++] = len = code; - continue; - } - let repeatLength = this.getBits(bitsLength) + bitsOffset; - while (repeatLength-- > 0) { - codeLengths[i++] = what; - } + try { + parsedCS = this.#parse(cs, options); + } catch (ex) { + if (asyncIfNotCached && !(ex instanceof MissingDataException)) { + return Promise.reject(ex); } - litCodeTable = this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes)); - distCodeTable = this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes)); - } else { - throw new FormatError("Unknown block type in flate stream"); + throw ex; } - buffer = this.buffer; - let limit = buffer ? buffer.length : 0; - let pos = this.bufferLength; - while (true) { - let code1 = this.getCode(litCodeTable); - if (code1 < 256) { - if (pos + 1 >= limit) { - buffer = this.ensureBuffer(pos + 1); - limit = buffer.length; - } - buffer[pos++] = code1; - continue; - } - if (code1 === 256) { - this.bufferLength = pos; - return; - } - code1 -= 257; - code1 = lengthDecode[code1]; - let code2 = code1 >> 16; - if (code2 > 0) { - code2 = this.getBits(code2); - } - len = (code1 & 0xffff) + code2; - code1 = this.getCode(distCodeTable); - code1 = distDecode[code1]; - code2 = code1 >> 16; - if (code2 > 0) { - code2 = this.getBits(code2); - } - const dist = (code1 & 0xffff) + code2; - if (pos + len >= limit) { - buffer = this.ensureBuffer(pos + len); - limit = buffer.length; - } - for (let k = 0; k < len; ++k, ++pos) { - buffer[pos] = buffer[pos - dist]; + if (csName || csRef) { + localColorSpaceCache.set(csName, csRef, parsedCS); + if (csRef) { + globalColorSpaceCache.set(null, csRef, parsedCS); } } + return asyncIfNotCached ? Promise.resolve(parsedCS) : parsedCS; } -} - -;// CONCATENATED MODULE: ./src/core/arithmetic_decoder.js -const QeTable = [{ - qe: 0x5601, - nmps: 1, - nlps: 1, - switchFlag: 1 -}, { - qe: 0x3401, - nmps: 2, - nlps: 6, - switchFlag: 0 -}, { - qe: 0x1801, - nmps: 3, - nlps: 9, - switchFlag: 0 -}, { - qe: 0x0ac1, - nmps: 4, - nlps: 12, - switchFlag: 0 -}, { - qe: 0x0521, - nmps: 5, - nlps: 29, - switchFlag: 0 -}, { - qe: 0x0221, - nmps: 38, - nlps: 33, - switchFlag: 0 -}, { - qe: 0x5601, - nmps: 7, - nlps: 6, - switchFlag: 1 -}, { - qe: 0x5401, - nmps: 8, - nlps: 14, - switchFlag: 0 -}, { - qe: 0x4801, - nmps: 9, - nlps: 14, - switchFlag: 0 -}, { - qe: 0x3801, - nmps: 10, - nlps: 14, - switchFlag: 0 -}, { - qe: 0x3001, - nmps: 11, - nlps: 17, - switchFlag: 0 -}, { - qe: 0x2401, - nmps: 12, - nlps: 18, - switchFlag: 0 -}, { - qe: 0x1c01, - nmps: 13, - nlps: 20, - switchFlag: 0 -}, { - qe: 0x1601, - nmps: 29, - nlps: 21, - switchFlag: 0 -}, { - qe: 0x5601, - nmps: 15, - nlps: 14, - switchFlag: 1 -}, { - qe: 0x5401, - nmps: 16, - nlps: 14, - switchFlag: 0 -}, { - qe: 0x5101, - nmps: 17, - nlps: 15, - switchFlag: 0 -}, { - qe: 0x4801, - nmps: 18, - nlps: 16, - switchFlag: 0 -}, { - qe: 0x3801, - nmps: 19, - nlps: 17, - switchFlag: 0 -}, { - qe: 0x3401, - nmps: 20, - nlps: 18, - switchFlag: 0 -}, { - qe: 0x3001, - nmps: 21, - nlps: 19, - switchFlag: 0 -}, { - qe: 0x2801, - nmps: 22, - nlps: 19, - switchFlag: 0 -}, { - qe: 0x2401, - nmps: 23, - nlps: 20, - switchFlag: 0 -}, { - qe: 0x2201, - nmps: 24, - nlps: 21, - switchFlag: 0 -}, { - qe: 0x1c01, - nmps: 25, - nlps: 22, - switchFlag: 0 -}, { - qe: 0x1801, - nmps: 26, - nlps: 23, - switchFlag: 0 -}, { - qe: 0x1601, - nmps: 27, - nlps: 24, - switchFlag: 0 -}, { - qe: 0x1401, - nmps: 28, - nlps: 25, - switchFlag: 0 -}, { - qe: 0x1201, - nmps: 29, - nlps: 26, - switchFlag: 0 -}, { - qe: 0x1101, - nmps: 30, - nlps: 27, - switchFlag: 0 -}, { - qe: 0x0ac1, - nmps: 31, - nlps: 28, - switchFlag: 0 -}, { - qe: 0x09c1, - nmps: 32, - nlps: 29, - switchFlag: 0 -}, { - qe: 0x08a1, - nmps: 33, - nlps: 30, - switchFlag: 0 -}, { - qe: 0x0521, - nmps: 34, - nlps: 31, - switchFlag: 0 -}, { - qe: 0x0441, - nmps: 35, - nlps: 32, - switchFlag: 0 -}, { - qe: 0x02a1, - nmps: 36, - nlps: 33, - switchFlag: 0 -}, { - qe: 0x0221, - nmps: 37, - nlps: 34, - switchFlag: 0 -}, { - qe: 0x0141, - nmps: 38, - nlps: 35, - switchFlag: 0 -}, { - qe: 0x0111, - nmps: 39, - nlps: 36, - switchFlag: 0 -}, { - qe: 0x0085, - nmps: 40, - nlps: 37, - switchFlag: 0 -}, { - qe: 0x0049, - nmps: 41, - nlps: 38, - switchFlag: 0 -}, { - qe: 0x0025, - nmps: 42, - nlps: 39, - switchFlag: 0 -}, { - qe: 0x0015, - nmps: 43, - nlps: 40, - switchFlag: 0 -}, { - qe: 0x0009, - nmps: 44, - nlps: 41, - switchFlag: 0 -}, { - qe: 0x0005, - nmps: 45, - nlps: 42, - switchFlag: 0 -}, { - qe: 0x0001, - nmps: 45, - nlps: 43, - switchFlag: 0 -}, { - qe: 0x5601, - nmps: 46, - nlps: 46, - switchFlag: 0 -}]; -class ArithmeticDecoder { - constructor(data, start, end) { - this.data = data; - this.bp = start; - this.dataEnd = end; - this.chigh = data[start]; - this.clow = 0; - this.byteIn(); - this.chigh = this.chigh << 7 & 0xffff | this.clow >> 9 & 0x7f; - this.clow = this.clow << 7 & 0xffff; - this.ct -= 7; - this.a = 0x8000; - } - byteIn() { - const data = this.data; - let bp = this.bp; - if (data[bp] === 0xff) { - if (data[bp + 1] > 0x8f) { - this.clow += 0xff00; - this.ct = 8; - } else { - bp++; - this.clow += data[bp] << 9; - this.ct = 7; - this.bp = bp; - } - } else { - bp++; - this.clow += bp < this.dataEnd ? data[bp] << 8 : 0xff00; - this.ct = 8; - this.bp = bp; - } - if (this.clow > 0xffff) { - this.chigh += this.clow >> 16; - this.clow &= 0xffff; - } - } - readBit(contexts, pos) { - let cx_index = contexts[pos] >> 1, - cx_mps = contexts[pos] & 1; - const qeTableIcx = QeTable[cx_index]; - const qeIcx = qeTableIcx.qe; - let d; - let a = this.a - qeIcx; - if (this.chigh < qeIcx) { - if (a < qeIcx) { - a = qeIcx; - d = cx_mps; - cx_index = qeTableIcx.nmps; - } else { - a = qeIcx; - d = 1 ^ cx_mps; - if (qeTableIcx.switchFlag === 1) { - cx_mps = d; - } - cx_index = qeTableIcx.nlps; - } - } else { - this.chigh -= qeIcx; - if ((a & 0x8000) !== 0) { - this.a = a; - return cx_mps; - } - if (a < qeIcx) { - d = 1 ^ cx_mps; - if (qeTableIcx.switchFlag === 1) { - cx_mps = d; - } - cx_index = qeTableIcx.nlps; - } else { - d = cx_mps; - cx_index = qeTableIcx.nmps; + static #subParse(cs, options) { + const { + globalColorSpaceCache + } = options; + let csRef; + if (cs instanceof Ref) { + csRef = cs; + const cachedCS = globalColorSpaceCache.getByRef(csRef); + if (cachedCS) { + return cachedCS; } } - do { - if (this.ct === 0) { - this.byteIn(); - } - a <<= 1; - this.chigh = this.chigh << 1 & 0xffff | this.clow >> 15 & 1; - this.clow = this.clow << 1 & 0xffff; - this.ct--; - } while ((a & 0x8000) === 0); - this.a = a; - contexts[pos] = cx_index << 1 | cx_mps; - return d; - } -} - -;// CONCATENATED MODULE: ./src/core/jbig2.js - - - - -class Jbig2Error extends BaseException { - constructor(msg) { - super(`JBIG2 error: ${msg}`, "Jbig2Error"); - } -} -class ContextCache { - getContexts(id) { - if (id in this) { - return this[id]; + const parsedCS = this.#parse(cs, options); + if (csRef) { + globalColorSpaceCache.set(null, csRef, parsedCS); } - return this[id] = new Int8Array(1 << 16); - } -} -class DecodingContext { - constructor(data, start, end) { - this.data = data; - this.start = start; - this.end = end; - } - get decoder() { - const decoder = new ArithmeticDecoder(this.data, this.start, this.end); - return shadow(this, "decoder", decoder); - } - get contextCache() { - const cache = new ContextCache(); - return shadow(this, "contextCache", cache); - } -} -const MAX_INT_32 = 2 ** 31 - 1; -const MIN_INT_32 = -(2 ** 31); -function decodeInteger(contextCache, procedure, decoder) { - const contexts = contextCache.getContexts(procedure); - let prev = 1; - function readBits(length) { - let v = 0; - for (let i = 0; i < length; i++) { - const bit = decoder.readBit(contexts, prev); - prev = prev < 256 ? prev << 1 | bit : (prev << 1 | bit) & 511 | 256; - v = v << 1 | bit; - } - return v >>> 0; - } - const sign = readBits(1); - const value = readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(32) + 4436 : readBits(12) + 340 : readBits(8) + 84 : readBits(6) + 20 : readBits(4) + 4 : readBits(2); - let signedValue; - if (sign === 0) { - signedValue = value; - } else if (value > 0) { - signedValue = -value; - } - if (signedValue >= MIN_INT_32 && signedValue <= MAX_INT_32) { - return signedValue; + return parsedCS; } - return null; -} -function decodeIAID(contextCache, decoder, codeLength) { - const contexts = contextCache.getContexts("IAID"); - let prev = 1; - for (let i = 0; i < codeLength; i++) { - const bit = decoder.readBit(contexts, prev); - prev = prev << 1 | bit; - } - if (codeLength < 31) { - return prev & (1 << codeLength) - 1; - } - return prev & 0x7fffffff; -} -const SegmentTypes = ["SymbolDictionary", null, null, null, "IntermediateTextRegion", null, "ImmediateTextRegion", "ImmediateLosslessTextRegion", null, null, null, null, null, null, null, null, "PatternDictionary", null, null, null, "IntermediateHalftoneRegion", null, "ImmediateHalftoneRegion", "ImmediateLosslessHalftoneRegion", null, null, null, null, null, null, null, null, null, null, null, null, "IntermediateGenericRegion", null, "ImmediateGenericRegion", "ImmediateLosslessGenericRegion", "IntermediateGenericRefinementRegion", null, "ImmediateGenericRefinementRegion", "ImmediateLosslessGenericRefinementRegion", null, null, null, null, "PageInformation", "EndOfPage", "EndOfStripe", "EndOfFile", "Profiles", "Tables", null, null, null, null, null, null, null, null, "Extension"]; -const CodingTemplates = [[{ - x: -1, - y: -2 -}, { - x: 0, - y: -2 -}, { - x: 1, - y: -2 -}, { - x: -2, - y: -1 -}, { - x: -1, - y: -1 -}, { - x: 0, - y: -1 -}, { - x: 1, - y: -1 -}, { - x: 2, - y: -1 -}, { - x: -4, - y: 0 -}, { - x: -3, - y: 0 -}, { - x: -2, - y: 0 -}, { - x: -1, - y: 0 -}], [{ - x: -1, - y: -2 -}, { - x: 0, - y: -2 -}, { - x: 1, - y: -2 -}, { - x: 2, - y: -2 -}, { - x: -2, - y: -1 -}, { - x: -1, - y: -1 -}, { - x: 0, - y: -1 -}, { - x: 1, - y: -1 -}, { - x: 2, - y: -1 -}, { - x: -3, - y: 0 -}, { - x: -2, - y: 0 -}, { - x: -1, - y: 0 -}], [{ - x: -1, - y: -2 -}, { - x: 0, - y: -2 -}, { - x: 1, - y: -2 -}, { - x: -2, - y: -1 -}, { - x: -1, - y: -1 -}, { - x: 0, - y: -1 -}, { - x: 1, - y: -1 -}, { - x: -2, - y: 0 -}, { - x: -1, - y: 0 -}], [{ - x: -3, - y: -1 -}, { - x: -2, - y: -1 -}, { - x: -1, - y: -1 -}, { - x: 0, - y: -1 -}, { - x: 1, - y: -1 -}, { - x: -4, - y: 0 -}, { - x: -3, - y: 0 -}, { - x: -2, - y: 0 -}, { - x: -1, - y: 0 -}]]; -const RefinementTemplates = [{ - coding: [{ - x: 0, - y: -1 - }, { - x: 1, - y: -1 - }, { - x: -1, - y: 0 - }], - reference: [{ - x: 0, - y: -1 - }, { - x: 1, - y: -1 - }, { - x: -1, - y: 0 - }, { - x: 0, - y: 0 - }, { - x: 1, - y: 0 - }, { - x: -1, - y: 1 - }, { - x: 0, - y: 1 - }, { - x: 1, - y: 1 - }] -}, { - coding: [{ - x: -1, - y: -1 - }, { - x: 0, - y: -1 - }, { - x: 1, - y: -1 - }, { - x: -1, - y: 0 - }], - reference: [{ - x: 0, - y: -1 - }, { - x: -1, - y: 0 - }, { - x: 0, - y: 0 - }, { - x: 1, - y: 0 - }, { - x: 0, - y: 1 - }, { - x: 1, - y: 1 - }] -}]; -const ReusedContexts = [0x9b25, 0x0795, 0x00e5, 0x0195]; -const RefinementReusedContexts = [0x0020, 0x0008]; -function decodeBitmapTemplate0(width, height, decodingContext) { - const decoder = decodingContext.decoder; - const contexts = decodingContext.contextCache.getContexts("GB"); - const bitmap = []; - let contextLabel, i, j, pixel, row, row1, row2; - const OLD_PIXEL_MASK = 0x7bf7; - for (i = 0; i < height; i++) { - row = bitmap[i] = new Uint8Array(width); - row1 = i < 1 ? row : bitmap[i - 1]; - row2 = i < 2 ? row : bitmap[i - 2]; - contextLabel = row2[0] << 13 | row2[1] << 12 | row2[2] << 11 | row1[0] << 7 | row1[1] << 6 | row1[2] << 5 | row1[3] << 4; - for (j = 0; j < width; j++) { - row[j] = pixel = decoder.readBit(contexts, contextLabel); - contextLabel = (contextLabel & OLD_PIXEL_MASK) << 1 | (j + 3 < width ? row2[j + 3] << 11 : 0) | (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel; - } - } - return bitmap; -} -function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, decodingContext) { - if (mmr) { - const input = new Reader(decodingContext.data, decodingContext.start, decodingContext.end); - return decodeMMRBitmap(input, width, height, false); - } - if (templateIndex === 0 && !skip && !prediction && at.length === 4 && at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 && at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) { - return decodeBitmapTemplate0(width, height, decodingContext); - } - const useskip = !!skip; - const template = CodingTemplates[templateIndex].concat(at); - template.sort(function (a, b) { - return a.y - b.y || a.x - b.x; - }); - const templateLength = template.length; - const templateX = new Int8Array(templateLength); - const templateY = new Int8Array(templateLength); - const changingTemplateEntries = []; - let reuseMask = 0, - minX = 0, - maxX = 0, - minY = 0; - let c, k; - for (k = 0; k < templateLength; k++) { - templateX[k] = template[k].x; - templateY[k] = template[k].y; - minX = Math.min(minX, template[k].x); - maxX = Math.max(maxX, template[k].x); - minY = Math.min(minY, template[k].y); - if (k < templateLength - 1 && template[k].y === template[k + 1].y && template[k].x === template[k + 1].x - 1) { - reuseMask |= 1 << templateLength - 1 - k; - } else { - changingTemplateEntries.push(k); - } - } - const changingEntriesLength = changingTemplateEntries.length; - const changingTemplateX = new Int8Array(changingEntriesLength); - const changingTemplateY = new Int8Array(changingEntriesLength); - const changingTemplateBit = new Uint16Array(changingEntriesLength); - for (c = 0; c < changingEntriesLength; c++) { - k = changingTemplateEntries[c]; - changingTemplateX[c] = template[k].x; - changingTemplateY[c] = template[k].y; - changingTemplateBit[c] = 1 << templateLength - 1 - k; - } - const sbb_left = -minX; - const sbb_top = -minY; - const sbb_right = width - maxX; - const pseudoPixelContext = ReusedContexts[templateIndex]; - let row = new Uint8Array(width); - const bitmap = []; - const decoder = decodingContext.decoder; - const contexts = decodingContext.contextCache.getContexts("GB"); - let ltp = 0, - j, - i0, - j0, - contextLabel = 0, - bit, - shift; - for (let i = 0; i < height; i++) { - if (prediction) { - const sltp = decoder.readBit(contexts, pseudoPixelContext); - ltp ^= sltp; - if (ltp) { - bitmap.push(row); - continue; - } - } - row = new Uint8Array(row); - bitmap.push(row); - for (j = 0; j < width; j++) { - if (useskip && skip[i][j]) { - row[j] = 0; - continue; - } - if (j >= sbb_left && j < sbb_right && i >= sbb_top) { - contextLabel = contextLabel << 1 & reuseMask; - for (k = 0; k < changingEntriesLength; k++) { - i0 = i + changingTemplateY[k]; - j0 = j + changingTemplateX[k]; - bit = bitmap[i0][j0]; - if (bit) { - bit = changingTemplateBit[k]; - contextLabel |= bit; - } - } - } else { - contextLabel = 0; - shift = templateLength - 1; - for (k = 0; k < templateLength; k++, shift--) { - j0 = j + templateX[k]; - if (j0 >= 0 && j0 < width) { - i0 = i + templateY[k]; - if (i0 >= 0) { - bit = bitmap[i0][j0]; - if (bit) { - contextLabel |= bit << shift; + static #parse(cs, options) { + const { + xref, + resources, + pdfFunctionFactory, + globalColorSpaceCache + } = options; + cs = xref.fetchIfRef(cs); + if (cs instanceof Name) { + switch (cs.name) { + case "G": + case "DeviceGray": + return this.gray; + case "RGB": + case "DeviceRGB": + return this.rgb; + case "DeviceRGBA": + return this.rgba; + case "CMYK": + case "DeviceCMYK": + return this.cmyk; + case "Pattern": + return new PatternCS(null); + default: + if (resources instanceof Dict) { + const colorSpaces = resources.get("ColorSpace"); + if (colorSpaces instanceof Dict) { + const resourcesCS = colorSpaces.get(cs.name); + if (resourcesCS) { + if (resourcesCS instanceof Name) { + return this.#parse(resourcesCS, options); + } + cs = resourcesCS; + break; } } } - } - } - const pixel = decoder.readBit(contexts, contextLabel); - row[j] = pixel; - } - } - return bitmap; -} -function decodeRefinement(width, height, templateIndex, referenceBitmap, offsetX, offsetY, prediction, at, decodingContext) { - let codingTemplate = RefinementTemplates[templateIndex].coding; - if (templateIndex === 0) { - codingTemplate = codingTemplate.concat([at[0]]); - } - const codingTemplateLength = codingTemplate.length; - const codingTemplateX = new Int32Array(codingTemplateLength); - const codingTemplateY = new Int32Array(codingTemplateLength); - let k; - for (k = 0; k < codingTemplateLength; k++) { - codingTemplateX[k] = codingTemplate[k].x; - codingTemplateY[k] = codingTemplate[k].y; - } - let referenceTemplate = RefinementTemplates[templateIndex].reference; - if (templateIndex === 0) { - referenceTemplate = referenceTemplate.concat([at[1]]); - } - const referenceTemplateLength = referenceTemplate.length; - const referenceTemplateX = new Int32Array(referenceTemplateLength); - const referenceTemplateY = new Int32Array(referenceTemplateLength); - for (k = 0; k < referenceTemplateLength; k++) { - referenceTemplateX[k] = referenceTemplate[k].x; - referenceTemplateY[k] = referenceTemplate[k].y; - } - const referenceWidth = referenceBitmap[0].length; - const referenceHeight = referenceBitmap.length; - const pseudoPixelContext = RefinementReusedContexts[templateIndex]; - const bitmap = []; - const decoder = decodingContext.decoder; - const contexts = decodingContext.contextCache.getContexts("GR"); - let ltp = 0; - for (let i = 0; i < height; i++) { - if (prediction) { - const sltp = decoder.readBit(contexts, pseudoPixelContext); - ltp ^= sltp; - if (ltp) { - throw new Jbig2Error("prediction is not supported"); - } - } - const row = new Uint8Array(width); - bitmap.push(row); - for (let j = 0; j < width; j++) { - let i0, j0; - let contextLabel = 0; - for (k = 0; k < codingTemplateLength; k++) { - i0 = i + codingTemplateY[k]; - j0 = j + codingTemplateX[k]; - if (i0 < 0 || j0 < 0 || j0 >= width) { - contextLabel <<= 1; - } else { - contextLabel = contextLabel << 1 | bitmap[i0][j0]; - } - } - for (k = 0; k < referenceTemplateLength; k++) { - i0 = i + referenceTemplateY[k] - offsetY; - j0 = j + referenceTemplateX[k] - offsetX; - if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth) { - contextLabel <<= 1; - } else { - contextLabel = contextLabel << 1 | referenceBitmap[i0][j0]; - } - } - const pixel = decoder.readBit(contexts, contextLabel); - row[j] = pixel; - } - } - return bitmap; -} -function decodeSymbolDictionary(huffman, refinement, symbols, numberOfNewSymbols, numberOfExportedSymbols, huffmanTables, templateIndex, at, refinementTemplateIndex, refinementAt, decodingContext, huffmanInput) { - if (huffman && refinement) { - throw new Jbig2Error("symbol refinement with Huffman is not supported"); - } - const newSymbols = []; - let currentHeight = 0; - let symbolCodeLength = log2(symbols.length + numberOfNewSymbols); - const decoder = decodingContext.decoder; - const contextCache = decodingContext.contextCache; - let tableB1, symbolWidths; - if (huffman) { - tableB1 = getStandardTable(1); - symbolWidths = []; - symbolCodeLength = Math.max(symbolCodeLength, 1); - } - while (newSymbols.length < numberOfNewSymbols) { - const deltaHeight = huffman ? huffmanTables.tableDeltaHeight.decode(huffmanInput) : decodeInteger(contextCache, "IADH", decoder); - currentHeight += deltaHeight; - let currentWidth = 0, - totalWidth = 0; - const firstSymbol = huffman ? symbolWidths.length : 0; - while (true) { - const deltaWidth = huffman ? huffmanTables.tableDeltaWidth.decode(huffmanInput) : decodeInteger(contextCache, "IADW", decoder); - if (deltaWidth === null) { - break; - } - currentWidth += deltaWidth; - totalWidth += currentWidth; - let bitmap; - if (refinement) { - const numberOfInstances = decodeInteger(contextCache, "IAAI", decoder); - if (numberOfInstances > 1) { - bitmap = decodeTextRegion(huffman, refinement, currentWidth, currentHeight, 0, numberOfInstances, 1, symbols.concat(newSymbols), symbolCodeLength, 0, 0, 1, 0, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, 0, huffmanInput); - } else { - const symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); - const rdx = decodeInteger(contextCache, "IARDX", decoder); - const rdy = decodeInteger(contextCache, "IARDY", decoder); - const symbol = symbolId < symbols.length ? symbols[symbolId] : newSymbols[symbolId - symbols.length]; - bitmap = decodeRefinement(currentWidth, currentHeight, refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, decodingContext); - } - newSymbols.push(bitmap); - } else if (huffman) { - symbolWidths.push(currentWidth); - } else { - bitmap = decodeBitmap(false, currentWidth, currentHeight, templateIndex, false, null, at, decodingContext); - newSymbols.push(bitmap); - } - } - if (huffman && !refinement) { - const bitmapSize = huffmanTables.tableBitmapSize.decode(huffmanInput); - huffmanInput.byteAlign(); - let collectiveBitmap; - if (bitmapSize === 0) { - collectiveBitmap = readUncompressedBitmap(huffmanInput, totalWidth, currentHeight); - } else { - const originalEnd = huffmanInput.end; - const bitmapEnd = huffmanInput.position + bitmapSize; - huffmanInput.end = bitmapEnd; - collectiveBitmap = decodeMMRBitmap(huffmanInput, totalWidth, currentHeight, false); - huffmanInput.end = originalEnd; - huffmanInput.position = bitmapEnd; - } - const numberOfSymbolsDecoded = symbolWidths.length; - if (firstSymbol === numberOfSymbolsDecoded - 1) { - newSymbols.push(collectiveBitmap); - } else { - let i, - y, - xMin = 0, - xMax, - bitmapWidth, - symbolBitmap; - for (i = firstSymbol; i < numberOfSymbolsDecoded; i++) { - bitmapWidth = symbolWidths[i]; - xMax = xMin + bitmapWidth; - symbolBitmap = []; - for (y = 0; y < currentHeight; y++) { - symbolBitmap.push(collectiveBitmap[y].subarray(xMin, xMax)); - } - newSymbols.push(symbolBitmap); - xMin = xMax; - } + warn(`Unrecognized ColorSpace: ${cs.name}`); + return this.gray; } } - } - const exportedSymbols = [], - flags = []; - let currentFlag = false, - i, - ii; - const totalSymbolsLength = symbols.length + numberOfNewSymbols; - while (flags.length < totalSymbolsLength) { - let runLength = huffman ? tableB1.decode(huffmanInput) : decodeInteger(contextCache, "IAEX", decoder); - while (runLength--) { - flags.push(currentFlag); - } - currentFlag = !currentFlag; - } - for (i = 0, ii = symbols.length; i < ii; i++) { - if (flags[i]) { - exportedSymbols.push(symbols[i]); - } - } - for (let j = 0; j < numberOfNewSymbols; i++, j++) { - if (flags[i]) { - exportedSymbols.push(newSymbols[j]); - } - } - return exportedSymbols; -} -function decodeTextRegion(huffman, refinement, width, height, defaultPixelValue, numberOfSymbolInstances, stripSize, inputSymbols, symbolCodeLength, transposed, dsOffset, referenceCorner, combinationOperator, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, logStripSize, huffmanInput) { - if (huffman && refinement) { - throw new Jbig2Error("refinement with Huffman is not supported"); - } - const bitmap = []; - let i, row; - for (i = 0; i < height; i++) { - row = new Uint8Array(width); - if (defaultPixelValue) { - for (let j = 0; j < width; j++) { - row[j] = defaultPixelValue; - } - } - bitmap.push(row); - } - const decoder = decodingContext.decoder; - const contextCache = decodingContext.contextCache; - let stripT = huffman ? -huffmanTables.tableDeltaT.decode(huffmanInput) : -decodeInteger(contextCache, "IADT", decoder); - let firstS = 0; - i = 0; - while (i < numberOfSymbolInstances) { - const deltaT = huffman ? huffmanTables.tableDeltaT.decode(huffmanInput) : decodeInteger(contextCache, "IADT", decoder); - stripT += deltaT; - const deltaFirstS = huffman ? huffmanTables.tableFirstS.decode(huffmanInput) : decodeInteger(contextCache, "IAFS", decoder); - firstS += deltaFirstS; - let currentS = firstS; - do { - let currentT = 0; - if (stripSize > 1) { - currentT = huffman ? huffmanInput.readBits(logStripSize) : decodeInteger(contextCache, "IAIT", decoder); - } - const t = stripSize * stripT + currentT; - const symbolId = huffman ? huffmanTables.symbolIDTable.decode(huffmanInput) : decodeIAID(contextCache, decoder, symbolCodeLength); - const applyRefinement = refinement && (huffman ? huffmanInput.readBit() : decodeInteger(contextCache, "IARI", decoder)); - let symbolBitmap = inputSymbols[symbolId]; - let symbolWidth = symbolBitmap[0].length; - let symbolHeight = symbolBitmap.length; - if (applyRefinement) { - const rdw = decodeInteger(contextCache, "IARDW", decoder); - const rdh = decodeInteger(contextCache, "IARDH", decoder); - const rdx = decodeInteger(contextCache, "IARDX", decoder); - const rdy = decodeInteger(contextCache, "IARDY", decoder); - symbolWidth += rdw; - symbolHeight += rdh; - symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, (rdh >> 1) + rdy, false, refinementAt, decodingContext); - } - let increment = 0; - if (!transposed) { - if (referenceCorner > 1) { - currentS += symbolWidth - 1; - } else { - increment = symbolWidth - 1; - } - } else if (!(referenceCorner & 1)) { - currentS += symbolHeight - 1; - } else { - increment = symbolHeight - 1; - } - const offsetT = t - (referenceCorner & 1 ? 0 : symbolHeight - 1); - const offsetS = currentS - (referenceCorner & 2 ? symbolWidth - 1 : 0); - let s2, t2, symbolRow; - if (transposed) { - for (s2 = 0; s2 < symbolHeight; s2++) { - row = bitmap[offsetS + s2]; - if (!row) { - continue; - } - symbolRow = symbolBitmap[s2]; - const maxWidth = Math.min(width - offsetT, symbolWidth); - switch (combinationOperator) { - case 0: - for (t2 = 0; t2 < maxWidth; t2++) { - row[offsetT + t2] |= symbolRow[t2]; - } - break; - case 2: - for (t2 = 0; t2 < maxWidth; t2++) { - row[offsetT + t2] ^= symbolRow[t2]; - } - break; - default: - throw new Jbig2Error(`operator ${combinationOperator} is not supported`); - } - } - } else { - for (t2 = 0; t2 < symbolHeight; t2++) { - row = bitmap[offsetT + t2]; - if (!row) { - continue; + if (Array.isArray(cs)) { + const mode = xref.fetchIfRef(cs[0]).name; + let params, numComps, baseCS, whitePoint, blackPoint, gamma; + switch (mode) { + case "G": + case "DeviceGray": + return this.gray; + case "RGB": + case "DeviceRGB": + return this.rgb; + case "CMYK": + case "DeviceCMYK": + return this.cmyk; + case "CalGray": + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray("WhitePoint"); + blackPoint = params.getArray("BlackPoint"); + gamma = params.get("Gamma"); + return new CalGrayCS(whitePoint, blackPoint, gamma); + case "CalRGB": + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray("WhitePoint"); + blackPoint = params.getArray("BlackPoint"); + gamma = params.getArray("Gamma"); + const matrix = params.getArray("Matrix"); + return new CalRGBCS(whitePoint, blackPoint, gamma, matrix); + case "ICCBased": + const isRef = cs[1] instanceof Ref; + if (isRef) { + const cachedCS = globalColorSpaceCache.getByRef(cs[1]); + if (cachedCS) { + return cachedCS; + } } - symbolRow = symbolBitmap[t2]; - switch (combinationOperator) { - case 0: - for (s2 = 0; s2 < symbolWidth; s2++) { - row[offsetS + s2] |= symbolRow[s2]; + const stream = xref.fetchIfRef(cs[1]); + const dict = stream.dict; + numComps = dict.get("N"); + if (IccColorSpace.isUsable) { + try { + const iccCS = new IccColorSpace(stream.getBytes(), "ICCBased", numComps); + if (isRef) { + globalColorSpaceCache.set(null, cs[1], iccCS); } - break; - case 2: - for (s2 = 0; s2 < symbolWidth; s2++) { - row[offsetS + s2] ^= symbolRow[s2]; + return iccCS; + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; } - break; - default: - throw new Jbig2Error(`operator ${combinationOperator} is not supported`); - } - } - } - i++; - const deltaS = huffman ? huffmanTables.tableDeltaS.decode(huffmanInput) : decodeInteger(contextCache, "IADS", decoder); - if (deltaS === null) { - break; - } - currentS += increment + deltaS + dsOffset; - } while (true); - } - return bitmap; -} -function decodePatternDictionary(mmr, patternWidth, patternHeight, maxPatternIndex, template, decodingContext) { - const at = []; - if (!mmr) { - at.push({ - x: -patternWidth, - y: 0 - }); - if (template === 0) { - at.push({ - x: -3, - y: -1 - }, { - x: 2, - y: -2 - }, { - x: -2, - y: -2 - }); - } - } - const collectiveWidth = (maxPatternIndex + 1) * patternWidth; - const collectiveBitmap = decodeBitmap(mmr, collectiveWidth, patternHeight, template, false, null, at, decodingContext); - const patterns = []; - for (let i = 0; i <= maxPatternIndex; i++) { - const patternBitmap = []; - const xMin = patternWidth * i; - const xMax = xMin + patternWidth; - for (let y = 0; y < patternHeight; y++) { - patternBitmap.push(collectiveBitmap[y].subarray(xMin, xMax)); - } - patterns.push(patternBitmap); - } - return patterns; -} -function decodeHalftoneRegion(mmr, patterns, template, regionWidth, regionHeight, defaultPixelValue, enableSkip, combinationOperator, gridWidth, gridHeight, gridOffsetX, gridOffsetY, gridVectorX, gridVectorY, decodingContext) { - const skip = null; - if (enableSkip) { - throw new Jbig2Error("skip is not supported"); - } - if (combinationOperator !== 0) { - throw new Jbig2Error(`operator "${combinationOperator}" is not supported in halftone region`); - } - const regionBitmap = []; - let i, j, row; - for (i = 0; i < regionHeight; i++) { - row = new Uint8Array(regionWidth); - if (defaultPixelValue) { - for (j = 0; j < regionWidth; j++) { - row[j] = defaultPixelValue; - } - } - regionBitmap.push(row); - } - const numberOfPatterns = patterns.length; - const pattern0 = patterns[0]; - const patternWidth = pattern0[0].length, - patternHeight = pattern0.length; - const bitsPerValue = log2(numberOfPatterns); - const at = []; - if (!mmr) { - at.push({ - x: template <= 1 ? 3 : 2, - y: -1 - }); - if (template === 0) { - at.push({ - x: -3, - y: -1 - }, { - x: 2, - y: -2 - }, { - x: -2, - y: -2 - }); - } - } - const grayScaleBitPlanes = []; - let mmrInput, bitmap; - if (mmr) { - mmrInput = new Reader(decodingContext.data, decodingContext.start, decodingContext.end); - } - for (i = bitsPerValue - 1; i >= 0; i--) { - if (mmr) { - bitmap = decodeMMRBitmap(mmrInput, gridWidth, gridHeight, true); - } else { - bitmap = decodeBitmap(false, gridWidth, gridHeight, template, false, skip, at, decodingContext); - } - grayScaleBitPlanes[i] = bitmap; - } - let mg, ng, bit, patternIndex, patternBitmap, x, y, patternRow, regionRow; - for (mg = 0; mg < gridHeight; mg++) { - for (ng = 0; ng < gridWidth; ng++) { - bit = 0; - patternIndex = 0; - for (j = bitsPerValue - 1; j >= 0; j--) { - bit ^= grayScaleBitPlanes[j][mg][ng]; - patternIndex |= bit << j; - } - patternBitmap = patterns[patternIndex]; - x = gridOffsetX + mg * gridVectorY + ng * gridVectorX >> 8; - y = gridOffsetY + mg * gridVectorX - ng * gridVectorY >> 8; - if (x >= 0 && x + patternWidth <= regionWidth && y >= 0 && y + patternHeight <= regionHeight) { - for (i = 0; i < patternHeight; i++) { - regionRow = regionBitmap[y + i]; - patternRow = patternBitmap[i]; - for (j = 0; j < patternWidth; j++) { - regionRow[x + j] |= patternRow[j]; - } - } - } else { - let regionX, regionY; - for (i = 0; i < patternHeight; i++) { - regionY = y + i; - if (regionY < 0 || regionY >= regionHeight) { - continue; - } - regionRow = regionBitmap[regionY]; - patternRow = patternBitmap[i]; - for (j = 0; j < patternWidth; j++) { - regionX = x + j; - if (regionX >= 0 && regionX < regionWidth) { - regionRow[regionX] |= patternRow[j]; + warn(`ICCBased color space (${cs[1]}): "${ex}".`); } } - } - } - } - } - return regionBitmap; -} -function readSegmentHeader(data, start) { - const segmentHeader = {}; - segmentHeader.number = readUint32(data, start); - const flags = data[start + 4]; - const segmentType = flags & 0x3f; - if (!SegmentTypes[segmentType]) { - throw new Jbig2Error("invalid segment type: " + segmentType); - } - segmentHeader.type = segmentType; - segmentHeader.typeName = SegmentTypes[segmentType]; - segmentHeader.deferredNonRetain = !!(flags & 0x80); - const pageAssociationFieldSize = !!(flags & 0x40); - const referredFlags = data[start + 5]; - let referredToCount = referredFlags >> 5 & 7; - const retainBits = [referredFlags & 31]; - let position = start + 6; - if (referredFlags === 7) { - referredToCount = readUint32(data, position - 1) & 0x1fffffff; - position += 3; - let bytes = referredToCount + 7 >> 3; - retainBits[0] = data[position++]; - while (--bytes > 0) { - retainBits.push(data[position++]); - } - } else if (referredFlags === 5 || referredFlags === 6) { - throw new Jbig2Error("invalid referred-to flags"); - } - segmentHeader.retainBits = retainBits; - let referredToSegmentNumberSize = 4; - if (segmentHeader.number <= 256) { - referredToSegmentNumberSize = 1; - } else if (segmentHeader.number <= 65536) { - referredToSegmentNumberSize = 2; - } - const referredTo = []; - let i, ii; - for (i = 0; i < referredToCount; i++) { - let number; - if (referredToSegmentNumberSize === 1) { - number = data[position]; - } else if (referredToSegmentNumberSize === 2) { - number = readUint16(data, position); - } else { - number = readUint32(data, position); - } - referredTo.push(number); - position += referredToSegmentNumberSize; - } - segmentHeader.referredTo = referredTo; - if (!pageAssociationFieldSize) { - segmentHeader.pageAssociation = data[position++]; - } else { - segmentHeader.pageAssociation = readUint32(data, position); - position += 4; - } - segmentHeader.length = readUint32(data, position); - position += 4; - if (segmentHeader.length === 0xffffffff) { - if (segmentType === 38) { - const genericRegionInfo = readRegionSegmentInformation(data, position); - const genericRegionSegmentFlags = data[position + RegionSegmentInformationFieldLength]; - const genericRegionMmr = !!(genericRegionSegmentFlags & 1); - const searchPatternLength = 6; - const searchPattern = new Uint8Array(searchPatternLength); - if (!genericRegionMmr) { - searchPattern[0] = 0xff; - searchPattern[1] = 0xac; - } - searchPattern[2] = genericRegionInfo.height >>> 24 & 0xff; - searchPattern[3] = genericRegionInfo.height >> 16 & 0xff; - searchPattern[4] = genericRegionInfo.height >> 8 & 0xff; - searchPattern[5] = genericRegionInfo.height & 0xff; - for (i = position, ii = data.length; i < ii; i++) { - let j = 0; - while (j < searchPatternLength && searchPattern[j] === data[i + j]) { - j++; - } - if (j === searchPatternLength) { - segmentHeader.length = i + searchPatternLength; - break; - } - } - if (segmentHeader.length === 0xffffffff) { - throw new Jbig2Error("segment end was not found"); - } - } else { - throw new Jbig2Error("invalid unknown segment length"); - } - } - segmentHeader.headerEnd = position; - return segmentHeader; -} -function readSegments(header, data, start, end) { - const segments = []; - let position = start; - while (position < end) { - const segmentHeader = readSegmentHeader(data, position); - position = segmentHeader.headerEnd; - const segment = { - header: segmentHeader, - data - }; - if (!header.randomAccess) { - segment.start = position; - position += segmentHeader.length; - segment.end = position; - } - segments.push(segment); - if (segmentHeader.type === 51) { - break; - } - } - if (header.randomAccess) { - for (let i = 0, ii = segments.length; i < ii; i++) { - segments[i].start = position; - position += segments[i].header.length; - segments[i].end = position; - } - } - return segments; -} -function readRegionSegmentInformation(data, start) { - return { - width: readUint32(data, start), - height: readUint32(data, start + 4), - x: readUint32(data, start + 8), - y: readUint32(data, start + 12), - combinationOperator: data[start + 16] & 7 - }; -} -const RegionSegmentInformationFieldLength = 17; -function processSegment(segment, visitor) { - const header = segment.header; - const data = segment.data, - end = segment.end; - let position = segment.start; - let args, at, i, atLength; - switch (header.type) { - case 0: - const dictionary = {}; - const dictionaryFlags = readUint16(data, position); - dictionary.huffman = !!(dictionaryFlags & 1); - dictionary.refinement = !!(dictionaryFlags & 2); - dictionary.huffmanDHSelector = dictionaryFlags >> 2 & 3; - dictionary.huffmanDWSelector = dictionaryFlags >> 4 & 3; - dictionary.bitmapSizeSelector = dictionaryFlags >> 6 & 1; - dictionary.aggregationInstancesSelector = dictionaryFlags >> 7 & 1; - dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256); - dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512); - dictionary.template = dictionaryFlags >> 10 & 3; - dictionary.refinementTemplate = dictionaryFlags >> 12 & 1; - position += 2; - if (!dictionary.huffman) { - atLength = dictionary.template === 0 ? 4 : 1; - at = []; - for (i = 0; i < atLength; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - dictionary.at = at; - } - if (dictionary.refinement && !dictionary.refinementTemplate) { - at = []; - for (i = 0; i < 2; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - dictionary.refinementAt = at; - } - dictionary.numberOfExportedSymbols = readUint32(data, position); - position += 4; - dictionary.numberOfNewSymbols = readUint32(data, position); - position += 4; - args = [dictionary, header.number, header.referredTo, data, position, end]; - break; - case 6: - case 7: - const textRegion = {}; - textRegion.info = readRegionSegmentInformation(data, position); - position += RegionSegmentInformationFieldLength; - const textRegionSegmentFlags = readUint16(data, position); - position += 2; - textRegion.huffman = !!(textRegionSegmentFlags & 1); - textRegion.refinement = !!(textRegionSegmentFlags & 2); - textRegion.logStripSize = textRegionSegmentFlags >> 2 & 3; - textRegion.stripSize = 1 << textRegion.logStripSize; - textRegion.referenceCorner = textRegionSegmentFlags >> 4 & 3; - textRegion.transposed = !!(textRegionSegmentFlags & 64); - textRegion.combinationOperator = textRegionSegmentFlags >> 7 & 3; - textRegion.defaultPixelValue = textRegionSegmentFlags >> 9 & 1; - textRegion.dsOffset = textRegionSegmentFlags << 17 >> 27; - textRegion.refinementTemplate = textRegionSegmentFlags >> 15 & 1; - if (textRegion.huffman) { - const textRegionHuffmanFlags = readUint16(data, position); - position += 2; - textRegion.huffmanFS = textRegionHuffmanFlags & 3; - textRegion.huffmanDS = textRegionHuffmanFlags >> 2 & 3; - textRegion.huffmanDT = textRegionHuffmanFlags >> 4 & 3; - textRegion.huffmanRefinementDW = textRegionHuffmanFlags >> 6 & 3; - textRegion.huffmanRefinementDH = textRegionHuffmanFlags >> 8 & 3; - textRegion.huffmanRefinementDX = textRegionHuffmanFlags >> 10 & 3; - textRegion.huffmanRefinementDY = textRegionHuffmanFlags >> 12 & 3; - textRegion.huffmanRefinementSizeSelector = !!(textRegionHuffmanFlags & 0x4000); - } - if (textRegion.refinement && !textRegion.refinementTemplate) { - at = []; - for (i = 0; i < 2; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - textRegion.refinementAt = at; - } - textRegion.numberOfSymbolInstances = readUint32(data, position); - position += 4; - args = [textRegion, header.referredTo, data, position, end]; - break; - case 16: - const patternDictionary = {}; - const patternDictionaryFlags = data[position++]; - patternDictionary.mmr = !!(patternDictionaryFlags & 1); - patternDictionary.template = patternDictionaryFlags >> 1 & 3; - patternDictionary.patternWidth = data[position++]; - patternDictionary.patternHeight = data[position++]; - patternDictionary.maxPatternIndex = readUint32(data, position); - position += 4; - args = [patternDictionary, header.number, data, position, end]; - break; - case 22: - case 23: - const halftoneRegion = {}; - halftoneRegion.info = readRegionSegmentInformation(data, position); - position += RegionSegmentInformationFieldLength; - const halftoneRegionFlags = data[position++]; - halftoneRegion.mmr = !!(halftoneRegionFlags & 1); - halftoneRegion.template = halftoneRegionFlags >> 1 & 3; - halftoneRegion.enableSkip = !!(halftoneRegionFlags & 8); - halftoneRegion.combinationOperator = halftoneRegionFlags >> 4 & 7; - halftoneRegion.defaultPixelValue = halftoneRegionFlags >> 7 & 1; - halftoneRegion.gridWidth = readUint32(data, position); - position += 4; - halftoneRegion.gridHeight = readUint32(data, position); - position += 4; - halftoneRegion.gridOffsetX = readUint32(data, position) & 0xffffffff; - position += 4; - halftoneRegion.gridOffsetY = readUint32(data, position) & 0xffffffff; - position += 4; - halftoneRegion.gridVectorX = readUint16(data, position); - position += 2; - halftoneRegion.gridVectorY = readUint16(data, position); - position += 2; - args = [halftoneRegion, header.referredTo, data, position, end]; - break; - case 38: - case 39: - const genericRegion = {}; - genericRegion.info = readRegionSegmentInformation(data, position); - position += RegionSegmentInformationFieldLength; - const genericRegionSegmentFlags = data[position++]; - genericRegion.mmr = !!(genericRegionSegmentFlags & 1); - genericRegion.template = genericRegionSegmentFlags >> 1 & 3; - genericRegion.prediction = !!(genericRegionSegmentFlags & 8); - if (!genericRegion.mmr) { - atLength = genericRegion.template === 0 ? 4 : 1; - at = []; - for (i = 0; i < atLength; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - genericRegion.at = at; - } - args = [genericRegion, data, position, end]; - break; - case 48: - const pageInfo = { - width: readUint32(data, position), - height: readUint32(data, position + 4), - resolutionX: readUint32(data, position + 8), - resolutionY: readUint32(data, position + 12) - }; - if (pageInfo.height === 0xffffffff) { - delete pageInfo.height; - } - const pageSegmentFlags = data[position + 16]; - readUint16(data, position + 17); - pageInfo.lossless = !!(pageSegmentFlags & 1); - pageInfo.refinement = !!(pageSegmentFlags & 2); - pageInfo.defaultPixelValue = pageSegmentFlags >> 2 & 1; - pageInfo.combinationOperator = pageSegmentFlags >> 3 & 3; - pageInfo.requiresBuffer = !!(pageSegmentFlags & 32); - pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64); - args = [pageInfo]; - break; - case 49: - break; - case 50: - break; - case 51: - break; - case 53: - args = [header.number, data, position, end]; - break; - case 62: - break; - default: - throw new Jbig2Error(`segment type ${header.typeName}(${header.type}) is not implemented`); - } - const callbackName = "on" + header.typeName; - if (callbackName in visitor) { - visitor[callbackName].apply(visitor, args); - } -} -function processSegments(segments, visitor) { - for (let i = 0, ii = segments.length; i < ii; i++) { - processSegment(segments[i], visitor); - } -} -function parseJbig2Chunks(chunks) { - const visitor = new SimpleSegmentVisitor(); - for (let i = 0, ii = chunks.length; i < ii; i++) { - const chunk = chunks[i]; - const segments = readSegments({}, chunk.data, chunk.start, chunk.end); - processSegments(segments, visitor); - } - return visitor.buffer; -} -function parseJbig2(data) { - throw new Error("Not implemented: parseJbig2"); -} -class SimpleSegmentVisitor { - onPageInformation(info) { - this.currentPageInfo = info; - const rowSize = info.width + 7 >> 3; - const buffer = new Uint8ClampedArray(rowSize * info.height); - if (info.defaultPixelValue) { - buffer.fill(0xff); - } - this.buffer = buffer; - } - drawBitmap(regionInfo, bitmap) { - const pageInfo = this.currentPageInfo; - const width = regionInfo.width, - height = regionInfo.height; - const rowSize = pageInfo.width + 7 >> 3; - const combinationOperator = pageInfo.combinationOperatorOverride ? regionInfo.combinationOperator : pageInfo.combinationOperator; - const buffer = this.buffer; - const mask0 = 128 >> (regionInfo.x & 7); - let offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3); - let i, j, mask, offset; - switch (combinationOperator) { - case 0: - for (i = 0; i < height; i++) { - mask = mask0; - offset = offset0; - for (j = 0; j < width; j++) { - if (bitmap[i][j]) { - buffer[offset] |= mask; - } - mask >>= 1; - if (!mask) { - mask = 128; - offset++; + const altRaw = dict.getRaw("Alternate"); + if (altRaw) { + const altCS = this.#subParse(altRaw, options); + if (altCS.numComps === numComps) { + return altCS; } + warn("ICCBased color space: Ignoring incorrect /Alternate entry."); } - offset0 += rowSize; - } - break; - case 2: - for (i = 0; i < height; i++) { - mask = mask0; - offset = offset0; - for (j = 0; j < width; j++) { - if (bitmap[i][j]) { - buffer[offset] ^= mask; - } - mask >>= 1; - if (!mask) { - mask = 128; - offset++; - } + if (numComps === 1) { + return this.gray; + } else if (numComps === 3) { + return this.rgb; + } else if (numComps === 4) { + return this.cmyk; } - offset0 += rowSize; - } - break; - default: - throw new Jbig2Error(`operator ${combinationOperator} is not supported`); - } - } - onImmediateGenericRegion(region, data, start, end) { - const regionInfo = region.info; - const decodingContext = new DecodingContext(data, start, end); - const bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, region.template, region.prediction, null, region.at, decodingContext); - this.drawBitmap(regionInfo, bitmap); - } - onImmediateLosslessGenericRegion() { - this.onImmediateGenericRegion(...arguments); - } - onSymbolDictionary(dictionary, currentSegment, referredSegments, data, start, end) { - let huffmanTables, huffmanInput; - if (dictionary.huffman) { - huffmanTables = getSymbolDictionaryHuffmanTables(dictionary, referredSegments, this.customTables); - huffmanInput = new Reader(data, start, end); - } - let symbols = this.symbols; - if (!symbols) { - this.symbols = symbols = {}; - } - const inputSymbols = []; - for (const referredSegment of referredSegments) { - const referredSymbols = symbols[referredSegment]; - if (referredSymbols) { - inputSymbols.push(...referredSymbols); - } - } - const decodingContext = new DecodingContext(data, start, end); - symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, dictionary.numberOfExportedSymbols, huffmanTables, dictionary.template, dictionary.at, dictionary.refinementTemplate, dictionary.refinementAt, decodingContext, huffmanInput); - } - onImmediateTextRegion(region, referredSegments, data, start, end) { - const regionInfo = region.info; - let huffmanTables, huffmanInput; - const symbols = this.symbols; - const inputSymbols = []; - for (const referredSegment of referredSegments) { - const referredSymbols = symbols[referredSegment]; - if (referredSymbols) { - inputSymbols.push(...referredSymbols); - } - } - const symbolCodeLength = log2(inputSymbols.length); - if (region.huffman) { - huffmanInput = new Reader(data, start, end); - huffmanTables = getTextRegionHuffmanTables(region, referredSegments, this.customTables, inputSymbols.length, huffmanInput); - } - const decodingContext = new DecodingContext(data, start, end); - const bitmap = decodeTextRegion(region.huffman, region.refinement, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.numberOfSymbolInstances, region.stripSize, inputSymbols, symbolCodeLength, region.transposed, region.dsOffset, region.referenceCorner, region.combinationOperator, huffmanTables, region.refinementTemplate, region.refinementAt, decodingContext, region.logStripSize, huffmanInput); - this.drawBitmap(regionInfo, bitmap); - } - onImmediateLosslessTextRegion() { - this.onImmediateTextRegion(...arguments); - } - onPatternDictionary(dictionary, currentSegment, data, start, end) { - let patterns = this.patterns; - if (!patterns) { - this.patterns = patterns = {}; - } - const decodingContext = new DecodingContext(data, start, end); - patterns[currentSegment] = decodePatternDictionary(dictionary.mmr, dictionary.patternWidth, dictionary.patternHeight, dictionary.maxPatternIndex, dictionary.template, decodingContext); - } - onImmediateHalftoneRegion(region, referredSegments, data, start, end) { - const patterns = this.patterns[referredSegments[0]]; - const regionInfo = region.info; - const decodingContext = new DecodingContext(data, start, end); - const bitmap = decodeHalftoneRegion(region.mmr, patterns, region.template, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.enableSkip, region.combinationOperator, region.gridWidth, region.gridHeight, region.gridOffsetX, region.gridOffsetY, region.gridVectorX, region.gridVectorY, decodingContext); - this.drawBitmap(regionInfo, bitmap); - } - onImmediateLosslessHalftoneRegion() { - this.onImmediateHalftoneRegion(...arguments); - } - onTables(currentSegment, data, start, end) { - let customTables = this.customTables; - if (!customTables) { - this.customTables = customTables = {}; - } - customTables[currentSegment] = decodeTablesSegment(data, start, end); - } -} -class HuffmanLine { - constructor(lineData) { - if (lineData.length === 2) { - this.isOOB = true; - this.rangeLow = 0; - this.prefixLength = lineData[0]; - this.rangeLength = 0; - this.prefixCode = lineData[1]; - this.isLowerRange = false; - } else { - this.isOOB = false; - this.rangeLow = lineData[0]; - this.prefixLength = lineData[1]; - this.rangeLength = lineData[2]; - this.prefixCode = lineData[3]; - this.isLowerRange = lineData[4] === "lower"; - } - } -} -class HuffmanTreeNode { - constructor(line) { - this.children = []; - if (line) { - this.isLeaf = true; - this.rangeLength = line.rangeLength; - this.rangeLow = line.rangeLow; - this.isLowerRange = line.isLowerRange; - this.isOOB = line.isOOB; - } else { - this.isLeaf = false; - } - } - buildTree(line, shift) { - const bit = line.prefixCode >> shift & 1; - if (shift <= 0) { - this.children[bit] = new HuffmanTreeNode(line); - } else { - let node = this.children[bit]; - if (!node) { - this.children[bit] = node = new HuffmanTreeNode(null); - } - node.buildTree(line, shift - 1); - } - } - decodeNode(reader) { - if (this.isLeaf) { - if (this.isOOB) { - return null; - } - const htOffset = reader.readBits(this.rangeLength); - return this.rangeLow + (this.isLowerRange ? -htOffset : htOffset); - } - const node = this.children[reader.readBit()]; - if (!node) { - throw new Jbig2Error("invalid Huffman data"); - } - return node.decodeNode(reader); - } -} -class HuffmanTable { - constructor(lines, prefixCodesDone) { - if (!prefixCodesDone) { - this.assignPrefixCodes(lines); - } - this.rootNode = new HuffmanTreeNode(null); - for (let i = 0, ii = lines.length; i < ii; i++) { - const line = lines[i]; - if (line.prefixLength > 0) { - this.rootNode.buildTree(line, line.prefixLength - 1); - } - } - } - decode(reader) { - return this.rootNode.decodeNode(reader); - } - assignPrefixCodes(lines) { - const linesLength = lines.length; - let prefixLengthMax = 0; - for (let i = 0; i < linesLength; i++) { - prefixLengthMax = Math.max(prefixLengthMax, lines[i].prefixLength); - } - const histogram = new Uint32Array(prefixLengthMax + 1); - for (let i = 0; i < linesLength; i++) { - histogram[lines[i].prefixLength]++; - } - let currentLength = 1, - firstCode = 0, - currentCode, - currentTemp, - line; - histogram[0] = 0; - while (currentLength <= prefixLengthMax) { - firstCode = firstCode + histogram[currentLength - 1] << 1; - currentCode = firstCode; - currentTemp = 0; - while (currentTemp < linesLength) { - line = lines[currentTemp]; - if (line.prefixLength === currentLength) { - line.prefixCode = currentCode; - currentCode++; - } - currentTemp++; - } - currentLength++; - } - } -} -function decodeTablesSegment(data, start, end) { - const flags = data[start]; - const lowestValue = readUint32(data, start + 1) & 0xffffffff; - const highestValue = readUint32(data, start + 5) & 0xffffffff; - const reader = new Reader(data, start + 9, end); - const prefixSizeBits = (flags >> 1 & 7) + 1; - const rangeSizeBits = (flags >> 4 & 7) + 1; - const lines = []; - let prefixLength, - rangeLength, - currentRangeLow = lowestValue; - do { - prefixLength = reader.readBits(prefixSizeBits); - rangeLength = reader.readBits(rangeSizeBits); - lines.push(new HuffmanLine([currentRangeLow, prefixLength, rangeLength, 0])); - currentRangeLow += 1 << rangeLength; - } while (currentRangeLow < highestValue); - prefixLength = reader.readBits(prefixSizeBits); - lines.push(new HuffmanLine([lowestValue - 1, prefixLength, 32, 0, "lower"])); - prefixLength = reader.readBits(prefixSizeBits); - lines.push(new HuffmanLine([highestValue, prefixLength, 32, 0])); - if (flags & 1) { - prefixLength = reader.readBits(prefixSizeBits); - lines.push(new HuffmanLine([prefixLength, 0])); - } - return new HuffmanTable(lines, false); -} -const standardTablesCache = {}; -function getStandardTable(number) { - let table = standardTablesCache[number]; - if (table) { - return table; - } - let lines; - switch (number) { - case 1: - lines = [[0, 1, 4, 0x0], [16, 2, 8, 0x2], [272, 3, 16, 0x6], [65808, 3, 32, 0x7]]; - break; - case 2: - lines = [[0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xe], [11, 5, 6, 0x1e], [75, 6, 32, 0x3e], [6, 0x3f]]; - break; - case 3: - lines = [[-256, 8, 8, 0xfe], [0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xe], [11, 5, 6, 0x1e], [-257, 8, 32, 0xff, "lower"], [75, 7, 32, 0x7e], [6, 0x3e]]; - break; - case 4: - lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xe], [12, 5, 6, 0x1e], [76, 5, 32, 0x1f]]; - break; - case 5: - lines = [[-255, 7, 8, 0x7e], [1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xe], [12, 5, 6, 0x1e], [-256, 7, 32, 0x7f, "lower"], [76, 6, 32, 0x3e]]; - break; - case 6: - lines = [[-2048, 5, 10, 0x1c], [-1024, 4, 9, 0x8], [-512, 4, 8, 0x9], [-256, 4, 7, 0xa], [-128, 5, 6, 0x1d], [-64, 5, 5, 0x1e], [-32, 4, 5, 0xb], [0, 2, 7, 0x0], [128, 3, 7, 0x2], [256, 3, 8, 0x3], [512, 4, 9, 0xc], [1024, 4, 10, 0xd], [-2049, 6, 32, 0x3e, "lower"], [2048, 6, 32, 0x3f]]; - break; - case 7: - lines = [[-1024, 4, 9, 0x8], [-512, 3, 8, 0x0], [-256, 4, 7, 0x9], [-128, 5, 6, 0x1a], [-64, 5, 5, 0x1b], [-32, 4, 5, 0xa], [0, 4, 5, 0xb], [32, 5, 5, 0x1c], [64, 5, 6, 0x1d], [128, 4, 7, 0xc], [256, 3, 8, 0x1], [512, 3, 9, 0x2], [1024, 3, 10, 0x3], [-1025, 5, 32, 0x1e, "lower"], [2048, 5, 32, 0x1f]]; - break; - case 8: - lines = [[-15, 8, 3, 0xfc], [-7, 9, 1, 0x1fc], [-5, 8, 1, 0xfd], [-3, 9, 0, 0x1fd], [-2, 7, 0, 0x7c], [-1, 4, 0, 0xa], [0, 2, 1, 0x0], [2, 5, 0, 0x1a], [3, 6, 0, 0x3a], [4, 3, 4, 0x4], [20, 6, 1, 0x3b], [22, 4, 4, 0xb], [38, 4, 5, 0xc], [70, 5, 6, 0x1b], [134, 5, 7, 0x1c], [262, 6, 7, 0x3c], [390, 7, 8, 0x7d], [646, 6, 10, 0x3d], [-16, 9, 32, 0x1fe, "lower"], [1670, 9, 32, 0x1ff], [2, 0x1]]; - break; - case 9: - lines = [[-31, 8, 4, 0xfc], [-15, 9, 2, 0x1fc], [-11, 8, 2, 0xfd], [-7, 9, 1, 0x1fd], [-5, 7, 1, 0x7c], [-3, 4, 1, 0xa], [-1, 3, 1, 0x2], [1, 3, 1, 0x3], [3, 5, 1, 0x1a], [5, 6, 1, 0x3a], [7, 3, 5, 0x4], [39, 6, 2, 0x3b], [43, 4, 5, 0xb], [75, 4, 6, 0xc], [139, 5, 7, 0x1b], [267, 5, 8, 0x1c], [523, 6, 8, 0x3c], [779, 7, 9, 0x7d], [1291, 6, 11, 0x3d], [-32, 9, 32, 0x1fe, "lower"], [3339, 9, 32, 0x1ff], [2, 0x0]]; - break; - case 10: - lines = [[-21, 7, 4, 0x7a], [-5, 8, 0, 0xfc], [-4, 7, 0, 0x7b], [-3, 5, 0, 0x18], [-2, 2, 2, 0x0], [2, 5, 0, 0x19], [3, 6, 0, 0x36], [4, 7, 0, 0x7c], [5, 8, 0, 0xfd], [6, 2, 6, 0x1], [70, 5, 5, 0x1a], [102, 6, 5, 0x37], [134, 6, 6, 0x38], [198, 6, 7, 0x39], [326, 6, 8, 0x3a], [582, 6, 9, 0x3b], [1094, 6, 10, 0x3c], [2118, 7, 11, 0x7d], [-22, 8, 32, 0xfe, "lower"], [4166, 8, 32, 0xff], [2, 0x2]]; - break; - case 11: - lines = [[1, 1, 0, 0x0], [2, 2, 1, 0x2], [4, 4, 0, 0xc], [5, 4, 1, 0xd], [7, 5, 1, 0x1c], [9, 5, 2, 0x1d], [13, 6, 2, 0x3c], [17, 7, 2, 0x7a], [21, 7, 3, 0x7b], [29, 7, 4, 0x7c], [45, 7, 5, 0x7d], [77, 7, 6, 0x7e], [141, 7, 32, 0x7f]]; - break; - case 12: - lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 1, 0x6], [5, 5, 0, 0x1c], [6, 5, 1, 0x1d], [8, 6, 1, 0x3c], [10, 7, 0, 0x7a], [11, 7, 1, 0x7b], [13, 7, 2, 0x7c], [17, 7, 3, 0x7d], [25, 7, 4, 0x7e], [41, 8, 5, 0xfe], [73, 8, 32, 0xff]]; - break; - case 13: - lines = [[1, 1, 0, 0x0], [2, 3, 0, 0x4], [3, 4, 0, 0xc], [4, 5, 0, 0x1c], [5, 4, 1, 0xd], [7, 3, 3, 0x5], [15, 6, 1, 0x3a], [17, 6, 2, 0x3b], [21, 6, 3, 0x3c], [29, 6, 4, 0x3d], [45, 6, 5, 0x3e], [77, 7, 6, 0x7e], [141, 7, 32, 0x7f]]; - break; - case 14: - lines = [[-2, 3, 0, 0x4], [-1, 3, 0, 0x5], [0, 1, 0, 0x0], [1, 3, 0, 0x6], [2, 3, 0, 0x7]]; - break; - case 15: - lines = [[-24, 7, 4, 0x7c], [-8, 6, 2, 0x3c], [-4, 5, 1, 0x1c], [-2, 4, 0, 0xc], [-1, 3, 0, 0x4], [0, 1, 0, 0x0], [1, 3, 0, 0x5], [2, 4, 0, 0xd], [3, 5, 1, 0x1d], [5, 6, 2, 0x3d], [9, 7, 4, 0x7d], [-25, 7, 32, 0x7e, "lower"], [25, 7, 32, 0x7f]]; - break; - default: - throw new Jbig2Error(`standard table B.${number} does not exist`); - } - for (let i = 0, ii = lines.length; i < ii; i++) { - lines[i] = new HuffmanLine(lines[i]); - } - table = new HuffmanTable(lines, true); - standardTablesCache[number] = table; - return table; -} -class Reader { - constructor(data, start, end) { - this.data = data; - this.start = start; - this.end = end; - this.position = start; - this.shift = -1; - this.currentByte = 0; - } - readBit() { - if (this.shift < 0) { - if (this.position >= this.end) { - throw new Jbig2Error("end of data while reading bit"); - } - this.currentByte = this.data[this.position++]; - this.shift = 7; - } - const bit = this.currentByte >> this.shift & 1; - this.shift--; - return bit; - } - readBits(numBits) { - let result = 0, - i; - for (i = numBits - 1; i >= 0; i--) { - result |= this.readBit() << i; - } - return result; - } - byteAlign() { - this.shift = -1; - } - next() { - if (this.position >= this.end) { - return -1; - } - return this.data[this.position++]; - } -} -function getCustomHuffmanTable(index, referredTo, customTables) { - let currentIndex = 0; - for (let i = 0, ii = referredTo.length; i < ii; i++) { - const table = customTables[referredTo[i]]; - if (table) { - if (index === currentIndex) { - return table; - } - currentIndex++; - } - } - throw new Jbig2Error("can't find custom Huffman table"); -} -function getTextRegionHuffmanTables(textRegion, referredTo, customTables, numberOfSymbols, reader) { - const codes = []; - for (let i = 0; i <= 34; i++) { - const codeLength = reader.readBits(4); - codes.push(new HuffmanLine([i, codeLength, 0, 0])); - } - const runCodesTable = new HuffmanTable(codes, false); - codes.length = 0; - for (let i = 0; i < numberOfSymbols;) { - const codeLength = runCodesTable.decode(reader); - if (codeLength >= 32) { - let repeatedLength, numberOfRepeats, j; - switch (codeLength) { - case 32: - if (i === 0) { - throw new Jbig2Error("no previous value in symbol ID table"); - } - numberOfRepeats = reader.readBits(2) + 3; - repeatedLength = codes[i - 1].prefixLength; - break; - case 33: - numberOfRepeats = reader.readBits(3) + 3; - repeatedLength = 0; - break; - case 34: - numberOfRepeats = reader.readBits(7) + 11; - repeatedLength = 0; break; + case "Pattern": + baseCS = cs[1] || null; + if (baseCS) { + baseCS = this.#subParse(baseCS, options); + } + return new PatternCS(baseCS); + case "I": + case "Indexed": + baseCS = this.#subParse(cs[1], options); + const hiVal = MathClamp(xref.fetchIfRef(cs[2]), 0, 255); + const lookup = xref.fetchIfRef(cs[3]); + return new IndexedCS(baseCS, hiVal, lookup); + case "Separation": + case "DeviceN": + const name = xref.fetchIfRef(cs[1]); + numComps = Array.isArray(name) ? name.length : 1; + baseCS = this.#subParse(cs[2], options); + const tintFn = pdfFunctionFactory.create(cs[3]); + return new AlternateCS(numComps, baseCS, tintFn); + case "Lab": + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray("WhitePoint"); + blackPoint = params.getArray("BlackPoint"); + const range = params.getArray("Range"); + return new LabCS(whitePoint, blackPoint, range); default: - throw new Jbig2Error("invalid code length in symbol ID table"); - } - for (j = 0; j < numberOfRepeats; j++) { - codes.push(new HuffmanLine([i, repeatedLength, 0, 0])); - i++; - } - } else { - codes.push(new HuffmanLine([i, codeLength, 0, 0])); - i++; - } - } - reader.byteAlign(); - const symbolIDTable = new HuffmanTable(codes, false); - let customIndex = 0, - tableFirstS, - tableDeltaS, - tableDeltaT; - switch (textRegion.huffmanFS) { - case 0: - case 1: - tableFirstS = getStandardTable(textRegion.huffmanFS + 6); - break; - case 3: - tableFirstS = getCustomHuffmanTable(customIndex, referredTo, customTables); - customIndex++; - break; - default: - throw new Jbig2Error("invalid Huffman FS selector"); - } - switch (textRegion.huffmanDS) { - case 0: - case 1: - case 2: - tableDeltaS = getStandardTable(textRegion.huffmanDS + 8); - break; - case 3: - tableDeltaS = getCustomHuffmanTable(customIndex, referredTo, customTables); - customIndex++; - break; - default: - throw new Jbig2Error("invalid Huffman DS selector"); - } - switch (textRegion.huffmanDT) { - case 0: - case 1: - case 2: - tableDeltaT = getStandardTable(textRegion.huffmanDT + 11); - break; - case 3: - tableDeltaT = getCustomHuffmanTable(customIndex, referredTo, customTables); - customIndex++; - break; - default: - throw new Jbig2Error("invalid Huffman DT selector"); - } - if (textRegion.refinement) { - throw new Jbig2Error("refinement with Huffman is not supported"); - } - return { - symbolIDTable, - tableFirstS, - tableDeltaS, - tableDeltaT - }; -} -function getSymbolDictionaryHuffmanTables(dictionary, referredTo, customTables) { - let customIndex = 0, - tableDeltaHeight, - tableDeltaWidth; - switch (dictionary.huffmanDHSelector) { - case 0: - case 1: - tableDeltaHeight = getStandardTable(dictionary.huffmanDHSelector + 4); - break; - case 3: - tableDeltaHeight = getCustomHuffmanTable(customIndex, referredTo, customTables); - customIndex++; - break; - default: - throw new Jbig2Error("invalid Huffman DH selector"); - } - switch (dictionary.huffmanDWSelector) { - case 0: - case 1: - tableDeltaWidth = getStandardTable(dictionary.huffmanDWSelector + 2); - break; - case 3: - tableDeltaWidth = getCustomHuffmanTable(customIndex, referredTo, customTables); - customIndex++; - break; - default: - throw new Jbig2Error("invalid Huffman DW selector"); - } - let tableBitmapSize, tableAggregateInstances; - if (dictionary.bitmapSizeSelector) { - tableBitmapSize = getCustomHuffmanTable(customIndex, referredTo, customTables); - customIndex++; - } else { - tableBitmapSize = getStandardTable(1); - } - if (dictionary.aggregationInstancesSelector) { - tableAggregateInstances = getCustomHuffmanTable(customIndex, referredTo, customTables); - } else { - tableAggregateInstances = getStandardTable(1); - } - return { - tableDeltaHeight, - tableDeltaWidth, - tableBitmapSize, - tableAggregateInstances - }; -} -function readUncompressedBitmap(reader, width, height) { - const bitmap = []; - for (let y = 0; y < height; y++) { - const row = new Uint8Array(width); - bitmap.push(row); - for (let x = 0; x < width; x++) { - row[x] = reader.readBit(); - } - reader.byteAlign(); - } - return bitmap; -} -function decodeMMRBitmap(input, width, height, endOfBlock) { - const params = { - K: -1, - Columns: width, - Rows: height, - BlackIs1: true, - EndOfBlock: endOfBlock - }; - const decoder = new CCITTFaxDecoder(input, params); - const bitmap = []; - let currentByte, - eof = false; - for (let y = 0; y < height; y++) { - const row = new Uint8Array(width); - bitmap.push(row); - let shift = -1; - for (let x = 0; x < width; x++) { - if (shift < 0) { - currentByte = decoder.readNextChar(); - if (currentByte === -1) { - currentByte = 0; - eof = true; - } - shift = 7; + warn(`Unimplemented ColorSpace object: ${mode}`); + return this.gray; } - row[x] = currentByte >> shift & 1; - shift--; } + warn(`Unrecognized ColorSpace object: ${cs}`); + return this.gray; } - if (endOfBlock && !eof) { - const lookForEOFLimit = 5; - for (let i = 0; i < lookForEOFLimit; i++) { - if (decoder.readNextChar() === -1) { - break; - } - } + static get gray() { + return shadow(this, "gray", new DeviceGrayCS()); } - return bitmap; -} -class Jbig2Image { - parseChunks(chunks) { - return parseJbig2Chunks(chunks); + static get rgb() { + return shadow(this, "rgb", new DeviceRgbCS()); } - parse(data) { - throw new Error("Not implemented: Jbig2Image.parse"); + static get rgba() { + return shadow(this, "rgba", new DeviceRgbaCS()); } -} - -;// CONCATENATED MODULE: ./src/core/jbig2_stream.js - - - - - -class Jbig2Stream extends DecodeStream { - constructor(stream, maybeLength, params) { - super(maybeLength); - this.stream = stream; - this.dict = stream.dict; - this.maybeLength = maybeLength; - this.params = params; - } - get bytes() { - return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); - } - ensureBuffer(requested) {} - readBlock() { - if (this.eof) { - return; - } - const jbig2Image = new Jbig2Image(); - const chunks = []; - if (this.params instanceof Dict) { - const globalsStream = this.params.get("JBIG2Globals"); - if (globalsStream instanceof BaseStream) { - const globals = globalsStream.getBytes(); - chunks.push({ - data: globals, - start: 0, - end: globals.length - }); + static get cmyk() { + if (CmykICCBasedCS.isUsable) { + try { + return shadow(this, "cmyk", new CmykICCBasedCS()); + } catch { + warn("CMYK fallback: DeviceCMYK"); } } - chunks.push({ - data: this.bytes, - start: 0, - end: this.bytes.length - }); - const data = jbig2Image.parseChunks(chunks); - const dataLength = data.length; - for (let i = 0; i < dataLength; i++) { - data[i] ^= 0xff; - } - this.buffer = data; - this.bufferLength = dataLength; - this.eof = true; + return shadow(this, "cmyk", new DeviceCmykCS()); } } -;// CONCATENATED MODULE: ./src/shared/image_utils.js +;// ./src/core/jpg.js -function convertToRGBA(params) { - switch (params.kind) { - case ImageKind.GRAYSCALE_1BPP: - return convertBlackAndWhiteToRGBA(params); - case ImageKind.RGB_24BPP: - return convertRGBToRGBA(params); - } - return null; -} -function convertBlackAndWhiteToRGBA({ - src, - srcPos = 0, - dest, - width, - height, - nonBlackColor = 0xffffffff, - inverseDecode = false -}) { - const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; - const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor]; - const widthInSource = width >> 3; - const widthRemainder = width & 7; - const srcLength = src.length; - dest = new Uint32Array(dest.buffer); - let destPos = 0; - for (let i = 0; i < height; i++) { - for (const max = srcPos + widthInSource; srcPos < max; srcPos++) { - const elem = srcPos < srcLength ? src[srcPos] : 255; - dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping; - } - if (widthRemainder === 0) { - continue; - } - const elem = srcPos < srcLength ? src[srcPos++] : 255; - for (let j = 0; j < widthRemainder; j++) { - dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping; - } - } - return { - srcPos, - destPos - }; -} -function convertRGBToRGBA({ - src, - srcPos = 0, - dest, - destPos = 0, - width, - height -}) { - let i = 0; - const len32 = src.length >> 2; - const src32 = new Uint32Array(src.buffer, srcPos, len32); - if (FeatureTest.isLittleEndian) { - for (; i < len32 - 2; i += 3, destPos += 4) { - const s1 = src32[i]; - const s2 = src32[i + 1]; - const s3 = src32[i + 2]; - dest[destPos] = s1 | 0xff000000; - dest[destPos + 1] = s1 >>> 24 | s2 << 8 | 0xff000000; - dest[destPos + 2] = s2 >>> 16 | s3 << 16 | 0xff000000; - dest[destPos + 3] = s3 >>> 8 | 0xff000000; - } - for (let j = i * 4, jj = src.length; j < jj; j += 3) { - dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | 0xff000000; - } - } else { - for (; i < len32 - 2; i += 3, destPos += 4) { - const s1 = src32[i]; - const s2 = src32[i + 1]; - const s3 = src32[i + 2]; - dest[destPos] = s1 | 0xff; - dest[destPos + 1] = s1 << 24 | s2 >>> 8 | 0xff; - dest[destPos + 2] = s2 << 16 | s3 >>> 16 | 0xff; - dest[destPos + 3] = s3 << 8 | 0xff; - } - for (let j = i * 4, jj = src.length; j < jj; j += 3) { - dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | 0xff; - } - } - return { - srcPos, - destPos - }; -} -function grayToRGBA(src, dest) { - if (FeatureTest.isLittleEndian) { - for (let i = 0, ii = src.length; i < ii; i++) { - dest[i] = src[i] * 0x10101 | 0xff000000; - } - } else { - for (let i = 0, ii = src.length; i < ii; i++) { - dest[i] = src[i] * 0x1010100 | 0x000000ff; - } - } -} - -;// CONCATENATED MODULE: ./src/core/jpg.js class JpegError extends BaseException { constructor(msg) { - super(`JPEG error: ${msg}`, "JpegError"); + super(msg, "JpegError"); } } class DNLMarkerError extends BaseException { @@ -6436,7 +4238,7 @@ function getBlockBufferOffset(component, row, col) { return 64 * ((component.blocksPerLine + 1) * row + col); } -function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive, parseDNLMarker = false) { +function decodeScan(data, view, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive, parseDNLMarker = false) { const mcusPerLine = frame.mcusPerLine; const progressive = frame.progressive; const startOffset = offset; @@ -6453,7 +4255,7 @@ if (nextByte) { if (nextByte === 0xdc && parseDNLMarker) { offset += 2; - const scanLines = readUint16(data, offset); + const scanLines = view.getUint16(offset); offset += 2; if (scanLines > 0 && scanLines !== frame.scanLines) { throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data", scanLines); @@ -6687,7 +4489,7 @@ } } bitsCount = 0; - fileMarker = findNextFileMarker(data, offset); + fileMarker = findNextFileMarker(data, view, offset); if (!fileMarker) { break; } @@ -6919,13 +4721,13 @@ } return component.blockData; } -function findNextFileMarker(data, currentPos, startPos = currentPos) { +function findNextFileMarker(data, view, currentPos, startPos = currentPos) { const maxPos = data.length - 1; let newPos = startPos < currentPos ? startPos : currentPos; if (currentPos >= maxPos) { return null; } - const currentMarker = readUint16(data, currentPos); + const currentMarker = view.getUint16(currentPos); if (currentMarker >= 0xffc0 && currentMarker <= 0xfffe) { return { invalid: null, @@ -6933,12 +4735,12 @@ offset: currentPos }; } - let newMarker = readUint16(data, newPos); + let newMarker = view.getUint16(newPos); while (!(newMarker >= 0xffc0 && newMarker <= 0xfffe)) { if (++newPos >= maxPos) { return null; } - newMarker = readUint16(data, newPos); + newMarker = view.getUint16(newPos); } return { invalid: currentMarker.toString(16), @@ -6946,6 +4748,48 @@ offset: newPos }; } +function prepareComponents(frame) { + const mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH); + const mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV); + for (const component of frame.components) { + const blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH); + const blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV); + const blocksPerLineForMcu = mcusPerLine * component.h; + const blocksPerColumnForMcu = mcusPerColumn * component.v; + const blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1); + component.blockData = new Int16Array(blocksBufferSize); + component.blocksPerLine = blocksPerLine; + component.blocksPerColumn = blocksPerColumn; + } + frame.mcusPerLine = mcusPerLine; + frame.mcusPerColumn = mcusPerColumn; +} +function readDataBlock(data, view, offset) { + const length = view.getUint16(offset); + offset += 2; + let endOffset = offset + length - 2; + const fileMarker = findNextFileMarker(data, view, endOffset, offset); + if (fileMarker?.invalid) { + warn("readDataBlock - incorrect length, current marker is: " + fileMarker.invalid); + endOffset = fileMarker.offset; + } + const array = data.subarray(offset, endOffset); + return { + appData: array, + oldOffset: offset, + newOffset: offset + array.length + }; +} +function skipData(data, view, offset) { + const length = view.getUint16(offset); + offset += 2; + const endOffset = offset + length - 2; + const fileMarker = findNextFileMarker(data, view, endOffset, offset); + if (fileMarker?.invalid) { + return fileMarker.offset; + } + return endOffset; +} class JpegImage { constructor({ decodeTransform = null, @@ -6954,38 +4798,67 @@ this._decodeTransform = decodeTransform; this._colorTransform = colorTransform; } - parse(data, { - dnlScanLines = null - } = {}) { - function readDataBlock() { - const length = readUint16(data, offset); - offset += 2; - let endOffset = offset + length - 2; - const fileMarker = findNextFileMarker(data, endOffset, offset); - if (fileMarker?.invalid) { - warn("readDataBlock - incorrect length, current marker is: " + fileMarker.invalid); - endOffset = fileMarker.offset; - } - const array = data.subarray(offset, endOffset); - offset += array.length; - return array; + static canUseImageDecoder(data, colorTransform = -1) { + const view = new DataView(data.buffer, data.byteOffset, data.byteLength); + let exifOffsets = null; + let offset = 0; + let numComponents = null; + let fileMarker = view.getUint16(offset); + offset += 2; + if (fileMarker !== 0xffd8) { + throw new JpegError("SOI not found"); } - function prepareComponents(frame) { - const mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH); - const mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV); - for (const component of frame.components) { - const blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH); - const blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV); - const blocksPerLineForMcu = mcusPerLine * component.h; - const blocksPerColumnForMcu = mcusPerColumn * component.v; - const blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1); - component.blockData = new Int16Array(blocksBufferSize); - component.blocksPerLine = blocksPerLine; - component.blocksPerColumn = blocksPerColumn; + fileMarker = view.getUint16(offset); + offset += 2; + markerLoop: while (fileMarker !== 0xffd9) { + switch (fileMarker) { + case 0xffe1: + const { + appData, + oldOffset, + newOffset + } = readDataBlock(data, view, offset); + offset = newOffset; + if (appData[0] === 0x45 && appData[1] === 0x78 && appData[2] === 0x69 && appData[3] === 0x66 && appData[4] === 0 && appData[5] === 0) { + if (exifOffsets) { + throw new JpegError("Duplicate EXIF-blocks found."); + } + exifOffsets = { + exifStart: oldOffset + 6, + exifEnd: newOffset + }; + } + fileMarker = view.getUint16(offset); + offset += 2; + continue; + case 0xffc0: + case 0xffc1: + case 0xffc2: + numComponents = data[offset + (2 + 1 + 2 + 2)]; + break markerLoop; + case 0xffff: + if (data[offset] !== 0xff) { + offset--; + } + break; } - frame.mcusPerLine = mcusPerLine; - frame.mcusPerColumn = mcusPerColumn; + offset = skipData(data, view, offset); + fileMarker = view.getUint16(offset); + offset += 2; } + if (numComponents === 4) { + return null; + } + if (numComponents === 3 && colorTransform === 0) { + return null; + } + return exifOffsets || {}; + } + parse(data, { + dnlScanLines = null + } = {}) { + const view = new DataView(data.buffer, data.byteOffset, data.byteLength); + const maxOffset = data.length - 1; let offset = 0; let jfif = null; let adobe = null; @@ -6994,12 +4867,12 @@ const quantizationTables = []; const huffmanTablesAC = [], huffmanTablesDC = []; - let fileMarker = readUint16(data, offset); + let fileMarker = view.getUint16(offset); offset += 2; if (fileMarker !== 0xffd8) { throw new JpegError("SOI not found"); } - fileMarker = readUint16(data, offset); + fileMarker = view.getUint16(offset); offset += 2; markerLoop: while (fileMarker !== 0xffd9) { let i, j, l; @@ -7021,7 +4894,11 @@ case 0xffee: case 0xffef: case 0xfffe: - const appData = readDataBlock(); + const { + appData, + newOffset + } = readDataBlock(data, view, offset); + offset = newOffset; if (fileMarker === 0xffe0) { if (appData[0] === 0x4a && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) { jfif = { @@ -7050,7 +4927,7 @@ } break; case 0xffdb: - const quantizationTablesLength = readUint16(data, offset); + const quantizationTablesLength = view.getUint16(offset); offset += 2; const quantizationTablesEnd = quantizationTablesLength + offset - 2; let z; @@ -7065,7 +4942,7 @@ } else if (quantizationTableSpec >> 4 === 1) { for (j = 0; j < 64; j++) { z = dctZigZag[j]; - tableData[z] = readUint16(data, offset); + tableData[z] = view.getUint16(offset); offset += 2; } } else { @@ -7085,10 +4962,10 @@ frame.extended = fileMarker === 0xffc1; frame.progressive = fileMarker === 0xffc2; frame.precision = data[offset++]; - const sofScanLines = readUint16(data, offset); + const sofScanLines = view.getUint16(offset); offset += 2; frame.scanLines = dnlScanLines || sofScanLines; - frame.samplesPerLine = readUint16(data, offset); + frame.samplesPerLine = view.getUint16(offset); offset += 2; frame.components = []; frame.componentIds = {}; @@ -7120,7 +4997,7 @@ prepareComponents(frame); break; case 0xffc4: - const huffmanLength = readUint16(data, offset); + const huffmanLength = view.getUint16(offset); offset += 2; for (i = 2; i < huffmanLength;) { const huffmanTableSpec = data[offset++]; @@ -7139,7 +5016,7 @@ break; case 0xffdd: offset += 2; - resetInterval = readUint16(data, offset); + resetInterval = view.getUint16(offset); offset += 2; break; case 0xffda: @@ -7161,7 +5038,7 @@ spectralEnd = data[offset++], successiveApproximation = data[offset++]; try { - const processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15, parseDNLMarker); + const processed = decodeScan(data, view, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15, parseDNLMarker); offset += processed; } catch (ex) { if (ex instanceof DNLMarkerError) { @@ -7185,20 +5062,24 @@ } break; default: - const nextFileMarker = findNextFileMarker(data, offset - 2, offset - 3); + const nextFileMarker = findNextFileMarker(data, view, offset - 2, offset - 3); if (nextFileMarker?.invalid) { warn("JpegImage.parse - unexpected data, current marker is: " + nextFileMarker.invalid); offset = nextFileMarker.offset; break; } - if (!nextFileMarker || offset >= data.length - 1) { + if (!nextFileMarker || offset >= maxOffset) { warn("JpegImage.parse - reached the end of the image data " + "without finding an EOI marker (0xFFD9)."); break markerLoop; } throw new JpegError("JpegImage.parse - unknown marker: " + fileMarker.toString(16)); } - fileMarker = readUint16(data, offset); - offset += 2; + if (offset < maxOffset) { + fileMarker = view.getUint16(offset); + offset += 2; + } else { + fileMarker = 0; + } } if (!frame) { throw new JpegError("JpegImage.parse - no frame data found."); @@ -7225,7 +5106,7 @@ this.numComponents = this.components.length; return undefined; } - _getLinearizedBlockData(width, height, isSourcePDF = false) { + #getLinearizedBlockData(width, height, isSourcePDF) { const scaleX = this.width / width, scaleY = this.height / height; let component, componentScaleX, componentScaleY, blocksPerScanline; @@ -7263,9 +5144,6 @@ } } let transform = this._decodeTransform; - if (!isSourcePDF && numComponents === 4 && !transform) { - transform = new Int32Array([-256, 255, -256, 255, -256, 255, -256, 255]); - } if (transform) { for (i = 0; i < dataLength;) { for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) { @@ -7294,7 +5172,7 @@ } _convertYccToRgb(data) { let Y, Cb, Cr; - for (let i = 0, length = data.length; i < length; i += 3) { + for (let i = 0, ii = data.length; i < ii; i += 3) { Y = data[i]; Cb = data[i + 1]; Cr = data[i + 2]; @@ -7305,7 +5183,7 @@ return data; } _convertYccToRgba(data, out) { - for (let i = 0, j = 0, length = data.length; i < length; i += 3, j += 4) { + for (let i = 0, j = 0, ii = data.length; i < ii; i += 3, j += 4) { const Y = data[i]; const Cb = data[i + 1]; const Cr = data[i + 2]; @@ -7317,35 +5195,16 @@ return out; } _convertYcckToRgb(data) { - let Y, Cb, Cr, k; - let offset = 0; - for (let i = 0, length = data.length; i < length; i += 4) { - Y = data[i]; - Cb = data[i + 1]; - Cr = data[i + 2]; - k = data[i + 3]; - data[offset++] = -122.67195406894 + Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - 0.154362151871126) + Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - 0.00477271405408747 * k + 1.53380253221734) + Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + 0.48357088451265) + k * (-0.000336197177618394 * k + 0.484791561490776); - data[offset++] = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665); - data[offset++] = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407); - } - return data.subarray(0, offset); + this._convertYcckToCmyk(data); + return this._convertCmykToRgb(data); } _convertYcckToRgba(data) { - for (let i = 0, length = data.length; i < length; i += 4) { - const Y = data[i]; - const Cb = data[i + 1]; - const Cr = data[i + 2]; - const k = data[i + 3]; - data[i] = -122.67195406894 + Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - 0.154362151871126) + Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - 0.00477271405408747 * k + 1.53380253221734) + Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + 0.48357088451265) + k * (-0.000336197177618394 * k + 0.484791561490776); - data[i + 1] = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665); - data[i + 2] = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407); - data[i + 3] = 255; - } - return data; + this._convertYcckToCmyk(data); + return this._convertCmykToRgba(data); } _convertYcckToCmyk(data) { let Y, Cb, Cr; - for (let i = 0, length = data.length; i < length; i += 4) { + for (let i = 0, ii = data.length; i < ii; i += 4) { Y = data[i]; Cb = data[i + 1]; Cr = data[i + 2]; @@ -7356,29 +5215,16 @@ return data; } _convertCmykToRgb(data) { - let c, m, y, k; - let offset = 0; - for (let i = 0, length = data.length; i < length; i += 4) { - c = data[i]; - m = data[i + 1]; - y = data[i + 2]; - k = data[i + 3]; - data[offset++] = 255 + c * (-0.00006747147073602441 * c + 0.0008379262121013727 * m + 0.0002894718188643294 * y + 0.003264231057537806 * k - 1.1185611867203937) + m * (0.000026374107616089405 * m - 0.00008626949158638572 * y - 0.0002748769067499491 * k - 0.02155688794978967) + y * (-0.00003878099212869363 * y - 0.0003267808279485286 * k + 0.0686742238595345) - k * (0.0003361971776183937 * k + 0.7430659151342254); - data[offset++] = 255 + c * (0.00013596372813588848 * c + 0.000924537132573585 * m + 0.00010567359618683593 * y + 0.0004791864687436512 * k - 0.3109689587515875) + m * (-0.00023545346108370344 * m + 0.0002702845253534714 * y + 0.0020200308977307156 * k - 0.7488052167015494) + y * (0.00006834815998235662 * y + 0.00015168452363460973 * k - 0.09751927774728933) - k * (0.0003189131175883281 * k + 0.7364883807733168); - data[offset++] = 255 + c * (0.000013598650411385307 * c + 0.00012423956175490851 * m + 0.0004751985097583589 * y - 0.0000036729317476630422 * k - 0.05562186980264034) + m * (0.00016141380598724676 * m + 0.0009692239130725186 * y + 0.0007782692450036253 * k - 0.44015232367526463) + y * (5.068882914068769e-7 * y + 0.0017778369011375071 * k - 0.7591454649749609) - k * (0.0003435319965105553 * k + 0.7063770186160144); - } - return data.subarray(0, offset); + const count = data.length / 4; + ColorSpaceUtils.cmyk.getRgbBuffer(data, 0, count, data, 0, 8, 0); + return data.subarray(0, count * 3); } _convertCmykToRgba(data) { - for (let i = 0, length = data.length; i < length; i += 4) { - const c = data[i]; - const m = data[i + 1]; - const y = data[i + 2]; - const k = data[i + 3]; - data[i] = 255 + c * (-0.00006747147073602441 * c + 0.0008379262121013727 * m + 0.0002894718188643294 * y + 0.003264231057537806 * k - 1.1185611867203937) + m * (0.000026374107616089405 * m - 0.00008626949158638572 * y - 0.0002748769067499491 * k - 0.02155688794978967) + y * (-0.00003878099212869363 * y - 0.0003267808279485286 * k + 0.0686742238595345) - k * (0.0003361971776183937 * k + 0.7430659151342254); - data[i + 1] = 255 + c * (0.00013596372813588848 * c + 0.000924537132573585 * m + 0.00010567359618683593 * y + 0.0004791864687436512 * k - 0.3109689587515875) + m * (-0.00023545346108370344 * m + 0.0002702845253534714 * y + 0.0020200308977307156 * k - 0.7488052167015494) + y * (0.00006834815998235662 * y + 0.00015168452363460973 * k - 0.09751927774728933) - k * (0.0003189131175883281 * k + 0.7364883807733168); - data[i + 2] = 255 + c * (0.000013598650411385307 * c + 0.00012423956175490851 * m + 0.0004751985097583589 * y - 0.0000036729317476630422 * k - 0.05562186980264034) + m * (0.00016141380598724676 * m + 0.0009692239130725186 * y + 0.0007782692450036253 * k - 0.44015232367526463) + y * (5.068882914068769e-7 * y + 0.0017778369011375071 * k - 0.7591454649749609) - k * (0.0003435319965105553 * k + 0.7063770186160144); - data[i + 3] = 255; + ColorSpaceUtils.cmyk.getRgbBuffer(data, 0, data.length / 4, data, 0, 8, 1); + if (ColorSpaceUtils.cmyk instanceof DeviceCmykCS) { + for (let i = 3, ii = data.length; i < ii; i += 4) { + data[i] = 255; + } } return data; } @@ -7387,12 +5233,12 @@ height, forceRGBA = false, forceRGB = false, - isSourcePDF = false + isSourcePDF = true }) { if (this.numComponents > 4) { throw new JpegError("Unsupported color mode"); } - const data = this._getLinearizedBlockData(width, height, isSourcePDF); + const data = this.#getLinearizedBlockData(width, height, isSourcePDF); if (this.numComponents === 1 && (forceRGBA || forceRGB)) { const len = data.length * (forceRGBA ? 4 : 3); const rgbaData = new Uint8ClampedArray(len); @@ -7432,34 +5278,36 @@ } } -;// CONCATENATED MODULE: ./src/core/jpeg_stream.js +;// ./src/core/jpeg_stream.js class JpegStream extends DecodeStream { + static #isImageDecoderSupported = FeatureTest.isImageDecoderSupported; constructor(stream, maybeLength, params) { - let ch; - while ((ch = stream.getByte()) !== -1) { - if (ch === 0xff) { - stream.skip(-1); - break; - } - } super(maybeLength); this.stream = stream; this.dict = stream.dict; this.maybeLength = maybeLength; this.params = params; } + static get canUseImageDecoder() { + return shadow(this, "canUseImageDecoder", this.#isImageDecoderSupported ? ImageDecoder.isTypeSupported("image/jpeg") : Promise.resolve(false)); + } + static setOptions({ + isImageDecoderSupported = false + }) { + this.#isImageDecoderSupported = isImageDecoderSupported; + } get bytes() { return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); } ensureBuffer(requested) {} readBlock() { - if (this.eof) { - return; - } + this.decodeImage(); + } + get jpegOptions() { const jpegOptions = { decodeTransform: undefined, colorTransform: undefined @@ -7488,1993 +5336,5497 @@ jpegOptions.colorTransform = colorTransform; } } - const jpegImage = new JpegImage(jpegOptions); - jpegImage.parse(this.bytes); + return shadow(this, "jpegOptions", jpegOptions); + } + #skipUselessBytes(data) { + for (let i = 0, ii = data.length - 1; i < ii; i++) { + if (data[i] === 0xff && data[i + 1] === 0xd8) { + if (i > 0) { + data = data.subarray(i); + } + break; + } + } + return data; + } + decodeImage(bytes) { + if (this.eof) { + return this.buffer; + } + bytes = this.#skipUselessBytes(bytes || this.bytes); + const jpegImage = new JpegImage(this.jpegOptions); + jpegImage.parse(bytes); const data = jpegImage.getData({ width: this.drawWidth, height: this.drawHeight, forceRGBA: this.forceRGBA, - forceRGB: this.forceRGB, - isSourcePDF: true + forceRGB: this.forceRGB }); this.buffer = data; this.bufferLength = data.length; this.eof = true; + return this.buffer; + } + get canAsyncDecodeImageFromBuffer() { + return this.stream.isAsync; + } + async getTransferableImage() { + if (!(await JpegStream.canUseImageDecoder)) { + return null; + } + const jpegOptions = this.jpegOptions; + if (jpegOptions.decodeTransform) { + return null; + } + let decoder; + try { + const bytes = this.canAsyncDecodeImageFromBuffer && (await this.stream.asyncGetBytes()) || this.bytes; + if (!bytes) { + return null; + } + let data = this.#skipUselessBytes(bytes); + const useImageDecoder = JpegImage.canUseImageDecoder(data, jpegOptions.colorTransform); + if (!useImageDecoder) { + return null; + } + if (useImageDecoder.exifStart) { + data = data.slice(); + data.fill(0x00, useImageDecoder.exifStart, useImageDecoder.exifEnd); + } + decoder = new ImageDecoder({ + data, + type: "image/jpeg", + preferAnimation: false + }); + return (await decoder.decode()).image; + } catch (reason) { + warn(`getTransferableImage - failed: "${reason}".`); + return null; + } finally { + decoder?.close(); + } + } + get isImageStream() { + return true; } } -;// CONCATENATED MODULE: ./src/core/jpx.js +;// ./src/core/operator_list.js - - -class JpxError extends BaseException { - constructor(msg) { - super(`JPX error: ${msg}`, "JpxError"); +function addState(parentState, pattern, checkFn, iterateFn, processFn) { + let state = parentState; + for (let i = 0, ii = pattern.length - 1; i < ii; i++) { + const item = pattern[i]; + state = state[item] ||= []; } + state[pattern.at(-1)] = { + checkFn, + iterateFn, + processFn + }; } -const SubbandsGainLog2 = { - LL: 0, - LH: 1, - HL: 1, - HH: 2 -}; -class JpxImage { - constructor() { - this.failOnCorruptedImage = false; +const InitialState = []; +addState(InitialState, [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore], null, function iterateInlineImageGroup(context, i) { + const fnArray = context.fnArray; + const iFirstSave = context.iCurr - 3; + const pos = (i - iFirstSave) % 4; + switch (pos) { + case 0: + return fnArray[i] === OPS.save; + case 1: + return fnArray[i] === OPS.transform; + case 2: + return fnArray[i] === OPS.paintInlineImageXObject; + case 3: + return fnArray[i] === OPS.restore; } - parse(data) { - const head = readUint16(data, 0); - if (head === 0xff4f) { - this.parseCodestream(data, 0, data.length); - return; + throw new Error(`iterateInlineImageGroup - invalid pos: ${pos}`); +}, function foundInlineImageGroup(context, i) { + const MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10; + const MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200; + const MAX_WIDTH = 1000; + const IMAGE_PADDING = 1; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstSave = curr - 3; + const iFirstTransform = curr - 2; + const iFirstPIIXO = curr - 1; + const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_INLINE_IMAGES_BLOCK); + if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) { + return i - (i - iFirstSave) % 4; + } + let maxX = 0; + const map = []; + let maxLineHeight = 0; + let currentX = IMAGE_PADDING, + currentY = IMAGE_PADDING; + for (let q = 0; q < count; q++) { + const transform = argsArray[iFirstTransform + (q << 2)]; + const img = argsArray[iFirstPIIXO + (q << 2)][0]; + if (currentX + img.width > MAX_WIDTH) { + maxX = Math.max(maxX, currentX); + currentY += maxLineHeight + 2 * IMAGE_PADDING; + currentX = 0; + maxLineHeight = 0; } - const length = data.length; - let position = 0; - while (position < length) { - let headerSize = 8; - let lbox = readUint32(data, position); - const tbox = readUint32(data, position + 4); - position += headerSize; - if (lbox === 1) { - lbox = readUint32(data, position) * 4294967296 + readUint32(data, position + 4); - position += 8; - headerSize += 8; - } - if (lbox === 0) { - lbox = length - position + headerSize; - } - if (lbox < headerSize) { - throw new JpxError("Invalid box field size"); - } - const dataLength = lbox - headerSize; - let jumpDataLength = true; - switch (tbox) { - case 0x6a703268: - jumpDataLength = false; - break; - case 0x636f6c72: - const method = data[position]; - if (method === 1) { - const colorspace = readUint32(data, position + 3); - switch (colorspace) { - case 16: - case 17: - case 18: - break; - default: - warn("Unknown colorspace " + colorspace); - break; - } - } else if (method === 2) { - info("ICC profile not supported"); - } - break; - case 0x6a703263: - this.parseCodestream(data, position, position + dataLength); - break; - case 0x6a502020: - if (readUint32(data, position) !== 0x0d0a870a) { - warn("Invalid JP2 signature"); - } - break; - case 0x6a501a1a: - case 0x66747970: - case 0x72726571: - case 0x72657320: - case 0x69686472: + map.push({ + transform, + x: currentX, + y: currentY, + w: img.width, + h: img.height + }); + currentX += img.width + 2 * IMAGE_PADDING; + maxLineHeight = Math.max(maxLineHeight, img.height); + } + const imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING; + const imgHeight = currentY + maxLineHeight + IMAGE_PADDING; + const imgData = new Uint8Array(imgWidth * imgHeight * 4); + const imgRowSize = imgWidth << 2; + for (let q = 0; q < count; q++) { + const data = argsArray[iFirstPIIXO + (q << 2)][0].data; + const rowSize = map[q].w << 2; + let dataOffset = 0; + let offset = map[q].x + map[q].y * imgWidth << 2; + imgData.set(data.subarray(0, rowSize), offset - imgRowSize); + for (let k = 0, kk = map[q].h; k < kk; k++) { + imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset); + dataOffset += rowSize; + offset += imgRowSize; + } + imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset); + while (offset >= 0) { + data[offset - 4] = data[offset]; + data[offset - 3] = data[offset + 1]; + data[offset - 2] = data[offset + 2]; + data[offset - 1] = data[offset + 3]; + data[offset + rowSize] = data[offset + rowSize - 4]; + data[offset + rowSize + 1] = data[offset + rowSize - 3]; + data[offset + rowSize + 2] = data[offset + rowSize - 2]; + data[offset + rowSize + 3] = data[offset + rowSize - 1]; + offset -= imgRowSize; + } + } + const img = { + width: imgWidth, + height: imgHeight + }; + if (context.isOffscreenCanvasSupported) { + const canvas = new OffscreenCanvas(imgWidth, imgHeight); + const ctx = canvas.getContext("2d"); + ctx.putImageData(new ImageData(new Uint8ClampedArray(imgData.buffer), imgWidth, imgHeight), 0, 0); + img.bitmap = canvas.transferToImageBitmap(); + img.data = null; + } else { + img.kind = ImageKind.RGBA_32BPP; + img.data = imgData; + } + fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup); + argsArray.splice(iFirstSave, count * 4, [img, map]); + return iFirstSave + 1; +}); +addState(InitialState, [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore], null, function iterateImageMaskGroup(context, i) { + const fnArray = context.fnArray; + const iFirstSave = context.iCurr - 3; + const pos = (i - iFirstSave) % 4; + switch (pos) { + case 0: + return fnArray[i] === OPS.save; + case 1: + return fnArray[i] === OPS.transform; + case 2: + return fnArray[i] === OPS.paintImageMaskXObject; + case 3: + return fnArray[i] === OPS.restore; + } + throw new Error(`iterateImageMaskGroup - invalid pos: ${pos}`); +}, function foundImageMaskGroup(context, i) { + const MIN_IMAGES_IN_MASKS_BLOCK = 10; + const MAX_IMAGES_IN_MASKS_BLOCK = 100; + const MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstSave = curr - 3; + const iFirstTransform = curr - 2; + const iFirstPIMXO = curr - 1; + let count = Math.floor((i - iFirstSave) / 4); + if (count < MIN_IMAGES_IN_MASKS_BLOCK) { + return i - (i - iFirstSave) % 4; + } + let isSameImage = false; + let iTransform, transformArgs; + const firstPIMXOArg0 = argsArray[iFirstPIMXO][0]; + const firstTransformArg0 = argsArray[iFirstTransform][0], + firstTransformArg1 = argsArray[iFirstTransform][1], + firstTransformArg2 = argsArray[iFirstTransform][2], + firstTransformArg3 = argsArray[iFirstTransform][3]; + if (firstTransformArg1 === firstTransformArg2) { + isSameImage = true; + iTransform = iFirstTransform + 4; + let iPIMXO = iFirstPIMXO + 4; + for (let q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) { + transformArgs = argsArray[iTransform]; + if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || transformArgs[0] !== firstTransformArg0 || transformArgs[1] !== firstTransformArg1 || transformArgs[2] !== firstTransformArg2 || transformArgs[3] !== firstTransformArg3) { + if (q < MIN_IMAGES_IN_MASKS_BLOCK) { + isSameImage = false; + } else { + count = q; + } + break; + } + } + } + if (isSameImage) { + count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK); + const positions = new Float32Array(count * 2); + iTransform = iFirstTransform; + for (let q = 0; q < count; q++, iTransform += 4) { + transformArgs = argsArray[iTransform]; + positions[q << 1] = transformArgs[4]; + positions[(q << 1) + 1] = transformArgs[5]; + } + fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat); + argsArray.splice(iFirstSave, count * 4, [firstPIMXOArg0, firstTransformArg0, firstTransformArg1, firstTransformArg2, firstTransformArg3, positions]); + } else { + count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK); + const images = []; + for (let q = 0; q < count; q++) { + transformArgs = argsArray[iFirstTransform + (q << 2)]; + const maskParams = argsArray[iFirstPIMXO + (q << 2)][0]; + images.push({ + data: maskParams.data, + width: maskParams.width, + height: maskParams.height, + interpolate: maskParams.interpolate, + count: maskParams.count, + transform: transformArgs + }); + } + fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup); + argsArray.splice(iFirstSave, count * 4, [images]); + } + return iFirstSave + 1; +}); +addState(InitialState, [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore], function (context) { + const argsArray = context.argsArray; + const iFirstTransform = context.iCurr - 2; + return argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0; +}, function iterateImageGroup(context, i) { + const fnArray = context.fnArray, + argsArray = context.argsArray; + const iFirstSave = context.iCurr - 3; + const pos = (i - iFirstSave) % 4; + switch (pos) { + case 0: + return fnArray[i] === OPS.save; + case 1: + if (fnArray[i] !== OPS.transform) { + return false; + } + const iFirstTransform = context.iCurr - 2; + const firstTransformArg0 = argsArray[iFirstTransform][0]; + const firstTransformArg3 = argsArray[iFirstTransform][3]; + if (argsArray[i][0] !== firstTransformArg0 || argsArray[i][1] !== 0 || argsArray[i][2] !== 0 || argsArray[i][3] !== firstTransformArg3) { + return false; + } + return true; + case 2: + if (fnArray[i] !== OPS.paintImageXObject) { + return false; + } + const iFirstPIXO = context.iCurr - 1; + const firstPIXOArg0 = argsArray[iFirstPIXO][0]; + if (argsArray[i][0] !== firstPIXOArg0) { + return false; + } + return true; + case 3: + return fnArray[i] === OPS.restore; + } + throw new Error(`iterateImageGroup - invalid pos: ${pos}`); +}, function (context, i) { + const MIN_IMAGES_IN_BLOCK = 3; + const MAX_IMAGES_IN_BLOCK = 1000; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstSave = curr - 3; + const iFirstTransform = curr - 2; + const iFirstPIXO = curr - 1; + const firstPIXOArg0 = argsArray[iFirstPIXO][0]; + const firstTransformArg0 = argsArray[iFirstTransform][0]; + const firstTransformArg3 = argsArray[iFirstTransform][3]; + const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_BLOCK); + if (count < MIN_IMAGES_IN_BLOCK) { + return i - (i - iFirstSave) % 4; + } + const positions = new Float32Array(count * 2); + let iTransform = iFirstTransform; + for (let q = 0; q < count; q++, iTransform += 4) { + const transformArgs = argsArray[iTransform]; + positions[q << 1] = transformArgs[4]; + positions[(q << 1) + 1] = transformArgs[5]; + } + const args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, positions]; + fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat); + argsArray.splice(iFirstSave, count * 4, args); + return iFirstSave + 1; +}); +addState(InitialState, [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText], null, function iterateShowTextGroup(context, i) { + const fnArray = context.fnArray, + argsArray = context.argsArray; + const iFirstSave = context.iCurr - 4; + const pos = (i - iFirstSave) % 5; + switch (pos) { + case 0: + return fnArray[i] === OPS.beginText; + case 1: + return fnArray[i] === OPS.setFont; + case 2: + return fnArray[i] === OPS.setTextMatrix; + case 3: + if (fnArray[i] !== OPS.showText) { + return false; + } + const iFirstSetFont = context.iCurr - 3; + const firstSetFontArg0 = argsArray[iFirstSetFont][0]; + const firstSetFontArg1 = argsArray[iFirstSetFont][1]; + if (argsArray[i][0] !== firstSetFontArg0 || argsArray[i][1] !== firstSetFontArg1) { + return false; + } + return true; + case 4: + return fnArray[i] === OPS.endText; + } + throw new Error(`iterateShowTextGroup - invalid pos: ${pos}`); +}, function (context, i) { + const MIN_CHARS_IN_BLOCK = 3; + const MAX_CHARS_IN_BLOCK = 1000; + const fnArray = context.fnArray, + argsArray = context.argsArray; + const curr = context.iCurr; + const iFirstBeginText = curr - 4; + const iFirstSetFont = curr - 3; + const iFirstSetTextMatrix = curr - 2; + const iFirstShowText = curr - 1; + const iFirstEndText = curr; + const firstSetFontArg0 = argsArray[iFirstSetFont][0]; + const firstSetFontArg1 = argsArray[iFirstSetFont][1]; + let count = Math.min(Math.floor((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK); + if (count < MIN_CHARS_IN_BLOCK) { + return i - (i - iFirstBeginText) % 5; + } + let iFirst = iFirstBeginText; + if (iFirstBeginText >= 4 && fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) { + count++; + iFirst -= 5; + } + let iEndText = iFirst + 4; + for (let q = 1; q < count; q++) { + fnArray.splice(iEndText, 3); + argsArray.splice(iEndText, 3); + iEndText += 2; + } + return iEndText + 1; +}); +addState(InitialState, [OPS.save, OPS.transform, OPS.constructPath, OPS.restore], context => { + const argsArray = context.argsArray; + const iFirstConstructPath = context.iCurr - 1; + const op = argsArray[iFirstConstructPath][0]; + if (op !== OPS.stroke && op !== OPS.closeStroke && op !== OPS.fillStroke && op !== OPS.eoFillStroke && op !== OPS.closeFillStroke && op !== OPS.closeEOFillStroke) { + return true; + } + const iFirstTransform = context.iCurr - 2; + const transform = argsArray[iFirstTransform]; + return transform[0] === 1 && transform[1] === 0 && transform[2] === 0 && transform[3] === 1; +}, () => false, (context, i) => { + const { + fnArray, + argsArray + } = context; + const curr = context.iCurr; + const iFirstSave = curr - 3; + const iFirstTransform = curr - 2; + const iFirstConstructPath = curr - 1; + const args = argsArray[iFirstConstructPath]; + const transform = argsArray[iFirstTransform]; + const [, [buffer], minMax] = args; + if (minMax) { + const newBBox = F32_BBOX_INIT.slice(); + Util.axialAlignedBoundingBox(minMax, transform, newBBox); + minMax.set(newBBox); + for (let k = 0, kk = buffer.length; k < kk;) { + switch (buffer[k++]) { + case DrawOPS.moveTo: + case DrawOPS.lineTo: + Util.applyTransform(buffer, transform, k); + k += 2; + break; + case DrawOPS.curveTo: + Util.applyTransformToBezier(buffer, transform, k); + k += 6; break; - default: - const headerType = String.fromCharCode(tbox >> 24 & 0xff, tbox >> 16 & 0xff, tbox >> 8 & 0xff, tbox & 0xff); - warn(`Unsupported header type ${tbox} (${headerType}).`); + } + } + } + fnArray.splice(iFirstSave, 4, OPS.constructPath); + argsArray.splice(iFirstSave, 4, args); + return iFirstSave + 1; +}); +class NullOptimizer { + constructor(queue) { + this.queue = queue; + } + _optimize() {} + push(fn, args) { + this.queue.fnArray.push(fn); + this.queue.argsArray.push(args); + this._optimize(); + } + flush() {} + reset() {} +} +class QueueOptimizer extends NullOptimizer { + constructor(queue) { + super(queue); + this.state = null; + this.context = { + iCurr: 0, + fnArray: queue.fnArray, + argsArray: queue.argsArray, + isOffscreenCanvasSupported: OperatorList.isOffscreenCanvasSupported + }; + this.match = null; + this.lastProcessed = 0; + } + _optimize() { + const fnArray = this.queue.fnArray; + let i = this.lastProcessed, + ii = fnArray.length; + let state = this.state; + let match = this.match; + if (!state && !match && i + 1 === ii && !InitialState[fnArray[i]]) { + this.lastProcessed = ii; + return; + } + const context = this.context; + while (i < ii) { + if (match) { + const iterate = (0, match.iterateFn)(context, i); + if (iterate) { + i++; + continue; + } + i = (0, match.processFn)(context, i + 1); + ii = fnArray.length; + match = null; + state = null; + if (i >= ii) { break; + } + } + state = (state || InitialState)[fnArray[i]]; + if (!state || Array.isArray(state)) { + i++; + continue; } - if (jumpDataLength) { - position += dataLength; + context.iCurr = i; + i++; + if (state.checkFn && !(0, state.checkFn)(context)) { + state = null; + continue; } + match = state; + state = null; } + this.state = state; + this.match = match; + this.lastProcessed = i; } - parseImageProperties(stream) { - let newByte = stream.getByte(); - while (newByte >= 0) { - const oldByte = newByte; - newByte = stream.getByte(); - const code = oldByte << 8 | newByte; - if (code === 0xff51) { - stream.skip(4); - const Xsiz = stream.getInt32() >>> 0; - const Ysiz = stream.getInt32() >>> 0; - const XOsiz = stream.getInt32() >>> 0; - const YOsiz = stream.getInt32() >>> 0; - stream.skip(16); - const Csiz = stream.getUint16(); - this.width = Xsiz - XOsiz; - this.height = Ysiz - YOsiz; - this.componentsCount = Csiz; - this.bitsPerComponent = 8; - return; + flush() { + while (this.match) { + const length = this.queue.fnArray.length; + this.lastProcessed = (0, this.match.processFn)(this.context, length); + this.match = null; + this.state = null; + this._optimize(); + } + } + reset() { + this.state = null; + this.match = null; + this.lastProcessed = 0; + } +} +class OperatorList { + static CHUNK_SIZE = 1000; + static CHUNK_SIZE_ABOUT = this.CHUNK_SIZE - 5; + static isOffscreenCanvasSupported = false; + constructor(intent = 0, streamSink) { + this._streamSink = streamSink; + this.fnArray = []; + this.argsArray = []; + this.optimizer = streamSink && !(intent & RenderingIntentFlag.OPLIST) ? new QueueOptimizer(this) : new NullOptimizer(this); + this.dependencies = new Set(); + this._totalLength = 0; + this.weight = 0; + this._resolved = streamSink ? null : Promise.resolve(); + } + static setOptions({ + isOffscreenCanvasSupported + }) { + this.isOffscreenCanvasSupported = isOffscreenCanvasSupported; + } + get length() { + return this.argsArray.length; + } + get ready() { + return this._resolved || this._streamSink.ready; + } + get totalLength() { + return this._totalLength + this.length; + } + addOp(fn, args) { + this.optimizer.push(fn, args); + this.weight++; + if (this._streamSink) { + if (this.weight >= OperatorList.CHUNK_SIZE) { + this.flush(); + } else if (this.weight >= OperatorList.CHUNK_SIZE_ABOUT && (fn === OPS.restore || fn === OPS.endText)) { + this.flush(); } } - throw new JpxError("No size marker found in JPX stream"); } - parseCodestream(data, start, end) { - const context = {}; - let doNotRecover = false; - try { - let position = start; - while (position + 1 < end) { - const code = readUint16(data, position); - position += 2; - let length = 0, - j, - sqcd, - spqcds, - spqcdSize, - scalarExpounded, - tile; - switch (code) { - case 0xff4f: - context.mainHeader = true; - break; - case 0xffd9: - break; - case 0xff51: - length = readUint16(data, position); - const siz = {}; - siz.Xsiz = readUint32(data, position + 4); - siz.Ysiz = readUint32(data, position + 8); - siz.XOsiz = readUint32(data, position + 12); - siz.YOsiz = readUint32(data, position + 16); - siz.XTsiz = readUint32(data, position + 20); - siz.YTsiz = readUint32(data, position + 24); - siz.XTOsiz = readUint32(data, position + 28); - siz.YTOsiz = readUint32(data, position + 32); - const componentsCount = readUint16(data, position + 36); - siz.Csiz = componentsCount; - const components = []; - j = position + 38; - for (let i = 0; i < componentsCount; i++) { - const component = { - precision: (data[j] & 0x7f) + 1, - isSigned: !!(data[j] & 0x80), - XRsiz: data[j + 1], - YRsiz: data[j + 2] - }; - j += 3; - calculateComponentDimensions(component, siz); - components.push(component); - } - context.SIZ = siz; - context.components = components; - calculateTileGrids(context, components); - context.QCC = []; - context.COC = []; - break; - case 0xff5c: - length = readUint16(data, position); - const qcd = {}; - j = position + 2; - sqcd = data[j++]; - switch (sqcd & 0x1f) { - case 0: - spqcdSize = 8; - scalarExpounded = true; - break; - case 1: - spqcdSize = 16; - scalarExpounded = false; - break; - case 2: - spqcdSize = 16; - scalarExpounded = true; - break; - default: - throw new Error("Invalid SQcd value " + sqcd); - } - qcd.noQuantization = spqcdSize === 8; - qcd.scalarExpounded = scalarExpounded; - qcd.guardBits = sqcd >> 5; - spqcds = []; - while (j < length + position) { - const spqcd = {}; - if (spqcdSize === 8) { - spqcd.epsilon = data[j++] >> 3; - spqcd.mu = 0; - } else { - spqcd.epsilon = data[j] >> 3; - spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1]; - j += 2; - } - spqcds.push(spqcd); - } - qcd.SPqcds = spqcds; - if (context.mainHeader) { - context.QCD = qcd; - } else { - context.currentTile.QCD = qcd; - context.currentTile.QCC = []; - } - break; - case 0xff5d: - length = readUint16(data, position); - const qcc = {}; - j = position + 2; - let cqcc; - if (context.SIZ.Csiz < 257) { - cqcc = data[j++]; - } else { - cqcc = readUint16(data, j); - j += 2; - } - sqcd = data[j++]; - switch (sqcd & 0x1f) { - case 0: - spqcdSize = 8; - scalarExpounded = true; - break; - case 1: - spqcdSize = 16; - scalarExpounded = false; - break; - case 2: - spqcdSize = 16; - scalarExpounded = true; - break; - default: - throw new Error("Invalid SQcd value " + sqcd); - } - qcc.noQuantization = spqcdSize === 8; - qcc.scalarExpounded = scalarExpounded; - qcc.guardBits = sqcd >> 5; - spqcds = []; - while (j < length + position) { - const spqcd = {}; - if (spqcdSize === 8) { - spqcd.epsilon = data[j++] >> 3; - spqcd.mu = 0; - } else { - spqcd.epsilon = data[j] >> 3; - spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1]; - j += 2; - } - spqcds.push(spqcd); - } - qcc.SPqcds = spqcds; - if (context.mainHeader) { - context.QCC[cqcc] = qcc; - } else { - context.currentTile.QCC[cqcc] = qcc; + addImageOps(fn, args, optionalContent, hasMask = false) { + if (hasMask) { + this.addOp(OPS.save); + this.addOp(OPS.setGState, [[["SMask", false]]]); + } + if (optionalContent !== undefined) { + this.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); + } + this.addOp(fn, args); + if (optionalContent !== undefined) { + this.addOp(OPS.endMarkedContent, []); + } + if (hasMask) { + this.addOp(OPS.restore); + } + } + addDependency(dependency) { + if (this.dependencies.has(dependency)) { + return; + } + this.dependencies.add(dependency); + this.addOp(OPS.dependency, [dependency]); + } + addDependencies(dependencies) { + for (const dependency of dependencies) { + this.addDependency(dependency); + } + } + addOpList(opList) { + if (!(opList instanceof OperatorList)) { + warn('addOpList - ignoring invalid "opList" parameter.'); + return; + } + for (const dependency of opList.dependencies) { + this.dependencies.add(dependency); + } + for (let i = 0, ii = opList.length; i < ii; i++) { + this.addOp(opList.fnArray[i], opList.argsArray[i]); + } + } + getIR() { + return { + fnArray: this.fnArray, + argsArray: this.argsArray, + length: this.length + }; + } + get _transfers() { + const transfers = []; + const { + fnArray, + argsArray, + length + } = this; + for (let i = 0; i < length; i++) { + switch (fnArray[i]) { + case OPS.paintInlineImageXObject: + case OPS.paintInlineImageXObjectGroup: + case OPS.paintImageMaskXObject: + { + const { + bitmap, + data + } = argsArray[i][0]; + if (bitmap || data?.buffer) { + transfers.push(bitmap || data.buffer); } break; - case 0xff52: - length = readUint16(data, position); - const cod = {}; - j = position + 2; - const scod = data[j++]; - cod.entropyCoderWithCustomPrecincts = !!(scod & 1); - cod.sopMarkerUsed = !!(scod & 2); - cod.ephMarkerUsed = !!(scod & 4); - cod.progressionOrder = data[j++]; - cod.layersCount = readUint16(data, j); - j += 2; - cod.multipleComponentTransform = data[j++]; - cod.decompositionLevelsCount = data[j++]; - cod.xcb = (data[j++] & 0xf) + 2; - cod.ycb = (data[j++] & 0xf) + 2; - const blockStyle = data[j++]; - cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1); - cod.resetContextProbabilities = !!(blockStyle & 2); - cod.terminationOnEachCodingPass = !!(blockStyle & 4); - cod.verticallyStripe = !!(blockStyle & 8); - cod.predictableTermination = !!(blockStyle & 16); - cod.segmentationSymbolUsed = !!(blockStyle & 32); - cod.reversibleTransformation = data[j++]; - if (cod.entropyCoderWithCustomPrecincts) { - const precinctsSizes = []; - while (j < length + position) { - const precinctsSize = data[j++]; - precinctsSizes.push({ - PPx: precinctsSize & 0xf, - PPy: precinctsSize >> 4 - }); - } - cod.precinctsSizes = precinctsSizes; - } - const unsupported = []; - if (cod.selectiveArithmeticCodingBypass) { - unsupported.push("selectiveArithmeticCodingBypass"); - } - if (cod.terminationOnEachCodingPass) { - unsupported.push("terminationOnEachCodingPass"); - } - if (cod.verticallyStripe) { - unsupported.push("verticallyStripe"); - } - if (cod.predictableTermination) { - unsupported.push("predictableTermination"); - } - if (unsupported.length > 0) { - doNotRecover = true; - warn(`JPX: Unsupported COD options (${unsupported.join(", ")}).`); - } - if (context.mainHeader) { - context.COD = cod; - } else { - context.currentTile.COD = cod; - context.currentTile.COC = []; + } + case OPS.constructPath: + { + const [, [data], minMax] = argsArray[i]; + if (data) { + transfers.push(data.buffer, minMax.buffer); } break; - case 0xff90: - length = readUint16(data, position); - tile = {}; - tile.index = readUint16(data, position + 2); - tile.length = readUint32(data, position + 4); - tile.dataEnd = tile.length + position - 2; - tile.partIndex = data[position + 8]; - tile.partsCount = data[position + 9]; - context.mainHeader = false; - if (tile.partIndex === 0) { - tile.COD = context.COD; - tile.COC = context.COC.slice(0); - tile.QCD = context.QCD; - tile.QCC = context.QCC.slice(0); - } - context.currentTile = tile; - break; - case 0xff93: - tile = context.currentTile; - if (tile.partIndex === 0) { - initializeTile(context, tile.index); - buildPackets(context); - } - length = tile.dataEnd - position; - parseTilePackets(context, data, position, length); - break; - case 0xff53: - warn("JPX: Codestream code 0xFF53 (COC) is not implemented."); - case 0xff55: - case 0xff57: - case 0xff58: - case 0xff64: - length = readUint16(data, position); - break; - default: - throw new Error("Unknown codestream code: " + code.toString(16)); - } - position += length; + } + case OPS.paintFormXObjectBegin: + const [matrix, bbox] = argsArray[i]; + if (matrix) { + transfers.push(matrix.buffer); + } + if (bbox) { + transfers.push(bbox.buffer); + } + break; + case OPS.setTextMatrix: + transfers.push(argsArray[i][0].buffer); + break; } - } catch (e) { - if (doNotRecover || this.failOnCorruptedImage) { - throw new JpxError(e.message); - } else { - warn(`JPX: Trying to recover from: "${e.message}".`); + } + return transfers; + } + flush(lastChunk = false, separateAnnots = null) { + this.optimizer.flush(); + const length = this.length; + this._totalLength += length; + this._streamSink.enqueue({ + fnArray: this.fnArray, + argsArray: this.argsArray, + lastChunk, + separateAnnots, + length + }, 1, this._transfers); + this.dependencies.clear(); + this.fnArray.length = 0; + this.argsArray.length = 0; + this.weight = 0; + this.optimizer.reset(); + } +} +class CheckedOperatorList extends OperatorList { + needsIsolation = false; + hasSoftMask = false; + addOp(fn, args) { + if (!this.needsIsolation || !this.hasSoftMask) { + if (fn === OPS.beginGroup) { + this.needsIsolation ||= args[0].needsIsolation; + this.hasSoftMask ||= args[0].hasSoftMask; + } else if (fn === OPS.setGState) { + for (const [key, val] of args[0]) { + if (key === "BM" && val !== "source-over") { + this.needsIsolation = true; + } else if (key === "SMask" && val !== false) { + this.needsIsolation = true; + this.hasSoftMask = true; + } + } } } - this.tiles = transformComponents(context); - this.width = context.SIZ.Xsiz - context.SIZ.XOsiz; - this.height = context.SIZ.Ysiz - context.SIZ.YOsiz; - this.componentsCount = context.SIZ.Csiz; - } -} -function calculateComponentDimensions(component, siz) { - component.x0 = Math.ceil(siz.XOsiz / component.XRsiz); - component.x1 = Math.ceil(siz.Xsiz / component.XRsiz); - component.y0 = Math.ceil(siz.YOsiz / component.YRsiz); - component.y1 = Math.ceil(siz.Ysiz / component.YRsiz); - component.width = component.x1 - component.x0; - component.height = component.y1 - component.y0; -} -function calculateTileGrids(context, components) { - const siz = context.SIZ; - const tiles = []; - let tile; - const numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz); - const numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz); - for (let q = 0; q < numYtiles; q++) { - for (let p = 0; p < numXtiles; p++) { - tile = {}; - tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz); - tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz); - tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz); - tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz); - tile.width = tile.tx1 - tile.tx0; - tile.height = tile.ty1 - tile.ty0; - tile.components = []; - tiles.push(tile); - } - } - context.tiles = tiles; - const componentsCount = siz.Csiz; - for (let i = 0, ii = componentsCount; i < ii; i++) { - const component = components[i]; - for (let j = 0, jj = tiles.length; j < jj; j++) { - const tileComponent = {}; - tile = tiles[j]; - tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz); - tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz); - tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz); - tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz); - tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0; - tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0; - tile.components[i] = tileComponent; + super.addOp(fn, args); + } +} + +;// ./src/core/pattern.js + + + + + +const ShadingType = { + FUNCTION_BASED: 1, + AXIAL: 2, + RADIAL: 3, + FREE_FORM_MESH: 4, + LATTICE_FORM_MESH: 5, + COONS_PATCH_MESH: 6, + TENSOR_PATCH_MESH: 7 +}; +class Pattern { + static #hasGPU = false; + constructor() { + unreachable("Cannot initialize Pattern."); + } + static setOptions({ + hasGPU + }) { + this.#hasGPU = hasGPU; + } + static parseShading(shading, xref, res, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache) { + const dict = shading instanceof BaseStream ? shading.dict : shading; + const type = dict.get("ShadingType"); + try { + switch (type) { + case ShadingType.FUNCTION_BASED: + return new FunctionBasedShading(dict, xref, res, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache); + case ShadingType.AXIAL: + case ShadingType.RADIAL: + return new RadialAxialShading(dict, xref, res, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache); + case ShadingType.FREE_FORM_MESH: + case ShadingType.LATTICE_FORM_MESH: + case ShadingType.COONS_PATCH_MESH: + case ShadingType.TENSOR_PATCH_MESH: + return new MeshShading(shading, xref, res, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache); + default: + throw new FormatError("Unsupported ShadingType: " + type); + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(ex); + return new DummyShading(); } } } -function getBlocksDimensions(context, component, r) { - const codOrCoc = component.codingStyleParameters; - const result = {}; - if (!codOrCoc.entropyCoderWithCustomPrecincts) { - result.PPx = 15; - result.PPy = 15; - } else { - result.PPx = codOrCoc.precinctsSizes[r].PPx; - result.PPy = codOrCoc.precinctsSizes[r].PPy; +class BaseShading { + static SMALL_NUMBER = 1e-6; + getIR() { + unreachable("Abstract method `getIR` called."); } - result.xcb_ = r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) : Math.min(codOrCoc.xcb, result.PPx); - result.ycb_ = r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) : Math.min(codOrCoc.ycb, result.PPy); - return result; } -function buildPrecincts(context, resolution, dimensions) { - const precinctWidth = 1 << dimensions.PPx; - const precinctHeight = 1 << dimensions.PPy; - const isZeroRes = resolution.resLevel === 0; - const precinctWidthInSubband = 1 << dimensions.PPx + (isZeroRes ? 0 : -1); - const precinctHeightInSubband = 1 << dimensions.PPy + (isZeroRes ? 0 : -1); - const numprecinctswide = resolution.trx1 > resolution.trx0 ? Math.ceil(resolution.trx1 / precinctWidth) - Math.floor(resolution.trx0 / precinctWidth) : 0; - const numprecinctshigh = resolution.try1 > resolution.try0 ? Math.ceil(resolution.try1 / precinctHeight) - Math.floor(resolution.try0 / precinctHeight) : 0; - const numprecincts = numprecinctswide * numprecinctshigh; - resolution.precinctParameters = { - precinctWidth, - precinctHeight, - numprecinctswide, - numprecinctshigh, - numprecincts, - precinctWidthInSubband, - precinctHeightInSubband - }; -} -function buildCodeblocks(context, subband, dimensions) { - const xcb_ = dimensions.xcb_; - const ycb_ = dimensions.ycb_; - const codeblockWidth = 1 << xcb_; - const codeblockHeight = 1 << ycb_; - const cbx0 = subband.tbx0 >> xcb_; - const cby0 = subband.tby0 >> ycb_; - const cbx1 = subband.tbx1 + codeblockWidth - 1 >> xcb_; - const cby1 = subband.tby1 + codeblockHeight - 1 >> ycb_; - const precinctParameters = subband.resolution.precinctParameters; - const codeblocks = []; - const precincts = []; - let i, j, codeblock, precinctNumber; - for (j = cby0; j < cby1; j++) { - for (i = cbx0; i < cbx1; i++) { - codeblock = { - cbx: i, - cby: j, - tbx0: codeblockWidth * i, - tby0: codeblockHeight * j, - tbx1: codeblockWidth * (i + 1), - tby1: codeblockHeight * (j + 1) - }; - codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0); - codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0); - codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1); - codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1); - const pi = Math.floor((codeblock.tbx0_ - subband.tbx0) / precinctParameters.precinctWidthInSubband); - const pj = Math.floor((codeblock.tby0_ - subband.tby0) / precinctParameters.precinctHeightInSubband); - precinctNumber = pi + pj * precinctParameters.numprecinctswide; - codeblock.precinctNumber = precinctNumber; - codeblock.subbandType = subband.type; - codeblock.Lblock = 3; - if (codeblock.tbx1_ <= codeblock.tbx0_ || codeblock.tby1_ <= codeblock.tby0_) { - continue; - } - codeblocks.push(codeblock); - let precinct = precincts[precinctNumber]; - if (precinct !== undefined) { - if (i < precinct.cbxMin) { - precinct.cbxMin = i; - } else if (i > precinct.cbxMax) { - precinct.cbxMax = i; - } - if (j < precinct.cbyMin) { - precinct.cbxMin = j; - } else if (j > precinct.cbyMax) { - precinct.cbyMax = j; - } - } else { - precincts[precinctNumber] = precinct = { - cbxMin: i, - cbyMin: j, - cbxMax: i, - cbyMax: j - }; +class RadialAxialShading extends BaseShading { + constructor(dict, xref, resources, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache) { + super(); + this.shadingType = dict.get("ShadingType"); + let coordsLen = 0; + if (this.shadingType === ShadingType.AXIAL) { + coordsLen = 4; + } else if (this.shadingType === ShadingType.RADIAL) { + coordsLen = 6; + } + this.coordsArr = dict.getArray("Coords"); + if (!isNumberArray(this.coordsArr, coordsLen)) { + throw new FormatError("RadialAxialShading: Invalid /Coords array."); + } + const cs = ColorSpaceUtils.parse({ + cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), + xref, + resources, + pdfFunctionFactory, + globalColorSpaceCache, + localColorSpaceCache + }); + this.bbox = lookupNormalRect(dict.getArray("BBox"), null); + let t0 = 0.0, + t1 = 1.0; + const domainArr = dict.getArray("Domain"); + if (isNumberArray(domainArr, 2)) { + [t0, t1] = domainArr; + } + let extendStart = false, + extendEnd = false; + const extendArr = dict.getArray("Extend"); + if (isBooleanArray(extendArr, 2)) { + [extendStart, extendEnd] = extendArr; + } + this.extendStart = extendStart; + this.extendEnd = extendEnd; + const fnObj = dict.getRaw("Function"); + const fn = pdfFunctionFactory.create(fnObj, true); + const NUMBER_OF_SAMPLES = 840; + const step = (t1 - t0) / NUMBER_OF_SAMPLES; + const colorStops = this.colorStops = []; + if (t0 >= t1 || step <= 0) { + info("Bad shading domain."); + return; + } + const color = new Float32Array(cs.numComps), + ratio = new Float32Array(1); + let iBase = 0; + ratio[0] = t0; + fn(ratio, 0, color, 0); + const rgbBuffer = new Uint8ClampedArray(3); + cs.getRgb(color, 0, rgbBuffer); + let [rBase, gBase, bBase] = rgbBuffer; + colorStops.push([0, Util.makeHexColor(rBase, gBase, bBase)]); + let iPrev = 1; + ratio[0] = t0 + step; + fn(ratio, 0, color, 0); + cs.getRgb(color, 0, rgbBuffer); + let [rPrev, gPrev, bPrev] = rgbBuffer; + let maxSlopeR = rPrev - rBase + 1; + let maxSlopeG = gPrev - gBase + 1; + let maxSlopeB = bPrev - bBase + 1; + let minSlopeR = rPrev - rBase - 1; + let minSlopeG = gPrev - gBase - 1; + let minSlopeB = bPrev - bBase - 1; + for (let i = 2; i < NUMBER_OF_SAMPLES; i++) { + ratio[0] = t0 + i * step; + fn(ratio, 0, color, 0); + cs.getRgb(color, 0, rgbBuffer); + const [r, g, b] = rgbBuffer; + const run = i - iBase; + maxSlopeR = Math.min(maxSlopeR, (r - rBase + 1) / run); + maxSlopeG = Math.min(maxSlopeG, (g - gBase + 1) / run); + maxSlopeB = Math.min(maxSlopeB, (b - bBase + 1) / run); + minSlopeR = Math.max(minSlopeR, (r - rBase - 1) / run); + minSlopeG = Math.max(minSlopeG, (g - gBase - 1) / run); + minSlopeB = Math.max(minSlopeB, (b - bBase - 1) / run); + const slopesExist = minSlopeR <= maxSlopeR && minSlopeG <= maxSlopeG && minSlopeB <= maxSlopeB; + if (!slopesExist) { + const cssColor = Util.makeHexColor(rPrev, gPrev, bPrev); + colorStops.push([iPrev / NUMBER_OF_SAMPLES, cssColor]); + maxSlopeR = r - rPrev + 1; + maxSlopeG = g - gPrev + 1; + maxSlopeB = b - bPrev + 1; + minSlopeR = r - rPrev - 1; + minSlopeG = g - gPrev - 1; + minSlopeB = b - bPrev - 1; + iBase = iPrev; + rBase = rPrev; + gBase = gPrev; + bBase = bPrev; } - codeblock.precinct = precinct; + iPrev = i; + rPrev = r; + gPrev = g; + bPrev = b; + } + colorStops.push([1, Util.makeHexColor(rPrev, gPrev, bPrev)]); + const background = dict.has("Background") ? cs.getRgbHex(dict.get("Background"), 0) : "transparent"; + if (!extendStart) { + colorStops.unshift([0, background]); + colorStops[1][0] += BaseShading.SMALL_NUMBER; + } + if (!extendEnd) { + colorStops.at(-1)[0] -= BaseShading.SMALL_NUMBER; + colorStops.push([1, background]); + } + this.colorStops = colorStops; + } + getIR() { + const { + coordsArr, + shadingType + } = this; + let type, p0, p1, r0, r1; + if (shadingType === ShadingType.AXIAL) { + p0 = [coordsArr[0], coordsArr[1]]; + p1 = [coordsArr[2], coordsArr[3]]; + r0 = null; + r1 = null; + type = "axial"; + } else if (shadingType === ShadingType.RADIAL) { + p0 = [coordsArr[0], coordsArr[1]]; + p1 = [coordsArr[3], coordsArr[4]]; + r0 = coordsArr[2]; + r1 = coordsArr[5]; + type = "radial"; + } else { + unreachable(`getPattern type unknown: ${shadingType}`); } + return ["RadialAxial", type, this.bbox, this.colorStops, p0, p1, r0, r1]; } - subband.codeblockParameters = { - codeblockWidth: xcb_, - codeblockHeight: ycb_, - numcodeblockwide: cbx1 - cbx0 + 1, - numcodeblockhigh: cby1 - cby0 + 1 - }; - subband.codeblocks = codeblocks; - subband.precincts = precincts; -} -function createPacket(resolution, precinctNumber, layerNumber) { - const precinctCodeblocks = []; - const subbands = resolution.subbands; - for (let i = 0, ii = subbands.length; i < ii; i++) { - const subband = subbands[i]; - const codeblocks = subband.codeblocks; - for (let j = 0, jj = codeblocks.length; j < jj; j++) { - const codeblock = codeblocks[j]; - if (codeblock.precinctNumber !== precinctNumber) { - continue; +} +function meshUpdateBounds(self) { + let minX = self.coords[0][0], + minY = self.coords[0][1], + maxX = minX, + maxY = minY; + for (let i = 1, ii = self.coords.length; i < ii; i++) { + const x = self.coords[i][0], + y = self.coords[i][1]; + minX = minX > x ? x : minX; + minY = minY > y ? y : minY; + maxX = maxX < x ? x : maxX; + maxY = maxY < y ? y : maxY; + } + self.bounds = [minX, minY, maxX, maxY]; +} +function meshPackData(self) { + let i, j, ii; + const coords = self.coords; + const coordsPacked = new Float32Array(coords.length * 2); + for (i = 0, j = 0, ii = coords.length; i < ii; i++) { + const xy = coords[i]; + coordsPacked[j++] = xy[0]; + coordsPacked[j++] = xy[1]; + } + self.coords = coordsPacked; + const colors = self.colors; + const colorsPacked = new Uint8Array(colors.length * 4); + for (i = 0, j = 0, ii = colors.length; i < ii; i++) { + const c = colors[i]; + colorsPacked[j++] = c[0]; + colorsPacked[j++] = c[1]; + colorsPacked[j++] = c[2]; + j++; + } + self.colors = colorsPacked; + for (const figure of self.figures) { + figure.coords = new Uint32Array(figure.coords); + figure.colors = new Uint32Array(figure.colors); + } +} +function buildMeshVertexData(coords, colors, figures) { + let vertexCount = 0; + for (const figure of figures) { + if (figure.type === MeshFigureType.TRIANGLES) { + vertexCount += figure.coords.length; + } else if (figure.type === MeshFigureType.LATTICE) { + const vpr = figure.verticesPerRow; + vertexCount += (Math.floor(figure.coords.length / vpr) - 1) * (vpr - 1) * 6; + } + } + const posData = new Float32Array(vertexCount * 2); + const colData = new Uint8Array(vertexCount * 4); + let pOff = 0, + cOff = 0; + const addVertex = (pi, ci) => { + posData[pOff++] = coords[pi * 2]; + posData[pOff++] = coords[pi * 2 + 1]; + colData[cOff++] = colors[ci * 4]; + colData[cOff++] = colors[ci * 4 + 1]; + colData[cOff++] = colors[ci * 4 + 2]; + cOff++; + }; + for (const figure of figures) { + const ps = figure.coords; + const cs = figure.colors; + if (figure.type === MeshFigureType.TRIANGLES) { + for (let i = 0, ii = ps.length; i < ii; i++) { + addVertex(ps[i], cs[i]); + } + } else if (figure.type === MeshFigureType.LATTICE) { + const vpr = figure.verticesPerRow; + const rows = Math.floor(ps.length / vpr) - 1; + const cols = vpr - 1; + for (let i = 0; i < rows; i++) { + let q = i * vpr; + for (let j = 0; j < cols; j++, q++) { + addVertex(ps[q], cs[q]); + addVertex(ps[q + 1], cs[q + 1]); + addVertex(ps[q + vpr], cs[q + vpr]); + addVertex(ps[q + vpr + 1], cs[q + vpr + 1]); + addVertex(ps[q + 1], cs[q + 1]); + addVertex(ps[q + vpr], cs[q + vpr]); + } } - precinctCodeblocks.push(codeblock); } } return { - layerNumber, - codeblocks: precinctCodeblocks + posData, + colData, + vertexCount }; } -function LayerResolutionComponentPositionIterator(context) { - const siz = context.SIZ; - const tileIndex = context.currentTile.index; - const tile = context.tiles[tileIndex]; - const layersCount = tile.codingStyleDefaultParameters.layersCount; - const componentsCount = siz.Csiz; - let maxDecompositionLevelsCount = 0; - for (let q = 0; q < componentsCount; q++) { - maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount); - } - let l = 0, - r = 0, - i = 0, - k = 0; - this.nextPacket = function JpxImage_nextPacket() { - for (; l < layersCount; l++) { - for (; r <= maxDecompositionLevelsCount; r++) { - for (; i < componentsCount; i++) { - const component = tile.components[i]; - if (r > component.codingStyleParameters.decompositionLevelsCount) { - continue; - } - const resolution = component.resolutions[r]; - const numprecincts = resolution.precinctParameters.numprecincts; - for (; k < numprecincts;) { - const packet = createPacket(resolution, k, l); - k++; - return packet; +class FunctionBasedShading extends BaseShading { + static MAX_STEP_COUNT = 512; + constructor(dict, xref, resources, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache) { + super(); + this.bbox = lookupNormalRect(dict.getArray("BBox"), null); + const cs = ColorSpaceUtils.parse({ + cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), + xref, + resources, + pdfFunctionFactory, + globalColorSpaceCache, + localColorSpaceCache + }); + this.background = dict.has("Background") ? cs.getRgb(dict.get("Background"), 0) : null; + const fnObj = dict.getRaw("Function"); + if (!fnObj) { + throw new FormatError("FunctionBasedShading: missing /Function"); + } + const fn = pdfFunctionFactory.create(fnObj, true); + const [x0, x1, y0, y1] = lookupRect(dict.getArray("Domain"), [0, 1, 0, 1]); + const matrix = lookupMatrix(dict.getArray("Matrix"), IDENTITY_MATRIX); + this.bounds = BBOX_INIT.slice(); + Util.axialAlignedBoundingBox([x0, y0, x1, y1], matrix, this.bounds); + const bboxW = this.bounds[2] - this.bounds[0]; + const bboxH = this.bounds[3] - this.bounds[1]; + const stepsX = MathClamp(Math.ceil(bboxW), 1, FunctionBasedShading.MAX_STEP_COUNT); + const stepsY = MathClamp(Math.ceil(bboxH), 1, FunctionBasedShading.MAX_STEP_COUNT); + const verticesPerRow = stepsX + 1; + const totalVertices = (stepsY + 1) * verticesPerRow; + const coords = this.coords = new Float32Array(totalVertices * 2); + const colors = this.colors = new Uint8ClampedArray(totalVertices * 4); + const xyBuf = new Float32Array(2); + const colorBuf = new Float32Array(cs.numComps); + const rangeX = (x1 - x0) / stepsX; + const rangeY = (y1 - y0) / stepsY; + const halfStepX = rangeX / 2; + const halfStepY = rangeY / 2; + let coordOffset = 0; + let colorOffset = 0; + for (let row = 0; row <= stepsY; row++) { + const yDomain = y0 + rangeY * row; + xyBuf[1] = row === stepsY ? yDomain - halfStepY : yDomain; + for (let col = 0; col <= stepsX; col++) { + const xDomain = x0 + rangeX * col; + xyBuf[0] = col === stepsX ? xDomain - halfStepX : xDomain; + fn(xyBuf, 0, colorBuf, 0); + coords[coordOffset] = xDomain; + coords[coordOffset + 1] = yDomain; + Util.applyTransform(coords, matrix, coordOffset); + coordOffset += 2; + cs.getRgbItem(colorBuf, 0, colors, colorOffset); + colorOffset += 4; + } + } + const ps = new Uint32Array(totalVertices); + for (let i = 0; i < totalVertices; i++) { + ps[i] = i; + } + this.figures = [{ + type: MeshFigureType.LATTICE, + coords: ps, + colors: new Uint32Array(ps), + verticesPerRow + }]; + } + getIR() { + const { + posData, + colData, + vertexCount + } = buildMeshVertexData(this.coords, this.colors, this.figures); + return ["Mesh", ShadingType.FUNCTION_BASED, posData, colData, vertexCount, this.bounds, this.bbox, this.background]; + } +} +class MeshStreamReader { + constructor(stream, context) { + this.stream = stream; + this.context = context; + this.buffer = 0; + this.bufferLength = 0; + const numComps = context.numComps; + this.tmpCompsBuf = new Float32Array(numComps); + const csNumComps = context.colorSpace.numComps; + this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : this.tmpCompsBuf; + } + get hasData() { + if (this.stream.end) { + return this.stream.pos < this.stream.end; + } + if (this.bufferLength > 0) { + return true; + } + const nextByte = this.stream.getByte(); + if (nextByte < 0) { + return false; + } + this.buffer = nextByte; + this.bufferLength = 8; + return true; + } + readBits(n) { + const { + stream + } = this; + let { + buffer, + bufferLength + } = this; + if (n === 32) { + if (bufferLength === 0) { + return stream.getInt32() >>> 0; + } + buffer = buffer << 24 | stream.getByte() << 16 | stream.getByte() << 8 | stream.getByte(); + const nextByte = stream.getByte(); + this.buffer = nextByte & (1 << bufferLength) - 1; + return (buffer << 8 - bufferLength | (nextByte & 0xff) >> bufferLength) >>> 0; + } + if (n === 8 && bufferLength === 0) { + return stream.getByte(); + } + while (bufferLength < n) { + buffer = buffer << 8 | stream.getByte(); + bufferLength += 8; + } + bufferLength -= n; + this.bufferLength = bufferLength; + this.buffer = buffer & (1 << bufferLength) - 1; + return buffer >> bufferLength; + } + align() { + this.buffer = 0; + this.bufferLength = 0; + } + readFlag() { + return this.readBits(this.context.bitsPerFlag); + } + readCoordinate() { + const { + bitsPerCoordinate, + decode + } = this.context; + const xi = this.readBits(bitsPerCoordinate); + const yi = this.readBits(bitsPerCoordinate); + const scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : 2.3283064365386963e-10; + return [xi * scale * (decode[1] - decode[0]) + decode[0], yi * scale * (decode[3] - decode[2]) + decode[2]]; + } + readComponents() { + const { + bitsPerComponent, + colorFn, + colorSpace, + decode, + numComps + } = this.context; + const scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10; + const components = this.tmpCompsBuf; + for (let i = 0, j = 4; i < numComps; i++, j += 2) { + const ci = this.readBits(bitsPerComponent); + components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j]; + } + const color = this.tmpCsCompsBuf; + colorFn?.(components, 0, color, 0); + return colorSpace.getRgb(color, 0); + } +} +let bCache = Object.create(null); +function buildB(count) { + const lut = []; + for (let i = 0; i <= count; i++) { + const t = i / count, + t_ = 1 - t; + lut.push(new Float32Array([t_ ** 3, 3 * t * t_ ** 2, 3 * t ** 2 * t_, t ** 3])); + } + return lut; +} +function getB(count) { + return bCache[count] ||= buildB(count); +} +function clearPatternCaches() { + bCache = Object.create(null); +} +class MeshShading extends BaseShading { + static MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3; + static MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20; + static TRIANGLE_DENSITY = 20; + constructor(stream, xref, resources, pdfFunctionFactory, globalColorSpaceCache, localColorSpaceCache) { + super(); + if (!(stream instanceof BaseStream)) { + throw new FormatError("Mesh data is not a stream"); + } + const dict = stream.dict; + this.shadingType = dict.get("ShadingType"); + this.bbox = lookupNormalRect(dict.getArray("BBox"), null); + const cs = ColorSpaceUtils.parse({ + cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), + xref, + resources, + pdfFunctionFactory, + globalColorSpaceCache, + localColorSpaceCache + }); + this.background = dict.has("Background") ? cs.getRgb(dict.get("Background"), 0) : null; + const fnObj = dict.getRaw("Function"); + const fn = fnObj ? pdfFunctionFactory.create(fnObj, true) : null; + this.coords = []; + this.colors = []; + this.figures = []; + const decodeContext = { + bitsPerCoordinate: dict.get("BitsPerCoordinate"), + bitsPerComponent: dict.get("BitsPerComponent"), + bitsPerFlag: dict.get("BitsPerFlag"), + decode: dict.getArray("Decode"), + colorFn: fn, + colorSpace: cs, + numComps: fn ? 1 : cs.numComps + }; + const reader = new MeshStreamReader(stream, decodeContext); + let patchMesh = false; + switch (this.shadingType) { + case ShadingType.FREE_FORM_MESH: + this._decodeType4Shading(reader); + break; + case ShadingType.LATTICE_FORM_MESH: + const verticesPerRow = dict.get("VerticesPerRow") | 0; + if (verticesPerRow < 2) { + throw new FormatError("Invalid VerticesPerRow"); + } + this._decodeType5Shading(reader, verticesPerRow); + break; + case ShadingType.COONS_PATCH_MESH: + this._decodeType6Shading(reader); + patchMesh = true; + break; + case ShadingType.TENSOR_PATCH_MESH: + this._decodeType7Shading(reader); + patchMesh = true; + break; + default: + unreachable("Unsupported mesh type."); + break; + } + if (patchMesh) { + this._updateBounds(); + for (let i = 0, ii = this.figures.length; i < ii; i++) { + this._buildFigureFromPatch(i); + } + } + this._updateBounds(); + this._packData(); + } + _decodeType4Shading(reader) { + const coords = this.coords; + const colors = this.colors; + const operators = []; + const ps = []; + let verticesLeft = 0; + while (reader.hasData) { + const f = reader.readFlag(); + const coord = reader.readCoordinate(); + const color = reader.readComponents(); + if (verticesLeft === 0) { + if (!(0 <= f && f <= 2)) { + throw new FormatError("Unknown type4 flag"); + } + switch (f) { + case 0: + verticesLeft = 3; + break; + case 1: + ps.push(ps.at(-2), ps.at(-1)); + verticesLeft = 1; + break; + case 2: + ps.push(ps.at(-3), ps.at(-1)); + verticesLeft = 1; + break; + } + operators.push(f); + } + ps.push(coords.length); + coords.push(coord); + colors.push(color); + verticesLeft--; + reader.align(); + } + this.figures.push({ + type: MeshFigureType.TRIANGLES, + coords: new Int32Array(ps), + colors: new Int32Array(ps) + }); + } + _decodeType5Shading(reader, verticesPerRow) { + const coords = this.coords; + const colors = this.colors; + const ps = []; + while (reader.hasData) { + const coord = reader.readCoordinate(); + const color = reader.readComponents(); + ps.push(coords.length); + coords.push(coord); + colors.push(color); + } + this.figures.push({ + type: MeshFigureType.LATTICE, + coords: new Int32Array(ps), + colors: new Int32Array(ps), + verticesPerRow + }); + } + _decodeType6Shading(reader) { + const coords = this.coords; + const colors = this.colors; + const ps = new Int32Array(16); + const cs = new Int32Array(4); + while (reader.hasData) { + const f = reader.readFlag(); + if (!(0 <= f && f <= 3)) { + throw new FormatError("Unknown type6 flag"); + } + const pi = coords.length; + for (let i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) { + coords.push(reader.readCoordinate()); + } + const ci = colors.length; + for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) { + colors.push(reader.readComponents()); + } + let tmp1, tmp2, tmp3, tmp4; + switch (f) { + case 0: + ps[12] = pi + 3; + ps[13] = pi + 4; + ps[14] = pi + 5; + ps[15] = pi + 6; + ps[8] = pi + 2; + ps[11] = pi + 7; + ps[4] = pi + 1; + ps[7] = pi + 8; + ps[0] = pi; + ps[1] = pi + 11; + ps[2] = pi + 10; + ps[3] = pi + 9; + cs[2] = ci + 1; + cs[3] = ci + 2; + cs[0] = ci; + cs[1] = ci + 3; + break; + case 1: + tmp1 = ps[12]; + tmp2 = ps[13]; + tmp3 = ps[14]; + tmp4 = ps[15]; + ps[12] = tmp4; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = tmp3; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[2]; + tmp2 = cs[3]; + cs[2] = tmp2; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 2: + tmp1 = ps[15]; + tmp2 = ps[11]; + ps[12] = ps[3]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[7]; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[3]; + cs[2] = cs[1]; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 3: + ps[12] = ps[0]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[1]; + ps[11] = pi + 3; + ps[4] = ps[2]; + ps[7] = pi + 4; + ps[0] = ps[3]; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + cs[2] = cs[0]; + cs[3] = ci; + cs[0] = cs[1]; + cs[1] = ci + 1; + break; + } + ps[5] = coords.length; + coords.push([(-4 * coords[ps[0]][0] - coords[ps[15]][0] + 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, (-4 * coords[ps[0]][1] - coords[ps[15]][1] + 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9]); + ps[6] = coords.length; + coords.push([(-4 * coords[ps[3]][0] - coords[ps[12]][0] + 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, (-4 * coords[ps[3]][1] - coords[ps[12]][1] + 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9]); + ps[9] = coords.length; + coords.push([(-4 * coords[ps[12]][0] - coords[ps[3]][0] + 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, (-4 * coords[ps[12]][1] - coords[ps[3]][1] + 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9]); + ps[10] = coords.length; + coords.push([(-4 * coords[ps[15]][0] - coords[ps[0]][0] + 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, (-4 * coords[ps[15]][1] - coords[ps[0]][1] + 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9]); + this.figures.push({ + type: MeshFigureType.PATCH, + coords: new Int32Array(ps), + colors: new Int32Array(cs) + }); + } + } + _decodeType7Shading(reader) { + const coords = this.coords; + const colors = this.colors; + const ps = new Int32Array(16); + const cs = new Int32Array(4); + while (reader.hasData) { + const f = reader.readFlag(); + if (!(0 <= f && f <= 3)) { + throw new FormatError("Unknown type7 flag"); + } + const pi = coords.length; + for (let i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) { + coords.push(reader.readCoordinate()); + } + const ci = colors.length; + for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) { + colors.push(reader.readComponents()); + } + let tmp1, tmp2, tmp3, tmp4; + switch (f) { + case 0: + ps[12] = pi + 3; + ps[13] = pi + 4; + ps[14] = pi + 5; + ps[15] = pi + 6; + ps[8] = pi + 2; + ps[9] = pi + 13; + ps[10] = pi + 14; + ps[11] = pi + 7; + ps[4] = pi + 1; + ps[5] = pi + 12; + ps[6] = pi + 15; + ps[7] = pi + 8; + ps[0] = pi; + ps[1] = pi + 11; + ps[2] = pi + 10; + ps[3] = pi + 9; + cs[2] = ci + 1; + cs[3] = ci + 2; + cs[0] = ci; + cs[1] = ci + 3; + break; + case 1: + tmp1 = ps[12]; + tmp2 = ps[13]; + tmp3 = ps[14]; + tmp4 = ps[15]; + ps[12] = tmp4; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = tmp3; + ps[9] = pi + 9; + ps[10] = pi + 10; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[5] = pi + 8; + ps[6] = pi + 11; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[2]; + tmp2 = cs[3]; + cs[2] = tmp2; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 2: + tmp1 = ps[15]; + tmp2 = ps[11]; + ps[12] = ps[3]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[7]; + ps[9] = pi + 9; + ps[10] = pi + 10; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[5] = pi + 8; + ps[6] = pi + 11; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[3]; + cs[2] = cs[1]; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 3: + ps[12] = ps[0]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[1]; + ps[9] = pi + 9; + ps[10] = pi + 10; + ps[11] = pi + 3; + ps[4] = ps[2]; + ps[5] = pi + 8; + ps[6] = pi + 11; + ps[7] = pi + 4; + ps[0] = ps[3]; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + cs[2] = cs[0]; + cs[3] = ci; + cs[0] = cs[1]; + cs[1] = ci + 1; + break; + } + this.figures.push({ + type: MeshFigureType.PATCH, + coords: new Int32Array(ps), + colors: new Int32Array(cs) + }); + } + } + _buildFigureFromPatch(index) { + const figure = this.figures[index]; + assert(figure.type === MeshFigureType.PATCH, "Unexpected patch mesh figure"); + const coords = this.coords, + colors = this.colors; + const pi = figure.coords; + const ci = figure.colors; + const figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); + const figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); + const figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); + const figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); + let splitXBy = Math.ceil((figureMaxX - figureMinX) * MeshShading.TRIANGLE_DENSITY / (this.bounds[2] - this.bounds[0])); + splitXBy = MathClamp(splitXBy, MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT); + let splitYBy = Math.ceil((figureMaxY - figureMinY) * MeshShading.TRIANGLE_DENSITY / (this.bounds[3] - this.bounds[1])); + splitYBy = MathClamp(splitYBy, MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT); + const verticesPerRow = splitXBy + 1; + const figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow); + const figureColors = new Int32Array((splitYBy + 1) * verticesPerRow); + let k = 0; + const cl = new Uint8Array(3), + cr = new Uint8Array(3); + const c0 = colors[ci[0]], + c1 = colors[ci[1]], + c2 = colors[ci[2]], + c3 = colors[ci[3]]; + const bRow = getB(splitYBy), + bCol = getB(splitXBy); + for (let row = 0; row <= splitYBy; row++) { + cl[0] = (c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy | 0; + cl[1] = (c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy | 0; + cl[2] = (c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy | 0; + cr[0] = (c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy | 0; + cr[1] = (c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy | 0; + cr[2] = (c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy | 0; + for (let col = 0; col <= splitXBy; col++, k++) { + if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) { + continue; + } + let x = 0, + y = 0; + let q = 0; + for (let i = 0; i <= 3; i++) { + for (let j = 0; j <= 3; j++, q++) { + const m = bRow[row][i] * bCol[col][j]; + x += coords[pi[q]][0] * m; + y += coords[pi[q]][1] * m; } - k = 0; } - i = 0; + figureCoords[k] = coords.length; + coords.push([x, y]); + figureColors[k] = colors.length; + const newColor = new Uint8Array(3); + newColor[0] = (cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy | 0; + newColor[1] = (cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy | 0; + newColor[2] = (cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy | 0; + colors.push(newColor); } - r = 0; } - throw new JpxError("Out of packets"); - }; + figureCoords[0] = pi[0]; + figureColors[0] = ci[0]; + figureCoords[splitXBy] = pi[3]; + figureColors[splitXBy] = ci[1]; + figureCoords[verticesPerRow * splitYBy] = pi[12]; + figureColors[verticesPerRow * splitYBy] = ci[2]; + figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15]; + figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3]; + this.figures[index] = { + type: MeshFigureType.LATTICE, + coords: figureCoords, + colors: figureColors, + verticesPerRow + }; + } + _updateBounds() { + meshUpdateBounds(this); + } + _packData() { + meshPackData(this); + } + getIR() { + const { + posData, + colData, + vertexCount + } = buildMeshVertexData(this.coords, this.colors, this.figures); + return ["Mesh", this.shadingType, posData, colData, vertexCount, this.bounds, this.bbox, this.background]; + } } -function ResolutionLayerComponentPositionIterator(context) { - const siz = context.SIZ; - const tileIndex = context.currentTile.index; - const tile = context.tiles[tileIndex]; - const layersCount = tile.codingStyleDefaultParameters.layersCount; - const componentsCount = siz.Csiz; - let maxDecompositionLevelsCount = 0; - for (let q = 0; q < componentsCount; q++) { - maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount); +class DummyShading extends BaseShading { + getIR() { + return ["Dummy"]; } - let r = 0, - l = 0, - i = 0, - k = 0; - this.nextPacket = function JpxImage_nextPacket() { - for (; r <= maxDecompositionLevelsCount; r++) { - for (; l < layersCount; l++) { - for (; i < componentsCount; i++) { - const component = tile.components[i]; - if (r > component.codingStyleParameters.decompositionLevelsCount) { - continue; +} +function getTilingPatternIR(operatorList, dict, color, needsIsolation = true) { + const matrix = lookupMatrix(dict.getArray("Matrix"), IDENTITY_MATRIX); + const bbox = lookupNormalRect(dict.getArray("BBox"), null); + if (!bbox || bbox[2] - bbox[0] === 0 || bbox[3] - bbox[1] === 0) { + throw new FormatError(`Invalid getTilingPatternIR /BBox array.`); + } + const xstep = dict.get("XStep"); + if (typeof xstep !== "number") { + throw new FormatError(`Invalid getTilingPatternIR /XStep value.`); + } + const ystep = dict.get("YStep"); + if (typeof ystep !== "number") { + throw new FormatError(`Invalid getTilingPatternIR /YStep value.`); + } + const paintType = dict.get("PaintType"); + if (!Number.isInteger(paintType)) { + throw new FormatError(`Invalid getTilingPatternIR /PaintType value.`); + } + const tilingType = dict.get("TilingType"); + if (!Number.isInteger(tilingType)) { + throw new FormatError(`Invalid getTilingPatternIR /TilingType value.`); + } + return ["TilingPattern", color, operatorList, matrix, bbox, xstep, ystep, paintType, tilingType, needsIsolation]; +} + +;// ./src/core/binary_cmap.js + + +function hexToInt(a, size) { + let n = 0; + for (let i = 0; i <= size; i++) { + n = n << 8 | a[i]; + } + return n >>> 0; +} +function hexToStr(a, size) { + if (size === 1) { + return String.fromCharCode(a[0], a[1]); + } + if (size === 3) { + return String.fromCharCode(a[0], a[1], a[2], a[3]); + } + return String.fromCharCode(...a.subarray(0, size + 1)); +} +function addHex(a, b, size) { + let c = 0; + for (let i = size; i >= 0; i--) { + c += a[i] + b[i]; + a[i] = c & 255; + c >>= 8; + } +} +function incHex(a, size) { + let c = 1; + for (let i = size; i >= 0 && c > 0; i--) { + c += a[i]; + a[i] = c & 255; + c >>= 8; + } +} +const MAX_NUM_SIZE = 16; +const MAX_ENCODED_NUM_SIZE = 19; +class BinaryCMapStream extends Stream { + tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE); + constructor(data) { + super(data, 0, data.length, null); + } + readNumber() { + let n = 0; + let last; + do { + const b = this.getByte(); + if (b < 0) { + throw new FormatError("unexpected EOF in bcmap"); + } + last = !(b & 0x80); + n = n << 7 | b & 0x7f; + } while (!last); + return n; + } + readSigned() { + const n = this.readNumber(); + return n & 1 ? ~(n >>> 1) : n >>> 1; + } + readHex(num, size) { + num.set(this.getBytes(size + 1)); + } + readHexNumber(num, size) { + let last; + const stack = this.tmpBuf; + let sp = 0; + do { + const b = this.getByte(); + if (b < 0) { + throw new FormatError("unexpected EOF in bcmap"); + } + last = !(b & 0x80); + stack[sp++] = b & 0x7f; + } while (!last); + let i = size, + buffer = 0, + bufferSize = 0; + while (i >= 0) { + while (bufferSize < 8 && stack.length > 0) { + buffer |= stack[--sp] << bufferSize; + bufferSize += 7; + } + num[i] = buffer & 255; + i--; + buffer >>= 8; + bufferSize -= 8; + } + } + readHexSigned(num, size) { + this.readHexNumber(num, size); + const sign = num[size] & 1 ? 255 : 0; + let c = 0; + for (let i = 0; i <= size; i++) { + c = (c & 1) << 8 | num[i]; + num[i] = c >> 1 ^ sign; + } + } + readString() { + const len = this.readNumber(), + buf = new Array(len); + for (let i = 0; i < len; i++) { + buf[i] = this.readNumber(); + } + return String.fromCharCode(...buf); + } +} +class BinaryCMapReader { + async process(data, cMap, extend) { + const stream = new BinaryCMapStream(data); + const header = stream.getByte(); + cMap.vertical = !!(header & 1); + let useCMap = null; + const start = new Uint8Array(MAX_NUM_SIZE); + const end = new Uint8Array(MAX_NUM_SIZE); + const char = new Uint8Array(MAX_NUM_SIZE); + const charCode = new Uint8Array(MAX_NUM_SIZE); + const tmp = new Uint8Array(MAX_NUM_SIZE); + let code; + let b; + while ((b = stream.getByte()) >= 0) { + const type = b >> 5; + if (type === 7) { + switch (b & 0x1f) { + case 0: + stream.readString(); + break; + case 1: + useCMap = stream.readString(); + break; + } + continue; + } + const sequence = !!(b & 0x10); + const dataSize = b & 15; + if (dataSize + 1 > MAX_NUM_SIZE) { + throw new Error("BinaryCMapReader.process: Invalid dataSize."); + } + const ucs2DataSize = 1; + const subitemsCount = stream.readNumber(); + switch (type) { + case 0: + stream.readHex(start, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, dataSize); + stream.readHexNumber(start, dataSize); + addHex(start, end, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); } - const resolution = component.resolutions[r]; - const numprecincts = resolution.precinctParameters.numprecincts; - for (; k < numprecincts;) { - const packet = createPacket(resolution, k, l); - k++; - return packet; - } - k = 0; - } - i = 0; - } - l = 0; - } - throw new JpxError("Out of packets"); - }; -} -function ResolutionPositionComponentLayerIterator(context) { - const siz = context.SIZ; - const tileIndex = context.currentTile.index; - const tile = context.tiles[tileIndex]; - const layersCount = tile.codingStyleDefaultParameters.layersCount; - const componentsCount = siz.Csiz; - let l, r, c, p; - let maxDecompositionLevelsCount = 0; - for (c = 0; c < componentsCount; c++) { - const component = tile.components[c]; - maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, component.codingStyleParameters.decompositionLevelsCount); - } - const maxNumPrecinctsInLevel = new Int32Array(maxDecompositionLevelsCount + 1); - for (r = 0; r <= maxDecompositionLevelsCount; ++r) { - let maxNumPrecincts = 0; - for (c = 0; c < componentsCount; ++c) { - const resolutions = tile.components[c].resolutions; - if (r < resolutions.length) { - maxNumPrecincts = Math.max(maxNumPrecincts, resolutions[r].precinctParameters.numprecincts); - } - } - maxNumPrecinctsInLevel[r] = maxNumPrecincts; - } - l = 0; - r = 0; - c = 0; - p = 0; - this.nextPacket = function JpxImage_nextPacket() { - for (; r <= maxDecompositionLevelsCount; r++) { - for (; p < maxNumPrecinctsInLevel[r]; p++) { - for (; c < componentsCount; c++) { - const component = tile.components[c]; - if (r > component.codingStyleParameters.decompositionLevelsCount) { - continue; + break; + case 1: + stream.readHex(start, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + stream.readNumber(); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, dataSize); + stream.readHexNumber(start, dataSize); + addHex(start, end, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + stream.readNumber(); } - const resolution = component.resolutions[r]; - const numprecincts = resolution.precinctParameters.numprecincts; - if (p >= numprecincts) { - continue; + break; + case 2: + stream.readHex(char, dataSize); + code = stream.readNumber(); + cMap.mapOne(hexToInt(char, dataSize), code); + for (let i = 1; i < subitemsCount; i++) { + incHex(char, dataSize); + if (!sequence) { + stream.readHexNumber(tmp, dataSize); + addHex(char, tmp, dataSize); + } + code = stream.readSigned() + (code + 1); + cMap.mapOne(hexToInt(char, dataSize), code); } - for (; l < layersCount;) { - const packet = createPacket(resolution, p, l); - l++; - return packet; - } - l = 0; - } - c = 0; - } - p = 0; - } - throw new JpxError("Out of packets"); - }; -} -function PositionComponentResolutionLayerIterator(context) { - const siz = context.SIZ; - const tileIndex = context.currentTile.index; - const tile = context.tiles[tileIndex]; - const layersCount = tile.codingStyleDefaultParameters.layersCount; - const componentsCount = siz.Csiz; - const precinctsSizes = getPrecinctSizesInImageScale(tile); - const precinctsIterationSizes = precinctsSizes; - let l = 0, - r = 0, - c = 0, - px = 0, - py = 0; - this.nextPacket = function JpxImage_nextPacket() { - for (; py < precinctsIterationSizes.maxNumHigh; py++) { - for (; px < precinctsIterationSizes.maxNumWide; px++) { - for (; c < componentsCount; c++) { - const component = tile.components[c]; - const decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; - for (; r <= decompositionLevelsCount; r++) { - const resolution = component.resolutions[r]; - const sizeInImageScale = precinctsSizes.components[c].resolutions[r]; - const k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution); - if (k === null) { - continue; + break; + case 3: + stream.readHex(start, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + code = stream.readNumber(); + cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, dataSize); + if (!sequence) { + stream.readHexNumber(start, dataSize); + addHex(start, end, dataSize); + } else { + start.set(end); } - for (; l < layersCount;) { - const packet = createPacket(resolution, k, l); - l++; - return packet; - } - l = 0; - } - r = 0; - } - c = 0; - } - px = 0; - } - throw new JpxError("Out of packets"); - }; -} -function ComponentPositionResolutionLayerIterator(context) { - const siz = context.SIZ; - const tileIndex = context.currentTile.index; - const tile = context.tiles[tileIndex]; - const layersCount = tile.codingStyleDefaultParameters.layersCount; - const componentsCount = siz.Csiz; - const precinctsSizes = getPrecinctSizesInImageScale(tile); - let l = 0, - r = 0, - c = 0, - px = 0, - py = 0; - this.nextPacket = function JpxImage_nextPacket() { - for (; c < componentsCount; ++c) { - const component = tile.components[c]; - const precinctsIterationSizes = precinctsSizes.components[c]; - const decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; - for (; py < precinctsIterationSizes.maxNumHigh; py++) { - for (; px < precinctsIterationSizes.maxNumWide; px++) { - for (; r <= decompositionLevelsCount; r++) { - const resolution = component.resolutions[r]; - const sizeInImageScale = precinctsIterationSizes.resolutions[r]; - const k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution); - if (k === null) { - continue; + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + code = stream.readNumber(); + cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); + } + break; + case 4: + stream.readHex(char, ucs2DataSize); + stream.readHex(charCode, dataSize); + cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); + for (let i = 1; i < subitemsCount; i++) { + incHex(char, ucs2DataSize); + if (!sequence) { + stream.readHexNumber(tmp, ucs2DataSize); + addHex(char, tmp, ucs2DataSize); } - for (; l < layersCount;) { - const packet = createPacket(resolution, k, l); - l++; - return packet; + incHex(charCode, dataSize); + stream.readHexSigned(tmp, dataSize); + addHex(charCode, tmp, dataSize); + cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); + } + break; + case 5: + stream.readHex(start, ucs2DataSize); + stream.readHexNumber(end, ucs2DataSize); + addHex(end, start, ucs2DataSize); + stream.readHex(charCode, dataSize); + cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); + for (let i = 1; i < subitemsCount; i++) { + incHex(end, ucs2DataSize); + if (!sequence) { + stream.readHexNumber(start, ucs2DataSize); + addHex(start, end, ucs2DataSize); + } else { + start.set(end); } - l = 0; + stream.readHexNumber(end, ucs2DataSize); + addHex(end, start, ucs2DataSize); + stream.readHex(charCode, dataSize); + cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); } - r = 0; + break; + default: + throw new Error(`BinaryCMapReader.process - unknown type: ${type}`); + } + } + if (useCMap) { + return extend(useCMap); + } + return cMap; + } +} + +;// ./src/core/ascii_85_stream.js + + +class Ascii85Stream extends DecodeStream { + #input = new Uint8Array(5); + constructor(str, maybeLength) { + if (maybeLength) { + maybeLength *= 0.8; + } + super(maybeLength); + this.stream = str; + this.dict = str.dict; + } + readBlock() { + const TILDA_CHAR = 0x7e; + const Z_LOWER_CHAR = 0x7a; + const EOF = -1; + const str = this.stream; + let c = str.getByte(); + while (isWhiteSpace(c)) { + c = str.getByte(); + } + if (c === EOF || c === TILDA_CHAR) { + this.eof = true; + return; + } + const bufferLength = this.bufferLength; + let buffer, i; + if (c === Z_LOWER_CHAR) { + buffer = this.ensureBuffer(bufferLength + 4); + buffer.fill(0, bufferLength, bufferLength + 4); + this.bufferLength += 4; + } else { + const input = this.#input; + input[0] = c; + for (i = 1; i < 5; ++i) { + c = str.getByte(); + while (isWhiteSpace(c)) { + c = str.getByte(); + } + input[i] = c; + if (c === EOF || c === TILDA_CHAR) { + break; } - px = 0; } - py = 0; + buffer = this.ensureBuffer(bufferLength + i - 1); + this.bufferLength += i - 1; + if (i < 5) { + input.fill(0x21 + 84, i, 5); + this.eof = true; + } + let t = 0; + for (i = 0; i < 5; ++i) { + t = t * 85 + (input[i] - 0x21); + } + for (i = 3; i >= 0; --i) { + buffer[bufferLength + i] = t & 0xff; + t >>= 8; + } } - throw new JpxError("Out of packets"); - }; + } } -function getPrecinctIndexIfExist(pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) { - const posX = pxIndex * precinctIterationSizes.minWidth; - const posY = pyIndex * precinctIterationSizes.minHeight; - if (posX % sizeInImageScale.width !== 0 || posY % sizeInImageScale.height !== 0) { - return null; + +;// ./src/core/ascii_hex_stream.js + +class AsciiHexStream extends DecodeStream { + constructor(str, maybeLength) { + if (maybeLength) { + maybeLength *= 0.5; + } + super(maybeLength); + this.stream = str; + this.dict = str.dict; + this.firstDigit = -1; + } + readBlock() { + const UPSTREAM_BLOCK_SIZE = 8000; + const bytes = this.stream.getBytes(UPSTREAM_BLOCK_SIZE); + if (!bytes.length) { + this.eof = true; + return; + } + const maxDecodeLength = bytes.length + 1 >> 1; + const buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength); + let bufferLength = this.bufferLength; + let firstDigit = this.firstDigit; + for (const ch of bytes) { + let digit; + if (ch >= 0x30 && ch <= 0x39) { + digit = ch & 0x0f; + } else if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) { + digit = (ch & 0x0f) + 9; + } else if (ch === 0x3e) { + this.eof = true; + break; + } else { + continue; + } + if (firstDigit < 0) { + firstDigit = digit; + } else { + buffer[bufferLength++] = firstDigit << 4 | digit; + firstDigit = -1; + } + } + if (firstDigit >= 0 && this.eof) { + buffer[bufferLength++] = firstDigit << 4; + firstDigit = -1; + } + this.firstDigit = firstDigit; + this.bufferLength = bufferLength; } - const startPrecinctRowIndex = posY / sizeInImageScale.width * resolution.precinctParameters.numprecinctswide; - return posX / sizeInImageScale.height + startPrecinctRowIndex; } -function getPrecinctSizesInImageScale(tile) { - const componentsCount = tile.components.length; - let minWidth = Number.MAX_VALUE; - let minHeight = Number.MAX_VALUE; - let maxNumWide = 0; - let maxNumHigh = 0; - const sizePerComponent = new Array(componentsCount); - for (let c = 0; c < componentsCount; c++) { - const component = tile.components[c]; - const decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; - const sizePerResolution = new Array(decompositionLevelsCount + 1); - let minWidthCurrentComponent = Number.MAX_VALUE; - let minHeightCurrentComponent = Number.MAX_VALUE; - let maxNumWideCurrentComponent = 0; - let maxNumHighCurrentComponent = 0; - let scale = 1; - for (let r = decompositionLevelsCount; r >= 0; --r) { - const resolution = component.resolutions[r]; - const widthCurrentResolution = scale * resolution.precinctParameters.precinctWidth; - const heightCurrentResolution = scale * resolution.precinctParameters.precinctHeight; - minWidthCurrentComponent = Math.min(minWidthCurrentComponent, widthCurrentResolution); - minHeightCurrentComponent = Math.min(minHeightCurrentComponent, heightCurrentResolution); - maxNumWideCurrentComponent = Math.max(maxNumWideCurrentComponent, resolution.precinctParameters.numprecinctswide); - maxNumHighCurrentComponent = Math.max(maxNumHighCurrentComponent, resolution.precinctParameters.numprecinctshigh); - sizePerResolution[r] = { - width: widthCurrentResolution, - height: heightCurrentResolution - }; - scale <<= 1; - } - minWidth = Math.min(minWidth, minWidthCurrentComponent); - minHeight = Math.min(minHeight, minHeightCurrentComponent); - maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent); - maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent); - sizePerComponent[c] = { - resolutions: sizePerResolution, - minWidth: minWidthCurrentComponent, - minHeight: minHeightCurrentComponent, - maxNumWide: maxNumWideCurrentComponent, - maxNumHigh: maxNumHighCurrentComponent - }; + +;// ./external/brotli/decode.js +let Options; +let makeBrotliDecode = () => { + const MAX_HUFFMAN_TABLE_SIZE = Int32Array.from([256, 402, 436, 468, 500, 534, 566, 598, 630, 662, 694, 726, 758, 790, 822, 854, 886, 920, 952, 984, 1016, 1048, 1080]); + const CODE_LENGTH_CODE_ORDER = Int32Array.from([1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15]); + const DISTANCE_SHORT_CODE_INDEX_OFFSET = Int32Array.from([0, 3, 2, 1, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3]); + const DISTANCE_SHORT_CODE_VALUE_OFFSET = Int32Array.from([0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3]); + const FIXED_TABLE = Int32Array.from([0x020000, 0x020004, 0x020003, 0x030002, 0x020000, 0x020004, 0x020003, 0x040001, 0x020000, 0x020004, 0x020003, 0x030002, 0x020000, 0x020004, 0x020003, 0x040005]); + const BLOCK_LENGTH_OFFSET = Int32Array.from([1, 5, 9, 13, 17, 25, 33, 41, 49, 65, 81, 97, 113, 145, 177, 209, 241, 305, 369, 497, 753, 1265, 2289, 4337, 8433, 16625]); + const BLOCK_LENGTH_N_BITS = Int32Array.from([2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 24]); + const INSERT_LENGTH_N_BITS = Int16Array.from([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0C, 0x0E, 0x18]); + const COPY_LENGTH_N_BITS = Int16Array.from([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x18]); + const CMD_LOOKUP = new Int16Array(2816); + unpackCommandLookupTable(CMD_LOOKUP); + function log2floor(i) { + let result = -1; + let step = 16; + let v = i; + while (step > 0) { + let next = v >> step; + if (next !== 0) { + result += step; + v = next; + } + step = step >> 1; + } + return result + v; + } + function calculateDistanceAlphabetSize(npostfix, ndirect, maxndistbits) { + return 16 + ndirect + 2 * (maxndistbits << npostfix); + } + function calculateDistanceAlphabetLimit(s, maxDistance, npostfix, ndirect) { + if (maxDistance < ndirect + (2 << npostfix)) { + return makeError(s, -23); + } + const offset = (maxDistance - ndirect >> npostfix) + 4; + const ndistbits = log2floor(offset) - 1; + const group = ndistbits - 1 << 1 | offset >> ndistbits & 1; + return (group - 1 << npostfix) + (1 << npostfix) + ndirect + 16; + } + function unpackCommandLookupTable(cmdLookup) { + const insertLengthOffsets = new Int32Array(24); + const copyLengthOffsets = new Int32Array(24); + copyLengthOffsets[0] = 2; + for (let i = 0; i < 23; ++i) { + insertLengthOffsets[i + 1] = insertLengthOffsets[i] + (1 << INSERT_LENGTH_N_BITS[i]); + copyLengthOffsets[i + 1] = copyLengthOffsets[i] + (1 << COPY_LENGTH_N_BITS[i]); + } + for (let cmdCode = 0; cmdCode < 704; ++cmdCode) { + let rangeIdx = cmdCode >> 6; + let distanceContextOffset = -4; + if (rangeIdx >= 2) { + rangeIdx -= 2; + distanceContextOffset = 0; + } + const insertCode = (0x29850 >> rangeIdx * 2 & 0x3) << 3 | cmdCode >> 3 & 7; + const copyCode = (0x26244 >> rangeIdx * 2 & 0x3) << 3 | cmdCode & 7; + const copyLengthOffset = copyLengthOffsets[copyCode]; + const distanceContext = distanceContextOffset + Math.min(copyLengthOffset, 5) - 2; + const index = cmdCode * 4; + cmdLookup[index] = INSERT_LENGTH_N_BITS[insertCode] | COPY_LENGTH_N_BITS[copyCode] << 8; + cmdLookup[index + 1] = insertLengthOffsets[insertCode]; + cmdLookup[index + 2] = copyLengthOffsets[copyCode]; + cmdLookup[index + 3] = distanceContext; + } + } + function decodeWindowBits(s) { + const largeWindowEnabled = s.isLargeWindow; + s.isLargeWindow = 0; + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + if (readFewBits(s, 1) === 0) { + return 16; + } + let n = readFewBits(s, 3); + if (n !== 0) { + return 17 + n; + } + n = readFewBits(s, 3); + if (n !== 0) { + if (n === 1) { + if (largeWindowEnabled === 0) { + return -1; + } + s.isLargeWindow = 1; + if (readFewBits(s, 1) === 1) { + return -1; + } + n = readFewBits(s, 6); + if (n < 10 || n > 30) { + return -1; + } + return n; + } + return 8 + n; + } + return 17; + } + function attachDictionaryChunk(s, data) { + if (s.runningState !== 1) { + return makeError(s, -24); + } + if (s.cdNumChunks === 0) { + s.cdChunks = new Array(16); + s.cdChunkOffsets = new Int32Array(16); + s.cdBlockBits = -1; + } + if (s.cdNumChunks === 15) { + return makeError(s, -27); + } + s.cdChunks[s.cdNumChunks] = data; + s.cdNumChunks++; + s.cdTotalSize += data.length; + s.cdChunkOffsets[s.cdNumChunks] = s.cdTotalSize; + return 0; } - return { - components: sizePerComponent, - minWidth, - minHeight, - maxNumWide, - maxNumHigh - }; -} -function buildPackets(context) { - const siz = context.SIZ; - const tileIndex = context.currentTile.index; - const tile = context.tiles[tileIndex]; - const componentsCount = siz.Csiz; - for (let c = 0; c < componentsCount; c++) { - const component = tile.components[c]; - const decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; - const resolutions = []; - const subbands = []; - for (let r = 0; r <= decompositionLevelsCount; r++) { - const blocksDimensions = getBlocksDimensions(context, component, r); - const resolution = {}; - const scale = 1 << decompositionLevelsCount - r; - resolution.trx0 = Math.ceil(component.tcx0 / scale); - resolution.try0 = Math.ceil(component.tcy0 / scale); - resolution.trx1 = Math.ceil(component.tcx1 / scale); - resolution.try1 = Math.ceil(component.tcy1 / scale); - resolution.resLevel = r; - buildPrecincts(context, resolution, blocksDimensions); - resolutions.push(resolution); - let subband; - if (r === 0) { - subband = {}; - subband.type = "LL"; - subband.tbx0 = Math.ceil(component.tcx0 / scale); - subband.tby0 = Math.ceil(component.tcy0 / scale); - subband.tbx1 = Math.ceil(component.tcx1 / scale); - subband.tby1 = Math.ceil(component.tcy1 / scale); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolution.subbands = [subband]; - } else { - const bscale = 1 << decompositionLevelsCount - r + 1; - const resolutionSubbands = []; - subband = {}; - subband.type = "HL"; - subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); - subband.tby0 = Math.ceil(component.tcy0 / bscale); - subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); - subband.tby1 = Math.ceil(component.tcy1 / bscale); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolutionSubbands.push(subband); - subband = {}; - subband.type = "LH"; - subband.tbx0 = Math.ceil(component.tcx0 / bscale); - subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); - subband.tbx1 = Math.ceil(component.tcx1 / bscale); - subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolutionSubbands.push(subband); - subband = {}; - subband.type = "HH"; - subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); - subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); - subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); - subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolutionSubbands.push(subband); - resolution.subbands = resolutionSubbands; + function initState(s) { + if (s.runningState !== 0) { + return makeError(s, -26); + } + s.blockTrees = new Int32Array(3091); + s.blockTrees[0] = 7; + s.distRbIdx = 3; + let result = calculateDistanceAlphabetLimit(s, 0x7FFFFFFC, 3, 120); + if (result < 0) { + return result; + } + const maxDistanceAlphabetLimit = result; + s.distExtraBits = new Int8Array(maxDistanceAlphabetLimit); + s.distOffset = new Int32Array(maxDistanceAlphabetLimit); + result = initBitReader(s); + if (result < 0) { + return result; + } + s.runningState = 1; + return 0; + } + function close(s) { + if (s.runningState === 0) { + return makeError(s, -25); + } + if (s.runningState > 0) { + s.runningState = 11; + } + return 0; + } + function decodeVarLenUnsignedByte(s) { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + if (readFewBits(s, 1) !== 0) { + const n = readFewBits(s, 3); + if (n === 0) { + return 1; } + return readFewBits(s, n) + (1 << n); } - component.resolutions = resolutions; - component.subbands = subbands; + return 0; } - const progressionOrder = tile.codingStyleDefaultParameters.progressionOrder; - switch (progressionOrder) { - case 0: - tile.packetsIterator = new LayerResolutionComponentPositionIterator(context); - break; - case 1: - tile.packetsIterator = new ResolutionLayerComponentPositionIterator(context); - break; - case 2: - tile.packetsIterator = new ResolutionPositionComponentLayerIterator(context); - break; - case 3: - tile.packetsIterator = new PositionComponentResolutionLayerIterator(context); - break; - case 4: - tile.packetsIterator = new ComponentPositionResolutionLayerIterator(context); - break; - default: - throw new JpxError(`Unsupported progression order ${progressionOrder}`); + function decodeMetaBlockLength(s) { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + s.inputEnd = readFewBits(s, 1); + s.metaBlockLength = 0; + s.isUncompressed = 0; + s.isMetadata = 0; + if (s.inputEnd !== 0 && readFewBits(s, 1) !== 0) { + return 0; + } + const sizeNibbles = readFewBits(s, 2) + 4; + if (sizeNibbles === 7) { + s.isMetadata = 1; + if (readFewBits(s, 1) !== 0) { + return makeError(s, -6); + } + const sizeBytes = readFewBits(s, 2); + if (sizeBytes === 0) { + return 0; + } + for (let i = 0; i < sizeBytes; ++i) { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const bits = readFewBits(s, 8); + if (bits === 0 && i + 1 === sizeBytes && sizeBytes > 1) { + return makeError(s, -8); + } + s.metaBlockLength += bits << i * 8; + } + } else { + for (let i = 0; i < sizeNibbles; ++i) { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const bits = readFewBits(s, 4); + if (bits === 0 && i + 1 === sizeNibbles && sizeNibbles > 4) { + return makeError(s, -8); + } + s.metaBlockLength += bits << i * 4; + } + } + s.metaBlockLength++; + if (s.inputEnd === 0) { + s.isUncompressed = readFewBits(s, 1); + } + return 0; } -} -function parseTilePackets(context, data, offset, dataLength) { - let position = 0; - let buffer, - bufferSize = 0, - skipNextBit = false; - function readBits(count) { - while (bufferSize < count) { - const b = data[offset + position]; - position++; - if (skipNextBit) { - buffer = buffer << 7 | b; - bufferSize += 7; - skipNextBit = false; + function readSymbol(tableGroup, tableIdx, s) { + let offset = tableGroup[tableIdx]; + const v = s.accumulator32 >>> s.bitOffset; + offset += v & 0xFF; + const bits = tableGroup[offset] >> 16; + const sym = tableGroup[offset] & 0xFFFF; + if (bits <= 8) { + s.bitOffset += bits; + return sym; + } + offset += sym; + const mask = (1 << bits) - 1; + offset += (v & mask) >>> 8; + s.bitOffset += (tableGroup[offset] >> 16) + 8; + return tableGroup[offset] & 0xFFFF; + } + function readBlockLength(tableGroup, tableIdx, s) { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const code = readSymbol(tableGroup, tableIdx, s); + const n = BLOCK_LENGTH_N_BITS[code]; + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + return BLOCK_LENGTH_OFFSET[code] + (n <= 16 ? readFewBits(s, n) : readManyBits(s, n)); + } + function moveToFront(v, index) { + let i = index; + const value = v[i]; + while (i > 0) { + v[i] = v[i - 1]; + i--; + } + v[0] = value; + } + function inverseMoveToFrontTransform(v, vLen) { + const mtf = new Int32Array(256); + for (let i = 0; i < 256; ++i) { + mtf[i] = i; + } + for (let i = 0; i < vLen; ++i) { + const index = v[i] & 0xFF; + v[i] = mtf[index]; + if (index !== 0) { + moveToFront(mtf, index); + } + } + } + function readHuffmanCodeLengths(codeLengthCodeLengths, numSymbols, codeLengths, s) { + let symbol = 0; + let prevCodeLen = 8; + let repeat = 0; + let repeatCodeLen = 0; + let space = 32768; + const table = new Int32Array(33); + const tableIdx = table.length - 1; + buildHuffmanTable(table, tableIdx, 5, codeLengthCodeLengths, 18); + while (symbol < numSymbols && space > 0) { + if (s.halfOffset > 2030) { + const result = readMoreInput(s); + if (result < 0) { + return result; + } + } + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const p = s.accumulator32 >>> s.bitOffset & 31; + s.bitOffset += table[p] >> 16; + const codeLen = table[p] & 0xFFFF; + if (codeLen < 16) { + repeat = 0; + codeLengths[symbol++] = codeLen; + if (codeLen !== 0) { + prevCodeLen = codeLen; + space -= 32768 >> codeLen; + } + } else { + const extraBits = codeLen - 14; + let newLen = 0; + if (codeLen === 16) { + newLen = prevCodeLen; + } + if (repeatCodeLen !== newLen) { + repeat = 0; + repeatCodeLen = newLen; + } + const oldRepeat = repeat; + if (repeat > 0) { + repeat -= 2; + repeat = repeat << extraBits; + } + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + repeat += readFewBits(s, extraBits) + 3; + const repeatDelta = repeat - oldRepeat; + if (symbol + repeatDelta > numSymbols) { + return makeError(s, -2); + } + for (let i = 0; i < repeatDelta; ++i) { + codeLengths[symbol++] = repeatCodeLen; + } + if (repeatCodeLen !== 0) { + space -= repeatDelta << 15 - repeatCodeLen; + } + } + } + if (space !== 0) { + return makeError(s, -18); + } + codeLengths.fill(0, symbol, numSymbols); + return 0; + } + function checkDupes(s, symbols, length) { + for (let i = 0; i < length - 1; ++i) { + for (let j = i + 1; j < length; ++j) { + if (symbols[i] === symbols[j]) { + return makeError(s, -7); + } + } + } + return 0; + } + function readSimpleHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s) { + const codeLengths = new Int32Array(alphabetSizeLimit); + const symbols = new Int32Array(4); + const maxBits = 1 + log2floor(alphabetSizeMax - 1); + const numSymbols = readFewBits(s, 2) + 1; + for (let i = 0; i < numSymbols; ++i) { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const symbol = readFewBits(s, maxBits); + if (symbol >= alphabetSizeLimit) { + return makeError(s, -15); + } + symbols[i] = symbol; + } + const result = checkDupes(s, symbols, numSymbols); + if (result < 0) { + return result; + } + let histogramId = numSymbols; + if (numSymbols === 4) { + histogramId += readFewBits(s, 1); + } + switch (histogramId) { + case 1: + codeLengths[symbols[0]] = 1; + break; + case 2: + codeLengths[symbols[0]] = 1; + codeLengths[symbols[1]] = 1; + break; + case 3: + codeLengths[symbols[0]] = 1; + codeLengths[symbols[1]] = 2; + codeLengths[symbols[2]] = 2; + break; + case 4: + codeLengths[symbols[0]] = 2; + codeLengths[symbols[1]] = 2; + codeLengths[symbols[2]] = 2; + codeLengths[symbols[3]] = 2; + break; + case 5: + codeLengths[symbols[0]] = 1; + codeLengths[symbols[1]] = 2; + codeLengths[symbols[2]] = 3; + codeLengths[symbols[3]] = 3; + break; + default: + break; + } + return buildHuffmanTable(tableGroup, tableIdx, 8, codeLengths, alphabetSizeLimit); + } + function readComplexHuffmanCode(alphabetSizeLimit, skip, tableGroup, tableIdx, s) { + const codeLengths = new Int32Array(alphabetSizeLimit); + const codeLengthCodeLengths = new Int32Array(18); + let space = 32; + let numCodes = 0; + for (let i = skip; i < 18; ++i) { + const codeLenIdx = CODE_LENGTH_CODE_ORDER[i]; + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const p = s.accumulator32 >>> s.bitOffset & 15; + s.bitOffset += FIXED_TABLE[p] >> 16; + const v = FIXED_TABLE[p] & 0xFFFF; + codeLengthCodeLengths[codeLenIdx] = v; + if (v !== 0) { + space -= 32 >> v; + numCodes++; + if (space <= 0) { + break; + } + } + } + if (space !== 0 && numCodes !== 1) { + return makeError(s, -4); + } + const result = readHuffmanCodeLengths(codeLengthCodeLengths, alphabetSizeLimit, codeLengths, s); + if (result < 0) { + return result; + } + return buildHuffmanTable(tableGroup, tableIdx, 8, codeLengths, alphabetSizeLimit); + } + function readHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s) { + if (s.halfOffset > 2030) { + const result = readMoreInput(s); + if (result < 0) { + return result; + } + } + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const simpleCodeOrSkip = readFewBits(s, 2); + if (simpleCodeOrSkip === 1) { + return readSimpleHuffmanCode(alphabetSizeMax, alphabetSizeLimit, tableGroup, tableIdx, s); + } + return readComplexHuffmanCode(alphabetSizeLimit, simpleCodeOrSkip, tableGroup, tableIdx, s); + } + function decodeContextMap(contextMapSize, contextMap, s) { + let result; + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; + } + } + const numTrees = decodeVarLenUnsignedByte(s) + 1; + if (numTrees === 1) { + contextMap.fill(0, 0, contextMapSize); + return numTrees; + } + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const useRleForZeros = readFewBits(s, 1); + let maxRunLengthPrefix = 0; + if (useRleForZeros !== 0) { + maxRunLengthPrefix = readFewBits(s, 4) + 1; + } + const alphabetSize = numTrees + maxRunLengthPrefix; + const tableSize = MAX_HUFFMAN_TABLE_SIZE[alphabetSize + 31 >> 5]; + const table = new Int32Array(tableSize + 1); + const tableIdx = table.length - 1; + result = readHuffmanCode(alphabetSize, alphabetSize, table, tableIdx, s); + if (result < 0) { + return result; + } + let i = 0; + while (i < contextMapSize) { + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; + } + } + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const code = readSymbol(table, tableIdx, s); + if (code === 0) { + contextMap[i] = 0; + i++; + } else if (code <= maxRunLengthPrefix) { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + let reps = (1 << code) + readFewBits(s, code); + while (reps !== 0) { + if (i >= contextMapSize) { + return makeError(s, -3); + } + contextMap[i] = 0; + i++; + reps--; + } } else { - buffer = buffer << 8 | b; - bufferSize += 8; + contextMap[i] = code - maxRunLengthPrefix; + i++; } - if (b === 0xff) { - skipNextBit = true; + } + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + if (readFewBits(s, 1) === 1) { + inverseMoveToFrontTransform(contextMap, contextMapSize); + } + return numTrees; + } + function decodeBlockTypeAndLength(s, treeType, numBlockTypes) { + const ringBuffers = s.rings; + const offset = 4 + treeType * 2; + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + let blockType = readSymbol(s.blockTrees, 2 * treeType, s); + const result = readBlockLength(s.blockTrees, 2 * treeType + 1, s); + if (blockType === 1) { + blockType = ringBuffers[offset + 1] + 1; + } else if (blockType === 0) { + blockType = ringBuffers[offset]; + } else { + blockType -= 2; + } + if (blockType >= numBlockTypes) { + blockType -= numBlockTypes; + } + ringBuffers[offset] = ringBuffers[offset + 1]; + ringBuffers[offset + 1] = blockType; + return result; + } + function decodeLiteralBlockSwitch(s) { + s.literalBlockLength = decodeBlockTypeAndLength(s, 0, s.numLiteralBlockTypes); + const literalBlockType = s.rings[5]; + s.contextMapSlice = literalBlockType << 6; + s.literalTreeIdx = s.contextMap[s.contextMapSlice] & 0xFF; + const contextMode = s.contextModes[literalBlockType]; + s.contextLookupOffset1 = contextMode << 9; + s.contextLookupOffset2 = s.contextLookupOffset1 + 256; + } + function decodeCommandBlockSwitch(s) { + s.commandBlockLength = decodeBlockTypeAndLength(s, 1, s.numCommandBlockTypes); + s.commandTreeIdx = s.rings[7]; + } + function decodeDistanceBlockSwitch(s) { + s.distanceBlockLength = decodeBlockTypeAndLength(s, 2, s.numDistanceBlockTypes); + s.distContextMapSlice = s.rings[9] << 2; + } + function maybeReallocateRingBuffer(s) { + let newSize = s.maxRingBufferSize; + if (newSize > s.expectedTotalSize) { + const minimalNewSize = s.expectedTotalSize; + while (newSize >> 1 > minimalNewSize) { + newSize = newSize >> 1; + } + if (s.inputEnd === 0 && newSize < 16384 && s.maxRingBufferSize >= 16384) { + newSize = 16384; + } + } + if (newSize <= s.ringBufferSize) { + return; + } + const ringBufferSizeWithSlack = newSize + 37; + const newBuffer = new Int8Array(ringBufferSizeWithSlack); + const oldBuffer = s.ringBuffer; + if (oldBuffer.length !== 0) { + newBuffer.set(oldBuffer.subarray(0, s.ringBufferSize), 0); + } + s.ringBuffer = newBuffer; + s.ringBufferSize = newSize; + } + function readNextMetablockHeader(s) { + if (s.inputEnd !== 0) { + s.nextRunningState = 10; + s.runningState = 12; + return 0; + } + s.literalTreeGroup = new Int32Array(0); + s.commandTreeGroup = new Int32Array(0); + s.distanceTreeGroup = new Int32Array(0); + let result; + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; } } - bufferSize -= count; - return buffer >>> bufferSize & (1 << count) - 1; + result = decodeMetaBlockLength(s); + if (result < 0) { + return result; + } + if (s.metaBlockLength === 0 && s.isMetadata === 0) { + return 0; + } + if (s.isUncompressed !== 0 || s.isMetadata !== 0) { + result = jumpToByteBoundary(s); + if (result < 0) { + return result; + } + if (s.isMetadata === 0) { + s.runningState = 6; + } else { + s.runningState = 5; + } + } else { + s.runningState = 3; + } + if (s.isMetadata !== 0) { + return 0; + } + s.expectedTotalSize += s.metaBlockLength; + if (s.expectedTotalSize > 1 << 30) { + s.expectedTotalSize = 1 << 30; + } + if (s.ringBufferSize < s.maxRingBufferSize) { + maybeReallocateRingBuffer(s); + } + return 0; } - function skipMarkerIfEqual(value) { - if (data[offset + position - 1] === 0xff && data[offset + position] === value) { - skipBytes(1); - return true; - } else if (data[offset + position] === 0xff && data[offset + position + 1] === value) { - skipBytes(2); - return true; + function readMetablockPartition(s, treeType, numBlockTypes) { + let offset = s.blockTrees[2 * treeType]; + if (numBlockTypes <= 1) { + s.blockTrees[2 * treeType + 1] = offset; + s.blockTrees[2 * treeType + 2] = offset; + return 1 << 28; + } + const blockTypeAlphabetSize = numBlockTypes + 2; + let result = readHuffmanCode(blockTypeAlphabetSize, blockTypeAlphabetSize, s.blockTrees, 2 * treeType, s); + if (result < 0) { + return result; } - return false; + offset += result; + s.blockTrees[2 * treeType + 1] = offset; + const blockLengthAlphabetSize = 26; + result = readHuffmanCode(blockLengthAlphabetSize, blockLengthAlphabetSize, s.blockTrees, 2 * treeType + 1, s); + if (result < 0) { + return result; + } + offset += result; + s.blockTrees[2 * treeType + 2] = offset; + return readBlockLength(s.blockTrees, 2 * treeType + 1, s); + } + function calculateDistanceLut(s, alphabetSizeLimit) { + const distExtraBits = s.distExtraBits; + const distOffset = s.distOffset; + const npostfix = s.distancePostfixBits; + const ndirect = s.numDirectDistanceCodes; + const postfix = 1 << npostfix; + let bits = 1; + let half = 0; + let i = 16; + for (let j = 0; j < ndirect; ++j) { + distExtraBits[i] = 0; + distOffset[i] = j + 1; + ++i; + } + while (i < alphabetSizeLimit) { + const base = ndirect + ((2 + half << bits) - 4 << npostfix) + 1; + for (let j = 0; j < postfix; ++j) { + distExtraBits[i] = bits; + distOffset[i] = base + j; + ++i; + } + bits = bits + half; + half = half ^ 1; + } + } + function readMetablockHuffmanCodesAndContextMaps(s) { + s.numLiteralBlockTypes = decodeVarLenUnsignedByte(s) + 1; + let result = readMetablockPartition(s, 0, s.numLiteralBlockTypes); + if (result < 0) { + return result; + } + s.literalBlockLength = result; + s.numCommandBlockTypes = decodeVarLenUnsignedByte(s) + 1; + result = readMetablockPartition(s, 1, s.numCommandBlockTypes); + if (result < 0) { + return result; + } + s.commandBlockLength = result; + s.numDistanceBlockTypes = decodeVarLenUnsignedByte(s) + 1; + result = readMetablockPartition(s, 2, s.numDistanceBlockTypes); + if (result < 0) { + return result; + } + s.distanceBlockLength = result; + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; + } + } + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + s.distancePostfixBits = readFewBits(s, 2); + s.numDirectDistanceCodes = readFewBits(s, 4) << s.distancePostfixBits; + s.contextModes = new Int8Array(s.numLiteralBlockTypes); + let i = 0; + while (i < s.numLiteralBlockTypes) { + const limit = Math.min(i + 96, s.numLiteralBlockTypes); + while (i < limit) { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + s.contextModes[i] = readFewBits(s, 2); + i++; + } + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; + } + } + } + const contextMapLength = s.numLiteralBlockTypes << 6; + s.contextMap = new Int8Array(contextMapLength); + result = decodeContextMap(contextMapLength, s.contextMap, s); + if (result < 0) { + return result; + } + const numLiteralTrees = result; + s.trivialLiteralContext = 1; + for (let j = 0; j < contextMapLength; ++j) { + if (s.contextMap[j] !== j >> 6) { + s.trivialLiteralContext = 0; + break; + } + } + s.distContextMap = new Int8Array(s.numDistanceBlockTypes << 2); + result = decodeContextMap(s.numDistanceBlockTypes << 2, s.distContextMap, s); + if (result < 0) { + return result; + } + const numDistTrees = result; + s.literalTreeGroup = new Int32Array(huffmanTreeGroupAllocSize(256, numLiteralTrees)); + result = decodeHuffmanTreeGroup(256, 256, numLiteralTrees, s, s.literalTreeGroup); + if (result < 0) { + return result; + } + s.commandTreeGroup = new Int32Array(huffmanTreeGroupAllocSize(704, s.numCommandBlockTypes)); + result = decodeHuffmanTreeGroup(704, 704, s.numCommandBlockTypes, s, s.commandTreeGroup); + if (result < 0) { + return result; + } + let distanceAlphabetSizeMax = calculateDistanceAlphabetSize(s.distancePostfixBits, s.numDirectDistanceCodes, 24); + let distanceAlphabetSizeLimit = distanceAlphabetSizeMax; + if (s.isLargeWindow === 1) { + distanceAlphabetSizeMax = calculateDistanceAlphabetSize(s.distancePostfixBits, s.numDirectDistanceCodes, 62); + result = calculateDistanceAlphabetLimit(s, 0x7FFFFFFC, s.distancePostfixBits, s.numDirectDistanceCodes); + if (result < 0) { + return result; + } + distanceAlphabetSizeLimit = result; + } + s.distanceTreeGroup = new Int32Array(huffmanTreeGroupAllocSize(distanceAlphabetSizeLimit, numDistTrees)); + result = decodeHuffmanTreeGroup(distanceAlphabetSizeMax, distanceAlphabetSizeLimit, numDistTrees, s, s.distanceTreeGroup); + if (result < 0) { + return result; + } + calculateDistanceLut(s, distanceAlphabetSizeLimit); + s.contextMapSlice = 0; + s.distContextMapSlice = 0; + s.contextLookupOffset1 = s.contextModes[0] * 512; + s.contextLookupOffset2 = s.contextLookupOffset1 + 256; + s.literalTreeIdx = 0; + s.commandTreeIdx = 0; + s.rings[4] = 1; + s.rings[5] = 0; + s.rings[6] = 1; + s.rings[7] = 0; + s.rings[8] = 1; + s.rings[9] = 0; + return 0; + } + function copyUncompressedData(s) { + const ringBuffer = s.ringBuffer; + let result; + if (s.metaBlockLength <= 0) { + result = reload(s); + if (result < 0) { + return result; + } + s.runningState = 2; + return 0; + } + const chunkLength = Math.min(s.ringBufferSize - s.pos, s.metaBlockLength); + result = copyRawBytes(s, ringBuffer, s.pos, chunkLength); + if (result < 0) { + return result; + } + s.metaBlockLength -= chunkLength; + s.pos += chunkLength; + if (s.pos === s.ringBufferSize) { + s.nextRunningState = 6; + s.runningState = 12; + return 0; + } + result = reload(s); + if (result < 0) { + return result; + } + s.runningState = 2; + return 0; } - function skipBytes(count) { - position += count; + function writeRingBuffer(s) { + const toWrite = Math.min(s.outputLength - s.outputUsed, s.ringBufferBytesReady - s.ringBufferBytesWritten); + if (toWrite !== 0) { + s.output.set(s.ringBuffer.subarray(s.ringBufferBytesWritten, s.ringBufferBytesWritten + toWrite), s.outputOffset + s.outputUsed); + s.outputUsed += toWrite; + s.ringBufferBytesWritten += toWrite; + } + if (s.outputUsed < s.outputLength) { + return 0; + } + return 2; + } + function huffmanTreeGroupAllocSize(alphabetSizeLimit, n) { + const maxTableSize = MAX_HUFFMAN_TABLE_SIZE[alphabetSizeLimit + 31 >> 5]; + return n + n * maxTableSize; } - function alignToByte() { - bufferSize = 0; - if (skipNextBit) { - position++; - skipNextBit = false; + function decodeHuffmanTreeGroup(alphabetSizeMax, alphabetSizeLimit, n, s, group) { + let next = n; + for (let i = 0; i < n; ++i) { + group[i] = next; + const result = readHuffmanCode(alphabetSizeMax, alphabetSizeLimit, group, i, s); + if (result < 0) { + return result; + } + next += result; } + return 0; } - function readCodingpasses() { - if (readBits(1) === 0) { - return 1; + function calculateFence(s) { + let result = s.ringBufferSize; + if (s.isEager !== 0) { + result = Math.min(result, s.ringBufferBytesWritten + s.outputLength - s.outputUsed); } - if (readBits(1) === 0) { - return 2; + return result; + } + function doUseDictionary(s, fence) { + if (s.distance > 0x7FFFFFFC) { + return makeError(s, -9); + } + const address = s.distance - s.maxDistance - 1 - s.cdTotalSize; + if (address < 0) { + const result = initializeCompoundDictionaryCopy(s, -address - 1, s.copyLength); + if (result < 0) { + return result; + } + s.runningState = 14; + } else { + const dictionaryData = data; + const wordLength = s.copyLength; + if (wordLength > 31) { + return makeError(s, -9); + } + const shift = sizeBits[wordLength]; + if (shift === 0) { + return makeError(s, -9); + } + let offset = offsets[wordLength]; + const mask = (1 << shift) - 1; + const wordIdx = address & mask; + const transformIdx = address >> shift; + offset += wordIdx * wordLength; + const transforms = RFC_TRANSFORMS; + if (transformIdx >= transforms.numTransforms) { + return makeError(s, -9); + } + const len = transformDictionaryWord(s.ringBuffer, s.pos, dictionaryData, offset, wordLength, transforms, transformIdx); + s.pos += len; + s.metaBlockLength -= len; + if (s.pos >= fence) { + s.nextRunningState = 4; + s.runningState = 12; + return 0; + } + s.runningState = 4; } - let value = readBits(2); - if (value < 3) { - return value + 3; - } - value = readBits(5); - if (value < 31) { - return value + 6; - } - value = readBits(7); - return value + 37; - } - const tileIndex = context.currentTile.index; - const tile = context.tiles[tileIndex]; - const sopMarkerUsed = context.COD.sopMarkerUsed; - const ephMarkerUsed = context.COD.ephMarkerUsed; - const packetsIterator = tile.packetsIterator; - while (position < dataLength) { - alignToByte(); - if (sopMarkerUsed && skipMarkerIfEqual(0x91)) { - skipBytes(4); + return 0; + } + function initializeCompoundDictionary(s) { + s.cdBlockMap = new Int8Array(256); + let blockBits = 8; + while (s.cdTotalSize - 1 >> blockBits !== 0) { + blockBits++; + } + blockBits -= 8; + s.cdBlockBits = blockBits; + let cursor = 0; + let index = 0; + while (cursor < s.cdTotalSize) { + while (s.cdChunkOffsets[index + 1] < cursor) { + index++; + } + s.cdBlockMap[cursor >> blockBits] = index; + cursor += 1 << blockBits; } - const packet = packetsIterator.nextPacket(); - if (!readBits(1)) { - continue; + } + function initializeCompoundDictionaryCopy(s, address, length) { + if (s.cdBlockBits === -1) { + initializeCompoundDictionary(s); + } + let index = s.cdBlockMap[address >> s.cdBlockBits]; + while (address >= s.cdChunkOffsets[index + 1]) { + index++; + } + if (s.cdTotalSize > address + length) { + return makeError(s, -9); + } + s.distRbIdx = s.distRbIdx + 1 & 0x3; + s.rings[s.distRbIdx] = s.distance; + s.metaBlockLength -= length; + s.cdBrIndex = index; + s.cdBrOffset = address - s.cdChunkOffsets[index]; + s.cdBrLength = length; + s.cdBrCopied = 0; + return 0; + } + function copyFromCompoundDictionary(s, fence) { + let pos = s.pos; + const origPos = pos; + while (s.cdBrLength !== s.cdBrCopied) { + const space = fence - pos; + const chunkLength = s.cdChunkOffsets[s.cdBrIndex + 1] - s.cdChunkOffsets[s.cdBrIndex]; + const remChunkLength = chunkLength - s.cdBrOffset; + let length = s.cdBrLength - s.cdBrCopied; + if (length > remChunkLength) { + length = remChunkLength; + } + if (length > space) { + length = space; + } + s.ringBuffer.set(s.cdChunks[s.cdBrIndex].subarray(s.cdBrOffset, s.cdBrOffset + length), pos); + pos += length; + s.cdBrOffset += length; + s.cdBrCopied += length; + if (length === remChunkLength) { + s.cdBrIndex++; + s.cdBrOffset = 0; + } + if (pos >= fence) { + break; + } } - const layerNumber = packet.layerNumber, - queue = []; - let codeblock; - for (let i = 0, ii = packet.codeblocks.length; i < ii; i++) { - codeblock = packet.codeblocks[i]; - let precinct = codeblock.precinct; - const codeblockColumn = codeblock.cbx - precinct.cbxMin; - const codeblockRow = codeblock.cby - precinct.cbyMin; - let codeblockIncluded = false; - let firstTimeInclusion = false; - let valueReady, zeroBitPlanesTree; - if (codeblock.included !== undefined) { - codeblockIncluded = !!readBits(1); - } else { - precinct = codeblock.precinct; - let inclusionTree; - if (precinct.inclusionTree !== undefined) { - inclusionTree = precinct.inclusionTree; - } else { - const width = precinct.cbxMax - precinct.cbxMin + 1; - const height = precinct.cbyMax - precinct.cbyMin + 1; - inclusionTree = new InclusionTree(width, height, layerNumber); - zeroBitPlanesTree = new TagTree(width, height); - precinct.inclusionTree = inclusionTree; - precinct.zeroBitPlanesTree = zeroBitPlanesTree; - for (let l = 0; l < layerNumber; l++) { - if (readBits(1) !== 0) { - throw new JpxError("Invalid tag tree"); - } + return pos - origPos; + } + function decompress(s) { + let result; + if (s.runningState === 0) { + return makeError(s, -25); + } + if (s.runningState < 0) { + return makeError(s, -28); + } + if (s.runningState === 11) { + return makeError(s, -22); + } + if (s.runningState === 1) { + const windowBits = decodeWindowBits(s); + if (windowBits === -1) { + return makeError(s, -11); + } + s.maxRingBufferSize = 1 << windowBits; + s.maxBackwardDistance = s.maxRingBufferSize - 16; + s.runningState = 2; + } + let fence = calculateFence(s); + let ringBufferMask = s.ringBufferSize - 1; + let ringBuffer = s.ringBuffer; + while (s.runningState !== 10) { + switch (s.runningState) { + case 2: + if (s.metaBlockLength < 0) { + return makeError(s, -10); } - } - if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) { - while (true) { - if (readBits(1)) { - valueReady = !inclusionTree.nextLevel(); - if (valueReady) { - codeblock.included = true; - codeblockIncluded = firstTimeInclusion = true; + result = readNextMetablockHeader(s); + if (result < 0) { + return result; + } + fence = calculateFence(s); + ringBufferMask = s.ringBufferSize - 1; + ringBuffer = s.ringBuffer; + continue; + case 3: + result = readMetablockHuffmanCodesAndContextMaps(s); + if (result < 0) { + return result; + } + s.runningState = 4; + continue; + case 4: + if (s.metaBlockLength <= 0) { + s.runningState = 2; + continue; + } + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; + } + } + if (s.commandBlockLength === 0) { + decodeCommandBlockSwitch(s); + } + s.commandBlockLength--; + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const cmdCode = readSymbol(s.commandTreeGroup, s.commandTreeIdx, s) << 2; + const insertAndCopyExtraBits = CMD_LOOKUP[cmdCode]; + const insertLengthOffset = CMD_LOOKUP[cmdCode + 1]; + const copyLengthOffset = CMD_LOOKUP[cmdCode + 2]; + s.distanceCode = CMD_LOOKUP[cmdCode + 3]; + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const insertLengthExtraBits = insertAndCopyExtraBits & 0xFF; + s.insertLength = insertLengthOffset + (insertLengthExtraBits <= 16 ? readFewBits(s, insertLengthExtraBits) : readManyBits(s, insertLengthExtraBits)); + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const copyLengthExtraBits = insertAndCopyExtraBits >> 8; + s.copyLength = copyLengthOffset + (copyLengthExtraBits <= 16 ? readFewBits(s, copyLengthExtraBits) : readManyBits(s, copyLengthExtraBits)); + s.j = 0; + s.runningState = 7; + continue; + case 7: + if (s.trivialLiteralContext !== 0) { + while (s.j < s.insertLength) { + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; + } + } + if (s.literalBlockLength === 0) { + decodeLiteralBlockSwitch(s); + } + s.literalBlockLength--; + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + ringBuffer[s.pos] = readSymbol(s.literalTreeGroup, s.literalTreeIdx, s); + s.pos++; + s.j++; + if (s.pos >= fence) { + s.nextRunningState = 7; + s.runningState = 12; + break; + } + } + } else { + let prevByte1 = ringBuffer[s.pos - 1 & ringBufferMask] & 0xFF; + let prevByte2 = ringBuffer[s.pos - 2 & ringBufferMask] & 0xFF; + while (s.j < s.insertLength) { + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; + } + } + if (s.literalBlockLength === 0) { + decodeLiteralBlockSwitch(s); + } + const literalContext = LOOKUP[s.contextLookupOffset1 + prevByte1] | LOOKUP[s.contextLookupOffset2 + prevByte2]; + const literalTreeIdx = s.contextMap[s.contextMapSlice + literalContext] & 0xFF; + s.literalBlockLength--; + prevByte2 = prevByte1; + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + prevByte1 = readSymbol(s.literalTreeGroup, literalTreeIdx, s); + ringBuffer[s.pos] = prevByte1; + s.pos++; + s.j++; + if (s.pos >= fence) { + s.nextRunningState = 7; + s.runningState = 12; break; } + } + } + if (s.runningState !== 7) { + continue; + } + s.metaBlockLength -= s.insertLength; + if (s.metaBlockLength <= 0) { + s.runningState = 4; + continue; + } + let distanceCode = s.distanceCode; + if (distanceCode < 0) { + s.distance = s.rings[s.distRbIdx]; + } else { + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; + } + } + if (s.distanceBlockLength === 0) { + decodeDistanceBlockSwitch(s); + } + s.distanceBlockLength--; + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + const distTreeIdx = s.distContextMap[s.distContextMapSlice + distanceCode] & 0xFF; + distanceCode = readSymbol(s.distanceTreeGroup, distTreeIdx, s); + if (distanceCode < 16) { + const index = s.distRbIdx + DISTANCE_SHORT_CODE_INDEX_OFFSET[distanceCode] & 0x3; + s.distance = s.rings[index] + DISTANCE_SHORT_CODE_VALUE_OFFSET[distanceCode]; + if (s.distance < 0) { + return makeError(s, -12); + } } else { - inclusionTree.incrementValue(layerNumber); - break; + const extraBits = s.distExtraBits[distanceCode]; + let bits; + if (s.bitOffset + extraBits <= 32) { + bits = readFewBits(s, extraBits); + } else { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + bits = extraBits <= 16 ? readFewBits(s, extraBits) : readManyBits(s, extraBits); + } + s.distance = s.distOffset[distanceCode] + (bits << s.distancePostfixBits); } } - } - } - if (!codeblockIncluded) { - continue; - } - if (firstTimeInclusion) { - zeroBitPlanesTree = precinct.zeroBitPlanesTree; - zeroBitPlanesTree.reset(codeblockColumn, codeblockRow); - while (true) { - if (readBits(1)) { - valueReady = !zeroBitPlanesTree.nextLevel(); - if (valueReady) { - break; + if (s.maxDistance !== s.maxBackwardDistance && s.pos < s.maxBackwardDistance) { + s.maxDistance = s.pos; + } else { + s.maxDistance = s.maxBackwardDistance; + } + if (s.distance > s.maxDistance) { + s.runningState = 9; + continue; + } + if (distanceCode > 0) { + s.distRbIdx = s.distRbIdx + 1 & 0x3; + s.rings[s.distRbIdx] = s.distance; + } + if (s.copyLength > s.metaBlockLength) { + return makeError(s, -9); + } + s.j = 0; + s.runningState = 8; + continue; + case 8: + let src = s.pos - s.distance & ringBufferMask; + let dst = s.pos; + const copyLength = s.copyLength - s.j; + const srcEnd = src + copyLength; + const dstEnd = dst + copyLength; + if (srcEnd < ringBufferMask && dstEnd < ringBufferMask) { + if (copyLength < 12 || srcEnd > dst && dstEnd > src) { + const numQuads = copyLength + 3 >> 2; + for (let k = 0; k < numQuads; ++k) { + ringBuffer[dst++] = ringBuffer[src++]; + ringBuffer[dst++] = ringBuffer[src++]; + ringBuffer[dst++] = ringBuffer[src++]; + ringBuffer[dst++] = ringBuffer[src++]; + } + } else { + ringBuffer.copyWithin(dst, src, srcEnd); } + s.j += copyLength; + s.metaBlockLength -= copyLength; + s.pos += copyLength; } else { - zeroBitPlanesTree.incrementValue(); + while (s.j < s.copyLength) { + ringBuffer[s.pos] = ringBuffer[s.pos - s.distance & ringBufferMask]; + s.metaBlockLength--; + s.pos++; + s.j++; + if (s.pos >= fence) { + s.nextRunningState = 8; + s.runningState = 12; + break; + } + } + } + if (s.runningState === 8) { + s.runningState = 4; + } + continue; + case 9: + result = doUseDictionary(s, fence); + if (result < 0) { + return result; + } + continue; + case 14: + s.pos += copyFromCompoundDictionary(s, fence); + if (s.pos >= fence) { + s.nextRunningState = 14; + s.runningState = 12; + return 2; + } + s.runningState = 4; + continue; + case 5: + while (s.metaBlockLength > 0) { + if (s.halfOffset > 2030) { + result = readMoreInput(s); + if (result < 0) { + return result; + } + } + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + readFewBits(s, 8); + s.metaBlockLength--; + } + s.runningState = 2; + continue; + case 6: + result = copyUncompressedData(s); + if (result < 0) { + return result; } + continue; + case 12: + s.ringBufferBytesReady = Math.min(s.pos, s.ringBufferSize); + s.runningState = 13; + continue; + case 13: + result = writeRingBuffer(s); + if (result !== 0) { + return result; + } + if (s.pos >= s.maxBackwardDistance) { + s.maxDistance = s.maxBackwardDistance; + } + if (s.pos >= s.ringBufferSize) { + if (s.pos > s.ringBufferSize) { + ringBuffer.copyWithin(0, s.ringBufferSize, s.pos); + } + s.pos = s.pos & ringBufferMask; + s.ringBufferBytesWritten = 0; + } + s.runningState = s.nextRunningState; + continue; + default: + return makeError(s, -28); + } + } + if (s.runningState !== 10) { + return makeError(s, -29); + } + if (s.metaBlockLength < 0) { + return makeError(s, -10); + } + result = jumpToByteBoundary(s); + if (result !== 0) { + return result; + } + result = checkHealth(s, 1); + if (result !== 0) { + return result; + } + return 1; + } + function Transforms(numTransforms, prefixSuffixLen, prefixSuffixCount) { + this.numTransforms = 0; + this.triplets = new Int32Array(0); + this.prefixSuffixStorage = new Int8Array(0); + this.prefixSuffixHeads = new Int32Array(0); + this.params = new Int16Array(0); + this.numTransforms = numTransforms; + this.triplets = new Int32Array(numTransforms * 3); + this.params = new Int16Array(numTransforms); + this.prefixSuffixStorage = new Int8Array(prefixSuffixLen); + this.prefixSuffixHeads = new Int32Array(prefixSuffixCount + 1); + } + const RFC_TRANSFORMS = new Transforms(121, 167, 50); + function unpackTransforms(prefixSuffix, prefixSuffixHeads, transforms, prefixSuffixSrc, transformsSrc) { + const prefixSuffixBytes = toUtf8Runes(prefixSuffixSrc); + const n = prefixSuffixBytes.length; + let index = 1; + let j = 0; + for (let i = 0; i < n; ++i) { + const c = prefixSuffixBytes[i]; + if (c === 35) { + prefixSuffixHeads[index++] = j; + } else { + prefixSuffix[j++] = c; + } + } + for (let i = 0; i < 363; ++i) { + transforms[i] = transformsSrc.charCodeAt(i) - 32; + } + } + unpackTransforms(RFC_TRANSFORMS.prefixSuffixStorage, RFC_TRANSFORMS.prefixSuffixHeads, RFC_TRANSFORMS.triplets, "# #s #, #e #.# the #.com/#\xC2\xA0# of # and # in # to #\"#\">#\n#]# for # a # that #. # with #'# from # by #. The # on # as # is #ing #\n\t#:#ed #(# at #ly #=\"# of the #. This #,# not #er #al #='#ful #ive #less #est #ize #ous #", " !! ! , *! &! \" ! ) * * - ! # ! #!*! + ,$ ! - % . / # 0 1 . \" 2 3!* 4% ! # / 5 6 7 8 0 1 & $ 9 + : ; < ' != > ?! 4 @ 4 2 & A *# ( B C& ) % ) !*# *-% A +! *. D! %' & E *6 F G% ! *A *% H! D I!+! J!+ K +- *4! A L!*4 M N +6 O!*% +.! K *G P +%( ! G *D +D Q +# *K!*G!+D!+# +G +A +4!+% +K!+4!*D!+K!*K"); + function transformDictionaryWord(dst, dstOffset, src, srcOffset, wordLen, transforms, transformIndex) { + let offset = dstOffset; + const triplets = transforms.triplets; + const prefixSuffixStorage = transforms.prefixSuffixStorage; + const prefixSuffixHeads = transforms.prefixSuffixHeads; + const transformOffset = 3 * transformIndex; + const prefixIdx = triplets[transformOffset]; + const transformType = triplets[transformOffset + 1]; + const suffixIdx = triplets[transformOffset + 2]; + let prefix = prefixSuffixHeads[prefixIdx]; + const prefixEnd = prefixSuffixHeads[prefixIdx + 1]; + let suffix = prefixSuffixHeads[suffixIdx]; + const suffixEnd = prefixSuffixHeads[suffixIdx + 1]; + let omitFirst = transformType - 11; + let omitLast = transformType; + if (omitFirst < 1 || omitFirst > 9) { + omitFirst = 0; + } + if (omitLast < 1 || omitLast > 9) { + omitLast = 0; + } + while (prefix !== prefixEnd) { + dst[offset++] = prefixSuffixStorage[prefix++]; + } + let len = wordLen; + if (omitFirst > len) { + omitFirst = len; + } + let dictOffset = srcOffset + omitFirst; + len -= omitFirst; + len -= omitLast; + let i = len; + while (i > 0) { + dst[offset++] = src[dictOffset++]; + i--; + } + if (transformType === 10 || transformType === 11) { + let uppercaseOffset = offset - len; + if (transformType === 10) { + len = 1; + } + while (len > 0) { + const c0 = dst[uppercaseOffset] & 0xFF; + if (c0 < 0xC0) { + if (c0 >= 97 && c0 <= 122) { + dst[uppercaseOffset] = dst[uppercaseOffset] ^ 32; + } + uppercaseOffset += 1; + len -= 1; + } else if (c0 < 0xE0) { + dst[uppercaseOffset + 1] = dst[uppercaseOffset + 1] ^ 32; + uppercaseOffset += 2; + len -= 2; + } else { + dst[uppercaseOffset + 2] = dst[uppercaseOffset + 2] ^ 5; + uppercaseOffset += 3; + len -= 3; + } + } + } else if (transformType === 21 || transformType === 22) { + let shiftOffset = offset - len; + const param = transforms.params[transformIndex]; + let scalar = (param & 0x7FFF) + (0x1000000 - (param & 0x8000)); + while (len > 0) { + let step = 1; + const c0 = dst[shiftOffset] & 0xFF; + if (c0 < 0x80) { + scalar += c0; + dst[shiftOffset] = scalar & 0x7F; + } else if (c0 < 0xC0) {} else if (c0 < 0xE0) { + if (len >= 2) { + const c1 = dst[shiftOffset + 1]; + scalar += c1 & 0x3F | (c0 & 0x1F) << 6; + dst[shiftOffset] = 0xC0 | scalar >> 6 & 0x1F; + dst[shiftOffset + 1] = c1 & 0xC0 | scalar & 0x3F; + step = 2; + } else { + step = len; + } + } else if (c0 < 0xF0) { + if (len >= 3) { + const c1 = dst[shiftOffset + 1]; + const c2 = dst[shiftOffset + 2]; + scalar += c2 & 0x3F | (c1 & 0x3F) << 6 | (c0 & 0x0F) << 12; + dst[shiftOffset] = 0xE0 | scalar >> 12 & 0x0F; + dst[shiftOffset + 1] = c1 & 0xC0 | scalar >> 6 & 0x3F; + dst[shiftOffset + 2] = c2 & 0xC0 | scalar & 0x3F; + step = 3; + } else { + step = len; + } + } else if (c0 < 0xF8) { + if (len >= 4) { + const c1 = dst[shiftOffset + 1]; + const c2 = dst[shiftOffset + 2]; + const c3 = dst[shiftOffset + 3]; + scalar += c3 & 0x3F | (c2 & 0x3F) << 6 | (c1 & 0x3F) << 12 | (c0 & 0x07) << 18; + dst[shiftOffset] = 0xF0 | scalar >> 18 & 0x07; + dst[shiftOffset + 1] = c1 & 0xC0 | scalar >> 12 & 0x3F; + dst[shiftOffset + 2] = c2 & 0xC0 | scalar >> 6 & 0x3F; + dst[shiftOffset + 3] = c3 & 0xC0 | scalar & 0x3F; + step = 4; + } else { + step = len; + } + } + shiftOffset += step; + len -= step; + if (transformType === 21) { + len = 0; } - codeblock.zeroBitPlanes = zeroBitPlanesTree.value; } - const codingpasses = readCodingpasses(); - while (readBits(1)) { - codeblock.Lblock++; + } + while (suffix !== suffixEnd) { + dst[offset++] = prefixSuffixStorage[suffix++]; + } + return offset - dstOffset; + } + function getNextKey(key, len) { + let step = 1 << len - 1; + while ((key & step) !== 0) { + step = step >> 1; + } + return (key & step - 1) + step; + } + function replicateValue(table, offset, step, end, item) { + let pos = end; + while (pos > 0) { + pos -= step; + table[offset + pos] = item; + } + } + function nextTableBitSize(count, len, rootBits) { + let bits = len; + let left = 1 << bits - rootBits; + while (bits < 15) { + left -= count[bits]; + if (left <= 0) { + break; } - const codingpassesLog2 = log2(codingpasses); - const bits = (codingpasses < 1 << codingpassesLog2 ? codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock; - const codedDataLength = readBits(bits); - queue.push({ - codeblock, - codingpasses, - dataLength: codedDataLength - }); + bits++; + left = left << 1; } - alignToByte(); - if (ephMarkerUsed) { - skipMarkerIfEqual(0x92); + return bits - rootBits; + } + function buildHuffmanTable(tableGroup, tableIdx, rootBits, codeLengths, codeLengthsSize) { + const tableOffset = tableGroup[tableIdx]; + const sorted = new Int32Array(codeLengthsSize); + const count = new Int32Array(16); + const offset = new Int32Array(16); + for (let sym = 0; sym < codeLengthsSize; ++sym) { + count[codeLengths[sym]]++; } - while (queue.length > 0) { - const packetItem = queue.shift(); - codeblock = packetItem.codeblock; - if (codeblock.data === undefined) { - codeblock.data = []; + offset[1] = 0; + for (let len = 1; len < 15; ++len) { + offset[len + 1] = offset[len] + count[len]; + } + for (let sym = 0; sym < codeLengthsSize; ++sym) { + if (codeLengths[sym] !== 0) { + sorted[offset[codeLengths[sym]]++] = sym; } - codeblock.data.push({ - data, - start: offset + position, - end: offset + position + packetItem.dataLength, - codingpasses: packetItem.codingpasses - }); - position += packetItem.dataLength; - } - } - return position; -} -function copyCoefficients(coefficients, levelWidth, levelHeight, subband, delta, mb, reversible, segmentationSymbolUsed, resetContextProbabilities) { - const x0 = subband.tbx0; - const y0 = subband.tby0; - const width = subband.tbx1 - subband.tbx0; - const codeblocks = subband.codeblocks; - const right = subband.type.charAt(0) === "H" ? 1 : 0; - const bottom = subband.type.charAt(1) === "H" ? levelWidth : 0; - for (let i = 0, ii = codeblocks.length; i < ii; ++i) { - const codeblock = codeblocks[i]; - const blockWidth = codeblock.tbx1_ - codeblock.tbx0_; - const blockHeight = codeblock.tby1_ - codeblock.tby0_; - if (blockWidth === 0 || blockHeight === 0) { - continue; } - if (codeblock.data === undefined) { - continue; + let tableBits = rootBits; + let tableSize = 1 << tableBits; + let totalSize = tableSize; + if (offset[15] === 1) { + for (let k = 0; k < totalSize; ++k) { + tableGroup[tableOffset + k] = sorted[0]; + } + return totalSize; } - const bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType, codeblock.zeroBitPlanes, mb); - let currentCodingpassType = 2; - const data = codeblock.data; - let totalLength = 0, - codingpasses = 0; - let j, jj, dataItem; - for (j = 0, jj = data.length; j < jj; j++) { - dataItem = data[j]; - totalLength += dataItem.end - dataItem.start; - codingpasses += dataItem.codingpasses; - } - const encodedData = new Uint8Array(totalLength); - let position = 0; - for (j = 0, jj = data.length; j < jj; j++) { - dataItem = data[j]; - const chunk = dataItem.data.subarray(dataItem.start, dataItem.end); - encodedData.set(chunk, position); - position += chunk.length; - } - const decoder = new ArithmeticDecoder(encodedData, 0, totalLength); - bitModel.setDecoder(decoder); - for (j = 0; j < codingpasses; j++) { - switch (currentCodingpassType) { - case 0: - bitModel.runSignificancePropagationPass(); - break; - case 1: - bitModel.runMagnitudeRefinementPass(); - break; - case 2: - bitModel.runCleanupPass(); - if (segmentationSymbolUsed) { - bitModel.checkSegmentationSymbol(); - } - break; + let key = 0; + let symbol = 0; + let step = 1; + for (let len = 1; len <= rootBits; ++len) { + step = step << 1; + while (count[len] > 0) { + replicateValue(tableGroup, tableOffset + key, step, tableSize, len << 16 | sorted[symbol++]); + key = getNextKey(key, len); + count[len]--; } - if (resetContextProbabilities) { - bitModel.reset(); - } - currentCodingpassType = (currentCodingpassType + 1) % 3; - } - let offset = codeblock.tbx0_ - x0 + (codeblock.tby0_ - y0) * width; - const sign = bitModel.coefficentsSign; - const magnitude = bitModel.coefficentsMagnitude; - const bitsDecoded = bitModel.bitsDecoded; - const magnitudeCorrection = reversible ? 0 : 0.5; - let k, n, nb; - position = 0; - const interleave = subband.type !== "LL"; - for (j = 0; j < blockHeight; j++) { - const row = offset / width | 0; - const levelOffset = 2 * row * (levelWidth - width) + right + bottom; - for (k = 0; k < blockWidth; k++) { - n = magnitude[position]; - if (n !== 0) { - n = (n + magnitudeCorrection) * delta; - if (sign[position] !== 0) { - n = -n; - } - nb = bitsDecoded[position]; - const pos = interleave ? levelOffset + (offset << 1) : offset; - coefficients[pos] = reversible && nb >= mb ? n : n * (1 << mb - nb); + } + const mask = totalSize - 1; + let low = -1; + let currentOffset = tableOffset; + step = 1; + for (let len = rootBits + 1; len <= 15; ++len) { + step = step << 1; + while (count[len] > 0) { + if ((key & mask) !== low) { + currentOffset += tableSize; + tableBits = nextTableBitSize(count, len, rootBits); + tableSize = 1 << tableBits; + totalSize += tableSize; + low = key & mask; + tableGroup[tableOffset + low] = tableBits + rootBits << 16 | currentOffset - tableOffset - low; } + replicateValue(tableGroup, currentOffset + (key >> rootBits), step, tableSize, len - rootBits << 16 | sorted[symbol++]); + key = getNextKey(key, len); + count[len]--; + } + } + return totalSize; + } + function readMoreInput(s) { + if (s.endOfStreamReached !== 0) { + if (halfAvailable(s) >= -2) { + return 0; + } + return makeError(s, -16); + } + const readOffset = s.halfOffset << 1; + let bytesInBuffer = 4096 - readOffset; + s.byteBuffer.copyWithin(0, readOffset, 4096); + s.halfOffset = 0; + while (bytesInBuffer < 4096) { + const spaceLeft = 4096 - bytesInBuffer; + const len = readInput(s, s.byteBuffer, bytesInBuffer, spaceLeft); + if (len < -1) { + return len; + } + if (len <= 0) { + s.endOfStreamReached = 1; + s.tailBytes = bytesInBuffer; + bytesInBuffer += 1; + break; + } + bytesInBuffer += len; + } + bytesToNibbles(s, bytesInBuffer); + return 0; + } + function checkHealth(s, endOfStream) { + if (s.endOfStreamReached === 0) { + return 0; + } + const byteOffset = (s.halfOffset << 1) + (s.bitOffset + 7 >> 3) - 4; + if (byteOffset > s.tailBytes) { + return makeError(s, -13); + } + if (endOfStream !== 0 && byteOffset !== s.tailBytes) { + return makeError(s, -17); + } + return 0; + } + function readFewBits(s, n) { + const v = s.accumulator32 >>> s.bitOffset & (1 << n) - 1; + s.bitOffset += n; + return v; + } + function readManyBits(s, n) { + const low = readFewBits(s, 16); + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + return low | readFewBits(s, n - 16) << 16; + } + function initBitReader(s) { + s.byteBuffer = new Int8Array(4160); + s.accumulator32 = 0; + s.shortBuffer = new Int16Array(2080); + s.bitOffset = 32; + s.halfOffset = 2048; + s.endOfStreamReached = 0; + return prepare(s); + } + function prepare(s) { + if (s.halfOffset > 2030) { + const result = readMoreInput(s); + if (result !== 0) { + return result; + } + } + let health = checkHealth(s, 0); + if (health !== 0) { + return health; + } + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + return 0; + } + function reload(s) { + if (s.bitOffset === 32) { + return prepare(s); + } + return 0; + } + function jumpToByteBoundary(s) { + const padding = 32 - s.bitOffset & 7; + if (padding !== 0) { + const paddingBits = readFewBits(s, padding); + if (paddingBits !== 0) { + return makeError(s, -5); + } + } + return 0; + } + function halfAvailable(s) { + let limit = 2048; + if (s.endOfStreamReached !== 0) { + limit = s.tailBytes + 1 >> 1; + } + return limit - s.halfOffset; + } + function copyRawBytes(s, data, offset, length) { + let pos = offset; + let len = length; + if ((s.bitOffset & 7) !== 0) { + return makeError(s, -30); + } + while (s.bitOffset !== 32 && len !== 0) { + data[pos++] = s.accumulator32 >>> s.bitOffset; + s.bitOffset += 8; + len--; + } + if (len === 0) { + return 0; + } + const copyNibbles = Math.min(halfAvailable(s), len >> 1); + if (copyNibbles > 0) { + const readOffset = s.halfOffset << 1; + const delta = copyNibbles << 1; + data.set(s.byteBuffer.subarray(readOffset, readOffset + delta), pos); + pos += delta; + len -= delta; + s.halfOffset += copyNibbles; + } + if (len === 0) { + return 0; + } + if (halfAvailable(s) > 0) { + if (s.bitOffset >= 16) { + s.accumulator32 = s.shortBuffer[s.halfOffset++] << 16 | s.accumulator32 >>> 16; + s.bitOffset -= 16; + } + while (len !== 0) { + data[pos++] = s.accumulator32 >>> s.bitOffset; + s.bitOffset += 8; + len--; + } + return checkHealth(s, 0); + } + while (len > 0) { + const chunkLen = readInput(s, data, pos, len); + if (chunkLen < -1) { + return chunkLen; + } + if (chunkLen <= 0) { + return makeError(s, -16); + } + pos += chunkLen; + len -= chunkLen; + } + return 0; + } + function bytesToNibbles(s, byteLen) { + const byteBuffer = s.byteBuffer; + const halfLen = byteLen >> 1; + const shortBuffer = s.shortBuffer; + for (let i = 0; i < halfLen; ++i) { + shortBuffer[i] = byteBuffer[i * 2] & 0xFF | (byteBuffer[i * 2 + 1] & 0xFF) << 8; + } + } + const LOOKUP = new Int32Array(2048); + function unpackLookupTable(lookup, utfMap, utfRle) { + for (let i = 0; i < 256; ++i) { + lookup[i] = i & 0x3F; + lookup[512 + i] = i >> 2; + lookup[1792 + i] = 2 + (i >> 6); + } + for (let i = 0; i < 128; ++i) { + lookup[1024 + i] = 4 * (utfMap.charCodeAt(i) - 32); + } + for (let i = 0; i < 64; ++i) { + lookup[1152 + i] = i & 1; + lookup[1216 + i] = 2 + (i & 1); + } + let offset = 1280; + for (let k = 0; k < 19; ++k) { + const value = k & 3; + const rep = utfRle.charCodeAt(k) - 32; + for (let i = 0; i < rep; ++i) { + lookup[offset++] = value; + } + } + for (let i = 0; i < 16; ++i) { + lookup[1792 + i] = 1; + lookup[2032 + i] = 6; + } + lookup[1792] = 0; + lookup[2047] = 7; + for (let i = 0; i < 256; ++i) { + lookup[1536 + i] = lookup[1792 + i] << 3; + } + } + unpackLookupTable(LOOKUP, " !! ! \"#$##%#$&'##(#)#++++++++++((&*'##,---,---,-----,-----,-----&#'###.///.///./////./////./////&#'# ", "A/* ': & : $ \x81 @"); + function State() { + this.ringBuffer = new Int8Array(0); + this.contextModes = new Int8Array(0); + this.contextMap = new Int8Array(0); + this.distContextMap = new Int8Array(0); + this.distExtraBits = new Int8Array(0); + this.output = new Int8Array(0); + this.byteBuffer = new Int8Array(0); + this.shortBuffer = new Int16Array(0); + this.intBuffer = new Int32Array(0); + this.rings = new Int32Array(0); + this.blockTrees = new Int32Array(0); + this.literalTreeGroup = new Int32Array(0); + this.commandTreeGroup = new Int32Array(0); + this.distanceTreeGroup = new Int32Array(0); + this.distOffset = new Int32Array(0); + this.accumulator64 = 0; + this.runningState = 0; + this.nextRunningState = 0; + this.accumulator32 = 0; + this.bitOffset = 0; + this.halfOffset = 0; + this.tailBytes = 0; + this.endOfStreamReached = 0; + this.metaBlockLength = 0; + this.inputEnd = 0; + this.isUncompressed = 0; + this.isMetadata = 0; + this.literalBlockLength = 0; + this.numLiteralBlockTypes = 0; + this.commandBlockLength = 0; + this.numCommandBlockTypes = 0; + this.distanceBlockLength = 0; + this.numDistanceBlockTypes = 0; + this.pos = 0; + this.maxDistance = 0; + this.distRbIdx = 0; + this.trivialLiteralContext = 0; + this.literalTreeIdx = 0; + this.commandTreeIdx = 0; + this.j = 0; + this.insertLength = 0; + this.contextMapSlice = 0; + this.distContextMapSlice = 0; + this.contextLookupOffset1 = 0; + this.contextLookupOffset2 = 0; + this.distanceCode = 0; + this.numDirectDistanceCodes = 0; + this.distancePostfixBits = 0; + this.distance = 0; + this.copyLength = 0; + this.maxBackwardDistance = 0; + this.maxRingBufferSize = 0; + this.ringBufferSize = 0; + this.expectedTotalSize = 0; + this.outputOffset = 0; + this.outputLength = 0; + this.outputUsed = 0; + this.ringBufferBytesWritten = 0; + this.ringBufferBytesReady = 0; + this.isEager = 0; + this.isLargeWindow = 0; + this.cdNumChunks = 0; + this.cdTotalSize = 0; + this.cdBrIndex = 0; + this.cdBrOffset = 0; + this.cdBrLength = 0; + this.cdBrCopied = 0; + this.cdChunks = new Array(0); + this.cdChunkOffsets = new Int32Array(0); + this.cdBlockBits = 0; + this.cdBlockMap = new Int8Array(0); + this.input = new InputStream(new Int8Array(0)); + this.ringBuffer = new Int8Array(0); + this.rings = new Int32Array(10); + this.rings[0] = 16; + this.rings[1] = 15; + this.rings[2] = 11; + this.rings[3] = 4; + } + let data = new Int8Array(0); + const offsets = new Int32Array(32); + const sizeBits = new Int32Array(32); + function setData(newData, newSizeBits) { + const dictionaryOffsets = offsets; + const dictionarySizeBits = sizeBits; + for (let i = 0; i < newSizeBits.length; ++i) { + dictionarySizeBits[i] = newSizeBits[i]; + } + let pos = 0; + for (let i = 0; i < newSizeBits.length; ++i) { + dictionaryOffsets[i] = pos; + const bits = dictionarySizeBits[i]; + if (bits !== 0) { + pos += i << (bits & 31); + } + } + for (let i = newSizeBits.length; i < 32; ++i) { + dictionaryOffsets[i] = pos; + } + data = newData; + } + function unpackDictionaryData(dictionary, data0, data1, skipFlip, sizeBits, sizeBitsData) { + const dict = toUsAsciiBytes(data0 + data1); + const skipFlipRunes = toUtf8Runes(skipFlip); + let offset = 0; + const n = skipFlipRunes.length >> 1; + for (let i = 0; i < n; ++i) { + const skip = skipFlipRunes[2 * i] - 36; + const flip = skipFlipRunes[2 * i + 1] - 36; + for (let j = 0; j < skip; ++j) { + dict[offset] = dict[offset] ^ 3; offset++; - position++; } - offset += width - blockWidth; + for (let j = 0; j < flip; ++j) { + dict[offset] = dict[offset] ^ 236; + offset++; + } + } + for (let i = 0; i < sizeBitsData.length; ++i) { + sizeBits[i] = sizeBitsData.charCodeAt(i) - 65; + } + dictionary.set(dict); + } + const dictionaryData = new Int8Array(122784); + const dictionarySizeBits = new Int32Array(25); + unpackDictionaryData(dictionaryData, "wjnfgltmojefofewab`h`lgfgbwbpkltlmozpjwf`jwzlsfmivpwojhfeqfftlqhwf{wzfbqlufqalgzolufelqnallhsobzojufojmfkfosklnfpjgfnlqftlqgolmdwkfnujftejmgsbdfgbzpevookfbgwfqnfb`kbqfbeqlnwqvfnbqhbaofvslmkjdkgbwfobmgmftpfufmmf{w`bpfalwkslpwvpfgnbgfkbmgkfqftkbwmbnfOjmhaoldpjyfabpfkfognbhfnbjmvpfq$*#(klogfmgptjwkMftpqfbgtfqfpjdmwbhfkbufdbnfpffm`boosbwktfoosovpnfmvejonsbqwiljmwkjpojpwdllgmffgtbzptfpwilapnjmgboploldlqj`kvpfpobpwwfbnbqnzellghjmdtjoofbpwtbqgafpwejqfSbdfhmltbtbz-smdnlufwkbmolbgdjufpfoemlwfnv`keffgnbmzql`hj`lmlm`follhkjgfgjfgKlnfqvofklpwbib{jmel`ovaobtpofppkboeplnfpv`kylmf233&lmfp`bqfWjnfqb`faovfelvqtffheb`fklsfdbufkbqgolpwtkfmsbqhhfswsbpppkjsqllnKWNOsobmWzsfglmfpbufhffseobdojmhplogejufwllhqbwfwltmivnswkvpgbqh`bqgejofefbqpwbzhjoowkbweboobvwlfufq-`lnwbohpklsulwfgffsnlgfqfpwwvqmalqmabmgefooqlpfvqo+phjmqlof`lnfb`wpbdfpnffwdlog-isdjwfnubqzefowwkfmpfmggqlsUjft`lsz2-3!?,b=pwlsfopfojfpwlvqsb`h-djesbpw`pp!pfwp6s{8-ip<73s{je#+pllmpfbwmlmfwvafyfqlpfmwqffgeb`wjmwldjewkbqn2;s{`bnfkjooalogyllnuljgfbpzqjmdejoosfbhjmjw`lpw0s{8ib`hwbdpajwpqloofgjwhmftmfbq?\"..dqltIPLMgvwzMbnfpbofzlv#olwpsbjmibyy`logfzfpejpkttt-qjphwbapsqfu23s{qjpf16s{Aovfgjmd033/abooelqgfbqmtjogal{-ebjqob`hufqpsbjqivmfwf`kje+\"sj`hfujo'+! tbqnolqgglfpsvoo/333jgfbgqbtkvdfpslwevmgavqmkqfe`foohfzpwj`hklvqolppevfo21s{pvjwgfboQPP!bdfgdqfzDFW!fbpfbjnpdjqobjgp;s{8mbuzdqjgwjsp :::tbqpobgz`bqp*8#~sksolpfmvooubpwtjmgQPP#tfbqqfozaffmpbnfgvhfmbpb`bsftjpkdvoeW109kjwppolwdbwfhj`haovqwkfz26s{$$*8*8!=npjftjmpajqgplqwafwbpffhW2;9lqgpwqffnboo53s{ebqn\x0ElupalzpX3^-$*8!SLPWafbqhjgp*8~~nbqzwfmg+VH*rvbgyk9\n.pjy....sqls$*8\x0EojewW2:9uj`fbmgzgfaw=QPPsllomf`haoltW259gllqfuboW249ofwpebjolqbosloomlub`lopdfmf#\x0Elxplewqlnfwjooqlpp?k0=slvqebgfsjmh?wq=njmj*\x7F\"+njmfyk9\x04abqpkfbq33*8njoh#..=jqlmeqfggjphtfmwpljosvwp,ip,klozW119JPAMW139bgbnpffp?k1=iplm$/#$`lmwW129#QPPollsbpjbnllm?,s=plvoOJMFelqw`bqwW279?k2=;3s{\"..?:s{8W379njhf975Ymj`fjm`kZlqhqj`fyk9\b$**8svqfnbdfsbqbwlmfalmg904Y\\le\\$^*8333/yk9\x0Bwbmhzbqgaltoavpk965YIbub03s{\t\x7F~\t&@0&907YifeeF[SJ`bpkujpbdloepmltyk9\x05rvfq-`pppj`hnfbwnjm-ajmggfookjqfsj`pqfmw905YKWWS.132elwltloeFMG#{al{967YALGZgj`h8\t~\tf{jw906Yubqpafbw$~*8gjfw:::8bmmf~~?,Xj^-Obmdhn.^tjqfwlzpbggppfbobof{8\t\n~f`klmjmf-lqd336*wlmziftppbmgofdpqlle333*#133tjmfdfbqgldpallwdbqz`vwpwzofwfnswjlm-{no`l`hdbmd'+$-63s{Sk-Gnjp`bobmolbmgfphnjofqzbmvmj{gjp`*8~\tgvpw`ojs*-\t\t43s{.133GUGp4^=?wbsfgfnlj((*tbdffvqlskjolswpklofEBRpbpjm.15WobapsfwpVQO#avoh`llh8~\x0E\tKFBGX3^*baaqivbm+2:;ofpkwtjm?,j=plmzdvzpev`hsjsf\x7F.\t\"331*mgltX2^8X^8\tOld#pbow\x0E\t\n\nabmdwqjnabwk*x\x0E\t33s{\t~*8hl9\0effpbg=\x0Ep9,,#X^8wloosovd+*x\tx\x0E\t#-ip$133sgvboalbw-ISD*8\t~rvlw*8\t\t$*8\t\x0E\t~\x0E1327132613251324132;132:13131312131113101317131613151314131;131:130313021301130013071306130513041320132113221323133:133;133413351336133713301331133213332:::2::;2::42::52::62::72::02::12::22::32:;:2:;;2:;42:;52:;62:;72:;02:;12:;22:;32:4:2:4;2:442:452:462:472:402:412:422:432:5:2:5;2:542:552:562:572:502:512:522:532:6:2:6;2:642:652:662:672:602:612:622:632333231720:73333::::`lnln/Mpfpwffpwbsfqlwlglkb`f`bgbb/]lajfmg/Abbp/Aujgb`bpllwqlelqlplollwqb`vbogjilpjgldqbmwjslwfnbgfafbodlrv/Efpwlmbgbwqfpsl`l`bpbabilwlgbpjmlbdvbsvfpvmlpbmwfgj`fovjpfoobnbzlylmbbnlqsjpllaqb`oj`foolgjlpklqb`bpj<[<\\!sbqhpnlvpfNlpw#---?,bnlmdaqbjmalgz#mlmf8abpfg`bqqzgqbewqfefqsbdf\\klnf-nfwfqgfobzgqfbnsqlufiljmw?,wq=gqvdp?\"..#bsqjojgfboboofmf{b`welqwk`lgfpoldj`Ujft#pffnpaobmhslqwp#+133pbufg\\ojmhdlbopdqbmwdqffhklnfpqjmdpqbwfg03s{8tklpfsbqpf+*8!#Aol`hojmv{ilmfpsj{fo$*8!=*8je+.ofewgbujgklqpfEl`vpqbjpfal{fpWqb`hfnfmw?,fn=abq!=-pq`>wltfqbow>!`baofkfmqz17s{8pfwvsjwbozpkbqsnjmlqwbpwftbmwpwkjp-qfpfwtkffodjqop,`pp,233&8`ovappwveeajaofulwfp#2333hlqfb~*8\x0E\tabmgprvfvf>#x~8;3s{8`hjmdx\x0E\t\n\nbkfbg`ol`hjqjpkojhf#qbwjlpwbwpElqn!zbkll*X3^8Balvwejmgp?,k2=gfavdwbphpVQO#>`foop~*+*821s{8sqjnfwfoopwvqmp3{533-isd!psbjmafb`kwb{fpnj`qlbmdfo..=?,djewppwfuf.ojmhalgz-~*8\t\nnlvmw#+2::EBR?,qldfqeqbmh@obpp1;s{8effgp?k2=?p`lwwwfpwp11s{8gqjmh*#\x7F\x7F#oftjppkboo 30:8#elq#olufgtbpwf33s{8ib9\x0Fnpjnlm?elmwqfsoznffwpvmwfq`kfbswjdkwAqbmg*#\">#gqfpp`ojspqllnplmhfznlajonbjm-Mbnf#sobwfevmmzwqffp`ln,!2-isdtnlgfsbqbnPWBQWofew#jggfm/#132*8\t~\telqn-ujqvp`kbjqwqbmptlqpwSbdfpjwjlmsbw`k?\"..\tl.`b`ejqnpwlvqp/333#bpjbmj((*xbglaf$*X3^jg>23alwk8nfmv#-1-nj-smd!hfujm`lb`k@kjogaqv`f1-isdVQO*(-isd\x7Fpvjwfpoj`fkbqqz213!#ptffwwq=\x0E\tmbnf>gjfdlsbdf#ptjpp..=\t\t eee8!=Old-`ln!wqfbwpkffw*#%%#27s{8poffsmwfmwejofgib9\x0Fojg>!`Mbnf!tlqpfpklwp.al{.gfowb\t%ow8afbqp97;Y?gbwb.qvqbo?,b=#psfmgabhfqpklsp>#!!8sks!=`wjlm20s{8aqjbmkfoolpjyf>l>&1E#iljmnbzaf?jnd#jnd!=/#eipjnd!#!*X3^NWlsAWzsf!mftozGbmph`yf`kwqbjohmltp?,k6=ebr!=yk.`m23*8\t.2!*8wzsf>aovfpwqvozgbujp-ip$8=\x0E\t?\"pwffo#zlv#k1=\x0E\telqn#ifpvp233&#nfmv-\x0E\t\n\x0E\ttbofpqjphpvnfmwggjmda.ojhwfb`kdje!#ufdbpgbmphffpwjpkrjspvlnjplaqfgfpgffmwqfwlglpsvfgfb/]lpfpw/Mwjfmfkbpwblwqlpsbqwfglmgfmvfulkb`fqelqnbnjpnlnfilqnvmglbrv/Ag/Abpp/_olbzvgbef`kbwlgbpwbmwlnfmlpgbwlplwqbppjwjlnv`klbklqbovdbqnbzlqfpwlpklqbpwfmfqbmwfpelwlpfpwbpsb/Apmvfubpbovgelqlpnfgjlrvjfmnfpfpslgfq`kjofpfq/Muf`fpgf`jqilp/Efpwbqufmwbdqvslkf`klfoolpwfmdlbnjdl`lpbpmjufodfmwfnjpnbbjqfpivojlwfnbpkb`jbebulqivmjlojaqfsvmwlavfmlbvwlqbaqjoavfmbwf{wlnbqylpbafqojpwbovfdl`/_nlfmfqlivfdlsfq/Vkbafqfpwlzmvm`bnvifqubolqevfqbojaqldvpwbjdvboulwlp`bplpdv/Absvfglplnlpbujplvpwfggfafmml`kfavp`bebowbfvqlppfqjfgj`kl`vqpl`obuf`bpbpof/_msobylobqdllaqbpujpwbbslzlivmwlwqbwbujpwl`qfbq`bnslkfnlp`jm`l`bqdlsjplplqgfmkb`fm/Mqfbgjp`lsfgql`fq`bsvfgbsbsfonfmlq/Vwjo`obqlilqdf`boofslmfqwbqgfmbgjfnbq`bpjdvffoobppjdol`l`kfnlwlpnbgqf`obpfqfpwlmj/]lrvfgbsbpbqabm`lkjilpujbifsbaol/Epwfujfmfqfjmlgfibqelmgl`bmbomlqwfofwqb`bvpbwlnbqnbmlpovmfpbvwlpujoobufmglsfpbqwjslpwfmdbnbq`loofubsbgqfvmjglubnlpylmbpbnalpabmgbnbqjbbavplnv`kbpvajqqjlibujujqdqbgl`kj`bboo/Ailufmgj`kbfpwbmwbofppbojqpvfolsfplpejmfpoobnbavp`l/Epwboofdbmfdqlsobybkvnlqsbdbqivmwbglaofjpobpalopbab/]lkbaobov`kb/mqfbgj`fmivdbqmlwbpuboofboo/M`bqdbglolqbabilfpw/Edvpwlnfmwfnbqjlejqnb`lpwlej`kbsobwbkldbqbqwfpofzfpbrvfonvpflabpfpsl`lpnjwbg`jfol`kj`lnjfgldbmbqpbmwlfwbsbgfafpsobzbqfgfppjfwf`lqwf`lqfbgvgbpgfpflujfilgfpfbbdvbp%rvlw8glnbjm`lnnlmpwbwvpfufmwpnbpwfqpzpwfnb`wjlmabmmfqqfnlufp`qloovsgbwfdolabonfgjvnejowfqmvnafq`kbmdfqfpvowsvaoj`p`qffm`kllpfmlqnbowqbufojppvfpplvq`fwbqdfwpsqjmdnlgvofnlajofptjw`ksklwlpalqgfqqfdjlmjwpfoepl`jbob`wjuf`lovnmqf`lqgelooltwjwof=fjwkfqofmdwkebnjozeqjfmgobzlvwbvwklq`qfbwfqfujftpvnnfqpfqufqsobzfgsobzfqf{sbmgsloj`zelqnbwglvaofsljmwppfqjfpsfqplmojujmdgfpjdmnlmwkpelq`fpvmjrvftfjdkwsflsoffmfqdzmbwvqfpfbq`kejdvqfkbujmd`vpwlnleepfwofwwfqtjmgltpvanjwqfmgfqdqlvspvsolbgkfbowknfwklgujgflpp`klloevwvqfpkbgltgfabwfubovfpLaif`wlwkfqpqjdkwpofbdvf`kqlnfpjnsofmlwj`fpkbqfgfmgjmdpfbplmqfslqwlmojmfprvbqfavwwlmjnbdfpfmbaofnlujmdobwfpwtjmwfqEqbm`fsfqjlgpwqlmdqfsfbwOlmglmgfwbjoelqnfggfnbmgpf`vqfsbppfgwlddofsob`fpgfuj`fpwbwj``jwjfppwqfbnzfooltbwwb`hpwqffweojdkwkjggfmjmel!=lsfmfgvpfevouboofz`bvpfpofbgfqpf`qfwpf`lmggbnbdfpslqwpf{`fswqbwjmdpjdmfgwkjmdpfeef`wejfogppwbwfpleej`fujpvbofgjwlqulovnfQfslqwnvpfvnnlujfpsbqfmwb``fppnlpwoznlwkfq!#jg>!nbqhfwdqlvmg`kbm`fpvqufzafelqfpznalonlnfmwpsff`knlwjlmjmpjgfnbwwfq@fmwfqlaif`wf{jpwpnjggofFvqlsfdqltwkofdb`znbmmfqfmlvdk`bqffqbmptfqlqjdjmslqwbo`ojfmwpfof`wqbmgln`olpfgwlsj`p`lnjmdebwkfqlswjlmpjnsozqbjpfgfp`bsf`klpfm`kvq`kgfejmfqfbplm`lqmfqlvwsvwnfnlqzjeqbnfsloj`fnlgfopMvnafqgvqjmdleefqppwzofphjoofgojpwfg`boofgpjoufqnbqdjmgfofwfafwwfqaqltpfojnjwpDolabopjmdoftjgdfw`fmwfqavgdfwmltqbs`qfgjw`objnpfmdjmfpbefwz`klj`fpsjqjw.pwzofpsqfbgnbhjmdmffgfgqvppjbsofbpff{wfmwP`qjswaqlhfmbooltp`kbqdfgjujgfeb`wlqnfnafq.abpfgwkflqz`lmejdbqlvmgtlqhfgkfosfg@kvq`kjnsb`wpklvogbotbzpoldl!#alwwlnojpw!=*xubq#sqfej{lqbmdfKfbgfq-svpk+`lvsofdbqgfmaqjgdfobvm`kQfujftwbhjmdujpjlmojwwofgbwjmdAvwwlmafbvwzwkfnfpelqdlwPfbq`kbm`klqbonlpwolbgfg@kbmdfqfwvqmpwqjmdqfolbgNlajofjm`lnfpvssozPlvq`flqgfqpujftfg%maps8`lvqpfBalvw#jpobmg?kwno#`llhjfmbnf>!bnbylmnlgfqmbguj`fjm?,b=9#Wkf#gjboldklvpfpAFDJM#Nf{j`lpwbqwp`fmwqfkfjdkwbggjmdJpobmgbppfwpFnsjqfP`kllofeelqwgjqf`wmfbqoznbmvboPfof`w-\t\tLmfiljmfgnfmv!=SkjojsbtbqgpkbmgofjnslqwLeej`fqfdbqgphjoopmbwjlmPslqwpgfdqfftffhoz#+f-d-afkjmggl`wlqolddfgvmjwfg?,a=?,afdjmpsobmwpbppjpwbqwjpwjppvfg033s{\x7F`bmbgbbdfm`zp`kfnfqfnbjmAqbyjopbnsofoldl!=afzlmg.p`bofb``fswpfqufgnbqjmfEllwfq`bnfqb?,k2=\t\\elqn!ofbufppwqfpp!#,=\x0E\t-dje!#lmolbgolbgfqL{elqgpjpwfqpvqujuojpwfmefnbofGfpjdmpjyf>!bssfbowf{w!=ofufopwkbmhpkjdkfqelq`fgbmjnbobmzlmfBeqj`bbdqffgqf`fmwSflsof?aq#,=tlmgfqsqj`fpwvqmfg\x7F\x7F#x~8nbjm!=jmojmfpvmgbztqbs!=ebjofg`fmpvpnjmvwfafb`lmrvlwfp263s{\x7Ffpwbwfqfnlwffnbjo!ojmhfgqjdkw8pjdmboelqnbo2-kwnopjdmvssqjm`feolbw9-smd!#elqvn-B``fppsbsfqpplvmgpf{wfmgKfjdkwpojgfqVWE.;!%bns8#Afelqf-#TjwkpwvgjlltmfqpnbmbdfsqlejwiRvfqzbmmvbosbqbnpalvdkwebnlvpdlldofolmdfqj((*#xjpqbfopbzjmdgf`jgfklnf!=kfbgfqfmpvqfaqbm`ksjf`fpaol`h8pwbwfgwls!=?qb`jmdqfpjyf..%dw8sb`jwzpf{vboavqfbv-isd!#23/333lawbjmwjwofpbnlvmw/#Jm`-`lnfgznfmv!#ozqj`pwlgbz-jmgffg`lvmwz\\oldl-EbnjozollhfgNbqhfwopf#jeSobzfqwvqhfz*8ubq#elqfpwdjujmdfqqlqpGlnbjm~fopfxjmpfqwAold?,ellwfqoldjm-ebpwfqbdfmwp?algz#23s{#3sqbdnbeqjgbzivmjlqgloobqsob`fg`lufqpsovdjm6/333#sbdf!=alpwlm-wfpw+bubwbqwfpwfg\\`lvmwelqvnpp`kfnbjmgf{/ejoofgpkbqfpqfbgfqbofqw+bssfbqPvanjwojmf!=algz!=\t)#WkfWklvdkpffjmdifqpfzMftp?,ufqjezf{sfqwjmivqztjgwk>@llhjfPWBQW#b`qlpp\\jnbdfwkqfbgmbwjufsl`hfwal{!=\tPzpwfn#Gbujg`bm`fqwbaofpsqlufgBsqjo#qfboozgqjufqjwfn!=nlqf!=albqgp`lolqp`bnsvpejqpw#\x7F\x7F#X^8nfgjb-dvjwbqejmjpktjgwk9pkltfgLwkfq#-sks!#bppvnfobzfqptjoplmpwlqfpqfojfeptfgfm@vpwlnfbpjoz#zlvq#Pwqjmd\t\tTkjowbzolq`ofbq9qfplqweqfm`kwklvdk!*#(#!?algz=avzjmdaqbmgpNfnafqmbnf!=lssjmdpf`wlq6s{8!=upsb`fslpwfqnbilq#`leeffnbqwjmnbwvqfkbssfm?,mbu=hbmpbpojmh!=Jnbdfp>ebopftkjof#kpsb`f3%bns8#\t\tJm##sltfqSlophj.`lolqilqgbmAlwwlnPwbqw#.`lvmw1-kwnomftp!=32-isdLmojmf.qjdkwnjoofqpfmjlqJPAM#33/333#dvjgfpubovf*f`wjlmqfsbjq-{no!##qjdkwp-kwno.aol`hqfdF{s9klufqtjwkjmujqdjmsklmfp?,wq=\x0Evpjmd#\t\nubq#=$*8\t\n?,wg=\t?,wq=\tabkbpbaqbpjodbofdlnbdzbqslophjpqsphj4]4C5d\bTA\nzk\x0BBl\bQ\x7F\x0BUm\x05Gx\bSM\nmC\bTA\twQ\nd}\bW@\bTl\bTF\ti@\tcT\x0BBM\x0B|j\x04BV\tqw\tcC\bWI\npa\tfM\n{Z\x05{X\bTF\bVV\bVK\t\x7Fm\x04kF\t[]\bPm\bTv\nsI\x0Bpg\t[I\bQp\x04mx\x0B_W\n^M\npe\x0BQ}\x0BGu\nel\npe\x04Ch\x04BV\bTA\tSo\nzk\x0BGL\x0BxD\nd[\x05Jz\x05MY\bQp\x04li\nfl\npC\x05{B\x05Nt\x0BwT\ti_\bTg\x04QQ\n|p\x0BXN\bQS\x0BxD\x04QC\bWZ\tpD\x0BVS\bTW\x05Nt\x04Yh\nzu\x04Kj\x05N}\twr\tHa\n_D\tj`\x0BQ}\x0BWp\nxZ\x04{c\tji\tBU\nbD\x04a|\tTn\tpV\nZd\nmC\x0BEV\x05{X\tc}\tTo\bWl\bUd\tIQ\tcg\x0Bxs\nXW\twR\x0Bek\tc}\t]y\tJn\nrp\neg\npV\nz\\\x05{W\npl\nz\\\nzU\tPc\t`{\bV@\nc|\bRw\ti_\bVb\nwX\tHv\x04Su\bTF\x0B_W\x0BWs\x0BsI\x05m\x7F\nTT\ndc\tUS\t}f\tiZ\bWz\tc}\x04MD\tBe\tiD\x0B@@\bTl\bPv\t}t\x04Sw\x04M`\x0BnU\tkW\x0Bed\nqo\x0BxY\tA|\bTz\x0By`\x04BR\x04BM\tia\x04XU\nyu\x04n^\tfL\tiI\nXW\tfD\bWz\bW@\tyj\t\x7Fm\tav\tBN\x0Bb\\\tpD\bTf\nY[\tJn\bQy\t[^\x0BWc\x0Byu\x04Dl\x04CJ\x0BWj\x0BHR\t`V\x0BuW\tQy\np@\x0BGu\x05pl\x04Jm\bW[\nLP\nxC\n`m\twQ\x05ui\x05\x7FR\nbI\twQ\tBZ\tWV\x04BR\npg\tcg\x05ti\x04CW\n_y\tRg\bQa\x0BQB\x0BWc\nYb\x05le\ngE\x04Su\nL[\tQ\x7F\tea\tdj\x0B]W\nb~\x04M`\twL\bTV\bVH\nt\x7F\npl\t|b\x05s_\bU|\bTa\x04oQ\x05lv\x04Sk\x04M`\bTv\x0BK}\nfl\tcC\x04oQ\x04BR\tHk\t|d\bQp\tHK\tBZ\x0BHR\bPv\x0BLx\x0BEZ\bT\x7F\bTv\tiD\x05oD\x05MU\x0BwB\x04Su\x05k`\x04St\ntC\tPl\tKg\noi\tjY\x0BxY\x04h}\nzk\bWZ\t\x7Fm\x0Be`\tTB\tfE\nzk\t`z\x04Yh\nV|\tHK\tAJ\tAJ\bUL\tp\\\tql\nYc\x04Kd\nfy\x04Yh\t[I\x0BDg\x04Jm\n]n\nlb\bUd\n{Z\tlu\tfs\x04oQ\bTW\x04Jm\x0BwB\tea\x04Yh\x04BC\tsb\tTn\nzU\n_y\x0BxY\tQ]\ngw\x04mt\tO\\\ntb\bWW\bQy\tmI\tV[\ny\\\naB\x0BRb\twQ\n]Q\x04QJ\bWg\x0BWa\bQj\ntC\bVH\nYm\x0Bxs\bVK\nel\bWI\x0BxY\x04Cq\ntR\x0BHV\bTl\bVw\tay\bQa\bVV\t}t\tdj\nr|\tp\\\twR\n{i\nTT\t[I\ti[\tAJ\x0Bxs\x0B_W\td{\x0BQ}\tcg\tTz\tA|\tCj\x0BLm\x05N}\x05m\x7F\nbK\tdZ\tp\\\t`V\tsV\np@\tiD\twQ\x0BQ}\bTf\x05ka\x04Jm\x0B@@\bV`\tzp\n@N\x04Sw\tiI\tcg\noi\x04Su\bVw\x04lo\x04Cy\tc}\x0Bb\\\tsU\x04BA\bWI\bTf\nxS\tVp\nd|\bTV\x0BbC\tNo\x05Ju\nTC\t|`\n{Z\tD]\bU|\tc}\x05lm\bTl\tBv\tPl\tc}\bQp\t\x7Fm\nLk\tkj\n@N\x04Sb\x04KO\tj_\tp\\\nzU\bTl\bTg\bWI\tcf\x04XO\bWW\ndz\x04li\tBN\nd[\bWO\x04MD\x0BKC\tdj\tI_\bVV\ny\\\x0BLm\x05xl\txB\tkV\x0Bb\\\x0BJW\x0BVS\tVx\x0BxD\td{\x04MD\bTa\t|`\x0BPz\x04R}\x0BWs\x04BM\nsI\x04CN\bTa\x04Jm\npe\ti_\npV\nrh\tRd\tHv\n~A\nxR\x0BWh\x0BWk\nxS\x0BAz\x0BwX\nbI\x04oQ\tfw\nqI\nV|\nun\x05z\x7F\x0Bpg\td\\\x0BoA\x05{D\ti_\x05xB\bT\x7F\t`V\x05qr\tTT\x04g]\x04CA\x0BuR\tVJ\tT`\npw\x0BRb\tI_\nCx\x04Ro\x0BsI\x04Cj\x04Kh\tBv\tWV\x04BB\x05oD\x05{D\nhc\x04Km\x0B^R\tQE\n{I\np@\nc|\x05Gt\tc}\x04Dl\nzU\x05qN\tsV\x05k}\tHh\x0B|j\nqo\x05u|\tQ]\x0Bek\x05\x7FZ\x04M`\x04St\npe\tdj\bVG\x0BeE\t\x7Fm\x0BWc\x04|I\n[W\tfL\bT\x7F\tBZ\x04Su\x0BKa\x04Cq\x05Nt\x04Y[\nqI\bTv\tfM\ti@\t}f\x04B\\\tQy\x0BBl\bWg\x04XD\x05kc\x0Bx[\bVV\tQ]\t\x7Fa\tPy\x0BxD\nfI\t}f\x05oD\tdj\tSG\x05ls\t~D\x04CN\n{Z\t\\v\n_D\nhc\x0Bx_\x04C[\tAJ\nLM\tVx\x04CI\tbj\tc^\tcF\ntC\x04Sx\twr\x04XA\bU\\\t|a\x0BK\\\bTV\bVj\nd|\tfs\x04CX\ntb\bRw\tVx\tAE\tA|\bT\x7F\x05Nt\x0BDg\tVc\bTl\x04d@\npo\t\x7FM\tcF\npe\tiZ\tBo\bSq\nfH\x04l`\bTx\bWf\tHE\x0BF{\tcO\tfD\nlm\x0BfZ\nlm\x0BeU\tdG\x04BH\bTV\tSi\x05MW\nwX\nz\\\t\\c\x04CX\nd}\tl}\bQp\bTV\tF~\bQ\x7F\t`i\ng@\x05nO\bUd\bTl\nL[\twQ\tji\ntC\t|J\nLU\naB\x0BxY\x04Kj\tAJ\x05uN\ti[\npe\x04Sk\x0BDg\x0Bx]\bVb\bVV\nea\tkV\nqI\bTa\x04Sk\nAO\tpD\ntb\nts\nyi\bVg\ti_\x0B_W\nLk\x05Nt\tyj\tfM\x04R\x7F\tiI\bTl\x0BwX\tsV\x0BMl\nyu\tAJ\bVj\x04KO\tWV\x0BA}\x0BW\x7F\nrp\tiD\x0B|o\x05lv\x0BsI\x04BM\td~\tCU\bVb\x04eV\npC\x0BwT\tj`\tc}\x0Bxs\x0Bps\x0Bvh\tWV\x0BGg\x0BAe\x0BVK\x0B]W\trg\x0BWc\x05F`\tBr\x0Bb\\\tdZ\bQp\nqI\x04kF\nLk\x0BAR\bWI\bTg\tbs\tdw\n{L\n_y\tiZ\bTA\tlg\bVV\bTl\tdk\n`k\ta{\ti_\x05{A\x05wj\twN\x0B@@\bTe\ti_\n_D\twL\nAH\x0BiK\x0Bek\n[]\tp_\tyj\bTv\tUS\t[r\n{I\nps\x05Gt\x0BVK\npl\x04S}\x0BWP\t|d\x04MD\x0BHV\bT\x7F\x04R}\x04M`\bTV\bVH\x05lv\x04Ch\bW[\x04Ke\tR{\x0B^R\tab\tBZ\tVA\tB`\nd|\nhs\x04Ke\tBe\x04Oi\tR{\td\\\x05nB\bWZ\tdZ\tVJ\x05Os\t\x7Fm\x04uQ\x0BhZ\x04Q@\x04QQ\nfI\bW[\x04B\\\x04li\nzU\nMd\x04M`\nxS\bVV\n\\}\x0BxD\t\x7Fm\bTp\x04IS\nc|\tkV\x05i~\tV{\x0BhZ\t|b\bWt\n@R\x0BoA\x0BnU\bWI\tea\tB`\tiD\tc}\tTz\x04BR\x0BQB\x05Nj\tCP\t[I\bTv\t`W\x05uN\x0Bpg\x0Bpg\x0BWc\tiT\tbs\twL\tU_\tc\\\t|h\x0BKa\tNr\tfL\nq|\nzu\nz\\\tNr\bUg\t|b\x04m`\bTv\nyd\nrp\bWf\tUX\x04BV\nzk\nd}\twQ\t}f\x04Ce\x0Bed\bTW\bSB\nxU\tcn\bTb\ne\x7F\ta\\\tSG\bU|\npV\nN\\\x04Kn\x0BnU\tAt\tpD\x0B^R\x0BIr\x04b[\tR{\tdE\x0BxD\x0BWK\x0BWA\bQL\bW@\x04Su\bUd\nDM\tPc\x04CA\x04Dl\x04oQ\tHs\x05wi\x04ub\n\x7Fa\bQp\x05Ob\nLP\bTl\x04Y[\x0BK}\tAJ\bQ\x7F\x04n^\x0BsA\bSM\nqM\bWZ\n^W\x0Bz{\x04S|\tfD\bVK\bTv\bPv\x04BB\tCP\x04dF\tid\x0Bxs\x04mx\x0Bws\tcC\ntC\tyc\x05M`\x0BW\x7F\nrh\bQp\x0BxD\x04\\o\nsI\x04_k\nzu\x04kF\tfD\x04Xs\x04XO\tjp\bTv\x04BS\x05{B\tBr\nzQ\nbI\tc{\x04BD\x04BV\x05nO\bTF\tca\x05Jd\tfL\tPV\tI_\nlK\x04`o\twX\npa\tgu\bP}\x05{^\bWf\n{I\tBN\npa\x04Kl\x0Bpg\tcn\tfL\x0Bvh\x04Cq\bTl\x0BnU\bSq\x04Cm\twR\bUJ\npe\nyd\nYg\x04Cy\x0BKW\tfD\nea\x04oQ\tj_\tBv\x04nM\x0BID\bTa\nzA\x05pl\n]n\bTa\tR{\tfr\n_y\bUg\x05{X\x05kk\x0BxD\x04|I\x05xl\nfy\x04Ce\x0BwB\nLk\x0Bd]\noi\n}h\tQ]\npe\bVw\x04Hk\x04OQ\nzk\tAJ\npV\bPv\ny\\\tA{\x04Oi\bSB\x04XA\x0BeE\tjp\nq}\tiD\x05qN\x0B^R\t\x7Fm\tiZ\tBr\bVg\noi\n\\X\tU_\nc|\x0BHV\bTf\tTn\x04\\N\x04\\N\nuB\x05lv\nyu\tTd\bTf\bPL\x0B]W\tdG\nA`\nw^\ngI\npe\tdw\nz\\\x05ia\bWZ\tcF\x04Jm\n{Z\bWO\x04_k\x04Df\x04RR\td\\\bVV\x0Bxs\x04BN\x05ti\x04lm\tTd\t]y\x0BHV\tSo\x0B|j\x04XX\tA|\x0BZ^\x0BGu\bTW\x05M`\x04kF\x0BhZ\x0BVK\tdG\x0BBl\tay\nxU\x05qE\x05nO\bVw\nqI\x04CX\ne\x7F\tPl\bWO\x0BLm\tdL\x05uH\x04Cm\tdT\x04fn\x0BwB\x05ka\x0BnU\n@M\nyT\tHv\t\\}\x04Kh\td~\x04Yh\x05k}\neR\td\\\bWI\t|b\tHK\tiD\bTW\x05MY\npl\bQ_\twr\x0BAx\tHE\bTg\bSq\x05vp\x0Bb\\\bWO\nOl\nsI\nfy\x0BID\t\\c\n{Z\n^~\npe\nAO\tTT\x0Bxv\x04k_\bWO\x0B|j\x0BwB\tQy\ti@\tPl\tHa\tdZ\x05k}\x04ra\tUT\x0BJc\x0Bed\np@\tQN\nd|\tkj\tHk\x04M`\noi\twr\td\\\nlq\no_\nlb\nL[\tac\x04BB\x04BH\x04Cm\npl\tIQ\bVK\x0Bxs\n`e\x0BiK\npa\x04Oi\tUS\bTp\tfD\nPG\x05kk\x04XA\nz\\\neg\x0BWh\twR\x05qN\nqS\tcn\x04lo\nxS\n^W\tBU\nt\x7F\tHE\tp\\\tfF\tfw\bVV\bW@\tak\x0BVK\x05ls\tVJ\bVV\x0BeE\x04\\o\nyX\nYm\x04M`\x05lL\nd|\nzk\tA{\x05sE\twQ\x04XT\nt\x7F\tPl\t]y\x0BwT\x05{p\x04MD\x0Bb\\\tQ]\x04Kj\tJn\nAH\x0BRb\tBU\tHK\t\\c\nfI\x05m\x7F\nqM\n@R\tSo\noi\x04BT\tHv\n_y\x04Kh\tBZ\t]i\bUJ\tV{\x04Sr\nbI\x0BGg\ta_\bTR\nfI\nfl\t[K\tII\x04S|\x0BuW\tiI\bWI\nqI\x0B|j\x04BV\bVg\bWZ\x04kF\x0Bx]\bTA\tab\tfr\ti@\tJd\tJd\x0Bps\nAO\bTa\x05xu\tiD\nzk\t|d\t|`\bW[\tlP\tdG\bVV\x0Bw}\x0BqO\ti[\bQ\x7F\bTz\x0BVF\twN\x05ts\tdw\bTv\neS\ngi\tNr\x05yS\npe\bVV\bSq\n`m\tyj\tBZ\x0BWX\bSB\tc\\\nUR\t[J\tc_\x04nM\bWQ\x0BAx\nMd\tBr\x05ui\x0BxY\bSM\x0BWc\x0B|j\x0Bxs\t}Q\tBO\bPL\bWW\tfM\nAO\tPc\x0BeU\x04e^\bTg\nqI\tac\bPv\tcF\x04oQ\tQ\x7F\x0BhZ\x05ka\nz\\\tiK\tBU\n`k\tCP\x04S|\x04M`\n{I\tS{\x04_O\tBZ\x04Zi\x04Sk\tps\tp\\\nYu\n]s\nxC\bWt\nbD\tkV\x0BGu\x05yS\nqA\t[r\neK\x04M`\tdZ\x05lL\bUg\bTl\nbD\tUS\x0Bb\\\tpV\ncc\x04S\\\tct\t`z\bPL\x0BWs\nA`\neg\bSq\x05uE\x04CR\x0BDg\t`W\x0Bz{\x0BWc\x04Sk\x04Sk\tbW\bUg\tea\nxZ\tiI\tUX\tVJ\nqn\tS{\x0BRb\bTQ\npl\x05Gt\x0BuW\x05uj\npF\nqI\tfL\t[I\tia\x04XO\nyu\x0BDg\x0Bed\tq{\x04VG\bQ\x7F\x05ka\tVj\tkV\txB\nd|\np@\tQN\tPc\tps\x04]j\tkV\toU\bTp\nzU\x05nB\x0BB]\ta{\bV@\n]n\x04m`\tcz\tR{\x04m`\bQa\x0BwT\bSM\x05MY\x05qN\tdj\x05~s\x0BQ}\x05MY\x0BMB\tBv\twR\bRg\x0BQ}\tql\x0BKC\nrm\x05xu\x04CC\x0BwB\x0Bvh\tBq\x04Xq\npV\ti_\x05Ob\x05uE\nbd\nqo\x0B{i\nC~\tBL\x0BeE\x05uH\bVj\x04Ey\x04Gz\x0BzR\x0B{i\tcf\n{Z\n]n\x04XA\x0BGu\x0BnU\thS\x0BGI\nCc\tHE\bTA\tHB\x04BH\x04Cj\nCc\bTF\tHE\nXI\tA{\bQ\x7F\tc\\\x0BmO\x0BWX\nfH\np@\x05MY\bTF\nlK\tBt\nzU\tTT\x04Km\x0BwT\npV\ndt\x0ByI\tVx\tQ\x7F\tRg\tTd\nzU\bRS\nLM\twA\x04nM\tTn\ndS\t]g\nLc\x0BwB\t}t\t[I\tCP\x04kX\x0BFm\x0BhZ\x05m\x7F\ti[\np@\x0BQ}\x0BW\x7F\t|d\nMO\nMd\tf_\tfD\tcJ\tHz\x0BRb\tio\tPy\x04Y[\nxU\tct\x0B@@\tww\bPv\x04BM\x04FF\ntb\x05v|\x0BKm\tBq\tBq\x04Kh\x04`o\nZd\x04XU\ti]\t|`\tSt\x04B\\\bQ\x7F\x0B_W\tTJ\nqI\t|a\tA{\x0BuP\x04MD\tPl\nxR\tfL\x0Bws\tc{\td\\\bV`\neg\tHK\x05kc\nd|\bVV\ny\\\x05kc\ti]\bVG\t`V\tss\tI_\tAE\tbs\tdu\nel\tpD\x0BW\x7F\nqs\x05lv\bSM\x04Zi\x0BVK\x05ia\x0BQB\tQ\x7F\n{Z\bPt\x0BKl\nlK\nhs\ndS\bVK\x05mf\nd^\tkV\tcO\nc|\bVH\t\\]\bTv\bSq\tmI\x0BDg\tVJ\tcn\ny\\\bVg\bTv\nyX\bTF\t]]\bTp\noi\nhs\x0BeU\nBf\tdj\x05Mr\n|p\t\\g\t]r\bVb\x05{D\nd[\x04XN\tfM\tO\\\x05s_\tcf\tiZ\x04XN\x0BWc\tqv\n`m\tU^\x05oD\nd|\x0BGg\tdE\x0Bwf\x04lo\x04u}\nd|\x05oQ\t`i\x04Oi\x0BxD\ndZ\nCx\x04Yw\nzk\ntb\ngw\tyj\tB`\nyX\x0Bps\ntC\x0BpP\x0Bqw\bPu\bPX\tDm\npw\x05Nj\tss\taG\x0Bxs\bPt\noL\x04Gz\tOk\ti@\ti]\x04eC\tIQ\tii\tdj\x0B@J\t|d\x05uh\bWZ\x0BeU\x0BnU\bTa\tcC\x04g]\nzk\x04Yh\bVK\nLU\np@\ntb\ntR\tCj\x0BNP\ti@\bP{\n\\}\n{c\nwX\tfL\bVG\tc{\t|`\tAJ\t|C\tfD\x05ln\t|d\tbs\nqI\x05{B\x0BAx\np@\nzk\x0BRb\x05Os\x0BWS\x04e^\x0BD_\tBv\x0BWd\bVb\x0Bxs\x0BeE\bRw\n]n\n|p\x0Bg|\tfw\x05kc\bTI\x05ka\n\\T\x04Sp\tju\x0Bps\npe\x05u|\x0BGr\bVe\tCU\x04]M\x04XU\x0BxD\bTa\tIQ\x0BWq\tCU\tam\tdj\bSo\x04Sw\x0BnU\x04Ch\tQ]\x05s_\bPt\tfS\bTa\t\\}\n@O\x04Yc\tUZ\bTx\npe\x0BnU\nzU\t|}\tiD\nz\\\bSM\x0BxD\x04BR\nzQ\tQN\x04]M\x04Yh\nLP\x0BFm\x0BLX\x05vc\x0Bql\x05ka\tHK\bVb\ntC\nCy\bTv\nuV\x04oQ\t`z\t[I\tB`\x0BRb\tyj\tsb\x0BWs\bTl\tkV\x0Bed\ne\x7F\x05lL\x0BxN\t\x7Fm\nJn\tjY\x0BxD\bVb\bSq\x0Byu\twL\x0BXL\bTA\tpg\tAt\tnD\x04XX\twR\npl\nhw\x05yS\nps\tcO\bW[\x0B|j\x04XN\tsV\tp\\\tBe\nb~\nAJ\n]e\x05k`\x05qN\tdw\tWV\tHE\x0BEV\x05Jz\tid\tB`\tzh\x05E]\tfD\bTg\x05qN\bTa\tja\x04Cv\bSM\nhc\bUe\x05t_\tie\x04g]\twQ\nPn\bVB\tjw\bVg\x0BbE\tBZ\x0BRH\bP{\tjp\n\\}\ta_\tcC\t|a\x0BD]\tBZ\ti[\tfD\x0BxW\no_\td\\\n_D\ntb\t\\c\tAJ\nlK\x04oQ\x04lo\x0BLx\x0BM@\bWZ\x04Kn\x0Bpg\nTi\nIv\n|r\x0B@}\x05Jz\x05Lm\x05Wh\x05k}\x05ln\x0BxD\n]s\x04gc\x0Bps\tBr\bTW\x0BBM\x05tZ\nBY\x04DW\tjf\x0BSW\x04C}\nqo\tdE\tmv\tIQ\bPP\bUb\x05lv\x04BC\nzQ\t[I\x0Bgl\nig\bUs\x04BT\x0BbC\bSq\tsU\tiW\nJn\tSY\tHK\trg\npV\x0BID\x0B|j\x04KO\t`S\t|a`vbmglfmujbqnbgqjgavp`bqjmj`jlwjfnslslqrvf`vfmwbfpwbglsvfgfmivfdlp`lmwqbfpw/Mmmlnaqfwjfmfmsfqejonbmfqbbnjdlp`jvgbg`fmwqlbvmrvfsvfgfpgfmwqlsqjnfqsqf`jlpfd/Vmavfmlpuloufqsvmwlppfnbmbkba/Abbdlpwlmvfulpvmjglp`bqolpfrvjslmj/]lpnv`klpbodvmb`lqqfljnbdfmsbqwjqbqqjabnbq/Abklnaqffnsoflufqgbg`bnajlnv`kbpevfqlmsbpbglo/Amfbsbqf`fmvfubp`vqplpfpwbabrvjfqlojaqlp`vbmwlb``fplnjdvfoubqjlp`vbwqlwjfmfpdqvslppfq/Mmfvqlsbnfgjlpeqfmwfb`fq`bgfn/Mplefqwb`l`kfpnlgfoljwbojbofwqbpbod/Vm`lnsqb`vbofpf{jpwf`vfqslpjfmglsqfmpboofdbqujbifpgjmfqlnvq`jbslgq/Msvfpwlgjbqjlsvfaolrvjfqfnbmvfosqlsjl`qjpjp`jfqwlpfdvqlnvfqwfevfmwf`fqqbqdqbmgffef`wlsbqwfpnfgjgbsqlsjbleqf`fwjfqqbf.nbjoubqjbpelqnbpevwvqllaifwlpfdvjqqjfpdlmlqnbpnjpnlp/Vmj`l`bnjmlpjwjlpqby/_mgfajglsqvfabwlofglwfm/Abifp/Vpfpsfql`l`jmblqjdfmwjfmgb`jfmwl`/Mgjykbaobqpfq/Abobwjmbevfqybfpwjoldvfqqbfmwqbq/E{jwlo/_sfybdfmgbu/Agflfujwbqsbdjmbnfwqlpibujfqsbgqfpe/M`jo`bafyb/Mqfbppbojgbfmu/Alibs/_mbavplpajfmfpwf{wlpoofubqsvfgbmevfqwf`ln/Vm`obpfpkvnbmlwfmjglajoablvmjgbgfpw/Mpfgjwbq`qfbgl2%bns8Kjpwlqz#>#mft#@fmwqbovsgbwfgPsf`jboMfwtlqhqfrvjqf`lnnfmwtbqmjmd@loofdfwlloabqqfnbjmpaf`bvpffof`wfgGfvwp`kejmbm`ftlqhfqprvj`hozafwtffmf{b`wozpfwwjmdgjpfbpfPl`jfwztfbslmpf{kjajw%ow8\"..@lmwqlo`obppfp`lufqfglvwojmfbwwb`hpgfuj`fp+tjmgltsvqslpfwjwof>!Nlajof#hjoojmdpkltjmdJwbojbmgqlssfgkfbujozfeef`wp.2$^*8\t`lmejqn@vqqfmwbgubm`fpkbqjmdlsfmjmdgqbtjmdajoojlmlqgfqfgDfqnbmzqfobwfg?,elqn=jm`ovgftkfwkfqgfejmfgP`jfm`f`bwboldBqwj`ofavwwlmpobqdfpwvmjelqnilvqmfzpjgfabq@kj`bdlklojgbzDfmfqbosbppbdf/%rvlw8bmjnbwfeffojmdbqqjufgsbppjmdmbwvqboqlvdkoz-\t\tWkf#avw#mlwgfmpjwzAqjwbjm@kjmfpfob`h#lewqjavwfJqfobmg!#gbwb.eb`wlqpqf`fjufwkbw#jpOjaqbqzkvpabmgjm#eb`wbeebjqp@kbqofpqbgj`boaqlvdkwejmgjmdobmgjmd9obmd>!qfwvqm#ofbgfqpsobmmfgsqfnjvnsb`hbdfBnfqj`bFgjwjlm^%rvlw8Nfppbdfmffg#wlubovf>!`lnsof{ollhjmdpwbwjlmafojfufpnboofq.nlajofqf`lqgptbmw#wlhjmg#leEjqfel{zlv#bqfpjnjobqpwvgjfgnb{jnvnkfbgjmdqbsjgoz`ojnbwfhjmdglnfnfqdfgbnlvmwpelvmgfgsjlmffqelqnvobgzmbpwzklt#wl#Pvsslqwqfufmvff`lmlnzQfpvowpaqlwkfqplogjfqobqdfoz`boojmd-%rvlw8B``lvmwFgtbqg#pfdnfmwQlafqw#feelqwpSb`jej`ofbqmfgvs#tjwkkfjdkw9tf#kbufBmdfofpmbwjlmp\\pfbq`kbssojfgb`rvjqfnbppjufdqbmwfg9#ebopfwqfbwfgajddfpwafmfejwgqjujmdPwvgjfpnjmjnvnsfqkbspnlqmjmdpfoojmdjp#vpfgqfufqpfubqjbmw#qlof>!njppjmdb`kjfufsqlnlwfpwvgfmwplnflmff{wqfnfqfpwlqfalwwln9fuloufgboo#wkfpjwfnbsfmdojpktbz#wl##Bvdvpwpznalop@lnsbmznbwwfqpnvpj`bobdbjmpwpfqujmd~*+*8\x0E\tsbznfmwwqlvaof`lm`fsw`lnsbqfsbqfmwpsobzfqpqfdjlmpnlmjwlq#$$Wkf#tjmmjmdf{solqfbgbswfgDboofqzsqlgv`fbajojwzfmkbm`f`bqffqp*-#Wkf#`loof`wPfbq`k#bm`jfmwf{jpwfgellwfq#kbmgofqsqjmwfg`lmplofFbpwfqmf{slqwptjmgltp@kbmmfojoofdbomfvwqbopvddfpw\\kfbgfqpjdmjmd-kwno!=pfwwofgtfpwfqm`bvpjmd.tfahjw`objnfgIvpwj`f`kbswfquj`wjnpWklnbp#nlyjoobsqlnjpfsbqwjfpfgjwjlmlvwpjgf9ebopf/kvmgqfgLoznsj`\\avwwlmbvwklqpqfb`kfg`kqlmj`gfnbmgppf`lmgpsqlwf`wbglswfgsqfsbqfmfjwkfqdqfbwozdqfbwfqlufqboojnsqluf`lnnbmgpsf`jbopfbq`k-tlqpkjsevmgjmdwklvdkwkjdkfpwjmpwfbgvwjojwzrvbqwfq@vowvqfwfpwjmd`ofbqozf{slpfgAqltpfqojafqbo~#`bw`kSqlif`wf{bnsofkjgf+*8EolqjgbbmptfqpbooltfgFnsfqlqgfefmpfpfqjlvpeqffglnPfufqbo.avwwlmEvqwkfqlvw#le#\">#mvoowqbjmfgGfmnbqhuljg+3*,boo-ipsqfufmwQfrvfpwPwfskfm\t\tTkfm#lapfquf?,k1=\x0E\tNlgfqm#sqlujgf!#bow>!alqgfqp-\t\tElq#\t\tNbmz#bqwjpwpsltfqfgsfqelqnej`wjlmwzsf#lenfgj`bowj`hfwplsslpfg@lvm`jotjwmfppivpwj`fDflqdf#Afodjvn---?,b=wtjwwfqmlwbaoztbjwjmdtbqebqf#Lwkfq#qbmhjmdskqbpfpnfmwjlmpvqujufp`klobq?,s=\x0E\t#@lvmwqzjdmlqfgolpp#leivpw#bpDflqdjbpwqbmdf?kfbg=?pwlssfg2$^*8\x0E\tjpobmgpmlwbaofalqgfq9ojpw#le`bqqjfg233/333?,k0=\t#pfufqboaf`lnfppfof`w#tfggjmd33-kwnonlmbq`klee#wkfwfb`kfqkjdkoz#ajloldzojef#lelq#fufmqjpf#le%qbrvl8sovplmfkvmwjmd+wklvdkGlvdobpiljmjmd`jq`ofpElq#wkfBm`jfmwUjfwmbnufkj`ofpv`k#bp`qzpwboubovf#>Tjmgltpfmilzfgb#pnboobppvnfg?b#jg>!elqfjdm#Boo#qjklt#wkfGjpsobzqfwjqfgkltfufqkjggfm8abwwofppffhjmd`bajmfwtbp#mlwollh#bw`lmgv`wdfw#wkfIbmvbqzkbssfmpwvqmjmdb9klufqLmojmf#Eqfm`k#ob`hjmdwzsj`bof{wqb`wfmfnjfpfufm#jedfmfqbwgf`jgfgbqf#mlw,pfbq`kafojfep.jnbdf9ol`bwfgpwbwj`-oldjm!=`lmufqwujlofmwfmwfqfgejqpw!=`jq`vjwEjmobmg`kfnjpwpkf#tbp23s{8!=bp#pv`kgjujgfg?,psbm=tjoo#afojmf#leb#dqfbwnzpwfqz,jmgf{-eboojmdgvf#wl#qbjotbz`loofdfnlmpwfqgfp`fmwjw#tjwkmv`ofbqIftjpk#sqlwfpwAqjwjpkeoltfqpsqfgj`wqfelqnpavwwlm#tkl#tbpof`wvqfjmpwbmwpvj`jgfdfmfqj`sfqjlgpnbqhfwpPl`jbo#ejpkjmd`lnajmfdqbskj`tjmmfqp?aq#,=?az#wkf#MbwvqboSqjub`z`llhjfplvw`lnfqfploufPtfgjpkaqjfeozSfqpjbmpl#nv`k@fmwvqzgfsj`wp`lovnmpklvpjmdp`qjswpmf{w#wlafbqjmdnbssjmdqfujpfgiRvfqz+.tjgwk9wjwof!=wllowjsPf`wjlmgfpjdmpWvqhjpkzlvmdfq-nbw`k+~*+*8\t\tavqmjmdlsfqbwfgfdqffpplvq`f>Qj`kbqg`olpfozsobpwj`fmwqjfp?,wq=\x0E\t`lolq9 vo#jg>!slppfppqloojmdskzpj`pebjojmdf{f`vwf`lmwfpwojmh#wlGfebvow?aq#,=\t9#wqvf/`kbqwfqwlvqjpn`obppj`sql`ffgf{sobjm?,k2=\x0E\tlmojmf-<{no#ufkfosjmdgjbnlmgvpf#wkfbjqojmffmg#..=*-bwwq+qfbgfqpklpwjmd eeeeeeqfbojyfUjm`fmwpjdmbop#pq`>!,Sqlgv`wgfpsjwfgjufqpfwfoojmdSvaoj`#kfog#jmIlpfsk#wkfbwqfbeef`wp?pwzof=b#obqdfglfpm$wobwfq/#Fofnfmwebuj`lm`qfbwlqKvmdbqzBjqslqwpff#wkfpl#wkbwNj`kbfoPzpwfnpSqldqbnp/#bmg##tjgwk>f%rvlw8wqbgjmdofew!=\tsfqplmpDlogfm#Beebjqpdqbnnbqelqnjmdgfpwqlzjgfb#le`bpf#lelogfpw#wkjp#jp-pq`#>#`bqwllmqfdjpwq@lnnlmpNvpojnpTkbw#jpjm#nbmznbqhjmdqfufbopJmgffg/frvbooz,pklt\\blvwgllqfp`bsf+Bvpwqjbdfmfwj`pzpwfn/Jm#wkf#pjwwjmdKf#boplJpobmgpB`bgfnz\t\n\n?\"..Gbmjfo#ajmgjmdaol`h!=jnslpfgvwjojyfBaqbkbn+f{`fswxtjgwk9svwwjmd*-kwno+\x7F\x7F#X^8\tGBWBX#)hjw`kfmnlvmwfgb`wvbo#gjbof`wnbjmoz#\\aobmh$jmpwboof{sfqwpje+wzsfJw#bopl%`lsz8#!=Wfqnpalqm#jmLswjlmpfbpwfqmwbohjmd`lm`fqmdbjmfg#lmdljmdivpwjez`qjwj`peb`wlqzjwp#ltmbppbvowjmujwfgobpwjmdkjp#ltmkqfe>!,!#qfo>!gfufols`lm`fqwgjbdqbngloobqp`ovpwfqsksbo`lklo*8~*+*8vpjmd#b=?psbm=ufppfopqfujuboBggqfppbnbwfvqbmgqljgboofdfgjoomfpptbohjmd`fmwfqprvbojeznbw`kfpvmjejfgf{wjm`wGfefmpfgjfg#jm\t\n?\"..#`vpwlnpojmhjmdOjwwof#Allh#lefufmjmdnjm-iptfbqjmdBoo#Qjd8\t~*+*8qbjpjmd#Bopl/#`qv`jbobalvw!=gf`obqf..=\t?p`ejqfel{bp#nv`kbssojfpjmgf{/#p/#avw#wzsf#>#\t\x0E\t?\"..wltbqgpQf`lqgpSqjubwfElqfjdmSqfnjfq`klj`fpUjqwvboqfwvqmp@lnnfmwSltfqfgjmojmf8slufqwz`kbnafqOjujmd#ulovnfpBmwklmzoldjm!#QfobwfgF`lmlnzqfb`kfp`vwwjmddqbujwzojef#jm@kbswfq.pkbgltMlwbaof?,wg=\x0E\t#qfwvqmpwbgjvntjgdfwpubqzjmdwqbufopkfog#aztkl#bqftlqh#jmeb`vowzbmdvobqtkl#kbgbjqslqwwltm#le\t\tPlnf#$`oj`h$`kbqdfphfztlqgjw#tjoo`jwz#le+wkjp*8Bmgqft#vmjrvf#`kf`hfglq#nlqf033s{8#qfwvqm8qpjlm>!sovdjmptjwkjm#kfqpfoePwbwjlmEfgfqboufmwvqfsvaojpkpfmw#wlwfmpjlmb`wqfpp`lnf#wlejmdfqpGvhf#lesflsof/f{soljwtkbw#jpkbqnlmzb#nbilq!9!kwwsjm#kjp#nfmv!=\tnlmwkozleej`fq`lvm`jodbjmjmdfufm#jmPvnnbqzgbwf#leolzbowzejwmfppbmg#tbpfnsfqlqpvsqfnfPf`lmg#kfbqjmdQvppjbmolmdfpwBoafqwbobwfqbopfw#le#pnboo!=-bssfmggl#tjwkefgfqboabmh#leafmfbwkGfpsjwf@bsjwbodqlvmgp*/#bmg#sfq`fmwjw#eqln`olpjmd`lmwbjmJmpwfbgejewffmbp#tfoo-zbkll-qfpslmgejdkwfqlap`vqfqfeof`wlqdbmj`>#Nbwk-fgjwjmdlmojmf#sbggjmdb#tkloflmfqqlqzfbq#lefmg#le#abqqjfqtkfm#jwkfbgfq#klnf#leqfpvnfgqfmbnfgpwqlmd=kfbwjmdqfwbjmp`olvgeqtbz#le#Nbq`k#2hmltjmdjm#sbqwAfwtffmofpplmp`olpfpwujqwvboojmhp!=`qlppfgFMG#..=ebnlvp#btbqgfgOj`fmpfKfbowk#ebjqoz#tfbowkznjmjnboBeqj`bm`lnsfwfobafo!=pjmdjmdebqnfqpAqbpjo*gjp`vppqfsob`fDqfdlqzelmw#`lsvqpvfgbssfbqpnbhf#vsqlvmgfgalwk#leaol`hfgpbt#wkfleej`fp`lolvqpje+gl`vtkfm#kffmelq`fsvpk+evBvdvpw#VWE.;!=Ebmwbpzjm#nlpwjmivqfgVpvboozebqnjmd`olpvqflaif`w#gfefm`fvpf#le#Nfgj`bo?algz=\tfujgfmwaf#vpfghfz@lgfpj{wffmJpobnj` 333333fmwjqf#tjgfoz#b`wjuf#+wzsflelmf#`bm`lolq#>psfbhfqf{wfmgpSkzpj`pwfqqbjm?walgz=evmfqboujftjmdnjggof#`qj`hfwsqlskfwpkjewfggl`wlqpQvppfoo#wbqdfw`lnsb`wbodfaqbpl`jbo.avoh#lenbm#bmg?,wg=\t#kf#ofew*-ubo+*ebopf*8oldj`boabmhjmdklnf#wlmbnjmd#Bqjylmb`qfgjwp*8\t~*8\telvmgfqjm#wvqm@loojmpafelqf#Avw#wkf`kbqdfgWjwof!=@bswbjmpsfoofgdlggfppWbd#..=Bggjmd9avw#tbpQf`fmw#sbwjfmwab`h#jm>ebopf%Ojm`lomtf#hmlt@lvmwfqIvgbjpnp`qjsw#bowfqfg$^*8\t##kbp#wkfvm`ofbqFufmw$/alwk#jmmlw#boo\t\t?\"..#sob`jmdkbqg#wl#`fmwfqplqw#le`ojfmwppwqffwpAfqmbqgbppfqwpwfmg#wlebmwbpzgltm#jmkbqalvqEqffglniftfoqz,balvw--pfbq`kofdfmgpjp#nbgfnlgfqm#lmoz#lmlmoz#wljnbdf!#ojmfbq#sbjmwfqbmg#mlwqbqfoz#b`qlmzngfojufqpklqwfq33%bns8bp#nbmztjgwk>!,)#?\"X@wjwof#>le#wkf#oltfpw#sj`hfg#fp`bsfgvpfp#lesflsofp#Svaoj`Nbwwkftwb`wj`pgbnbdfgtbz#elqobtp#lefbpz#wl#tjmgltpwqlmd##pjnsof~`bw`k+pfufmwkjmelal{tfmw#wlsbjmwfg`jwjyfmJ#glm$wqfwqfbw-#Plnf#tt-!*8\talnajmdnbjowl9nbgf#jm-#Nbmz#`bqqjfp\x7F\x7Fx~8tjtlqh#lepzmlmzngfefbwpebulqfglswj`bosbdfWqbvmofpp#pfmgjmdofew!=?`lnP`lqBoo#wkfiRvfqz-wlvqjpw@obppj`ebopf!#Tjokfonpvavqapdfmvjmfajpklsp-psojw+dolabo#elooltpalgz#lemlnjmbo@lmwb`wpf`vobqofew#wl`kjfeoz.kjggfm.abmmfq?,oj=\t\t-#Tkfm#jm#alwkgjpnjppF{solqfbotbzp#ujb#wkfpsb/]lotfoebqfqvojmd#bqqbmdf`bswbjmkjp#plmqvof#lekf#wllhjwpfoe/>3%bns8+`boofgpbnsofpwl#nbhf`ln,sbdNbqwjm#Hfmmfgzb``fswpevoo#lekbmgofgAfpjgfp,,..=?,baof#wlwbqdfwpfppfm`fkjn#wl#jwp#az#`lnnlm-njmfqbowl#wbhftbzp#wlp-lqd,obgujpfgsfmbowzpjnsof9je#wkfzOfwwfqpb#pklqwKfqafqwpwqjhfp#dqlvsp-ofmdwkeojdkwplufqobspoltoz#ofppfq#pl`jbo#?,s=\t\n\njw#jmwlqbmhfg#qbwf#levo=\x0E\t##bwwfnswsbjq#lenbhf#jwHlmwbhwBmwlmjlkbujmd#qbwjmdp#b`wjufpwqfbnpwqbssfg!*-`pp+klpwjofofbg#wlojwwof#dqlvsp/Sj`wvqf..=\x0E\t\x0E\t#qltp>!#laif`wjmufqpf?ellwfq@vpwlnU=?_,p`qploujmd@kbnafqpobufqztlvmgfgtkfqfbp\">#$vmgelq#boosbqwoz#.qjdkw9Bqbajbmab`hfg#`fmwvqzvmjw#lenlajof.Fvqlsf/jp#klnfqjph#legfpjqfg@ojmwlm`lpw#lebdf#le#af`lnf#mlmf#les%rvlw8Njggof#fbg$*X3@qjwj`ppwvgjlp=%`lsz8dqlvs!=bppfnaonbhjmd#sqfppfgtjgdfw-sp9!#<#qfavjowaz#plnfElqnfq#fgjwlqpgfobzfg@bmlmj`kbg#wkfsvpkjmd`obpp>!avw#bqfsbqwjboAbazolmalwwln#`bqqjfq@lnnbmgjwp#vpfBp#tjwk`lvqpfpb#wkjqggfmlwfpbopl#jmKlvpwlm13s{8!=b``vpfgglvaof#dlbo#leEbnlvp#*-ajmg+sqjfpwp#Lmojmfjm#Ivozpw#(#!d`lmpvowgf`jnbokfosevoqfujufgjp#ufqzq$($jswolpjmd#efnbofpjp#boplpwqjmdpgbzp#lebqqjuboevwvqf#?laif`welq`jmdPwqjmd+!#,=\t\n\nkfqf#jpfm`lgfg-##Wkf#aboollmglmf#az,`lnnlmad`lolqobt#le#Jmgjbmbbuljgfgavw#wkf1s{#0s{irvfqz-bewfq#bsloj`z-nfm#bmgellwfq.>#wqvf8elq#vpfp`qffm-Jmgjbm#jnbdf#>ebnjoz/kwws9,,#%maps8gqjufqpfwfqmbopbnf#bpmlwj`fgujftfqp~*+*8\t#jp#nlqfpfbplmpelqnfq#wkf#mftjp#ivpw`lmpfmw#Pfbq`ktbp#wkftkz#wkfpkjssfgaq=?aq=tjgwk9#kfjdkw>nbgf#le`vjpjmfjp#wkbwb#ufqz#Bgnjqbo#ej{fg8mlqnbo#NjppjlmSqfpp/#lmwbqjl`kbqpfwwqz#wl#jmubgfg>!wqvf!psb`jmdjp#nlpwb#nlqf#wlwboozeboo#le~*8\x0E\t##jnnfmpfwjnf#jmpfw#lvwpbwjpezwl#ejmggltm#wlolw#le#Sobzfqpjm#Ivmfrvbmwvnmlw#wkfwjnf#wlgjpwbmwEjmmjpkpq`#>#+pjmdof#kfos#leDfqnbm#obt#bmgobafofgelqfpwp`llhjmdpsb`f!=kfbgfq.tfoo#bpPwbmofzaqjgdfp,dolabo@qlbwjb#Balvw#X3^8\t##jw/#bmgdqlvsfgafjmd#b*xwkqltkf#nbgfojdkwfqfwkj`boEEEEEE!alwwln!ojhf#b#fnsolzpojuf#jmbp#pffmsqjmwfqnlpw#leva.ojmhqfif`wpbmg#vpfjnbdf!=pv``ffgeffgjmdMv`ofbqjmelqnbwl#kfosTlnfm$pMfjwkfqNf{j`bmsqlwfjm?wbaof#az#nbmzkfbowkzobtpvjwgfujpfg-svpk+xpfoofqppjnsoz#Wkqlvdk-`llhjf#Jnbdf+logfq!=vp-ip!=#Pjm`f#vmjufqpobqdfq#lsfm#wl\"..#fmgojfp#jm$^*8\x0E\t##nbqhfwtkl#jp#+!GLN@lnbmbdfglmf#elqwzsfle#Hjmdglnsqlejwpsqlslpfwl#pklt`fmwfq8nbgf#jwgqfppfgtfqf#jmnj{wvqfsqf`jpfbqjpjmdpq`#>#$nbhf#b#pf`vqfgAbswjpwulwjmd#\t\n\nubq#Nbq`k#1dqft#vs@ojnbwf-qfnlufphjoofgtbz#wkf?,kfbg=eb`f#leb`wjmd#qjdkw!=wl#tlqhqfgv`fpkbp#kbgfqf`wfgpklt+*8b`wjlm>allh#lebm#bqfb>>#!kww?kfbgfq\t?kwno=`lmelqneb`jmd#`llhjf-qfoz#lmklpwfg#-`vpwlnkf#tfmwavw#elqpsqfbg#Ebnjoz#b#nfbmplvw#wkfelqvnp-ellwbdf!=Nlajo@ofnfmwp!#jg>!bp#kjdkjmwfmpf..=?\"..efnbof#jp#pffmjnsojfgpfw#wkfb#pwbwfbmg#kjpebpwfpwafpjgfpavwwlm\\alvmgfg!=?jnd#Jmelal{fufmwp/b#zlvmdbmg#bqfMbwjuf#`kfbsfqWjnflvwbmg#kbpfmdjmfptlm#wkf+nlpwozqjdkw9#ejmg#b#.alwwlnSqjm`f#bqfb#lenlqf#lepfbq`k\\mbwvqf/ofdboozsfqjlg/obmg#lelq#tjwkjmgv`fgsqlujmdnjppjofol`boozBdbjmpwwkf#tbzh%rvlw8s{8!=\x0E\tsvpkfg#babmglmmvnfqbo@fqwbjmJm#wkjpnlqf#jmlq#plnfmbnf#jpbmg/#jm`qltmfgJPAM#3.`qfbwfpL`wlafqnbz#mlw`fmwfq#obwf#jmGfefm`ffmb`wfgtjpk#wlaqlbgoz`llojmdlmolbg>jw-#Wkfqf`lufqNfnafqpkfjdkw#bppvnfp?kwno=\tsflsof-jm#lmf#>tjmgltellwfq\\b#dllg#qfhobnblwkfqp/wl#wkjp\\`llhjfsbmfo!=Olmglm/gfejmfp`qvpkfgabswjpn`lbpwbopwbwvp#wjwof!#nluf#wlolpw#jmafwwfq#jnsojfpqjuboqzpfqufqp#PzpwfnSfqkbspfp#bmg#`lmwfmgeoltjmdobpwfg#qjpf#jmDfmfpjpujft#leqjpjmd#pffn#wlavw#jm#ab`hjmdkf#tjoodjufm#bdjujmd#`jwjfp-eolt#le#Obwfq#boo#avwKjdktbzlmoz#azpjdm#lekf#glfpgjeefqpabwwfqz%bns8obpjmdofpwkqfbwpjmwfdfqwbhf#lmqfevpfg`boofg#>VP%bnsPff#wkfmbwjufpaz#wkjppzpwfn-kfbg#le9klufq/ofpajbmpvqmbnfbmg#boo`lnnlm,kfbgfq\\\\sbqbnpKbqubqg,sj{fo-qfnlubopl#olmdqlof#leiljmwozphzp`qbVmj`lgfaq#,=\x0E\tBwobmwbmv`ofvp@lvmwz/svqfoz#`lvmw!=fbpjoz#avjog#blm`oj`hb#djufmsljmwfqk%rvlw8fufmwp#fopf#x\tgjwjlmpmlt#wkf/#tjwk#nbm#tkllqd,Tfalmf#bmg`buboqzKf#gjfgpfbwwof33/333#xtjmgltkbuf#wlje+tjmgbmg#jwpplofoz#n%rvlw8qfmftfgGfwqljwbnlmdpwfjwkfq#wkfn#jmPfmbwlqVp?,b=?Hjmd#leEqbm`jp.sqlgv`kf#vpfgbqw#bmgkjn#bmgvpfg#azp`lqjmdbw#klnfwl#kbufqfobwfpjajojwzeb`wjlmAveebolojmh!=?tkbw#kfeqff#wl@jwz#le`lnf#jmpf`wlqp`lvmwfglmf#gbzmfqulvpprvbqf#~8je+dljm#tkbwjnd!#bojp#lmozpfbq`k,wvfpgbzollpfozPlolnlmpf{vbo#.#?b#kqnfgjvn!GL#MLW#Eqbm`f/tjwk#b#tbq#bmgpf`lmg#wbhf#b#=\x0E\t\x0E\t\x0E\tnbqhfw-kjdktbzglmf#jm`wjujwz!obpw!=laojdfgqjpf#wl!vmgfejnbgf#wl#Fbqoz#sqbjpfgjm#jwp#elq#kjpbwkofwfIvsjwfqZbkll\"#wfqnfg#pl#nbmzqfbooz#p-#Wkf#b#tlnbmgjqf`w#qjdkw!#aj`z`ofb`jmd>!gbz#bmgpwbwjmdQbwkfq/kjdkfq#Leej`f#bqf#mltwjnfp/#tkfm#b#sbz#elqlm#wkjp.ojmh!=8alqgfqbqlvmg#bmmvbo#wkf#Mftsvw#wkf-`ln!#wbhjm#wlb#aqjfe+jm#wkfdqlvsp-8#tjgwkfmyznfppjnsof#jm#obwfxqfwvqmwkfqbszb#sljmwabmmjmdjmhp!=\t+*8!#qfb#sob`f_v330@bbalvw#bwq=\x0E\t\n\n``lvmw#djufp#b?P@QJSWQbjotbzwkfnfp,wlloal{AzJg+!{kvnbmp/tbw`kfpjm#plnf#je#+tj`lnjmd#elqnbwp#Vmgfq#avw#kbpkbmgfg#nbgf#azwkbm#jmefbq#legfmlwfg,jeqbnfofew#jmulowbdfjm#fb`kb%rvlw8abpf#leJm#nbmzvmgfqdlqfdjnfpb`wjlm#?,s=\x0E\t?vpwlnUb8%dw8?,jnslqwplq#wkbwnlpwoz#%bns8qf#pjyf>!?,b=?,kb#`obppsbppjufKlpw#>#TkfwkfqefqwjofUbqjlvp>X^8+ev`bnfqbp,=?,wg=b`wp#bpJm#plnf=\x0E\t\x0E\t?\"lqdbmjp#?aq#,=Afjijmd`bwbo/Lgfvwp`kfvqlsfvfvphbqbdbfjodfpufmphbfpsb/]bnfmpbifvpvbqjlwqbabiln/E{j`ls/Mdjmbpjfnsqfpjpwfnbl`wvaqfgvqbmwfb/]bgjqfnsqfpbnlnfmwlmvfpwqlsqjnfqbwqbu/Epdqb`jbpmvfpwqbsql`fplfpwbglp`bojgbgsfqplmbm/Vnfqlb`vfqgln/Vpj`bnjfnaqllefqwbpbodvmlpsb/Apfpfifnsolgfqf`klbgfn/Mpsqjubglbdqfdbqfmob`fpslpjaofklwfofppfujoobsqjnfql/Vowjnlfufmwlpbq`kjul`vowvqbnvifqfpfmwqbgbbmvm`jlfnabqdlnfq`bgldqbmgfpfpwvgjlnfilqfpefaqfqlgjpf/]lwvqjpnl`/_gjdlslqwbgbfpsb`jlebnjojbbmwlmjlsfqnjwfdvbqgbqbodvmbpsqf`jlpbodvjfmpfmwjglujpjwbpw/Awvol`lml`fqpfdvmgl`lmpfileqbm`jbnjmvwlppfdvmgbwfmfnlpfef`wlpn/Mobdbpfpj/_mqfujpwbdqbmbgb`lnsqbqjmdqfpldbq`/Abb``j/_mf`vbglqrvjfmfpjm`ovplgfafq/Mnbwfqjbklnaqfpnvfpwqbslgq/Abnb/]bmb/Vowjnbfpwbnlplej`jbowbnajfmmjmd/Vmpbovglpslgfnlpnfilqbqslpjwjlmavpjmfppklnfsbdfpf`vqjwzobmdvbdfpwbmgbqg`bnsbjdmefbwvqfp`bwfdlqzf{wfqmbo`kjogqfmqfpfqufgqfpfbq`kf{`kbmdfebulqjwfwfnsobwfnjojwbqzjmgvpwqzpfquj`fpnbwfqjbosqlgv`wpy.jmgf{9`lnnfmwpplewtbqf`lnsofwf`bofmgbqsobwelqnbqwj`ofpqfrvjqfgnlufnfmwrvfpwjlmavjogjmdslojwj`pslppjaofqfojdjlmskzpj`boeffgab`hqfdjpwfqsj`wvqfpgjpbaofgsqlwl`lobvgjfm`fpfwwjmdpb`wjujwzfofnfmwpofbqmjmdbmzwkjmdbapwqb`wsqldqfpplufqujftnbdbyjmff`lmlnj`wqbjmjmdsqfppvqfubqjlvp#?pwqlmd=sqlsfqwzpklssjmdwldfwkfqbgubm`fgafkbujlqgltmolbgefbwvqfgellwaboopfof`wfgObmdvbdfgjpwbm`fqfnfnafqwqb`hjmdsbpptlqgnlgjejfgpwvgfmwpgjqf`wozejdkwjmdmlqwkfqmgbwbabpfefpwjuboaqfbhjmdol`bwjlmjmwfqmfwgqlsgltmsqb`wj`ffujgfm`fevm`wjlmnbqqjbdfqfpslmpfsqlaofnpmfdbwjufsqldqbnpbmbozpjpqfofbpfgabmmfq!=svq`kbpfsloj`jfpqfdjlmbo`qfbwjufbqdvnfmwallhnbqhqfefqqfq`kfnj`bogjujpjlm`booab`hpfsbqbwfsqlif`wp`lmeoj`wkbqgtbqfjmwfqfpwgfojufqznlvmwbjmlawbjmfg>#ebopf8elq+ubq#b``fswfg`bsb`jwz`lnsvwfqjgfmwjwzbjq`qbewfnsolzfgsqlslpfgglnfpwj`jm`ovgfpsqlujgfgklpsjwboufqwj`bo`loobspfbssqlb`ksbqwmfqpoldl!=?bgbvdkwfqbvwklq!#`vowvqboebnjojfp,jnbdfp,bppfnaozsltfqevowfb`kjmdejmjpkfggjpwqj`w`qjwj`bo`dj.ajm,svqslpfpqfrvjqfpfof`wjlmaf`lnjmdsqlujgfpb`bgfnj`f{fq`jpfb`wvbooznfgj`jmf`lmpwbmwb``jgfmwNbdbyjmfgl`vnfmwpwbqwjmdalwwln!=lapfqufg9#%rvlw8f{wfmgfgsqfujlvpPlewtbqf`vpwlnfqgf`jpjlmpwqfmdwkgfwbjofgpojdkwozsobmmjmdwf{wbqfb`vqqfm`zfufqzlmfpwqbjdkwwqbmpefqslpjwjufsqlgv`fgkfqjwbdfpkjssjmdbaplovwfqf`fjufgqfofubmwavwwlm!#ujlofm`fbmztkfqfafmfejwpobvm`kfgqf`fmwozboojbm`felooltfgnvowjsofavoofwjmjm`ovgfgl``vqqfgjmwfqmbo'+wkjp*-qfsvaoj`=?wq=?wg`lmdqfppqf`lqgfgvowjnbwfplovwjlm?vo#jg>!gjp`lufqKlnf?,b=tfapjwfpmfwtlqhpbowklvdkfmwjqfoznfnlqjbonfppbdfp`lmwjmvfb`wjuf!=plnftkbwuj`wlqjbTfpwfqm##wjwof>!Ol`bwjlm`lmwqb`wujpjwlqpGltmolbgtjwklvw#qjdkw!=\tnfbpvqfptjgwk#>#ubqjbaofjmuloufgujqdjmjbmlqnboozkbssfmfgb``lvmwppwbmgjmdmbwjlmboQfdjpwfqsqfsbqfg`lmwqlopb``vqbwfajqwkgbzpwqbwfdzleej`jbodqbskj`p`qjnjmboslppjaoz`lmpvnfqSfqplmbopsfbhjmdubojgbwfb`kjfufg-isd!#,=nb`kjmfp?,k1=\t##hfztlqgpeqjfmgozaqlwkfqp`lnajmfglqjdjmbo`lnslpfgf{sf`wfgbgfrvbwfsbhjpwbmeloolt!#ubovbaof?,obafo=qfobwjufaqjmdjmdjm`qfbpfdlufqmlqsovdjmp,Ojpw#le#Kfbgfq!=!#mbnf>!#+%rvlw8dqbgvbwf?,kfbg=\t`lnnfq`fnbobzpjbgjqf`wlqnbjmwbjm8kfjdkw9p`kfgvof`kbmdjmdab`h#wl#`bwkloj`sbwwfqmp`lolq9# dqfbwfpwpvssojfpqfojbaof?,vo=\t\n\n?pfof`w#`jwjyfmp`olwkjmdtbw`kjmd?oj#jg>!psf`jej``bqqzjmdpfmwfm`f?`fmwfq=`lmwqbpwwkjmhjmd`bw`k+f*plvwkfqmNj`kbfo#nfq`kbmw`bqlvpfosbggjmd9jmwfqjlq-psojw+!ojybwjlmL`wlafq#*xqfwvqmjnsqlufg..%dw8\t\t`lufqbdf`kbjqnbm-smd!#,=pvaif`wpQj`kbqg#tkbwfufqsqlabaozqf`lufqzabpfabooivgdnfmw`lmmf`w--`pp!#,=#tfapjwfqfslqwfggfebvow!,=?,b=\x0E\tfof`wqj`p`lwobmg`qfbwjlmrvbmwjwz-#JPAM#3gjg#mlw#jmpwbm`f.pfbq`k.!#obmd>!psfbhfqp@lnsvwfq`lmwbjmpbq`kjufpnjmjpwfqqfb`wjlmgjp`lvmwJwbojbml`qjwfqjbpwqlmdoz9#$kwws9$p`qjsw$`lufqjmdleefqjmdbssfbqfgAqjwjpk#jgfmwjezEb`fallhmvnfqlvpufkj`ofp`lm`fqmpBnfqj`bmkbmgojmdgju#jg>!Tjoojbn#sqlujgfq\\`lmwfmwb``vqb`zpf`wjlm#bmgfqplmeof{jaof@bwfdlqzobtqfm`f?p`qjsw=obzlvw>!bssqlufg#nb{jnvnkfbgfq!=?,wbaof=Pfquj`fpkbnjowlm`vqqfmw#`bmbgjbm`kbmmfop,wkfnfp,,bqwj`oflswjlmboslqwvdboubovf>!!jmwfqubotjqfofppfmwjwofgbdfm`jfpPfbq`k!#nfbpvqfgwklvpbmgpsfmgjmd%kfoojs8mft#Gbwf!#pjyf>!sbdfMbnfnjggof!#!#,=?,b=kjggfm!=pfrvfm`fsfqplmbolufqeoltlsjmjlmpjoojmljpojmhp!=\t\n?wjwof=ufqpjlmppbwvqgbzwfqnjmbojwfnsqlsfmdjmffqpf`wjlmpgfpjdmfqsqlslpbo>!ebopf!Fpsb/]loqfofbpfppvanjw!#fq%rvlw8bggjwjlmpznswlnplqjfmwfgqfplvq`fqjdkw!=?sofbpvqfpwbwjlmpkjpwlqz-ofbujmd##alqgfq>`lmwfmwp`fmwfq!=-\t\tPlnf#gjqf`wfgpvjwbaofavodbqjb-pklt+*8gfpjdmfgDfmfqbo#`lm`fswpF{bnsofptjoojbnpLqjdjmbo!=?psbm=pfbq`k!=lsfqbwlqqfrvfpwpb#%rvlw8booltjmdGl`vnfmwqfujpjlm-#\t\tWkf#zlvqpfoe@lmwb`w#nj`kjdbmFmdojpk#`lovnajbsqjlqjwzsqjmwjmdgqjmhjmdeb`jojwzqfwvqmfg@lmwfmw#leej`fqpQvppjbm#dfmfqbwf.;;6:.2!jmgj`bwfebnjojbq#rvbojwznbqdjm93#`lmwfmwujftslqw`lmwb`wp.wjwof!=slqwbaof-ofmdwk#fojdjaofjmuloufpbwobmwj`lmolbg>!gfebvow-pvssojfgsbznfmwpdolppbqz\t\tBewfq#dvjgbm`f?,wg=?wgfm`lgjmdnjggof!=`bnf#wl#gjpsobzpp`lwwjpkilmbwkbmnbilqjwztjgdfwp-`ojmj`bowkbjobmgwfb`kfqp?kfbg=\t\nbeef`wfgpvsslqwpsljmwfq8wlPwqjmd?,pnboo=lhobklnbtjoo#af#jmufpwlq3!#bow>!klojgbzpQfplvq`foj`fmpfg#+tkj`k#-#Bewfq#`lmpjgfqujpjwjmdf{solqfqsqjnbqz#pfbq`k!#bmgqljg!rvj`hoz#nffwjmdpfpwjnbwf8qfwvqm#8`lolq9 #kfjdkw>bssqlubo/#%rvlw8#`kf`hfg-njm-ip!nbdmfwj`=?,b=?,kelqf`bpw-#Tkjof#wkvqpgbzgufqwjpf%fb`vwf8kbp@obppfubovbwflqgfqjmdf{jpwjmdsbwjfmwp#Lmojmf#`lolqbglLswjlmp!`bnsafoo?\"..#fmg?,psbm=??aq#,=\x0E\t\\slsvsp\x7Fp`jfm`fp/%rvlw8#rvbojwz#Tjmgltp#bppjdmfgkfjdkw9#?a#`obppof%rvlw8#ubovf>!#@lnsbmzf{bnsofp?jeqbnf#afojfufpsqfpfmwpnbqpkboosbqw#le#sqlsfqoz*-\t\tWkf#wb{lmlnznv`k#le#?,psbm=\t!#gbwb.pqwvdv/Fpp`qlooWl#sqlif`w?kfbg=\x0E\tbwwlqmfzfnskbpjppslmplqpebm`zal{tlqog$p#tjogojef`kf`hfg>pfppjlmpsqldqbnns{8elmw.#Sqlif`wilvqmbopafojfufgub`bwjlmwklnsplmojdkwjmdbmg#wkf#psf`jbo#alqgfq>3`kf`hjmd?,walgz=?avwwlm#@lnsofwf`ofbqej{\t?kfbg=\tbqwj`of#?pf`wjlmejmgjmdpqlof#jm#slsvobq##L`wlafqtfapjwf#f{slpvqfvpfg#wl##`kbmdfplsfqbwfg`oj`hjmdfmwfqjmd`lnnbmgpjmelqnfg#mvnafqp##?,gju=`qfbwjmdlmPvanjwnbqzobmg`loofdfpbmbozwj`ojpwjmdp`lmwb`w-olddfgJmbgujplqzpjaojmdp`lmwfmw!p%rvlw8*p-#Wkjp#sb`hbdfp`kf`hal{pvddfpwpsqfdmbmwwlnlqqltpsb`jmd>j`lm-smdibsbmfpf`lgfabpfavwwlm!=dbnaojmdpv`k#bp#/#tkjof#?,psbm=#njpplvqjpslqwjmdwls92s{#-?,psbm=wfmpjlmptjgwk>!1obyzolbgmlufnafqvpfg#jm#kfjdkw>!`qjsw!=\t%maps8?,?wq=?wg#kfjdkw91,sqlgv`w`lvmwqz#jm`ovgf#ellwfq!#%ow8\"..#wjwof!=?,irvfqz-?,elqn=\t+\x0BBl\bQ\x7F*+\x0BUm\x05Gx*kqubwphjjwbojbmlqln/Nm(ow/Pqh/Kf4K4]4C5dwbnaj/Emmlwj`jbpnfmpbifpsfqplmbpgfqf`klpmb`jlmbopfquj`jl`lmwb`wlvpvbqjlpsqldqbnbdlajfqmlfnsqfpbpbmvm`jlpubofm`jb`lolnajbgfpsv/Epgfslqwfpsqlzf`wlsqlgv`wls/Vaoj`lmlplwqlpkjpwlqjbsqfpfmwfnjoolmfpnfgjbmwfsqfdvmwbbmwfqjlqqf`vqplpsqlaofnbpbmwjbdlmvfpwqlplsjmj/_mjnsqjnjqnjfmwqbpbn/Eqj`bufmgfglqpl`jfgbgqfpsf`wlqfbojybqqfdjpwqlsbobaqbpjmwfq/Epfmwlm`fpfpsf`jbonjfnaqlpqfbojgbg`/_qglabybqbdlybs/Mdjmbppl`jbofpaolrvfbqdfpwj/_mborvjofqpjpwfnbp`jfm`jbp`lnsofwlufqpj/_m`lnsofwbfpwvgjlps/Vaoj`blaifwjulboj`bmwfavp`bglq`bmwjgbgfmwqbgbpb``jlmfpbq`kjulppvsfqjlqnbzlq/Abbofnbmjbevm`j/_m/Vowjnlpkb`jfmglbrvfoolpfgj`j/_mefqmbmglbnajfmwfeb`fallhmvfpwqbp`ojfmwfpsql`fplpabpwbmwfsqfpfmwbqfslqwbq`lmdqfplsvaoj`bq`lnfq`jl`lmwqbwli/_ufmfpgjpwqjwlw/E`mj`b`lmivmwlfmfqd/Abwqbabibqbpwvqjbpqf`jfmwfvwjojybqalofw/Ampboubglq`lqqf`wbwqbabilpsqjnfqlpmfdl`jlpojafqwbggfwboofpsbmwboobsq/_{jnlbonfq/Abbmjnbofprvj/Emfp`lqby/_mpf``j/_mavp`bmglls`jlmfpf{wfqjlq`lm`fswlwlgbu/Abdbofq/Abfp`qjajqnfgj`jmboj`fm`jb`lmpvowbbpsf`wlp`q/Awj`bg/_obqfpivpwj`jbgfafq/Mmsfq/Alglmf`fpjwbnbmwfmfqsfrvf/]lqf`jajgbwqjavmbowfmfqjef`bm`j/_m`bmbqjbpgfp`bqdbgjufqplpnboolq`bqfrvjfqfw/E`mj`lgfafq/Abujujfmgbejmbmybpbgfobmwfevm`jlmb`lmpfilpgje/A`jo`jvgbgfpbmwjdvbpbubmybgbw/Eqnjmlvmjgbgfpp/Mm`kfy`bnsb/]bplewlmj`qfujpwbp`lmwjfmfpf`wlqfpnlnfmwlpeb`vowbg`q/Egjwlgjufqpbppvsvfpwleb`wlqfppfdvmglpsfrvf/]b<_!?,pfof`w=Bvpwqbojb!#`obpp>!pjwvbwjlmbvwklqjwzelooltjmdsqjnbqjozlsfqbwjlm`kboofmdfgfufolsfgbmlmznlvpevm`wjlm#evm`wjlmp`lnsbmjfppwqv`wvqfbdqffnfmw!#wjwof>!slwfmwjbofgv`bwjlmbqdvnfmwppf`lmgbqz`lszqjdkwobmdvbdfpf{`ovpjuf`lmgjwjlm?,elqn=\x0E\tpwbwfnfmwbwwfmwjlmAjldqbskz~#fopf#x\tplovwjlmptkfm#wkf#Bmbozwj`pwfnsobwfpgbmdfqlvppbwfoojwfgl`vnfmwpsvaojpkfqjnslqwbmwsqlwlwzsfjmeovfm`f%qbrvl8?,feef`wjufdfmfqboozwqbmpelqnafbvwjevowqbmpslqwlqdbmjyfgsvaojpkfgsqlnjmfmwvmwjo#wkfwkvnambjoMbwjlmbo#-el`vp+*8lufq#wkf#njdqbwjlmbmmlvm`fgellwfq!=\tf{`fswjlmofpp#wkbmf{sfmpjufelqnbwjlmeqbnftlqhwfqqjwlqzmgj`bwjlm`vqqfmwoz`obppMbnf`qjwj`jpnwqbgjwjlmfopftkfqfBof{bmgfqbssljmwfgnbwfqjbopaqlbg`bpwnfmwjlmfgbeejojbwf?,lswjlm=wqfbwnfmwgjeefqfmw,gfebvow-Sqfpjgfmwlm`oj`h>!ajldqbskzlwkfqtjpfsfqnbmfmwEqbm/KbjpKlooztllgf{sbmpjlmpwbmgbqgp?,pwzof=\tqfgv`wjlmGf`fnafq#sqfefqqfg@bnaqjgdflsslmfmwpAvpjmfpp#`lmevpjlm=\t?wjwof=sqfpfmwfgf{sobjmfgglfp#mlw#tlqogtjgfjmwfqeb`fslpjwjlmpmftpsbsfq?,wbaof=\tnlvmwbjmpojhf#wkf#fppfmwjboejmbm`jbopfof`wjlmb`wjlm>!,babmglmfgFgv`bwjlmsbqpfJmw+pwbajojwzvmbaof#wl?,wjwof=\tqfobwjlmpMlwf#wkbwfeej`jfmwsfqelqnfgwtl#zfbqpPjm`f#wkfwkfqfelqftqbssfq!=bowfqmbwfjm`qfbpfgAbwwof#lesfq`fjufgwqzjmd#wlmf`fppbqzslqwqbzfgfof`wjlmpFojybafwk?,jeqbnf=gjp`lufqzjmpvqbm`fp-ofmdwk8ofdfmgbqzDfldqbskz`bmgjgbwf`lqslqbwfplnfwjnfppfquj`fp-jmkfqjwfg?,pwqlmd=@lnnvmjwzqfojdjlvpol`bwjlmp@lnnjwwffavjogjmdpwkf#tlqogml#olmdfqafdjmmjmdqfefqfm`f`bmmlw#afeqfrvfm`zwzsj`boozjmwl#wkf#qfobwjuf8qf`lqgjmdsqfpjgfmwjmjwjboozwf`kmjrvfwkf#lwkfqjw#`bm#aff{jpwfm`fvmgfqojmfwkjp#wjnfwfofsklmfjwfnp`lsfsqb`wj`fpbgubmwbdf*8qfwvqm#Elq#lwkfqsqlujgjmdgfnl`qb`zalwk#wkf#f{wfmpjufpveefqjmdpvsslqwfg`lnsvwfqp#evm`wjlmsqb`wj`bopbjg#wkbwjw#nbz#afFmdojpk?,eqln#wkf#p`kfgvofggltmolbgp?,obafo=\tpvpsf`wfgnbqdjm9#3psjqjwvbo?,kfbg=\t\tnj`qlplewdqbgvboozgjp`vppfgkf#af`bnff{f`vwjufirvfqz-ipklvpfklog`lmejqnfgsvq`kbpfgojwfqboozgfpwqlzfgvs#wl#wkfubqjbwjlmqfnbjmjmdjw#jp#mlw`fmwvqjfpIbsbmfpf#bnlmd#wkf`lnsofwfgbodlqjwknjmwfqfpwpqfafoojlmvmgfejmfgfm`lvqbdfqfpjybaofjmuloujmdpfmpjwjufvmjufqpbosqlujpjlm+bowklvdkefbwvqjmd`lmgv`wfg*/#tkj`k#`lmwjmvfg.kfbgfq!=Efaqvbqz#mvnfqlvp#lufqeolt9`lnslmfmweqbdnfmwpf{`foofmw`lopsbm>!wf`kmj`bomfbq#wkf#Bgubm`fg#plvq`f#lef{sqfppfgKlmd#Hlmd#Eb`fallhnvowjsof#nf`kbmjpnfofubwjlmleefmpjuf?,elqn=\t\npslmplqfggl`vnfmw-lq#%rvlw8wkfqf#bqfwklpf#tklnlufnfmwpsql`fppfpgjeej`vowpvanjwwfgqf`lnnfmg`lmujm`fgsqlnlwjmd!#tjgwk>!-qfsob`f+`obppj`bo`lbojwjlmkjp#ejqpwgf`jpjlmpbppjpwbmwjmgj`bwfgfulovwjlm.tqbssfq!fmlvdk#wlbolmd#wkfgfojufqfg..=\x0E\t?\"..Bnfqj`bm#sqlwf`wfgMlufnafq#?,pwzof=?evqmjwvqfJmwfqmfw##lmaovq>!pvpsfmgfgqf`jsjfmwabpfg#lm#Nlqflufq/balojpkfg`loof`wfgtfqf#nbgffnlwjlmbofnfqdfm`zmbqqbwjufbgul`bwfps{8alqgfq`lnnjwwfggjq>!owq!fnsolzffpqfpfbq`k-#pfof`wfgpv``fpplq`vpwlnfqpgjpsobzfgPfswfnafqbgg@obpp+Eb`fallh#pvddfpwfgbmg#obwfqlsfqbwjmdfobalqbwfPlnfwjnfpJmpwjwvwf`fqwbjmozjmpwboofgelooltfqpIfqvpbofnwkfz#kbuf`lnsvwjmddfmfqbwfgsqlujm`fpdvbqbmwffbqajwqbqzqf`ldmjyftbmwfg#wls{8tjgwk9wkflqz#leafkbujlvqTkjof#wkffpwjnbwfgafdbm#wl#jw#af`bnfnbdmjwvgfnvpw#kbufnlqf#wkbmGjqf`wlqzf{wfmpjlmpf`qfwbqzmbwvqboozl``vqqjmdubqjbaofpdjufm#wkfsobwelqn-?,obafo=?ebjofg#wl`lnslvmgphjmgp#le#pl`jfwjfpbolmdpjgf#..%dw8\t\tplvwktfpwwkf#qjdkwqbgjbwjlmnbz#kbuf#vmfp`bsf+pslhfm#jm!#kqfe>!,sqldqbnnflmoz#wkf#`lnf#eqlngjqf`wlqzavqjfg#jmb#pjnjobqwkfz#tfqf?,elmw=?,Mlqtfdjbmpsf`jejfgsqlgv`jmdsbppfmdfq+mft#Gbwfwfnslqbqzej`wjlmboBewfq#wkffrvbwjlmpgltmolbg-qfdvobqozgfufolsfqbaluf#wkfojmhfg#wlskfmlnfmbsfqjlg#lewllowjs!=pvapwbm`fbvwlnbwj`bpsf`w#leBnlmd#wkf`lmmf`wfgfpwjnbwfpBjq#Elq`fpzpwfn#lelaif`wjufjnnfgjbwfnbhjmd#jwsbjmwjmdp`lmrvfqfgbqf#pwjoosql`fgvqfdqltwk#lekfbgfg#azFvqlsfbm#gjujpjlmpnlof`vofpeqbm`kjpfjmwfmwjlmbwwqb`wfg`kjogkllgbopl#vpfggfgj`bwfgpjmdbslqfgfdqff#leebwkfq#le`lmeoj`wp?,b=?,s=\t`bnf#eqlntfqf#vpfgmlwf#wkbwqf`fjujmdF{f`vwjuffufm#nlqfb``fpp#wl`lnnbmgfqSlojwj`bonvpj`jbmpgfoj`jlvpsqjplmfqpbgufmw#leVWE.;!#,=?\"X@GBWBX!=@lmwb`wPlvwkfqm#ad`lolq>!pfqjfp#le-#Jw#tbp#jm#Fvqlsfsfqnjwwfgubojgbwf-bssfbqjmdleej`jboppfqjlvpoz.obmdvbdfjmjwjbwfgf{wfmgjmdolmd.wfqnjmeobwjlmpv`k#wkbwdfw@llhjfnbqhfg#az?,avwwlm=jnsofnfmwavw#jw#jpjm`qfbpfpgltm#wkf#qfrvjqjmdgfsfmgfmw..=\t?\"..#jmwfqujftTjwk#wkf#`lsjfp#le`lmpfmpvptbp#avjowUfmfyvfob+elqnfqozwkf#pwbwfsfqplmmfopwqbwfdj`ebulvq#lejmufmwjlmTjhjsfgjb`lmwjmfmwujqwvbooztkj`k#tbpsqjm`jsof@lnsofwf#jgfmwj`bopklt#wkbwsqjnjwjufbtbz#eqlnnlof`vobqsqf`jpfozgjpploufgVmgfq#wkfufqpjlm>!=%maps8?,Jw#jp#wkf#Wkjp#jp#tjoo#kbuflqdbmjpnpplnf#wjnfEqjfgqj`ktbp#ejqpwwkf#lmoz#eb`w#wkbwelqn#jg>!sqf`fgjmdWf`kmj`boskzpj`jpwl``vqp#jmmbujdbwlqpf`wjlm!=psbm#jg>!plvdkw#wlafolt#wkfpvqujujmd~?,pwzof=kjp#gfbwkbp#jm#wkf`bvpfg#azsbqwjboozf{jpwjmd#vpjmd#wkftbp#djufmb#ojpw#leofufop#lemlwjlm#leLeej`jbo#gjpnjppfgp`jfmwjpwqfpfnaofpgvsoj`bwff{solpjufqf`lufqfgboo#lwkfqdboofqjfpxsbggjmd9sflsof#leqfdjlm#lebggqfppfpbppl`jbwfjnd#bow>!jm#nlgfqmpklvog#afnfwklg#leqfslqwjmdwjnfpwbnsmffgfg#wlwkf#Dqfbwqfdbqgjmdpffnfg#wlujftfg#bpjnsb`w#lmjgfb#wkbwwkf#Tlqogkfjdkw#lef{sbmgjmdWkfpf#bqf`vqqfmw!=`bqfevooznbjmwbjmp`kbqdf#le@obppj`bobggqfppfgsqfgj`wfgltmfqpkjs?gju#jg>!qjdkw!=\x0E\tqfpjgfm`fofbuf#wkf`lmwfmw!=bqf#lewfm##~*+*8\x0E\tsqlabaoz#Sqlefpplq.avwwlm!#qfpslmgfgpbzp#wkbwkbg#wl#afsob`fg#jmKvmdbqjbmpwbwvp#lepfqufp#bpVmjufqpbof{f`vwjlmbddqfdbwfelq#tkj`kjmef`wjlmbdqffg#wlkltfufq/#slsvobq!=sob`fg#lm`lmpwqv`wfof`wlqbopznalo#lejm`ovgjmdqfwvqm#wlbq`kjwf`w@kqjpwjbmsqfujlvp#ojujmd#jmfbpjfq#wlsqlefpplq\t%ow8\"..#feef`w#lebmbozwj`ptbp#wbhfmtkfqf#wkfwllh#lufqafojfe#jmBeqjhbbmpbp#ebq#bpsqfufmwfgtlqh#tjwkb#psf`jbo?ejfogpfw@kqjpwnbpQfwqjfufg\t\tJm#wkf#ab`h#jmwlmlqwkfbpwnbdbyjmfp=?pwqlmd=`lnnjwwffdlufqmjmddqlvsp#lepwlqfg#jmfpwbaojpkb#dfmfqbojwp#ejqpwwkfjq#ltmslsvobwfgbm#laif`w@bqjaafbmboolt#wkfgjpwqj`wptjp`lmpjmol`bwjlm-8#tjgwk9#jmkbajwfgPl`jbojpwIbmvbqz#2?,ellwfq=pjnjobqoz`klj`f#lewkf#pbnf#psf`jej`#avpjmfpp#Wkf#ejqpw-ofmdwk8#gfpjqf#wlgfbo#tjwkpjm`f#wkfvpfqBdfmw`lm`fjufgjmgf{-sksbp#%rvlw8fmdbdf#jmqf`fmwoz/eft#zfbqptfqf#bopl\t?kfbg=\t?fgjwfg#azbqf#hmltm`jwjfp#jmb``fpphfz`lmgfnmfgbopl#kbufpfquj`fp/ebnjoz#leP`kllo#le`lmufqwfgmbwvqf#le#obmdvbdfnjmjpwfqp?,laif`w=wkfqf#jp#b#slsvobqpfrvfm`fpbgul`bwfgWkfz#tfqfbmz#lwkfqol`bwjlm>fmwfq#wkfnv`k#nlqfqfeof`wfgtbp#mbnfglqjdjmbo#b#wzsj`botkfm#wkfzfmdjmffqp`lvog#mlwqfpjgfmwptfgmfpgbzwkf#wkjqg#sqlgv`wpIbmvbqz#1tkbw#wkfzb#`fqwbjmqfb`wjlmpsql`fpplqbewfq#kjpwkf#obpw#`lmwbjmfg!=?,gju=\t?,b=?,wg=gfsfmg#lmpfbq`k!=\tsjf`fp#le`lnsfwjmdQfefqfm`fwfmmfppfftkj`k#kbp#ufqpjlm>?,psbm=#??,kfbgfq=djufp#wkfkjpwlqjbmubovf>!!=sbggjmd93ujft#wkbwwldfwkfq/wkf#nlpw#tbp#elvmgpvapfw#lebwwb`h#lm`kjogqfm/sljmwp#lesfqplmbo#slpjwjlm9boofdfgoz@ofufobmgtbp#obwfqbmg#bewfqbqf#djufmtbp#pwjoop`qloojmdgfpjdm#lenbhfp#wkfnv`k#ofppBnfqj`bmp-\t\tBewfq#/#avw#wkfNvpfvn#leolvjpjbmb+eqln#wkfnjmmfplwbsbqwj`ofpb#sql`fppGlnjmj`bmulovnf#leqfwvqmjmdgfefmpjuf33s{\x7Fqjdknbgf#eqlnnlvpflufq!#pwzof>!pwbwfp#le+tkj`k#jp`lmwjmvfpEqbm`jp`lavjogjmd#tjwklvw#btjwk#plnftkl#tlvogb#elqn#leb#sbqw#leafelqf#jwhmltm#bp##Pfquj`fpol`bwjlm#bmg#lewfmnfbpvqjmdbmg#jw#jpsbsfqab`hubovfp#le\x0E\t?wjwof=>#tjmglt-gfwfqnjmffq%rvlw8#sobzfg#azbmg#fbqoz?,`fmwfq=eqln#wkjpwkf#wkqffsltfq#bmgle#%rvlw8jmmfqKWNO?b#kqfe>!z9jmojmf8@kvq`k#lewkf#fufmwufqz#kjdkleej`jbo#.kfjdkw9#`lmwfmw>!,`dj.ajm,wl#`qfbwfbeqjhbbmpfpsfqbmwleqbm/Kbjpobwujf)Mvojfwvuj)_(`f)Mwjmb(af)Mwjmb\fUh\fT{\fTN\n{I\np@\x04Fr\x0BBl\bQ\x7F\tA{\x0BUm\x05Gx\tA{\x01yp\x06YA\0zX\bTV\bWl\bUd\x04BM\x0BB{\npV\x0B@x\x04B\\\np@\x04Db\x04Gz\tal\npa\tfM\tuD\bV~\x04mx\x0BQ}\ndS\tp\\\bVK\bS]\bU|\x05oD\tkV\x0Bed\x0BHR\nb~\x04M`\nJp\x05oD\x04|Q\nLP\x04Sw\bTl\nAI\nxC\bWt\tBq\x05F`\x04Cm\x0BLm\tKx\t}t\bPv\ny\\\naB\tV\x7F\nZd\x04XU\x04li\tfr\ti@\tBH\x04BD\x04BV\t`V\n[]\tp_\tTn\n~A\nxR\tuD\t`{\bV@\tTn\tHK\tAJ\x0Bxs\x04Zf\nqI\x04Zf\x0BBM\x0B|j\t}t\bSM\nmC\x0BQ}pfquj`jlpbqw/A`volbqdfmwjmbabq`folmb`vborvjfqsvaoj`bglsqlgv`wlpslo/Awj`bqfpsvfpwbtjhjsfgjbpjdvjfmwfa/Vprvfgb`lnvmjgbgpfdvqjgbgsqjm`jsbosqfdvmwbp`lmwfmjglqfpslmgfqufmfyvfobsqlaofnbpgj`jfnaqfqfob`j/_mmlujfnaqfpjnjobqfpsqlzf`wlpsqldqbnbpjmpwjwvwlb`wjujgbgfm`vfmwqbf`lmln/Abjn/Mdfmfp`lmwb`wbqgfp`bqdbqmf`fpbqjlbwfm`j/_mwfo/Eelml`lnjpj/_m`bm`jlmfp`bsb`jgbgfm`lmwqbqbm/Mojpjpebulqjwlpw/Eqnjmlpsqlujm`jbfwjrvfwbpfofnfmwlpevm`jlmfpqfpvowbgl`bq/M`wfqsqlsjfgbgsqjm`jsjlmf`fpjgbgnvmj`jsbo`qfb`j/_mgfp`bqdbpsqfpfm`jb`lnfq`jbolsjmjlmfpfifq`j`jlfgjwlqjbopbobnbm`bdlmy/Mofygl`vnfmwlsfo/A`vobqf`jfmwfpdfmfqbofpwbqqbdlmbsq/M`wj`bmlufgbgfpsqlsvfpwbsb`jfmwfpw/E`mj`bplaifwjulp`lmwb`wlp\fHB\fIk\fHn\fH^\fHS\fHc\fHU\fId\fHn\fH{\fHC\fHR\fHT\fHR\fHI\fHc\fHY\fHn\fH\\\fHU\fIk\fHy\fIg\fHd\fHy\fIm\fHw\fH\\\fHU\fHR\fH@\fHR\fHJ\fHy\fHU\fHR\fHT\fHA\fIl\fHU\fIm\fHc\fH\\\fHU\fIl\fHB\fId\fHn\fHJ\fHS\fHD\fH@\fHR\fHHgjsolgl`p\fHT\fHB\fHC\fH\\\fIn\fHF\fHD\fHR\fHB\fHF\fHH\fHR\fHG\fHS\fH\\\fHx\fHT\fHH\fHH\fH\\\fHU\fH^\fIg\fH{\fHU\fIm\fHj\fH@\fHR\fH\\\fHJ\fIk\fHZ\fHU\fIm\fHd\fHz\fIk\fH^\fHC\fHJ\fHS\fHy\fHR\fHB\fHY\fIk\fH@\fHH\fIl\fHD\fH@\fIl\fHv\fHB\fI`\fHH\fHT\fHR\fH^\fH^\fIk\fHz\fHp\fIe\fH@\fHB\fHJ\fHJ\fHH\fHI\fHR\fHD\fHU\fIl\fHZ\fHU\fH\\\fHi\fH^\fH{\fHy\fHA\fIl\fHD\fH{\fH\\\fHF\fHR\fHT\fH\\\fHR\fHH\fHy\fHS\fHc\fHe\fHT\fIk\fH{\fHC\fIl\fHU\fIn\fHm\fHj\fH{\fIk\fHs\fIl\fHB\fHz\fIg\fHp\fHy\fHR\fH\\\fHi\fHA\fIl\fH{\fHC\fIk\fHH\fIm\fHB\fHY\fIg\fHs\fHJ\fIk\fHn\fHi\fH{\fH\\\fH|\fHT\fIk\fHB\fIk\fH^\fH^\fH{\fHR\fHU\fHR\fH^\fHf\fHF\fH\\\fHv\fHR\fH\\\fH|\fHT\fHR\fHJ\fIk\fH\\\fHp\fHS\fHT\fHJ\fHS\fH^\fH@\fHn\fHJ\fH@\fHD\fHR\fHU\fIn\fHn\fH^\fHR\fHz\fHp\fIl\fHH\fH@\fHs\fHD\fHB\fHS\fH^\fHk\fHT\fIk\fHj\fHD\fIk\fHD\fHC\fHR\fHy\fIm\fH^\fH^\fIe\fH{\fHA\fHR\fH{\fH\\\fIk\fH^\fHp\fH{\fHU\fH\\\fHR\fHB\fH^\fH{\fIk\fHF\fIk\fHp\fHU\fHR\fHI\fHk\fHT\fIl\fHT\fHU\fIl\fHy\fH^\fHR\fHL\fIl\fHy\fHU\fHR\fHm\fHJ\fIn\fH\\\fHH\fHU\fHH\fHT\fHR\fHH\fHC\fHR\fHJ\fHj\fHC\fHR\fHF\fHR\fHy\fHy\fI`\fHD\fHZ\fHR\fHB\fHJ\fIk\fHz\fHC\fHU\fIl\fH\\\fHR\fHC\fHz\fIm\fHJ\fH^\fH{\fIl`bwfdlqjfpf{sfqjfm`f?,wjwof=\x0E\t@lszqjdkw#ibubp`qjsw`lmgjwjlmpfufqzwkjmd?s#`obpp>!wf`kmloldzab`hdqlvmg?b#`obpp>!nbmbdfnfmw%`lsz8#132ibubP`qjsw`kbqb`wfqpaqfbg`qvnawkfnpfoufpklqjylmwbodlufqmnfmw@bojelqmjbb`wjujwjfpgjp`lufqfgMbujdbwjlmwqbmpjwjlm`lmmf`wjlmmbujdbwjlmbssfbqbm`f?,wjwof=?n`kf`hal{!#wf`kmjrvfpsqlwf`wjlmbssbqfmwozbp#tfoo#bpvmw$/#$VB.qfplovwjlmlsfqbwjlmpwfofujpjlmwqbmpobwfgTbpkjmdwlmmbujdbwlq-#>#tjmglt-jnsqfppjlm%ow8aq%dw8ojwfqbwvqfslsvobwjlmad`lolq>! fpsf`jbooz#`lmwfmw>!sqlgv`wjlmmftpofwwfqsqlsfqwjfpgfejmjwjlmofbgfqpkjsWf`kmloldzSbqojbnfmw`lnsbqjplmvo#`obpp>!-jmgf{Le+!`lm`ovpjlmgjp`vppjlm`lnslmfmwpajloldj`boQfulovwjlm\\`lmwbjmfqvmgfqpwllgmlp`qjsw=?sfqnjppjlmfb`k#lwkfqbwnlpskfqf#lmel`vp>!?elqn#jg>!sql`fppjmdwkjp-ubovfdfmfqbwjlm@lmefqfm`fpvapfrvfmwtfoo.hmltmubqjbwjlmpqfsvwbwjlmskfmlnfmlmgjp`jsojmfoldl-smd!#+gl`vnfmw/alvmgbqjfpf{sqfppjlmpfwwofnfmwAb`hdqlvmglvw#le#wkffmwfqsqjpf+!kwwsp9!#vmfp`bsf+!sbpptlqg!#gfnl`qbwj`?b#kqfe>!,tqbssfq!=\tnfnafqpkjsojmdvjpwj`s{8sbggjmdskjolplskzbppjpwbm`fvmjufqpjwzeb`jojwjfpqf`ldmjyfgsqfefqfm`fje#+wzsflenbjmwbjmfgul`bavobqzkzslwkfpjp-pvanjw+*8%bns8maps8bmmlwbwjlmafkjmg#wkfElvmgbwjlmsvaojpkfq!bppvnswjlmjmwqlgv`fg`lqqvswjlmp`jfmwjpwpf{soj`jwozjmpwfbg#legjnfmpjlmp#lm@oj`h>!`lmpjgfqfggfsbqwnfmwl``vsbwjlmpllm#bewfqjmufpwnfmwsqlmlvm`fgjgfmwjejfgf{sfqjnfmwNbmbdfnfmwdfldqbskj`!#kfjdkw>!ojmh#qfo>!-qfsob`f+,gfsqfppjlm`lmefqfm`fsvmjpknfmwfojnjmbwfgqfpjpwbm`fbgbswbwjlmlsslpjwjlmtfoo#hmltmpvssofnfmwgfwfqnjmfgk2#`obpp>!3s{8nbqdjmnf`kbmj`bopwbwjpwj`p`fofaqbwfgDlufqmnfmw\t\tGvqjmd#wgfufolsfqpbqwjej`jbofrvjubofmwlqjdjmbwfg@lnnjppjlmbwwb`knfmw?psbm#jg>!wkfqf#tfqfMfgfqobmgpafzlmg#wkfqfdjpwfqfgilvqmbojpweqfrvfmwozboo#le#wkfobmd>!fm!#?,pwzof=\x0E\tbaplovwf8#pvsslqwjmdf{wqfnfoz#nbjmpwqfbn?,pwqlmd=#slsvobqjwzfnsolznfmw?,wbaof=\x0E\t#`lopsbm>!?,elqn=\t##`lmufqpjlmbalvw#wkf#?,s=?,gju=jmwfdqbwfg!#obmd>!fmSlqwvdvfpfpvapwjwvwfjmgjujgvbojnslppjaofnvowjnfgjbbonlpw#boos{#plojg# bsbqw#eqlnpvaif`w#wljm#Fmdojpk`qjwj`jyfgf{`fsw#elqdvjgfojmfplqjdjmboozqfnbqhbaofwkf#pf`lmgk1#`obpp>!?b#wjwof>!+jm`ovgjmdsbqbnfwfqpsqlkjajwfg>#!kwws9,,gj`wjlmbqzsfq`fswjlmqfulovwjlmelvmgbwjlms{8kfjdkw9pv``fppevopvsslqwfqpnjoofmmjvnkjp#ebwkfqwkf#%rvlw8ml.qfsfbw8`lnnfq`jbojmgvpwqjbofm`lvqbdfgbnlvmw#le#vmleej`jbofeej`jfm`zQfefqfm`fp`llqgjmbwfgjp`objnfqf{sfgjwjlmgfufolsjmd`bo`vobwfgpjnsojejfgofdjwjnbwfpvapwqjmd+3!#`obpp>!`lnsofwfozjoovpwqbwfejuf#zfbqpjmpwqvnfmwSvaojpkjmd2!#`obpp>!spz`kloldz`lmejgfm`fmvnafq#le#bapfm`f#leel`vpfg#lmiljmfg#wkfpwqv`wvqfpsqfujlvpoz=?,jeqbnf=lm`f#bdbjmavw#qbwkfqjnnjdqbmwple#`lvqpf/b#dqlvs#leOjwfqbwvqfVmojhf#wkf?,b=%maps8\tevm`wjlm#jw#tbp#wkf@lmufmwjlmbvwlnlajofSqlwfpwbmwbddqfppjufbewfq#wkf#Pjnjobqoz/!#,=?,gju=`loof`wjlm\x0E\tevm`wjlmujpjajojwzwkf#vpf#leulovmwffqpbwwqb`wjlmvmgfq#wkf#wkqfbwfmfg)?\"X@GBWBXjnslqwbm`fjm#dfmfqbowkf#obwwfq?,elqn=\t?,-jmgf{Le+$j#>#38#j#?gjeefqfm`fgfulwfg#wlwqbgjwjlmppfbq`k#elqvowjnbwfozwlvqmbnfmwbwwqjavwfppl.`boofg#~\t?,pwzof=fubovbwjlmfnskbpjyfgb``fppjaof?,pf`wjlm=pv``fppjlmbolmd#tjwkNfbmtkjof/jmgvpwqjfp?,b=?aq#,=kbp#af`lnfbpsf`wp#leWfofujpjlmpveej`jfmwabphfwabooalwk#pjgfp`lmwjmvjmdbm#bqwj`of?jnd#bow>!bgufmwvqfpkjp#nlwkfqnbm`kfpwfqsqjm`jsofpsbqwj`vobq`lnnfmwbqzfeef`wp#legf`jgfg#wl!=?pwqlmd=svaojpkfqpIlvqmbo#legjeej`vowzeb`jojwbwfb``fswbaofpwzof-`pp!\nevm`wjlm#jmmlubwjlm=@lszqjdkwpjwvbwjlmptlvog#kbufavpjmfppfpGj`wjlmbqzpwbwfnfmwplewfm#vpfgsfqpjpwfmwjm#Ibmvbqz`lnsqjpjmd?,wjwof=\t\ngjsolnbwj``lmwbjmjmdsfqelqnjmdf{wfmpjlmpnbz#mlw#af`lm`fsw#le#lm`oj`h>!Jw#jp#boplejmbm`jbo#nbhjmd#wkfOv{fnalvqdbggjwjlmbobqf#`boofgfmdbdfg#jm!p`qjsw!*8avw#jw#tbpfof`wqlmj`lmpvanjw>!\t?\"..#Fmg#fof`wqj`boleej`jboozpvddfpwjlmwls#le#wkfvmojhf#wkfBvpwqbojbmLqjdjmboozqfefqfm`fp\t?,kfbg=\x0E\tqf`ldmjpfgjmjwjbojyfojnjwfg#wlBof{bmgqjbqfwjqfnfmwBgufmwvqfpelvq#zfbqp\t\t%ow8\"..#jm`qfbpjmdgf`lqbwjlmk0#`obpp>!lqjdjmp#lelaojdbwjlmqfdvobwjlm`obppjejfg+evm`wjlm+bgubmwbdfpafjmd#wkf#kjpwlqjbmp?abpf#kqfeqfsfbwfgoztjoojmd#wl`lnsbqbaofgfpjdmbwfgmlnjmbwjlmevm`wjlmbojmpjgf#wkfqfufobwjlmfmg#le#wkfp#elq#wkf#bvwklqjyfgqfevpfg#wlwbhf#sob`fbvwlmlnlvp`lnsqlnjpfslojwj`bo#qfpwbvqbmwwtl#le#wkfEfaqvbqz#1rvbojwz#leptelaif`w-vmgfqpwbmgmfbqoz#bootqjwwfm#azjmwfqujftp!#tjgwk>!2tjwkgqbtboeolbw9ofewjp#vpvbooz`bmgjgbwfpmftpsbsfqpnzpwfqjlvpGfsbqwnfmwafpw#hmltmsbqojbnfmwpvssqfppfg`lmufmjfmwqfnfnafqfggjeefqfmw#pzpwfnbwj`kbp#ofg#wlsqlsbdbmgb`lmwqloofgjmeovfm`fp`fqfnlmjbosql`objnfgSqlwf`wjlmoj#`obpp>!P`jfmwjej``obpp>!ml.wqbgfnbqhpnlqf#wkbm#tjgfpsqfbgOjafqbwjlmwllh#sob`fgbz#le#wkfbp#olmd#bpjnsqjplmfgBggjwjlmbo\t?kfbg=\t?nObalqbwlqzMlufnafq#1f{`fswjlmpJmgvpwqjboubqjfwz#leeolbw9#ofeGvqjmd#wkfbppfppnfmwkbuf#affm#gfbop#tjwkPwbwjpwj`pl``vqqfm`f,vo=?,gju=`ofbqej{!=wkf#svaoj`nbmz#zfbqptkj`k#tfqflufq#wjnf/pzmlmznlvp`lmwfmw!=\tsqfpvnbaozkjp#ebnjozvpfqBdfmw-vmf{sf`wfgjm`ovgjmd#`kboofmdfgb#njmlqjwzvmgfejmfg!afolmdp#wlwbhfm#eqlnjm#L`wlafqslpjwjlm9#pbjg#wl#afqfojdjlvp#Efgfqbwjlm#qltpsbm>!lmoz#b#eftnfbmw#wkbwofg#wl#wkf..=\x0E\t?gju#?ejfogpfw=Bq`kajpkls#`obpp>!mlafjmd#vpfgbssqlb`kfpsqjujofdfpmlp`qjsw=\tqfpvowp#jmnbz#af#wkfFbpwfq#fddnf`kbmjpnpqfbplmbaofSlsvobwjlm@loof`wjlmpfof`wfg!=mlp`qjsw=\x0E,jmgf{-sksbqqjubo#le.ippgh$**8nbmbdfg#wljm`lnsofwf`bpvbowjfp`lnsofwjlm@kqjpwjbmpPfswfnafq#bqjwknfwj`sql`fgvqfpnjdkw#kbufSqlgv`wjlmjw#bssfbqpSkjolplskzeqjfmgpkjsofbgjmd#wldjujmd#wkfwltbqg#wkfdvbqbmwffggl`vnfmwfg`lolq9 333ujgfl#dbnf`lnnjppjlmqfeof`wjmd`kbmdf#wkfbppl`jbwfgpbmp.pfqjelmhfzsqfpp8#sbggjmd9Kf#tbp#wkfvmgfqozjmdwzsj`booz#/#bmg#wkf#pq`Fofnfmwpv``fppjufpjm`f#wkf#pklvog#af#mfwtlqhjmdb``lvmwjmdvpf#le#wkfoltfq#wkbmpkltp#wkbw?,psbm=\t\n\n`lnsobjmwp`lmwjmvlvprvbmwjwjfpbpwqlmlnfqkf#gjg#mlwgvf#wl#jwpbssojfg#wlbm#bufqbdffeelqwp#wlwkf#evwvqfbwwfnsw#wlWkfqfelqf/`bsbajojwzQfsvaoj`bmtbp#elqnfgFof`wqlmj`hjolnfwfqp`kboofmdfpsvaojpkjmdwkf#elqnfqjmgjdfmlvpgjqf`wjlmppvapjgjbqz`lmpsjqb`zgfwbjop#lebmg#jm#wkfbeelqgbaofpvapwbm`fpqfbplm#elq`lmufmwjlmjwfnwzsf>!baplovwfozpvsslpfgozqfnbjmfg#bbwwqb`wjufwqbufoojmdpfsbqbwfozel`vpfp#lmfofnfmwbqzbssoj`baofelvmg#wkbwpwzofpkffwnbmvp`qjswpwbmgp#elq#ml.qfsfbw+plnfwjnfp@lnnfq`jbojm#Bnfqj`bvmgfqwbhfmrvbqwfq#lebm#f{bnsofsfqplmboozjmgf{-sks!owqOjfvwfmbmw\t?gju#jg>!wkfz#tlvogbajojwz#lenbgf#vs#lemlwfg#wkbw`ofbq#wkbwbqdvf#wkbwwl#bmlwkfq`kjogqfm$psvqslpf#leelqnvobwfgabpfg#vslmwkf#qfdjlmpvaif`w#lesbppfmdfqpslppfppjlm-\t\tJm#wkf#Afelqf#wkfbewfqtbqgp`vqqfmwoz#b`qlpp#wkfp`jfmwjej``lnnvmjwz-`bsjwbojpnjm#Dfqnbmzqjdkw.tjmdwkf#pzpwfnPl`jfwz#leslojwj`jbmgjqf`wjlm9tfmw#lm#wlqfnlubo#le#Mft#Zlqh#bsbqwnfmwpjmgj`bwjlmgvqjmd#wkfvmofpp#wkfkjpwlqj`bokbg#affm#bgfejmjwjufjmdqfgjfmwbwwfmgbm`f@fmwfq#elqsqlnjmfm`fqfbgzPwbwfpwqbwfdjfpavw#jm#wkfbp#sbqw#le`lmpwjwvwf`objn#wkbwobalqbwlqz`lnsbwjaofebjovqf#le/#pv`k#bp#afdbm#tjwkvpjmd#wkf#wl#sqlujgfefbwvqf#leeqln#tkj`k,!#`obpp>!dfloldj`bopfufqbo#legfojafqbwfjnslqwbmw#klogp#wkbwjmd%rvlw8#ubojdm>wlswkf#Dfqnbmlvwpjgf#lemfdlwjbwfgkjp#`bqffqpfsbqbwjlmjg>!pfbq`ktbp#`boofgwkf#elvqwkqf`qfbwjlmlwkfq#wkbmsqfufmwjlmtkjof#wkf#fgv`bwjlm/`lmmf`wjmdb``vqbwfoztfqf#avjowtbp#hjoofgbdqffnfmwpnv`k#nlqf#Gvf#wl#wkftjgwk9#233plnf#lwkfqHjmdgln#lewkf#fmwjqfebnlvp#elqwl#`lmmf`wlaif`wjufpwkf#Eqfm`ksflsof#bmgefbwvqfg!=jp#pbjg#wlpwqv`wvqboqfefqfmgvnnlpw#lewfmb#pfsbqbwf.=\t?gju#jg#Leej`jbo#tlqogtjgf-bqjb.obafowkf#sobmfwbmg#jw#tbpg!#ubovf>!ollhjmd#bwafmfej`jbobqf#jm#wkfnlmjwlqjmdqfslqwfgozwkf#nlgfqmtlqhjmd#lmbooltfg#wltkfqf#wkf#jmmlubwjuf?,b=?,gju=plvmgwqb`hpfbq`kElqnwfmg#wl#afjmsvw#jg>!lsfmjmd#leqfpwqj`wfgbglswfg#azbggqfppjmdwkfloldjbmnfwklgp#leubqjbmw#le@kqjpwjbm#ufqz#obqdfbvwlnlwjufaz#ebq#wkfqbmdf#eqlnsvqpvjw#leeloolt#wkfaqlvdkw#wljm#Fmdobmgbdqff#wkbwb``vpfg#le`lnfp#eqlnsqfufmwjmdgju#pwzof>kjp#lq#kfqwqfnfmglvpeqffgln#le`lm`fqmjmd3#2fn#2fn8Abphfwaboo,pwzof-`ppbm#fbqojfqfufm#bewfq,!#wjwof>!-`ln,jmgf{wbhjmd#wkfsjwwpavqdk`lmwfmw!=\x0E?p`qjsw=+ewvqmfg#lvwkbujmd#wkf?,psbm=\x0E\t#l``bpjlmboaf`bvpf#jwpwbqwfg#wlskzpj`booz=?,gju=\t##`qfbwfg#az@vqqfmwoz/#ad`lolq>!wbajmgf{>!gjpbpwqlvpBmbozwj`p#bopl#kbp#b=?gju#jg>!?,pwzof=\t?`boofg#elqpjmdfq#bmg-pq`#>#!,,ujlobwjlmpwkjp#sljmw`lmpwbmwozjp#ol`bwfgqf`lqgjmdpg#eqln#wkfmfgfqobmgpslqwvdv/Fp;N;};D;u;F5m4K4]4_7`gfpbqqlool`lnfmwbqjlfgv`b`j/_mpfswjfnaqfqfdjpwqbglgjqf``j/_mvaj`b`j/_msvaoj`jgbgqfpsvfpwbpqfpvowbglpjnslqwbmwfqfpfqubglpbqw/A`volpgjefqfmwfppjdvjfmwfpqfs/Vaoj`bpjwvb`j/_mnjmjpwfqjlsqjub`jgbggjqf`wlqjlelqnb`j/_mslaob`j/_msqfpjgfmwf`lmw", "fmjglpb``fplqjlpwf`kmlqbwjsfqplmbofp`bwfdlq/Abfpsf`jbofpgjpslmjaofb`wvbojgbgqfefqfm`jbuboobglojgajaojlwf`bqfob`jlmfp`bofmgbqjlslo/Awj`bpbmwfqjlqfpgl`vnfmwlpmbwvqbofybnbwfqjbofpgjefqfm`jbf`lm/_nj`bwqbmpslqwfqlgq/Advfysbqwj`jsbqfm`vfmwqbmgjp`vpj/_mfpwqv`wvqbevmgb`j/_meqf`vfmwfpsfqnbmfmwfwlwbonfmwf!2s{#plojg# -dje!#bow>!wqbmpsbqfmwjmelqnbwjlmbssoj`bwjlm!#lm`oj`h>!fpwbaojpkfgbgufqwjpjmd-smd!#bow>!fmujqlmnfmwsfqelqnbm`fbssqlsqjbwf%bns8ngbpk8jnnfgjbwfoz?,pwqlmd=?,qbwkfq#wkbmwfnsfqbwvqfgfufolsnfmw`lnsfwjwjlmsob`fklogfqujpjajojwz9`lszqjdkw!=3!#kfjdkw>!fufm#wklvdkqfsob`fnfmwgfpwjmbwjlm@lqslqbwjlm?vo#`obpp>!Bppl`jbwjlmjmgjujgvbopsfqpsf`wjufpfwWjnflvw+vqo+kwws9,,nbwkfnbwj`pnbqdjm.wls9fufmwvbooz#gfp`qjswjlm*#ml.qfsfbw`loof`wjlmp-ISD\x7Fwkvna\x7Fsbqwj`jsbwf,kfbg=?algzeolbw9ofew8?oj#`obpp>!kvmgqfgp#le\t\tKltfufq/#`lnslpjwjlm`ofbq9alwk8`llsfqbwjlmtjwkjm#wkf#obafo#elq>!alqgfq.wls9Mft#Yfbobmgqf`lnnfmgfgsklwldqbskzjmwfqfpwjmd%ow8pvs%dw8`lmwqlufqpzMfwkfqobmgpbowfqmbwjufnb{ofmdwk>!ptjwyfqobmgGfufolsnfmwfppfmwjbooz\t\tBowklvdk#?,wf{wbqfb=wkvmgfqajqgqfsqfpfmwfg%bns8mgbpk8psf`vobwjlm`lnnvmjwjfpofdjpobwjlmfof`wqlmj`p\t\n?gju#jg>!joovpwqbwfgfmdjmffqjmdwfqqjwlqjfpbvwklqjwjfpgjpwqjavwfg5!#kfjdkw>!pbmp.pfqje8`bsbaof#le#gjpbssfbqfgjmwfqb`wjufollhjmd#elqjw#tlvog#afBedkbmjpwbmtbp#`qfbwfgNbwk-eollq+pvqqlvmgjmd`bm#bopl#aflapfqubwjlmnbjmwfmbm`ffm`lvmwfqfg?k1#`obpp>!nlqf#qf`fmwjw#kbp#affmjmubpjlm#le*-dfwWjnf+*evmgbnfmwboGfpsjwf#wkf!=?gju#jg>!jmpsjqbwjlmf{bnjmbwjlmsqfsbqbwjlmf{sobmbwjlm?jmsvw#jg>!?,b=?,psbm=ufqpjlmp#lejmpwqvnfmwpafelqf#wkf##>#$kwws9,,Gfp`qjswjlmqfobwjufoz#-pvapwqjmd+fb`k#le#wkff{sfqjnfmwpjmeovfmwjbojmwfdqbwjlmnbmz#sflsofgvf#wl#wkf#`lnajmbwjlmgl#mlw#kbufNjggof#Fbpw?mlp`qjsw=?`lszqjdkw!#sfqkbsp#wkfjmpwjwvwjlmjm#Gf`fnafqbqqbmdfnfmwnlpw#ebnlvpsfqplmbojwz`qfbwjlm#leojnjwbwjlmpf{`ovpjufozplufqfjdmwz.`lmwfmw!=\t?wg#`obpp>!vmgfqdqlvmgsbqboofo#wlgl`wqjmf#lel``vsjfg#azwfqnjmloldzQfmbjppbm`fb#mvnafq#lepvsslqw#elqf{solqbwjlmqf`ldmjwjlmsqfgf`fpplq?jnd#pq`>!,?k2#`obpp>!svaoj`bwjlmnbz#bopl#afpsf`jbojyfg?,ejfogpfw=sqldqfppjufnjoojlmp#lepwbwfp#wkbwfmelq`fnfmwbqlvmg#wkf#lmf#bmlwkfq-sbqfmwMlgfbdqj`vowvqfBowfqmbwjufqfpfbq`kfqpwltbqgp#wkfNlpw#le#wkfnbmz#lwkfq#+fpsf`jbooz?wg#tjgwk>!8tjgwk9233&jmgfsfmgfmw?k0#`obpp>!#lm`kbmdf>!*-bgg@obpp+jmwfqb`wjlmLmf#le#wkf#gbvdkwfq#leb``fpplqjfpaqbm`kfp#le\x0E\t?gju#jg>!wkf#obqdfpwgf`obqbwjlmqfdvobwjlmpJmelqnbwjlmwqbmpobwjlmgl`vnfmwbqzjm#lqgfq#wl!=\t?kfbg=\t?!#kfjdkw>!2b`qlpp#wkf#lqjfmwbwjlm*8?,p`qjsw=jnsofnfmwfg`bm#af#pffmwkfqf#tbp#bgfnlmpwqbwf`lmwbjmfq!=`lmmf`wjlmpwkf#Aqjwjpktbp#tqjwwfm\"jnslqwbmw8s{8#nbqdjm.elooltfg#azbajojwz#wl#`lnsoj`bwfggvqjmd#wkf#jnnjdqbwjlmbopl#`boofg?k7#`obpp>!gjpwjm`wjlmqfsob`fg#azdlufqmnfmwpol`bwjlm#lejm#Mlufnafqtkfwkfq#wkf?,s=\t?,gju=b`rvjpjwjlm`boofg#wkf#sfqpf`vwjlmgfpjdmbwjlmxelmw.pjyf9bssfbqfg#jmjmufpwjdbwff{sfqjfm`fgnlpw#ojhfoztjgfoz#vpfggjp`vppjlmpsqfpfm`f#le#+gl`vnfmw-f{wfmpjufozJw#kbp#affmjw#glfp#mlw`lmwqbqz#wljmkbajwbmwpjnsqlufnfmwp`klobqpkjs`lmpvnswjlmjmpwqv`wjlmelq#f{bnsoflmf#lq#nlqfs{8#sbggjmdwkf#`vqqfmwb#pfqjfp#lebqf#vpvboozqlof#jm#wkfsqfujlvpoz#gfqjubwjufpfujgfm`f#lef{sfqjfm`fp`lolqp`kfnfpwbwfg#wkbw`fqwjej`bwf?,b=?,gju=\t#pfof`wfg>!kjdk#p`klloqfpslmpf#wl`lnelqwbaofbglswjlm#lewkqff#zfbqpwkf#`lvmwqzjm#Efaqvbqzpl#wkbw#wkfsflsof#tkl#sqlujgfg#az?sbqbn#mbnfbeef`wfg#azjm#wfqnp#lebssljmwnfmwJPL.;;6:.2!tbp#alqm#jmkjpwlqj`bo#qfdbqgfg#bpnfbpvqfnfmwjp#abpfg#lm#bmg#lwkfq#9#evm`wjlm+pjdmjej`bmw`fofaqbwjlmwqbmpnjwwfg,ip,irvfqz-jp#hmltm#bpwkflqfwj`bo#wbajmgf{>!jw#`lvog#af?mlp`qjsw=\tkbujmd#affm\x0E\t?kfbg=\x0E\t?#%rvlw8Wkf#`lnsjobwjlmkf#kbg#affmsqlgv`fg#azskjolplskfq`lmpwqv`wfgjmwfmgfg#wlbnlmd#lwkfq`lnsbqfg#wlwl#pbz#wkbwFmdjmffqjmdb#gjeefqfmwqfefqqfg#wlgjeefqfm`fpafojfe#wkbwsklwldqbskpjgfmwjezjmdKjpwlqz#le#Qfsvaoj`#lemf`fppbqjozsqlabajojwzwf`kmj`boozofbujmd#wkfpsf`wb`vobqeqb`wjlm#lefof`wqj`jwzkfbg#le#wkfqfpwbvqbmwpsbqwmfqpkjsfnskbpjp#lmnlpw#qf`fmwpkbqf#tjwk#pbzjmd#wkbwejoofg#tjwkgfpjdmfg#wljw#jp#lewfm!=?,jeqbnf=bp#elooltp9nfqdfg#tjwkwkqlvdk#wkf`lnnfq`jbo#sljmwfg#lvwlsslqwvmjwzujft#le#wkfqfrvjqfnfmwgjujpjlm#lesqldqbnnjmdkf#qf`fjufgpfwJmwfqubo!=?,psbm=?,jm#Mft#Zlqhbggjwjlmbo#`lnsqfppjlm\t\t?gju#jg>!jm`lqslqbwf8?,p`qjsw=?bwwb`kFufmwaf`bnf#wkf#!#wbqdfw>!\\`bqqjfg#lvwPlnf#le#wkfp`jfm`f#bmgwkf#wjnf#le@lmwbjmfq!=nbjmwbjmjmd@kqjpwlskfqNv`k#le#wkftqjwjmdp#le!#kfjdkw>!1pjyf#le#wkfufqpjlm#le#nj{wvqf#le#afwtffm#wkfF{bnsofp#lefgv`bwjlmbo`lnsfwjwjuf#lmpvanjw>!gjqf`wlq#legjpwjm`wjuf,GWG#[KWNO#qfobwjmd#wlwfmgfm`z#wlsqlujm`f#letkj`k#tlvoggfpsjwf#wkfp`jfmwjej`#ofdjpobwvqf-jmmfqKWNO#boofdbwjlmpBdqj`vowvqftbp#vpfg#jmbssqlb`k#wljmwfoojdfmwzfbqp#obwfq/pbmp.pfqjegfwfqnjmjmdSfqelqnbm`fbssfbqbm`fp/#tkj`k#jp#elvmgbwjlmpbaaqfujbwfgkjdkfq#wkbmp#eqln#wkf#jmgjujgvbo#`lnslpfg#lepvsslpfg#wl`objnp#wkbwbwwqjavwjlmelmw.pjyf92fofnfmwp#leKjpwlqj`bo#kjp#aqlwkfqbw#wkf#wjnfbmmjufqpbqzdlufqmfg#azqfobwfg#wl#vowjnbwfoz#jmmlubwjlmpjw#jp#pwjoo`bm#lmoz#afgfejmjwjlmpwlDNWPwqjmdB#mvnafq#lejnd#`obpp>!Fufmwvbooz/tbp#`kbmdfgl``vqqfg#jmmfjdkalqjmdgjpwjmdvjpktkfm#kf#tbpjmwqlgv`jmdwfqqfpwqjboNbmz#le#wkfbqdvfp#wkbwbm#Bnfqj`bm`lmrvfpw#letjgfpsqfbg#tfqf#hjoofgp`qffm#bmg#Jm#lqgfq#wlf{sf`wfg#wlgfp`fmgbmwpbqf#ol`bwfgofdjpobwjufdfmfqbwjlmp#ab`hdqlvmgnlpw#sflsofzfbqp#bewfqwkfqf#jp#mlwkf#kjdkfpweqfrvfmwoz#wkfz#gl#mlwbqdvfg#wkbwpkltfg#wkbwsqfglnjmbmwwkfloldj`boaz#wkf#wjnf`lmpjgfqjmdpklqw.ojufg?,psbm=?,b=`bm#af#vpfgufqz#ojwwoflmf#le#wkf#kbg#boqfbgzjmwfqsqfwfg`lnnvmj`bwfefbwvqfp#ledlufqmnfmw/?,mlp`qjsw=fmwfqfg#wkf!#kfjdkw>!0Jmgfsfmgfmwslsvobwjlmpobqdf.p`bof-#Bowklvdk#vpfg#jm#wkfgfpwqv`wjlmslppjajojwzpwbqwjmd#jmwtl#lq#nlqff{sqfppjlmppvalqgjmbwfobqdfq#wkbmkjpwlqz#bmg?,lswjlm=\x0E\t@lmwjmfmwbofojnjmbwjmdtjoo#mlw#afsqb`wj`f#lejm#eqlmw#lepjwf#le#wkffmpvqf#wkbwwl#`qfbwf#bnjppjppjssjslwfmwjboozlvwpwbmgjmdafwwfq#wkbmtkbw#jp#mltpjwvbwfg#jmnfwb#mbnf>!WqbgjwjlmbopvddfpwjlmpWqbmpobwjlmwkf#elqn#lebwnlpskfqj`jgfloldj`bofmwfqsqjpfp`bo`vobwjmdfbpw#le#wkfqfnmbmwp#lesovdjmpsbdf,jmgf{-sks!Wkjp#jp#wkf#?b#kqfe>!,slsvobqjyfgjmuloufg#jmbqf#vpfg#wlbmg#pfufqbonbgf#az#wkfpffnp#wl#afojhfoz#wkbwSbofpwjmjbmmbnfg#bewfqjw#kbg#affmnlpw#`lnnlmwl#qfefq#wlavw#wkjp#jp`lmpf`vwjufwfnslqbqjozJm#dfmfqbo/`lmufmwjlmpwbhfp#sob`fpvagjujpjlmwfqqjwlqjbolsfqbwjlmbosfqnbmfmwoztbp#obqdfozlvwaqfbh#lejm#wkf#sbpwelooltjmd#b#{nomp9ld>!=?b#`obpp>!`obpp>!wf{w@lmufqpjlm#nbz#af#vpfgnbmveb`wvqfbewfq#afjmd`ofbqej{!=\trvfpwjlm#letbp#fof`wfgwl#af`lnf#baf`bvpf#le#plnf#sflsofjmpsjqfg#azpv``fppevo#b#wjnf#tkfmnlqf#`lnnlmbnlmdpw#wkfbm#leej`jbotjgwk9233&8wf`kmloldz/tbp#bglswfgwl#hffs#wkfpfwwofnfmwpojuf#ajqwkpjmgf{-kwno!@lmmf`wj`vwbppjdmfg#wl%bns8wjnfp8b``lvmw#elqbojdm>qjdkwwkf#`lnsbmzbotbzp#affmqfwvqmfg#wljmuloufnfmwAf`bvpf#wkfwkjp#sfqjlg!#mbnf>!r!#`lmejmfg#wlb#qfpvow#leubovf>!!#,=jp#b`wvboozFmujqlmnfmw\x0E\t?,kfbg=\x0E\t@lmufqpfoz/=\t?gju#jg>!3!#tjgwk>!2jp#sqlabaozkbuf#af`lnf`lmwqloojmdwkf#sqlaofn`jwjyfmp#leslojwj`jbmpqfb`kfg#wkfbp#fbqoz#bp9mlmf8#lufq?wbaof#`fooubojgjwz#legjqf`woz#wllmnlvpfgltmtkfqf#jw#jptkfm#jw#tbpnfnafqp#le#qfobwjlm#wlb``lnnlgbwfbolmd#tjwk#Jm#wkf#obwfwkf#Fmdojpkgfoj`jlvp!=wkjp#jp#mlwwkf#sqfpfmwje#wkfz#bqfbmg#ejmboozb#nbwwfq#le\x0E\t\n?,gju=\x0E\t\x0E\t?,p`qjsw=ebpwfq#wkbmnbilqjwz#lebewfq#tkj`k`lnsbqbwjufwl#nbjmwbjmjnsqluf#wkfbtbqgfg#wkffq!#`obpp>!eqbnfalqgfqqfpwlqbwjlmjm#wkf#pbnfbmbozpjp#lewkfjq#ejqpwGvqjmd#wkf#`lmwjmfmwbopfrvfm`f#leevm`wjlm+*xelmw.pjyf9#tlqh#lm#wkf?,p`qjsw=\t?afdjmp#tjwkibubp`qjsw9`lmpwjwvfmwtbp#elvmgfgfrvjojaqjvnbppvnf#wkbwjp#djufm#azmffgp#wl#af`llqgjmbwfpwkf#ubqjlvpbqf#sbqw#lelmoz#jm#wkfpf`wjlmp#lejp#b#`lnnlmwkflqjfp#legjp`lufqjfpbppl`jbwjlmfgdf#le#wkfpwqfmdwk#leslpjwjlm#jmsqfpfmw.gbzvmjufqpboozwl#elqn#wkfavw#jmpwfbg`lqslqbwjlmbwwb`kfg#wljp#`lnnlmozqfbplmp#elq#%rvlw8wkf#`bm#af#nbgftbp#baof#wltkj`k#nfbmpavw#gjg#mlwlmNlvpfLufqbp#slppjaoflsfqbwfg#az`lnjmd#eqlnwkf#sqjnbqzbggjwjlm#leelq#pfufqbowqbmpefqqfgb#sfqjlg#lebqf#baof#wlkltfufq/#jwpklvog#kbufnv`k#obqdfq\t\n?,p`qjsw=bglswfg#wkfsqlsfqwz#legjqf`wfg#azfeef`wjufoztbp#aqlvdkw`kjogqfm#leSqldqbnnjmdolmdfq#wkbmnbmvp`qjswptbq#bdbjmpwaz#nfbmp#lebmg#nlpw#lepjnjobq#wl#sqlsqjfwbqzlqjdjmbwjmdsqfpwjdjlvpdqbnnbwj`bof{sfqjfm`f-wl#nbhf#wkfJw#tbp#bopljp#elvmg#jm`lnsfwjwlqpjm#wkf#V-P-qfsob`f#wkfaqlvdkw#wkf`bo`vobwjlmeboo#le#wkfwkf#dfmfqbosqb`wj`boozjm#klmlq#leqfofbpfg#jmqfpjgfmwjbobmg#plnf#lehjmd#le#wkfqfb`wjlm#wl2pw#Fbqo#le`vowvqf#bmgsqjm`jsbooz?,wjwof=\t##wkfz#`bm#afab`h#wl#wkfplnf#le#kjpf{slpvqf#wlbqf#pjnjobqelqn#le#wkfbggEbulqjwf`jwjyfmpkjssbqw#jm#wkfsflsof#tjwkjm#sqb`wj`fwl#`lmwjmvf%bns8njmvp8bssqlufg#az#wkf#ejqpw#booltfg#wkfbmg#elq#wkfevm`wjlmjmdsobzjmd#wkfplovwjlm#wlkfjdkw>!3!#jm#kjp#allhnlqf#wkbm#belooltp#wkf`qfbwfg#wkfsqfpfm`f#jm%maps8?,wg=mbwjlmbojpwwkf#jgfb#leb#`kbqb`wfqtfqf#elq`fg#`obpp>!awmgbzp#le#wkfefbwvqfg#jmpkltjmd#wkfjmwfqfpw#jmjm#sob`f#lewvqm#le#wkfwkf#kfbg#leOlqg#le#wkfslojwj`boozkbp#jwp#ltmFgv`bwjlmbobssqlubo#leplnf#le#wkffb`k#lwkfq/afkbujlq#lebmg#af`bvpfbmg#bmlwkfqbssfbqfg#lmqf`lqgfg#jmaob`h%rvlw8nbz#jm`ovgfwkf#tlqog$p`bm#ofbg#wlqfefqp#wl#balqgfq>!3!#dlufqmnfmw#tjmmjmd#wkfqfpvowfg#jm#tkjof#wkf#Tbpkjmdwlm/wkf#pvaif`w`jwz#jm#wkf=?,gju=\x0E\t\n\nqfeof`w#wkfwl#`lnsofwfaf`bnf#nlqfqbgjlb`wjufqfif`wfg#aztjwklvw#bmzkjp#ebwkfq/tkj`k#`lvog`lsz#le#wkfwl#jmgj`bwfb#slojwj`bob``lvmwp#le`lmpwjwvwfptlqhfg#tjwkfq?,b=?,oj=le#kjp#ojefb``lnsbmjfg`ojfmwTjgwksqfufmw#wkfOfdjpobwjufgjeefqfmwozwldfwkfq#jmkbp#pfufqboelq#bmlwkfqwf{w#le#wkfelvmgfg#wkff#tjwk#wkf#jp#vpfg#elq`kbmdfg#wkfvpvbooz#wkfsob`f#tkfqftkfqfbp#wkf=#?b#kqfe>!!=?b#kqfe>!wkfnpfoufp/bowklvdk#kfwkbw#`bm#afwqbgjwjlmboqlof#le#wkfbp#b#qfpvowqfnluf@kjoggfpjdmfg#aztfpw#le#wkfPlnf#sflsofsqlgv`wjlm/pjgf#le#wkfmftpofwwfqpvpfg#az#wkfgltm#wl#wkfb``fswfg#azojuf#jm#wkfbwwfnswp#wllvwpjgf#wkfeqfrvfm`jfpKltfufq/#jmsqldqbnnfqpbw#ofbpw#jmbssql{jnbwfbowklvdk#jwtbp#sbqw#lebmg#ubqjlvpDlufqmlq#lewkf#bqwj`ofwvqmfg#jmwl=?b#kqfe>!,wkf#f`lmlnzjp#wkf#nlpwnlpw#tjgfoztlvog#obwfqbmg#sfqkbspqjpf#wl#wkfl``vqp#tkfmvmgfq#tkj`k`lmgjwjlmp-wkf#tfpwfqmwkflqz#wkbwjp#sqlgv`fgwkf#`jwz#lejm#tkj`k#kfpffm#jm#wkfwkf#`fmwqboavjogjmd#lenbmz#le#kjpbqfb#le#wkfjp#wkf#lmoznlpw#le#wkfnbmz#le#wkfwkf#TfpwfqmWkfqf#jp#mlf{wfmgfg#wlPwbwjpwj`bo`lopsbm>1#\x7Fpklqw#pwlqzslppjaof#wlwlsloldj`bo`qjwj`bo#leqfslqwfg#wlb#@kqjpwjbmgf`jpjlm#wljp#frvbo#wlsqlaofnp#leWkjp#`bm#afnfq`kbmgjpfelq#nlpw#leml#fujgfm`ffgjwjlmp#lefofnfmwp#jm%rvlw8-#Wkf`ln,jnbdfp,tkj`k#nbhfpwkf#sql`fppqfnbjmp#wkfojwfqbwvqf/jp#b#nfnafqwkf#slsvobqwkf#bm`jfmwsqlaofnp#jmwjnf#le#wkfgfefbwfg#azalgz#le#wkfb#eft#zfbqpnv`k#le#wkfwkf#tlqh#le@bojelqmjb/pfqufg#bp#bdlufqmnfmw-`lm`fswp#lenlufnfmw#jm\n\n?gju#jg>!jw!#ubovf>!obmdvbdf#lebp#wkfz#bqfsqlgv`fg#jmjp#wkbw#wkff{sobjm#wkfgju=?,gju=\tKltfufq#wkfofbg#wl#wkf\n?b#kqfe>!,tbp#dqbmwfgsflsof#kbuf`lmwjmvbooztbp#pffm#bpbmg#qfobwfgwkf#qlof#lesqlslpfg#azle#wkf#afpwfb`k#lwkfq-@lmpwbmwjmfsflsof#eqlngjbof`wp#lewl#qfujpjlmtbp#qfmbnfgb#plvq`f#lewkf#jmjwjboobvm`kfg#jmsqlujgf#wkfwl#wkf#tfpwtkfqf#wkfqfbmg#pjnjobqafwtffm#wtljp#bopl#wkfFmdojpk#bmg`lmgjwjlmp/wkbw#jw#tbpfmwjwofg#wlwkfnpfoufp-rvbmwjwz#leqbmpsbqfm`zwkf#pbnf#bpwl#iljm#wkf`lvmwqz#bmgwkjp#jp#wkfWkjp#ofg#wlb#pwbwfnfmw`lmwqbpw#wlobpwJmgf{Lewkqlvdk#kjpjp#gfpjdmfgwkf#wfqn#jpjp#sqlujgfgsqlwf`w#wkfmd?,b=?,oj=Wkf#`vqqfmwwkf#pjwf#lepvapwbmwjbof{sfqjfm`f/jm#wkf#Tfpwwkfz#pklvogpolufm(ajmb`lnfmwbqjlpvmjufqpjgbg`lmgj`jlmfpb`wjujgbgfpf{sfqjfm`jbwf`mlold/Absqlgv``j/_msvmwvb`j/_mbsoj`b`j/_m`lmwqbpf/]b`bwfdlq/Abpqfdjpwqbqpfsqlefpjlmbowqbwbnjfmwlqfd/Apwqbwfpf`qfwbq/Absqjm`jsbofpsqlwf``j/_mjnslqwbmwfpjnslqwbm`jbslpjajojgbgjmwfqfpbmwf`qf`jnjfmwlmf`fpjgbgfppvp`qjajqpfbpl`jb`j/_mgjpslmjaofpfubovb`j/_mfpwvgjbmwfpqfpslmpbaofqfplov`j/_mdvbgbobibqbqfdjpwqbglplslqwvmjgbg`lnfq`jbofpelwldqbe/Abbvwlqjgbgfpjmdfmjfq/Abwfofujpj/_m`lnsfwfm`jblsfqb`jlmfpfpwbaof`jglpjnsofnfmwfb`wvbonfmwfmbufdb`j/_m`lmelqnjgbgojmf.kfjdkw9elmw.ebnjoz9!#9#!kwws9,,bssoj`bwjlmpojmh!#kqfe>!psf`jej`booz,,?\"X@GBWBX\tLqdbmjybwjlmgjpwqjavwjlm3s{8#kfjdkw9qfobwjlmpkjsgfuj`f.tjgwk?gju#`obpp>!?obafo#elq>!qfdjpwqbwjlm?,mlp`qjsw=\t,jmgf{-kwno!tjmglt-lsfm+#\"jnslqwbmw8bssoj`bwjlm,jmgfsfmgfm`f,,ttt-dlldoflqdbmjybwjlmbvwl`lnsofwfqfrvjqfnfmwp`lmpfqubwjuf?elqn#mbnf>!jmwfoof`wvbonbqdjm.ofew92;wk#`fmwvqzbm#jnslqwbmwjmpwjwvwjlmpbaaqfujbwjlm?jnd#`obpp>!lqdbmjpbwjlm`jujojybwjlm2:wk#`fmwvqzbq`kjwf`wvqfjm`lqslqbwfg13wk#`fmwvqz.`lmwbjmfq!=nlpw#mlwbaoz,=?,b=?,gju=mlwjej`bwjlm$vmgfejmfg$*Evqwkfqnlqf/afojfuf#wkbwjmmfqKWNO#>#sqjlq#wl#wkfgqbnbwj`boozqfefqqjmd#wlmfdlwjbwjlmpkfbgrvbqwfqpPlvwk#Beqj`bvmpv``fppevoSfmmpzoubmjbBp#b#qfpvow/?kwno#obmd>!%ow8,pvs%dw8gfbojmd#tjwkskjobgfoskjbkjpwlqj`booz*8?,p`qjsw=\tsbggjmd.wls9f{sfqjnfmwbodfwBwwqjavwfjmpwqv`wjlmpwf`kmloldjfpsbqw#le#wkf#>evm`wjlm+*xpvap`qjswjlmo-gwg!=\x0E\t?kwdfldqbskj`bo@lmpwjwvwjlm$/#evm`wjlm+pvsslqwfg#azbdqj`vowvqbo`lmpwqv`wjlmsvaoj`bwjlmpelmw.pjyf9#2b#ubqjfwz#le?gju#pwzof>!Fm`z`olsfgjbjeqbnf#pq`>!gfnlmpwqbwfgb``lnsojpkfgvmjufqpjwjfpGfnldqbskj`p*8?,p`qjsw=?gfgj`bwfg#wlhmltofgdf#lepbwjpeb`wjlmsbqwj`vobqoz?,gju=?,gju=Fmdojpk#+VP*bssfmg@kjog+wqbmpnjppjlmp-#Kltfufq/#jmwfoojdfm`f!#wbajmgf{>!eolbw9qjdkw8@lnnlmtfbowkqbmdjmd#eqlnjm#tkj`k#wkfbw#ofbpw#lmfqfsqlgv`wjlmfm`z`olsfgjb8elmw.pjyf92ivqjpgj`wjlmbw#wkbw#wjnf!=?b#`obpp>!Jm#bggjwjlm/gfp`qjswjlm(`lmufqpbwjlm`lmwb`w#tjwkjp#dfmfqboozq!#`lmwfmw>!qfsqfpfmwjmd%ow8nbwk%dw8sqfpfmwbwjlml``bpjlmbooz?jnd#tjgwk>!mbujdbwjlm!=`lnsfmpbwjlm`kbnsjlmpkjsnfgjb>!boo!#ujlobwjlm#leqfefqfm`f#wlqfwvqm#wqvf8Pwqj`w,,FM!#wqbmpb`wjlmpjmwfqufmwjlmufqjej`bwjlmJmelqnbwjlm#gjeej`vowjfp@kbnsjlmpkjs`bsbajojwjfp?\"Xfmgje^..=~\t?,p`qjsw=\t@kqjpwjbmjwzelq#f{bnsof/Sqlefppjlmboqfpwqj`wjlmppvddfpw#wkbwtbp#qfofbpfg+pv`k#bp#wkfqfnluf@obpp+vmfnsolznfmwwkf#Bnfqj`bmpwqv`wvqf#le,jmgf{-kwno#svaojpkfg#jmpsbm#`obpp>!!=?b#kqfe>!,jmwqlgv`wjlmafolmdjmd#wl`objnfg#wkbw`lmpfrvfm`fp?nfwb#mbnf>!Dvjgf#wl#wkflufqtkfonjmdbdbjmpw#wkf#`lm`fmwqbwfg/\t-mlmwlv`k#lapfqubwjlmp?,b=\t?,gju=\te#+gl`vnfmw-alqgfq9#2s{#xelmw.pjyf92wqfbwnfmw#le3!#kfjdkw>!2nlgjej`bwjlmJmgfsfmgfm`fgjujgfg#jmwldqfbwfq#wkbmb`kjfufnfmwpfpwbaojpkjmdIbubP`qjsw!#mfufqwkfofpppjdmjej`bm`fAqlbg`bpwjmd=%maps8?,wg=`lmwbjmfq!=\tpv`k#bp#wkf#jmeovfm`f#leb#sbqwj`vobqpq`>$kwws9,,mbujdbwjlm!#kboe#le#wkf#pvapwbmwjbo#%maps8?,gju=bgubmwbdf#legjp`lufqz#leevmgbnfmwbo#nfwqlslojwbmwkf#lsslpjwf!#{no9obmd>!gfojafqbwfozbojdm>`fmwfqfulovwjlm#lesqfpfqubwjlmjnsqlufnfmwpafdjmmjmd#jmIfpvp#@kqjpwSvaoj`bwjlmpgjpbdqffnfmwwf{w.bojdm9q/#evm`wjlm+*pjnjobqjwjfpalgz=?,kwno=jp#`vqqfmwozboskbafwj`bojp#plnfwjnfpwzsf>!jnbdf,nbmz#le#wkf#eolt9kjggfm8bubjobaof#jmgfp`qjaf#wkff{jpwfm`f#leboo#lufq#wkfwkf#Jmwfqmfw\n?vo#`obpp>!jmpwboobwjlmmfjdkalqkllgbqnfg#elq`fpqfgv`jmd#wkf`lmwjmvfp#wlMlmfwkfofpp/wfnsfqbwvqfp\t\n\n?b#kqfe>!`olpf#wl#wkff{bnsofp#le#jp#balvw#wkf+pff#afolt*-!#jg>!pfbq`ksqlefppjlmbojp#bubjobaofwkf#leej`jbo\n\n?,p`qjsw=\t\t\n\n?gju#jg>!b``fofqbwjlmwkqlvdk#wkf#Kboo#le#Ebnfgfp`qjswjlmpwqbmpobwjlmpjmwfqefqfm`f#wzsf>$wf{w,qf`fmw#zfbqpjm#wkf#tlqogufqz#slsvobqxab`hdqlvmg9wqbgjwjlmbo#plnf#le#wkf#`lmmf`wfg#wlf{soljwbwjlmfnfqdfm`f#le`lmpwjwvwjlmB#Kjpwlqz#lepjdmjej`bmw#nbmveb`wvqfgf{sf`wbwjlmp=?mlp`qjsw=?`bm#af#elvmgaf`bvpf#wkf#kbp#mlw#affmmfjdkalvqjmdtjwklvw#wkf#bggfg#wl#wkf\n?oj#`obpp>!jmpwqvnfmwboPlujfw#Vmjlmb`hmltofgdfgtkj`k#`bm#afmbnf#elq#wkfbwwfmwjlm#wlbwwfnswp#wl#gfufolsnfmwpJm#eb`w/#wkf?oj#`obpp>!bjnsoj`bwjlmppvjwbaof#elqnv`k#le#wkf#`lolmjybwjlmsqfpjgfmwjbo`bm`foAvaaof#Jmelqnbwjlmnlpw#le#wkf#jp#gfp`qjafgqfpw#le#wkf#nlqf#lq#ofppjm#PfswfnafqJmwfoojdfm`fpq`>!kwws9,,s{8#kfjdkw9#bubjobaof#wlnbmveb`wvqfqkvnbm#qjdkwpojmh#kqfe>!,bubjobajojwzsqlslqwjlmbolvwpjgf#wkf#bpwqlmlnj`bokvnbm#afjmdpmbnf#le#wkf#bqf#elvmg#jmbqf#abpfg#lmpnboofq#wkbmb#sfqplm#tklf{sbmpjlm#lebqdvjmd#wkbwmlt#hmltm#bpJm#wkf#fbqozjmwfqnfgjbwfgfqjufg#eqlnP`bmgjmbujbm?,b=?,gju=\x0E\t`lmpjgfq#wkfbm#fpwjnbwfgwkf#Mbwjlmbo?gju#jg>!sbdqfpvowjmd#jm`lnnjppjlmfgbmboldlvp#wlbqf#qfrvjqfg,vo=\t?,gju=\ttbp#abpfg#lmbmg#af`bnf#b%maps8%maps8w!#ubovf>!!#tbp#`bswvqfgml#nlqf#wkbmqfpsf`wjufoz`lmwjmvf#wl#=\x0E\t?kfbg=\x0E\t?tfqf#`qfbwfgnlqf#dfmfqbojmelqnbwjlm#vpfg#elq#wkfjmgfsfmgfmw#wkf#Jnsfqjbo`lnslmfmw#lewl#wkf#mlqwkjm`ovgf#wkf#@lmpwqv`wjlmpjgf#le#wkf#tlvog#mlw#afelq#jmpwbm`fjmufmwjlm#lenlqf#`lnsof{`loof`wjufozab`hdqlvmg9#wf{w.bojdm9#jwp#lqjdjmbojmwl#b``lvmwwkjp#sql`fppbm#f{wfmpjufkltfufq/#wkfwkfz#bqf#mlwqfif`wfg#wkf`qjwj`jpn#legvqjmd#tkj`ksqlabaoz#wkfwkjp#bqwj`of+evm`wjlm+*xJw#pklvog#afbm#bdqffnfmwb``jgfmwboozgjeefqp#eqlnBq`kjwf`wvqfafwwfq#hmltmbqqbmdfnfmwpjmeovfm`f#lmbwwfmgfg#wkfjgfmwj`bo#wlplvwk#le#wkfsbpp#wkqlvdk{no!#wjwof>!tfjdkw9alog8`qfbwjmd#wkfgjpsobz9mlmfqfsob`fg#wkf?jnd#pq`>!,jkwwsp9,,ttt-Tlqog#Tbq#JJwfpwjnlmjbopelvmg#jm#wkfqfrvjqfg#wl#bmg#wkbw#wkfafwtffm#wkf#tbp#gfpjdmfg`lmpjpwp#le#`lmpjgfqbaozsvaojpkfg#azwkf#obmdvbdf@lmpfqubwjlm`lmpjpwfg#leqfefq#wl#wkfab`h#wl#wkf#`pp!#nfgjb>!Sflsof#eqln#bubjobaof#lmsqlufg#wl#afpvddfpwjlmp!tbp#hmltm#bpubqjfwjfp#leojhfoz#wl#af`lnsqjpfg#lepvsslqw#wkf#kbmgp#le#wkf`lvsofg#tjwk`lmmf`w#bmg#alqgfq9mlmf8sfqelqnbm`fpafelqf#afjmdobwfq#af`bnf`bo`vobwjlmplewfm#`boofgqfpjgfmwp#lenfbmjmd#wkbw=?oj#`obpp>!fujgfm`f#elqf{sobmbwjlmpfmujqlmnfmwp!=?,b=?,gju=tkj`k#booltpJmwqlgv`wjlmgfufolsfg#azb#tjgf#qbmdflm#afkboe#leubojdm>!wls!sqjm`jsof#lebw#wkf#wjnf/?,mlp`qjsw=\x0Epbjg#wl#kbufjm#wkf#ejqpwtkjof#lwkfqpkzslwkfwj`boskjolplskfqpsltfq#le#wkf`lmwbjmfg#jmsfqelqnfg#azjmbajojwz#wltfqf#tqjwwfmpsbm#pwzof>!jmsvw#mbnf>!wkf#rvfpwjlmjmwfmgfg#elqqfif`wjlm#lejnsojfp#wkbwjmufmwfg#wkfwkf#pwbmgbqgtbp#sqlabaozojmh#afwtffmsqlefpplq#lejmwfqb`wjlmp`kbmdjmd#wkfJmgjbm#L`fbm#`obpp>!obpwtlqhjmd#tjwk$kwws9,,ttt-zfbqp#afelqfWkjp#tbp#wkfqf`qfbwjlmbofmwfqjmd#wkfnfbpvqfnfmwpbm#f{wqfnfozubovf#le#wkfpwbqw#le#wkf\t?,p`qjsw=\t\tbm#feelqw#wljm`qfbpf#wkfwl#wkf#plvwkpsb`jmd>!3!=pveej`jfmwozwkf#Fvqlsfbm`lmufqwfg#wl`ofbqWjnflvwgjg#mlw#kbuf`lmpfrvfmwozelq#wkf#mf{wf{wfmpjlm#lef`lmlnj`#bmgbowklvdk#wkfbqf#sqlgv`fgbmg#tjwk#wkfjmpveej`jfmwdjufm#az#wkfpwbwjmd#wkbwf{sfmgjwvqfp?,psbm=?,b=\twklvdkw#wkbwlm#wkf#abpjp`foosbggjmd>jnbdf#le#wkfqfwvqmjmd#wljmelqnbwjlm/pfsbqbwfg#azbppbppjmbwfgp!#`lmwfmw>!bvwklqjwz#lemlqwktfpwfqm?,gju=\t?gju#!=?,gju=\x0E\t##`lmpvowbwjlm`lnnvmjwz#lewkf#mbwjlmbojw#pklvog#afsbqwj`jsbmwp#bojdm>!ofewwkf#dqfbwfpwpfof`wjlm#lepvsfqmbwvqbogfsfmgfmw#lmjp#nfmwjlmfgbooltjmd#wkftbp#jmufmwfgb``lnsbmzjmdkjp#sfqplmbobubjobaof#bwpwvgz#le#wkflm#wkf#lwkfqf{f`vwjlm#leKvnbm#Qjdkwpwfqnp#le#wkfbppl`jbwjlmpqfpfbq`k#bmgpv``ffgfg#azgfefbwfg#wkfbmg#eqln#wkfavw#wkfz#bqf`lnnbmgfq#lepwbwf#le#wkfzfbqp#le#bdfwkf#pwvgz#le?vo#`obpp>!psob`f#jm#wkftkfqf#kf#tbp?oj#`obpp>!ewkfqf#bqf#mltkj`k#af`bnfkf#svaojpkfgf{sqfppfg#jmwl#tkj`k#wkf`lnnjppjlmfqelmw.tfjdkw9wfqqjwlqz#lef{wfmpjlmp!=Qlnbm#Fnsjqffrvbo#wl#wkfJm#`lmwqbpw/kltfufq/#bmgjp#wzsj`boozbmg#kjp#tjef+bopl#`boofg=?vo#`obpp>!feef`wjufoz#fuloufg#jmwlpffn#wl#kbuftkj`k#jp#wkfwkfqf#tbp#mlbm#f{`foofmwboo#le#wkfpfgfp`qjafg#azJm#sqb`wj`f/aqlbg`bpwjmd`kbqdfg#tjwkqfeof`wfg#jmpvaif`wfg#wlnjojwbqz#bmgwl#wkf#sljmwf`lmlnj`boozpfwWbqdfwjmdbqf#b`wvboozuj`wlqz#lufq+*8?,p`qjsw=`lmwjmvlvpozqfrvjqfg#elqfulovwjlmbqzbm#feef`wjufmlqwk#le#wkf/#tkj`k#tbp#eqlmw#le#wkflq#lwkfqtjpfplnf#elqn#lekbg#mlw#affmdfmfqbwfg#azjmelqnbwjlm-sfqnjwwfg#wljm`ovgfp#wkfgfufolsnfmw/fmwfqfg#jmwlwkf#sqfujlvp`lmpjpwfmwozbqf#hmltm#bpwkf#ejfog#lewkjp#wzsf#ledjufm#wl#wkfwkf#wjwof#le`lmwbjmp#wkfjmpwbm`fp#lejm#wkf#mlqwkgvf#wl#wkfjqbqf#gfpjdmfg`lqslqbwjlmptbp#wkbw#wkflmf#le#wkfpfnlqf#slsvobqpv``ffgfg#jmpvsslqw#eqlnjm#gjeefqfmwglnjmbwfg#azgfpjdmfg#elqltmfqpkjs#lebmg#slppjaozpwbmgbqgjyfgqfpslmpfWf{wtbp#jmwfmgfgqf`fjufg#wkfbppvnfg#wkbwbqfbp#le#wkfsqjnbqjoz#jmwkf#abpjp#lejm#wkf#pfmpfb``lvmwp#elqgfpwqlzfg#azbw#ofbpw#wtltbp#gf`obqfg`lvog#mlw#afPf`qfwbqz#lebssfbq#wl#afnbqdjm.wls92,]_p(\x7F_p(',df*xwkqlt#f~8wkf#pwbqw#lewtl#pfsbqbwfobmdvbdf#bmgtkl#kbg#affmlsfqbwjlm#legfbwk#le#wkfqfbo#mvnafqp\n?ojmh#qfo>!sqlujgfg#wkfwkf#pwlqz#le`lnsfwjwjlmpfmdojpk#+VH*fmdojpk#+VP*#evm`wjlm+*-isd!#tjgwk>!`lmejdvqbwjlm-smd!#tjgwk>!?algz#`obpp>!Nbwk-qbmgln+*`lmwfnslqbqz#Vmjwfg#Pwbwfp`jq`vnpwbm`fp-bssfmg@kjog+lqdbmjybwjlmp?psbm#`obpp>!!=?jnd#pq`>!,gjpwjmdvjpkfgwklvpbmgp#le#`lnnvmj`bwjlm`ofbq!=?,gju=jmufpwjdbwjlmebuj`lm-j`l!#nbqdjm.qjdkw9abpfg#lm#wkf#Nbppb`kvpfwwpwbaof#alqgfq>jmwfqmbwjlmbobopl#hmltm#bpsqlmvm`jbwjlmab`hdqlvmg9 esbggjmd.ofew9Elq#f{bnsof/#njp`foobmflvp%ow8,nbwk%dw8spz`kloldj`bojm#sbqwj`vobqfbq`k!#wzsf>!elqn#nfwklg>!bp#lsslpfg#wlPvsqfnf#@lvqwl``bpjlmbooz#Bggjwjlmbooz/Mlqwk#Bnfqj`bs{8ab`hdqlvmglsslqwvmjwjfpFmwfqwbjmnfmw-wlOltfq@bpf+nbmveb`wvqjmdsqlefppjlmbo#`lnajmfg#tjwkElq#jmpwbm`f/`lmpjpwjmd#le!#nb{ofmdwk>!qfwvqm#ebopf8`lmp`jlvpmfppNfgjwfqqbmfbmf{wqblqgjmbqzbppbppjmbwjlmpvapfrvfmwoz#avwwlm#wzsf>!wkf#mvnafq#lewkf#lqjdjmbo#`lnsqfkfmpjufqfefqp#wl#wkf?,vo=\t?,gju=\tskjolplskj`bool`bwjlm-kqfetbp#svaojpkfgPbm#Eqbm`jp`l+evm`wjlm+*x\t?gju#jg>!nbjmplskjpwj`bwfgnbwkfnbwj`bo#,kfbg=\x0E\t?algzpvddfpwp#wkbwgl`vnfmwbwjlm`lm`fmwqbwjlmqfobwjlmpkjspnbz#kbuf#affm+elq#f{bnsof/Wkjp#bqwj`of#jm#plnf#`bpfpsbqwp#le#wkf#gfejmjwjlm#leDqfbw#Aqjwbjm#`foosbggjmd>frvjubofmw#wlsob`fklogfq>!8#elmw.pjyf9#ivpwjej`bwjlmafojfufg#wkbwpveefqfg#eqlnbwwfnswfg#wl#ofbgfq#le#wkf`qjsw!#pq`>!,+evm`wjlm+*#xbqf#bubjobaof\t\n?ojmh#qfo>!#pq`>$kwws9,,jmwfqfpwfg#jm`lmufmwjlmbo#!#bow>!!#,=?,bqf#dfmfqboozkbp#bopl#affmnlpw#slsvobq#`lqqfpslmgjmd`qfgjwfg#tjwkwzof>!alqgfq9?,b=?,psbm=?,-dje!#tjgwk>!?jeqbnf#pq`>!wbaof#`obpp>!jmojmf.aol`h8b``lqgjmd#wl#wldfwkfq#tjwkbssql{jnbwfozsbqojbnfmwbqznlqf#bmg#nlqfgjpsobz9mlmf8wqbgjwjlmboozsqfglnjmbmwoz%maps8\x7F%maps8%maps8?,psbm=#`foopsb`jmd>?jmsvw#mbnf>!lq!#`lmwfmw>!`lmwqlufqpjbosqlsfqwz>!ld9,{.pkl`htbuf.gfnlmpwqbwjlmpvqqlvmgfg#azMfufqwkfofpp/tbp#wkf#ejqpw`lmpjgfqbaof#Bowklvdk#wkf#`loobalqbwjlmpklvog#mlw#afsqlslqwjlm#le?psbm#pwzof>!hmltm#bp#wkf#pklqwoz#bewfqelq#jmpwbm`f/gfp`qjafg#bp#,kfbg=\t?algz#pwbqwjmd#tjwkjm`qfbpjmdoz#wkf#eb`w#wkbwgjp`vppjlm#lenjggof#le#wkfbm#jmgjujgvbogjeej`vow#wl#sljmw#le#ujftklnlpf{vbojwzb``fswbm`f#le?,psbm=?,gju=nbmveb`wvqfqplqjdjm#le#wkf`lnnlmoz#vpfgjnslqwbm`f#legfmlnjmbwjlmpab`hdqlvmg9# ofmdwk#le#wkfgfwfqnjmbwjlmb#pjdmjej`bmw!#alqgfq>!3!=qfulovwjlmbqzsqjm`jsofp#lejp#`lmpjgfqfgtbp#gfufolsfgJmgl.Fvqlsfbmuvomfqbaof#wlsqlslmfmwp#lebqf#plnfwjnfp`olpfq#wl#wkfMft#Zlqh#@jwz#mbnf>!pfbq`kbwwqjavwfg#wl`lvqpf#le#wkfnbwkfnbwj`jbmaz#wkf#fmg#lebw#wkf#fmg#le!#alqgfq>!3!#wf`kmloldj`bo-qfnluf@obpp+aqbm`k#le#wkffujgfm`f#wkbw\"Xfmgje^..=\x0E\tJmpwjwvwf#le#jmwl#b#pjmdofqfpsf`wjufoz-bmg#wkfqfelqfsqlsfqwjfp#lejp#ol`bwfg#jmplnf#le#tkj`kWkfqf#jp#bopl`lmwjmvfg#wl#bssfbqbm`f#le#%bns8mgbpk8#gfp`qjafp#wkf`lmpjgfqbwjlmbvwklq#le#wkfjmgfsfmgfmwozfrvjssfg#tjwkglfp#mlw#kbuf?,b=?b#kqfe>!`lmevpfg#tjwk?ojmh#kqfe>!,bw#wkf#bdf#lebssfbq#jm#wkfWkfpf#jm`ovgfqfdbqgofpp#le`lvog#af#vpfg#pwzof>%rvlw8pfufqbo#wjnfpqfsqfpfmw#wkfalgz=\t?,kwno=wklvdkw#wl#afslsvobwjlm#leslppjajojwjfpsfq`fmwbdf#leb``fpp#wl#wkfbm#bwwfnsw#wlsqlgv`wjlm#leirvfqz,irvfqzwtl#gjeefqfmwafolmd#wl#wkffpwbaojpknfmwqfsob`jmd#wkfgfp`qjswjlm!#gfwfqnjmf#wkfbubjobaof#elqB``lqgjmd#wl#tjgf#qbmdf#le\n?gju#`obpp>!nlqf#`lnnlmozlqdbmjpbwjlmpevm`wjlmbojwztbp#`lnsofwfg#%bns8ngbpk8#sbqwj`jsbwjlmwkf#`kbqb`wfqbm#bggjwjlmbobssfbqp#wl#afeb`w#wkbw#wkfbm#f{bnsof#lepjdmjej`bmwozlmnlvpflufq>!af`bvpf#wkfz#bpzm`#>#wqvf8sqlaofnp#tjwkpffnp#wl#kbufwkf#qfpvow#le#pq`>!kwws9,,ebnjojbq#tjwkslppfppjlm#leevm`wjlm#+*#xwllh#sob`f#jmbmg#plnfwjnfppvapwbmwjbooz?psbm=?,psbm=jp#lewfm#vpfgjm#bm#bwwfnswdqfbw#gfbo#leFmujqlmnfmwbopv``fppevooz#ujqwvbooz#boo13wk#`fmwvqz/sqlefppjlmbopmf`fppbqz#wl#gfwfqnjmfg#az`lnsbwjajojwzaf`bvpf#jw#jpGj`wjlmbqz#lenlgjej`bwjlmpWkf#elooltjmdnbz#qfefq#wl9@lmpfrvfmwoz/Jmwfqmbwjlmbobowklvdk#plnfwkbw#tlvog#aftlqog$p#ejqpw`obppjejfg#bpalwwln#le#wkf+sbqwj`vobqozbojdm>!ofew!#nlpw#`lnnlmozabpjp#elq#wkfelvmgbwjlm#le`lmwqjavwjlmpslsvobqjwz#le`fmwfq#le#wkfwl#qfgv`f#wkfivqjpgj`wjlmpbssql{jnbwjlm#lmnlvpflvw>!Mft#Wfpwbnfmw`loof`wjlm#le?,psbm=?,b=?,jm#wkf#Vmjwfgejon#gjqf`wlq.pwqj`w-gwg!=kbp#affm#vpfgqfwvqm#wl#wkfbowklvdk#wkjp`kbmdf#jm#wkfpfufqbo#lwkfqavw#wkfqf#bqfvmsqf`fgfmwfgjp#pjnjobq#wlfpsf`jbooz#jmtfjdkw9#alog8jp#`boofg#wkf`lnsvwbwjlmbojmgj`bwf#wkbwqfpwqj`wfg#wl\n?nfwb#mbnf>!bqf#wzsj`booz`lmeoj`w#tjwkKltfufq/#wkf#Bm#f{bnsof#le`lnsbqfg#tjwkrvbmwjwjfp#leqbwkfq#wkbm#b`lmpwfoobwjlmmf`fppbqz#elqqfslqwfg#wkbwpsf`jej`bwjlmslojwj`bo#bmg%maps8%maps8?qfefqfm`fp#wlwkf#pbnf#zfbqDlufqmnfmw#ledfmfqbwjlm#lekbuf#mlw#affmpfufqbo#zfbqp`lnnjwnfmw#wl\n\n?vo#`obpp>!ujpvbojybwjlm2:wk#`fmwvqz/sqb`wjwjlmfqpwkbw#kf#tlvogbmg#`lmwjmvfgl``vsbwjlm#lejp#gfejmfg#bp`fmwqf#le#wkfwkf#bnlvmw#le=?gju#pwzof>!frvjubofmw#legjeefqfmwjbwfaqlvdkw#balvwnbqdjm.ofew9#bvwlnbwj`boozwklvdkw#le#bpPlnf#le#wkfpf\t?gju#`obpp>!jmsvw#`obpp>!qfsob`fg#tjwkjp#lmf#le#wkffgv`bwjlm#bmgjmeovfm`fg#azqfsvwbwjlm#bp\t?nfwb#mbnf>!b``lnnlgbwjlm?,gju=\t?,gju=obqdf#sbqw#leJmpwjwvwf#elqwkf#pl.`boofg#bdbjmpw#wkf#Jm#wkjp#`bpf/tbp#bssljmwfg`objnfg#wl#afKltfufq/#wkjpGfsbqwnfmw#lewkf#qfnbjmjmdfeef`w#lm#wkfsbqwj`vobqoz#gfbo#tjwk#wkf\t?gju#pwzof>!bonlpw#botbzpbqf#`vqqfmwozf{sqfppjlm#leskjolplskz#leelq#nlqf#wkbm`jujojybwjlmplm#wkf#jpobmgpfof`wfgJmgf{`bm#qfpvow#jm!#ubovf>!!#,=wkf#pwqv`wvqf#,=?,b=?,gju=Nbmz#le#wkfpf`bvpfg#az#wkfle#wkf#Vmjwfgpsbm#`obpp>!n`bm#af#wqb`fgjp#qfobwfg#wlaf`bnf#lmf#lejp#eqfrvfmwozojujmd#jm#wkfwkflqfwj`boozElooltjmd#wkfQfulovwjlmbqzdlufqmnfmw#jmjp#gfwfqnjmfgwkf#slojwj`bojmwqlgv`fg#jmpveej`jfmw#wlgfp`qjswjlm!=pklqw#pwlqjfppfsbqbwjlm#lebp#wl#tkfwkfqhmltm#elq#jwptbp#jmjwjboozgjpsobz9aol`hjp#bm#f{bnsofwkf#sqjm`jsbo`lmpjpwp#le#bqf`ldmjyfg#bp,algz=?,kwno=b#pvapwbmwjboqf`lmpwqv`wfgkfbg#le#pwbwfqfpjpwbm`f#wlvmgfqdqbgvbwfWkfqf#bqf#wtldqbujwbwjlmbobqf#gfp`qjafgjmwfmwjlmboozpfqufg#bp#wkf`obpp>!kfbgfqlsslpjwjlm#wlevmgbnfmwboozglnjmbwfg#wkfbmg#wkf#lwkfqboojbm`f#tjwktbp#elq`fg#wlqfpsf`wjufoz/bmg#slojwj`bojm#pvsslqw#lesflsof#jm#wkf13wk#`fmwvqz-bmg#svaojpkfgolbg@kbqwafbwwl#vmgfqpwbmgnfnafq#pwbwfpfmujqlmnfmwboejqpw#kboe#le`lvmwqjfp#bmgbq`kjwf`wvqboaf#`lmpjgfqfg`kbqb`wfqjyfg`ofbqJmwfqubobvwklqjwbwjufEfgfqbwjlm#letbp#pv``ffgfgbmg#wkfqf#bqfb#`lmpfrvfm`fwkf#Sqfpjgfmwbopl#jm`ovgfgeqff#plewtbqfpv``fppjlm#legfufolsfg#wkftbp#gfpwqlzfgbtbz#eqln#wkf8\t?,p`qjsw=\t?bowklvdk#wkfzelooltfg#az#bnlqf#sltfqevoqfpvowfg#jm#bVmjufqpjwz#leKltfufq/#nbmzwkf#sqfpjgfmwKltfufq/#plnfjp#wklvdkw#wlvmwjo#wkf#fmgtbp#bmmlvm`fgbqf#jnslqwbmwbopl#jm`ovgfp=?jmsvw#wzsf>wkf#`fmwfq#le#GL#MLW#BOWFQvpfg#wl#qfefqwkfnfp,wkbw#kbg#affmwkf#abpjp#elqkbp#gfufolsfgjm#wkf#pvnnfq`lnsbqbwjufozgfp`qjafg#wkfpv`k#bp#wklpfwkf#qfpvowjmdjp#jnslppjaofubqjlvp#lwkfqPlvwk#Beqj`bmkbuf#wkf#pbnffeef`wjufmfppjm#tkj`k#`bpf8#wf{w.bojdm9pwqv`wvqf#bmg8#ab`hdqlvmg9qfdbqgjmd#wkfpvsslqwfg#wkfjp#bopl#hmltmpwzof>!nbqdjmjm`ovgjmd#wkfabkbpb#Nfobzvmlqph#alhn/Iomlqph#mzmlqphpolufm)M(ajmbjmwfqmb`jlmbo`bojej`b`j/_m`lnvmj`b`j/_m`lmpwqv``j/_m!=?gju#`obpp>!gjpbnajdvbwjlmGlnbjmMbnf$/#$bgnjmjpwqbwjlmpjnvowbmflvpozwqbmpslqwbwjlmJmwfqmbwjlmbo#nbqdjm.alwwln9qfpslmpjajojwz?\"Xfmgje^..=\t?,=?nfwb#mbnf>!jnsofnfmwbwjlmjmeqbpwqv`wvqfqfsqfpfmwbwjlmalqgfq.alwwln9?,kfbg=\t?algz=>kwws&0B&1E&1E?elqn#nfwklg>!nfwklg>!slpw!#,ebuj`lm-j`l!#~*8\t?,p`qjsw=\t-pfwBwwqjavwf+Bgnjmjpwqbwjlm>#mft#Bqqbz+*8?\"Xfmgje^..=\x0E\tgjpsobz9aol`h8Vmelqwvmbwfoz/!=%maps8?,gju=,ebuj`lm-j`l!=>$pwzofpkffw$#jgfmwjej`bwjlm/#elq#f{bnsof/?oj=?b#kqfe>!,bm#bowfqmbwjufbp#b#qfpvow#lesw!=?,p`qjsw=\twzsf>!pvanjw!#\t+evm`wjlm+*#xqf`lnnfmgbwjlmelqn#b`wjlm>!,wqbmpelqnbwjlmqf`lmpwqv`wjlm-pwzof-gjpsobz#B``lqgjmd#wl#kjggfm!#mbnf>!bolmd#tjwk#wkfgl`vnfmw-algz-bssql{jnbwfoz#@lnnvmj`bwjlmpslpw!#b`wjlm>!nfbmjmd#%rvlw8..?\"Xfmgje^..=Sqjnf#Njmjpwfq`kbqb`wfqjpwj`?,b=#?b#`obpp>wkf#kjpwlqz#le#lmnlvpflufq>!wkf#dlufqmnfmwkqfe>!kwwsp9,,tbp#lqjdjmbooztbp#jmwqlgv`fg`obppjej`bwjlmqfsqfpfmwbwjufbqf#`lmpjgfqfg?\"Xfmgje^..=\t\tgfsfmgp#lm#wkfVmjufqpjwz#le#jm#`lmwqbpw#wl#sob`fklogfq>!jm#wkf#`bpf#lejmwfqmbwjlmbo#`lmpwjwvwjlmbopwzof>!alqgfq.9#evm`wjlm+*#xAf`bvpf#le#wkf.pwqj`w-gwg!=\t?wbaof#`obpp>!b``lnsbmjfg#azb``lvmw#le#wkf?p`qjsw#pq`>!,mbwvqf#le#wkf#wkf#sflsof#jm#jm#bggjwjlm#wlp*8#ip-jg#>#jg!#tjgwk>!233&!qfdbqgjmd#wkf#Qlnbm#@bwkloj`bm#jmgfsfmgfmwelooltjmd#wkf#-dje!#tjgwk>!2wkf#elooltjmd#gjp`qjnjmbwjlmbq`kbfloldj`bosqjnf#njmjpwfq-ip!=?,p`qjsw=`lnajmbwjlm#le#nbqdjmtjgwk>!`qfbwfFofnfmw+t-bwwb`kFufmw+?,b=?,wg=?,wq=pq`>!kwwsp9,,bJm#sbqwj`vobq/#bojdm>!ofew!#@yf`k#Qfsvaoj`Vmjwfg#Hjmdgln`lqqfpslmgfm`f`lm`ovgfg#wkbw-kwno!#wjwof>!+evm`wjlm#+*#x`lnfp#eqln#wkfbssoj`bwjlm#le?psbm#`obpp>!pafojfufg#wl#affnfmw+$p`qjsw$?,b=\t?,oj=\t?ojufqz#gjeefqfmw=?psbm#`obpp>!lswjlm#ubovf>!+bopl#hmltm#bp\n?oj=?b#kqfe>!=?jmsvw#mbnf>!pfsbqbwfg#eqlnqfefqqfg#wl#bp#ubojdm>!wls!=elvmgfq#le#wkfbwwfnswjmd#wl#`bqalm#gjl{jgf\t\t?gju#`obpp>!`obpp>!pfbq`k.,algz=\t?,kwno=lsslqwvmjwz#wl`lnnvmj`bwjlmp?,kfbg=\x0E\t?algz#pwzof>!tjgwk9Wj\rVSmd#Uj\rWkw`kbmdfp#jm#wkfalqgfq.`lolq9 3!#alqgfq>!3!#?,psbm=?,gju=?tbp#gjp`lufqfg!#wzsf>!wf{w!#*8\t?,p`qjsw=\t\tGfsbqwnfmw#le#f``ofpjbpwj`bowkfqf#kbp#affmqfpvowjmd#eqln?,algz=?,kwno=kbp#mfufq#affmwkf#ejqpw#wjnfjm#qfpslmpf#wlbvwlnbwj`booz#?,gju=\t\t?gju#jtbp#`lmpjgfqfgsfq`fmw#le#wkf!#,=?,b=?,gju=`loof`wjlm#le#gfp`fmgfg#eqlnpf`wjlm#le#wkfb``fsw.`kbqpfwwl#af#`lmevpfgnfnafq#le#wkf#sbggjmd.qjdkw9wqbmpobwjlm#lejmwfqsqfwbwjlm#kqfe>$kwws9,,tkfwkfq#lq#mlwWkfqf#bqf#boplwkfqf#bqf#nbmzb#pnboo#mvnafqlwkfq#sbqwp#lejnslppjaof#wl##`obpp>!avwwlmol`bwfg#jm#wkf-#Kltfufq/#wkfbmg#fufmwvboozBw#wkf#fmg#le#af`bvpf#le#jwpqfsqfpfmwp#wkf?elqn#b`wjlm>!#nfwklg>!slpw!jw#jp#slppjaofnlqf#ojhfoz#wlbm#jm`qfbpf#jmkbuf#bopl#affm`lqqfpslmgp#wlbmmlvm`fg#wkbwbojdm>!qjdkw!=nbmz#`lvmwqjfpelq#nbmz#zfbqpfbqojfpw#hmltmaf`bvpf#jw#tbpsw!=?,p`qjsw=\x0E#ubojdm>!wls!#jmkbajwbmwp#leelooltjmd#zfbq\x0E\t?gju#`obpp>!njoojlm#sflsof`lmwqlufqpjbo#`lm`fqmjmd#wkfbqdvf#wkbw#wkfdlufqmnfmw#bmgb#qfefqfm`f#wlwqbmpefqqfg#wlgfp`qjajmd#wkf#pwzof>!`lolq9bowklvdk#wkfqfafpw#hmltm#elqpvanjw!#mbnf>!nvowjsoj`bwjlmnlqf#wkbm#lmf#qf`ldmjwjlm#le@lvm`jo#le#wkffgjwjlm#le#wkf##?nfwb#mbnf>!Fmwfqwbjmnfmw#btbz#eqln#wkf#8nbqdjm.qjdkw9bw#wkf#wjnf#lejmufpwjdbwjlmp`lmmf`wfg#tjwkbmg#nbmz#lwkfqbowklvdk#jw#jpafdjmmjmd#tjwk#?psbm#`obpp>!gfp`fmgbmwp#le?psbm#`obpp>!j#bojdm>!qjdkw!?,kfbg=\t?algz#bpsf`wp#le#wkfkbp#pjm`f#affmFvqlsfbm#Vmjlmqfnjmjp`fmw#lenlqf#gjeej`vowUj`f#Sqfpjgfmw`lnslpjwjlm#lesbppfg#wkqlvdknlqf#jnslqwbmwelmw.pjyf922s{f{sobmbwjlm#lewkf#`lm`fsw#letqjwwfm#jm#wkf\n?psbm#`obpp>!jp#lmf#le#wkf#qfpfnaobm`f#wllm#wkf#dqlvmgptkj`k#`lmwbjmpjm`ovgjmd#wkf#gfejmfg#az#wkfsvaoj`bwjlm#lenfbmp#wkbw#wkflvwpjgf#le#wkfpvsslqw#le#wkf?jmsvw#`obpp>!?psbm#`obpp>!w+Nbwk-qbmgln+*nlpw#sqlnjmfmwgfp`qjswjlm#le@lmpwbmwjmlsoftfqf#svaojpkfg?gju#`obpp>!pfbssfbqp#jm#wkf2!#kfjdkw>!2!#nlpw#jnslqwbmwtkj`k#jm`ovgfptkj`k#kbg#affmgfpwqv`wjlm#lewkf#slsvobwjlm\t\n?gju#`obpp>!slppjajojwz#leplnfwjnfp#vpfgbssfbq#wl#kbufpv``fpp#le#wkfjmwfmgfg#wl#afsqfpfmw#jm#wkfpwzof>!`ofbq9a\x0E\t?,p`qjsw=\x0E\t?tbp#elvmgfg#jmjmwfqujft#tjwk\\jg!#`lmwfmw>!`bsjwbo#le#wkf\x0E\t?ojmh#qfo>!pqfofbpf#le#wkfsljmw#lvw#wkbw{NOKwwsQfrvfpwbmg#pvapfrvfmwpf`lmg#obqdfpwufqz#jnslqwbmwpsf`jej`bwjlmppvqeb`f#le#wkfbssojfg#wl#wkfelqfjdm#sloj`z\\pfwGlnbjmMbnffpwbaojpkfg#jmjp#afojfufg#wlJm#bggjwjlm#wlnfbmjmd#le#wkfjp#mbnfg#bewfqwl#sqlwf`w#wkfjp#qfsqfpfmwfgGf`obqbwjlm#lenlqf#feej`jfmw@obppjej`bwjlmlwkfq#elqnp#lekf#qfwvqmfg#wl?psbm#`obpp>!`sfqelqnbm`f#le+evm`wjlm+*#x\x0Eje#bmg#lmoz#jeqfdjlmp#le#wkfofbgjmd#wl#wkfqfobwjlmp#tjwkVmjwfg#Mbwjlmppwzof>!kfjdkw9lwkfq#wkbm#wkfzsf!#`lmwfmw>!Bppl`jbwjlm#le\t?,kfbg=\t?algzol`bwfg#lm#wkfjp#qfefqqfg#wl+jm`ovgjmd#wkf`lm`fmwqbwjlmpwkf#jmgjujgvbobnlmd#wkf#nlpwwkbm#bmz#lwkfq,=\t?ojmh#qfo>!#qfwvqm#ebopf8wkf#svqslpf#lewkf#bajojwz#wl8`lolq9 eee~\t-\t?psbm#`obpp>!wkf#pvaif`w#legfejmjwjlmp#le=\x0E\t?ojmh#qfo>!`objn#wkbw#wkfkbuf#gfufolsfg?wbaof#tjgwk>!`fofaqbwjlm#leElooltjmd#wkf#wl#gjpwjmdvjpk?psbm#`obpp>!awbhfp#sob`f#jmvmgfq#wkf#mbnfmlwfg#wkbw#wkf=?\"Xfmgje^..=\tpwzof>!nbqdjm.jmpwfbg#le#wkfjmwqlgv`fg#wkfwkf#sql`fpp#lejm`qfbpjmd#wkfgjeefqfm`fp#jmfpwjnbwfg#wkbwfpsf`jbooz#wkf,gju=?gju#jg>!tbp#fufmwvboozwkqlvdklvw#kjpwkf#gjeefqfm`fplnfwkjmd#wkbwpsbm=?,psbm=?,pjdmjej`bmwoz#=?,p`qjsw=\x0E\t\x0E\tfmujqlmnfmwbo#wl#sqfufmw#wkfkbuf#affm#vpfgfpsf`jbooz#elqvmgfqpwbmg#wkfjp#fppfmwjbooztfqf#wkf#ejqpwjp#wkf#obqdfpwkbuf#affm#nbgf!#pq`>!kwws9,,jmwfqsqfwfg#bppf`lmg#kboe#le`qloojmd>!ml!#jp#`lnslpfg#leJJ/#Kloz#Qlnbmjp#f{sf`wfg#wlkbuf#wkfjq#ltmgfejmfg#bp#wkfwqbgjwjlmbooz#kbuf#gjeefqfmwbqf#lewfm#vpfgwl#fmpvqf#wkbwbdqffnfmw#tjwk`lmwbjmjmd#wkfbqf#eqfrvfmwozjmelqnbwjlm#lmf{bnsof#jp#wkfqfpvowjmd#jm#b?,b=?,oj=?,vo=#`obpp>!ellwfqbmg#fpsf`jboozwzsf>!avwwlm!#?,psbm=?,psbm=tkj`k#jm`ovgfg=\t?nfwb#mbnf>!`lmpjgfqfg#wkf`bqqjfg#lvw#azKltfufq/#jw#jpaf`bnf#sbqw#lejm#qfobwjlm#wlslsvobq#jm#wkfwkf#`bsjwbo#letbp#leej`jbooztkj`k#kbp#affmwkf#Kjpwlqz#lebowfqmbwjuf#wlgjeefqfmw#eqlnwl#pvsslqw#wkfpvddfpwfg#wkbwjm#wkf#sql`fpp##?gju#`obpp>!wkf#elvmgbwjlmaf`bvpf#le#kjp`lm`fqmfg#tjwkwkf#vmjufqpjwzlsslpfg#wl#wkfwkf#`lmwf{w#le?psbm#`obpp>!swf{w!#mbnf>!r!\n\n?gju#`obpp>!wkf#p`jfmwjej`qfsqfpfmwfg#aznbwkfnbwj`jbmpfof`wfg#az#wkfwkbw#kbuf#affm=?gju#`obpp>!`gju#jg>!kfbgfqjm#sbqwj`vobq/`lmufqwfg#jmwl*8\t?,p`qjsw=\t?skjolplskj`bo#pqsphlkqubwphjwj\rVSmd#Uj\rWkw!kwws9,,!=?psbm#`obpp>!nfnafqp#le#wkf#tjmglt-ol`bwjlmufqwj`bo.bojdm9,b=#\x7F#?b#kqfe>!?\"gl`wzsf#kwno=nfgjb>!p`qffm!#?lswjlm#ubovf>!ebuj`lm-j`l!#,=\t\n\n?gju#`obpp>!`kbqb`wfqjpwj`p!#nfwklg>!dfw!#,algz=\t?,kwno=\tpklqw`vw#j`lm!#gl`vnfmw-tqjwf+sbggjmd.alwwln9qfsqfpfmwbwjufppvanjw!#ubovf>!bojdm>!`fmwfq!#wkqlvdklvw#wkf#p`jfm`f#ej`wjlm\t##?gju#`obpp>!pvanjw!#`obpp>!lmf#le#wkf#nlpw#ubojdm>!wls!=?tbp#fpwbaojpkfg*8\x0E\t?,p`qjsw=\x0E\tqfwvqm#ebopf8!=*-pwzof-gjpsobzaf`bvpf#le#wkf#gl`vnfmw-`llhjf?elqn#b`wjlm>!,~algzxnbqdjm938Fm`z`olsfgjb#leufqpjlm#le#wkf#-`qfbwfFofnfmw+mbnf!#`lmwfmw>!?,gju=\t?,gju=\t\tbgnjmjpwqbwjuf#?,algz=\t?,kwno=kjpwlqz#le#wkf#!=?jmsvw#wzsf>!slqwjlm#le#wkf#bp#sbqw#le#wkf#%maps8?b#kqfe>!lwkfq#`lvmwqjfp!=\t?gju#`obpp>!?,psbm=?,psbm=?Jm#lwkfq#tlqgp/gjpsobz9#aol`h8`lmwqlo#le#wkf#jmwqlgv`wjlm#le,=\t?nfwb#mbnf>!bp#tfoo#bp#wkf#jm#qf`fmw#zfbqp\x0E\t\n?gju#`obpp>!?,gju=\t\n?,gju=\tjmpsjqfg#az#wkfwkf#fmg#le#wkf#`lnsbwjaof#tjwkaf`bnf#hmltm#bp#pwzof>!nbqdjm9-ip!=?,p`qjsw=?#Jmwfqmbwjlmbo#wkfqf#kbuf#affmDfqnbm#obmdvbdf#pwzof>!`lolq9 @lnnvmjpw#Sbqwz`lmpjpwfmw#tjwkalqgfq>!3!#`foo#nbqdjmkfjdkw>!wkf#nbilqjwz#le!#bojdm>!`fmwfqqfobwfg#wl#wkf#nbmz#gjeefqfmw#Lqwklgl{#@kvq`kpjnjobq#wl#wkf#,=\t?ojmh#qfo>!ptbp#lmf#le#wkf#vmwjo#kjp#gfbwk~*+*8\t?,p`qjsw=lwkfq#obmdvbdfp`lnsbqfg#wl#wkfslqwjlmp#le#wkfwkf#Mfwkfqobmgpwkf#nlpw#`lnnlmab`hdqlvmg9vqo+bqdvfg#wkbw#wkfp`qloojmd>!ml!#jm`ovgfg#jm#wkfMlqwk#Bnfqj`bm#wkf#mbnf#le#wkfjmwfqsqfwbwjlmpwkf#wqbgjwjlmbogfufolsnfmw#le#eqfrvfmwoz#vpfgb#`loof`wjlm#leufqz#pjnjobq#wlpvqqlvmgjmd#wkff{bnsof#le#wkjpbojdm>!`fmwfq!=tlvog#kbuf#affmjnbdf\\`bswjlm#>bwwb`kfg#wl#wkfpvddfpwjmd#wkbwjm#wkf#elqn#le#jmuloufg#jm#wkfjp#gfqjufg#eqlnmbnfg#bewfq#wkfJmwqlgv`wjlm#wlqfpwqj`wjlmp#lm#pwzof>!tjgwk9#`bm#af#vpfg#wl#wkf#`qfbwjlm#lenlpw#jnslqwbmw#jmelqnbwjlm#bmgqfpvowfg#jm#wkf`loobspf#le#wkfWkjp#nfbmp#wkbwfofnfmwp#le#wkftbp#qfsob`fg#azbmbozpjp#le#wkfjmpsjqbwjlm#elqqfdbqgfg#bp#wkfnlpw#pv``fppevohmltm#bp#%rvlw8b#`lnsqfkfmpjufKjpwlqz#le#wkf#tfqf#`lmpjgfqfgqfwvqmfg#wl#wkfbqf#qfefqqfg#wlVmplvq`fg#jnbdf=\t\n?gju#`obpp>!`lmpjpwp#le#wkfpwlsSqlsbdbwjlmjmwfqfpw#jm#wkfbubjobajojwz#lebssfbqp#wl#kbuffof`wqlnbdmfwj`fmbaofPfquj`fp+evm`wjlm#le#wkfJw#jp#jnslqwbmw?,p`qjsw=?,gju=evm`wjlm+*xubq#qfobwjuf#wl#wkfbp#b#qfpvow#le#wkf#slpjwjlm#leElq#f{bnsof/#jm#nfwklg>!slpw!#tbp#elooltfg#az%bns8ngbpk8#wkfwkf#bssoj`bwjlmip!=?,p`qjsw=\x0E\tvo=?,gju=?,gju=bewfq#wkf#gfbwktjwk#qfpsf`w#wlpwzof>!sbggjmd9jp#sbqwj`vobqozgjpsobz9jmojmf8#wzsf>!pvanjw!#jp#gjujgfg#jmwl\bTA\nzk#+\x0BBl\bQ\x7F*qfpslmpbajojgbgbgnjmjpwqb`j/_mjmwfqmb`jlmbofp`lqqfpslmgjfmwf\fHe\fHF\fHC\fIg\fH{\fHF\fIn\fH\\\fIa\fHY\fHU\fHB\fHR\fH\\\fIk\fH^\fIg\fH{\fIg\fHn\fHv\fIm\fHD\fHR\fHY\fH^\fIk\fHy\fHS\fHD\fHT\fH\\\fHy\fHR\fH\\\fHF\fIm\fH^\fHS\fHT\fHz\fIg\fHp\fIk\fHn\fHv\fHR\fHU\fHS\fHc\fHA\fIk\fHp\fIk\fHn\fHZ\fHR\fHB\fHS\fH^\fHU\fHB\fHR\fH\\\fIl\fHp\fHR\fH{\fH\\\fHO\fH@\fHD\fHR\fHD\fIk\fHy\fIm\fHB\fHR\fH\\\fH@\fIa\fH^\fIe\fH{\fHB\fHR\fH^\fHS\fHy\fHB\fHU\fHS\fH^\fHR\fHF\fIo\fH[\fIa\fHL\fH@\fHN\fHP\fHH\fIk\fHA\fHR\fHp\fHF\fHR\fHy\fIa\fH^\fHS\fHy\fHs\fIa\fH\\\fIk\fHD\fHz\fHS\fH^\fHR\fHG\fHJ\fI`\fH\\\fHR\fHD\fHB\fHR\fHB\fH^\fIk\fHB\fHH\fHJ\fHR\fHD\fH@\fHR\fHp\fHR\fH\\\fHY\fHS\fHy\fHR\fHT\fHy\fIa\fHC\fIg\fHn\fHv\fHR\fHU\fHH\fIk\fHF\fHU\fIm\fHm\fHv\fH@\fHH\fHR\fHC\fHR\fHT\fHn\fHY\fHR\fHJ\fHJ\fIk\fHz\fHD\fIk\fHF\fHS\fHw\fH^\fIk\fHY\fHS\fHZ\fIk\fH[\fH\\\fHR\fHp\fIa\fHC\fHe\fHH\fIa\fHH\fH\\\fHB\fIm\fHn\fH@\fHd\fHJ\fIg\fHD\fIg\fHn\fHe\fHF\fHy\fH\\\fHO\fHF\fHN\fHP\fIk\fHn\fHT\fIa\fHI\fHS\fHH\fHG\fHS\fH^\fIa\fHB\fHB\fIm\fHz\fIa\fHC\fHi\fHv\fIa\fHw\fHR\fHw\fIn\fHs\fHH\fIl\fHT\fHn\fH{\fIl\fHH\fHp\fHR\fHc\fH{\fHR\fHY\fHS\fHA\fHR\fH{\fHt\fHO\fIa\fHs\fIk\fHJ\fIn\fHT\fH\\\fIk\fHJ\fHS\fHD\fIg\fHn\fHU\fHH\fIa\fHC\fHR\fHT\fIk\fHy\fIa\fHT\fH{\fHR\fHn\fHK\fIl\fHY\fHS\fHZ\fIa\fHY\fH\\\fHR\fHH\fIk\fHn\fHJ\fId\fHs\fIa\fHT\fHD\fHy\fIa\fHZ\fHR\fHT\fHR\fHB\fHD\fIk\fHi\fHJ\fHR\fH^\fHH\fH@\fHS\fHp\fH^\fIl\fHF\fIm\fH\\\fIn\fH[\fHU\fHS\fHn\fHJ\fIl\fHB\fHS\fHH\fIa\fH\\\fHy\fHY\fHS\fHH\fHR\fH\\\fIm\fHF\fHC\fIk\fHT\fIa\fHI\fHR\fHD\fHy\fH\\\fIg\fHM\fHP\fHB\fIm\fHy\fIa\fHH\fHC\fIg\fHp\fHD\fHR\fHy\fIo\fHF\fHC\fHR\fHF\fIg\fHT\fIa\fHs\fHt\fH\\\fIk\fH^\fIn\fHy\fHR\fH\\\fIa\fHC\fHY\fHS\fHv\fHR\fH\\\fHT\fIn\fHv\fHD\fHR\fHB\fIn\fH^\fIa\fHC\fHJ\fIk\fHz\fIk\fHn\fHU\fHB\fIk\fHZ\fHR\fHT\fIa\fHy\fIn\fH^\fHB\fId\fHn\fHD\fIk\fHH\fId\fHC\fHR\fH\\\fHp\fHS\fHT\fHy\fIkqpp({no!#wjwof>!.wzsf!#`lmwfmw>!wjwof!#`lmwfmw>!bw#wkf#pbnf#wjnf-ip!=?,p`qjsw=\t?!#nfwklg>!slpw!#?,psbm=?,b=?,oj=ufqwj`bo.bojdm9w,irvfqz-njm-ip!=-`oj`h+evm`wjlm+#pwzof>!sbggjmd.~*+*8\t?,p`qjsw=\t?,psbm=?b#kqfe>!?b#kqfe>!kwws9,,*8#qfwvqm#ebopf8wf{w.gf`lqbwjlm9#p`qloojmd>!ml!#alqgfq.`loobspf9bppl`jbwfg#tjwk#Abkbpb#JmglmfpjbFmdojpk#obmdvbdf?wf{w#{no9psb`f>-dje!#alqgfq>!3!?,algz=\t?,kwno=\tlufqeolt9kjggfm8jnd#pq`>!kwws9,,bggFufmwOjpwfmfqqfpslmpjaof#elq#p-ip!=?,p`qjsw=\t,ebuj`lm-j`l!#,=lsfqbwjmd#pzpwfn!#pwzof>!tjgwk92wbqdfw>!\\aobmh!=Pwbwf#Vmjufqpjwzwf{w.bojdm9ofew8\tgl`vnfmw-tqjwf+/#jm`ovgjmd#wkf#bqlvmg#wkf#tlqog*8\x0E\t?,p`qjsw=\x0E\t?!#pwzof>!kfjdkw98lufqeolt9kjggfmnlqf#jmelqnbwjlmbm#jmwfqmbwjlmbob#nfnafq#le#wkf#lmf#le#wkf#ejqpw`bm#af#elvmg#jm#?,gju=\t\n\n?,gju=\tgjpsobz9#mlmf8!=!#,=\t?ojmh#qfo>!\t##+evm`wjlm+*#xwkf#26wk#`fmwvqz-sqfufmwGfebvow+obqdf#mvnafq#le#Azybmwjmf#Fnsjqf-isd\x7Fwkvna\x7Fofew\x7Fubpw#nbilqjwz#lenbilqjwz#le#wkf##bojdm>!`fmwfq!=Vmjufqpjwz#Sqfppglnjmbwfg#az#wkfPf`lmg#Tlqog#Tbqgjpwqjavwjlm#le#pwzof>!slpjwjlm9wkf#qfpw#le#wkf#`kbqb`wfqjyfg#az#qfo>!mleloolt!=gfqjufp#eqln#wkfqbwkfq#wkbm#wkf#b#`lnajmbwjlm#lepwzof>!tjgwk9233Fmdojpk.psfbhjmd`lnsvwfq#p`jfm`falqgfq>!3!#bow>!wkf#f{jpwfm`f#leGfnl`qbwj`#Sbqwz!#pwzof>!nbqdjm.Elq#wkjp#qfbplm/-ip!=?,p`qjsw=\t\npAzWbdMbnf+p*X3^ip!=?,p`qjsw=\x0E\t?-ip!=?,p`qjsw=\x0E\tojmh#qfo>!j`lm!#$#bow>$$#`obpp>$elqnbwjlm#le#wkfufqpjlmp#le#wkf#?,b=?,gju=?,gju=,sbdf=\t##?sbdf=\t?gju#`obpp>!`lmwaf`bnf#wkf#ejqpwabkbpb#Jmglmfpjbfmdojpk#+pjnsof*\"y\"W\"W\"[\"Q\"U\"V\"@=i=l<^<\\=n=m!?gju#jg>!ellwfq!=wkf#Vmjwfg#Pwbwfp?jnd#pq`>!kwws9,,-isd\x7Fqjdkw\x7Fwkvna\x7F-ip!=?,p`qjsw=\x0E\t?ol`bwjlm-sqlwl`loeqbnfalqgfq>!3!#p!#,=\t?nfwb#mbnf>!?,b=?,gju=?,gju=?elmw.tfjdkw9alog8%rvlw8#bmg#%rvlw8gfsfmgjmd#lm#wkf#nbqdjm938sbggjmd9!#qfo>!mleloolt!#Sqfpjgfmw#le#wkf#wtfmwjfwk#`fmwvqzfujpjlm=\t##?,sbdfJmwfqmfw#F{solqfqb-bpzm`#>#wqvf8\x0E\tjmelqnbwjlm#balvw?gju#jg>!kfbgfq!=!#b`wjlm>!kwws9,,?b#kqfe>!kwwsp9,,?gju#jg>!`lmwfmw!?,gju=\x0E\t?,gju=\x0E\t?gfqjufg#eqln#wkf#?jnd#pq`>$kwws9,,b``lqgjmd#wl#wkf#\t?,algz=\t?,kwno=\tpwzof>!elmw.pjyf9p`qjsw#obmdvbdf>!Bqjbo/#Kfoufwj`b/?,b=?psbm#`obpp>!?,p`qjsw=?p`qjsw#slojwj`bo#sbqwjfpwg=?,wq=?,wbaof=?kqfe>!kwws9,,ttt-jmwfqsqfwbwjlm#leqfo>!pwzofpkffw!#gl`vnfmw-tqjwf+$?`kbqpfw>!vwe.;!=\tafdjmmjmd#le#wkf#qfufbofg#wkbw#wkfwfofujpjlm#pfqjfp!#qfo>!mleloolt!=#wbqdfw>!\\aobmh!=`objnjmd#wkbw#wkfkwws&0B&1E&1Ettt-nbmjefpwbwjlmp#leSqjnf#Njmjpwfq#lejmeovfm`fg#az#wkf`obpp>!`ofbqej{!=,gju=\x0E\t?,gju=\x0E\t\x0E\twkqff.gjnfmpjlmbo@kvq`k#le#Fmdobmgle#Mlqwk#@bqlojmbprvbqf#hjolnfwqfp-bggFufmwOjpwfmfqgjpwjm`w#eqln#wkf`lnnlmoz#hmltm#bpSklmfwj`#Boskbafwgf`obqfg#wkbw#wkf`lmwqloofg#az#wkfAfmibnjm#Eqbmhojmqlof.sobzjmd#dbnfwkf#Vmjufqpjwz#lejm#Tfpwfqm#Fvqlsfsfqplmbo#`lnsvwfqSqlif`w#Dvwfmafqdqfdbqgofpp#le#wkfkbp#affm#sqlslpfgwldfwkfq#tjwk#wkf=?,oj=?oj#`obpp>!jm#plnf#`lvmwqjfpnjm-ip!=?,p`qjsw=le#wkf#slsvobwjlmleej`jbo#obmdvbdf?jnd#pq`>!jnbdfp,jgfmwjejfg#az#wkfmbwvqbo#qfplvq`fp`obppjej`bwjlm#le`bm#af#`lmpjgfqfgrvbmwvn#nf`kbmj`pMfufqwkfofpp/#wkfnjoojlm#zfbqp#bdl?,algz=\x0E\t?,kwno=\x0E\"y\"W\"W\"[\"Q\"U\"V\"@\twbhf#bgubmwbdf#lebmg/#b``lqgjmd#wlbwwqjavwfg#wl#wkfNj`qlplew#Tjmgltpwkf#ejqpw#`fmwvqzvmgfq#wkf#`lmwqlogju#`obpp>!kfbgfqpklqwoz#bewfq#wkfmlwbaof#f{`fswjlmwfmp#le#wklvpbmgppfufqbo#gjeefqfmwbqlvmg#wkf#tlqog-qfb`kjmd#njojwbqzjplobwfg#eqln#wkflsslpjwjlm#wl#wkfwkf#Log#WfpwbnfmwBeqj`bm#Bnfqj`bmpjmpfqwfg#jmwl#wkfpfsbqbwf#eqln#wkfnfwqlslojwbm#bqfbnbhfp#jw#slppjaofb`hmltofgdfg#wkbwbqdvbaoz#wkf#nlpwwzsf>!wf{w,`pp!=\twkf#JmwfqmbwjlmboB``lqgjmd#wl#wkf#sf>!wf{w,`pp!#,=\t`ljm`jgf#tjwk#wkfwtl.wkjqgp#le#wkfGvqjmd#wkjp#wjnf/gvqjmd#wkf#sfqjlgbmmlvm`fg#wkbw#kfwkf#jmwfqmbwjlmbobmg#nlqf#qf`fmwozafojfufg#wkbw#wkf`lmp`jlvpmfpp#bmgelqnfqoz#hmltm#bppvqqlvmgfg#az#wkfejqpw#bssfbqfg#jml``bpjlmbooz#vpfgslpjwjlm9baplovwf8!#wbqdfw>!\\aobmh!#slpjwjlm9qfobwjuf8wf{w.bojdm9`fmwfq8ib{,ojap,irvfqz,2-ab`hdqlvmg.`lolq9 wzsf>!bssoj`bwjlm,bmdvbdf!#`lmwfmw>!?nfwb#kwws.frvju>!Sqjub`z#Sloj`z?,b=f+!&0@p`qjsw#pq`>$!#wbqdfw>!\\aobmh!=Lm#wkf#lwkfq#kbmg/-isd\x7Fwkvna\x7Fqjdkw\x7F1?,gju=?gju#`obpp>!?gju#pwzof>!eolbw9mjmfwffmwk#`fmwvqz?,algz=\x0E\t?,kwno=\x0E\t?jnd#pq`>!kwws9,,p8wf{w.bojdm9`fmwfqelmw.tfjdkw9#alog8#B``lqgjmd#wl#wkf#gjeefqfm`f#afwtffm!#eqbnfalqgfq>!3!#!#pwzof>!slpjwjlm9ojmh#kqfe>!kwws9,,kwno7,ollpf-gwg!=\tgvqjmd#wkjp#sfqjlg?,wg=?,wq=?,wbaof=`olpfoz#qfobwfg#wlelq#wkf#ejqpw#wjnf8elmw.tfjdkw9alog8jmsvw#wzsf>!wf{w!#?psbm#pwzof>!elmw.lmqfbgzpwbwf`kbmdf\n?gju#`obpp>!`ofbqgl`vnfmw-ol`bwjlm-#Elq#f{bnsof/#wkf#b#tjgf#ubqjfwz#le#?\"GL@WZSF#kwno=\x0E\t?%maps8%maps8%maps8!=?b#kqfe>!kwws9,,pwzof>!eolbw9ofew8`lm`fqmfg#tjwk#wkf>kwws&0B&1E&1Ettt-jm#slsvobq#`vowvqfwzsf>!wf{w,`pp!#,=jw#jp#slppjaof#wl#Kbqubqg#Vmjufqpjwzwzofpkffw!#kqfe>!,wkf#nbjm#`kbqb`wfqL{elqg#Vmjufqpjwz##mbnf>!hfztlqgp!#`pwzof>!wf{w.bojdm9wkf#Vmjwfg#Hjmdglnefgfqbo#dlufqmnfmw?gju#pwzof>!nbqdjm#gfsfmgjmd#lm#wkf#gfp`qjswjlm#le#wkf?gju#`obpp>!kfbgfq-njm-ip!=?,p`qjsw=gfpwqv`wjlm#le#wkfpojdkwoz#gjeefqfmwjm#b``lqgbm`f#tjwkwfof`lnnvmj`bwjlmpjmgj`bwfp#wkbw#wkfpklqwoz#wkfqfbewfqfpsf`jbooz#jm#wkf#Fvqlsfbm#`lvmwqjfpKltfufq/#wkfqf#bqfpq`>!kwws9,,pwbwj`pvddfpwfg#wkbw#wkf!#pq`>!kwws9,,ttt-b#obqdf#mvnafq#le#Wfof`lnnvmj`bwjlmp!#qfo>!mleloolt!#wKloz#Qlnbm#Fnsfqlqbonlpw#f{`ovpjufoz!#alqgfq>!3!#bow>!Pf`qfwbqz#le#Pwbwf`vonjmbwjmd#jm#wkf@JB#Tlqog#Eb`wallhwkf#nlpw#jnslqwbmwbmmjufqpbqz#le#wkfpwzof>!ab`hdqlvmg.?oj=?fn=?b#kqfe>!,wkf#Bwobmwj`#L`fbmpwqj`woz#psfbhjmd/pklqwoz#afelqf#wkfgjeefqfmw#wzsfp#lewkf#Lwwlnbm#Fnsjqf=?jnd#pq`>!kwws9,,Bm#Jmwqlgv`wjlm#wl`lmpfrvfm`f#le#wkfgfsbqwvqf#eqln#wkf@lmefgfqbwf#Pwbwfpjmgjdfmlvp#sflsofpSql`ffgjmdp#le#wkfjmelqnbwjlm#lm#wkfwkflqjfp#kbuf#affmjmuloufnfmw#jm#wkfgjujgfg#jmwl#wkqffbgib`fmw#`lvmwqjfpjp#qfpslmpjaof#elqgjpplovwjlm#le#wkf`loobalqbwjlm#tjwktjgfoz#qfdbqgfg#bpkjp#`lmwfnslqbqjfpelvmgjmd#nfnafq#leGlnjmj`bm#Qfsvaoj`dfmfqbooz#b``fswfgwkf#slppjajojwz#lebqf#bopl#bubjobaofvmgfq#`lmpwqv`wjlmqfpwlqbwjlm#le#wkfwkf#dfmfqbo#svaoj`jp#bonlpw#fmwjqfozsbppfp#wkqlvdk#wkfkbp#affm#pvddfpwfg`lnsvwfq#bmg#ujgflDfqnbmj`#obmdvbdfp#b``lqgjmd#wl#wkf#gjeefqfmw#eqln#wkfpklqwoz#bewfqtbqgpkqfe>!kwwsp9,,ttt-qf`fmw#gfufolsnfmwAlbqg#le#Gjqf`wlqp?gju#`obpp>!pfbq`k\x7F#?b#kqfe>!kwws9,,Jm#sbqwj`vobq/#wkfNvowjsof#ellwmlwfplq#lwkfq#pvapwbm`fwklvpbmgp#le#zfbqpwqbmpobwjlm#le#wkf?,gju=\x0E\t?,gju=\x0E\t\x0E\t?b#kqfe>!jmgf{-skstbp#fpwbaojpkfg#jmnjm-ip!=?,p`qjsw=\tsbqwj`jsbwf#jm#wkfb#pwqlmd#jmeovfm`fpwzof>!nbqdjm.wls9qfsqfpfmwfg#az#wkfdqbgvbwfg#eqln#wkfWqbgjwjlmbooz/#wkfFofnfmw+!p`qjsw!*8Kltfufq/#pjm`f#wkf,gju=\t?,gju=\t?gju#ofew8#nbqdjm.ofew9sqlwf`wjlm#bdbjmpw38#ufqwj`bo.bojdm9Vmelqwvmbwfoz/#wkfwzsf>!jnbdf,{.j`lm,gju=\t?gju#`obpp>!#`obpp>!`ofbqej{!=?gju#`obpp>!ellwfq\n\n?,gju=\t\n\n?,gju=\twkf#nlwjlm#sj`wvqf<}=f!t0-lqd,2:::,{kwno!=?b#wbqdfw>!\\aobmh!#wf{w,kwno8#`kbqpfw>!#wbqdfw>!\\aobmh!=?wbaof#`foosbggjmd>!bvwl`lnsofwf>!lee!#wf{w.bojdm9#`fmwfq8wl#obpw#ufqpjlm#az#ab`hdqlvmg.`lolq9# !#kqfe>!kwws9,,ttt-,gju=?,gju=?gju#jg>?b#kqfe>! !#`obpp>!!=?jnd#pq`>!kwws9,,`qjsw!#pq`>!kwws9,,\t?p`qjsw#obmdvbdf>!,,FM!#!kwws9,,ttt-tfm`lgfVQJ@lnslmfmw+!#kqfe>!ibubp`qjsw9?gju#`obpp>!`lmwfmwgl`vnfmw-tqjwf+$?p`slpjwjlm9#baplovwf8p`qjsw#pq`>!kwws9,,#pwzof>!nbqdjm.wls9-njm-ip!=?,p`qjsw=\t?,gju=\t?gju#`obpp>!t0-lqd,2:::,{kwno!#\t\x0E\t?,algz=\x0E\t?,kwno=gjpwjm`wjlm#afwtffm,!#wbqdfw>!\\aobmh!=?ojmh#kqfe>!kwws9,,fm`lgjmd>!vwe.;!<=\tt-bggFufmwOjpwfmfq!kwws9,,ttt-j`lm!#kqfe>!kwws9,,#pwzof>!ab`hdqlvmg9wzsf>!wf{w,`pp!#,=\tnfwb#sqlsfqwz>!ld9w?jmsvw#wzsf>!wf{w!##pwzof>!wf{w.bojdm9wkf#gfufolsnfmw#le#wzofpkffw!#wzsf>!wfkwno8#`kbqpfw>vwe.;jp#`lmpjgfqfg#wl#afwbaof#tjgwk>!233&!#Jm#bggjwjlm#wl#wkf#`lmwqjavwfg#wl#wkf#gjeefqfm`fp#afwtffmgfufolsnfmw#le#wkf#Jw#jp#jnslqwbmw#wl#?,p`qjsw=\t\t?p`qjsw##pwzof>!elmw.pjyf92=?,psbm=?psbm#jg>daOjaqbqz#le#@lmdqfpp?jnd#pq`>!kwws9,,jnFmdojpk#wqbmpobwjlmB`bgfnz#le#P`jfm`fpgju#pwzof>!gjpsobz9`lmpwqv`wjlm#le#wkf-dfwFofnfmwAzJg+jg*jm#`lmivm`wjlm#tjwkFofnfmw+$p`qjsw$*8#?nfwb#sqlsfqwz>!ld9<}=f!wf{w!#mbnf>!=Sqjub`z#Sloj`z?,b=bgnjmjpwfqfg#az#wkffmbaofPjmdofQfrvfpwpwzof>%rvlw8nbqdjm9?,gju=?,gju=?,gju=?=?jnd#pq`>!kwws9,,j#pwzof>%rvlw8eolbw9qfefqqfg#wl#bp#wkf#wlwbo#slsvobwjlm#lejm#Tbpkjmdwlm/#G-@-#pwzof>!ab`hdqlvmg.bnlmd#lwkfq#wkjmdp/lqdbmjybwjlm#le#wkfsbqwj`jsbwfg#jm#wkfwkf#jmwqlgv`wjlm#lejgfmwjejfg#tjwk#wkfej`wjlmbo#`kbqb`wfq#L{elqg#Vmjufqpjwz#njpvmgfqpwbmgjmd#leWkfqf#bqf/#kltfufq/pwzofpkffw!#kqfe>!,@lovnajb#Vmjufqpjwzf{sbmgfg#wl#jm`ovgfvpvbooz#qfefqqfg#wljmgj`bwjmd#wkbw#wkfkbuf#pvddfpwfg#wkbwbeejojbwfg#tjwk#wkf`lqqfobwjlm#afwtffmmvnafq#le#gjeefqfmw=?,wg=?,wq=?,wbaof=Qfsvaoj`#le#Jqfobmg\t?,p`qjsw=\t?p`qjsw#vmgfq#wkf#jmeovfm`f`lmwqjavwjlm#wl#wkfLeej`jbo#tfapjwf#lekfbgrvbqwfqp#le#wkf`fmwfqfg#bqlvmg#wkfjnsoj`bwjlmp#le#wkfkbuf#affm#gfufolsfgEfgfqbo#Qfsvaoj`#leaf`bnf#jm`qfbpjmdoz`lmwjmvbwjlm#le#wkfMlwf/#kltfufq/#wkbwpjnjobq#wl#wkbw#le#`bsbajojwjfp#le#wkfb``lqgbm`f#tjwk#wkfsbqwj`jsbmwp#jm#wkfevqwkfq#gfufolsnfmwvmgfq#wkf#gjqf`wjlmjp#lewfm#`lmpjgfqfgkjp#zlvmdfq#aqlwkfq?,wg=?,wq=?,wbaof=?b#kwws.frvju>![.VB.skzpj`bo#sqlsfqwjfple#Aqjwjpk#@lovnajbkbp#affm#`qjwj`jyfg+tjwk#wkf#f{`fswjlmrvfpwjlmp#balvw#wkfsbppjmd#wkqlvdk#wkf3!#`foosbggjmd>!3!#wklvpbmgp#le#sflsofqfgjqf`wp#kfqf-#Elqkbuf#`kjogqfm#vmgfq&0F&0@,p`qjsw&0F!**8?b#kqfe>!kwws9,,ttt-?oj=?b#kqfe>!kwws9,,pjwf\\mbnf!#`lmwfmw>!wf{w.gf`lqbwjlm9mlmfpwzof>!gjpsobz9#mlmf?nfwb#kwws.frvju>![.mft#Gbwf+*-dfwWjnf+*#wzsf>!jnbdf,{.j`lm!?,psbm=?psbm#`obpp>!obmdvbdf>!ibubp`qjswtjmglt-ol`bwjlm-kqfe?b#kqfe>!ibubp`qjsw9..=\x0E\t?p`qjsw#wzsf>!w?b#kqfe>$kwws9,,ttt-klqw`vw#j`lm!#kqfe>!?,gju=\x0E\t?gju#`obpp>!?p`qjsw#pq`>!kwws9,,!#qfo>!pwzofpkffw!#w?,gju=\t?p`qjsw#wzsf>,b=#?b#kqfe>!kwws9,,#booltWqbmpsbqfm`z>![.VB.@lnsbwjaof!#`lmqfobwjlmpkjs#afwtffm\t?,p`qjsw=\x0E\t?p`qjsw#?,b=?,oj=?,vo=?,gju=bppl`jbwfg#tjwk#wkf#sqldqbnnjmd#obmdvbdf?,b=?b#kqfe>!kwws9,,?,b=?,oj=?oj#`obpp>!elqn#b`wjlm>!kwws9,,?gju#pwzof>!gjpsobz9wzsf>!wf{w!#mbnf>!r!?wbaof#tjgwk>!233&!#ab`hdqlvmg.slpjwjlm9!#alqgfq>!3!#tjgwk>!qfo>!pklqw`vw#j`lm!#k5=?vo=?oj=?b#kqfe>!##?nfwb#kwws.frvju>!`pp!#nfgjb>!p`qffm!#qfpslmpjaof#elq#wkf#!#wzsf>!bssoj`bwjlm,!#pwzof>!ab`hdqlvmg.kwno8#`kbqpfw>vwe.;!#booltwqbmpsbqfm`z>!pwzofpkffw!#wzsf>!wf\x0E\t?nfwb#kwws.frvju>!=?,psbm=?psbm#`obpp>!3!#`foopsb`jmd>!3!=8\t?,p`qjsw=\t?p`qjsw#plnfwjnfp#`boofg#wkfglfp#mlw#mf`fppbqjozElq#nlqf#jmelqnbwjlmbw#wkf#afdjmmjmd#le#?\"GL@WZSF#kwno=?kwnosbqwj`vobqoz#jm#wkf#wzsf>!kjggfm!#mbnf>!ibubp`qjsw9uljg+3*8!feef`wjufmfpp#le#wkf#bvwl`lnsofwf>!lee!#dfmfqbooz#`lmpjgfqfg=?jmsvw#wzsf>!wf{w!#!=?,p`qjsw=\x0E\t?p`qjswwkqlvdklvw#wkf#tlqog`lnnlm#njp`lm`fswjlmbppl`jbwjlm#tjwk#wkf?,gju=\t?,gju=\t?gju#`gvqjmd#kjp#ojefwjnf/`lqqfpslmgjmd#wl#wkfwzsf>!jnbdf,{.j`lm!#bm#jm`qfbpjmd#mvnafqgjsolnbwj`#qfobwjlmpbqf#lewfm#`lmpjgfqfgnfwb#`kbqpfw>!vwe.;!#?jmsvw#wzsf>!wf{w!#f{bnsofp#jm`ovgf#wkf!=?jnd#pq`>!kwws9,,jsbqwj`jsbwjlm#jm#wkfwkf#fpwbaojpknfmw#le\t?,gju=\t?gju#`obpp>!%bns8maps8%bns8maps8wl#gfwfqnjmf#tkfwkfqrvjwf#gjeefqfmw#eqlnnbqhfg#wkf#afdjmmjmdgjpwbm`f#afwtffm#wkf`lmwqjavwjlmp#wl#wkf`lmeoj`w#afwtffm#wkftjgfoz#`lmpjgfqfg#wltbp#lmf#le#wkf#ejqpwtjwk#ubqzjmd#gfdqffpkbuf#psf`vobwfg#wkbw+gl`vnfmw-dfwFofnfmwsbqwj`jsbwjmd#jm#wkflqjdjmbooz#gfufolsfgfwb#`kbqpfw>!vwe.;!=#wzsf>!wf{w,`pp!#,=\tjmwfq`kbmdfbaoz#tjwknlqf#`olpfoz#qfobwfgpl`jbo#bmg#slojwj`bowkbw#tlvog#lwkfqtjpfsfqsfmgj`vobq#wl#wkfpwzof#wzsf>!wf{w,`ppwzsf>!pvanjw!#mbnf>!ebnjojfp#qfpjgjmd#jmgfufolsjmd#`lvmwqjfp`lnsvwfq#sqldqbnnjmdf`lmlnj`#gfufolsnfmwgfwfqnjmbwjlm#le#wkfelq#nlqf#jmelqnbwjlmlm#pfufqbo#l``bpjlmpslqwvdv/Fp#+Fvqlsfv*VWE.;!#pfwWjnflvw+evm`wjlm+*gjpsobz9jmojmf.aol`h8?jmsvw#wzsf>!pvanjw!#wzsf#>#$wf{w,ibubp`qj?jnd#pq`>!kwws9,,ttt-!#!kwws9,,ttt-t0-lqd,pklqw`vw#j`lm!#kqfe>!!#bvwl`lnsofwf>!lee!#?,b=?,gju=?gju#`obpp>?,b=?,oj=\t?oj#`obpp>!`pp!#wzsf>!wf{w,`pp!#?elqn#b`wjlm>!kwws9,,{w,`pp!#kqfe>!kwws9,,ojmh#qfo>!bowfqmbwf!#\x0E\t?p`qjsw#wzsf>!wf{w,#lm`oj`h>!ibubp`qjsw9+mft#Gbwf*-dfwWjnf+*~kfjdkw>!2!#tjgwk>!2!#Sflsof$p#Qfsvaoj`#le##?b#kqfe>!kwws9,,ttt-wf{w.gf`lqbwjlm9vmgfqwkf#afdjmmjmd#le#wkf#?,gju=\t?,gju=\t?,gju=\tfpwbaojpknfmw#le#wkf#?,gju=?,gju=?,gju=?,g ujftslqwxnjm.kfjdkw9\t?p`qjsw#pq`>!kwws9,,lswjlm=?lswjlm#ubovf>lewfm#qfefqqfg#wl#bp#,lswjlm=\t?lswjlm#ubov?\"GL@WZSF#kwno=\t?\"..XJmwfqmbwjlmbo#Bjqslqw=\t?b#kqfe>!kwws9,,ttt?,b=?b#kqfe>!kwws9,,t\fTL\fT^\fTE\fT^\fUh\fT{\fTN\roI\ro|\roL\ro{\roO\rov\rot\nAO\x05Gx\bTA\nzk#+\x0BUm\x05Gx*\fHD\fHS\fH\\\fIa\fHJ\fIk\fHZ\fHM\fHR\fHe\fHD\fH^\fIg\fHM\fHy\fIa\fH[\fIk\fHH\fIa\fH\\\fHp\fHR\fHD\fHy\fHR\fH\\\fIl\fHT\fHn\fH@\fHn\fHK\fHS\fHH\fHT\fIa\fHI\fHR\fHF\fHD\fHR\fHT\fIa\fHY\fIl\fHy\fHR\fH\\\fHT\fHn\fHT\fIa\fHy\fH\\\fHO\fHT\fHR\fHB\fH{\fIa\fH\\\fIl\fHv\fHS\fHs\fIa\fHL\fIg\fHn\fHY\fHS\fHp\fIa\fHr\fHR\fHD\fHi\fHB\fIk\fH\\\fHS\fHy\fHR\fHY\fHS\fHA\fHS\fHD\fIa\fHD\fH{\fHR\fHM\fHS\fHC\fHR\fHm\fHy\fIa\fHC\fIg\fHn\fHy\fHS\fHT\fIm\fH\\\fHy\fIa\fH[\fHR\fHF\fHU\fIm\fHm\fHv\fHH\fIl\fHF\fIa\fH\\\fH@\fHn\fHK\fHD\fHs\fHS\fHF\fIa\fHF\fHO\fIl\fHy\fIa\fH\\\fHS\fHy\fIk\fHs\fHF\fIa\fH\\\fHR\fH\\\fHn\fHA\fHF\fIa\fH\\\fHR\fHF\fIa\fHH\fHB\fHR\fH^\fHS\fHy\fIg\fHn\fH\\\fHG\fHP\fIa\fHH\fHR\fH\\\fHD\fHS\fH\\\fIa\fHB\fHR\fHO\fH^\fHS\fHB\fHS\fHs\fIk\fHMgfp`qjswjlm!#`lmwfmw>!gl`vnfmw-ol`bwjlm-sqlw-dfwFofnfmwpAzWbdMbnf+?\"GL@WZSF#kwno=\t?kwno#?nfwb#`kbqpfw>!vwe.;!=9vqo!#`lmwfmw>!kwws9,,-`pp!#qfo>!pwzofpkffw!pwzof#wzsf>!wf{w,`pp!=wzsf>!wf{w,`pp!#kqfe>!t0-lqd,2:::,{kwno!#{nowzsf>!wf{w,ibubp`qjsw!#nfwklg>!dfw!#b`wjlm>!ojmh#qfo>!pwzofpkffw!##>#gl`vnfmw-dfwFofnfmwwzsf>!jnbdf,{.j`lm!#,=`foosbggjmd>!3!#`foops-`pp!#wzsf>!wf{w,`pp!#?,b=?,oj=?oj=?b#kqfe>!!#tjgwk>!2!#kfjdkw>!2!!=?b#kqfe>!kwws9,,ttt-pwzof>!gjpsobz9mlmf8!=bowfqmbwf!#wzsf>!bssoj.,,T0@,,GWG#[KWNO#2-3#foopsb`jmd>!3!#`foosbg#wzsf>!kjggfm!#ubovf>!,b=%maps8?psbm#qlof>!p\t?jmsvw#wzsf>!kjggfm!#obmdvbdf>!IbubP`qjsw!##gl`vnfmw-dfwFofnfmwpAd>!3!#`foopsb`jmd>!3!#zsf>!wf{w,`pp!#nfgjb>!wzsf>$wf{w,ibubp`qjsw$tjwk#wkf#f{`fswjlm#le#zsf>!wf{w,`pp!#qfo>!pw#kfjdkw>!2!#tjgwk>!2!#>$(fm`lgfVQJ@lnslmfmw+?ojmh#qfo>!bowfqmbwf!#\talgz/#wq/#jmsvw/#wf{wnfwb#mbnf>!qlalwp!#`lmnfwklg>!slpw!#b`wjlm>!=\t?b#kqfe>!kwws9,,ttt-`pp!#qfo>!pwzofpkffw!#?,gju=?,gju=?gju#`obppobmdvbdf>!ibubp`qjsw!=bqjb.kjggfm>!wqvf!=.[?qjsw!#wzsf>!wf{w,ibubpo>38~*+*8\t+evm`wjlm+*xab`hdqlvmg.jnbdf9#vqo+,b=?,oj=?oj=?b#kqfe>!k\n\n?oj=?b#kqfe>!kwws9,,bwlq!#bqjb.kjggfm>!wqv=#?b#kqfe>!kwws9,,ttt-obmdvbdf>!ibubp`qjsw!#,lswjlm=\t?lswjlm#ubovf,gju=?,gju=?gju#`obpp>qbwlq!#bqjb.kjggfm>!wqf>+mft#Gbwf*-dfwWjnf+*slqwvdv/Fp#+gl#Aqbpjo*!wf{w,?nfwb#kwws.frvju>!@lmwfqbmpjwjlmbo,,FM!#!kwws9?kwno#{nomp>!kwws9,,ttt.,,T0@,,GWG#[KWNO#2-3#WGWG,{kwno2.wqbmpjwjlmbo,,ttt-t0-lqd,WQ,{kwno2,sf#>#$wf{w,ibubp`qjsw$8?nfwb#mbnf>!gfp`qjswjlmsbqfmwMlgf-jmpfqwAfelqf?jmsvw#wzsf>!kjggfm!#mbip!#wzsf>!wf{w,ibubp`qj+gl`vnfmw*-qfbgz+evm`wjp`qjsw#wzsf>!wf{w,ibubpjnbdf!#`lmwfmw>!kwws9,,VB.@lnsbwjaof!#`lmwfmw>wno8#`kbqpfw>vwe.;!#,=\tojmh#qfo>!pklqw`vw#j`lm?ojmh#qfo>!pwzofpkffw!#?,p`qjsw=\t?p`qjsw#wzsf>>#gl`vnfmw-`qfbwfFofnfm?b#wbqdfw>!\\aobmh!#kqfe>#gl`vnfmw-dfwFofnfmwpAjmsvw#wzsf>!wf{w!#mbnf>b-wzsf#>#$wf{w,ibubp`qjmsvw#wzsf>!kjggfm!#mbnfkwno8#`kbqpfw>vwe.;!#,=gwg!=\t?kwno#{nomp>!kwws.,,T0@,,GWG#KWNO#7-32#WfmwpAzWbdMbnf+$p`qjsw$*jmsvw#wzsf>!kjggfm!#mbn?p`qjsw#wzsf>!wf{w,ibubp!#pwzof>!gjpsobz9mlmf8!=gl`vnfmw-dfwFofnfmwAzJg+>gl`vnfmw-`qfbwfFofnfmw+$#wzsf>$wf{w,ibubp`qjsw$jmsvw#wzsf>!wf{w!#mbnf>!g-dfwFofnfmwpAzWbdMbnf+pmj`bo!#kqfe>!kwws9,,ttt-@,,GWG#KWNO#7-32#Wqbmpjw?pwzof#wzsf>!wf{w,`pp!=\t\t?pwzof#wzsf>!wf{w,`pp!=jlmbo-gwg!=\t?kwno#{nomp>kwws.frvju>!@lmwfmw.Wzsfgjmd>!3!#`foopsb`jmd>!3!kwno8#`kbqpfw>vwe.;!#,=\t#pwzof>!gjpsobz9mlmf8!=??oj=?b#kqfe>!kwws9,,ttt-#wzsf>$wf{w,ibubp`qjsw$=&*&'&^&\x88\u0178\u0C3E&\u01AD&\u0192&)&^&%&'&\x82&P&1&\xB1&3&]&m&u&E&t&C&\xCF&V&V&/&>&6&\u0F76\u177Co&p&@&E&M&P&x&@&F&e&\xCC&7&:&(&D&0&C&)&.&F&-&1&(&L&F&1\u025E*\u03EA\u21F3&\u1372&K&;&)&E&H&P&0&?&9&V&\x81&-&v&a&,&E&)&?&=&'&'&B&\u0D2E&\u0503&\u0316*&*8&%&%&&&%,)&\x9A&>&\x86&7&]&F&2&>&J&6&n&2&%&?&\x8E&2&6&J&g&-&0&,&*&J&*&O&)&6&(&<&B&N&.&P&@&2&.&W&M&%\u053C\x84(,(<&,&\u03DA&\u18C7&-&,(%&(&%&(\u013B0&X&D&\x81&j&'&J&(&.&B&3&Z&R&h&3&E&E&<\xC6-\u0360\u1EF3&%8?&@&,&Z&@&0&J&,&^&x&_&6&C&6&C\u072C\u2A25&f&-&-&-&-&,&J&2&8&z&8&C&Y&8&-&d&\u1E78\xCC-&7&1&F&7&t&W&7&I&.&.&^&=\u0F9C\u19D3&8(>&/&/&\u077B')'\u1065')'%@/&0&%\u043E\u09C0*&*@&C\u053D\u05D4\u0274\u05EB4\u0DD7\u071A\u04D16\u0D84&/\u0178\u0303Z&*%\u0246\u03FF&\u0134&1\xA8\u04B4\u0174", dictionarySizeBits, "AAAAKKLLKKKKKJJIHHIHHGGFF"); + setData(dictionaryData, dictionarySizeBits); + function InputStream(data) { + this.data = new Int8Array(0); + this.offset = 0; + this.data = data; + } + function readInput(s, dst, offset, length) { + if (s.input === null) { + return -1; + } + const src = s.input; + const end = Math.min(src.offset + length, src.data.length); + const bytesRead = end - src.offset; + dst.set(src.data.subarray(src.offset, end), offset); + src.offset += bytesRead; + return bytesRead; + } + function closeInput(s) { + s.input = new InputStream(new Int8Array(0)); + } + function toUsAsciiBytes(src) { + const n = src.length; + const result = new Int8Array(n); + for (let i = 0; i < n; ++i) { + result[i] = src.charCodeAt(i); + } + return result; + } + function toUtf8Runes(src) { + const n = src.length; + const result = new Int32Array(n); + for (let i = 0; i < n; ++i) { + result[i] = src.charCodeAt(i); + } + return result; + } + function makeError(s, code) { + if (code >= 0) { + return code; + } + if (s.runningState >= 0) { + s.runningState = code; + } + throw new Error("Brotli error code: " + code); + } + let ByteBuffer; + function decode(bytes, options) { + let s = new State(); + s.input = new InputStream(bytes); + initState(s); + if (options) { + let customDictionary = options["customDictionary"]; + if (customDictionary) attachDictionaryChunk(s, customDictionary); + } + let totalOutput = 0; + let chunks = []; + while (true) { + let chunk = new Int8Array(16384); + chunks.push(chunk); + s.output = chunk; + s.outputOffset = 0; + s.outputLength = 16384; + s.outputUsed = 0; + decompress(s); + totalOutput += s.outputUsed; + if (s.outputUsed < 16384) break; + } + close(s); + closeInput(s); + let result = new Int8Array(totalOutput); + let offset = 0; + for (let i = 0; i < chunks.length; ++i) { + let chunk = chunks[i]; + let end = Math.min(totalOutput, offset + 16384); + let len = end - offset; + if (len < 16384) { + result.set(chunk.subarray(0, len), offset); + } else { + result.set(chunk, offset); + } + offset += len; + } + return result; + } + return decode; +}; +let BrotliDecode = makeBrotliDecode(); +;// ./src/core/brotli_stream.js + + + +class BrotliStream extends DecodeStream { + #isAsync = true; + constructor(stream, maybeLength) { + super(maybeLength); + this.stream = stream; + this.dict = stream.dict; + } + readBlock() { + const bytes = this.stream.getBytes(); + const decodedData = BrotliDecode(new Int8Array(bytes.buffer, bytes.byteOffset, bytes.length)); + this.buffer = new Uint8Array(decodedData.buffer, decodedData.byteOffset, decodedData.length); + this.bufferLength = this.buffer.length; + this.eof = true; + } + async getImageData(length, _decoderOptions) { + const data = await this.asyncGetBytes(); + if (!data) { + return this.getBytes(length); + } + if (data.length <= length) { + return data; } + return data.subarray(0, length); + } + async asyncGetBytes() { + const { + decompressed, + compressed + } = await this.asyncGetBytesFromDecompressionStream("brotli"); + if (decompressed) { + return decompressed; + } + this.#isAsync = false; + this.stream = new Stream(compressed, 0, compressed.length, this.stream.dict); + this.reset(); + return null; + } + get isAsync() { + return this.#isAsync; } } -function transformTile(context, tile, c) { - const component = tile.components[c]; - const codingStyleParameters = component.codingStyleParameters; - const quantizationParameters = component.quantizationParameters; - const decompositionLevelsCount = codingStyleParameters.decompositionLevelsCount; - const spqcds = quantizationParameters.SPqcds; - const scalarExpounded = quantizationParameters.scalarExpounded; - const guardBits = quantizationParameters.guardBits; - const segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed; - const resetContextProbabilities = codingStyleParameters.resetContextProbabilities; - const precision = context.components[c].precision; - const reversible = codingStyleParameters.reversibleTransformation; - const transform = reversible ? new ReversibleTransform() : new IrreversibleTransform(); - const subbandCoefficients = []; - let b = 0; - for (let i = 0; i <= decompositionLevelsCount; i++) { - const resolution = component.resolutions[i]; - const width = resolution.trx1 - resolution.trx0; - const height = resolution.try1 - resolution.try0; - const coefficients = new Float32Array(width * height); - for (let j = 0, jj = resolution.subbands.length; j < jj; j++) { - let mu, epsilon; - if (!scalarExpounded) { - mu = spqcds[0].mu; - epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0); - } else { - mu = spqcds[b].mu; - epsilon = spqcds[b].epsilon; - b++; - } - const subband = resolution.subbands[j]; - const gainLog2 = SubbandsGainLog2[subband.type]; - const delta = reversible ? 1 : 2 ** (precision + gainLog2 - epsilon) * (1 + mu / 2048); - const mb = guardBits + epsilon - 1; - copyCoefficients(coefficients, width, height, subband, delta, mb, reversible, segmentationSymbolUsed, resetContextProbabilities); + +;// ./external/jbig2/jbig2.js +async function JBig2(moduleArg = {}) { + var moduleRtn; + var Module = moduleArg; + var ENVIRONMENT_IS_WEB = true; + var ENVIRONMENT_IS_WORKER = false; + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = (status, toThrow) => { + throw toThrow; + }; + var _scriptName = import.meta.url; + var scriptDirectory = ""; + var readAsync, readBinary; + if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + try { + scriptDirectory = new URL(".", _scriptName).href; + } catch {} + readAsync = async url => { + var response = await fetch(url, { + credentials: "same-origin" + }); + if (response.ok) { + return response.arrayBuffer(); + } + throw new Error(response.status + " : " + response.url); + }; + } else {} + var out = console.log.bind(console); + var err = console.error.bind(console); + var wasmBinary; + var ABORT = false; + var EXITSTATUS; + var readyPromiseResolve, readyPromiseReject; + var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + var HEAP64, HEAPU64; + var runtimeInitialized = false; + function updateMemoryViews() { + var b = wasmMemory.buffer; + HEAP8 = new Int8Array(b); + HEAP16 = new Int16Array(b); + HEAPU8 = new Uint8Array(b); + HEAPU16 = new Uint16Array(b); + HEAP32 = new Int32Array(b); + HEAPU32 = new Uint32Array(b); + HEAPF32 = new Float32Array(b); + HEAPF64 = new Float64Array(b); + HEAP64 = new BigInt64Array(b); + HEAPU64 = new BigUint64Array(b); + } + function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(onPreRuns); + } + function initRuntime() { + runtimeInitialized = true; + wasmExports["j"](); + } + function postRun() { + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(onPostRuns); + } + function abort(what) { + Module["onAbort"]?.(what); + what = "Aborted(" + what + ")"; + err(what); + ABORT = true; + what += ". Build with -sASSERTIONS for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject?.(e); + throw e; + } + var wasmBinaryFile; + function getWasmImports() { + var imports = { + a: wasmImports + }; + return imports; + } + async function createWasm() { + function receiveInstance(instance, module) { + wasmExports = instance.exports; + assignWasmExports(wasmExports); + updateMemoryViews(); + return wasmExports; } - subbandCoefficients.push({ - width, - height, - items: coefficients + var info = getWasmImports(); + return new Promise((resolve, reject) => { + Module["instantiateWasm"](info, (inst, mod) => { + resolve(receiveInstance(inst, mod)); + }); }); } - const result = transform.calculate(subbandCoefficients, component.tcx0, component.tcy0); - return { - left: component.tcx0, - top: component.tcy0, - width: result.width, - height: result.height, - items: result.items - }; -} -function transformComponents(context) { - const siz = context.SIZ; - const components = context.components; - const componentsCount = siz.Csiz; - const resultImages = []; - for (let i = 0, ii = context.tiles.length; i < ii; i++) { - const tile = context.tiles[i]; - const transformedTiles = []; - for (let c = 0; c < componentsCount; c++) { - transformedTiles[c] = transformTile(context, tile, c); + class ExitStatus { + name = "ExitStatus"; + constructor(status) { + this.message = `Program terminated with exit(${status})`; + this.status = status; } - const tile0 = transformedTiles[0]; - const out = new Uint8ClampedArray(tile0.items.length * componentsCount); - const result = { - left: tile0.left, - top: tile0.top, - width: tile0.width, - height: tile0.height, - items: out + } + var callRuntimeCallbacks = callbacks => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + var onPostRuns = []; + var addOnPostRun = cb => onPostRuns.push(cb); + var onPreRuns = []; + var addOnPreRun = cb => onPreRuns.push(cb); + var noExitRuntime = true; + var __abort_js = () => abort(""); + var runtimeKeepaliveCounter = 0; + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + var timers = {}; + var handleException = e => { + if (e instanceof ExitStatus || e == "unwind") { + return EXITSTATUS; + } + quit_(1, e); + }; + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + var _proc_exit = code => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module["onExit"]?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + var exitJS = (status, implicit) => { + EXITSTATUS = status; + _proc_exit(status); + }; + var _exit = exitJS; + var maybeExit = () => { + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + var callUserCallback = func => { + if (ABORT) { + return; + } + try { + return func(); + } catch (e) { + handleException(e); + } finally { + maybeExit(); + } + }; + var _emscripten_get_now = () => performance.now(); + var __setitimer_js = (which, timeout_ms) => { + if (timers[which]) { + clearTimeout(timers[which].id); + delete timers[which]; + } + if (!timeout_ms) return 0; + var id = setTimeout(() => { + delete timers[which]; + callUserCallback(() => __emscripten_timeout(which, _emscripten_get_now())); + }, timeout_ms); + timers[which] = { + id, + timeout_ms }; - let shift, offset; - let pos = 0, - j, - jj, - y0, - y1, - y2; - if (tile.codingStyleDefaultParameters.multipleComponentTransform) { - const fourComponents = componentsCount === 4; - const y0items = transformedTiles[0].items; - const y1items = transformedTiles[1].items; - const y2items = transformedTiles[2].items; - const y3items = fourComponents ? transformedTiles[3].items : null; - shift = components[0].precision - 8; - offset = (128 << shift) + 0.5; - const component0 = tile.components[0]; - const alpha01 = componentsCount - 3; - jj = y0items.length; - if (!component0.codingStyleParameters.reversibleTransformation) { - for (j = 0; j < jj; j++, pos += alpha01) { - y0 = y0items[j] + offset; - y1 = y1items[j]; - y2 = y2items[j]; - out[pos++] = y0 + 1.402 * y2 >> shift; - out[pos++] = y0 - 0.34413 * y1 - 0.71414 * y2 >> shift; - out[pos++] = y0 + 1.772 * y1 >> shift; - } - } else { - for (j = 0; j < jj; j++, pos += alpha01) { - y0 = y0items[j] + offset; - y1 = y1items[j]; - y2 = y2items[j]; - const g = y0 - (y2 + y1 >> 2); - out[pos++] = g + y2 >> shift; - out[pos++] = g >> shift; - out[pos++] = g + y1 >> shift; - } - } - if (fourComponents) { - for (j = 0, pos = 3; j < jj; j++, pos += 4) { - out[pos] = y3items[j] + offset >> shift; - } - } - } else { - for (let c = 0; c < componentsCount; c++) { - const items = transformedTiles[c].items; - shift = components[c].precision - 8; - offset = (128 << shift) + 0.5; - for (pos = c, j = 0, jj = items.length; j < jj; j++) { - out[pos] = items[j] + offset >> shift; - pos += componentsCount; - } - } - } - resultImages.push(result); - } - return resultImages; -} -function initializeTile(context, tileIndex) { - const siz = context.SIZ; - const componentsCount = siz.Csiz; - const tile = context.tiles[tileIndex]; - for (let c = 0; c < componentsCount; c++) { - const component = tile.components[c]; - const qcdOrQcc = context.currentTile.QCC[c] !== undefined ? context.currentTile.QCC[c] : context.currentTile.QCD; - component.quantizationParameters = qcdOrQcc; - const codOrCoc = context.currentTile.COC[c] !== undefined ? context.currentTile.COC[c] : context.currentTile.COD; - component.codingStyleParameters = codOrCoc; - } - tile.codingStyleDefaultParameters = context.currentTile.COD; -} -class TagTree { - constructor(width, height) { - const levelsLength = log2(Math.max(width, height)) + 1; - this.levels = []; - for (let i = 0; i < levelsLength; i++) { - const level = { - width, - height, - items: [] - }; - this.levels.push(level); - width = Math.ceil(width / 2); - height = Math.ceil(height / 2); - } - } - reset(i, j) { - let currentLevel = 0, - value = 0, - level; - while (currentLevel < this.levels.length) { - level = this.levels[currentLevel]; - const index = i + j * level.width; - if (level.items[index] !== undefined) { - value = level.items[index]; - break; - } - level.index = index; - i >>= 1; - j >>= 1; - currentLevel++; - } - currentLevel--; - level = this.levels[currentLevel]; - level.items[level.index] = value; - this.currentLevel = currentLevel; - delete this.value; - } - incrementValue() { - const level = this.levels[this.currentLevel]; - level.items[level.index]++; - } - nextLevel() { - let currentLevel = this.currentLevel; - let level = this.levels[currentLevel]; - const value = level.items[level.index]; - currentLevel--; - if (currentLevel < 0) { - this.value = value; + return 0; + }; + function _createImageData(size) { + Module.imageData = new Uint8Array(size); + } + var getHeapMax = () => 2147483648; + var alignMemory = (size, alignment) => Math.ceil(size / alignment) * alignment; + var growMemory = size => { + var oldHeapSize = wasmMemory.buffer.byteLength; + var pages = (size - oldHeapSize + 65535) / 65536 | 0; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } catch (e) {} + }; + var _emscripten_resize_heap = requestedSize => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { return false; } - this.currentLevel = currentLevel; - level = this.levels[currentLevel]; - level.items[level.index] = value; - return true; + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + .2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + function _setImageData(array_ptr, pitch8, pitch32, height) { + if (pitch32 === pitch8) { + Module.imageData = new Uint8ClampedArray(HEAPU8.subarray(array_ptr, array_ptr + pitch32 * height)); + return; + } + const destSize = pitch8 * height; + const imageData = Module.imageData = new Uint8ClampedArray(destSize); + for (let srcStart = array_ptr, destStart = 0; destStart < destSize; srcStart += pitch32, destStart += pitch8) { + imageData.set(HEAPU8.subarray(srcStart, srcStart + pitch8), destStart); + } + } + function _setLineData(line_ptr, pitch8, offset) { + Module.imageData.set(HEAPU8.subarray(line_ptr, line_ptr + pitch8), offset); + } + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + if (Module["noExitRuntime"]) noExitRuntime = Module["noExitRuntime"]; + if (Module["print"]) out = Module["print"]; + if (Module["printErr"]) err = Module["printErr"]; + if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; + if (Module["arguments"]) arguments_ = Module["arguments"]; + if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].shift()(); + } + } + Module["writeArrayToMemory"] = writeArrayToMemory; + var _malloc, _free, _jbig2_decode, _ccitt_decode, __emscripten_timeout, memory, __indirect_function_table, wasmMemory; + function assignWasmExports(wasmExports) { + _malloc = Module["_malloc"] = wasmExports["k"]; + _free = Module["_free"] = wasmExports["l"]; + _jbig2_decode = Module["_jbig2_decode"] = wasmExports["m"]; + _ccitt_decode = Module["_ccitt_decode"] = wasmExports["n"]; + __emscripten_timeout = wasmExports["o"]; + memory = wasmMemory = wasmExports["i"]; + __indirect_function_table = wasmExports["__indirect_function_table"]; + } + var wasmImports = { + e: __abort_js, + b: __emscripten_runtime_keepalive_clear, + c: __setitimer_js, + g: _createImageData, + d: _emscripten_resize_heap, + a: _proc_exit, + h: _setImageData, + f: _setLineData + }; + function run() { + preRun(); + function doRun() { + Module["calledRun"] = true; + if (ABORT) return; + initRuntime(); + readyPromiseResolve?.(Module); + Module["onRuntimeInitialized"]?.(); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(() => { + setTimeout(() => Module["setStatus"](""), 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + var wasmExports; + wasmExports = await createWasm(); + run(); + if (runtimeInitialized) { + moduleRtn = Module; + } else { + moduleRtn = new Promise((resolve, reject) => { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + } + return moduleRtn; +} +/* harmony default export */ const jbig2 = (JBig2); +;// ./src/core/wasm_image.js + + +class WasmImage { + static #handler = null; + static #instances = new Set(); + static #useWasm = true; + static #useWorkerFetch = true; + static #wasmUrl = null; + #buffer = null; + #modulePromise = null; + _filename = null; + _noWasmFilename = null; + static setOptions({ + handler, + useWasm, + useWorkerFetch, + wasmUrl + }) { + WasmImage.#useWasm = useWasm; + WasmImage.#useWorkerFetch = useWorkerFetch; + WasmImage.#wasmUrl = wasmUrl; + if (!useWorkerFetch) { + WasmImage.#handler = handler; + } + } + static get instance() { + unreachable("Abstract getter `instance` accessed"); + } + static cleanup() { + for (const instance of WasmImage.#instances) { + instance.#modulePromise = null; + } + } + constructor(trackInstance = false) { + if (trackInstance) { + WasmImage.#instances.add(this); + } + } + async #getJsModule(fallbackCallback) { + let instance = null; + try { + const mod = await import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + `${WasmImage.#wasmUrl}${this._noWasmFilename}`); + instance = mod.default(); + } catch (ex) { + warn(`#getJsModule: ${ex}`); + } + fallbackCallback(instance); + } + async #instantiateWasm(fallbackCallback, imports, successCallback) { + try { + if (!this.#buffer) { + if (WasmImage.#useWorkerFetch) { + this.#buffer = await fetchBinaryData(`${WasmImage.#wasmUrl}${this._filename}`); + } else { + this.#buffer = await WasmImage.#handler.sendWithPromise("FetchBinaryData", { + kind: "wasmUrl", + filename: this._filename + }); + } + } + const results = await WebAssembly.instantiate(this.#buffer, imports); + return successCallback(results.instance); + } catch (ex) { + warn(`#instantiateWasm: ${ex}`); + this.#getJsModule(fallbackCallback); + return null; + } + } + _getModule(ImageDecoder) { + if (!this.#modulePromise) { + const { + promise, + resolve + } = Promise.withResolvers(); + const promises = [promise]; + if (!WasmImage.#useWasm) { + this.#getJsModule(resolve); + } else { + promises.push(ImageDecoder({ + warn: warn, + instantiateWasm: this.#instantiateWasm.bind(this, resolve) + })); + } + this.#modulePromise = Promise.race(promises); + } + return this.#modulePromise; + } + async decode(bytes, _params) { + unreachable("Abstract method `decode` called"); + } +} + +;// ./src/core/jbig2_ccittFax.js + + + +class Jbig2Error extends BaseException { + constructor(msg) { + super(msg, "Jbig2Error"); } } -class InclusionTree { - constructor(width, height, defaultValue) { - const levelsLength = log2(Math.max(width, height)) + 1; - this.levels = []; - for (let i = 0; i < levelsLength; i++) { - const items = new Uint8Array(width * height); - for (let j = 0, jj = items.length; j < jj; j++) { - items[j] = defaultValue; +class JBig2CCITTFaxImage extends WasmImage { + _filename = "jbig2.wasm"; + _noWasmFilename = "jbig2_nowasm_fallback.js"; + static get instance() { + return shadow(this, "instance", new JBig2CCITTFaxImage(true)); + } + async decode(bytes, width, height, globals, CCITTOptions) { + const module = await this._getModule(jbig2); + if (!module) { + throw new Jbig2Error("JBig2 failed to initialize"); + } + let ptr, globalsPtr; + try { + const size = bytes.length; + ptr = module._malloc(size); + module.writeArrayToMemory(bytes, ptr); + if (CCITTOptions) { + module._ccitt_decode(ptr, size, width, height, CCITTOptions.K, CCITTOptions.EndOfLine ? 1 : 0, CCITTOptions.EncodedByteAlign ? 1 : 0, CCITTOptions.BlackIs1 ? 1 : 0, CCITTOptions.Columns, CCITTOptions.Rows); + } else { + const globalsSize = globals ? globals.length : 0; + if (globalsSize > 0) { + globalsPtr = module._malloc(globalsSize); + module.writeArrayToMemory(globals, globalsPtr); + } + module._jbig2_decode(ptr, size, width, height, globalsPtr, globalsSize); } - const level = { - width, - height, - items - }; - this.levels.push(level); - width = Math.ceil(width / 2); - height = Math.ceil(height / 2); - } - } - reset(i, j, stopValue) { - let currentLevel = 0; - while (currentLevel < this.levels.length) { - const level = this.levels[currentLevel]; - const index = i + j * level.width; - level.index = index; - const value = level.items[index]; - if (value === 0xff) { - break; - } - if (value > stopValue) { - this.currentLevel = currentLevel; - this.propagateValues(); - return false; + if (!module.imageData) { + throw new Jbig2Error("Unknown error"); + } + const { + imageData + } = module; + module.imageData = null; + return imageData; + } finally { + if (ptr) { + module._free(ptr); + } + if (globalsPtr) { + module._free(globalsPtr); } - i >>= 1; - j >>= 1; - currentLevel++; } - this.currentLevel = currentLevel - 1; - return true; } - incrementValue(stopValue) { - const level = this.levels[this.currentLevel]; - level.items[level.index] = stopValue + 1; - this.propagateValues(); - } - propagateValues() { - let levelIndex = this.currentLevel; - let level = this.levels[levelIndex]; - const currentValue = level.items[level.index]; - while (--levelIndex >= 0) { - level = this.levels[levelIndex]; - level.items[level.index] = currentValue; - } - } - nextLevel() { - let currentLevel = this.currentLevel; - let level = this.levels[currentLevel]; - const value = level.items[level.index]; - level.items[level.index] = 0xff; - currentLevel--; - if (currentLevel < 0) { - return false; +} + +;// ./src/core/ccitt_stream.js + + + + +class CCITTFaxStream extends DecodeStream { + constructor(str, maybeLength, params) { + super(maybeLength); + this.stream = str; + this.maybeLength = maybeLength; + this.dict = str.dict; + if (!(params instanceof Dict)) { + params = Dict.empty; } - this.currentLevel = currentLevel; - level = this.levels[currentLevel]; - level.items[level.index] = value; + this.params = { + K: params.get("K") || 0, + EndOfLine: !!params.get("EndOfLine"), + EncodedByteAlign: !!params.get("EncodedByteAlign"), + Columns: params.get("Columns") || 1728, + Rows: params.get("Rows") || 0, + EndOfBlock: !!(params.get("EndOfBlock") ?? true), + BlackIs1: !!params.get("BlackIs1") + }; + } + get bytes() { + return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); + } + get isImageStream() { return true; } + get isAsyncDecoder() { + return true; + } + async decodeImage(bytes, length, _decoderOptions) { + if (this.eof) { + return this.buffer; + } + if (!bytes) { + bytes = this.stream.isAsync ? (await this.stream.asyncGetBytes()) || this.bytes : this.bytes; + } + this.buffer = await JBig2CCITTFaxImage.instance.decode(bytes, this.dict.get("W", "Width"), this.dict.get("H", "Height"), null, this.params); + this.bufferLength = this.buffer.length; + this.eof = true; + return this.buffer; + } } -class BitModel { - static UNIFORM_CONTEXT = 17; - static RUNLENGTH_CONTEXT = 18; - static LLAndLHContextsLabel = new Uint8Array([0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8]); - static HLContextLabel = new Uint8Array([0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8]); - static HHContextLabel = new Uint8Array([0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5, 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8]); - constructor(width, height, subband, zeroBitPlanes, mb) { - this.width = width; - this.height = height; - let contextLabelTable; - if (subband === "HH") { - contextLabelTable = BitModel.HHContextLabel; - } else if (subband === "HL") { - contextLabelTable = BitModel.HLContextLabel; - } else { - contextLabelTable = BitModel.LLAndLHContextsLabel; - } - this.contextLabelTable = contextLabelTable; - const coefficientCount = width * height; - this.neighborsSignificance = new Uint8Array(coefficientCount); - this.coefficentsSign = new Uint8Array(coefficientCount); - let coefficentsMagnitude; - if (mb > 14) { - coefficentsMagnitude = new Uint32Array(coefficientCount); - } else if (mb > 6) { - coefficentsMagnitude = new Uint16Array(coefficientCount); - } else { - coefficentsMagnitude = new Uint8Array(coefficientCount); - } - this.coefficentsMagnitude = coefficentsMagnitude; - this.processingFlags = new Uint8Array(coefficientCount); - const bitsDecoded = new Uint8Array(coefficientCount); - if (zeroBitPlanes !== 0) { - for (let i = 0; i < coefficientCount; i++) { - bitsDecoded[i] = zeroBitPlanes; - } + +;// ./src/core/flate_stream.js + + + +const codeLenCodeMap = new Int32Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); +const lengthDecode = new Int32Array([0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102]); +const distDecode = new Int32Array([0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001]); +const fixedLitCodeTab = [new Int32Array([0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff]), 9]; +const fixedDistCodeTab = [new Int32Array([0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000]), 5]; +class FlateStream extends DecodeStream { + #isAsync = true; + constructor(str, maybeLength) { + super(maybeLength); + this.stream = str; + this.dict = str.dict; + const cmf = str.getByte(); + const flg = str.getByte(); + if (cmf === -1 || flg === -1) { + throw new FormatError(`Invalid header in flate stream: ${cmf}, ${flg}`); + } + if ((cmf & 0x0f) !== 0x08) { + throw new FormatError(`Unknown compression method in flate stream: ${cmf}, ${flg}`); } - this.bitsDecoded = bitsDecoded; + if (((cmf << 8) + flg) % 31 !== 0) { + throw new FormatError(`Bad FCHECK in flate stream: ${cmf}, ${flg}`); + } + if (flg & 0x20) { + throw new FormatError(`FDICT bit set in flate stream: ${cmf}, ${flg}`); + } + this.codeSize = 0; + this.codeBuf = 0; + } + async getImageData(length, _decoderOptions) { + const data = await this.asyncGetBytes(); + if (!data) { + return this.getBytes(length); + } + if (data.length <= length) { + return data; + } + return data.subarray(0, length); + } + async asyncGetBytes() { + const { + decompressed, + compressed + } = await this.asyncGetBytesFromDecompressionStream("deflate"); + if (decompressed) { + return decompressed; + } + this.#isAsync = false; + this.stream = new Stream(compressed, 2, compressed.length, this.stream.dict); this.reset(); + return null; } - setDecoder(decoder) { - this.decoder = decoder; + get isAsync() { + return this.#isAsync; } - reset() { - this.contexts = new Int8Array(19); - this.contexts[0] = 4 << 1 | 0; - this.contexts[BitModel.UNIFORM_CONTEXT] = 46 << 1 | 0; - this.contexts[BitModel.RUNLENGTH_CONTEXT] = 3 << 1 | 0; - } - setNeighborsSignificance(row, column, index) { - const neighborsSignificance = this.neighborsSignificance; - const width = this.width, - height = this.height; - const left = column > 0; - const right = column + 1 < width; + getBits(bits) { + const str = this.stream; + let codeSize = this.codeSize; + let codeBuf = this.codeBuf; + let b; + while (codeSize < bits) { + if ((b = str.getByte()) === -1) { + throw new FormatError("Bad encoding in flate stream"); + } + codeBuf |= b << codeSize; + codeSize += 8; + } + b = codeBuf & (1 << bits) - 1; + this.codeBuf = codeBuf >> bits; + this.codeSize = codeSize -= bits; + return b; + } + getCode(table) { + const str = this.stream; + const codes = table[0]; + const maxLen = table[1]; + let codeSize = this.codeSize; + let codeBuf = this.codeBuf; + let b; + while (codeSize < maxLen) { + if ((b = str.getByte()) === -1) { + break; + } + codeBuf |= b << codeSize; + codeSize += 8; + } + const code = codes[codeBuf & (1 << maxLen) - 1]; + const codeLen = code >> 16; + const codeVal = code & 0xffff; + if (codeLen < 1 || codeSize < codeLen) { + throw new FormatError("Bad encoding in flate stream"); + } + this.codeBuf = codeBuf >> codeLen; + this.codeSize = codeSize - codeLen; + return codeVal; + } + generateHuffmanTable(lengths) { + const n = lengths.length; + let maxLen = 0; let i; - if (row > 0) { - i = index - width; - if (left) { - neighborsSignificance[i - 1] += 0x10; - } - if (right) { - neighborsSignificance[i + 1] += 0x10; - } - neighborsSignificance[i] += 0x04; - } - if (row + 1 < height) { - i = index + width; - if (left) { - neighborsSignificance[i - 1] += 0x10; - } - if (right) { - neighborsSignificance[i + 1] += 0x10; - } - neighborsSignificance[i] += 0x04; - } - if (left) { - neighborsSignificance[index - 1] += 0x01; - } - if (right) { - neighborsSignificance[index + 1] += 0x01; - } - neighborsSignificance[index] |= 0x80; - } - runSignificancePropagationPass() { - const decoder = this.decoder; - const width = this.width, - height = this.height; - const coefficentsMagnitude = this.coefficentsMagnitude; - const coefficentsSign = this.coefficentsSign; - const neighborsSignificance = this.neighborsSignificance; - const processingFlags = this.processingFlags; - const contexts = this.contexts; - const labels = this.contextLabelTable; - const bitsDecoded = this.bitsDecoded; - const processedInverseMask = ~1; - const processedMask = 1; - const firstMagnitudeBitMask = 2; - for (let i0 = 0; i0 < height; i0 += 4) { - for (let j = 0; j < width; j++) { - let index = i0 * width + j; - for (let i1 = 0; i1 < 4; i1++, index += width) { - const i = i0 + i1; - if (i >= height) { - break; - } - processingFlags[index] &= processedInverseMask; - if (coefficentsMagnitude[index] || !neighborsSignificance[index]) { - continue; + for (i = 0; i < n; ++i) { + if (lengths[i] > maxLen) { + maxLen = lengths[i]; + } + } + const size = 1 << maxLen; + const codes = new Int32Array(size); + for (let len = 1, code = 0, skip = 2; len <= maxLen; ++len, code <<= 1, skip <<= 1) { + for (let val = 0; val < n; ++val) { + if (lengths[val] === len) { + let code2 = 0; + let t = code; + for (i = 0; i < len; ++i) { + code2 = code2 << 1 | t & 1; + t >>= 1; } - const contextLabel = labels[neighborsSignificance[index]]; - const decision = decoder.readBit(contexts, contextLabel); - if (decision) { - const sign = this.decodeSignBit(i, j, index); - coefficentsSign[index] = sign; - coefficentsMagnitude[index] = 1; - this.setNeighborsSignificance(i, j, index); - processingFlags[index] |= firstMagnitudeBitMask; - } - bitsDecoded[index]++; - processingFlags[index] |= processedMask; - } - } - } - } - decodeSignBit(row, column, index) { - const width = this.width, - height = this.height; - const coefficentsMagnitude = this.coefficentsMagnitude; - const coefficentsSign = this.coefficentsSign; - let contribution, sign0, sign1, significance1; - let contextLabel, decoded; - significance1 = column > 0 && coefficentsMagnitude[index - 1] !== 0; - if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) { - sign1 = coefficentsSign[index + 1]; - if (significance1) { - sign0 = coefficentsSign[index - 1]; - contribution = 1 - sign1 - sign0; - } else { - contribution = 1 - sign1 - sign1; - } - } else if (significance1) { - sign0 = coefficentsSign[index - 1]; - contribution = 1 - sign0 - sign0; - } else { - contribution = 0; - } - const horizontalContribution = 3 * contribution; - significance1 = row > 0 && coefficentsMagnitude[index - width] !== 0; - if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) { - sign1 = coefficentsSign[index + width]; - if (significance1) { - sign0 = coefficentsSign[index - width]; - contribution = 1 - sign1 - sign0 + horizontalContribution; - } else { - contribution = 1 - sign1 - sign1 + horizontalContribution; - } - } else if (significance1) { - sign0 = coefficentsSign[index - width]; - contribution = 1 - sign0 - sign0 + horizontalContribution; - } else { - contribution = horizontalContribution; - } - if (contribution >= 0) { - contextLabel = 9 + contribution; - decoded = this.decoder.readBit(this.contexts, contextLabel); - } else { - contextLabel = 9 - contribution; - decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1; - } - return decoded; - } - runMagnitudeRefinementPass() { - const decoder = this.decoder; - const width = this.width, - height = this.height; - const coefficentsMagnitude = this.coefficentsMagnitude; - const neighborsSignificance = this.neighborsSignificance; - const contexts = this.contexts; - const bitsDecoded = this.bitsDecoded; - const processingFlags = this.processingFlags; - const processedMask = 1; - const firstMagnitudeBitMask = 2; - const length = width * height; - const width4 = width * 4; - for (let index0 = 0, indexNext; index0 < length; index0 = indexNext) { - indexNext = Math.min(length, index0 + width4); - for (let j = 0; j < width; j++) { - for (let index = index0 + j; index < indexNext; index += width) { - if (!coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) { - continue; + for (i = code2; i < size; i += skip) { + codes[i] = len << 16 | val; } - let contextLabel = 16; - if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) { - processingFlags[index] ^= firstMagnitudeBitMask; - const significance = neighborsSignificance[index] & 127; - contextLabel = significance === 0 ? 15 : 14; - } - const bit = decoder.readBit(contexts, contextLabel); - coefficentsMagnitude[index] = coefficentsMagnitude[index] << 1 | bit; - bitsDecoded[index]++; - processingFlags[index] |= processedMask; + ++code; } } } + return [codes, maxLen]; } - runCleanupPass() { - const decoder = this.decoder; - const width = this.width, - height = this.height; - const neighborsSignificance = this.neighborsSignificance; - const coefficentsMagnitude = this.coefficentsMagnitude; - const coefficentsSign = this.coefficentsSign; - const contexts = this.contexts; - const labels = this.contextLabelTable; - const bitsDecoded = this.bitsDecoded; - const processingFlags = this.processingFlags; - const processedMask = 1; - const firstMagnitudeBitMask = 2; - const oneRowDown = width; - const twoRowsDown = width * 2; - const threeRowsDown = width * 3; - let iNext; - for (let i0 = 0; i0 < height; i0 = iNext) { - iNext = Math.min(i0 + 4, height); - const indexBase = i0 * width; - const checkAllEmpty = i0 + 3 < height; - for (let j = 0; j < width; j++) { - const index0 = indexBase + j; - const allEmpty = checkAllEmpty && processingFlags[index0] === 0 && processingFlags[index0 + oneRowDown] === 0 && processingFlags[index0 + twoRowsDown] === 0 && processingFlags[index0 + threeRowsDown] === 0 && neighborsSignificance[index0] === 0 && neighborsSignificance[index0 + oneRowDown] === 0 && neighborsSignificance[index0 + twoRowsDown] === 0 && neighborsSignificance[index0 + threeRowsDown] === 0; - let i1 = 0, - index = index0; - let i = i0, - sign; - if (allEmpty) { - const hasSignificantCoefficent = decoder.readBit(contexts, BitModel.RUNLENGTH_CONTEXT); - if (!hasSignificantCoefficent) { - bitsDecoded[index0]++; - bitsDecoded[index0 + oneRowDown]++; - bitsDecoded[index0 + twoRowsDown]++; - bitsDecoded[index0 + threeRowsDown]++; - continue; - } - i1 = decoder.readBit(contexts, BitModel.UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, BitModel.UNIFORM_CONTEXT); - if (i1 !== 0) { - i = i0 + i1; - index += i1 * width; - } - sign = this.decodeSignBit(i, j, index); - coefficentsSign[index] = sign; - coefficentsMagnitude[index] = 1; - this.setNeighborsSignificance(i, j, index); - processingFlags[index] |= firstMagnitudeBitMask; - index = index0; - for (let i2 = i0; i2 <= i; i2++, index += width) { - bitsDecoded[index]++; - } - i1++; + #endsStreamOnError(err) { + info(err); + this.eof = true; + } + readBlock() { + let buffer, hdr, len; + const str = this.stream; + try { + hdr = this.getBits(3); + } catch (ex) { + this.#endsStreamOnError(ex.message); + return; + } + if (hdr & 1) { + this.eof = true; + } + hdr >>= 1; + if (hdr === 0) { + let b; + if ((b = str.getByte()) === -1) { + this.#endsStreamOnError("Bad block header in flate stream"); + return; + } + let blockLen = b; + if ((b = str.getByte()) === -1) { + this.#endsStreamOnError("Bad block header in flate stream"); + return; + } + blockLen |= b << 8; + if ((b = str.getByte()) === -1) { + this.#endsStreamOnError("Bad block header in flate stream"); + return; + } + let check = b; + if ((b = str.getByte()) === -1) { + this.#endsStreamOnError("Bad block header in flate stream"); + return; + } + check |= b << 8; + if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) { + throw new FormatError("Bad uncompressed block length in flate stream"); + } + this.codeBuf = 0; + this.codeSize = 0; + const bufferLength = this.bufferLength, + end = bufferLength + blockLen; + buffer = this.ensureBuffer(end); + this.bufferLength = end; + if (blockLen === 0) { + if (str.peekByte() === -1) { + this.eof = true; } - for (i = i0 + i1; i < iNext; i++, index += width) { - if (coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) { - continue; - } - const contextLabel = labels[neighborsSignificance[index]]; - const decision = decoder.readBit(contexts, contextLabel); - if (decision === 1) { - sign = this.decodeSignBit(i, j, index); - coefficentsSign[index] = sign; - coefficentsMagnitude[index] = 1; - this.setNeighborsSignificance(i, j, index); - processingFlags[index] |= firstMagnitudeBitMask; - } - bitsDecoded[index]++; + } else { + const block = str.getBytes(blockLen); + buffer.set(block, bufferLength); + if (block.length < blockLen) { + this.eof = true; } } + return; } - } - checkSegmentationSymbol() { - const decoder = this.decoder; - const contexts = this.contexts; - const symbol = decoder.readBit(contexts, BitModel.UNIFORM_CONTEXT) << 3 | decoder.readBit(contexts, BitModel.UNIFORM_CONTEXT) << 2 | decoder.readBit(contexts, BitModel.UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, BitModel.UNIFORM_CONTEXT); - if (symbol !== 0xa) { - throw new JpxError("Invalid segmentation symbol"); + let litCodeTable; + let distCodeTable; + if (hdr === 1) { + litCodeTable = fixedLitCodeTab; + distCodeTable = fixedDistCodeTab; + } else if (hdr === 2) { + const numLitCodes = this.getBits(5) + 257; + const numDistCodes = this.getBits(5) + 1; + const numCodeLenCodes = this.getBits(4) + 4; + const codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length); + let i; + for (i = 0; i < numCodeLenCodes; ++i) { + codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3); + } + const codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths); + len = 0; + i = 0; + const codes = numLitCodes + numDistCodes; + const codeLengths = new Uint8Array(codes); + let bitsLength, bitsOffset, what; + while (i < codes) { + const code = this.getCode(codeLenCodeTab); + if (code === 16) { + bitsLength = 2; + bitsOffset = 3; + what = len; + } else if (code === 17) { + bitsLength = 3; + bitsOffset = 3; + what = len = 0; + } else if (code === 18) { + bitsLength = 7; + bitsOffset = 11; + what = len = 0; + } else { + codeLengths[i++] = len = code; + continue; + } + let repeatLength = this.getBits(bitsLength) + bitsOffset; + while (repeatLength-- > 0) { + codeLengths[i++] = what; + } + } + litCodeTable = this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes)); + distCodeTable = this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes)); + } else { + throw new FormatError("Unknown block type in flate stream"); + } + buffer = this.buffer; + let limit = buffer ? buffer.length : 0; + let pos = this.bufferLength; + while (true) { + let code1 = this.getCode(litCodeTable); + if (code1 < 256) { + if (pos + 1 >= limit) { + buffer = this.ensureBuffer(pos + 1); + limit = buffer.length; + } + buffer[pos++] = code1; + continue; + } + if (code1 === 256) { + this.bufferLength = pos; + return; + } + code1 -= 257; + code1 = lengthDecode[code1]; + let code2 = code1 >> 16; + if (code2 > 0) { + code2 = this.getBits(code2); + } + len = (code1 & 0xffff) + code2; + code1 = this.getCode(distCodeTable); + code1 = distDecode[code1]; + code2 = code1 >> 16; + if (code2 > 0) { + code2 = this.getBits(code2); + } + const dist = (code1 & 0xffff) + code2; + if (pos + len >= limit) { + buffer = this.ensureBuffer(pos + len); + limit = buffer.length; + } + for (let k = 0; k < len; ++k, ++pos) { + buffer[pos] = buffer[pos - dist]; + } } } } -class Transform { - constructor() { - if (this.constructor === Transform) { - unreachable("Cannot initialize Transform."); + +;// ./src/core/jbig2_stream.js + + + + + +class Jbig2Stream extends DecodeStream { + constructor(stream, maybeLength, params) { + super(maybeLength); + this.stream = stream; + this.dict = stream.dict; + this.maybeLength = maybeLength; + this.params = params; + } + get bytes() { + return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); + } + ensureBuffer(requested) {} + get isAsyncDecoder() { + return true; + } + get isImageStream() { + return true; + } + static stripFileHeader(bytes) { + if (bytes.length >= 9 && bytes[0] === 0x97 && bytes[1] === 0x4a && bytes[2] === 0x42 && bytes[3] === 0x32 && bytes[4] === 0x0d && bytes[5] === 0x0a && bytes[6] === 0x1a && bytes[7] === 0x0a) { + const headerLength = (bytes[8] & 2) === 0 ? 13 : 9; + return bytes.subarray(headerLength); } + return bytes; } - calculate(subbands, u0, v0) { - let ll = subbands[0]; - for (let i = 1, ii = subbands.length; i < ii; i++) { - ll = this.iterate(ll, subbands[i], u0, v0); - } - return ll; - } - extend(buffer, offset, size) { - let i1 = offset - 1, - j1 = offset + 1; - let i2 = offset + size - 2, - j2 = offset + size; - buffer[i1--] = buffer[j1++]; - buffer[j2++] = buffer[i2--]; - buffer[i1--] = buffer[j1++]; - buffer[j2++] = buffer[i2--]; - buffer[i1--] = buffer[j1++]; - buffer[j2++] = buffer[i2--]; - buffer[i1] = buffer[j1]; - buffer[j2] = buffer[i2]; - } - filter(x, offset, length) { - unreachable("Abstract method `filter` called"); - } - iterate(ll, hl_lh_hh, u0, v0) { - const llWidth = ll.width, - llHeight = ll.height; - let llItems = ll.items; - const width = hl_lh_hh.width; - const height = hl_lh_hh.height; - const items = hl_lh_hh.items; - let i, j, k, l, u, v; - for (k = 0, i = 0; i < llHeight; i++) { - l = i * 2 * width; - for (j = 0; j < llWidth; j++, k++, l += 2) { - items[l] = llItems[k]; - } - } - llItems = ll.items = null; - const bufferPadding = 4; - const rowBuffer = new Float32Array(width + 2 * bufferPadding); - if (width === 1) { - if ((u0 & 1) !== 0) { - for (v = 0, k = 0; v < height; v++, k += width) { - items[k] *= 0.5; - } - } - } else { - for (v = 0, k = 0; v < height; v++, k += width) { - rowBuffer.set(items.subarray(k, k + width), bufferPadding); - this.extend(rowBuffer, bufferPadding, width); - this.filter(rowBuffer, bufferPadding, width); - items.set(rowBuffer.subarray(bufferPadding, bufferPadding + width), k); - } - } - let numBuffers = 16; - const colBuffers = []; - for (i = 0; i < numBuffers; i++) { - colBuffers.push(new Float32Array(height + 2 * bufferPadding)); - } - let b, - currentBuffer = 0; - ll = bufferPadding + height; - if (height === 1) { - if ((v0 & 1) !== 0) { - for (u = 0; u < width; u++) { - items[u] *= 0.5; - } - } - } else { - for (u = 0; u < width; u++) { - if (currentBuffer === 0) { - numBuffers = Math.min(width - u, numBuffers); - for (k = u, l = bufferPadding; l < ll; k += width, l++) { - for (b = 0; b < numBuffers; b++) { - colBuffers[b][l] = items[k + b]; - } - } - currentBuffer = numBuffers; - } - currentBuffer--; - const buffer = colBuffers[currentBuffer]; - this.extend(buffer, bufferPadding, height); - this.filter(buffer, bufferPadding, height); - if (currentBuffer === 0) { - k = u - numBuffers + 1; - for (l = bufferPadding; l < ll; k += width, l++) { - for (b = 0; b < numBuffers; b++) { - items[k + b] = colBuffers[b][l]; - } - } - } + async decodeImage(bytes, length, _decoderOptions) { + if (this.eof) { + return this.buffer; + } + bytes = Jbig2Stream.stripFileHeader(bytes || this.bytes); + let globals = null; + if (this.params instanceof Dict) { + const globalsStream = this.params.get("JBIG2Globals"); + if (globalsStream instanceof BaseStream) { + globals = Jbig2Stream.stripFileHeader(globalsStream.getBytes()); } } - return { - width, - height, - items - }; + this.buffer = await JBig2CCITTFaxImage.instance.decode(bytes, this.dict.get("Width"), this.dict.get("Height"), globals); + this.bufferLength = this.buffer.length; + this.eof = true; + return this.buffer; + } + get canAsyncDecodeImageFromBuffer() { + return this.stream.isAsync; } } -class IrreversibleTransform extends Transform { - filter(x, offset, length) { - const len = length >> 1; - offset |= 0; - let j, n, current, next; - const alpha = -1.586134342059924; - const beta = -0.052980118572961; - const gamma = 0.882911075530934; - const delta = 0.443506852043971; - const K = 1.230174104914001; - const K_ = 1 / K; - j = offset - 3; - for (n = len + 4; n--; j += 2) { - x[j] *= K_; - } - j = offset - 2; - current = delta * x[j - 1]; - for (n = len + 3; n--; j += 2) { - next = delta * x[j + 1]; - x[j] = K * x[j] - current - next; - if (n--) { - j += 2; - current = delta * x[j + 1]; - x[j] = K * x[j] - current - next; - } else { - break; + +;// ./external/openjpeg/openjpeg.js +async function OpenJPEG(moduleArg = {}) { + var moduleRtn; + var Module = moduleArg; + var ENVIRONMENT_IS_WEB = true; + var ENVIRONMENT_IS_WORKER = false; + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = (status, toThrow) => { + throw toThrow; + }; + var _scriptName = import.meta.url; + var scriptDirectory = ""; + var readAsync, readBinary; + if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + try { + scriptDirectory = new URL(".", _scriptName).href; + } catch {} + readAsync = async url => { + var response = await fetch(url, { + credentials: "same-origin" + }); + if (response.ok) { + return response.arrayBuffer(); + } + throw new Error(response.status + " : " + response.url); + }; + } else {} + var out = console.log.bind(console); + var err = console.error.bind(console); + var wasmBinary; + var ABORT = false; + var EXITSTATUS; + class EmscriptenEH {} + class EmscriptenSjLj extends EmscriptenEH {} + var readyPromiseResolve, readyPromiseReject; + var runtimeInitialized = false; + function updateMemoryViews() { + var b = wasmMemory.buffer; + HEAP8 = new Int8Array(b); + HEAP16 = new Int16Array(b); + HEAPU8 = new Uint8Array(b); + HEAPU16 = new Uint16Array(b); + HEAP32 = new Int32Array(b); + HEAPU32 = new Uint32Array(b); + HEAPF32 = new Float32Array(b); + HEAPF64 = new Float64Array(b); + HEAP64 = new BigInt64Array(b); + HEAPU64 = new BigUint64Array(b); + } + function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(onPreRuns); + } + function initRuntime() { + runtimeInitialized = true; + wasmExports["s"](); + } + function postRun() { + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(onPostRuns); + } + function abort(what) { + Module["onAbort"]?.(what); + what = `Aborted(${what})`; + err(what); + ABORT = true; + what += ". Build with -sASSERTIONS for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject?.(e); + throw e; + } + var wasmBinaryFile; + function getWasmImports() { + var imports = { + a: wasmImports + }; + return imports; + } + async function createWasm() { + function receiveInstance(instance, module) { + wasmExports = instance.exports; + assignWasmExports(wasmExports); + updateMemoryViews(); + return wasmExports; + } + var info = getWasmImports(); + return new Promise((resolve, reject) => { + Module["instantiateWasm"](info, (inst, mod) => { + resolve(receiveInstance(inst, mod)); + }); + }); + } + class ExitStatus { + name = "ExitStatus"; + constructor(status) { + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + } + var HEAP16; + var HEAP32; + var HEAP64; + var HEAP8; + var HEAPF32; + var HEAPF64; + var HEAPU16; + var HEAPU32; + var HEAPU64; + var HEAPU8; + var callRuntimeCallbacks = callbacks => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }; + var onPostRuns = []; + var addOnPostRun = cb => onPostRuns.push(cb); + var onPreRuns = []; + var addOnPreRun = cb => onPreRuns.push(cb); + var noExitRuntime = true; + var __abort_js = () => abort(""); + var runtimeKeepaliveCounter = 0; + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + var timers = {}; + var handleException = e => { + if (e instanceof ExitStatus || e == "unwind") { + return EXITSTATUS; + } + quit_(1, e); + }; + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + var _proc_exit = code => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module["onExit"]?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + var exitJS = (status, implicit) => { + EXITSTATUS = status; + _proc_exit(status); + }; + var _exit = exitJS; + var maybeExit = () => { + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); } } - j = offset - 1; - current = gamma * x[j - 1]; - for (n = len + 2; n--; j += 2) { - next = gamma * x[j + 1]; - x[j] -= current + next; - if (n--) { - j += 2; - current = gamma * x[j + 1]; - x[j] -= current + next; + }; + var callUserCallback = func => { + if (ABORT) { + return; + } + try { + return func(); + } catch (e) { + handleException(e); + } finally { + maybeExit(); + } + }; + var _emscripten_get_now = () => performance.now(); + var __setitimer_js = (which, timeout_ms) => { + if (timers[which]) { + clearTimeout(timers[which].id); + delete timers[which]; + } + if (!timeout_ms) return 0; + var id = setTimeout(() => { + delete timers[which]; + callUserCallback(() => __emscripten_timeout(which, _emscripten_get_now())); + }, timeout_ms); + timers[which] = { + id, + timeout_ms + }; + return 0; + }; + function _copy_pixels_1(compG_ptr, nb_pixels) { + compG_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels); + const compG = HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + imageData.set(compG); + } + function _copy_pixels_3(compR_ptr, compG_ptr, compB_ptr, nb_pixels) { + compR_ptr >>= 2; + compG_ptr >>= 2; + compB_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 3); + const compR = HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); + const compG = HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compB = HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[3 * i] = compR[i]; + imageData[3 * i + 1] = compG[i]; + imageData[3 * i + 2] = compB[i]; + } + } + function _copy_pixels_4(compR_ptr, compG_ptr, compB_ptr, compA_ptr, nb_pixels) { + compR_ptr >>= 2; + compG_ptr >>= 2; + compB_ptr >>= 2; + compA_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); + const compR = HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); + const compG = HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compB = HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); + const compA = HEAP32.subarray(compA_ptr, compA_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = compR[i]; + imageData[4 * i + 1] = compG[i]; + imageData[4 * i + 2] = compB[i]; + imageData[4 * i + 3] = compA[i]; + } + } + var getHeapMax = () => 2147483648; + var alignMemory = (size, alignment) => Math.ceil(size / alignment) * alignment; + var growMemory = size => { + var oldHeapSize = wasmMemory.buffer.byteLength; + var pages = (size - oldHeapSize + 65535) / 65536 | 0; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } catch (e) {} + }; + var _emscripten_resize_heap = requestedSize => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + .2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + var ENV = {}; + var getExecutableName = () => thisProgram || "./this.program"; + var getEnvStrings = () => { + if (!getEnvStrings.strings) { + var lang = (globalThis.navigator?.language ?? "C").replace("-", "_") + ".UTF-8"; + var env = { + USER: "web_user", + LOGNAME: "web_user", + PATH: "/", + PWD: "/", + HOME: "/home/web_user", + LANG: lang, + _: getExecutableName() + }; + for (var x in ENV) { + if (ENV[x] === undefined) delete env[x];else env[x] = ENV[x]; + } + var strings = []; + for (var x in env) { + strings.push(`${x}=${env[x]}`); + } + getEnvStrings.strings = strings; + } + return getEnvStrings.strings; + }; + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.codePointAt(i); + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + i++; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }; + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + var envp = 0; + for (var string of getEnvStrings()) { + var ptr = environ_buf + bufSize; + HEAPU32[__environ + envp >> 2] = ptr; + bufSize += stringToUTF8(string, ptr, Infinity) + 1; + envp += 4; + } + return 0; + }; + var lengthBytesUTF8 = str => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var c = str.charCodeAt(i); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; } else { - break; + len += 3; } } - j = offset; - current = beta * x[j - 1]; - for (n = len + 1; n--; j += 2) { - next = beta * x[j + 1]; - x[j] -= current + next; - if (n--) { - j += 2; - current = beta * x[j + 1]; - x[j] -= current + next; + return len; + }; + var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[penviron_count >> 2] = strings.length; + var bufSize = 0; + for (var string of strings) { + bufSize += lengthBytesUTF8(string) + 1; + } + HEAPU32[penviron_buf_size >> 2] = bufSize; + return 0; + }; + var INT53_MAX = 9007199254740992; + var INT53_MIN = -9007199254740992; + var bigintToI53Checked = num => num < INT53_MIN || num > INT53_MAX ? NaN : Number(num); + function _fd_seek(fd, offset, whence, newOffset) { + offset = bigintToI53Checked(offset); + return 70; + } + var printCharBuffers = [null, [], []]; + var UTF8Decoder = globalThis.TextDecoder && new TextDecoder(); + var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { + var maxIdx = idx + maxBytesToRead; + if (ignoreNul) return maxIdx; + while (heapOrArray[idx] && !(idx >= maxIdx)) ++idx; + return idx; + }; + var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead, ignoreNul) => { + var endPtr = findStringEnd(heapOrArray, idx, maxBytesToRead, ignoreNul); + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ""; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; } else { - break; + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heapOrArray[idx++] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); } } - if (len !== 0) { - j = offset + 1; - current = alpha * x[j - 1]; - for (n = len; n--; j += 2) { - next = alpha * x[j + 1]; - x[j] -= current + next; - if (n--) { - j += 2; - current = alpha * x[j + 1]; - x[j] -= current + next; - } else { - break; - } + return str; + }; + var printChar = (stream, curr) => { + var buffer = printCharBuffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer)); + buffer.length = 0; + } else { + buffer.push(curr); + } + }; + var UTF8ToString = (ptr, maxBytesToRead, ignoreNul) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead, ignoreNul) : ""; + var _fd_write = (fd, iov, iovcnt, pnum) => { + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[iov >> 2]; + var len = HEAPU32[iov + 4 >> 2]; + iov += 8; + for (var j = 0; j < len; j++) { + printChar(fd, HEAPU8[ptr + j]); } + num += len; } + HEAPU32[pnum >> 2] = num; + return 0; + }; + function _gray_to_rgba(compG_ptr, nb_pixels) { + compG_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); + const compG = HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = imageData[4 * i + 1] = imageData[4 * i + 2] = compG[i]; + imageData[4 * i + 3] = 255; + } + } + function _graya_to_rgba(compG_ptr, compA_ptr, nb_pixels) { + compG_ptr >>= 2; + compA_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); + const compG = HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compA = HEAP32.subarray(compA_ptr, compA_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = imageData[4 * i + 1] = imageData[4 * i + 2] = compG[i]; + imageData[4 * i + 3] = compA[i]; + } + } + function _jsPrintWarning(message_ptr) { + const message = UTF8ToString(message_ptr); + (Module.warn || console.warn)(`OpenJPEG: ${message}`); + } + function _rgb_to_rgba(compR_ptr, compG_ptr, compB_ptr, nb_pixels) { + compR_ptr >>= 2; + compG_ptr >>= 2; + compB_ptr >>= 2; + const imageData = Module.imageData = new Uint8ClampedArray(nb_pixels * 4); + const compR = HEAP32.subarray(compR_ptr, compR_ptr + nb_pixels); + const compG = HEAP32.subarray(compG_ptr, compG_ptr + nb_pixels); + const compB = HEAP32.subarray(compB_ptr, compB_ptr + nb_pixels); + for (let i = 0; i < nb_pixels; i++) { + imageData[4 * i] = compR[i]; + imageData[4 * i + 1] = compG[i]; + imageData[4 * i + 2] = compB[i]; + imageData[4 * i + 3] = 255; + } + } + function _storeErrorMessage(message_ptr) { + const message = UTF8ToString(message_ptr); + if (!Module.errorMessages) { + Module.errorMessages = message; + } else { + Module.errorMessages += "\n" + message; + } + } + var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); + }; + if (Module["noExitRuntime"]) noExitRuntime = Module["noExitRuntime"]; + if (Module["print"]) out = Module["print"]; + if (Module["printErr"]) err = Module["printErr"]; + if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; + if (Module["arguments"]) arguments_ = Module["arguments"]; + if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].shift()(); + } + } + Module["writeArrayToMemory"] = writeArrayToMemory; + var _malloc, _free, _jp2_decode, __emscripten_timeout, memory, __indirect_function_table, wasmMemory; + function assignWasmExports(wasmExports) { + _malloc = Module["_malloc"] = wasmExports["t"]; + _free = Module["_free"] = wasmExports["u"]; + _jp2_decode = Module["_jp2_decode"] = wasmExports["v"]; + __emscripten_timeout = wasmExports["w"]; + memory = wasmMemory = wasmExports["r"]; + __indirect_function_table = wasmExports["__indirect_function_table"]; + } + var wasmImports = { + m: __abort_js, + l: __emscripten_runtime_keepalive_clear, + i: __setitimer_js, + f: _copy_pixels_1, + e: _copy_pixels_3, + d: _copy_pixels_4, + j: _emscripten_resize_heap, + o: _environ_get, + p: _environ_sizes_get, + n: _fd_seek, + b: _fd_write, + q: _gray_to_rgba, + h: _graya_to_rgba, + c: _jsPrintWarning, + k: _proc_exit, + g: _rgb_to_rgba, + a: _storeErrorMessage + }; + function run() { + preRun(); + function doRun() { + Module["calledRun"] = true; + if (ABORT) return; + initRuntime(); + readyPromiseResolve?.(Module); + Module["onRuntimeInitialized"]?.(); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(() => { + setTimeout(() => Module["setStatus"](""), 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + var wasmExports; + wasmExports = await createWasm(); + run(); + if (runtimeInitialized) { + moduleRtn = Module; + } else { + moduleRtn = new Promise((resolve, reject) => { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + } + return moduleRtn; +} +/* harmony default export */ const openjpeg = (OpenJPEG); +;// ./src/core/jpx.js + + + + +class JpxError extends BaseException { + constructor(msg) { + super(msg, "JpxError"); } } -class ReversibleTransform extends Transform { - filter(x, offset, length) { - const len = length >> 1; - offset |= 0; - let j, n; - for (j = offset, n = len + 1; n--; j += 2) { - x[j] -= x[j - 1] + x[j + 1] + 2 >> 2; +class JpxImage extends WasmImage { + _filename = "openjpeg.wasm"; + _noWasmFilename = "openjpeg_nowasm_fallback.js"; + static get instance() { + return shadow(this, "instance", new JpxImage(true)); + } + async decode(bytes, { + numComponents = 4, + isIndexedColormap = false, + smaskInData = false, + reducePower = 0 + } = {}) { + const module = await this._getModule(openjpeg); + if (!module) { + throw new JpxError("OpenJPEG failed to initialize"); } - for (j = offset + 1, n = len; n--; j += 2) { - x[j] += x[j - 1] + x[j + 1] >> 1; + let ptr; + try { + const size = bytes.length; + ptr = module._malloc(size); + module.writeArrayToMemory(bytes, ptr); + const ret = module._jp2_decode(ptr, size, numComponents > 0 ? numComponents : 0, !!isIndexedColormap, !!smaskInData, reducePower); + if (ret) { + const { + errorMessages + } = module; + if (errorMessages) { + delete module.errorMessages; + throw new JpxError(errorMessages); + } + throw new JpxError("Unknown error"); + } + const { + imageData + } = module; + module.imageData = null; + return imageData; + } finally { + if (ptr) { + module._free(ptr); + } + } + } + static parseImageProperties(stream) { + let newByte = stream.getByte(); + while (newByte >= 0) { + const oldByte = newByte; + newByte = stream.getByte(); + const code = oldByte << 8 | newByte; + if (code === 0xff51) { + stream.skip(4); + const Xsiz = stream.getInt32() >>> 0; + const Ysiz = stream.getInt32() >>> 0; + const XOsiz = stream.getInt32() >>> 0; + const YOsiz = stream.getInt32() >>> 0; + stream.skip(16); + const Csiz = stream.getUint16(); + return { + width: Xsiz - XOsiz, + height: Ysiz - YOsiz, + bitsPerComponent: 8, + componentsCount: Csiz + }; + } } + throw new JpxError("No size marker found in JPX stream"); } } -;// CONCATENATED MODULE: ./src/core/jpx_stream.js +;// ./src/core/jpx_stream.js class JpxStream extends DecodeStream { - constructor(stream, maybeLength, params) { + constructor(stream, maybeLength) { super(maybeLength); this.stream = stream; this.dict = stream.dict; this.maybeLength = maybeLength; - this.params = params; } get bytes() { return shadow(this, "bytes", this.stream.getBytes(this.maybeLength)); } ensureBuffer(requested) {} - readBlock() { + get isAsyncDecoder() { + return true; + } + async decodeImage(bytes, _length, decoderOptions) { if (this.eof) { - return; - } - const jpxImage = new JpxImage(); - jpxImage.parse(this.bytes); - const width = jpxImage.width; - const height = jpxImage.height; - const componentsCount = jpxImage.componentsCount; - const tileCount = jpxImage.tiles.length; - if (tileCount === 1) { - this.buffer = jpxImage.tiles[0].items; - } else { - const data = new Uint8ClampedArray(width * height * componentsCount); - for (let k = 0; k < tileCount; k++) { - const tileComponents = jpxImage.tiles[k]; - const tileWidth = tileComponents.width; - const tileHeight = tileComponents.height; - const tileLeft = tileComponents.left; - const tileTop = tileComponents.top; - const src = tileComponents.items; - let srcPosition = 0; - let dataPosition = (width * tileTop + tileLeft) * componentsCount; - const imgRowSize = width * componentsCount; - const tileRowSize = tileWidth * componentsCount; - for (let j = 0; j < tileHeight; j++) { - const rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize); - data.set(rowBytes, dataPosition); - srcPosition += tileRowSize; - dataPosition += imgRowSize; - } - } - this.buffer = data; + return this.buffer; } + bytes ||= this.bytes; + this.buffer = await JpxImage.instance.decode(bytes, decoderOptions); this.bufferLength = this.buffer.length; this.eof = true; + return this.buffer; + } + get canAsyncDecodeImageFromBuffer() { + return this.stream.isAsync; + } + get isImageStream() { + return true; } } -;// CONCATENATED MODULE: ./src/core/lzw_stream.js +;// ./src/core/lzw_stream.js class LZWStream extends DecodeStream { constructor(str, maybeLength, earlyChange) { super(maybeLength); - this.str = str; + this.stream = str; this.dict = str.dict; this.cachedData = 0; this.bitsCached = 0; @@ -9499,7 +10851,7 @@ let bitsCached = this.bitsCached; let cachedData = this.cachedData; while (bitsCached < n) { - const c = this.str.getByte(); + const c = this.stream.getByte(); if (c === -1) { this.eof = true; return null; @@ -9509,7 +10861,6 @@ } this.bitsCached = bitsCached -= n; this.cachedData = cachedData; - this.lastCode = null; return cachedData >>> bitsCached & (1 << n) - 1; } readBlock() { @@ -9586,7 +10937,7 @@ } } -;// CONCATENATED MODULE: ./src/core/predictor_stream.js +;// ./src/core/predictor_stream.js @@ -9604,7 +10955,7 @@ throw new FormatError(`Unsupported predictor: ${predictor}`); } this.readBlock = predictor === 2 ? this.readBlockTiff : this.readBlockPng; - this.str = str; + this.stream = str; this.dict = str.dict; const colors = this.colors = params.get("Colors") || 1; const bits = this.bits = params.get("BPC", "BitsPerComponent") || 8; @@ -9619,7 +10970,7 @@ const buffer = this.ensureBuffer(bufferLength + rowBytes); const bits = this.bits; const colors = this.colors; - const rawBytes = this.str.getBytes(rowBytes); + const rawBytes = this.stream.getBytes(rowBytes); this.eof = !rawBytes.length; if (this.eof) { return; @@ -9688,8 +11039,8 @@ readBlockPng() { const rowBytes = this.rowBytes; const pixBytes = this.pixBytes; - const predictor = this.str.getByte(); - const rawBytes = this.str.getBytes(rowBytes); + const predictor = this.stream.getByte(); + const rawBytes = this.stream.getBytes(rowBytes); this.eof = !rawBytes.length; if (this.eof) { return; @@ -9773,16 +11124,16 @@ } } -;// CONCATENATED MODULE: ./src/core/run_length_stream.js +;// ./src/core/run_length_stream.js class RunLengthStream extends DecodeStream { constructor(str, maybeLength) { super(maybeLength); - this.str = str; + this.stream = str; this.dict = str.dict; } readBlock() { - const repeatHeader = this.str.getBytes(2); + const repeatHeader = this.stream.getBytes(2); if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) { this.eof = true; return; @@ -9794,23 +11145,22 @@ buffer = this.ensureBuffer(bufferLength + n + 1); buffer[bufferLength++] = repeatHeader[1]; if (n > 0) { - const source = this.str.getBytes(n); + const source = this.stream.getBytes(n); buffer.set(source, bufferLength); bufferLength += n; } } else { n = 257 - n; - const b = repeatHeader[1]; buffer = this.ensureBuffer(bufferLength + n + 1); - for (let i = 0; i < n; i++) { - buffer[bufferLength++] = b; - } + buffer.fill(repeatHeader[1], bufferLength, bufferLength + n); + bufferLength += n; } this.bufferLength = bufferLength; } } -;// CONCATENATED MODULE: ./src/core/parser.js +;// ./src/core/parser.js + @@ -9989,7 +11339,7 @@ warn("findDefaultInlineStreamEnd - `lexer.knownCommands` is undefined."); continue; } - const tmpLexer = new Lexer(new Stream(followingBytes.slice()), knownCommands); + const tmpLexer = new Lexer(new Stream(stream.peekBytes(5 * n)), knownCommands); tmpLexer._hexStringWarn = () => {}; let numArgs = 0; while (true) { @@ -10198,12 +11548,12 @@ if (lexer.beginInlineImagePos !== -1) { dictLength = stream.pos - lexer.beginInlineImagePos; } - const filter = this.xref.fetchIfRef(dictMap.F || dictMap.Filter); + const filter = this.#fetchIfRef(dictMap.F || dictMap.Filter); let filterName; if (filter instanceof Name) { filterName = filter.name; } else if (Array.isArray(filter)) { - const filterZero = this.xref.fetchIfRef(filter[0]); + const filterZero = this.#fetchIfRef(filter[0]); if (filterZero instanceof Name) { filterName = filterZero.name; } @@ -10245,10 +11595,10 @@ dict.set(key, dictMap[key]); } let imageStream = stream.makeSubStream(startPos, length, dict); - if (cipherTransform) { + if (cipherTransform && !this.#hasCryptFilter(filter)) { imageStream = cipherTransform.createStream(imageStream, length); } - imageStream = this.filter(imageStream, dict, length); + imageStream = this.filter(imageStream, dict, length, cipherTransform); imageStream.dict = dict; if (cacheKey !== undefined) { imageStream.cacheKey = `inline_img_${++this._imageId}`; @@ -10258,13 +11608,31 @@ this.shift(); return imageStream; } - _findStreamLength(startPos, signature) { + #fetchIfRef(obj) { + return this.xref ? this.xref.fetchIfRef(obj) : obj; + } + #hasCryptFilter(filter) { + if (!Array.isArray(filter)) { + return isName(filter, "Crypt"); + } + for (const f of filter) { + if (isName(this.#fetchIfRef(f), "Crypt")) { + return true; + } + } + return false; + } + #findStreamLength(startPos) { const { stream } = this.lexer; stream.pos = startPos; const SCAN_BLOCK_LENGTH = 2048; - const signatureLength = signature.length; + const signatureLength = "endstream".length; + const END_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64]); + const endLength = END_SIGNATURE.length; + const PARTIAL_SIGNATURE = [new Uint8Array([0x73, 0x74, 0x72, 0x65, 0x61, 0x6d]), new Uint8Array([0x73, 0x74, 0x65, 0x61, 0x6d]), new Uint8Array([0x73, 0x74, 0x72, 0x65, 0x61])]; + const normalLength = signatureLength - endLength; while (stream.pos < stream.end) { const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH); const scanLength = scanBytes.length - signatureLength; @@ -10274,12 +11642,34 @@ let pos = 0; while (pos < scanLength) { let j = 0; - while (j < signatureLength && scanBytes[pos + j] === signature[j]) { + while (j < endLength && scanBytes[pos + j] === END_SIGNATURE[j]) { j++; } - if (j >= signatureLength) { - stream.pos += pos; - return stream.pos - startPos; + if (j >= endLength) { + let found = false; + for (const part of PARTIAL_SIGNATURE) { + const partLen = part.length; + let k = 0; + while (k < partLen && scanBytes[pos + j + k] === part[k]) { + k++; + } + if (k >= normalLength) { + found = true; + break; + } + if (k >= partLen) { + const lastByte = scanBytes[pos + j + k]; + if (isWhiteSpace(lastByte)) { + info(`Found "${bytesToString([...END_SIGNATURE, ...part])}" when ` + "searching for endstream command."); + found = true; + } + break; + } + } + if (found) { + stream.pos += pos; + return stream.pos - startPos; + } } pos++; } @@ -10302,71 +11692,53 @@ if (this.tryShift() && isCmd(this.buf2, "endstream")) { this.shift(); } else { - const ENDSTREAM_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d]); - let actualLength = this._findStreamLength(startPos, ENDSTREAM_SIGNATURE); - if (actualLength < 0) { - const MAX_TRUNCATION = 1; - for (let i = 1; i <= MAX_TRUNCATION; i++) { - const end = ENDSTREAM_SIGNATURE.length - i; - const TRUNCATED_SIGNATURE = ENDSTREAM_SIGNATURE.slice(0, end); - const maybeLength = this._findStreamLength(startPos, TRUNCATED_SIGNATURE); - if (maybeLength >= 0) { - const lastByte = stream.peekBytes(end + 1)[end]; - if (!isWhiteSpace(lastByte)) { - break; - } - info(`Found "${bytesToString(TRUNCATED_SIGNATURE)}" when ` + "searching for endstream command."); - actualLength = maybeLength; - break; - } - } - if (actualLength < 0) { - throw new FormatError("Missing endstream command."); - } + length = this.#findStreamLength(startPos); + if (length < 0) { + throw new FormatError("Missing endstream command."); } - length = actualLength; lexer.nextChar(); this.shift(); this.shift(); } this.shift(); stream = stream.makeSubStream(startPos, length, dict); - if (cipherTransform) { + const filter = dict.get("F", "Filter"); + if (cipherTransform && !this.#hasCryptFilter(filter)) { stream = cipherTransform.createStream(stream, length); } - stream = this.filter(stream, dict, length); + stream = this.filter(stream, dict, length, cipherTransform); stream.dict = dict; return stream; } - filter(stream, dict, length) { + filter(stream, dict, length, cipherTransform = null) { let filter = dict.get("F", "Filter"); let params = dict.get("DP", "DecodeParms"); if (filter instanceof Name) { if (Array.isArray(params)) { warn("/DecodeParms should not be an Array, when /Filter is a Name."); } - return this.makeFilter(stream, filter.name, length, params); + return this.makeFilter(stream, filter.name, length, params, cipherTransform); } let maybeLength = length; if (Array.isArray(filter)) { const filterArray = filter; const paramsArray = params; for (let i = 0, ii = filterArray.length; i < ii; ++i) { - filter = this.xref.fetchIfRef(filterArray[i]); + filter = this.#fetchIfRef(filterArray[i]); if (!(filter instanceof Name)) { throw new FormatError(`Bad filter name "${filter}"`); } params = null; if (Array.isArray(paramsArray) && i in paramsArray) { - params = this.xref.fetchIfRef(paramsArray[i]); + params = this.#fetchIfRef(paramsArray[i]); } - stream = this.makeFilter(stream, filter.name, maybeLength, params); + stream = this.makeFilter(stream, filter.name, maybeLength, params, cipherTransform); maybeLength = null; } } return stream; } - makeFilter(stream, name, maybeLength, params) { + makeFilter(stream, name, maybeLength, params, cipherTransform = null) { if (maybeLength === 0) { warn(`Empty "${name}" stream.`); return new NullStream(); @@ -10394,7 +11766,7 @@ return new JpegStream(stream, maybeLength, params); case "JPX": case "JPXDecode": - return new JpxStream(stream, maybeLength, params); + return new JpxStream(stream, maybeLength); case "A85": case "ASCII85Decode": return new Ascii85Stream(stream, maybeLength); @@ -10409,6 +11781,18 @@ return new RunLengthStream(stream, maybeLength); case "JBIG2Decode": return new Jbig2Stream(stream, maybeLength, params); + case "BrotliDecode": + return new BrotliStream(stream, maybeLength); + case "Crypt": + { + if (!cipherTransform) { + warn('Filter "Crypt" is missing a cipher transform.'); + return stream; + } + const param = params instanceof Dict ? params.get("Name") : null; + const cryptName = param instanceof Name ? param : Name.get("Identity"); + return cipherTransform.createStream(stream, maybeLength, cryptName); + } } warn(`Filter "${name}" is not supported.`); return stream; @@ -10448,7 +11832,6 @@ } getNumber() { let ch = this.currentChar; - let eNotation = false; let divideBy = 0; let sign = 1; if (ch === 0x2d) { @@ -10471,26 +11854,20 @@ } if (ch < 0x30 || ch > 0x39) { const msg = `Invalid number: ${String.fromCharCode(ch)} (charCode ${ch})`; - if (isWhiteSpace(ch) || ch === -1) { + if (isWhiteSpace(ch) || ch === 0x28 || ch === 0x3c || ch === -1) { info(`Lexer.getNumber - "${msg}".`); return 0; } throw new FormatError(msg); } let baseValue = ch - 0x30; - let powerValue = 0; - let powerValueSign = 1; while ((ch = this.nextChar()) >= 0) { if (ch >= 0x30 && ch <= 0x39) { const currentDigit = ch - 0x30; - if (eNotation) { - powerValue = powerValue * 10 + currentDigit; - } else { - if (divideBy !== 0) { - divideBy *= 10; - } - baseValue = baseValue * 10 + currentDigit; + if (divideBy !== 0) { + divideBy *= 10; } + baseValue = baseValue * 10 + currentDigit; } else if (ch === 0x2e) { if (divideBy === 0) { divideBy = 1; @@ -10499,15 +11876,6 @@ } } else if (ch === 0x2d) { warn("Badly formatted number: minus sign in the middle"); - } else if (ch === 0x45 || ch === 0x65) { - ch = this.peekChar(); - if (ch === 0x2b || ch === 0x2d) { - powerValueSign = ch === 0x2d ? -1 : 1; - this.nextChar(); - } else if (ch < 0x30 || ch > 0x39) { - break; - } - eNotation = true; } else { break; } @@ -10515,9 +11883,6 @@ if (divideBy !== 0) { baseValue /= divideBy; } - if (eNotation) { - baseValue *= 10 ** (powerValueSign * powerValue); - } return sign * baseValue; } getString() { @@ -10590,2244 +11955,1049 @@ charBuffered = false; x = (x << 3) + (ch & 0x0f); } - } - strBuf.push(String.fromCharCode(x)); - break; - case 0x0d: - if (this.peekChar() === 0x0a) { - this.nextChar(); - } - break; - case 0x0a: - break; - default: - strBuf.push(String.fromCharCode(ch)); - break; - } - break; - default: - strBuf.push(String.fromCharCode(ch)); - break; - } - if (done) { - break; - } - if (!charBuffered) { - ch = this.nextChar(); - } - } - return strBuf.join(""); - } - getName() { - let ch, previousCh; - const strBuf = this.strBuf; - strBuf.length = 0; - while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { - if (ch === 0x23) { - ch = this.nextChar(); - if (specialChars[ch]) { - warn("Lexer_getName: " + "NUMBER SIGN (#) should be followed by a hexadecimal number."); - strBuf.push("#"); - break; - } - const x = toHexDigit(ch); - if (x !== -1) { - previousCh = ch; - ch = this.nextChar(); - const x2 = toHexDigit(ch); - if (x2 === -1) { - warn(`Lexer_getName: Illegal digit (${String.fromCharCode(ch)}) ` + "in hexadecimal number."); - strBuf.push("#", String.fromCharCode(previousCh)); - if (specialChars[ch]) { - break; - } - strBuf.push(String.fromCharCode(ch)); - continue; - } - strBuf.push(String.fromCharCode(x << 4 | x2)); - } else { - strBuf.push("#", String.fromCharCode(ch)); - } - } else { - strBuf.push(String.fromCharCode(ch)); - } - } - if (strBuf.length > 127) { - warn(`Name token is longer than allowed by the spec: ${strBuf.length}`); - } - return Name.get(strBuf.join("")); - } - _hexStringWarn(ch) { - const MAX_HEX_STRING_NUM_WARN = 5; - if (this._hexStringNumWarn++ === MAX_HEX_STRING_NUM_WARN) { - warn("getHexString - ignoring additional invalid characters."); - return; - } - if (this._hexStringNumWarn > MAX_HEX_STRING_NUM_WARN) { - return; - } - warn(`getHexString - ignoring invalid character: ${ch}`); - } - getHexString() { - const strBuf = this.strBuf; - strBuf.length = 0; - let ch = this.currentChar; - let isFirstHex = true; - let firstDigit, secondDigit; - this._hexStringNumWarn = 0; - while (true) { - if (ch < 0) { - warn("Unterminated hex string"); - break; - } else if (ch === 0x3e) { - this.nextChar(); - break; - } else if (specialChars[ch] === 1) { - ch = this.nextChar(); - continue; - } else { - if (isFirstHex) { - firstDigit = toHexDigit(ch); - if (firstDigit === -1) { - this._hexStringWarn(ch); - ch = this.nextChar(); - continue; - } - } else { - secondDigit = toHexDigit(ch); - if (secondDigit === -1) { - this._hexStringWarn(ch); - ch = this.nextChar(); - continue; - } - strBuf.push(String.fromCharCode(firstDigit << 4 | secondDigit)); - } - isFirstHex = !isFirstHex; - ch = this.nextChar(); - } - } - return strBuf.join(""); - } - getObj() { - let comment = false; - let ch = this.currentChar; - while (true) { - if (ch < 0) { - return EOF; - } - if (comment) { - if (ch === 0x0a || ch === 0x0d) { - comment = false; - } - } else if (ch === 0x25) { - comment = true; - } else if (specialChars[ch] !== 1) { - break; - } - ch = this.nextChar(); - } - switch (ch | 0) { - case 0x30: - case 0x31: - case 0x32: - case 0x33: - case 0x34: - case 0x35: - case 0x36: - case 0x37: - case 0x38: - case 0x39: - case 0x2b: - case 0x2d: - case 0x2e: - return this.getNumber(); - case 0x28: - return this.getString(); - case 0x2f: - return this.getName(); - case 0x5b: - this.nextChar(); - return Cmd.get("["); - case 0x5d: - this.nextChar(); - return Cmd.get("]"); - case 0x3c: - ch = this.nextChar(); - if (ch === 0x3c) { - this.nextChar(); - return Cmd.get("<<"); - } - return this.getHexString(); - case 0x3e: - ch = this.nextChar(); - if (ch === 0x3e) { - this.nextChar(); - return Cmd.get(">>"); - } - return Cmd.get(">"); - case 0x7b: - this.nextChar(); - return Cmd.get("{"); - case 0x7d: - this.nextChar(); - return Cmd.get("}"); - case 0x29: - this.nextChar(); - throw new FormatError(`Illegal character: ${ch}`); - } - let str = String.fromCharCode(ch); - if (ch < 0x20 || ch > 0x7f) { - const nextCh = this.peekChar(); - if (nextCh >= 0x20 && nextCh <= 0x7f) { - this.nextChar(); - return Cmd.get(str); - } - } - const knownCommands = this.knownCommands; - let knownCommandFound = knownCommands?.[str] !== undefined; - while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { - const possibleCommand = str + String.fromCharCode(ch); - if (knownCommandFound && knownCommands[possibleCommand] === undefined) { - break; - } - if (str.length === 128) { - throw new FormatError(`Command token too long: ${str.length}`); - } - str = possibleCommand; - knownCommandFound = knownCommands?.[str] !== undefined; - } - if (str === "true") { - return true; - } - if (str === "false") { - return false; - } - if (str === "null") { - return null; - } - if (str === "BI") { - this.beginInlineImagePos = this.stream.pos; - } - return Cmd.get(str); - } - skipToNextLine() { - let ch = this.currentChar; - while (ch >= 0) { - if (ch === 0x0d) { - ch = this.nextChar(); - if (ch === 0x0a) { - this.nextChar(); - } - break; - } else if (ch === 0x0a) { - this.nextChar(); - break; - } - ch = this.nextChar(); - } - } -} -class Linearization { - static create(stream) { - function getInt(linDict, name, allowZeroValue = false) { - const obj = linDict.get(name); - if (Number.isInteger(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) { - return obj; - } - throw new Error(`The "${name}" parameter in the linearization ` + "dictionary is invalid."); - } - function getHints(linDict) { - const hints = linDict.get("H"); - let hintsLength; - if (Array.isArray(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) { - for (let index = 0; index < hintsLength; index++) { - const hint = hints[index]; - if (!(Number.isInteger(hint) && hint > 0)) { - throw new Error(`Hint (${index}) in the linearization dictionary is invalid.`); - } - } - return hints; - } - throw new Error("Hint array in the linearization dictionary is invalid."); - } - const parser = new Parser({ - lexer: new Lexer(stream), - xref: null - }); - const obj1 = parser.getObj(); - const obj2 = parser.getObj(); - const obj3 = parser.getObj(); - const linDict = parser.getObj(); - let obj, length; - if (!(Number.isInteger(obj1) && Number.isInteger(obj2) && isCmd(obj3, "obj") && linDict instanceof Dict && typeof (obj = linDict.get("Linearized")) === "number" && obj > 0)) { - return null; - } else if ((length = getInt(linDict, "L")) !== stream.length) { - throw new Error('The "L" parameter in the linearization dictionary ' + "does not equal the stream length."); - } - return { - length, - hints: getHints(linDict), - objectNumberFirst: getInt(linDict, "O"), - endFirst: getInt(linDict, "E"), - numPages: getInt(linDict, "N"), - mainXRefEntriesOffset: getInt(linDict, "T"), - pageFirst: linDict.has("P") ? getInt(linDict, "P", true) : 0 - }; - } -} - -;// CONCATENATED MODULE: ./src/core/cmap.js - - - - - - - -const BUILT_IN_CMAPS = ["Adobe-GB1-UCS2", "Adobe-CNS1-UCS2", "Adobe-Japan1-UCS2", "Adobe-Korea1-UCS2", "78-EUC-H", "78-EUC-V", "78-H", "78-RKSJ-H", "78-RKSJ-V", "78-V", "78ms-RKSJ-H", "78ms-RKSJ-V", "83pv-RKSJ-H", "90ms-RKSJ-H", "90ms-RKSJ-V", "90msp-RKSJ-H", "90msp-RKSJ-V", "90pv-RKSJ-H", "90pv-RKSJ-V", "Add-H", "Add-RKSJ-H", "Add-RKSJ-V", "Add-V", "Adobe-CNS1-0", "Adobe-CNS1-1", "Adobe-CNS1-2", "Adobe-CNS1-3", "Adobe-CNS1-4", "Adobe-CNS1-5", "Adobe-CNS1-6", "Adobe-GB1-0", "Adobe-GB1-1", "Adobe-GB1-2", "Adobe-GB1-3", "Adobe-GB1-4", "Adobe-GB1-5", "Adobe-Japan1-0", "Adobe-Japan1-1", "Adobe-Japan1-2", "Adobe-Japan1-3", "Adobe-Japan1-4", "Adobe-Japan1-5", "Adobe-Japan1-6", "Adobe-Korea1-0", "Adobe-Korea1-1", "Adobe-Korea1-2", "B5-H", "B5-V", "B5pc-H", "B5pc-V", "CNS-EUC-H", "CNS-EUC-V", "CNS1-H", "CNS1-V", "CNS2-H", "CNS2-V", "ETHK-B5-H", "ETHK-B5-V", "ETen-B5-H", "ETen-B5-V", "ETenms-B5-H", "ETenms-B5-V", "EUC-H", "EUC-V", "Ext-H", "Ext-RKSJ-H", "Ext-RKSJ-V", "Ext-V", "GB-EUC-H", "GB-EUC-V", "GB-H", "GB-V", "GBK-EUC-H", "GBK-EUC-V", "GBK2K-H", "GBK2K-V", "GBKp-EUC-H", "GBKp-EUC-V", "GBT-EUC-H", "GBT-EUC-V", "GBT-H", "GBT-V", "GBTpc-EUC-H", "GBTpc-EUC-V", "GBpc-EUC-H", "GBpc-EUC-V", "H", "HKdla-B5-H", "HKdla-B5-V", "HKdlb-B5-H", "HKdlb-B5-V", "HKgccs-B5-H", "HKgccs-B5-V", "HKm314-B5-H", "HKm314-B5-V", "HKm471-B5-H", "HKm471-B5-V", "HKscs-B5-H", "HKscs-B5-V", "Hankaku", "Hiragana", "KSC-EUC-H", "KSC-EUC-V", "KSC-H", "KSC-Johab-H", "KSC-Johab-V", "KSC-V", "KSCms-UHC-H", "KSCms-UHC-HW-H", "KSCms-UHC-HW-V", "KSCms-UHC-V", "KSCpc-EUC-H", "KSCpc-EUC-V", "Katakana", "NWP-H", "NWP-V", "RKSJ-H", "RKSJ-V", "Roman", "UniCNS-UCS2-H", "UniCNS-UCS2-V", "UniCNS-UTF16-H", "UniCNS-UTF16-V", "UniCNS-UTF32-H", "UniCNS-UTF32-V", "UniCNS-UTF8-H", "UniCNS-UTF8-V", "UniGB-UCS2-H", "UniGB-UCS2-V", "UniGB-UTF16-H", "UniGB-UTF16-V", "UniGB-UTF32-H", "UniGB-UTF32-V", "UniGB-UTF8-H", "UniGB-UTF8-V", "UniJIS-UCS2-H", "UniJIS-UCS2-HW-H", "UniJIS-UCS2-HW-V", "UniJIS-UCS2-V", "UniJIS-UTF16-H", "UniJIS-UTF16-V", "UniJIS-UTF32-H", "UniJIS-UTF32-V", "UniJIS-UTF8-H", "UniJIS-UTF8-V", "UniJIS2004-UTF16-H", "UniJIS2004-UTF16-V", "UniJIS2004-UTF32-H", "UniJIS2004-UTF32-V", "UniJIS2004-UTF8-H", "UniJIS2004-UTF8-V", "UniJISPro-UCS2-HW-V", "UniJISPro-UCS2-V", "UniJISPro-UTF8-V", "UniJISX0213-UTF32-H", "UniJISX0213-UTF32-V", "UniJISX02132004-UTF32-H", "UniJISX02132004-UTF32-V", "UniKS-UCS2-H", "UniKS-UCS2-V", "UniKS-UTF16-H", "UniKS-UTF16-V", "UniKS-UTF32-H", "UniKS-UTF32-V", "UniKS-UTF8-H", "UniKS-UTF8-V", "V", "WP-Symbol"]; -const MAX_MAP_RANGE = 2 ** 24 - 1; -class CMap { - constructor(builtInCMap = false) { - this.codespaceRanges = [[], [], [], []]; - this.numCodespaceRanges = 0; - this._map = []; - this.name = ""; - this.vertical = false; - this.useCMap = null; - this.builtInCMap = builtInCMap; - } - addCodespaceRange(n, low, high) { - this.codespaceRanges[n - 1].push(low, high); - this.numCodespaceRanges++; - } - mapCidRange(low, high, dstLow) { - if (high - low > MAX_MAP_RANGE) { - throw new Error("mapCidRange - ignoring data above MAX_MAP_RANGE."); - } - while (low <= high) { - this._map[low++] = dstLow++; - } - } - mapBfRange(low, high, dstLow) { - if (high - low > MAX_MAP_RANGE) { - throw new Error("mapBfRange - ignoring data above MAX_MAP_RANGE."); - } - const lastByte = dstLow.length - 1; - while (low <= high) { - this._map[low++] = dstLow; - const nextCharCode = dstLow.charCodeAt(lastByte) + 1; - if (nextCharCode > 0xff) { - dstLow = dstLow.substring(0, lastByte - 1) + String.fromCharCode(dstLow.charCodeAt(lastByte - 1) + 1) + "\x00"; - continue; - } - dstLow = dstLow.substring(0, lastByte) + String.fromCharCode(nextCharCode); - } - } - mapBfRangeToArray(low, high, array) { - if (high - low > MAX_MAP_RANGE) { - throw new Error("mapBfRangeToArray - ignoring data above MAX_MAP_RANGE."); - } - const ii = array.length; - let i = 0; - while (low <= high && i < ii) { - this._map[low] = array[i++]; - ++low; - } - } - mapOne(src, dst) { - this._map[src] = dst; - } - lookup(code) { - return this._map[code]; - } - contains(code) { - return this._map[code] !== undefined; - } - forEach(callback) { - const map = this._map; - const length = map.length; - if (length <= 0x10000) { - for (let i = 0; i < length; i++) { - if (map[i] !== undefined) { - callback(i, map[i]); - } - } - } else { - for (const i in map) { - callback(i, map[i]); - } - } - } - charCodeOf(value) { - const map = this._map; - if (map.length <= 0x10000) { - return map.indexOf(value); - } - for (const charCode in map) { - if (map[charCode] === value) { - return charCode | 0; - } - } - return -1; - } - getMap() { - return this._map; - } - readCharCode(str, offset, out) { - let c = 0; - const codespaceRanges = this.codespaceRanges; - for (let n = 0, nn = codespaceRanges.length; n < nn; n++) { - c = (c << 8 | str.charCodeAt(offset + n)) >>> 0; - const codespaceRange = codespaceRanges[n]; - for (let k = 0, kk = codespaceRange.length; k < kk;) { - const low = codespaceRange[k++]; - const high = codespaceRange[k++]; - if (c >= low && c <= high) { - out.charcode = c; - out.length = n + 1; - return; - } - } - } - out.charcode = 0; - out.length = 1; - } - getCharCodeLength(charCode) { - const codespaceRanges = this.codespaceRanges; - for (let n = 0, nn = codespaceRanges.length; n < nn; n++) { - const codespaceRange = codespaceRanges[n]; - for (let k = 0, kk = codespaceRange.length; k < kk;) { - const low = codespaceRange[k++]; - const high = codespaceRange[k++]; - if (charCode >= low && charCode <= high) { - return n + 1; - } - } - } - return 1; - } - get length() { - return this._map.length; - } - get isIdentityCMap() { - if (!(this.name === "Identity-H" || this.name === "Identity-V")) { - return false; - } - if (this._map.length !== 0x10000) { - return false; - } - for (let i = 0; i < 0x10000; i++) { - if (this._map[i] !== i) { - return false; - } - } - return true; - } -} -class IdentityCMap extends CMap { - constructor(vertical, n) { - super(); - this.vertical = vertical; - this.addCodespaceRange(n, 0, 0xffff); - } - mapCidRange(low, high, dstLow) { - unreachable("should not call mapCidRange"); - } - mapBfRange(low, high, dstLow) { - unreachable("should not call mapBfRange"); - } - mapBfRangeToArray(low, high, array) { - unreachable("should not call mapBfRangeToArray"); - } - mapOne(src, dst) { - unreachable("should not call mapCidOne"); - } - lookup(code) { - return Number.isInteger(code) && code <= 0xffff ? code : undefined; - } - contains(code) { - return Number.isInteger(code) && code <= 0xffff; - } - forEach(callback) { - for (let i = 0; i <= 0xffff; i++) { - callback(i, i); - } - } - charCodeOf(value) { - return Number.isInteger(value) && value <= 0xffff ? value : -1; - } - getMap() { - const map = new Array(0x10000); - for (let i = 0; i <= 0xffff; i++) { - map[i] = i; - } - return map; - } - get length() { - return 0x10000; - } - get isIdentityCMap() { - unreachable("should not access .isIdentityCMap"); - } -} -function strToInt(str) { - let a = 0; - for (let i = 0; i < str.length; i++) { - a = a << 8 | str.charCodeAt(i); - } - return a >>> 0; -} -function expectString(obj) { - if (typeof obj !== "string") { - throw new FormatError("Malformed CMap: expected string."); - } -} -function expectInt(obj) { - if (!Number.isInteger(obj)) { - throw new FormatError("Malformed CMap: expected int."); - } -} -function parseBfChar(cMap, lexer) { - while (true) { - let obj = lexer.getObj(); - if (obj === EOF) { - break; - } - if (isCmd(obj, "endbfchar")) { - return; - } - expectString(obj); - const src = strToInt(obj); - obj = lexer.getObj(); - expectString(obj); - const dst = obj; - cMap.mapOne(src, dst); - } -} -function parseBfRange(cMap, lexer) { - while (true) { - let obj = lexer.getObj(); - if (obj === EOF) { - break; - } - if (isCmd(obj, "endbfrange")) { - return; - } - expectString(obj); - const low = strToInt(obj); - obj = lexer.getObj(); - expectString(obj); - const high = strToInt(obj); - obj = lexer.getObj(); - if (Number.isInteger(obj) || typeof obj === "string") { - const dstLow = Number.isInteger(obj) ? String.fromCharCode(obj) : obj; - cMap.mapBfRange(low, high, dstLow); - } else if (isCmd(obj, "[")) { - obj = lexer.getObj(); - const array = []; - while (!isCmd(obj, "]") && obj !== EOF) { - array.push(obj); - obj = lexer.getObj(); - } - cMap.mapBfRangeToArray(low, high, array); - } else { - break; - } - } - throw new FormatError("Invalid bf range."); -} -function parseCidChar(cMap, lexer) { - while (true) { - let obj = lexer.getObj(); - if (obj === EOF) { - break; - } - if (isCmd(obj, "endcidchar")) { - return; - } - expectString(obj); - const src = strToInt(obj); - obj = lexer.getObj(); - expectInt(obj); - const dst = obj; - cMap.mapOne(src, dst); - } -} -function parseCidRange(cMap, lexer) { - while (true) { - let obj = lexer.getObj(); - if (obj === EOF) { - break; - } - if (isCmd(obj, "endcidrange")) { - return; - } - expectString(obj); - const low = strToInt(obj); - obj = lexer.getObj(); - expectString(obj); - const high = strToInt(obj); - obj = lexer.getObj(); - expectInt(obj); - const dstLow = obj; - cMap.mapCidRange(low, high, dstLow); - } -} -function parseCodespaceRange(cMap, lexer) { - while (true) { - let obj = lexer.getObj(); - if (obj === EOF) { - break; - } - if (isCmd(obj, "endcodespacerange")) { - return; - } - if (typeof obj !== "string") { - break; - } - const low = strToInt(obj); - obj = lexer.getObj(); - if (typeof obj !== "string") { - break; - } - const high = strToInt(obj); - cMap.addCodespaceRange(obj.length, low, high); - } - throw new FormatError("Invalid codespace range."); -} -function parseWMode(cMap, lexer) { - const obj = lexer.getObj(); - if (Number.isInteger(obj)) { - cMap.vertical = !!obj; - } -} -function parseCMapName(cMap, lexer) { - const obj = lexer.getObj(); - if (obj instanceof Name) { - cMap.name = obj.name; - } -} -async function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) { - let previous, embeddedUseCMap; - objLoop: while (true) { - try { - const obj = lexer.getObj(); - if (obj === EOF) { - break; - } else if (obj instanceof Name) { - if (obj.name === "WMode") { - parseWMode(cMap, lexer); - } else if (obj.name === "CMapName") { - parseCMapName(cMap, lexer); - } - previous = obj; - } else if (obj instanceof Cmd) { - switch (obj.cmd) { - case "endcmap": - break objLoop; - case "usecmap": - if (previous instanceof Name) { - embeddedUseCMap = previous.name; - } - break; - case "begincodespacerange": - parseCodespaceRange(cMap, lexer); - break; - case "beginbfchar": - parseBfChar(cMap, lexer); - break; - case "begincidchar": - parseCidChar(cMap, lexer); - break; - case "beginbfrange": - parseBfRange(cMap, lexer); - break; - case "begincidrange": - parseCidRange(cMap, lexer); - break; - } - } - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn("Invalid cMap data: " + ex); - continue; - } - } - if (!useCMap && embeddedUseCMap) { - useCMap = embeddedUseCMap; - } - if (useCMap) { - return extendCMap(cMap, fetchBuiltInCMap, useCMap); - } - return cMap; -} -async function extendCMap(cMap, fetchBuiltInCMap, useCMap) { - cMap.useCMap = await createBuiltInCMap(useCMap, fetchBuiltInCMap); - if (cMap.numCodespaceRanges === 0) { - const useCodespaceRanges = cMap.useCMap.codespaceRanges; - for (let i = 0; i < useCodespaceRanges.length; i++) { - cMap.codespaceRanges[i] = useCodespaceRanges[i].slice(); - } - cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges; - } - cMap.useCMap.forEach(function (key, value) { - if (!cMap.contains(key)) { - cMap.mapOne(key, cMap.useCMap.lookup(key)); - } - }); - return cMap; -} -async function createBuiltInCMap(name, fetchBuiltInCMap) { - if (name === "Identity-H") { - return new IdentityCMap(false, 2); - } else if (name === "Identity-V") { - return new IdentityCMap(true, 2); - } - if (!BUILT_IN_CMAPS.includes(name)) { - throw new Error("Unknown CMap name: " + name); - } - if (!fetchBuiltInCMap) { - throw new Error("Built-in CMap parameters are not provided."); - } - const { - cMapData, - compressionType - } = await fetchBuiltInCMap(name); - const cMap = new CMap(true); - if (compressionType === CMapCompressionType.BINARY) { - return new BinaryCMapReader().process(cMapData, cMap, useCMap => extendCMap(cMap, fetchBuiltInCMap, useCMap)); - } - if (compressionType === CMapCompressionType.NONE) { - const lexer = new Lexer(new Stream(cMapData)); - return parseCMap(cMap, lexer, fetchBuiltInCMap, null); - } - throw new Error(`Invalid CMap "compressionType" value: ${compressionType}`); -} -class CMapFactory { - static async create({ - encoding, - fetchBuiltInCMap, - useCMap - }) { - if (encoding instanceof Name) { - return createBuiltInCMap(encoding.name, fetchBuiltInCMap); - } else if (encoding instanceof BaseStream) { - const parsedCMap = await parseCMap(new CMap(), new Lexer(encoding), fetchBuiltInCMap, useCMap); - if (parsedCMap.isIdentityCMap) { - return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap); - } - return parsedCMap; - } - throw new Error("Encoding required."); - } -} - -;// CONCATENATED MODULE: ./src/core/charsets.js -const ISOAdobeCharset = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron"]; -const ExpertCharset = [".notdef", "space", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "onequarter", "onehalf", "threequarters", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall"]; -const ExpertSubsetCharset = [".notdef", "space", "dollaroldstyle", "dollarsuperior", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "hyphensuperior", "colonmonetary", "onefitted", "rupiah", "centoldstyle", "figuredash", "hypheninferior", "onequarter", "onehalf", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior"]; - -;// CONCATENATED MODULE: ./src/core/encodings.js -const ExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclamsmall", "Hungarumlautsmall", "", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "", "", "", "isuperior", "", "", "lsuperior", "msuperior", "nsuperior", "osuperior", "", "", "rsuperior", "ssuperior", "tsuperior", "", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "exclamdownsmall", "centoldstyle", "Lslashsmall", "", "", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "", "Dotaccentsmall", "", "", "Macronsmall", "", "", "figuredash", "hypheninferior", "", "", "Ogoneksmall", "Ringsmall", "Cedillasmall", "", "", "", "onequarter", "onehalf", "threequarters", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "", "", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall"]; -const MacExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclamsmall", "Hungarumlautsmall", "centoldstyle", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "", "threequartersemdash", "", "questionsmall", "", "", "", "", "Ethsmall", "", "", "onequarter", "onehalf", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "", "", "", "", "", "", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "", "parenrightinferior", "Circumflexsmall", "hypheninferior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "", "", "asuperior", "centsuperior", "", "", "", "", "Aacutesmall", "Agravesmall", "Acircumflexsmall", "Adieresissmall", "Atildesmall", "Aringsmall", "Ccedillasmall", "Eacutesmall", "Egravesmall", "Ecircumflexsmall", "Edieresissmall", "Iacutesmall", "Igravesmall", "Icircumflexsmall", "Idieresissmall", "Ntildesmall", "Oacutesmall", "Ogravesmall", "Ocircumflexsmall", "Odieresissmall", "Otildesmall", "Uacutesmall", "Ugravesmall", "Ucircumflexsmall", "Udieresissmall", "", "eightsuperior", "fourinferior", "threeinferior", "sixinferior", "eightinferior", "seveninferior", "Scaronsmall", "", "centinferior", "twoinferior", "", "Dieresissmall", "", "Caronsmall", "osuperior", "fiveinferior", "", "commainferior", "periodinferior", "Yacutesmall", "", "dollarinferior", "", "", "Thornsmall", "", "nineinferior", "zeroinferior", "Zcaronsmall", "AEsmall", "Oslashsmall", "questiondownsmall", "oneinferior", "Lslashsmall", "", "", "", "", "", "", "Cedillasmall", "", "", "", "", "", "OEsmall", "figuredash", "hyphensuperior", "", "", "", "", "exclamdownsmall", "", "Ydieresissmall", "", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "ninesuperior", "zerosuperior", "", "esuperior", "rsuperior", "tsuperior", "", "", "isuperior", "ssuperior", "dsuperior", "", "", "", "", "", "lsuperior", "Ogoneksmall", "Brevesmall", "Macronsmall", "bsuperior", "nsuperior", "msuperior", "commasuperior", "periodsuperior", "Dotaccentsmall", "Ringsmall", "", "", "", ""]; -const MacRomanEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "", "Adieresis", "Aring", "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", "aacute", "agrave", "acircumflex", "adieresis", "atilde", "aring", "ccedilla", "eacute", "egrave", "ecircumflex", "edieresis", "iacute", "igrave", "icircumflex", "idieresis", "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling", "section", "bullet", "paragraph", "germandbls", "registered", "copyright", "trademark", "acute", "dieresis", "notequal", "AE", "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", "yen", "mu", "partialdiff", "summation", "product", "pi", "integral", "ordfeminine", "ordmasculine", "Omega", "ae", "oslash", "questiondown", "exclamdown", "logicalnot", "radical", "florin", "approxequal", "Delta", "guillemotleft", "guillemotright", "ellipsis", "space", "Agrave", "Atilde", "Otilde", "OE", "oe", "endash", "emdash", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", "dotlessi", "circumflex", "tilde", "macron", "breve", "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", "caron"]; -const StandardEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "", "endash", "dagger", "daggerdbl", "periodcentered", "", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "", "questiondown", "", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "", "ring", "cedilla", "", "hungarumlaut", "ogonek", "caron", "emdash", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "AE", "", "ordfeminine", "", "", "", "", "Lslash", "Oslash", "OE", "ordmasculine", "", "", "", "", "", "ae", "", "", "", "dotlessi", "", "", "lslash", "oslash", "oe", "germandbls", "", "", "", ""]; -const WinAnsiEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "bullet", "Euro", "bullet", "quotesinglbase", "florin", "quotedblbase", "ellipsis", "dagger", "daggerdbl", "circumflex", "perthousand", "Scaron", "guilsinglleft", "OE", "bullet", "Zcaron", "bullet", "bullet", "quoteleft", "quoteright", "quotedblleft", "quotedblright", "bullet", "endash", "emdash", "tilde", "trademark", "scaron", "guilsinglright", "oe", "bullet", "zcaron", "Ydieresis", "space", "exclamdown", "cent", "sterling", "currency", "yen", "brokenbar", "section", "dieresis", "copyright", "ordfeminine", "guillemotleft", "logicalnot", "hyphen", "registered", "macron", "degree", "plusminus", "twosuperior", "threesuperior", "acute", "mu", "paragraph", "periodcentered", "cedilla", "onesuperior", "ordmasculine", "guillemotright", "onequarter", "onehalf", "threequarters", "questiondown", "Agrave", "Aacute", "Acircumflex", "Atilde", "Adieresis", "Aring", "AE", "Ccedilla", "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave", "Iacute", "Icircumflex", "Idieresis", "Eth", "Ntilde", "Ograve", "Oacute", "Ocircumflex", "Otilde", "Odieresis", "multiply", "Oslash", "Ugrave", "Uacute", "Ucircumflex", "Udieresis", "Yacute", "Thorn", "germandbls", "agrave", "aacute", "acircumflex", "atilde", "adieresis", "aring", "ae", "ccedilla", "egrave", "eacute", "ecircumflex", "edieresis", "igrave", "iacute", "icircumflex", "idieresis", "eth", "ntilde", "ograve", "oacute", "ocircumflex", "otilde", "odieresis", "divide", "oslash", "ugrave", "uacute", "ucircumflex", "udieresis", "yacute", "thorn", "ydieresis"]; -const SymbolSetEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "universal", "numbersign", "existential", "percent", "ampersand", "suchthat", "parenleft", "parenright", "asteriskmath", "plus", "comma", "minus", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "congruent", "Alpha", "Beta", "Chi", "Delta", "Epsilon", "Phi", "Gamma", "Eta", "Iota", "theta1", "Kappa", "Lambda", "Mu", "Nu", "Omicron", "Pi", "Theta", "Rho", "Sigma", "Tau", "Upsilon", "sigma1", "Omega", "Xi", "Psi", "Zeta", "bracketleft", "therefore", "bracketright", "perpendicular", "underscore", "radicalex", "alpha", "beta", "chi", "delta", "epsilon", "phi", "gamma", "eta", "iota", "phi1", "kappa", "lambda", "mu", "nu", "omicron", "pi", "theta", "rho", "sigma", "tau", "upsilon", "omega1", "omega", "xi", "psi", "zeta", "braceleft", "bar", "braceright", "similar", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Euro", "Upsilon1", "minute", "lessequal", "fraction", "infinity", "florin", "club", "diamond", "heart", "spade", "arrowboth", "arrowleft", "arrowup", "arrowright", "arrowdown", "degree", "plusminus", "second", "greaterequal", "multiply", "proportional", "partialdiff", "bullet", "divide", "notequal", "equivalence", "approxequal", "ellipsis", "arrowvertex", "arrowhorizex", "carriagereturn", "aleph", "Ifraktur", "Rfraktur", "weierstrass", "circlemultiply", "circleplus", "emptyset", "intersection", "union", "propersuperset", "reflexsuperset", "notsubset", "propersubset", "reflexsubset", "element", "notelement", "angle", "gradient", "registerserif", "copyrightserif", "trademarkserif", "product", "radical", "dotmath", "logicalnot", "logicaland", "logicalor", "arrowdblboth", "arrowdblleft", "arrowdblup", "arrowdblright", "arrowdbldown", "lozenge", "angleleft", "registersans", "copyrightsans", "trademarksans", "summation", "parenlefttp", "parenleftex", "parenleftbt", "bracketlefttp", "bracketleftex", "bracketleftbt", "bracelefttp", "braceleftmid", "braceleftbt", "braceex", "", "angleright", "integral", "integraltp", "integralex", "integralbt", "parenrighttp", "parenrightex", "parenrightbt", "bracketrighttp", "bracketrightex", "bracketrightbt", "bracerighttp", "bracerightmid", "bracerightbt", ""]; -const ZapfDingbatsEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "a1", "a2", "a202", "a3", "a4", "a5", "a119", "a118", "a117", "a11", "a12", "a13", "a14", "a15", "a16", "a105", "a17", "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26", "a27", "a28", "a6", "a7", "a8", "a9", "a10", "a29", "a30", "a31", "a32", "a33", "a34", "a35", "a36", "a37", "a38", "a39", "a40", "a41", "a42", "a43", "a44", "a45", "a46", "a47", "a48", "a49", "a50", "a51", "a52", "a53", "a54", "a55", "a56", "a57", "a58", "a59", "a60", "a61", "a62", "a63", "a64", "a65", "a66", "a67", "a68", "a69", "a70", "a71", "a72", "a73", "a74", "a203", "a75", "a204", "a76", "a77", "a78", "a79", "a81", "a82", "a83", "a84", "a97", "a98", "a99", "a100", "", "a89", "a90", "a93", "a94", "a91", "a92", "a205", "a85", "a206", "a86", "a87", "a88", "a95", "a96", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "a101", "a102", "a103", "a104", "a106", "a107", "a108", "a112", "a111", "a110", "a109", "a120", "a121", "a122", "a123", "a124", "a125", "a126", "a127", "a128", "a129", "a130", "a131", "a132", "a133", "a134", "a135", "a136", "a137", "a138", "a139", "a140", "a141", "a142", "a143", "a144", "a145", "a146", "a147", "a148", "a149", "a150", "a151", "a152", "a153", "a154", "a155", "a156", "a157", "a158", "a159", "a160", "a161", "a163", "a164", "a196", "a165", "a192", "a166", "a167", "a168", "a169", "a170", "a171", "a172", "a173", "a162", "a174", "a175", "a176", "a177", "a178", "a179", "a193", "a180", "a199", "a181", "a200", "a182", "", "a201", "a183", "a184", "a197", "a185", "a194", "a198", "a186", "a195", "a187", "a188", "a189", "a190", "a191", ""]; -function getEncoding(encodingName) { - switch (encodingName) { - case "WinAnsiEncoding": - return WinAnsiEncoding; - case "StandardEncoding": - return StandardEncoding; - case "MacRomanEncoding": - return MacRomanEncoding; - case "SymbolSetEncoding": - return SymbolSetEncoding; - case "ZapfDingbatsEncoding": - return ZapfDingbatsEncoding; - case "ExpertEncoding": - return ExpertEncoding; - case "MacExpertEncoding": - return MacExpertEncoding; - default: - return null; - } -} - -;// CONCATENATED MODULE: ./src/core/cff_parser.js - - - -const MAX_SUBR_NESTING = 10; -const CFFStandardStrings = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall", "001.000", "001.001", "001.002", "001.003", "Black", "Bold", "Book", "Light", "Medium", "Regular", "Roman", "Semibold"]; -const NUM_STANDARD_CFF_STRINGS = 391; -const CharstringValidationData = [null, { - id: "hstem", - min: 2, - stackClearing: true, - stem: true -}, null, { - id: "vstem", - min: 2, - stackClearing: true, - stem: true -}, { - id: "vmoveto", - min: 1, - stackClearing: true -}, { - id: "rlineto", - min: 2, - resetStack: true -}, { - id: "hlineto", - min: 1, - resetStack: true -}, { - id: "vlineto", - min: 1, - resetStack: true -}, { - id: "rrcurveto", - min: 6, - resetStack: true -}, null, { - id: "callsubr", - min: 1, - undefStack: true -}, { - id: "return", - min: 0, - undefStack: true -}, null, null, { - id: "endchar", - min: 0, - stackClearing: true -}, null, null, null, { - id: "hstemhm", - min: 2, - stackClearing: true, - stem: true -}, { - id: "hintmask", - min: 0, - stackClearing: true -}, { - id: "cntrmask", - min: 0, - stackClearing: true -}, { - id: "rmoveto", - min: 2, - stackClearing: true -}, { - id: "hmoveto", - min: 1, - stackClearing: true -}, { - id: "vstemhm", - min: 2, - stackClearing: true, - stem: true -}, { - id: "rcurveline", - min: 8, - resetStack: true -}, { - id: "rlinecurve", - min: 8, - resetStack: true -}, { - id: "vvcurveto", - min: 4, - resetStack: true -}, { - id: "hhcurveto", - min: 4, - resetStack: true -}, null, { - id: "callgsubr", - min: 1, - undefStack: true -}, { - id: "vhcurveto", - min: 4, - resetStack: true -}, { - id: "hvcurveto", - min: 4, - resetStack: true -}]; -const CharstringValidationData12 = [null, null, null, { - id: "and", - min: 2, - stackDelta: -1 -}, { - id: "or", - min: 2, - stackDelta: -1 -}, { - id: "not", - min: 1, - stackDelta: 0 -}, null, null, null, { - id: "abs", - min: 1, - stackDelta: 0 -}, { - id: "add", - min: 2, - stackDelta: -1, - stackFn(stack, index) { - stack[index - 2] = stack[index - 2] + stack[index - 1]; - } -}, { - id: "sub", - min: 2, - stackDelta: -1, - stackFn(stack, index) { - stack[index - 2] = stack[index - 2] - stack[index - 1]; - } -}, { - id: "div", - min: 2, - stackDelta: -1, - stackFn(stack, index) { - stack[index - 2] = stack[index - 2] / stack[index - 1]; - } -}, null, { - id: "neg", - min: 1, - stackDelta: 0, - stackFn(stack, index) { - stack[index - 1] = -stack[index - 1]; - } -}, { - id: "eq", - min: 2, - stackDelta: -1 -}, null, null, { - id: "drop", - min: 1, - stackDelta: -1 -}, null, { - id: "put", - min: 2, - stackDelta: -2 -}, { - id: "get", - min: 1, - stackDelta: 0 -}, { - id: "ifelse", - min: 4, - stackDelta: -3 -}, { - id: "random", - min: 0, - stackDelta: 1 -}, { - id: "mul", - min: 2, - stackDelta: -1, - stackFn(stack, index) { - stack[index - 2] = stack[index - 2] * stack[index - 1]; - } -}, null, { - id: "sqrt", - min: 1, - stackDelta: 0 -}, { - id: "dup", - min: 1, - stackDelta: 1 -}, { - id: "exch", - min: 2, - stackDelta: 0 -}, { - id: "index", - min: 2, - stackDelta: 0 -}, { - id: "roll", - min: 3, - stackDelta: -2 -}, null, null, null, { - id: "hflex", - min: 7, - resetStack: true -}, { - id: "flex", - min: 13, - resetStack: true -}, { - id: "hflex1", - min: 9, - resetStack: true -}, { - id: "flex1", - min: 11, - resetStack: true -}]; -class CFFParser { - constructor(file, properties, seacAnalysisEnabled) { - this.bytes = file.getBytes(); - this.properties = properties; - this.seacAnalysisEnabled = !!seacAnalysisEnabled; - } - parse() { - const properties = this.properties; - const cff = new CFF(); - this.cff = cff; - const header = this.parseHeader(); - const nameIndex = this.parseIndex(header.endPos); - const topDictIndex = this.parseIndex(nameIndex.endPos); - const stringIndex = this.parseIndex(topDictIndex.endPos); - const globalSubrIndex = this.parseIndex(stringIndex.endPos); - const topDictParsed = this.parseDict(topDictIndex.obj.get(0)); - const topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings); - cff.header = header.obj; - cff.names = this.parseNameIndex(nameIndex.obj); - cff.strings = this.parseStringIndex(stringIndex.obj); - cff.topDict = topDict; - cff.globalSubrIndex = globalSubrIndex.obj; - this.parsePrivateDict(cff.topDict); - cff.isCIDFont = topDict.hasName("ROS"); - const charStringOffset = topDict.getByName("CharStrings"); - const charStringIndex = this.parseIndex(charStringOffset).obj; - const fontMatrix = topDict.getByName("FontMatrix"); - if (fontMatrix) { - properties.fontMatrix = fontMatrix; - } - const fontBBox = topDict.getByName("FontBBox"); - if (fontBBox) { - properties.ascent = Math.max(fontBBox[3], fontBBox[1]); - properties.descent = Math.min(fontBBox[1], fontBBox[3]); - properties.ascentScaled = true; - } - let charset, encoding; - if (cff.isCIDFont) { - const fdArrayIndex = this.parseIndex(topDict.getByName("FDArray")).obj; - for (let i = 0, ii = fdArrayIndex.count; i < ii; ++i) { - const dictRaw = fdArrayIndex.get(i); - const fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings); - this.parsePrivateDict(fontDict); - cff.fdArray.push(fontDict); - } - encoding = null; - charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, true); - cff.fdSelect = this.parseFDSelect(topDict.getByName("FDSelect"), charStringIndex.count); - } else { - charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, false); - encoding = this.parseEncoding(topDict.getByName("Encoding"), properties, cff.strings, charset.charset); - } - cff.charset = charset; - cff.encoding = encoding; - const charStringsAndSeacs = this.parseCharStrings({ - charStrings: charStringIndex, - localSubrIndex: topDict.privateDict.subrsIndex, - globalSubrIndex: globalSubrIndex.obj, - fdSelect: cff.fdSelect, - fdArray: cff.fdArray, - privateDict: topDict.privateDict - }); - cff.charStrings = charStringsAndSeacs.charStrings; - cff.seacs = charStringsAndSeacs.seacs; - cff.widths = charStringsAndSeacs.widths; - return cff; - } - parseHeader() { - let bytes = this.bytes; - const bytesLength = bytes.length; - let offset = 0; - while (offset < bytesLength && bytes[offset] !== 1) { - ++offset; - } - if (offset >= bytesLength) { - throw new FormatError("Invalid CFF header"); - } - if (offset !== 0) { - info("cff data is shifted"); - bytes = bytes.subarray(offset); - this.bytes = bytes; - } - const major = bytes[0]; - const minor = bytes[1]; - const hdrSize = bytes[2]; - const offSize = bytes[3]; - const header = new CFFHeader(major, minor, hdrSize, offSize); - return { - obj: header, - endPos: hdrSize - }; - } - parseDict(dict) { - let pos = 0; - function parseOperand() { - let value = dict[pos++]; - if (value === 30) { - return parseFloatOperand(); - } else if (value === 28) { - value = dict[pos++]; - value = (value << 24 | dict[pos++] << 16) >> 16; - return value; - } else if (value === 29) { - value = dict[pos++]; - value = value << 8 | dict[pos++]; - value = value << 8 | dict[pos++]; - value = value << 8 | dict[pos++]; - return value; - } else if (value >= 32 && value <= 246) { - return value - 139; - } else if (value >= 247 && value <= 250) { - return (value - 247) * 256 + dict[pos++] + 108; - } else if (value >= 251 && value <= 254) { - return -((value - 251) * 256) - dict[pos++] - 108; - } - warn('CFFParser_parseDict: "' + value + '" is a reserved command.'); - return NaN; - } - function parseFloatOperand() { - let str = ""; - const eof = 15; - const lookup = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "E", "E-", null, "-"]; - const length = dict.length; - while (pos < length) { - const b = dict[pos++]; - const b1 = b >> 4; - const b2 = b & 15; - if (b1 === eof) { - break; - } - str += lookup[b1]; - if (b2 === eof) { - break; - } - str += lookup[b2]; - } - return parseFloat(str); - } - let operands = []; - const entries = []; - pos = 0; - const end = dict.length; - while (pos < end) { - let b = dict[pos]; - if (b <= 21) { - if (b === 12) { - b = b << 8 | dict[++pos]; - } - entries.push([b, operands]); - operands = []; - ++pos; - } else { - operands.push(parseOperand()); - } - } - return entries; - } - parseIndex(pos) { - const cffIndex = new CFFIndex(); - const bytes = this.bytes; - const count = bytes[pos++] << 8 | bytes[pos++]; - const offsets = []; - let end = pos; - let i, ii; - if (count !== 0) { - const offsetSize = bytes[pos++]; - const startPos = pos + (count + 1) * offsetSize - 1; - for (i = 0, ii = count + 1; i < ii; ++i) { - let offset = 0; - for (let j = 0; j < offsetSize; ++j) { - offset <<= 8; - offset += bytes[pos++]; - } - offsets.push(startPos + offset); - } - end = offsets[count]; - } - for (i = 0, ii = offsets.length - 1; i < ii; ++i) { - const offsetStart = offsets[i]; - const offsetEnd = offsets[i + 1]; - cffIndex.add(bytes.subarray(offsetStart, offsetEnd)); - } - return { - obj: cffIndex, - endPos: end - }; - } - parseNameIndex(index) { - const names = []; - for (let i = 0, ii = index.count; i < ii; ++i) { - const name = index.get(i); - names.push(bytesToString(name)); - } - return names; - } - parseStringIndex(index) { - const strings = new CFFStrings(); - for (let i = 0, ii = index.count; i < ii; ++i) { - const data = index.get(i); - strings.add(bytesToString(data)); - } - return strings; - } - createDict(Type, dict, strings) { - const cffDict = new Type(strings); - for (const [key, value] of dict) { - cffDict.setByKey(key, value); - } - return cffDict; - } - parseCharString(state, data, localSubrIndex, globalSubrIndex) { - if (!data || state.callDepth > MAX_SUBR_NESTING) { - return false; - } - let stackSize = state.stackSize; - const stack = state.stack; - let length = data.length; - for (let j = 0; j < length;) { - const value = data[j++]; - let validationCommand = null; - if (value === 12) { - const q = data[j++]; - if (q === 0) { - data[j - 2] = 139; - data[j - 1] = 22; - stackSize = 0; - } else { - validationCommand = CharstringValidationData12[q]; - } - } else if (value === 28) { - stack[stackSize] = (data[j] << 24 | data[j + 1] << 16) >> 16; - j += 2; - stackSize++; - } else if (value === 14) { - if (stackSize >= 4) { - stackSize -= 4; - if (this.seacAnalysisEnabled) { - state.seac = stack.slice(stackSize, stackSize + 4); - return false; - } - } - validationCommand = CharstringValidationData[value]; - } else if (value >= 32 && value <= 246) { - stack[stackSize] = value - 139; - stackSize++; - } else if (value >= 247 && value <= 254) { - stack[stackSize] = value < 251 ? (value - 247 << 8) + data[j] + 108 : -(value - 251 << 8) - data[j] - 108; - j++; - stackSize++; - } else if (value === 255) { - stack[stackSize] = (data[j] << 24 | data[j + 1] << 16 | data[j + 2] << 8 | data[j + 3]) / 65536; - j += 4; - stackSize++; - } else if (value === 19 || value === 20) { - state.hints += stackSize >> 1; - if (state.hints === 0) { - data.copyWithin(j - 1, j, -1); - j -= 1; - length -= 1; - continue; - } - j += state.hints + 7 >> 3; - stackSize %= 2; - validationCommand = CharstringValidationData[value]; - } else if (value === 10 || value === 29) { - const subrsIndex = value === 10 ? localSubrIndex : globalSubrIndex; - if (!subrsIndex) { - validationCommand = CharstringValidationData[value]; - warn("Missing subrsIndex for " + validationCommand.id); - return false; - } - let bias = 32768; - if (subrsIndex.count < 1240) { - bias = 107; - } else if (subrsIndex.count < 33900) { - bias = 1131; - } - const subrNumber = stack[--stackSize] + bias; - if (subrNumber < 0 || subrNumber >= subrsIndex.count || isNaN(subrNumber)) { - validationCommand = CharstringValidationData[value]; - warn("Out of bounds subrIndex for " + validationCommand.id); - return false; - } - state.stackSize = stackSize; - state.callDepth++; - const valid = this.parseCharString(state, subrsIndex.get(subrNumber), localSubrIndex, globalSubrIndex); - if (!valid) { - return false; - } - state.callDepth--; - stackSize = state.stackSize; - continue; - } else if (value === 11) { - state.stackSize = stackSize; - return true; - } else if (value === 0 && j === data.length) { - data[j - 1] = 14; - validationCommand = CharstringValidationData[14]; - } else if (value === 9) { - data.copyWithin(j - 1, j, -1); - j -= 1; - length -= 1; - continue; - } else { - validationCommand = CharstringValidationData[value]; - } - if (validationCommand) { - if (validationCommand.stem) { - state.hints += stackSize >> 1; - if (value === 3 || value === 23) { - state.hasVStems = true; - } else if (state.hasVStems && (value === 1 || value === 18)) { - warn("CFF stem hints are in wrong order"); - data[j - 1] = value === 1 ? 3 : 23; - } - } - if ("min" in validationCommand) { - if (!state.undefStack && stackSize < validationCommand.min) { - warn("Not enough parameters for " + validationCommand.id + "; actual: " + stackSize + ", expected: " + validationCommand.min); - if (stackSize === 0) { - data[j - 1] = 14; - return true; - } - return false; - } - } - if (state.firstStackClearing && validationCommand.stackClearing) { - state.firstStackClearing = false; - stackSize -= validationCommand.min; - if (stackSize >= 2 && validationCommand.stem) { - stackSize %= 2; - } else if (stackSize > 1) { - warn("Found too many parameters for stack-clearing command"); - } - if (stackSize > 0) { - state.width = stack[stackSize - 1]; - } - } - if ("stackDelta" in validationCommand) { - if ("stackFn" in validationCommand) { - validationCommand.stackFn(stack, stackSize); + } + strBuf.push(String.fromCharCode(x)); + break; + case 0x0d: + if (this.peekChar() === 0x0a) { + this.nextChar(); + } + break; + case 0x0a: + break; + default: + strBuf.push(String.fromCharCode(ch)); + break; } - stackSize += validationCommand.stackDelta; - } else if (validationCommand.stackClearing) { - stackSize = 0; - } else if (validationCommand.resetStack) { - stackSize = 0; - state.undefStack = false; - } else if (validationCommand.undefStack) { - stackSize = 0; - state.undefStack = true; - state.firstStackClearing = false; - } + break; + default: + strBuf.push(String.fromCharCode(ch)); + break; + } + if (done) { + break; + } + if (!charBuffered) { + ch = this.nextChar(); } } - if (length < data.length) { - data.fill(14, length); - } - state.stackSize = stackSize; - return true; + return strBuf.join(""); } - parseCharStrings({ - charStrings, - localSubrIndex, - globalSubrIndex, - fdSelect, - fdArray, - privateDict - }) { - const seacs = []; - const widths = []; - const count = charStrings.count; - for (let i = 0; i < count; i++) { - const charstring = charStrings.get(i); - const state = { - callDepth: 0, - stackSize: 0, - stack: [], - undefStack: true, - hints: 0, - firstStackClearing: true, - seac: null, - width: null, - hasVStems: false - }; - let valid = true; - let localSubrToUse = null; - let privateDictToUse = privateDict; - if (fdSelect && fdArray.length) { - const fdIndex = fdSelect.getFDIndex(i); - if (fdIndex === -1) { - warn("Glyph index is not in fd select."); - valid = false; - } - if (fdIndex >= fdArray.length) { - warn("Invalid fd index for glyph index."); - valid = false; + getName() { + let ch, previousCh; + const strBuf = this.strBuf; + strBuf.length = 0; + while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { + if (ch === 0x23) { + ch = this.nextChar(); + if (specialChars[ch]) { + warn("Lexer_getName: " + "NUMBER SIGN (#) should be followed by a hexadecimal number."); + strBuf.push("#"); + break; } - if (valid) { - privateDictToUse = fdArray[fdIndex].privateDict; - localSubrToUse = privateDictToUse.subrsIndex; + const x = toHexDigit(ch); + if (x !== -1) { + previousCh = ch; + ch = this.nextChar(); + const x2 = toHexDigit(ch); + if (x2 === -1) { + warn(`Lexer_getName: Illegal digit (${String.fromCharCode(ch)}) ` + "in hexadecimal number."); + strBuf.push("#", String.fromCharCode(previousCh)); + if (specialChars[ch]) { + break; + } + strBuf.push(String.fromCharCode(ch)); + continue; + } + strBuf.push(String.fromCharCode(x << 4 | x2)); + } else { + strBuf.push("#", String.fromCharCode(ch)); } - } else if (localSubrIndex) { - localSubrToUse = localSubrIndex; - } - if (valid) { - valid = this.parseCharString(state, charstring, localSubrToUse, globalSubrIndex); - } - if (state.width !== null) { - const nominalWidth = privateDictToUse.getByName("nominalWidthX"); - widths[i] = nominalWidth + state.width; } else { - const defaultWidth = privateDictToUse.getByName("defaultWidthX"); - widths[i] = defaultWidth; - } - if (state.seac !== null) { - seacs[i] = state.seac; - } - if (!valid) { - charStrings.set(i, new Uint8Array([14])); + strBuf.push(String.fromCharCode(ch)); } } - return { - charStrings, - seacs, - widths - }; - } - emptyPrivateDictionary(parentDict) { - const privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings); - parentDict.setByKey(18, [0, 0]); - parentDict.privateDict = privateDict; - } - parsePrivateDict(parentDict) { - if (!parentDict.hasName("Private")) { - this.emptyPrivateDictionary(parentDict); - return; - } - const privateOffset = parentDict.getByName("Private"); - if (!Array.isArray(privateOffset) || privateOffset.length !== 2) { - parentDict.removeByName("Private"); - return; - } - const size = privateOffset[0]; - const offset = privateOffset[1]; - if (size === 0 || offset >= this.bytes.length) { - this.emptyPrivateDictionary(parentDict); - return; - } - const privateDictEnd = offset + size; - const dictData = this.bytes.subarray(offset, privateDictEnd); - const dict = this.parseDict(dictData); - const privateDict = this.createDict(CFFPrivateDict, dict, parentDict.strings); - parentDict.privateDict = privateDict; - if (privateDict.getByName("ExpansionFactor") === 0) { - privateDict.setByName("ExpansionFactor", 0.06); + if (strBuf.length > 127) { + warn(`Name token is longer than allowed by the spec: ${strBuf.length}`); } - if (!privateDict.getByName("Subrs")) { + return Name.get(strBuf.join("")); + } + _hexStringWarn(ch) { + const MAX_HEX_STRING_NUM_WARN = 5; + if (this._hexStringNumWarn++ === MAX_HEX_STRING_NUM_WARN) { + warn("getHexString - ignoring additional invalid characters."); return; } - const subrsOffset = privateDict.getByName("Subrs"); - const relativeOffset = offset + subrsOffset; - if (subrsOffset === 0 || relativeOffset >= this.bytes.length) { - this.emptyPrivateDictionary(parentDict); + if (this._hexStringNumWarn > MAX_HEX_STRING_NUM_WARN) { return; } - const subrsIndex = this.parseIndex(relativeOffset); - privateDict.subrsIndex = subrsIndex.obj; + warn(`getHexString - ignoring invalid character: ${ch}`); } - parseCharsets(pos, length, strings, cid) { - if (pos === 0) { - return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, ISOAdobeCharset); - } else if (pos === 1) { - return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, ExpertCharset); - } else if (pos === 2) { - return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, ExpertSubsetCharset); - } - const bytes = this.bytes; - const start = pos; - const format = bytes[pos++]; - const charset = [cid ? 0 : ".notdef"]; - let id, count, i; - length -= 1; - switch (format) { - case 0: - for (i = 0; i < length; i++) { - id = bytes[pos++] << 8 | bytes[pos++]; - charset.push(cid ? id : strings.get(id)); - } + getHexString() { + const strBuf = this.strBuf; + strBuf.length = 0; + let ch = this.currentChar; + let firstDigit = -1, + digit = -1; + this._hexStringNumWarn = 0; + while (true) { + if (ch < 0) { + warn("Unterminated hex string"); break; - case 1: - while (charset.length <= length) { - id = bytes[pos++] << 8 | bytes[pos++]; - count = bytes[pos++]; - for (i = 0; i <= count; i++) { - charset.push(cid ? id++ : strings.get(id++)); - } - } + } else if (ch === 0x3e) { + this.nextChar(); break; - case 2: - while (charset.length <= length) { - id = bytes[pos++] << 8 | bytes[pos++]; - count = bytes[pos++] << 8 | bytes[pos++]; - for (i = 0; i <= count; i++) { - charset.push(cid ? id++ : strings.get(id++)); - } + } else if (specialChars[ch] === 1) { + ch = this.nextChar(); + continue; + } else { + digit = toHexDigit(ch); + if (digit === -1) { + this._hexStringWarn(ch); + } else if (firstDigit === -1) { + firstDigit = digit; + } else { + strBuf.push(String.fromCharCode(firstDigit << 4 | digit)); + firstDigit = -1; } - break; - default: - throw new FormatError("Unknown charset format"); + ch = this.nextChar(); + } } - const end = pos; - const raw = bytes.subarray(start, end); - return new CFFCharset(false, format, charset, raw); + if (firstDigit !== -1) { + strBuf.push(String.fromCharCode(firstDigit << 4)); + } + return strBuf.join(""); } - parseEncoding(pos, properties, strings, charset) { - const encoding = Object.create(null); - const bytes = this.bytes; - let predefined = false; - let format, i, ii; - let raw = null; - function readSupplement() { - const supplementsCount = bytes[pos++]; - for (i = 0; i < supplementsCount; i++) { - const code = bytes[pos++]; - const sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff); - encoding[code] = charset.indexOf(strings.get(sid)); + getObj() { + let comment = false; + let ch = this.currentChar; + while (true) { + if (ch < 0) { + return EOF; + } + if (comment) { + if (ch === 0x0a || ch === 0x0d) { + comment = false; + } + } else if (ch === 0x25) { + comment = true; + } else if (specialChars[ch] !== 1) { + break; } + ch = this.nextChar(); } - if (pos === 0 || pos === 1) { - predefined = true; - format = pos; - const baseEncoding = pos ? ExpertEncoding : StandardEncoding; - for (i = 0, ii = charset.length; i < ii; i++) { - const index = baseEncoding.indexOf(charset[i]); - if (index !== -1) { - encoding[index] = i; + switch (ch | 0) { + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x2b: + case 0x2d: + case 0x2e: + return this.getNumber(); + case 0x28: + return this.getString(); + case 0x2f: + return this.getName(); + case 0x5b: + this.nextChar(); + return Cmd.get("["); + case 0x5d: + this.nextChar(); + return Cmd.get("]"); + case 0x3c: + ch = this.nextChar(); + if (ch === 0x3c) { + this.nextChar(); + return Cmd.get("<<"); + } + return this.getHexString(); + case 0x3e: + ch = this.nextChar(); + if (ch === 0x3e) { + this.nextChar(); + return Cmd.get(">>"); } + return Cmd.get(">"); + case 0x7b: + this.nextChar(); + return Cmd.get("{"); + case 0x7d: + this.nextChar(); + return Cmd.get("}"); + case 0x29: + this.nextChar(); + throw new FormatError(`Illegal character: ${ch}`); + } + let str = String.fromCharCode(ch); + if (ch < 0x20 || ch > 0x7f) { + const nextCh = this.peekChar(); + if (nextCh >= 0x20 && nextCh <= 0x7f) { + this.nextChar(); + return Cmd.get(str); } - } else { - const dataStart = pos; - format = bytes[pos++]; - switch (format & 0x7f) { - case 0: - const glyphsCount = bytes[pos++]; - for (i = 1; i <= glyphsCount; i++) { - encoding[bytes[pos++]] = i; - } - break; - case 1: - const rangesCount = bytes[pos++]; - let gid = 1; - for (i = 0; i < rangesCount; i++) { - const start = bytes[pos++]; - const left = bytes[pos++]; - for (let j = start; j <= start + left; j++) { - encoding[j] = gid++; - } - } - break; - default: - throw new FormatError(`Unknown encoding format: ${format} in CFF`); + } + const knownCommands = this.knownCommands; + let knownCommandFound = knownCommands?.[str] !== undefined; + while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { + const possibleCommand = str + String.fromCharCode(ch); + if (knownCommandFound && knownCommands[possibleCommand] === undefined) { + break; } - const dataEnd = pos; - if (format & 0x80) { - bytes[dataStart] &= 0x7f; - readSupplement(); + if (str.length === 128) { + throw new FormatError(`Command token too long: ${str.length}`); } - raw = bytes.subarray(dataStart, dataEnd); + str = possibleCommand; + knownCommandFound = knownCommands?.[str] !== undefined; } - format &= 0x7f; - return new CFFEncoding(predefined, format, encoding, raw); + if (str === "true") { + return true; + } + if (str === "false") { + return false; + } + if (str === "null") { + return null; + } + if (str === "BI") { + this.beginInlineImagePos = this.stream.pos; + } + return Cmd.get(str); } - parseFDSelect(pos, length) { - const bytes = this.bytes; - const format = bytes[pos++]; - const fdSelect = []; - let i; - switch (format) { - case 0: - for (i = 0; i < length; ++i) { - const id = bytes[pos++]; - fdSelect.push(id); + skipToNextLine() { + let ch = this.currentChar; + while (ch >= 0) { + if (ch === 0x0d) { + ch = this.nextChar(); + if (ch === 0x0a) { + this.nextChar(); } break; - case 3: - const rangesCount = bytes[pos++] << 8 | bytes[pos++]; - for (i = 0; i < rangesCount; ++i) { - let first = bytes[pos++] << 8 | bytes[pos++]; - if (i === 0 && first !== 0) { - warn("parseFDSelect: The first range must have a first GID of 0" + " -- trying to recover."); - first = 0; - } - const fdIndex = bytes[pos++]; - const next = bytes[pos] << 8 | bytes[pos + 1]; - for (let j = first; j < next; ++j) { - fdSelect.push(fdIndex); - } - } - pos += 2; + } else if (ch === 0x0a) { + this.nextChar(); break; - default: - throw new FormatError(`parseFDSelect: Unknown format "${format}".`); - } - if (fdSelect.length !== length) { - throw new FormatError("parseFDSelect: Invalid font data."); + } + ch = this.nextChar(); } - return new CFFFDSelect(format, fdSelect); } } -class CFF { - constructor() { - this.header = null; - this.names = []; - this.topDict = null; - this.strings = new CFFStrings(); - this.globalSubrIndex = null; - this.encoding = null; - this.charset = null; - this.charStrings = null; - this.fdArray = []; - this.fdSelect = null; - this.isCIDFont = false; - } - duplicateFirstGlyph() { - if (this.charStrings.count >= 65535) { - warn("Not enough space in charstrings to duplicate first glyph."); - return; +class Linearization { + static create(stream) { + function getInt(linDict, name, allowZeroValue = false) { + const obj = linDict.get(name); + if (Number.isInteger(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) { + return obj; + } + throw new Error(`The "${name}" parameter in the linearization ` + "dictionary is invalid."); } - const glyphZero = this.charStrings.get(0); - this.charStrings.add(glyphZero); - if (this.isCIDFont) { - this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]); + function getHints(linDict) { + const hints = linDict.get("H"); + let hintsLength; + if (Array.isArray(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) { + for (let index = 0; index < hintsLength; index++) { + const hint = hints[index]; + if (!(Number.isInteger(hint) && hint > 0)) { + throw new Error(`Hint (${index}) in the linearization dictionary is invalid.`); + } + } + return hints; + } + throw new Error("Hint array in the linearization dictionary is invalid."); } - } - hasGlyphId(id) { - if (id < 0 || id >= this.charStrings.count) { - return false; + const parser = new Parser({ + lexer: new Lexer(stream), + xref: null + }); + const obj1 = parser.getObj(); + const obj2 = parser.getObj(); + const obj3 = parser.getObj(); + const linDict = parser.getObj(); + let obj, length; + if (!(Number.isInteger(obj1) && Number.isInteger(obj2) && isCmd(obj3, "obj") && linDict instanceof Dict && typeof (obj = linDict.get("Linearized")) === "number" && obj > 0)) { + return null; + } else if ((length = getInt(linDict, "L")) !== stream.length) { + throw new Error('The "L" parameter in the linearization dictionary ' + "does not equal the stream length."); } - const glyph = this.charStrings.get(id); - return glyph.length > 0; + return { + length, + hints: getHints(linDict), + objectNumberFirst: getInt(linDict, "O"), + endFirst: getInt(linDict, "E"), + numPages: getInt(linDict, "N"), + mainXRefEntriesOffset: getInt(linDict, "T"), + pageFirst: linDict.has("P") ? getInt(linDict, "P", true) : 0 + }; } } -class CFFHeader { - constructor(major, minor, hdrSize, offSize) { - this.major = major; - this.minor = minor; - this.hdrSize = hdrSize; - this.offSize = offSize; + +;// ./src/core/cmap.js + + + + + + + +const BUILT_IN_CMAPS = ["Adobe-GB1-UCS2", "Adobe-CNS1-UCS2", "Adobe-Japan1-UCS2", "Adobe-Korea1-UCS2", "78-EUC-H", "78-EUC-V", "78-H", "78-RKSJ-H", "78-RKSJ-V", "78-V", "78ms-RKSJ-H", "78ms-RKSJ-V", "83pv-RKSJ-H", "90ms-RKSJ-H", "90ms-RKSJ-V", "90msp-RKSJ-H", "90msp-RKSJ-V", "90pv-RKSJ-H", "90pv-RKSJ-V", "Add-H", "Add-RKSJ-H", "Add-RKSJ-V", "Add-V", "Adobe-CNS1-0", "Adobe-CNS1-1", "Adobe-CNS1-2", "Adobe-CNS1-3", "Adobe-CNS1-4", "Adobe-CNS1-5", "Adobe-CNS1-6", "Adobe-GB1-0", "Adobe-GB1-1", "Adobe-GB1-2", "Adobe-GB1-3", "Adobe-GB1-4", "Adobe-GB1-5", "Adobe-Japan1-0", "Adobe-Japan1-1", "Adobe-Japan1-2", "Adobe-Japan1-3", "Adobe-Japan1-4", "Adobe-Japan1-5", "Adobe-Japan1-6", "Adobe-Korea1-0", "Adobe-Korea1-1", "Adobe-Korea1-2", "B5-H", "B5-V", "B5pc-H", "B5pc-V", "CNS-EUC-H", "CNS-EUC-V", "CNS1-H", "CNS1-V", "CNS2-H", "CNS2-V", "ETHK-B5-H", "ETHK-B5-V", "ETen-B5-H", "ETen-B5-V", "ETenms-B5-H", "ETenms-B5-V", "EUC-H", "EUC-V", "Ext-H", "Ext-RKSJ-H", "Ext-RKSJ-V", "Ext-V", "GB-EUC-H", "GB-EUC-V", "GB-H", "GB-V", "GBK-EUC-H", "GBK-EUC-V", "GBK2K-H", "GBK2K-V", "GBKp-EUC-H", "GBKp-EUC-V", "GBT-EUC-H", "GBT-EUC-V", "GBT-H", "GBT-V", "GBTpc-EUC-H", "GBTpc-EUC-V", "GBpc-EUC-H", "GBpc-EUC-V", "H", "HKdla-B5-H", "HKdla-B5-V", "HKdlb-B5-H", "HKdlb-B5-V", "HKgccs-B5-H", "HKgccs-B5-V", "HKm314-B5-H", "HKm314-B5-V", "HKm471-B5-H", "HKm471-B5-V", "HKscs-B5-H", "HKscs-B5-V", "Hankaku", "Hiragana", "KSC-EUC-H", "KSC-EUC-V", "KSC-H", "KSC-Johab-H", "KSC-Johab-V", "KSC-V", "KSCms-UHC-H", "KSCms-UHC-HW-H", "KSCms-UHC-HW-V", "KSCms-UHC-V", "KSCpc-EUC-H", "KSCpc-EUC-V", "Katakana", "NWP-H", "NWP-V", "RKSJ-H", "RKSJ-V", "Roman", "UniCNS-UCS2-H", "UniCNS-UCS2-V", "UniCNS-UTF16-H", "UniCNS-UTF16-V", "UniCNS-UTF32-H", "UniCNS-UTF32-V", "UniCNS-UTF8-H", "UniCNS-UTF8-V", "UniGB-UCS2-H", "UniGB-UCS2-V", "UniGB-UTF16-H", "UniGB-UTF16-V", "UniGB-UTF32-H", "UniGB-UTF32-V", "UniGB-UTF8-H", "UniGB-UTF8-V", "UniJIS-UCS2-H", "UniJIS-UCS2-HW-H", "UniJIS-UCS2-HW-V", "UniJIS-UCS2-V", "UniJIS-UTF16-H", "UniJIS-UTF16-V", "UniJIS-UTF32-H", "UniJIS-UTF32-V", "UniJIS-UTF8-H", "UniJIS-UTF8-V", "UniJIS2004-UTF16-H", "UniJIS2004-UTF16-V", "UniJIS2004-UTF32-H", "UniJIS2004-UTF32-V", "UniJIS2004-UTF8-H", "UniJIS2004-UTF8-V", "UniJISPro-UCS2-HW-V", "UniJISPro-UCS2-V", "UniJISPro-UTF8-V", "UniJISX0213-UTF32-H", "UniJISX0213-UTF32-V", "UniJISX02132004-UTF32-H", "UniJISX02132004-UTF32-V", "UniKS-UCS2-H", "UniKS-UCS2-V", "UniKS-UTF16-H", "UniKS-UTF16-V", "UniKS-UTF32-H", "UniKS-UTF32-V", "UniKS-UTF8-H", "UniKS-UTF8-V", "V", "WP-Symbol"]; +const MAX_MAP_RANGE = 2 ** 24 - 1; +class CMap { + constructor(builtInCMap = false) { + this.codespaceRanges = [[], [], [], []]; + this.numCodespaceRanges = 0; + this._map = []; + this.name = ""; + this.vertical = false; + this.useCMap = null; + this.builtInCMap = builtInCMap; } -} -class CFFStrings { - constructor() { - this.strings = []; + addCodespaceRange(n, low, high) { + this.codespaceRanges[n - 1].push(low, high); + this.numCodespaceRanges++; } - get(index) { - if (index >= 0 && index <= NUM_STANDARD_CFF_STRINGS - 1) { - return CFFStandardStrings[index]; + mapCidRange(low, high, dstLow) { + if (high - low > MAX_MAP_RANGE) { + throw new Error("mapCidRange - ignoring data above MAX_MAP_RANGE."); } - if (index - NUM_STANDARD_CFF_STRINGS <= this.strings.length) { - return this.strings[index - NUM_STANDARD_CFF_STRINGS]; + while (low <= high) { + this._map[low++] = dstLow++; } - return CFFStandardStrings[0]; } - getSID(str) { - let index = CFFStandardStrings.indexOf(str); - if (index !== -1) { - return index; + mapBfRange(low, high, dstLow) { + if (high - low > MAX_MAP_RANGE) { + throw new Error("mapBfRange - ignoring data above MAX_MAP_RANGE."); } - index = this.strings.indexOf(str); - if (index !== -1) { - return index + NUM_STANDARD_CFF_STRINGS; + const lastByte = dstLow.length - 1; + while (low <= high) { + this._map[low++] = dstLow; + const nextCharCode = dstLow.charCodeAt(lastByte) + 1; + if (nextCharCode > 0xff) { + dstLow = dstLow.substring(0, lastByte - 1) + String.fromCharCode(dstLow.charCodeAt(lastByte - 1) + 1) + "\x00"; + continue; + } + dstLow = dstLow.substring(0, lastByte) + String.fromCharCode(nextCharCode); } - return -1; } - add(value) { - this.strings.push(value); + mapBfRangeToArray(low, high, array) { + if (high - low > MAX_MAP_RANGE) { + throw new Error("mapBfRangeToArray - ignoring data above MAX_MAP_RANGE."); + } + const ii = array.length; + let i = 0; + while (low <= high && i < ii) { + this._map[low] = array[i++]; + ++low; + } } - get count() { - return this.strings.length; + mapOne(src, dst) { + this._map[src] = dst; } -} -class CFFIndex { - constructor() { - this.objects = []; - this.length = 0; + lookup(code) { + return this._map[code]; } - add(data) { - this.length += data.length; - this.objects.push(data); + contains(code) { + return this._map[code] !== undefined; } - set(index, data) { - this.length += data.length - this.objects[index].length; - this.objects[index] = data; + forEach(callback) { + const map = this._map; + const length = map.length; + if (length <= 0x10000) { + for (let i = 0; i < length; i++) { + if (map[i] !== undefined) { + callback(i, map[i]); + } + } + } else { + for (const i in map) { + callback(i, map[i]); + } + } } - get(index) { - return this.objects[index]; + charCodeOf(value) { + const map = this._map; + if (map.length <= 0x10000) { + return map.indexOf(value); + } + for (const charCode in map) { + if (map[charCode] === value) { + return charCode | 0; + } + } + return -1; } - get count() { - return this.objects.length; + getMap() { + return this._map; } -} -class CFFDict { - constructor(tables, strings) { - this.keyToNameMap = tables.keyToNameMap; - this.nameToKeyMap = tables.nameToKeyMap; - this.defaults = tables.defaults; - this.types = tables.types; - this.opcodes = tables.opcodes; - this.order = tables.order; - this.strings = strings; - this.values = Object.create(null); + readCharCode(str, offset, out) { + let c = 0; + const codespaceRanges = this.codespaceRanges; + for (let n = 0, nn = codespaceRanges.length; n < nn; n++) { + c = (c << 8 | str.charCodeAt(offset + n)) >>> 0; + const codespaceRange = codespaceRanges[n]; + for (let k = 0, kk = codespaceRange.length; k < kk;) { + const low = codespaceRange[k++]; + const high = codespaceRange[k++]; + if (c >= low && c <= high) { + out.charcode = c; + out.length = n + 1; + return; + } + } + } + out.charcode = 0; + out.length = 1; } - setByKey(key, value) { - if (!(key in this.keyToNameMap)) { + getCharCodeLength(charCode) { + const codespaceRanges = this.codespaceRanges; + for (let n = 0, nn = codespaceRanges.length; n < nn; n++) { + const codespaceRange = codespaceRanges[n]; + for (let k = 0, kk = codespaceRange.length; k < kk;) { + const low = codespaceRange[k++]; + const high = codespaceRange[k++]; + if (charCode >= low && charCode <= high) { + return n + 1; + } + } + } + return 1; + } + get length() { + return this._map.length; + } + get isIdentityCMap() { + if (!(this.name === "Identity-H" || this.name === "Identity-V")) { return false; } - if (value.length === 0) { - return true; + if (this._map.length !== 0x10000) { + return false; } - for (const val of value) { - if (isNaN(val)) { - warn(`Invalid CFFDict value: "${value}" for key "${key}".`); - return true; + for (let i = 0; i < 0x10000; i++) { + if (this._map[i] !== i) { + return false; } } - const type = this.types[key]; - if (type === "num" || type === "sid" || type === "offset") { - value = value[0]; - } - this.values[key] = value; return true; } - setByName(name, value) { - if (!(name in this.nameToKeyMap)) { - throw new FormatError(`Invalid dictionary name "${name}"`); - } - this.values[this.nameToKeyMap[name]] = value; +} +class IdentityCMap extends CMap { + constructor(vertical, n) { + super(); + this.vertical = vertical; + this.addCodespaceRange(n, 0, 0xffff); } - hasName(name) { - return this.nameToKeyMap[name] in this.values; + mapCidRange(low, high, dstLow) { + unreachable("should not call mapCidRange"); } - getByName(name) { - if (!(name in this.nameToKeyMap)) { - throw new FormatError(`Invalid dictionary name ${name}"`); - } - const key = this.nameToKeyMap[name]; - if (!(key in this.values)) { - return this.defaults[key]; - } - return this.values[key]; + mapBfRange(low, high, dstLow) { + unreachable("should not call mapBfRange"); } - removeByName(name) { - delete this.values[this.nameToKeyMap[name]]; + mapBfRangeToArray(low, high, array) { + unreachable("should not call mapBfRangeToArray"); } - static createTables(layout) { - const tables = { - keyToNameMap: {}, - nameToKeyMap: {}, - defaults: {}, - types: {}, - opcodes: {}, - order: [] - }; - for (const entry of layout) { - const key = Array.isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0]; - tables.keyToNameMap[key] = entry[1]; - tables.nameToKeyMap[entry[1]] = key; - tables.types[key] = entry[2]; - tables.defaults[key] = entry[3]; - tables.opcodes[key] = Array.isArray(entry[0]) ? entry[0] : [entry[0]]; - tables.order.push(key); + mapOne(src, dst) { + unreachable("should not call mapCidOne"); + } + lookup(code) { + return Number.isInteger(code) && code <= 0xffff ? code : undefined; + } + contains(code) { + return Number.isInteger(code) && code <= 0xffff; + } + forEach(callback) { + for (let i = 0; i <= 0xffff; i++) { + callback(i, i); } - return tables; } -} -const CFFTopDictLayout = [[[12, 30], "ROS", ["sid", "sid", "num"], null], [[12, 20], "SyntheticBase", "num", null], [0, "version", "sid", null], [1, "Notice", "sid", null], [[12, 0], "Copyright", "sid", null], [2, "FullName", "sid", null], [3, "FamilyName", "sid", null], [4, "Weight", "sid", null], [[12, 1], "isFixedPitch", "num", 0], [[12, 2], "ItalicAngle", "num", 0], [[12, 3], "UnderlinePosition", "num", -100], [[12, 4], "UnderlineThickness", "num", 50], [[12, 5], "PaintType", "num", 0], [[12, 6], "CharstringType", "num", 2], [[12, 7], "FontMatrix", ["num", "num", "num", "num", "num", "num"], [0.001, 0, 0, 0.001, 0, 0]], [13, "UniqueID", "num", null], [5, "FontBBox", ["num", "num", "num", "num"], [0, 0, 0, 0]], [[12, 8], "StrokeWidth", "num", 0], [14, "XUID", "array", null], [15, "charset", "offset", 0], [16, "Encoding", "offset", 0], [17, "CharStrings", "offset", 0], [18, "Private", ["offset", "offset"], null], [[12, 21], "PostScript", "sid", null], [[12, 22], "BaseFontName", "sid", null], [[12, 23], "BaseFontBlend", "delta", null], [[12, 31], "CIDFontVersion", "num", 0], [[12, 32], "CIDFontRevision", "num", 0], [[12, 33], "CIDFontType", "num", 0], [[12, 34], "CIDCount", "num", 8720], [[12, 35], "UIDBase", "num", null], [[12, 37], "FDSelect", "offset", null], [[12, 36], "FDArray", "offset", null], [[12, 38], "FontName", "sid", null]]; -class CFFTopDict extends CFFDict { - static get tables() { - return shadow(this, "tables", this.createTables(CFFTopDictLayout)); + charCodeOf(value) { + return Number.isInteger(value) && value <= 0xffff ? value : -1; } - constructor(strings) { - super(CFFTopDict.tables, strings); - this.privateDict = null; + getMap() { + const map = new Array(0x10000); + for (let i = 0; i <= 0xffff; i++) { + map[i] = i; + } + return map; } -} -const CFFPrivateDictLayout = [[6, "BlueValues", "delta", null], [7, "OtherBlues", "delta", null], [8, "FamilyBlues", "delta", null], [9, "FamilyOtherBlues", "delta", null], [[12, 9], "BlueScale", "num", 0.039625], [[12, 10], "BlueShift", "num", 7], [[12, 11], "BlueFuzz", "num", 1], [10, "StdHW", "num", null], [11, "StdVW", "num", null], [[12, 12], "StemSnapH", "delta", null], [[12, 13], "StemSnapV", "delta", null], [[12, 14], "ForceBold", "num", 0], [[12, 17], "LanguageGroup", "num", 0], [[12, 18], "ExpansionFactor", "num", 0.06], [[12, 19], "initialRandomSeed", "num", 0], [20, "defaultWidthX", "num", 0], [21, "nominalWidthX", "num", 0], [19, "Subrs", "offset", null]]; -class CFFPrivateDict extends CFFDict { - static get tables() { - return shadow(this, "tables", this.createTables(CFFPrivateDictLayout)); + get length() { + return 0x10000; } - constructor(strings) { - super(CFFPrivateDict.tables, strings); - this.subrsIndex = null; + get isIdentityCMap() { + unreachable("should not access .isIdentityCMap"); } } -const CFFCharsetPredefinedTypes = { - ISO_ADOBE: 0, - EXPERT: 1, - EXPERT_SUBSET: 2 -}; -class CFFCharset { - constructor(predefined, format, charset, raw) { - this.predefined = predefined; - this.format = format; - this.charset = charset; - this.raw = raw; +function strToInt(str) { + let a = 0; + for (let i = 0; i < str.length; i++) { + a = a << 8 | str.charCodeAt(i); } + return a >>> 0; } -class CFFEncoding { - constructor(predefined, format, encoding, raw) { - this.predefined = predefined; - this.format = format; - this.encoding = encoding; - this.raw = raw; +function expectString(obj) { + if (typeof obj !== "string") { + throw new FormatError("Malformed CMap: expected string."); } } -class CFFFDSelect { - constructor(format, fdSelect) { - this.format = format; - this.fdSelect = fdSelect; - } - getFDIndex(glyphIndex) { - if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) { - return -1; - } - return this.fdSelect[glyphIndex]; +function expectInt(obj) { + if (!Number.isInteger(obj)) { + throw new FormatError("Malformed CMap: expected int."); } } -class CFFOffsetTracker { - constructor() { - this.offsets = Object.create(null); - } - isTracking(key) { - return key in this.offsets; - } - track(key, location) { - if (key in this.offsets) { - throw new FormatError(`Already tracking location of ${key}`); +function parseBfChar(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; } - this.offsets[key] = location; - } - offset(value) { - for (const key in this.offsets) { - this.offsets[key] += value; + if (isCmd(obj, "endbfchar")) { + return; } + expectString(obj); + const src = strToInt(obj); + obj = lexer.getObj(); + expectString(obj); + const dst = obj; + cMap.mapOne(src, dst); } - setEntryLocation(key, values, output) { - if (!(key in this.offsets)) { - throw new FormatError(`Not tracking location of ${key}`); +} +function parseBfRange(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; } - const data = output.data; - const dataOffset = this.offsets[key]; - const size = 5; - for (let i = 0, ii = values.length; i < ii; ++i) { - const offset0 = i * size + dataOffset; - const offset1 = offset0 + 1; - const offset2 = offset0 + 2; - const offset3 = offset0 + 3; - const offset4 = offset0 + 4; - if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) { - throw new FormatError("writing to an offset that is not empty"); + if (isCmd(obj, "endbfrange")) { + return; + } + expectString(obj); + const low = strToInt(obj); + obj = lexer.getObj(); + expectString(obj); + const high = strToInt(obj); + obj = lexer.getObj(); + if (Number.isInteger(obj) || typeof obj === "string") { + const dstLow = Number.isInteger(obj) ? String.fromCharCode(obj) : obj; + cMap.mapBfRange(low, high, dstLow); + } else if (isCmd(obj, "[")) { + obj = lexer.getObj(); + const array = []; + while (!isCmd(obj, "]") && obj !== EOF) { + array.push(obj); + obj = lexer.getObj(); } - const value = values[i]; - data[offset0] = 0x1d; - data[offset1] = value >> 24 & 0xff; - data[offset2] = value >> 16 & 0xff; - data[offset3] = value >> 8 & 0xff; - data[offset4] = value & 0xff; + cMap.mapBfRangeToArray(low, high, array); + } else { + break; } } + throw new FormatError("Invalid bf range."); } -class CFFCompiler { - constructor(cff) { - this.cff = cff; - } - compile() { - const cff = this.cff; - const output = { - data: [], - length: 0, - add(data) { - try { - this.data.push(...data); - } catch { - this.data = this.data.concat(data); - } - this.length = this.data.length; - } - }; - const header = this.compileHeader(cff.header); - output.add(header); - const nameIndex = this.compileNameIndex(cff.names); - output.add(nameIndex); - if (cff.isCIDFont) { - if (cff.topDict.hasName("FontMatrix")) { - const base = cff.topDict.getByName("FontMatrix"); - cff.topDict.removeByName("FontMatrix"); - for (const subDict of cff.fdArray) { - let matrix = base.slice(0); - if (subDict.hasName("FontMatrix")) { - matrix = Util.transform(matrix, subDict.getByName("FontMatrix")); - } - subDict.setByName("FontMatrix", matrix); - } - } +function parseCidChar(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; } - const xuid = cff.topDict.getByName("XUID"); - if (xuid?.length > 16) { - cff.topDict.removeByName("XUID"); + if (isCmd(obj, "endcidchar")) { + return; } - cff.topDict.setByName("charset", 0); - let compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont); - output.add(compiled.output); - const topDictTracker = compiled.trackers[0]; - const stringIndex = this.compileStringIndex(cff.strings.strings); - output.add(stringIndex); - const globalSubrIndex = this.compileIndex(cff.globalSubrIndex); - output.add(globalSubrIndex); - if (cff.encoding && cff.topDict.hasName("Encoding")) { - if (cff.encoding.predefined) { - topDictTracker.setEntryLocation("Encoding", [cff.encoding.format], output); - } else { - const encoding = this.compileEncoding(cff.encoding); - topDictTracker.setEntryLocation("Encoding", [output.length], output); - output.add(encoding); - } + expectString(obj); + const src = strToInt(obj); + obj = lexer.getObj(); + expectInt(obj); + const dst = obj; + cMap.mapOne(src, dst); + } +} +function parseCidRange(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; } - const charset = this.compileCharset(cff.charset, cff.charStrings.count, cff.strings, cff.isCIDFont); - topDictTracker.setEntryLocation("charset", [output.length], output); - output.add(charset); - const charStrings = this.compileCharStrings(cff.charStrings); - topDictTracker.setEntryLocation("CharStrings", [output.length], output); - output.add(charStrings); - if (cff.isCIDFont) { - topDictTracker.setEntryLocation("FDSelect", [output.length], output); - const fdSelect = this.compileFDSelect(cff.fdSelect); - output.add(fdSelect); - compiled = this.compileTopDicts(cff.fdArray, output.length, true); - topDictTracker.setEntryLocation("FDArray", [output.length], output); - output.add(compiled.output); - const fontDictTrackers = compiled.trackers; - this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output); + if (isCmd(obj, "endcidrange")) { + return; } - this.compilePrivateDicts([cff.topDict], [topDictTracker], output); - output.add([0]); - return output.data; + expectString(obj); + const low = strToInt(obj); + obj = lexer.getObj(); + expectString(obj); + const high = strToInt(obj); + obj = lexer.getObj(); + expectInt(obj); + const dstLow = obj; + cMap.mapCidRange(low, high, dstLow); } - encodeNumber(value) { - if (Number.isInteger(value)) { - return this.encodeInteger(value); +} +function parseCodespaceRange(cMap, lexer) { + while (true) { + let obj = lexer.getObj(); + if (obj === EOF) { + break; } - return this.encodeFloat(value); - } - static get EncodeFloatRegExp() { - return shadow(this, "EncodeFloatRegExp", /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/); - } - encodeFloat(num) { - let value = num.toString(); - const m = CFFCompiler.EncodeFloatRegExp.exec(value); - if (m) { - const epsilon = parseFloat("1e" + ((m[2] ? +m[2] : 0) + m[1].length)); - value = (Math.round(num * epsilon) / epsilon).toString(); + if (isCmd(obj, "endcodespacerange")) { + return; } - let nibbles = ""; - let i, ii; - for (i = 0, ii = value.length; i < ii; ++i) { - const a = value[i]; - if (a === "e") { - nibbles += value[++i] === "-" ? "c" : "b"; - } else if (a === ".") { - nibbles += "a"; - } else if (a === "-") { - nibbles += "e"; - } else { - nibbles += a; - } + if (typeof obj !== "string") { + break; } - nibbles += nibbles.length & 1 ? "f" : "ff"; - const out = [30]; - for (i = 0, ii = nibbles.length; i < ii; i += 2) { - out.push(parseInt(nibbles.substring(i, i + 2), 16)); + const low = strToInt(obj); + obj = lexer.getObj(); + if (typeof obj !== "string") { + break; } - return out; + const high = strToInt(obj); + cMap.addCodespaceRange(obj.length, low, high); } - encodeInteger(value) { - let code; - if (value >= -107 && value <= 107) { - code = [value + 139]; - } else if (value >= 108 && value <= 1131) { - value -= 108; - code = [(value >> 8) + 247, value & 0xff]; - } else if (value >= -1131 && value <= -108) { - value = -value - 108; - code = [(value >> 8) + 251, value & 0xff]; - } else if (value >= -32768 && value <= 32767) { - code = [0x1c, value >> 8 & 0xff, value & 0xff]; - } else { - code = [0x1d, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff]; - } - return code; + throw new FormatError("Invalid codespace range."); +} +function parseWMode(cMap, lexer) { + const obj = lexer.getObj(); + if (Number.isInteger(obj)) { + cMap.vertical = !!obj; } - compileHeader(header) { - return [header.major, header.minor, 4, header.offSize]; +} +function parseCMapName(cMap, lexer) { + const obj = lexer.getObj(); + if (obj instanceof Name) { + cMap.name = obj.name; } - compileNameIndex(names) { - const nameIndex = new CFFIndex(); - for (const name of names) { - const length = Math.min(name.length, 127); - let sanitizedName = new Array(length); - for (let j = 0; j < length; j++) { - let char = name[j]; - if (char < "!" || char > "~" || char === "[" || char === "]" || char === "(" || char === ")" || char === "{" || char === "}" || char === "<" || char === ">" || char === "/" || char === "%") { - char = "_"; +} +async function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) { + let previous, embeddedUseCMap; + objLoop: while (true) { + try { + const obj = lexer.getObj(); + if (obj === EOF) { + break; + } else if (obj instanceof Name) { + if (obj.name === "WMode") { + parseWMode(cMap, lexer); + } else if (obj.name === "CMapName") { + parseCMapName(cMap, lexer); } - sanitizedName[j] = char; - } - sanitizedName = sanitizedName.join(""); - if (sanitizedName === "") { - sanitizedName = "Bad_Font_Name"; - } - nameIndex.add(stringToBytes(sanitizedName)); - } - return this.compileIndex(nameIndex); - } - compileTopDicts(dicts, length, removeCidKeys) { - const fontDictTrackers = []; - let fdArrayIndex = new CFFIndex(); - for (const fontDict of dicts) { - if (removeCidKeys) { - fontDict.removeByName("CIDFontVersion"); - fontDict.removeByName("CIDFontRevision"); - fontDict.removeByName("CIDFontType"); - fontDict.removeByName("CIDCount"); - fontDict.removeByName("UIDBase"); - } - const fontDictTracker = new CFFOffsetTracker(); - const fontDictData = this.compileDict(fontDict, fontDictTracker); - fontDictTrackers.push(fontDictTracker); - fdArrayIndex.add(fontDictData); - fontDictTracker.offset(length); - } - fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers); - return { - trackers: fontDictTrackers, - output: fdArrayIndex - }; - } - compilePrivateDicts(dicts, trackers, output) { - for (let i = 0, ii = dicts.length; i < ii; ++i) { - const fontDict = dicts[i]; - const privateDict = fontDict.privateDict; - if (!privateDict || !fontDict.hasName("Private")) { - throw new FormatError("There must be a private dictionary."); - } - const privateDictTracker = new CFFOffsetTracker(); - const privateDictData = this.compileDict(privateDict, privateDictTracker); - let outputLength = output.length; - privateDictTracker.offset(outputLength); - if (!privateDictData.length) { - outputLength = 0; - } - trackers[i].setEntryLocation("Private", [privateDictData.length, outputLength], output); - output.add(privateDictData); - if (privateDict.subrsIndex && privateDict.hasName("Subrs")) { - const subrs = this.compileIndex(privateDict.subrsIndex); - privateDictTracker.setEntryLocation("Subrs", [privateDictData.length], output); - output.add(subrs); - } - } - } - compileDict(dict, offsetTracker) { - const out = []; - for (const key of dict.order) { - if (!(key in dict.values)) { - continue; - } - let values = dict.values[key]; - let types = dict.types[key]; - if (!Array.isArray(types)) { - types = [types]; - } - if (!Array.isArray(values)) { - values = [values]; - } - if (values.length === 0) { - continue; - } - for (let j = 0, jj = types.length; j < jj; ++j) { - const type = types[j]; - const value = values[j]; - switch (type) { - case "num": - case "sid": - out.push(...this.encodeNumber(value)); - break; - case "offset": - const name = dict.keyToNameMap[key]; - if (!offsetTracker.isTracking(name)) { - offsetTracker.track(name, out.length); + previous = obj; + } else if (obj instanceof Cmd) { + switch (obj.cmd) { + case "endcmap": + break objLoop; + case "usecmap": + if (previous instanceof Name) { + embeddedUseCMap = previous.name; } - out.push(0x1d, 0, 0, 0, 0); break; - case "array": - case "delta": - out.push(...this.encodeNumber(value)); - for (let k = 1, kk = values.length; k < kk; ++k) { - out.push(...this.encodeNumber(values[k])); - } + case "begincodespacerange": + parseCodespaceRange(cMap, lexer); + break; + case "beginbfchar": + parseBfChar(cMap, lexer); + break; + case "begincidchar": + parseCidChar(cMap, lexer); + break; + case "beginbfrange": + parseBfRange(cMap, lexer); + break; + case "begincidrange": + parseCidRange(cMap, lexer); break; - default: - throw new FormatError(`Unknown data type of ${type}`); } } - out.push(...dict.opcodes[key]); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Invalid cMap data: " + ex); + continue; } - return out; } - compileStringIndex(strings) { - const stringIndex = new CFFIndex(); - for (const string of strings) { - stringIndex.add(stringToBytes(string)); - } - return this.compileIndex(stringIndex); + if (!useCMap && embeddedUseCMap) { + useCMap = embeddedUseCMap; } - compileCharStrings(charStrings) { - const charStringsIndex = new CFFIndex(); - for (let i = 0; i < charStrings.count; i++) { - const glyph = charStrings.get(i); - if (glyph.length === 0) { - charStringsIndex.add(new Uint8Array([0x8b, 0x0e])); - continue; - } - charStringsIndex.add(glyph); + if (useCMap) { + return extendCMap(cMap, fetchBuiltInCMap, useCMap); + } + return cMap; +} +async function extendCMap(cMap, fetchBuiltInCMap, useCMap) { + cMap.useCMap = await createBuiltInCMap(useCMap, fetchBuiltInCMap); + if (cMap.numCodespaceRanges === 0) { + const useCodespaceRanges = cMap.useCMap.codespaceRanges; + for (let i = 0; i < useCodespaceRanges.length; i++) { + cMap.codespaceRanges[i] = useCodespaceRanges[i].slice(); } - return this.compileIndex(charStringsIndex); + cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges; } - compileCharset(charset, numGlyphs, strings, isCIDFont) { - let out; - const numGlyphsLessNotDef = numGlyphs - 1; - if (isCIDFont) { - out = new Uint8Array([2, 0, 0, numGlyphsLessNotDef >> 8 & 0xff, numGlyphsLessNotDef & 0xff]); - } else { - const length = 1 + numGlyphsLessNotDef * 2; - out = new Uint8Array(length); - out[0] = 0; - let charsetIndex = 0; - const numCharsets = charset.charset.length; - let warned = false; - for (let i = 1; i < out.length; i += 2) { - let sid = 0; - if (charsetIndex < numCharsets) { - const name = charset.charset[charsetIndex++]; - sid = strings.getSID(name); - if (sid === -1) { - sid = 0; - if (!warned) { - warned = true; - warn(`Couldn't find ${name} in CFF strings`); - } - } - } - out[i] = sid >> 8 & 0xff; - out[i + 1] = sid & 0xff; - } + cMap.useCMap.forEach(function (key, value) { + if (!cMap.contains(key)) { + cMap.mapOne(key, value); } - return this.compileTypedArray(out); + }); + return cMap; +} +async function createBuiltInCMap(name, fetchBuiltInCMap) { + if (name === "Identity-H") { + return new IdentityCMap(false, 2); + } else if (name === "Identity-V") { + return new IdentityCMap(true, 2); } - compileEncoding(encoding) { - return this.compileTypedArray(encoding.raw); + if (!BUILT_IN_CMAPS.includes(name)) { + throw new Error("Unknown CMap name: " + name); } - compileFDSelect(fdSelect) { - const format = fdSelect.format; - let out, i; - switch (format) { - case 0: - out = new Uint8Array(1 + fdSelect.fdSelect.length); - out[0] = format; - for (i = 0; i < fdSelect.fdSelect.length; i++) { - out[i + 1] = fdSelect.fdSelect[i]; - } - break; - case 3: - const start = 0; - let lastFD = fdSelect.fdSelect[0]; - const ranges = [format, 0, 0, start >> 8 & 0xff, start & 0xff, lastFD]; - for (i = 1; i < fdSelect.fdSelect.length; i++) { - const currentFD = fdSelect.fdSelect[i]; - if (currentFD !== lastFD) { - ranges.push(i >> 8 & 0xff, i & 0xff, currentFD); - lastFD = currentFD; - } + if (!fetchBuiltInCMap) { + throw new Error("Built-in CMap parameters are not provided."); + } + const { + cMapData, + isCompressed + } = await fetchBuiltInCMap(name); + const cMap = new CMap(true); + if (isCompressed) { + return new BinaryCMapReader().process(cMapData, cMap, useCMap => extendCMap(cMap, fetchBuiltInCMap, useCMap)); + } + const lexer = new Lexer(new Stream(cMapData)); + return parseCMap(cMap, lexer, fetchBuiltInCMap, null); +} +class CMapFactory { + static async create({ + encoding, + fetchBuiltInCMap, + useCMap + }) { + if (encoding instanceof Name) { + return createBuiltInCMap(encoding.name, fetchBuiltInCMap); + } else if (encoding instanceof BaseStream) { + if (encoding.isAsync) { + const bytes = await encoding.asyncGetBytes(); + if (bytes) { + encoding = new Stream(bytes, 0, bytes.length, encoding.dict); } - const numRanges = (ranges.length - 3) / 3; - ranges[1] = numRanges >> 8 & 0xff; - ranges[2] = numRanges & 0xff; - ranges.push(i >> 8 & 0xff, i & 0xff); - out = new Uint8Array(ranges); - break; + } + const parsedCMap = await parseCMap(new CMap(), new Lexer(encoding), fetchBuiltInCMap, useCMap); + if (parsedCMap.isIdentityCMap) { + return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap); + } + return parsedCMap; } - return this.compileTypedArray(out); - } - compileTypedArray(data) { - return Array.from(data); + throw new Error("Encoding required."); } - compileIndex(index, trackers = []) { - const objects = index.objects; - const count = objects.length; - if (count === 0) { - return [0, 0]; +} + +;// ./src/shared/obj_bin_transform_utils.js +class CSS_FONT_INFO { + static strings = ["fontFamily", "fontWeight", "italicAngle"]; +} +class SYSTEM_FONT_INFO { + static strings = ["css", "loadedName", "baseFontName", "src"]; +} +class FONT_INFO { + static bools = ["black", "bold", "disableFontFace", "fontExtraProperties", "isInvalidPDFjsFont", "isType3Font", "italic", "missingFile", "remeasure", "vertical"]; + static numbers = ["ascent", "defaultWidth", "descent"]; + static strings = ["fallbackName", "loadedName", "mimetype", "name"]; + static OFFSET_NUMBERS = Math.ceil(this.bools.length * 2 / 8); + static OFFSET_BBOX = this.OFFSET_NUMBERS + this.numbers.length * 8; + static OFFSET_FONT_MATRIX = this.OFFSET_BBOX + 1 + 2 * 4; + static OFFSET_DEFAULT_VMETRICS = this.OFFSET_FONT_MATRIX + 1 + 8 * 6; + static OFFSET_STRINGS = this.OFFSET_DEFAULT_VMETRICS + 1 + 2 * 3; +} +class PATTERN_INFO { + static KIND = 0; + static HAS_BBOX = 1; + static HAS_BACKGROUND = 2; + static SHADING_TYPE = 3; + static N_COORD = 4; + static N_COLOR = 8; + static N_STOP = 12; + static N_FIGURES = 16; +} + +;// ./src/core/obj_bin_transform_core.js + + +function compileCssFontInfo(info) { + const encoder = new TextEncoder(); + const encodedStrings = {}; + let stringsLength = 0; + for (const prop of CSS_FONT_INFO.strings) { + const encoded = encoder.encode(info[prop]); + encodedStrings[prop] = encoded; + stringsLength += 4 + encoded.length; + } + const buffer = new ArrayBuffer(stringsLength); + const data = new Uint8Array(buffer); + const view = new DataView(buffer); + let offset = 0; + for (const prop of CSS_FONT_INFO.strings) { + const encoded = encodedStrings[prop]; + const length = encoded.length; + view.setUint32(offset, length); + data.set(encoded, offset + 4); + offset += 4 + length; + } + assert(offset === buffer.byteLength, "compileCssFontInfo: Buffer overflow"); + return buffer; +} +function compileSystemFontInfo(info) { + const encoder = new TextEncoder(); + const encodedStrings = {}; + let stringsLength = 0; + for (const prop of SYSTEM_FONT_INFO.strings) { + const encoded = encoder.encode(info[prop]); + encodedStrings[prop] = encoded; + stringsLength += 4 + encoded.length; + } + stringsLength += 4; + let encodedStyleStyle, + encodedStyleWeight, + lengthEstimate = 1 + stringsLength; + if (info.style) { + encodedStyleStyle = encoder.encode(info.style.style); + encodedStyleWeight = encoder.encode(info.style.weight); + lengthEstimate += 4 + encodedStyleStyle.length + 4 + encodedStyleWeight.length; + } + const buffer = new ArrayBuffer(lengthEstimate); + const data = new Uint8Array(buffer); + const view = new DataView(buffer); + let offset = 0; + view.setUint8(offset++, info.guessFallback ? 1 : 0); + view.setUint32(offset, 0); + offset += 4; + stringsLength = 0; + for (const prop of SYSTEM_FONT_INFO.strings) { + const encoded = encodedStrings[prop]; + const length = encoded.length; + stringsLength += 4 + length; + view.setUint32(offset, length); + data.set(encoded, offset + 4); + offset += 4 + length; + } + view.setUint32(offset - stringsLength - 4, stringsLength); + if (info.style) { + view.setUint32(offset, encodedStyleStyle.length); + data.set(encodedStyleStyle, offset + 4); + offset += 4 + encodedStyleStyle.length; + view.setUint32(offset, encodedStyleWeight.length); + data.set(encodedStyleWeight, offset + 4); + offset += 4 + encodedStyleWeight.length; + } + assert(offset <= buffer.byteLength, "compileSystemFontInfo: Buffer overflow"); + return buffer.transferToFixedLength(offset); +} +function compileFontInfo(font) { + const systemFontInfoBuffer = font.systemFontInfo ? compileSystemFontInfo(font.systemFontInfo) : null; + const cssFontInfoBuffer = font.cssFontInfo ? compileCssFontInfo(font.cssFontInfo) : null; + const encoder = new TextEncoder(); + const encodedStrings = {}; + let stringsLength = 0; + for (const prop of FONT_INFO.strings) { + encodedStrings[prop] = encoder.encode(font[prop]); + stringsLength += 4 + encodedStrings[prop].length; + } + const lengthEstimate = FONT_INFO.OFFSET_STRINGS + 4 + stringsLength + 4 + (systemFontInfoBuffer?.byteLength ?? 0) + 4 + (cssFontInfoBuffer?.byteLength ?? 0) + 4 + (font.data?.length ?? 0); + const buffer = new ArrayBuffer(lengthEstimate); + const data = new Uint8Array(buffer); + const view = new DataView(buffer); + let offset = 0; + const numBools = FONT_INFO.bools.length; + let boolByte = 0, + boolBit = 0; + for (let i = 0; i < numBools; i++) { + const value = font[FONT_INFO.bools[i]]; + const bits = value === undefined ? 0x00 : value ? 0x02 : 0x01; + boolByte |= bits << boolBit; + boolBit += 2; + if (boolBit === 8 || i === numBools - 1) { + view.setUint8(offset++, boolByte); + boolByte = 0; + boolBit = 0; + } + } + assert(offset === FONT_INFO.OFFSET_NUMBERS, "compileFontInfo: Boolean properties offset mismatch"); + for (const prop of FONT_INFO.numbers) { + view.setFloat64(offset, font[prop]); + offset += 8; + } + assert(offset === FONT_INFO.OFFSET_BBOX, "compileFontInfo: Number properties offset mismatch"); + if (font.bbox) { + view.setUint8(offset++, 4); + for (const coord of font.bbox) { + view.setInt16(offset, coord, true); + offset += 2; } - const data = [count >> 8 & 0xff, count & 0xff]; - let lastOffset = 1, - i; - for (i = 0; i < count; ++i) { - lastOffset += objects[i].length; + } else { + view.setUint8(offset++, 0); + offset += 2 * 4; + } + assert(offset === FONT_INFO.OFFSET_FONT_MATRIX, "compileFontInfo: BBox properties offset mismatch"); + if (font.fontMatrix) { + view.setUint8(offset++, 6); + for (const point of font.fontMatrix) { + view.setFloat64(offset, point, true); + offset += 8; } - let offsetSize; - if (lastOffset < 0x100) { - offsetSize = 1; - } else if (lastOffset < 0x10000) { - offsetSize = 2; - } else if (lastOffset < 0x1000000) { - offsetSize = 3; - } else { - offsetSize = 4; + } else { + view.setUint8(offset++, 0); + offset += 8 * 6; + } + assert(offset === FONT_INFO.OFFSET_DEFAULT_VMETRICS, "compileFontInfo: FontMatrix properties offset mismatch"); + if (font.defaultVMetrics) { + view.setUint8(offset++, 3); + for (const metric of font.defaultVMetrics) { + view.setInt16(offset, metric, true); + offset += 2; } - data.push(offsetSize); - let relativeOffset = 1; - for (i = 0; i < count + 1; i++) { - if (offsetSize === 1) { - data.push(relativeOffset & 0xff); - } else if (offsetSize === 2) { - data.push(relativeOffset >> 8 & 0xff, relativeOffset & 0xff); - } else if (offsetSize === 3) { - data.push(relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff); + } else { + view.setUint8(offset++, 0); + offset += 3 * 2; + } + assert(offset === FONT_INFO.OFFSET_STRINGS, "compileFontInfo: DefaultVMetrics properties offset mismatch"); + view.setUint32(FONT_INFO.OFFSET_STRINGS, 0); + offset += 4; + for (const prop of FONT_INFO.strings) { + const encoded = encodedStrings[prop]; + const length = encoded.length; + view.setUint32(offset, length); + data.set(encoded, offset + 4); + offset += 4 + length; + } + view.setUint32(FONT_INFO.OFFSET_STRINGS, offset - FONT_INFO.OFFSET_STRINGS - 4); + if (!systemFontInfoBuffer) { + view.setUint32(offset, 0); + offset += 4; + } else { + const length = systemFontInfoBuffer.byteLength; + view.setUint32(offset, length); + assert(offset + 4 + length <= buffer.byteLength, "compileFontInfo: Buffer overflow at systemFontInfo"); + data.set(new Uint8Array(systemFontInfoBuffer), offset + 4); + offset += 4 + length; + } + if (!cssFontInfoBuffer) { + view.setUint32(offset, 0); + offset += 4; + } else { + const length = cssFontInfoBuffer.byteLength; + view.setUint32(offset, length); + assert(offset + 4 + length <= buffer.byteLength, "compileFontInfo: Buffer overflow at cssFontInfo"); + data.set(new Uint8Array(cssFontInfoBuffer), offset + 4); + offset += 4 + length; + } + if (font.data === undefined) { + view.setUint32(offset, 0); + offset += 4; + } else { + view.setUint32(offset, font.data.length); + data.set(font.data, offset + 4); + offset += 4 + font.data.length; + } + assert(offset <= buffer.byteLength, "compileFontInfo: Buffer overflow"); + return buffer.transferToFixedLength(offset); +} +function compilePatternInfo(ir) { + let kind, + bbox = null, + coords = [], + colors = [], + colorStops = [], + shadingType = null, + background = null; + switch (ir[0]) { + case "RadialAxial": + kind = ir[1] === "axial" ? 1 : 2; + bbox = ir[2]; + colorStops = ir[3]; + if (kind === 1) { + coords.push(...ir[4], ...ir[5]); } else { - data.push(relativeOffset >>> 24 & 0xff, relativeOffset >> 16 & 0xff, relativeOffset >> 8 & 0xff, relativeOffset & 0xff); - } - if (objects[i]) { - relativeOffset += objects[i].length; + coords.push(ir[4][0], ir[4][1], ir[6], ir[5][0], ir[5][1], ir[7]); } - } - for (i = 0; i < count; i++) { - if (trackers[i]) { - trackers[i].offset(data.length); - } - data.push(...objects[i]); - } - return data; + break; + case "Mesh": + kind = 3; + shadingType = ir[1]; + coords = ir[2]; + colors = ir[3]; + bbox = ir[6]; + background = ir[7]; + break; + default: + throw new Error(`Unsupported pattern type: ${ir[0]}`); + } + const nCoord = Math.floor(coords.length / 2); + const nColor = Math.floor(colors.length / 4); + const nStop = colorStops.length; + const byteLen = 20 + nCoord * 8 + nColor * 4 + nStop * 8 + (bbox ? 16 : 0) + (background ? 3 : 0); + const buffer = new ArrayBuffer(byteLen); + const dataView = new DataView(buffer); + const u8data = new Uint8Array(buffer); + dataView.setUint8(PATTERN_INFO.KIND, kind); + dataView.setUint8(PATTERN_INFO.HAS_BBOX, bbox ? 1 : 0); + dataView.setUint8(PATTERN_INFO.HAS_BACKGROUND, background ? 1 : 0); + dataView.setUint8(PATTERN_INFO.SHADING_TYPE, shadingType); + dataView.setUint32(PATTERN_INFO.N_COORD, nCoord, true); + dataView.setUint32(PATTERN_INFO.N_COLOR, nColor, true); + dataView.setUint32(PATTERN_INFO.N_STOP, nStop, true); + dataView.setUint32(PATTERN_INFO.N_FIGURES, 0, true); + let offset = 20; + const coordsView = new Float32Array(buffer, offset, nCoord * 2); + coordsView.set(coords); + offset += nCoord * 8; + u8data.set(colors, offset); + offset += nColor * 4; + for (const [pos, hex] of colorStops) { + dataView.setFloat32(offset, pos, true); + offset += 4; + dataView.setUint32(offset, parseInt(hex.slice(1), 16), true); + offset += 4; + } + if (bbox) { + for (const v of bbox) { + dataView.setFloat32(offset, v, true); + offset += 4; + } + } + if (background) { + u8data.set(background, offset); + } + return buffer; +} +function compileFontPathInfo(path) { + return path.slice().buffer; +} + +;// ./src/core/encodings.js +const ExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclamsmall", "Hungarumlautsmall", "", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "", "", "", "isuperior", "", "", "lsuperior", "msuperior", "nsuperior", "osuperior", "", "", "rsuperior", "ssuperior", "tsuperior", "", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "exclamdownsmall", "centoldstyle", "Lslashsmall", "", "", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "", "Dotaccentsmall", "", "", "Macronsmall", "", "", "figuredash", "hypheninferior", "", "", "Ogoneksmall", "Ringsmall", "Cedillasmall", "", "", "", "onequarter", "onehalf", "threequarters", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "", "", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall"]; +const MacExpertEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclamsmall", "Hungarumlautsmall", "centoldstyle", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "", "threequartersemdash", "", "questionsmall", "", "", "", "", "Ethsmall", "", "", "onequarter", "onehalf", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "", "", "", "", "", "", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "", "parenrightinferior", "Circumflexsmall", "hypheninferior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "", "", "asuperior", "centsuperior", "", "", "", "", "Aacutesmall", "Agravesmall", "Acircumflexsmall", "Adieresissmall", "Atildesmall", "Aringsmall", "Ccedillasmall", "Eacutesmall", "Egravesmall", "Ecircumflexsmall", "Edieresissmall", "Iacutesmall", "Igravesmall", "Icircumflexsmall", "Idieresissmall", "Ntildesmall", "Oacutesmall", "Ogravesmall", "Ocircumflexsmall", "Odieresissmall", "Otildesmall", "Uacutesmall", "Ugravesmall", "Ucircumflexsmall", "Udieresissmall", "", "eightsuperior", "fourinferior", "threeinferior", "sixinferior", "eightinferior", "seveninferior", "Scaronsmall", "", "centinferior", "twoinferior", "", "Dieresissmall", "", "Caronsmall", "osuperior", "fiveinferior", "", "commainferior", "periodinferior", "Yacutesmall", "", "dollarinferior", "", "", "Thornsmall", "", "nineinferior", "zeroinferior", "Zcaronsmall", "AEsmall", "Oslashsmall", "questiondownsmall", "oneinferior", "Lslashsmall", "", "", "", "", "", "", "Cedillasmall", "", "", "", "", "", "OEsmall", "figuredash", "hyphensuperior", "", "", "", "", "exclamdownsmall", "", "Ydieresissmall", "", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "ninesuperior", "zerosuperior", "", "esuperior", "rsuperior", "tsuperior", "", "", "isuperior", "ssuperior", "dsuperior", "", "", "", "", "", "lsuperior", "Ogoneksmall", "Brevesmall", "Macronsmall", "bsuperior", "nsuperior", "msuperior", "commasuperior", "periodsuperior", "Dotaccentsmall", "Ringsmall", "", "", "", ""]; +const MacRomanEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "", "Adieresis", "Aring", "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", "aacute", "agrave", "acircumflex", "adieresis", "atilde", "aring", "ccedilla", "eacute", "egrave", "ecircumflex", "edieresis", "iacute", "igrave", "icircumflex", "idieresis", "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", "dagger", "degree", "cent", "sterling", "section", "bullet", "paragraph", "germandbls", "registered", "copyright", "trademark", "acute", "dieresis", "notequal", "AE", "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", "yen", "mu", "partialdiff", "summation", "product", "pi", "integral", "ordfeminine", "ordmasculine", "Omega", "ae", "oslash", "questiondown", "exclamdown", "logicalnot", "radical", "florin", "approxequal", "Delta", "guillemotleft", "guillemotright", "ellipsis", "space", "Agrave", "Atilde", "Otilde", "OE", "oe", "endash", "emdash", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", "dotlessi", "circumflex", "tilde", "macron", "breve", "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", "caron"]; +const StandardEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "", "endash", "dagger", "daggerdbl", "periodcentered", "", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "", "questiondown", "", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "", "ring", "cedilla", "", "hungarumlaut", "ogonek", "caron", "emdash", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "AE", "", "ordfeminine", "", "", "", "", "Lslash", "Oslash", "OE", "ordmasculine", "", "", "", "", "", "ae", "", "", "", "dotlessi", "", "", "lslash", "oslash", "oe", "germandbls", "", "", "", ""]; +const WinAnsiEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "bullet", "Euro", "bullet", "quotesinglbase", "florin", "quotedblbase", "ellipsis", "dagger", "daggerdbl", "circumflex", "perthousand", "Scaron", "guilsinglleft", "OE", "bullet", "Zcaron", "bullet", "bullet", "quoteleft", "quoteright", "quotedblleft", "quotedblright", "bullet", "endash", "emdash", "tilde", "trademark", "scaron", "guilsinglright", "oe", "bullet", "zcaron", "Ydieresis", "space", "exclamdown", "cent", "sterling", "currency", "yen", "brokenbar", "section", "dieresis", "copyright", "ordfeminine", "guillemotleft", "logicalnot", "hyphen", "registered", "macron", "degree", "plusminus", "twosuperior", "threesuperior", "acute", "mu", "paragraph", "periodcentered", "cedilla", "onesuperior", "ordmasculine", "guillemotright", "onequarter", "onehalf", "threequarters", "questiondown", "Agrave", "Aacute", "Acircumflex", "Atilde", "Adieresis", "Aring", "AE", "Ccedilla", "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave", "Iacute", "Icircumflex", "Idieresis", "Eth", "Ntilde", "Ograve", "Oacute", "Ocircumflex", "Otilde", "Odieresis", "multiply", "Oslash", "Ugrave", "Uacute", "Ucircumflex", "Udieresis", "Yacute", "Thorn", "germandbls", "agrave", "aacute", "acircumflex", "atilde", "adieresis", "aring", "ae", "ccedilla", "egrave", "eacute", "ecircumflex", "edieresis", "igrave", "iacute", "icircumflex", "idieresis", "eth", "ntilde", "ograve", "oacute", "ocircumflex", "otilde", "odieresis", "divide", "oslash", "ugrave", "uacute", "ucircumflex", "udieresis", "yacute", "thorn", "ydieresis"]; +const SymbolSetEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "exclam", "universal", "numbersign", "existential", "percent", "ampersand", "suchthat", "parenleft", "parenright", "asteriskmath", "plus", "comma", "minus", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "congruent", "Alpha", "Beta", "Chi", "Delta", "Epsilon", "Phi", "Gamma", "Eta", "Iota", "theta1", "Kappa", "Lambda", "Mu", "Nu", "Omicron", "Pi", "Theta", "Rho", "Sigma", "Tau", "Upsilon", "sigma1", "Omega", "Xi", "Psi", "Zeta", "bracketleft", "therefore", "bracketright", "perpendicular", "underscore", "radicalex", "alpha", "beta", "chi", "delta", "epsilon", "phi", "gamma", "eta", "iota", "phi1", "kappa", "lambda", "mu", "nu", "omicron", "pi", "theta", "rho", "sigma", "tau", "upsilon", "omega1", "omega", "xi", "psi", "zeta", "braceleft", "bar", "braceright", "similar", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Euro", "Upsilon1", "minute", "lessequal", "fraction", "infinity", "florin", "club", "diamond", "heart", "spade", "arrowboth", "arrowleft", "arrowup", "arrowright", "arrowdown", "degree", "plusminus", "second", "greaterequal", "multiply", "proportional", "partialdiff", "bullet", "divide", "notequal", "equivalence", "approxequal", "ellipsis", "arrowvertex", "arrowhorizex", "carriagereturn", "aleph", "Ifraktur", "Rfraktur", "weierstrass", "circlemultiply", "circleplus", "emptyset", "intersection", "union", "propersuperset", "reflexsuperset", "notsubset", "propersubset", "reflexsubset", "element", "notelement", "angle", "gradient", "registerserif", "copyrightserif", "trademarkserif", "product", "radical", "dotmath", "logicalnot", "logicaland", "logicalor", "arrowdblboth", "arrowdblleft", "arrowdblup", "arrowdblright", "arrowdbldown", "lozenge", "angleleft", "registersans", "copyrightsans", "trademarksans", "summation", "parenlefttp", "parenleftex", "parenleftbt", "bracketlefttp", "bracketleftex", "bracketleftbt", "bracelefttp", "braceleftmid", "braceleftbt", "braceex", "", "angleright", "integral", "integraltp", "integralex", "integralbt", "parenrighttp", "parenrightex", "parenrightbt", "bracketrighttp", "bracketrightex", "bracketrightbt", "bracerighttp", "bracerightmid", "bracerightbt", ""]; +const ZapfDingbatsEncoding = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "space", "a1", "a2", "a202", "a3", "a4", "a5", "a119", "a118", "a117", "a11", "a12", "a13", "a14", "a15", "a16", "a105", "a17", "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26", "a27", "a28", "a6", "a7", "a8", "a9", "a10", "a29", "a30", "a31", "a32", "a33", "a34", "a35", "a36", "a37", "a38", "a39", "a40", "a41", "a42", "a43", "a44", "a45", "a46", "a47", "a48", "a49", "a50", "a51", "a52", "a53", "a54", "a55", "a56", "a57", "a58", "a59", "a60", "a61", "a62", "a63", "a64", "a65", "a66", "a67", "a68", "a69", "a70", "a71", "a72", "a73", "a74", "a203", "a75", "a204", "a76", "a77", "a78", "a79", "a81", "a82", "a83", "a84", "a97", "a98", "a99", "a100", "", "a89", "a90", "a93", "a94", "a91", "a92", "a205", "a85", "a206", "a86", "a87", "a88", "a95", "a96", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "a101", "a102", "a103", "a104", "a106", "a107", "a108", "a112", "a111", "a110", "a109", "a120", "a121", "a122", "a123", "a124", "a125", "a126", "a127", "a128", "a129", "a130", "a131", "a132", "a133", "a134", "a135", "a136", "a137", "a138", "a139", "a140", "a141", "a142", "a143", "a144", "a145", "a146", "a147", "a148", "a149", "a150", "a151", "a152", "a153", "a154", "a155", "a156", "a157", "a158", "a159", "a160", "a161", "a163", "a164", "a196", "a165", "a192", "a166", "a167", "a168", "a169", "a170", "a171", "a172", "a173", "a162", "a174", "a175", "a176", "a177", "a178", "a179", "a193", "a180", "a199", "a181", "a200", "a182", "", "a201", "a183", "a184", "a197", "a185", "a194", "a198", "a186", "a195", "a187", "a188", "a189", "a190", "a191", ""]; +function getEncoding(encodingName) { + switch (encodingName) { + case "WinAnsiEncoding": + return WinAnsiEncoding; + case "StandardEncoding": + return StandardEncoding; + case "MacRomanEncoding": + return MacRomanEncoding; + case "SymbolSetEncoding": + return SymbolSetEncoding; + case "ZapfDingbatsEncoding": + return ZapfDingbatsEncoding; + case "ExpertEncoding": + return ExpertEncoding; + case "MacExpertEncoding": + return MacExpertEncoding; + default: + return null; } } -;// CONCATENATED MODULE: ./src/core/glyphlist.js +;// ./src/core/glyphlist.js const getGlyphsUnicode = getLookupTableFactory(function (t) { t.A = 0x0041; @@ -17365,7 +17535,7 @@ t[".notdef"] = 0x0000; }); -;// CONCATENATED MODULE: ./src/core/unicode.js +;// ./src/core/unicode.js const getSpecialPUASymbols = getLookupTableFactory(function (t) { t[63721] = 0x00a9; @@ -17450,7 +17620,7 @@ } return -1; } -const SpecialCharRegExp = new RegExp("^(\\s)|(\\p{Mn})|(\\p{Cf})$", "u"); +const SpecialCharRegExp = /^(\s)|(\p{Mn})|(\p{Cf})$/u; const CategoryCache = new Map(); function getCharUnicodeCategory(char) { const cachedCategory = CategoryCache.get(char); @@ -17470,7 +17640,8 @@ CategoryCache.clear(); } -;// CONCATENATED MODULE: ./src/core/fonts_utils.js +;// ./src/core/fonts_utils.js + @@ -17553,8 +17724,1761 @@ function normalizeFontName(name) { return name.replaceAll(/[,_]/g, "-").replaceAll(/\s/g, ""); } +const getVerticalPresentationForm = getLookupTableFactory(t => { + t[0x2013] = 0xfe32; + t[0x2014] = 0xfe31; + t[0x2025] = 0xfe30; + t[0x2026] = 0xfe19; + t[0x3001] = 0xfe11; + t[0x3002] = 0xfe12; + t[0x3008] = 0xfe3f; + t[0x3009] = 0xfe40; + t[0x300a] = 0xfe3d; + t[0x300b] = 0xfe3e; + t[0x300c] = 0xfe41; + t[0x300d] = 0xfe42; + t[0x300e] = 0xfe43; + t[0x300f] = 0xfe44; + t[0x3010] = 0xfe3b; + t[0x3011] = 0xfe3c; + t[0x3014] = 0xfe39; + t[0x3015] = 0xfe3a; + t[0x3016] = 0xfe17; + t[0x3017] = 0xfe18; + t[0xfe4f] = 0xfe34; + t[0xff01] = 0xfe15; + t[0xff08] = 0xfe35; + t[0xff09] = 0xfe36; + t[0xff0c] = 0xfe10; + t[0xff1a] = 0xfe13; + t[0xff1b] = 0xfe14; + t[0xff1f] = 0xfe16; + t[0xff3b] = 0xfe47; + t[0xff3d] = 0xfe48; + t[0xff3f] = 0xfe33; + t[0xff5b] = 0xfe37; + t[0xff5d] = 0xfe38; +}); +const MAX_SIZE_TO_COMPILE = 1000; +function compileType3Glyph({ + data: img, + width, + height +}) { + if (width > MAX_SIZE_TO_COMPILE || height > MAX_SIZE_TO_COMPILE) { + return null; + } + const POINT_TO_PROCESS_LIMIT = 1000; + const POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]); + const width1 = width + 1; + const points = new Uint8Array(width1 * (height + 1)); + let i, j, j0; + const lineSize = width + 7 & ~7; + const data = new Uint8Array(lineSize * height); + let pos = 0; + for (const elem of img) { + let mask = 128; + while (mask > 0) { + data[pos++] = elem & mask ? 0 : 255; + mask >>= 1; + } + } + let count = 0; + pos = 0; + if (data[pos] !== 0) { + points[0] = 1; + ++count; + } + for (j = 1; j < width; j++) { + if (data[pos] !== data[pos + 1]) { + points[j] = data[pos] ? 2 : 1; + ++count; + } + pos++; + } + if (data[pos] !== 0) { + points[j] = 2; + ++count; + } + for (i = 1; i < height; i++) { + pos = i * lineSize; + j0 = i * width1; + if (data[pos - lineSize] !== data[pos]) { + points[j0] = data[pos] ? 1 : 8; + ++count; + } + let sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0); + for (j = 1; j < width; j++) { + sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0); + if (POINT_TYPES[sum]) { + points[j0 + j] = POINT_TYPES[sum]; + ++count; + } + pos++; + } + if (data[pos - lineSize] !== data[pos]) { + points[j0 + j] = data[pos] ? 2 : 4; + ++count; + } + if (count > POINT_TO_PROCESS_LIMIT) { + return null; + } + } + pos = lineSize * (height - 1); + j0 = i * width1; + if (data[pos] !== 0) { + points[j0] = 8; + ++count; + } + for (j = 1; j < width; j++) { + if (data[pos] !== data[pos + 1]) { + points[j0 + j] = data[pos] ? 4 : 8; + ++count; + } + pos++; + } + if (data[pos] !== 0) { + points[j0 + j] = 4; + ++count; + } + if (count > POINT_TO_PROCESS_LIMIT) { + return null; + } + const steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]); + const pathBuf = []; + const { + a, + b, + c, + d, + e, + f + } = new DOMMatrix().scaleSelf(1 / width, -1 / height).translateSelf(0, -height); + for (i = 0; count && i <= height; i++) { + let p = i * width1; + const end = p + width; + while (p < end && !points[p]) { + p++; + } + if (p === end) { + continue; + } + let x = p % width1; + let y = i; + pathBuf.push(DrawOPS.moveTo, a * x + c * y + e, b * x + d * y + f); + const p0 = p; + let type = points[p]; + do { + const step = steps[type]; + do { + p += step; + } while (!points[p]); + const pp = points[p]; + if (pp !== 5 && pp !== 10) { + type = pp; + points[p] = 0; + } else { + type = pp & 0x33 * type >> 4; + points[p] &= type >> 2 | type << 2; + } + x = p % width1; + y = p / width1 | 0; + pathBuf.push(DrawOPS.lineTo, a * x + c * y + e, b * x + d * y + f); + if (!points[p]) { + --count; + } + } while (p0 !== p); + --i; + } + return [OPS.rawFillPath, [new Float32Array(pathBuf)], new Float32Array([0, 0, width, height])]; +} + +;// ./src/core/charsets.js +const ISOAdobeCharset = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron"]; +const ExpertCharset = [".notdef", "space", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "onequarter", "onehalf", "threequarters", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall"]; +const ExpertSubsetCharset = [".notdef", "space", "dollaroldstyle", "dollarsuperior", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "comma", "hyphen", "period", "fraction", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "colon", "semicolon", "commasuperior", "threequartersemdash", "periodsuperior", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "fi", "fl", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "hyphensuperior", "colonmonetary", "onefitted", "rupiah", "centoldstyle", "figuredash", "hypheninferior", "onequarter", "onehalf", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior"]; + +;// ./src/core/data_builder.js + + +class DataBuilder { + #buf; + #bufLength = 1024; + #hasExactLength = false; + #pos = 0; + #view; + constructor({ + exactLength = 0, + minLength = 0 + }) { + this.#hasExactLength = !!exactLength; + this.#initBuf(exactLength || minLength); + } + #initBuf(minLength) { + if (this.#hasExactLength) { + this.#bufLength = minLength; + } else { + while (this.#bufLength < minLength) { + this.#bufLength *= 2; + } + } + const newBuf = new Uint8Array(this.#bufLength); + if (this.#buf) { + newBuf.set(this.#buf, 0); + } + this.#buf = newBuf; + this.#view = new DataView(newBuf.buffer); + } + get data() { + return this.#buf.subarray(0, this.#pos); + } + get length() { + return this.#pos; + } + skip(n) { + this.#pos += n; + } + setArray(arr) { + const newPos = this.#pos + arr.length; + if (!this.#hasExactLength && newPos > this.#bufLength) { + this.#initBuf(newPos); + } + this.#buf.set(arr, this.#pos); + this.#pos = newPos; + } + setInt16(val) { + const newPos = this.#pos + 2; + if (!this.#hasExactLength && newPos > this.#bufLength) { + this.#initBuf(newPos); + } + this.#view.setInt16(this.#pos, val); + this.#pos = newPos; + } + setSafeInt16(val) { + const newPos = this.#pos + 2; + if (!this.#hasExactLength && newPos > this.#bufLength) { + this.#initBuf(newPos); + } + this.#view.setInt16(this.#pos, MathClamp(val, -0x8000, 0x7fff)); + this.#pos = newPos; + } + setInt32(val) { + const newPos = this.#pos + 4; + if (!this.#hasExactLength && newPos > this.#bufLength) { + this.#initBuf(newPos); + } + this.#view.setInt32(this.#pos, val); + this.#pos = newPos; + } +} + +;// ./src/core/cff_parser.js + + + + + +const MAX_SUBR_NESTING = 10; +function looksLikeUnsigned16BitNegative(coord) { + return coord > 0x7fff && coord <= 0xffff; +} +function recoverSigned16BitBBox(bbox, onlyLowerLeft = false) { + return Util.normalizeRect(bbox.map((coord, i) => (!onlyLowerLeft || i < 2) && looksLikeUnsigned16BitNegative(coord) ? coord - 0x10000 : coord)); +} +const CFFStandardStrings = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall", "001.000", "001.001", "001.002", "001.003", "Black", "Bold", "Book", "Light", "Medium", "Regular", "Roman", "Semibold"]; +const NUM_STANDARD_CFF_STRINGS = 391; +const DEFAULT_BLUE_SCALE = 0.039625; +const DEFAULT_BLUE_SHIFT = 7; +const DEFAULT_BLUE_FUZZ = 1; +const DEFAULT_EXPANSION_FACTOR = 0.06; +const CharstringValidationData = [null, { + id: "hstem", + min: 2, + stackClearing: true, + stem: true +}, null, { + id: "vstem", + min: 2, + stackClearing: true, + stem: true +}, { + id: "vmoveto", + min: 1, + stackClearing: true +}, { + id: "rlineto", + min: 2, + resetStack: true +}, { + id: "hlineto", + min: 1, + resetStack: true +}, { + id: "vlineto", + min: 1, + resetStack: true +}, { + id: "rrcurveto", + min: 6, + resetStack: true +}, null, { + id: "callsubr", + min: 1 +}, { + id: "return", + min: 0 +}, null, null, { + id: "endchar", + min: 0, + stackClearing: true +}, null, null, null, { + id: "hstemhm", + min: 2, + stackClearing: true, + stem: true +}, { + id: "hintmask", + min: 0, + stackClearing: true +}, { + id: "cntrmask", + min: 0, + stackClearing: true +}, { + id: "rmoveto", + min: 2, + stackClearing: true +}, { + id: "hmoveto", + min: 1, + stackClearing: true +}, { + id: "vstemhm", + min: 2, + stackClearing: true, + stem: true +}, { + id: "rcurveline", + min: 8, + resetStack: true +}, { + id: "rlinecurve", + min: 8, + resetStack: true +}, { + id: "vvcurveto", + min: 4, + resetStack: true +}, { + id: "hhcurveto", + min: 4, + resetStack: true +}, null, { + id: "callgsubr", + min: 1 +}, { + id: "vhcurveto", + min: 4, + resetStack: true +}, { + id: "hvcurveto", + min: 4, + resetStack: true +}]; +const CharstringValidationData12 = [null, null, null, { + id: "and", + min: 2, + stackDelta: -1 +}, { + id: "or", + min: 2, + stackDelta: -1 +}, { + id: "not", + min: 1, + stackDelta: 0 +}, null, null, null, { + id: "abs", + min: 1, + stackDelta: 0 +}, { + id: "add", + min: 2, + stackDelta: -1, + stackFn(stack, index) { + stack[index - 2] = stack[index - 2] + stack[index - 1]; + } +}, { + id: "sub", + min: 2, + stackDelta: -1, + stackFn(stack, index) { + stack[index - 2] = stack[index - 2] - stack[index - 1]; + } +}, { + id: "div", + min: 2, + stackDelta: -1, + stackFn(stack, index) { + stack[index - 2] = stack[index - 2] / stack[index - 1]; + } +}, null, { + id: "neg", + min: 1, + stackDelta: 0, + stackFn(stack, index) { + stack[index - 1] = -stack[index - 1]; + } +}, { + id: "eq", + min: 2, + stackDelta: -1 +}, null, null, { + id: "drop", + min: 1, + stackDelta: -1 +}, null, { + id: "put", + min: 2, + stackDelta: -2 +}, { + id: "get", + min: 1, + stackDelta: 0 +}, { + id: "ifelse", + min: 4, + stackDelta: -3 +}, { + id: "random", + min: 0, + stackDelta: 1 +}, { + id: "mul", + min: 2, + stackDelta: -1, + stackFn(stack, index) { + stack[index - 2] = stack[index - 2] * stack[index - 1]; + } +}, null, { + id: "sqrt", + min: 1, + stackDelta: 0 +}, { + id: "dup", + min: 1, + stackDelta: 1 +}, { + id: "exch", + min: 2, + stackDelta: 0 +}, { + id: "index", + min: 2, + stackDelta: 0 +}, { + id: "roll", + min: 3, + stackDelta: -2 +}, null, null, null, { + id: "hflex", + min: 7, + resetStack: true +}, { + id: "flex", + min: 13, + resetStack: true +}, { + id: "hflex1", + min: 9, + resetStack: true +}, { + id: "flex1", + min: 11, + resetStack: true +}]; +class CFFParser { + constructor(file, properties, seacAnalysisEnabled) { + this.bytes = file.getBytes(); + this.properties = properties; + this.seacAnalysisEnabled = !!seacAnalysisEnabled; + } + parse() { + const properties = this.properties; + const cff = new CFF(this.bytes.length); + this.cff = cff; + const header = this.parseHeader(); + const nameIndex = this.parseIndex(header.endPos); + const topDictIndex = this.parseIndex(nameIndex.endPos); + const stringIndex = this.parseIndex(topDictIndex.endPos); + const globalSubrIndex = this.parseIndex(stringIndex.endPos); + const topDictParsed = this.parseDict(topDictIndex.obj.get(0)); + const topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings); + cff.header = header.obj; + cff.names = this.parseNameIndex(nameIndex.obj); + cff.strings = this.parseStringIndex(stringIndex.obj); + cff.topDict = topDict; + cff.globalSubrIndex = globalSubrIndex.obj; + this.parsePrivateDict(cff.topDict); + cff.isCIDFont = topDict.hasName("ROS"); + const charStringOffset = topDict.getByName("CharStrings"); + const charStringIndex = this.parseIndex(charStringOffset).obj; + cff.charStringCount = charStringIndex.count; + const fontMatrix = topDict.getByName("FontMatrix"); + if (fontMatrix) { + properties.fontMatrix = fontMatrix; + } + let fontBBox = topDict.getByName("FontBBox"); + const descriptorBBox = properties.bbox?.some(coord => coord !== 0) ? recoverSigned16BitBBox(properties.bbox) : null; + const cffBBoxHasUnsignedLowerLeft = fontBBox?.slice(0, 2).some(looksLikeUnsigned16BitNegative); + const cffBBoxHasUnsignedCoords = fontBBox?.some(looksLikeUnsigned16BitNegative); + if (fontBBox?.every(coord => coord === 0) && descriptorBBox) { + fontBBox = descriptorBBox; + topDict.setByName("FontBBox", fontBBox); + } else if (cffBBoxHasUnsignedCoords) { + const recoveredFontBBox = recoverSigned16BitBBox(fontBBox); + const descriptorCorroborates = descriptorBBox && properties.bbox.some(coord => coord < 0) && !properties.bbox.some(looksLikeUnsigned16BitNegative) && isArrayEqual(recoveredFontBBox, descriptorBBox); + if (descriptorCorroborates || cffBBoxHasUnsignedLowerLeft) { + fontBBox = descriptorCorroborates ? recoveredFontBBox : recoverSigned16BitBBox(fontBBox, true); + topDict.setByName("FontBBox", fontBBox); + } + } + if (fontBBox?.some(coord => coord !== 0)) { + properties.ascent = Math.max(fontBBox[3], fontBBox[1]); + properties.descent = Math.min(fontBBox[1], fontBBox[3]); + properties.ascentScaled = true; + } + let charset, encoding; + if (cff.isCIDFont) { + const fdArrayIndex = this.parseIndex(topDict.getByName("FDArray")).obj; + for (let i = 0, ii = fdArrayIndex.count; i < ii; ++i) { + const dictRaw = fdArrayIndex.get(i); + const fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings); + this.parsePrivateDict(fontDict); + cff.fdArray.push(fontDict); + } + encoding = null; + charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, true); + cff.fdSelect = this.parseFDSelect(topDict.getByName("FDSelect"), charStringIndex.count); + } else { + charset = this.parseCharsets(topDict.getByName("charset"), charStringIndex.count, cff.strings, false); + encoding = this.parseEncoding(topDict.getByName("Encoding"), properties, cff.strings, charset.charset); + } + cff.charset = charset; + cff.encoding = encoding; + const charStringsAndSeacs = this.parseCharStrings({ + charStrings: charStringIndex, + localSubrIndex: topDict.privateDict.subrsIndex, + globalSubrIndex: globalSubrIndex.obj, + fdSelect: cff.fdSelect, + fdArray: cff.fdArray, + privateDict: topDict.privateDict + }); + cff.charStrings = charStringsAndSeacs.charStrings; + cff.seacs = charStringsAndSeacs.seacs; + cff.widths = charStringsAndSeacs.widths; + return cff; + } + parseHeader() { + let bytes = this.bytes; + const bytesLength = bytes.length; + let offset = 0; + while (offset < bytesLength && bytes[offset] !== 1) { + ++offset; + } + if (offset >= bytesLength) { + throw new FormatError("Invalid CFF header"); + } + if (offset !== 0) { + info("cff data is shifted"); + bytes = bytes.subarray(offset); + this.bytes = bytes; + } + const major = bytes[0]; + const minor = bytes[1]; + const hdrSize = bytes[2]; + const offSize = bytes[3]; + const header = new CFFHeader(major, minor, hdrSize, offSize); + return { + obj: header, + endPos: hdrSize + }; + } + parseDict(dict) { + const view = new DataView(dict.buffer, dict.byteOffset, dict.bytesLength); + let pos = 0; + function parseOperand() { + let value = dict[pos++]; + if (value === 30) { + return parseFloatOperand(); + } else if (value === 28) { + value = view.getInt16(pos); + pos += 2; + return value; + } else if (value === 29) { + value = view.getInt32(pos); + pos += 4; + return value; + } else if (value >= 32 && value <= 246) { + return value - 139; + } else if (value >= 247 && value <= 250) { + return (value - 247) * 256 + dict[pos++] + 108; + } else if (value >= 251 && value <= 254) { + return -((value - 251) * 256) - dict[pos++] - 108; + } + warn(`CFFParser.parseDict: "${value}" is a reserved command.`); + return NaN; + } + function parseFloatOperand() { + let str = ""; + const eof = 15; + const lookup = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "E", "E-", null, "-"]; + const length = dict.length; + while (pos < length) { + const b = dict[pos++]; + const b1 = b >> 4; + const b2 = b & 15; + if (b1 === eof) { + break; + } + str += lookup[b1]; + if (b2 === eof) { + break; + } + str += lookup[b2]; + } + return parseFloat(str); + } + let operands = []; + const entries = []; + pos = 0; + const end = dict.length; + while (pos < end) { + let b = dict[pos]; + if (b <= 21) { + if (b === 12) { + b = b << 8 | dict[++pos]; + } + entries.push([b, operands]); + operands = []; + ++pos; + } else { + operands.push(parseOperand()); + } + } + return entries; + } + parseIndex(pos) { + const cffIndex = new CFFIndex(); + const bytes = this.bytes; + const count = bytes[pos++] << 8 | bytes[pos++]; + const offsets = []; + let end = pos; + let i, ii; + if (count !== 0) { + const offsetSize = bytes[pos++]; + const startPos = pos + (count + 1) * offsetSize - 1; + for (i = 0, ii = count + 1; i < ii; ++i) { + let offset = 0; + for (let j = 0; j < offsetSize; ++j) { + offset <<= 8; + offset += bytes[pos++]; + } + offsets.push(startPos + offset); + } + end = offsets[count]; + } + for (i = 0, ii = offsets.length - 1; i < ii; ++i) { + const offsetStart = offsets[i]; + const offsetEnd = offsets[i + 1]; + cffIndex.add(bytes.subarray(offsetStart, offsetEnd)); + } + return { + obj: cffIndex, + endPos: end + }; + } + parseNameIndex(index) { + const names = []; + for (let i = 0, ii = index.count; i < ii; ++i) { + const name = index.get(i); + names.push(bytesToString(name)); + } + return names; + } + parseStringIndex(index) { + const strings = new CFFStrings(); + for (let i = 0, ii = index.count; i < ii; ++i) { + const data = index.get(i); + strings.add(bytesToString(data)); + } + return strings; + } + createDict(Type, dict, strings) { + const cffDict = new Type(strings); + for (const [key, value] of dict) { + cffDict.setByKey(key, value); + } + return cffDict; + } + parseCharString(state, data, localSubrIndex, globalSubrIndex) { + if (!data || state.callDepth > MAX_SUBR_NESTING) { + return false; + } + const view = new DataView(data.buffer, data.byteOffset, data.bytesLength); + let stackSize = state.stackSize; + const stack = state.stack; + let length = data.length; + for (let j = 0; j < length;) { + const value = data[j++]; + let validationCommand = null; + if (value === 12) { + const q = data[j++]; + if (q === 0) { + data[j - 2] = 139; + data[j - 1] = 22; + stackSize = 0; + } else { + validationCommand = CharstringValidationData12[q]; + } + } else if (value === 28) { + stack[stackSize] = view.getInt16(j); + j += 2; + stackSize++; + } else if (value === 14) { + if (stackSize >= 4) { + stackSize -= 4; + if (this.seacAnalysisEnabled) { + state.seac = stack.slice(stackSize, stackSize + 4); + return false; + } + } + validationCommand = CharstringValidationData[value]; + } else if (value >= 32 && value <= 246) { + stack[stackSize] = value - 139; + stackSize++; + } else if (value >= 247 && value <= 254) { + stack[stackSize] = value < 251 ? (value - 247 << 8) + data[j] + 108 : -(value - 251 << 8) - data[j] - 108; + j++; + stackSize++; + } else if (value === 255) { + stack[stackSize] = view.getInt32(j) / 65536; + j += 4; + stackSize++; + } else if (value === 19 || value === 20) { + state.hints += stackSize >> 1; + if (state.hints === 0) { + data.copyWithin(j - 1, j, -1); + j -= 1; + length -= 1; + continue; + } + j += state.hints + 7 >> 3; + stackSize %= 2; + validationCommand = CharstringValidationData[value]; + } else if (value === 10 || value === 29) { + const subrsIndex = value === 10 ? localSubrIndex : globalSubrIndex; + if (!subrsIndex) { + validationCommand = CharstringValidationData[value]; + warn("Missing subrsIndex for " + validationCommand.id); + return false; + } + let bias = 32768; + if (subrsIndex.count < 1240) { + bias = 107; + } else if (subrsIndex.count < 33900) { + bias = 1131; + } + const subrNumber = stack[--stackSize] + bias; + if (subrNumber < 0 || subrNumber >= subrsIndex.count || isNaN(subrNumber)) { + validationCommand = CharstringValidationData[value]; + warn("Out of bounds subrIndex for " + validationCommand.id); + return false; + } + state.stackSize = stackSize; + state.callDepth++; + const valid = this.parseCharString(state, subrsIndex.get(subrNumber), localSubrIndex, globalSubrIndex); + if (!valid) { + return false; + } + state.callDepth--; + stackSize = state.stackSize; + continue; + } else if (value === 11) { + state.stackSize = stackSize; + return true; + } else if (value === 0 && j === data.length) { + data[j - 1] = 14; + validationCommand = CharstringValidationData[14]; + } else if (value === 9) { + data.copyWithin(j - 1, j, -1); + j -= 1; + length -= 1; + continue; + } else { + validationCommand = CharstringValidationData[value]; + } + if (validationCommand) { + if (validationCommand.stem) { + state.hints += stackSize >> 1; + if (value === 3 || value === 23) { + state.hasVStems = true; + } else if (state.hasVStems && (value === 1 || value === 18)) { + warn("CFF stem hints are in wrong order"); + data[j - 1] = value === 1 ? 3 : 23; + } + } + if (stackSize < validationCommand.min) { + warn("Not enough parameters for " + validationCommand.id + "; actual: " + stackSize + ", expected: " + validationCommand.min); + if (stackSize === 0) { + data[j - 1] = 14; + return true; + } + return false; + } + if (state.firstStackClearing && validationCommand.stackClearing) { + state.firstStackClearing = false; + stackSize -= validationCommand.min; + if (stackSize >= 2 && validationCommand.stem) { + stackSize %= 2; + } else if (stackSize > 1) { + warn("Found too many parameters for stack-clearing command"); + } + if (stackSize > 0) { + state.width = stack[stackSize - 1]; + } + } + if ("stackDelta" in validationCommand) { + if ("stackFn" in validationCommand) { + validationCommand.stackFn(stack, stackSize); + } + stackSize += validationCommand.stackDelta; + } else if (validationCommand.stackClearing || validationCommand.resetStack) { + stackSize = 0; + } + } + } + if (length < data.length) { + data.fill(14, length); + } + state.stackSize = stackSize; + return true; + } + parseCharStrings({ + charStrings, + localSubrIndex, + globalSubrIndex, + fdSelect, + fdArray, + privateDict + }) { + const seacs = []; + const widths = []; + const count = charStrings.count; + for (let i = 0; i < count; i++) { + const charstring = charStrings.get(i); + const state = { + callDepth: 0, + stackSize: 0, + stack: [], + hints: 0, + firstStackClearing: true, + seac: null, + width: null, + hasVStems: false + }; + let valid = true; + let localSubrToUse = null; + let privateDictToUse = privateDict; + if (fdSelect && fdArray.length) { + const fdIndex = fdSelect.getFDIndex(i); + if (fdIndex === -1) { + warn("Glyph index is not in fd select."); + valid = false; + } + if (fdIndex >= fdArray.length) { + warn("Invalid fd index for glyph index."); + valid = false; + } + if (valid) { + privateDictToUse = fdArray[fdIndex].privateDict; + localSubrToUse = privateDictToUse.subrsIndex; + } + } else if (localSubrIndex) { + localSubrToUse = localSubrIndex; + } + if (valid) { + valid = this.parseCharString(state, charstring, localSubrToUse, globalSubrIndex); + } + if (state.width !== null) { + const nominalWidth = privateDictToUse.getByName("nominalWidthX"); + widths[i] = nominalWidth + state.width; + } else { + const defaultWidth = privateDictToUse.getByName("defaultWidthX"); + widths[i] = defaultWidth; + } + if (state.seac !== null) { + seacs[i] = state.seac; + } + if (!valid) { + charStrings.set(i, new Uint8Array([14])); + } + } + return { + charStrings, + seacs, + widths + }; + } + emptyPrivateDictionary(parentDict) { + const privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings); + parentDict.setByKey(18, [0, 0]); + parentDict.privateDict = privateDict; + } + parsePrivateDict(parentDict) { + if (!parentDict.hasName("Private")) { + this.emptyPrivateDictionary(parentDict); + return; + } + const privateOffset = parentDict.getByName("Private"); + if (!Array.isArray(privateOffset) || privateOffset.length !== 2) { + parentDict.removeByName("Private"); + return; + } + const size = privateOffset[0]; + const offset = privateOffset[1]; + if (size === 0 || offset >= this.bytes.length) { + this.emptyPrivateDictionary(parentDict); + return; + } + if (offset + size > this.bytes.length) { + throw new FormatError("CFF Private DICT extends past end of font"); + } + const privateDictEnd = offset + size; + const dictData = this.bytes.subarray(offset, privateDictEnd); + const dict = this.parseDict(dictData); + const privateDict = this.createDict(CFFPrivateDict, dict, parentDict.strings); + parentDict.privateDict = privateDict; + const blueScale = privateDict.getByName("BlueScale"); + const blueShift = privateDict.getByName("BlueShift"); + const blueFuzz = privateDict.getByName("BlueFuzz"); + const expansionFactor = privateDict.getByName("ExpansionFactor"); + if (blueScale === 0 && blueShift === 0 && blueFuzz === 0 && expansionFactor === 0) { + privateDict.setByName("BlueScale", DEFAULT_BLUE_SCALE); + privateDict.setByName("BlueShift", DEFAULT_BLUE_SHIFT); + privateDict.setByName("BlueFuzz", DEFAULT_BLUE_FUZZ); + } + if (expansionFactor === 0) { + privateDict.setByName("ExpansionFactor", DEFAULT_EXPANSION_FACTOR); + } + if (blueScale > 0) { + let maxZoneHeight = 0; + for (const zones of [privateDict.getByName("BlueValues"), privateDict.getByName("OtherBlues")]) { + if (!zones) { + continue; + } + for (let i = 1; i < zones.length; i += 2) { + if (zones[i] > maxZoneHeight) { + maxZoneHeight = zones[i]; + } + } + } + if (maxZoneHeight > 0) { + const PRECISION = 1e5; + const lowerBound = 0.5 / maxZoneHeight; + const minBlueScale = lowerBound <= DEFAULT_BLUE_SCALE ? Math.ceil(lowerBound * PRECISION) / PRECISION : -Infinity; + const maxBlueScale = Math.floor(PRECISION / maxZoneHeight) / PRECISION; + const clamped = MathClamp(blueScale, minBlueScale, maxBlueScale); + if (clamped !== blueScale) { + privateDict.setByName("BlueScale", clamped); + } + } + } + if (!privateDict.getByName("Subrs")) { + return; + } + const subrsOffset = privateDict.getByName("Subrs"); + const relativeOffset = offset + subrsOffset; + if (subrsOffset === 0 || relativeOffset >= this.bytes.length) { + this.emptyPrivateDictionary(parentDict); + return; + } + const subrsIndex = this.parseIndex(relativeOffset); + privateDict.subrsIndex = subrsIndex.obj; + } + parseCharsets(pos, length, strings, cid) { + if (pos === 0) { + return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, ISOAdobeCharset); + } else if (pos === 1) { + return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, ExpertCharset); + } else if (pos === 2) { + return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, ExpertSubsetCharset); + } + const { + bytes + } = this; + const format = bytes[pos++]; + const charset = [cid ? 0 : ".notdef"]; + let id, count, i; + length -= 1; + switch (format) { + case 0: + for (i = 0; i < length; i++) { + id = bytes[pos++] << 8 | bytes[pos++]; + charset.push(cid ? id : strings.get(id)); + } + break; + case 1: + while (charset.length <= length) { + id = bytes[pos++] << 8 | bytes[pos++]; + count = bytes[pos++]; + for (i = 0; i <= count; i++) { + charset.push(cid ? id++ : strings.get(id++)); + } + } + break; + case 2: + while (charset.length <= length) { + id = bytes[pos++] << 8 | bytes[pos++]; + count = bytes[pos++] << 8 | bytes[pos++]; + for (i = 0; i <= count; i++) { + charset.push(cid ? id++ : strings.get(id++)); + } + } + break; + default: + throw new FormatError("Unknown charset format"); + } + return new CFFCharset(false, format, charset); + } + parseEncoding(pos, properties, strings, charset) { + const encoding = Object.create(null); + const bytes = this.bytes; + let predefined = false; + let format, i, ii; + let raw = null; + function readSupplement() { + const supplementsCount = bytes[pos++]; + for (i = 0; i < supplementsCount; i++) { + const code = bytes[pos++]; + const sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff); + encoding[code] = charset.indexOf(strings.get(sid)); + } + } + if (pos === 0 || pos === 1) { + predefined = true; + format = pos; + const baseEncoding = pos ? ExpertEncoding : StandardEncoding; + for (i = 0, ii = charset.length; i < ii; i++) { + const index = baseEncoding.indexOf(charset[i]); + if (index !== -1) { + encoding[index] = i; + } + } + } else { + const dataStart = pos; + format = bytes[pos++]; + switch (format & 0x7f) { + case 0: + const glyphsCount = bytes[pos++]; + for (i = 1; i <= glyphsCount; i++) { + encoding[bytes[pos++]] = i; + } + break; + case 1: + const rangesCount = bytes[pos++]; + let gid = 1; + for (i = 0; i < rangesCount; i++) { + const start = bytes[pos++]; + const left = bytes[pos++]; + for (let j = start; j <= start + left; j++) { + encoding[j] = gid++; + } + } + break; + default: + throw new FormatError(`Unknown encoding format: ${format} in CFF`); + } + const dataEnd = pos; + if (format & 0x80) { + bytes[dataStart] &= 0x7f; + readSupplement(); + } + raw = bytes.subarray(dataStart, dataEnd); + } + format &= 0x7f; + return new CFFEncoding(predefined, format, encoding, raw); + } + parseFDSelect(pos, length) { + const bytes = this.bytes; + const format = bytes[pos++]; + const fdSelect = []; + let i; + switch (format) { + case 0: + for (i = 0; i < length; ++i) { + const id = bytes[pos++]; + fdSelect.push(id); + } + break; + case 3: + const rangesCount = bytes[pos++] << 8 | bytes[pos++]; + for (i = 0; i < rangesCount; ++i) { + let first = bytes[pos++] << 8 | bytes[pos++]; + if (i === 0 && first !== 0) { + warn("parseFDSelect: The first range must have a first GID of 0" + " -- trying to recover."); + first = 0; + } + const fdIndex = bytes[pos++]; + const next = bytes[pos] << 8 | bytes[pos + 1]; + for (let j = first; j < next; ++j) { + fdSelect.push(fdIndex); + } + } + pos += 2; + break; + default: + throw new FormatError(`parseFDSelect: Unknown format "${format}".`); + } + if (fdSelect.length !== length) { + throw new FormatError("parseFDSelect: Invalid font data."); + } + return new CFFFDSelect(format, fdSelect); + } +} +class CFF { + header = null; + names = []; + topDict = null; + strings = new CFFStrings(); + globalSubrIndex = null; + encoding = null; + charset = null; + charStrings = null; + fdArray = []; + fdSelect = null; + isCIDFont = false; + charStringCount = 0; + constructor(rawFileLength = 0) { + this.rawFileLength = rawFileLength; + } + duplicateFirstGlyph() { + if (this.charStrings.count >= 65535) { + warn("Not enough space in charstrings to duplicate first glyph."); + return; + } + const glyphZero = this.charStrings.get(0); + this.charStrings.add(glyphZero); + if (this.isCIDFont) { + this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]); + } + } + hasGlyphId(id) { + if (id < 0 || id >= this.charStrings.count) { + return false; + } + const glyph = this.charStrings.get(id); + return glyph.length > 0; + } +} +class CFFHeader { + constructor(major, minor, hdrSize, offSize) { + this.major = major; + this.minor = minor; + this.hdrSize = hdrSize; + this.offSize = offSize; + } +} +class CFFStrings { + strings = []; + get(index) { + if (index >= 0 && index <= NUM_STANDARD_CFF_STRINGS - 1) { + return CFFStandardStrings[index]; + } + if (index - NUM_STANDARD_CFF_STRINGS <= this.strings.length) { + return this.strings[index - NUM_STANDARD_CFF_STRINGS]; + } + return CFFStandardStrings[0]; + } + getSID(str) { + let index = CFFStandardStrings.indexOf(str); + if (index !== -1) { + return index; + } + index = this.strings.indexOf(str); + if (index !== -1) { + return index + NUM_STANDARD_CFF_STRINGS; + } + return -1; + } + add(value) { + this.strings.push(value); + } + get count() { + return this.strings.length; + } +} +class CFFIndex { + objects = []; + length = 0; + add(data) { + this.length += data.length; + this.objects.push(data); + } + set(index, data) { + this.length += data.length - this.objects[index].length; + this.objects[index] = data; + } + get(index) { + return this.objects[index]; + } + get count() { + return this.objects.length; + } +} +class CFFDict { + constructor(tables, strings) { + this.keyToNameMap = tables.keyToNameMap; + this.nameToKeyMap = tables.nameToKeyMap; + this.defaults = tables.defaults; + this.types = tables.types; + this.opcodes = tables.opcodes; + this.order = tables.order; + this.strings = strings; + this.values = Object.create(null); + } + setByKey(key, value) { + if (!(key in this.keyToNameMap)) { + return false; + } + if (value.length === 0) { + return true; + } + for (const val of value) { + if (isNaN(val)) { + warn(`Invalid CFFDict value: "${value}" for key "${key}".`); + return true; + } + } + const type = this.types[key]; + if (type === "num" || type === "sid" || type === "offset") { + value = value[0]; + } + this.values[key] = value; + return true; + } + setByName(name, value) { + if (!(name in this.nameToKeyMap)) { + throw new FormatError(`Invalid dictionary name "${name}"`); + } + this.values[this.nameToKeyMap[name]] = value; + } + hasName(name) { + return this.nameToKeyMap[name] in this.values; + } + getByName(name) { + if (!(name in this.nameToKeyMap)) { + throw new FormatError(`Invalid dictionary name ${name}"`); + } + const key = this.nameToKeyMap[name]; + if (!(key in this.values)) { + return this.defaults[key]; + } + return this.values[key]; + } + removeByName(name) { + delete this.values[this.nameToKeyMap[name]]; + } + static createTables(layout) { + const tables = { + keyToNameMap: {}, + nameToKeyMap: {}, + defaults: {}, + types: {}, + opcodes: {}, + order: [] + }; + for (const entry of layout) { + const key = Array.isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0]; + tables.keyToNameMap[key] = entry[1]; + tables.nameToKeyMap[entry[1]] = key; + tables.types[key] = entry[2]; + tables.defaults[key] = entry[3]; + tables.opcodes[key] = Array.isArray(entry[0]) ? entry[0] : [entry[0]]; + tables.order.push(key); + } + return tables; + } +} +const CFFTopDictLayout = [[[12, 30], "ROS", ["sid", "sid", "num"], null], [[12, 20], "SyntheticBase", "num", null], [0, "version", "sid", null], [1, "Notice", "sid", null], [[12, 0], "Copyright", "sid", null], [2, "FullName", "sid", null], [3, "FamilyName", "sid", null], [4, "Weight", "sid", null], [[12, 1], "isFixedPitch", "num", 0], [[12, 2], "ItalicAngle", "num", 0], [[12, 3], "UnderlinePosition", "num", -100], [[12, 4], "UnderlineThickness", "num", 50], [[12, 5], "PaintType", "num", 0], [[12, 6], "CharstringType", "num", 2], [[12, 7], "FontMatrix", ["num", "num", "num", "num", "num", "num"], [0.001, 0, 0, 0.001, 0, 0]], [13, "UniqueID", "num", null], [5, "FontBBox", ["num", "num", "num", "num"], [0, 0, 0, 0]], [[12, 8], "StrokeWidth", "num", 0], [14, "XUID", "array", null], [15, "charset", "offset", 0], [16, "Encoding", "offset", 0], [17, "CharStrings", "offset", 0], [18, "Private", ["offset", "offset"], null], [[12, 21], "PostScript", "sid", null], [[12, 22], "BaseFontName", "sid", null], [[12, 23], "BaseFontBlend", "delta", null], [[12, 31], "CIDFontVersion", "num", 0], [[12, 32], "CIDFontRevision", "num", 0], [[12, 33], "CIDFontType", "num", 0], [[12, 34], "CIDCount", "num", 8720], [[12, 35], "UIDBase", "num", null], [[12, 37], "FDSelect", "offset", null], [[12, 36], "FDArray", "offset", null], [[12, 38], "FontName", "sid", null]]; +class CFFTopDict extends CFFDict { + static get tables() { + return shadow(this, "tables", this.createTables(CFFTopDictLayout)); + } + constructor(strings) { + super(CFFTopDict.tables, strings); + this.privateDict = null; + } +} +const CFFPrivateDictLayout = [[6, "BlueValues", "delta", null], [7, "OtherBlues", "delta", null], [8, "FamilyBlues", "delta", null], [9, "FamilyOtherBlues", "delta", null], [[12, 9], "BlueScale", "num", DEFAULT_BLUE_SCALE], [[12, 10], "BlueShift", "num", DEFAULT_BLUE_SHIFT], [[12, 11], "BlueFuzz", "num", DEFAULT_BLUE_FUZZ], [10, "StdHW", "num", null], [11, "StdVW", "num", null], [[12, 12], "StemSnapH", "delta", null], [[12, 13], "StemSnapV", "delta", null], [[12, 14], "ForceBold", "num", 0], [[12, 17], "LanguageGroup", "num", 0], [[12, 18], "ExpansionFactor", "num", DEFAULT_EXPANSION_FACTOR], [[12, 19], "initialRandomSeed", "num", 0], [20, "defaultWidthX", "num", 0], [21, "nominalWidthX", "num", 0], [19, "Subrs", "offset", null]]; +class CFFPrivateDict extends CFFDict { + static get tables() { + return shadow(this, "tables", this.createTables(CFFPrivateDictLayout)); + } + constructor(strings) { + super(CFFPrivateDict.tables, strings); + this.subrsIndex = null; + } +} +const CFFCharsetPredefinedTypes = { + ISO_ADOBE: 0, + EXPERT: 1, + EXPERT_SUBSET: 2 +}; +class CFFCharset { + constructor(predefined, format, charset) { + this.predefined = predefined; + this.format = format; + this.charset = charset; + } +} +class CFFEncoding { + constructor(predefined, format, encoding, raw) { + this.predefined = predefined; + this.format = format; + this.encoding = encoding; + this.raw = raw; + } +} +class CFFFDSelect { + constructor(format, fdSelect) { + this.format = format; + this.fdSelect = fdSelect; + } + getFDIndex(glyphIndex) { + if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) { + return -1; + } + return this.fdSelect[glyphIndex]; + } +} +class CFFOffsetTracker { + offsets = Object.create(null); + isTracking(key) { + return key in this.offsets; + } + track(key, location) { + if (key in this.offsets) { + throw new FormatError(`Already tracking location of ${key}`); + } + this.offsets[key] = location; + } + offset(value) { + for (const key in this.offsets) { + this.offsets[key] += value; + } + } + setEntryLocation(key, values, output) { + if (!(key in this.offsets)) { + throw new FormatError(`Not tracking location of ${key}`); + } + const data = output.data; + const dataOffset = this.offsets[key]; + const size = 5; + for (let i = 0, ii = values.length; i < ii; ++i) { + const offset0 = i * size + dataOffset; + const offset1 = offset0 + 1; + const offset2 = offset0 + 2; + const offset3 = offset0 + 3; + const offset4 = offset0 + 4; + if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) { + throw new FormatError("writing to an offset that is not empty"); + } + const value = values[i]; + data[offset0] = 0x1d; + data[offset1] = value >> 24 & 0xff; + data[offset2] = value >> 16 & 0xff; + data[offset3] = value >> 8 & 0xff; + data[offset4] = value & 0xff; + } + } +} +class CFFCompiler { + constructor(cff) { + this.cff = cff; + } + compile() { + const cff = this.cff; + const output = new DataBuilder({ + minLength: cff.rawFileLength + }); + const header = this.compileHeader(cff.header); + output.setArray(header); + const nameIndex = this.compileNameIndex(cff.names); + output.setArray(nameIndex); + if (cff.isCIDFont) { + if (cff.topDict.hasName("FontMatrix")) { + const base = cff.topDict.getByName("FontMatrix"); + cff.topDict.removeByName("FontMatrix"); + for (const subDict of cff.fdArray) { + let matrix = base.slice(0); + if (subDict.hasName("FontMatrix")) { + matrix = Util.transform(matrix, subDict.getByName("FontMatrix")); + } + subDict.setByName("FontMatrix", matrix); + } + } + } + const xuid = cff.topDict.getByName("XUID"); + if (xuid?.length > 16) { + cff.topDict.removeByName("XUID"); + } + cff.topDict.setByName("charset", 0); + let compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont); + output.setArray(compiled.output); + const topDictTracker = compiled.trackers[0]; + const stringIndex = this.compileStringIndex(cff.strings.strings); + output.setArray(stringIndex); + const globalSubrIndex = this.compileIndex(cff.globalSubrIndex); + output.setArray(globalSubrIndex); + if (cff.encoding && cff.topDict.hasName("Encoding")) { + if (cff.encoding.predefined) { + topDictTracker.setEntryLocation("Encoding", [cff.encoding.format], output); + } else { + const encoding = this.compileEncoding(cff.encoding); + topDictTracker.setEntryLocation("Encoding", [output.length], output); + output.setArray(encoding); + } + } + const charset = this.compileCharset(cff.charset, cff.charStrings.count, cff.strings, cff.isCIDFont); + topDictTracker.setEntryLocation("charset", [output.length], output); + output.setArray(charset); + const charStrings = this.compileCharStrings(cff.charStrings); + topDictTracker.setEntryLocation("CharStrings", [output.length], output); + output.setArray(charStrings); + if (cff.isCIDFont) { + topDictTracker.setEntryLocation("FDSelect", [output.length], output); + const fdSelect = this.compileFDSelect(cff.fdSelect); + output.setArray(fdSelect); + compiled = this.compileTopDicts(cff.fdArray, output.length, true); + topDictTracker.setEntryLocation("FDArray", [output.length], output); + output.setArray(compiled.output); + const fontDictTrackers = compiled.trackers; + this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output); + } + this.compilePrivateDicts([cff.topDict], [topDictTracker], output); + output.setArray([0]); + return output.data; + } + encodeNumber(value) { + if (Number.isInteger(value)) { + return this.encodeInteger(value); + } + return this.encodeFloat(value); + } + static get EncodeFloatRegExp() { + return shadow(this, "EncodeFloatRegExp", /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/); + } + encodeFloat(num) { + let value = num.toString(); + const m = CFFCompiler.EncodeFloatRegExp.exec(value); + if (m) { + const epsilon = parseFloat("1e" + ((m[2] ? +m[2] : 0) + m[1].length)); + value = (Math.round(num * epsilon) / epsilon).toString(); + } + let nibbles = ""; + let i, ii; + for (i = 0, ii = value.length; i < ii; ++i) { + const a = value[i]; + if (a === "e") { + nibbles += value[++i] === "-" ? "c" : "b"; + } else if (a === ".") { + nibbles += "a"; + } else if (a === "-") { + nibbles += "e"; + } else { + nibbles += a; + } + } + nibbles += nibbles.length & 1 ? "f" : "ff"; + const out = [30]; + for (i = 0, ii = nibbles.length; i < ii; i += 2) { + out.push(parseInt(nibbles.substring(i, i + 2), 16)); + } + return out; + } + encodeInteger(value) { + let code; + if (value >= -107 && value <= 107) { + code = [value + 139]; + } else if (value >= 108 && value <= 1131) { + value -= 108; + code = [(value >> 8) + 247, value & 0xff]; + } else if (value >= -1131 && value <= -108) { + value = -value - 108; + code = [(value >> 8) + 251, value & 0xff]; + } else if (value >= -32768 && value <= 32767) { + code = [0x1c, value >> 8 & 0xff, value & 0xff]; + } else { + code = [0x1d, value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff]; + } + return code; + } + compileHeader(header) { + return [header.major, header.minor, 4, header.offSize]; + } + compileNameIndex(names) { + const nameIndex = new CFFIndex(); + for (const name of names) { + const length = Math.min(name.length, 127); + let sanitizedName = new Array(length); + for (let j = 0; j < length; j++) { + let char = name[j]; + if (char < "!" || char > "~" || char === "[" || char === "]" || char === "(" || char === ")" || char === "{" || char === "}" || char === "<" || char === ">" || char === "/" || char === "%") { + char = "_"; + } + sanitizedName[j] = char; + } + sanitizedName = sanitizedName.join(""); + if (sanitizedName === "") { + sanitizedName = "Bad_Font_Name"; + } + nameIndex.add(stringToBytes(sanitizedName)); + } + return this.compileIndex(nameIndex); + } + compileTopDicts(dicts, length, removeCidKeys) { + const fontDictTrackers = []; + let fdArrayIndex = new CFFIndex(); + for (const fontDict of dicts) { + if (removeCidKeys) { + fontDict.removeByName("CIDFontVersion"); + fontDict.removeByName("CIDFontRevision"); + fontDict.removeByName("CIDFontType"); + fontDict.removeByName("CIDCount"); + fontDict.removeByName("UIDBase"); + } + const fontDictTracker = new CFFOffsetTracker(); + const fontDictData = this.compileDict(fontDict, fontDictTracker); + fontDictTrackers.push(fontDictTracker); + fdArrayIndex.add(fontDictData); + fontDictTracker.offset(length); + } + fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers); + return { + trackers: fontDictTrackers, + output: fdArrayIndex + }; + } + compilePrivateDicts(dicts, trackers, output) { + for (let i = 0, ii = dicts.length; i < ii; ++i) { + const fontDict = dicts[i]; + const privateDict = fontDict.privateDict; + if (!privateDict || !fontDict.hasName("Private")) { + throw new FormatError("There must be a private dictionary."); + } + const privateDictTracker = new CFFOffsetTracker(); + const privateDictData = this.compileDict(privateDict, privateDictTracker); + let outputLength = output.length; + privateDictTracker.offset(outputLength); + if (!privateDictData.length) { + outputLength = 0; + } + trackers[i].setEntryLocation("Private", [privateDictData.length, outputLength], output); + output.setArray(privateDictData); + if (privateDict.subrsIndex && privateDict.hasName("Subrs")) { + const subrs = this.compileIndex(privateDict.subrsIndex); + privateDictTracker.setEntryLocation("Subrs", [privateDictData.length], output); + output.setArray(subrs); + } + } + } + compileDict(dict, offsetTracker) { + const out = []; + for (const key of dict.order) { + if (!(key in dict.values)) { + continue; + } + let values = dict.values[key]; + let types = dict.types[key]; + if (!Array.isArray(types)) { + types = [types]; + } + if (!Array.isArray(values)) { + values = [values]; + } + if (values.length === 0) { + continue; + } + for (let j = 0, jj = types.length; j < jj; ++j) { + const type = types[j]; + const value = values[j]; + switch (type) { + case "num": + case "sid": + out.push(...this.encodeNumber(value)); + break; + case "offset": + const name = dict.keyToNameMap[key]; + if (!offsetTracker.isTracking(name)) { + offsetTracker.track(name, out.length); + } + out.push(0x1d, 0, 0, 0, 0); + break; + case "array": + case "delta": + out.push(...this.encodeNumber(value)); + for (let k = 1, kk = values.length; k < kk; ++k) { + out.push(...this.encodeNumber(values[k])); + } + break; + default: + throw new FormatError(`Unknown data type of ${type}`); + } + } + out.push(...dict.opcodes[key]); + } + return out; + } + compileStringIndex(strings) { + const stringIndex = new CFFIndex(); + for (const string of strings) { + stringIndex.add(stringToBytes(string)); + } + return this.compileIndex(stringIndex); + } + compileCharStrings(charStrings) { + const charStringsIndex = new CFFIndex(); + for (let i = 0; i < charStrings.count; i++) { + const glyph = charStrings.get(i); + if (glyph.length === 0) { + charStringsIndex.add(new Uint8Array([0x8b, 0x0e])); + continue; + } + charStringsIndex.add(glyph); + } + return this.compileIndex(charStringsIndex); + } + compileCharset(charset, numGlyphs, strings, isCIDFont) { + let out; + const numGlyphsLessNotDef = numGlyphs - 1; + if (isCIDFont) { + const nLeft = numGlyphsLessNotDef - 1; + out = new Uint8Array([2, 0, 1, nLeft >> 8 & 0xff, nLeft & 0xff]); + } else { + const length = 1 + numGlyphsLessNotDef * 2; + out = new Uint8Array(length); + let charsetIndex = 0; + const numCharsets = charset.charset.length; + let warned = false; + for (let i = 1; i < out.length; i += 2) { + let sid = 0; + if (charsetIndex < numCharsets) { + const name = charset.charset[charsetIndex++]; + sid = strings.getSID(name); + if (sid === -1) { + sid = 0; + if (!warned) { + warned = true; + warn(`Couldn't find ${name} in CFF strings`); + } + } + } + out[i] = sid >> 8 & 0xff; + out[i + 1] = sid & 0xff; + } + } + return out; + } + compileEncoding(encoding) { + return encoding.raw; + } + compileFDSelect(fdSelect) { + const format = fdSelect.format; + let out, i; + switch (format) { + case 0: + out = new Uint8Array(1 + fdSelect.fdSelect.length); + out[0] = format; + out.set(fdSelect.fdSelect, 1); + break; + case 3: + const start = 0; + let lastFD = fdSelect.fdSelect[0]; + const ranges = [format, 0, 0, start >> 8 & 0xff, start & 0xff, lastFD]; + for (i = 1; i < fdSelect.fdSelect.length; i++) { + const currentFD = fdSelect.fdSelect[i]; + if (currentFD !== lastFD) { + ranges.push(i >> 8 & 0xff, i & 0xff, currentFD); + lastFD = currentFD; + } + } + const numRanges = (ranges.length - 3) / 3; + ranges[1] = numRanges >> 8 & 0xff; + ranges[2] = numRanges & 0xff; + ranges.push(i >> 8 & 0xff, i & 0xff); + out = new Uint8Array(ranges); + break; + } + return out; + } + compileIndex(index, trackers = []) { + const objects = index.objects; + const count = objects.length; + if (count === 0) { + return new Uint8Array(2); + } + let lastOffset = 1, + i; + for (i = 0; i < count; ++i) { + lastOffset += objects[i].length; + } + let offsetSize; + if (lastOffset < 0x100) { + offsetSize = 1; + } else if (lastOffset < 0x10000) { + offsetSize = 2; + } else if (lastOffset < 0x1000000) { + offsetSize = 3; + } else { + offsetSize = 4; + } + const data = new Uint8Array(2 + offsetSize * (count + 1) + lastOffset); + let pos = 0; + data[pos++] = count >> 8 & 0xff; + data[pos++] = count & 0xff; + data[pos++] = offsetSize; + let relativeOffset = 1; + for (i = 0; i < count + 1; i++) { + if (offsetSize === 1) { + data[pos++] = relativeOffset & 0xff; + } else if (offsetSize === 2) { + data[pos++] = relativeOffset >> 8 & 0xff; + data[pos++] = relativeOffset & 0xff; + } else if (offsetSize === 3) { + data[pos++] = relativeOffset >> 16 & 0xff; + data[pos++] = relativeOffset >> 8 & 0xff; + data[pos++] = relativeOffset & 0xff; + } else { + data[pos++] = relativeOffset >>> 24 & 0xff; + data[pos++] = relativeOffset >> 16 & 0xff; + data[pos++] = relativeOffset >> 8 & 0xff; + data[pos++] = relativeOffset & 0xff; + } + if (objects[i]) { + relativeOffset += objects[i].length; + } + } + for (i = 0; i < count; i++) { + trackers[i]?.offset(pos); + data.set(objects[i], pos); + pos += objects[i].length; + } + return data; + } +} -;// CONCATENATED MODULE: ./src/core/standard_fonts.js +;// ./src/core/standard_fonts.js const getStdFontMap = getLookupTableFactory(function (t) { @@ -17611,6 +19535,7 @@ t.CourierNewPSMT = "Courier"; t["Helvetica-BoldItalic"] = "Helvetica-BoldOblique"; t["Helvetica-Italic"] = "Helvetica-Oblique"; + t["HelveticaLTStd-Bold"] = "Helvetica-Bold"; t["Symbol-Bold"] = "Symbol"; t["Symbol-BoldItalic"] = "Symbol"; t["Symbol-Italic"] = "Symbol"; @@ -17663,6 +19588,10 @@ t["ComicSansMS-Bold"] = "Comic Sans MS-Bold"; t["ComicSansMS-BoldItalic"] = "Comic Sans MS-BoldItalic"; t["ComicSansMS-Italic"] = "Comic Sans MS-Italic"; + t.GillSansMT = "Helvetica"; + t["GillSansMT-Bold"] = "Helvetica-Bold"; + t["GillSansMT-BoldItalic"] = "Helvetica-BoldOblique"; + t["GillSansMT-Italic"] = "Helvetica-Oblique"; t.Impact = "Helvetica"; t["ItcSymbol-Bold"] = "Helvetica-Bold"; t["ItcSymbol-BoldItalic"] = "Helvetica-BoldOblique"; @@ -18059,6 +19988,70 @@ t[337] = 9552; t[493] = 1039; t[494] = 1040; + t[570] = 1040; + t[571] = 1041; + t[572] = 1042; + t[573] = 1043; + t[574] = 1044; + t[575] = 1045; + t[576] = 1046; + t[577] = 1047; + t[578] = 1048; + t[579] = 1049; + t[580] = 1050; + t[581] = 1051; + t[582] = 1052; + t[583] = 1053; + t[584] = 1054; + t[585] = 1055; + t[586] = 1056; + t[587] = 1057; + t[588] = 1058; + t[589] = 1059; + t[590] = 1060; + t[591] = 1061; + t[592] = 1062; + t[593] = 1063; + t[594] = 1064; + t[595] = 1065; + t[596] = 1066; + t[597] = 1067; + t[598] = 1068; + t[599] = 1069; + t[600] = 1070; + t[601] = 1071; + t[602] = 1072; + t[603] = 1073; + t[604] = 1074; + t[605] = 1075; + t[606] = 1076; + t[607] = 1077; + t[608] = 1078; + t[609] = 1079; + t[610] = 1080; + t[611] = 1081; + t[612] = 1082; + t[613] = 1083; + t[614] = 1084; + t[615] = 1085; + t[616] = 1086; + t[617] = 1087; + t[618] = 1088; + t[619] = 1089; + t[620] = 1090; + t[621] = 1091; + t[622] = 1092; + t[623] = 1093; + t[624] = 1094; + t[625] = 1095; + t[626] = 1096; + t[627] = 1097; + t[628] = 1098; + t[629] = 1099; + t[630] = 1100; + t[631] = 1101; + t[632] = 1102; + t[633] = 1103; t[672] = 1488; t[673] = 1489; t[674] = 1490; @@ -18381,6 +20374,7 @@ t[896] = 91; t[897] = 93; t[923] = 64; + t[940] = 163; t[1004] = 48; t[1005] = 49; t[1006] = 50; @@ -18405,7 +20399,649 @@ return !!(getStdFontMap()[fontName] || getNonStdFontMap()[fontName] || getSerifFonts()[fontName] || getSymbolsFonts()[fontName]); } -;// CONCATENATED MODULE: ./src/core/to_unicode_map.js +;// ./src/core/glyf.js +const ON_CURVE_POINT = 1 << 0; +const X_SHORT_VECTOR = 1 << 1; +const Y_SHORT_VECTOR = 1 << 2; +const REPEAT_FLAG = 1 << 3; +const X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR = 1 << 4; +const Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR = 1 << 5; +const OVERLAP_SIMPLE = 1 << 6; +const ARG_1_AND_2_ARE_WORDS = 1 << 0; +const ARGS_ARE_XY_VALUES = 1 << 1; +const WE_HAVE_A_SCALE = 1 << 3; +const MORE_COMPONENTS = 1 << 5; +const WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6; +const WE_HAVE_A_TWO_BY_TWO = 1 << 7; +const WE_HAVE_INSTRUCTIONS = 1 << 8; +const GLYPH_HEADER_SIZE = 10; +class GlyfTable { + constructor({ + glyfTable, + isGlyphLocationsLong, + locaTable, + numGlyphs + }) { + this.glyphs = []; + const loca = new DataView(locaTable.buffer, locaTable.byteOffset, locaTable.byteLength); + const glyf = new DataView(glyfTable.buffer, glyfTable.byteOffset, glyfTable.byteLength); + const offsetSize = isGlyphLocationsLong ? 4 : 2; + let prev = isGlyphLocationsLong ? loca.getUint32(0) : 2 * loca.getUint16(0); + let pos = 0; + for (let i = 0; i < numGlyphs; i++) { + pos += offsetSize; + const next = isGlyphLocationsLong ? loca.getUint32(pos) : 2 * loca.getUint16(pos); + if (next === prev) { + this.glyphs.push(new Glyph({})); + continue; + } + const glyph = Glyph.parse(prev, glyf); + this.glyphs.push(glyph); + prev = next; + } + } + getSize() { + return Math.sumPrecise(this.glyphs.map(g => g.getSize() + 3 & ~3)); + } + write() { + const totalSize = this.getSize(); + const glyfTable = new DataView(new ArrayBuffer(totalSize)); + const isLocationLong = totalSize > 0x1fffe; + const offsetSize = isLocationLong ? 4 : 2; + const locaTable = new DataView(new ArrayBuffer((this.glyphs.length + 1) * offsetSize)); + if (isLocationLong) { + locaTable.setUint32(0, 0); + } else { + locaTable.setUint16(0, 0); + } + let pos = 0; + let locaIndex = 0; + for (const glyph of this.glyphs) { + pos += glyph.write(pos, glyfTable); + pos = pos + 3 & ~3; + locaIndex += offsetSize; + if (isLocationLong) { + locaTable.setUint32(locaIndex, pos); + } else { + locaTable.setUint16(locaIndex, pos >> 1); + } + } + return { + isLocationLong, + loca: new Uint8Array(locaTable.buffer), + glyf: new Uint8Array(glyfTable.buffer) + }; + } + scale(factors) { + for (let i = 0, ii = this.glyphs.length; i < ii; i++) { + this.glyphs[i].scale(factors[i]); + } + } +} +class Glyph { + constructor({ + header = null, + simple = null, + composites = null + }) { + this.header = header; + this.simple = simple; + this.composites = composites; + } + static parse(pos, glyf) { + const [read, header] = GlyphHeader.parse(pos, glyf); + pos += read; + if (header.numberOfContours < 0) { + const composites = []; + while (true) { + const [n, composite] = CompositeGlyph.parse(pos, glyf); + pos += n; + composites.push(composite); + if (!(composite.flags & MORE_COMPONENTS)) { + break; + } + } + return new Glyph({ + header, + composites + }); + } + const simple = SimpleGlyph.parse(pos, glyf, header.numberOfContours); + return new Glyph({ + header, + simple + }); + } + getSize() { + if (!this.header) { + return 0; + } + const size = this.simple ? this.simple.getSize() : Math.sumPrecise(this.composites.map(c => c.getSize())); + return this.header.getSize() + size; + } + write(pos, buf) { + if (!this.header) { + return 0; + } + const spos = pos; + pos += this.header.write(pos, buf); + if (this.simple) { + pos += this.simple.write(pos, buf); + } else { + for (const composite of this.composites) { + pos += composite.write(pos, buf); + } + } + return pos - spos; + } + scale(factor) { + if (!this.header) { + return; + } + const xMiddle = (this.header.xMin + this.header.xMax) / 2; + this.header.scale(xMiddle, factor); + if (this.simple) { + this.simple.scale(xMiddle, factor); + } else { + for (const composite of this.composites) { + composite.scale(xMiddle, factor); + } + } + } +} +class GlyphHeader { + constructor({ + numberOfContours, + xMin, + yMin, + xMax, + yMax + }) { + this.numberOfContours = numberOfContours; + this.xMin = xMin; + this.yMin = yMin; + this.xMax = xMax; + this.yMax = yMax; + } + static parse(pos, glyf) { + return [GLYPH_HEADER_SIZE, new GlyphHeader({ + numberOfContours: glyf.getInt16(pos), + xMin: glyf.getInt16(pos + 2), + yMin: glyf.getInt16(pos + 4), + xMax: glyf.getInt16(pos + 6), + yMax: glyf.getInt16(pos + 8) + })]; + } + getSize() { + return GLYPH_HEADER_SIZE; + } + write(pos, buf) { + buf.setInt16(pos, this.numberOfContours); + buf.setInt16(pos + 2, this.xMin); + buf.setInt16(pos + 4, this.yMin); + buf.setInt16(pos + 6, this.xMax); + buf.setInt16(pos + 8, this.yMax); + return GLYPH_HEADER_SIZE; + } + scale(x, factor) { + this.xMin = Math.round(x + (this.xMin - x) * factor); + this.xMax = Math.round(x + (this.xMax - x) * factor); + } +} +class Contour { + constructor({ + flags, + xCoordinates, + yCoordinates + }) { + this.xCoordinates = xCoordinates; + this.yCoordinates = yCoordinates; + this.flags = flags; + } +} +class SimpleGlyph { + constructor({ + contours, + instructions + }) { + this.contours = contours; + this.instructions = instructions; + } + static parse(pos, glyf, numberOfContours) { + const endPtsOfContours = []; + for (let i = 0; i < numberOfContours; i++) { + const endPt = glyf.getUint16(pos); + pos += 2; + endPtsOfContours.push(endPt); + } + const numberOfPt = endPtsOfContours[numberOfContours - 1] + 1; + const instructionLength = glyf.getUint16(pos); + pos += 2; + const instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength); + pos += instructionLength; + const flags = []; + for (let i = 0; i < numberOfPt; pos++, i++) { + let flag = glyf.getUint8(pos); + flags.push(flag); + if (flag & REPEAT_FLAG) { + const count = glyf.getUint8(++pos); + flag ^= REPEAT_FLAG; + for (let m = 0; m < count; m++) { + flags.push(flag); + } + i += count; + } + } + const allXCoordinates = []; + let xCoordinates = []; + let yCoordinates = []; + let pointFlags = []; + const contours = []; + let endPtsOfContoursIndex = 0; + let lastCoordinate = 0; + for (let i = 0; i < numberOfPt; i++) { + const flag = flags[i]; + if (flag & X_SHORT_VECTOR) { + const x = glyf.getUint8(pos++); + lastCoordinate += flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR ? x : -x; + xCoordinates.push(lastCoordinate); + } else if (flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR) { + xCoordinates.push(lastCoordinate); + } else { + lastCoordinate += glyf.getInt16(pos); + pos += 2; + xCoordinates.push(lastCoordinate); + } + if (endPtsOfContours[endPtsOfContoursIndex] === i) { + endPtsOfContoursIndex++; + allXCoordinates.push(xCoordinates); + xCoordinates = []; + } + } + lastCoordinate = 0; + endPtsOfContoursIndex = 0; + for (let i = 0; i < numberOfPt; i++) { + const flag = flags[i]; + if (flag & Y_SHORT_VECTOR) { + const y = glyf.getUint8(pos++); + lastCoordinate += flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR ? y : -y; + yCoordinates.push(lastCoordinate); + } else if (flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR) { + yCoordinates.push(lastCoordinate); + } else { + lastCoordinate += glyf.getInt16(pos); + pos += 2; + yCoordinates.push(lastCoordinate); + } + pointFlags.push(flag & ON_CURVE_POINT | flag & OVERLAP_SIMPLE); + if (endPtsOfContours[endPtsOfContoursIndex] === i) { + xCoordinates = allXCoordinates[endPtsOfContoursIndex]; + endPtsOfContoursIndex++; + contours.push(new Contour({ + flags: pointFlags, + xCoordinates, + yCoordinates + })); + yCoordinates = []; + pointFlags = []; + } + } + return new SimpleGlyph({ + contours, + instructions + }); + } + getSize() { + let size = this.contours.length * 2 + 2 + this.instructions.length; + let lastX = 0; + let lastY = 0; + for (const contour of this.contours) { + size += contour.flags.length; + for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { + const x = contour.xCoordinates[i]; + const y = contour.yCoordinates[i]; + let abs = Math.abs(x - lastX); + if (abs > 255) { + size += 2; + } else if (abs > 0) { + size += 1; + } + lastX = x; + abs = Math.abs(y - lastY); + if (abs > 255) { + size += 2; + } else if (abs > 0) { + size += 1; + } + lastY = y; + } + } + return size; + } + write(pos, buf) { + const spos = pos; + const xCoordinates = []; + const yCoordinates = []; + const flags = []; + let lastX = 0; + let lastY = 0; + for (const contour of this.contours) { + for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { + let flag = contour.flags[i]; + const x = contour.xCoordinates[i]; + let delta = x - lastX; + if (delta === 0) { + flag |= X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR; + xCoordinates.push(0); + } else { + const abs = Math.abs(delta); + if (abs <= 255) { + flag |= delta >= 0 ? X_SHORT_VECTOR | X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR : X_SHORT_VECTOR; + xCoordinates.push(abs); + } else { + xCoordinates.push(delta); + } + } + lastX = x; + const y = contour.yCoordinates[i]; + delta = y - lastY; + if (delta === 0) { + flag |= Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR; + yCoordinates.push(0); + } else { + const abs = Math.abs(delta); + if (abs <= 255) { + flag |= delta >= 0 ? Y_SHORT_VECTOR | Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR : Y_SHORT_VECTOR; + yCoordinates.push(abs); + } else { + yCoordinates.push(delta); + } + } + lastY = y; + flags.push(flag); + } + buf.setUint16(pos, xCoordinates.length - 1); + pos += 2; + } + buf.setUint16(pos, this.instructions.length); + pos += 2; + if (this.instructions.length) { + new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos); + pos += this.instructions.length; + } + for (const flag of flags) { + buf.setUint8(pos++, flag); + } + for (let i = 0, ii = xCoordinates.length; i < ii; i++) { + const x = xCoordinates[i]; + const flag = flags[i]; + if (flag & X_SHORT_VECTOR) { + buf.setUint8(pos++, x); + } else if (!(flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR)) { + buf.setInt16(pos, x); + pos += 2; + } + } + for (let i = 0, ii = yCoordinates.length; i < ii; i++) { + const y = yCoordinates[i]; + const flag = flags[i]; + if (flag & Y_SHORT_VECTOR) { + buf.setUint8(pos++, y); + } else if (!(flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR)) { + buf.setInt16(pos, y); + pos += 2; + } + } + return pos - spos; + } + scale(x, factor) { + for (const contour of this.contours) { + if (contour.xCoordinates.length === 0) { + continue; + } + for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { + contour.xCoordinates[i] = Math.round(x + (contour.xCoordinates[i] - x) * factor); + } + } + } +} +class CompositeGlyph { + constructor({ + flags, + glyphIndex, + argument1, + argument2, + transf, + instructions + }) { + this.flags = flags; + this.glyphIndex = glyphIndex; + this.argument1 = argument1; + this.argument2 = argument2; + this.transf = transf; + this.instructions = instructions; + } + static parse(pos, glyf) { + const spos = pos; + const transf = []; + let flags = glyf.getUint16(pos); + const glyphIndex = glyf.getUint16(pos + 2); + pos += 4; + let argument1, argument2; + if (flags & ARG_1_AND_2_ARE_WORDS) { + if (flags & ARGS_ARE_XY_VALUES) { + argument1 = glyf.getInt16(pos); + argument2 = glyf.getInt16(pos + 2); + } else { + argument1 = glyf.getUint16(pos); + argument2 = glyf.getUint16(pos + 2); + } + pos += 4; + flags ^= ARG_1_AND_2_ARE_WORDS; + } else { + if (flags & ARGS_ARE_XY_VALUES) { + argument1 = glyf.getInt8(pos); + argument2 = glyf.getInt8(pos + 1); + } else { + argument1 = glyf.getUint8(pos); + argument2 = glyf.getUint8(pos + 1); + } + pos += 2; + } + if (flags & WE_HAVE_A_SCALE) { + transf.push(glyf.getUint16(pos)); + pos += 2; + } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) { + transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2)); + pos += 4; + } else if (flags & WE_HAVE_A_TWO_BY_TWO) { + transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2), glyf.getUint16(pos + 4), glyf.getUint16(pos + 6)); + pos += 8; + } + let instructions = null; + if (flags & WE_HAVE_INSTRUCTIONS) { + const instructionLength = glyf.getUint16(pos); + pos += 2; + instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength); + pos += instructionLength; + } + return [pos - spos, new CompositeGlyph({ + flags, + glyphIndex, + argument1, + argument2, + transf, + instructions + })]; + } + getSize() { + let size = 2 + 2 + this.transf.length * 2; + if (this.flags & WE_HAVE_INSTRUCTIONS) { + size += 2 + this.instructions.length; + } + size += 2; + if (this.flags & 2) { + if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 127)) { + size += 2; + } + } else if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) { + size += 2; + } + return size; + } + write(pos, buf) { + const spos = pos; + if (this.flags & ARGS_ARE_XY_VALUES) { + if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 127)) { + this.flags |= ARG_1_AND_2_ARE_WORDS; + } + } else if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) { + this.flags |= ARG_1_AND_2_ARE_WORDS; + } + buf.setUint16(pos, this.flags); + buf.setUint16(pos + 2, this.glyphIndex); + pos += 4; + if (this.flags & ARG_1_AND_2_ARE_WORDS) { + if (this.flags & ARGS_ARE_XY_VALUES) { + buf.setInt16(pos, this.argument1); + buf.setInt16(pos + 2, this.argument2); + } else { + buf.setUint16(pos, this.argument1); + buf.setUint16(pos + 2, this.argument2); + } + pos += 4; + } else { + buf.setUint8(pos, this.argument1); + buf.setUint8(pos + 1, this.argument2); + pos += 2; + } + if (this.flags & WE_HAVE_INSTRUCTIONS) { + buf.setUint16(pos, this.instructions.length); + pos += 2; + if (this.instructions.length) { + new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos); + pos += this.instructions.length; + } + } + return pos - spos; + } + scale(x, factor) {} +} +function pruneCompositeGlyphCycles(glyfTable, locaEntries, numGlyphs) { + const glyf = new DataView(glyfTable.buffer, glyfTable.byteOffset, glyfTable.byteLength); + const components = new Array(numGlyphs); + for (let i = 0; i < numGlyphs; i++) { + const offset = locaEntries[i].offset; + const endOffset = Math.min(locaEntries[i].endOffset, glyf.byteLength); + if (endOffset - offset <= GLYPH_HEADER_SIZE || glyf.getInt16(offset) >= 0) { + continue; + } + const comps = []; + let p = offset + GLYPH_HEADER_SIZE; + while (p + 4 <= endOffset) { + const flags = glyf.getUint16(p); + const gid = glyf.getUint16(p + 2); + let size = 4 + (flags & ARG_1_AND_2_ARE_WORDS ? 4 : 2); + if (flags & WE_HAVE_A_SCALE) { + size += 2; + } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) { + size += 4; + } else if (flags & WE_HAVE_A_TWO_BY_TWO) { + size += 8; + } + comps.push({ + gid, + offset: p, + size, + flags + }); + p += size; + if (!(flags & MORE_COMPONENTS)) { + break; + } + } + if (comps.length) { + components[i] = comps; + } + } + const WHITE = 0, + GRAY = 1, + BLACK = 2; + const state = new Uint8Array(numGlyphs); + const backEdges = new Map(); + for (let start = 0; start < numGlyphs; start++) { + if (state[start] !== WHITE || !components[start]) { + continue; + } + const stack = [{ + node: start, + idx: 0 + }]; + state[start] = GRAY; + while (stack.length > 0) { + const top = stack.at(-1); + const comps = components[top.node]; + if (!comps || top.idx >= comps.length) { + state[top.node] = BLACK; + stack.pop(); + continue; + } + const compIdx = top.idx++; + const next = comps[compIdx].gid; + if (next >= numGlyphs || state[next] === BLACK) { + continue; + } + if (state[next] === WHITE) { + state[next] = GRAY; + stack.push({ + node: next, + idx: 0 + }); + continue; + } + let removeSet = backEdges.get(top.node); + if (!removeSet) { + removeSet = new Set(); + backEdges.set(top.node, removeSet); + } + removeSet.add(compIdx); + } + } + const droppedGlyphs = new Set(); + for (const [gIdx, removeSet] of backEdges) { + const comps = components[gIdx]; + const remaining = []; + for (let ci = 0; ci < comps.length; ci++) { + if (!removeSet.has(ci)) { + remaining.push(comps[ci]); + } + } + if (remaining.length === 0) { + droppedGlyphs.add(gIdx); + continue; + } + const start = locaEntries[gIdx].offset; + const endOffset = Math.min(locaEntries[gIdx].endOffset, glyf.byteLength); + let writePos = start + GLYPH_HEADER_SIZE; + for (let ci = 0; ci < remaining.length; ci++) { + const c = remaining[ci]; + const isLast = ci === remaining.length - 1; + let newFlags = c.flags & ~WE_HAVE_INSTRUCTIONS; + newFlags = isLast ? newFlags & ~MORE_COMPONENTS : newFlags | MORE_COMPONENTS; + if (writePos !== c.offset) { + glyfTable.copyWithin(writePos, c.offset, c.offset + c.size); + } + glyf.setUint16(writePos, newFlags); + writePos += c.size; + } + if (writePos < endOffset) { + glyfTable.fill(0, writePos, endOffset); + } + } + return droppedGlyphs; +} + +;// ./src/core/to_unicode_map.js class ToUnicodeMap { constructor(cmap = []) { @@ -18416,7 +21052,7 @@ } forEach(callback) { for (const charCode in this._map) { - callback(charCode, this._map[charCode].charCodeAt(0)); + callback(charCode, this._map[charCode].codePointAt(0)); } } has(i) { @@ -18473,7 +21109,7 @@ } } -;// CONCATENATED MODULE: ./src/core/cff_font.js +;// ./src/core/cff_font.js @@ -18487,9 +21123,10 @@ this.seacs = this.cff.seacs; try { this.data = compiler.compile(); - } catch { - warn("Failed to compile font " + properties.loadedName); - this.data = file; + } catch (ex) { + warn(`Failed to compile font "${properties.loadedName}": "${ex}".`); + file.reset(); + this.data = file.getBytes(); } this._createBuiltInEncoding(); } @@ -18575,80 +21212,66 @@ } } -;// CONCATENATED MODULE: ./src/core/font_renderer.js +;// ./src/core/font_renderer.js -function getUint32(data, offset) { - return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0; -} -function getUint16(data, offset) { - return data[offset] << 8 | data[offset + 1]; -} -function getInt16(data, offset) { - return (data[offset] << 24 | data[offset + 1] << 16) >> 16; -} -function getInt8(data, offset) { - return data[offset] << 24 >> 24; -} -function getFloat214(data, offset) { - return getInt16(data, offset) / 16384; + +function getFloat214(view, offset) { + return view.getInt16(offset) / 16384; } function getSubroutineBias(subrs) { const numSubrs = subrs.length; - let bias = 32768; - if (numSubrs < 1240) { - bias = 107; - } else if (numSubrs < 33900) { - bias = 1131; + if (numSubrs >= 33900) { + return 32768; } - return bias; + return numSubrs < 1240 ? 107 : 1131; } function parseCmap(data, start, end) { - const offset = getUint16(data, start + 2) === 1 ? getUint32(data, start + 8) : getUint32(data, start + 16); - const format = getUint16(data, start + offset); + const view = new DataView(data.buffer, data.byteOffset, data.byteLength); + const offset = view.getUint16(start + 2) === 1 ? view.getUint32(start + 8) : view.getUint32(start + 16); + const format = view.getUint16(start + offset); let ranges, p, i; if (format === 4) { - getUint16(data, start + offset + 2); - const segCount = getUint16(data, start + offset + 6) >> 1; + const segCount = view.getUint16(start + offset + 6) >> 1; p = start + offset + 14; ranges = []; for (i = 0; i < segCount; i++, p += 2) { ranges[i] = { - end: getUint16(data, p) + end: view.getUint16(p) }; } p += 2; for (i = 0; i < segCount; i++, p += 2) { - ranges[i].start = getUint16(data, p); + ranges[i].start = view.getUint16(p); } for (i = 0; i < segCount; i++, p += 2) { - ranges[i].idDelta = getUint16(data, p); + ranges[i].idDelta = view.getUint16(p); } for (i = 0; i < segCount; i++, p += 2) { - let idOffset = getUint16(data, p); + let idOffset = view.getUint16(p); if (idOffset === 0) { continue; } ranges[i].ids = []; for (let j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) { - ranges[i].ids[j] = getUint16(data, p + idOffset); + ranges[i].ids[j] = view.getUint16(p + idOffset); idOffset += 2; } } return ranges; } else if (format === 12) { - const groups = getUint32(data, start + offset + 12); + const groups = view.getUint32(start + offset + 12); p = start + offset + 16; ranges = []; for (i = 0; i < groups; i++) { - start = getUint32(data, p); + start = view.getUint32(p); ranges.push({ start, - end: getUint32(data, p + 4), - idDelta: getUint32(data, p + 8) - start + end: view.getUint32(p + 4), + idDelta: view.getUint32(p + 8) - start }); p += 12; } @@ -18670,18 +21293,19 @@ }; } function parseGlyfTable(glyf, loca, isGlyphLocationsLong) { + const view = new DataView(loca.buffer, loca.byteOffset, loca.byteLength); let itemSize, itemDecode; if (isGlyphLocationsLong) { itemSize = 4; - itemDecode = getUint32; + itemDecode = (dv, offset) => dv.getUint32(offset); } else { itemSize = 2; - itemDecode = (data, offset) => 2 * getUint16(data, offset); + itemDecode = (dv, offset) => 2 * dv.getUint16(offset); } const glyphs = []; - let startOffset = itemDecode(loca, 0); + let startOffset = itemDecode(view, 0); for (let j = itemSize; j < loca.length; j += itemSize) { - const endOffset = itemDecode(loca, j); + const endOffset = itemDecode(view, j); glyphs.push(glyf.subarray(startOffset, endOffset)); startOffset = endOffset; } @@ -18708,49 +21332,54 @@ glyphId: gid }; } -function compileGlyf(code, cmds, font) { +function compileGlyf(code, cmds, font, visitedGlyphs = new Set()) { + if (!code?.length) { + return; + } + if (visitedGlyphs.has(code)) { + warn("compileGlyf: skipping recursive composite glyph reference."); + return; + } + visitedGlyphs.add(code); function moveTo(x, y) { - cmds.push({ - cmd: "moveTo", - args: [x, y] - }); + if (firstPoint) { + cmds.add(DrawOPS.lineTo, firstPoint); + } + firstPoint = [x, y]; + cmds.add(DrawOPS.moveTo, [x, y]); } function lineTo(x, y) { - cmds.push({ - cmd: "lineTo", - args: [x, y] - }); + cmds.add(DrawOPS.lineTo, [x, y]); } function quadraticCurveTo(xa, ya, x, y) { - cmds.push({ - cmd: "quadraticCurveTo", - args: [xa, ya, x, y] - }); + cmds.add(DrawOPS.quadraticCurveTo, [xa, ya, x, y]); } + const view = new DataView(code.buffer, code.byteOffset, code.byteLength); let i = 0; - const numberOfContours = getInt16(code, i); + const numberOfContours = view.getInt16(i); let flags; + let firstPoint = null; let x = 0, y = 0; i += 10; if (numberOfContours < 0) { do { - flags = getUint16(code, i); - const glyphIndex = getUint16(code, i + 2); + flags = view.getUint16(i); + const glyphIndex = view.getUint16(i + 2); i += 4; let arg1, arg2; if (flags & 0x01) { if (flags & 0x02) { - arg1 = getInt16(code, i); - arg2 = getInt16(code, i + 2); + arg1 = view.getInt16(i); + arg2 = view.getInt16(i + 2); } else { - arg1 = getUint16(code, i); - arg2 = getUint16(code, i + 2); + arg1 = view.getUint16(i); + arg2 = view.getUint16(i + 2); } i += 4; } else if (flags & 0x02) { - arg1 = getInt8(code, i++); - arg2 = getInt8(code, i++); + arg1 = view.getInt8(i++); + arg2 = view.getInt8(i++); } else { arg1 = code[i++]; arg2 = code[i++]; @@ -18767,42 +21396,36 @@ scale01 = 0, scale10 = 0; if (flags & 0x08) { - scaleX = scaleY = getFloat214(code, i); + scaleX = scaleY = getFloat214(view, i); i += 2; } else if (flags & 0x40) { - scaleX = getFloat214(code, i); - scaleY = getFloat214(code, i + 2); + scaleX = getFloat214(view, i); + scaleY = getFloat214(view, i + 2); i += 4; } else if (flags & 0x80) { - scaleX = getFloat214(code, i); - scale01 = getFloat214(code, i + 2); - scale10 = getFloat214(code, i + 4); - scaleY = getFloat214(code, i + 6); + scaleX = getFloat214(view, i); + scale01 = getFloat214(view, i + 2); + scale10 = getFloat214(view, i + 4); + scaleY = getFloat214(view, i + 6); i += 8; } const subglyph = font.glyphs[glyphIndex]; if (subglyph) { - cmds.push({ - cmd: "save" - }, { - cmd: "transform", - args: [scaleX, scale01, scale10, scaleY, x, y] - }); + cmds.save(); + cmds.transform([scaleX, scale01, scale10, scaleY, x, y]); if (!(flags & 0x02)) {} - compileGlyf(subglyph, cmds, font); - cmds.push({ - cmd: "restore" - }); + compileGlyf(subglyph, cmds, font, visitedGlyphs); + cmds.restore(); } } while (flags & 0x20); } else { const endPtsOfContours = []; let j, jj; for (j = 0; j < numberOfContours; j++) { - endPtsOfContours.push(getUint16(code, i)); + endPtsOfContours.push(view.getUint16(i)); i += 2; } - const instructionLength = getUint16(code, i); + const instructionLength = view.getUint16(i); i += 2 + instructionLength; const numberOfPoints = endPtsOfContours.at(-1) + 1; const points = []; @@ -18821,7 +21444,7 @@ for (j = 0; j < numberOfPoints; j++) { switch (points[j].flags & 0x12) { case 0x00: - x += getInt16(code, i); + x += view.getInt16(i); i += 2; break; case 0x02: @@ -18836,7 +21459,7 @@ for (j = 0; j < numberOfPoints; j++) { switch (points[j].flags & 0x24) { case 0x00: - y += getInt16(code, i); + y += view.getInt16(i); i += 2; break; case 0x04: @@ -18879,31 +21502,29 @@ startPoint = endPoint + 1; } } + visitedGlyphs.delete(code); } function compileCharString(charStringCode, cmds, font, glyphId) { function moveTo(x, y) { - cmds.push({ - cmd: "moveTo", - args: [x, y] - }); + if (firstPoint) { + cmds.add(DrawOPS.lineTo, firstPoint); + } + firstPoint = [x, y]; + cmds.add(DrawOPS.moveTo, [x, y]); } function lineTo(x, y) { - cmds.push({ - cmd: "lineTo", - args: [x, y] - }); + cmds.add(DrawOPS.lineTo, [x, y]); } function bezierCurveTo(x1, y1, x2, y2, x, y) { - cmds.push({ - cmd: "bezierCurveTo", - args: [x1, y1, x2, y2, x, y] - }); + cmds.add(DrawOPS.curveTo, [x1, y1, x2, y2, x, y]); } const stack = []; let x = 0, y = 0; let stems = 0; + let firstPoint = null; function parse(code) { + const view = new DataView(code.buffer, code.byteOffset, code.byteLength); let i = 0; while (i < code.length) { let stackClean = false; @@ -19067,17 +21688,11 @@ const bchar = stack.pop(); y = stack.pop(); x = stack.pop(); - cmds.push({ - cmd: "save" - }, { - cmd: "translate", - args: [x, y] - }); + cmds.save(); + cmds.translate(x, y); let cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[StandardEncoding[achar]])); compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId); - cmds.push({ - cmd: "restore" - }); + cmds.restore(); cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[StandardEncoding[bchar]])); compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId); } @@ -19168,7 +21783,7 @@ } break; case 28: - stack.push((code[i] << 24 | code[i + 1] << 16) >> 16); + stack.push(view.getInt16(i)); i += 2; break; case 29: @@ -19231,7 +21846,7 @@ } else if (v < 255) { stack.push(-(v - 251) * 256 - code[i++] - 108); } else { - stack.push((code[i] << 24 | code[i + 1] << 16 | code[i + 2] << 8 | code[i + 3]) / 65536); + stack.push(view.getInt32(i) / 65536); i += 4; } break; @@ -19243,42 +21858,76 @@ } parse(charStringCode); } -const NOOP = []; +class Commands { + cmds = []; + transformStack = []; + currentTransform = [1, 0, 0, 1, 0, 0]; + add(cmd, args) { + if (args) { + const { + currentTransform + } = this; + for (let i = 0, ii = args.length; i < ii; i += 2) { + Util.applyTransform(args, currentTransform, i); + } + this.cmds.push(cmd, ...args); + } else { + this.cmds.push(cmd); + } + } + transform(transf) { + this.currentTransform = Util.transform(this.currentTransform, transf); + } + translate(x, y) { + this.transform([1, 0, 0, 1, x, y]); + } + save() { + this.transformStack.push(this.currentTransform.slice()); + } + restore() { + this.currentTransform = this.transformStack.pop() || [1, 0, 0, 1, 0, 0]; + } + getPath() { + if (FeatureTest.isFloat16ArraySupported) { + return new Float16Array(this.cmds); + } + return new Float32Array(this.cmds); + } +} class CompiledFont { constructor(fontMatrix) { - if (this.constructor === CompiledFont) { - unreachable("Cannot initialize CompiledFont."); - } this.fontMatrix = fontMatrix; this.compiledGlyphs = Object.create(null); this.compiledCharCodeToGlyphId = Object.create(null); } + static get NOOP() { + return shadow(this, "NOOP", FeatureTest.isFloat16ArraySupported ? new Float16Array(0) : new Float32Array(0)); + } getPathJs(unicode) { const { charCode, glyphId } = lookupCmap(this.cmap, unicode); - let fn = this.compiledGlyphs[glyphId]; - if (!fn) { + let fn = this.compiledGlyphs[glyphId], + compileEx; + if (fn === undefined) { try { fn = this.compileGlyph(this.glyphs[glyphId], glyphId); - this.compiledGlyphs[glyphId] = fn; } catch (ex) { - this.compiledGlyphs[glyphId] = NOOP; - if (this.compiledCharCodeToGlyphId[charCode] === undefined) { - this.compiledCharCodeToGlyphId[charCode] = glyphId; - } - throw ex; + fn = CompiledFont.NOOP; + compileEx = ex; } + this.compiledGlyphs[glyphId] = fn; } - if (this.compiledCharCodeToGlyphId[charCode] === undefined) { - this.compiledCharCodeToGlyphId[charCode] = glyphId; + this.compiledCharCodeToGlyphId[charCode] ??= glyphId; + if (compileEx) { + throw compileEx; } return fn; } compileGlyph(code, glyphId) { - if (!code || code.length === 0 || code[0] === 14) { - return NOOP; + if (!code?.length || code[0] === 14) { + return CompiledFont.NOOP; } let fontMatrix = this.fontMatrix; if (this.isCFFCIDFont) { @@ -19290,20 +21939,12 @@ warn("Invalid fd index for glyph index."); } } - const cmds = [{ - cmd: "save" - }, { - cmd: "transform", - args: fontMatrix.slice() - }, { - cmd: "scale", - args: ["size", "-size"] - }]; + assert(isNumberArray(fontMatrix, 6), "Expected a valid fontMatrix."); + const cmds = new Commands(); + cmds.transform(fontMatrix.slice()); this.compileGlyphImpl(code, cmds, glyphId); - cmds.push({ - cmd: "restore" - }); - return cmds; + cmds.add(DrawOPS.closePath); + return cmds.getPath(); } compileGlyphImpl() { unreachable("Children classes should implement this."); @@ -19327,13 +21968,13 @@ } } class Type2Compiled extends CompiledFont { - constructor(cffInfo, cmap, fontMatrix, glyphNameMap) { + constructor(cffInfo, cmap, fontMatrix) { super(fontMatrix || [0.001, 0, 0, 0.001, 0, 0]); this.glyphs = cffInfo.glyphs; this.gsubrs = cffInfo.gsubrs || []; this.subrs = cffInfo.subrs || []; this.cmap = cmap; - this.glyphNameMap = glyphNameMap || getGlyphsUnicode(); + this.glyphNameMap = getGlyphsUnicode(); this.gsubrsBias = getSubroutineBias(this.gsubrs); this.subrsBias = getSubroutineBias(this.subrs); this.isCFFCIDFont = cffInfo.isCFFCIDFont; @@ -19346,13 +21987,14 @@ } class FontRendererFactory { static create(font, seacAnalysisEnabled) { - const data = new Uint8Array(font.data); + const data = new Uint8Array(font.data), + view = new DataView(data.buffer); let cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm; - const numTables = getUint16(data, 4); + const numTables = view.getUint16(4); for (let i = 0, p = 12; i < numTables; i++, p += 16) { const tag = bytesToString(data.subarray(p, p + 4)); - const offset = getUint32(data, p + 8); - const length = getUint32(data, p + 12); + const offset = view.getUint32(p + 8); + const length = view.getUint32(p + 12); switch (tag) { case "cmap": cmap = parseCmap(data, offset, offset + length); @@ -19364,8 +22006,8 @@ loca = data.subarray(offset, offset + length); break; case "head": - unitsPerEm = getUint16(data, offset + 18); - indexToLocFormat = getUint16(data, offset + 50); + unitsPerEm = view.getUint16(offset + 18); + indexToLocFormat = view.getUint16(offset + 50); break; case "CFF ": cff = parseCff(data, offset, offset + length, seacAnalysisEnabled); @@ -19376,11 +22018,11 @@ const fontMatrix = !unitsPerEm ? font.fontMatrix : [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0]; return new TrueTypeCompiled(parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix); } - return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap); + return new Type2Compiled(cff, cmap, font.fontMatrix); } } -;// CONCATENATED MODULE: ./src/core/metrics.js +;// ./src/core/metrics.js const getMetrics = getLookupTableFactory(function (t) { t.Courier = 600; @@ -22407,569 +25049,14 @@ }; }); -;// CONCATENATED MODULE: ./src/core/glyf.js -const ON_CURVE_POINT = 1 << 0; -const X_SHORT_VECTOR = 1 << 1; -const Y_SHORT_VECTOR = 1 << 2; -const REPEAT_FLAG = 1 << 3; -const X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR = 1 << 4; -const Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR = 1 << 5; -const OVERLAP_SIMPLE = 1 << 6; -const ARG_1_AND_2_ARE_WORDS = 1 << 0; -const ARGS_ARE_XY_VALUES = 1 << 1; -const WE_HAVE_A_SCALE = 1 << 3; -const MORE_COMPONENTS = 1 << 5; -const WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6; -const WE_HAVE_A_TWO_BY_TWO = 1 << 7; -const WE_HAVE_INSTRUCTIONS = 1 << 8; -class GlyfTable { - constructor({ - glyfTable, - isGlyphLocationsLong, - locaTable, - numGlyphs - }) { - this.glyphs = []; - const loca = new DataView(locaTable.buffer, locaTable.byteOffset, locaTable.byteLength); - const glyf = new DataView(glyfTable.buffer, glyfTable.byteOffset, glyfTable.byteLength); - const offsetSize = isGlyphLocationsLong ? 4 : 2; - let prev = isGlyphLocationsLong ? loca.getUint32(0) : 2 * loca.getUint16(0); - let pos = 0; - for (let i = 0; i < numGlyphs; i++) { - pos += offsetSize; - const next = isGlyphLocationsLong ? loca.getUint32(pos) : 2 * loca.getUint16(pos); - if (next === prev) { - this.glyphs.push(new Glyph({})); - continue; - } - const glyph = Glyph.parse(prev, glyf); - this.glyphs.push(glyph); - prev = next; - } - } - getSize() { - return this.glyphs.reduce((a, g) => { - const size = g.getSize(); - return a + (size + 3 & ~3); - }, 0); - } - write() { - const totalSize = this.getSize(); - const glyfTable = new DataView(new ArrayBuffer(totalSize)); - const isLocationLong = totalSize > 0x1fffe; - const offsetSize = isLocationLong ? 4 : 2; - const locaTable = new DataView(new ArrayBuffer((this.glyphs.length + 1) * offsetSize)); - if (isLocationLong) { - locaTable.setUint32(0, 0); - } else { - locaTable.setUint16(0, 0); - } - let pos = 0; - let locaIndex = 0; - for (const glyph of this.glyphs) { - pos += glyph.write(pos, glyfTable); - pos = pos + 3 & ~3; - locaIndex += offsetSize; - if (isLocationLong) { - locaTable.setUint32(locaIndex, pos); - } else { - locaTable.setUint16(locaIndex, pos >> 1); - } - } - return { - isLocationLong, - loca: new Uint8Array(locaTable.buffer), - glyf: new Uint8Array(glyfTable.buffer) - }; - } - scale(factors) { - for (let i = 0, ii = this.glyphs.length; i < ii; i++) { - this.glyphs[i].scale(factors[i]); - } - } -} -class Glyph { - constructor({ - header = null, - simple = null, - composites = null - }) { - this.header = header; - this.simple = simple; - this.composites = composites; - } - static parse(pos, glyf) { - const [read, header] = GlyphHeader.parse(pos, glyf); - pos += read; - if (header.numberOfContours < 0) { - const composites = []; - while (true) { - const [n, composite] = CompositeGlyph.parse(pos, glyf); - pos += n; - composites.push(composite); - if (!(composite.flags & MORE_COMPONENTS)) { - break; - } - } - return new Glyph({ - header, - composites - }); - } - const simple = SimpleGlyph.parse(pos, glyf, header.numberOfContours); - return new Glyph({ - header, - simple - }); - } - getSize() { - if (!this.header) { - return 0; - } - const size = this.simple ? this.simple.getSize() : this.composites.reduce((a, c) => a + c.getSize(), 0); - return this.header.getSize() + size; - } - write(pos, buf) { - if (!this.header) { - return 0; - } - const spos = pos; - pos += this.header.write(pos, buf); - if (this.simple) { - pos += this.simple.write(pos, buf); - } else { - for (const composite of this.composites) { - pos += composite.write(pos, buf); - } - } - return pos - spos; - } - scale(factor) { - if (!this.header) { - return; - } - const xMiddle = (this.header.xMin + this.header.xMax) / 2; - this.header.scale(xMiddle, factor); - if (this.simple) { - this.simple.scale(xMiddle, factor); - } else { - for (const composite of this.composites) { - composite.scale(xMiddle, factor); - } - } - } -} -class GlyphHeader { - constructor({ - numberOfContours, - xMin, - yMin, - xMax, - yMax - }) { - this.numberOfContours = numberOfContours; - this.xMin = xMin; - this.yMin = yMin; - this.xMax = xMax; - this.yMax = yMax; - } - static parse(pos, glyf) { - return [10, new GlyphHeader({ - numberOfContours: glyf.getInt16(pos), - xMin: glyf.getInt16(pos + 2), - yMin: glyf.getInt16(pos + 4), - xMax: glyf.getInt16(pos + 6), - yMax: glyf.getInt16(pos + 8) - })]; - } - getSize() { - return 10; - } - write(pos, buf) { - buf.setInt16(pos, this.numberOfContours); - buf.setInt16(pos + 2, this.xMin); - buf.setInt16(pos + 4, this.yMin); - buf.setInt16(pos + 6, this.xMax); - buf.setInt16(pos + 8, this.yMax); - return 10; - } - scale(x, factor) { - this.xMin = Math.round(x + (this.xMin - x) * factor); - this.xMax = Math.round(x + (this.xMax - x) * factor); - } -} -class Contour { - constructor({ - flags, - xCoordinates, - yCoordinates - }) { - this.xCoordinates = xCoordinates; - this.yCoordinates = yCoordinates; - this.flags = flags; - } -} -class SimpleGlyph { - constructor({ - contours, - instructions - }) { - this.contours = contours; - this.instructions = instructions; - } - static parse(pos, glyf, numberOfContours) { - const endPtsOfContours = []; - for (let i = 0; i < numberOfContours; i++) { - const endPt = glyf.getUint16(pos); - pos += 2; - endPtsOfContours.push(endPt); - } - const numberOfPt = endPtsOfContours[numberOfContours - 1] + 1; - const instructionLength = glyf.getUint16(pos); - pos += 2; - const instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength); - pos += instructionLength; - const flags = []; - for (let i = 0; i < numberOfPt; pos++, i++) { - let flag = glyf.getUint8(pos); - flags.push(flag); - if (flag & REPEAT_FLAG) { - const count = glyf.getUint8(++pos); - flag ^= REPEAT_FLAG; - for (let m = 0; m < count; m++) { - flags.push(flag); - } - i += count; - } - } - const allXCoordinates = []; - let xCoordinates = []; - let yCoordinates = []; - let pointFlags = []; - const contours = []; - let endPtsOfContoursIndex = 0; - let lastCoordinate = 0; - for (let i = 0; i < numberOfPt; i++) { - const flag = flags[i]; - if (flag & X_SHORT_VECTOR) { - const x = glyf.getUint8(pos++); - lastCoordinate += flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR ? x : -x; - xCoordinates.push(lastCoordinate); - } else if (flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR) { - xCoordinates.push(lastCoordinate); - } else { - lastCoordinate += glyf.getInt16(pos); - pos += 2; - xCoordinates.push(lastCoordinate); - } - if (endPtsOfContours[endPtsOfContoursIndex] === i) { - endPtsOfContoursIndex++; - allXCoordinates.push(xCoordinates); - xCoordinates = []; - } - } - lastCoordinate = 0; - endPtsOfContoursIndex = 0; - for (let i = 0; i < numberOfPt; i++) { - const flag = flags[i]; - if (flag & Y_SHORT_VECTOR) { - const y = glyf.getUint8(pos++); - lastCoordinate += flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR ? y : -y; - yCoordinates.push(lastCoordinate); - } else if (flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR) { - yCoordinates.push(lastCoordinate); - } else { - lastCoordinate += glyf.getInt16(pos); - pos += 2; - yCoordinates.push(lastCoordinate); - } - pointFlags.push(flag & ON_CURVE_POINT | flag & OVERLAP_SIMPLE); - if (endPtsOfContours[endPtsOfContoursIndex] === i) { - xCoordinates = allXCoordinates[endPtsOfContoursIndex]; - endPtsOfContoursIndex++; - contours.push(new Contour({ - flags: pointFlags, - xCoordinates, - yCoordinates - })); - yCoordinates = []; - pointFlags = []; - } - } - return new SimpleGlyph({ - contours, - instructions - }); - } - getSize() { - let size = this.contours.length * 2 + 2 + this.instructions.length; - let lastX = 0; - let lastY = 0; - for (const contour of this.contours) { - size += contour.flags.length; - for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { - const x = contour.xCoordinates[i]; - const y = contour.yCoordinates[i]; - let abs = Math.abs(x - lastX); - if (abs > 255) { - size += 2; - } else if (abs > 0) { - size += 1; - } - lastX = x; - abs = Math.abs(y - lastY); - if (abs > 255) { - size += 2; - } else if (abs > 0) { - size += 1; - } - lastY = y; - } - } - return size; - } - write(pos, buf) { - const spos = pos; - const xCoordinates = []; - const yCoordinates = []; - const flags = []; - let lastX = 0; - let lastY = 0; - for (const contour of this.contours) { - for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { - let flag = contour.flags[i]; - const x = contour.xCoordinates[i]; - let delta = x - lastX; - if (delta === 0) { - flag |= X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR; - xCoordinates.push(0); - } else { - const abs = Math.abs(delta); - if (abs <= 255) { - flag |= delta >= 0 ? X_SHORT_VECTOR | X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR : X_SHORT_VECTOR; - xCoordinates.push(abs); - } else { - xCoordinates.push(delta); - } - } - lastX = x; - const y = contour.yCoordinates[i]; - delta = y - lastY; - if (delta === 0) { - flag |= Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR; - yCoordinates.push(0); - } else { - const abs = Math.abs(delta); - if (abs <= 255) { - flag |= delta >= 0 ? Y_SHORT_VECTOR | Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR : Y_SHORT_VECTOR; - yCoordinates.push(abs); - } else { - yCoordinates.push(delta); - } - } - lastY = y; - flags.push(flag); - } - buf.setUint16(pos, xCoordinates.length - 1); - pos += 2; - } - buf.setUint16(pos, this.instructions.length); - pos += 2; - if (this.instructions.length) { - new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos); - pos += this.instructions.length; - } - for (const flag of flags) { - buf.setUint8(pos++, flag); - } - for (let i = 0, ii = xCoordinates.length; i < ii; i++) { - const x = xCoordinates[i]; - const flag = flags[i]; - if (flag & X_SHORT_VECTOR) { - buf.setUint8(pos++, x); - } else if (!(flag & X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR)) { - buf.setInt16(pos, x); - pos += 2; - } - } - for (let i = 0, ii = yCoordinates.length; i < ii; i++) { - const y = yCoordinates[i]; - const flag = flags[i]; - if (flag & Y_SHORT_VECTOR) { - buf.setUint8(pos++, y); - } else if (!(flag & Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR)) { - buf.setInt16(pos, y); - pos += 2; - } - } - return pos - spos; - } - scale(x, factor) { - for (const contour of this.contours) { - if (contour.xCoordinates.length === 0) { - continue; - } - for (let i = 0, ii = contour.xCoordinates.length; i < ii; i++) { - contour.xCoordinates[i] = Math.round(x + (contour.xCoordinates[i] - x) * factor); - } - } - } -} -class CompositeGlyph { - constructor({ - flags, - glyphIndex, - argument1, - argument2, - transf, - instructions - }) { - this.flags = flags; - this.glyphIndex = glyphIndex; - this.argument1 = argument1; - this.argument2 = argument2; - this.transf = transf; - this.instructions = instructions; - } - static parse(pos, glyf) { - const spos = pos; - const transf = []; - let flags = glyf.getUint16(pos); - const glyphIndex = glyf.getUint16(pos + 2); - pos += 4; - let argument1, argument2; - if (flags & ARG_1_AND_2_ARE_WORDS) { - if (flags & ARGS_ARE_XY_VALUES) { - argument1 = glyf.getInt16(pos); - argument2 = glyf.getInt16(pos + 2); - } else { - argument1 = glyf.getUint16(pos); - argument2 = glyf.getUint16(pos + 2); - } - pos += 4; - flags ^= ARG_1_AND_2_ARE_WORDS; - } else { - if (flags & ARGS_ARE_XY_VALUES) { - argument1 = glyf.getInt8(pos); - argument2 = glyf.getInt8(pos + 1); - } else { - argument1 = glyf.getUint8(pos); - argument2 = glyf.getUint8(pos + 1); - } - pos += 2; - } - if (flags & WE_HAVE_A_SCALE) { - transf.push(glyf.getUint16(pos)); - pos += 2; - } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) { - transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2)); - pos += 4; - } else if (flags & WE_HAVE_A_TWO_BY_TWO) { - transf.push(glyf.getUint16(pos), glyf.getUint16(pos + 2), glyf.getUint16(pos + 4), glyf.getUint16(pos + 6)); - pos += 8; - } - let instructions = null; - if (flags & WE_HAVE_INSTRUCTIONS) { - const instructionLength = glyf.getUint16(pos); - pos += 2; - instructions = new Uint8Array(glyf).slice(pos, pos + instructionLength); - pos += instructionLength; - } - return [pos - spos, new CompositeGlyph({ - flags, - glyphIndex, - argument1, - argument2, - transf, - instructions - })]; - } - getSize() { - let size = 2 + 2 + this.transf.length * 2; - if (this.flags & WE_HAVE_INSTRUCTIONS) { - size += 2 + this.instructions.length; - } - size += 2; - if (this.flags & 2) { - if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 127)) { - size += 2; - } - } else if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) { - size += 2; - } - return size; - } - write(pos, buf) { - const spos = pos; - if (this.flags & ARGS_ARE_XY_VALUES) { - if (!(this.argument1 >= -128 && this.argument1 <= 127 && this.argument2 >= -128 && this.argument2 <= 127)) { - this.flags |= ARG_1_AND_2_ARE_WORDS; - } - } else if (!(this.argument1 >= 0 && this.argument1 <= 255 && this.argument2 >= 0 && this.argument2 <= 255)) { - this.flags |= ARG_1_AND_2_ARE_WORDS; - } - buf.setUint16(pos, this.flags); - buf.setUint16(pos + 2, this.glyphIndex); - pos += 4; - if (this.flags & ARG_1_AND_2_ARE_WORDS) { - if (this.flags & ARGS_ARE_XY_VALUES) { - buf.setInt16(pos, this.argument1); - buf.setInt16(pos + 2, this.argument2); - } else { - buf.setUint16(pos, this.argument1); - buf.setUint16(pos + 2, this.argument2); - } - pos += 4; - } else { - buf.setUint8(pos, this.argument1); - buf.setUint8(pos + 1, this.argument2); - pos += 2; - } - if (this.flags & WE_HAVE_INSTRUCTIONS) { - buf.setUint16(pos, this.instructions.length); - pos += 2; - if (this.instructions.length) { - new Uint8Array(buf.buffer, 0, buf.buffer.byteLength).set(this.instructions, pos); - pos += this.instructions.length; - } - } - return pos - spos; - } - scale(x, factor) {} -} - -;// CONCATENATED MODULE: ./src/core/opentype_file_builder.js +;// ./src/core/opentype_file_builder.js - -function writeInt16(dest, offset, num) { - dest[offset] = num >> 8 & 0xff; - dest[offset + 1] = num & 0xff; -} -function writeInt32(dest, offset, num) { - dest[offset] = num >> 24 & 0xff; - dest[offset + 1] = num >> 16 & 0xff; - dest[offset + 2] = num >> 8 & 0xff; - dest[offset + 3] = num & 0xff; -} -function writeData(dest, offset, data) { - if (data instanceof Uint8Array) { - dest.set(data, offset); - } else if (typeof data === "string") { - for (let i = 0, ii = data.length; i < ii; i++) { - dest[offset++] = data.charCodeAt(i) & 0xff; - } - } else { - for (const num of data) { - dest[offset++] = num & 0xff; - } - } -} const OTF_HEADER_SIZE = 12; const OTF_TABLE_ENTRY_SIZE = 16; class OpenTypeFileBuilder { + #tables = new Map(); constructor(sfnt) { this.sfnt = sfnt; - this.tables = Object.create(null); } static getSearchParams(entriesCount, entrySize) { let maxPower2 = 1, @@ -22987,64 +25074,58 @@ } toArray() { let sfnt = this.sfnt; - const tables = this.tables; - const tablesNames = Object.keys(tables); - tablesNames.sort(); + const tables = this.#tables; + const tablesNames = [...tables.keys()].sort(); const numTables = tablesNames.length; - let i, j, jj, table, tableName; let offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE; const tableOffsets = [offset]; - for (i = 0; i < numTables; i++) { - table = tables[tablesNames[i]]; + for (let i = 0; i < numTables; i++) { + const table = tables.get(tablesNames[i]); const paddedLength = (table.length + 3 & ~3) >>> 0; offset += paddedLength; tableOffsets.push(offset); } - const file = new Uint8Array(offset); - for (i = 0; i < numTables; i++) { - table = tables[tablesNames[i]]; - writeData(file, tableOffsets[i], table); + const file = new Uint8Array(offset), + view = new DataView(file.buffer); + for (let i = 0; i < numTables; i++) { + const table = tables.get(tablesNames[i]); + file.set(table, tableOffsets[i]); } if (sfnt === "true") { - sfnt = string32(0x00010000); + sfnt = "\x00\x01\x00\x00"; } - file[0] = sfnt.charCodeAt(0) & 0xff; - file[1] = sfnt.charCodeAt(1) & 0xff; - file[2] = sfnt.charCodeAt(2) & 0xff; - file[3] = sfnt.charCodeAt(3) & 0xff; - writeInt16(file, 4, numTables); + file.set(stringToBytes(sfnt), 0); + view.setInt16(4, numTables); const searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16); - writeInt16(file, 6, searchParams.range); - writeInt16(file, 8, searchParams.entry); - writeInt16(file, 10, searchParams.rangeShift); + view.setInt16(6, searchParams.range); + view.setInt16(8, searchParams.entry); + view.setInt16(10, searchParams.rangeShift); offset = OTF_HEADER_SIZE; - for (i = 0; i < numTables; i++) { - tableName = tablesNames[i]; - file[offset] = tableName.charCodeAt(0) & 0xff; - file[offset + 1] = tableName.charCodeAt(1) & 0xff; - file[offset + 2] = tableName.charCodeAt(2) & 0xff; - file[offset + 3] = tableName.charCodeAt(3) & 0xff; + for (let i = 0; i < numTables; i++) { + const tableName = tablesNames[i]; + file.set(stringToBytes(tableName), offset); let checksum = 0; - for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) { - const quad = readUint32(file, j); + for (let j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) { + const quad = view.getUint32(j); checksum = checksum + quad >>> 0; } - writeInt32(file, offset + 4, checksum); - writeInt32(file, offset + 8, tableOffsets[i]); - writeInt32(file, offset + 12, tables[tableName].length); + view.setInt32(offset + 4, checksum); + view.setInt32(offset + 8, tableOffsets[i]); + view.setInt32(offset + 12, tables.get(tableName).length); offset += OTF_TABLE_ENTRY_SIZE; } + this.#tables.clear(); return file; } addTable(tag, data) { - if (tag in this.tables) { - throw new Error("Table " + tag + " already exists"); + if (this.#tables.has(tag)) { + throw new Error(`Table ${tag} already exists`); } - this.tables[tag] = data; + this.#tables.set(tag, data); } } -;// CONCATENATED MODULE: ./src/core/type1_parser.js +;// ./src/core/type1_parser.js @@ -23068,13 +25149,11 @@ hvcurveto: [31] }; class Type1CharString { - constructor() { - this.width = 0; - this.lsb = 0; - this.flexing = false; - this.output = []; - this.stack = []; - } + width = 0; + lsb = 0; + flexing = false; + output = []; + stack = []; convert(encoded, subrs, seacAnalysisEnabled) { const count = encoded.length; let error = false; @@ -23428,8 +25507,7 @@ const stream = this.stream; const subrs = [], charstrings = []; - const privateData = Object.create(null); - privateData.lenIV = 4; + const privateData = new Map([["lenIV", 4]]); const program = { subrs: [], charstrings: [], @@ -23438,6 +25516,8 @@ } }; let token, length, data, lenIV; + let subrsParsed = false; + let charStringsParsed = false; while ((token = this.getToken()) !== null) { if (token !== "/") { continue; @@ -23445,6 +25525,10 @@ token = this.getToken(); switch (token) { case "CharStrings": + if (charStringsParsed) { + break; + } + charStringsParsed = true; this.getToken(); this.getToken(); this.getToken(); @@ -23461,7 +25545,7 @@ length = this.readInt(); this.getToken(); data = length > 0 ? stream.getBytes(length) : new Uint8Array(0); - lenIV = program.properties.privateData.lenIV; + lenIV = privateData.get("lenIV"); const encoded = this.readCharStrings(data, lenIV); this.nextChar(); token = this.getToken(); @@ -23477,6 +25561,10 @@ } break; case "Subrs": + if (subrsParsed) { + break; + } + subrsParsed = true; this.readInt(); this.getToken(); while (this.getToken() === "dup") { @@ -23484,7 +25572,7 @@ length = this.readInt(); this.getToken(); data = length > 0 ? stream.getBytes(length) : new Uint8Array(0); - lenIV = program.properties.privateData.lenIV; + lenIV = privateData.get("lenIV"); const encoded = this.readCharStrings(data, lenIV); this.nextChar(); token = this.getToken(); @@ -23500,29 +25588,29 @@ case "FamilyOtherBlues": const blueArray = this.readNumberArray(); if (blueArray.length > 0 && blueArray.length % 2 === 0 && HINTING_ENABLED) { - program.properties.privateData[token] = blueArray; + privateData.set(token, blueArray); } break; case "StemSnapH": case "StemSnapV": - program.properties.privateData[token] = this.readNumberArray(); + privateData.set(token, this.readNumberArray()); break; case "StdHW": case "StdVW": - program.properties.privateData[token] = this.readNumberArray()[0]; + privateData.set(token, this.readNumberArray()[0]); break; case "BlueShift": case "lenIV": case "BlueFuzz": case "BlueScale": case "LanguageGroup": - program.properties.privateData[token] = this.readNumber(); + privateData.set(token, this.readNumber()); break; case "ExpansionFactor": - program.properties.privateData[token] = this.readNumber() || 0.06; + privateData.set(token, this.readNumber() || 0.06); break; case "ForceBold": - program.properties.privateData[token] = this.readBoolean(); + privateData.set(token, this.readBoolean()); break; } } @@ -23532,10 +25620,7 @@ } of charstrings) { const charString = new Type1CharString(); const error = charString.convert(encoded, subrs, this.seacAnalysisEnabled); - let output = charString.output; - if (error) { - output = [14]; - } + const output = !error ? charString.output : [14]; const charStringObject = { glyphName: glyph, charstring: output, @@ -23557,6 +25642,214 @@ } return program; } + extractCidKeyedFontProgram(properties) { + const stream = this.stream; + const privateData = new Map([["lenIV", 4]]); + const program = { + subrs: [], + charstrings: [], + properties: { + privateData + } + }; + let cidCount = 0; + let cidMapOffset = -1; + let fdBytes = 1; + let gdBytes = 0; + let subrMapOffset = -1; + let sdBytes = 0; + let subrCount = 0; + let startDataLength = 0; + let startDataIsHex = false; + let foundStartData = false; + const previousTokens = []; + function rememberToken(value) { + previousTokens.push(value); + if (previousTokens.length > 4) { + previousTokens.shift(); + } + } + let token; + while ((token = this.getToken()) !== null) { + if (token === "StartData") { + const dataType = previousTokens.at(-3); + const dataLength = previousTokens.at(-1); + if (previousTokens.at(-4) !== "(" || previousTokens.at(-2) !== ")" || dataType !== "Binary" && dataType !== "Hex" || !/^\d+$/.test(dataLength)) { + return null; + } + startDataLength = parseInt(dataLength, 10); + if (startDataLength <= 0) { + return null; + } + startDataIsHex = dataType === "Hex"; + foundStartData = true; + break; + } + rememberToken(token); + if (token !== "/") { + continue; + } + token = this.getToken(); + rememberToken(token); + switch (token) { + case "FontMatrix": + properties.fontMatrix = this.readNumberArray(); + break; + case "FontBBox": + const fontBBox = this.readNumberArray(); + properties.ascent = Math.max(fontBBox[3], fontBBox[1]); + properties.descent = Math.min(fontBBox[1], fontBBox[3]); + properties.ascentScaled = true; + break; + case "CIDCount": + cidCount = this.readInt(); + break; + case "CIDMapOffset": + cidMapOffset = this.readInt(); + break; + case "FDBytes": + fdBytes = this.readInt(); + break; + case "GDBytes": + gdBytes = this.readInt(); + break; + case "SubrMapOffset": + subrMapOffset = this.readInt(); + break; + case "SDBytes": + sdBytes = this.readInt(); + break; + case "SubrCount": + subrCount = this.readInt(); + break; + case "BlueValues": + case "OtherBlues": + case "FamilyBlues": + case "FamilyOtherBlues": + this.readNumberArray(); + break; + case "StemSnapH": + case "StemSnapV": + privateData.set(token, this.readNumberArray()); + break; + case "StdHW": + case "StdVW": + privateData.set(token, this.readNumberArray()[0]); + break; + case "BlueShift": + case "lenIV": + case "BlueFuzz": + case "BlueScale": + case "LanguageGroup": + privateData.set(token, this.readNumber()); + break; + case "ExpansionFactor": + privateData.set(token, this.readNumber() || 0.06); + break; + case "ForceBold": + privateData.set(token, this.readBoolean()); + break; + } + } + if (!foundStartData || cidCount <= 0 || cidMapOffset < 0 || fdBytes < 0 || fdBytes > 4 || gdBytes < 1 || gdBytes > 4) { + return null; + } + const maxLength = stream.end - stream.pos; + if (startDataLength > maxLength) { + if (!startDataIsHex) { + startDataLength = maxLength; + } else if (startDataLength > 2 * maxLength) { + return null; + } + } + let binary = stream.getBytes(startDataIsHex ? undefined : startDataLength); + if (startDataIsHex) { + const decoded = new Uint8Array(startDataLength); + let digit1 = -1, + j = 0; + for (let i = 0, ii = binary.length; i < ii && j < startDataLength; i++) { + const digit = binary[i]; + if (!isHexDigit(digit)) { + continue; + } + if (digit1 < 0) { + digit1 = digit; + continue; + } + decoded[j++] = parseInt(String.fromCharCode(digit1, digit), 16); + digit1 = -1; + } + if (j !== startDataLength) { + return null; + } + binary = decoded; + } + const lenIV = privateData.get("lenIV"); + const cidEntrySize = fdBytes + gdBytes; + const subrs = []; + function readUint(offset, byteCount) { + let n = 0; + for (let i = 0; i < byteCount; i++) { + n = n << 8 | binary[offset + i]; + } + return n >>> 0; + } + if (cidMapOffset + (cidCount + 1) * cidEntrySize > binary.length || subrCount > 0 && (subrMapOffset < 0 || sdBytes < 1 || sdBytes > 4 || subrMapOffset + (subrCount + 1) * sdBytes > binary.length)) { + return null; + } + if (fdBytes > 0) { + for (let cid = 0; cid < cidCount; cid++) { + if (readUint(cidMapOffset + cid * cidEntrySize, fdBytes) !== 0) { + return null; + } + } + } + if (subrCount > 0) { + const subrOffsets = new Array(subrCount + 1); + for (let i = 0; i <= subrCount; i++) { + subrOffsets[i] = readUint(subrMapOffset + i * sdBytes, sdBytes); + } + for (let i = 0; i < subrCount; i++) { + const start = subrOffsets[i]; + const end = subrOffsets[i + 1]; + if (end > binary.length || end < start) { + subrs[i] = new Uint8Array(0); + continue; + } + subrs[i] = this.readCharStrings(binary.subarray(start, end), lenIV); + } + } + const charstrings = []; + let prevOffset = readUint(cidMapOffset + fdBytes, gdBytes); + for (let cid = 0; cid < cidCount; cid++) { + const nextOffset = readUint(cidMapOffset + (cid + 1) * cidEntrySize + fdBytes, gdBytes); + const glyphName = cid === 0 ? ".notdef" : `cid${cid}`; + if (nextOffset > prevOffset && nextOffset <= binary.length) { + const encoded = this.readCharStrings(binary.subarray(prevOffset, nextOffset), lenIV); + const charString = new Type1CharString(); + const error = charString.convert(encoded, subrs, this.seacAnalysisEnabled); + charstrings.push({ + glyphName, + charstring: error ? [14] : charString.output, + width: charString.width, + lsb: charString.lsb, + seac: charString.seac + }); + } else { + const notDef = charstrings[0]; + charstrings.push({ + glyphName, + charstring: notDef?.charstring.slice() || [0x8b, 0x0e], + width: notDef?.width || 0, + lsb: notDef?.lsb || 0 + }); + } + prevOffset = nextOffset; + } + program.subrs = subrs; + program.charstrings = charstrings; + return program; + } extractFontHeader(properties) { let token; while ((token = this.getToken()) !== null) { @@ -23609,7 +25902,7 @@ } } -;// CONCATENATED MODULE: ./src/core/type1_font.js +;// ./src/core/type1_font.js @@ -23698,8 +25991,33 @@ length: eexecBytes.length }; } +function isCidKeyedType1File(file) { + const sample = file.peekBytes(2048); + if (sample.length < 2 || sample[0] !== 0x25 || sample[1] !== 0x21) { + return false; + } + const text = bytesToString(sample); + return text.includes("Resource-CIDFont") || /\/CIDFontType\s+0\b/.test(text); +} class Type1Font { + #rawFileLength; constructor(name, file, properties) { + let data; + if (properties.composite && isCidKeyedType1File(file)) { + data = this.#parseCidKeyedType1(file, properties); + } + data ||= this.#parseType1(file, properties); + for (const key in data.properties) { + properties[key] = data.properties[key]; + } + const charstrings = data.charstrings; + const type2Charstrings = this.getType2Charstrings(charstrings); + const subrs = this.getType2Subrs(data.subrs); + this.charstrings = charstrings; + this.data = this.wrap(name, type2Charstrings, this.charstrings, subrs, properties); + this.seacs = this.getSeacs(data.charstrings); + } + #parseType1(file, properties) { const PFB_HEADER_SIZE = 6; let headerBlockLength = properties.length1; let eexecBlockLength = properties.length2; @@ -23719,15 +26037,21 @@ const eexecBlock = getEexecBlock(file, eexecBlockLength); const eexecBlockParser = new Type1Parser(eexecBlock.stream, true, SEAC_ANALYSIS_ENABLED); const data = eexecBlockParser.extractFontProgram(properties); - for (const key in data.properties) { - properties[key] = data.properties[key]; + this.#rawFileLength = headerBlock.length + eexecBlock.length; + return data; + } + #parseCidKeyedType1(file, properties) { + const fileStart = file.pos; + const length = file.end - fileStart; + const parser = new Type1Parser(file, false, SEAC_ANALYSIS_ENABLED); + const data = parser.extractCidKeyedFontProgram(properties); + if (!data) { + file.pos = fileStart; + warn("Type1Font: unable to parse CID-keyed Type 1 font."); + return null; } - const charstrings = data.charstrings; - const type2Charstrings = this.getType2Charstrings(charstrings); - const subrs = this.getType2Subrs(data.subrs); - this.charstrings = charstrings; - this.data = this.wrap(name, type2Charstrings, this.charstrings, subrs, properties); - this.seacs = this.getSeacs(data.charstrings); + this.#rawFileLength = length; + return data; } get numGlyphs() { return this.charstrings.length + 1; @@ -23816,7 +26140,7 @@ return type2Subrs; } wrap(name, glyphs, charstrings, subrs, properties) { - const cff = new CFF(); + const cff = new CFF(this.#rawFileLength); cff.header = new CFFHeader(1, 0, 4, 4); cff.names = [name]; const topDict = new CFFTopDict(); @@ -23842,9 +26166,10 @@ cff.globalSubrIndex = new CFFIndex(); const count = glyphs.length; const charsetArray = [".notdef"]; - let i, ii; - for (i = 0; i < count; i++) { - const glyphName = charstrings[i].glyphName; + for (let i = 0; i < count; i++) { + const { + glyphName + } = charstrings[i]; const index = CFFStandardStrings.indexOf(glyphName); if (index === -1) { strings.add(glyphName); @@ -23854,19 +26179,18 @@ cff.charset = new CFFCharset(false, 0, charsetArray); const charStringsIndex = new CFFIndex(); charStringsIndex.add([0x8b, 0x0e]); - for (i = 0; i < count; i++) { + for (let i = 0; i < count; i++) { charStringsIndex.add(glyphs[i]); } cff.charStrings = charStringsIndex; const privateDict = new CFFPrivateDict(); privateDict.setByName("Subrs", null); const fields = ["BlueValues", "OtherBlues", "FamilyBlues", "FamilyOtherBlues", "StemSnapH", "StemSnapV", "BlueShift", "BlueFuzz", "BlueScale", "LanguageGroup", "ExpansionFactor", "ForceBold", "StdHW", "StdVW"]; - for (i = 0, ii = fields.length; i < ii; i++) { - const field = fields[i]; - if (!(field in properties.privateData)) { + for (const field of fields) { + if (!properties.privateData.has(field)) { continue; } - const value = properties.privateData[field]; + const value = properties.privateData.get(field); if (Array.isArray(value)) { for (let j = value.length - 1; j > 0; j--) { value[j] -= value[j - 1]; @@ -23876,8 +26200,8 @@ } cff.topDict.privateDict = privateDict; const subrIndex = new CFFIndex(); - for (i = 0, ii = subrs.length; i < ii; i++) { - subrIndex.add(subrs[i]); + for (const subr of subrs) { + subrIndex.add(subr); } privateDict.subrsIndex = subrIndex; const compiler = new CFFCompiler(cff); @@ -23885,7 +26209,7 @@ } } -;// CONCATENATED MODULE: ./src/core/fonts.js +;// ./src/core/fonts.js @@ -23905,8 +26229,8 @@ const PRIVATE_USE_AREAS = [[0xe000, 0xf8ff], [0x100000, 0x10fffd]]; const PDF_GLYPH_SPACE_UNITS = 1000; -const EXPORT_DATA_PROPERTIES = ["ascent", "bbox", "black", "bold", "charProcOperatorList", "composite", "cssFontInfo", "data", "defaultVMetrics", "defaultWidth", "descent", "fallbackName", "fontMatrix", "isInvalidPDFjsFont", "isType3Font", "italic", "loadedName", "mimetype", "missingFile", "name", "remeasure", "subtype", "systemFontInfo", "type", "vertical"]; -const EXPORT_DATA_EXTRA_PROPERTIES = ["cMap", "defaultEncoding", "differences", "isMonospace", "isSerifFont", "isSymbolicFont", "seacMap", "toFontChar", "toUnicode", "vmetrics", "widths"]; +const EXPORT_DATA_PROPERTIES = ["ascent", "bbox", "black", "bold", "cssFontInfo", "data", "defaultVMetrics", "defaultWidth", "descent", "disableFontFace", "fallbackName", "fontExtraProperties", "fontMatrix", "isInvalidPDFjsFont", "isType3Font", "italic", "loadedName", "mimetype", "missingFile", "name", "remeasure", "systemFontInfo", "vertical"]; +const EXPORT_DATA_EXTRA_PROPERTIES = ["cMap", "composite", "defaultEncoding", "differences", "isMonospace", "isSerifFont", "isSymbolicFont", "seacMap", "subtype", "toFontChar", "toUnicode", "type", "vmetrics", "widths"]; function adjustWidths(properties) { if (!properties.fontMatrix) { return; @@ -24048,23 +26372,10 @@ bytes[index + 1] = value >>> 16; bytes[index] = value >>> 24; } -function int32(b0, b1, b2, b3) { - return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; -} -function string16(value) { - return String.fromCharCode(value >> 8 & 0xff, value & 0xff); -} -function safeString16(value) { - if (value > 0x7fff) { - value = 0x7fff; - } else if (value < -0x8000) { - value = -0x8000; - } - return String.fromCharCode(value >> 8 & 0xff, value & 0xff); -} function isTrueTypeFile(file) { - const header = file.peekBytes(4); - return readUint32(header, 0) === 0x00010000 || bytesToString(header) === "true"; + const header = file.peekBytes(4), + str = bytesToString(header); + return str === "\x00\x01\x00\x00" || str === "true"; } function isTrueTypeCollectionFile(file) { const header = file.peekBytes(4); @@ -24174,8 +26485,8 @@ let nextAvailableFontCharCode = privateUseOffetStart; let privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1]; const isInPrivateArea = code => PRIVATE_USE_AREAS[0][0] <= code && code <= PRIVATE_USE_AREAS[0][1] || PRIVATE_USE_AREAS[1][0] <= code && code <= PRIVATE_USE_AREAS[1][1]; - for (let originalCharCode in charCodeToGlyphId) { - originalCharCode |= 0; + let LIGATURE_TO_UNICODE = null; + for (const originalCharCode in charCodeToGlyphId) { let glyphId = charCodeToGlyphId[originalCharCode]; if (!hasGlyph(glyphId)) { continue; @@ -24195,7 +26506,20 @@ } let unicode = toUnicode.get(originalCharCode); if (typeof unicode === "string") { - unicode = unicode.codePointAt(0); + if (unicode.length === 1) { + unicode = unicode.codePointAt(0); + } else { + if (!LIGATURE_TO_UNICODE) { + LIGATURE_TO_UNICODE = new Map(); + for (let i = 0xfb00; i <= 0xfb4f; i++) { + const normalized = String.fromCharCode(i).normalize("NFKD"); + if (normalized.length > 1) { + LIGATURE_TO_UNICODE.set(normalized, i); + } + } + } + unicode = LIGATURE_TO_UNICODE.get(unicode) || unicode.codePointAt(0); + } } if (unicode && !isInPrivateArea(unicode) && !usedGlyphIds.has(glyphId)) { toUnicodeExtraMap.set(unicode, glyphId); @@ -24239,9 +26563,7 @@ glyphId: 0 }); } - codes.sort(function fontGetRangesSort(a, b) { - return a.fontCharCode - b.fontCharCode; - }); + codes.sort((a, b) => a.fontCharCode - b.fontCharCode); const ranges = []; const length = codes.length; for (let n = 0; n < length;) { @@ -24263,8 +26585,7 @@ } function createCmapTable(glyphs, toUnicodeExtraMap, numGlyphs) { const ranges = getRanges(glyphs, toUnicodeExtraMap, numGlyphs); - const numTables = ranges.at(-1)[1] > 0xffff ? 2 : 1; - let cmap = "\x00\x00" + string16(numTables) + "\x00\x03" + "\x00\x01" + string32(4 + numTables * 8); + const hasNonBmp = ranges.at(-1)[1] > 0xffff; let i, ii, j, jj; for (i = ranges.length - 1; i >= 0; --i) { if (ranges[i][0] <= 0xffff) { @@ -24278,20 +26599,26 @@ const trailingRangesCount = ranges[i][1] < 0xffff ? 1 : 0; const segCount = bmpLength + trailingRangesCount; const searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2); - let startCount = ""; - let endCount = ""; - let idDeltas = ""; - let idRangeOffsets = ""; - let glyphsIds = ""; + const segmentsLength = bmpLength * 2 + trailingRangesCount * 2; + const startCount = new DataBuilder({ + exactLength: segmentsLength + }), + endCount = new DataBuilder({ + exactLength: segmentsLength + }), + idDeltas = new DataBuilder({ + exactLength: segmentsLength + }), + idRangeOffsets = new DataBuilder({ + exactLength: segmentsLength + }), + glyphsIds = new DataBuilder({}); let bias = 0; - let range, start, end, codes; + let format4Overflow = false; for (i = 0, ii = bmpLength; i < ii; i++) { - range = ranges[i]; - start = range[0]; - end = range[1]; - startCount += string16(start); - endCount += string16(end); - codes = range[2]; + const [start, end, codes] = ranges[i]; + startCount.setInt16(start); + endCount.setInt16(end); let contiguous = true; for (j = 1, jj = codes.length; j < jj; ++j) { if (codes[j] !== codes[j - 1] + 1) { @@ -24302,51 +26629,117 @@ if (!contiguous) { const offset = (segCount - i) * 2 + bias * 2; bias += end - start + 1; - idDeltas += string16(0); - idRangeOffsets += string16(offset); + idDeltas.skip(2); + if (offset > 0xffff) { + format4Overflow = true; + idRangeOffsets.skip(2); + } else { + idRangeOffsets.setInt16(offset); + } for (j = 0, jj = codes.length; j < jj; ++j) { - glyphsIds += string16(codes[j]); + glyphsIds.setInt16(codes[j]); } } else { const startCode = codes[0]; - idDeltas += string16(startCode - start & 0xffff); - idRangeOffsets += string16(0); + idDeltas.setInt16(startCode - start & 0xffff); + idRangeOffsets.skip(2); } } if (trailingRangesCount > 0) { - endCount += "\xFF\xFF"; - startCount += "\xFF\xFF"; - idDeltas += "\x00\x01"; - idRangeOffsets += "\x00\x00"; - } - const format314 = "\x00\x00" + string16(2 * segCount) + string16(searchParams.range) + string16(searchParams.entry) + string16(searchParams.rangeShift) + endCount + "\x00\x00" + startCount + idDeltas + idRangeOffsets + glyphsIds; - let format31012 = ""; - let header31012 = ""; - if (numTables > 1) { - cmap += "\x00\x03" + "\x00\x0A" + string32(4 + numTables * 8 + 4 + format314.length); - format31012 = ""; - for (i = 0, ii = ranges.length; i < ii; i++) { - range = ranges[i]; - start = range[0]; - codes = range[2]; + endCount.setArray([0xff, 0xff]); + startCount.setArray([0xff, 0xff]); + idDeltas.setArray([0x00, 0x01]); + idRangeOffsets.skip(2); + } + const format314 = new DataBuilder({ + exactLength: 12 + startCount.length + endCount.length + idDeltas.length + idRangeOffsets.length + glyphsIds.length + }); + format314.skip(2); + format314.setInt16(2 * segCount); + format314.setInt16(searchParams.range); + format314.setInt16(searchParams.entry); + format314.setInt16(searchParams.rangeShift); + format314.setArray(endCount.data); + format314.skip(2); + format314.setArray(startCount.data); + format314.setArray(idDeltas.data); + format314.setArray(idRangeOffsets.data); + format314.setArray(glyphsIds.data); + const useFormat4 = !format4Overflow && format314.length + 4 <= 0xffff; + const useFormat12 = hasNonBmp || !useFormat4; + const numTables = (useFormat4 ? 1 : 0) + (useFormat12 ? 1 : 0); + let format31012 = null, + header31012 = null; + if (useFormat12) { + format31012 = new DataBuilder({}); + for (const range of ranges) { + let start = range[0]; + const codes = range[2]; let code = codes[0]; for (j = 1, jj = codes.length; j < jj; ++j) { if (codes[j] !== codes[j - 1] + 1) { - end = range[0] + j - 1; - format31012 += string32(start) + string32(end) + string32(code); + const end = range[0] + j - 1; + format31012.setInt32(start); + format31012.setInt32(end); + format31012.setInt32(code); start = end + 1; code = codes[j]; } } - format31012 += string32(start) + string32(range[1]) + string32(code); - } - header31012 = "\x00\x0C" + "\x00\x00" + string32(format31012.length + 16) + "\x00\x00\x00\x00" + string32(format31012.length / 12); + format31012.setInt32(start); + format31012.setInt32(range[1]); + format31012.setInt32(code); + } + header31012 = new DataBuilder({ + exactLength: 16 + }); + header31012.setArray([0x00, 0x0c]); + header31012.skip(2); + header31012.setInt32(format31012.length + 16); + header31012.skip(4); + header31012.setInt32(format31012.length / 12); + } + const headerLength = 4 + numTables * 8; + const format4Length = useFormat4 ? 4 + format314.length : 0; + const cmap = new DataBuilder({ + exactLength: headerLength + }); + cmap.skip(2); + cmap.setInt16(numTables); + let tableOffset = headerLength; + if (useFormat4) { + cmap.setArray([0x00, 0x03]); + cmap.setArray([0x00, 0x01]); + cmap.setInt32(tableOffset); + tableOffset += format4Length; + } + if (useFormat12) { + cmap.setArray([0x00, 0x03]); + cmap.setArray([0x00, 0x0a]); + cmap.setInt32(tableOffset); } - return cmap + "\x00\x04" + string16(format314.length + 4) + format314 + header31012 + format31012; + const table = new DataBuilder({ + exactLength: cmap.length + format4Length + (header31012?.length ?? 0) + (format31012?.length ?? 0) + }); + table.setArray(cmap.data); + if (useFormat4) { + table.setArray([0x00, 0x04]); + table.setInt16(format314.length + 4); + table.setArray(format314.data); + } + if (useFormat12) { + table.setArray(header31012.data); + table.setArray(format31012.data); + } + return table.data; } function validateOS2Table(os2, file) { file.pos = (file.start || 0) + os2.offset; const version = file.getUint16(); + const minLength = [78, 86, 96, 96, 96, 100][version]; + if (minLength === undefined || os2.length < minLength) { + return false; + } file.skip(60); const selection = file.getUint16(); if (version < 4 && selection & 0x0300) { @@ -24410,7 +26803,7 @@ lastCharIndex = 255; } const bbox = properties.bbox || [0, 0, 0, 0]; - const unitsPerEm = override.unitsPerEm || 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]; + const unitsPerEm = override.unitsPerEm || (properties.fontMatrix ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs)) : 1000); const scale = properties.ascentScaled ? 1.0 : unitsPerEm / PDF_GLYPH_SPACE_UNITS; const typoAscent = override.ascent || Math.round(scale * (properties.ascent || bbox[3])); let typoDescent = override.descent || Math.round(scale * (properties.descent || bbox[1])); @@ -24419,67 +26812,142 @@ } const winAscent = override.yMax || typoAscent; const winDescent = -override.yMin || -typoDescent; - return "\x00\x03" + "\x02\x24" + "\x01\xF4" + "\x00\x05" + "\x00\x00" + "\x02\x8A" + "\x02\xBB" + "\x00\x00" + "\x00\x8C" + "\x02\x8A" + "\x02\xBB" + "\x00\x00" + "\x01\xDF" + "\x00\x31" + "\x01\x02" + "\x00\x00" + "\x00\x00\x06" + String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + "\x00\x00\x00\x00\x00\x00" + string32(ulUnicodeRange1) + string32(ulUnicodeRange2) + string32(ulUnicodeRange3) + string32(ulUnicodeRange4) + "\x2A\x32\x31\x2A" + string16(properties.italicAngle ? 1 : 0) + string16(firstCharIndex || properties.firstChar) + string16(lastCharIndex || properties.lastChar) + string16(typoAscent) + string16(typoDescent) + "\x00\x64" + string16(winAscent) + string16(winDescent) + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + string16(properties.xHeight) + string16(properties.capHeight) + string16(0) + string16(firstCharIndex || properties.firstChar) + "\x00\x03"; + const os2 = new DataBuilder({ + exactLength: 96 + }); + os2.setArray([0x00, 0x03]); + os2.setArray([0x02, 0x24]); + os2.setArray([0x01, 0xf4]); + os2.setArray([0x00, 0x05]); + os2.skip(2); + os2.setArray([0x02, 0x8a]); + os2.setArray([0x02, 0xbb]); + os2.skip(2); + os2.setArray([0x00, 0x8c]); + os2.setArray([0x02, 0x8a]); + os2.setArray([0x02, 0xbb]); + os2.skip(2); + os2.setArray([0x01, 0xdf]); + os2.setArray([0x00, 0x31]); + os2.setArray([0x01, 0x02]); + os2.skip(2); + os2.setArray([0x00, 0x00, 0x06, properties.fixedPitch ? 0x09 : 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]); + os2.setInt32(ulUnicodeRange1); + os2.setInt32(ulUnicodeRange2); + os2.setInt32(ulUnicodeRange3); + os2.setInt32(ulUnicodeRange4); + os2.setArray([0x2a, 0x32, 0x31, 0x2a]); + os2.setInt16(properties.italicAngle ? 1 : 0); + os2.setInt16(firstCharIndex || properties.firstChar); + os2.setInt16(lastCharIndex || properties.lastChar); + os2.setInt16(typoAscent); + os2.setInt16(typoDescent); + os2.setArray([0x00, 0x64]); + os2.setInt16(winAscent); + os2.setInt16(winDescent); + os2.skip(4 + 4); + os2.setInt16(properties.xHeight); + os2.setInt16(properties.capHeight); + os2.skip(2); + os2.setInt16(firstCharIndex || properties.firstChar); + os2.setArray([0x00, 0x03]); + return os2.data; } function createPostTable(properties) { - const angle = Math.floor(properties.italicAngle * 2 ** 16); - return "\x00\x03\x00\x00" + string32(angle) + "\x00\x00" + "\x00\x00" + string32(properties.fixedPitch ? 1 : 0) + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + "\x00\x00\x00\x00" + "\x00\x00\x00\x00"; + const post = new DataBuilder({ + exactLength: 32 + }); + post.setArray([0x00, 0x03, 0x00, 0x00]); + post.setInt32(Math.floor(properties.italicAngle * 2 ** 16)); + post.skip(2 + 2); + post.setInt32(properties.fixedPitch ? 1 : 0); + post.skip(4 + 4 + 4 + 4); + return post.data; } function createPostscriptName(name) { return name.replaceAll(/[^\x21-\x7E]|[[\](){}<>/%]/g, "").slice(0, 63); } function createNameTable(name, proto) { - if (!proto) { - proto = [[], []]; - } + proto ||= [[], []]; const strings = [proto[0][0] || "Original licence", proto[0][1] || name, proto[0][2] || "Unknown", proto[0][3] || "uniqueID", proto[0][4] || name, proto[0][5] || "Version 0.11", proto[0][6] || createPostscriptName(name), proto[0][7] || "Unknown", proto[0][8] || "Unknown", proto[0][9] || "Unknown"]; - const stringsUnicode = []; + const stringsBytes = strings.map(s => stringToBytes(s)); + const stringsUnicodeBytes = new Array(strings.length); let i, ii, j, jj, str; for (i = 0, ii = strings.length; i < ii; i++) { str = proto[1][i] || strings[i]; - const strBufUnicode = []; + const strUnicode = new DataBuilder({ + exactLength: str.length * 2 + }); for (j = 0, jj = str.length; j < jj; j++) { - strBufUnicode.push(string16(str.charCodeAt(j))); + strUnicode.setInt16(str.charCodeAt(j)); } - stringsUnicode.push(strBufUnicode.join("")); + stringsUnicodeBytes[i] = strUnicode.data; } - const names = [strings, stringsUnicode]; - const platforms = ["\x00\x01", "\x00\x03"]; - const encodings = ["\x00\x00", "\x00\x01"]; - const languages = ["\x00\x00", "\x04\x09"]; - const namesRecordCount = strings.length * platforms.length; - let nameTable = "\x00\x00" + string16(namesRecordCount) + string16(namesRecordCount * 12 + 6); + const namesBytes = [stringsBytes, stringsUnicodeBytes]; + const platformsBytes = [[0x00, 0x01], [0x00, 0x03]]; + const encodingsBytes = [[0x00, 0x00], [0x00, 0x01]]; + const languagesBytes = [[0x00, 0x00], [0x04, 0x09]]; + const nameRecords = []; let strOffset = 0; - for (i = 0, ii = platforms.length; i < ii; i++) { - const strs = names[i]; + for (i = 0, ii = platformsBytes.length; i < ii; i++) { + const strs = namesBytes[i]; for (j = 0, jj = strs.length; j < jj; j++) { str = strs[j]; - const nameRecord = platforms[i] + encodings[i] + languages[i] + string16(j) + string16(str.length) + string16(strOffset); - nameTable += nameRecord; + const nameRecord = new DataBuilder({ + exactLength: 6 + platformsBytes[i].length + encodingsBytes[i].length + languagesBytes[i].length + }); + nameRecord.setArray(platformsBytes[i]); + nameRecord.setArray(encodingsBytes[i]); + nameRecord.setArray(languagesBytes[i]); + nameRecord.setInt16(j); + nameRecord.setInt16(str.length); + nameRecord.setInt16(strOffset); + nameRecords.push(nameRecord.data); strOffset += str.length; } } - nameTable += strings.join("") + stringsUnicode.join(""); - return nameTable; + const namesRecordCount = stringsBytes.length * platformsBytes.length; + const nameTable = new DataBuilder({ + exactLength: 6 + Math.sumPrecise(nameRecords.map(arr => arr.length)) + Math.sumPrecise(stringsBytes.map(arr => arr.length)) + Math.sumPrecise(stringsUnicodeBytes.map(arr => arr.length)) + }); + nameTable.skip(2); + nameTable.setInt16(namesRecordCount); + nameTable.setInt16(namesRecordCount * 12 + 6); + for (const arr of nameRecords) { + nameTable.setArray(arr); + } + for (const arr of stringsBytes) { + nameTable.setArray(arr); + } + for (const arr of stringsUnicodeBytes) { + nameTable.setArray(arr); + } + return nameTable.data; } class Font { - constructor(name, file, properties) { + #charsCache = new Map(); + #glyphCache = new Map(); + charProcOperatorList; + constructor(name, file, properties, evaluatorOptions) { this.name = name; this.psName = null; this.mimetype = null; - this.disableFontFace = false; + this.disableFontFace = evaluatorOptions.disableFontFace; + this.fontExtraProperties = evaluatorOptions.fontExtraProperties; this.loadedName = properties.loadedName; this.isType3Font = properties.isType3Font; this.missingFile = false; this.cssFontInfo = properties.cssFontInfo; - this._charsCache = Object.create(null); - this._glyphCache = Object.create(null); let isSerifFont = !!(properties.flags & FontFlags.Serif); if (!isSerifFont && !properties.isSimulatedFlags) { - const baseName = name.replaceAll(/[,_]/g, "-").split("-", 1)[0], + const stdFontMap = getStdFontMap(), + nonStdFontMap = getNonStdFontMap(), serifFonts = getSerifFonts(); - for (const namePart of baseName.split("+")) { - if (serifFonts[namePart]) { + for (const namePart of name.split("+")) { + let fontName = normalizeFontName(namePart); + fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName; + fontName = fontName.split("-", 1)[0]; + if (serifFonts[fontName]) { isSerifFont = true; break; } @@ -24564,8 +27032,8 @@ case "CIDFontType2": this.mimetype = "font/opentype"; data = this.checkAndRepair(name, file, properties); + adjustWidths(properties); if (this.isOpenType) { - adjustWidths(properties); type = "OpenType"; } break; @@ -24591,18 +27059,23 @@ const renderer = FontRendererFactory.create(this, SEAC_ANALYSIS_ENABLED); return shadow(this, "renderer", renderer); } - exportData(extraProperties = false) { - const exportDataProperties = extraProperties ? [...EXPORT_DATA_PROPERTIES, ...EXPORT_DATA_EXTRA_PROPERTIES] : EXPORT_DATA_PROPERTIES; + #getExportData(props) { const data = Object.create(null); - let property, value; - for (property of exportDataProperties) { - value = this[property]; + for (const prop of props) { + const value = this[prop]; if (value !== undefined) { - data[property] = value; + data[prop] = value; } } return data; } + exportData() { + return { + buffer: compileFontInfo(this.#getExportData(EXPORT_DATA_PROPERTIES)), + charProcOperatorList: this.charProcOperatorList, + extra: this.fontExtraProperties ? this.#getExportData(EXPORT_DATA_EXTRA_PROPERTIES) : undefined + }; + } fallbackToSystemFont(properties) { this.missingFile = true; const { @@ -24628,10 +27101,10 @@ this.capHeight = metrics.capHeight / PDF_GLYPH_SPACE_UNITS; } } - this.bold = /bold/gi.test(fontName); - this.italic = /oblique|italic/gi.test(fontName); - this.black = /Black/g.test(name); - const isNarrow = /Narrow/g.test(name); + this.bold = /bold/i.test(fontName); + this.italic = /oblique|italic/i.test(fontName); + this.black = /Black/.test(name); + const isNarrow = /Narrow/.test(name); this.remeasure = (!isStandardFont || isNarrow) && Object.keys(this.widths).length > 0; if ((isStandardFont || isMappedToStandardFont) && type === "CIDFontType2" && this.cidEncoding.startsWith("Identity-")) { const cidToGidMap = properties.cidToGidMap; @@ -24669,7 +27142,7 @@ this.toFontChar = buildToFontChar(SymbolSetEncoding, getGlyphsUnicode(), this.differences); } else if (/Dingbats/i.test(fontName)) { this.toFontChar = buildToFontChar(ZapfDingbatsEncoding, getDingbatsGlyphsUnicode(), this.differences); - } else if (isStandardFont) { + } else if (isStandardFont || isMappedToStandardFont) { const map = buildToFontChar(this.defaultEncoding, getGlyphsUnicode(), this.differences); if (type === "CIDFontType2" && !this.cidEncoding.startsWith("Identity-") && !(this.toUnicode instanceof IdentityToUnicodeMap)) { this.toUnicode.forEach(function (charCode, unicodeCharCode) { @@ -24738,12 +27211,14 @@ data[8] = data[9] = data[10] = data[11] = 0; data[17] |= 0x20; } + const view = tag === "CFF " ? null : new DataView(data.buffer, data.byteOffset, data.byteLength); return { tag, checksum, length, offset, - data + data, + view }; } function readOpenTypeHeader(ttf) { @@ -25052,19 +27527,22 @@ hasShortCmap: false }; } - mappings.sort(function (a, b) { - return a.charCode - b.charCode; - }); - for (let i = 1; i < mappings.length; i++) { - if (mappings[i - 1].charCode === mappings[i].charCode) { - mappings.splice(i, 1); - i--; + const finalMappings = [], + seenCharCodes = new Set(); + for (const map of mappings) { + const { + charCode + } = map; + if (seenCharCodes.has(charCode)) { + continue; } + seenCharCodes.add(charCode); + finalMappings.push(map); } return { platformId: potentialTable.platformId, encodingId: potentialTable.encodingId, - mappings, + mappings: finalMappings.sort((a, b) => a.charCode - b.charCode), hasShortCmap }; } @@ -25216,16 +27694,16 @@ return glyphProfile; } function sanitizeHead(head, numGlyphs, locaLength) { - const data = head.data; - const version = int32(data[0], data[1], data[2], data[3]); + const { + data, + view + } = head; + const version = view.getInt32(0); if (version >> 16 !== 1) { info("Attempting to fix invalid version in head table: " + version); - data[0] = 0; - data[1] = 1; - data[2] = 0; - data[3] = 0; + view.setInt32(0, 0x00010000); } - const indexToLocFormat = int16(data[50], data[51]); + const indexToLocFormat = signedInt16(data[50], data[51]); if (indexToLocFormat < 0 || indexToLocFormat > 1) { info("Attempting to fix invalid indexToLocFormat in head table: " + indexToLocFormat); const numGlyphsPlusOne = numGlyphs + 1; @@ -25308,11 +27786,15 @@ if (last.offset !== 0 && last.endOffset === 0) { last.endOffset = oldGlyfDataLength; } + const droppedGlyphs = pruneCompositeGlyphCycles(oldGlyfData, locaEntries, numGlyphs); const missingGlyphs = Object.create(null); let writeOffset = 0; itemEncode(locaData, 0, writeOffset); for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { - const glyphProfile = sanitizeGlyph(oldGlyfData, locaEntries[i].offset, locaEntries[i].endOffset, newGlyfData, writeOffset, hintsValid); + const glyphProfile = droppedGlyphs.has(i) ? { + length: 0, + sizeOfInstructions: 0 + } : sanitizeGlyph(oldGlyfData, locaEntries[i].offset, locaEntries[i].endOffset, newGlyfData, writeOffset, hintsValid); const newLength = glyphProfile.length; if (newLength === 0) { missingGlyphs[i] = true; @@ -25379,15 +27861,11 @@ if (!valid) { break; } - const customNames = [], - strBuf = []; + const customNames = []; while (font.pos < end) { - const stringLength = font.getByte(); - strBuf.length = stringLength; - for (i = 0; i < stringLength; ++i) { - strBuf[i] = String.fromCharCode(font.getByte()); - } - customNames.push(strBuf.join("")); + const strLen = font.getByte(), + str = font.getString(strLen); + customNames.push(str); } glyphNames = []; for (i = 0; i < numGlyphs; ++i) { @@ -25500,7 +27978,7 @@ } else { for (j = 0; j < n; j++) { b = data[i++]; - stack.push(b << 8 | data[i++]); + stack.push(signedInt16(b, data[i++])); } } } else if ((op & 0xf8) === 0xb0) { @@ -25519,7 +27997,7 @@ } else { for (j = 0; j < n; j++) { b = data[i++]; - stack.push(b << 8 | data[i++]); + stack.push(signedInt16(b, data[i++])); } } } else if (op === 0x2b && !tooComplexToFollowFunctions) { @@ -25717,15 +28195,16 @@ header = readOpenTypeHeader(font); tables = readTables(font, header.numTables); } - let cff, cffFile; const isTrueType = !tables["CFF "]; + let parsedCff = null; if (!isTrueType) { - const isComposite = properties.composite && (properties.cidToGidMap?.length > 0 || !(properties.cMap instanceof IdentityCMap)); - if (header.version === "OTTO" && !isComposite || !tables.head || !tables.hhea || !tables.maxp || !tables.post) { - cffFile = new Stream(tables["CFF "].data); - cff = new CFFFont(cffFile, properties); - adjustWidths(properties); - return this.convert(name, cff, properties); + try { + parsedCff = new CFFParser(new Stream(tables["CFF "].data), properties, SEAC_ANALYSIS_ENABLED).parse(); + } catch { + warn("Failed to parse font " + properties.loadedName); + } + if (header.version === "OTTO" && (!properties.composite || properties.fontFileN === "FontFile3" && parsedCff?.isCIDFont) || !tables.head || !tables.hhea || !tables.maxp || !tables.post) { + return this.convert(name, new CFFFont(new Stream(tables["CFF "].data), properties), properties); } delete tables.glyf; delete tables.loca; @@ -25749,9 +28228,23 @@ if (!tables.maxp) { throw new FormatError('Required "maxp" table is not found'); } + let numGlyphsFromCFF; + if (parsedCff) { + try { + parsedCff.duplicateFirstGlyph(); + tables["CFF "].data = new CFFCompiler(parsedCff).compile(); + numGlyphsFromCFF = parsedCff.charStringCount; + } catch { + warn("Failed to compile font " + properties.loadedName); + } + } font.pos = (font.start || 0) + tables.maxp.offset; let version = font.getInt32(); - const numGlyphs = font.getUint16(); + const numGlyphs = numGlyphsFromCFF ?? font.getUint16(); + if (version === 0x00005000 && tables.maxp.length !== 6) { + tables.maxp.data = tables.maxp.data.subarray(0, 6); + tables.maxp.length = 6; + } if (version !== 0x00010000 && version !== 0x00005000) { if (tables.maxp.length === 6) { version = 0x0005000; @@ -25762,11 +28255,28 @@ } writeUint32(tables.maxp.data, 0, version); } + let isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]); + if (tables.loca) { + const locaLength = isGlyphLocationsLong ? (numGlyphs + 1) * 4 : (numGlyphs + 1) * 2; + if (tables.loca.length !== locaLength) { + warn("Incorrect 'loca' table length -- attempting to fix it."); + const sortedTables = Object.values(tables).filter(Boolean).sort((a, b) => a.offset - b.offset); + const locaIndex = sortedTables.indexOf(tables.loca); + const nextTable = sortedTables[locaIndex + 1] || null; + if (nextTable && tables.loca.offset + locaLength < nextTable.offset) { + const previousPos = font.pos; + font.pos = font.start || 0; + font.skip(tables.loca.offset); + tables.loca.data = font.getBytes(locaLength); + tables.loca.length = locaLength; + font.pos = previousPos; + } + } + } if (properties.scaleFactors?.length === numGlyphs && isTrueType) { const { scaleFactors } = properties; - const isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]); const glyphs = new GlyfTable({ glyfTable: tables.glyf.data, isGlyphLocationsLong, @@ -25783,7 +28293,7 @@ tables.loca.data = loca; if (isLocationLong !== !!isGlyphLocationsLong) { tables.head.data[50] = 0; - tables.head.data[51] = isLocationLong ? 1 : 0; + isGlyphLocationsLong = tables.head.data[51] = isLocationLong ? 1 : 0; } const metrics = tables.hmtx.data; for (let i = 0; i < numGlyphs; i++) { @@ -25815,6 +28325,19 @@ maxFunctionDefs = font.getUint16(); font.pos += 4; maxSizeOfInstructions = font.getUint16(); + } else if (isTrueType && version === 0x00005000) { + const newMaxp = new Uint8Array(32); + writeUint32(newMaxp, 0, 0x00010000); + newMaxp[4] = numGlyphs >> 8 & 0xff; + newMaxp[5] = numGlyphs & 0xff; + newMaxp.fill(0xff, 6, 14); + newMaxp[15] = 2; + newMaxp[28] = 0xff; + newMaxp[29] = 0xff; + newMaxp[31] = 0x10; + tables.maxp.data = newMaxp; + tables.maxp.length = 32; + version = 0x00010000; } tables.maxp.data[4] = numGlyphsOut >> 8; tables.maxp.data[5] = numGlyphsOut & 255; @@ -25831,7 +28354,6 @@ sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0); let missingGlyphs = Object.create(null); if (isTrueType) { - const isGlyphLocationsLong = int16(tables.head.data[50], tables.head.data[51]); const glyphsInfo = sanitizeGlyphLocations(tables.loca, tables.glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions); missingGlyphs = glyphsInfo.missingGlyphs; if (version >= 0x00010000 && tables.maxp.length >= 32) { @@ -25870,7 +28392,7 @@ tag: "post", data: createPostTable(properties) }; - const charCodeToGlyphId = []; + const charCodeToGlyphId = Object.create(null); function hasGlyph(glyphId) { return !missingGlyphs[glyphId]; } @@ -25977,14 +28499,14 @@ } } } + if (!properties.isInternalFont && charCodeToGlyphId[0] === undefined && hasGlyph(0)) { + charCodeToGlyphId[0] = 0; + } } if (charCodeToGlyphId.length === 0) { charCodeToGlyphId[0] = 0; } - let glyphZeroId = numGlyphsOut - 1; - if (!dupFirstEntry) { - glyphZeroId = 0; - } + const glyphZeroId = dupFirstEntry ? numGlyphsOut - 1 : 0; if (!properties.cssFontInfo) { const newMapping = adjustMapping(charCodeToGlyphId, hasGlyph, glyphZeroId, this.toUnicode); this.toFontChar = newMapping.toFontChar; @@ -25999,18 +28521,6 @@ }; } } - if (!isTrueType) { - try { - cffFile = new Stream(tables["CFF "].data); - const parser = new CFFParser(cffFile, properties, SEAC_ANALYSIS_ENABLED); - cff = parser.parse(); - cff.duplicateFirstGlyph(); - const compiler = new CFFCompiler(cff); - tables["CFF "].data = compiler.compile(); - } catch { - warn("Failed to compile font " + properties.loadedName); - } - } if (!tables.name) { tables.name = { tag: "name", @@ -26035,10 +28545,7 @@ if (properties.builtInEncoding) { adjustType1ToUnicode(properties, properties.builtInEncoding); } - let glyphZeroId = 1; - if (font instanceof CFFFont) { - glyphZeroId = font.numGlyphs - 1; - } + const glyphZeroId = font instanceof CFFFont ? font.numGlyphs - 1 : 1; const mapping = font.getGlyphMapping(properties); let newMapping = null; let newCharCodeToGlyphId = mapping; @@ -26104,35 +28611,81 @@ } properties.seacMap = seacMap; } - const unitsPerEm = 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]; + const unitsPerEm = properties.fontMatrix ? 1 / Math.max(...properties.fontMatrix.slice(0, 4).map(Math.abs)) : 1000; const builder = new OpenTypeFileBuilder("\x4F\x54\x54\x4F"); builder.addTable("CFF ", font.data); builder.addTable("OS/2", createOS2Table(properties, newCharCodeToGlyphId)); builder.addTable("cmap", createCmapTable(newCharCodeToGlyphId, toUnicodeExtraMap, numGlyphs)); - builder.addTable("head", "\x00\x01\x00\x00" + "\x00\x00\x10\x00" + "\x00\x00\x00\x00" + "\x5F\x0F\x3C\xF5" + "\x00\x00" + safeString16(unitsPerEm) + "\x00\x00\x00\x00\x9e\x0b\x7e\x27" + "\x00\x00\x00\x00\x9e\x0b\x7e\x27" + "\x00\x00" + safeString16(properties.descent) + "\x0F\xFF" + safeString16(properties.ascent) + string16(properties.italicAngle ? 2 : 0) + "\x00\x11" + "\x00\x00" + "\x00\x00" + "\x00\x00"); - builder.addTable("hhea", "\x00\x01\x00\x00" + safeString16(properties.ascent) + safeString16(properties.descent) + "\x00\x00" + "\xFF\xFF" + "\x00\x00" + "\x00\x00" + "\x00\x00" + safeString16(properties.capHeight) + safeString16(Math.tan(properties.italicAngle) * properties.xHeight) + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + "\x00\x00" + string16(numGlyphs)); - builder.addTable("hmtx", function fontFieldsHmtx() { + builder.addTable("head", function fontTableHead() { + const dateArr = [0x00, 0x00, 0x00, 0x00, 0x9e, 0x0b, 0x7e, 0x27]; + const head = new DataBuilder({ + exactLength: 54 + }); + head.setArray([0x00, 0x01, 0x00, 0x00]); + head.setArray([0x00, 0x00, 0x10, 0x00]); + head.skip(4); + head.setArray([0x5f, 0x0f, 0x3c, 0xf5]); + head.skip(2); + head.setSafeInt16(unitsPerEm); + head.setArray(dateArr); + head.setArray(dateArr); + head.skip(2); + head.setSafeInt16(properties.descent); + head.setArray([0x0f, 0xff]); + head.setSafeInt16(properties.ascent); + head.setInt16(properties.italicAngle ? 2 : 0); + head.setArray([0x00, 0x11]); + head.skip(2 + 2 + 2); + return head.data; + }()); + builder.addTable("hhea", function fontTableHhea() { + const hhea = new DataBuilder({ + exactLength: 36 + }); + hhea.setArray([0x00, 0x01, 0x00, 0x00]); + hhea.setSafeInt16(properties.ascent); + hhea.setSafeInt16(properties.descent); + hhea.skip(2); + hhea.setArray([0xff, 0xff]); + hhea.skip(2 + 2 + 2); + hhea.setSafeInt16(properties.capHeight); + hhea.setSafeInt16(Math.tan(properties.italicAngle) * properties.xHeight); + hhea.skip(2 + 2 + 2 + 2 + 2 + 2); + hhea.setInt16(numGlyphs); + return hhea.data; + }()); + builder.addTable("hmtx", function fontTableHmtx() { const charstrings = font.charstrings; - const cffWidths = font.cff ? font.cff.widths : null; - let hmtx = "\x00\x00\x00\x00"; + const cffWidths = font.cff?.widths ?? null; + const hmtx = new DataBuilder({ + exactLength: numGlyphs * 4 + }); + hmtx.skip(4); for (let i = 1, ii = numGlyphs; i < ii; i++) { let width = 0; if (charstrings) { - const charstring = charstrings[i - 1]; - width = "width" in charstring ? charstring.width : 0; + width = charstrings[i - 1].width || 0; } else if (cffWidths) { width = Math.ceil(cffWidths[i] || 0); } - hmtx += string16(width) + string16(0); + hmtx.setInt16(width); + hmtx.skip(2); } - return hmtx; + return hmtx.data; + }()); + builder.addTable("maxp", function fontTableMaxp() { + const maxp = new DataBuilder({ + exactLength: 6 + }); + maxp.setArray([0x00, 0x00, 0x50, 0x00]); + maxp.setInt16(numGlyphs); + return maxp.data; }()); - builder.addTable("maxp", "\x00\x00\x50\x00" + string16(numGlyphs)); builder.addTable("name", createNameTable(fontName)); builder.addTable("post", createPostTable(properties)); return builder.toArray(); } - get spaceWidth() { + get _spaceWidth() { const possibleSpaceReplacements = ["space", "minus", "one", "i", "I"]; let width; for (const glyphName of possibleSpaceReplacements) { @@ -26160,10 +28713,10 @@ break; } } - return shadow(this, "spaceWidth", width || this.defaultWidth); + return shadow(this, "_spaceWidth", width || this.defaultWidth); } _charToGlyph(charcode, isSpace = false) { - let glyph = this._glyphCache[charcode]; + let glyph = this.#glyphCache.get(charcode); if (glyph?.isSpace === isSpace) { return glyph; } @@ -26179,7 +28732,7 @@ if (typeof width !== "number") { width = this.defaultWidth; } - const vmetric = this.vmetrics?.[widthCode]; + const vmetric = this.vmetrics?.[widthCode] || this.defaultVMetrics; let unicode = this.toUnicode.get(charcode) || charcode; if (typeof unicode === "number") { unicode = String.fromCharCode(unicode); @@ -26190,6 +28743,10 @@ const glyphName = this.differences[charcode] || this.defaultEncoding[charcode]; if ((glyphName === ".notdef" || glyphName === "") && this.type === "Type1") { fontCharCode = 0x20; + if (glyphName === "") { + width ||= this._spaceWidth; + unicode = String.fromCharCode(fontCharCode); + } } fontCharCode = mapSpecialUnicodeValues(fontCharCode); } @@ -26214,11 +28771,18 @@ warn(`charToGlyph - invalid fontCharCode: ${fontCharCode}`); } } + if (this.missingFile && this.vertical && fontChar.length === 1) { + const vertical = getVerticalPresentationForm()[fontChar.charCodeAt(0)]; + if (vertical) { + fontChar = unicode = String.fromCharCode(vertical); + } + } glyph = new fonts_Glyph(charcode, fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont); - return this._glyphCache[charcode] = glyph; + this.#glyphCache.set(charcode, glyph); + return glyph; } charsToGlyphs(chars) { - let glyphs = this._charsCache[chars]; + let glyphs = this.#charsCache.get(chars); if (glyphs) { return glyphs; } @@ -26244,7 +28808,8 @@ glyphs.push(glyph); } } - return this._charsCache[chars] = glyphs; + this.#charsCache.set(chars, glyphs); + return glyphs; } getCharPositions(chars) { const positions = []; @@ -26265,7 +28830,7 @@ return positions; } get glyphCacheValues() { - return Object.values(this._glyphCache); + return this.#glyphCache.values(); } encodeString(str) { const buffers = []; @@ -26313,813 +28878,14 @@ encodeString(chars) { return [chars]; } - exportData(extraProperties = false) { + exportData() { return { error: this.error }; } } -;// CONCATENATED MODULE: ./src/core/pattern.js - - - - -const ShadingType = { - FUNCTION_BASED: 1, - AXIAL: 2, - RADIAL: 3, - FREE_FORM_MESH: 4, - LATTICE_FORM_MESH: 5, - COONS_PATCH_MESH: 6, - TENSOR_PATCH_MESH: 7 -}; -class Pattern { - constructor() { - unreachable("Cannot initialize Pattern."); - } - static parseShading(shading, xref, res, pdfFunctionFactory, localColorSpaceCache) { - const dict = shading instanceof BaseStream ? shading.dict : shading; - const type = dict.get("ShadingType"); - try { - switch (type) { - case ShadingType.AXIAL: - case ShadingType.RADIAL: - return new RadialAxialShading(dict, xref, res, pdfFunctionFactory, localColorSpaceCache); - case ShadingType.FREE_FORM_MESH: - case ShadingType.LATTICE_FORM_MESH: - case ShadingType.COONS_PATCH_MESH: - case ShadingType.TENSOR_PATCH_MESH: - return new MeshShading(shading, xref, res, pdfFunctionFactory, localColorSpaceCache); - default: - throw new FormatError("Unsupported ShadingType: " + type); - } - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn(ex); - return new DummyShading(); - } - } -} -class BaseShading { - static SMALL_NUMBER = 1e-6; - constructor() { - if (this.constructor === BaseShading) { - unreachable("Cannot initialize BaseShading."); - } - } - getIR() { - unreachable("Abstract method `getIR` called."); - } -} -class RadialAxialShading extends BaseShading { - constructor(dict, xref, resources, pdfFunctionFactory, localColorSpaceCache) { - super(); - this.coordsArr = dict.getArray("Coords"); - this.shadingType = dict.get("ShadingType"); - const cs = ColorSpace.parse({ - cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), - xref, - resources, - pdfFunctionFactory, - localColorSpaceCache - }); - const bbox = dict.getArray("BBox"); - this.bbox = Array.isArray(bbox) && bbox.length === 4 ? Util.normalizeRect(bbox) : null; - let t0 = 0.0, - t1 = 1.0; - if (dict.has("Domain")) { - const domainArr = dict.getArray("Domain"); - t0 = domainArr[0]; - t1 = domainArr[1]; - } - let extendStart = false, - extendEnd = false; - if (dict.has("Extend")) { - const extendArr = dict.getArray("Extend"); - extendStart = extendArr[0]; - extendEnd = extendArr[1]; - } - if (this.shadingType === ShadingType.RADIAL && (!extendStart || !extendEnd)) { - const [x1, y1, r1, x2, y2, r2] = this.coordsArr; - const distance = Math.hypot(x1 - x2, y1 - y2); - if (r1 <= r2 + distance && r2 <= r1 + distance) { - warn("Unsupported radial gradient."); - } - } - this.extendStart = extendStart; - this.extendEnd = extendEnd; - const fnObj = dict.getRaw("Function"); - const fn = pdfFunctionFactory.createFromArray(fnObj); - const NUMBER_OF_SAMPLES = 840; - const step = (t1 - t0) / NUMBER_OF_SAMPLES; - const colorStops = this.colorStops = []; - if (t0 >= t1 || step <= 0) { - info("Bad shading domain."); - return; - } - const color = new Float32Array(cs.numComps), - ratio = new Float32Array(1); - let rgbColor; - let iBase = 0; - ratio[0] = t0; - fn(ratio, 0, color, 0); - let rgbBase = cs.getRgb(color, 0); - const cssColorBase = Util.makeHexColor(rgbBase[0], rgbBase[1], rgbBase[2]); - colorStops.push([0, cssColorBase]); - let iPrev = 1; - ratio[0] = t0 + step; - fn(ratio, 0, color, 0); - let rgbPrev = cs.getRgb(color, 0); - let maxSlopeR = rgbPrev[0] - rgbBase[0] + 1; - let maxSlopeG = rgbPrev[1] - rgbBase[1] + 1; - let maxSlopeB = rgbPrev[2] - rgbBase[2] + 1; - let minSlopeR = rgbPrev[0] - rgbBase[0] - 1; - let minSlopeG = rgbPrev[1] - rgbBase[1] - 1; - let minSlopeB = rgbPrev[2] - rgbBase[2] - 1; - for (let i = 2; i < NUMBER_OF_SAMPLES; i++) { - ratio[0] = t0 + i * step; - fn(ratio, 0, color, 0); - rgbColor = cs.getRgb(color, 0); - const run = i - iBase; - maxSlopeR = Math.min(maxSlopeR, (rgbColor[0] - rgbBase[0] + 1) / run); - maxSlopeG = Math.min(maxSlopeG, (rgbColor[1] - rgbBase[1] + 1) / run); - maxSlopeB = Math.min(maxSlopeB, (rgbColor[2] - rgbBase[2] + 1) / run); - minSlopeR = Math.max(minSlopeR, (rgbColor[0] - rgbBase[0] - 1) / run); - minSlopeG = Math.max(minSlopeG, (rgbColor[1] - rgbBase[1] - 1) / run); - minSlopeB = Math.max(minSlopeB, (rgbColor[2] - rgbBase[2] - 1) / run); - const slopesExist = minSlopeR <= maxSlopeR && minSlopeG <= maxSlopeG && minSlopeB <= maxSlopeB; - if (!slopesExist) { - const cssColor = Util.makeHexColor(rgbPrev[0], rgbPrev[1], rgbPrev[2]); - colorStops.push([iPrev / NUMBER_OF_SAMPLES, cssColor]); - maxSlopeR = rgbColor[0] - rgbPrev[0] + 1; - maxSlopeG = rgbColor[1] - rgbPrev[1] + 1; - maxSlopeB = rgbColor[2] - rgbPrev[2] + 1; - minSlopeR = rgbColor[0] - rgbPrev[0] - 1; - minSlopeG = rgbColor[1] - rgbPrev[1] - 1; - minSlopeB = rgbColor[2] - rgbPrev[2] - 1; - iBase = iPrev; - rgbBase = rgbPrev; - } - iPrev = i; - rgbPrev = rgbColor; - } - const cssColor = Util.makeHexColor(rgbPrev[0], rgbPrev[1], rgbPrev[2]); - colorStops.push([1, cssColor]); - let background = "transparent"; - if (dict.has("Background")) { - rgbColor = cs.getRgb(dict.get("Background"), 0); - background = Util.makeHexColor(rgbColor[0], rgbColor[1], rgbColor[2]); - } - if (!extendStart) { - colorStops.unshift([0, background]); - colorStops[1][0] += BaseShading.SMALL_NUMBER; - } - if (!extendEnd) { - colorStops.at(-1)[0] -= BaseShading.SMALL_NUMBER; - colorStops.push([1, background]); - } - this.colorStops = colorStops; - } - getIR() { - const coordsArr = this.coordsArr; - const shadingType = this.shadingType; - let type, p0, p1, r0, r1; - if (shadingType === ShadingType.AXIAL) { - p0 = [coordsArr[0], coordsArr[1]]; - p1 = [coordsArr[2], coordsArr[3]]; - r0 = null; - r1 = null; - type = "axial"; - } else if (shadingType === ShadingType.RADIAL) { - p0 = [coordsArr[0], coordsArr[1]]; - p1 = [coordsArr[3], coordsArr[4]]; - r0 = coordsArr[2]; - r1 = coordsArr[5]; - type = "radial"; - } else { - unreachable(`getPattern type unknown: ${shadingType}`); - } - return ["RadialAxial", type, this.bbox, this.colorStops, p0, p1, r0, r1]; - } -} -class MeshStreamReader { - constructor(stream, context) { - this.stream = stream; - this.context = context; - this.buffer = 0; - this.bufferLength = 0; - const numComps = context.numComps; - this.tmpCompsBuf = new Float32Array(numComps); - const csNumComps = context.colorSpace.numComps; - this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : this.tmpCompsBuf; - } - get hasData() { - if (this.stream.end) { - return this.stream.pos < this.stream.end; - } - if (this.bufferLength > 0) { - return true; - } - const nextByte = this.stream.getByte(); - if (nextByte < 0) { - return false; - } - this.buffer = nextByte; - this.bufferLength = 8; - return true; - } - readBits(n) { - let buffer = this.buffer; - let bufferLength = this.bufferLength; - if (n === 32) { - if (bufferLength === 0) { - return (this.stream.getByte() << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte()) >>> 0; - } - buffer = buffer << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte(); - const nextByte = this.stream.getByte(); - this.buffer = nextByte & (1 << bufferLength) - 1; - return (buffer << 8 - bufferLength | (nextByte & 0xff) >> bufferLength) >>> 0; - } - if (n === 8 && bufferLength === 0) { - return this.stream.getByte(); - } - while (bufferLength < n) { - buffer = buffer << 8 | this.stream.getByte(); - bufferLength += 8; - } - bufferLength -= n; - this.bufferLength = bufferLength; - this.buffer = buffer & (1 << bufferLength) - 1; - return buffer >> bufferLength; - } - align() { - this.buffer = 0; - this.bufferLength = 0; - } - readFlag() { - return this.readBits(this.context.bitsPerFlag); - } - readCoordinate() { - const bitsPerCoordinate = this.context.bitsPerCoordinate; - const xi = this.readBits(bitsPerCoordinate); - const yi = this.readBits(bitsPerCoordinate); - const decode = this.context.decode; - const scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : 2.3283064365386963e-10; - return [xi * scale * (decode[1] - decode[0]) + decode[0], yi * scale * (decode[3] - decode[2]) + decode[2]]; - } - readComponents() { - const numComps = this.context.numComps; - const bitsPerComponent = this.context.bitsPerComponent; - const scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10; - const decode = this.context.decode; - const components = this.tmpCompsBuf; - for (let i = 0, j = 4; i < numComps; i++, j += 2) { - const ci = this.readBits(bitsPerComponent); - components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j]; - } - const color = this.tmpCsCompsBuf; - if (this.context.colorFn) { - this.context.colorFn(components, 0, color, 0); - } - return this.context.colorSpace.getRgb(color, 0); - } -} -let bCache = Object.create(null); -function buildB(count) { - const lut = []; - for (let i = 0; i <= count; i++) { - const t = i / count, - t_ = 1 - t; - lut.push(new Float32Array([t_ ** 3, 3 * t * t_ ** 2, 3 * t ** 2 * t_, t ** 3])); - } - return lut; -} -function getB(count) { - return bCache[count] ||= buildB(count); -} -function clearPatternCaches() { - bCache = Object.create(null); -} -class MeshShading extends BaseShading { - static MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3; - static MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20; - static TRIANGLE_DENSITY = 20; - constructor(stream, xref, resources, pdfFunctionFactory, localColorSpaceCache) { - super(); - if (!(stream instanceof BaseStream)) { - throw new FormatError("Mesh data is not a stream"); - } - const dict = stream.dict; - this.shadingType = dict.get("ShadingType"); - const bbox = dict.getArray("BBox"); - this.bbox = Array.isArray(bbox) && bbox.length === 4 ? Util.normalizeRect(bbox) : null; - const cs = ColorSpace.parse({ - cs: dict.getRaw("CS") || dict.getRaw("ColorSpace"), - xref, - resources, - pdfFunctionFactory, - localColorSpaceCache - }); - this.background = dict.has("Background") ? cs.getRgb(dict.get("Background"), 0) : null; - const fnObj = dict.getRaw("Function"); - const fn = fnObj ? pdfFunctionFactory.createFromArray(fnObj) : null; - this.coords = []; - this.colors = []; - this.figures = []; - const decodeContext = { - bitsPerCoordinate: dict.get("BitsPerCoordinate"), - bitsPerComponent: dict.get("BitsPerComponent"), - bitsPerFlag: dict.get("BitsPerFlag"), - decode: dict.getArray("Decode"), - colorFn: fn, - colorSpace: cs, - numComps: fn ? 1 : cs.numComps - }; - const reader = new MeshStreamReader(stream, decodeContext); - let patchMesh = false; - switch (this.shadingType) { - case ShadingType.FREE_FORM_MESH: - this._decodeType4Shading(reader); - break; - case ShadingType.LATTICE_FORM_MESH: - const verticesPerRow = dict.get("VerticesPerRow") | 0; - if (verticesPerRow < 2) { - throw new FormatError("Invalid VerticesPerRow"); - } - this._decodeType5Shading(reader, verticesPerRow); - break; - case ShadingType.COONS_PATCH_MESH: - this._decodeType6Shading(reader); - patchMesh = true; - break; - case ShadingType.TENSOR_PATCH_MESH: - this._decodeType7Shading(reader); - patchMesh = true; - break; - default: - unreachable("Unsupported mesh type."); - break; - } - if (patchMesh) { - this._updateBounds(); - for (let i = 0, ii = this.figures.length; i < ii; i++) { - this._buildFigureFromPatch(i); - } - } - this._updateBounds(); - this._packData(); - } - _decodeType4Shading(reader) { - const coords = this.coords; - const colors = this.colors; - const operators = []; - const ps = []; - let verticesLeft = 0; - while (reader.hasData) { - const f = reader.readFlag(); - const coord = reader.readCoordinate(); - const color = reader.readComponents(); - if (verticesLeft === 0) { - if (!(0 <= f && f <= 2)) { - throw new FormatError("Unknown type4 flag"); - } - switch (f) { - case 0: - verticesLeft = 3; - break; - case 1: - ps.push(ps.at(-2), ps.at(-1)); - verticesLeft = 1; - break; - case 2: - ps.push(ps.at(-3), ps.at(-1)); - verticesLeft = 1; - break; - } - operators.push(f); - } - ps.push(coords.length); - coords.push(coord); - colors.push(color); - verticesLeft--; - reader.align(); - } - this.figures.push({ - type: "triangles", - coords: new Int32Array(ps), - colors: new Int32Array(ps) - }); - } - _decodeType5Shading(reader, verticesPerRow) { - const coords = this.coords; - const colors = this.colors; - const ps = []; - while (reader.hasData) { - const coord = reader.readCoordinate(); - const color = reader.readComponents(); - ps.push(coords.length); - coords.push(coord); - colors.push(color); - } - this.figures.push({ - type: "lattice", - coords: new Int32Array(ps), - colors: new Int32Array(ps), - verticesPerRow - }); - } - _decodeType6Shading(reader) { - const coords = this.coords; - const colors = this.colors; - const ps = new Int32Array(16); - const cs = new Int32Array(4); - while (reader.hasData) { - const f = reader.readFlag(); - if (!(0 <= f && f <= 3)) { - throw new FormatError("Unknown type6 flag"); - } - const pi = coords.length; - for (let i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) { - coords.push(reader.readCoordinate()); - } - const ci = colors.length; - for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) { - colors.push(reader.readComponents()); - } - let tmp1, tmp2, tmp3, tmp4; - switch (f) { - case 0: - ps[12] = pi + 3; - ps[13] = pi + 4; - ps[14] = pi + 5; - ps[15] = pi + 6; - ps[8] = pi + 2; - ps[11] = pi + 7; - ps[4] = pi + 1; - ps[7] = pi + 8; - ps[0] = pi; - ps[1] = pi + 11; - ps[2] = pi + 10; - ps[3] = pi + 9; - cs[2] = ci + 1; - cs[3] = ci + 2; - cs[0] = ci; - cs[1] = ci + 3; - break; - case 1: - tmp1 = ps[12]; - tmp2 = ps[13]; - tmp3 = ps[14]; - tmp4 = ps[15]; - ps[12] = tmp4; - ps[13] = pi + 0; - ps[14] = pi + 1; - ps[15] = pi + 2; - ps[8] = tmp3; - ps[11] = pi + 3; - ps[4] = tmp2; - ps[7] = pi + 4; - ps[0] = tmp1; - ps[1] = pi + 7; - ps[2] = pi + 6; - ps[3] = pi + 5; - tmp1 = cs[2]; - tmp2 = cs[3]; - cs[2] = tmp2; - cs[3] = ci; - cs[0] = tmp1; - cs[1] = ci + 1; - break; - case 2: - tmp1 = ps[15]; - tmp2 = ps[11]; - ps[12] = ps[3]; - ps[13] = pi + 0; - ps[14] = pi + 1; - ps[15] = pi + 2; - ps[8] = ps[7]; - ps[11] = pi + 3; - ps[4] = tmp2; - ps[7] = pi + 4; - ps[0] = tmp1; - ps[1] = pi + 7; - ps[2] = pi + 6; - ps[3] = pi + 5; - tmp1 = cs[3]; - cs[2] = cs[1]; - cs[3] = ci; - cs[0] = tmp1; - cs[1] = ci + 1; - break; - case 3: - ps[12] = ps[0]; - ps[13] = pi + 0; - ps[14] = pi + 1; - ps[15] = pi + 2; - ps[8] = ps[1]; - ps[11] = pi + 3; - ps[4] = ps[2]; - ps[7] = pi + 4; - ps[0] = ps[3]; - ps[1] = pi + 7; - ps[2] = pi + 6; - ps[3] = pi + 5; - cs[2] = cs[0]; - cs[3] = ci; - cs[0] = cs[1]; - cs[1] = ci + 1; - break; - } - ps[5] = coords.length; - coords.push([(-4 * coords[ps[0]][0] - coords[ps[15]][0] + 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, (-4 * coords[ps[0]][1] - coords[ps[15]][1] + 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9]); - ps[6] = coords.length; - coords.push([(-4 * coords[ps[3]][0] - coords[ps[12]][0] + 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, (-4 * coords[ps[3]][1] - coords[ps[12]][1] + 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9]); - ps[9] = coords.length; - coords.push([(-4 * coords[ps[12]][0] - coords[ps[3]][0] + 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, (-4 * coords[ps[12]][1] - coords[ps[3]][1] + 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9]); - ps[10] = coords.length; - coords.push([(-4 * coords[ps[15]][0] - coords[ps[0]][0] + 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, (-4 * coords[ps[15]][1] - coords[ps[0]][1] + 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9]); - this.figures.push({ - type: "patch", - coords: new Int32Array(ps), - colors: new Int32Array(cs) - }); - } - } - _decodeType7Shading(reader) { - const coords = this.coords; - const colors = this.colors; - const ps = new Int32Array(16); - const cs = new Int32Array(4); - while (reader.hasData) { - const f = reader.readFlag(); - if (!(0 <= f && f <= 3)) { - throw new FormatError("Unknown type7 flag"); - } - const pi = coords.length; - for (let i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) { - coords.push(reader.readCoordinate()); - } - const ci = colors.length; - for (let i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) { - colors.push(reader.readComponents()); - } - let tmp1, tmp2, tmp3, tmp4; - switch (f) { - case 0: - ps[12] = pi + 3; - ps[13] = pi + 4; - ps[14] = pi + 5; - ps[15] = pi + 6; - ps[8] = pi + 2; - ps[9] = pi + 13; - ps[10] = pi + 14; - ps[11] = pi + 7; - ps[4] = pi + 1; - ps[5] = pi + 12; - ps[6] = pi + 15; - ps[7] = pi + 8; - ps[0] = pi; - ps[1] = pi + 11; - ps[2] = pi + 10; - ps[3] = pi + 9; - cs[2] = ci + 1; - cs[3] = ci + 2; - cs[0] = ci; - cs[1] = ci + 3; - break; - case 1: - tmp1 = ps[12]; - tmp2 = ps[13]; - tmp3 = ps[14]; - tmp4 = ps[15]; - ps[12] = tmp4; - ps[13] = pi + 0; - ps[14] = pi + 1; - ps[15] = pi + 2; - ps[8] = tmp3; - ps[9] = pi + 9; - ps[10] = pi + 10; - ps[11] = pi + 3; - ps[4] = tmp2; - ps[5] = pi + 8; - ps[6] = pi + 11; - ps[7] = pi + 4; - ps[0] = tmp1; - ps[1] = pi + 7; - ps[2] = pi + 6; - ps[3] = pi + 5; - tmp1 = cs[2]; - tmp2 = cs[3]; - cs[2] = tmp2; - cs[3] = ci; - cs[0] = tmp1; - cs[1] = ci + 1; - break; - case 2: - tmp1 = ps[15]; - tmp2 = ps[11]; - ps[12] = ps[3]; - ps[13] = pi + 0; - ps[14] = pi + 1; - ps[15] = pi + 2; - ps[8] = ps[7]; - ps[9] = pi + 9; - ps[10] = pi + 10; - ps[11] = pi + 3; - ps[4] = tmp2; - ps[5] = pi + 8; - ps[6] = pi + 11; - ps[7] = pi + 4; - ps[0] = tmp1; - ps[1] = pi + 7; - ps[2] = pi + 6; - ps[3] = pi + 5; - tmp1 = cs[3]; - cs[2] = cs[1]; - cs[3] = ci; - cs[0] = tmp1; - cs[1] = ci + 1; - break; - case 3: - ps[12] = ps[0]; - ps[13] = pi + 0; - ps[14] = pi + 1; - ps[15] = pi + 2; - ps[8] = ps[1]; - ps[9] = pi + 9; - ps[10] = pi + 10; - ps[11] = pi + 3; - ps[4] = ps[2]; - ps[5] = pi + 8; - ps[6] = pi + 11; - ps[7] = pi + 4; - ps[0] = ps[3]; - ps[1] = pi + 7; - ps[2] = pi + 6; - ps[3] = pi + 5; - cs[2] = cs[0]; - cs[3] = ci; - cs[0] = cs[1]; - cs[1] = ci + 1; - break; - } - this.figures.push({ - type: "patch", - coords: new Int32Array(ps), - colors: new Int32Array(cs) - }); - } - } - _buildFigureFromPatch(index) { - const figure = this.figures[index]; - assert(figure.type === "patch", "Unexpected patch mesh figure"); - const coords = this.coords, - colors = this.colors; - const pi = figure.coords; - const ci = figure.colors; - const figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); - const figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); - const figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); - const figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); - let splitXBy = Math.ceil((figureMaxX - figureMinX) * MeshShading.TRIANGLE_DENSITY / (this.bounds[2] - this.bounds[0])); - splitXBy = Math.max(MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy)); - let splitYBy = Math.ceil((figureMaxY - figureMinY) * MeshShading.TRIANGLE_DENSITY / (this.bounds[3] - this.bounds[1])); - splitYBy = Math.max(MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy)); - const verticesPerRow = splitXBy + 1; - const figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow); - const figureColors = new Int32Array((splitYBy + 1) * verticesPerRow); - let k = 0; - const cl = new Uint8Array(3), - cr = new Uint8Array(3); - const c0 = colors[ci[0]], - c1 = colors[ci[1]], - c2 = colors[ci[2]], - c3 = colors[ci[3]]; - const bRow = getB(splitYBy), - bCol = getB(splitXBy); - for (let row = 0; row <= splitYBy; row++) { - cl[0] = (c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy | 0; - cl[1] = (c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy | 0; - cl[2] = (c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy | 0; - cr[0] = (c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy | 0; - cr[1] = (c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy | 0; - cr[2] = (c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy | 0; - for (let col = 0; col <= splitXBy; col++, k++) { - if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) { - continue; - } - let x = 0, - y = 0; - let q = 0; - for (let i = 0; i <= 3; i++) { - for (let j = 0; j <= 3; j++, q++) { - const m = bRow[row][i] * bCol[col][j]; - x += coords[pi[q]][0] * m; - y += coords[pi[q]][1] * m; - } - } - figureCoords[k] = coords.length; - coords.push([x, y]); - figureColors[k] = colors.length; - const newColor = new Uint8Array(3); - newColor[0] = (cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy | 0; - newColor[1] = (cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy | 0; - newColor[2] = (cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy | 0; - colors.push(newColor); - } - } - figureCoords[0] = pi[0]; - figureColors[0] = ci[0]; - figureCoords[splitXBy] = pi[3]; - figureColors[splitXBy] = ci[1]; - figureCoords[verticesPerRow * splitYBy] = pi[12]; - figureColors[verticesPerRow * splitYBy] = ci[2]; - figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15]; - figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3]; - this.figures[index] = { - type: "lattice", - coords: figureCoords, - colors: figureColors, - verticesPerRow - }; - } - _updateBounds() { - let minX = this.coords[0][0], - minY = this.coords[0][1], - maxX = minX, - maxY = minY; - for (let i = 1, ii = this.coords.length; i < ii; i++) { - const x = this.coords[i][0], - y = this.coords[i][1]; - minX = minX > x ? x : minX; - minY = minY > y ? y : minY; - maxX = maxX < x ? x : maxX; - maxY = maxY < y ? y : maxY; - } - this.bounds = [minX, minY, maxX, maxY]; - } - _packData() { - let i, ii, j, jj; - const coords = this.coords; - const coordsPacked = new Float32Array(coords.length * 2); - for (i = 0, j = 0, ii = coords.length; i < ii; i++) { - const xy = coords[i]; - coordsPacked[j++] = xy[0]; - coordsPacked[j++] = xy[1]; - } - this.coords = coordsPacked; - const colors = this.colors; - const colorsPacked = new Uint8Array(colors.length * 3); - for (i = 0, j = 0, ii = colors.length; i < ii; i++) { - const c = colors[i]; - colorsPacked[j++] = c[0]; - colorsPacked[j++] = c[1]; - colorsPacked[j++] = c[2]; - } - this.colors = colorsPacked; - const figures = this.figures; - for (i = 0, ii = figures.length; i < ii; i++) { - const figure = figures[i], - ps = figure.coords, - cs = figure.colors; - for (j = 0, jj = ps.length; j < jj; j++) { - ps[j] *= 2; - cs[j] *= 3; - } - } - } - getIR() { - const { - bounds - } = this; - if (bounds[2] - bounds[0] === 0 || bounds[3] - bounds[1] === 0) { - throw new FormatError(`Invalid MeshShading bounds: [${bounds}].`); - } - return ["Mesh", this.shadingType, this.coords, this.colors, this.figures, bounds, this.bbox, this.background]; - } -} -class DummyShading extends BaseShading { - getIR() { - return ["Dummy"]; - } -} -function getTilingPatternIR(operatorList, dict, color) { - const matrix = dict.getArray("Matrix"); - const bbox = Util.normalizeRect(dict.getArray("BBox")); - const xstep = dict.get("XStep"); - const ystep = dict.get("YStep"); - const paintType = dict.get("PaintType"); - const tilingType = dict.get("TilingType"); - if (bbox[2] - bbox[0] === 0 || bbox[3] - bbox[1] === 0) { - throw new FormatError(`Invalid getTilingPatternIR /BBox array: [${bbox}].`); - } - return ["TilingPattern", color, operatorList, matrix, bbox, xstep, ystep, paintType, tilingType]; -} - -;// CONCATENATED MODULE: ./src/core/calibri_factors.js +;// ./src/core/calibri_factors.js const CalibriBoldFactors = [1.3877, 1, 1, 1, 0.97801, 0.92482, 0.89552, 0.91133, 0.81988, 0.97566, 0.98152, 0.93548, 0.93548, 1.2798, 0.85284, 0.92794, 1, 0.96134, 1.54657, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.91133, 0.82845, 0.82845, 0.85284, 0.85284, 0.85284, 0.75859, 0.92138, 0.83908, 0.7762, 0.73293, 0.87289, 0.73133, 0.7514, 0.81921, 0.87356, 0.95958, 0.59526, 0.75727, 0.69225, 1.04924, 0.9121, 0.86943, 0.79795, 0.88198, 0.77958, 0.70864, 0.81055, 0.90399, 0.88653, 0.96017, 0.82577, 0.77892, 0.78257, 0.97507, 1.54657, 0.97507, 0.85284, 0.89552, 0.90176, 0.88762, 0.8785, 0.75241, 0.8785, 0.90518, 0.95015, 0.77618, 0.8785, 0.88401, 0.91916, 0.86304, 0.88401, 0.91488, 0.8785, 0.8801, 0.8785, 0.8785, 0.91343, 0.7173, 1.04106, 0.8785, 0.85075, 0.95794, 0.82616, 0.85162, 0.79492, 0.88331, 1.69808, 0.88331, 0.85284, 0.97801, 0.89552, 0.91133, 0.89552, 0.91133, 1.7801, 0.89552, 1.24487, 1.13254, 1.12401, 0.96839, 0.85284, 0.68787, 0.70645, 0.85592, 0.90747, 1.01466, 1.0088, 0.90323, 1, 1.07463, 1, 0.91056, 0.75806, 1.19118, 0.96839, 0.78864, 0.82845, 0.84133, 0.75859, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.83908, 0.77539, 0.73293, 0.73133, 0.73133, 0.73133, 0.73133, 0.95958, 0.95958, 0.95958, 0.95958, 0.88506, 0.9121, 0.86943, 0.86943, 0.86943, 0.86943, 0.86943, 0.85284, 0.87508, 0.90399, 0.90399, 0.90399, 0.90399, 0.77892, 0.79795, 0.90807, 0.88762, 0.88762, 0.88762, 0.88762, 0.88762, 0.88762, 0.8715, 0.75241, 0.90518, 0.90518, 0.90518, 0.90518, 0.88401, 0.88401, 0.88401, 0.88401, 0.8785, 0.8785, 0.8801, 0.8801, 0.8801, 0.8801, 0.8801, 0.90747, 0.89049, 0.8785, 0.8785, 0.8785, 0.8785, 0.85162, 0.8785, 0.85162, 0.83908, 0.88762, 0.83908, 0.88762, 0.83908, 0.88762, 0.73293, 0.75241, 0.73293, 0.75241, 0.73293, 0.75241, 0.73293, 0.75241, 0.87289, 0.83016, 0.88506, 0.93125, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.73133, 0.90518, 0.81921, 0.77618, 0.81921, 0.77618, 0.81921, 0.77618, 1, 1, 0.87356, 0.8785, 0.91075, 0.89608, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.95958, 0.88401, 0.76229, 0.90167, 0.59526, 0.91916, 1, 1, 0.86304, 0.69225, 0.88401, 1, 1, 0.70424, 0.79468, 0.91926, 0.88175, 0.70823, 0.94903, 0.9121, 0.8785, 1, 1, 0.9121, 0.8785, 0.87802, 0.88656, 0.8785, 0.86943, 0.8801, 0.86943, 0.8801, 0.86943, 0.8801, 0.87402, 0.89291, 0.77958, 0.91343, 1, 1, 0.77958, 0.91343, 0.70864, 0.7173, 0.70864, 0.7173, 0.70864, 0.7173, 0.70864, 0.7173, 1, 1, 0.81055, 0.75841, 0.81055, 1.06452, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.90399, 0.8785, 0.96017, 0.95794, 0.77892, 0.85162, 0.77892, 0.78257, 0.79492, 0.78257, 0.79492, 0.78257, 0.79492, 0.9297, 0.56892, 0.83908, 0.88762, 0.77539, 0.8715, 0.87508, 0.89049, 1, 1, 0.81055, 1.04106, 1.20528, 1.20528, 1, 1.15543, 0.70674, 0.98387, 0.94721, 1.33431, 1.45894, 0.95161, 1.06303, 0.83908, 0.80352, 0.57184, 0.6965, 0.56289, 0.82001, 0.56029, 0.81235, 1.02988, 0.83908, 0.7762, 0.68156, 0.80367, 0.73133, 0.78257, 0.87356, 0.86943, 0.95958, 0.75727, 0.89019, 1.04924, 0.9121, 0.7648, 0.86943, 0.87356, 0.79795, 0.78275, 0.81055, 0.77892, 0.9762, 0.82577, 0.99819, 0.84896, 0.95958, 0.77892, 0.96108, 1.01407, 0.89049, 1.02988, 0.94211, 0.96108, 0.8936, 0.84021, 0.87842, 0.96399, 0.79109, 0.89049, 1.00813, 1.02988, 0.86077, 0.87445, 0.92099, 0.84723, 0.86513, 0.8801, 0.75638, 0.85714, 0.78216, 0.79586, 0.87965, 0.94211, 0.97747, 0.78287, 0.97926, 0.84971, 1.02988, 0.94211, 0.8801, 0.94211, 0.84971, 0.73133, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90264, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90518, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90548, 1, 1, 1, 1, 1, 1, 0.96017, 0.95794, 0.96017, 0.95794, 0.96017, 0.95794, 0.77892, 0.85162, 1, 1, 0.89552, 0.90527, 1, 0.90363, 0.92794, 0.92794, 0.92794, 0.92794, 0.87012, 0.87012, 0.87012, 0.89552, 0.89552, 1.42259, 0.71143, 1.06152, 1, 1, 1.03372, 1.03372, 0.97171, 1.4956, 2.2807, 0.93835, 0.83406, 0.91133, 0.84107, 0.91133, 1, 1, 1, 0.72021, 1, 1.23108, 0.83489, 0.88525, 0.88525, 0.81499, 0.90527, 1.81055, 0.90527, 1.81055, 1.31006, 1.53711, 0.94434, 1.08696, 1, 0.95018, 0.77192, 0.85284, 0.90747, 1.17534, 0.69825, 0.9716, 1.37077, 0.90747, 0.90747, 0.85356, 0.90747, 0.90747, 1.44947, 0.85284, 0.8941, 0.8941, 0.70572, 0.8, 0.70572, 0.70572, 0.70572, 0.70572, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.99862, 0.99862, 1, 1, 1, 1, 1, 1.08004, 0.91027, 1, 1, 1, 0.99862, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.90727, 0.90727, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; const CalibriBoldMetrics = { lineHeight: 1.2207, @@ -27141,7 +28907,7 @@ lineGap: 0.2207 }; -;// CONCATENATED MODULE: ./src/core/helvetica_factors.js +;// ./src/core/helvetica_factors.js const HelveticaBoldFactors = [0.76116, 1, 1, 1.0006, 0.99998, 0.99974, 0.99973, 0.99973, 0.99982, 0.99977, 1.00087, 0.99998, 0.99998, 0.99959, 1.00003, 1.0006, 0.99998, 1.0006, 1.0006, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99998, 1, 1.00003, 1.00003, 1.00003, 1.00026, 0.9999, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00026, 1.00022, 0.99977, 1.0006, 0.99973, 0.99977, 1.00026, 0.99999, 0.99977, 1.00022, 1.00001, 1.00022, 0.99977, 1.00001, 1.00026, 0.99977, 1.00001, 1.00016, 1.00001, 1.00001, 1.00026, 0.99998, 1.0006, 0.99998, 1.00003, 0.99973, 0.99998, 0.99973, 1.00026, 0.99973, 1.00026, 0.99973, 0.99998, 1.00026, 1.00026, 1.0006, 1.0006, 0.99973, 1.0006, 0.99982, 1.00026, 1.00026, 1.00026, 1.00026, 0.99959, 0.99973, 0.99998, 1.00026, 0.99973, 1.00022, 0.99973, 0.99973, 1, 0.99959, 1.00077, 0.99959, 1.00003, 0.99998, 0.99973, 0.99973, 0.99973, 0.99973, 1.00077, 0.99973, 0.99998, 1.00025, 0.99968, 0.99973, 1.00003, 1.00025, 0.60299, 1.00024, 1.06409, 1, 1, 0.99998, 1, 0.99973, 1.0006, 0.99998, 1, 0.99936, 0.99973, 1.00002, 1.00002, 1.00002, 1.00026, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 0.99977, 1, 0.99977, 1.00001, 1.00001, 1.00001, 1.00001, 1.0006, 1.0006, 1.0006, 1.0006, 0.99977, 0.99977, 1.00022, 1.00022, 1.00022, 1.00022, 1.00022, 1.00003, 1.00022, 0.99977, 0.99977, 0.99977, 0.99977, 1.00001, 1.00001, 1.00026, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 0.99982, 0.99973, 0.99973, 0.99973, 0.99973, 0.99973, 1.0006, 1.0006, 1.0006, 1.0006, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 1.06409, 1.00026, 1.00026, 1.00026, 1.00026, 1.00026, 0.99973, 1.00026, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 0.99973, 0.99977, 1.03374, 0.99977, 1.00026, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.0006, 1.00042, 0.99973, 0.99973, 1.0006, 0.99977, 0.99973, 0.99973, 1.00026, 1.0006, 1.00026, 1.0006, 1.00026, 1.03828, 1.00026, 0.99999, 1.00026, 1.0006, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.9993, 0.9998, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1.00022, 1.00026, 1, 1.00016, 0.99977, 0.99959, 0.99977, 0.99959, 0.99977, 0.99959, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00001, 0.99973, 1.00026, 0.99998, 1.00026, 0.8121, 1.00026, 0.99998, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 0.99977, 1.00026, 1.00016, 1.00022, 1.00001, 0.99973, 1.00001, 1.00026, 1, 1.00026, 1, 1.00026, 1, 1.0006, 0.99973, 0.99977, 0.99973, 1, 0.99982, 1.00022, 1.00026, 1.00001, 0.99973, 1.00026, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 0.99998, 1.00034, 0.99977, 1, 0.99997, 1.00026, 1.00078, 1.00036, 0.99973, 1.00013, 1.0006, 0.99977, 0.99977, 0.99988, 0.85148, 1.00001, 1.00026, 0.99977, 1.00022, 1.0006, 0.99977, 1.00001, 0.99999, 0.99977, 1.00069, 1.00022, 0.99977, 1.00001, 0.99984, 1.00026, 1.00001, 1.00024, 1.00001, 0.9999, 1, 1.0006, 1.00001, 1.00041, 0.99962, 1.00026, 1.0006, 0.99995, 1.00041, 0.99942, 0.99973, 0.99927, 1.00082, 0.99902, 1.00026, 1.00087, 1.0006, 1.00069, 0.99973, 0.99867, 0.99973, 0.9993, 1.00026, 1.00049, 1.00056, 1, 0.99988, 0.99935, 0.99995, 0.99954, 1.00055, 0.99945, 1.00032, 1.0006, 0.99995, 1.00026, 0.99995, 1.00032, 1.00001, 1.00008, 0.99971, 1.00019, 0.9994, 1.00001, 1.0006, 1.00044, 0.99973, 1.00023, 1.00047, 1, 0.99942, 0.99561, 0.99989, 1.00035, 0.99977, 1.00035, 0.99977, 1.00019, 0.99944, 1.00001, 1.00021, 0.99926, 1.00035, 1.00035, 0.99942, 1.00048, 0.99999, 0.99977, 1.00022, 1.00035, 1.00001, 0.99977, 1.00026, 0.99989, 1.00057, 1.00001, 0.99936, 1.00052, 1.00012, 0.99996, 1.00043, 1, 1.00035, 0.9994, 0.99976, 1.00035, 0.99973, 1.00052, 1.00041, 1.00119, 1.00037, 0.99973, 1.00002, 0.99986, 1.00041, 1.00041, 0.99902, 0.9996, 1.00034, 0.99999, 1.00026, 0.99999, 1.00026, 0.99973, 1.00052, 0.99973, 1, 0.99973, 1.00041, 1.00075, 0.9994, 1.0003, 0.99999, 1, 1.00041, 0.99955, 1, 0.99915, 0.99973, 0.99973, 1.00026, 1.00119, 0.99955, 0.99973, 1.0006, 0.99911, 1.0006, 1.00026, 0.99972, 1.00026, 0.99902, 1.00041, 0.99973, 0.99999, 1, 1, 1.00038, 1.0005, 1.00016, 1.00022, 1.00016, 1.00022, 1.00016, 1.00022, 1.00001, 0.99973, 1, 1, 0.99973, 1, 1, 0.99955, 1.0006, 1.0006, 1.0006, 1.0006, 1, 1, 1, 0.99973, 0.99973, 0.99972, 1, 1, 1.00106, 0.99999, 0.99998, 0.99998, 0.99999, 0.99998, 1.66475, 1, 0.99973, 0.99973, 1.00023, 0.99973, 0.99971, 1.00047, 1.00023, 1, 0.99991, 0.99984, 1.00002, 1.00002, 1.00002, 1.00002, 1, 1, 1, 1, 1, 1, 1, 0.99972, 1, 1.20985, 1.39713, 1.00003, 1.00031, 1.00015, 1, 0.99561, 1.00027, 1.00031, 1.00031, 0.99915, 1.00031, 1.00031, 0.99999, 1.00003, 0.99999, 0.99999, 1.41144, 1.6, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.41144, 1.40579, 1.40579, 1.36625, 0.99999, 1, 0.99861, 0.99861, 1, 1.00026, 1.00026, 1.00026, 1.00026, 0.99972, 0.99999, 0.99999, 0.99999, 0.99999, 1.40483, 1, 0.99977, 1.00054, 1, 1, 0.99953, 0.99962, 1.00042, 0.9995, 1, 1, 1, 1, 1, 1, 1, 1, 0.99998, 0.99998, 0.99998, 0.99998, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; const HelveticaBoldMetrics = { lineHeight: 1.2, @@ -27163,7 +28929,7 @@ lineGap: 0.2 }; -;// CONCATENATED MODULE: ./src/core/liberationsans_widths.js +;// ./src/core/liberationsans_widths.js const LiberationSansBoldWidths = [365, 0, 333, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 333, 556, 556, 556, 556, 280, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 556, 278, 333, 333, 365, 556, 834, 834, 834, 611, 722, 722, 722, 722, 722, 722, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, 611, 611, 611, 549, 611, 611, 611, 611, 611, 556, 611, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 719, 722, 611, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 611, 778, 611, 778, 611, 778, 611, 722, 611, 722, 611, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 785, 556, 556, 278, 722, 556, 556, 611, 278, 611, 278, 611, 385, 611, 479, 611, 278, 722, 611, 722, 611, 722, 611, 708, 723, 611, 778, 611, 778, 611, 778, 611, 1000, 944, 722, 389, 722, 389, 722, 389, 667, 556, 667, 556, 667, 556, 667, 556, 611, 333, 611, 479, 611, 333, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 944, 778, 667, 556, 667, 611, 500, 611, 500, 611, 500, 278, 556, 722, 556, 1000, 889, 778, 611, 667, 556, 611, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 465, 722, 333, 853, 906, 474, 825, 927, 838, 278, 722, 722, 601, 719, 667, 611, 722, 778, 278, 722, 667, 833, 722, 644, 778, 722, 667, 600, 611, 667, 821, 667, 809, 802, 278, 667, 615, 451, 611, 278, 582, 615, 610, 556, 606, 475, 460, 611, 541, 278, 558, 556, 612, 556, 445, 611, 766, 619, 520, 684, 446, 582, 715, 576, 753, 845, 278, 582, 611, 582, 845, 667, 669, 885, 567, 711, 667, 278, 276, 556, 1094, 1062, 875, 610, 722, 622, 719, 722, 719, 722, 567, 712, 667, 904, 626, 719, 719, 610, 702, 833, 722, 778, 719, 667, 722, 611, 622, 854, 667, 730, 703, 1005, 1019, 870, 979, 719, 711, 1031, 719, 556, 618, 615, 417, 635, 556, 709, 497, 615, 615, 500, 635, 740, 604, 611, 604, 611, 556, 490, 556, 875, 556, 615, 581, 833, 844, 729, 854, 615, 552, 854, 583, 556, 556, 611, 417, 552, 556, 278, 281, 278, 969, 906, 611, 500, 615, 556, 604, 778, 611, 487, 447, 944, 778, 944, 778, 944, 778, 667, 556, 333, 333, 556, 1000, 1000, 552, 278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1000, 1000, 240, 479, 333, 333, 604, 333, 167, 396, 556, 556, 1094, 556, 885, 489, 1115, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 722, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 611, 611, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 333, 333, 333, 333, 333, 333, 333, 333]; const LiberationSansBoldMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; const LiberationSansBoldItalicWidths = [365, 0, 333, 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 333, 556, 556, 556, 556, 280, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 556, 278, 333, 333, 365, 556, 834, 834, 834, 611, 722, 722, 722, 722, 722, 722, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 556, 556, 556, 556, 556, 278, 278, 278, 278, 611, 611, 611, 611, 611, 611, 611, 549, 611, 611, 611, 611, 611, 556, 611, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 740, 722, 611, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 611, 778, 611, 778, 611, 778, 611, 722, 611, 722, 611, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 782, 556, 556, 278, 722, 556, 556, 611, 278, 611, 278, 611, 396, 611, 479, 611, 278, 722, 611, 722, 611, 722, 611, 708, 723, 611, 778, 611, 778, 611, 778, 611, 1000, 944, 722, 389, 722, 389, 722, 389, 667, 556, 667, 556, 667, 556, 667, 556, 611, 333, 611, 479, 611, 333, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 722, 611, 944, 778, 667, 556, 667, 611, 500, 611, 500, 611, 500, 278, 556, 722, 556, 1000, 889, 778, 611, 667, 556, 611, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 722, 333, 854, 906, 473, 844, 930, 847, 278, 722, 722, 610, 671, 667, 611, 722, 778, 278, 722, 667, 833, 722, 657, 778, 718, 667, 590, 611, 667, 822, 667, 829, 781, 278, 667, 620, 479, 611, 278, 591, 620, 621, 556, 610, 479, 492, 611, 558, 278, 566, 556, 603, 556, 450, 611, 712, 605, 532, 664, 409, 591, 704, 578, 773, 834, 278, 591, 611, 591, 834, 667, 667, 886, 614, 719, 667, 278, 278, 556, 1094, 1042, 854, 622, 719, 677, 719, 722, 708, 722, 614, 722, 667, 927, 643, 719, 719, 615, 687, 833, 722, 778, 719, 667, 722, 611, 677, 781, 667, 729, 708, 979, 989, 854, 1000, 708, 719, 1042, 729, 556, 619, 604, 534, 618, 556, 736, 510, 611, 611, 507, 622, 740, 604, 611, 611, 611, 556, 889, 556, 885, 556, 646, 583, 889, 935, 707, 854, 594, 552, 865, 589, 556, 556, 611, 469, 563, 556, 278, 278, 278, 969, 906, 611, 507, 619, 556, 611, 778, 611, 575, 467, 944, 778, 944, 778, 944, 778, 667, 556, 333, 333, 556, 1000, 1000, 552, 278, 278, 278, 278, 500, 500, 500, 556, 556, 350, 1000, 1000, 240, 479, 333, 333, 604, 333, 167, 396, 556, 556, 1104, 556, 885, 516, 1146, 1000, 768, 600, 834, 834, 834, 834, 999, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 722, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 611, 611, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 333, 333, 333, 333, 333, 333, 333, 333]; @@ -27173,7 +28939,7 @@ const LiberationSansRegularWidths = [365, 0, 333, 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, 333, 556, 556, 556, 556, 260, 556, 333, 737, 370, 556, 584, 737, 552, 400, 549, 333, 333, 333, 576, 537, 278, 333, 333, 365, 556, 834, 834, 834, 611, 667, 667, 667, 667, 667, 667, 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584, 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 500, 556, 556, 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, 556, 556, 556, 549, 611, 556, 556, 556, 556, 500, 556, 500, 667, 556, 667, 556, 667, 556, 722, 500, 722, 500, 722, 500, 722, 500, 722, 615, 722, 556, 667, 556, 667, 556, 667, 556, 667, 556, 667, 556, 778, 556, 778, 556, 778, 556, 778, 556, 722, 556, 722, 556, 278, 278, 278, 278, 278, 278, 278, 222, 278, 278, 735, 444, 500, 222, 667, 500, 500, 556, 222, 556, 222, 556, 292, 556, 334, 556, 222, 722, 556, 722, 556, 722, 556, 604, 723, 556, 778, 556, 778, 556, 778, 556, 1000, 944, 722, 333, 722, 333, 722, 333, 667, 500, 667, 500, 667, 500, 667, 500, 611, 278, 611, 375, 611, 278, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 722, 556, 944, 722, 667, 500, 667, 611, 500, 611, 500, 611, 500, 222, 556, 667, 556, 1000, 889, 778, 611, 667, 500, 611, 278, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 667, 278, 784, 838, 384, 774, 855, 752, 222, 667, 667, 551, 668, 667, 611, 722, 778, 278, 667, 668, 833, 722, 650, 778, 722, 667, 618, 611, 667, 798, 667, 835, 748, 278, 667, 578, 446, 556, 222, 547, 578, 575, 500, 557, 446, 441, 556, 556, 222, 500, 500, 576, 500, 448, 556, 690, 569, 482, 617, 395, 547, 648, 525, 713, 781, 222, 547, 556, 547, 781, 667, 667, 865, 542, 719, 667, 278, 278, 500, 1057, 1010, 854, 583, 722, 635, 719, 667, 656, 667, 542, 677, 667, 923, 604, 719, 719, 583, 656, 833, 722, 778, 719, 667, 722, 611, 635, 760, 667, 740, 667, 917, 938, 792, 885, 656, 719, 1010, 722, 556, 573, 531, 365, 583, 556, 669, 458, 559, 559, 438, 583, 688, 552, 556, 542, 556, 500, 458, 500, 823, 500, 573, 521, 802, 823, 625, 719, 521, 510, 750, 542, 556, 556, 556, 365, 510, 500, 222, 278, 222, 906, 812, 556, 438, 559, 500, 552, 778, 556, 489, 411, 944, 722, 944, 722, 944, 722, 667, 500, 333, 333, 556, 1000, 1000, 552, 222, 222, 222, 222, 333, 333, 333, 556, 556, 350, 1000, 1000, 188, 354, 333, 333, 500, 333, 167, 365, 556, 556, 1094, 556, 885, 323, 1073, 1000, 768, 600, 834, 834, 834, 834, 1000, 500, 1000, 500, 1000, 500, 500, 494, 612, 823, 713, 584, 549, 713, 979, 719, 274, 549, 549, 583, 549, 549, 604, 584, 604, 604, 708, 625, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 708, 729, 604, 604, 354, 354, 1000, 990, 990, 990, 990, 494, 604, 604, 604, 604, 354, 1021, 1052, 917, 750, 750, 531, 656, 594, 510, 500, 750, 750, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 222, 222, 294, 294, 324, 324, 316, 328, 398, 285]; const LiberationSansRegularMapping = [-1, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 402, 506, 507, 508, 509, 510, 511, 536, 537, 538, 539, 710, 711, 713, 728, 729, 730, 731, 732, 733, 900, 901, 902, 903, 904, 905, 906, 908, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1138, 1139, 1168, 1169, 7808, 7809, 7810, 7811, 7812, 7813, 7922, 7923, 8208, 8209, 8211, 8212, 8213, 8215, 8216, 8217, 8218, 8219, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8242, 8243, 8249, 8250, 8252, 8254, 8260, 8319, 8355, 8356, 8359, 8364, 8453, 8467, 8470, 8482, 8486, 8494, 8539, 8540, 8541, 8542, 8592, 8593, 8594, 8595, 8596, 8597, 8616, 8706, 8710, 8719, 8721, 8722, 8730, 8734, 8735, 8745, 8747, 8776, 8800, 8801, 8804, 8805, 8962, 8976, 8992, 8993, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 9632, 9633, 9642, 9643, 9644, 9650, 9658, 9660, 9668, 9674, 9675, 9679, 9688, 9689, 9702, 9786, 9787, 9788, 9792, 9794, 9824, 9827, 9829, 9830, 9834, 9835, 9836, 61441, 61442, 61445, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; -;// CONCATENATED MODULE: ./src/core/myriadpro_factors.js +;// ./src/core/myriadpro_factors.js const MyriadProBoldFactors = [1.36898, 1, 1, 0.72706, 0.80479, 0.83734, 0.98894, 0.99793, 0.9897, 0.93884, 0.86209, 0.94292, 0.94292, 1.16661, 1.02058, 0.93582, 0.96694, 0.93582, 1.19137, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.99793, 0.78076, 0.78076, 1.02058, 1.02058, 1.02058, 0.72851, 0.78966, 0.90838, 0.83637, 0.82391, 0.96376, 0.80061, 0.86275, 0.8768, 0.95407, 1.0258, 0.73901, 0.85022, 0.83655, 1.0156, 0.95546, 0.92179, 0.87107, 0.92179, 0.82114, 0.8096, 0.89713, 0.94438, 0.95353, 0.94083, 0.91905, 0.90406, 0.9446, 0.94292, 1.18777, 0.94292, 1.02058, 0.89903, 0.90088, 0.94938, 0.97898, 0.81093, 0.97571, 0.94938, 1.024, 0.9577, 0.95933, 0.98621, 1.0474, 0.97455, 0.98981, 0.9672, 0.95933, 0.9446, 0.97898, 0.97407, 0.97646, 0.78036, 1.10208, 0.95442, 0.95298, 0.97579, 0.9332, 0.94039, 0.938, 0.80687, 1.01149, 0.80687, 1.02058, 0.80479, 0.99793, 0.99793, 0.99793, 0.99793, 1.01149, 1.00872, 0.90088, 0.91882, 1.0213, 0.8361, 1.02058, 0.62295, 0.54324, 0.89022, 1.08595, 1, 1, 0.90088, 1, 0.97455, 0.93582, 0.90088, 1, 1.05686, 0.8361, 0.99642, 0.99642, 0.99642, 0.72851, 0.90838, 0.90838, 0.90838, 0.90838, 0.90838, 0.90838, 0.868, 0.82391, 0.80061, 0.80061, 0.80061, 0.80061, 1.0258, 1.0258, 1.0258, 1.0258, 0.97484, 0.95546, 0.92179, 0.92179, 0.92179, 0.92179, 0.92179, 1.02058, 0.92179, 0.94438, 0.94438, 0.94438, 0.94438, 0.90406, 0.86958, 0.98225, 0.94938, 0.94938, 0.94938, 0.94938, 0.94938, 0.94938, 0.9031, 0.81093, 0.94938, 0.94938, 0.94938, 0.94938, 0.98621, 0.98621, 0.98621, 0.98621, 0.93969, 0.95933, 0.9446, 0.9446, 0.9446, 0.9446, 0.9446, 1.08595, 0.9446, 0.95442, 0.95442, 0.95442, 0.95442, 0.94039, 0.97898, 0.94039, 0.90838, 0.94938, 0.90838, 0.94938, 0.90838, 0.94938, 0.82391, 0.81093, 0.82391, 0.81093, 0.82391, 0.81093, 0.82391, 0.81093, 0.96376, 0.84313, 0.97484, 0.97571, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.80061, 0.94938, 0.8768, 0.9577, 0.8768, 0.9577, 0.8768, 0.9577, 1, 1, 0.95407, 0.95933, 0.97069, 0.95933, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 1.0258, 0.98621, 0.887, 1.01591, 0.73901, 1.0474, 1, 1, 0.97455, 0.83655, 0.98981, 1, 1, 0.83655, 0.73977, 0.83655, 0.73903, 0.84638, 1.033, 0.95546, 0.95933, 1, 1, 0.95546, 0.95933, 0.8271, 0.95417, 0.95933, 0.92179, 0.9446, 0.92179, 0.9446, 0.92179, 0.9446, 0.936, 0.91964, 0.82114, 0.97646, 1, 1, 0.82114, 0.97646, 0.8096, 0.78036, 0.8096, 0.78036, 1, 1, 0.8096, 0.78036, 1, 1, 0.89713, 0.77452, 0.89713, 1.10208, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94438, 0.95442, 0.94083, 0.97579, 0.90406, 0.94039, 0.90406, 0.9446, 0.938, 0.9446, 0.938, 0.9446, 0.938, 1, 0.99793, 0.90838, 0.94938, 0.868, 0.9031, 0.92179, 0.9446, 1, 1, 0.89713, 1.10208, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90088, 0.90989, 0.9358, 0.91945, 0.83181, 0.75261, 0.87992, 0.82976, 0.96034, 0.83689, 0.97268, 1.0078, 0.90838, 0.83637, 0.8019, 0.90157, 0.80061, 0.9446, 0.95407, 0.92436, 1.0258, 0.85022, 0.97153, 1.0156, 0.95546, 0.89192, 0.92179, 0.92361, 0.87107, 0.96318, 0.89713, 0.93704, 0.95638, 0.91905, 0.91709, 0.92796, 1.0258, 0.93704, 0.94836, 1.0373, 0.95933, 1.0078, 0.95871, 0.94836, 0.96174, 0.92601, 0.9498, 0.98607, 0.95776, 0.95933, 1.05453, 1.0078, 0.98275, 0.9314, 0.95617, 0.91701, 1.05993, 0.9446, 0.78367, 0.9553, 1, 0.86832, 1.0128, 0.95871, 0.99394, 0.87548, 0.96361, 0.86774, 1.0078, 0.95871, 0.9446, 0.95871, 0.86774, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.94083, 0.97579, 0.94083, 0.97579, 0.94083, 0.97579, 0.90406, 0.94039, 0.96694, 1, 0.89903, 1, 1, 1, 0.93582, 0.93582, 0.93582, 1, 0.908, 0.908, 0.918, 0.94219, 0.94219, 0.96544, 1, 1.285, 1, 1, 0.81079, 0.81079, 1, 1, 0.74854, 1, 1, 1, 1, 0.99793, 1, 1, 1, 0.65, 1, 1.36145, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.17173, 1, 0.80535, 0.76169, 1.02058, 1.0732, 1.05486, 1, 1, 1.30692, 1.08595, 1.08595, 1, 1.08595, 1.08595, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.16161, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; const MyriadProBoldMetrics = { lineHeight: 1.2, @@ -27195,7 +28961,7 @@ lineGap: 0.2 }; -;// CONCATENATED MODULE: ./src/core/segoeui_factors.js +;// ./src/core/segoeui_factors.js const SegoeuiBoldFactors = [1.76738, 1, 1, 0.99297, 0.9824, 1.04016, 1.06497, 1.03424, 0.97529, 1.17647, 1.23203, 1.1085, 1.1085, 1.16939, 1.2107, 0.9754, 1.21408, 0.9754, 1.59578, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 1.03424, 0.81378, 0.81378, 1.2107, 1.2107, 1.2107, 0.71703, 0.97847, 0.97363, 0.88776, 0.8641, 1.02096, 0.79795, 0.85132, 0.914, 1.06085, 1.1406, 0.8007, 0.89858, 0.83693, 1.14889, 1.09398, 0.97489, 0.92094, 0.97489, 0.90399, 0.84041, 0.95923, 1.00135, 1, 1.06467, 0.98243, 0.90996, 0.99361, 1.1085, 1.56942, 1.1085, 1.2107, 0.74627, 0.94282, 0.96752, 1.01519, 0.86304, 1.01359, 0.97278, 1.15103, 1.01359, 0.98561, 1.02285, 1.02285, 1.00527, 1.02285, 1.0302, 0.99041, 1.0008, 1.01519, 1.01359, 1.02258, 0.79104, 1.16862, 0.99041, 0.97454, 1.02511, 0.99298, 0.96752, 0.95801, 0.94856, 1.16579, 0.94856, 1.2107, 0.9824, 1.03424, 1.03424, 1, 1.03424, 1.16579, 0.8727, 1.3871, 1.18622, 1.10818, 1.04478, 1.2107, 1.18622, 0.75155, 0.94994, 1.28826, 1.21408, 1.21408, 0.91056, 1, 0.91572, 0.9754, 0.64663, 1.18328, 1.24866, 1.04478, 1.14169, 1.15749, 1.17389, 0.71703, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.97363, 0.93506, 0.8641, 0.79795, 0.79795, 0.79795, 0.79795, 1.1406, 1.1406, 1.1406, 1.1406, 1.02096, 1.09398, 0.97426, 0.97426, 0.97426, 0.97426, 0.97426, 1.2107, 0.97489, 1.00135, 1.00135, 1.00135, 1.00135, 0.90996, 0.92094, 1.02798, 0.96752, 0.96752, 0.96752, 0.96752, 0.96752, 0.96752, 0.93136, 0.86304, 0.97278, 0.97278, 0.97278, 0.97278, 1.02285, 1.02285, 1.02285, 1.02285, 0.97122, 0.99041, 1, 1, 1, 1, 1, 1.28826, 1.0008, 0.99041, 0.99041, 0.99041, 0.99041, 0.96752, 1.01519, 0.96752, 0.97363, 0.96752, 0.97363, 0.96752, 0.97363, 0.96752, 0.8641, 0.86304, 0.8641, 0.86304, 0.8641, 0.86304, 0.8641, 0.86304, 1.02096, 1.03057, 1.02096, 1.03517, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.79795, 0.97278, 0.914, 1.01359, 0.914, 1.01359, 0.914, 1.01359, 1, 1, 1.06085, 0.98561, 1.06085, 1.00879, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 1.1406, 1.02285, 0.97138, 1.08692, 0.8007, 1.02285, 1, 1, 1.00527, 0.83693, 1.02285, 1, 1, 0.83693, 0.9455, 0.83693, 0.90418, 0.83693, 1.13005, 1.09398, 0.99041, 1, 1, 1.09398, 0.99041, 0.96692, 1.09251, 0.99041, 0.97489, 1.0008, 0.97489, 1.0008, 0.97489, 1.0008, 0.93994, 0.97931, 0.90399, 1.02258, 1, 1, 0.90399, 1.02258, 0.84041, 0.79104, 0.84041, 0.79104, 0.84041, 0.79104, 0.84041, 0.79104, 1, 1, 0.95923, 1.07034, 0.95923, 1.16862, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.00135, 0.99041, 1.06467, 1.02511, 0.90996, 0.96752, 0.90996, 0.99361, 0.95801, 0.99361, 0.95801, 0.99361, 0.95801, 1.07733, 1.03424, 0.97363, 0.96752, 0.93506, 0.93136, 0.97489, 1.0008, 1, 1, 0.95923, 1.16862, 1.15103, 1.15103, 1.01173, 1.03959, 0.75953, 0.81378, 0.79912, 1.15103, 1.21994, 0.95161, 0.87815, 1.01149, 0.81525, 0.7676, 0.98167, 1.01134, 1.02546, 0.84097, 1.03089, 1.18102, 0.97363, 0.88776, 0.85134, 0.97826, 0.79795, 0.99361, 1.06085, 0.97489, 1.1406, 0.89858, 1.0388, 1.14889, 1.09398, 0.86039, 0.97489, 1.0595, 0.92094, 0.94793, 0.95923, 0.90996, 0.99346, 0.98243, 1.02112, 0.95493, 1.1406, 0.90996, 1.03574, 1.02597, 1.0008, 1.18102, 1.06628, 1.03574, 1.0192, 1.01932, 1.00886, 0.97531, 1.0106, 1.0008, 1.13189, 1.18102, 1.02277, 0.98683, 1.0016, 0.99561, 1.07237, 1.0008, 0.90434, 0.99921, 0.93803, 0.8965, 1.23085, 1.06628, 1.04983, 0.96268, 1.0499, 0.98439, 1.18102, 1.06628, 1.0008, 1.06628, 0.98439, 0.79795, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.09466, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.97278, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.02065, 1, 1, 1, 1, 1, 1, 1.06467, 1.02511, 1.06467, 1.02511, 1.06467, 1.02511, 0.90996, 0.96752, 1, 1.21408, 0.89903, 1, 1, 0.75155, 1.04394, 1.04394, 1.04394, 1.04394, 0.98633, 0.98633, 0.98633, 0.73047, 0.73047, 1.20642, 0.91211, 1.25635, 1.222, 1.02956, 1.03372, 1.03372, 0.96039, 1.24633, 1, 1.12454, 0.93503, 1.03424, 1.19687, 1.03424, 1, 1, 1, 0.771, 1, 1, 1.15749, 1.15749, 1.15749, 1.10948, 0.86279, 0.94434, 0.86279, 0.94434, 0.86182, 1, 1, 1.16897, 1, 0.96085, 0.90137, 1.2107, 1.18416, 1.13973, 0.69825, 0.9716, 2.10339, 1.29004, 1.29004, 1.21172, 1.29004, 1.29004, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.42603, 1, 0.99862, 0.99862, 1, 0.87025, 0.87025, 0.87025, 0.87025, 1.18874, 1.42603, 1, 1.42603, 1.42603, 0.99862, 1, 1, 1, 1, 1, 1.2886, 1.04315, 1.15296, 1.34163, 1, 1, 1, 1.09193, 1.09193, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; const SegoeuiBoldMetrics = { lineHeight: 1.33008, @@ -27217,7 +28983,7 @@ lineGap: 0 }; -;// CONCATENATED MODULE: ./src/core/xfa_fonts.js +;// ./src/core/xfa_fonts.js @@ -27415,203 +29181,2587 @@ return dict; } -;// CONCATENATED MODULE: ./src/core/ps_parser.js +;// ./src/core/postscript/lexer.js +const TOKEN = { + number: 0, + lbrace: 1, + rbrace: 2, + true: 3, + false: 4, + add: 5, + sub: 6, + mul: 7, + div: 8, + idiv: 9, + mod: 10, + exp: 11, + eq: 12, + ne: 13, + gt: 14, + ge: 15, + lt: 16, + le: 17, + and: 18, + or: 19, + xor: 20, + bitshift: 21, + abs: 22, + neg: 23, + ceiling: 24, + floor: 25, + round: 26, + truncate: 27, + not: 28, + sqrt: 29, + sin: 30, + cos: 31, + ln: 32, + log: 33, + atan: 34, + cvi: 35, + cvr: 36, + dup: 37, + exch: 38, + pop: 39, + copy: 40, + index: 41, + roll: 42, + if: 43, + ifelse: 44, + eof: 45, + min: 46, + max: 47 +}; +class Token { + constructor(id, value = null) { + this.id = id; + this.value = value; + } +} +class lexer_Lexer { + static #singletons = null; + static #operatorSingletons = null; + static #initSingletons() { + const singletons = Object.create(null); + const operatorSingletons = Object.create(null); + for (const [name, id] of Object.entries(TOKEN)) { + if (name === "number") { + continue; + } + const isOperator = id >= TOKEN.true && id <= TOKEN.ifelse; + const token = new Token(id, isOperator ? name : null); + singletons[name] = token; + if (isOperator) { + operatorSingletons[name] = token; + } + } + this.#singletons = singletons; + this.#operatorSingletons = operatorSingletons; + } + constructor(data) { + if (!lexer_Lexer.#singletons) { + lexer_Lexer.#initSingletons(); + } + this.data = data; + this.pos = 0; + this.len = data.length; + this._numberPattern = /[+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?/iy; + this._identifierPattern = /[a-z]+/y; + } + _skipComment() { + const lf = this.data.indexOf("\n", this.pos); + const cr = this.data.indexOf("\r", this.pos); + const eol = Math.min(lf < 0 ? this.len : lf, cr < 0 ? this.len : cr); + this.pos = Math.min(eol + 1, this.len); + } + _getNumber() { + this._numberPattern.lastIndex = this.pos; + const match = this._numberPattern.exec(this.data); + if (!match) { + return new Token(TOKEN.number, 0); + } + const number = parseFloat(match[0]); + if (!Number.isFinite(number)) { + return new Token(TOKEN.number, 0); + } + this.pos = this._numberPattern.lastIndex; + return new Token(TOKEN.number, number); + } + _getOperator() { + this._identifierPattern.lastIndex = this.pos; + const match = this._identifierPattern.exec(this.data); + if (!match) { + return new Token(TOKEN.number, 0); + } + this.pos = this._identifierPattern.lastIndex; + const op = match[0]; + const token = lexer_Lexer.#operatorSingletons[op]; + if (!token) { + return new Token(TOKEN.number, 0); + } + return token; + } + next() { + while (this.pos < this.len) { + const ch = this.data.charCodeAt(this.pos++); + switch (ch) { + case 0x00: + case 0x09: + case 0x0a: + case 0x0c: + case 0x0d: + case 0x20: + break; + case 0x25: + this._skipComment(); + break; + case 0x7b: + return lexer_Lexer.#singletons.lbrace; + case 0x7d: + return lexer_Lexer.#singletons.rbrace; + case 0x2b: + case 0x2d: + this.pos--; + return this._getNumber(); + case 0x2e: + this.pos--; + return this._getNumber(); + default: + if (ch >= 0x30 && ch <= 0x39) { + this.pos--; + return this._getNumber(); + } + if (ch >= 0x61 && ch <= 0x7a) { + this.pos--; + return this._getOperator(); + } + return new Token(TOKEN.number, 0); + } + } + return lexer_Lexer.#singletons.eof; + } +} +;// ./src/core/postscript/ast.js -class PostScriptParser { +const PS_VALUE_TYPE = { + numeric: 0, + boolean: 1, + unknown: 2 +}; +const PS_NODE = { + program: 0, + block: 1, + number: 2, + operator: 3, + if: 4, + ifelse: 5, + arg: 6, + const: 7, + unary: 8, + binary: 9, + ternary: 10 +}; +class PsNode { + constructor(type) { + this.type = type; + } +} +class PsProgram extends PsNode { + constructor(body) { + super(PS_NODE.program); + this.body = body; + } +} +class PsBlock extends PsNode { + constructor(instructions) { + super(PS_NODE.block); + this.instructions = instructions; + } +} +class PsNumber extends PsNode { + constructor(value) { + super(PS_NODE.number); + this.value = value; + } +} +class PsOperator extends PsNode { + constructor(op) { + super(PS_NODE.operator); + this.op = op; + } +} +class PsIf extends PsNode { + constructor(then) { + super(PS_NODE.if); + this.then = then; + } +} +class PsIfElse extends PsNode { + constructor(then, otherwise) { + super(PS_NODE.ifelse); + this.then = then; + this.otherwise = otherwise; + } +} +class PsArgNode extends PsNode { + constructor(index) { + super(PS_NODE.arg); + this.index = index; + this.valueType = PS_VALUE_TYPE.numeric; + } +} +class PsConstNode extends PsNode { + constructor(value) { + super(PS_NODE.const); + this.value = value; + this.valueType = typeof value === "boolean" ? PS_VALUE_TYPE.boolean : PS_VALUE_TYPE.numeric; + } +} +class PsUnaryNode extends PsNode { + constructor(op, operand, valueType = PS_VALUE_TYPE.unknown) { + super(PS_NODE.unary); + this.op = op; + this.operand = operand; + this.valueType = valueType; + } +} +class PsBinaryNode extends PsNode { + constructor(op, first, second, valueType = PS_VALUE_TYPE.unknown) { + super(PS_NODE.binary); + this.op = op; + this.first = first; + this.second = second; + this.valueType = valueType; + } +} +class PsTernaryNode extends PsNode { + constructor(cond, then, otherwise, valueType = PS_VALUE_TYPE.unknown) { + super(PS_NODE.ternary); + this.cond = cond; + this.then = then; + this.otherwise = otherwise; + this.valueType = valueType; + } +} +class ast_Parser { constructor(lexer) { this.lexer = lexer; - this.operators = []; - this.token = null; - this.prev = null; - } - nextToken() { - this.prev = this.token; - this.token = this.lexer.getToken(); - } - accept(type) { - if (this.token.type === type) { - this.nextToken(); - return true; - } - return false; + this._token = null; } - expect(type) { - if (this.accept(type)) { - return true; + static _isRegularOperator(id) { + return id >= TOKEN.true && id < TOKEN.if; + } + _advance() { + this._token = this.lexer.next(); + } + _expect(id) { + if (this._token.id !== id) { + throw new FormatError(`PostScript function: expected token id ${id}, got ${this._token.id}.`); } - throw new FormatError(`Unexpected symbol: found ${this.token.type} expected ${type}.`); + const tok = this._token; + this._advance(); + return tok; } parse() { - this.nextToken(); - this.expect(PostScriptTokenTypes.LBRACE); - this.parseBlock(); - this.expect(PostScriptTokenTypes.RBRACE); - return this.operators; + this._advance(); + this._expect(TOKEN.lbrace); + const block = this._parseBlock(); + this._expect(TOKEN.rbrace); + if (this._token.id !== TOKEN.eof) { + warn("PostScript function: unexpected content after closing brace."); + } + return new PsProgram(block); } - parseBlock() { + _parseBlock() { + const instructions = []; while (true) { - if (this.accept(PostScriptTokenTypes.NUMBER)) { - this.operators.push(this.prev.value); - } else if (this.accept(PostScriptTokenTypes.OPERATOR)) { - this.operators.push(this.prev.value); - } else if (this.accept(PostScriptTokenTypes.LBRACE)) { - this.parseCondition(); - } else { + const tok = this._token; + switch (tok.id) { + case TOKEN.number: + instructions.push(new PsNumber(tok.value)); + this._advance(); + break; + case TOKEN.lbrace: + { + this._advance(); + const thenBlock = this._parseBlock(); + this._expect(TOKEN.rbrace); + if (this._token.id === TOKEN.if) { + this._advance(); + instructions.push(new PsIf(thenBlock)); + } else if (this._token.id === TOKEN.lbrace) { + this._advance(); + const elseBlock = this._parseBlock(); + this._expect(TOKEN.rbrace); + this._expect(TOKEN.ifelse); + instructions.push(new PsIfElse(thenBlock, elseBlock)); + } else { + throw new FormatError("PostScript function: a procedure block must be followed by 'if' or '{…} ifelse'."); + } + break; + } + case TOKEN.rbrace: + case TOKEN.eof: + return new PsBlock(instructions); + case TOKEN.if: + case TOKEN.ifelse: + throw new FormatError(`PostScript function: unexpected '${tok.value}' operator.`); + default: + if (ast_Parser._isRegularOperator(tok.id)) { + instructions.push(new PsOperator(tok.id)); + this._advance(); + break; + } + throw new FormatError(`PostScript function: unexpected token id ${tok.id}.`); + } + } + } +} +function parsePostScriptFunction(source) { + return new ast_Parser(new lexer_Lexer(source)).parse(); +} +function _nodesEqual(a, b) { + if (a === b) { + return true; + } + if (a.type !== b.type) { + return false; + } + switch (a.type) { + case PS_NODE.arg: + return a.index === b.index; + case PS_NODE.const: + return a.value === b.value; + case PS_NODE.unary: + return a.op === b.op && _nodesEqual(a.operand, b.operand); + case PS_NODE.binary: + return a.op === b.op && _nodesEqual(a.first, b.first) && _nodesEqual(a.second, b.second); + case PS_NODE.ternary: + return _nodesEqual(a.cond, b.cond) && _nodesEqual(a.then, b.then) && _nodesEqual(a.otherwise, b.otherwise); + default: + return false; + } +} +function _evalBinaryConst(op, a, b) { + switch (op) { + case TOKEN.add: + return a + b; + case TOKEN.sub: + return a - b; + case TOKEN.mul: + return a * b; + case TOKEN.div: + return b !== 0 ? a / b : 0; + case TOKEN.idiv: + return b !== 0 ? Math.trunc(a / b) : 0; + case TOKEN.mod: + return b !== 0 ? a - Math.trunc(a / b) * b : 0; + case TOKEN.exp: + { + const r = a ** b; + return Number.isFinite(r) ? r : undefined; + } + case TOKEN.atan: + { + let deg = Math.atan2(a, b) * (180 / Math.PI); + if (deg < 0) { + deg += 360; + } + return deg; + } + case TOKEN.eq: + return a === b; + case TOKEN.ne: + return a !== b; + case TOKEN.gt: + return a > b; + case TOKEN.ge: + return a >= b; + case TOKEN.lt: + return a < b; + case TOKEN.le: + return a <= b; + case TOKEN.and: + return typeof a === "boolean" ? a && b : a & b | 0; + case TOKEN.or: + return typeof a === "boolean" ? a || b : a | b | 0; + case TOKEN.xor: + return typeof a === "boolean" ? a !== b : a ^ b | 0; + case TOKEN.bitshift: + return b >= 0 ? a << b | 0 : a >> -b | 0; + case TOKEN.min: + return Math.min(a, b); + case TOKEN.max: + return Math.max(a, b); + default: + return undefined; + } +} +function _evalUnaryConst(op, v) { + switch (op) { + case TOKEN.abs: + return Math.abs(v); + case TOKEN.neg: + return -v; + case TOKEN.ceiling: + return Math.ceil(v); + case TOKEN.floor: + return Math.floor(v); + case TOKEN.round: + return Math.round(v); + case TOKEN.truncate: + return Math.trunc(v); + case TOKEN.sqrt: + { + const r = Math.sqrt(v); + return Number.isFinite(r) ? r : undefined; + } + case TOKEN.sin: + return Math.sin(v % 360 * Math.PI / 180); + case TOKEN.cos: + return Math.cos(v % 360 * Math.PI / 180); + case TOKEN.ln: + { + const r = Math.log(v); + return Number.isFinite(r) ? r : undefined; + } + case TOKEN.log: + { + const r = Math.log10(v); + return Number.isFinite(r) ? r : undefined; + } + case TOKEN.cvi: + return Math.trunc(v); + case TOKEN.cvr: + return v; + case TOKEN.not: + return typeof v === "boolean" ? !v : ~v; + default: + return undefined; + } +} +const MAX_STACK_SIZE = 100; +function _unaryValueType(op, operandType) { + return op === TOKEN.not ? operandType : PS_VALUE_TYPE.numeric; +} +function _binaryValueType(op, firstType, secondType) { + switch (op) { + case TOKEN.eq: + case TOKEN.ne: + case TOKEN.gt: + case TOKEN.ge: + case TOKEN.lt: + case TOKEN.le: + return PS_VALUE_TYPE.boolean; + case TOKEN.and: + case TOKEN.or: + case TOKEN.xor: + return firstType === secondType && firstType !== PS_VALUE_TYPE.unknown ? firstType : PS_VALUE_TYPE.unknown; + default: + return PS_VALUE_TYPE.numeric; + } +} +class PSStackToTree { + static #binaryOps = null; + static #unaryOps = null; + static #idempotentUnary = null; + static #negatedComparison = null; + static #init() { + this.#binaryOps = new Set([TOKEN.add, TOKEN.sub, TOKEN.mul, TOKEN.div, TOKEN.idiv, TOKEN.mod, TOKEN.exp, TOKEN.atan, TOKEN.eq, TOKEN.ne, TOKEN.gt, TOKEN.ge, TOKEN.lt, TOKEN.le, TOKEN.and, TOKEN.or, TOKEN.xor, TOKEN.bitshift]); + this.#unaryOps = new Set([TOKEN.abs, TOKEN.neg, TOKEN.ceiling, TOKEN.floor, TOKEN.round, TOKEN.truncate, TOKEN.sqrt, TOKEN.sin, TOKEN.cos, TOKEN.ln, TOKEN.log, TOKEN.cvi, TOKEN.cvr, TOKEN.not]); + this.#idempotentUnary = new Set([TOKEN.abs, TOKEN.ceiling, TOKEN.cvi, TOKEN.cvr, TOKEN.floor, TOKEN.round, TOKEN.truncate]); + this.#negatedComparison = new Map([[TOKEN.eq, TOKEN.ne], [TOKEN.ne, TOKEN.eq], [TOKEN.lt, TOKEN.ge], [TOKEN.le, TOKEN.gt], [TOKEN.gt, TOKEN.le], [TOKEN.ge, TOKEN.lt]]); + } + evaluate(program, numInputs) { + if (!PSStackToTree.#binaryOps) { + PSStackToTree.#init(); + } + this._failed = false; + if (numInputs > MAX_STACK_SIZE) { + return null; + } + const stack = []; + for (let i = 0; i < numInputs; i++) { + stack.push(new PsArgNode(i)); + } + this._evalBlock(program.body, stack); + if (this._failed) { + return null; + } + PSStackToTree.#markShared(stack); + return stack; + } + static #markShared(outputs) { + const refCount = new Map(); + const visit = node => { + if (!node || node.type === PS_NODE.arg || node.type === PS_NODE.const) { + return; + } + const prev = refCount.get(node) ?? 0; + refCount.set(node, prev + 1); + if (prev > 0) { return; } + switch (node.type) { + case PS_NODE.unary: + visit(node.operand); + break; + case PS_NODE.binary: + visit(node.first); + visit(node.second); + break; + case PS_NODE.ternary: + visit(node.cond); + visit(node.then); + visit(node.otherwise); + break; + } + }; + for (const output of outputs) { + visit(output); + } + for (const [node, count] of refCount) { + if (count > 1) { + node.shared = true; + node.sharedCount = count; + } } } - parseCondition() { - const conditionLocation = this.operators.length; - this.operators.push(null, null); - this.parseBlock(); - this.expect(PostScriptTokenTypes.RBRACE); - if (this.accept(PostScriptTokenTypes.IF)) { - this.operators[conditionLocation] = this.operators.length; - this.operators[conditionLocation + 1] = "jz"; - } else if (this.accept(PostScriptTokenTypes.LBRACE)) { - const jumpLocation = this.operators.length; - this.operators.push(null, null); - const endOfTrue = this.operators.length; - this.parseBlock(); - this.expect(PostScriptTokenTypes.RBRACE); - this.expect(PostScriptTokenTypes.IFELSE); - this.operators[jumpLocation] = this.operators.length; - this.operators[jumpLocation + 1] = "j"; - this.operators[conditionLocation] = endOfTrue; - this.operators[conditionLocation + 1] = "jz"; - } else { - throw new FormatError("PS Function: error parsing conditional."); + _evalBlock(block, stack) { + this._evalBlockFrom(block.instructions, 0, stack); + } + _evalBlockFrom(instructions, startIdx, stack) { + for (let idx = startIdx; idx < instructions.length; idx++) { + if (this._failed) { + break; + } + const instr = instructions[idx]; + switch (instr.type) { + case PS_NODE.number: + stack.push(new PsConstNode(instr.value)); + if (stack.length > MAX_STACK_SIZE) { + this._failed = true; + } + break; + case PS_NODE.operator: + this._evalOp(instr.op, stack); + break; + case PS_NODE.if: + { + if (stack.length < 1) { + this._failed = true; + break; + } + const cond = stack.pop(); + const saved = stack.slice(); + this._evalBlock(instr.then, stack); + if (this._failed) { + break; + } + if (stack.length === saved.length) { + for (let i = 0; i < stack.length; i++) { + if (stack[i] !== saved[i]) { + stack[i] = this._makeTernary(cond, stack[i], saved[i]); + } + } + } else if (stack.length > saved.length) { + if (cond.type === PS_NODE.const) { + if (!cond.value) { + stack.length = 0; + stack.push(...saved); + } + break; + } + const trueStack = stack.slice(); + this._evalBlockFrom(instructions, idx + 1, trueStack); + if (this._failed) { + break; + } + const falseStack = saved; + this._evalBlockFrom(instructions, idx + 1, falseStack); + if (this._failed) { + break; + } + if (trueStack.length !== falseStack.length) { + const zero = new PsConstNode(0); + while (trueStack.length < falseStack.length) { + trueStack.push(zero); + } + while (falseStack.length < trueStack.length) { + falseStack.push(zero); + } + } + stack.length = 0; + for (let i = 0; i < trueStack.length; i++) { + stack.push(this._makeTernary(cond, trueStack[i], falseStack[i])); + } + return; + } else { + this._failed = true; + } + break; + } + case PS_NODE.ifelse: + { + if (stack.length < 1) { + this._failed = true; + break; + } + const cond = stack.pop(); + const snapshot = stack.slice(); + const thenStack = snapshot.slice(); + this._evalBlock(instr.then, thenStack); + if (this._failed) { + break; + } + const elseStack = snapshot.slice(); + this._evalBlock(instr.otherwise, elseStack); + if (this._failed) { + break; + } + if (thenStack.length !== elseStack.length) { + const zero = new PsConstNode(0); + while (thenStack.length < elseStack.length) { + thenStack.push(zero); + } + while (elseStack.length < thenStack.length) { + elseStack.push(zero); + } + } + stack.length = 0; + for (let i = 0; i < thenStack.length; i++) { + stack.push(this._makeTernary(cond, thenStack[i], elseStack[i])); + } + break; + } + } } } -} -const PostScriptTokenTypes = { - LBRACE: 0, - RBRACE: 1, - NUMBER: 2, - OPERATOR: 3, - IF: 4, - IFELSE: 5 + _evalOp(op, stack) { + if (PSStackToTree.#binaryOps.has(op)) { + if (stack.length < 2) { + this._failed = true; + return; + } + const first = stack.pop(); + const second = stack.pop(); + stack.push(this._makeBinary(op, first, second)); + return; + } + if (PSStackToTree.#unaryOps.has(op)) { + if (stack.length < 1) { + this._failed = true; + return; + } + stack.push(this._makeUnary(op, stack.pop())); + return; + } + switch (op) { + case TOKEN.true: + stack.push(new PsConstNode(true)); + if (stack.length > MAX_STACK_SIZE) { + this._failed = true; + } + break; + case TOKEN.false: + stack.push(new PsConstNode(false)); + if (stack.length > MAX_STACK_SIZE) { + this._failed = true; + } + break; + case TOKEN.dup: + if (stack.length < 1) { + this._failed = true; + break; + } + stack.push(stack.at(-1)); + if (stack.length > MAX_STACK_SIZE) { + this._failed = true; + } + break; + case TOKEN.exch: + { + if (stack.length < 2) { + this._failed = true; + break; + } + const a = stack.pop(); + const b = stack.pop(); + stack.push(a, b); + break; + } + case TOKEN.pop: + if (stack.length < 1) { + this._failed = true; + break; + } + stack.pop(); + break; + case TOKEN.copy: + { + if (stack.length < 1) { + this._failed = true; + break; + } + const nNode = stack.pop(); + if (nNode.type === PS_NODE.const) { + const n = nNode.value | 0; + if (n === 0) {} else if (n < 0 || n > stack.length) { + this._failed = true; + } else { + stack.push(...stack.slice(-n)); + if (stack.length > MAX_STACK_SIZE) { + this._failed = true; + } + } + } else { + this._failed = true; + } + break; + } + case TOKEN.index: + { + if (stack.length < 1) { + this._failed = true; + break; + } + const nNode = stack.pop(); + if (nNode.type === PS_NODE.const) { + const n = nNode.value | 0; + if (n < 0 || n >= stack.length) { + this._failed = true; + } else { + stack.push(stack.at(-n - 1)); + } + } else { + this._failed = true; + } + break; + } + case TOKEN.roll: + { + if (stack.length < 2) { + this._failed = true; + break; + } + const jNode = stack.pop(); + const nNode = stack.pop(); + if (nNode.type === PS_NODE.const && jNode.type === PS_NODE.const) { + const n = nNode.value | 0; + if (n === 0) {} else if (n < 0 || n > stack.length) { + this._failed = true; + } else { + const j = ((jNode.value | 0) % n + n) % n; + if (j > 0) { + const slice = stack.splice(-n, n); + stack.push(...slice.slice(n - j), ...slice.slice(0, n - j)); + } + } + } else { + this._failed = true; + } + break; + } + default: + this._failed = true; + break; + } + } + _makeBinary(op, first, second) { + if (first.type === PS_NODE.const && second.type === PS_NODE.const) { + const v = _evalBinaryConst(op, second.value, first.value); + if (v !== undefined) { + return new PsConstNode(v); + } + } + if (_nodesEqual(first, second)) { + switch (op) { + case TOKEN.sub: + return new PsConstNode(0); + case TOKEN.xor: + return new PsConstNode(first.valueType === PS_VALUE_TYPE.boolean ? false : 0); + case TOKEN.and: + case TOKEN.or: + return first; + case TOKEN.min: + case TOKEN.max: + return first; + case TOKEN.eq: + case TOKEN.ge: + case TOKEN.le: + return new PsConstNode(true); + case TOKEN.ne: + case TOKEN.gt: + case TOKEN.lt: + return new PsConstNode(false); + } + } + if (first.type === PS_NODE.const) { + const b = first.value; + switch (op) { + case TOKEN.add: + if (b === 0) { + return second; + } + break; + case TOKEN.sub: + if (b === 0) { + return second; + } + break; + case TOKEN.mul: + if (b === 1) { + return second; + } + if (b === 0) { + return first; + } + if (b === -1) { + return this._makeUnary(TOKEN.neg, second); + } + break; + case TOKEN.div: + if (b !== 0) { + return this._makeBinary(TOKEN.mul, new PsConstNode(1 / b), second); + } + break; + case TOKEN.idiv: + if (b === 1) { + return second; + } + break; + case TOKEN.exp: + if (b === 1) { + return second; + } + if (b === -1) { + return this._makeBinary(TOKEN.div, second, new PsConstNode(1)); + } + if (b === 0.5) { + return this._makeUnary(TOKEN.sqrt, second); + } + if (b === 0.25) { + const sqrtOnce = this._makeUnary(TOKEN.sqrt, second); + return this._makeUnary(TOKEN.sqrt, sqrtOnce); + } + if (b === 2) { + return this._makeBinary(TOKEN.mul, second, second); + } + if (b === 3) { + return this._makeBinary(TOKEN.mul, this._makeBinary(TOKEN.mul, second, second), second); + } + if (b === 4) { + const square = this._makeBinary(TOKEN.mul, second, second); + return this._makeBinary(TOKEN.mul, square, square); + } + if (b === 0) { + return new PsConstNode(1); + } + break; + case TOKEN.and: + if (b === true) { + return second; + } + if (b === false) { + return first; + } + break; + case TOKEN.or: + if (b === false) { + return second; + } + if (b === true) { + return first; + } + break; + case TOKEN.min: + if (second.type === PS_NODE.binary && second.op === TOKEN.max && second.first.type === PS_NODE.const && second.first.value >= b) { + return first; + } + break; + case TOKEN.max: + if (second.type === PS_NODE.binary && second.op === TOKEN.min && second.first.type === PS_NODE.const && second.first.value <= b) { + return first; + } + break; + } + } + if (second.type === PS_NODE.const) { + const a = second.value; + switch (op) { + case TOKEN.add: + if (a === 0) { + return first; + } + break; + case TOKEN.sub: + if (a === 0) { + return this._makeUnary(TOKEN.neg, first); + } + break; + case TOKEN.mul: + if (a === 1) { + return first; + } + if (a === 0) { + return second; + } + if (a === -1) { + return this._makeUnary(TOKEN.neg, first); + } + break; + case TOKEN.and: + if (a === true) { + return first; + } + if (a === false) { + return second; + } + break; + case TOKEN.or: + if (a === false) { + return first; + } + if (a === true) { + return second; + } + break; + } + } + return new PsBinaryNode(op, first, second, _binaryValueType(op, first.valueType, second.valueType)); + } + _makeUnary(op, operand) { + if (operand.type === PS_NODE.const) { + const v = _evalUnaryConst(op, operand.value); + if (v !== undefined) { + return new PsConstNode(v); + } + } + if (op === TOKEN.not && operand.type === PS_NODE.binary) { + const negated = PSStackToTree.#negatedComparison.get(operand.op); + if (negated !== undefined) { + return new PsBinaryNode(negated, operand.first, operand.second, PS_VALUE_TYPE.boolean); + } + } + if (op === TOKEN.neg && operand.type === PS_NODE.binary && operand.op === TOKEN.sub) { + return this._makeBinary(TOKEN.sub, operand.second, operand.first); + } + if (operand.type === PS_NODE.unary) { + if (op === TOKEN.neg && operand.op === TOKEN.neg || op === TOKEN.not && operand.op === TOKEN.not) { + return operand.operand; + } + if (op === TOKEN.abs && operand.op === TOKEN.neg) { + return this._makeUnary(TOKEN.abs, operand.operand); + } + if (PSStackToTree.#idempotentUnary.has(op) && op === operand.op) { + return operand; + } + } + return new PsUnaryNode(op, operand, _unaryValueType(op, operand.valueType)); + } + _makeTernary(cond, then, otherwise) { + if (cond.type === PS_NODE.const) { + return cond.value ? then : otherwise; + } + if (_nodesEqual(then, otherwise)) { + return then; + } + if (then.type === PS_NODE.const && otherwise.type === PS_NODE.const) { + if (then.value === true && otherwise.value === false) { + return cond; + } + if (then.value === false && otherwise.value === true) { + return this._makeUnary(TOKEN.not, cond); + } + } + if (cond.type === PS_NODE.binary) { + const { + op: cop, + first: cf, + second: cs + } = cond; + if (cop === TOKEN.gt || cop === TOKEN.ge) { + if (_nodesEqual(then, cf) && _nodesEqual(otherwise, cs)) { + return this._makeBinary(TOKEN.min, cf, cs); + } + if (_nodesEqual(then, cs) && _nodesEqual(otherwise, cf)) { + return this._makeBinary(TOKEN.max, cf, cs); + } + } else if (cop === TOKEN.lt || cop === TOKEN.le) { + if (_nodesEqual(then, cf) && _nodesEqual(otherwise, cs)) { + return this._makeBinary(TOKEN.max, cf, cs); + } + if (_nodesEqual(then, cs) && _nodesEqual(otherwise, cf)) { + return this._makeBinary(TOKEN.min, cf, cs); + } + } + } + return new PsTernaryNode(cond, then, otherwise, then.valueType === otherwise.valueType ? then.valueType : PS_VALUE_TYPE.unknown); + } +} + +;// ./src/core/postscript/js_evaluator.js + + + +const OP = { + ARG: 0, + CONST: 1, + STORE: 2, + IF: 3, + JUMP: 4, + ABS: 5, + NEG: 6, + CEIL: 7, + FLOOR: 8, + ROUND: 9, + TRUNC: 10, + NOT_B: 11, + NOT_N: 12, + SQRT: 13, + SIN: 14, + COS: 15, + LN: 16, + LOG10: 17, + CVI: 18, + SHIFT: 19, + ADD: 20, + SUB: 21, + MUL: 22, + DIV: 23, + IDIV: 24, + MOD: 25, + POW: 26, + EQ: 27, + NE: 28, + GT: 29, + GE: 30, + LT: 31, + LE: 32, + AND: 33, + OR: 34, + XOR: 35, + ATAN: 36, + MIN: 37, + MAX: 38, + TEE_TMP: 39, + LOAD_TMP: 40 }; -class PostScriptToken { - static get opCache() { - return shadow(this, "opCache", Object.create(null)); +const _DEG_TO_RAD = Math.PI / 180; +const _RAD_TO_DEG = 180 / Math.PI; +class PsJsCompiler { + static #stack = new Float64Array(64); + static #tmp = new Float64Array(64); + constructor(domain, range) { + this.nIn = domain.length >> 1; + this.nOut = range.length >> 1; + this.range = range; + this.ir = []; + this._tmpMap = new Map(); + this._nextTmp = 0; + } + _compileNode(node) { + if (node.shared) { + const cached = this._tmpMap.get(node); + if (cached !== undefined) { + this.ir.push(OP.LOAD_TMP, cached); + return true; + } + if (!this._compileNodeImpl(node)) { + return false; + } + const slot = this._nextTmp++; + this._tmpMap.set(node, slot); + this.ir.push(OP.TEE_TMP, slot); + return true; + } + return this._compileNodeImpl(node); } - constructor(type, value) { - this.type = type; - this.value = value; + _compileNodeImpl(node) { + switch (node.type) { + case PS_NODE.arg: + this.ir.push(OP.ARG, node.index); + return true; + case PS_NODE.const: + { + const v = node.value; + this.ir.push(OP.CONST, typeof v === "boolean" ? Number(v) : v); + return true; + } + case PS_NODE.unary: + return this._compileUnary(node); + case PS_NODE.binary: + return this._compileBinary(node); + case PS_NODE.ternary: + return this._compileTernary(node); + default: + return false; + } + } + _compileUnary(node) { + const { + op, + operand, + valueType + } = node; + if (op === TOKEN.cvr) { + return this._compileNode(operand); + } + if (!this._compileNode(operand)) { + return false; + } + switch (op) { + case TOKEN.abs: + this.ir.push(OP.ABS); + break; + case TOKEN.neg: + this.ir.push(OP.NEG); + break; + case TOKEN.ceiling: + this.ir.push(OP.CEIL); + break; + case TOKEN.floor: + this.ir.push(OP.FLOOR); + break; + case TOKEN.round: + this.ir.push(OP.ROUND); + break; + case TOKEN.truncate: + this.ir.push(OP.TRUNC); + break; + case TOKEN.sqrt: + this.ir.push(OP.SQRT); + break; + case TOKEN.sin: + this.ir.push(OP.SIN); + break; + case TOKEN.cos: + this.ir.push(OP.COS); + break; + case TOKEN.ln: + this.ir.push(OP.LN); + break; + case TOKEN.log: + this.ir.push(OP.LOG10); + break; + case TOKEN.cvi: + this.ir.push(OP.CVI); + break; + case TOKEN.not: + if (valueType === PS_VALUE_TYPE.boolean) { + this.ir.push(OP.NOT_B); + } else if (valueType === PS_VALUE_TYPE.numeric) { + this.ir.push(OP.NOT_N); + } else { + return false; + } + break; + default: + return false; + } + return true; + } + _compileBinary(node) { + const { + op, + first, + second + } = node; + if (op === TOKEN.bitshift) { + if (first.type !== PS_NODE.const || !Number.isInteger(first.value)) { + return false; + } + if (!this._compileNode(second)) { + return false; + } + this.ir.push(OP.SHIFT, first.value); + return true; + } + if (!this._compileNode(second)) { + return false; + } + if (!this._compileNode(first)) { + return false; + } + switch (op) { + case TOKEN.add: + this.ir.push(OP.ADD); + break; + case TOKEN.sub: + this.ir.push(OP.SUB); + break; + case TOKEN.mul: + this.ir.push(OP.MUL); + break; + case TOKEN.div: + this.ir.push(OP.DIV); + break; + case TOKEN.idiv: + this.ir.push(OP.IDIV); + break; + case TOKEN.mod: + this.ir.push(OP.MOD); + break; + case TOKEN.exp: + this.ir.push(OP.POW); + break; + case TOKEN.eq: + this.ir.push(OP.EQ); + break; + case TOKEN.ne: + this.ir.push(OP.NE); + break; + case TOKEN.gt: + this.ir.push(OP.GT); + break; + case TOKEN.ge: + this.ir.push(OP.GE); + break; + case TOKEN.lt: + this.ir.push(OP.LT); + break; + case TOKEN.le: + this.ir.push(OP.LE); + break; + case TOKEN.and: + this.ir.push(OP.AND); + break; + case TOKEN.or: + this.ir.push(OP.OR); + break; + case TOKEN.xor: + this.ir.push(OP.XOR); + break; + case TOKEN.atan: + this.ir.push(OP.ATAN); + break; + case TOKEN.min: + this.ir.push(OP.MIN); + break; + case TOKEN.max: + this.ir.push(OP.MAX); + break; + default: + return false; + } + return true; + } + _compileTernary(node) { + if (!this._compileNode(node.cond)) { + return false; + } + this.ir.push(OP.IF, 0); + const ifPatch = this.ir.length - 1; + if (!this._compileNode(node.then)) { + return false; + } + this.ir.push(OP.JUMP, 0); + const jumpPatch = this.ir.length - 1; + this.ir[ifPatch] = this.ir.length; + if (!this._compileNode(node.otherwise)) { + return false; + } + this.ir[jumpPatch] = this.ir.length; + return true; + } + compile(program) { + const outputs = new PSStackToTree().evaluate(program, this.nIn); + if (!outputs || outputs.length < this.nOut) { + return null; + } + for (let i = 0; i < this.nOut; i++) { + if (!this._compileNode(outputs[i])) { + return null; + } + const min = this.range[i * 2]; + const max = this.range[i * 2 + 1]; + this.ir.push(OP.STORE, i, min, max); + } + return new Float64Array(this.ir); } - static getOperator(op) { - return PostScriptToken.opCache[op] ||= new PostScriptToken(PostScriptTokenTypes.OPERATOR, op); + static execute(ir, src, srcOffset, dest, destOffset) { + let ip = 0, + sp = 0; + const n = ir.length; + const stack = this.#stack; + const tmp = this.#tmp; + while (ip < n) { + switch (ir[ip++] | 0) { + case OP.ARG: + stack[sp++] = src[srcOffset + (ir[ip++] | 0)]; + break; + case OP.CONST: + stack[sp++] = ir[ip++]; + break; + case OP.STORE: + { + const slot = ir[ip++] | 0; + const min = ir[ip++]; + const max = ir[ip++]; + dest[destOffset + slot] = MathClamp(stack[--sp], min, max); + break; + } + case OP.IF: + { + const tgt = ir[ip++]; + if (stack[--sp] === 0) { + ip = tgt; + } + break; + } + case OP.JUMP: + ip = ir[ip]; + break; + case OP.ABS: + stack[sp - 1] = Math.abs(stack[sp - 1]); + break; + case OP.NEG: + stack[sp - 1] = -stack[sp - 1]; + break; + case OP.CEIL: + stack[sp - 1] = Math.ceil(stack[sp - 1]); + break; + case OP.FLOOR: + stack[sp - 1] = Math.floor(stack[sp - 1]); + break; + case OP.ROUND: + stack[sp - 1] = Math.floor(stack[sp - 1] + 0.5); + break; + case OP.TRUNC: + stack[sp - 1] = Math.trunc(stack[sp - 1]); + break; + case OP.NOT_B: + stack[sp - 1] = stack[sp - 1] !== 0 ? 0 : 1; + break; + case OP.NOT_N: + stack[sp - 1] = ~(stack[sp - 1] | 0); + break; + case OP.SQRT: + stack[sp - 1] = Math.sqrt(stack[sp - 1]); + break; + case OP.SIN: + stack[sp - 1] = Math.sin(stack[sp - 1] % 360 * _DEG_TO_RAD); + break; + case OP.COS: + stack[sp - 1] = Math.cos(stack[sp - 1] % 360 * _DEG_TO_RAD); + break; + case OP.LN: + stack[sp - 1] = Math.log(stack[sp - 1]); + break; + case OP.LOG10: + stack[sp - 1] = Math.log10(stack[sp - 1]); + break; + case OP.CVI: + stack[sp - 1] = Math.trunc(stack[sp - 1]) | 0; + break; + case OP.SHIFT: + { + const amt = ir[ip++]; + const v = stack[sp - 1] | 0; + if (amt > 0) { + stack[sp - 1] = v << amt; + } else if (amt < 0) { + stack[sp - 1] = v >> -amt; + } else { + stack[sp - 1] = v; + } + break; + } + case OP.ADD: + { + const b = stack[--sp]; + stack[sp - 1] += b; + break; + } + case OP.SUB: + { + const b = stack[--sp]; + stack[sp - 1] -= b; + break; + } + case OP.MUL: + { + const b = stack[--sp]; + stack[sp - 1] *= b; + break; + } + case OP.DIV: + { + const b = stack[--sp]; + stack[sp - 1] = b !== 0 ? stack[sp - 1] / b : 0; + break; + } + case OP.IDIV: + { + const b = stack[--sp]; + stack[sp - 1] = b !== 0 ? Math.trunc(stack[sp - 1] / b) : 0; + break; + } + case OP.MOD: + { + const b = stack[--sp]; + stack[sp - 1] = b !== 0 ? stack[sp - 1] % b : 0; + break; + } + case OP.POW: + { + const b = stack[--sp]; + stack[sp - 1] **= b; + break; + } + case OP.EQ: + { + const b = stack[--sp]; + stack[sp - 1] = stack[sp - 1] === b ? 1 : 0; + break; + } + case OP.NE: + { + const b = stack[--sp]; + stack[sp - 1] = stack[sp - 1] !== b ? 1 : 0; + break; + } + case OP.GT: + { + const b = stack[--sp]; + stack[sp - 1] = stack[sp - 1] > b ? 1 : 0; + break; + } + case OP.GE: + { + const b = stack[--sp]; + stack[sp - 1] = stack[sp - 1] >= b ? 1 : 0; + break; + } + case OP.LT: + { + const b = stack[--sp]; + stack[sp - 1] = stack[sp - 1] < b ? 1 : 0; + break; + } + case OP.LE: + { + const b = stack[--sp]; + stack[sp - 1] = stack[sp - 1] <= b ? 1 : 0; + break; + } + case OP.AND: + { + const b = stack[--sp] | 0; + stack[sp - 1] = (stack[sp - 1] | 0) & b; + break; + } + case OP.OR: + { + const b = stack[--sp] | 0; + stack[sp - 1] = stack[sp - 1] | 0 | b; + break; + } + case OP.XOR: + { + const b = stack[--sp] | 0; + stack[sp - 1] = (stack[sp - 1] | 0) ^ b; + break; + } + case OP.ATAN: + { + const b = stack[--sp]; + const deg = Math.atan2(stack[sp - 1], b) * _RAD_TO_DEG; + stack[sp - 1] = deg < 0 ? deg + 360 : deg; + break; + } + case OP.MIN: + { + const b = stack[--sp]; + stack[sp - 1] = Math.min(stack[sp - 1], b); + break; + } + case OP.MAX: + { + const b = stack[--sp]; + stack[sp - 1] = Math.max(stack[sp - 1], b); + break; + } + case OP.TEE_TMP: + tmp[ir[ip++] | 0] = stack[sp - 1]; + break; + case OP.LOAD_TMP: + stack[sp++] = tmp[ir[ip++] | 0]; + break; + } + } } - static get LBRACE() { - return shadow(this, "LBRACE", new PostScriptToken(PostScriptTokenTypes.LBRACE, "{")); +} +class PSStackBasedInterpreter { + static #stack = new Float64Array(100); + static #sp = 0; + static #push(v) { + if (this.#sp < this.#stack.length) { + this.#stack[this.#sp++] = v; + } } - static get RBRACE() { - return shadow(this, "RBRACE", new PostScriptToken(PostScriptTokenTypes.RBRACE, "}")); + static #execOp(op) { + const stack = this.#stack; + switch (op) { + case TOKEN.true: + this.#push(1); + break; + case TOKEN.false: + this.#push(0); + break; + case TOKEN.abs: + stack[this.#sp - 1] = Math.abs(stack[this.#sp - 1]); + break; + case TOKEN.neg: + stack[this.#sp - 1] = -stack[this.#sp - 1]; + break; + case TOKEN.ceiling: + stack[this.#sp - 1] = Math.ceil(stack[this.#sp - 1]); + break; + case TOKEN.floor: + stack[this.#sp - 1] = Math.floor(stack[this.#sp - 1]); + break; + case TOKEN.round: + stack[this.#sp - 1] = Math.floor(stack[this.#sp - 1] + 0.5); + break; + case TOKEN.truncate: + stack[this.#sp - 1] = Math.trunc(stack[this.#sp - 1]); + break; + case TOKEN.sqrt: + stack[this.#sp - 1] = Math.sqrt(stack[this.#sp - 1]); + break; + case TOKEN.sin: + stack[this.#sp - 1] = Math.sin(stack[this.#sp - 1] % 360 * _DEG_TO_RAD); + break; + case TOKEN.cos: + stack[this.#sp - 1] = Math.cos(stack[this.#sp - 1] % 360 * _DEG_TO_RAD); + break; + case TOKEN.ln: + stack[this.#sp - 1] = Math.log(stack[this.#sp - 1]); + break; + case TOKEN.log: + stack[this.#sp - 1] = Math.log10(stack[this.#sp - 1]); + break; + case TOKEN.cvi: + stack[this.#sp - 1] = Math.trunc(stack[this.#sp - 1]) | 0; + break; + case TOKEN.cvr: + break; + case TOKEN.not: + { + const v = stack[this.#sp - 1]; + stack[this.#sp - 1] = v === 0 || v === 1 ? 1 - v : ~(v | 0); + break; + } + case TOKEN.add: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] += b; + break; + } + case TOKEN.sub: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] -= b; + break; + } + case TOKEN.mul: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] *= b; + break; + } + case TOKEN.div: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = b !== 0 ? stack[this.#sp - 1] / b : 0; + break; + } + case TOKEN.idiv: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = b !== 0 ? Math.trunc(stack[this.#sp - 1] / b) : 0; + break; + } + case TOKEN.mod: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = b !== 0 ? stack[this.#sp - 1] % b : 0; + break; + } + case TOKEN.exp: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] **= b; + break; + } + case TOKEN.atan: + { + const dx = stack[--this.#sp]; + const deg = Math.atan2(stack[this.#sp - 1], dx) * _RAD_TO_DEG; + stack[this.#sp - 1] = deg < 0 ? deg + 360 : deg; + break; + } + case TOKEN.eq: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = stack[this.#sp - 1] === b ? 1 : 0; + break; + } + case TOKEN.ne: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = stack[this.#sp - 1] !== b ? 1 : 0; + break; + } + case TOKEN.gt: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = stack[this.#sp - 1] > b ? 1 : 0; + break; + } + case TOKEN.ge: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = stack[this.#sp - 1] >= b ? 1 : 0; + break; + } + case TOKEN.lt: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = stack[this.#sp - 1] < b ? 1 : 0; + break; + } + case TOKEN.le: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = stack[this.#sp - 1] <= b ? 1 : 0; + break; + } + case TOKEN.and: + { + const b = stack[--this.#sp] | 0; + stack[this.#sp - 1] = (stack[this.#sp - 1] | 0) & b; + break; + } + case TOKEN.or: + { + const b = stack[--this.#sp] | 0; + stack[this.#sp - 1] = stack[this.#sp - 1] | 0 | b; + break; + } + case TOKEN.xor: + { + const b = stack[--this.#sp] | 0; + stack[this.#sp - 1] = (stack[this.#sp - 1] | 0) ^ b; + break; + } + case TOKEN.bitshift: + { + const amt = stack[--this.#sp] | 0; + const v = stack[this.#sp - 1] | 0; + stack[this.#sp - 1] = amt > 0 ? v << amt : v >> -amt; + break; + } + case TOKEN.min: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = Math.min(stack[this.#sp - 1], b); + break; + } + case TOKEN.max: + { + const b = stack[--this.#sp]; + stack[this.#sp - 1] = Math.max(stack[this.#sp - 1], b); + break; + } + case TOKEN.dup: + this.#push(stack[this.#sp - 1]); + break; + case TOKEN.exch: + { + const a = stack[--this.#sp]; + const b = stack[--this.#sp]; + this.#push(a); + this.#push(b); + break; + } + case TOKEN.pop: + this.#sp--; + break; + case TOKEN.copy: + { + const n = Math.trunc(stack[--this.#sp]); + const base = this.#sp - n; + for (let k = 0; k < n; k++) { + this.#push(stack[base + k]); + } + break; + } + case TOKEN.index: + { + const i = Math.trunc(stack[--this.#sp]); + this.#push(stack[this.#sp - 1 - i]); + break; + } + case TOKEN.roll: + { + const j = Math.trunc(stack[--this.#sp]); + const n = Math.trunc(stack[--this.#sp]); + if (n > 1 && j !== 0) { + const mod = (j % n + n) % n; + if (mod !== 0) { + const base = this.#sp - n; + const sub = stack.slice(base, this.#sp); + for (let k = 0; k < n; k++) { + stack[base + k] = sub[(k - mod + n) % n]; + } + } + } + break; + } + } } - static get IF() { - return shadow(this, "IF", new PostScriptToken(PostScriptTokenTypes.IF, "IF")); + static #execBlock(instructions) { + for (const instr of instructions) { + switch (instr.type) { + case PS_NODE.number: + this.#push(instr.value); + break; + case PS_NODE.operator: + this.#execOp(instr.op); + break; + case PS_NODE.if: + if (this.#stack[--this.#sp] !== 0) { + this.#execBlock(instr.then.instructions); + } + break; + case PS_NODE.ifelse: + if (this.#stack[--this.#sp] !== 0) { + this.#execBlock(instr.then.instructions); + } else { + this.#execBlock(instr.otherwise.instructions); + } + break; + } + } } - static get IFELSE() { - return shadow(this, "IFELSE", new PostScriptToken(PostScriptTokenTypes.IFELSE, "IFELSE")); + static build(program, domain, range) { + const nIn = domain.length >> 1; + const nOut = range.length >> 1; + const { + instructions + } = program.body; + return (src, srcOffset, dest, destOffset) => { + this.#sp = 0; + for (let i = 0; i < nIn; i++) { + this.#push(src[srcOffset + i]); + } + this.#execBlock(instructions); + const base = this.#sp - nOut; + for (let i = 0; i < nOut; i++) { + const v = base + i >= 0 ? this.#stack[base + i] : 0; + dest[destOffset + i] = MathClamp(range[i * 2 + 1], range[i * 2], v); + } + }; + } +} +function buildPostScriptJsFunction(source, domain, range, forceInterpreter = false) { + const program = parsePostScriptFunction(source); + const ir = !forceInterpreter && new PsJsCompiler(domain, range).compile(program); + if (ir) { + return (src, srcOffset, dest, destOffset) => { + PsJsCompiler.execute(ir, src, srcOffset, dest, destOffset); + }; + } + return PSStackBasedInterpreter.build(program, domain, range); +} + +;// ./src/core/postscript/wasm_compiler.js + + +const wasm_compiler_OP = { + if: 0x04, + else: 0x05, + end: 0x0b, + select: 0x1b, + call: 0x10, + local_get: 0x20, + local_set: 0x21, + local_tee: 0x22, + i32_const: 0x41, + i32_eqz: 0x45, + i32_and: 0x71, + i32_or: 0x72, + i32_xor: 0x73, + i32_shl: 0x74, + i32_shr_s: 0x75, + i32_trunc_f64_s: 0xaa, + f64_const: 0x44, + f64_eq: 0x61, + f64_ne: 0x62, + f64_lt: 0x63, + f64_gt: 0x64, + f64_le: 0x65, + f64_ge: 0x66, + f64_abs: 0x99, + f64_neg: 0x9a, + f64_ceil: 0x9b, + f64_floor: 0x9c, + f64_trunc: 0x9d, + f64_nearest: 0x9e, + f64_sqrt: 0x9f, + f64_add: 0xa0, + f64_sub: 0xa1, + f64_mul: 0xa2, + f64_div: 0xa3, + f64_min: 0xa4, + f64_max: 0xa5, + f64_convert_i32_s: 0xb7, + f64_store: 0x39 +}; +const FUNC_TYPE = 0x60; +const F64 = 0x7c; +const SECTION = { + type: 0x01, + import: 0x02, + function: 0x03, + memory: 0x05, + export: 0x07, + code: 0x0a +}; +const EXTERN_FUNC = 0x00; +const EXTERN_MEM = 0x02; +function unsignedLEB128(n) { + const out = []; + do { + let byte = n & 0x7f; + n >>>= 7; + if (n !== 0) { + byte |= 0x80; + } + out.push(byte); + } while (n !== 0); + return out; +} +function encodeASCIIString(s) { + return [...unsignedLEB128(s.length), ...Array.from(s, c => c.charCodeAt(0))]; +} +function section(id, data) { + return [id, ...unsignedLEB128(data.length), ...data]; +} +function vec(items) { + const out = unsignedLEB128(items.length); + for (const item of items) { + if (typeof item === "number") { + out.push(item); + continue; + } + for (const byte of item) { + out.push(byte); + } } + return out; } -class PostScriptLexer { - constructor(stream) { - this.stream = stream; - this.nextChar(); - this.strBuf = []; +const MATH_IMPORTS = [["sin", "Math", "sin", [F64], [F64]], ["cos", "Math", "cos", [F64], [F64]], ["atan2", "Math", "atan2", [F64, F64], [F64]], ["log", "Math", "log", [F64], [F64]], ["log10", "Math", "log10", [F64], [F64]], ["pow", "Math", "pow", [F64, F64], [F64]]]; +const _mathImportObject = { + Math: Object.fromEntries(MATH_IMPORTS.map(([name]) => [name, Math[name]])) +}; +class PsWasmCompiler { + static #initialized = false; + static #comparisonToOp = null; + static #importIdx = null; + static #degToRad = 0; + static #radToDeg = 0; + static #importTypeEntries = null; + static #importSection = null; + static #functionSection = null; + static #memorySection = null; + static #exportSection = null; + static #wasmMagicVersion = null; + static #f64View = null; + static #f64Arr = null; + static #init() { + this.#comparisonToOp = new Map([[TOKEN.eq, wasm_compiler_OP.f64_eq], [TOKEN.ne, wasm_compiler_OP.f64_ne], [TOKEN.lt, wasm_compiler_OP.f64_lt], [TOKEN.le, wasm_compiler_OP.f64_le], [TOKEN.gt, wasm_compiler_OP.f64_gt], [TOKEN.ge, wasm_compiler_OP.f64_ge]]); + this.#importIdx = Object.create(null); + for (let i = 0; i < MATH_IMPORTS.length; i++) { + this.#importIdx[MATH_IMPORTS[i][0]] = i; + } + this.#degToRad = Math.PI / 180; + this.#radToDeg = 180 / Math.PI; + this.#importTypeEntries = MATH_IMPORTS.map(([,,, params, results]) => [FUNC_TYPE, ...vec(params), ...vec(results)]); + this.#importSection = new Uint8Array(section(SECTION.import, vec(MATH_IMPORTS.map(([, mod, field], i) => [...encodeASCIIString(mod), ...encodeASCIIString(field), EXTERN_FUNC, ...unsignedLEB128(i + 1)])))); + this.#functionSection = new Uint8Array(section(SECTION.function, vec([[0]]))); + this.#memorySection = new Uint8Array(section(SECTION.memory, vec([[0x00, 0x01]]))); + this.#exportSection = new Uint8Array(section(SECTION.export, vec([[...encodeASCIIString("fn"), EXTERN_FUNC, ...unsignedLEB128(MATH_IMPORTS.length)], [...encodeASCIIString("mem"), EXTERN_MEM, 0x00]]))); + this.#wasmMagicVersion = new Uint8Array([0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00]); + const f64Buf = new ArrayBuffer(8); + this.#f64View = new DataView(f64Buf); + this.#f64Arr = new Uint8Array(f64Buf); + this.#initialized = true; + } + constructor(domain, range) { + if (!PsWasmCompiler.#initialized) { + PsWasmCompiler.#init(); + } + this._nIn = domain.length >> 1; + this._nOut = range.length >> 1; + this._range = range; + this._code = []; + this._nextLocal = this._nIn; + this._freeLocals = []; + this._sharedLocals = new Map(); } - nextChar() { - return this.currentChar = this.stream.getByte(); + _allocLocal() { + return this._freeLocals.pop() ?? this._nextLocal++; } - getToken() { - let comment = false; - let ch = this.currentChar; - while (true) { - if (ch < 0) { - return EOF; + _releaseLocal(idx) { + this._freeLocals.push(idx); + } + _emitULEB128(n) { + do { + let b = n & 0x7f; + n >>>= 7; + if (n !== 0) { + b |= 0x80; + } + this._code.push(b); + } while (n !== 0); + } + _emitF64Const(value) { + this._code.push(wasm_compiler_OP.f64_const); + PsWasmCompiler.#f64View.setFloat64(0, value, true); + for (let i = 0; i < 8; i++) { + this._code.push(PsWasmCompiler.#f64Arr[i]); + } + } + _emitLocalGet(idx) { + this._code.push(wasm_compiler_OP.local_get); + this._emitULEB128(idx); + } + _emitLocalSet(idx) { + this._code.push(wasm_compiler_OP.local_set); + this._emitULEB128(idx); + } + _emitLocalTee(idx) { + this._code.push(wasm_compiler_OP.local_tee); + this._emitULEB128(idx); + } + _compileNode(node) { + if (node.shared) { + const entry = this._sharedLocals.get(node); + if (entry !== undefined) { + this._emitLocalGet(entry.local); + if (--entry.remaining === 0) { + this._releaseLocal(entry.local); + } + return true; } - if (comment) { - if (ch === 0x0a || ch === 0x0d) { - comment = false; + if (!this._compileNodeImpl(node)) { + return false; + } + const local = this._allocLocal(); + this._sharedLocals.set(node, { + local, + remaining: node.sharedCount - 1 + }); + this._emitLocalTee(local); + return true; + } + return this._compileNodeImpl(node); + } + _compileNodeImpl(node) { + switch (node.type) { + case PS_NODE.arg: + this._emitLocalGet(node.index); + return true; + case PS_NODE.const: + { + let v = node.value; + if (typeof v === "boolean") { + v = v ? 1 : 0; + } + this._emitF64Const(v); + return true; } - } else if (ch === 0x25) { - comment = true; - } else if (!isWhiteSpace(ch)) { - break; + case PS_NODE.unary: + return this._compileUnaryNode(node); + case PS_NODE.binary: + return this._compileBinaryNode(node); + case PS_NODE.ternary: + return this._compileTernaryNode(node); + default: + return false; + } + } + _compileSinCosNode(node) { + const local = this._allocLocal(); + try { + if (!this._compileNode(node.operand)) { + return false; } - ch = this.nextChar(); + const code = this._code; + this._emitLocalSet(local); + this._emitLocalGet(local); + this._emitLocalGet(local); + this._emitF64Const(360); + code.push(wasm_compiler_OP.f64_div, wasm_compiler_OP.f64_trunc); + this._emitF64Const(360); + code.push(wasm_compiler_OP.f64_mul, wasm_compiler_OP.f64_sub); + this._emitF64Const(PsWasmCompiler.#degToRad); + code.push(wasm_compiler_OP.f64_mul, wasm_compiler_OP.call); + this._emitULEB128(PsWasmCompiler.#importIdx[node.op === TOKEN.sin ? "sin" : "cos"]); + return true; + } finally { + this._releaseLocal(local); } - switch (ch | 0) { - case 0x30: - case 0x31: - case 0x32: - case 0x33: - case 0x34: - case 0x35: - case 0x36: - case 0x37: - case 0x38: - case 0x39: - case 0x2b: - case 0x2d: - case 0x2e: - return new PostScriptToken(PostScriptTokenTypes.NUMBER, this.getNumber()); - case 0x7b: - this.nextChar(); - return PostScriptToken.LBRACE; - case 0x7d: - this.nextChar(); - return PostScriptToken.RBRACE; + } + _compileUnaryNode(node) { + const code = this._code; + if (node.op === TOKEN.sin || node.op === TOKEN.cos) { + return this._compileSinCosNode(node); + } + if (node.op === TOKEN.not) { + if (node.valueType === PS_VALUE_TYPE.boolean) { + if (!this._compileNodeAsBoolI32(node.operand)) { + return false; + } + code.push(wasm_compiler_OP.i32_eqz, wasm_compiler_OP.f64_convert_i32_s); + return true; + } + if (node.valueType === PS_VALUE_TYPE.numeric) { + if (!this._compileNode(node.operand)) { + return false; + } + code.push(wasm_compiler_OP.i32_trunc_f64_s, wasm_compiler_OP.i32_const, 0x7f, wasm_compiler_OP.i32_xor, wasm_compiler_OP.f64_convert_i32_s); + return true; + } + return false; } - const strBuf = this.strBuf; - strBuf.length = 0; - strBuf[0] = String.fromCharCode(ch); - while ((ch = this.nextChar()) >= 0 && (ch >= 0x41 && ch <= 0x5a || ch >= 0x61 && ch <= 0x7a)) { - strBuf.push(String.fromCharCode(ch)); - } - const str = strBuf.join(""); - switch (str.toLowerCase()) { - case "if": - return PostScriptToken.IF; - case "ifelse": - return PostScriptToken.IFELSE; + if (!this._compileNode(node.operand)) { + return false; + } + switch (node.op) { + case TOKEN.abs: + code.push(wasm_compiler_OP.f64_abs); + break; + case TOKEN.neg: + code.push(wasm_compiler_OP.f64_neg); + break; + case TOKEN.sqrt: + code.push(wasm_compiler_OP.f64_sqrt); + break; + case TOKEN.floor: + code.push(wasm_compiler_OP.f64_floor); + break; + case TOKEN.ceiling: + code.push(wasm_compiler_OP.f64_ceil); + break; + case TOKEN.round: + this._emitF64Const(0.5); + code.push(wasm_compiler_OP.f64_add, wasm_compiler_OP.f64_floor); + break; + case TOKEN.truncate: + code.push(wasm_compiler_OP.f64_trunc); + break; + case TOKEN.cvi: + code.push(wasm_compiler_OP.i32_trunc_f64_s, wasm_compiler_OP.f64_convert_i32_s); + break; + case TOKEN.cvr: + break; + case TOKEN.ln: + code.push(wasm_compiler_OP.call); + this._emitULEB128(PsWasmCompiler.#importIdx.log); + break; + case TOKEN.log: + code.push(wasm_compiler_OP.call); + this._emitULEB128(PsWasmCompiler.#importIdx.log10); + break; default: - return PostScriptToken.getOperator(str); + return false; } + return true; } - getNumber() { - let ch = this.currentChar; - const strBuf = this.strBuf; - strBuf.length = 0; - strBuf[0] = String.fromCharCode(ch); - while ((ch = this.nextChar()) >= 0) { - if (ch >= 0x30 && ch <= 0x39 || ch === 0x2d || ch === 0x2e) { - strBuf.push(String.fromCharCode(ch)); + _compileSafeDivNode(first, second) { + const tmp = this._allocLocal(); + try { + if (!this._compileNode(second)) { + return false; + } + if (!this._compileNode(first)) { + return false; + } + const code = this._code; + this._emitLocalTee(tmp); + code.push(wasm_compiler_OP.f64_div); + this._emitF64Const(0); + this._emitLocalGet(tmp); + this._emitF64Const(0); + code.push(wasm_compiler_OP.f64_ne, wasm_compiler_OP.select); + return true; + } finally { + this._releaseLocal(tmp); + } + } + _compileSafeIdivNode(first, second) { + const tmp = this._allocLocal(); + try { + if (!this._compileNode(second)) { + return false; + } + if (!this._compileNode(first)) { + return false; + } + const code = this._code; + this._emitLocalTee(tmp); + code.push(wasm_compiler_OP.f64_div, wasm_compiler_OP.f64_trunc); + this._emitF64Const(0); + this._emitLocalGet(tmp); + this._emitF64Const(0); + code.push(wasm_compiler_OP.f64_ne, wasm_compiler_OP.select); + return true; + } finally { + this._releaseLocal(tmp); + } + } + _compileBitshiftNode(first, second) { + if (first.type !== PS_NODE.const || !Number.isInteger(first.value)) { + return false; + } + if (!this._compileNode(second)) { + return false; + } + const code = this._code; + code.push(wasm_compiler_OP.i32_trunc_f64_s); + const shift = first.value; + if (shift > 0) { + code.push(wasm_compiler_OP.i32_const); + this._emitULEB128(shift); + code.push(wasm_compiler_OP.i32_shl); + } else if (shift < 0) { + code.push(wasm_compiler_OP.i32_const); + this._emitULEB128(-shift); + code.push(wasm_compiler_OP.i32_shr_s); + } + code.push(wasm_compiler_OP.f64_convert_i32_s); + return true; + } + _compileModNode(first, second) { + if (first.type === PS_NODE.const && first.value === 0) { + if (!this._compileNode(second)) { + return false; + } + this._code.push(wasm_compiler_OP.drop); + this._emitF64Const(0); + return true; + } + const localA = this._allocLocal(); + try { + if (!this._compileNode(second)) { + return false; + } + this._emitLocalTee(localA); + const code = this._code; + if (first.type === PS_NODE.const) { + this._emitLocalGet(localA); + this._emitF64Const(first.value); + code.push(wasm_compiler_OP.f64_div, wasm_compiler_OP.f64_trunc); + this._emitF64Const(first.value); + code.push(wasm_compiler_OP.f64_mul, wasm_compiler_OP.f64_sub); } else { + const localB = this._allocLocal(); + try { + if (!this._compileNode(first)) { + return false; + } + this._emitLocalSet(localB); + this._emitLocalGet(localA); + this._emitLocalGet(localB); + code.push(wasm_compiler_OP.f64_div, wasm_compiler_OP.f64_trunc); + this._emitLocalGet(localB); + code.push(wasm_compiler_OP.f64_mul, wasm_compiler_OP.f64_sub); + this._emitF64Const(0); + this._emitLocalGet(localB); + this._emitF64Const(0); + code.push(wasm_compiler_OP.f64_ne, wasm_compiler_OP.select); + } finally { + this._releaseLocal(localB); + } + } + return true; + } finally { + this._releaseLocal(localA); + } + } + _compileAtanNode(first, second) { + const localR = this._allocLocal(); + try { + if (!this._compileNode(second)) { + return false; + } + if (!this._compileNode(first)) { + return false; + } + const code = this._code; + code.push(wasm_compiler_OP.call); + this._emitULEB128(PsWasmCompiler.#importIdx.atan2); + this._emitF64Const(PsWasmCompiler.#radToDeg); + code.push(wasm_compiler_OP.f64_mul); + this._emitLocalTee(localR); + this._emitF64Const(0); + code.push(wasm_compiler_OP.f64_lt, wasm_compiler_OP.if, F64); + this._emitLocalGet(localR); + this._emitF64Const(360); + code.push(wasm_compiler_OP.f64_add, wasm_compiler_OP.else); + this._emitLocalGet(localR); + code.push(wasm_compiler_OP.end); + return true; + } finally { + this._releaseLocal(localR); + } + } + _compileBitwiseNode(op, first, second) { + if (!this._compileBitwiseOperandI32(second)) { + return false; + } + if (!this._compileBitwiseOperandI32(first)) { + return false; + } + const code = this._code; + switch (op) { + case TOKEN.and: + code.push(wasm_compiler_OP.i32_and); + break; + case TOKEN.or: + code.push(wasm_compiler_OP.i32_or); break; + case TOKEN.xor: + code.push(wasm_compiler_OP.i32_xor); + break; + default: + return false; + } + code.push(wasm_compiler_OP.f64_convert_i32_s); + return true; + } + _compileBitwiseOperandI32(node) { + if (node.valueType === PS_VALUE_TYPE.boolean) { + return this._compileNodeAsBoolI32(node); + } + if (!this._compileNode(node)) { + return false; + } + this._code.push(wasm_compiler_OP.i32_trunc_f64_s); + return true; + } + _compileStandardBinaryNode(op, first, second) { + if (first === second && first.type !== PS_NODE.arg && first.type !== PS_NODE.const && !first.shared) { + const tmp = this._allocLocal(); + try { + if (!this._compileNode(first)) { + return false; + } + this._emitLocalTee(tmp); + this._emitLocalGet(tmp); + } finally { + this._releaseLocal(tmp); } + } else { + if (!this._compileNode(second)) { + return false; + } + if (!this._compileNode(first)) { + return false; + } + } + const code = this._code; + switch (op) { + case TOKEN.add: + code.push(wasm_compiler_OP.f64_add); + break; + case TOKEN.sub: + code.push(wasm_compiler_OP.f64_sub); + break; + case TOKEN.mul: + code.push(wasm_compiler_OP.f64_mul); + break; + case TOKEN.exp: + code.push(wasm_compiler_OP.call); + this._emitULEB128(PsWasmCompiler.#importIdx.pow); + break; + case TOKEN.eq: + code.push(wasm_compiler_OP.f64_eq, wasm_compiler_OP.f64_convert_i32_s); + break; + case TOKEN.ne: + code.push(wasm_compiler_OP.f64_ne, wasm_compiler_OP.f64_convert_i32_s); + break; + case TOKEN.lt: + code.push(wasm_compiler_OP.f64_lt, wasm_compiler_OP.f64_convert_i32_s); + break; + case TOKEN.le: + code.push(wasm_compiler_OP.f64_le, wasm_compiler_OP.f64_convert_i32_s); + break; + case TOKEN.gt: + code.push(wasm_compiler_OP.f64_gt, wasm_compiler_OP.f64_convert_i32_s); + break; + case TOKEN.ge: + code.push(wasm_compiler_OP.f64_ge, wasm_compiler_OP.f64_convert_i32_s); + break; + case TOKEN.min: + code.push(wasm_compiler_OP.f64_min); + break; + case TOKEN.max: + code.push(wasm_compiler_OP.f64_max); + break; + default: + return false; } - const value = parseFloat(strBuf.join("")); - if (isNaN(value)) { - throw new FormatError(`Invalid floating point number: ${value}`); + return true; + } + _compileBinaryNode(node) { + const { + op, + first, + second + } = node; + if (op === TOKEN.bitshift) { + return this._compileBitshiftNode(first, second); } - return value; + if (op === TOKEN.div) { + return this._compileSafeDivNode(first, second); + } + if (op === TOKEN.idiv) { + return this._compileSafeIdivNode(first, second); + } + if (op === TOKEN.mod) { + return this._compileModNode(first, second); + } + if (op === TOKEN.atan) { + return this._compileAtanNode(first, second); + } + if (op === TOKEN.and || op === TOKEN.or || op === TOKEN.xor) { + return this._compileBitwiseNode(op, first, second); + } + return this._compileStandardBinaryNode(op, first, second); + } + _compileNodeAsBoolI32(node) { + if (node.type === PS_NODE.binary) { + const wasmOp = PsWasmCompiler.#comparisonToOp.get(node.op); + if (wasmOp !== undefined) { + if (!this._compileNode(node.second)) { + return false; + } + if (!this._compileNode(node.first)) { + return false; + } + this._code.push(wasmOp); + return true; + } + if (node.valueType === PS_VALUE_TYPE.boolean && (node.op === TOKEN.and || node.op === TOKEN.or || node.op === TOKEN.xor)) { + if (!this._compileNodeAsBoolI32(node.second)) { + return false; + } + if (!this._compileNodeAsBoolI32(node.first)) { + return false; + } + switch (node.op) { + case TOKEN.and: + this._code.push(wasm_compiler_OP.i32_and); + break; + case TOKEN.or: + this._code.push(wasm_compiler_OP.i32_or); + break; + case TOKEN.xor: + this._code.push(wasm_compiler_OP.i32_xor); + break; + } + return true; + } + } + if (node.type === PS_NODE.unary && node.op === TOKEN.not && node.valueType === PS_VALUE_TYPE.boolean) { + if (!this._compileNodeAsBoolI32(node.operand)) { + return false; + } + this._code.push(wasm_compiler_OP.i32_eqz); + return true; + } + if (!this._compileNode(node)) { + return false; + } + if (node.valueType === PS_VALUE_TYPE.boolean) { + this._code.push(wasm_compiler_OP.i32_trunc_f64_s); + } else { + this._emitF64Const(0); + this._code.push(wasm_compiler_OP.f64_ne); + } + return true; + } + _compileTernaryNode(node) { + if (!this._compileNodeAsBoolI32(node.cond)) { + return false; + } + this._code.push(wasm_compiler_OP.if, F64); + if (!this._compileNode(node.then)) { + return false; + } + this._code.push(wasm_compiler_OP.else); + if (!this._compileNode(node.otherwise)) { + return false; + } + this._code.push(wasm_compiler_OP.end); + return true; + } + compile(program) { + const outputs = new PSStackToTree().evaluate(program, this._nIn); + if (!outputs || outputs.length < this._nOut) { + return null; + } + const code = this._code; + for (let i = 0; i < this._nOut; i++) { + const min = this._range[i * 2]; + const max = this._range[i * 2 + 1]; + code.push(wasm_compiler_OP.i32_const); + this._emitULEB128(i * 8); + if (!this._compileNode(outputs[i])) { + return null; + } + this._emitF64Const(max); + code.push(wasm_compiler_OP.f64_min); + this._emitF64Const(min); + code.push(wasm_compiler_OP.f64_max, wasm_compiler_OP.f64_store, 0x03, 0x00); + } + code.push(wasm_compiler_OP.end); + const nIn = this._nIn; + const nLocals = this._nextLocal - nIn; + const paramTypes = Array(nIn).fill(F64); + const resultTypes = []; + const funcType = [FUNC_TYPE, ...vec(paramTypes), ...vec(resultTypes)]; + const typeSectionBytes = new Uint8Array(section(SECTION.type, vec([funcType, ...PsWasmCompiler.#importTypeEntries]))); + const localDecls = nLocals > 0 ? vec([[...unsignedLEB128(nLocals), F64]]) : vec([]); + const funcBodyLen = localDecls.length + code.length; + const codeSectionBytes = new Uint8Array(section(SECTION.code, vec([[...unsignedLEB128(funcBodyLen), ...localDecls, ...code]]))); + const magicVersion = PsWasmCompiler.#wasmMagicVersion; + const importSection = PsWasmCompiler.#importSection; + const functionSection = PsWasmCompiler.#functionSection; + const memorySection = PsWasmCompiler.#memorySection; + const exportSection = PsWasmCompiler.#exportSection; + const totalLen = magicVersion.length + typeSectionBytes.length + importSection.length + functionSection.length + memorySection.length + exportSection.length + codeSectionBytes.length; + const result = new Uint8Array(totalLen); + let off = 0; + result.set(magicVersion, off); + off += magicVersion.length; + result.set(typeSectionBytes, off); + off += typeSectionBytes.length; + result.set(importSection, off); + off += importSection.length; + result.set(functionSection, off); + off += functionSection.length; + result.set(memorySection, off); + off += memorySection.length; + result.set(exportSection, off); + off += exportSection.length; + result.set(codeSectionBytes, off); + return result; + } +} +function compilePostScriptToWasm(source, domain, range) { + return new PsWasmCompiler(domain, range).compile(parsePostScriptFunction(source)); +} +function _makeWrapper(exports, nIn, nOut) { + const { + fn, + mem + } = exports; + const outView = new Float64Array(mem.buffer, 0, nOut); + let writeOut; + switch (nOut) { + case 1: + writeOut = (dest, destOffset) => { + dest[destOffset] = outView[0]; + }; + break; + case 2: + writeOut = (dest, destOffset) => { + dest[destOffset] = outView[0]; + dest[destOffset + 1] = outView[1]; + }; + break; + case 3: + writeOut = (dest, destOffset) => { + dest[destOffset] = outView[0]; + dest[destOffset + 1] = outView[1]; + dest[destOffset + 2] = outView[2]; + }; + break; + case 4: + writeOut = (dest, destOffset) => { + dest[destOffset] = outView[0]; + dest[destOffset + 1] = outView[1]; + dest[destOffset + 2] = outView[2]; + dest[destOffset + 3] = outView[3]; + }; + break; + default: + writeOut = (dest, destOffset) => { + for (let i = 0; i < nOut; i++) { + dest[destOffset + i] = outView[i]; + } + }; + } + switch (nIn) { + case 1: + return (src, srcOffset, dest, destOffset) => { + fn(src[srcOffset]); + writeOut(dest, destOffset); + }; + case 2: + return (src, srcOffset, dest, destOffset) => { + fn(src[srcOffset], src[srcOffset + 1]); + writeOut(dest, destOffset); + }; + case 3: + return (src, srcOffset, dest, destOffset) => { + fn(src[srcOffset], src[srcOffset + 1], src[srcOffset + 2]); + writeOut(dest, destOffset); + }; + case 4: + return (src, srcOffset, dest, destOffset) => { + fn(src[srcOffset], src[srcOffset + 1], src[srcOffset + 2], src[srcOffset + 3]); + writeOut(dest, destOffset); + }; + default: + { + const inBuf = new Float64Array(nIn); + return (src, srcOffset, dest, destOffset) => { + for (let i = 0; i < nIn; i++) { + inBuf[i] = src[srcOffset + i]; + } + fn(...inBuf); + writeOut(dest, destOffset); + }; + } + } +} +function buildPostScriptWasmFunction(source, domain, range) { + const bytes = compilePostScriptToWasm(source, domain, range); + if (!bytes) { + return null; + } + try { + const instance = new WebAssembly.Instance(new WebAssembly.Module(bytes), _mathImportObject); + return _makeWrapper(instance.exports, domain.length >> 1, range.length >> 1); + } catch { + return null; } } -;// CONCATENATED MODULE: ./src/core/image_utils.js +;// ./src/core/image_utils.js class BaseLocalCache { constructor(options) { - if (this.constructor === BaseLocalCache) { - unreachable("Cannot initialize BaseLocalCache."); - } this._onlyRefs = options?.onlyRefs === true; if (!this._onlyRefs) { this._nameRefMap = new Map(); @@ -27743,26 +31893,46 @@ this._imageCache.put(ref, data); } } +class GlobalColorSpaceCache extends BaseLocalCache { + constructor(options) { + super({ + onlyRefs: true + }); + } + set(name = null, ref, data) { + if (!ref) { + throw new Error('GlobalColorSpaceCache.set - expected "ref" argument.'); + } + if (this._imageCache.has(ref)) { + return; + } + this._imageCache.put(ref, data); + } + clear() { + this._imageCache.clear(); + } +} class GlobalImageCache { static NUM_PAGES_THRESHOLD = 2; static MIN_IMAGES_TO_CACHE = 10; - static MAX_BYTE_SIZE = 5 * MAX_IMAGE_SIZE_TO_CACHE; + static MAX_BYTE_SIZE = 5e7; + #decodeFailedSet = new RefSet(); constructor() { this._refCache = new RefSetCache(); this._imageCache = new RefSetCache(); } - get _byteSize() { + get #byteSize() { let byteSize = 0; for (const imageData of this._imageCache) { byteSize += imageData.byteSize; } return byteSize; } - get _cacheLimitReached() { + get #cacheLimitReached() { if (this._imageCache.size < GlobalImageCache.MIN_IMAGES_TO_CACHE) { return false; } - if (this._byteSize < GlobalImageCache.MAX_BYTE_SIZE) { + if (this.#byteSize < GlobalImageCache.MAX_BYTE_SIZE) { return false; } return true; @@ -27777,11 +31947,17 @@ if (pageIndexSet.size < GlobalImageCache.NUM_PAGES_THRESHOLD) { return false; } - if (!this._imageCache.has(ref) && this._cacheLimitReached) { + if (!this._imageCache.has(ref) && this.#cacheLimitReached) { return false; } return true; } + addDecodeFailed(ref) { + this.#decodeFailedSet.put(ref); + } + hasDecodeFailed(ref) { + return this.#decodeFailedSet.has(ref); + } addByteSize(ref, byteSize) { const imageData = this._imageCache.get(ref); if (!imageData) { @@ -27814,7 +31990,7 @@ if (this._imageCache.has(ref)) { return; } - if (this._cacheLimitReached) { + if (this.#cacheLimitReached) { warn("GlobalImageCache.setData - cache limit reached."); return; } @@ -27822,84 +31998,71 @@ } clear(onlyData = false) { if (!onlyData) { + this.#decodeFailedSet.clear(); this._refCache.clear(); } this._imageCache.clear(); } } -;// CONCATENATED MODULE: ./src/core/function.js +;// ./src/core/function.js + + + +const FunctionType = { + SAMPLED: 0, + EXPONENTIAL_INTERPOLATION: 2, + STITCHING: 3, + POSTSCRIPT_CALCULATOR: 4 +}; class PDFFunctionFactory { + static #useWasm = true; + static setOptions({ + useWasm + }) { + this.#useWasm = useWasm; + } constructor({ - xref, - isEvalSupported = true + xref }) { this.xref = xref; - this.isEvalSupported = isEvalSupported !== false; - } - create(fn) { - const cachedFunction = this.getCached(fn); - if (cachedFunction) { - return cachedFunction; - } - const parsedFunction = PDFFunction.parse({ - xref: this.xref, - isEvalSupported: this.isEvalSupported, - fn: fn instanceof Ref ? this.xref.fetch(fn) : fn - }); - this._cache(fn, parsedFunction); - return parsedFunction; } - createFromArray(fnObj) { - const cachedFunction = this.getCached(fnObj); - if (cachedFunction) { - return cachedFunction; - } - const parsedFunction = PDFFunction.parseArray({ - xref: this.xref, - isEvalSupported: this.isEvalSupported, - fnObj: fnObj instanceof Ref ? this.xref.fetch(fnObj) : fnObj - }); - this._cache(fnObj, parsedFunction); - return parsedFunction; + get useWasm() { + return PDFFunctionFactory.#useWasm; } - getCached(cacheKey) { - let fnRef; - if (cacheKey instanceof Ref) { - fnRef = cacheKey; - } else if (cacheKey instanceof Dict) { - fnRef = cacheKey.objId; - } else if (cacheKey instanceof BaseStream) { - fnRef = cacheKey.dict?.objId; + create(fn, parseArray = false) { + let fnRef, parsedFn; + if (fn instanceof Ref) { + fnRef = fn; + } else if (fn instanceof Dict) { + fnRef = fn.objId; + } else if (fn instanceof BaseStream) { + fnRef = fn.dict?.objId; } if (fnRef) { - const localFunction = this._localFunctionCache.getByRef(fnRef); - if (localFunction) { - return localFunction; + const cachedFn = this._localFunctionCache.getByRef(fnRef); + if (cachedFn) { + return cachedFn; } } - return null; - } - _cache(cacheKey, parsedFunction) { - if (!parsedFunction) { - throw new Error('PDFFunctionFactory._cache - expected "parsedFunction" argument.'); - } - let fnRef; - if (cacheKey instanceof Ref) { - fnRef = cacheKey; - } else if (cacheKey instanceof Dict) { - fnRef = cacheKey.objId; - } else if (cacheKey instanceof BaseStream) { - fnRef = cacheKey.dict?.objId; + const fnObj = this.xref.fetchIfRef(fn); + if (Array.isArray(fnObj)) { + if (!parseArray) { + throw new Error('PDFFunctionFactory.create - expected "parseArray" argument.'); + } + parsedFn = PDFFunction.parseArray(this, fnObj); + } else { + parsedFn = PDFFunction.parse(this, fnObj); } if (fnRef) { - this._localFunctionCache.set(null, fnRef, parsedFunction); + this._localFunctionCache.set(null, fnRef, parsedFn); } + return parsedFn; } get _localFunctionCache() { return shadow(this, "_localFunctionCache", new LocalFunctionCache()); @@ -27909,33 +32072,24 @@ if (!Array.isArray(arr)) { return null; } - const length = arr.length; - for (let i = 0; i < length; i++) { - if (typeof arr[i] !== "number") { - const result = new Array(length); - for (let j = 0; j < length; j++) { - result[j] = +arr[j]; - } - return result; - } + if (!isNumberArray(arr, null)) { + return arr.map(x => +x); } return arr; } class PDFFunction { static getSampleArray(size, outputSize, bps, stream) { - let i, ii; - let length = 1; - for (i = 0, ii = size.length; i < ii; i++) { - length *= size[i]; + let length = outputSize; + for (const s of size) { + length *= s; } - length *= outputSize; const array = new Array(length); let codeSize = 0; let codeBuf = 0; const sampleMul = 1.0 / (2.0 ** bps - 1); const strBytes = stream.getBytes((length * bps + 7) / 8); let strIdx = 0; - for (i = 0; i < length; i++) { + for (let i = 0; i < length; i++) { while (codeSize < bps) { codeBuf <<= 8; codeBuf |= strBytes[strIdx++]; @@ -27947,64 +32101,28 @@ } return array; } - static parse({ - xref, - isEvalSupported, - fn - }) { + static parse(factory, fn) { const dict = fn.dict || fn; const typeNum = dict.get("FunctionType"); switch (typeNum) { - case 0: - return this.constructSampled({ - xref, - isEvalSupported, - fn, - dict - }); - case 1: - break; - case 2: - return this.constructInterpolated({ - xref, - isEvalSupported, - dict - }); - case 3: - return this.constructStiched({ - xref, - isEvalSupported, - dict - }); - case 4: - return this.constructPostScript({ - xref, - isEvalSupported, - fn, - dict - }); + case FunctionType.SAMPLED: + return this.constructSampled(factory, fn, dict); + case FunctionType.EXPONENTIAL_INTERPOLATION: + return this.constructInterpolated(factory, dict); + case FunctionType.STITCHING: + return this.constructStiched(factory, dict); + case FunctionType.POSTSCRIPT_CALCULATOR: + return this.constructPostScript(factory, fn, dict); } - throw new FormatError("Unknown type of function"); + throw new FormatError(`Unknown function type: ${typeNum}`); } - static parseArray({ - xref, - isEvalSupported, - fnObj - }) { - if (!Array.isArray(fnObj)) { - return this.parse({ - xref, - isEvalSupported, - fn: fnObj - }); - } + static parseArray(factory, fnObj) { + const { + xref + } = factory; const fnArray = []; for (const fn of fnObj) { - fnArray.push(this.parse({ - xref, - isEvalSupported, - fn: xref.fetchIfRef(fn) - })); + fnArray.push(this.parse(factory, xref.fetchIfRef(fn))); } return function (src, srcOffset, dest, destOffset) { for (let i = 0, ii = fnArray.length; i < ii; i++) { @@ -28012,33 +32130,17 @@ } }; } - static constructSampled({ - xref, - isEvalSupported, - fn, - dict - }) { - function toMultiArray(arr) { - const inputLength = arr.length; - const out = []; - let index = 0; - for (let i = 0; i < inputLength; i += 2) { - out[index++] = [arr[i], arr[i + 1]]; - } - return out; - } + static constructSampled(factory, fn, dict) { function interpolate(x, xmin, xmax, ymin, ymax) { return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin)); } - let domain = toNumberArray(dict.getArray("Domain")); - let range = toNumberArray(dict.getArray("Range")); + const domain = toNumberArray(dict.getArray("Domain")); + const range = toNumberArray(dict.getArray("Range")); if (!domain || !range) { throw new FormatError("No domain or range"); } const inputSize = domain.length / 2; const outputSize = range.length / 2; - domain = toMultiArray(domain); - range = toMultiArray(range); const size = toNumberArray(dict.getArray("Size")); const bps = dict.get("BitsPerSample"); const order = dict.get("Order") || 1; @@ -28049,31 +32151,25 @@ if (!encode) { encode = []; for (let i = 0; i < inputSize; ++i) { - encode.push([0, size[i] - 1]); + encode.push(0, size[i] - 1); } - } else { - encode = toMultiArray(encode); } - let decode = toNumberArray(dict.getArray("Decode")); - decode = !decode ? range : toMultiArray(decode); + const decode = toNumberArray(dict.getArray("Decode")) || range; const samples = this.getSampleArray(size, outputSize, bps, fn); return function constructSampledFn(src, srcOffset, dest, destOffset) { const cubeVertices = 1 << inputSize; - const cubeN = new Float64Array(cubeVertices); + const cubeN = new Float64Array(cubeVertices).fill(1); const cubeVertex = new Uint32Array(cubeVertices); let i, j; - for (j = 0; j < cubeVertices; j++) { - cubeN[j] = 1; - } let k = outputSize, pos = 1; for (i = 0; i < inputSize; ++i) { - const domain_2i = domain[i][0]; - const domain_2i_1 = domain[i][1]; - const xi = Math.min(Math.max(src[srcOffset + i], domain_2i), domain_2i_1); - let e = interpolate(xi, domain_2i, domain_2i_1, encode[i][0], encode[i][1]); + const domain_2i = domain[2 * i]; + const domain_2i_1 = domain[2 * i + 1]; + const xi = MathClamp(src[srcOffset + i], domain_2i, domain_2i_1); + let e = interpolate(xi, domain_2i, domain_2i_1, encode[2 * i], encode[2 * i + 1]); const size_i = size[i]; - e = Math.min(Math.max(e, 0), size_i - 1); + e = MathClamp(e, 0, size_i - 1); const e0 = e < size_i - 1 ? Math.floor(e) : e - 1; const n0 = e0 + 1 - e; const n1 = e - e0; @@ -28096,16 +32192,12 @@ for (i = 0; i < cubeVertices; i++) { rj += samples[cubeVertex[i] + j] * cubeN[i]; } - rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]); - dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), range[j][1]); + rj = interpolate(rj, 0, 1, decode[2 * j], decode[2 * j + 1]); + dest[destOffset + j] = MathClamp(rj, range[2 * j], range[2 * j + 1]); } }; } - static constructInterpolated({ - xref, - isEvalSupported, - dict - }) { + static constructInterpolated(factory, dict) { const c0 = toNumberArray(dict.getArray("C0")) || [0]; const c1 = toNumberArray(dict.getArray("C1")) || [1]; const n = dict.get("N"); @@ -28121,11 +32213,7 @@ } }; } - static constructStiched({ - xref, - isEvalSupported, - dict - }) { + static constructStiched(factory, dict) { const domain = toNumberArray(dict.getArray("Domain")); if (!domain) { throw new FormatError("No domain"); @@ -28134,27 +32222,18 @@ if (inputSize !== 1) { throw new FormatError("Bad domain for stiched function"); } + const { + xref + } = factory; const fns = []; for (const fn of dict.get("Functions")) { - fns.push(this.parse({ - xref, - isEvalSupported, - fn: xref.fetchIfRef(fn) - })); + fns.push(this.parse(factory, xref.fetchIfRef(fn))); } const bounds = toNumberArray(dict.getArray("Bounds")); const encode = toNumberArray(dict.getArray("Encode")); const tmpBuf = new Float32Array(1); return function constructStichedFn(src, srcOffset, dest, destOffset) { - const clip = function constructStichedFromIRClip(v, min, max) { - if (v > max) { - v = max; - } else if (v < min) { - v = min; - } - return v; - }; - const v = clip(src[srcOffset], domain[0], domain[1]); + const v = MathClamp(src[srcOffset], domain[0], domain[1]); const length = bounds.length; let i; for (i = 0; i < length; ++i) { @@ -28162,26 +32241,15 @@ break; } } - let dmin = domain[0]; - if (i > 0) { - dmin = bounds[i - 1]; - } - let dmax = domain[1]; - if (i < bounds.length) { - dmax = bounds[i]; - } + const dmin = i > 0 ? bounds[i - 1] : domain[0]; + const dmax = i < length ? bounds[i] : domain[1]; const rmin = encode[2 * i]; const rmax = encode[2 * i + 1]; tmpBuf[0] = dmin === dmax ? rmin : rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin); fns[i](tmpBuf, 0, dest, destOffset); }; } - static constructPostScript({ - xref, - isEvalSupported, - fn, - dict - }) { + static constructPostScript(factory, fn, dict) { const domain = toNumberArray(dict.getArray("Domain")); const range = toNumberArray(dict.getArray("Range")); if (!domain) { @@ -28190,59 +32258,17 @@ if (!range) { throw new FormatError("No range."); } - const lexer = new PostScriptLexer(fn); - const parser = new PostScriptParser(lexer); - const code = parser.parse(); - if (isEvalSupported && FeatureTest.isEvalSupported) { - const compiled = new PostScriptCompiler().compile(code, domain, range); - if (compiled) { - return new Function("src", "srcOffset", "dest", "destOffset", compiled); - } - } - info("Unable to compile PS function"); - const numOutputs = range.length >> 1; - const numInputs = domain.length >> 1; - const evaluator = new PostScriptEvaluator(code); - const cache = Object.create(null); - const MAX_CACHE_SIZE = 2048 * 4; - let cache_available = MAX_CACHE_SIZE; - const tmpBuf = new Float32Array(numInputs); - return function constructPostScriptFn(src, srcOffset, dest, destOffset) { - let i, value; - let key = ""; - const input = tmpBuf; - for (i = 0; i < numInputs; i++) { - value = src[srcOffset + i]; - input[i] = value; - key += value + "_"; - } - const cachedValue = cache[key]; - if (cachedValue !== undefined) { - dest.set(cachedValue, destOffset); - return; - } - const output = new Float32Array(numOutputs); - const stack = evaluator.execute(input); - const stackIndex = stack.length - numOutputs; - for (i = 0; i < numOutputs; i++) { - value = stack[stackIndex + i]; - let bound = range[i * 2]; - if (value < bound) { - value = bound; - } else { - bound = range[i * 2 + 1]; - if (value > bound) { - value = bound; - } + const psCode = fn.getString(); + try { + if (factory.useWasm) { + const wasmFn = buildPostScriptWasmFunction(psCode, domain, range); + if (wasmFn) { + return wasmFn; } - output[i] = value; } - if (cache_available > 0) { - cache_available--; - cache[key] = output; - } - dest.set(output, destOffset); - }; + } catch {} + warn("Failed to compile PostScript function to wasm, falling back to JS"); + return buildPostScriptJsFunction(psCode, domain, range); } } function isPDFFunction(v) { @@ -28256,615 +32282,117 @@ } return fnDict.has("FunctionType"); } -class PostScriptStack { - static MAX_STACK_SIZE = 100; - constructor(initialStack) { - this.stack = initialStack ? Array.from(initialStack) : []; - } - push(value) { - if (this.stack.length >= PostScriptStack.MAX_STACK_SIZE) { - throw new Error("PostScript function stack overflow."); - } - this.stack.push(value); - } - pop() { - if (this.stack.length <= 0) { - throw new Error("PostScript function stack underflow."); - } - return this.stack.pop(); - } - copy(n) { - if (this.stack.length + n >= PostScriptStack.MAX_STACK_SIZE) { - throw new Error("PostScript function stack overflow."); - } - const stack = this.stack; - for (let i = stack.length - n, j = n - 1; j >= 0; j--, i++) { - stack.push(stack[i]); - } - } - index(n) { - this.push(this.stack[this.stack.length - n - 1]); - } - roll(n, p) { - const stack = this.stack; - const l = stack.length - n; - const r = stack.length - 1; - const c = l + (p - Math.floor(p / n) * n); - for (let i = l, j = r; i < j; i++, j--) { - const t = stack[i]; - stack[i] = stack[j]; - stack[j] = t; - } - for (let i = l, j = c - 1; i < j; i++, j--) { - const t = stack[i]; - stack[i] = stack[j]; - stack[j] = t; - } - for (let i = c, j = r; i < j; i++, j--) { - const t = stack[i]; - stack[i] = stack[j]; - stack[j] = t; - } - } -} -class PostScriptEvaluator { - constructor(operators) { - this.operators = operators; - } - execute(initialStack) { - const stack = new PostScriptStack(initialStack); - let counter = 0; - const operators = this.operators; - const length = operators.length; - let operator, a, b; - while (counter < length) { - operator = operators[counter++]; - if (typeof operator === "number") { - stack.push(operator); - continue; - } - switch (operator) { - case "jz": - b = stack.pop(); - a = stack.pop(); - if (!a) { - counter = b; - } - break; - case "j": - a = stack.pop(); - counter = a; - break; - case "abs": - a = stack.pop(); - stack.push(Math.abs(a)); - break; - case "add": - b = stack.pop(); - a = stack.pop(); - stack.push(a + b); - break; - case "and": - b = stack.pop(); - a = stack.pop(); - if (typeof a === "boolean" && typeof b === "boolean") { - stack.push(a && b); - } else { - stack.push(a & b); - } - break; - case "atan": - b = stack.pop(); - a = stack.pop(); - a = Math.atan2(a, b) / Math.PI * 180; - if (a < 0) { - a += 360; - } - stack.push(a); - break; - case "bitshift": - b = stack.pop(); - a = stack.pop(); - if (a > 0) { - stack.push(a << b); - } else { - stack.push(a >> b); - } - break; - case "ceiling": - a = stack.pop(); - stack.push(Math.ceil(a)); - break; - case "copy": - a = stack.pop(); - stack.copy(a); - break; - case "cos": - a = stack.pop(); - stack.push(Math.cos(a % 360 / 180 * Math.PI)); - break; - case "cvi": - a = stack.pop() | 0; - stack.push(a); - break; - case "cvr": - break; - case "div": - b = stack.pop(); - a = stack.pop(); - stack.push(a / b); - break; - case "dup": - stack.copy(1); - break; - case "eq": - b = stack.pop(); - a = stack.pop(); - stack.push(a === b); - break; - case "exch": - stack.roll(2, 1); - break; - case "exp": - b = stack.pop(); - a = stack.pop(); - stack.push(a ** b); - break; - case "false": - stack.push(false); - break; - case "floor": - a = stack.pop(); - stack.push(Math.floor(a)); - break; - case "ge": - b = stack.pop(); - a = stack.pop(); - stack.push(a >= b); - break; - case "gt": - b = stack.pop(); - a = stack.pop(); - stack.push(a > b); - break; - case "idiv": - b = stack.pop(); - a = stack.pop(); - stack.push(a / b | 0); - break; - case "index": - a = stack.pop(); - stack.index(a); - break; - case "le": - b = stack.pop(); - a = stack.pop(); - stack.push(a <= b); - break; - case "ln": - a = stack.pop(); - stack.push(Math.log(a)); - break; - case "log": - a = stack.pop(); - stack.push(Math.log10(a)); - break; - case "lt": - b = stack.pop(); - a = stack.pop(); - stack.push(a < b); - break; - case "mod": - b = stack.pop(); - a = stack.pop(); - stack.push(a % b); - break; - case "mul": - b = stack.pop(); - a = stack.pop(); - stack.push(a * b); - break; - case "ne": - b = stack.pop(); - a = stack.pop(); - stack.push(a !== b); - break; - case "neg": - a = stack.pop(); - stack.push(-a); - break; - case "not": - a = stack.pop(); - if (typeof a === "boolean") { - stack.push(!a); - } else { - stack.push(~a); - } - break; - case "or": - b = stack.pop(); - a = stack.pop(); - if (typeof a === "boolean" && typeof b === "boolean") { - stack.push(a || b); - } else { - stack.push(a | b); - } - break; - case "pop": - stack.pop(); - break; - case "roll": - b = stack.pop(); - a = stack.pop(); - stack.roll(a, b); - break; - case "round": - a = stack.pop(); - stack.push(Math.round(a)); - break; - case "sin": - a = stack.pop(); - stack.push(Math.sin(a % 360 / 180 * Math.PI)); - break; - case "sqrt": - a = stack.pop(); - stack.push(Math.sqrt(a)); - break; - case "sub": - b = stack.pop(); - a = stack.pop(); - stack.push(a - b); - break; - case "true": - stack.push(true); - break; - case "truncate": - a = stack.pop(); - a = a < 0 ? Math.ceil(a) : Math.floor(a); - stack.push(a); - break; - case "xor": - b = stack.pop(); - a = stack.pop(); - if (typeof a === "boolean" && typeof b === "boolean") { - stack.push(a !== b); - } else { - stack.push(a ^ b); - } - break; - default: - throw new FormatError(`Unknown operator ${operator}`); - } + +;// ./src/core/evaluator_utils.js + + +function textSinkWrapper(sink) { + const TEXT_CONTENT_CHUNK_SIZE = 100; + const resolved = sink ? null : Promise.resolve(); + return { + enqueueInvoked: false, + enqueue(chunk, size) { + this.enqueueInvoked = true; + sink?.enqueue(chunk, size); + }, + get desiredSize() { + return sink?.desiredSize ?? TEXT_CONTENT_CHUNK_SIZE; + }, + get ready() { + return sink?.ready ?? resolved; } - return stack.stack; - } -} -class AstNode { - constructor(type) { - this.type = type; - } - visit(visitor) { - unreachable("abstract method"); - } -} -class AstArgument extends AstNode { - constructor(index, min, max) { - super("args"); - this.index = index; - this.min = min; - this.max = max; - } - visit(visitor) { - visitor.visitArgument(this); - } -} -class AstLiteral extends AstNode { - constructor(number) { - super("literal"); - this.number = number; - this.min = number; - this.max = number; - } - visit(visitor) { - visitor.visitLiteral(this); - } -} -class AstBinaryOperation extends AstNode { - constructor(op, arg1, arg2, min, max) { - super("binary"); - this.op = op; - this.arg1 = arg1; - this.arg2 = arg2; - this.min = min; - this.max = max; - } - visit(visitor) { - visitor.visitBinaryOperation(this); - } -} -class AstMin extends AstNode { - constructor(arg, max) { - super("max"); - this.arg = arg; - this.min = arg.min; - this.max = max; - } - visit(visitor) { - visitor.visitMin(this); - } -} -class AstVariable extends AstNode { - constructor(index, min, max) { - super("var"); - this.index = index; - this.min = min; - this.max = max; - } - visit(visitor) { - visitor.visitVariable(this); - } -} -class AstVariableDefinition extends AstNode { - constructor(variable, arg) { - super("definition"); - this.variable = variable; - this.arg = arg; - } - visit(visitor) { - visitor.visitVariableDefinition(this); - } -} -class ExpressionBuilderVisitor { - constructor() { - this.parts = []; - } - visitArgument(arg) { - this.parts.push("Math.max(", arg.min, ", Math.min(", arg.max, ", src[srcOffset + ", arg.index, "]))"); - } - visitVariable(variable) { - this.parts.push("v", variable.index); - } - visitLiteral(literal) { - this.parts.push(literal.number); - } - visitBinaryOperation(operation) { - this.parts.push("("); - operation.arg1.visit(this); - this.parts.push(" ", operation.op, " "); - operation.arg2.visit(this); - this.parts.push(")"); - } - visitVariableDefinition(definition) { - this.parts.push("var "); - definition.variable.visit(this); - this.parts.push(" = "); - definition.arg.visit(this); - this.parts.push(";"); - } - visitMin(max) { - this.parts.push("Math.min("); - max.arg.visit(this); - this.parts.push(", ", max.max, ")"); - } - toString() { - return this.parts.join(""); - } + }; } -function buildAddOperation(num1, num2) { - if (num2.type === "literal" && num2.number === 0) { - return num1; - } - if (num1.type === "literal" && num1.number === 0) { - return num2; - } - if (num2.type === "literal" && num1.type === "literal") { - return new AstLiteral(num1.number + num2.number); +function _parseVisibilityExpression(xref, array, nestingCounter, currentResult) { + const MAX_NESTING = 10; + if (++nestingCounter > MAX_NESTING) { + warn("Visibility expression is too deeply nested"); + return; } - return new AstBinaryOperation("+", num1, num2, num1.min + num2.min, num1.max + num2.max); -} -function buildMulOperation(num1, num2) { - if (num2.type === "literal") { - if (num2.number === 0) { - return new AstLiteral(0); - } else if (num2.number === 1) { - return num1; - } else if (num1.type === "literal") { - return new AstLiteral(num1.number * num2.number); - } + const length = array.length; + const operator = xref.fetchIfRef(array[0]); + if (length < 2 || !(operator instanceof Name)) { + warn("Invalid visibility expression"); + return; } - if (num1.type === "literal") { - if (num1.number === 0) { - return new AstLiteral(0); - } else if (num1.number === 1) { - return num2; - } + switch (operator.name) { + case "And": + case "Or": + case "Not": + currentResult.push(operator.name); + break; + default: + warn(`Invalid operator ${operator.name} in visibility expression`); + return; } - const min = Math.min(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max); - const max = Math.max(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max); - return new AstBinaryOperation("*", num1, num2, min, max); -} -function buildSubOperation(num1, num2) { - if (num2.type === "literal") { - if (num2.number === 0) { - return num1; - } else if (num1.type === "literal") { - return new AstLiteral(num1.number - num2.number); + for (let i = 1; i < length; i++) { + const raw = array[i]; + const object = xref.fetchIfRef(raw); + if (Array.isArray(object)) { + const nestedResult = []; + currentResult.push(nestedResult); + _parseVisibilityExpression(xref, object, nestingCounter, nestedResult); + } else if (raw instanceof Ref) { + currentResult.push(raw.toString()); } } - if (num2.type === "binary" && num2.op === "-" && num1.type === "literal" && num1.number === 1 && num2.arg1.type === "literal" && num2.arg1.number === 1) { - return num2.arg2; - } - return new AstBinaryOperation("-", num1, num2, num1.min - num2.max, num1.max - num2.min); } -function buildMinOperation(num1, max) { - if (num1.min >= max) { - return new AstLiteral(max); - } else if (num1.max <= max) { - return num1; +function parseMarkedContentProps(xref, contentProperties, resources) { + let optionalContent; + if (contentProperties instanceof Name) { + const properties = resources.get("Properties"); + optionalContent = properties.get(contentProperties.name); + } else if (contentProperties instanceof Dict) { + optionalContent = contentProperties; + } else { + throw new FormatError("Optional content properties malformed."); } - return new AstMin(num1, max); -} -class PostScriptCompiler { - compile(code, domain, range) { - const stack = []; - const instructions = []; - const inputSize = domain.length >> 1, - outputSize = range.length >> 1; - let lastRegister = 0; - let n, j; - let num1, num2, ast1, ast2, tmpVar, item; - for (let i = 0; i < inputSize; i++) { - stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1])); - } - for (let i = 0, ii = code.length; i < ii; i++) { - item = code[i]; - if (typeof item === "number") { - stack.push(new AstLiteral(item)); - continue; - } - switch (item) { - case "add": - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - stack.push(buildAddOperation(num1, num2)); - break; - case "cvr": - if (stack.length < 1) { - return null; - } - break; - case "mul": - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - stack.push(buildMulOperation(num1, num2)); - break; - case "sub": - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - stack.push(buildSubOperation(num1, num2)); - break; - case "exch": - if (stack.length < 2) { - return null; - } - ast1 = stack.pop(); - ast2 = stack.pop(); - stack.push(ast1, ast2); - break; - case "pop": - if (stack.length < 1) { - return null; - } - stack.pop(); - break; - case "index": - if (stack.length < 1) { - return null; - } - num1 = stack.pop(); - if (num1.type !== "literal") { - return null; - } - n = num1.number; - if (n < 0 || !Number.isInteger(n) || stack.length < n) { - return null; - } - ast1 = stack[stack.length - n - 1]; - if (ast1.type === "literal" || ast1.type === "var") { - stack.push(ast1); - break; - } - tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); - stack[stack.length - n - 1] = tmpVar; - stack.push(tmpVar); - instructions.push(new AstVariableDefinition(tmpVar, ast1)); - break; - case "dup": - if (stack.length < 1) { - return null; - } - if (typeof code[i + 1] === "number" && code[i + 2] === "gt" && code[i + 3] === i + 7 && code[i + 4] === "jz" && code[i + 5] === "pop" && code[i + 6] === code[i + 1]) { - num1 = stack.pop(); - stack.push(buildMinOperation(num1, code[i + 1])); - i += 6; - break; - } - ast1 = stack.at(-1); - if (ast1.type === "literal" || ast1.type === "var") { - stack.push(ast1); - break; - } - tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); - stack[stack.length - 1] = tmpVar; - stack.push(tmpVar); - instructions.push(new AstVariableDefinition(tmpVar, ast1)); - break; - case "roll": - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - if (num2.type !== "literal" || num1.type !== "literal") { - return null; - } - j = num2.number; - n = num1.number; - if (n <= 0 || !Number.isInteger(n) || !Number.isInteger(j) || stack.length < n) { - return null; - } - j = (j % n + n) % n; - if (j === 0) { - break; - } - stack.push(...stack.splice(stack.length - n, n - j)); - break; - default: - return null; + const optionalContentType = optionalContent.get("Type")?.name; + if (optionalContentType === "OCG") { + return { + type: optionalContentType, + id: optionalContent.objId + }; + } else if (optionalContentType === "OCMD") { + const expression = optionalContent.get("VE"); + if (Array.isArray(expression)) { + const result = []; + _parseVisibilityExpression(xref, expression, 0, result); + if (result.length > 0) { + return { + type: "OCMD", + expression: result + }; } } - if (stack.length !== outputSize) { - return null; - } - const result = []; - for (const instruction of instructions) { - const statementBuilder = new ExpressionBuilderVisitor(); - instruction.visit(statementBuilder); - result.push(statementBuilder.toString()); - } - for (let i = 0, ii = stack.length; i < ii; i++) { - const expr = stack[i], - statementBuilder = new ExpressionBuilderVisitor(); - expr.visit(statementBuilder); - const min = range[i * 2], - max = range[i * 2 + 1]; - const out = [statementBuilder.toString()]; - if (min > expr.min) { - out.unshift("Math.max(", min, ", "); - out.push(")"); - } - if (max < expr.max) { - out.unshift("Math.min(", max, ", "); - out.push(")"); - } - out.unshift("dest[destOffset + ", i, "] = "); - out.push(";"); - result.push(out.join("")); + const optionalContentGroups = optionalContent.get("OCGs"); + if (Array.isArray(optionalContentGroups) || optionalContentGroups instanceof Dict) { + const groupIds = []; + if (Array.isArray(optionalContentGroups)) { + for (const ocg of optionalContentGroups) { + groupIds.push(ocg.toString()); + } + } else { + groupIds.push(optionalContentGroups.objId); + } + const p = optionalContent.get("P"); + return { + type: optionalContentType, + ids: groupIds, + policy: p instanceof Name ? p.name : null, + expression: null + }; + } else if (optionalContentGroups instanceof Ref) { + return { + type: optionalContentType, + id: optionalContentGroups.toString() + }; } - return result.join("\n"); } + return null; } -;// CONCATENATED MODULE: ./src/core/bidi.js +;// ./src/core/bidi.js const baseTypes = ["BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "S", "B", "S", "WS", "B", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "B", "B", "B", "S", "WS", "ON", "ON", "ET", "ET", "ET", "ON", "ON", "ON", "ON", "ON", "ES", "CS", "ES", "CS", "CS", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "CS", "ON", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "ON", "ON", "ON", "BN", "BN", "BN", "BN", "BN", "BN", "B", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "BN", "CS", "ON", "ET", "ET", "ET", "ET", "ON", "ON", "ON", "ON", "L", "ON", "ON", "BN", "ON", "ON", "ET", "ET", "EN", "EN", "ON", "L", "ON", "ON", "ON", "EN", "L", "ON", "ON", "ON", "ON", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "L", "ON", "L", "L", "L", "L", "L", "L", "L", "L"]; const arabicTypes = ["AN", "AN", "AN", "AN", "AN", "AN", "ON", "ON", "AL", "ET", "ET", "AL", "CS", "AL", "ON", "ON", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "AN", "ET", "AN", "AN", "AL", "AL", "AL", "NSM", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "AL", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AN", "ON", "NSM", "NSM", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "NSM", "NSM", "ON", "NSM", "NSM", "NSM", "NSM", "AL", "AL", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "EN", "AL", "AL", "AL", "AL", "AL", "AL"]; @@ -28883,11 +32411,6 @@ } return j; } -function setValues(arr, start, end, value) { - for (let j = start; j < end; ++j) { - arr[j] = value; - } -} function reverseValues(arr, start, end) { for (let i = start, j = end - 1; i < j; ++i, --j) { const temp = arr[i]; @@ -29027,21 +32550,31 @@ if (types[i] === "ON") { const end = findUnequal(types, i + 1, "ON"); let before = sor; - if (i > 0) { - before = types[i - 1]; + for (let j = i - 1; j >= 0; j--) { + const tt = types[j]; + if (tt === "L") { + before = "L"; + break; + } + if (tt === "R" || tt === "EN" || tt === "AN") { + before = "R"; + break; + } } let after = eor; - if (end + 1 < strLength) { - after = types[end + 1]; - } - if (before !== "L") { - before = "R"; - } - if (after !== "L") { - after = "R"; + for (let j = end; j < strLength; j++) { + const tt = types[j]; + if (tt === "L") { + after = "L"; + break; + } + if (tt === "R" || tt === "EN" || tt === "AN") { + after = "R"; + break; + } } if (before === after) { - setValues(types, i, end, before); + types.fill(before, i, end); } i = end - 1; } @@ -29100,13 +32633,18 @@ return createBidiText(chars.join(""), isLTR); } -;// CONCATENATED MODULE: ./src/core/font_substitutions.js +;// ./src/core/font_substitutions.js + const NORMAL = { style: "normal", weight: "normal" }; +const MEDIUM = { + style: "normal", + weight: "500" +}; const BOLD = { style: "normal", weight: "bold" @@ -29120,7 +32658,7 @@ weight: "bold" }; const substitutionMap = new Map([["Times-Roman", { - local: ["Times New Roman", "Times-Roman", "Times", "Liberation Serif", "Nimbus Roman", "Nimbus Roman L", "Tinos", "Thorndale", "TeX Gyre Termes", "FreeSerif", "Linux Libertine O", "Libertinus Serif", "DejaVu Serif", "Bitstream Vera Serif", "Ubuntu"], + local: ["Times New Roman", "Times-Roman", "Times", "Liberation Serif", "Nimbus Roman", "Nimbus Roman L", "Tinos", "Thorndale", "TeX Gyre Termes", "FreeSerif", "Linux Libertine O", "Libertinus Serif", "PT Astra Serif", "DejaVu Serif", "Bitstream Vera Serif", "Ubuntu"], style: NORMAL, ultimate: "serif" }], ["Times-Bold", { @@ -29228,6 +32766,104 @@ alias: "Wingdings" }], ["Wingdings-Bold", { alias: "Wingdings" +}], ["\xCB\xCE\xCC\xE5", { + local: ["SimSun", "SimSun Regular", "NSimSun"], + style: NORMAL, + ultimate: "serif" +}], ["\xBA\xDA\xCC\xE5", { + local: ["SimHei", "SimHei Regular"], + style: NORMAL, + ultimate: "sans-serif" +}], ["\xBF\xAC\xCC\xE5", { + local: ["KaiTi", "SimKai", "SimKai Regular"], + style: NORMAL, + ultimate: "sans-serif" +}], ["\xB7\xC2\xCB\xCE", { + local: ["FangSong", "SimFang", "SimFang Regular"], + style: NORMAL, + ultimate: "serif" +}], ["\xBF\xAC\xCC\xE5_GB2312", { + alias: "\xBF\xAC\xCC\xE5" +}], ["\xB7\xC2\xCB\xCE_GB2312", { + alias: "\xB7\xC2\xCB\xCE" +}], ["\xC1\xA5\xCA\xE9", { + local: ["SimLi", "SimLi Regular"], + style: NORMAL, + ultimate: "serif" +}], ["\xD0\xC2\xCB\xCE", { + alias: "\xCB\xCE\xCC\xE5" +}], ["HeiseiMin-W3", { + local: ["Hiragino Mincho ProN", "Hiragino Mincho Pro", "Yu Mincho", "YuMincho", "Source Han Serif JP", "Noto Serif JP", "Noto Serif CJK JP", "IPAexMincho", "IPAMincho", "Takao Mincho", "MS Mincho", "MS PMincho"], + style: NORMAL, + ultimate: "serif" +}], ["HeiseiKakuGo-W5", { + local: ["Hiragino Kaku Gothic ProN", "Hiragino Kaku Gothic Pro", "Hiragino Sans", "Yu Gothic", "YuGothic", "Source Han Sans JP", "Noto Sans JP", "Noto Sans CJK JP", "IPAexGothic", "IPAGothic", "Takao Gothic", "Meiryo", "MS Gothic", "MS PGothic"], + style: MEDIUM, + ultimate: "sans-serif" +}], ["HeiseiMin-W3-Acro", { + alias: "HeiseiMin-W3" +}], ["HeiseiKakuGo-W5-Acro", { + alias: "HeiseiKakuGo-W5" +}], ["KozMinPro-Regular", { + alias: "HeiseiMin-W3" +}], ["KozMinProVI-Regular", { + alias: "HeiseiMin-W3" +}], ["KozMinPr6N-Regular", { + alias: "HeiseiMin-W3" +}], ["KozGoPro-Regular", { + alias: "HeiseiKakuGo-W5" +}], ["KozGoProVI-Regular", { + alias: "HeiseiKakuGo-W5" +}], ["KozGoPr6N-Regular", { + alias: "HeiseiKakuGo-W5" +}], ["STSong-Light", { + local: ["STSong", "Songti SC", "Source Han Serif SC", "Source Han Serif CN", "Noto Serif SC", "Noto Serif CJK SC", "AR PL UMing CN", "SimSun", "NSimSun"], + style: NORMAL, + ultimate: "serif" +}], ["STHeiti-Regular", { + local: ["STHeiti", "Heiti SC", "PingFang SC", "Source Han Sans SC", "Source Han Sans CN", "Noto Sans SC", "Noto Sans CJK SC", "Microsoft YaHei", "SimHei", "WenQuanYi Zen Hei"], + style: NORMAL, + ultimate: "sans-serif" +}], ["STSongStd-Light", { + alias: "STSong-Light" +}], ["AdobeSongStd-Light", { + alias: "STSong-Light" +}], ["AdobeHeitiStd-Regular", { + alias: "STHeiti-Regular" +}], ["AdobeKaitiStd-Regular", { + alias: "\xBF\xAC\xCC\xE5" +}], ["AdobeFangsongStd-Regular", { + alias: "\xB7\xC2\xCB\xCE" +}], ["MSung-Light", { + local: ["Songti TC", "LiSong Pro", "Source Han Serif TC", "Source Han Serif TW", "Noto Serif TC", "Noto Serif CJK TC", "AR PL UMing TW", "PMingLiU", "MingLiU", "MingLiU_HKSCS"], + style: NORMAL, + ultimate: "serif" +}], ["MHei-Medium", { + local: ["Heiti TC", "STHeiti", "Source Han Sans TC", "Source Han Sans TW", "Noto Sans TC", "Noto Sans CJK TC", "PingFang TC", "Microsoft JhengHei"], + style: MEDIUM, + ultimate: "sans-serif" +}], ["MSungStd-Light", { + alias: "MSung-Light" +}], ["AdobeMingStd-Light", { + alias: "MSung-Light" +}], ["HYSMyeongJo-Medium", { + local: ["AppleMyungjo", "Source Han Serif KR", "Noto Serif KR", "Noto Serif CJK KR", "Nanum Myeongjo", "Batang"], + style: MEDIUM, + ultimate: "serif" +}], ["HYGoThic-Medium", { + local: ["Apple SD Gothic Neo", "AppleGothic", "Source Han Sans KR", "Noto Sans KR", "Noto Sans CJK KR", "Nanum Gothic", "Malgun Gothic", "Dotum", "Gulim"], + style: MEDIUM, + ultimate: "sans-serif" +}], ["HYSMyeongJoStd-Medium", { + alias: "HYSMyeongJo-Medium" +}], ["AdobeMyungjoStd-Medium", { + alias: "HYSMyeongJo-Medium" +}], ["HYGoThic-Bold", { + alias: "HYGoThic-Medium", + style: BOLD +}], ["AdobeGothicStd-Bold", { + alias: "HYGoThic-Medium", + style: BOLD }]]); const fontAliases = new Map([["Arial-Black", "ArialBlack"]]); function getStyleToAppend(style) { @@ -29293,10 +32929,13 @@ } return result; } -function getFontSubstitution(systemFontCache, idFactory, localFontPath, baseFontName, standardFontName) { +function getFontSubstitution(systemFontCache, idFactory, localFontPath, baseFontName, standardFontName, type) { if (baseFontName.startsWith("InvalidPDFjsFont_")) { return null; } + if ((type === "TrueType" || type === "Type1") && /^[A-Z]{6}\+/.test(baseFontName)) { + baseFontName = baseFontName.slice(7); + } baseFontName = normalizeFontName(baseFontName); const key = baseFontName; let substitutionInfo = systemFontCache.get(key); @@ -29321,11 +32960,12 @@ const loadedName = `${idFactory.getDocId()}_s${idFactory.createFontId()}`; if (!substitution) { if (!validateFontName(baseFontName)) { + warn(`Cannot substitute the font because of its name: ${baseFontName}`); systemFontCache.set(key, null); return null; } - const bold = /bold/gi.test(baseFontName); - const italic = /oblique|italic/gi.test(baseFontName); + const bold = /bold/i.test(baseFontName); + const italic = /oblique|italic/i.test(baseFontName); const style = bold && italic && BOLDITALIC || bold && BOLD || italic && ITALIC || NORMAL; substitutionInfo = { css: `"${getFamilyName(baseFontName)}",${loadedName}`, @@ -29360,251 +33000,7 @@ return substitutionInfo; } -;// CONCATENATED MODULE: ./src/core/image_resizer.js - -const MIN_IMAGE_DIM = 2048; -const MAX_IMAGE_DIM = 65537; -const MAX_ERROR = 128; -class ImageResizer { - constructor(imgData, isMask) { - this._imgData = imgData; - this._isMask = isMask; - } - static needsToBeResized(width, height) { - if (width <= this._goodSquareLength && height <= this._goodSquareLength) { - return false; - } - const { - MAX_DIM - } = this; - if (width > MAX_DIM || height > MAX_DIM) { - return true; - } - const area = width * height; - if (this._hasMaxArea) { - return area > this.MAX_AREA; - } - if (area < this._goodSquareLength ** 2) { - return false; - } - if (this._areGoodDims(width, height)) { - this._goodSquareLength = Math.max(this._goodSquareLength, Math.floor(Math.sqrt(width * height))); - return false; - } - this._goodSquareLength = this._guessMax(this._goodSquareLength, MAX_DIM, MAX_ERROR, 0); - const maxArea = this.MAX_AREA = this._goodSquareLength ** 2; - return area > maxArea; - } - static get MAX_DIM() { - return shadow(this, "MAX_DIM", this._guessMax(MIN_IMAGE_DIM, MAX_IMAGE_DIM, 0, 1)); - } - static get MAX_AREA() { - this._hasMaxArea = true; - return shadow(this, "MAX_AREA", this._guessMax(ImageResizer._goodSquareLength, this.MAX_DIM, MAX_ERROR, 0) ** 2); - } - static set MAX_AREA(area) { - if (area >= 0) { - this._hasMaxArea = true; - shadow(this, "MAX_AREA", area); - } - } - static setMaxArea(area) { - if (!this._hasMaxArea) { - this.MAX_AREA = area >> 2; - } - } - static _areGoodDims(width, height) { - try { - const canvas = new OffscreenCanvas(width, height); - const ctx = canvas.getContext("2d"); - ctx.fillRect(0, 0, 1, 1); - const opacity = ctx.getImageData(0, 0, 1, 1).data[3]; - canvas.width = canvas.height = 1; - return opacity !== 0; - } catch { - return false; - } - } - static _guessMax(start, end, tolerance, defaultHeight) { - while (start + tolerance + 1 < end) { - const middle = Math.floor((start + end) / 2); - const height = defaultHeight || middle; - if (this._areGoodDims(middle, height)) { - start = middle; - } else { - end = middle; - } - } - return start; - } - static async createImage(imgData, isMask = false) { - return new ImageResizer(imgData, isMask)._createImage(); - } - async _createImage() { - const data = this._encodeBMP(); - const blob = new Blob([data.buffer], { - type: "image/bmp" - }); - const bitmapPromise = createImageBitmap(blob); - const { - MAX_AREA, - MAX_DIM - } = ImageResizer; - const { - _imgData: imgData - } = this; - const { - width, - height - } = imgData; - const minFactor = Math.max(width / MAX_DIM, height / MAX_DIM, Math.sqrt(width * height / MAX_AREA)); - const firstFactor = Math.max(minFactor, 2); - const factor = Math.round(10 * (minFactor + 1.25)) / 10 / firstFactor; - const N = Math.floor(Math.log2(factor)); - const steps = new Array(N + 2).fill(2); - steps[0] = firstFactor; - steps.splice(-1, 1, factor / (1 << N)); - let newWidth = width; - let newHeight = height; - let bitmap = await bitmapPromise; - for (const step of steps) { - const prevWidth = newWidth; - const prevHeight = newHeight; - newWidth = Math.floor(newWidth / step) - 1; - newHeight = Math.floor(newHeight / step) - 1; - const canvas = new OffscreenCanvas(newWidth, newHeight); - const ctx = canvas.getContext("2d"); - ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight); - bitmap = canvas.transferToImageBitmap(); - } - imgData.data = null; - imgData.bitmap = bitmap; - imgData.width = newWidth; - imgData.height = newHeight; - return imgData; - } - _encodeBMP() { - const { - width, - height, - kind - } = this._imgData; - let data = this._imgData.data; - let bitPerPixel; - let colorTable = new Uint8Array(0); - let maskTable = colorTable; - let compression = 0; - switch (kind) { - case ImageKind.GRAYSCALE_1BPP: - { - bitPerPixel = 1; - colorTable = new Uint8Array(this._isMask ? [255, 255, 255, 255, 0, 0, 0, 0] : [0, 0, 0, 0, 255, 255, 255, 255]); - const rowLen = width + 7 >> 3; - const rowSize = rowLen + 3 & -4; - if (rowLen !== rowSize) { - const newData = new Uint8Array(rowSize * height); - let k = 0; - for (let i = 0, ii = height * rowLen; i < ii; i += rowLen, k += rowSize) { - newData.set(data.subarray(i, i + rowLen), k); - } - data = newData; - } - break; - } - case ImageKind.RGB_24BPP: - { - bitPerPixel = 24; - if (width & 3) { - const rowLen = 3 * width; - const rowSize = rowLen + 3 & -4; - const extraLen = rowSize - rowLen; - const newData = new Uint8Array(rowSize * height); - let k = 0; - for (let i = 0, ii = height * rowLen; i < ii; i += rowLen) { - const row = data.subarray(i, i + rowLen); - for (let j = 0; j < rowLen; j += 3) { - newData[k++] = row[j + 2]; - newData[k++] = row[j + 1]; - newData[k++] = row[j]; - } - k += extraLen; - } - data = newData; - } else { - for (let i = 0, ii = data.length; i < ii; i += 3) { - const tmp = data[i]; - data[i] = data[i + 2]; - data[i + 2] = tmp; - } - } - break; - } - case ImageKind.RGBA_32BPP: - bitPerPixel = 32; - compression = 3; - maskTable = new Uint8Array(4 + 4 + 4 + 4 + 52); - const view = new DataView(maskTable.buffer); - if (FeatureTest.isLittleEndian) { - view.setUint32(0, 0x000000ff, true); - view.setUint32(4, 0x0000ff00, true); - view.setUint32(8, 0x00ff0000, true); - view.setUint32(12, 0xff000000, true); - } else { - view.setUint32(0, 0xff000000, true); - view.setUint32(4, 0x00ff0000, true); - view.setUint32(8, 0x0000ff00, true); - view.setUint32(12, 0x000000ff, true); - } - break; - default: - throw new Error("invalid format"); - } - let i = 0; - const headerLength = 40 + maskTable.length; - const fileLength = 14 + headerLength + colorTable.length + data.length; - const bmpData = new Uint8Array(fileLength); - const view = new DataView(bmpData.buffer); - view.setUint16(i, 0x4d42, true); - i += 2; - view.setUint32(i, fileLength, true); - i += 4; - view.setUint32(i, 0, true); - i += 4; - view.setUint32(i, 14 + headerLength + colorTable.length, true); - i += 4; - view.setUint32(i, headerLength, true); - i += 4; - view.setInt32(i, width, true); - i += 4; - view.setInt32(i, -height, true); - i += 4; - view.setUint16(i, 1, true); - i += 2; - view.setUint16(i, bitPerPixel, true); - i += 2; - view.setUint32(i, compression, true); - i += 4; - view.setUint32(i, 0, true); - i += 4; - view.setInt32(i, 0, true); - i += 4; - view.setInt32(i, 0, true); - i += 4; - view.setUint32(i, colorTable.length / 4, true); - i += 4; - view.setUint32(i, 0, true); - i += 4; - bmpData.set(maskTable, i); - i += maskTable.length; - bmpData.set(colorTable, i); - i += colorTable.length; - bmpData.set(data, i); - return bmpData; - } -} -ImageResizer._goodSquareLength = MIN_IMAGE_DIM; - -;// CONCATENATED MODULE: ./src/shared/murmurhash3.js +;// ./src/shared/murmurhash3.js const SEED = 0xc3d2e1f0; const MASK_HIGH = 0xffff0000; const MASK_LOW = 0xffff; @@ -29697,531 +33093,9 @@ } } -;// CONCATENATED MODULE: ./src/core/operator_list.js +;// ./src/core/image.js -function addState(parentState, pattern, checkFn, iterateFn, processFn) { - let state = parentState; - for (let i = 0, ii = pattern.length - 1; i < ii; i++) { - const item = pattern[i]; - state = state[item] ||= []; - } - state[pattern.at(-1)] = { - checkFn, - iterateFn, - processFn - }; -} -const InitialState = []; -addState(InitialState, [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore], null, function iterateInlineImageGroup(context, i) { - const fnArray = context.fnArray; - const iFirstSave = context.iCurr - 3; - const pos = (i - iFirstSave) % 4; - switch (pos) { - case 0: - return fnArray[i] === OPS.save; - case 1: - return fnArray[i] === OPS.transform; - case 2: - return fnArray[i] === OPS.paintInlineImageXObject; - case 3: - return fnArray[i] === OPS.restore; - } - throw new Error(`iterateInlineImageGroup - invalid pos: ${pos}`); -}, function foundInlineImageGroup(context, i) { - const MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10; - const MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200; - const MAX_WIDTH = 1000; - const IMAGE_PADDING = 1; - const fnArray = context.fnArray, - argsArray = context.argsArray; - const curr = context.iCurr; - const iFirstSave = curr - 3; - const iFirstTransform = curr - 2; - const iFirstPIIXO = curr - 1; - const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_INLINE_IMAGES_BLOCK); - if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) { - return i - (i - iFirstSave) % 4; - } - let maxX = 0; - const map = []; - let maxLineHeight = 0; - let currentX = IMAGE_PADDING, - currentY = IMAGE_PADDING; - for (let q = 0; q < count; q++) { - const transform = argsArray[iFirstTransform + (q << 2)]; - const img = argsArray[iFirstPIIXO + (q << 2)][0]; - if (currentX + img.width > MAX_WIDTH) { - maxX = Math.max(maxX, currentX); - currentY += maxLineHeight + 2 * IMAGE_PADDING; - currentX = 0; - maxLineHeight = 0; - } - map.push({ - transform, - x: currentX, - y: currentY, - w: img.width, - h: img.height - }); - currentX += img.width + 2 * IMAGE_PADDING; - maxLineHeight = Math.max(maxLineHeight, img.height); - } - const imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING; - const imgHeight = currentY + maxLineHeight + IMAGE_PADDING; - const imgData = new Uint8Array(imgWidth * imgHeight * 4); - const imgRowSize = imgWidth << 2; - for (let q = 0; q < count; q++) { - const data = argsArray[iFirstPIIXO + (q << 2)][0].data; - const rowSize = map[q].w << 2; - let dataOffset = 0; - let offset = map[q].x + map[q].y * imgWidth << 2; - imgData.set(data.subarray(0, rowSize), offset - imgRowSize); - for (let k = 0, kk = map[q].h; k < kk; k++) { - imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset); - dataOffset += rowSize; - offset += imgRowSize; - } - imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset); - while (offset >= 0) { - data[offset - 4] = data[offset]; - data[offset - 3] = data[offset + 1]; - data[offset - 2] = data[offset + 2]; - data[offset - 1] = data[offset + 3]; - data[offset + rowSize] = data[offset + rowSize - 4]; - data[offset + rowSize + 1] = data[offset + rowSize - 3]; - data[offset + rowSize + 2] = data[offset + rowSize - 2]; - data[offset + rowSize + 3] = data[offset + rowSize - 1]; - offset -= imgRowSize; - } - } - const img = { - width: imgWidth, - height: imgHeight - }; - if (context.isOffscreenCanvasSupported) { - const canvas = new OffscreenCanvas(imgWidth, imgHeight); - const ctx = canvas.getContext("2d"); - ctx.putImageData(new ImageData(new Uint8ClampedArray(imgData.buffer), imgWidth, imgHeight), 0, 0); - img.bitmap = canvas.transferToImageBitmap(); - img.data = null; - } else { - img.kind = ImageKind.RGBA_32BPP; - img.data = imgData; - } - fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup); - argsArray.splice(iFirstSave, count * 4, [img, map]); - return iFirstSave + 1; -}); -addState(InitialState, [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore], null, function iterateImageMaskGroup(context, i) { - const fnArray = context.fnArray; - const iFirstSave = context.iCurr - 3; - const pos = (i - iFirstSave) % 4; - switch (pos) { - case 0: - return fnArray[i] === OPS.save; - case 1: - return fnArray[i] === OPS.transform; - case 2: - return fnArray[i] === OPS.paintImageMaskXObject; - case 3: - return fnArray[i] === OPS.restore; - } - throw new Error(`iterateImageMaskGroup - invalid pos: ${pos}`); -}, function foundImageMaskGroup(context, i) { - const MIN_IMAGES_IN_MASKS_BLOCK = 10; - const MAX_IMAGES_IN_MASKS_BLOCK = 100; - const MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000; - const fnArray = context.fnArray, - argsArray = context.argsArray; - const curr = context.iCurr; - const iFirstSave = curr - 3; - const iFirstTransform = curr - 2; - const iFirstPIMXO = curr - 1; - let count = Math.floor((i - iFirstSave) / 4); - if (count < MIN_IMAGES_IN_MASKS_BLOCK) { - return i - (i - iFirstSave) % 4; - } - let isSameImage = false; - let iTransform, transformArgs; - const firstPIMXOArg0 = argsArray[iFirstPIMXO][0]; - const firstTransformArg0 = argsArray[iFirstTransform][0], - firstTransformArg1 = argsArray[iFirstTransform][1], - firstTransformArg2 = argsArray[iFirstTransform][2], - firstTransformArg3 = argsArray[iFirstTransform][3]; - if (firstTransformArg1 === firstTransformArg2) { - isSameImage = true; - iTransform = iFirstTransform + 4; - let iPIMXO = iFirstPIMXO + 4; - for (let q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) { - transformArgs = argsArray[iTransform]; - if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || transformArgs[0] !== firstTransformArg0 || transformArgs[1] !== firstTransformArg1 || transformArgs[2] !== firstTransformArg2 || transformArgs[3] !== firstTransformArg3) { - if (q < MIN_IMAGES_IN_MASKS_BLOCK) { - isSameImage = false; - } else { - count = q; - } - break; - } - } - } - if (isSameImage) { - count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK); - const positions = new Float32Array(count * 2); - iTransform = iFirstTransform; - for (let q = 0; q < count; q++, iTransform += 4) { - transformArgs = argsArray[iTransform]; - positions[q << 1] = transformArgs[4]; - positions[(q << 1) + 1] = transformArgs[5]; - } - fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat); - argsArray.splice(iFirstSave, count * 4, [firstPIMXOArg0, firstTransformArg0, firstTransformArg1, firstTransformArg2, firstTransformArg3, positions]); - } else { - count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK); - const images = []; - for (let q = 0; q < count; q++) { - transformArgs = argsArray[iFirstTransform + (q << 2)]; - const maskParams = argsArray[iFirstPIMXO + (q << 2)][0]; - images.push({ - data: maskParams.data, - width: maskParams.width, - height: maskParams.height, - interpolate: maskParams.interpolate, - count: maskParams.count, - transform: transformArgs - }); - } - fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup); - argsArray.splice(iFirstSave, count * 4, [images]); - } - return iFirstSave + 1; -}); -addState(InitialState, [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore], function (context) { - const argsArray = context.argsArray; - const iFirstTransform = context.iCurr - 2; - return argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0; -}, function iterateImageGroup(context, i) { - const fnArray = context.fnArray, - argsArray = context.argsArray; - const iFirstSave = context.iCurr - 3; - const pos = (i - iFirstSave) % 4; - switch (pos) { - case 0: - return fnArray[i] === OPS.save; - case 1: - if (fnArray[i] !== OPS.transform) { - return false; - } - const iFirstTransform = context.iCurr - 2; - const firstTransformArg0 = argsArray[iFirstTransform][0]; - const firstTransformArg3 = argsArray[iFirstTransform][3]; - if (argsArray[i][0] !== firstTransformArg0 || argsArray[i][1] !== 0 || argsArray[i][2] !== 0 || argsArray[i][3] !== firstTransformArg3) { - return false; - } - return true; - case 2: - if (fnArray[i] !== OPS.paintImageXObject) { - return false; - } - const iFirstPIXO = context.iCurr - 1; - const firstPIXOArg0 = argsArray[iFirstPIXO][0]; - if (argsArray[i][0] !== firstPIXOArg0) { - return false; - } - return true; - case 3: - return fnArray[i] === OPS.restore; - } - throw new Error(`iterateImageGroup - invalid pos: ${pos}`); -}, function (context, i) { - const MIN_IMAGES_IN_BLOCK = 3; - const MAX_IMAGES_IN_BLOCK = 1000; - const fnArray = context.fnArray, - argsArray = context.argsArray; - const curr = context.iCurr; - const iFirstSave = curr - 3; - const iFirstTransform = curr - 2; - const iFirstPIXO = curr - 1; - const firstPIXOArg0 = argsArray[iFirstPIXO][0]; - const firstTransformArg0 = argsArray[iFirstTransform][0]; - const firstTransformArg3 = argsArray[iFirstTransform][3]; - const count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_BLOCK); - if (count < MIN_IMAGES_IN_BLOCK) { - return i - (i - iFirstSave) % 4; - } - const positions = new Float32Array(count * 2); - let iTransform = iFirstTransform; - for (let q = 0; q < count; q++, iTransform += 4) { - const transformArgs = argsArray[iTransform]; - positions[q << 1] = transformArgs[4]; - positions[(q << 1) + 1] = transformArgs[5]; - } - const args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, positions]; - fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat); - argsArray.splice(iFirstSave, count * 4, args); - return iFirstSave + 1; -}); -addState(InitialState, [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText], null, function iterateShowTextGroup(context, i) { - const fnArray = context.fnArray, - argsArray = context.argsArray; - const iFirstSave = context.iCurr - 4; - const pos = (i - iFirstSave) % 5; - switch (pos) { - case 0: - return fnArray[i] === OPS.beginText; - case 1: - return fnArray[i] === OPS.setFont; - case 2: - return fnArray[i] === OPS.setTextMatrix; - case 3: - if (fnArray[i] !== OPS.showText) { - return false; - } - const iFirstSetFont = context.iCurr - 3; - const firstSetFontArg0 = argsArray[iFirstSetFont][0]; - const firstSetFontArg1 = argsArray[iFirstSetFont][1]; - if (argsArray[i][0] !== firstSetFontArg0 || argsArray[i][1] !== firstSetFontArg1) { - return false; - } - return true; - case 4: - return fnArray[i] === OPS.endText; - } - throw new Error(`iterateShowTextGroup - invalid pos: ${pos}`); -}, function (context, i) { - const MIN_CHARS_IN_BLOCK = 3; - const MAX_CHARS_IN_BLOCK = 1000; - const fnArray = context.fnArray, - argsArray = context.argsArray; - const curr = context.iCurr; - const iFirstBeginText = curr - 4; - const iFirstSetFont = curr - 3; - const iFirstSetTextMatrix = curr - 2; - const iFirstShowText = curr - 1; - const iFirstEndText = curr; - const firstSetFontArg0 = argsArray[iFirstSetFont][0]; - const firstSetFontArg1 = argsArray[iFirstSetFont][1]; - let count = Math.min(Math.floor((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK); - if (count < MIN_CHARS_IN_BLOCK) { - return i - (i - iFirstBeginText) % 5; - } - let iFirst = iFirstBeginText; - if (iFirstBeginText >= 4 && fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) { - count++; - iFirst -= 5; - } - let iEndText = iFirst + 4; - for (let q = 1; q < count; q++) { - fnArray.splice(iEndText, 3); - argsArray.splice(iEndText, 3); - iEndText += 2; - } - return iEndText + 1; -}); -class NullOptimizer { - constructor(queue) { - this.queue = queue; - } - _optimize() {} - push(fn, args) { - this.queue.fnArray.push(fn); - this.queue.argsArray.push(args); - this._optimize(); - } - flush() {} - reset() {} -} -class QueueOptimizer extends NullOptimizer { - constructor(queue) { - super(queue); - this.state = null; - this.context = { - iCurr: 0, - fnArray: queue.fnArray, - argsArray: queue.argsArray, - isOffscreenCanvasSupported: false - }; - this.match = null; - this.lastProcessed = 0; - } - set isOffscreenCanvasSupported(value) { - this.context.isOffscreenCanvasSupported = value; - } - _optimize() { - const fnArray = this.queue.fnArray; - let i = this.lastProcessed, - ii = fnArray.length; - let state = this.state; - let match = this.match; - if (!state && !match && i + 1 === ii && !InitialState[fnArray[i]]) { - this.lastProcessed = ii; - return; - } - const context = this.context; - while (i < ii) { - if (match) { - const iterate = (0, match.iterateFn)(context, i); - if (iterate) { - i++; - continue; - } - i = (0, match.processFn)(context, i + 1); - ii = fnArray.length; - match = null; - state = null; - if (i >= ii) { - break; - } - } - state = (state || InitialState)[fnArray[i]]; - if (!state || Array.isArray(state)) { - i++; - continue; - } - context.iCurr = i; - i++; - if (state.checkFn && !(0, state.checkFn)(context)) { - state = null; - continue; - } - match = state; - state = null; - } - this.state = state; - this.match = match; - this.lastProcessed = i; - } - flush() { - while (this.match) { - const length = this.queue.fnArray.length; - this.lastProcessed = (0, this.match.processFn)(this.context, length); - this.match = null; - this.state = null; - this._optimize(); - } - } - reset() { - this.state = null; - this.match = null; - this.lastProcessed = 0; - } -} -class OperatorList { - static CHUNK_SIZE = 1000; - static CHUNK_SIZE_ABOUT = this.CHUNK_SIZE - 5; - constructor(intent = 0, streamSink) { - this._streamSink = streamSink; - this.fnArray = []; - this.argsArray = []; - this.optimizer = streamSink && !(intent & RenderingIntentFlag.OPLIST) ? new QueueOptimizer(this) : new NullOptimizer(this); - this.dependencies = new Set(); - this._totalLength = 0; - this.weight = 0; - this._resolved = streamSink ? null : Promise.resolve(); - } - set isOffscreenCanvasSupported(value) { - this.optimizer.isOffscreenCanvasSupported = value; - } - get length() { - return this.argsArray.length; - } - get ready() { - return this._resolved || this._streamSink.ready; - } - get totalLength() { - return this._totalLength + this.length; - } - addOp(fn, args) { - this.optimizer.push(fn, args); - this.weight++; - if (this._streamSink) { - if (this.weight >= OperatorList.CHUNK_SIZE) { - this.flush(); - } else if (this.weight >= OperatorList.CHUNK_SIZE_ABOUT && (fn === OPS.restore || fn === OPS.endText)) { - this.flush(); - } - } - } - addImageOps(fn, args, optionalContent) { - if (optionalContent !== undefined) { - this.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); - } - this.addOp(fn, args); - if (optionalContent !== undefined) { - this.addOp(OPS.endMarkedContent, []); - } - } - addDependency(dependency) { - if (this.dependencies.has(dependency)) { - return; - } - this.dependencies.add(dependency); - this.addOp(OPS.dependency, [dependency]); - } - addDependencies(dependencies) { - for (const dependency of dependencies) { - this.addDependency(dependency); - } - } - addOpList(opList) { - if (!(opList instanceof OperatorList)) { - warn('addOpList - ignoring invalid "opList" parameter.'); - return; - } - for (const dependency of opList.dependencies) { - this.dependencies.add(dependency); - } - for (let i = 0, ii = opList.length; i < ii; i++) { - this.addOp(opList.fnArray[i], opList.argsArray[i]); - } - } - getIR() { - return { - fnArray: this.fnArray, - argsArray: this.argsArray, - length: this.length - }; - } - get _transfers() { - const transfers = []; - const { - fnArray, - argsArray, - length - } = this; - for (let i = 0; i < length; i++) { - switch (fnArray[i]) { - case OPS.paintInlineImageXObject: - case OPS.paintInlineImageXObjectGroup: - case OPS.paintImageMaskXObject: - const arg = argsArray[i][0]; - if (!arg.cached && arg.data?.buffer instanceof ArrayBuffer) { - transfers.push(arg.data.buffer); - } - break; - } - } - return transfers; - } - flush(lastChunk = false, separateAnnots = null) { - this.optimizer.flush(); - const length = this.length; - this._totalLength += length; - this._streamSink.enqueue({ - fnArray: this.fnArray, - argsArray: this.argsArray, - lastChunk, - separateAnnots, - length - }, 1, this._transfers); - this.dependencies.clear(); - this.fnArray.length = 0; - this.argsArray.length = 0; - this.weight = 0; - this.optimizer.reset(); - } -} -;// CONCATENATED MODULE: ./src/core/image.js @@ -30231,46 +33105,6 @@ -function decodeAndClamp(value, addend, coefficient, max) { - value = addend + value * coefficient; - if (value < 0) { - value = 0; - } else if (value > max) { - value = max; - } - return value; -} -function resizeImageMask(src, bpc, w1, h1, w2, h2) { - const length = w2 * h2; - let dest; - if (bpc <= 8) { - dest = new Uint8Array(length); - } else if (bpc <= 16) { - dest = new Uint16Array(length); - } else { - dest = new Uint32Array(length); - } - const xRatio = w1 / w2; - const yRatio = h1 / h2; - let i, - j, - py, - newIndex = 0, - oldIndex; - const xScaled = new Uint16Array(w2); - const w1Scanline = w1; - for (i = 0; i < w2; i++) { - xScaled[i] = Math.floor(i * xRatio); - } - for (i = 0; i < h2; i++) { - py = Math.floor(i * yRatio) * w1Scanline; - for (j = 0; j < w2; j++) { - oldIndex = py + xScaled[j]; - dest[newIndex++] = src[oldIndex]; - } - } - return dest; -} class PDFImage { constructor({ xref, @@ -30281,6 +33115,7 @@ mask = null, isMask = false, pdfFunctionFactory, + globalColorSpaceCache, localColorSpaceCache }) { this.image = image; @@ -30297,13 +33132,25 @@ } switch (filterName) { case "JPXDecode": - const jpxImage = new JpxImage(); - jpxImage.parseImageProperties(image.stream); + ({ + width: image.width, + height: image.height, + componentsCount: image.numComps, + bitsPerComponent: image.bitsPerComponent + } = JpxImage.parseImageProperties(image.stream)); image.stream.reset(); - image.width = jpxImage.width; - image.height = jpxImage.height; - image.bitsPerComponent = jpxImage.bitsPerComponent; - image.numComps = jpxImage.componentsCount; + const reducePower = ImageResizer.getReducePowerForJPX(image.width, image.height, image.numComps); + this.jpxDecoderOptions = { + numComponents: 0, + isIndexedColormap: false, + smaskInData: dict.has("SMaskInData"), + reducePower + }; + if (reducePower) { + const factor = 2 ** reducePower; + image.width = Math.ceil(image.width / factor); + image.height = Math.ceil(image.height / factor); + } break; case "JBIG2Decode": image.bitsPerComponent = 1; @@ -30316,9 +33163,21 @@ warn("PDFImage - using the Width/Height of the image data, " + "rather than the image dictionary."); width = image.width; height = image.height; - } - if (width < 1 || height < 1) { - throw new FormatError(`Invalid image width: ${width} or height: ${height}`); + } else { + const validWidth = typeof width === "number" && width > 0, + validHeight = typeof height === "number" && height > 0; + if (!validWidth || !validHeight) { + if (!image.fallbackDims) { + throw new FormatError(`Invalid image width: ${width} or height: ${height}`); + } + warn("PDFImage - using the Width/Height of the parent image, for SMask/Mask data."); + if (!validWidth) { + width = image.fallbackDims.width; + } + if (!validHeight) { + height = image.fallbackDims.height; + } + } } this.width = width; this.height = height; @@ -30339,30 +33198,43 @@ this.bpc = bitsPerComponent; if (!this.imageMask) { let colorSpace = dict.getRaw("CS") || dict.getRaw("ColorSpace"); - if (!colorSpace) { - info("JPX images (which do not require color spaces)"); - switch (image.numComps) { - case 1: - colorSpace = Name.get("DeviceGray"); - break; - case 3: - colorSpace = Name.get("DeviceRGB"); - break; - case 4: - colorSpace = Name.get("DeviceCMYK"); - break; - default: - throw new Error(`JPX images with ${image.numComps} color components not supported.`); + const hasColorSpace = !!colorSpace; + if (!hasColorSpace) { + if (this.jpxDecoderOptions) { + colorSpace = Name.get("DeviceRGBA"); + } else { + switch (image.numComps) { + case 1: + colorSpace = Name.get("DeviceGray"); + break; + case 3: + colorSpace = Name.get("DeviceRGB"); + break; + case 4: + colorSpace = Name.get("DeviceCMYK"); + break; + default: + throw new Error(`Images with ${image.numComps} color components not supported.`); + } } + } else if (this.jpxDecoderOptions?.smaskInData) { + colorSpace = Name.get("DeviceRGBA"); } - this.colorSpace = ColorSpace.parse({ + this.colorSpace = ColorSpaceUtils.parse({ cs: colorSpace, xref, resources: isInline ? res : null, pdfFunctionFactory, + globalColorSpaceCache, localColorSpaceCache }); this.numComps = this.colorSpace.numComps; + if (this.jpxDecoderOptions) { + this.jpxDecoderOptions.numComponents = hasColorSpace ? this.numComps : 0; + this.jpxDecoderOptions.isIndexedColormap = this.colorSpace.name === "Indexed"; + } + } else { + this.numComps = 1; } this.decode = dict.getArray("D", "Decode"); this.needsDecode = false; @@ -30380,12 +33252,17 @@ } } if (smask) { + smask.fallbackDims ??= { + width, + height + }; this.smask = new PDFImage({ xref, res, image: smask, isInline, pdfFunctionFactory, + globalColorSpaceCache, localColorSpaceCache }); } else if (mask) { @@ -30395,6 +33272,10 @@ if (!imageMask) { warn("Ignoring /Mask in image without /ImageMask."); } else { + mask.fallbackDims ??= { + width, + height + }; this.mask = new PDFImage({ xref, res, @@ -30402,6 +33283,7 @@ isInline, isMask: true, pdfFunctionFactory, + globalColorSpaceCache, localColorSpaceCache }); } @@ -30416,6 +33298,7 @@ image, isInline = false, pdfFunctionFactory, + globalColorSpaceCache, localColorSpaceCache }) { const imageData = image; @@ -30444,51 +33327,24 @@ smask: smaskData, mask: maskData, pdfFunctionFactory, + globalColorSpaceCache, localColorSpaceCache }); } - static createRawMask({ - imgArray, - width, - height, - imageIsFromDecodeStream, - inverseDecode, - interpolate - }) { - const computedLength = (width + 7 >> 3) * height; - const actualLength = imgArray.byteLength; - const haveFullData = computedLength === actualLength; - let data, i; - if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) { - data = imgArray; - } else if (!inverseDecode) { - data = new Uint8Array(imgArray); - } else { - data = new Uint8Array(computedLength); - data.set(imgArray); - data.fill(0xff, actualLength); - } - if (inverseDecode) { - for (i = 0; i < actualLength; i++) { - data[i] ^= 0xff; - } - } - return { - data, - width, - height, - interpolate - }; - } static async createMask({ - imgArray, - width, - height, - imageIsFromDecodeStream, - inverseDecode, - interpolate, + image, isOffscreenCanvasSupported = false }) { + const { + dict + } = image; + const width = dict.get("W", "Width"); + const height = dict.get("H", "Height"); + const interpolate = dict.get("I", "Interpolate"); + const decode = dict.getArray("D", "Decode"); + const inverseDecode = decode?.[0] > 0; + const computedLength = (width + 7 >> 3) * height; + const imgArray = await image.getImageData(computedLength); const isSingleOpaquePixel = width === 1 && height === 1 && inverseDecode === (imgArray.length === 0 || !!(imgArray[0] & 128)); if (isSingleOpaquePixel) { return { @@ -30535,14 +33391,29 @@ bitmap }; } - return this.createRawMask({ - imgArray, + const actualLength = imgArray.byteLength; + const haveFullData = computedLength === actualLength; + let data; + if (image instanceof DecodeStream && (!inverseDecode || haveFullData)) { + data = imgArray; + } else if (!inverseDecode) { + data = new Uint8Array(imgArray); + } else { + data = new Uint8Array(computedLength); + data.set(imgArray); + data.fill(0xff, actualLength); + } + if (inverseDecode) { + for (let i = 0; i < actualLength; i++) { + data[i] ^= 0xff; + } + } + return { + data, width, height, - inverseDecode, - imageIsFromDecodeStream, interpolate - }); + }; } get drawWidth() { return Math.max(this.width, this.smask?.width || 0, this.mask?.width || 0); @@ -30566,7 +33437,7 @@ let index = 0; for (i = 0, ii = this.width * this.height; i < ii; i++) { for (let j = 0; j < numComps; j++) { - buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max); + buffer[index] = MathClamp(decodeAddends[j] + buffer[index] * decodeCoefficients[j], 0, max); index++; } } @@ -30646,60 +33517,61 @@ } return output; } - fillOpacity(rgbaBuf, width, height, actualHeight, image) { - const smask = this.smask; - const mask = this.mask; - let alphaBuf, sw, sh, i, ii, j; - if (smask) { - sw = smask.width; - sh = smask.height; - alphaBuf = new Uint8ClampedArray(sw * sh); - smask.fillGrayBuffer(alphaBuf); - if (sw !== width || sh !== height) { - alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height); - } - } else if (mask) { - if (mask instanceof PDFImage) { - sw = mask.width; - sh = mask.height; - alphaBuf = new Uint8ClampedArray(sw * sh); - mask.numComps = 1; - mask.fillGrayBuffer(alphaBuf); - for (i = 0, ii = sw * sh; i < ii; ++i) { - alphaBuf[i] = 255 - alphaBuf[i]; - } - if (sw !== width || sh !== height) { - alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, width, height); - } - } else if (Array.isArray(mask)) { - alphaBuf = new Uint8ClampedArray(width * height); - const numComps = this.numComps; - for (i = 0, ii = width * height; i < ii; ++i) { - let opacity = 0; - const imageOffset = i * numComps; - for (j = 0; j < numComps; ++j) { - const color = image[imageOffset + j]; - const maskOffset = j * 2; - if (color < mask[maskOffset] || color > mask[maskOffset + 1]) { - opacity = 255; - break; + async fillOpacity(rgbaBuf, width, height, actualHeight, image) { + let apply; + if (this.smask) { + apply = (buffer, options) => this.smask.fillGrayBuffer(buffer, { + ...options, + destWidth: width, + destHeight: height + }); + } else if (this.mask) { + if (this.mask instanceof PDFImage) { + apply = (buffer, options) => this.mask.fillGrayBuffer(buffer, { + ...options, + invertOutput: true, + destWidth: width, + destHeight: height + }); + } else if (Array.isArray(this.mask)) { + apply = (buffer, { + maxRows, + offset, + stride + }) => { + for (let i = 0, ii = width * maxRows; i < ii; ++i) { + let opacity = 0; + const imageOffset = i * this.numComps; + for (let j = 0; j < this.numComps; ++j) { + const color = image[imageOffset + j]; + const maskOffset = j * 2; + if (color < this.mask[maskOffset] || color > this.mask[maskOffset + 1]) { + opacity = 255; + break; + } } + buffer[i * stride + offset] = opacity; } - alphaBuf[i] = opacity; - } + }; } else { throw new FormatError("Unknown mask format."); } - } - if (alphaBuf) { - for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { - rgbaBuf[j] = alphaBuf[i]; - } } else { - for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { - rgbaBuf[j] = 255; - } + apply = (buffer, { + maxRows, + offset, + stride + }) => { + for (let i = 0, ii = width * maxRows; i < ii; ++i) { + buffer[i * stride + offset] = 255; + } + }; } + await apply(rgbaBuf, { + maxRows: actualHeight, + offset: 3, + stride: 4 + }); } undoPreblend(buffer, width, height) { const matte = this.smask?.matte; @@ -30741,6 +33613,19 @@ const bpc = this.bpc; const rowBytes = originalWidth * numComps * bpc + 7 >> 3; const mustBeResized = isOffscreenCanvasSupported && ImageResizer.needsToBeResized(drawWidth, drawHeight); + if (!this.smask && !this.mask && this.colorSpace.name === "DeviceRGBA") { + imgData.kind = ImageKind.RGBA_32BPP; + const imgArray = imgData.data = await this.getImageBytes(originalHeight * originalWidth * 4, { + internal: isOffscreenCanvasSupported && mustBeResized + }); + if (isOffscreenCanvasSupported) { + if (!mustBeResized) { + return this.createBitmap(ImageKind.RGBA_32BPP, drawWidth, drawHeight, imgArray); + } + return ImageResizer.createImage(imgData, false); + } + return imgData; + } if (!forceRGBA) { let kind; if (this.colorSpace.name === "DeviceGray" && bpc === 1) { @@ -30749,7 +33634,13 @@ kind = ImageKind.RGB_24BPP; } if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) { - const data = this.getImageBytes(originalHeight * rowBytes, {}); + const image = await this.#getImage(originalWidth, originalHeight); + if (image) { + return image; + } + const data = await this.getImageBytes(originalHeight * rowBytes, { + internal: isOffscreenCanvasSupported && mustBeResized + }); if (isOffscreenCanvasSupported) { if (mustBeResized) { return ImageResizer.createImage({ @@ -30791,10 +33682,15 @@ break; } if (isHandled) { - const rgba = this.getImageBytes(imageLength, { + const image = await this.#getImage(drawWidth, drawHeight); + if (image) { + return image; + } + const rgba = await this.getImageBytes(imageLength, { drawWidth, drawHeight, - forceRGBA: true + forceRGBA: true, + internal: true }); return this.createBitmap(ImageKind.RGBA_32BPP, drawWidth, drawHeight, rgba); } @@ -30805,10 +33701,11 @@ case "DeviceRGB": case "DeviceCMYK": imgData.kind = ImageKind.RGB_24BPP; - imgData.data = this.getImageBytes(imageLength, { + imgData.data = await this.getImageBytes(imageLength, { drawWidth, drawHeight, - forceRGB: true + forceRGB: true, + internal: mustBeResized }); if (mustBeResized) { return ImageResizer.createImage(imgData); @@ -30818,7 +33715,7 @@ } } } - const imgArray = this.getImageBytes(originalHeight * rowBytes, { + const imgArray = await this.getImageBytes(originalHeight * rowBytes, { internal: true }); const actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight; @@ -30849,7 +33746,7 @@ } alpha01 = 1; maybeUndoPreblend = true; - this.fillOpacity(data, drawWidth, drawHeight, actualHeight, comps); + await this.fillOpacity(data, drawWidth, drawHeight, actualHeight, comps); } if (this.needsDecode) { this.decodeBuffer(comps); @@ -30875,29 +33772,74 @@ } return imgData; } - fillGrayBuffer(buffer) { + async fillGrayBuffer(buffer, { + destWidth, + destHeight, + invertOutput, + maxRows, + offset = 0, + stride = 1 + } = {}) { const numComps = this.numComps; if (numComps !== 1) { throw new FormatError(`Reading gray scale from a color image: ${numComps}`); } - const width = this.width; - const height = this.height; + const srcWidth = this.width; + const srcHeight = this.height; const bpc = this.bpc; - const rowBytes = width * numComps * bpc + 7 >> 3; - const imgArray = this.getImageBytes(height * rowBytes, { + const rowBytes = srcWidth * numComps * bpc + 7 >> 3; + const imgArray = await this.getImageBytes(srcHeight * rowBytes, { internal: true }); const comps = this.getComponents(imgArray); - let i, length; + const resolvedDestWidth = destWidth ?? srcWidth; + const resolvedDestHeight = destHeight ?? srcHeight; + const needsResampling = resolvedDestWidth !== srcWidth || resolvedDestHeight !== srcHeight; + const rows = maxRows === undefined ? resolvedDestHeight : Math.min(resolvedDestHeight, maxRows); + let outputWidth = srcWidth; + let yRatio = 0; + let xScaled = null; + if (needsResampling) { + outputWidth = resolvedDestWidth; + yRatio = srcHeight / resolvedDestHeight; + const xRatio = srcWidth / resolvedDestWidth; + xScaled = new Uint32Array(resolvedDestWidth); + for (let i = 0; i < resolvedDestWidth; i++) { + xScaled[i] = Math.floor(i * xRatio); + } + } + const mask = invertOutput ? 0xff : 0; if (bpc === 1) { - length = width * height; - if (this.needsDecode) { - for (i = 0; i < length; ++i) { - buffer[i] = comps[i] - 1 & 255; + if (xScaled) { + const xMap = xScaled; + let destIndex = offset; + if (this.needsDecode) { + for (let row = 0; row < rows; row++) { + const py = Math.floor(row * yRatio) * srcWidth; + for (let col = 0; col < outputWidth; col++) { + buffer[destIndex] = comps[py + xMap[col]] - 1 & 255 ^ mask; + destIndex += stride; + } + } + } else { + for (let row = 0; row < rows; row++) { + const py = Math.floor(row * yRatio) * srcWidth; + for (let col = 0; col < outputWidth; col++) { + buffer[destIndex] = -comps[py + xMap[col]] & 255 ^ mask; + destIndex += stride; + } + } } } else { - for (i = 0; i < length; ++i) { - buffer[i] = -comps[i] & 255; + const length = outputWidth * rows; + if (this.needsDecode) { + for (let i = 0; i < length; ++i) { + buffer[i * stride + offset] = comps[i] - 1 & 255 ^ mask; + } + } else { + for (let i = 0; i < length; ++i) { + buffer[i * stride + offset] = -comps[i] & 255 ^ mask; + } } } return; @@ -30905,10 +33847,22 @@ if (this.needsDecode) { this.decodeBuffer(comps); } - length = width * height; const scale = 255 / ((1 << bpc) - 1); - for (i = 0; i < length; ++i) { - buffer[i] = scale * comps[i]; + if (xScaled) { + const xMap = xScaled; + let destIndex = offset; + for (let row = 0; row < rows; row++) { + const py = Math.floor(row * yRatio) * srcWidth; + for (let col = 0; col < outputWidth; col++) { + buffer[destIndex] = scale * comps[py + xMap[col]] ^ mask; + destIndex += stride; + } + } + } else { + const length = outputWidth * rows; + for (let i = 0; i < length; ++i) { + buffer[i * stride + offset] = scale * comps[i] ^ mask; + } } } createBitmap(kind, width, height, src) { @@ -30938,7 +33892,20 @@ interpolate: this.interpolate }; } - getImageBytes(length, { + async #getImage(width, height) { + const bitmap = await this.image.getTransferableImage(); + if (!bitmap) { + return null; + } + return { + data: null, + width, + height, + bitmap, + interpolate: this.interpolate + }; + } + async getImageBytes(length, { drawWidth, drawHeight, forceRGBA = false, @@ -30950,7 +33917,7 @@ this.image.drawHeight = drawHeight || this.height; this.image.forceRGBA = !!forceRGBA; this.image.forceRGB = !!forceRGB; - const imageBytes = this.image.getBytes(length); + const imageBytes = await this.image.getImageData(length, this.jpxDecoderOptions); if (internal || this.image instanceof DecodeStream) { return imageBytes; } @@ -30959,7 +33926,10 @@ } } -;// CONCATENATED MODULE: ./src/core/evaluator.js +;// ./src/core/evaluator.js + + + @@ -30990,13 +33960,19 @@ maxImageSize: -1, disableFontFace: false, ignoreErrors: false, - isEvalSupported: true, isOffscreenCanvasSupported: false, + isImageDecoderSupported: false, canvasMaxAreaInBytes: -1, fontExtraProperties: false, useSystemFonts: true, + useWasm: true, + useWorkerFetch: true, cMapUrl: null, - standardFontDataUrl: null + cMapPacked: true, + iccUrl: null, + standardFontDataUrl: null, + wasmUrl: null, + hasGPU: false }); const PatternType = { TILING: 1, @@ -31062,9 +34038,19 @@ warn(`Unsupported blend mode: ${value.name}`); return "source-over"; } -function incrementCachedImageMaskCount(data) { - if (data.fn === OPS.paintImageMaskXObject && data.args[0]?.count > 0) { - data.args[0].count++; +function addCachedImageOps(opList, { + objId, + fn, + args, + optionalContent, + hasMask +}) { + if (objId) { + opList.addDependency(objId); + } + opList.addImageOps(fn, args, optionalContent, hasMask); + if (fn === OPS.paintImageMaskXObject && args[0]?.count > 0) { + args[0].count++; } } class TimeSlotManager { @@ -31094,6 +34080,7 @@ fontCache, builtInCMapCache, standardFontDataCache, + globalColorSpaceCache, globalImageCache, systemFontCache, options = null @@ -31105,20 +34092,21 @@ this.fontCache = fontCache; this.builtInCMapCache = builtInCMapCache; this.standardFontDataCache = standardFontDataCache; + this.globalColorSpaceCache = globalColorSpaceCache; this.globalImageCache = globalImageCache; this.systemFontCache = systemFontCache; this.options = options || DefaultPartialEvaluatorOptions; - this.parsingType3Font = false; + this.type3FontRefs = null; this._regionalImageCache = new RegionalImageCache(); this._fetchBuiltInCMapBound = this.fetchBuiltInCMap.bind(this); - ImageResizer.setMaxArea(this.options.canvasMaxAreaInBytes); } get _pdfFunctionFactory() { - const pdfFunctionFactory = new PDFFunctionFactory({ - xref: this.xref, - isEvalSupported: this.options.isEvalSupported - }); - return shadow(this, "_pdfFunctionFactory", pdfFunctionFactory); + return shadow(this, "_pdfFunctionFactory", new PDFFunctionFactory({ + xref: this.xref + })); + } + get parsingType3Font() { + return !!this.type3FontRefs; } clone(newOptions = null) { const newEvaluator = Object.create(this); @@ -31224,24 +34212,21 @@ return cachedData; } let data; - if (this.options.cMapUrl !== null) { - const url = `${this.options.cMapUrl}${name}.bcmap`; - const response = await fetch(url); - if (!response.ok) { - throw new Error(`fetchBuiltInCMap: failed to fetch file "${url}" with "${response.statusText}".`); - } + if (this.options.useWorkerFetch) { data = { - cMapData: new Uint8Array(await response.arrayBuffer()), - compressionType: CMapCompressionType.BINARY + cMapData: await fetchBinaryData(`${this.options.cMapUrl}${name}.bcmap`), + isCompressed: true }; } else { - data = await this.handler.sendWithPromise("FetchBuiltInCMap", { - name - }); - } - if (data.compressionType !== CMapCompressionType.NONE) { - this.builtInCMapCache.set(name, data); + data = { + cMapData: await this.handler.sendWithPromise("FetchBinaryData", { + kind: "cMapUrl", + filename: `${name}${this.options.cMapPacked ? ".bcmap" : ""}` + }), + isCompressed: this.options.cMapPacked + }; } + this.builtInCMapCache.set(name, data); return data; } async fetchStandardFontData(name) { @@ -31255,34 +34240,32 @@ const standardFontNameToFileName = getFontNameToFileMap(), filename = standardFontNameToFileName[name]; let data; - if (this.options.standardFontDataUrl !== null) { - const url = `${this.options.standardFontDataUrl}${filename}`; - const response = await fetch(url); - if (!response.ok) { - warn(`fetchStandardFontData: failed to fetch file "${url}" with "${response.statusText}".`); + try { + if (this.options.useWorkerFetch) { + data = await fetchBinaryData(`${this.options.standardFontDataUrl}${filename}`); } else { - data = new Uint8Array(await response.arrayBuffer()); - } - } else { - try { - data = await this.handler.sendWithPromise("FetchStandardFontData", { + data = await this.handler.sendWithPromise("FetchBinaryData", { + kind: "standardFontDataUrl", filename }); - } catch (e) { - warn(`fetchStandardFontData: failed to fetch file "${filename}" with "${e}".`); } - } - if (!data) { + } catch (ex) { + warn(ex); return null; } this.standardFontDataCache.set(name, data); return new Stream(data); } - async buildFormXObject(resources, xobj, smask, operatorList, task, initialState, localColorSpaceCache) { - const dict = xobj.dict; - const matrix = dict.getArray("Matrix"); - let bbox = dict.getArray("BBox"); - bbox = Array.isArray(bbox) && bbox.length === 4 ? Util.normalizeRect(bbox) : null; + async buildFormXObject(resources, xobj, smask, operatorList, task, initialState, localColorSpaceCache, seenRefs) { + const { + dict + } = xobj; + const matrix = lookupMatrix(dict.getArray("Matrix"), null); + const bbox = lookupNormalRect(dict.getArray("BBox"), null); + let f32bbox = bbox && new Float32Array(bbox); + if (f32bbox?.some(x => !isFinite(x))) { + f32bbox = null; + } let optionalContent, groupOptions; if (dict.has("OC")) { optionalContent = await this.parseMarkedContentProps(dict.get("OC"), resources); @@ -31291,13 +34274,20 @@ operatorList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); } const group = dict.get("Group"); + let newOpList; + const f32matrix = matrix && new Float32Array(matrix); + const args = [f32matrix, !group && f32bbox || null]; + const localResources = dict.get("Resources"); if (group) { groupOptions = { matrix, - bbox, + bbox: f32bbox, smask, isolated: false, - knockout: false + knockout: false, + needsIsolation: false, + hasSoftMask: false, + isGray: false }; const groupSubtype = group.get("S"); let colorSpace = null; @@ -31305,37 +34295,40 @@ groupOptions.isolated = group.get("I") || false; groupOptions.knockout = group.get("K") || false; if (group.has("CS")) { - const cs = group.getRaw("CS"); - const cachedColorSpace = ColorSpace.getCached(cs, this.xref, localColorSpaceCache); - if (cachedColorSpace) { - colorSpace = cachedColorSpace; - } else { - colorSpace = await this.parseColorSpace({ - cs, - resources, - localColorSpaceCache - }); - } + const cs = this._getColorSpace(group.getRaw("CS"), resources, localColorSpaceCache); + colorSpace = cs instanceof ColorSpace ? cs : await this._handleColorSpace(cs); } } + groupOptions.isGray = colorSpace?.numComps === 1; if (smask?.backdrop) { - colorSpace ||= ColorSpace.singletons.rgb; - smask.backdrop = colorSpace.getRgb(smask.backdrop, 0); + colorSpace ||= ColorSpaceUtils.rgb; + smask.backdrop = colorSpace.getRgbHex(smask.backdrop, 0); + } else if (smask?.subtype === "Luminosity") { + smask.backdrop = "#000000"; } - operatorList.addOp(OPS.beginGroup, [groupOptions]); + newOpList = new CheckedOperatorList(); + } else { + newOpList = operatorList; + operatorList.addOp(OPS.paintFormXObjectBegin, args); } - const args = group ? [matrix, null] : [matrix, bbox]; - operatorList.addOp(OPS.paintFormXObjectBegin, args); await this.getOperatorList({ stream: xobj, task, - resources: dict.get("Resources") || resources, - operatorList, - initialState + resources: localResources instanceof Dict ? localResources : resources, + operatorList: newOpList, + initialState, + prevRefs: seenRefs }); - operatorList.addOp(OPS.paintFormXObjectEnd, []); if (group) { + groupOptions.needsIsolation = newOpList.needsIsolation || !!smask; + groupOptions.hasSoftMask = newOpList.hasSoftMask || !!smask; + operatorList.addOp(OPS.beginGroup, [groupOptions]); + operatorList.addOp(OPS.paintFormXObjectBegin, args); + operatorList.addOpList(newOpList); + operatorList.addOp(OPS.paintFormXObjectEnd, []); operatorList.addOp(OPS.endGroup, [groupOptions]); + } else { + operatorList.addOp(OPS.paintFormXObjectEnd, []); } if (optionalContent !== undefined) { operatorList.addOp(OPS.endMarkedContent, []); @@ -31357,7 +34350,14 @@ localImageCache, localColorSpaceCache }) { - const dict = image.dict; + const { + maxImageSize, + ignoreErrors, + isOffscreenCanvasSupported + } = this.options; + const { + dict + } = image; const imageRef = dict.objId; const w = dict.get("W", "Width"); const h = dict.get("H", "Height"); @@ -31365,41 +34365,32 @@ warn("Image dimensions are missing, or not numbers."); return; } - const maxImageSize = this.options.maxImageSize; if (maxImageSize !== -1 && w * h > maxImageSize) { const msg = "Image exceeded maximum allowed size and was removed."; - if (this.options.ignoreErrors) { - warn(msg); - return; + if (!ignoreErrors) { + throw new Error(msg); } - throw new Error(msg); + warn(msg); + return; } let optionalContent; if (dict.has("OC")) { optionalContent = await this.parseMarkedContentProps(dict.get("OC"), resources); } const imageMask = dict.get("IM", "ImageMask") || false; - let imgData, args; + let imgData, fn, args; if (imageMask) { - const interpolate = dict.get("I", "Interpolate"); - const bitStrideLength = w + 7 >> 3; - const imgArray = image.getBytes(bitStrideLength * h); - const decode = dict.getArray("D", "Decode"); - if (this.parsingType3Font) { - imgData = PDFImage.createRawMask({ - imgArray, - width: w, - height: h, - imageIsFromDecodeStream: image instanceof DecodeStream, - inverseDecode: decode?.[0] > 0, - interpolate - }); - imgData.cached = !!cacheKey; - args = [imgData]; - operatorList.addImageOps(OPS.paintImageMaskXObject, args, optionalContent); + imgData = await PDFImage.createMask({ + image, + isOffscreenCanvasSupported: isOffscreenCanvasSupported && !this.parsingType3Font + }); + if (imgData.isSingleOpaquePixel) { + fn = OPS.paintSolidColorImageMask; + args = []; + operatorList.addImageOps(fn, args, optionalContent); if (cacheKey) { const cacheData = { - fn: OPS.paintImageMaskXObject, + fn, args, optionalContent }; @@ -31410,34 +34401,21 @@ } return; } - imgData = await PDFImage.createMask({ - imgArray, - width: w, - height: h, - imageIsFromDecodeStream: image instanceof DecodeStream, - inverseDecode: decode?.[0] > 0, - interpolate, - isOffscreenCanvasSupported: this.options.isOffscreenCanvasSupported - }); - if (imgData.isSingleOpaquePixel) { - operatorList.addImageOps(OPS.paintSolidColorImageMask, [], optionalContent); - if (cacheKey) { - const cacheData = { - fn: OPS.paintSolidColorImageMask, - args: [], - optionalContent - }; - localImageCache.set(cacheKey, imageRef, cacheData); - if (imageRef) { - this._regionalImageCache.set(null, imageRef, cacheData); - } + if (this.parsingType3Font) { + args = compileType3Glyph(imgData); + if (args) { + operatorList.addImageOps(OPS.constructPath, args, optionalContent); + return; } + warn("Cannot compile Type3 glyph."); + operatorList.addImageOps(OPS.paintImageMaskXObject, [imgData], optionalContent); return; } const objId = `mask_${this.idFactory.createObjId()}`; operatorList.addDependency(objId); imgData.dataLen = imgData.bitmap ? imgData.width * imgData.height * 4 : imgData.data.length; this._sendImgData(objId, imgData); + fn = OPS.paintImageMaskXObject; args = [{ data: objId, width: imgData.width, @@ -31445,10 +34423,11 @@ interpolate: imgData.interpolate, count: 1 }]; - operatorList.addImageOps(OPS.paintImageMaskXObject, args, optionalContent); + operatorList.addImageOps(fn, args, optionalContent); if (cacheKey) { const cacheData = { - fn: OPS.paintImageMaskXObject, + objId, + fn, args, optionalContent }; @@ -31460,7 +34439,8 @@ return; } const SMALL_IMAGE_DIMENSIONS = 200; - if (isInline && !dict.has("SMask") && !dict.has("Mask") && w + h < SMALL_IMAGE_DIMENSIONS) { + const hasMask = dict.has("SMask") || dict.has("Mask"); + if (isInline && w + h < SMALL_IMAGE_DIMENSIONS && !hasMask) { try { const imageObj = new PDFImage({ xref: this.xref, @@ -31468,14 +34448,14 @@ image, isInline, pdfFunctionFactory: this._pdfFunctionFactory, + globalColorSpaceCache: this.globalColorSpaceCache, localColorSpaceCache }); imgData = await imageObj.createImageData(true, false); - operatorList.isOffscreenCanvasSupported = this.options.isOffscreenCanvasSupported; operatorList.addImageOps(OPS.paintInlineImageXObject, [imgData], optionalContent); } catch (reason) { const msg = `Unable to decode inline image: "${reason}".`; - if (!this.options.ignoreErrors) { + if (!ignoreErrors) { throw new Error(msg); } warn(msg); @@ -31483,7 +34463,8 @@ return; } let objId = `img_${this.idFactory.createObjId()}`, - cacheGlobally = false; + cacheGlobally = false, + globalCacheData = null; if (this.parsingType3Font) { objId = `${this.idFactory.getDocId()}_type3_${objId}`; } else if (cacheKey && imageRef) { @@ -31494,23 +34475,33 @@ } } operatorList.addDependency(objId); + fn = OPS.paintImageXObject; args = [objId, w, h]; - operatorList.addImageOps(OPS.paintImageXObject, args, optionalContent); - if (cacheGlobally && w * h > 250000) { - const localLength = await this.handler.sendWithPromise("commonobj", [objId, "CopyLocalImage", { - imageRef - }]); - if (localLength) { - this.globalImageCache.setData(imageRef, { - objId, - fn: OPS.paintImageXObject, - args, - optionalContent, - byteSize: 0 - }); - this.globalImageCache.addByteSize(imageRef, localLength); + operatorList.addImageOps(fn, args, optionalContent, hasMask); + if (cacheGlobally) { + globalCacheData = { + objId, + fn, + args, + optionalContent, + hasMask, + byteSize: 0 + }; + if (this.globalImageCache.hasDecodeFailed(imageRef)) { + this.globalImageCache.setData(imageRef, globalCacheData); + this._sendImgData(objId, null, cacheGlobally); return; } + if (w * h > 250000 || hasMask) { + const localLength = await this.handler.sendWithPromise("commonobj", [objId, "CopyLocalImage", { + imageRef + }]); + if (localLength) { + this.globalImageCache.setData(imageRef, globalCacheData); + this.globalImageCache.addByteSize(imageRef, localLength); + return; + } + } } PDFImage.buildImage({ xref: this.xref, @@ -31518,9 +34509,10 @@ image, isInline, pdfFunctionFactory: this._pdfFunctionFactory, + globalColorSpaceCache: this.globalColorSpaceCache, localColorSpaceCache }).then(async imageObj => { - imgData = await imageObj.createImageData(false, this.options.isOffscreenCanvasSupported); + imgData = await imageObj.createImageData(false, isOffscreenCanvasSupported); imgData.dataLen = imgData.bitmap ? imgData.width * imgData.height * 4 : imgData.data.length; imgData.ref = imageRef; if (cacheGlobally) { @@ -31529,30 +34521,30 @@ return this._sendImgData(objId, imgData, cacheGlobally); }).catch(reason => { warn(`Unable to decode image "${objId}": "${reason}".`); + if (imageRef) { + this.globalImageCache.addDecodeFailed(imageRef); + } return this._sendImgData(objId, null, cacheGlobally); }); if (cacheKey) { const cacheData = { - fn: OPS.paintImageXObject, + objId, + fn, args, - optionalContent + optionalContent, + hasMask }; localImageCache.set(cacheKey, imageRef, cacheData); if (imageRef) { this._regionalImageCache.set(null, imageRef, cacheData); if (cacheGlobally) { - this.globalImageCache.setData(imageRef, { - objId, - fn: OPS.paintImageXObject, - args, - optionalContent, - byteSize: 0 - }); + assert(globalCacheData, "The global cache-data must be available."); + this.globalImageCache.setData(imageRef, globalCacheData); } } } } - handleSMask(smask, resources, operatorList, task, stateManager, localColorSpaceCache) { + handleSMask(smask, resources, operatorList, task, stateManager, localColorSpaceCache, seenRefs) { const smaskContent = smask.get("G"); const smaskOptions = { subtype: smask.get("S").name, @@ -31570,12 +34562,17 @@ } smaskOptions.transferMap = transferMap; } - return this.buildFormXObject(resources, smaskContent, smaskOptions, operatorList, task, stateManager.state.clone(), localColorSpaceCache); + return this.buildFormXObject(resources, smaskContent, smaskOptions, operatorList, task, stateManager.state.clone({ + newPath: true + }), localColorSpaceCache, seenRefs); } handleTransferFunction(tr) { let transferArray; if (Array.isArray(tr)) { transferArray = tr; + if (tr.length > 1 && tr.every(map => map === tr[0])) { + transferArray = [tr[0]]; + } } else if (isPDFFunction(tr)) { transferArray = [tr]; } else { @@ -31612,8 +34609,8 @@ } return transferMaps; } - handleTilingType(fn, color, resources, pattern, patternDict, operatorList, task, localTilingPatternCache) { - const tilingOpList = new OperatorList(); + handleTilingType(fn, color, resources, pattern, patternDict, operatorList, task, localTilingPatternCache, seenRefs) { + const tilingOpList = new CheckedOperatorList(); const patternResources = Dict.merge({ xref: this.xref, dictArray: [patternDict.get("Resources"), resources] @@ -31622,15 +34619,20 @@ stream: pattern, task, resources: patternResources, - operatorList: tilingOpList + operatorList: tilingOpList, + prevRefs: seenRefs }).then(function () { const operatorListIR = tilingOpList.getIR(); - const tilingPatternIR = getTilingPatternIR(operatorListIR, patternDict, color); + const { + needsIsolation + } = tilingOpList; + const tilingPatternIR = getTilingPatternIR(operatorListIR, patternDict, color, needsIsolation); operatorList.addDependencies(tilingOpList.dependencies); operatorList.addOp(fn, tilingPatternIR); if (patternDict.objId) { localTilingPatternCache.set(null, patternDict.objId, { operatorListIR, + needsIsolation, dict: patternDict }); } @@ -31645,21 +34647,11 @@ throw reason; }); } - async handleSetFont(resources, fontArgs, fontRef, operatorList, task, state, fallbackFontDict = null, cssFontInfo = null) { + async handleSetFont(resources, fontArgs, fontRef, operatorList, task, state, fallbackFontDict = null, cssFontInfo = null, seenRefs = null) { const fontName = fontArgs?.[0] instanceof Name ? fontArgs[0].name : null; - let translated = await this.loadFont(fontName, fontRef, resources, fallbackFontDict, cssFontInfo); + const translated = await this.loadFont(fontName, fontRef, resources, task, fallbackFontDict, cssFontInfo, seenRefs); if (translated.font.isType3Font) { - try { - await translated.loadType3Data(this, resources, task); - operatorList.addDependencies(translated.type3Dependencies); - } catch (reason) { - translated = new TranslatedFont({ - loadedName: "g_font_error", - font: new ErrorFont(`Type3 font load error: ${reason}`), - dict: translated.font, - evaluatorOptions: this.options - }); - } + operatorList.addDependencies(translated.type3Dependencies); } state.font = translated.font; translated.send(this.handler); @@ -31670,7 +34662,7 @@ const glyphs = font.charsToGlyphs(chars); if (font.data) { const isAddToPathSet = !!(state.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG); - if (isAddToPathSet || state.fillColorSpace.name === "Pattern" || font.disableFontFace || this.options.disableFontFace) { + if (isAddToPathSet || state.fillColorSpace.name === "Pattern" || state.strokeColorSpace.name === "Pattern" || font.disableFontFace) { PartialEvaluator.buildFontPaths(font, glyphs, this.handler, this.options); } } @@ -31695,18 +34687,24 @@ task, stateManager, localGStateCache, - localColorSpaceCache + localColorSpaceCache, + seenRefs }) { const gStateRef = gState.objId; let isSimpleGState = true; const gStateObj = []; let promise = Promise.resolve(); - for (const key of gState.getKeys()) { - const value = gState.get(key); + for (const [key, value] of gState) { switch (key) { case "Type": break; case "LW": + if (typeof value !== "number") { + warn(`Invalid LW (line width): ${value}`); + break; + } + gStateObj.push([key, Math.abs(value)]); + break; case "LC": case "LJ": case "ML": @@ -31719,7 +34717,7 @@ break; case "Font": isSimpleGState = false; - promise = promise.then(() => this.handleSetFont(resources, null, value[0], operatorList, task, stateManager.state).then(function (loadedName) { + promise = promise.then(() => this.handleSetFont(resources, null, value[0], operatorList, task, stateManager.state, null, null, seenRefs).then(function (loadedName) { operatorList.addDependency(loadedName); gStateObj.push([key, [loadedName, value[1]]]); })); @@ -31734,16 +34732,22 @@ } if (value instanceof Dict) { isSimpleGState = false; - promise = promise.then(() => this.handleSMask(value, resources, operatorList, task, stateManager, localColorSpaceCache)); + promise = promise.then(() => this.handleSMask(value, resources, operatorList, task, stateManager, localColorSpaceCache, seenRefs)); gStateObj.push([key, true]); } else { warn("Unsupported SMask type"); } break; case "TR": - const transferMaps = this.handleTransferFunction(value); - gStateObj.push([key, transferMaps]); - break; + case "TR2": + { + if (key === "TR" && gState.has("TR2")) { + break; + } + const transferMaps = this.handleTransferFunction(value); + gStateObj.push(["TR", transferMaps]); + break; + } case "OP": case "op": case "OPM": @@ -31751,7 +34755,6 @@ case "BG2": case "UCR": case "UCR2": - case "TR2": case "HT": case "SM": case "SA": @@ -31772,15 +34775,12 @@ localGStateCache.set(cacheKey, gStateRef, gStateObj); } } - loadFont(fontName, font, resources, fallbackFontDict = null, cssFontInfo = null) { - const errorFont = async () => { - return new TranslatedFont({ - loadedName: "g_font_error", - font: new ErrorFont(`Font "${fontName}" is not available.`), - dict: font, - evaluatorOptions: this.options - }); - }; + loadFont(fontName, font, resources, task, fallbackFontDict = null, cssFontInfo = null, seenRefs = null) { + const errorFont = async () => new TranslatedFont({ + loadedName: "g_font_error", + font: new ErrorFont(`Font "${fontName}" is not available.`), + dict: font + }); let fontRef; if (font) { if (font instanceof Ref) { @@ -31793,13 +34793,17 @@ } } if (fontRef) { - if (this.parsingType3Font && this.type3FontRefs.has(fontRef)) { + if (this.type3FontRefs?.has(fontRef)) { return errorFont(); } if (this.fontCache.has(fontRef)) { return this.fontCache.get(fontRef); } - font = this.xref.fetchIfRef(fontRef); + try { + font = this.xref.fetchIfRef(fontRef); + } catch (ex) { + warn(`loadFont - lookup failed: "${ex}".`); + } } if (!(font instanceof Dict)) { if (!this.options.ignoreErrors && !this.parsingType3Font) { @@ -31858,98 +34862,130 @@ this.fontCache.put(font.cacheKey, promise); } font.loadedName = `${this.idFactory.getDocId()}_${fontID}`; - this.translateFont(preEvaluatedFont).then(translatedFont => { - resolve(new TranslatedFont({ + this.translateFont(preEvaluatedFont).then(async translatedFont => { + const translated = new TranslatedFont({ loadedName: font.loadedName, font: translatedFont, - dict: font, - evaluatorOptions: this.options - })); + dict: font + }); + if (translatedFont.isType3Font) { + try { + await translated.loadType3Data(this, resources, task, seenRefs); + } catch (reason) { + throw new Error(`Type3 font load error: ${reason}`); + } + } + resolve(translated); }).catch(reason => { warn(`loadFont - translateFont failed: "${reason}".`); resolve(new TranslatedFont({ loadedName: font.loadedName, - font: new ErrorFont(reason instanceof Error ? reason.message : reason), - dict: font, - evaluatorOptions: this.options + font: new ErrorFont(reason?.message), + dict: font })); }); return promise; } - buildPath(operatorList, fn, args, parsingText = false) { - const lastIndex = operatorList.length - 1; - if (!args) { - args = []; - } - if (lastIndex < 0 || operatorList.fnArray[lastIndex] !== OPS.constructPath) { - if (parsingText) { - warn(`Encountered path operator "${fn}" inside of a text object.`); - operatorList.addOp(OPS.save, null); - } - let minMax; - switch (fn) { - case OPS.rectangle: - const x = args[0] + args[2]; - const y = args[1] + args[3]; - minMax = [Math.min(args[0], x), Math.min(args[1], y), Math.max(args[0], x), Math.max(args[1], y)]; - break; - case OPS.moveTo: - case OPS.lineTo: - minMax = [args[0], args[1], args[0], args[1]]; + buildPath(fn, args, state) { + const { + pathMinMax: minMax, + pathBuffer + } = state; + switch (fn | 0) { + case OPS.rectangle: + { + const x = state.currentPointX = args[0]; + const y = state.currentPointY = args[1]; + const width = args[2]; + const height = args[3]; + const xw = x + width; + const yh = y + height; + if (width === 0 || height === 0) { + pathBuffer.push(DrawOPS.moveTo, x, y, DrawOPS.lineTo, xw, yh, DrawOPS.closePath); + } else { + pathBuffer.push(DrawOPS.moveTo, x, y, DrawOPS.lineTo, xw, y, DrawOPS.lineTo, xw, yh, DrawOPS.lineTo, x, yh, DrawOPS.closePath); + } + Util.rectBoundingBox(x, y, xw, yh, minMax); break; - default: - minMax = [Infinity, Infinity, -Infinity, -Infinity]; + } + case OPS.moveTo: + { + const x = state.currentPointX = args[0]; + const y = state.currentPointY = args[1]; + pathBuffer.push(DrawOPS.moveTo, x, y); + Util.pointBoundingBox(x, y, minMax); break; - } - operatorList.addOp(OPS.constructPath, [[fn], args, minMax]); - if (parsingText) { - operatorList.addOp(OPS.restore, null); - } - } else { - const opArgs = operatorList.argsArray[lastIndex]; - opArgs[0].push(fn); - opArgs[1].push(...args); - const minMax = opArgs[2]; - switch (fn) { - case OPS.rectangle: - const x = args[0] + args[2]; - const y = args[1] + args[3]; - minMax[0] = Math.min(minMax[0], args[0], x); - minMax[1] = Math.min(minMax[1], args[1], y); - minMax[2] = Math.max(minMax[2], args[0], x); - minMax[3] = Math.max(minMax[3], args[1], y); + } + case OPS.lineTo: + { + const x = state.currentPointX = args[0]; + const y = state.currentPointY = args[1]; + pathBuffer.push(DrawOPS.lineTo, x, y); + Util.pointBoundingBox(x, y, minMax); + break; + } + case OPS.curveTo: + { + const startX = state.currentPointX; + const startY = state.currentPointY; + const [x1, y1, x2, y2, x, y] = args; + state.currentPointX = x; + state.currentPointY = y; + pathBuffer.push(DrawOPS.curveTo, x1, y1, x2, y2, x, y); + Util.bezierBoundingBox(startX, startY, x1, y1, x2, y2, x, y, minMax); break; - case OPS.moveTo: - case OPS.lineTo: - minMax[0] = Math.min(minMax[0], args[0]); - minMax[1] = Math.min(minMax[1], args[1]); - minMax[2] = Math.max(minMax[2], args[0]); - minMax[3] = Math.max(minMax[3], args[1]); + } + case OPS.curveTo2: + { + const startX = state.currentPointX; + const startY = state.currentPointY; + const [x1, y1, x, y] = args; + state.currentPointX = x; + state.currentPointY = y; + pathBuffer.push(DrawOPS.curveTo, startX, startY, x1, y1, x, y); + Util.bezierBoundingBox(startX, startY, startX, startY, x1, y1, x, y, minMax); break; - } + } + case OPS.curveTo3: + { + const startX = state.currentPointX; + const startY = state.currentPointY; + const [x1, y1, x, y] = args; + state.currentPointX = x; + state.currentPointY = y; + pathBuffer.push(DrawOPS.curveTo, x1, y1, x, y, x, y); + Util.bezierBoundingBox(startX, startY, x1, y1, x, y, x, y, minMax); + break; + } + case OPS.closePath: + pathBuffer.push(DrawOPS.closePath); + break; } } - parseColorSpace({ - cs, - resources, - localColorSpaceCache - }) { - return ColorSpace.parseAsync({ + _getColorSpace(cs, resources, localColorSpaceCache) { + return ColorSpaceUtils.parse({ cs, xref: this.xref, resources, pdfFunctionFactory: this._pdfFunctionFactory, - localColorSpaceCache - }).catch(reason => { - if (reason instanceof AbortException) { + globalColorSpaceCache: this.globalColorSpaceCache, + localColorSpaceCache, + asyncIfNotCached: true + }); + } + async _handleColorSpace(csPromise) { + try { + return await csPromise; + } catch (ex) { + if (ex instanceof AbortException) { return null; } if (this.options.ignoreErrors) { - warn(`parseColorSpace - ignoring ColorSpace: "${reason}".`); + warn(`_handleColorSpace - ignoring ColorSpace: "${ex}".`); return null; } - throw reason; - }); + throw ex; + } } parseShading({ shading, @@ -31963,7 +34999,7 @@ } let patternIR; try { - const shadingFill = Pattern.parseShading(shading, this.xref, resources, this._pdfFunctionFactory, localColorSpaceCache); + const shadingFill = Pattern.parseShading(shading, this.xref, resources, this._pdfFunctionFactory, this.globalColorSpaceCache, localColorSpaceCache); patternIR = shadingFill.getIR(); } catch (reason) { if (reason instanceof AbortException) { @@ -31982,21 +35018,22 @@ } localShadingPatternCache.set(shading, id); if (this.parsingType3Font) { - this.handler.send("commonobj", [id, "Pattern", patternIR]); + const buffer = compilePatternInfo(patternIR); + this.handler.send("commonobj", [id, "Pattern", buffer], [buffer]); } else { this.handler.send("obj", [id, this.pageIndex, "Pattern", patternIR]); } return id; } - handleColorN(operatorList, fn, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache) { + handleColorN(operatorList, fn, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache, seenRefs) { const patternName = args.pop(); if (patternName instanceof Name) { const rawPattern = patterns.getRaw(patternName.name); const localTilingPattern = rawPattern instanceof Ref && localTilingPatternCache.getByRef(rawPattern); if (localTilingPattern) { try { - const color = cs.base ? cs.base.getRgb(args, 0) : null; - const tilingPatternIR = getTilingPatternIR(localTilingPattern.operatorListIR, localTilingPattern.dict, color); + const color = cs.base ? cs.base.getRgbHex(args, 0) : null; + const tilingPatternIR = getTilingPatternIR(localTilingPattern.operatorListIR, localTilingPattern.dict, color, localTilingPattern.needsIsolation); operatorList.addOp(fn, tilingPatternIR); return undefined; } catch {} @@ -32006,8 +35043,8 @@ const dict = pattern instanceof BaseStream ? pattern.dict : pattern; const typeNum = dict.get("PatternType"); if (typeNum === PatternType.TILING) { - const color = cs.base ? cs.base.getRgb(args, 0) : null; - return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task, localTilingPatternCache); + const color = cs.base ? cs.base.getRgbHex(args, 0) : null; + return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task, localTilingPatternCache, seenRefs); } else if (typeNum === PatternType.SHADING) { const shading = dict.get("Shading"); const objId = this.parseShading({ @@ -32017,7 +35054,7 @@ localShadingPatternCache }); if (objId) { - const matrix = dict.getArray("Matrix"); + const matrix = lookupMatrix(dict.getArray("Matrix"), null); operatorList.addOp(fn, ["Shading", objId, matrix]); } return undefined; @@ -32027,101 +35064,32 @@ } throw new FormatError(`Unknown PatternName: ${patternName}`); } - _parseVisibilityExpression(array, nestingCounter, currentResult) { - const MAX_NESTING = 10; - if (++nestingCounter > MAX_NESTING) { - warn("Visibility expression is too deeply nested"); - return; - } - const length = array.length; - const operator = this.xref.fetchIfRef(array[0]); - if (length < 2 || !(operator instanceof Name)) { - warn("Invalid visibility expression"); - return; - } - switch (operator.name) { - case "And": - case "Or": - case "Not": - currentResult.push(operator.name); - break; - default: - warn(`Invalid operator ${operator.name} in visibility expression`); - return; - } - for (let i = 1; i < length; i++) { - const raw = array[i]; - const object = this.xref.fetchIfRef(raw); - if (Array.isArray(object)) { - const nestedResult = []; - currentResult.push(nestedResult); - this._parseVisibilityExpression(object, nestingCounter, nestedResult); - } else if (raw instanceof Ref) { - currentResult.push(raw.toString()); - } - } - } async parseMarkedContentProps(contentProperties, resources) { - let optionalContent; - if (contentProperties instanceof Name) { - const properties = resources.get("Properties"); - optionalContent = properties.get(contentProperties.name); - } else if (contentProperties instanceof Dict) { - optionalContent = contentProperties; - } else { - throw new FormatError("Optional content properties malformed."); - } - const optionalContentType = optionalContent.get("Type")?.name; - if (optionalContentType === "OCG") { - return { - type: optionalContentType, - id: optionalContent.objId - }; - } else if (optionalContentType === "OCMD") { - const expression = optionalContent.get("VE"); - if (Array.isArray(expression)) { - const result = []; - this._parseVisibilityExpression(expression, 0, result); - if (result.length > 0) { - return { - type: "OCMD", - expression: result - }; - } - } - const optionalContentGroups = optionalContent.get("OCGs"); - if (Array.isArray(optionalContentGroups) || optionalContentGroups instanceof Dict) { - const groupIds = []; - if (Array.isArray(optionalContentGroups)) { - for (const ocg of optionalContentGroups) { - groupIds.push(ocg.toString()); - } - } else { - groupIds.push(optionalContentGroups.objId); - } - return { - type: optionalContentType, - ids: groupIds, - policy: optionalContent.get("P") instanceof Name ? optionalContent.get("P").name : null, - expression: null - }; - } else if (optionalContentGroups instanceof Ref) { - return { - type: optionalContentType, - id: optionalContentGroups.toString() - }; - } - } - return null; + return parseMarkedContentProps(this.xref, contentProperties, resources); } - getOperatorList({ + async getOperatorList({ stream, task, resources, operatorList, initialState = null, - fallbackFontDict = null + fallbackFontDict = null, + prevRefs = null }) { + if (stream.isAsync) { + const bytes = await stream.asyncGetBytes(); + if (bytes) { + stream = new Stream(bytes, 0, bytes.length, stream.dict); + } + } + const objId = stream.dict?.objId; + const seenRefs = new RefSet(prevRefs); + if (objId) { + if (prevRefs?.has(objId)) { + throw new Error(`getOperatorList - ignoring circular reference: ${objId}`); + } + seenRefs.put(objId); + } resources ||= Dict.empty; initialState ||= new EvalState(); if (!operatorList) { @@ -32129,7 +35097,6 @@ } const self = this; const xref = this.xref; - let parsingText = false; const localImageCache = new LocalImageCache(); const localColorSpaceCache = new LocalColorSpaceCache(); const localGStateCache = new LocalGStateCache(); @@ -32173,8 +35140,7 @@ if (isValidName) { const localImage = localImageCache.getByName(name); if (localImage) { - operatorList.addImageOps(localImage.fn, localImage.args, localImage.optionalContent); - incrementCachedImageMaskCount(localImage); + addCachedImageOps(operatorList, localImage); args = null; continue; } @@ -32185,17 +35151,9 @@ } let xobj = xobjs.getRaw(name); if (xobj instanceof Ref) { - const localImage = localImageCache.getByRef(xobj) || self._regionalImageCache.getByRef(xobj); - if (localImage) { - operatorList.addImageOps(localImage.fn, localImage.args, localImage.optionalContent); - incrementCachedImageMaskCount(localImage); - resolveXObject(); - return; - } - const globalImage = self.globalImageCache.getData(xobj, self.pageIndex); - if (globalImage) { - operatorList.addDependency(globalImage.objId); - operatorList.addImageOps(globalImage.fn, globalImage.args, globalImage.optionalContent); + const cachedImage = localImageCache.getByRef(xobj) || self._regionalImageCache.getByRef(xobj) || self.globalImageCache.getData(xobj, self.pageIndex); + if (cachedImage) { + addCachedImageOps(operatorList, cachedImage); resolveXObject(); return; } @@ -32210,7 +35168,9 @@ } if (type.name === "Form") { stateManager.save(); - self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone(), localColorSpaceCache).then(function () { + self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone({ + newPath: true + }), localColorSpaceCache, seenRefs).then(function () { stateManager.restore(); resolveXObject(); }, rejectXObject); @@ -32243,25 +35203,18 @@ })); return; case OPS.setFont: - var fontSize = args[1]; - next(self.handleSetFont(resources, args, null, operatorList, task, stateManager.state, fallbackFontDict).then(function (loadedName) { + const fontSize = args[1]; + next(self.handleSetFont(resources, args, null, operatorList, task, stateManager.state, fallbackFontDict, null, seenRefs).then(function (loadedName) { operatorList.addDependency(loadedName); operatorList.addOp(OPS.setFont, [loadedName, fontSize]); })); return; - case OPS.beginText: - parsingText = true; - break; - case OPS.endText: - parsingText = false; - break; case OPS.endInlineImage: - var cacheKey = args[0].cacheKey; + const cacheKey = args[0].cacheKey; if (cacheKey) { const localImage = localImageCache.getByName(cacheKey); if (localImage) { - operatorList.addImageOps(localImage.fn, localImage.args, localImage.optionalContent); - incrementCachedImageMaskCount(localImage); + addCachedImageOps(operatorList, localImage); args = null; continue; } @@ -32288,8 +35241,8 @@ self.ensureStateFont(stateManager.state); continue; } - var combinedGlyphs = []; - var state = stateManager.state; + const combinedGlyphs = [], + state = stateManager.state; for (const arrItem of args[0]) { if (typeof arrItem === "string") { combinedGlyphs.push(...self.handleText(arrItem, state)); @@ -32325,104 +35278,124 @@ break; case OPS.setFillColorSpace: { - const cachedColorSpace = ColorSpace.getCached(args[0], xref, localColorSpaceCache); - if (cachedColorSpace) { - stateManager.state.fillColorSpace = cachedColorSpace; + const fillCS = self._getColorSpace(args[0], resources, localColorSpaceCache); + if (fillCS instanceof ColorSpace) { + stateManager.state.fillColorSpace = fillCS; continue; } - next(self.parseColorSpace({ - cs: args[0], - resources, - localColorSpaceCache - }).then(function (colorSpace) { - if (colorSpace) { - stateManager.state.fillColorSpace = colorSpace; - } + next(self._handleColorSpace(fillCS).then(colorSpace => { + stateManager.state.fillColorSpace = colorSpace || ColorSpaceUtils.gray; })); return; } case OPS.setStrokeColorSpace: { - const cachedColorSpace = ColorSpace.getCached(args[0], xref, localColorSpaceCache); - if (cachedColorSpace) { - stateManager.state.strokeColorSpace = cachedColorSpace; + const strokeCS = self._getColorSpace(args[0], resources, localColorSpaceCache); + if (strokeCS instanceof ColorSpace) { + stateManager.state.strokeColorSpace = strokeCS; continue; } - next(self.parseColorSpace({ - cs: args[0], - resources, - localColorSpaceCache - }).then(function (colorSpace) { - if (colorSpace) { - stateManager.state.strokeColorSpace = colorSpace; - } + next(self._handleColorSpace(strokeCS).then(colorSpace => { + stateManager.state.strokeColorSpace = colorSpace || ColorSpaceUtils.gray; })); return; } case OPS.setFillColor: cs = stateManager.state.fillColorSpace; - args = cs.getRgb(args, 0); + args = [cs.getRgbHex(args, 0)]; fn = OPS.setFillRGBColor; break; case OPS.setStrokeColor: cs = stateManager.state.strokeColorSpace; - args = cs.getRgb(args, 0); + args = [cs.getRgbHex(args, 0)]; fn = OPS.setStrokeRGBColor; break; case OPS.setFillGray: - stateManager.state.fillColorSpace = ColorSpace.singletons.gray; - args = ColorSpace.singletons.gray.getRgb(args, 0); + stateManager.state.fillColorSpace = ColorSpaceUtils.gray; + args = [ColorSpaceUtils.gray.getRgbHex(args, 0)]; fn = OPS.setFillRGBColor; break; case OPS.setStrokeGray: - stateManager.state.strokeColorSpace = ColorSpace.singletons.gray; - args = ColorSpace.singletons.gray.getRgb(args, 0); + stateManager.state.strokeColorSpace = ColorSpaceUtils.gray; + args = [ColorSpaceUtils.gray.getRgbHex(args, 0)]; fn = OPS.setStrokeRGBColor; break; case OPS.setFillCMYKColor: - stateManager.state.fillColorSpace = ColorSpace.singletons.cmyk; - args = ColorSpace.singletons.cmyk.getRgb(args, 0); + stateManager.state.fillColorSpace = ColorSpaceUtils.cmyk; + args = [ColorSpaceUtils.cmyk.getRgbHex(args, 0)]; fn = OPS.setFillRGBColor; break; case OPS.setStrokeCMYKColor: - stateManager.state.strokeColorSpace = ColorSpace.singletons.cmyk; - args = ColorSpace.singletons.cmyk.getRgb(args, 0); + stateManager.state.strokeColorSpace = ColorSpaceUtils.cmyk; + args = [ColorSpaceUtils.cmyk.getRgbHex(args, 0)]; fn = OPS.setStrokeRGBColor; break; case OPS.setFillRGBColor: - stateManager.state.fillColorSpace = ColorSpace.singletons.rgb; - args = ColorSpace.singletons.rgb.getRgb(args, 0); + stateManager.state.fillColorSpace = ColorSpaceUtils.rgb; + args = [ColorSpaceUtils.rgb.getRgbHex(args, 0)]; break; case OPS.setStrokeRGBColor: - stateManager.state.strokeColorSpace = ColorSpace.singletons.rgb; - args = ColorSpace.singletons.rgb.getRgb(args, 0); + stateManager.state.strokeColorSpace = ColorSpaceUtils.rgb; + args = [ColorSpaceUtils.rgb.getRgbHex(args, 0)]; break; case OPS.setFillColorN: - cs = stateManager.state.fillColorSpace; + cs = stateManager.state.patternFillColorSpace; + if (!cs) { + if (isNumberArray(args, null)) { + args = [ColorSpaceUtils.gray.getRgbHex(args, 0)]; + fn = OPS.setFillRGBColor; + break; + } + args = []; + fn = OPS.setFillTransparent; + break; + } if (cs.name === "Pattern") { - next(self.handleColorN(operatorList, OPS.setFillColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache)); + next(self.handleColorN(operatorList, OPS.setFillColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache, seenRefs)); return; } - args = cs.getRgb(args, 0); + args = [cs.getRgbHex(args, 0)]; fn = OPS.setFillRGBColor; break; case OPS.setStrokeColorN: - cs = stateManager.state.strokeColorSpace; + cs = stateManager.state.patternStrokeColorSpace; + if (!cs) { + if (isNumberArray(args, null)) { + args = [ColorSpaceUtils.gray.getRgbHex(args, 0)]; + fn = OPS.setStrokeRGBColor; + break; + } + args = []; + fn = OPS.setStrokeTransparent; + break; + } if (cs.name === "Pattern") { - next(self.handleColorN(operatorList, OPS.setStrokeColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache)); + next(self.handleColorN(operatorList, OPS.setStrokeColorN, args, cs, patterns, resources, task, localColorSpaceCache, localTilingPatternCache, localShadingPatternCache, seenRefs)); return; } - args = cs.getRgb(args, 0); + args = [cs.getRgbHex(args, 0)]; fn = OPS.setStrokeRGBColor; break; case OPS.shadingFill: - var shadingRes = resources.get("Shading"); - if (!shadingRes) { - throw new FormatError("No shading resource found"); - } - var shading = shadingRes.get(args[0].name); - if (!shading) { - throw new FormatError("No shading object found"); + let shading; + try { + const shadingRes = resources.get("Shading"); + if (!shadingRes) { + throw new FormatError("No shading resource found"); + } + shading = shadingRes.get(args[0].name); + if (!shading) { + throw new FormatError("No shading object found"); + } + } catch (reason) { + if (reason instanceof AbortException) { + continue; + } + if (self.options.ignoreErrors) { + warn(`getOperatorList - ignoring Shading: "${reason}".`); + continue; + } + throw reason; } const patternId = self.parseShading({ shading, @@ -32469,7 +35442,8 @@ task, stateManager, localGStateCache, - localColorSpaceCache + localColorSpaceCache, + seenRefs }).then(resolveGState, rejectGState); }).catch(function (reason) { if (reason instanceof AbortException) { @@ -32482,6 +35456,33 @@ throw reason; })); return; + case OPS.setLineWidth: + { + const [thickness] = args; + if (typeof thickness !== "number") { + warn(`Invalid setLineWidth: ${thickness}`); + continue; + } + args[0] = Math.abs(thickness); + break; + } + case OPS.setDash: + { + const dashPhase = args[1]; + if (typeof dashPhase !== "number") { + warn(`Invalid setDash: ${dashPhase}`); + continue; + } + const dashArray = args[0]; + if (!Array.isArray(dashArray)) { + warn(`Invalid setDash: ${dashArray}`); + continue; + } + if (dashArray.some(x => typeof x !== "number")) { + args[0] = dashArray.filter(x => typeof x === "number"); + } + break; + } case OPS.moveTo: case OPS.lineTo: case OPS.curveTo: @@ -32489,7 +35490,38 @@ case OPS.curveTo3: case OPS.closePath: case OPS.rectangle: - self.buildPath(operatorList, fn, args, parsingText); + self.buildPath(fn, args, stateManager.state); + continue; + case OPS.stroke: + case OPS.closeStroke: + case OPS.fill: + case OPS.eoFill: + case OPS.fillStroke: + case OPS.eoFillStroke: + case OPS.closeFillStroke: + case OPS.closeEOFillStroke: + case OPS.endPath: + { + const { + state: { + pathBuffer, + pathMinMax + } + } = stateManager; + if (fn === OPS.closeStroke || fn === OPS.closeFillStroke || fn === OPS.closeEOFillStroke) { + pathBuffer.push(DrawOPS.closePath); + } + if (pathBuffer.length === 0) { + operatorList.addOp(OPS.constructPath, [fn, [null], null]); + } else { + operatorList.addOp(OPS.constructPath, [fn, [new Float32Array(pathBuffer)], pathMinMax.slice()]); + pathBuffer.length = 0; + pathMinMax.set(BBOX_INIT, 0); + } + continue; + } + case OPS.setTextMatrix: + operatorList.addOp(fn, [new Float32Array(args)]); continue; case OPS.markPoint: case OPS.markPointProps: @@ -32555,7 +35587,7 @@ throw reason; }); } - getTextContent({ + async getTextContent({ stream, task, resources, @@ -32564,10 +35596,28 @@ sink, seenStyles = new Set(), viewBox, + lang = null, markedContentData = null, disableNormalization = false, - keepWhiteSpace = false + keepWhiteSpace = false, + prevRefs = null, + intersector = null }) { + if (stream.isAsync) { + const bytes = await stream.asyncGetBytes(); + if (bytes) { + stream = new Stream(bytes, 0, bytes.length, stream.dict); + } + } + sink ??= textSinkWrapper(null); + const objId = stream.dict?.objId; + const seenRefs = new RefSet(prevRefs); + if (objId) { + if (prevRefs?.has(objId)) { + throw new Error(`getTextContent - ignoring circular reference: ${objId}`); + } + seenRefs.put(objId); + } resources ||= Dict.empty; stateManager ||= new StateManager(new TextState()); if (includeMarkedContent) { @@ -32577,7 +35627,8 @@ } const textContent = { items: [], - styles: Object.create(null) + styles: Object.create(null), + lang }; const textContentItem = { initialized: false, @@ -32588,6 +35639,7 @@ height: 0, vertical: false, prevTransform: null, + prevTextRise: 0, textAdvanceScale: 0, spaceInFlowMin: 0, spaceInFlowMax: 0, @@ -32627,13 +35679,14 @@ const emptyXObjectCache = new LocalImageCache(); const emptyGStateCache = new LocalGStateCache(); const preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); - let textState; + let textState, currentTextState; function pushWhitespace({ width = 0, height = 0, transform = textContentItem.prevTransform, fontName = textContentItem.fontName }) { + intersector?.addExtraChar(" "); textContent.items.push({ str: " ", dir: "ltr", @@ -32739,12 +35792,7 @@ }; } async function handleSetFont(fontName, fontRef) { - const translated = await self.loadFont(fontName, fontRef, resources); - if (translated.font.isType3Font) { - try { - await translated.loadType3Data(self, resources, task); - } catch {} - } + const translated = await self.loadFont(fontName, fontRef, resources, task, null, null, seenRefs); textState.loadedName = translated.loadedName; textState.font = translated.font; textState.fontMatrix = translated.font.fontMatrix || FONT_IDENTITY_MATRIX; @@ -32799,7 +35847,7 @@ if (textState.font.vertical) { const advanceY = (lastPosY - posY) / textContentItem.textAdvanceScale; const advanceX = posX - lastPosX; - const textOrientation = Math.sign(textContentItem.height); + const textOrientation = Math.sign(textContentItem.height || textContentItem.totalHeight); if (advanceY < textOrientation * textContentItem.negativeSpaceMax) { if (Math.abs(advanceX) > 0.5 * textContentItem.width) { appendEOL(); @@ -32843,7 +35891,7 @@ } const advanceX = (posX - lastPosX) / textContentItem.textAdvanceScale; const advanceY = posY - lastPosY; - const textOrientation = Math.sign(textContentItem.width); + const textOrientation = Math.sign(textContentItem.width || textContentItem.totalWidth); if (advanceX < textOrientation * textContentItem.negativeSpaceMax) { if (Math.abs(advanceY) > 0.5 * textContentItem.height) { appendEOL(); @@ -32853,7 +35901,9 @@ flushTextContentItem(); return true; } - if (Math.abs(advanceY) > textContentItem.height) { + const textRiseDelta = textState.textRise - textContentItem.prevTextRise; + const advanceYCorrected = textRiseDelta === 0 ? advanceY : advanceY - currentTransform[3] / textState.fontSize * textRiseDelta; + if (Math.abs(advanceYCorrected) > textContentItem.height) { appendEOL(); return true; } @@ -32889,9 +35939,14 @@ chars, extraSpacing }) { + if (currentTextState !== textState && (currentTextState.fontSize !== textState.fontSize || currentTextState.fontName !== textState.fontName && (currentTextState.font.name !== textState.font.name || currentTextState.font.vertical !== textState.font.vertical))) { + flushTextContentItem(); + currentTextState = textState.clone(); + } const font = textState.font; + const baseCharSpacing = font.vertical ? -textState.charSpacing : textState.charSpacing; if (!chars) { - const charSpacing = textState.charSpacing + extraSpacing; + const charSpacing = baseCharSpacing + extraSpacing; if (charSpacing) { if (!font.vertical) { textState.translateTextMatrix(charSpacing * textState.textHScale, 0); @@ -32909,23 +35964,27 @@ for (let i = 0, ii = glyphs.length; i < ii; i++) { const glyph = glyphs[i]; const { - category + category, + originalCharCode } = glyph; if (category.isInvisibleFormatMark) { continue; } - let charSpacing = textState.charSpacing + (i + 1 === ii ? extraSpacing : 0); + let charSpacing = baseCharSpacing + (i + 1 === ii ? extraSpacing : 0); let glyphWidth = glyph.width; if (font.vertical) { glyphWidth = glyph.vmetric ? glyph.vmetric[0] : -glyphWidth; } let scaledDim = glyphWidth * scale; + if (originalCharCode === 0x20) { + charSpacing += textState.wordSpacing; + } if (!keepWhiteSpace && category.isWhitespace) { if (!font.vertical) { - charSpacing += scaledDim + textState.wordSpacing; + charSpacing += scaledDim; textState.translateTextMatrix(charSpacing * textState.textHScale, 0); } else { - charSpacing += -scaledDim + textState.wordSpacing; + charSpacing += -scaledDim; textState.translateTextMatrix(0, -charSpacing); } saveLastChar(" "); @@ -32945,21 +36004,27 @@ } if (!font.vertical) { scaledDim *= textState.textHScale; + intersector?.addGlyph(getCurrentTextTransform(), scaledDim, 0, glyph.unicode); textState.translateTextMatrix(scaledDim, 0); textChunk.width += scaledDim; } else { + intersector?.addGlyph(getCurrentTextTransform(), 0, scaledDim, glyph.unicode); textState.translateTextMatrix(0, scaledDim); scaledDim = Math.abs(scaledDim); textChunk.height += scaledDim; } if (scaledDim) { textChunk.prevTransform = getCurrentTextTransform(); + textChunk.prevTextRise = textState.textRise; } const glyphUnicode = glyph.unicode; if (saveLastChar(glyphUnicode)) { textChunk.str.push(" "); + intersector?.addExtraChar(" "); + } + if (!intersector) { + textChunk.str.push(glyphUnicode); } - textChunk.str.push(glyphUnicode); if (charSpacing) { if (!font.vertical) { textState.translateTextMatrix(charSpacing * textState.textHScale, 0); @@ -32970,6 +36035,7 @@ } } function appendEOL() { + intersector?.addExtraChar("\n"); resetLastChars(); if (textContentItem.initialized) { textContentItem.hasEOL = true; @@ -32991,6 +36057,7 @@ if (textContentItem.initialized) { resetLastChars(); textContentItem.str.push(" "); + intersector?.addExtraChar(" "); } return false; } @@ -33051,6 +36118,8 @@ timeSlotManager.reset(); const operation = {}; let stop, + name, + isValidName, args = []; while (!(stop = timeSlotManager.check())) { args.length = 0; @@ -33058,18 +36127,17 @@ if (!preprocessor.read(operation)) { break; } - const previousState = textState; textState = stateManager.state; + currentTextState ||= textState.clone(); const fn = operation.fn; args = operation.args; switch (fn | 0) { case OPS.setFont: - var fontNameArg = args[0].name, + const fontNameArg = args[0].name, fontSizeArg = args[1]; if (textState.font && fontNameArg === textState.fontName && fontSizeArg === textState.fontSize) { break; } - flushTextContentItem(); textState.fontName = fontNameArg; textState.fontSize = fontSizeArg; next(handleSetFont(fontNameArg, null)); @@ -33175,11 +36243,9 @@ break; case OPS.paintXObject: flushTextContentItem(); - if (!xobjs) { - xobjs = resources.get("XObject") || Dict.empty; - } - var isValidName = args[0] instanceof Name; - var name = args[0].name; + xobjs ??= resources.get("XObject") || Dict.empty; + isValidName = args[0] instanceof Name; + name = args[0].name; if (isValidName && emptyXObjectCache.getByName(name)) { break; } @@ -33203,50 +36269,44 @@ if (!(xobj instanceof BaseStream)) { throw new FormatError("XObject should be a stream"); } - const type = xobj.dict.get("Subtype"); + const { + dict + } = xobj; + const type = dict.get("Subtype"); if (!(type instanceof Name)) { throw new FormatError("XObject should have a Name subtype"); } if (type.name !== "Form") { - emptyXObjectCache.set(name, xobj.dict.objId, true); + emptyXObjectCache.set(name, dict.objId, true); resolveXObject(); return; } const currentState = stateManager.state.clone(); const xObjStateManager = new StateManager(currentState); - const matrix = xobj.dict.getArray("Matrix"); - if (Array.isArray(matrix) && matrix.length === 6) { + const matrix = lookupMatrix(dict.getArray("Matrix"), null); + if (matrix) { xObjStateManager.transform(matrix); } + const localResources = dict.get("Resources"); enqueueChunk(); - const sinkWrapper = { - enqueueInvoked: false, - enqueue(chunk, size) { - this.enqueueInvoked = true; - sink.enqueue(chunk, size); - }, - get desiredSize() { - return sink.desiredSize; - }, - get ready() { - return sink.ready; - } - }; + const sinkWrapper = textSinkWrapper(sink); self.getTextContent({ stream: xobj, task, - resources: xobj.dict.get("Resources") || resources, + resources: localResources instanceof Dict ? localResources : resources, stateManager: xObjStateManager, includeMarkedContent, sink: sinkWrapper, seenStyles, viewBox, + lang, markedContentData, disableNormalization, - keepWhiteSpace + keepWhiteSpace, + prevRefs: seenRefs }).then(function () { if (!sinkWrapper.enqueueInvoked) { - emptyXObjectCache.set(name, xobj.dict.objId, true); + emptyXObjectCache.set(name, dict.objId, true); } resolveXObject(); }, rejectXObject); @@ -33314,10 +36374,7 @@ flushTextContentItem(); if (includeMarkedContent) { markedContentData.level++; - let mcid = null; - if (args[1] instanceof Dict) { - mcid = args[1].get("MCID"); - } + const mcid = args[1] instanceof Dict ? args[1].get("MCID") : null; textContent.items.push({ type: "beginMarkedContentProps", id: Number.isInteger(mcid) ? `${self.idFactory.getPageObjId()}_mc${mcid}` : null, @@ -33337,11 +36394,6 @@ }); } break; - case OPS.restore: - if (previousState && (previousState.font !== textState.font || previousState.fontSize !== textState.fontSize || previousState.fontName !== textState.fontName)) { - flushTextContentItem(); - } - break; } if (textContent.items.length >= sink.desiredSize) { stop = true; @@ -33374,7 +36426,7 @@ const toUnicodePromise = this.readToUnicode(properties.toUnicode); if (properties.composite) { const cidSystemInfo = dict.get("CIDSystemInfo"); - if (cidSystemInfo instanceof Dict) { + if (cidSystemInfo instanceof Dict && !properties.cidSystemInfo) { properties.cidSystemInfo = { registry: stringToPDFString(cidSystemInfo.get("Registry")), ordering: stringToPDFString(cidSystemInfo.get("Ordering")), @@ -33433,11 +36485,37 @@ if (baseEncodingName && nonEmbeddedFont && isSymbolsFontName) { baseEncodingName = null; } + if (baseEncodingName === "WinAnsiEncoding" && nonEmbeddedFont && properties.name?.charCodeAt(0) >= 0xb7) { + const fontName = properties.name; + const chineseFontNames = ["\xCB\xCE\xCC\xE5", "\xBA\xDA\xCC\xE5", "\xBF\xAC\xCC\xE5", "\xB7\xC2\xCB\xCE", "\xBF\xAC\xCC\xE5_GB2312", "\xB7\xC2\xCB\xCE_GB2312", "\xC1\xA5\xCA\xE9", "\xD0\xC2\xCB\xCE", "\xB7\xC2\xCB\xCE\xCC\xE5", "\xD0\xA1\xB1\xEA\xCB\xCE"]; + if (chineseFontNames.includes(fontName)) { + baseEncodingName = null; + properties.defaultEncoding = "Adobe-GB1-UCS2"; + properties.composite = true; + properties.cidEncoding = Name.get("GBK-EUC-H"); + const cMap = await CMapFactory.create({ + encoding: properties.cidEncoding, + fetchBuiltInCMap: this._fetchBuiltInCMapBound, + useCMap: null + }); + properties.cMap = cMap; + properties.vertical = properties.cMap.vertical; + properties.cidSystemInfo = { + registry: "Adobe", + ordering: "GB1", + supplement: 0 + }; + } + } if (baseEncodingName) { properties.defaultEncoding = getEncoding(baseEncodingName); } else { - const isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); + let isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); const isNonsymbolicFont = !!(properties.flags & FontFlags.Nonsymbolic); + if (properties.type === "TrueType" && isSymbolicFont && isNonsymbolicFont && differences.length !== 0) { + properties.flags &= ~FontFlags.Symbolic; + isSymbolicFont = false; + } encoding = StandardEncoding; if (properties.type === "TrueType" && !isNonsymbolicFont) { encoding = WinAnsiEncoding; @@ -33619,6 +36697,9 @@ map[charCode] = String.fromCodePoint(token); return; } + if (token.length % 2 !== 0) { + token = "\u0000" + token; + } const str = []; for (let k = 0; k < token.length; k += 2) { const w1 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1); @@ -33664,56 +36745,85 @@ let defaultWidth = 0; const glyphsVMetrics = []; let defaultVMetrics; - let i, ii, j, jj, start, code, widths; if (properties.composite) { - defaultWidth = dict.has("DW") ? dict.get("DW") : 1000; - widths = dict.get("W"); - if (widths) { - for (i = 0, ii = widths.length; i < ii; i++) { - start = xref.fetchIfRef(widths[i++]); - code = xref.fetchIfRef(widths[i]); + const dw = dict.get("DW"); + defaultWidth = typeof dw === "number" ? Math.ceil(dw) : 1000; + const widths = dict.get("W"); + if (Array.isArray(widths)) { + for (let i = 0, ii = widths.length; i < ii; i++) { + let start = xref.fetchIfRef(widths[i++]); + if (!Number.isInteger(start)) { + break; + } + const code = xref.fetchIfRef(widths[i]); if (Array.isArray(code)) { - for (j = 0, jj = code.length; j < jj; j++) { - glyphsWidths[start++] = xref.fetchIfRef(code[j]); + for (const c of code) { + const width = xref.fetchIfRef(c); + if (typeof width === "number") { + glyphsWidths[start] = width; + } + start++; } - } else { + } else if (Number.isInteger(code)) { const width = xref.fetchIfRef(widths[++i]); - for (j = start; j <= code; j++) { + if (typeof width !== "number") { + continue; + } + for (let j = start; j <= code; j++) { glyphsWidths[j] = width; } + } else { + break; } } } if (properties.vertical) { - let vmetrics = dict.getArray("DW2") || [880, -1000]; + const dw2 = dict.getArray("DW2"); + let vmetrics = isNumberArray(dw2, 2) ? dw2 : [880, -1000]; defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]]; vmetrics = dict.get("W2"); - if (vmetrics) { - for (i = 0, ii = vmetrics.length; i < ii; i++) { - start = xref.fetchIfRef(vmetrics[i++]); - code = xref.fetchIfRef(vmetrics[i]); + if (Array.isArray(vmetrics)) { + for (let i = 0, ii = vmetrics.length; i < ii; i++) { + let start = xref.fetchIfRef(vmetrics[i++]); + if (!Number.isInteger(start)) { + break; + } + const code = xref.fetchIfRef(vmetrics[i]); if (Array.isArray(code)) { - for (j = 0, jj = code.length; j < jj; j++) { - glyphsVMetrics[start++] = [xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j])]; + for (let j = 0, jj = code.length; j < jj; j++) { + const vmetric = [xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j])]; + if (isNumberArray(vmetric, null)) { + glyphsVMetrics[start] = vmetric; + } + start++; } - } else { + } else if (Number.isInteger(code)) { const vmetric = [xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i])]; - for (j = start; j <= code; j++) { + if (!isNumberArray(vmetric, null)) { + continue; + } + for (let j = start; j <= code; j++) { glyphsVMetrics[j] = vmetric; } + } else { + break; } } } } } else { - const firstChar = properties.firstChar; - widths = dict.get("Widths"); - if (widths) { - j = firstChar; - for (i = 0, ii = widths.length; i < ii; i++) { - glyphsWidths[j++] = xref.fetchIfRef(widths[i]); + const widths = dict.get("Widths"); + if (Array.isArray(widths)) { + let j = properties.firstChar; + for (const w of widths) { + const width = xref.fetchIfRef(w); + if (typeof width === "number") { + glyphsWidths[j] = width; + } + j++; } - defaultWidth = parseFloat(descriptor.get("MissingWidth")) || 0; + const missingWidth = descriptor.get("MissingWidth"); + defaultWidth = typeof missingWidth === "number" ? missingWidth : 0; } else { const baseFontName = dict.get("BaseFont"); if (baseFontName instanceof Name) { @@ -33751,19 +36861,17 @@ } isSerifFont(baseFontName) { const fontNameWoStyle = baseFontName.split("-", 1)[0]; - return fontNameWoStyle in getSerifFonts() || /serif/gi.test(fontNameWoStyle); + return fontNameWoStyle in getSerifFonts() || /serif/i.test(fontNameWoStyle); } getBaseFontMetrics(name) { let defaultWidth = 0; let widths = Object.create(null); let monospace = false; + let fontName = normalizeFontName(name); const stdFontMap = getStdFontMap(); - let lookupName = stdFontMap[name] || name; + fontName = stdFontMap[fontName] || fontName; const Metrics = getMetrics(); - if (!(lookupName in Metrics)) { - lookupName = this.isSerifFont(name) ? "Times-Roman" : "Helvetica"; - } - const glyphWidths = Metrics[lookupName]; + const glyphWidths = Metrics[fontName] ?? Metrics[this.isSerifFont(name) ? "Times-Roman" : "Helvetica"]; if (typeof glyphWidths === "number") { defaultWidth = glyphWidths; monospace = true; @@ -33815,8 +36923,14 @@ } composite = true; } - const firstChar = dict.get("FirstChar") || 0, - lastChar = dict.get("LastChar") || (composite ? 0xffff : 0xff); + let firstChar = dict.get("FirstChar"); + if (!Number.isInteger(firstChar)) { + firstChar = 0; + } + let lastChar = dict.get("LastChar"); + if (!Number.isInteger(lastChar)) { + lastChar = composite ? 0xffff : 0xff; + } const descriptor = dict.get("FontDescriptor"); const toUnicode = dict.get("ToUnicode") || baseDict.get("ToUnicode"); if (descriptor) { @@ -33849,7 +36963,7 @@ } hash.update(`${firstChar}-${lastChar}`); if (toUnicode instanceof BaseStream) { - const stream = toUnicode.str || toUnicode; + const stream = toUnicode.stream || toUnicode; const uint8array = stream.buffer ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : new Uint8Array(stream.bytes.buffer, stream.start, stream.end - stream.start); hash.update(uint8array); } else if (toUnicode instanceof Name) { @@ -33894,6 +37008,14 @@ hash.update(cidToGidMap.peekBytes()); } } + if (type.name === "Type3") { + const charProcs = baseDict.get("CharProcs"); + if (charProcs instanceof Dict) { + for (const [key, entry] of charProcs.getRawEntries()) { + hash.update(entry instanceof Ref ? `${key}\0${entry}` : key); + } + } + } } return { descriptor, @@ -33921,15 +37043,15 @@ const isType3Font = type === "Type3"; if (!descriptor) { if (isType3Font) { - descriptor = new Dict(null); - descriptor.set("FontName", Name.get(type)); - descriptor.set("FontBBox", dict.getArray("FontBBox") || [0, 0, 0, 0]); + descriptor = Dict.empty; + } else if (composite) { + descriptor = Dict.empty; } else { let baseFontName = dict.get("BaseFont"); if (!(baseFontName instanceof Name)) { throw new FormatError("Base font is not specified"); } - baseFontName = baseFontName.name.replaceAll(/[,_]/g, "-"); + baseFontName = normalizeFontName(baseFontName.name); const metrics = this.getBaseFontMetrics(baseFontName); const fontNameWoStyle = baseFontName.split("-", 1)[0]; const flags = (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) | (metrics.monospace ? FontFlags.FixedPitch : 0) | (getSymbolsFonts()[fontNameWoStyle] ? FontFlags.Symbolic : FontFlags.Nonsymbolic); @@ -33958,20 +37080,24 @@ properties.isInternalFont = !!file; } if (!properties.isInternalFont && this.options.useSystemFonts) { - properties.systemFontInfo = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, baseFontName, standardFontName); + properties.systemFontInfo = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, baseFontName, standardFontName, type); } const newProperties = await this.extractDataStructures(dict, properties); - if (widths) { + if (Array.isArray(widths)) { const glyphWidths = []; let j = firstChar; - for (const width of widths) { - glyphWidths[j++] = this.xref.fetchIfRef(width); + for (const w of widths) { + const width = this.xref.fetchIfRef(w); + if (typeof width === "number") { + glyphWidths[j] = width; + } + j++; } newProperties.widths = glyphWidths; } else { newProperties.widths = this.buildCharCodeToWidth(metrics.widths, newProperties); } - return new Font(baseFontName, file, newProperties); + return new Font(baseFontName, file, newProperties, this.options); } } let fontName = descriptor.get("FontName"); @@ -33984,25 +37110,50 @@ } const fontNameStr = fontName?.name; const baseFontStr = baseFont?.name; - if (!isType3Font && fontNameStr !== baseFontStr) { + if (isType3Font) { + if (!fontNameStr) { + fontName = Name.get(type); + } + } else if (fontNameStr !== baseFontStr) { info(`The FontDescriptor's FontName is "${fontNameStr}" but ` + `should be the same as the Font's BaseFont "${baseFontStr}".`); if (fontNameStr && baseFontStr && (baseFontStr.startsWith(fontNameStr) || !isKnownFontName(fontNameStr) && isKnownFontName(baseFontStr))) { fontName = null; } + fontName ||= baseFont; } - fontName ||= baseFont; if (!(fontName instanceof Name)) { throw new FormatError("invalid font name"); } - let fontFile, subtype, length1, length2, length3; + let fontFile, fontFileN, subtype, length1, length2, length3; try { - fontFile = descriptor.get("FontFile", "FontFile2", "FontFile3"); + for (const n of ["FontFile", "FontFile2", "FontFile3"]) { + fontFile = descriptor.get(n); + if (fontFile) { + fontFileN = n; + break; + } + } + if (fontFile) { + if (!(fontFile instanceof BaseStream)) { + throw new FormatError("FontFile should be a stream"); + } else { + if (fontFile.isAsync) { + const bytes = await fontFile.asyncGetBytes(); + if (bytes) { + fontFile = new Stream(bytes, 0, bytes.length, fontFile.dict); + } + } + if (fontFile.isEmpty) { + throw new FormatError("FontFile is empty"); + } + } + } } catch (ex) { if (!this.options.ignoreErrors) { throw ex; } warn(`translateFont - fetching "${fontName.name}" font file: "${ex}".`); - fontFile = new NullStream(); + fontFile = null; } let isInternalFont = false; let glyphScaleFactors = null; @@ -34035,14 +37186,41 @@ isInternalFont = !!fontFile; } if (!isInternalFont && this.options.useSystemFonts) { - systemFontInfo = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, fontName.name, standardFontName); + systemFontInfo = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, fontName.name, standardFontName, type); } } + const fontMatrix = lookupMatrix(dict.getArray("FontMatrix"), FONT_IDENTITY_MATRIX); + const bbox = lookupNormalRect(descriptor.getArray("FontBBox") || dict.getArray("FontBBox"), isType3Font ? [0, 0, 0, 0] : undefined); + let ascent = descriptor.get("Ascent"); + if (typeof ascent !== "number") { + ascent = undefined; + } + let descent = descriptor.get("Descent"); + if (typeof descent !== "number") { + descent = undefined; + } + let xHeight = descriptor.get("XHeight"); + if (typeof xHeight !== "number") { + xHeight = 0; + } + let capHeight = descriptor.get("CapHeight"); + if (typeof capHeight !== "number") { + capHeight = 0; + } + let flags = descriptor.get("Flags"); + if (!Number.isInteger(flags)) { + flags = 0; + } + let italicAngle = descriptor.get("ItalicAngle"); + if (typeof italicAngle !== "number") { + italicAngle = 0; + } const properties = { type, name: fontName.name, subtype, file: fontFile, + fontFileN, length1, length2, length3, @@ -34050,17 +37228,17 @@ loadedName: baseDict.loadedName, composite, fixedPitch: false, - fontMatrix: dict.getArray("FontMatrix") || FONT_IDENTITY_MATRIX, + fontMatrix, firstChar, lastChar, toUnicode, - bbox: descriptor.getArray("FontBBox") || dict.getArray("FontBBox"), - ascent: descriptor.get("Ascent"), - descent: descriptor.get("Descent"), - xHeight: descriptor.get("XHeight") || 0, - capHeight: descriptor.get("CapHeight") || 0, - flags: descriptor.get("Flags"), - italicAngle: descriptor.get("ItalicAngle") || 0, + bbox, + ascent, + descent, + xHeight, + capHeight, + flags, + italicAngle, isType3Font, cssFontInfo, scaleFactors: glyphScaleFactors, @@ -34081,7 +37259,19 @@ } const newProperties = await this.extractDataStructures(dict, properties); this.extractWidths(dict, descriptor, newProperties); - return new Font(fontName.name, fontFile, newProperties); + const font = new Font(fontName.name, fontFile, newProperties, this.options); + if (font.missingFile && !font.systemFontInfo && !isType3Font && this.options.useSystemFonts) { + const standardFontName = getStandardFontName(fontName.name); + const substitution = getFontSubstitution(this.systemFontCache, this.idFactory, this.options.standardFontDataUrl, fontName.name, standardFontName, type); + if (substitution) { + if (substitution.guessFallback) { + substitution.guessFallback = false; + substitution.css += `,${font.fallbackName}`; + } + font.systemFontInfo = substitution; + } + } + return font; } static buildFontPaths(font, glyphs, handler, evaluatorOptions) { function buildPath(fontChar) { @@ -34090,7 +37280,8 @@ if (font.renderer.hasBuiltPath(fontChar)) { return; } - handler.send("commonobj", [glyphName, "FontPath", font.renderer.getPathJs(fontChar)]); + const buffer = compileFontPathInfo(font.renderer.getPathJs(fontChar)); + handler.send("commonobj", [glyphName, "FontPath", buffer], [buffer]); } catch (reason) { if (evaluatorOptions.ignoreErrors) { warn(`buildFontPaths - ignoring ${glyphName} glyph: "${reason}".`); @@ -34117,59 +37308,58 @@ } } class TranslatedFont { + #sent = false; + #type3Loaded = null; constructor({ loadedName, font, - dict, - evaluatorOptions + dict }) { this.loadedName = loadedName; this.font = font; this.dict = dict; - this._evaluatorOptions = evaluatorOptions || DefaultPartialEvaluatorOptions; - this.type3Loaded = null; this.type3Dependencies = font.isType3Font ? new Set() : null; - this.sent = false; } send(handler) { - if (this.sent) { + if (this.#sent) { return; } - this.sent = true; - handler.send("commonobj", [this.loadedName, "Font", this.font.exportData(this._evaluatorOptions.fontExtraProperties)]); + this.#sent = true; + const fontData = this.font.exportData(), + transfers = fontData.buffer ? [fontData.buffer] : null; + handler.send("commonobj", [this.loadedName, "Font", fontData], transfers); } - fallback(handler) { + fallback(handler, evaluatorOptions) { if (!this.font.data) { return; } this.font.disableFontFace = true; - PartialEvaluator.buildFontPaths(this.font, this.font.glyphCacheValues, handler, this._evaluatorOptions); + PartialEvaluator.buildFontPaths(this.font, this.font.glyphCacheValues, handler, evaluatorOptions); } - loadType3Data(evaluator, resources, task) { - if (this.type3Loaded) { - return this.type3Loaded; - } - if (!this.font.isType3Font) { - throw new Error("Must be a Type3 font."); + loadType3Data(evaluator, resources, task, seenRefs = null) { + if (this.#type3Loaded) { + return this.#type3Loaded; } + const { + font, + type3Dependencies + } = this; + assert(font.isType3Font, "Must be a Type3 font."); const type3Evaluator = evaluator.clone({ ignoreErrors: false }); - type3Evaluator.parsingType3Font = true; const type3FontRefs = new RefSet(evaluator.type3FontRefs); if (this.dict.objId && !type3FontRefs.has(this.dict.objId)) { type3FontRefs.put(this.dict.objId); } type3Evaluator.type3FontRefs = type3FontRefs; - const translatedFont = this.font, - type3Dependencies = this.type3Dependencies; let loadCharProcsPromise = Promise.resolve(); const charProcs = this.dict.get("CharProcs"); const fontResources = this.dict.get("Resources") || resources; const charProcOperatorList = Object.create(null); - const fontBBox = Util.normalizeRect(translatedFont.bbox || [0, 0, 0, 0]), - width = fontBBox[2] - fontBBox[0], - height = fontBBox[3] - fontBBox[1]; + const [x0, y0, x1, y1] = font.bbox, + width = x1 - x0, + height = y1 - y0; const fontBBoxSize = Math.hypot(width, height); for (const key of charProcs.getKeys()) { loadCharProcsPromise = loadCharProcsPromise.then(() => { @@ -34179,10 +37369,18 @@ stream: glyphStream, task, resources: fontResources, - operatorList + operatorList, + prevRefs: seenRefs }).then(() => { - if (operatorList.fnArray[0] === OPS.setCharWidthAndBounds) { - this._removeType3ColorOperators(operatorList, fontBBoxSize); + switch (operatorList.fnArray[0]) { + case OPS.setCharWidthAndBounds: + this.#removeType3ColorOperators(operatorList, fontBBoxSize); + break; + case OPS.setCharWidth: + if (!fontBBoxSize) { + this.#guessType3FontBBox(operatorList); + } + break; } charProcOperatorList[key] = operatorList.getIR(); for (const dependency of operatorList.dependencies) { @@ -34195,16 +37393,16 @@ }); }); } - this.type3Loaded = loadCharProcsPromise.then(() => { - translatedFont.charProcOperatorList = charProcOperatorList; + this.#type3Loaded = loadCharProcsPromise.then(() => { + font.charProcOperatorList = charProcOperatorList; if (this._bbox) { - translatedFont.isCharBBox = true; - translatedFont.bbox = this._bbox; + font.isCharBBox = true; + font.bbox = this._bbox; } }); - return this.type3Loaded; + return this.#type3Loaded; } - _removeType3ColorOperators(operatorList, fontBBoxSize = NaN) { + #removeType3ColorOperators(operatorList, fontBBoxSize = NaN) { const charBBox = Util.normalizeRect(operatorList.argsArray[0].slice(2)), width = charBBox[2] - charBBox[0], height = charBBox[3] - charBBox[1]; @@ -34213,13 +37411,8 @@ operatorList.fnArray.splice(0, 1); operatorList.argsArray.splice(0, 1); } else if (fontBBoxSize === 0 || Math.round(charBBoxSize / fontBBoxSize) >= 10) { - if (!this._bbox) { - this._bbox = [Infinity, Infinity, -Infinity, -Infinity]; - } - this._bbox[0] = Math.min(this._bbox[0], charBBox[0]); - this._bbox[1] = Math.min(this._bbox[1], charBBox[1]); - this._bbox[2] = Math.max(this._bbox[2], charBBox[2]); - this._bbox[3] = Math.max(this._bbox[3], charBBox[3]); + this._bbox ??= BBOX_INIT.slice(); + Util.rectBoundingBox(...charBBox, this._bbox); } let i = 0, ii = operatorList.length; @@ -34270,6 +37463,20 @@ i++; } } + #guessType3FontBBox(operatorList) { + let i = 1; + const ii = operatorList.length; + while (i < ii) { + switch (operatorList.fnArray[i]) { + case OPS.constructPath: + const minMax = operatorList.argsArray[i][2]; + this._bbox ??= BBOX_INIT.slice(); + Util.rectBoundingBox(...minMax, this._bbox); + break; + } + i++; + } + } } class StateManager { constructor(initialState = new EvalState()) { @@ -34292,21 +37499,19 @@ } } class TextState { - constructor() { - this.ctm = new Float32Array(IDENTITY_MATRIX); - this.fontName = null; - this.fontSize = 0; - this.loadedName = null; - this.font = null; - this.fontMatrix = FONT_IDENTITY_MATRIX; - this.textMatrix = IDENTITY_MATRIX.slice(); - this.textLineMatrix = IDENTITY_MATRIX.slice(); - this.charSpacing = 0; - this.wordSpacing = 0; - this.leading = 0; - this.textHScale = 1; - this.textRise = 0; - } + ctm = new Float32Array(IDENTITY_MATRIX); + fontName = null; + fontSize = 0; + loadedName = null; + font = null; + fontMatrix = FONT_IDENTITY_MATRIX; + textMatrix = IDENTITY_MATRIX.slice(); + textLineMatrix = IDENTITY_MATRIX.slice(); + charSpacing = 0; + wordSpacing = 0; + leading = 0; + textHScale = 1; + textRise = 0; setTextMatrix(a, b, c, d, e, f) { const m = this.textMatrix; m[0] = a; @@ -34340,7 +37545,7 @@ this.textMatrix = this.textLineMatrix.slice(); } clone() { - const clone = Object.create(this); + const clone = Object.assign(Object.create(this), this); clone.textMatrix = this.textMatrix.slice(); clone.textLineMatrix = this.textLineMatrix.slice(); clone.fontMatrix = this.fontMatrix.slice(); @@ -34348,15 +37553,38 @@ } } class EvalState { - constructor() { - this.ctm = new Float32Array(IDENTITY_MATRIX); - this.font = null; - this.textRenderingMode = TextRenderingMode.FILL; - this.fillColorSpace = ColorSpace.singletons.gray; - this.strokeColorSpace = ColorSpace.singletons.gray; + ctm = new Float32Array(IDENTITY_MATRIX); + font = null; + textRenderingMode = TextRenderingMode.FILL; + _fillColorSpace = ColorSpaceUtils.gray; + _strokeColorSpace = ColorSpaceUtils.gray; + patternFillColorSpace = null; + patternStrokeColorSpace = null; + currentPointX = 0; + currentPointY = 0; + pathMinMax = F32_BBOX_INIT.slice(); + pathBuffer = []; + get fillColorSpace() { + return this._fillColorSpace; + } + set fillColorSpace(colorSpace) { + this._fillColorSpace = this.patternFillColorSpace = colorSpace; } - clone() { - return Object.create(this); + get strokeColorSpace() { + return this._strokeColorSpace; + } + set strokeColorSpace(colorSpace) { + this._strokeColorSpace = this.patternStrokeColorSpace = colorSpace; + } + clone({ + newPath = false + } = {}) { + const clone = Object.create(this); + if (newPath) { + clone.pathBuffer = []; + clone.pathMinMax = F32_BBOX_INIT.slice(); + } + return clone; } } class EvaluatorPreprocessor { @@ -34834,7 +38062,8 @@ } } -;// CONCATENATED MODULE: ./src/core/default_appearance.js +;// ./src/core/default_appearance.js + @@ -34881,13 +38110,13 @@ } break; case OPS.setFillRGBColor: - ColorSpace.singletons.rgb.getRgbItem(args, 0, result.fontColor, 0); + ColorSpaceUtils.rgb.getRgbItem(args, 0, result.fontColor, 0); break; case OPS.setFillGray: - ColorSpace.singletons.gray.getRgbItem(args, 0, result.fontColor, 0); + ColorSpaceUtils.gray.getRgbItem(args, 0, result.fontColor, 0); break; case OPS.setFillCMYKColor: - ColorSpace.singletons.cmyk.getRgbItem(args, 0, result.fontColor, 0); + ColorSpaceUtils.cmyk.getRgbItem(args, 0, result.fontColor, 0); break; } } @@ -34901,11 +38130,11 @@ return new DefaultAppearanceEvaluator(str).parse(); } class AppearanceStreamEvaluator extends EvaluatorPreprocessor { - constructor(stream, evaluatorOptions, xref) { + constructor(stream, xref, globalColorSpaceCache) { super(stream); this.stream = stream; - this.evaluatorOptions = evaluatorOptions; this.xref = xref; + this.globalColorSpaceCache = globalColorSpaceCache; this.resources = stream.dict?.get("Resources"); } parse() { @@ -34918,7 +38147,7 @@ fontSize: 0, fontName: "", fontColor: new Uint8ClampedArray(3), - fillColorSpace: ColorSpace.singletons.gray + fillColorSpace: ColorSpaceUtils.gray }; let breakLoop = false; const stack = []; @@ -34958,11 +38187,12 @@ } break; case OPS.setFillColorSpace: - result.fillColorSpace = ColorSpace.parse({ + result.fillColorSpace = ColorSpaceUtils.parse({ cs: args[0], xref: this.xref, resources: this.resources, pdfFunctionFactory: this._pdfFunctionFactory, + globalColorSpaceCache: this.globalColorSpaceCache, localColorSpaceCache: this._localColorSpaceCache }); break; @@ -34971,13 +38201,13 @@ cs.getRgbItem(args, 0, result.fontColor, 0); break; case OPS.setFillRGBColor: - ColorSpace.singletons.rgb.getRgbItem(args, 0, result.fontColor, 0); + ColorSpaceUtils.rgb.getRgbItem(args, 0, result.fontColor, 0); break; case OPS.setFillGray: - ColorSpace.singletons.gray.getRgbItem(args, 0, result.fontColor, 0); + ColorSpaceUtils.gray.getRgbItem(args, 0, result.fontColor, 0); break; case OPS.setFillCMYKColor: - ColorSpace.singletons.cmyk.getRgbItem(args, 0, result.fontColor, 0); + ColorSpaceUtils.cmyk.getRgbItem(args, 0, result.fontColor, 0); break; case OPS.showText: case OPS.showSpacedText: @@ -34999,15 +38229,13 @@ return shadow(this, "_localColorSpaceCache", new LocalColorSpaceCache()); } get _pdfFunctionFactory() { - const pdfFunctionFactory = new PDFFunctionFactory({ - xref: this.xref, - isEvalSupported: this.evaluatorOptions.isEvalSupported - }); - return shadow(this, "_pdfFunctionFactory", pdfFunctionFactory); + return shadow(this, "_pdfFunctionFactory", new PDFFunctionFactory({ + xref: this.xref + })); } } -function parseAppearanceStream(stream, evaluatorOptions, xref) { - return new AppearanceStreamEvaluator(stream, evaluatorOptions, xref).parse(); +function parseAppearanceStream(stream, xref, globalColorSpaceCache) { + return new AppearanceStreamEvaluator(stream, xref, globalColorSpaceCache).parse(); } function getPdfColor(color, isFill) { if (color[0] === color[1] && color[1] === color[2]) { @@ -35024,6 +38252,7 @@ return `/${escapePDFName(fontName)} ${fontSize} Tf ${getPdfColor(fontColor, true)}`; } class FakeUnicodeFont { + static #fontNameId = 1; constructor(xref, fontFamily) { this.xref = xref; this.widths = null; @@ -35031,20 +38260,19 @@ this.lastChar = -Infinity; this.fontFamily = fontFamily; const canvas = new OffscreenCanvas(1, 1); - this.ctxMeasure = canvas.getContext("2d"); - if (!FakeUnicodeFont._fontNameId) { - FakeUnicodeFont._fontNameId = 1; - } - this.fontName = Name.get(`InvalidPDFjsFont_${fontFamily}_${FakeUnicodeFont._fontNameId++}`); + this.ctxMeasure = canvas.getContext("2d", { + willReadFrequently: true + }); + this.fontName = Name.get(`InvalidPDFjsFont_${fontFamily}_${FakeUnicodeFont.#fontNameId++}`); } get fontDescriptorRef() { if (!FakeUnicodeFont._fontDescriptorRef) { const fontDescriptor = new Dict(this.xref); - fontDescriptor.set("Type", Name.get("FontDescriptor")); + fontDescriptor.setIfName("Type", "FontDescriptor"); fontDescriptor.set("FontName", this.fontName); fontDescriptor.set("FontFamily", "MyriadPro Regular"); fontDescriptor.set("FontBBox", [0, 0, 0, 0]); - fontDescriptor.set("FontStretch", Name.get("Normal")); + fontDescriptor.setIfName("FontStretch", "Normal"); fontDescriptor.set("FontWeight", 400); fontDescriptor.set("ItalicAngle", 0); FakeUnicodeFont._fontDescriptorRef = this.xref.getNewPersistentRef(fontDescriptor); @@ -35054,15 +38282,15 @@ get descendantFontRef() { const descendantFont = new Dict(this.xref); descendantFont.set("BaseFont", this.fontName); - descendantFont.set("Type", Name.get("Font")); - descendantFont.set("Subtype", Name.get("CIDFontType0")); - descendantFont.set("CIDToGIDMap", Name.get("Identity")); + descendantFont.setIfName("Type", "Font"); + descendantFont.setIfName("Subtype", "CIDFontType0"); + descendantFont.setIfName("CIDToGIDMap", "Identity"); descendantFont.set("FirstChar", this.firstChar); descendantFont.set("LastChar", this.lastChar); descendantFont.set("FontDescriptor", this.fontDescriptorRef); descendantFont.set("DW", 1000); const widths = []; - const chars = [...this.widths.entries()].sort(); + const chars = [...this.widths].sort(); let currentChar = null; let currentWidths = null; for (const [char, width] of chars) { @@ -35093,11 +38321,11 @@ get baseFontRef() { const baseFont = new Dict(this.xref); baseFont.set("BaseFont", this.fontName); - baseFont.set("Type", Name.get("Font")); - baseFont.set("Subtype", Name.get("Type0")); - baseFont.set("Encoding", Name.get("Identity-H")); + baseFont.setIfName("Type", "Font"); + baseFont.setIfName("Subtype", "Type0"); + baseFont.setIfName("Encoding", "Identity-H"); baseFont.set("DescendantFonts", [this.descendantFontRef]); - baseFont.set("ToUnicode", Name.get("Identity-H")); + baseFont.setIfName("ToUnicode", "Identity-H"); return this.xref.getNewPersistentRef(baseFont); } get resources() { @@ -35171,10 +38399,7 @@ if (rotation % 180 !== 0) { [w, h] = [h, w]; } - let hscale = 1; - if (maxWidth > w) { - hscale = w / maxWidth; - } + const hscale = maxWidth > w ? w / maxWidth : 1; let vscale = 1; const lineHeight = LINE_FACTOR * fontSize; const lineDescent = LINE_DESCENT_FACTOR * fontSize; @@ -35195,7 +38420,7 @@ const r0 = new Dict(this.xref); r0.set("ca", strokeAlpha); r0.set("CA", strokeAlpha); - r0.set("Type", Name.get("ExtGState")); + r0.setIfName("Type", "ExtGState"); extGState.set("R0", r0); resources.set("ExtGState", extGState); } @@ -35206,8 +38431,8 @@ buffer.push("ET", "Q"); const appearance = buffer.join("\n"); const appearanceStreamDict = new Dict(this.xref); - appearanceStreamDict.set("Subtype", Name.get("Form")); - appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.setIfName("Subtype", "Form"); + appearanceStreamDict.setIfName("Type", "XObject"); appearanceStreamDict.set("BBox", [0, 0, w, h]); appearanceStreamDict.set("Length", appearance.length); appearanceStreamDict.set("Resources", resources); @@ -35215,35 +38440,95 @@ const matrix = getRotationMatrix(rotation, w, h); appearanceStreamDict.set("Matrix", matrix); } - const ap = new StringStream(appearance); - ap.dict = appearanceStreamDict; - return ap; + return new StringStream(appearance, appearanceStreamDict); + } +} + +;// ./src/shared/scripting_utils.js +/* unused harmony import specifier */ var scripting_utils_MathClamp; + +function makeColorComp(n) { + return Math.floor(scripting_utils_MathClamp(n, 0, 1) * 255).toString(16).padStart(2, "0"); +} +function scaleAndClamp(x) { + return scripting_utils_MathClamp(x, 0, 1) * 255; +} +class ColorConverters { + static CMYK_G([c, y, m, k]) { + return ["G", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)]; + } + static G_CMYK([g]) { + return ["CMYK", 0, 0, 0, 1 - g]; + } + static G_RGB([g]) { + return ["RGB", g, g, g]; + } + static G_rgb([g]) { + g = scaleAndClamp(g); + return [g, g, g]; + } + static G_HTML([g]) { + const G = makeColorComp(g); + return `#${G}${G}${G}`; + } + static RGB_G([r, g, b]) { + return ["G", 0.3 * r + 0.59 * g + 0.11 * b]; + } + static RGB_rgb(color) { + return color.map(scaleAndClamp); + } + static RGB_HTML(color) { + return `#${color.map(makeColorComp).join("")}`; + } + static T_HTML() { + return "#00000000"; + } + static T_rgb() { + return [null]; + } + static CMYK_RGB([c, y, m, k]) { + return ["RGB", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)]; + } + static CMYK_rgb([c, y, m, k]) { + return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))]; + } + static CMYK_HTML(components) { + const rgb = this.CMYK_RGB(components).slice(1); + return this.RGB_HTML(rgb); + } + static RGB_CMYK([r, g, b]) { + const c = 1 - r; + const m = 1 - g; + const y = 1 - b; + const k = Math.min(c, m, y); + return ["CMYK", c, m, y, k]; } } +const DateFormats = ["m/d", "m/d/yy", "mm/dd/yy", "mm/yy", "d-mmm", "d-mmm-yy", "dd-mmm-yy", "yy-mm-dd", "mmm-yy", "mmmm-yy", "mmm d, yyyy", "mmmm d, yyyy", "m/d/yy h:MM tt", "m/d/yy HH:MM"]; +const TimeFormats = ["HH:MM", "h:MM tt", "HH:MM:ss", "h:MM:ss tt"]; -;// CONCATENATED MODULE: ./src/core/name_number_tree.js +;// ./src/core/name_number_tree.js class NameOrNumberTree { constructor(root, xref, type) { - if (this.constructor === NameOrNumberTree) { - unreachable("Cannot initialize NameOrNumberTree."); - } this.root = root; this.xref = xref; this._type = type; } - getAll() { + getAll(isRaw = false) { const map = new Map(); if (!this.root) { return map; } const xref = this.xref; const processed = new RefSet(); - processed.put(this.root); + if (this.root instanceof Ref) { + processed.put(this.root); + } const queue = [this.root]; - while (queue.length > 0) { - const obj = xref.fetchIfRef(queue.shift()); + for (const node of queue) { + const obj = xref.fetchIfRef(node); if (!(obj instanceof Dict)) { continue; } @@ -35253,11 +38538,13 @@ continue; } for (const kid of kids) { - if (processed.has(kid)) { - throw new FormatError(`Duplicate entry in "${this._type}" tree.`); + if (kid instanceof Ref) { + if (processed.has(kid)) { + throw new FormatError(`Duplicate entry in "${this._type}" tree.`); + } + processed.put(kid); } queue.push(kid); - processed.put(kid); } continue; } @@ -35266,12 +38553,12 @@ continue; } for (let i = 0, ii = entries.length; i < ii; i += 2) { - map.set(xref.fetchIfRef(entries[i]), xref.fetchIfRef(entries[i + 1])); + map.set(isRaw ? entries[i] : xref.fetchIfRef(entries[i]), isRaw ? entries[i + 1] : xref.fetchIfRef(entries[i + 1])); } } return map; } - get(key) { + getRaw(key) { if (!this.root) { return null; } @@ -35320,12 +38607,15 @@ } else if (key > currentKey) { l = m + 2; } else { - return xref.fetchIfRef(entries[m + 1]); + return entries[m + 1]; } } } return null; } + get(key) { + return this.xref.fetchIfRef(this.getRaw(key)); + } } class NameTree extends NameOrNumberTree { constructor(root, xref) { @@ -35338,7 +38628,8 @@ } } -;// CONCATENATED MODULE: ./src/core/cleanup_helper.js +;// ./src/core/cleanup_helper.js + @@ -35346,85 +38637,87 @@ clearPatternCaches(); clearPrimitiveCaches(); clearUnicodeCaches(); + WasmImage.cleanup(); } -;// CONCATENATED MODULE: ./src/core/file_spec.js +;// ./src/core/file_spec.js + -function pickPlatformItem(dict) { - if (dict.has("UF")) { - return dict.get("UF"); - } else if (dict.has("F")) { - return dict.get("F"); - } else if (dict.has("Unix")) { - return dict.get("Unix"); - } else if (dict.has("Mac")) { - return dict.get("Mac"); - } else if (dict.has("DOS")) { - return dict.get("DOS"); - } - return null; -} class FileSpec { - #contentAvailable = false; - constructor(root, xref, skipContent = false) { + constructor(root) { if (!(root instanceof Dict)) { return; } - this.xref = xref; this.root = root; if (root.has("FS")) { this.fs = root.get("FS"); } - this.description = root.has("Desc") ? stringToPDFString(root.get("Desc")) : ""; if (root.has("RF")) { warn("Related file specifications are not supported"); } - if (!skipContent) { - if (root.has("EF")) { - this.#contentAvailable = true; - } else { - warn("Non-embedded file specifications are not supported"); - } - } } get filename() { - if (!this._filename && this.root) { - const filename = pickPlatformItem(this.root) || "unnamed"; - this._filename = stringToPDFString(filename).replaceAll("\\\\", "\\").replaceAll("\\/", "/").replaceAll("\\", "/"); + const item = FileSpec.pickPlatformItem(this.root); + if (item && typeof item === "string") { + return stringToPDFString(item, true).replaceAll("\\\\", "\\").replaceAll("\\/", "/").replaceAll("\\", "/"); } - return this._filename; + return ""; } - get content() { - if (!this.#contentAvailable) { - return null; - } - if (!this.contentRef && this.root) { - this.contentRef = pickPlatformItem(this.root.get("EF")); - } - let content = null; - if (this.contentRef) { - const fileObj = this.xref.fetchIfRef(this.contentRef); - if (fileObj instanceof BaseStream) { - content = fileObj.getBytes(); - } else { - warn("Embedded file specification points to non-existing/invalid content"); - } - } else { - warn("Embedded file specification does not have a content"); + get description() { + const desc = this.root?.get("Desc"); + if (desc && typeof desc === "string") { + return stringToPDFString(desc); } - return content; + return ""; } get serializable() { + const { + filename, + description + } = this; return { - filename: this.filename, - content: this.content + rawFilename: filename, + filename: stripPath(filename) || "unnamed", + description }; } + static pickPlatformItem(dict, raw = false) { + if (dict instanceof Dict) { + for (const key of ["UF", "F", "Unix", "Mac", "DOS"]) { + if (dict.has(key)) { + return raw ? dict.getRaw(key) : dict.get(key); + } + } + } + return null; + } + static hasEmbeddedFile(fileSpecDict) { + return this.pickPlatformItem(fileSpecDict.get("EF")) instanceof BaseStream; + } + static readContent(dict) { + if (!(dict instanceof Dict)) { + return null; + } + const ef = this.pickPlatformItem(dict.get("EF")); + if (!(ef instanceof BaseStream)) { + warn("Embedded file specification points to non-existing/invalid content"); + return null; + } + return this.readStreamContent(ef); + } + static readStreamContent(stream) { + const encrypt = stream.dict?.xref?.encrypt; + if (encrypt?.encryptionKey === null) { + throw new PasswordException("No password given", PasswordResponses.NEED_PASSWORD); + } + return stream.getBytes(); + } } -;// CONCATENATED MODULE: ./src/core/xml_parser.js +;// ./src/core/xml_parser.js + const XMLParserErrorCode = { NoError: 0, @@ -35452,12 +38745,16 @@ return true; } class XMLParserBase { + static get _entityRegex() { + return shadow(this, "_entityRegex", /&(?:#x([^;]+)|#([^;]+)|([^;]+));/g); + } _resolveEntities(s) { - return s.replaceAll(/&([^;]+);/g, (all, entity) => { - if (entity.substring(0, 2) === "#x") { - return String.fromCodePoint(parseInt(entity.substring(2), 16)); - } else if (entity.substring(0, 1) === "#") { - return String.fromCodePoint(parseInt(entity.substring(1), 10)); + return s.replaceAll(XMLParserBase._entityRegex, (_, hex, dec, entity) => { + if (hex) { + return String.fromCodePoint(parseInt(hex, 16)); + } + if (dec) { + return String.fromCodePoint(parseInt(dec, 10)); } switch (entity) { case "lt": @@ -35607,2031 +38904,341 @@ this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration); return; } - complexDoctype = true; - } - const doctypeContent = s.substring(j + 8, q + (complexDoctype ? 1 : 0)); - this.onDoctype(doctypeContent); - j = q + (complexDoctype ? 2 : 1); - } else { - this.onError(XMLParserErrorCode.MalformedElement); - return; - } - break; - default: - const content = this._parseContent(s, j); - if (content === null) { - this.onError(XMLParserErrorCode.MalformedElement); - return; - } - let isClosed = false; - if (s.substring(j + content.parsed, j + content.parsed + 2) === "/>") { - isClosed = true; - } else if (s.substring(j + content.parsed, j + content.parsed + 1) !== ">") { - this.onError(XMLParserErrorCode.UnterminatedElement); - return; - } - this.onBeginElement(content.name, content.attributes, isClosed); - j += content.parsed + (isClosed ? 2 : 1); - break; - } - } else { - while (j < s.length && s[j] !== "<") { - j++; - } - const text = s.substring(i, j); - this.onText(this._resolveEntities(text)); - } - i = j; - } - } - onResolveEntity(name) { - return `&${name};`; - } - onPi(name, value) {} - onComment(text) {} - onCdata(text) {} - onDoctype(doctypeContent) {} - onText(text) {} - onBeginElement(name, attributes, isEmpty) {} - onEndElement(name) {} - onError(code) {} -} -class SimpleDOMNode { - constructor(nodeName, nodeValue) { - this.nodeName = nodeName; - this.nodeValue = nodeValue; - Object.defineProperty(this, "parentNode", { - value: null, - writable: true - }); - } - get firstChild() { - return this.childNodes?.[0]; - } - get nextSibling() { - const childNodes = this.parentNode.childNodes; - if (!childNodes) { - return undefined; - } - const index = childNodes.indexOf(this); - if (index === -1) { - return undefined; - } - return childNodes[index + 1]; - } - get textContent() { - if (!this.childNodes) { - return this.nodeValue || ""; - } - return this.childNodes.map(function (child) { - return child.textContent; - }).join(""); - } - get children() { - return this.childNodes || []; - } - hasChildNodes() { - return this.childNodes?.length > 0; - } - searchNode(paths, pos) { - if (pos >= paths.length) { - return this; - } - const component = paths[pos]; - if (component.name.startsWith("#") && pos < paths.length - 1) { - return this.searchNode(paths, pos + 1); - } - const stack = []; - let node = this; - while (true) { - if (component.name === node.nodeName) { - if (component.pos === 0) { - const res = node.searchNode(paths, pos + 1); - if (res !== null) { - return res; - } - } else if (stack.length === 0) { - return null; - } else { - const [parent] = stack.pop(); - let siblingPos = 0; - for (const child of parent.childNodes) { - if (component.name === child.nodeName) { - if (siblingPos === component.pos) { - return child.searchNode(paths, pos + 1); - } - siblingPos++; - } - } - return node.searchNode(paths, pos + 1); - } - } - if (node.childNodes?.length > 0) { - stack.push([node, 0]); - node = node.childNodes[0]; - } else if (stack.length === 0) { - return null; - } else { - while (stack.length !== 0) { - const [parent, currentPos] = stack.pop(); - const newPos = currentPos + 1; - if (newPos < parent.childNodes.length) { - stack.push([parent, newPos]); - node = parent.childNodes[newPos]; - break; - } - } - if (stack.length === 0) { - return null; - } - } - } - } - dump(buffer) { - if (this.nodeName === "#text") { - buffer.push(encodeToXmlString(this.nodeValue)); - return; - } - buffer.push(`<${this.nodeName}`); - if (this.attributes) { - for (const attribute of this.attributes) { - buffer.push(` ${attribute.name}="${encodeToXmlString(attribute.value)}"`); - } - } - if (this.hasChildNodes()) { - buffer.push(">"); - for (const child of this.childNodes) { - child.dump(buffer); - } - buffer.push(``); - } else if (this.nodeValue) { - buffer.push(`>${encodeToXmlString(this.nodeValue)}`); - } else { - buffer.push("/>"); - } - } -} -class SimpleXMLParser extends XMLParserBase { - constructor({ - hasAttributes = false, - lowerCaseName = false - }) { - super(); - this._currentFragment = null; - this._stack = null; - this._errorCode = XMLParserErrorCode.NoError; - this._hasAttributes = hasAttributes; - this._lowerCaseName = lowerCaseName; - } - parseFromString(data) { - this._currentFragment = []; - this._stack = []; - this._errorCode = XMLParserErrorCode.NoError; - this.parseXml(data); - if (this._errorCode !== XMLParserErrorCode.NoError) { - return undefined; - } - const [documentElement] = this._currentFragment; - if (!documentElement) { - return undefined; - } - return { - documentElement - }; - } - onText(text) { - if (isWhitespaceString(text)) { - return; - } - const node = new SimpleDOMNode("#text", text); - this._currentFragment.push(node); - } - onCdata(text) { - const node = new SimpleDOMNode("#text", text); - this._currentFragment.push(node); - } - onBeginElement(name, attributes, isEmpty) { - if (this._lowerCaseName) { - name = name.toLowerCase(); - } - const node = new SimpleDOMNode(name); - node.childNodes = []; - if (this._hasAttributes) { - node.attributes = attributes; - } - this._currentFragment.push(node); - if (isEmpty) { - return; - } - this._stack.push(this._currentFragment); - this._currentFragment = node.childNodes; - } - onEndElement(name) { - this._currentFragment = this._stack.pop() || []; - const lastElement = this._currentFragment.at(-1); - if (!lastElement) { - return null; - } - for (const childNode of lastElement.childNodes) { - childNode.parentNode = lastElement; - } - return lastElement; - } - onError(code) { - this._errorCode = code; - } -} - -;// CONCATENATED MODULE: ./src/core/metadata_parser.js - -class MetadataParser { - constructor(data) { - data = this._repair(data); - const parser = new SimpleXMLParser({ - lowerCaseName: true - }); - const xmlDocument = parser.parseFromString(data); - this._metadataMap = new Map(); - this._data = data; - if (xmlDocument) { - this._parse(xmlDocument); - } - } - _repair(data) { - return data.replace(/^[^<]+/, "").replaceAll(/>\\376\\377([^<]+)/g, function (all, codes) { - const bytes = codes.replaceAll(/\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) { - return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1); - }).replaceAll(/&(amp|apos|gt|lt|quot);/g, function (str, name) { - switch (name) { - case "amp": - return "&"; - case "apos": - return "'"; - case "gt": - return ">"; - case "lt": - return "<"; - case "quot": - return '"'; - } - throw new Error(`_repair: ${name} isn't defined.`); - }); - const charBuf = [">"]; - for (let i = 0, ii = bytes.length; i < ii; i += 2) { - const code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1); - if (code >= 32 && code < 127 && code !== 60 && code !== 62 && code !== 38) { - charBuf.push(String.fromCharCode(code)); - } else { - charBuf.push("&#x" + (0x10000 + code).toString(16).substring(1) + ";"); - } - } - return charBuf.join(""); - }); - } - _getSequence(entry) { - const name = entry.nodeName; - if (name !== "rdf:bag" && name !== "rdf:seq" && name !== "rdf:alt") { - return null; - } - return entry.childNodes.filter(node => node.nodeName === "rdf:li"); - } - _parseArray(entry) { - if (!entry.hasChildNodes()) { - return; - } - const [seqNode] = entry.childNodes; - const sequence = this._getSequence(seqNode) || []; - this._metadataMap.set(entry.nodeName, sequence.map(node => node.textContent.trim())); - } - _parse(xmlDocument) { - let rdf = xmlDocument.documentElement; - if (rdf.nodeName !== "rdf:rdf") { - rdf = rdf.firstChild; - while (rdf && rdf.nodeName !== "rdf:rdf") { - rdf = rdf.nextSibling; - } - } - if (!rdf || rdf.nodeName !== "rdf:rdf" || !rdf.hasChildNodes()) { - return; - } - for (const desc of rdf.childNodes) { - if (desc.nodeName !== "rdf:description") { - continue; - } - for (const entry of desc.childNodes) { - const name = entry.nodeName; - switch (name) { - case "#text": - continue; - case "dc:creator": - case "dc:subject": - this._parseArray(entry); - continue; - } - this._metadataMap.set(name, entry.textContent.trim()); - } - } - } - get serializable() { - return { - parsedData: this._metadataMap, - rawData: this._data - }; - } -} - -;// CONCATENATED MODULE: ./src/core/decrypt_stream.js - -const chunkSize = 512; -class DecryptStream extends DecodeStream { - constructor(str, maybeLength, decrypt) { - super(maybeLength); - this.str = str; - this.dict = str.dict; - this.decrypt = decrypt; - this.nextChunk = null; - this.initialized = false; - } - readBlock() { - let chunk; - if (this.initialized) { - chunk = this.nextChunk; - } else { - chunk = this.str.getBytes(chunkSize); - this.initialized = true; - } - if (!chunk || chunk.length === 0) { - this.eof = true; - return; - } - this.nextChunk = this.str.getBytes(chunkSize); - const hasMoreData = this.nextChunk?.length > 0; - const decrypt = this.decrypt; - chunk = decrypt(chunk, !hasMoreData); - const bufferLength = this.bufferLength, - newLength = bufferLength + chunk.length, - buffer = this.ensureBuffer(newLength); - buffer.set(chunk, bufferLength); - this.bufferLength = newLength; - } -} - -;// CONCATENATED MODULE: ./src/core/crypto.js - - - -class ARCFourCipher { - constructor(key) { - this.a = 0; - this.b = 0; - const s = new Uint8Array(256); - const keyLength = key.length; - for (let i = 0; i < 256; ++i) { - s[i] = i; - } - for (let i = 0, j = 0; i < 256; ++i) { - const tmp = s[i]; - j = j + tmp + key[i % keyLength] & 0xff; - s[i] = s[j]; - s[j] = tmp; - } - this.s = s; - } - encryptBlock(data) { - let a = this.a, - b = this.b; - const s = this.s; - const n = data.length; - const output = new Uint8Array(n); - for (let i = 0; i < n; ++i) { - a = a + 1 & 0xff; - const tmp = s[a]; - b = b + tmp & 0xff; - const tmp2 = s[b]; - s[a] = tmp2; - s[b] = tmp; - output[i] = data[i] ^ s[tmp + tmp2 & 0xff]; - } - this.a = a; - this.b = b; - return output; - } - decryptBlock(data) { - return this.encryptBlock(data); - } - encrypt(data) { - return this.encryptBlock(data); - } -} -const calculateMD5 = function calculateMD5Closure() { - const r = new Uint8Array([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]); - const k = new Int32Array([-680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, -145523070, -1120210379, 718787259, -343485551]); - function hash(data, offset, length) { - let h0 = 1732584193, - h1 = -271733879, - h2 = -1732584194, - h3 = 271733878; - const paddedLength = length + 72 & ~63; - const padded = new Uint8Array(paddedLength); - let i, j; - for (i = 0; i < length; ++i) { - padded[i] = data[offset++]; - } - padded[i++] = 0x80; - const n = paddedLength - 8; - while (i < n) { - padded[i++] = 0; - } - padded[i++] = length << 3 & 0xff; - padded[i++] = length >> 5 & 0xff; - padded[i++] = length >> 13 & 0xff; - padded[i++] = length >> 21 & 0xff; - padded[i++] = length >>> 29 & 0xff; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - const w = new Int32Array(16); - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j, i += 4) { - w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24; - } - let a = h0, - b = h1, - c = h2, - d = h3, - f, - g; - for (j = 0; j < 64; ++j) { - if (j < 16) { - f = b & c | ~b & d; - g = j; - } else if (j < 32) { - f = d & b | ~d & c; - g = 5 * j + 1 & 15; - } else if (j < 48) { - f = b ^ c ^ d; - g = 3 * j + 5 & 15; - } else { - f = c ^ (b | ~d); - g = 7 * j & 15; - } - const tmp = d, - rotateArg = a + f + k[j] + w[g] | 0, - rotate = r[j]; - d = c; - c = b; - b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0; - a = tmp; - } - h0 = h0 + a | 0; - h1 = h1 + b | 0; - h2 = h2 + c | 0; - h3 = h3 + d | 0; - } - return new Uint8Array([h0 & 0xFF, h0 >> 8 & 0xFF, h0 >> 16 & 0xFF, h0 >>> 24 & 0xFF, h1 & 0xFF, h1 >> 8 & 0xFF, h1 >> 16 & 0xFF, h1 >>> 24 & 0xFF, h2 & 0xFF, h2 >> 8 & 0xFF, h2 >> 16 & 0xFF, h2 >>> 24 & 0xFF, h3 & 0xFF, h3 >> 8 & 0xFF, h3 >> 16 & 0xFF, h3 >>> 24 & 0xFF]); - } - return hash; -}(); -class Word64 { - constructor(highInteger, lowInteger) { - this.high = highInteger | 0; - this.low = lowInteger | 0; - } - and(word) { - this.high &= word.high; - this.low &= word.low; - } - xor(word) { - this.high ^= word.high; - this.low ^= word.low; - } - or(word) { - this.high |= word.high; - this.low |= word.low; - } - shiftRight(places) { - if (places >= 32) { - this.low = this.high >>> places - 32 | 0; - this.high = 0; - } else { - this.low = this.low >>> places | this.high << 32 - places; - this.high = this.high >>> places | 0; - } - } - shiftLeft(places) { - if (places >= 32) { - this.high = this.low << places - 32; - this.low = 0; - } else { - this.high = this.high << places | this.low >>> 32 - places; - this.low <<= places; - } - } - rotateRight(places) { - let low, high; - if (places & 32) { - high = this.low; - low = this.high; - } else { - low = this.low; - high = this.high; - } - places &= 31; - this.low = low >>> places | high << 32 - places; - this.high = high >>> places | low << 32 - places; - } - not() { - this.high = ~this.high; - this.low = ~this.low; - } - add(word) { - const lowAdd = (this.low >>> 0) + (word.low >>> 0); - let highAdd = (this.high >>> 0) + (word.high >>> 0); - if (lowAdd > 0xffffffff) { - highAdd += 1; - } - this.low = lowAdd | 0; - this.high = highAdd | 0; - } - copyTo(bytes, offset) { - bytes[offset] = this.high >>> 24 & 0xff; - bytes[offset + 1] = this.high >> 16 & 0xff; - bytes[offset + 2] = this.high >> 8 & 0xff; - bytes[offset + 3] = this.high & 0xff; - bytes[offset + 4] = this.low >>> 24 & 0xff; - bytes[offset + 5] = this.low >> 16 & 0xff; - bytes[offset + 6] = this.low >> 8 & 0xff; - bytes[offset + 7] = this.low & 0xff; - } - assign(word) { - this.high = word.high; - this.low = word.low; - } -} -const calculateSHA256 = function calculateSHA256Closure() { - function rotr(x, n) { - return x >>> n | x << 32 - n; - } - function ch(x, y, z) { - return x & y ^ ~x & z; - } - function maj(x, y, z) { - return x & y ^ x & z ^ y & z; - } - function sigma(x) { - return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22); - } - function sigmaPrime(x) { - return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25); - } - function littleSigma(x) { - return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3; - } - function littleSigmaPrime(x) { - return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10; - } - const k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]; - function hash(data, offset, length) { - let h0 = 0x6a09e667, - h1 = 0xbb67ae85, - h2 = 0x3c6ef372, - h3 = 0xa54ff53a, - h4 = 0x510e527f, - h5 = 0x9b05688c, - h6 = 0x1f83d9ab, - h7 = 0x5be0cd19; - const paddedLength = Math.ceil((length + 9) / 64) * 64; - const padded = new Uint8Array(paddedLength); - let i, j; - for (i = 0; i < length; ++i) { - padded[i] = data[offset++]; - } - padded[i++] = 0x80; - const n = paddedLength - 8; - while (i < n) { - padded[i++] = 0; - } - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = length >>> 29 & 0xff; - padded[i++] = length >> 21 & 0xff; - padded[i++] = length >> 13 & 0xff; - padded[i++] = length >> 5 & 0xff; - padded[i++] = length << 3 & 0xff; - const w = new Uint32Array(64); - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j) { - w[j] = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3]; - i += 4; - } - for (j = 16; j < 64; ++j) { - w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + littleSigma(w[j - 15]) + w[j - 16] | 0; - } - let a = h0, - b = h1, - c = h2, - d = h3, - e = h4, - f = h5, - g = h6, - h = h7, - t1, - t2; - for (j = 0; j < 64; ++j) { - t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j]; - t2 = sigma(a) + maj(a, b, c); - h = g; - g = f; - f = e; - e = d + t1 | 0; - d = c; - c = b; - b = a; - a = t1 + t2 | 0; - } - h0 = h0 + a | 0; - h1 = h1 + b | 0; - h2 = h2 + c | 0; - h3 = h3 + d | 0; - h4 = h4 + e | 0; - h5 = h5 + f | 0; - h6 = h6 + g | 0; - h7 = h7 + h | 0; - } - return new Uint8Array([h0 >> 24 & 0xFF, h0 >> 16 & 0xFF, h0 >> 8 & 0xFF, h0 & 0xFF, h1 >> 24 & 0xFF, h1 >> 16 & 0xFF, h1 >> 8 & 0xFF, h1 & 0xFF, h2 >> 24 & 0xFF, h2 >> 16 & 0xFF, h2 >> 8 & 0xFF, h2 & 0xFF, h3 >> 24 & 0xFF, h3 >> 16 & 0xFF, h3 >> 8 & 0xFF, h3 & 0xFF, h4 >> 24 & 0xFF, h4 >> 16 & 0xFF, h4 >> 8 & 0xFF, h4 & 0xFF, h5 >> 24 & 0xFF, h5 >> 16 & 0xFF, h5 >> 8 & 0xFF, h5 & 0xFF, h6 >> 24 & 0xFF, h6 >> 16 & 0xFF, h6 >> 8 & 0xFF, h6 & 0xFF, h7 >> 24 & 0xFF, h7 >> 16 & 0xFF, h7 >> 8 & 0xFF, h7 & 0xFF]); - } - return hash; -}(); -const calculateSHA512 = function calculateSHA512Closure() { - function ch(result, x, y, z, tmp) { - result.assign(x); - result.and(y); - tmp.assign(x); - tmp.not(); - tmp.and(z); - result.xor(tmp); - } - function maj(result, x, y, z, tmp) { - result.assign(x); - result.and(y); - tmp.assign(x); - tmp.and(z); - result.xor(tmp); - tmp.assign(y); - tmp.and(z); - result.xor(tmp); - } - function sigma(result, x, tmp) { - result.assign(x); - result.rotateRight(28); - tmp.assign(x); - tmp.rotateRight(34); - result.xor(tmp); - tmp.assign(x); - tmp.rotateRight(39); - result.xor(tmp); - } - function sigmaPrime(result, x, tmp) { - result.assign(x); - result.rotateRight(14); - tmp.assign(x); - tmp.rotateRight(18); - result.xor(tmp); - tmp.assign(x); - tmp.rotateRight(41); - result.xor(tmp); - } - function littleSigma(result, x, tmp) { - result.assign(x); - result.rotateRight(1); - tmp.assign(x); - tmp.rotateRight(8); - result.xor(tmp); - tmp.assign(x); - tmp.shiftRight(7); - result.xor(tmp); - } - function littleSigmaPrime(result, x, tmp) { - result.assign(x); - result.rotateRight(19); - tmp.assign(x); - tmp.rotateRight(61); - result.xor(tmp); - tmp.assign(x); - tmp.shiftRight(6); - result.xor(tmp); - } - const k = [new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019), new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe), new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2), new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694), new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3), new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5), new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4), new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926), new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b), new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910), new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8), new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3), new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9), new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178), new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493), new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)]; - function hash(data, offset, length, mode384 = false) { - let h0, h1, h2, h3, h4, h5, h6, h7; - if (!mode384) { - h0 = new Word64(0x6a09e667, 0xf3bcc908); - h1 = new Word64(0xbb67ae85, 0x84caa73b); - h2 = new Word64(0x3c6ef372, 0xfe94f82b); - h3 = new Word64(0xa54ff53a, 0x5f1d36f1); - h4 = new Word64(0x510e527f, 0xade682d1); - h5 = new Word64(0x9b05688c, 0x2b3e6c1f); - h6 = new Word64(0x1f83d9ab, 0xfb41bd6b); - h7 = new Word64(0x5be0cd19, 0x137e2179); - } else { - h0 = new Word64(0xcbbb9d5d, 0xc1059ed8); - h1 = new Word64(0x629a292a, 0x367cd507); - h2 = new Word64(0x9159015a, 0x3070dd17); - h3 = new Word64(0x152fecd8, 0xf70e5939); - h4 = new Word64(0x67332667, 0xffc00b31); - h5 = new Word64(0x8eb44a87, 0x68581511); - h6 = new Word64(0xdb0c2e0d, 0x64f98fa7); - h7 = new Word64(0x47b5481d, 0xbefa4fa4); - } - const paddedLength = Math.ceil((length + 17) / 128) * 128; - const padded = new Uint8Array(paddedLength); - let i, j; - for (i = 0; i < length; ++i) { - padded[i] = data[offset++]; - } - padded[i++] = 0x80; - const n = paddedLength - 16; - while (i < n) { - padded[i++] = 0; - } - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = length >>> 29 & 0xff; - padded[i++] = length >> 21 & 0xff; - padded[i++] = length >> 13 & 0xff; - padded[i++] = length >> 5 & 0xff; - padded[i++] = length << 3 & 0xff; - const w = new Array(80); - for (i = 0; i < 80; i++) { - w[i] = new Word64(0, 0); - } - let a = new Word64(0, 0), - b = new Word64(0, 0), - c = new Word64(0, 0); - let d = new Word64(0, 0), - e = new Word64(0, 0), - f = new Word64(0, 0); - let g = new Word64(0, 0), - h = new Word64(0, 0); - const t1 = new Word64(0, 0), - t2 = new Word64(0, 0); - const tmp1 = new Word64(0, 0), - tmp2 = new Word64(0, 0); - let tmp3; - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j) { - w[j].high = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3]; - w[j].low = padded[i + 4] << 24 | padded[i + 5] << 16 | padded[i + 6] << 8 | padded[i + 7]; - i += 8; - } - for (j = 16; j < 80; ++j) { - tmp3 = w[j]; - littleSigmaPrime(tmp3, w[j - 2], tmp2); - tmp3.add(w[j - 7]); - littleSigma(tmp1, w[j - 15], tmp2); - tmp3.add(tmp1); - tmp3.add(w[j - 16]); - } - a.assign(h0); - b.assign(h1); - c.assign(h2); - d.assign(h3); - e.assign(h4); - f.assign(h5); - g.assign(h6); - h.assign(h7); - for (j = 0; j < 80; ++j) { - t1.assign(h); - sigmaPrime(tmp1, e, tmp2); - t1.add(tmp1); - ch(tmp1, e, f, g, tmp2); - t1.add(tmp1); - t1.add(k[j]); - t1.add(w[j]); - sigma(t2, a, tmp2); - maj(tmp1, a, b, c, tmp2); - t2.add(tmp1); - tmp3 = h; - h = g; - g = f; - f = e; - d.add(t1); - e = d; - d = c; - c = b; - b = a; - tmp3.assign(t1); - tmp3.add(t2); - a = tmp3; - } - h0.add(a); - h1.add(b); - h2.add(c); - h3.add(d); - h4.add(e); - h5.add(f); - h6.add(g); - h7.add(h); - } - let result; - if (!mode384) { - result = new Uint8Array(64); - h0.copyTo(result, 0); - h1.copyTo(result, 8); - h2.copyTo(result, 16); - h3.copyTo(result, 24); - h4.copyTo(result, 32); - h5.copyTo(result, 40); - h6.copyTo(result, 48); - h7.copyTo(result, 56); - } else { - result = new Uint8Array(48); - h0.copyTo(result, 0); - h1.copyTo(result, 8); - h2.copyTo(result, 16); - h3.copyTo(result, 24); - h4.copyTo(result, 32); - h5.copyTo(result, 40); - } - return result; - } - return hash; -}(); -function calculateSHA384(data, offset, length) { - return calculateSHA512(data, offset, length, true); -} -class NullCipher { - decryptBlock(data) { - return data; - } - encrypt(data) { - return data; - } -} -class AESBaseCipher { - constructor() { - if (this.constructor === AESBaseCipher) { - unreachable("Cannot initialize AESBaseCipher."); - } - this._s = new Uint8Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]); - this._inv_s = new Uint8Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]); - this._mix = new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]); - this._mixCol = new Uint8Array(256); - for (let i = 0; i < 256; i++) { - this._mixCol[i] = i < 128 ? i << 1 : i << 1 ^ 0x1b; - } - this.buffer = new Uint8Array(16); - this.bufferPosition = 0; - } - _expandKey(cipherKey) { - unreachable("Cannot call `_expandKey` on the base class"); - } - _decrypt(input, key) { - let t, u, v; - const state = new Uint8Array(16); - state.set(input); - for (let j = 0, k = this._keySize; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - for (let i = this._cyclesOfRepetition - 1; i >= 1; --i) { - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - for (let j = 0; j < 16; ++j) { - state[j] = this._inv_s[state[j]]; - } - for (let j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - for (let j = 0; j < 16; j += 4) { - const s0 = this._mix[state[j]]; - const s1 = this._mix[state[j + 1]]; - const s2 = this._mix[state[j + 2]]; - const s3 = this._mix[state[j + 3]]; - t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8; - state[j] = t >>> 24 & 0xff; - state[j + 1] = t >> 16 & 0xff; - state[j + 2] = t >> 8 & 0xff; - state[j + 3] = t & 0xff; - } - } - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - for (let j = 0; j < 16; ++j) { - state[j] = this._inv_s[state[j]]; - state[j] ^= key[j]; - } - return state; - } - _encrypt(input, key) { - const s = this._s; - let t, u, v; - const state = new Uint8Array(16); - state.set(input); - for (let j = 0; j < 16; ++j) { - state[j] ^= key[j]; - } - for (let i = 1; i < this._cyclesOfRepetition; i++) { - for (let j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - for (let j = 0; j < 16; j += 4) { - const s0 = state[j + 0]; - const s1 = state[j + 1]; - const s2 = state[j + 2]; - const s3 = state[j + 3]; - t = s0 ^ s1 ^ s2 ^ s3; - state[j + 0] ^= t ^ this._mixCol[s0 ^ s1]; - state[j + 1] ^= t ^ this._mixCol[s1 ^ s2]; - state[j + 2] ^= t ^ this._mixCol[s2 ^ s3]; - state[j + 3] ^= t ^ this._mixCol[s3 ^ s0]; - } - for (let j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - } - for (let j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - for (let j = 0, k = this._keySize; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - return state; - } - _decryptBlock2(data, finalize) { - const sourceLength = data.length; - let buffer = this.buffer, - bufferLength = this.bufferPosition; - const result = []; - let iv = this.iv; - for (let i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - const plain = this._decrypt(buffer, this._key); - for (let j = 0; j < 16; ++j) { - plain[j] ^= iv[j]; - } - iv = buffer; - result.push(plain); - buffer = new Uint8Array(16); - bufferLength = 0; - } - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array(0); - } - let outputLength = 16 * result.length; - if (finalize) { - const lastBlock = result.at(-1); - let psLen = lastBlock[15]; - if (psLen <= 16) { - for (let i = 15, ii = 16 - psLen; i >= ii; --i) { - if (lastBlock[i] !== psLen) { - psLen = 0; - break; - } - } - outputLength -= psLen; - result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); - } - } - const output = new Uint8Array(outputLength); - for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - } - decryptBlock(data, finalize, iv = null) { - const sourceLength = data.length; - const buffer = this.buffer; - let bufferLength = this.bufferPosition; - if (iv) { - this.iv = iv; - } else { - for (let i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) { - buffer[bufferLength] = data[i]; - } - if (bufferLength < 16) { - this.bufferLength = bufferLength; - return new Uint8Array(0); - } - this.iv = buffer; - data = data.subarray(16); - } - this.buffer = new Uint8Array(16); - this.bufferLength = 0; - this.decryptBlock = this._decryptBlock2; - return this.decryptBlock(data, finalize); - } - encrypt(data, iv) { - const sourceLength = data.length; - let buffer = this.buffer, - bufferLength = this.bufferPosition; - const result = []; - if (!iv) { - iv = new Uint8Array(16); - } - for (let i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - for (let j = 0; j < 16; ++j) { - buffer[j] ^= iv[j]; - } - const cipher = this._encrypt(buffer, this._key); - iv = cipher; - result.push(cipher); - buffer = new Uint8Array(16); - bufferLength = 0; - } - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array(0); - } - const outputLength = 16 * result.length; - const output = new Uint8Array(outputLength); - for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - } -} -class AES128Cipher extends AESBaseCipher { - constructor(key) { - super(); - this._cyclesOfRepetition = 10; - this._keySize = 160; - this._rcon = new Uint8Array([0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]); - this._key = this._expandKey(key); - } - _expandKey(cipherKey) { - const b = 176; - const s = this._s; - const rcon = this._rcon; - const result = new Uint8Array(b); - result.set(cipherKey); - for (let j = 16, i = 1; j < b; ++i) { - let t1 = result[j - 3]; - let t2 = result[j - 2]; - let t3 = result[j - 1]; - let t4 = result[j - 4]; - t1 = s[t1]; - t2 = s[t2]; - t3 = s[t3]; - t4 = s[t4]; - t1 ^= rcon[i]; - for (let n = 0; n < 4; ++n) { - result[j] = t1 ^= result[j - 16]; - j++; - result[j] = t2 ^= result[j - 16]; - j++; - result[j] = t3 ^= result[j - 16]; - j++; - result[j] = t4 ^= result[j - 16]; - j++; - } - } - return result; - } -} -class AES256Cipher extends AESBaseCipher { - constructor(key) { - super(); - this._cyclesOfRepetition = 14; - this._keySize = 224; - this._key = this._expandKey(key); - } - _expandKey(cipherKey) { - const b = 240; - const s = this._s; - const result = new Uint8Array(b); - result.set(cipherKey); - let r = 1; - let t1, t2, t3, t4; - for (let j = 32, i = 1; j < b; ++i) { - if (j % 32 === 16) { - t1 = s[t1]; - t2 = s[t2]; - t3 = s[t3]; - t4 = s[t4]; - } else if (j % 32 === 0) { - t1 = result[j - 3]; - t2 = result[j - 2]; - t3 = result[j - 1]; - t4 = result[j - 4]; - t1 = s[t1]; - t2 = s[t2]; - t3 = s[t3]; - t4 = s[t4]; - t1 ^= r; - if ((r <<= 1) >= 256) { - r = (r ^ 0x1b) & 0xff; - } - } - for (let n = 0; n < 4; ++n) { - result[j] = t1 ^= result[j - 32]; - j++; - result[j] = t2 ^= result[j - 32]; - j++; - result[j] = t3 ^= result[j - 32]; - j++; - result[j] = t4 ^= result[j - 32]; - j++; - } - } - return result; - } -} -class PDF17 { - checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) { - const hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerValidationSalt, password.length); - hashData.set(userBytes, password.length + ownerValidationSalt.length); - const result = calculateSHA256(hashData, 0, hashData.length); - return isArrayEqual(result, ownerPassword); - } - checkUserPassword(password, userValidationSalt, userPassword) { - const hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userValidationSalt, password.length); - const result = calculateSHA256(hashData, 0, hashData.length); - return isArrayEqual(result, userPassword); - } - getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) { - const hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerKeySalt, password.length); - hashData.set(userBytes, password.length + ownerKeySalt.length); - const key = calculateSHA256(hashData, 0, hashData.length); - const cipher = new AES256Cipher(key); - return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16)); - } - getUserKey(password, userKeySalt, userEncryption) { - const hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userKeySalt, password.length); - const key = calculateSHA256(hashData, 0, hashData.length); - const cipher = new AES256Cipher(key); - return cipher.decryptBlock(userEncryption, false, new Uint8Array(16)); - } -} -class PDF20 { - _hash(password, input, userBytes) { - let k = calculateSHA256(input, 0, input.length).subarray(0, 32); - let e = [0]; - let i = 0; - while (i < 64 || e.at(-1) > i - 32) { - const combinedLength = password.length + k.length + userBytes.length, - combinedArray = new Uint8Array(combinedLength); - let writeOffset = 0; - combinedArray.set(password, writeOffset); - writeOffset += password.length; - combinedArray.set(k, writeOffset); - writeOffset += k.length; - combinedArray.set(userBytes, writeOffset); - const k1 = new Uint8Array(combinedLength * 64); - for (let j = 0, pos = 0; j < 64; j++, pos += combinedLength) { - k1.set(combinedArray, pos); - } - const cipher = new AES128Cipher(k.subarray(0, 16)); - e = cipher.encrypt(k1, k.subarray(16, 32)); - const remainder = e.slice(0, 16).reduce((a, b) => a + b, 0) % 3; - if (remainder === 0) { - k = calculateSHA256(e, 0, e.length); - } else if (remainder === 1) { - k = calculateSHA384(e, 0, e.length); - } else if (remainder === 2) { - k = calculateSHA512(e, 0, e.length); - } - i++; - } - return k.subarray(0, 32); - } - checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) { - const hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerValidationSalt, password.length); - hashData.set(userBytes, password.length + ownerValidationSalt.length); - const result = this._hash(password, hashData, userBytes); - return isArrayEqual(result, ownerPassword); - } - checkUserPassword(password, userValidationSalt, userPassword) { - const hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userValidationSalt, password.length); - const result = this._hash(password, hashData, []); - return isArrayEqual(result, userPassword); - } - getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) { - const hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerKeySalt, password.length); - hashData.set(userBytes, password.length + ownerKeySalt.length); - const key = this._hash(password, hashData, userBytes); - const cipher = new AES256Cipher(key); - return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16)); - } - getUserKey(password, userKeySalt, userEncryption) { - const hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userKeySalt, password.length); - const key = this._hash(password, hashData, []); - const cipher = new AES256Cipher(key); - return cipher.decryptBlock(userEncryption, false, new Uint8Array(16)); - } -} -class CipherTransform { - constructor(stringCipherConstructor, streamCipherConstructor) { - this.StringCipherConstructor = stringCipherConstructor; - this.StreamCipherConstructor = streamCipherConstructor; - } - createStream(stream, length) { - const cipher = new this.StreamCipherConstructor(); - return new DecryptStream(stream, length, function cipherTransformDecryptStream(data, finalize) { - return cipher.decryptBlock(data, finalize); - }); - } - decryptString(s) { - const cipher = new this.StringCipherConstructor(); - let data = stringToBytes(s); - data = cipher.decryptBlock(data, true); - return bytesToString(data); - } - encryptString(s) { - const cipher = new this.StringCipherConstructor(); - if (cipher instanceof AESBaseCipher) { - const strLen = s.length; - const pad = 16 - strLen % 16; - s += String.fromCharCode(pad).repeat(pad); - const iv = new Uint8Array(16); - if (typeof crypto !== "undefined") { - crypto.getRandomValues(iv); + complexDoctype = true; + } + const doctypeContent = s.substring(j + 8, q + (complexDoctype ? 1 : 0)); + this.onDoctype(doctypeContent); + j = q + (complexDoctype ? 2 : 1); + } else { + this.onError(XMLParserErrorCode.MalformedElement); + return; + } + break; + default: + const content = this._parseContent(s, j); + if (content === null) { + this.onError(XMLParserErrorCode.MalformedElement); + return; + } + let isClosed = false; + if (s.substring(j + content.parsed, j + content.parsed + 2) === "/>") { + isClosed = true; + } else if (s.substring(j + content.parsed, j + content.parsed + 1) !== ">") { + this.onError(XMLParserErrorCode.UnterminatedElement); + return; + } + this.onBeginElement(content.name, content.attributes, isClosed); + j += content.parsed + (isClosed ? 2 : 1); + break; + } } else { - for (let i = 0; i < 16; i++) { - iv[i] = Math.floor(256 * Math.random()); + while (j < s.length && s[j] !== "<") { + j++; } + const text = s.substring(i, j); + this.onText(this._resolveEntities(text)); } - let data = stringToBytes(s); - data = cipher.encrypt(data, iv); - const buf = new Uint8Array(16 + data.length); - buf.set(iv); - buf.set(data, 16); - return bytesToString(buf); + i = j; } - let data = stringToBytes(s); - data = cipher.encrypt(data); - return bytesToString(data); } + onResolveEntity(name) { + return `&${name};`; + } + onPi(name, value) {} + onComment(text) {} + onCdata(text) {} + onDoctype(doctypeContent) {} + onText(text) {} + onBeginElement(name, attributes, isEmpty) {} + onEndElement(name) {} + onError(code) {} } -class CipherTransformFactory { - static #defaultPasswordBytes = new Uint8Array([0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a]); - #createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) { - if (password) { - const passwordLength = Math.min(127, password.length); - password = password.subarray(0, passwordLength); - } else { - password = []; - } - const pdfAlgorithm = revision === 6 ? new PDF20() : new PDF17(); - if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)) { - return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption); - } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt, uBytes, ownerPassword)) { - return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, ownerEncryption); - } - return null; +class SimpleDOMNode { + constructor(nodeName, nodeValue) { + this.nodeName = nodeName; + this.nodeValue = nodeValue; + Object.defineProperty(this, "parentNode", { + value: null, + writable: true + }); } - #prepareKeyData(fileId, password, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata) { - const hashDataSize = 40 + ownerPassword.length + fileId.length; - const hashData = new Uint8Array(hashDataSize); - let i = 0, - j, - n; - if (password) { - n = Math.min(32, password.length); - for (; i < n; ++i) { - hashData[i] = password[i]; - } - } - j = 0; - while (i < 32) { - hashData[i++] = CipherTransformFactory.#defaultPasswordBytes[j++]; + get firstChild() { + return this.childNodes?.[0]; + } + get nextSibling() { + const childNodes = this.parentNode.childNodes; + if (!childNodes) { + return undefined; } - for (j = 0, n = ownerPassword.length; j < n; ++j) { - hashData[i++] = ownerPassword[j]; + const index = childNodes.indexOf(this); + if (index === -1) { + return undefined; } - hashData[i++] = flags & 0xff; - hashData[i++] = flags >> 8 & 0xff; - hashData[i++] = flags >> 16 & 0xff; - hashData[i++] = flags >>> 24 & 0xff; - for (j = 0, n = fileId.length; j < n; ++j) { - hashData[i++] = fileId[j]; + return childNodes[index + 1]; + } + get textContent() { + if (!this.childNodes) { + return this.nodeValue || ""; } - if (revision >= 4 && !encryptMetadata) { - hashData[i++] = 0xff; - hashData[i++] = 0xff; - hashData[i++] = 0xff; - hashData[i++] = 0xff; + return this.childNodes.map(child => child.textContent).join(""); + } + get children() { + return this.childNodes || []; + } + hasChildNodes() { + return this.childNodes?.length > 0; + } + searchNode(paths, pos) { + if (pos >= paths.length) { + return this; } - let hash = calculateMD5(hashData, 0, i); - const keyLengthInBytes = keyLength >> 3; - if (revision >= 3) { - for (j = 0; j < 50; ++j) { - hash = calculateMD5(hash, 0, keyLengthInBytes); - } + const component = paths[pos]; + if (component.name.startsWith("#") && pos < paths.length - 1) { + return this.searchNode(paths, pos + 1); } - const encryptionKey = hash.subarray(0, keyLengthInBytes); - let cipher, checkData; - if (revision >= 3) { - for (i = 0; i < 32; ++i) { - hashData[i] = CipherTransformFactory.#defaultPasswordBytes[i]; - } - for (j = 0, n = fileId.length; j < n; ++j) { - hashData[i++] = fileId[j]; - } - cipher = new ARCFourCipher(encryptionKey); - checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i)); - n = encryptionKey.length; - const derivedKey = new Uint8Array(n); - for (j = 1; j <= 19; ++j) { - for (let k = 0; k < n; ++k) { - derivedKey[k] = encryptionKey[k] ^ j; - } - cipher = new ARCFourCipher(derivedKey); - checkData = cipher.encryptBlock(checkData); - } - for (j = 0, n = checkData.length; j < n; ++j) { - if (userPassword[j] !== checkData[j]) { + const stack = []; + let node = this; + while (true) { + if (component.name === node.nodeName) { + if (component.pos === 0) { + const res = node.searchNode(paths, pos + 1); + if (res !== null) { + return res; + } + } else if (stack.length === 0) { return null; + } else { + const [parent] = stack.pop(); + let siblingPos = 0; + for (const child of parent.childNodes) { + if (component.name === child.nodeName) { + if (siblingPos === component.pos) { + return child.searchNode(paths, pos + 1); + } + siblingPos++; + } + } + return node.searchNode(paths, pos + 1); } } - } else { - cipher = new ARCFourCipher(encryptionKey); - checkData = cipher.encryptBlock(CipherTransformFactory.#defaultPasswordBytes); - for (j = 0, n = checkData.length; j < n; ++j) { - if (userPassword[j] !== checkData[j]) { + if (node.childNodes?.length > 0) { + stack.push([node, 0]); + node = node.childNodes[0]; + } else if (stack.length === 0) { + return null; + } else { + while (stack.length !== 0) { + const [parent, currentPos] = stack.pop(); + const newPos = currentPos + 1; + if (newPos < parent.childNodes.length) { + stack.push([parent, newPos]); + node = parent.childNodes[newPos]; + break; + } + } + if (stack.length === 0) { return null; } } } - return encryptionKey; } - #decodeUserPassword(password, ownerPassword, revision, keyLength) { - const hashData = new Uint8Array(32); - let i = 0; - const n = Math.min(32, password.length); - for (; i < n; ++i) { - hashData[i] = password[i]; - } - let j = 0; - while (i < 32) { - hashData[i++] = CipherTransformFactory.#defaultPasswordBytes[j++]; + dump(buffer) { + if (this.nodeName === "#text") { + buffer.push(encodeToXmlString(this.nodeValue)); + return; } - let hash = calculateMD5(hashData, 0, i); - const keyLengthInBytes = keyLength >> 3; - if (revision >= 3) { - for (j = 0; j < 50; ++j) { - hash = calculateMD5(hash, 0, hash.length); + buffer.push(`<${this.nodeName}`); + if (this.attributes) { + for (const attribute of this.attributes) { + buffer.push(` ${attribute.name}="${encodeToXmlString(attribute.value)}"`); } } - let cipher, userPassword; - if (revision >= 3) { - userPassword = ownerPassword; - const derivedKey = new Uint8Array(keyLengthInBytes); - for (j = 19; j >= 0; j--) { - for (let k = 0; k < keyLengthInBytes; ++k) { - derivedKey[k] = hash[k] ^ j; - } - cipher = new ARCFourCipher(derivedKey); - userPassword = cipher.encryptBlock(userPassword); + if (this.hasChildNodes()) { + buffer.push(">"); + for (const child of this.childNodes) { + child.dump(buffer); } + buffer.push(``); + } else if (this.nodeValue) { + buffer.push(`>${encodeToXmlString(this.nodeValue)}`); } else { - cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes)); - userPassword = cipher.encryptBlock(ownerPassword); + buffer.push("/>"); } - return userPassword; } - #buildObjectKey(num, gen, encryptionKey, isAes = false) { - const key = new Uint8Array(encryptionKey.length + 9); - const n = encryptionKey.length; - let i; - for (i = 0; i < n; ++i) { - key[i] = encryptionKey[i]; - } - key[i++] = num & 0xff; - key[i++] = num >> 8 & 0xff; - key[i++] = num >> 16 & 0xff; - key[i++] = gen & 0xff; - key[i++] = gen >> 8 & 0xff; - if (isAes) { - key[i++] = 0x73; - key[i++] = 0x41; - key[i++] = 0x6c; - key[i++] = 0x54; - } - const hash = calculateMD5(key, 0, i); - return hash.subarray(0, Math.min(encryptionKey.length + 5, 16)); +} +class SimpleXMLParser extends XMLParserBase { + constructor({ + hasAttributes = false, + lowerCaseName = false + }) { + super(); + this._currentFragment = null; + this._stack = null; + this._errorCode = XMLParserErrorCode.NoError; + this._hasAttributes = hasAttributes; + this._lowerCaseName = lowerCaseName; } - #buildCipherConstructor(cf, name, num, gen, key) { - if (!(name instanceof Name)) { - throw new FormatError("Invalid crypt filter name."); - } - const self = this; - const cryptFilter = cf.get(name.name); - const cfm = cryptFilter?.get("CFM"); - if (!cfm || cfm.name === "None") { - return function () { - return new NullCipher(); - }; - } - if (cfm.name === "V2") { - return function () { - return new ARCFourCipher(self.#buildObjectKey(num, gen, key, false)); - }; - } - if (cfm.name === "AESV2") { - return function () { - return new AES128Cipher(self.#buildObjectKey(num, gen, key, true)); - }; + parseFromString(data) { + this._currentFragment = []; + this._stack = []; + this._errorCode = XMLParserErrorCode.NoError; + this.parseXml(data); + if (this._errorCode !== XMLParserErrorCode.NoError) { + return undefined; } - if (cfm.name === "AESV3") { - return function () { - return new AES256Cipher(key); - }; + const [documentElement] = this._currentFragment; + if (!documentElement) { + return undefined; } - throw new FormatError("Unknown crypto method"); + return { + documentElement + }; } - constructor(dict, fileId, password) { - const filter = dict.get("Filter"); - if (!isName(filter, "Standard")) { - throw new FormatError("unknown encryption method"); - } - this.filterName = filter.name; - this.dict = dict; - const algorithm = dict.get("V"); - if (!Number.isInteger(algorithm) || algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm !== 5) { - throw new FormatError("unsupported encryption algorithm"); - } - this.algorithm = algorithm; - let keyLength = dict.get("Length"); - if (!keyLength) { - if (algorithm <= 3) { - keyLength = 40; - } else { - const cfDict = dict.get("CF"); - const streamCryptoName = dict.get("StmF"); - if (cfDict instanceof Dict && streamCryptoName instanceof Name) { - cfDict.suppressEncryption = true; - const handlerDict = cfDict.get(streamCryptoName.name); - keyLength = handlerDict?.get("Length") || 128; - if (keyLength < 40) { - keyLength <<= 3; - } - } - } - } - if (!Number.isInteger(keyLength) || keyLength < 40 || keyLength % 8 !== 0) { - throw new FormatError("invalid key length"); + onText(text) { + if (isWhitespaceString(text)) { + return; } - const ownerBytes = stringToBytes(dict.get("O")), - userBytes = stringToBytes(dict.get("U")); - const ownerPassword = ownerBytes.subarray(0, 32); - const userPassword = userBytes.subarray(0, 32); - const flags = dict.get("P"); - const revision = dict.get("R"); - const encryptMetadata = (algorithm === 4 || algorithm === 5) && dict.get("EncryptMetadata") !== false; - this.encryptMetadata = encryptMetadata; - const fileIdBytes = stringToBytes(fileId); - let passwordBytes; - if (password) { - if (revision === 6) { - try { - password = utf8StringToString(password); - } catch { - warn("CipherTransformFactory: Unable to convert UTF8 encoded password."); - } - } - passwordBytes = stringToBytes(password); + const node = new SimpleDOMNode("#text", text); + this._currentFragment.push(node); + } + onCdata(text) { + const node = new SimpleDOMNode("#text", text); + this._currentFragment.push(node); + } + onBeginElement(name, attributes, isEmpty) { + if (this._lowerCaseName) { + name = name.toLowerCase(); } - let encryptionKey; - if (algorithm !== 5) { - encryptionKey = this.#prepareKeyData(fileIdBytes, passwordBytes, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata); - } else { - const ownerValidationSalt = ownerBytes.subarray(32, 40); - const ownerKeySalt = ownerBytes.subarray(40, 48); - const uBytes = userBytes.subarray(0, 48); - const userValidationSalt = userBytes.subarray(32, 40); - const userKeySalt = userBytes.subarray(40, 48); - const ownerEncryption = stringToBytes(dict.get("OE")); - const userEncryption = stringToBytes(dict.get("UE")); - const perms = stringToBytes(dict.get("Perms")); - encryptionKey = this.#createEncryptionKey20(revision, passwordBytes, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms); + const node = new SimpleDOMNode(name); + node.childNodes = []; + if (this._hasAttributes) { + node.attributes = attributes; } - if (!encryptionKey && !password) { - throw new PasswordException("No password given", PasswordResponses.NEED_PASSWORD); - } else if (!encryptionKey && password) { - const decodedPassword = this.#decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength); - encryptionKey = this.#prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata); + this._currentFragment.push(node); + if (isEmpty) { + return; } - if (!encryptionKey) { - throw new PasswordException("Incorrect Password", PasswordResponses.INCORRECT_PASSWORD); + this._stack.push(this._currentFragment); + this._currentFragment = node.childNodes; + } + onEndElement(name) { + this._currentFragment = this._stack.pop() || []; + const lastElement = this._currentFragment.at(-1); + if (!lastElement) { + return null; } - this.encryptionKey = encryptionKey; - if (algorithm >= 4) { - const cf = dict.get("CF"); - if (cf instanceof Dict) { - cf.suppressEncryption = true; - } - this.cf = cf; - this.stmf = dict.get("StmF") || Name.get("Identity"); - this.strf = dict.get("StrF") || Name.get("Identity"); - this.eff = dict.get("EFF") || this.stmf; + for (const childNode of lastElement.childNodes) { + childNode.parentNode = lastElement; } + return lastElement; } - createCipherTransform(num, gen) { - if (this.algorithm === 4 || this.algorithm === 5) { - return new CipherTransform(this.#buildCipherConstructor(this.cf, this.strf, num, gen, this.encryptionKey), this.#buildCipherConstructor(this.cf, this.stmf, num, gen, this.encryptionKey)); - } - const key = this.#buildObjectKey(num, gen, this.encryptionKey, false); - const cipherConstructor = function () { - return new ARCFourCipher(key); - }; - return new CipherTransform(cipherConstructor, cipherConstructor); + onError(code) { + this._errorCode = code; } } -;// CONCATENATED MODULE: ./src/core/writer.js - - - - - - +;// ./src/core/metadata_parser.js -async function writeObject(ref, obj, buffer, { - encrypt = null -}) { - const transform = encrypt?.createCipherTransform(ref.num, ref.gen); - buffer.push(`${ref.num} ${ref.gen} obj\n`); - if (obj instanceof Dict) { - await writeDict(obj, buffer, transform); - } else if (obj instanceof BaseStream) { - await writeStream(obj, buffer, transform); - } else if (Array.isArray(obj) || ArrayBuffer.isView(obj)) { - await writeArray(obj, buffer, transform); - } - buffer.push("\nendobj\n"); -} -async function writeDict(dict, buffer, transform) { - buffer.push("<<"); - for (const key of dict.getKeys()) { - buffer.push(` /${escapePDFName(key)} `); - await writeValue(dict.getRaw(key), buffer, transform); +class MetadataParser { + constructor(data) { + data = this._repair(data); + const parser = new SimpleXMLParser({ + lowerCaseName: true + }); + const xmlDocument = parser.parseFromString(data); + this._metadataMap = new Map(); + this._data = data; + if (xmlDocument) { + this._parse(xmlDocument); + } } - buffer.push(">>"); -} -async function writeStream(stream, buffer, transform) { - let bytes = stream.getBytes(); - const { - dict - } = stream; - const [filter, params] = await Promise.all([dict.getAsync("Filter"), dict.getAsync("DecodeParms")]); - const filterZero = Array.isArray(filter) ? await dict.xref.fetchIfRefAsync(filter[0]) : filter; - const isFilterZeroFlateDecode = isName(filterZero, "FlateDecode"); - const MIN_LENGTH_FOR_COMPRESSING = 256; - if (typeof CompressionStream !== "undefined" && (bytes.length >= MIN_LENGTH_FOR_COMPRESSING || isFilterZeroFlateDecode)) { - try { - const cs = new CompressionStream("deflate"); - const writer = cs.writable.getWriter(); - writer.write(bytes); - writer.close(); - const buf = await new Response(cs.readable).arrayBuffer(); - bytes = new Uint8Array(buf); - let newFilter, newParams; - if (!filter) { - newFilter = Name.get("FlateDecode"); - } else if (!isFilterZeroFlateDecode) { - newFilter = Array.isArray(filter) ? [Name.get("FlateDecode"), ...filter] : [Name.get("FlateDecode"), filter]; - if (params) { - newParams = Array.isArray(params) ? [null, ...params] : [null, params]; + _repair(data) { + return data.replace(/^[^<]+/, "").replaceAll(/>\\376\\377([^<]+)/g, function (all, codes) { + const bytes = codes.replaceAll(/\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) { + return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1); + }).replaceAll(/&(amp|apos|gt|lt|quot);/g, function (str, name) { + switch (name) { + case "amp": + return "&"; + case "apos": + return "'"; + case "gt": + return ">"; + case "lt": + return "<"; + case "quot": + return '"'; + } + throw new Error(`_repair: ${name} isn't defined.`); + }); + const charBuf = [">"]; + for (let i = 0, ii = bytes.length; i < ii; i += 2) { + const code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1); + if (code >= 32 && code < 127 && code !== 60 && code !== 62 && code !== 38) { + charBuf.push(String.fromCharCode(code)); + } else { + charBuf.push("&#x" + (0x10000 + code).toString(16).substring(1) + ";"); } } - if (newFilter) { - dict.set("Filter", newFilter); - } - if (newParams) { - dict.set("DecodeParms", newParams); - } - } catch (ex) { - info(`writeStream - cannot compress data: "${ex}".`); - } - } - let string = bytesToString(bytes); - if (transform) { - string = transform.encryptString(string); + return charBuf.join(""); + }); } - dict.set("Length", string.length); - await writeDict(dict, buffer, transform); - buffer.push(" stream\n", string, "\nendstream"); -} -async function writeArray(array, buffer, transform) { - buffer.push("["); - let first = true; - for (const val of array) { - if (!first) { - buffer.push(" "); - } else { - first = false; + _getSequence(entry) { + const name = entry.nodeName; + if (name !== "rdf:bag" && name !== "rdf:seq" && name !== "rdf:alt") { + return null; } - await writeValue(val, buffer, transform); + return entry.childNodes.filter(node => node.nodeName === "rdf:li"); } - buffer.push("]"); -} -async function writeValue(value, buffer, transform) { - if (value instanceof Name) { - buffer.push(`/${escapePDFName(value.name)}`); - } else if (value instanceof Ref) { - buffer.push(`${value.num} ${value.gen} R`); - } else if (Array.isArray(value) || ArrayBuffer.isView(value)) { - await writeArray(value, buffer, transform); - } else if (typeof value === "string") { - if (transform) { - value = transform.encryptString(value); + _parseArray(entry) { + if (!entry.hasChildNodes()) { + return; } - buffer.push(`(${escapeString(value)})`); - } else if (typeof value === "number") { - buffer.push(numberToString(value)); - } else if (typeof value === "boolean") { - buffer.push(value.toString()); - } else if (value instanceof Dict) { - await writeDict(value, buffer, transform); - } else if (value instanceof BaseStream) { - await writeStream(value, buffer, transform); - } else if (value === null) { - buffer.push("null"); - } else { - warn(`Unhandled value in writer: ${typeof value}, please file a bug.`); - } -} -function writeInt(number, size, offset, buffer) { - for (let i = size + offset - 1; i > offset - 1; i--) { - buffer[i] = number & 0xff; - number >>= 8; - } - return offset + size; -} -function writeString(string, offset, buffer) { - for (let i = 0, len = string.length; i < len; i++) { - buffer[offset + i] = string.charCodeAt(i) & 0xff; - } -} -function computeMD5(filesize, xrefInfo) { - const time = Math.floor(Date.now() / 1000); - const filename = xrefInfo.filename || ""; - const md5Buffer = [time.toString(), filename, filesize.toString()]; - let md5BufferLen = md5Buffer.reduce((a, str) => a + str.length, 0); - for (const value of Object.values(xrefInfo.info)) { - md5Buffer.push(value); - md5BufferLen += value.length; - } - const array = new Uint8Array(md5BufferLen); - let offset = 0; - for (const str of md5Buffer) { - writeString(str, offset, array); - offset += str.length; + const [seqNode] = entry.childNodes; + const sequence = this._getSequence(seqNode) || []; + this._metadataMap.set(entry.nodeName, sequence.map(node => node.textContent.trim())); } - return bytesToString(calculateMD5(array)); -} -function writeXFADataForAcroform(str, newRefs) { - const xml = new SimpleXMLParser({ - hasAttributes: true - }).parseFromString(str); - for (const { - xfa - } of newRefs) { - if (!xfa) { - continue; - } - const { - path, - value - } = xfa; - if (!path) { - continue; - } - const nodePath = parseXFAPath(path); - let node = xml.documentElement.searchNode(nodePath, 0); - if (!node && nodePath.length > 1) { - node = xml.documentElement.searchNode([nodePath.at(-1)], 0); - } - if (node) { - node.childNodes = Array.isArray(value) ? value.map(val => new SimpleDOMNode("value", val)) : [new SimpleDOMNode("#text", value)]; - } else { - warn(`Node not found for path: ${path}`); + _parse(xmlDocument) { + let rdf = xmlDocument.documentElement; + if (rdf.nodeName !== "rdf:rdf") { + rdf = rdf.firstChild; + while (rdf && rdf.nodeName !== "rdf:rdf") { + rdf = rdf.nextSibling; + } } - } - const buffer = []; - xml.documentElement.dump(buffer); - return buffer.join(""); -} -async function updateAcroform({ - xref, - acroForm, - acroFormRef, - hasXfa, - hasXfaDatasetsEntry, - xfaDatasetsRef, - needAppearances, - newRefs -}) { - if (hasXfa && !hasXfaDatasetsEntry && !xfaDatasetsRef) { - warn("XFA - Cannot save it"); - } - if (!needAppearances && (!hasXfa || !xfaDatasetsRef || hasXfaDatasetsEntry)) { - return; - } - const dict = acroForm.clone(); - if (hasXfa && !hasXfaDatasetsEntry) { - const newXfa = acroForm.get("XFA").slice(); - newXfa.splice(2, 0, "datasets"); - newXfa.splice(3, 0, xfaDatasetsRef); - dict.set("XFA", newXfa); - } - if (needAppearances) { - dict.set("NeedAppearances", true); - } - const buffer = []; - await writeObject(acroFormRef, dict, buffer, xref); - newRefs.push({ - ref: acroFormRef, - data: buffer.join("") - }); -} -function updateXFA({ - xfaData, - xfaDatasetsRef, - newRefs, - xref -}) { - if (xfaData === null) { - const datasets = xref.fetchIfRef(xfaDatasetsRef); - xfaData = writeXFADataForAcroform(datasets.getString(), newRefs); - } - const encrypt = xref.encrypt; - if (encrypt) { - const transform = encrypt.createCipherTransform(xfaDatasetsRef.num, xfaDatasetsRef.gen); - xfaData = transform.encryptString(xfaData); - } - const data = `${xfaDatasetsRef.num} ${xfaDatasetsRef.gen} obj\n` + `<< /Type /EmbeddedFile /Length ${xfaData.length}>>\nstream\n` + xfaData + "\nendstream\nendobj\n"; - newRefs.push({ - ref: xfaDatasetsRef, - data - }); -} -async function getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer) { - buffer.push("xref\n"); - const indexes = getIndexes(newRefs); - let indexesPosition = 0; - for (const { - ref, - data - } of newRefs) { - if (ref.num === indexes[indexesPosition]) { - buffer.push(`${indexes[indexesPosition]} ${indexes[indexesPosition + 1]}\n`); - indexesPosition += 2; + if (!rdf || rdf.nodeName !== "rdf:rdf" || !rdf.hasChildNodes()) { + return; } - buffer.push(`${baseOffset.toString().padStart(10, "0")} ${Math.min(ref.gen, 0xffff).toString().padStart(5, "0")} n\r\n`); - baseOffset += data.length; - } - computeIDs(baseOffset, xrefInfo, newXref); - buffer.push("trailer\n"); - await writeDict(newXref, buffer); - buffer.push("\nstartxref\n", baseOffset.toString(), "\n%%EOF\n"); -} -function getIndexes(newRefs) { - const indexes = []; - for (const { - ref - } of newRefs) { - if (ref.num === indexes.at(-2) + indexes.at(-1)) { - indexes[indexes.length - 1] += 1; - } else { - indexes.push(ref.num, 1); + for (const desc of rdf.childNodes) { + if (desc.nodeName !== "rdf:description") { + continue; + } + for (const entry of desc.childNodes) { + const name = entry.nodeName; + switch (name) { + case "#text": + continue; + case "dc:creator": + case "dc:subject": + this._parseArray(entry); + continue; + } + this._metadataMap.set(name, entry.textContent.trim()); + } } } - return indexes; -} -async function getXRefStreamTable(xrefInfo, baseOffset, newRefs, newXref, buffer) { - const xrefTableData = []; - let maxOffset = 0; - let maxGen = 0; - for (const { - ref, - data - } of newRefs) { - maxOffset = Math.max(maxOffset, baseOffset); - const gen = Math.min(ref.gen, 0xffff); - maxGen = Math.max(maxGen, gen); - xrefTableData.push([1, baseOffset, gen]); - baseOffset += data.length; - } - newXref.set("Index", getIndexes(newRefs)); - const offsetSize = getSizeInBytes(maxOffset); - const maxGenSize = getSizeInBytes(maxGen); - const sizes = [1, offsetSize, maxGenSize]; - newXref.set("W", sizes); - computeIDs(baseOffset, xrefInfo, newXref); - const structSize = sizes.reduce((a, x) => a + x, 0); - const data = new Uint8Array(structSize * xrefTableData.length); - const stream = new Stream(data); - stream.dict = newXref; - let offset = 0; - for (const [type, objOffset, gen] of xrefTableData) { - offset = writeInt(type, sizes[0], offset, data); - offset = writeInt(objOffset, sizes[1], offset, data); - offset = writeInt(gen, sizes[2], offset, data); - } - await writeObject(xrefInfo.newRef, stream, buffer, {}); - buffer.push("startxref\n", baseOffset.toString(), "\n%%EOF\n"); -} -function computeIDs(baseOffset, xrefInfo, newXref) { - if (Array.isArray(xrefInfo.fileIds) && xrefInfo.fileIds.length > 0) { - const md5 = computeMD5(baseOffset, xrefInfo); - newXref.set("ID", [xrefInfo.fileIds[0], md5]); - } -} -function getTrailerDict(xrefInfo, newRefs, useXrefStream) { - const newXref = new Dict(null); - newXref.set("Prev", xrefInfo.startXRef); - const refForXrefTable = xrefInfo.newRef; - if (useXrefStream) { - newRefs.push({ - ref: refForXrefTable, - data: "" - }); - newXref.set("Size", refForXrefTable.num + 1); - newXref.set("Type", Name.get("XRef")); - } else { - newXref.set("Size", refForXrefTable.num); - } - if (xrefInfo.rootRef !== null) { - newXref.set("Root", xrefInfo.rootRef); - } - if (xrefInfo.infoRef !== null) { - newXref.set("Info", xrefInfo.infoRef); - } - if (xrefInfo.encryptRef !== null) { - newXref.set("Encrypt", xrefInfo.encryptRef); - } - return newXref; -} -async function incrementalUpdate({ - originalData, - xrefInfo, - newRefs, - xref = null, - hasXfa = false, - xfaDatasetsRef = null, - hasXfaDatasetsEntry = false, - needAppearances, - acroFormRef = null, - acroForm = null, - xfaData = null, - useXrefStream = false -}) { - await updateAcroform({ - xref, - acroForm, - acroFormRef, - hasXfa, - hasXfaDatasetsEntry, - xfaDatasetsRef, - needAppearances, - newRefs - }); - if (hasXfa) { - updateXFA({ - xfaData, - xfaDatasetsRef, - newRefs, - xref - }); - } - let buffer, baseOffset; - const lastByte = originalData.at(-1); - if (lastByte === 0x0a || lastByte === 0x0d) { - buffer = []; - baseOffset = originalData.length; - } else { - buffer = ["\n"]; - baseOffset = originalData.length + 1; - } - const newXref = getTrailerDict(xrefInfo, newRefs, useXrefStream); - newRefs = newRefs.sort((a, b) => a.ref.num - b.ref.num); - for (const { - data - } of newRefs) { - buffer.push(data); - } - await (useXrefStream ? getXRefStreamTable(xrefInfo, baseOffset, newRefs, newXref, buffer) : getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer)); - const totalLength = buffer.reduce((a, str) => a + str.length, originalData.length); - const array = new Uint8Array(totalLength); - array.set(originalData); - let offset = originalData.length; - for (const str of buffer) { - writeString(str, offset, array); - offset += str.length; + get serializable() { + return { + parsedData: this._metadataMap, + rawData: this._data + }; } - return array; } -;// CONCATENATED MODULE: ./src/core/struct_tree.js +;// ./src/core/struct_tree.js + + + @@ -37645,14 +39252,47 @@ ELEMENT: 5 }; class StructTreeRoot { - constructor(rootDict, rootRef) { + kidRefToPosition = undefined; + parentTree = null; + roleMap = new Map(); + structParentIds = null; + constructor(xref, rootDict, rootRef) { + this.xref = xref; this.dict = rootDict; this.ref = rootRef instanceof Ref ? rootRef : null; - this.roleMap = new Map(); - this.structParentIds = null; + const roleMap = rootDict.get("RoleMap"); + if (roleMap instanceof Dict) { + for (const [key, value] of roleMap) { + if (value instanceof Name) { + this.roleMap.set(key, value.name); + } + } + } + const parentTree = rootDict.getRaw("ParentTree"); + if (parentTree) { + this.parentTree = new NumberTree(parentTree, xref); + } } - init() { - this.readRoleMap(); + getKidPosition(kidRef) { + if (this.kidRefToPosition === undefined) { + const obj = this.dict.get("K"); + if (Array.isArray(obj)) { + const map = this.kidRefToPosition = new Map(); + for (let i = 0, ii = obj.length; i < ii; i++) { + const ref = obj[i]; + if (ref) { + map.set(ref.toString(), i); + } + } + } else if (obj instanceof Dict) { + this.kidRefToPosition = new Map([[obj.objId, 0]]); + } else if (!obj) { + this.kidRefToPosition = new Map(); + } else { + this.kidRefToPosition = null; + } + } + return this.kidRefToPosition ? this.kidRefToPosition.get(kidRef) ?? NaN : -1; } #addIdToPage(pageRef, id, type) { if (!(pageRef instanceof Ref) || id < 0) { @@ -37669,18 +39309,6 @@ addAnnotationIdToPage(pageRef, id) { this.#addIdToPage(pageRef, id, StructElementType.ANNOTATION); } - readRoleMap() { - const roleMapDict = this.dict.get("RoleMap"); - if (!(roleMapDict instanceof Dict)) { - return; - } - roleMapDict.forEach((key, value) => { - if (!(value instanceof Name)) { - return; - } - this.roleMap.set(key, value.name); - }); - } static async canCreateStructureTree({ catalogRef, pdfManager, @@ -37723,53 +39351,44 @@ xref, catalogRef, pdfManager, - newRefs + changes }) { - const root = pdfManager.catalog.cloneDict(); + const root = await pdfManager.ensureCatalog("cloneDict"); + const cache = new RefSetCache(); + cache.put(catalogRef, root); const structTreeRootRef = xref.getNewTemporaryRef(); root.set("StructTreeRoot", structTreeRootRef); - const buffer = []; - await writeObject(catalogRef, root, buffer, xref); - newRefs.push({ - ref: catalogRef, - data: buffer.join("") - }); const structTreeRoot = new Dict(xref); structTreeRoot.set("Type", Name.get("StructTreeRoot")); const parentTreeRef = xref.getNewTemporaryRef(); structTreeRoot.set("ParentTree", parentTreeRef); const kids = []; structTreeRoot.set("K", kids); + cache.put(structTreeRootRef, structTreeRoot); const parentTree = new Dict(xref); const nums = []; parentTree.set("Nums", nums); const nextKey = await this.#writeKids({ newAnnotationsByPage, structTreeRootRef, + structTreeRoot: null, kids, nums, xref, pdfManager, - newRefs, - buffer + changes, + cache }); structTreeRoot.set("ParentTreeNextKey", nextKey); - buffer.length = 0; - await writeObject(parentTreeRef, parentTree, buffer, xref); - newRefs.push({ - ref: parentTreeRef, - data: buffer.join("") - }); - buffer.length = 0; - await writeObject(structTreeRootRef, structTreeRoot, buffer, xref); - newRefs.push({ - ref: structTreeRootRef, - data: buffer.join("") - }); + cache.put(parentTreeRef, parentTree); + for (const [ref, obj] of cache.items()) { + changes.put(ref, { + data: obj + }); + } } async canUpdateStructTree({ pdfManager, - xref, newAnnotationsByPage }) { if (!this.ref) { @@ -37791,7 +39410,7 @@ warn("Cannot update the struct tree: nums isn't an array."); return false; } - const numberTree = new NumberTree(parentTree, xref); + const numberTree = new NumberTree(parentTree, this.xref); for (const pageIndex of newAnnotationsByPage.keys()) { const { pageDict @@ -37812,13 +39431,15 @@ } = await pdfManager.getPage(pageIndex); StructTreeRoot.#collectParents({ elements, - xref: this.dict.xref, + xref: this.xref, pageDict, numberTree }); for (const element of elements) { if (element.accessibilityData?.type) { - element.parentTreeId = nextKey++; + if (!(element.accessibilityData.structParent >= 0)) { + element.parentTreeId = nextKey++; + } hasNothingToUpdate = false; } } @@ -37837,11 +39458,15 @@ async updateStructureTree({ newAnnotationsByPage, pdfManager, - newRefs + changes }) { - const xref = this.dict.xref; + const { + ref: structTreeRootRef, + xref + } = this; const structTreeRoot = this.dict.clone(); - const structTreeRootRef = this.ref; + const cache = new RefSetCache(); + cache.put(structTreeRootRef, structTreeRoot); let parentTreeRef = structTreeRoot.getRaw("ParentTree"); let parentTree; if (parentTreeRef instanceof Ref) { @@ -37852,6 +39477,7 @@ structTreeRoot.set("ParentTree", parentTreeRef); } parentTree = parentTree.clone(); + cache.put(parentTreeRef, parentTree); let nums = parentTree.getRaw("Nums"); let numsRef = null; if (nums instanceof Ref) { @@ -37862,71 +39488,49 @@ if (!numsRef) { parentTree.set("Nums", nums); } - let kids = structTreeRoot.getRaw("K"); - let kidsRef = null; - if (kids instanceof Ref) { - kidsRef = kids; - kids = xref.fetch(kidsRef); - } else { - kidsRef = xref.getNewTemporaryRef(); - structTreeRoot.set("K", kidsRef); - } - kids = Array.isArray(kids) ? kids.slice() : [kids]; - const buffer = []; - const newNextkey = await StructTreeRoot.#writeKids({ + const newNextKey = await StructTreeRoot.#writeKids({ newAnnotationsByPage, structTreeRootRef, - kids, + structTreeRoot: this, + kids: null, nums, xref, pdfManager, - newRefs, - buffer - }); - structTreeRoot.set("ParentTreeNextKey", newNextkey); - buffer.length = 0; - await writeObject(kidsRef, kids, buffer, xref); - newRefs.push({ - ref: kidsRef, - data: buffer.join("") + changes, + cache }); + if (newNextKey === -1) { + return; + } + structTreeRoot.set("ParentTreeNextKey", newNextKey); if (numsRef) { - buffer.length = 0; - await writeObject(numsRef, nums, buffer, xref); - newRefs.push({ - ref: numsRef, - data: buffer.join("") + cache.put(numsRef, nums); + } + for (const [ref, obj] of cache.items()) { + changes.put(ref, { + data: obj }); } - buffer.length = 0; - await writeObject(parentTreeRef, parentTree, buffer, xref); - newRefs.push({ - ref: parentTreeRef, - data: buffer.join("") - }); - buffer.length = 0; - await writeObject(structTreeRootRef, structTreeRoot, buffer, xref); - newRefs.push({ - ref: structTreeRootRef, - data: buffer.join("") - }); } static async #writeKids({ newAnnotationsByPage, structTreeRootRef, + structTreeRoot, kids, nums, xref, pdfManager, - newRefs, - buffer + changes, + cache }) { const objr = Name.get("OBJR"); - let nextKey = -Infinity; + let nextKey = -1; + let structTreePageObjs; for (const [pageIndex, elements] of newAnnotationsByPage) { + const page = await pdfManager.getPage(pageIndex); const { ref: pageRef - } = await pdfManager.getPage(pageIndex); + } = page; const isPageRef = pageRef instanceof Ref; for (const { accessibilityData, @@ -37938,45 +39542,38 @@ continue; } const { - type, - title, - lang, - alt, - expanded, - actualText + structParent } = accessibilityData; + if (structTreeRoot && Number.isInteger(structParent) && structParent >= 0) { + let objs = (structTreePageObjs ||= new Map()).get(pageIndex); + if (objs === undefined) { + const structTreePage = new StructTreePage(structTreeRoot, page.pageDict); + objs = structTreePage.collectObjects(pageRef); + structTreePageObjs.set(pageIndex, objs); + } + const objRef = objs?.get(structParent); + if (objRef) { + const tagDict = xref.fetch(objRef).clone(); + StructTreeRoot.#writeProperties(tagDict, accessibilityData); + changes.put(objRef, { + data: tagDict + }); + continue; + } + } nextKey = Math.max(nextKey, parentTreeId); const tagRef = xref.getNewTemporaryRef(); const tagDict = new Dict(xref); - tagDict.set("S", Name.get(type)); - if (title) { - tagDict.set("T", title); - } - if (lang) { - tagDict.set("Lang", lang); - } - if (alt) { - tagDict.set("Alt", alt); - } - if (expanded) { - tagDict.set("E", expanded); - } - if (actualText) { - tagDict.set("ActualText", actualText); - } - if (structTreeParent) { - await this.#updateParentTag({ - structTreeParent, - tagDict, - newTagRef: tagRef, - fallbackRef: structTreeRootRef, - xref, - newRefs, - buffer - }); - } else { - tagDict.set("P", structTreeRootRef); - } + StructTreeRoot.#writeProperties(tagDict, accessibilityData); + await this.#updateParentTag({ + structTreeParent, + tagDict, + newTagRef: tagRef, + structTreeRootRef, + fallbackKids: kids, + xref, + cache + }); const objDict = new Dict(xref); tagDict.set("K", objDict); objDict.set("Type", objr); @@ -37984,29 +39581,48 @@ objDict.set("Pg", pageRef); } objDict.set("Obj", ref); - buffer.length = 0; - await writeObject(tagRef, tagDict, buffer, xref); - newRefs.push({ - ref: tagRef, - data: buffer.join("") - }); + cache.put(tagRef, tagDict); nums.push(parentTreeId, tagRef); - kids.push(tagRef); } } return nextKey + 1; } + static #writeProperties(tagDict, { + type, + title, + lang, + alt, + expanded, + actualText + }) { + tagDict.set("S", Name.get(type)); + if (title) { + tagDict.set("T", stringToAsciiOrUTF16BE(title)); + } + if (lang) { + tagDict.set("Lang", stringToAsciiOrUTF16BE(lang)); + } + if (alt) { + tagDict.set("Alt", stringToAsciiOrUTF16BE(alt)); + } + if (expanded) { + tagDict.set("E", stringToAsciiOrUTF16BE(expanded)); + } + if (actualText) { + tagDict.set("ActualText", stringToAsciiOrUTF16BE(actualText)); + } + } static #collectParents({ elements, xref, pageDict, numberTree }) { - const idToElement = new Map(); + const idToElements = new Map(); for (const element of elements) { if (element.structTreeParentId) { const id = parseInt(element.structTreeParentId.split("_mc")[1], 10); - idToElement.set(id, element); + idToElements.getOrInsertComputed(id, makeArr).push(element); } } const id = pageDict.get("StructParents"); @@ -38015,15 +39631,18 @@ } const parentArray = numberTree.get(id); const updateElement = (kid, pageKid, kidRef) => { - const element = idToElement.get(kid); - if (element) { + const elems = idToElements.get(kid); + if (elems) { const parentRef = pageKid.getRaw("P"); const parentDict = xref.fetchIfRef(parentRef); if (parentRef instanceof Ref && parentDict instanceof Dict) { - element.structTreeParent = { + const params = { ref: kidRef, dict: pageKid }; + for (const element of elems) { + element.structTreeParent = params; + } } return true; } @@ -38047,72 +39666,66 @@ if (Number.isInteger(kid) && updateElement(kid, pageKid, kidRef)) { break; } + if (!(kid instanceof Dict)) { + continue; + } + if (!isName(kid.get("Type"), "MCR")) { + break; + } + const mcid = kid.get("MCID"); + if (Number.isInteger(mcid) && updateElement(mcid, pageKid, kidRef)) { + break; + } } } } static async #updateParentTag({ - structTreeParent: { - ref, - dict - }, + structTreeParent, tagDict, newTagRef, - fallbackRef, + structTreeRootRef, + fallbackKids, xref, - newRefs, - buffer + cache }) { - const parentRef = dict.getRaw("P"); - let parentDict = xref.fetchIfRef(parentRef); - tagDict.set("P", parentRef); - let saveParentDict = false; - let parentKids; - let parentKidsRef = parentDict.getRaw("K"); - if (!(parentKidsRef instanceof Ref)) { - parentKids = parentKidsRef; - parentKidsRef = xref.getNewTemporaryRef(); - parentDict = parentDict.clone(); - parentDict.set("K", parentKidsRef); - saveParentDict = true; - } else { - parentKids = xref.fetch(parentKidsRef); - } - if (Array.isArray(parentKids)) { - const index = parentKids.indexOf(ref); - if (index >= 0) { - parentKids = parentKids.slice(); - parentKids.splice(index + 1, 0, newTagRef); - } else { - warn("Cannot update the struct tree: parent kid not found."); - tagDict.set("P", fallbackRef); - return; - } - } else if (parentKids instanceof Dict) { - parentKids = [parentKidsRef, newTagRef]; - parentKidsRef = xref.getNewTemporaryRef(); - parentDict.set("K", parentKidsRef); - saveParentDict = true; + let ref = null; + let parentRef; + if (structTreeParent) { + ({ + ref + } = structTreeParent); + parentRef = structTreeParent.dict.getRaw("P") || structTreeRootRef; + } else { + parentRef = structTreeRootRef; } - buffer.length = 0; - await writeObject(parentKidsRef, parentKids, buffer, xref); - newRefs.push({ - ref: parentKidsRef, - data: buffer.join("") - }); - if (!saveParentDict) { - return; + tagDict.set("P", parentRef); + const parentDict = xref.fetchIfRef(parentRef); + if (!parentDict) { + fallbackKids.push(newTagRef); + return; + } + let cachedParentDict = cache.get(parentRef); + if (!cachedParentDict) { + cachedParentDict = parentDict.clone(); + cache.put(parentRef, cachedParentDict); + } + const parentKidsRaw = cachedParentDict.getRaw("K"); + let cachedParentKids = parentKidsRaw instanceof Ref ? cache.get(parentKidsRaw) : null; + if (!cachedParentKids) { + cachedParentKids = xref.fetchIfRef(parentKidsRaw); + cachedParentKids = Array.isArray(cachedParentKids) ? cachedParentKids.slice() : [parentKidsRaw]; + const parentKidsRef = xref.getNewTemporaryRef(); + cachedParentDict.set("K", parentKidsRef); + cache.put(parentKidsRef, cachedParentKids); } - buffer.length = 0; - await writeObject(parentRef, parentDict, buffer, xref); - newRefs.push({ - ref: parentRef, - data: buffer.join("") - }); + const index = cachedParentKids.indexOf(ref); + cachedParentKids.splice(index >= 0 ? index + 1 : cachedParentKids.length, 0, newTagRef); } } class StructElementNode { constructor(tree, dict) { this.tree = tree; + this.xref = tree.xref; this.dict = dict; this.kids = []; this.parseKids(); @@ -38123,10 +39736,33 @@ const { root } = this.tree; - if (root.roleMap.has(name)) { - return root.roleMap.get(name); + return root.roleMap.get(name) ?? name; + } + get mathML() { + let AFs = this.dict.get("AF") || []; + if (!Array.isArray(AFs)) { + AFs = [AFs]; } - return name; + for (let af of AFs) { + af = this.xref.fetchIfRef(af); + if (!isDict(af, "Filespec") || !isName(af.get("AFRelationship"), "Supplement")) { + continue; + } + const fileStream = FileSpec.pickPlatformItem(af.get("EF")); + if (!(fileStream instanceof BaseStream) || !isDict(fileStream.dict, "EmbeddedFile") || !isName(fileStream.dict.get("Subtype"), "application/mathml+xml")) { + continue; + } + return stringToUTF8String(fileStream.getString()); + } + const A = this.dict.get("A"); + if (A instanceof Dict) { + const O = A.get("O"); + if (isName(O, "MSFT_Office")) { + const mathml = A.get("MSFT_MathML"); + return mathml ? stringToPDFString(mathml) : null; + } + } + return null; } parseKids() { let pageObjId = null; @@ -38137,7 +39773,7 @@ const kids = this.dict.get("K"); if (Array.isArray(kids)) { for (const kid of kids) { - const element = this.parseKid(pageObjId, kid); + const element = this.parseKid(pageObjId, this.xref.fetchIfRef(kid)); if (element) { this.kids.push(element); } @@ -38160,37 +39796,31 @@ pageObjId }); } - let kidDict = null; - if (kid instanceof Ref) { - kidDict = this.dict.xref.fetch(kid); - } else if (kid instanceof Dict) { - kidDict = kid; - } - if (!kidDict) { + if (!(kid instanceof Dict)) { return null; } - const pageRef = kidDict.getRaw("Pg"); + const pageRef = kid.getRaw("Pg"); if (pageRef instanceof Ref) { pageObjId = pageRef.toString(); } - const type = kidDict.get("Type") instanceof Name ? kidDict.get("Type").name : null; + const type = kid.get("Type") instanceof Name ? kid.get("Type").name : null; if (type === "MCR") { if (this.tree.pageDict.objId !== pageObjId) { return null; } - const kidRef = kidDict.getRaw("Stm"); + const kidRef = kid.getRaw("Stm"); return new StructElement({ type: StructElementType.STREAM_CONTENT, refObjId: kidRef instanceof Ref ? kidRef.toString() : null, pageObjId, - mcid: kidDict.get("MCID") + mcid: kid.get("MCID") }); } if (type === "OBJR") { if (this.tree.pageDict.objId !== pageObjId) { return null; } - const kidRef = kidDict.getRaw("Obj"); + const kidRef = kid.getRaw("Obj"); return new StructElement({ type: StructElementType.OBJECT, refObjId: kidRef instanceof Ref ? kidRef.toString() : null, @@ -38199,7 +39829,7 @@ } return new StructElement({ type: StructElementType.ELEMENT, - dict: kidDict + dict: kid }); } } @@ -38222,31 +39852,55 @@ class StructTreePage { constructor(structTreeRoot, pageDict) { this.root = structTreeRoot; - this.rootDict = structTreeRoot ? structTreeRoot.dict : null; + this.xref = structTreeRoot?.xref ?? null; + this.rootDict = structTreeRoot?.dict ?? null; this.pageDict = pageDict; this.nodes = []; } + collectObjects(pageRef) { + if (!this.root || !this.rootDict || !(pageRef instanceof Ref)) { + return null; + } + const parentTree = this.rootDict.get("ParentTree"); + if (!parentTree) { + return null; + } + const ids = this.root.structParentIds?.get(pageRef); + if (!ids) { + return null; + } + const map = new Map(); + const numberTree = new NumberTree(parentTree, this.xref); + for (const [elemId] of ids) { + const obj = numberTree.getRaw(elemId); + if (obj instanceof Ref) { + map.set(elemId, obj); + } + } + return map; + } parse(pageRef) { - if (!this.root || !this.rootDict) { + if (!this.root || !this.rootDict || !(pageRef instanceof Ref)) { return; } - const parentTree = this.rootDict.get("ParentTree"); + const { + parentTree + } = this.root; if (!parentTree) { return; } const id = this.pageDict.get("StructParents"); - const ids = pageRef instanceof Ref && this.root.structParentIds?.get(pageRef); + const ids = this.root.structParentIds?.get(pageRef); if (!Number.isInteger(id) && !ids) { return; } const map = new Map(); - const numberTree = new NumberTree(parentTree, this.rootDict.xref); if (Number.isInteger(id)) { - const parentArray = numberTree.get(id); + const parentArray = parentTree.get(id); if (Array.isArray(parentArray)) { for (const ref of parentArray) { if (ref instanceof Ref) { - this.addNode(this.rootDict.xref.fetch(ref), map); + this.addNode(this.xref.fetch(ref), map); } } } @@ -38255,9 +39909,9 @@ return; } for (const [elemId, type] of ids) { - const obj = numberTree.get(elemId); + const obj = parentTree.get(elemId); if (obj) { - const elem = this.addNode(this.rootDict.xref.fetchIfRef(obj), map); + const elem = this.addNode(this.xref.fetchIfRef(obj), map); if (elem?.kids?.length === 1 && elem.kids[0].type === StructElementType.OBJECT) { elem.kids[0].type = type; } @@ -38269,13 +39923,33 @@ warn("StructTree MAX_DEPTH reached."); return null; } + if (!(dict instanceof Dict)) { + return null; + } if (map.has(dict)) { return map.get(dict); } const element = new StructElementNode(this, dict); map.set(dict, element); + switch (element.role) { + case "L": + case "LBody": + case "LI": + case "Table": + case "THead": + case "TBody": + case "TFoot": + case "TR": + { + for (const kid of element.kids) { + if (kid.type === StructElementType.ELEMENT) { + this.addNode(kid.dict, map, level - 1); + } + } + } + } const parent = dict.get("P"); - if (!parent || isName(parent.get("Type"), "StructTreeRoot")) { + if (!(parent instanceof Dict) || isName(parent.get("Type"), "StructTreeRoot")) { if (!this.addTopLevelNode(dict, element)) { map.delete(dict); } @@ -38298,29 +39972,14 @@ return element; } addTopLevelNode(dict, element) { - const obj = this.rootDict.get("K"); - if (!obj) { + const index = this.root.getKidPosition(dict.objId); + if (isNaN(index)) { return false; } - if (obj instanceof Dict) { - if (obj.objId !== dict.objId) { - return false; - } - this.nodes[0] = element; - return true; - } - if (!Array.isArray(obj)) { - return true; - } - let save = false; - for (let i = 0; i < obj.length; i++) { - const kidRef = obj[i]; - if (kidRef?.toString() === dict.objId) { - this.nodes[i] = element; - save = true; - } + if (index !== -1) { + this.nodes[index] = element; } - return save; + return true; } get serializable() { function nodeToSerializable(node, parent, level = 0) { @@ -38332,10 +39991,41 @@ obj.role = node.role; obj.children = []; parent.children.push(obj); - const alt = node.dict.get("Alt"); + let alt = node.dict.get("Alt"); + if (typeof alt !== "string") { + alt = node.dict.get("ActualText"); + } if (typeof alt === "string") { obj.alt = stringToPDFString(alt); } + if (obj.role === "Formula") { + try { + const { + mathML + } = node; + if (mathML) { + obj.mathML = mathML; + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`Ignoring mathML: "${ex}".`); + } + } + const a = node.dict.get("A"); + if (a instanceof Dict) { + const bbox = lookupNormalRect(a.getArray("BBox"), null); + if (bbox) { + obj.bbox = bbox; + } else { + const width = a.get("Width"); + const height = a.get("Height"); + if (typeof width === "number" && width > 0 && typeof height === "number" && height > 0) { + obj.bbox = [0, 0, width, height]; + } + } + } const lang = node.dict.get("Lang"); if (typeof lang === "string") { obj.lang = stringToPDFString(lang); @@ -38376,7 +40066,7 @@ } } -;// CONCATENATED MODULE: ./src/core/catalog.js +;// ./src/core/catalog.js @@ -38388,11 +40078,14 @@ -function fetchDestination(dest) { + +const isRef = v => v instanceof Ref; +const isValidExplicitDest = _isValidExplicitDest.bind(null, isRef, isName); +function fetchDest(dest) { if (dest instanceof Dict) { dest = dest.get("D"); } - return Array.isArray(dest) ? dest : null; + return isValidExplicitDest(dest) ? dest : null; } function fetchRemoteDest(action) { let dest = action.get("D"); @@ -38401,37 +40094,57 @@ dest = dest.name; } if (typeof dest === "string") { - return stringToPDFString(dest); - } else if (Array.isArray(dest)) { + return stringToPDFString(dest, true); + } else if (isValidExplicitDest(dest)) { return JSON.stringify(dest); } } return null; } class Catalog { + #actualNumPages = null; + #annotationAttachmentIdByRef = new RefSetCache(); + #annotationAttachmentRefById = new Map(); + #catDict = null; + builtInCMapCache = new Map(); + fontCache = new RefSetCache(); + globalColorSpaceCache = new GlobalColorSpaceCache(); + globalImageCache = new GlobalImageCache(); + nonBlendModesSet = new RefSet(); + pageDictCache = new RefSetCache(); + pageIndexCache = new RefSetCache(); + pageKidsCountCache = new RefSetCache(); + standardFontDataCache = new Map(); + systemFontCache = new Map(); constructor(pdfManager, xref) { this.pdfManager = pdfManager; this.xref = xref; - this._catDict = xref.getCatalogObj(); - if (!(this._catDict instanceof Dict)) { + this.#catDict = xref.getCatalogObj(); + if (!(this.#catDict instanceof Dict)) { throw new FormatError("Catalog object is not a dictionary."); } this.toplevelPagesDict; - this._actualNumPages = null; - this.fontCache = new RefSetCache(); - this.builtInCMapCache = new Map(); - this.standardFontDataCache = new Map(); - this.globalImageCache = new GlobalImageCache(); - this.pageKidsCountCache = new RefSetCache(); - this.pageIndexCache = new RefSetCache(); - this.nonBlendModesSet = new RefSet(); - this.systemFontCache = new Map(); } cloneDict() { - return this._catDict.clone(); + return this.#catDict.clone(); + } + getAttachmentIdForAnnotation(ref) { + let id = this.#annotationAttachmentIdByRef.get(ref); + if (id) { + return id; + } + const baseId = `attachmentRef:${ref.toString()}`; + id = baseId; + let i = 1; + while (this.#annotationAttachmentRefById.has(id) || this.attachments?.has(id)) { + id = `${baseId}-${i++}`; + } + this.#annotationAttachmentIdByRef.put(ref, id); + this.#annotationAttachmentRefById.set(id, ref); + return id; } get version() { - const version = this._catDict.get("Version"); + const version = this.#catDict.get("Version"); if (version instanceof Name) { if (PDF_VERSION_REGEXP.test(version.name)) { return shadow(this, "version", version.name); @@ -38441,17 +40154,17 @@ return shadow(this, "version", null); } get lang() { - const lang = this._catDict.get("Lang"); - return shadow(this, "lang", typeof lang === "string" ? stringToPDFString(lang) : null); + const lang = this.#catDict.get("Lang"); + return shadow(this, "lang", lang && typeof lang === "string" ? stringToPDFString(lang) : null); } get needsRendering() { - const needsRendering = this._catDict.get("NeedsRendering"); + const needsRendering = this.#catDict.get("NeedsRendering"); return shadow(this, "needsRendering", typeof needsRendering === "boolean" ? needsRendering : false); } get collection() { let collection = null; try { - const obj = this._catDict.get("Collection"); + const obj = this.#catDict.get("Collection"); if (obj instanceof Dict && obj.size > 0) { collection = obj; } @@ -38466,7 +40179,7 @@ get acroForm() { let acroForm = null; try { - const obj = this._catDict.get("AcroForm"); + const obj = this.#catDict.get("AcroForm"); if (obj instanceof Dict && obj.size > 0) { acroForm = obj; } @@ -38479,25 +40192,21 @@ return shadow(this, "acroForm", acroForm); } get acroFormRef() { - const value = this._catDict.getRaw("AcroForm"); + const value = this.#catDict.getRaw("AcroForm"); return shadow(this, "acroFormRef", value instanceof Ref ? value : null); } get metadata() { - const streamRef = this._catDict.getRaw("Metadata"); + const streamRef = this.#catDict.getRaw("Metadata"); if (!(streamRef instanceof Ref)) { return shadow(this, "metadata", null); } let metadata = null; try { const stream = this.xref.fetch(streamRef, !this.xref.encrypt?.encryptMetadata); - if (stream instanceof BaseStream && stream.dict instanceof Dict) { - const type = stream.dict.get("Type"); - const subtype = stream.dict.get("Subtype"); - if (isName(type, "Metadata") && isName(subtype, "XML")) { - const data = stringToUTF8String(stream.getString()); - if (data) { - metadata = new MetadataParser(data).serializable; - } + if (stream instanceof BaseStream && isDict(stream.dict, "Metadata") && isName(stream.dict.get("Subtype"), "XML")) { + const data = stringToUTF8String(stream.getString()); + if (data) { + metadata = new MetadataParser(data).serializable; } } } catch (ex) { @@ -38511,7 +40220,7 @@ get markInfo() { let markInfo = null; try { - markInfo = this._readMarkInfo(); + markInfo = this.#readMarkInfo(); } catch (ex) { if (ex instanceof MissingDataException) { throw ex; @@ -38520,8 +40229,8 @@ } return shadow(this, "markInfo", markInfo); } - _readMarkInfo() { - const obj = this._catDict.get("MarkInfo"); + #readMarkInfo() { + const obj = this.#catDict.get("MarkInfo"); if (!(obj instanceof Dict)) { return null; } @@ -38538,10 +40247,13 @@ } return markInfo; } + get hasStructTree() { + return this.#catDict.has("StructTreeRoot"); + } get structTreeRoot() { let structTree = null; try { - structTree = this._readStructTreeRoot(); + structTree = this.#readStructTreeRoot(); } catch (ex) { if (ex instanceof MissingDataException) { throw ex; @@ -38550,18 +40262,13 @@ } return shadow(this, "structTreeRoot", structTree); } - _readStructTreeRoot() { - const rawObj = this._catDict.getRaw("StructTreeRoot"); - const obj = this.xref.fetchIfRef(rawObj); - if (!(obj instanceof Dict)) { - return null; - } - const root = new StructTreeRoot(obj, rawObj); - root.init(); - return root; + #readStructTreeRoot() { + const rawObj = this.#catDict.getRaw("StructTreeRoot"), + obj = this.xref.fetchIfRef(rawObj); + return obj instanceof Dict ? new StructTreeRoot(this.xref, obj, rawObj) : null; } get toplevelPagesDict() { - const pagesObj = this._catDict.get("Pages"); + const pagesObj = this.#catDict.get("Pages"); if (!(pagesObj instanceof Dict)) { throw new FormatError("Invalid top-level pages dictionary."); } @@ -38570,7 +40277,7 @@ get documentOutline() { let obj = null; try { - obj = this._readDocumentOutline(); + obj = this.#readDocumentOutline(); } catch (ex) { if (ex instanceof MissingDataException) { throw ex; @@ -38579,8 +40286,8 @@ } return shadow(this, "documentOutline", obj); } - _readDocumentOutline() { - let obj = this._catDict.get("Outlines"); + #readDocumentOutline(options = {}) { + let obj = this.#catDict.get("Outlines"); if (!(obj instanceof Dict)) { return null; } @@ -38624,11 +40331,12 @@ const color = outlineDict.getArray("C"); const count = outlineDict.get("Count"); let rgbColor = blackColor; - if (Array.isArray(color) && color.length === 3 && (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) { - rgbColor = ColorSpace.singletons.rgb.getRgb(color, 0); + if (isNumberArray(color, 3) && (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) { + rgbColor = ColorSpaceUtils.rgb.getRgb(color, 0); } const outlineItem = { action: data.action, + attachmentId: data.attachmentId, attachment: data.attachment, dest: data.dest, url: data.url, @@ -38642,6 +40350,9 @@ italic: !!(flags & 1), items: [] }; + if (options.keepRawDict) { + outlineItem.rawDict = outlineDict; + } i.parent.items.push(outlineItem); obj = outlineDict.getRaw("First"); if (obj instanceof Ref && !processed.has(obj)) { @@ -38662,10 +40373,24 @@ } return root.items.length > 0 ? root.items : null; } + get documentOutlineForEditor() { + let obj = null; + try { + obj = this.#readDocumentOutline({ + keepRawDict: true + }); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn("Unable to read document outline."); + } + return shadow(this, "documentOutlineForEditor", obj); + } get permissions() { let permissions = null; try { - permissions = this._readPermissions(); + permissions = this.#readPermissions(); } catch (ex) { if (ex instanceof MissingDataException) { throw ex; @@ -38674,7 +40399,7 @@ } return shadow(this, "permissions", permissions); } - _readPermissions() { + #readPermissions() { const encrypt = this.xref.trailer.get("Encrypt"); if (!(encrypt instanceof Dict)) { return null; @@ -38696,7 +40421,7 @@ get optionalContentConfig() { let config = null; try { - const properties = this._catDict.get("OCProperties"); + const properties = this.#catDict.get("OCProperties"); if (!properties) { return shadow(this, "optionalContentConfig", null); } @@ -38708,17 +40433,14 @@ if (!Array.isArray(groupsData)) { return shadow(this, "optionalContentConfig", null); } - const groups = []; - const groupRefs = new RefSet(); + const groupRefCache = new RefSetCache(); for (const groupRef of groupsData) { - if (!(groupRef instanceof Ref) || groupRefs.has(groupRef)) { + if (!(groupRef instanceof Ref) || groupRefCache.has(groupRef)) { continue; } - groupRefs.put(groupRef); - groups.push(this.#readOptionalContentGroup(groupRef)); + groupRefCache.put(groupRef, this.#readOptionalContentGroup(groupRef)); } - config = this.#readOptionalContentConfig(defaultConfig, groupRefs); - config.groups = groups; + config = this.#readOptionalContentConfig(defaultConfig, groupRefCache); } catch (ex) { if (ex instanceof MissingDataException) { throw ex; @@ -38736,7 +40458,8 @@ usage: { print: null, view: null - } + }, + rbGroups: [] }; const name = group.get("Name"); if (typeof name === "string") { @@ -38782,15 +40505,12 @@ } return obj; } - #readOptionalContentConfig(config, contentGroupRefs) { + #readOptionalContentConfig(config, groupRefCache) { function parseOnOff(refs) { const onParsed = []; if (Array.isArray(refs)) { for (const value of refs) { - if (!(value instanceof Ref)) { - continue; - } - if (contentGroupRefs.has(value)) { + if (value instanceof Ref && groupRefCache.has(value)) { onParsed.push(value.toString()); } } @@ -38803,7 +40523,7 @@ } const order = []; for (const value of refs) { - if (value instanceof Ref && contentGroupRefs.has(value)) { + if (value instanceof Ref && groupRefCache.has(value)) { parsedOrderRefs.put(value); order.push(value.toString()); continue; @@ -38817,7 +40537,7 @@ return order; } const hiddenGroups = []; - for (const groupRef of contentGroupRefs) { + for (const [groupRef] of groupRefCache.items()) { if (parsedOrderRefs.has(groupRef)) { continue; } @@ -38845,7 +40565,7 @@ return null; } const nestedOrder = parseOrder(value.slice(1), nestedLevels); - if (!nestedOrder || !nestedOrder.length) { + if (!nestedOrder?.length) { return null; } return { @@ -38853,9 +40573,28 @@ order: nestedOrder }; } + function parseRBGroups(rbGroups) { + if (!Array.isArray(rbGroups)) { + return; + } + for (const value of rbGroups) { + const rbGroup = xref.fetchIfRef(value); + if (!Array.isArray(rbGroup) || !rbGroup.length) { + continue; + } + const parsedRbGroup = new Set(); + for (const ref of rbGroup) { + if (ref instanceof Ref && groupRefCache.has(ref) && !parsedRbGroup.has(ref.toString())) { + parsedRbGroup.add(ref.toString()); + groupRefCache.get(ref).rbGroups.push(parsedRbGroup); + } + } + } + } const xref = this.xref, parsedOrderRefs = new RefSet(), MAX_NESTED_LEVELS = 10; + parseRBGroups(config.get("RBGroups")); return { name: typeof config.get("Name") === "string" ? stringToPDFString(config.get("Name")) : null, creator: typeof config.get("Creator") === "string" ? stringToPDFString(config.get("Creator")) : null, @@ -38863,14 +40602,14 @@ on: parseOnOff(config.get("ON")), off: parseOnOff(config.get("OFF")), order: parseOrder(config.get("Order")), - groups: null + groups: [...groupRefCache] }; } setActualNumPages(num = null) { - this._actualNumPages = num; + this.#actualNumPages = num; } get hasActualNumPages() { - return this._actualNumPages !== null; + return this.#actualNumPages !== null; } get _pagesCount() { const obj = this.toplevelPagesDict.get("Count"); @@ -38880,61 +40619,74 @@ return shadow(this, "_pagesCount", obj); } get numPages() { - return this.hasActualNumPages ? this._actualNumPages : this._pagesCount; + return this.#actualNumPages ?? this._pagesCount; } get destinations() { - const obj = this._readDests(), + const rawDests = this.#readDests(), dests = Object.create(null); - if (obj instanceof NameTree) { - for (const [key, value] of obj.getAll()) { - const dest = fetchDestination(value); - if (dest) { - dests[stringToPDFString(key)] = dest; + for (const obj of rawDests) { + if (obj instanceof NameTree) { + for (const [key, value] of obj.getAll()) { + const dest = fetchDest(value); + if (dest) { + dests[stringToPDFString(key, true)] = dest; + } } - } - } else if (obj instanceof Dict) { - obj.forEach(function (key, value) { - const dest = fetchDestination(value); - if (dest) { - dests[key] = dest; + } else if (obj instanceof Dict) { + for (const [key, value] of obj) { + const dest = fetchDest(value); + if (dest) { + dests[stringToPDFString(key, true)] ||= dest; + } } - }); + } } return shadow(this, "destinations", dests); } getDestination(id) { - const obj = this._readDests(); - if (obj instanceof NameTree) { - const dest = fetchDestination(obj.get(id)); - if (dest) { - return dest; - } - const allDest = this.destinations[id]; - if (allDest) { - warn(`Found "${id}" at an incorrect position in the NameTree.`); - return allDest; + if (Object.hasOwn(this, "destinations")) { + return this.destinations[id] ?? null; + } + const rawDests = this.#readDests(); + for (const obj of rawDests) { + if (obj instanceof NameTree || obj instanceof Dict) { + const dest = fetchDest(obj.get(id)); + if (dest) { + return dest; + } } - } else if (obj instanceof Dict) { - const dest = fetchDestination(obj.get(id)); + } + if (rawDests.length) { + const dest = this.destinations[id]; if (dest) { return dest; } } return null; } - _readDests() { - const obj = this._catDict.get("Names"); + #readDests() { + const obj = this.#catDict.get("Names"); + const rawDests = []; if (obj?.has("Dests")) { - return new NameTree(obj.getRaw("Dests"), this.xref); - } else if (this._catDict.has("Dests")) { - return this._catDict.get("Dests"); + rawDests.push(new NameTree(obj.getRaw("Dests"), this.xref)); } - return undefined; + if (this.#catDict.has("Dests")) { + rawDests.push(this.#catDict.get("Dests")); + } + return rawDests; + } + get rawPageLabels() { + const obj = this.#catDict.getRaw("PageLabels"); + if (!obj) { + return null; + } + const numberTree = new NumberTree(obj, this.xref); + return numberTree.getAll(); } get pageLabels() { let obj = null; try { - obj = this._readPageLabels(); + obj = this.#readPageLabels(); } catch (ex) { if (ex instanceof MissingDataException) { throw ex; @@ -38943,16 +40695,14 @@ } return shadow(this, "pageLabels", obj); } - _readPageLabels() { - const obj = this._catDict.getRaw("PageLabels"); - if (!obj) { + #readPageLabels() { + const nums = this.rawPageLabels; + if (!nums) { return null; } const pageLabels = new Array(this.numPages); let style = null, prefix = ""; - const numberTree = new NumberTree(obj, this.xref); - const nums = numberTree.getAll(); let currentLabel = "", currentIndex = 1; for (let i = 0, ii = this.numPages; i < ii; i++) { @@ -39022,7 +40772,7 @@ return pageLabels; } get pageLayout() { - const obj = this._catDict.get("PageLayout"); + const obj = this.#catDict.get("PageLayout"); let pageLayout = ""; if (obj instanceof Name) { switch (obj.name) { @@ -39038,7 +40788,7 @@ return shadow(this, "pageLayout", pageLayout); } get pageMode() { - const obj = this._catDict.get("PageMode"); + const obj = this.#catDict.get("PageMode"); let pageMode = "UseNone"; if (obj instanceof Name) { switch (obj.name) { @@ -39054,13 +40804,12 @@ return shadow(this, "pageMode", pageMode); } get viewerPreferences() { - const obj = this._catDict.get("ViewerPreferences"); + const obj = this.#catDict.get("ViewerPreferences"); if (!(obj instanceof Dict)) { return shadow(this, "viewerPreferences", null); } let prefs = null; - for (const key of obj.getKeys()) { - const value = obj.get(key); + for (const [key, value] of obj) { let prefValue; switch (key) { case "HideToolbar": @@ -39164,15 +40913,13 @@ warn(`Bad value, for key "${key}", in ViewerPreferences: ${value}.`); continue; } - if (!prefs) { - prefs = Object.create(null); - } + prefs ??= Object.create(null); prefs[key] = prefValue; } return shadow(this, "viewerPreferences", prefs); } get openAction() { - const obj = this._catDict.get("OpenAction"); + const obj = this.#catDict.get("OpenAction"); const openAction = Object.create(null); if (obj instanceof Dict) { const destDict = new Dict(this.xref); @@ -39191,42 +40938,73 @@ } else if (resultObj.action) { openAction.action = resultObj.action; } - } else if (Array.isArray(obj)) { + } else if (isValidExplicitDest(obj)) { openAction.dest = obj; } return shadow(this, "openAction", objectSize(openAction) > 0 ? openAction : null); } get attachments() { - const obj = this._catDict.get("Names"); + const obj = this.#catDict.get("Names"); let attachments = null; if (obj instanceof Dict && obj.has("EmbeddedFiles")) { const nameTree = new NameTree(obj.getRaw("EmbeddedFiles"), this.xref); for (const [key, value] of nameTree.getAll()) { - const fs = new FileSpec(value, this.xref); - if (!attachments) { - attachments = Object.create(null); - } - attachments[stringToPDFString(key)] = fs.serializable; + (attachments ??= new Map()).set(stringToPDFString(key, true), new FileSpec(value).serializable); } } return shadow(this, "attachments", attachments); } + #attachmentContentByName(id) { + const obj = this.#catDict.get("Names"); + if (obj instanceof Dict && obj.has("EmbeddedFiles")) { + const nameTree = new NameTree(obj.getRaw("EmbeddedFiles"), this.xref); + for (const [key, value] of nameTree.getAll()) { + if (stringToPDFString(key, true) === id) { + return FileSpec.readContent(value); + } + } + } + return undefined; + } + attachmentContent(id) { + const namedContent = this.#attachmentContentByName(id); + if (namedContent !== undefined) { + return namedContent; + } + const ref = this.#annotationAttachmentRefById.get(id); + if (ref) { + const target = this.xref.fetch(ref); + if (target instanceof BaseStream) { + return FileSpec.readStreamContent(target); + } + return target instanceof Dict ? FileSpec.readContent(target) : null; + } + return null; + } + get rawEmbeddedFiles() { + const obj = this.#catDict.get("Names"); + if (!(obj instanceof Dict) || !obj.has("EmbeddedFiles")) { + return null; + } + const nameTree = new NameTree(obj.getRaw("EmbeddedFiles"), this.xref); + return nameTree.getAll(true); + } get xfaImages() { - const obj = this._catDict.get("Names"); + const obj = this.#catDict.get("Names"); let xfaImages = null; if (obj instanceof Dict && obj.has("XFAImages")) { const nameTree = new NameTree(obj.getRaw("XFAImages"), this.xref); for (const [key, value] of nameTree.getAll()) { - if (!xfaImages) { - xfaImages = new Dict(this.xref); + if (value instanceof BaseStream) { + xfaImages ??= new Map(); + xfaImages.set(stringToPDFString(key, true), value.getBytes()); } - xfaImages.set(stringToPDFString(key), value); } } return shadow(this, "xfaImages", xfaImages); } - _collectJavaScript() { - const obj = this._catDict.get("Names"); + #collectJavaScript() { + const obj = this.#catDict.get("Names"); let javaScript = null; function appendIfJavaScriptDict(name, jsDict) { if (!(jsDict instanceof Dict)) { @@ -39241,7 +41019,7 @@ } else if (typeof js !== "string") { return; } - js = stringToPDFString(js).replaceAll("\x00", ""); + js = stringToPDFString(js, true).replaceAll("\x00", ""); if (js) { (javaScript ||= new Map()).set(name, js); } @@ -39249,18 +41027,18 @@ if (obj instanceof Dict && obj.has("JavaScript")) { const nameTree = new NameTree(obj.getRaw("JavaScript"), this.xref); for (const [key, value] of nameTree.getAll()) { - appendIfJavaScriptDict(stringToPDFString(key), value); + appendIfJavaScriptDict(stringToPDFString(key, true), value); } } - const openAction = this._catDict.get("OpenAction"); + const openAction = this.#catDict.get("OpenAction"); if (openAction) { appendIfJavaScriptDict("OpenAction", openAction); } return javaScript; } get jsActions() { - const javaScript = this._collectJavaScript(); - let actions = collectActions(this.xref, this._catDict, DocumentActionEventType); + const javaScript = this.#collectJavaScript(); + let actions = collectActions(this.xref, this.#catDict, DocumentActionEventType); if (javaScript) { actions ||= Object.create(null); for (const [key, val] of javaScript) { @@ -39273,25 +41051,17 @@ } return shadow(this, "jsActions", actions); } - async fontFallback(id, handler) { - const translatedFonts = await Promise.all(this.fontCache); - for (const translatedFont of translatedFonts) { - if (translatedFont.loadedName === id) { - translatedFont.fallback(handler); - return; - } - } - } async cleanup(manuallyTriggered = false) { clearGlobalCaches(); + this.globalColorSpaceCache.clear(); this.globalImageCache.clear(manuallyTriggered); this.pageKidsCountCache.clear(); this.pageIndexCache.clear(); + this.pageDictCache.clear(); this.nonBlendModesSet.clear(); - const translatedFonts = await Promise.all(this.fontCache); for (const { dict - } of translatedFonts) { + } of await Promise.all(this.fontCache)) { delete dict.cacheKey; } this.fontCache.clear(); @@ -39302,13 +41072,14 @@ async getPageDict(pageIndex) { const nodesToVisit = [this.toplevelPagesDict]; const visitedNodes = new RefSet(); - const pagesRef = this._catDict.getRaw("Pages"); + const pagesRef = this.#catDict.getRaw("Pages"); if (pagesRef instanceof Ref) { visitedNodes.put(pagesRef); } const xref = this.xref, pageKidsCountCache = this.pageKidsCountCache, - pageIndexCache = this.pageIndexCache; + pageIndexCache = this.pageIndexCache, + pageDictCache = this.pageDictCache; let currentPageIndex = 0; while (nodesToVisit.length) { const currentNode = nodesToVisit.pop(); @@ -39322,7 +41093,7 @@ throw new FormatError("Pages tree contains circular reference."); } visitedNodes.put(currentNode); - const obj = await xref.fetchAsync(currentNode); + const obj = await (pageDictCache.get(currentNode) || xref.fetchAsync(currentNode)); if (obj instanceof Dict) { let type = obj.getRaw("Type"); if (type instanceof Ref) { @@ -39383,7 +41154,11 @@ throw new FormatError("Page dictionary kids object is not an array."); } for (let last = kids.length - 1; last >= 0; last--) { - nodesToVisit.push(kids[last]); + const lastKid = kids[last]; + nodesToVisit.push(lastKid); + if (currentNode === this.toplevelPagesDict && lastKid instanceof Ref && !pageDictCache.has(lastKid)) { + pageDictCache.put(lastKid, xref.fetchAsync(lastKid)); + } } } throw new Error(`Page index ${pageIndex} not found.`); @@ -39397,7 +41172,7 @@ posInKids: 0 }]; const visitedNodes = new RefSet(); - const pagesRef = this._catDict.getRaw("Pages"); + const pagesRef = this.#catDict.getRaw("Pages"); if (pagesRef instanceof Ref) { visitedNodes.put(pagesRef); } @@ -39437,6 +41212,19 @@ } } if (!Array.isArray(kids)) { + let type = currentNode.getRaw("Type"); + if (type instanceof Ref) { + try { + type = await xref.fetchAsync(type); + } catch (ex) { + addPageError(ex); + break; + } + } + if (isName(type, "Page") || !currentNode.has("Kids")) { + addPageDict(currentNode, null); + break; + } addPageError(new FormatError("Page dictionary kids object is not an array.")); break; } @@ -39486,82 +41274,76 @@ } return map; } - getPageIndex(pageRef) { + async getPageIndex(pageRef) { const cachedPageIndex = this.pageIndexCache.get(pageRef); if (cachedPageIndex !== undefined) { - return Promise.resolve(cachedPageIndex); + return cachedPageIndex; } const xref = this.xref; - function pagesBeforeRef(kidRef) { - let total = 0, - parentRef; - return xref.fetchAsync(kidRef).then(function (node) { - if (isRefsEqual(kidRef, pageRef) && !isDict(node, "Page") && !(node instanceof Dict && !node.has("Type") && node.has("Contents"))) { - throw new FormatError("The reference does not point to a /Page dictionary."); - } - if (!node) { - return null; - } - if (!(node instanceof Dict)) { - throw new FormatError("Node must be a dictionary."); - } - parentRef = node.getRaw("Parent"); - return node.getAsync("Parent"); - }).then(function (parent) { - if (!parent) { - return null; - } - if (!(parent instanceof Dict)) { - throw new FormatError("Parent must be a dictionary."); + let total = 0, + ref = pageRef; + while (true) { + const node = await xref.fetchAsync(ref); + if (isRefsEqual(ref, pageRef) && !isDict(node, "Page") && !(node instanceof Dict && !node.has("Type") && node.has("Contents"))) { + throw new FormatError("The reference does not point to a /Page dictionary."); + } + if (!node) { + break; + } + if (!(node instanceof Dict)) { + throw new FormatError("Node must be a dictionary."); + } + const parentRef = node.getRaw("Parent"); + const parent = await node.getAsync("Parent"); + if (!parent) { + break; + } + if (!(parent instanceof Dict)) { + throw new FormatError("Parent must be a dictionary."); + } + const kids = await parent.getAsync("Kids"); + if (!kids) { + break; + } + if (!Array.isArray(kids)) { + throw new FormatError("Kids must be an array."); + } + const kidPromises = []; + let found = false; + for (const kid of kids) { + if (!(kid instanceof Ref)) { + throw new FormatError("Kid must be a reference."); } - return parent.getAsync("Kids"); - }).then(function (kids) { - if (!kids) { - return null; + if (isRefsEqual(kid, ref)) { + found = true; + break; } - const kidPromises = []; - let found = false; - for (const kid of kids) { - if (!(kid instanceof Ref)) { - throw new FormatError("Kid must be a reference."); + kidPromises.push(xref.fetchAsync(kid).then(obj => { + if (!(obj instanceof Dict)) { + throw new FormatError("Kid node must be a dictionary."); } - if (isRefsEqual(kid, kidRef)) { - found = true; - break; - } - kidPromises.push(xref.fetchAsync(kid).then(function (obj) { - if (!(obj instanceof Dict)) { - throw new FormatError("Kid node must be a dictionary."); - } - if (obj.has("Count")) { - total += obj.get("Count"); - } else { - total++; + if (obj.has("Count")) { + const count = obj.get("Count"); + if (Number.isInteger(count) && count >= 0) { + total += count; + return; } - })); - } - if (!found) { - throw new FormatError("Kid reference not found in parent's kids."); - } - return Promise.all(kidPromises).then(function () { - return [total, parentRef]; - }); - }); + throw new FormatError("Count must be a (positive) integer."); + } + total++; + })); + } + if (!found) { + throw new FormatError("Kid reference not found in parent's kids."); + } + await Promise.all(kidPromises); + ref = parentRef; } - let total = 0; - const next = ref => pagesBeforeRef(ref).then(args => { - if (!args) { - this.pageIndexCache.put(pageRef, total); - return total; - } - const [count, parentRef] = args; - total += count; - return next(parentRef); - }); - return next(pageRef); + this.pageIndexCache.put(pageRef, total); + return total; } get baseUrl() { - const uri = this._catDict.get("URI"); + const uri = this.#catDict.get("URI"); if (uri instanceof Dict) { const base = uri.get("Base"); if (typeof base === "string") { @@ -39575,6 +41357,83 @@ } return shadow(this, "baseUrl", this.pdfManager.docBaseUrl); } + static #getDestFromStructElement(xref, seRef) { + const seDict = xref.fetchIfRef(seRef); + if (!(seDict instanceof Dict)) { + return null; + } + let pageRef = null; + const directPg = seDict.getRaw("Pg"); + if (directPg instanceof Ref) { + pageRef = directPg; + } + if (!pageRef) { + const queue = [seDict]; + while (queue.length > 0 && !pageRef) { + const node = queue.shift(); + const kids = node.get("K"); + let kidsArr; + if (Array.isArray(kids)) { + kidsArr = kids; + } else if (kids) { + kidsArr = [kids]; + } else { + continue; + } + for (const kid of kidsArr) { + const kidObj = xref.fetchIfRef(kid); + if (!(kidObj instanceof Dict)) { + continue; + } + const pg = kidObj.getRaw("Pg"); + if (pg instanceof Ref) { + pageRef = pg; + break; + } + queue.push(kidObj); + } + } + } + if (!pageRef) { + const MAX_DEPTH = 40; + let current = seDict; + for (let depth = 0; depth < MAX_DEPTH; depth++) { + const parentRaw = current.getRaw("P"); + if (!(parentRaw instanceof Ref)) { + break; + } + const parentDict = xref.fetch(parentRaw); + if (!(parentDict instanceof Dict)) { + break; + } + if (isName(parentDict.get("Type"), "StructTreeRoot")) { + break; + } + const pg = parentDict.getRaw("Pg"); + if (pg instanceof Ref) { + pageRef = pg; + break; + } + current = parentDict; + } + } + if (!pageRef) { + return null; + } + let x = null, + y = null; + const attrs = seDict.get("A"); + if (attrs instanceof Dict) { + const bbox = lookupRect(attrs.getArray("BBox"), null); + if (bbox) { + x = bbox[0]; + y = bbox[3]; + } + } + return [pageRef, { + name: "XYZ" + }, x, y, null]; + } static parseDestDictionary({ destDict, resultObj, @@ -39641,16 +41500,14 @@ case "GoToR": const urlDict = action.get("F"); if (urlDict instanceof Dict) { - const fs = new FileSpec(urlDict, null, true); - const { - filename - } = fs.serializable; - url = filename; + url = new FileSpec(urlDict).filename; } else if (typeof urlDict === "string") { url = urlDict; + } else { + break; } const remoteDest = fetchRemoteDest(action); - if (remoteDest && typeof url === "string") { + if (remoteDest) { url = url.split("#", 1)[0] + "#" + remoteDest; } const newWindow = action.get("NewWindow"); @@ -39660,16 +41517,17 @@ break; case "GoToE": const target = action.get("T"); - let attachment; - if (docAttachments && target instanceof Dict) { + let id = null; + if (target instanceof Dict) { const relationship = target.get("R"); const name = target.get("N"); if (isName(relationship, "C") && typeof name === "string") { - attachment = docAttachments[stringToPDFString(name)]; + id = stringToPDFString(name, true); } } - if (attachment) { - resultObj.attachment = attachment; + if (docAttachments && id) { + resultObj.attachmentId = id; + resultObj.attachment = docAttachments.get(id); const attachmentDest = fetchRemoteDest(action); if (attachmentDest) { resultObj.attachmentDest = attachmentDest; @@ -39720,7 +41578,7 @@ } else if (typeof jsAction === "string") { js = jsAction; } - const jsURL = js && recoverJsURL(stringToPDFString(js)); + const jsURL = js && recoverJsURL(stringToPDFString(js, true)); if (jsURL) { url = jsURL.url; resultObj.newWindow = jsURL.newWindow; @@ -39751,15 +41609,231 @@ dest = dest.name; } if (typeof dest === "string") { - resultObj.dest = stringToPDFString(dest); - } else if (Array.isArray(dest)) { + resultObj.dest = stringToPDFString(dest, true); + } else if (isValidExplicitDest(dest)) { resultObj.dest = dest; } } + if (!resultObj.dest && !resultObj.url && !resultObj.action && !resultObj.attachment && !resultObj.setOCGState && !resultObj.resetForm) { + const seRef = destDict.getRaw("SE"); + if (seRef instanceof Ref) { + try { + const seDest = Catalog.#getDestFromStructElement(destDict.xref, seRef); + if (seDest) { + resultObj.dest = seDest; + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + info("SE parsing failed."); + } + } + } + } +} + +;// ./src/core/editor/pdf_images.js + + + +const FLATE_COLOR_COUNT_THRESHOLD = 16384; +function createImageDict(xref, width, height, colorSpace) { + const image = new Dict(xref); + image.set("Type", Name.get("XObject")); + image.set("Subtype", Name.get("Image")); + image.set("BitsPerComponent", 8); + image.setIfName("ColorSpace", colorSpace); + image.set("Width", width); + image.set("Height", height); + return image; +} +function createRawImage(buffer, dict) { + return new Stream(buffer, 0, buffer.length, dict); +} +function paethPredictor(left, above, upperLeft) { + const p = left + above - upperLeft; + const pa = Math.abs(p - left); + const pb = Math.abs(p - above); + const pc = Math.abs(p - upperLeft); + if (pa <= pb && pa <= pc) { + return left; + } + return pb <= pc ? above : upperLeft; +} +function applyPNGOptimumFilter(data, width, height, bytesPerPixel) { + const rowSize = width * bytesPerPixel; + const out = new Uint8Array(height * (rowSize + 1)); + const candidates = [new Uint8Array(rowSize), new Uint8Array(rowSize), new Uint8Array(rowSize), new Uint8Array(rowSize), new Uint8Array(rowSize)]; + for (let y = 0; y < height; y++) { + const rowOffset = y * rowSize; + const prevRowOffset = rowOffset - rowSize; + const scores = [0, 0, 0, 0, 0]; + for (let x = 0; x < rowSize; x++) { + const offset = rowOffset + x; + const cur = data[offset]; + const left = x >= bytesPerPixel ? data[offset - bytesPerPixel] : 0; + const above = y > 0 ? data[prevRowOffset + x] : 0; + const upperLeft = y > 0 && x >= bytesPerPixel ? data[prevRowOffset + x - bytesPerPixel] : 0; + candidates[0][x] = cur; + candidates[1][x] = cur - left & 0xff; + candidates[2][x] = cur - above & 0xff; + candidates[3][x] = cur - (left + above >> 1) & 0xff; + candidates[4][x] = cur - paethPredictor(left, above, upperLeft) & 0xff; + for (let f = 0; f < 5; f++) { + const v = candidates[f][x]; + scores[f] += v < 128 ? v : 256 - v; + } + } + let bestFilter = 0; + for (let f = 1; f < 5; f++) { + if (scores[f] < scores[bestFilter]) { + bestFilter = f; + } + } + const outOffset = y * (rowSize + 1); + out[outOffset] = bestFilter; + out.set(candidates[bestFilter], outOffset + 1); + } + return out; +} +async function deflate(bytes) { + const cs = new CompressionStream("deflate"); + const writer = cs.writable.getWriter(); + const writePromise = (async () => { + try { + await writer.ready; + await writer.write(bytes); + await writer.ready; + await writer.close(); + } catch (reason) { + await writer.abort(reason).catch(() => {}); + throw reason; + } + })(); + const [compressed] = await Promise.all([new Response(cs.readable).bytes(), writePromise.then(() => null)]); + return compressed; +} +async function createPNGLikeImage(buffer, width, height, dict) { + const bytesPerPixel = buffer.length / (width * height); + let compressed; + if (typeof CompressionStream === "function") { + try { + const filtered = applyPNGOptimumFilter(buffer, width, height, bytesPerPixel); + compressed = await deflate(filtered); + } catch {} + } + if (!compressed) { + return createRawImage(buffer, dict); + } + dict.setIfName("Filter", "FlateDecode"); + const decodeParms = new Dict(dict.xref); + decodeParms.set("Predictor", 15); + decodeParms.set("Columns", width); + decodeParms.set("Colors", bytesPerPixel); + decodeParms.set("BitsPerComponent", 8); + dict.set("DecodeParms", decodeParms); + return createRawImage(compressed, dict); +} +async function createImage(bitmap, xref, { + closeBitmap = false +} = {}) { + const { + width, + height + } = bitmap; + if (!Number.isInteger(width) || !Number.isInteger(height) || width <= 0 || height <= 0) { + if (closeBitmap) { + bitmap.close?.(); + } + throw new Error(`createImage: invalid bitmap dimensions ${width}x${height}`); + } + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d", { + alpha: true, + willReadFrequently: true + }); + let data; + try { + ctx.drawImage(bitmap, 0, 0); + data = ctx.getImageData(0, 0, width, height).data; + } finally { + if (closeBitmap) { + bitmap.close?.(); + } + } + const buf32 = new Uint32Array(data.buffer, data.byteOffset, data.byteLength >> 2); + const isLE = FeatureTest.isLittleEndian; + const rgbMask = isLE ? 0x00ffffff : 0xffffff00; + const colorCounter = new Set(); + let hasAlpha = false; + let useFlate = true; + for (let i = 0, ii = buf32.length; i < ii; i++) { + const v = buf32[i]; + if ((isLE ? v >>> 24 : v & 0xff) !== 0xff) { + hasAlpha = true; + break; + } + if (useFlate) { + colorCounter.add((v & rgbMask) >>> 0); + if (colorCounter.size > FLATE_COLOR_COUNT_THRESHOLD) { + useFlate = false; + colorCounter.clear(); + } + } + } + if (hasAlpha) { + useFlate = true; + } + const image = createImageDict(xref, width, height, "DeviceRGB"); + let imageStreamPromise; + let imageRenderStream = null; + if (useFlate) { + const rgbBuffer = new Uint8Array(width * height * 3); + for (let i = 0, j = 0, ii = data.length; i < ii; i += 4, j += 3) { + rgbBuffer[j] = data[i]; + rgbBuffer[j + 1] = data[i + 1]; + rgbBuffer[j + 2] = data[i + 2]; + } + imageStreamPromise = createPNGLikeImage(rgbBuffer, width, height, image); + imageRenderStream = createRawImage(rgbBuffer, createImageDict(xref, width, height, "DeviceRGB")); + } else { + image.setIfName("Filter", "DCTDecode"); + imageStreamPromise = canvas.convertToBlob({ + type: "image/jpeg", + quality: 1 + }).then(blob => blob.bytes()).then(bytes => createRawImage(bytes, image)); + } + let smaskStreamPromise = Promise.resolve(null); + let smaskRenderStream = null; + if (hasAlpha) { + const alphaBuffer = new Uint8Array(buf32.length); + if (isLE) { + for (let i = 0, ii = buf32.length; i < ii; i++) { + alphaBuffer[i] = buf32[i] >>> 24; + } + } else { + for (let i = 0, ii = buf32.length; i < ii; i++) { + alphaBuffer[i] = buf32[i] & 0xff; + } + } + const smask = createImageDict(xref, width, height, "DeviceGray"); + const smaskRenderDict = createImageDict(xref, width, height, "DeviceGray"); + smaskStreamPromise = createPNGLikeImage(alphaBuffer, width, height, smask); + smaskRenderStream = createRawImage(alphaBuffer, smaskRenderDict); } + const [imageStream, smaskStream] = await Promise.all([imageStreamPromise, smaskStreamPromise]); + return { + imageStream, + imageRenderStream, + smaskStream, + smaskRenderStream, + width, + height + }; } -;// CONCATENATED MODULE: ./src/core/object_loader.js +;// ./src/core/object_loader.js @@ -39782,21 +41856,17 @@ } } class ObjectLoader { + refSet = new RefSet(); constructor(dict, keys, xref) { this.dict = dict; this.keys = keys; this.xref = xref; - this.refSet = null; } async load() { - if (this.xref.stream.isDataLoaded) { - return undefined; - } const { keys, dict } = this; - this.refSet = new RefSet(); const nodesToVisit = []; for (const key of keys) { const rawValue = dict.getRaw(key); @@ -39804,9 +41874,10 @@ nodesToVisit.push(rawValue); } } - return this._walk(nodesToVisit); + await this.#walk(nodesToVisit); + this.refSet = null; } - async _walk(nodesToVisit) { + async #walk(nodesToVisit) { const nodesToRevisit = []; const pendingRequests = []; while (nodesToVisit.length) { @@ -39820,12 +41891,9 @@ currentNode = this.xref.fetch(currentNode); } catch (ex) { if (!(ex instanceof MissingDataException)) { - warn(`ObjectLoader._walk - requesting all data: "${ex}".`); - this.refSet = null; - const { - manager - } = this.xref.stream; - return manager.requestAllChunks(); + warn(`ObjectLoader.#walk - requesting all data: "${ex}".`); + await this.xref.stream.manager.requestAllChunks(); + return; } nodesToRevisit.push(currentNode); pendingRequests.push({ @@ -39862,14 +41930,19 @@ this.refSet.remove(node); } } - return this._walk(nodesToRevisit); + await this.#walk(nodesToRevisit); } - this.refSet = null; - return undefined; + } + static async load(obj, keys, xref) { + if (xref.stream.isDataLoaded) { + return; + } + const objLoader = new ObjectLoader(obj, keys, xref); + await objLoader.load(); } } -;// CONCATENATED MODULE: ./src/core/xfa/symbol_utils.js +;// ./src/core/xfa/symbol_utils.js const $acceptWhitespace = Symbol(); const $addHTML = Symbol(); const $appendChild = Symbol(); @@ -39939,7 +42012,7 @@ const $toStyle = Symbol(); const $uid = Symbol("uid"); -;// CONCATENATED MODULE: ./src/core/xfa/namespaces.js +;// ./src/core/xfa/namespaces.js const $buildXFAObject = Symbol(); const NamespaceIds = { config: { @@ -40004,7 +42077,8 @@ } }; -;// CONCATENATED MODULE: ./src/core/xfa/utils.js +;// ./src/core/xfa/utils.js + const dimConverters = { pt: x => x, @@ -40101,7 +42175,7 @@ den: 1 }; } - const ratio = data.trim().split(/\s*:\s*/).map(x => parseFloat(x)).filter(x => !isNaN(x)); + const ratio = data.split(":", 2).map(x => parseFloat(x.trim())).filter(x => !isNaN(x)); if (ratio.length === 1) { ratio.push(1); } @@ -40135,7 +42209,7 @@ b }; } - const color = data.trim().split(/\s*,\s*/).map(c => Math.min(Math.max(0, parseInt(c.trim(), 10)), 255)).map(c => isNaN(c) ? 0 : c); + const color = data.split(",", 3).map(c => MathClamp(parseInt(c.trim(), 10), 0, 255)).map(c => isNaN(c) ? 0 : c); if (color.length < 3) { return { r, @@ -40160,7 +42234,7 @@ height: def }; } - const bbox = data.trim().split(/\s*,\s*/).map(m => getMeasurement(m, "-1")); + const bbox = data.split(",", 4).map(m => getMeasurement(m.trim(), "-1")); if (bbox.length < 4 || bbox[2] < 0 || bbox[3] < 0) { return { x: def, @@ -40201,7 +42275,7 @@ } } -;// CONCATENATED MODULE: ./src/core/xfa/fonts.js +;// ./src/core/xfa/fonts.js @@ -40233,14 +42307,8 @@ addPdfFont(pdfFont) { const cssFontInfo = pdfFont.cssFontInfo; const name = cssFontInfo.fontFamily; - let font = this.fonts.get(name); - if (!font) { - font = Object.create(null); - this.fonts.set(name, font); - if (!this.defaultFont) { - this.defaultFont = font; - } - } + const font = this.fonts.getOrInsertComputed(name, makeObj); + this.defaultFont ??= font; let property = ""; const fontWeight = parseFloat(cssFontInfo.fontWeight); if (parseFloat(cssFontInfo.italicAngle) !== 0) { @@ -40269,7 +42337,7 @@ if (font) { return font; } - const pattern = /,|-|_| |bolditalic|bold|italic|regular|it/gi; + const pattern = /[,\-_ ]|bolditalic|bold|italic|regular|it/gi; let name = fontName.replaceAll(pattern, ""); font = this.fonts.get(name); if (font) { @@ -40278,13 +42346,13 @@ } name = name.toLowerCase(); const maybe = []; - for (const [family, pdfFont] of this.fonts.entries()) { + for (const [family, pdfFont] of this.fonts) { if (family.replaceAll(pattern, "").toLowerCase().startsWith(name)) { maybe.push(pdfFont); } } if (maybe.length === 0) { - for (const [, pdfFont] of this.fonts.entries()) { + for (const pdfFont of this.fonts.values()) { if (pdfFont.regular.name?.replaceAll(pattern, "").toLowerCase().startsWith(name)) { maybe.push(pdfFont); } @@ -40292,7 +42360,7 @@ } if (maybe.length === 0) { name = name.replaceAll(/psmt|mt/gi, ""); - for (const [family, pdfFont] of this.fonts.entries()) { + for (const [family, pdfFont] of this.fonts) { if (family.replaceAll(pattern, "").toLowerCase().startsWith(name)) { maybe.push(pdfFont); } @@ -40354,7 +42422,7 @@ }; } -;// CONCATENATED MODULE: ./src/core/xfa/text.js +;// ./src/core/xfa/text.js const WIDTH_FACTOR = 1.02; class FontInfo { @@ -40419,9 +42487,7 @@ pushData(xfaFont, margin, lineHeight) { const lastFont = this.stack.at(-1); for (const name of ["typeface", "posture", "weight", "size", "letterSpacing"]) { - if (!xfaFont[name]) { - xfaFont[name] = lastFont.xfaFont[name]; - } + xfaFont[name] ||= lastFont.xfaFont[name]; } for (const name of ["top", "bottom", "left", "right"]) { if (isNaN(margin[name])) { @@ -40429,9 +42495,7 @@ } } const fontInfo = new FontInfo(xfaFont, margin, lineHeight || lastFont.lineHeight, this.fontFinder); - if (!fontInfo.pdfFont) { - fontInfo.pdfFont = lastFont.pdfFont; - } + fontInfo.pdfFont ||= lastFont.pdfFont; this.stack.push(fontInfo); } popFont() { @@ -40564,7 +42628,7 @@ } } -;// CONCATENATED MODULE: ./src/core/xfa/som.js +;// ./src/core/xfa/som.js const namePattern = /^[^.[]+/; @@ -40691,11 +42755,7 @@ } let children, cached; if (useCache) { - cached = somCache.get(node); - if (!cached) { - cached = new Map(); - somCache.set(node, cached); - } + cached = somCache.getOrInsertComputed(node, makeMap); children = cached.get(cacheName); } if (!children) { @@ -40797,7 +42857,7 @@ return null; } -;// CONCATENATED MODULE: ./src/core/xfa/xfa_object.js +;// ./src/core/xfa/xfa_object.js @@ -40884,7 +42944,7 @@ return false; } [$onChildCheck](child) { - return this.hasOwnProperty(child[$nodeName]) && child[$namespaceId] === this[$namespaceId]; + return Object.hasOwn(this, child[$nodeName]) && child[$namespaceId] === this[$namespaceId]; } [$isNsAgnostic]() { return false; @@ -40932,7 +42992,7 @@ this[_children].splice(i, 1); } [$hasSettableValue]() { - return this.hasOwnProperty("value"); + return Object.hasOwn(this, "value"); } [$setValue](_) {} [$onText](_) {} @@ -41370,7 +43430,7 @@ for (const [attrName, value] of Object.entries(attributes)) { map.set(attrName, new XFAAttribute(this, attrName, value)); } - if (attributes.hasOwnProperty($nsAttributes)) { + if (Object.hasOwn(attributes, $nsAttributes)) { const dataNode = attributes[$nsAttributes].xfa.dataNode; if (dataNode !== undefined) { if (dataNode === "dataGroup") { @@ -41392,7 +43452,7 @@ const utf8TagName = utf8StringToString(tagName); const prefix = this[$namespaceId] === NS_DATASETS ? "xfa:" : ""; buf.push(`<${prefix}${utf8TagName}`); - for (const [name, value] of this[_attributes].entries()) { + for (const [name, value] of this[_attributes]) { const utf8Name = utf8StringToString(name); buf.push(` ${utf8Name}="${encodeToXmlString(value[$content])}"`); } @@ -41604,7 +43664,7 @@ } } -;// CONCATENATED MODULE: ./src/core/xfa/html_utils.js +;// ./src/core/xfa/html_utils.js @@ -41662,10 +43722,10 @@ const colSpan = node.colSpan; let w; if (colSpan === -1) { - w = extra.columnWidths.slice(extra.currentColumn).reduce((a, x) => a + x, 0); + w = Math.sumPrecise(extra.columnWidths.slice(extra.currentColumn)); extra.currentColumn = 0; } else { - w = extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan).reduce((a, x) => a + x, 0); + w = Math.sumPrecise(extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan)); extra.currentColumn = (extra.currentColumn + node.colSpan) % extra.columnWidths.length; } if (!isNaN(w)) { @@ -41863,9 +43923,9 @@ const colSpan = node.colSpan; let width; if (colSpan === -1) { - width = extra.columnWidths.slice(extra.currentColumn).reduce((a, w) => a + w, 0); + width = Math.sumPrecise(extra.columnWidths.slice(extra.currentColumn)); } else { - width = extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan).reduce((a, w) => a + w, 0); + width = Math.sumPrecise(extra.columnWidths.slice(extra.currentColumn, extra.currentColumn + colSpan)); } if (!isNaN(width)) { node.w = width; @@ -41876,7 +43936,7 @@ } if (node.layout === "table") { if (node.w === "" && Array.isArray(node.columnWidths)) { - node.w = node.columnWidths.reduce((a, x) => a + x, 0); + node.w = Math.sumPrecise(node.columnWidths); } } } @@ -41907,7 +43967,7 @@ if (value === null) { continue; } - if (converters.hasOwnProperty(name)) { + if (Object.hasOwn(converters, name)) { converters[name](node, style); continue; } @@ -42108,7 +44168,8 @@ return absoluteUrl ? absoluteUrl.href : null; } -;// CONCATENATED MODULE: ./src/core/xfa/layout.js +;// ./src/core/xfa/layout.js + function createLine(node, children) { @@ -42191,14 +44252,14 @@ } case "table": { - extra.width = Math.min(availableSpace.width, Math.max(extra.width, w)); + extra.width = MathClamp(w, extra.width, availableSpace.width); extra.height += h; extra.children.push(html); break; } case "tb": { - extra.width = Math.min(availableSpace.width, Math.max(extra.width, w)); + extra.width = MathClamp(w, extra.width, availableSpace.width); extra.height += h; extra.children.push(html); break; @@ -42224,7 +44285,7 @@ }; case "rl-row": case "row": - const width = node[$extra].columnWidths.slice(node[$extra].currentColumn).reduce((a, x) => a + x); + const width = Math.sumPrecise(node[$extra].columnWidths.slice(node[$extra].currentColumn)); return { width, height: availableSpace.height - marginH @@ -42376,7 +44437,7 @@ } } -;// CONCATENATED MODULE: ./src/core/xfa/template.js +;// ./src/core/xfa/template.js @@ -42388,7 +44449,6 @@ const TEMPLATE_NS_ID = NamespaceIds.template.id; -const SVG_NS = "http://www.w3.org/2000/svg"; const MAX_ATTEMPTS_FOR_LRTB_LAYOUT = 2; const MAX_EMPTY_PAGES = 3; const DEFAULT_TAB_INDEX = 5000; @@ -43266,7 +45326,7 @@ this.margin = null; } [$toHTML](availableSpace) { - const style = toStyle("margin"); + const style = toStyle(this, "margin"); const size = measureToString(this.size); style.width = style.height = size; let type; @@ -43347,7 +45407,7 @@ const field = ui[$getParent](); const fontSize = field.font?.size || 10; const optionStyle = { - fontSize: `calc(${fontSize}px * var(--scale-factor))` + fontSize: `calc(${fontSize}px * var(--total-scale-factor))` }; const children = []; if (field.items.children.length > 0) { @@ -44093,9 +46153,7 @@ class: [] }; setAccess(this, attributes.class); - if (!this[$extra]) { - this[$extra] = Object.create(null); - } + this[$extra] ||= Object.create(null); Object.assign(this[$extra], { children, attributes, @@ -44440,9 +46498,7 @@ ui.attributes.tabindex = this[$tabIndex]; } } - if (!ui.attributes.style) { - ui.attributes.style = Object.create(null); - } + ui.attributes.style ||= Object.create(null); let aElement = null; if (this.ui.button) { if (ui.children.length === 1) { @@ -44521,9 +46577,7 @@ } else if (this.ui.checkButton) { caption.attributes.class[0] = "xfaCaptionForCheckButton"; } - if (!ui.attributes.class) { - ui.attributes.class = []; - } + ui.attributes.class ||= []; ui.children.splice(0, 0, caption); switch (this.caption.placement) { case "left": @@ -44805,12 +46859,12 @@ if (this.contentType && !MIMES.has(this.contentType.toLowerCase())) { return HTMLResult.EMPTY; } - let buffer = this[$globalData].images && this[$globalData].images.get(this.href); + let buffer = this[$globalData].images?.get(this.href); if (!buffer && (this.href || !this[$content])) { return HTMLResult.EMPTY; } if (!buffer && this.transferEncoding === "base64") { - buffer = stringToBytes(atob(this[$content])); + buffer = Uint8Array.fromBase64(this[$content]); } if (!buffer) { return HTMLResult.EMPTY; @@ -45199,7 +47253,7 @@ }) : ""; this.max = attributes.max !== "" ? getInteger({ data: attributes.max, - defaultValue: 1, + defaultValue: -1, validate: x => true }) : ""; this.min = attributes.min !== "" ? getInteger({ @@ -45324,11 +47378,9 @@ delete this[$extra]; } [$getNextPage]() { - if (!this[$extra]) { - this[$extra] = { - numberOfUse: 0 - }; - } + this[$extra] ||= { + numberOfUse: 0 + }; const parent = this[$getParent](); if (parent.relation === "orderedOccurrence") { if (this[$isUsable]()) { @@ -45345,11 +47397,9 @@ }; } [$toHTML]() { - if (!this[$extra]) { - this[$extra] = { - numberOfUse: 1 - }; - } + this[$extra] ||= { + numberOfUse: 1 + }; const children = []; this[$extra].children = children; const style = Object.create(null); @@ -45419,13 +47469,11 @@ return !this.occur || this.occur.max === -1 || this[$extra].numberOfUse < this.occur.max; } [$getNextPage]() { - if (!this[$extra]) { - this[$extra] = { - numberOfUse: 1, - pageIndex: -1, - pageSetIndex: -1 - }; - } + this[$extra] ||= { + numberOfUse: 1, + pageIndex: -1, + pageSetIndex: -1 + }; if (this.relation === "orderedOccurrence") { if (this[$extra].pageIndex + 1 < this.pageArea.children.length) { this[$extra].pageIndex += 1; @@ -45503,7 +47551,7 @@ style.paddingLeft = measureToString(this.marginLeft); } if (this.marginRight !== "") { - style.paddingight = measureToString(this.marginRight); + style.paddingRight = measureToString(this.marginRight); } if (this.spaceAbove !== "") { style.paddingTop = measureToString(this.spaceAbove); @@ -46083,9 +48131,7 @@ class: [] }; setAccess(this, attributes.class); - if (!this[$extra]) { - this[$extra] = Object.create(null); - } + this[$extra] ||= Object.create(null); Object.assign(this[$extra], { children, line: null, @@ -46375,9 +48421,7 @@ breakBefore[$extra] = {}; } } - if (!pageArea) { - pageArea = pageAreas[0]; - } + pageArea ||= pageAreas[0]; pageArea[$extra] = { numberOfUse: 1 }; @@ -46560,12 +48604,7 @@ } [$getExtra]() { if (typeof this[$content] === "string") { - return this[$content].split(/[\u2029\u2028\n]/).reduce((acc, line) => { - if (line) { - acc.push(line); - } - return acc; - }, []).join("\n"); + return this[$content].split(/[\u2029\u2028\n]/).filter(line => !!line).join("\n"); } return this[$content][$text](); } @@ -46575,15 +48614,12 @@ if (this[$content].includes("\u2029")) { html.name = "div"; html.children = []; - this[$content].split("\u2029").map(para => para.split(/[\u2028\n]/).reduce((acc, line) => { - acc.push({ - name: "span", - value: line - }, { - name: "br" - }); - return acc; - }, [])).forEach(lines => { + this[$content].split("\u2029").map(para => para.split(/[\u2028\n]/).flatMap(line => [{ + name: "span", + value: line + }, { + name: "br" + }])).forEach(lines => { html.children.push({ name: "p", children: lines @@ -46905,7 +48941,7 @@ } class TemplateNamespace { static [$buildXFAObject](name, attributes) { - if (TemplateNamespace.hasOwnProperty(name)) { + if (Object.hasOwn(TemplateNamespace, name)) { const node = TemplateNamespace[name](attributes); node[$setSetAttributes](attributes); return node; @@ -47253,7 +49289,7 @@ } } -;// CONCATENATED MODULE: ./src/core/xfa/bind.js +;// ./src/core/xfa/bind.js @@ -47342,7 +49378,7 @@ return null; } _setProperties(formNode, dataNode) { - if (!formNode.hasOwnProperty("setProperty")) { + if (!Object.hasOwn(formNode, "setProperty")) { return; } for (const { @@ -47394,7 +49430,7 @@ targetParent[name] = obj[name]; continue; } - if (!targetNode.hasOwnProperty($content)) { + if (!Object.hasOwn(targetNode, $content)) { warn(`XFA - Invalid node to use in setProperty`); continue; } @@ -47404,7 +49440,7 @@ } } _bindItems(formNode, dataNode) { - if (!formNode.hasOwnProperty("items") || !formNode.hasOwnProperty("bindItems") || formNode.bindItems.isEmpty()) { + if (!Object.hasOwn(formNode, "items") || !Object.hasOwn(formNode, "bindItems") || formNode.bindItems.isEmpty()) { return; } for (const item of formNode.items.children) { @@ -47674,7 +49710,7 @@ } } -;// CONCATENATED MODULE: ./src/core/xfa/data.js +;// ./src/core/xfa/data.js class DataHandler { constructor(root, data) { @@ -47723,7 +49759,7 @@ } } -;// CONCATENATED MODULE: ./src/core/xfa/config.js +;// ./src/core/xfa/config.js @@ -48447,7 +50483,7 @@ super(CONFIG_NS_ID, "range"); } [$finalize]() { - this[$content] = this[$content].trim().split(/\s*,\s*/, 2).map(range => range.split("-").map(x => parseInt(x.trim(), 10))).filter(range => range.every(x => !isNaN(x))).map(range => { + this[$content] = this[$content].split(",", 2).map(range => range.split("-").map(x => parseInt(x.trim(), 10))).filter(range => range.every(x => !isNaN(x))).map(range => { if (range.length === 1) { range.push(range[0]); } @@ -48481,7 +50517,7 @@ } [$finalize]() { this[$content] = this[$content].trim(); - if (this[$content].toLowerCase().startsWith("xml") || new RegExp("[\\p{L}_][\\p{L}\\d._\\p{M}-]*", "u").test(this[$content])) { + if (this[$content].toLowerCase().startsWith("xml") || /[\p{L}_][\p{L}\d._\p{M}-]*/u.test(this[$content])) { warn("XFA - Rename: invalid XFA name"); } } @@ -48598,7 +50634,7 @@ this.area = new XFAObjectArray(); } } -class config_Transform extends XFAObject { +class Transform extends XFAObject { constructor(attributes) { super(CONFIG_NS_ID, "transform", true); this.groupParent = null; @@ -48683,7 +50719,7 @@ super(CONFIG_NS_ID, "window"); } [$finalize]() { - const pair = this[$content].trim().split(/\s*,\s*/, 2).map(x => parseInt(x, 10)); + const pair = this[$content].split(",", 2).map(x => parseInt(x.trim(), 10)); if (pair.some(x => isNaN(x))) { this[$content] = [0, 0]; return; @@ -48726,7 +50762,7 @@ } class ConfigNamespace { static [$buildXFAObject](name, attributes) { - if (ConfigNamespace.hasOwnProperty(name)) { + if (Object.hasOwn(ConfigNamespace, name)) { return ConfigNamespace[name](attributes); } return undefined; @@ -49101,7 +51137,7 @@ return new Trace(attrs); } static transform(attrs) { - return new config_Transform(attrs); + return new Transform(attrs); } static type(attrs) { return new Type(attrs); @@ -49150,7 +51186,7 @@ } } -;// CONCATENATED MODULE: ./src/core/xfa/connection_set.js +;// ./src/core/xfa/connection_set.js const CONNECTION_SET_NS_ID = NamespaceIds.connectionSet.id; @@ -49268,7 +51304,7 @@ } class ConnectionSetNamespace { static [$buildXFAObject](name, attributes) { - if (ConnectionSetNamespace.hasOwnProperty(name)) { + if (Object.hasOwn(ConnectionSetNamespace, name)) { return ConnectionSetNamespace[name](attributes); } return undefined; @@ -49311,7 +51347,7 @@ } } -;// CONCATENATED MODULE: ./src/core/xfa/datasets.js +;// ./src/core/xfa/datasets.js @@ -49340,7 +51376,7 @@ } class DatasetsNamespace { static [$buildXFAObject](name, attributes) { - if (DatasetsNamespace.hasOwnProperty(name)) { + if (Object.hasOwn(DatasetsNamespace, name)) { return DatasetsNamespace[name](attributes); } return undefined; @@ -49353,7 +51389,7 @@ } } -;// CONCATENATED MODULE: ./src/core/xfa/locale_set.js +;// ./src/core/xfa/locale_set.js @@ -49522,7 +51558,7 @@ } class LocaleSetNamespace { static [$buildXFAObject](name, attributes) { - if (LocaleSetNamespace.hasOwnProperty(name)) { + if (Object.hasOwn(LocaleSetNamespace, name)) { return LocaleSetNamespace[name](attributes); } return undefined; @@ -49601,7 +51637,7 @@ } } -;// CONCATENATED MODULE: ./src/core/xfa/signature.js +;// ./src/core/xfa/signature.js const SIGNATURE_NS_ID = NamespaceIds.signature.id; @@ -49612,7 +51648,7 @@ } class SignatureNamespace { static [$buildXFAObject](name, attributes) { - if (SignatureNamespace.hasOwnProperty(name)) { + if (Object.hasOwn(SignatureNamespace, name)) { return SignatureNamespace[name](attributes); } return undefined; @@ -49622,7 +51658,7 @@ } } -;// CONCATENATED MODULE: ./src/core/xfa/stylesheet.js +;// ./src/core/xfa/stylesheet.js const STYLESHEET_NS_ID = NamespaceIds.stylesheet.id; @@ -49633,7 +51669,7 @@ } class StylesheetNamespace { static [$buildXFAObject](name, attributes) { - if (StylesheetNamespace.hasOwnProperty(name)) { + if (Object.hasOwn(StylesheetNamespace, name)) { return StylesheetNamespace[name](attributes); } return undefined; @@ -49643,7 +51679,7 @@ } } -;// CONCATENATED MODULE: ./src/core/xfa/xdp.js +;// ./src/core/xfa/xdp.js @@ -49667,7 +51703,7 @@ } class XdpNamespace { static [$buildXFAObject](name, attributes) { - if (XdpNamespace.hasOwnProperty(name)) { + if (Object.hasOwn(XdpNamespace, name)) { return XdpNamespace[name](attributes); } return undefined; @@ -49677,7 +51713,7 @@ } } -;// CONCATENATED MODULE: ./src/core/xfa/xhtml.js +;// ./src/core/xfa/xhtml.js @@ -49686,8 +51722,8 @@ const XHTML_NS_ID = NamespaceIds.xhtml.id; const $richText = Symbol(); const VALID_STYLES = new Set(["color", "font", "font-family", "font-size", "font-stretch", "font-style", "font-weight", "margin", "margin-bottom", "margin-left", "margin-right", "margin-top", "letter-spacing", "line-height", "orphans", "page-break-after", "page-break-before", "page-break-inside", "tab-interval", "tab-stop", "text-align", "text-decoration", "text-indent", "vertical-align", "widows", "kerning-mode", "xfa-font-horizontal-scale", "xfa-font-vertical-scale", "xfa-spacerun", "xfa-tab-stops"]); -const StyleMapping = new Map([["page-break-after", "breakAfter"], ["page-break-before", "breakBefore"], ["page-break-inside", "breakInside"], ["kerning-mode", value => value === "none" ? "none" : "normal"], ["xfa-font-horizontal-scale", value => `scaleX(${Math.max(0, Math.min(parseInt(value) / 100)).toFixed(2)})`], ["xfa-font-vertical-scale", value => `scaleY(${Math.max(0, Math.min(parseInt(value) / 100)).toFixed(2)})`], ["xfa-spacerun", ""], ["xfa-tab-stops", ""], ["font-size", (value, original) => { - value = original.fontSize = getMeasurement(value); +const StyleMapping = new Map([["page-break-after", "breakAfter"], ["page-break-before", "breakBefore"], ["page-break-inside", "breakInside"], ["kerning-mode", value => value === "none" ? "none" : "normal"], ["xfa-font-horizontal-scale", value => `scaleX(${Math.max(0, parseInt(value, 10) / 100).toFixed(2)})`], ["xfa-font-vertical-scale", value => `scaleY(${Math.max(0, parseInt(value, 10) / 100).toFixed(2)})`], ["xfa-spacerun", ""], ["xfa-tab-stops", ""], ["font-size", (value, original) => { + value = original.fontSize = Math.abs(getMeasurement(value)); return measureToString(0.99 * value); }], ["letter-spacing", value => measureToString(getMeasurement(value))], ["line-height", value => measureToString(getMeasurement(value))], ["margin", value => measureToString(getMeasurement(value))], ["margin-bottom", value => measureToString(getMeasurement(value))], ["margin-left", value => measureToString(getMeasurement(value))], ["margin-right", value => measureToString(getMeasurement(value))], ["margin-top", value => measureToString(getMeasurement(value))], ["text-indent", value => measureToString(getMeasurement(value))], ["font-family", value => value], ["vertical-align", value => measureToString(getMeasurement(value))]]); const spacesRegExp = /\s+/g; @@ -49711,7 +51747,7 @@ if (key.endsWith("scale")) { style.transform = style.transform ? `${style[key]} ${newValue}` : newValue; } else { - style[key.replaceAll(/-([a-zA-Z])/g, (_, x) => x.toUpperCase())] = newValue; + style[key.replaceAll(/-([a-z])/gi, (_, x) => x.toUpperCase())] = newValue; } } if (style.fontFamily) { @@ -49730,7 +51766,7 @@ style.verticalAlign = measureToString(Math.sign(getMeasurement(style.verticalAlign)) * fontSize * VERTICAL_FACTOR); } if (richText && style.fontSize) { - style.fontSize = `calc(${style.fontSize} * var(--scale-factor))`; + style.fontSize = `calc(${style.fontSize} * var(--total-scale-factor))`; } fixTextIndent(style); return style; @@ -49739,7 +51775,7 @@ if (!node.style) { return ""; } - return node.style.trim().split(/\s*;\s*/).filter(s => !!s).map(s => s.split(/\s*:\s*/, 2)).filter(([key, value]) => { + return node.style.split(";").filter(s => !!s.trim()).map(s => s.split(":", 2).map(t => t.trim())).filter(([key, value]) => { if (key === "font-family") { node[$globalData].usedTypefaces.add(value); } @@ -50030,7 +52066,7 @@ } class XhtmlNamespace { static [$buildXFAObject](name, attributes) { - if (XhtmlNamespace.hasOwnProperty(name)) { + if (Object.hasOwn(XhtmlNamespace, name)) { return XhtmlNamespace[name](attributes); } return undefined; @@ -50076,7 +52112,7 @@ } } -;// CONCATENATED MODULE: ./src/core/xfa/setup.js +;// ./src/core/xfa/setup.js @@ -50098,7 +52134,7 @@ xhtml: XhtmlNamespace }; -;// CONCATENATED MODULE: ./src/core/xfa/unknown.js +;// ./src/core/xfa/unknown.js class UnknownNamespace { @@ -50110,7 +52146,7 @@ } } -;// CONCATENATED MODULE: ./src/core/xfa/builder.js +;// ./src/core/xfa/builder.js @@ -50174,7 +52210,7 @@ if (prefixes) { this._addNamespacePrefix(prefixes); } - if (attributes.hasOwnProperty($nsAttributes)) { + if (Object.hasOwn(attributes, $nsAttributes)) { const dataTemplate = NamespaceSetUp.datasets; const nsAttrs = attributes[$nsAttributes]; let xfaAttrs = null; @@ -50237,12 +52273,7 @@ value } of prefixes) { const namespace = this._searchNamespace(value); - let prefixStack = this._namespacePrefixes.get(prefix); - if (!prefixStack) { - prefixStack = []; - this._namespacePrefixes.set(prefix, prefixStack); - } - prefixStack.push(namespace); + this._namespacePrefixes.getOrInsertComputed(prefix, makeArr).push(namespace); } } _getNamespaceToUse(prefix) { @@ -50278,7 +52309,7 @@ } } -;// CONCATENATED MODULE: ./src/core/xfa/parser.js +;// ./src/core/xfa/parser.js @@ -50336,9 +52367,7 @@ } } else if (name.startsWith("xmlns:")) { const prefix = name.substring("xmlns:".length); - if (!prefixes) { - prefixes = []; - } + prefixes ??= []; prefixes.push({ prefix, value @@ -50348,10 +52377,7 @@ if (i === -1) { attributeObj[name] = value; } else { - let nsAttrs = attributeObj[$nsAttributes]; - if (!nsAttrs) { - nsAttrs = attributeObj[$nsAttributes] = Object.create(null); - } + const nsAttrs = attributeObj[$nsAttributes] ??= Object.create(null); const [ns, attrName] = [name.slice(0, i), name.slice(i + 1)]; const attrs = nsAttrs[ns] ||= Object.create(null); attrs[attrName] = value; @@ -50410,7 +52436,7 @@ } } -;// CONCATENATED MODULE: ./src/core/xfa/factory.js +;// ./src/core/xfa/factory.js @@ -50432,7 +52458,7 @@ } } isValid() { - return this.root && this.form; + return !!(this.root && this.form); } _createPagesHelper() { const iterator = this.form[$toPages](); @@ -50460,7 +52486,7 @@ width, height } = c.attributes.style; - return [0, 0, parseInt(width), parseInt(height)]; + return [0, 0, parseInt(width, 10), parseInt(height, 10)]; }); } catch (e) { warn(`XFA - an error occurred during layout: ${e}`); @@ -50551,7 +52577,10 @@ } } -;// CONCATENATED MODULE: ./src/core/annotation.js +;// ./src/core/annotation.js + + + @@ -50569,36 +52598,39 @@ class AnnotationFactory { static createGlobals(pdfManager) { - return Promise.all([pdfManager.ensureCatalog("acroForm"), pdfManager.ensureDoc("xfaDatasets"), pdfManager.ensureCatalog("structTreeRoot"), pdfManager.ensureCatalog("baseUrl"), pdfManager.ensureCatalog("attachments")]).then(([acroForm, xfaDatasets, structTreeRoot, baseUrl, attachments]) => { - return { - pdfManager, - acroForm: acroForm instanceof Dict ? acroForm : Dict.empty, - xfaDatasets, - structTreeRoot, - baseUrl, - attachments - }; - }, reason => { + return Promise.all([pdfManager.ensureCatalog("acroForm"), pdfManager.ensureDoc("xfaDatasets"), pdfManager.ensureCatalog("structTreeRoot"), pdfManager.ensureCatalog("baseUrl"), pdfManager.ensureCatalog("attachments"), pdfManager.ensureCatalog("globalColorSpaceCache")]).then(([acroForm, xfaDatasets, structTreeRoot, baseUrl, attachments, globalColorSpaceCache]) => ({ + pdfManager, + catalog: pdfManager.pdfDocument.catalog, + acroForm: acroForm instanceof Dict ? acroForm : Dict.empty, + xfaDatasets, + structTreeRoot, + baseUrl, + attachments, + globalColorSpaceCache + }), reason => { warn(`createGlobals: "${reason}".`); return null; }); } - static async create(xref, ref, annotationGlobals, idFactory, collectFields, pageRef) { + static async create(xref, ref, annotationGlobals, idFactory, collectFields, orphanFields, collectByType, pageRef) { const pageIndex = collectFields ? await this._getPageIndex(xref, ref, annotationGlobals.pdfManager) : null; - return annotationGlobals.pdfManager.ensure(this, "_create", [xref, ref, annotationGlobals, idFactory, collectFields, pageIndex, pageRef]); + return annotationGlobals.pdfManager.ensure(this, "_create", [xref, ref, annotationGlobals, idFactory, collectFields, orphanFields, collectByType, pageIndex, pageRef]); } - static _create(xref, ref, annotationGlobals, idFactory, collectFields = false, pageIndex = null, pageRef = null) { + static _create(xref, ref, annotationGlobals, idFactory, collectFields = false, orphanFields = null, collectByType = null, pageIndex = null, pageRef = null) { const dict = xref.fetchIfRef(ref); if (!(dict instanceof Dict)) { return undefined; } + let subtype = dict.get("Subtype"); + subtype = subtype instanceof Name ? subtype.name : null; + if (collectByType && !collectByType.has(AnnotationType[subtype?.toUpperCase()])) { + return null; + } const { acroForm, pdfManager } = annotationGlobals; const id = ref instanceof Ref ? ref.toString() : `annot_${idFactory.createObjId()}`; - let subtype = dict.get("Subtype"); - subtype = subtype instanceof Name ? subtype.name : null; const parameters = { xref, ref, @@ -50607,6 +52639,7 @@ id, annotationGlobals, collectFields, + orphanFields, needAppearances: !collectFields && acroForm.get("NeedAppearances") === true, pageIndex, evaluatorOptions: pdfManager.evaluatorOptions, @@ -50665,6 +52698,10 @@ return new StampAnnotation(parameters); case "FileAttachment": return new FileAttachmentAnnotation(parameters); + case "RichMedia": + return new RichMediaAnnotation(parameters); + case "Screen": + return new ScreenAnnotation(parameters); default: if (!collectFields) { if (!subtype) { @@ -50723,14 +52760,12 @@ continue; } imagePromises ||= new Map(); - imagePromises.set(bitmapId, StampAnnotation.createImage(bitmap, xref)); + imagePromises.set(bitmapId, createImage(bitmap, xref)); } return imagePromises; } - static async saveNewAnnotations(evaluator, task, annotations, imagePromises) { - const xref = evaluator.xref; + static async saveNewAnnotations(evaluator, xref, task, annotations, imagePromises, changes) { let baseFontRef; - const dependencies = []; const promises = []; const { isOffscreenCanvasSupported @@ -50743,19 +52778,16 @@ case AnnotationEditorType.FREETEXT: if (!baseFontRef) { const baseFont = new Dict(xref); - baseFont.set("BaseFont", Name.get("Helvetica")); - baseFont.set("Type", Name.get("Font")); - baseFont.set("Subtype", Name.get("Type1")); - baseFont.set("Encoding", Name.get("WinAnsiEncoding")); - const buffer = []; + baseFont.setIfName("BaseFont", "Helvetica"); + baseFont.setIfName("Type", "Font"); + baseFont.setIfName("Subtype", "Type1"); + baseFont.setIfName("Encoding", "WinAnsiEncoding"); baseFontRef = xref.getNewTemporaryRef(); - await writeObject(baseFontRef, baseFont, buffer, xref); - dependencies.push({ - ref: baseFontRef, - data: buffer.join("") + changes.put(baseFontRef, { + data: baseFont }); } - promises.push(FreeTextAnnotation.createNewAnnotation(xref, annotation, dependencies, { + promises.push(FreeTextAnnotation.createNewAnnotation(xref, annotation, changes, { evaluator, task, baseFontRef @@ -50763,52 +52795,48 @@ break; case AnnotationEditorType.HIGHLIGHT: if (annotation.quadPoints) { - promises.push(HighlightAnnotation.createNewAnnotation(xref, annotation, dependencies)); + promises.push(HighlightAnnotation.createNewAnnotation(xref, annotation, changes)); } else { - promises.push(InkAnnotation.createNewAnnotation(xref, annotation, dependencies)); + promises.push(InkAnnotation.createNewAnnotation(xref, annotation, changes)); } break; case AnnotationEditorType.INK: - promises.push(InkAnnotation.createNewAnnotation(xref, annotation, dependencies)); + promises.push(InkAnnotation.createNewAnnotation(xref, annotation, changes)); break; case AnnotationEditorType.STAMP: - if (!isOffscreenCanvasSupported) { - break; - } - const image = await imagePromises.get(annotation.bitmapId); - if (image.imageStream) { + const image = isOffscreenCanvasSupported ? await imagePromises?.get(annotation.bitmapId) : null; + if (image?.imageStream) { const { imageStream, smaskStream } = image; - const buffer = []; if (smaskStream) { const smaskRef = xref.getNewTemporaryRef(); - await writeObject(smaskRef, smaskStream, buffer, xref); - dependencies.push({ - ref: smaskRef, - data: buffer.join("") + changes.put(smaskRef, { + data: smaskStream }); imageStream.dict.set("SMask", smaskRef); - buffer.length = 0; } const imageRef = image.imageRef = xref.getNewTemporaryRef(); - await writeObject(imageRef, imageStream, buffer, xref); - dependencies.push({ - ref: imageRef, - data: buffer.join("") + changes.put(imageRef, { + data: imageStream }); - image.imageStream = image.smaskStream = null; + image.imageStream = null; + image.imageRenderStream = null; + image.smaskStream = null; + image.smaskRenderStream = null; } - promises.push(StampAnnotation.createNewAnnotation(xref, annotation, dependencies, { + promises.push(StampAnnotation.createNewAnnotation(xref, annotation, changes, { image })); break; + case AnnotationEditorType.SIGNATURE: + promises.push(StampAnnotation.createNewAnnotation(xref, annotation, changes, {})); + break; } } return { - annotations: await Promise.all(promises), - dependencies + annotations: (await Promise.all(promises)).flat() }; } static async printNewAnnotations(annotationGlobals, evaluator, task, annotations, imagePromises) { @@ -50849,26 +52877,34 @@ })); break; case AnnotationEditorType.STAMP: - if (!options.isOffscreenCanvasSupported) { - break; - } - const image = await imagePromises.get(annotation.bitmapId); - if (image.imageStream) { + const image = options.isOffscreenCanvasSupported ? await imagePromises?.get(annotation.bitmapId) : null; + if (image?.imageStream) { const { imageStream, - smaskStream + imageRenderStream, + smaskStream, + smaskRenderStream } = image; - if (smaskStream) { - imageStream.dict.set("SMask", smaskStream); - } - image.imageRef = new JpegStream(imageStream, imageStream.length); - image.imageStream = image.smaskStream = null; + const imageRef = imageRenderStream || new JpegStream(imageStream, imageStream.length); + if (smaskStream || smaskRenderStream) { + imageRef.dict.set("SMask", smaskRenderStream || smaskStream); + } + image.imageRef = imageRef; + image.imageStream = null; + image.imageRenderStream = null; + image.smaskStream = null; + image.smaskRenderStream = null; } promises.push(StampAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { image, evaluatorOptions: options })); break; + case AnnotationEditorType.SIGNATURE: + promises.push(StampAnnotation.createNewPrintAnnotation(annotationGlobals, xref, annotation, { + evaluatorOptions: options + })); + break; } } return Promise.all(promises); @@ -50883,61 +52919,44 @@ case 0: return null; case 1: - ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0); + ColorSpaceUtils.gray.getRgbItem(color, 0, rgbColor, 0); return rgbColor; case 3: - ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0); + ColorSpaceUtils.rgb.getRgbItem(color, 0, rgbColor, 0); return rgbColor; case 4: - ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0); + ColorSpaceUtils.cmyk.getRgbItem(color, 0, rgbColor, 0); return rgbColor; default: return defaultColor; } } -function getPdfColorArray(color) { - return Array.from(color, c => c / 255); +function getPdfColorArray(color, defaultValue = null) { + return color && Array.from(color, c => c / 255) || defaultValue; } function getQuadPoints(dict, rect) { const quadPoints = dict.getArray("QuadPoints"); - if (!Array.isArray(quadPoints) || quadPoints.length === 0 || quadPoints.length % 8 > 0) { + if (!isNumberArray(quadPoints, null) || quadPoints.length === 0 || quadPoints.length % 8 > 0) { return null; } - const quadPointsLists = []; - for (let i = 0, ii = quadPoints.length / 8; i < ii; i++) { - let minX = Infinity, - maxX = -Infinity, - minY = Infinity, - maxY = -Infinity; - for (let j = i * 8, jj = i * 8 + 8; j < jj; j += 2) { - const x = quadPoints[j]; - const y = quadPoints[j + 1]; - minX = Math.min(x, minX); - maxX = Math.max(x, maxX); - minY = Math.min(y, minY); - maxY = Math.max(y, maxY); - } + const newQuadPoints = new Float32Array(quadPoints.length); + for (let i = 0, ii = quadPoints.length; i < ii; i += 8) { + const [x1, y1, x2, y2, x3, y3, x4, y4] = quadPoints.slice(i, i + 8); + const minX = Math.min(x1, x2, x3, x4); + const maxX = Math.max(x1, x2, x3, x4); + const minY = Math.min(y1, y2, y3, y4); + const maxY = Math.max(y1, y2, y3, y4); if (rect !== null && (minX < rect[0] || maxX > rect[2] || minY < rect[1] || maxY > rect[3])) { return null; } - quadPointsLists.push([{ - x: minX, - y: maxY - }, { - x: maxX, - y: maxY - }, { - x: minX, - y: minY - }, { - x: maxX, - y: minY - }]); + newQuadPoints.set([minX, maxY, maxX, maxY, minX, minY, maxX, minY], i); } - return quadPointsLists; + return newQuadPoints; } function getTransformMatrix(rect, bbox, matrix) { - const [minX, minY, maxX, maxY] = Util.getAxialAlignedBoundingBox(bbox, matrix); + const minMax = F32_BBOX_INIT.slice(); + Util.axialAlignedBoundingBox(bbox, matrix, minMax); + const [minX, minY, maxX, maxY] = minMax; if (minX === maxX || minY === maxY) { return [1, 0, 0, 1, rect[0], rect[1]]; } @@ -50946,12 +52965,21 @@ return [xRatio, 0, 0, yRatio, rect[0] - minX * xRatio, rect[1] - minY * yRatio]; } class Annotation { + appearance = null; + _oc = undefined; constructor(params) { const { + annotationGlobals, dict, - xref, - annotationGlobals + orphanFields, + ref, + subtype, + xref } = params; + const parentRef = orphanFields?.get(ref); + if (parentRef) { + dict.set("Parent", parentRef); + } this.setTitle(dict.get("T")); this.setContents(dict.get("Contents")); this.setModificationDate(dict.get("M")); @@ -50960,7 +52988,7 @@ this.setColor(dict.getArray("C")); this.setBorderStyle(dict); this.setAppearance(dict); - this.setOptionalContent(dict); + this.#setOptionalContent(xref, dict); const MK = dict.get("MK"); this.setBorderAndBackgroundColors(MK); this.setRotation(MK, dict); @@ -50971,12 +52999,8 @@ } const isLocked = !!(this.flags & AnnotationFlag.LOCKED); const isContentLocked = !!(this.flags & AnnotationFlag.LOCKEDCONTENTS); - if (annotationGlobals.structTreeRoot) { - let structParent = dict.get("StructParent"); - structParent = Number.isInteger(structParent) && structParent >= 0 ? structParent : -1; - annotationGlobals.structTreeRoot.addAnnotationIdToPage(params.pageRef, structParent); - } this.data = { + annotationType: AnnotationType[subtype?.toUpperCase()], annotationFlags: this.flags, borderStyle: this.borderStyle, color: this.color, @@ -50987,12 +53011,20 @@ hasAppearance: !!this.appearance, id: params.id, modificationDate: this.modificationDate, + oc: this._oc, rect: this.rectangle, - subtype: params.subtype, + subtype, hasOwnCanvas: false, noRotate: !!(this.flags & AnnotationFlag.NOROTATE), - noHTML: isLocked && isContentLocked + noHTML: isLocked && isContentLocked, + isEditable: false, + structParent: -1 }; + if (annotationGlobals.structTreeRoot) { + let structParent = dict.get("StructParent"); + this.data.structParent = structParent = Number.isInteger(structParent) && structParent >= 0 ? structParent : -1; + annotationGlobals.structTreeRoot.addAnnotationIdToPage(params.pageRef, structParent); + } if (params.collectFields) { const kids = dict.get("Kids"); if (Array.isArray(kids)) { @@ -51010,13 +53042,50 @@ this.data.fieldName = this._constructFieldName(dict); this.data.pageIndex = params.pageIndex; } + const it = dict.get("IT"); + if (it instanceof Name) { + this.data.it = it.name; + } this._isOffscreenCanvasSupported = params.evaluatorOptions.isOffscreenCanvasSupported; this._fallbackFontDict = null; this._needAppearances = false; } + _getOperatorListNoAppearance() { + return { + opList: new OperatorList(), + separateForm: false, + separateCanvas: false + }; + } _hasFlag(flags, flag) { return !!(flags & flag); } + _buildFlags(noView, noPrint) { + let { + flags + } = this; + if (noView === undefined) { + if (noPrint === undefined) { + return undefined; + } + if (noPrint) { + return flags & ~AnnotationFlag.PRINT; + } + return flags & ~AnnotationFlag.HIDDEN | AnnotationFlag.PRINT; + } + if (noView) { + flags |= AnnotationFlag.PRINT; + if (noPrint) { + return flags & ~AnnotationFlag.NOVIEW | AnnotationFlag.HIDDEN; + } + return flags & ~AnnotationFlag.HIDDEN | AnnotationFlag.NOVIEW; + } + flags &= ~(AnnotationFlag.HIDDEN | AnnotationFlag.NOVIEW); + if (noPrint) { + return flags & ~AnnotationFlag.PRINT; + } + return flags | AnnotationFlag.PRINT; + } _isViewable(flags) { return !this._hasFlag(flags, AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, AnnotationFlag.NOVIEW); } @@ -51037,6 +53106,9 @@ } return this.printable; } + mustBeViewedWhenEditing(isEditing, modifiedIds = null) { + return isEditing ? !this.data.isEditable : !modifiedIds?.has(this.data.id); + } get viewable() { if (this.data.quadPoints === null) { return false; @@ -51094,7 +53166,7 @@ return this._hasFlag(this.flags, flag); } setRectangle(rectangle) { - this.rectangle = Array.isArray(rectangle) && rectangle.length === 4 ? Util.normalizeRect(rectangle) : [0, 0, 0, 0]; + this.rectangle = lookupNormalRect(rectangle, [0, 0, 0, 0]); } setColor(color) { this.color = getRgbColor(color); @@ -51163,12 +53235,16 @@ } } else if (borderStyle.has("Border")) { const array = borderStyle.getArray("Border"); - if (Array.isArray(array) && array.length >= 3) { - this.borderStyle.setHorizontalCornerRadius(array[0]); - this.borderStyle.setVerticalCornerRadius(array[1]); - this.borderStyle.setWidth(array[2], this.rectangle); - if (array.length === 4) { - this.borderStyle.setDashArray(array[3], true); + if (Array.isArray(array)) { + if (array.length >= 3) { + this.borderStyle.setHorizontalCornerRadius(array[0]); + this.borderStyle.setVerticalCornerRadius(array[1]); + this.borderStyle.setWidth(array[2], this.rectangle); + if (array.length === 4) { + this.borderStyle.setDashArray(array[3], true); + } + } else if (array.length === 0) { + this.borderStyle.setWidth(0); } } } else { @@ -51176,7 +53252,6 @@ } } setAppearance(dict) { - this.appearance = null; const appearanceStates = dict.get("AP"); if (!(appearanceStates instanceof Dict)) { return; @@ -51190,7 +53265,7 @@ return; } const as = dict.get("AS"); - if (!(as instanceof Name) || !normalAppearanceState.has(as.name)) { + if (!(as instanceof Name)) { return; } const appearance = normalAppearanceState.get(as.name); @@ -51198,63 +53273,53 @@ this.appearance = appearance; } } - setOptionalContent(dict) { - this.oc = null; - const oc = dict.get("OC"); - if (oc instanceof Name) { - warn("setOptionalContent: Support for /Name-entry is not implemented."); - } else if (oc instanceof Dict) { - this.oc = oc; + #setOptionalContent(xref, dict) { + if (dict.has("OC")) { + try { + this._oc = parseMarkedContentProps(xref, dict.get("OC"), null); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn(`#setOptionalContent: ${ex}`); + } } } - loadResources(keys, appearance) { - return appearance.dict.getAsync("Resources").then(resources => { - if (!resources) { - return undefined; - } - const objectLoader = new ObjectLoader(resources, keys, resources.xref); - return objectLoader.load().then(function () { - return resources; - }); - }); + async loadResources(keys, appearance) { + const resources = await appearance.dict.getAsync("Resources"); + if (resources) { + await ObjectLoader.load(resources, keys, resources.xref); + } + return resources; + } + get _ownCanvasRequiresForms() { + return false; } - async getOperatorList(evaluator, task, intent, renderForms, annotationStorage) { + async getOperatorList(evaluator, task, intent, annotationStorage) { const { hasOwnCanvas, id, rect } = this.data; let appearance = this.appearance; - const isUsingOwnCanvas = !!(hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY); - if (isUsingOwnCanvas && (rect[0] === rect[2] || rect[1] === rect[3])) { + const isUsingOwnCanvas = !!(hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY && (!this._ownCanvasRequiresForms || intent & RenderingIntentFlag.ANNOTATIONS_FORMS)); + if (isUsingOwnCanvas && (this.width === 0 || this.height === 0)) { this.data.hasOwnCanvas = false; - return { - opList: new OperatorList(), - separateForm: false, - separateCanvas: false - }; + return this._getOperatorListNoAppearance(); } if (!appearance) { if (!isUsingOwnCanvas) { - return { - opList: new OperatorList(), - separateForm: false, - separateCanvas: false - }; + return this._getOperatorListNoAppearance(); } - appearance = new StringStream(""); - appearance.dict = new Dict(); + appearance = new StringStream("", new Dict()); } const appearanceDict = appearance.dict; - const resources = await this.loadResources(["ExtGState", "ColorSpace", "Pattern", "Shading", "XObject", "Font"], appearance); - const bbox = appearanceDict.getArray("BBox") || [0, 0, 1, 1]; - const matrix = appearanceDict.getArray("Matrix") || [1, 0, 0, 1, 0, 0]; + const resources = await this.loadResources(RESOURCES_KEYS_OPERATOR_LIST, appearance); + const bbox = lookupRect(appearanceDict.getArray("BBox"), [0, 0, this.width, this.height]); + const matrix = lookupMatrix(appearanceDict.getArray("Matrix"), IDENTITY_MATRIX); const transform = getTransformMatrix(rect, bbox, matrix); const opList = new OperatorList(); - let optionalContent; - if (this.oc) { - optionalContent = await evaluator.parseMarkedContentProps(this.oc, null); - } + const optionalContent = this._oc; if (optionalContent !== undefined) { opList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); } @@ -51277,9 +53342,12 @@ separateCanvas: isUsingOwnCanvas }; } - async save(evaluator, task, annotationStorage) { + async save(evaluator, task, annotationStorage, changes) { return null; } + get overlaysTextContent() { + return false; + } get hasTextContent() { return false; } @@ -51287,7 +53355,7 @@ if (!this.appearance) { return; } - const resources = await this.loadResources(["ExtGState", "Font", "Properties", "XObject"], this.appearance); + const resources = await this.loadResources(RESOURCES_KEYS_TEXT_CONTENT, this.appearance); const text = []; const buffer = []; let firstPosition = null; @@ -51323,7 +53391,9 @@ } if (text.length > 1 || text[0]) { const appearanceDict = this.appearance.dict; - this.data.textPosition = this._transformPoint(firstPosition, appearanceDict.getArray("BBox"), appearanceDict.getArray("Matrix")); + const bbox = lookupRect(appearanceDict.getArray("BBox"), null); + const matrix = lookupMatrix(appearanceDict.getArray("Matrix"), null); + this.data.textPosition = this._transformPoint(firstPosition, bbox, matrix); this.data.textContent = text; } } @@ -51336,8 +53406,10 @@ const transform = getTransformMatrix(rect, bbox, matrix); transform[4] -= rect[0]; transform[5] -= rect[1]; - coords = Util.applyTransform(coords, transform); - return Util.applyTransform(coords, matrix); + const p = coords.slice(); + Util.applyTransform(p, transform); + Util.applyTransform(p, matrix); + return p; } getFieldObject() { if (this.data.kidIds) { @@ -51391,15 +53463,29 @@ } return fieldName.join("."); } + _getAttachmentId(fsDict, fsRef, annotationGlobals) { + if (!(fsDict instanceof Dict)) { + return undefined; + } + if (!(fsRef instanceof Ref)) { + fsRef = FileSpec.pickPlatformItem(fsDict.get("EF"), true); + } + return fsRef instanceof Ref ? annotationGlobals.catalog.getAttachmentIdForAnnotation(fsRef) : undefined; + } + get width() { + return this.data.rect[2] - this.data.rect[0]; + } + get height() { + return this.data.rect[3] - this.data.rect[1]; + } } class AnnotationBorderStyle { - constructor() { - this.width = 1; - this.style = AnnotationBorderStyleType.SOLID; - this.dashArray = [3]; - this.horizontalCornerRadius = 0; - this.verticalCornerRadius = 0; - } + width = 1; + rawWidth = 1; + style = AnnotationBorderStyleType.SOLID; + dashArray = [3]; + horizontalCornerRadius = 0; + verticalCornerRadius = 0; setWidth(width, rect = [0, 0, 0, 0]) { if (width instanceof Name) { this.width = 0; @@ -51407,6 +53493,7 @@ } if (typeof width === "number") { if (width > 0) { + this.rawWidth = width; const maxWidth = (rect[2] - rect[0]) / 2; const maxHeight = (rect[3] - rect[1]) / 2; if (maxWidth > 0 && maxHeight > 0 && (width > maxWidth || width > maxHeight)) { @@ -51542,10 +53629,7 @@ fillAlpha, pointsCallback }) { - let minX = Number.MAX_VALUE; - let minY = Number.MAX_VALUE; - let maxX = Number.MIN_VALUE; - let maxY = Number.MIN_VALUE; + const bbox = this.data.rect = BBOX_INIT.slice(); const buffer = ["q"]; if (extra) { buffer.push(extra); @@ -51556,46 +53640,23 @@ if (fillColor) { buffer.push(`${fillColor[0]} ${fillColor[1]} ${fillColor[2]} rg`); } - let pointsArray = this.data.quadPoints; - if (!pointsArray) { - pointsArray = [[{ - x: this.rectangle[0], - y: this.rectangle[3] - }, { - x: this.rectangle[2], - y: this.rectangle[3] - }, { - x: this.rectangle[0], - y: this.rectangle[1] - }, { - x: this.rectangle[2], - y: this.rectangle[1] - }]]; - } - for (const points of pointsArray) { - const [mX, MX, mY, MY] = pointsCallback(buffer, points); - minX = Math.min(minX, mX); - maxX = Math.max(maxX, MX); - minY = Math.min(minY, mY); - maxY = Math.max(maxY, MY); + const pointsArray = this.data.quadPoints || Float32Array.from([this.rectangle[0], this.rectangle[3], this.rectangle[2], this.rectangle[3], this.rectangle[0], this.rectangle[1], this.rectangle[2], this.rectangle[1]]); + for (let i = 0, ii = pointsArray.length; i < ii; i += 8) { + const points = pointsCallback(buffer, pointsArray.subarray(i, i + 8)); + Util.rectBoundingBox(...points, bbox); } buffer.push("Q"); const formDict = new Dict(xref); const appearanceStreamDict = new Dict(xref); - appearanceStreamDict.set("Subtype", Name.get("Form")); - const appearanceStream = new StringStream(buffer.join(" ")); - appearanceStream.dict = appearanceStreamDict; + appearanceStreamDict.setIfName("Subtype", "Form"); + const appearanceStream = new StringStream(buffer.join(" "), appearanceStreamDict); formDict.set("Fm0", appearanceStream); const gsDict = new Dict(xref); if (blendMode) { - gsDict.set("BM", Name.get(blendMode)); - } - if (typeof strokeAlpha === "number") { - gsDict.set("CA", strokeAlpha); - } - if (typeof fillAlpha === "number") { - gsDict.set("ca", fillAlpha); + gsDict.setIfName("BM", blendMode); } + gsDict.setIfNumber("CA", strokeAlpha); + gsDict.setIfNumber("ca", fillAlpha); const stateDict = new Dict(xref); stateDict.set("GS0", gsDict); const resources = new Dict(xref); @@ -51603,26 +53664,21 @@ resources.set("XObject", formDict); const appearanceDict = new Dict(xref); appearanceDict.set("Resources", resources); - const bbox = this.data.rect = [minX, minY, maxX, maxY]; appearanceDict.set("BBox", bbox); - this.appearance = new StringStream("/GS0 gs /Fm0 Do"); - this.appearance.dict = appearanceDict; + this.appearance = new StringStream("/GS0 gs /Fm0 Do", appearanceDict); this._streams.push(this.appearance, appearanceStream); } - static async createNewAnnotation(xref, annotation, dependencies, params) { + static async createNewAnnotation(xref, annotation, changes, params) { const annotationRef = annotation.ref ||= xref.getNewTemporaryRef(); const ap = await this.createNewAppearanceStream(annotation, xref, params); - const buffer = []; let annotationDict; if (ap) { const apRef = xref.getNewTemporaryRef(); annotationDict = this.createNewDict(annotation, xref, { apRef }); - await writeObject(apRef, ap, buffer, xref); - dependencies.push({ - ref: apRef, - data: buffer.join("") + changes.put(apRef, { + data: ap }); } else { annotationDict = this.createNewDict(annotation, xref, {}); @@ -51630,18 +53686,41 @@ if (Number.isInteger(annotation.parentTreeId)) { annotationDict.set("StructParent", annotation.parentTreeId); } - buffer.length = 0; - await writeObject(annotationRef, annotationDict, buffer, xref); - return { - ref: annotationRef, - data: buffer.join("") + changes.put(annotationRef, { + data: annotationDict + }); + const retRef = { + ref: annotationRef }; + const { + popup + } = annotation; + if (popup) { + if (popup.deleted) { + annotationDict.delete("Popup"); + annotationDict.delete("Contents"); + annotationDict.delete("RC"); + return retRef; + } + const popupRef = popup.ref ||= xref.getNewTemporaryRef(); + popup.parent = annotationRef; + const popupDict = PopupAnnotation.createNewDict(popup, xref); + changes.put(popupRef, { + data: popupDict + }); + annotationDict.setIfDefined("Contents", stringToAsciiOrUTF16BE(popup.contents)); + annotationDict.set("Popup", popupRef); + return [retRef, { + ref: popupRef + }]; + } + return retRef; } static async createNewPrintAnnotation(annotationGlobals, xref, annotation, params) { const ap = await this.createNewAppearanceStream(annotation, xref, params); - const annotationDict = this.createNewDict(annotation, xref, { + const annotationDict = this.createNewDict(annotation, xref, ap ? { ap - }); + } : {}); const newAnnotation = new this.prototype.constructor({ dict: annotationDict, xref, @@ -51664,7 +53743,6 @@ } = params; const data = this.data; this._needAppearances = params.needAppearances; - data.annotationType = AnnotationType.WIDGET; if (data.fieldName === undefined) { data.fieldName = this._constructFieldName(dict); } @@ -51724,15 +53802,17 @@ if (!Number.isInteger(data.fieldFlags) || data.fieldFlags < 0) { data.fieldFlags = 0; } + data.password = this.hasFieldFlag(AnnotationFieldFlag.PASSWORD); data.readOnly = this.hasFieldFlag(AnnotationFieldFlag.READONLY); data.required = this.hasFieldFlag(AnnotationFieldFlag.REQUIRED); data.hidden = this._hasFlag(data.annotationFlags, AnnotationFlag.HIDDEN) || this._hasFlag(data.annotationFlags, AnnotationFlag.NOVIEW); } _decodeFormValue(formValue) { if (Array.isArray(formValue)) { - return formValue.filter(item => typeof item === "string").map(item => stringToPDFString(item)); + const arr = formValue.map(item => this._decodeFormValue(item)).filter(item => item !== null); + return arr.length > 0 ? arr : null; } else if (formValue instanceof Name) { - return stringToPDFString(formValue.name); + return formValue.name; } else if (typeof formValue === "string") { return stringToPDFString(formValue); } @@ -51755,12 +53835,7 @@ if (rotation === undefined) { rotation = this.rotation; } - if (rotation === 0) { - return IDENTITY_MATRIX; - } - const width = this.data.rect[2] - this.data.rect[0]; - const height = this.data.rect[3] - this.data.rect[1]; - return getRotationMatrix(rotation, width, height); + return rotation === 0 ? IDENTITY_MATRIX : getRotationMatrix(rotation, this.width, this.height); } getBorderAndBackgroundAppearances(annotationStorage) { let rotation = annotationStorage?.get(this.data.id)?.rotation; @@ -51770,9 +53845,7 @@ if (!this.backgroundColor && !this.borderColor) { return ""; } - const width = this.data.rect[2] - this.data.rect[0]; - const height = this.data.rect[3] - this.data.rect[1]; - const rect = rotation === 0 || rotation === 180 ? `0 0 ${width} ${height} re` : `0 0 ${height} ${width} re`; + const rect = rotation === 0 || rotation === 180 ? `0 0 ${this.width} ${this.height} re` : `0 0 ${this.height} ${this.width} re`; let str = ""; if (this.backgroundColor) { str = `${getPdfColor(this.backgroundColor, true)} ${rect} f `; @@ -51783,20 +53856,18 @@ } return str; } - async getOperatorList(evaluator, task, intent, renderForms, annotationStorage) { - if (renderForms && !(this instanceof SignatureWidgetAnnotation) && !this.data.noHTML && !this.data.hasOwnCanvas) { - return { - opList: new OperatorList(), - separateForm: true, - separateCanvas: false - }; + async getOperatorList(evaluator, task, intent, annotationStorage) { + if (intent & RenderingIntentFlag.ANNOTATIONS_FORMS && !(this instanceof SignatureWidgetAnnotation) && !this.data.noHTML && !this.data.hasOwnCanvas) { + const list = this._getOperatorListNoAppearance(); + list.separateForm = true; + return list; } if (!this._hasText) { - return super.getOperatorList(evaluator, task, intent, renderForms, annotationStorage); + return super.getOperatorList(evaluator, task, intent, annotationStorage); } const content = await this._getAppearance(evaluator, task, intent, annotationStorage); if (this.appearance && content === null) { - return super.getOperatorList(evaluator, task, intent, renderForms, annotationStorage); + return super.getOperatorList(evaluator, task, intent, annotationStorage); } const opList = new OperatorList(); if (!this._defaultAppearance || content === null) { @@ -51808,12 +53879,9 @@ } const isUsingOwnCanvas = !!(this.data.hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY); const matrix = [1, 0, 0, 1, 0, 0]; - const bbox = [0, 0, this.data.rect[2] - this.data.rect[0], this.data.rect[3] - this.data.rect[1]]; + const bbox = [0, 0, this.width, this.height]; const transform = getTransformMatrix(this.data.rect, bbox, matrix); - let optionalContent; - if (this.oc) { - optionalContent = await evaluator.parseMarkedContentProps(this.oc, null); - } + const optionalContent = this._oc; if (optionalContent !== undefined) { opList.addOp(OPS.beginMarkedContentProps, ["OC", optionalContent]); } @@ -51840,27 +53908,41 @@ if (rotation) { mk.set("R", rotation); } - if (this.borderColor) { - mk.set("BC", getPdfColorArray(this.borderColor)); - } - if (this.backgroundColor) { - mk.set("BG", getPdfColorArray(this.backgroundColor)); - } + mk.setIfArray("BC", getPdfColorArray(this.borderColor)); + mk.setIfArray("BG", getPdfColorArray(this.backgroundColor)); return mk.size > 0 ? mk : null; } amendSavedDict(annotationStorage, dict) {} - async save(evaluator, task, annotationStorage) { + setValue(dict, value, xref, changes) { + const { + dict: parentDict, + ref: parentRef + } = getParentToUpdate(dict, this.ref, xref); + if (!parentDict) { + dict.set("V", value); + } else if (!changes.has(parentRef)) { + const newParentDict = parentDict.clone(); + newParentDict.set("V", value); + changes.put(parentRef, { + data: newParentDict + }); + return newParentDict; + } + return null; + } + async save(evaluator, task, annotationStorage, changes) { const storageEntry = annotationStorage?.get(this.data.id); + const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint); let value = storageEntry?.value, rotation = storageEntry?.rotation; if (value === this.data.fieldValue || value === undefined) { - if (!this._hasValueFromXFA && rotation === undefined) { - return null; + if (!this._hasValueFromXFA && rotation === undefined && flags === undefined) { + return; } value ||= this.data.fieldValue; } - if (rotation === undefined && !this._hasValueFromXFA && Array.isArray(value) && Array.isArray(this.data.fieldValue) && value.length === this.data.fieldValue.length && value.every((x, i) => x === this.data.fieldValue[i])) { - return null; + if (rotation === undefined && !this._hasValueFromXFA && Array.isArray(value) && Array.isArray(this.data.fieldValue) && isArrayEqual(value, this.data.fieldValue) && flags === undefined) { + return; } if (rotation === undefined) { rotation = this.rotation; @@ -51868,8 +53950,8 @@ let appearance = null; if (!this._needAppearances) { appearance = await this._getAppearance(evaluator, task, RenderingIntentFlag.SAVE, annotationStorage); - if (appearance === null) { - return null; + if (appearance === null && flags === undefined) { + return; } } else {} let needAppearances = false; @@ -51882,64 +53964,64 @@ } = evaluator; const originalDict = xref.fetchIfRef(this.ref); if (!(originalDict instanceof Dict)) { - return null; + return; } const dict = new Dict(xref); - for (const key of originalDict.getKeys()) { + for (const [key, rawVal] of originalDict.getRawEntries()) { if (key !== "AP") { - dict.set(key, originalDict.getRaw(key)); + dict.set(key, rawVal); + } + } + if (flags !== undefined) { + dict.set("F", flags); + if (appearance === null && !needAppearances) { + const ap = originalDict.getRaw("AP"); + if (ap) { + dict.set("AP", ap); + } } } const xfa = { path: this.data.fieldName, value }; - const encoder = val => isAscii(val) ? val : stringToUTF16String(val, true); - dict.set("V", Array.isArray(value) ? value.map(encoder) : encoder(value)); - this.amendSavedDict(annotationStorage, dict); + const newParentDict = this.setValue(dict, Array.isArray(value) ? value.map(stringToAsciiOrUTF16BE) : stringToAsciiOrUTF16BE(value), xref, changes); + this.amendSavedDict(annotationStorage, newParentDict || dict); const maybeMK = this._getMKDict(rotation); if (maybeMK) { dict.set("MK", maybeMK); } - const buffer = []; - const changes = [{ - ref: this.ref, - data: "", + changes.put(this.ref, { + data: dict, xfa, needAppearances - }]; + }); if (appearance !== null) { const newRef = xref.getNewTemporaryRef(); const AP = new Dict(xref); dict.set("AP", AP); AP.set("N", newRef); - const resources = this._getSaveFieldResources(xref); - const appearanceStream = new StringStream(appearance); - const appearanceDict = appearanceStream.dict = new Dict(xref); - appearanceDict.set("Subtype", Name.get("Form")); + const resources = this._getSaveFieldResources(xref), + appearanceDict = new Dict(xref); + appearanceDict.setIfName("Subtype", "Form"); appearanceDict.set("Resources", resources); - appearanceDict.set("BBox", [0, 0, this.data.rect[2] - this.data.rect[0], this.data.rect[3] - this.data.rect[1]]); + const bbox = rotation % 180 === 0 ? [0, 0, this.width, this.height] : [0, 0, this.height, this.width]; + appearanceDict.set("BBox", bbox); + const appearanceStream = new StringStream(appearance, appearanceDict); const rotationMatrix = this.getRotationMatrix(annotationStorage); if (rotationMatrix !== IDENTITY_MATRIX) { appearanceDict.set("Matrix", rotationMatrix); } - await writeObject(newRef, appearanceStream, buffer, xref); - changes.push({ - ref: newRef, - data: buffer.join(""), + changes.put(newRef, { + data: appearanceStream, xfa: null, needAppearances: false }); - buffer.length = 0; } dict.set("M", `D:${getModificationDate()}`); - await writeObject(this.ref, dict, buffer, xref); - changes[0].data = buffer.join(""); - return changes; } async _getAppearance(evaluator, task, intent, annotationStorage) { - const isPassword = this.hasFieldFlag(AnnotationFieldFlag.PASSWORD); - if (isPassword) { + if (this.data.password) { return null; } const storageEntry = annotationStorage?.get(this.data.id); @@ -51964,7 +54046,7 @@ value = value[0]; } assert(typeof value === "string", "Expected `value` to be a string."); - value = value.trim(); + value = value.trimEnd(); if (this.data.combo) { const option = this.data.options.find(({ exportValue @@ -51987,8 +54069,10 @@ } const defaultPadding = 1; const defaultHPadding = 2; - let totalHeight = this.data.rect[3] - this.data.rect[1]; - let totalWidth = this.data.rect[2] - this.data.rect[0]; + let { + width: totalWidth, + height: totalHeight + } = this; if (rotation === 90 || rotation === 270) { [totalWidth, totalHeight] = [totalHeight, totalWidth]; } @@ -52018,8 +54102,8 @@ const newFont = resources.getRaw("Font"); if (this._fieldResources.mergedResources.has("Font")) { const oldFont = this._fieldResources.mergedResources.get("Font"); - for (const key of newFont.getKeys()) { - oldFont.set(key, newFont.getRaw(key)); + for (const [key, rawVal] of newFont.getRawEntries()) { + oldFont.set(key, rawVal); } } else { this._fieldResources.mergedResources.set("Font", newFont); @@ -52055,7 +54139,7 @@ return this._getMultilineAppearance(defaultAppearance, encodedLines, font, fontSize, totalWidth, totalHeight, alignment, defaultHPadding, defaultVPadding, descent, lineHeight, annotationStorage); } if (this.data.comb) { - return this._getCombAppearance(defaultAppearance, font, encodedLines[0], fontSize, totalWidth, totalHeight, defaultHPadding, defaultVPadding, descent, lineHeight, annotationStorage); + return this._getCombAppearance(defaultAppearance, font, encodedLines[0], fontSize, totalWidth, totalHeight, alignment, bidi(lines[0]).dir === "rtl", annotationStorage); } const bottomPadding = defaultVPadding + descent; if (alignment === 0 || alignment > 2) { @@ -52083,7 +54167,7 @@ return initialState.font; } _getTextWidth(text, font) { - return font.charsToGlyphs(text).reduce((width, glyph) => width + glyph.width, 0) / 1000; + return Math.sumPrecise(font.charsToGlyphs(text).map(g => g.width)) / 1000; } _computeFontSize(height, width, text, font, lineCount) { let { @@ -52095,7 +54179,7 @@ const roundWithTwoDigits = x => Math.floor(x * 100) / 100; if (lineCount === -1) { const textWidth = this._getTextWidth(text, font); - fontSize = roundWithTwoDigits(Math.min(height / LINE_FACTOR, textWidth > width ? width / textWidth : Infinity)); + fontSize = roundWithTwoDigits(Math.min(height / LINE_FACTOR, width / textWidth)); numberOfLines = 1; } else { const lines = text.split(/\r\n?|\n/); @@ -52201,9 +54285,16 @@ class TextWidgetAnnotation extends WidgetAnnotation { constructor(params) { super(params); + const { + dict + } = params; + if (dict.has("PMD")) { + this.flags |= AnnotationFlag.HIDDEN; + this.data.hidden = true; + warn("Barcodes are not supported"); + } this.data.hasOwnCanvas = this.data.readOnly && !this.data.noHTML; this._hasText = true; - const dict = params.dict; if (typeof this.data.fieldValue !== "string") { this.data.fieldValue = ""; } @@ -52224,22 +54315,98 @@ } this.data.maxLen = maximumLength; this.data.multiLine = this.hasFieldFlag(AnnotationFieldFlag.MULTILINE); - this.data.comb = this.hasFieldFlag(AnnotationFieldFlag.COMB) && !this.hasFieldFlag(AnnotationFieldFlag.MULTILINE) && !this.hasFieldFlag(AnnotationFieldFlag.PASSWORD) && !this.hasFieldFlag(AnnotationFieldFlag.FILESELECT) && this.data.maxLen !== 0; + this.data.comb = this.hasFieldFlag(AnnotationFieldFlag.COMB) && !this.data.multiLine && !this.data.password && !this.hasFieldFlag(AnnotationFieldFlag.FILESELECT) && this.data.maxLen !== 0; this.data.doNotScroll = this.hasFieldFlag(AnnotationFieldFlag.DONOTSCROLL); + const { + data: { + actions + } + } = this; + if (!actions) { + return; + } + const AFDateTime = /^AF(Date|Time)_(?:Keystroke|Format)(?:Ex)?\(['"]?([^'"]+)['"]?\);$/; + let canUseHTMLDateTime = false; + if (actions.Format?.length === 1 && actions.Keystroke?.length === 1 && AFDateTime.test(actions.Format[0]) && AFDateTime.test(actions.Keystroke[0]) || actions.Format?.length === 0 && actions.Keystroke?.length === 1 && AFDateTime.test(actions.Keystroke[0]) || actions.Keystroke?.length === 0 && actions.Format?.length === 1 && AFDateTime.test(actions.Format[0])) { + canUseHTMLDateTime = true; + } + const actionsToVisit = []; + if (actions.Format) { + actionsToVisit.push(...actions.Format); + } + if (actions.Keystroke) { + actionsToVisit.push(...actions.Keystroke); + } + if (canUseHTMLDateTime) { + delete actions.Keystroke; + actions.Format = actionsToVisit; + } + for (const formatAction of actionsToVisit) { + const m = formatAction.match(AFDateTime); + if (!m) { + continue; + } + const isDate = m[1] === "Date"; + let format = m[2]; + const num = parseInt(format, 10); + if (!isNaN(num) && Math.floor(Math.log10(num)) + 1 === m[2].length) { + format = (isDate ? DateFormats : TimeFormats)[num] ?? format; + } + this.data.datetimeFormat = format; + if (!canUseHTMLDateTime) { + break; + } + if (isDate) { + if (/HH|MM|ss|h/.test(format)) { + this.data.datetimeType = "datetime-local"; + this.data.timeStep = /ss/.test(format) ? 1 : 60; + } else { + this.data.datetimeType = "date"; + } + break; + } + this.data.datetimeType = "time"; + this.data.timeStep = /ss/.test(format) ? 1 : 60; + break; + } } get hasTextContent() { return !!this.appearance && !this._needAppearances; } - _getCombAppearance(defaultAppearance, font, text, fontSize, width, height, hPadding, vPadding, descent, lineHeight, annotationStorage) { + _getCombAppearance(defaultAppearance, font, text, fontSize, width, height, alignment, isRTL, annotationStorage) { const combWidth = width / this.data.maxLen; const colors = this.getBorderAndBackgroundAppearances(annotationStorage); - const buf = []; - const positions = font.getCharPositions(text); - for (const [start, end] of positions) { - buf.push(`(${escapeString(text.substring(start, end))}) Tj`); + const cells = font.getCharPositions(text).map(([start, end]) => { + const glyph = text.substring(start, end); + return { + glyph, + width: this._getTextWidth(glyph, font) * fontSize + }; + }); + if (isRTL) { + cells.reverse(); + } + const textWidth = combWidth * cells.length; + let hShift = 0; + if (alignment === 1) { + hShift += Math.floor((width - textWidth) / (2 * combWidth)) * combWidth; + } else if (alignment === 2) { + hShift += width - textWidth; } - const renderedComb = buf.join(` ${numberToString(combWidth)} 0 Td `); - return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 ${numberToString(hPadding)} ${numberToString(vPadding + descent)} Tm ${renderedComb}` + " ET Q EMC"; + const buf = []; + let previousWidth = 0; + for (let i = 0, ii = cells.length; i < ii; i++) { + const { + glyph, + width: glyphWidth + } = cells[i]; + const shift = i === 0 ? (combWidth - glyphWidth) / 2 : combWidth + (previousWidth - glyphWidth) / 2; + buf.push(`${numberToString(shift)} 0 Td (${escapeString(glyph)}) Tj`); + previousWidth = glyphWidth; + } + const renderedComb = buf.join(" "); + const vShift = (height - (font.capHeight || font.ascent || 1) * fontSize) / 2; + return `/Tx BMC q ${colors}BT ` + defaultAppearance + ` 1 0 0 1 ${numberToString(hShift)} ${numberToString(vShift)} Tm ${renderedComb}` + " ET Q EMC"; } _getMultilineAppearance(defaultAppearance, lines, font, fontSize, width, height, alignment, hPadding, vPadding, descent, lineHeight, annotationStorage) { const buf = []; @@ -52308,17 +54475,32 @@ } } if (startChunk < line.length) { - chunks.push(line.substring(startChunk, line.length)); + chunks.push(line.substring(startChunk)); } return chunks; } + async extractTextContent(evaluator, task, viewBox) { + await super.extractTextContent(evaluator, task, viewBox); + const text = this.data.textContent; + if (!text) { + return; + } + const allText = text.join("\n"); + if (allText === this.data.fieldValue) { + return; + } + const regex = allText.replaceAll(/([.*+?^${}()|[\]\\])|(\s+)/g, (_m, p1) => p1 ? `\\${p1}` : "\\s+"); + if (new RegExp(`^\\s*${regex}\\s*$`).test(this.data.fieldValue)) { + this.data.textContent = this.data.fieldValue.split("\n"); + } + } getFieldObject() { return { id: this.data.id, value: this.data.fieldValue, defaultValue: this.data.defaultFieldValue || "", multiline: this.data.multiLine, - password: this.hasFieldFlag(AnnotationFieldFlag.PASSWORD), + password: this.data.password, charLimit: this.data.maxLen, comb: this.data.comb, editable: !this.data.readOnly, @@ -52330,6 +54512,8 @@ strokeColor: this.data.borderColor, fillColor: this.data.backgroundColor, rotation: this.rotation, + datetimeFormat: this.data.datetimeFormat, + hasDatetimeHTML: !!this.data.datetimeType, type: "text" }; } @@ -52339,26 +54523,62 @@ super(params); this.checkedAppearance = null; this.uncheckedAppearance = null; - this.data.checkBox = !this.hasFieldFlag(AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); - this.data.radioButton = this.hasFieldFlag(AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); - this.data.pushButton = this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); + const isRadio = this.hasFieldFlag(AnnotationFieldFlag.RADIO), + isPushButton = this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); + this.data.checkBox = !isRadio && !isPushButton; + this.data.radioButton = isRadio && !isPushButton; + this.data.pushButton = isPushButton; this.data.isTooltipOnly = false; + this.data.hasOwnCanvas = true; + this.data.noHTML = false; if (this.data.checkBox) { this._processCheckBox(params); } else if (this.data.radioButton) { this._processRadioButton(params); } else if (this.data.pushButton) { - this.data.hasOwnCanvas = true; - this.data.noHTML = false; this._processPushButton(params); } else { warn("Invalid field flags for button widget annotation"); } } - async getOperatorList(evaluator, task, intent, renderForms, annotationStorage) { + get _ownCanvasRequiresForms() { + return this.data.checkBox || this.data.radioButton; + } + #getOperatorListForAppearance(evaluator, task, intent, annotationStorage, rotation, appearance) { + if (!appearance) { + return this._getOperatorListNoAppearance(); + } + const savedAppearance = this.appearance; + const savedMatrix = lookupMatrix(appearance.dict.getArray("Matrix"), IDENTITY_MATRIX); + if (rotation) { + appearance.dict.set("Matrix", this.getRotationMatrix(annotationStorage)); + } + this.appearance = appearance; + const operatorList = super.getOperatorList(evaluator, task, intent, annotationStorage); + this.appearance = savedAppearance; + appearance.dict.set("Matrix", savedMatrix); + return operatorList; + } + async getOperatorList(evaluator, task, intent, annotationStorage) { if (this.data.pushButton) { return super.getOperatorList(evaluator, task, intent, false, annotationStorage); } + if (intent & RenderingIntentFlag.DISPLAY && intent & RenderingIntentFlag.ANNOTATIONS_FORMS && (this.data.checkBox || this.data.radioButton)) { + const setCanvasName = (operatorList, name) => { + const index = operatorList.fnArray.indexOf(OPS.beginAnnotation); + if (index !== -1) { + operatorList.argsArray[index].push(name); + } + }; + const checked = await this.#getOperatorListForAppearance(evaluator, task, intent, annotationStorage, null, this.checkedAppearance); + setCanvasName(checked.opList, "checked"); + const unchecked = await this.#getOperatorListForAppearance(evaluator, task, intent, annotationStorage, null, this.uncheckedAppearance); + setCanvasName(unchecked.opList, "unchecked"); + checked.opList.addOpList(unchecked.opList); + checked.separateForm ||= unchecked.separateForm; + checked.separateCanvas ||= unchecked.separateCanvas; + return checked; + } let value = null; let rotation = null; if (annotationStorage) { @@ -52367,59 +54587,44 @@ rotation = storageEntry ? storageEntry.rotation : null; } if (value === null && this.appearance) { - return super.getOperatorList(evaluator, task, intent, renderForms, annotationStorage); + return super.getOperatorList(evaluator, task, intent, annotationStorage); } if (value === null || value === undefined) { value = this.data.checkBox ? this.data.fieldValue === this.data.exportValue : this.data.fieldValue === this.data.buttonValue; } - const appearance = value ? this.checkedAppearance : this.uncheckedAppearance; - if (appearance) { - const savedAppearance = this.appearance; - const savedMatrix = appearance.dict.getArray("Matrix") || IDENTITY_MATRIX; - if (rotation) { - appearance.dict.set("Matrix", this.getRotationMatrix(annotationStorage)); - } - this.appearance = appearance; - const operatorList = super.getOperatorList(evaluator, task, intent, renderForms, annotationStorage); - this.appearance = savedAppearance; - appearance.dict.set("Matrix", savedMatrix); - return operatorList; - } - return { - opList: new OperatorList(), - separateForm: false, - separateCanvas: false - }; + return this.#getOperatorListForAppearance(evaluator, task, intent, annotationStorage, rotation, value ? this.checkedAppearance : this.uncheckedAppearance); } - async save(evaluator, task, annotationStorage) { + async save(evaluator, task, annotationStorage, changes) { if (this.data.checkBox) { - return this._saveCheckbox(evaluator, task, annotationStorage); + this._saveCheckbox(evaluator, task, annotationStorage, changes); + return; } if (this.data.radioButton) { - return this._saveRadioButton(evaluator, task, annotationStorage); + this._saveRadioButton(evaluator, task, annotationStorage, changes); } - return null; } - async _saveCheckbox(evaluator, task, annotationStorage) { + async _saveCheckbox(evaluator, task, annotationStorage, changes) { if (!annotationStorage) { - return null; + return; } const storageEntry = annotationStorage.get(this.data.id); + const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint); let rotation = storageEntry?.rotation, value = storageEntry?.value; - if (rotation === undefined) { + if (rotation === undefined && flags === undefined) { if (value === undefined) { - return null; + return; } const defaultValue = this.data.fieldValue === this.data.exportValue; if (defaultValue === value) { - return null; + return; } } - const dict = evaluator.xref.fetchIfRef(this.ref); + let dict = evaluator.xref.fetchIfRef(this.ref); if (!(dict instanceof Dict)) { - return null; + return; } + dict = dict.clone(); if (rotation === undefined) { rotation = this.rotation; } @@ -52430,42 +54635,45 @@ path: this.data.fieldName, value: value ? this.data.exportValue : "" }; - const name = Name.get(value ? this.data.exportValue : "Off"); - dict.set("V", name); + const name = Name.get(value ? this._onStateName : "Off"); + this.setValue(dict, name, evaluator.xref, changes); dict.set("AS", name); dict.set("M", `D:${getModificationDate()}`); + if (flags !== undefined) { + dict.set("F", flags); + } const maybeMK = this._getMKDict(rotation); if (maybeMK) { dict.set("MK", maybeMK); } - const buffer = []; - await writeObject(this.ref, dict, buffer, evaluator.xref); - return [{ - ref: this.ref, - data: buffer.join(""), - xfa - }]; + changes.put(this.ref, { + data: dict, + xfa, + needAppearances: false + }); } - async _saveRadioButton(evaluator, task, annotationStorage) { + async _saveRadioButton(evaluator, task, annotationStorage, changes) { if (!annotationStorage) { - return null; + return; } const storageEntry = annotationStorage.get(this.data.id); + const flags = this._buildFlags(storageEntry?.noView, storageEntry?.noPrint); let rotation = storageEntry?.rotation, value = storageEntry?.value; - if (rotation === undefined) { + if (rotation === undefined && flags === undefined) { if (value === undefined) { - return null; + return; } const defaultValue = this.data.fieldValue === this.data.buttonValue; if (defaultValue === value) { - return null; + return; } } - const dict = evaluator.xref.fetchIfRef(this.ref); + let dict = evaluator.xref.fetchIfRef(this.ref); if (!(dict instanceof Dict)) { - return null; + return; } + dict = dict.clone(); if (value === undefined) { value = this.data.fieldValue === this.data.buttonValue; } @@ -52476,44 +54684,30 @@ path: this.data.fieldName, value: value ? this.data.buttonValue : "" }; - const name = Name.get(value ? this.data.buttonValue : "Off"); - const buffer = []; - let parentData = null; + const name = Name.get(value ? this._onStateName : "Off"); if (value) { - if (this.parent instanceof Ref) { - const parent = evaluator.xref.fetch(this.parent); - parent.set("V", name); - await writeObject(this.parent, parent, buffer, evaluator.xref); - parentData = buffer.join(""); - buffer.length = 0; - } else if (this.parent instanceof Dict) { - this.parent.set("V", name); - } + this.setValue(dict, name, evaluator.xref, changes); } dict.set("AS", name); dict.set("M", `D:${getModificationDate()}`); + if (flags !== undefined) { + dict.set("F", flags); + } const maybeMK = this._getMKDict(rotation); if (maybeMK) { dict.set("MK", maybeMK); } - await writeObject(this.ref, dict, buffer, evaluator.xref); - const newRefs = [{ - ref: this.ref, - data: buffer.join(""), - xfa - }]; - if (parentData) { - newRefs.push({ - ref: this.parent, - data: parentData, - xfa: null - }); - } - return newRefs; + changes.put(this.ref, { + data: dict, + xfa, + needAppearances: false + }); } _getDefaultCheckedAppearance(params, type) { - const width = this.data.rect[2] - this.data.rect[0]; - const height = this.data.rect[3] - this.data.rect[1]; + const { + width, + height + } = this; const bbox = [0, 0, width, height]; const FONT_RATIO = 0.8; const fontSize = Math.min(width, height) * FONT_RATIO; @@ -52538,8 +54732,8 @@ const appearance = `q BT /PdfJsZaDb ${fontSize} Tf 0 g ${xShift} ${yShift} Td (${char}) Tj ET Q`; const appearanceStreamDict = new Dict(params.xref); appearanceStreamDict.set("FormType", 1); - appearanceStreamDict.set("Subtype", Name.get("Form")); - appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.setIfName("Subtype", "Form"); + appearanceStreamDict.setIfName("Type", "XObject"); appearanceStreamDict.set("BBox", bbox); appearanceStreamDict.set("Matrix", [1, 0, 0, 1, 0, 0]); appearanceStreamDict.set("Length", appearance.length); @@ -52548,25 +54742,104 @@ font.set("PdfJsZaDb", this.fallbackFontDict); resources.set("Font", font); appearanceStreamDict.set("Resources", resources); - this.checkedAppearance = new StringStream(appearance); - this.checkedAppearance.dict = appearanceStreamDict; + this.checkedAppearance = new StringStream(appearance, appearanceStreamDict); this._streams.push(this.checkedAppearance); } + _getOnStateName(dict) { + const appearanceStates = dict.get("AP"); + if (!(appearanceStates instanceof Dict)) { + return null; + } + const normalAppearance = appearanceStates.get("N"); + if (!(normalAppearance instanceof Dict)) { + return null; + } + for (const key of normalAppearance.getKeys()) { + if (key !== "Off") { + return key; + } + } + return null; + } + _getExportValueForOptIndex(index, opt, xref) { + if (Number.isInteger(index) && index >= 0 && index < opt.length) { + const value = this._decodeFormValue(xref.fetchIfRef(opt[index])); + if (typeof value === "string") { + return value; + } + } + return null; + } + _getOptInfo(dict, onState, opt, xref) { + if (!Array.isArray(opt)) { + return null; + } + const stateToIndex = new Map(); + let currentIndex = null; + const fieldParent = dict.get("Parent"); + const kids = fieldParent instanceof Dict ? fieldParent.get("Kids") : null; + if (Array.isArray(kids)) { + for (let i = 0, ii = Math.min(kids.length, opt.length); i < ii; i++) { + const kid = kids[i]; + if (kid instanceof Ref && isRefsEqual(kid, this.ref)) { + currentIndex = i; + } + const kidDict = xref.fetchIfRef(kid); + if (!(kidDict instanceof Dict)) { + continue; + } + if (kidDict === dict) { + currentIndex = i; + } + const kidOnState = this._getOnStateName(kidDict); + if (typeof kidOnState === "string" && !stateToIndex.has(kidOnState)) { + stateToIndex.set(kidOnState, i); + } + } + } else if (opt.length === 1 && typeof onState === "string") { + currentIndex = 0; + stateToIndex.set(onState, 0); + } + return { + currentIndex, + opt, + stateToIndex + }; + } + _getExportValue(state, optInfo, xref) { + if (!optInfo || typeof state !== "string" || state === "Off") { + return state; + } + if (state === this._onStateName) { + const exportValue = this._getExportValueForOptIndex(optInfo.currentIndex, optInfo.opt, xref); + if (exportValue !== null) { + return exportValue; + } + } + if (optInfo.stateToIndex.has(state)) { + const exportValue = this._getExportValueForOptIndex(optInfo.stateToIndex.get(state), optInfo.opt, xref); + if (exportValue !== null) { + return exportValue; + } + } + const index = parseInt(state, 10); + if (Number.isInteger(index) && String(index) === state) { + return this._getExportValueForOptIndex(index, optInfo.opt, xref) || state; + } + return state; + } _processCheckBox(params) { const customAppearance = params.dict.get("AP"); - if (!(customAppearance instanceof Dict)) { - return; - } - const normalAppearance = customAppearance.get("N"); + let normalAppearance = customAppearance instanceof Dict ? customAppearance.get("N") : null; if (!(normalAppearance instanceof Dict)) { - return; + normalAppearance = null; } const asValue = this._decodeFormValue(params.dict.get("AS")); if (typeof asValue === "string") { this.data.fieldValue = asValue; } const yes = this.data.fieldValue !== null && this.data.fieldValue !== "Off" ? this.data.fieldValue : "Yes"; - const exportValues = normalAppearance.getKeys(); + const exportValues = normalAppearance ? [...normalAppearance.getKeys()] : []; if (exportValues.length === 0) { exportValues.push("Off", yes); } else if (exportValues.length === 1) { @@ -52583,13 +54856,22 @@ exportValues.length = 0; exportValues.push("Off", otherYes); } - if (!exportValues.includes(this.data.fieldValue)) { + const onState = exportValues[1]; + this._onStateName = onState; + const opt = getInheritableProperty({ + dict: params.dict, + key: "Opt" + }); + const optInfo = this._getOptInfo(params.dict, onState, opt, params.xref); + this.data.exportValue = this._getExportValue(onState, optInfo, params.xref); + if (!exportValues.includes(this.data.fieldValue) && this.data.fieldValue !== this.data.exportValue) { this.data.fieldValue = "Off"; } - this.data.exportValue = exportValues[1]; - const checkedAppearance = normalAppearance.get(this.data.exportValue); + this.data.fieldValue = this._getExportValue(this.data.fieldValue, optInfo, params.xref); + this.data.defaultFieldValue = this._getExportValue(this.data.defaultFieldValue, optInfo, params.xref); + const checkedAppearance = normalAppearance?.get(onState); this.checkedAppearance = checkedAppearance instanceof BaseStream ? checkedAppearance : null; - const uncheckedAppearance = normalAppearance.get("Off"); + const uncheckedAppearance = normalAppearance?.get("Off"); this.uncheckedAppearance = uncheckedAppearance instanceof BaseStream ? uncheckedAppearance : null; if (this.checkedAppearance) { this._streams.push(this.checkedAppearance); @@ -52622,13 +54904,23 @@ if (!(normalAppearance instanceof Dict)) { return; } + let onState = null; for (const key of normalAppearance.getKeys()) { if (key !== "Off") { - this.data.buttonValue = this._decodeFormValue(key); + onState = key; break; } } - const checkedAppearance = normalAppearance.get(this.data.buttonValue); + this._onStateName = onState; + const opt = getInheritableProperty({ + dict: params.dict, + key: "Opt" + }); + const optInfo = this._getOptInfo(params.dict, onState, opt, params.xref); + this.data.buttonValue = this._getExportValue(onState, optInfo, params.xref); + this.data.fieldValue = this._getExportValue(this.data.fieldValue, optInfo, params.xref); + this.data.defaultFieldValue = this._getExportValue(this.data.defaultFieldValue, optInfo, params.xref); + const checkedAppearance = normalAppearance.get(onState); this.checkedAppearance = checkedAppearance instanceof BaseStream ? checkedAppearance : null; const uncheckedAppearance = normalAppearance.get("Off"); this.uncheckedAppearance = uncheckedAppearance instanceof BaseStream ? uncheckedAppearance : null; @@ -52691,10 +54983,10 @@ } get fallbackFontDict() { const dict = new Dict(); - dict.set("BaseFont", Name.get("ZapfDingbats")); - dict.set("Type", Name.get("FallbackType")); - dict.set("Subtype", Name.get("FallbackType")); - dict.set("Encoding", Name.get("ZapfDingbatsEncoding")); + dict.setIfName("BaseFont", "ZapfDingbats"); + dict.setIfName("Type", "FallbackType"); + dict.setIfName("Subtype", "FallbackType"); + dict.setIfName("Encoding", "ZapfDingbatsEncoding"); return shadow(this, "fallbackFontDict", dict); } } @@ -52725,8 +55017,8 @@ if (!this.hasIndices) { if (typeof this.data.fieldValue === "string") { this.data.fieldValue = [this.data.fieldValue]; - } else if (!this.data.fieldValue) { - this.data.fieldValue = []; + } else { + this.data.fieldValue ||= []; } } else { this.data.fieldValue = []; @@ -52737,6 +55029,12 @@ } } } + if (this.data.options.length === 0 && this.data.fieldValue.length > 0) { + this.data.options = this.data.fieldValue.map(value => ({ + exportValue: value, + displayValue: value + })); + } this.data.combo = this.hasFieldFlag(AnnotationFieldFlag.COMBO); this.data.multiSelect = this.hasFieldFlag(AnnotationFieldFlag.MULTISELECT); this._hasText = true; @@ -52803,8 +55101,10 @@ } const defaultPadding = 1; const defaultHPadding = 2; - let totalHeight = this.data.rect[3] - this.data.rect[1]; - let totalWidth = this.data.rect[2] - this.data.rect[0]; + let { + width: totalWidth, + height: totalHeight + } = this; if (rotation === 90 || rotation === 270) { [totalWidth, totalHeight] = [totalHeight, totalWidth]; } @@ -52906,7 +55206,6 @@ const { dict } = params; - this.data.annotationType = AnnotationType.TEXT; if (this.data.hasAppearance) { this.data.name = "NoIcon"; } else { @@ -52930,7 +55229,6 @@ dict, annotationGlobals } = params; - this.data.annotationType = AnnotationType.LINK; this.data.noHTML = false; const quadPoints = getQuadPoints(dict, this.rectangle); if (quadPoints) { @@ -52944,6 +55242,9 @@ docAttachments: annotationGlobals.attachments }); } + get overlaysTextContent() { + return true; + } } class PopupAnnotation extends Annotation { constructor(params) { @@ -52951,9 +55252,8 @@ const { dict } = params; - this.data.annotationType = AnnotationType.POPUP; this.data.noHTML = false; - if (this.data.rect[0] === this.data.rect[2] || this.data.rect[1] === this.data.rect[3]) { + if (this.width === 0 || this.height === 0) { this.data.rect = null; } let parentItem = dict.get("Parent"); @@ -52961,8 +55261,8 @@ warn("Popup annotation has a missing or invalid parent annotation."); return; } - const parentRect = parentItem.getArray("Rect"); - this.data.parentRect = Array.isArray(parentRect) && parentRect.length === 4 ? Util.normalizeRect(parentRect) : null; + this.data.parentRect = lookupNormalRect(parentItem.getArray("Rect"), null); + this.data.creationDate = parentItem.get("CreationDate") || ""; const rt = parentItem.get("RT"); if (isName(rt, AnnotationReplyType.GROUP)) { parentItem = parentItem.get("IRT"); @@ -52994,24 +55294,41 @@ } this.data.open = !!dict.get("Open"); } + static createNewDict(annotation, xref, _params) { + const { + oldAnnotation, + rect, + parent + } = annotation; + const popup = oldAnnotation || new Dict(xref); + popup.setIfNotExists("Type", Name.get("Annot")); + popup.setIfNotExists("Subtype", Name.get("Popup")); + popup.setIfNotExists("Open", false); + popup.setIfArray("Rect", rect); + popup.set("Parent", parent); + return popup; + } + static async createNewAppearanceStream(annotation, xref, params) { + return null; + } } class FreeTextAnnotation extends MarkupAnnotation { constructor(params) { super(params); - this.data.hasOwnCanvas = !this.data.noHTML; + this.data.hasOwnCanvas = this.data.noRotate; + this.data.isEditable = !this.data.noHTML; this.data.noHTML = false; const { - evaluatorOptions, + annotationGlobals, xref } = params; - this.data.annotationType = AnnotationType.FREETEXT; this.setDefaultAppearance(params); this._hasAppearance = !!this.appearance; if (this._hasAppearance) { const { fontColor, fontSize - } = parseAppearanceStream(this.appearance, evaluatorOptions, xref); + } = parseAppearanceStream(this.appearance, xref, annotationGlobals.globalColorSpaceCache); this.data.defaultAppearanceData.fontColor = fontColor; this.data.defaultAppearanceData.fontSize = fontSize || 10; } else { @@ -53048,34 +55365,33 @@ }) { const { color, + date, fontSize, + oldAnnotation, rect, rotation, user, value } = annotation; - const freetext = new Dict(xref); - freetext.set("Type", Name.get("Annot")); - freetext.set("Subtype", Name.get("FreeText")); - freetext.set("CreationDate", `D:${getModificationDate()}`); - freetext.set("Rect", rect); + const freetext = oldAnnotation || new Dict(xref); + freetext.setIfNotExists("Type", Name.get("Annot")); + freetext.setIfNotExists("Subtype", Name.get("FreeText")); + freetext.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate(date)}`); + if (oldAnnotation) { + freetext.delete("RC"); + } + freetext.setIfArray("Rect", rect); const da = `/Helv ${fontSize} Tf ${getPdfColor(color, true)}`; freetext.set("DA", da); - freetext.set("Contents", isAscii(value) ? value : stringToUTF16String(value, true)); - freetext.set("F", 4); - freetext.set("Border", [0, 0, 0]); - freetext.set("Rotate", rotation); - if (user) { - freetext.set("T", isAscii(user) ? user : stringToUTF16String(user, true)); - } + freetext.setIfDefined("Contents", stringToAsciiOrUTF16BE(value)); + freetext.setIfNotExists("F", 4); + freetext.setIfNotExists("Border", [0, 0, 0]); + freetext.setIfNumber("Rotate", rotation); + freetext.setIfDefined("T", stringToAsciiOrUTF16BE(user)); if (apRef || ap) { const n = new Dict(xref); freetext.set("AP", n); - if (apRef) { - n.set("N", apRef); - } else { - n.set("N", ap); - } + n.set("N", apRef || ap); } return freetext; } @@ -53092,16 +55408,19 @@ rotation, value } = annotation; + if (!color) { + return null; + } const resources = new Dict(xref); const font = new Dict(xref); if (baseFontRef) { font.set("Helv", baseFontRef); } else { const baseFont = new Dict(xref); - baseFont.set("BaseFont", Name.get("Helvetica")); - baseFont.set("Type", Name.get("Font")); - baseFont.set("Subtype", Name.get("Type1")); - baseFont.set("Encoding", Name.get("WinAnsiEncoding")); + baseFont.setIfName("BaseFont", "Helvetica"); + baseFont.setIfName("Type", "Font"); + baseFont.setIfName("Subtype", "Type1"); + baseFont.setIfName("Encoding", "WinAnsiEncoding"); font.set("Helv", baseFont); } resources.set("Font", font); @@ -53133,10 +55452,7 @@ } totalWidth = Math.max(totalWidth, lineWidth); } - let hscale = 1; - if (totalWidth > w) { - hscale = w / totalWidth; - } + const hscale = totalWidth > w ? w / totalWidth : 1; let vscale = 1; const lineHeight = LINE_FACTOR * fontSize; const lineAscent = (LINE_FACTOR - LINE_DESCENT_FACTOR) * fontSize; @@ -53180,14 +55496,12 @@ const appearance = buffer.join("\n"); const appearanceStreamDict = new Dict(xref); appearanceStreamDict.set("FormType", 1); - appearanceStreamDict.set("Subtype", Name.get("Form")); - appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.setIfName("Subtype", "Form"); + appearanceStreamDict.setIfName("Type", "XObject"); appearanceStreamDict.set("BBox", rect); appearanceStreamDict.set("Resources", resources); appearanceStreamDict.set("Matrix", [1, 0, 0, 1, -rect[0], -rect[1]]); - const ap = new StringStream(appearance); - ap.dict = appearanceStreamDict; - return ap; + return new StringStream(appearance, appearanceStreamDict); } } class LineAnnotation extends MarkupAnnotation { @@ -53197,18 +55511,17 @@ dict, xref } = params; - this.data.annotationType = AnnotationType.LINE; this.data.hasOwnCanvas = this.data.noRotate; this.data.noHTML = false; - const lineCoordinates = dict.getArray("L"); + const lineCoordinates = lookupRect(dict.getArray("L"), [0, 0, 0, 0]); this.data.lineCoordinates = Util.normalizeRect(lineCoordinates); this.setLineEndings(dict.getArray("LE")); this.data.lineEndings = this.lineEndings; if (!this.appearance) { - const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); const strokeAlpha = dict.get("CA"); const interiorColor = getRgbColor(dict.getArray("IC"), null); - const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null; + const fillColor = getPdfColorArray(interiorColor); const fillAlpha = fillColor ? strokeAlpha : null; const borderWidth = this.borderStyle.width || 1, borderAdjust = 2 * borderWidth; @@ -53225,7 +55538,7 @@ fillAlpha, pointsCallback: (buffer, points) => { buffer.push(`${lineCoordinates[0]} ${lineCoordinates[1]} m`, `${lineCoordinates[2]} ${lineCoordinates[3]} l`, "S"); - return [points[0].x - borderWidth, points[1].x + borderWidth, points[3].y - borderWidth, points[1].y + borderWidth]; + return [points[0] - borderWidth, points[7] - borderWidth, points[2] + borderWidth, points[3] + borderWidth]; } }); } @@ -53238,14 +55551,13 @@ dict, xref } = params; - this.data.annotationType = AnnotationType.SQUARE; this.data.hasOwnCanvas = this.data.noRotate; this.data.noHTML = false; if (!this.appearance) { - const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); const strokeAlpha = dict.get("CA"); const interiorColor = getRgbColor(dict.getArray("IC"), null); - const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null; + const fillColor = getPdfColorArray(interiorColor); const fillAlpha = fillColor ? strokeAlpha : null; if (this.borderStyle.width === 0 && !fillColor) { return; @@ -53258,17 +55570,17 @@ strokeAlpha, fillAlpha, pointsCallback: (buffer, points) => { - const x = points[2].x + this.borderStyle.width / 2; - const y = points[2].y + this.borderStyle.width / 2; - const width = points[3].x - points[2].x - this.borderStyle.width; - const height = points[1].y - points[3].y - this.borderStyle.width; + const x = points[4] + this.borderStyle.width / 2; + const y = points[5] + this.borderStyle.width / 2; + const width = points[6] - points[4] - this.borderStyle.width; + const height = points[3] - points[7] - this.borderStyle.width; buffer.push(`${x} ${y} ${width} ${height} re`); if (fillColor) { buffer.push("B"); } else { buffer.push("S"); } - return [points[0].x, points[1].x, points[3].y, points[1].y]; + return [points[0], points[7], points[2], points[3]]; } }); } @@ -53281,12 +55593,11 @@ dict, xref } = params; - this.data.annotationType = AnnotationType.CIRCLE; if (!this.appearance) { - const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); const strokeAlpha = dict.get("CA"); const interiorColor = getRgbColor(dict.getArray("IC"), null); - const fillColor = interiorColor ? getPdfColorArray(interiorColor) : null; + const fillColor = getPdfColorArray(interiorColor); const fillAlpha = fillColor ? strokeAlpha : null; if (this.borderStyle.width === 0 && !fillColor) { return; @@ -53300,10 +55611,10 @@ strokeAlpha, fillAlpha, pointsCallback: (buffer, points) => { - const x0 = points[0].x + this.borderStyle.width / 2; - const y0 = points[0].y - this.borderStyle.width / 2; - const x1 = points[3].x - this.borderStyle.width / 2; - const y1 = points[3].y + this.borderStyle.width / 2; + const x0 = points[0] + this.borderStyle.width / 2; + const y0 = points[1] - this.borderStyle.width / 2; + const x1 = points[6] - this.borderStyle.width / 2; + const y1 = points[7] + this.borderStyle.width / 2; const xMid = x0 + (x1 - x0) / 2; const yMid = y0 + (y1 - y0) / 2; const xOffset = (x1 - x0) / 2 * controlPointsDistance; @@ -53314,7 +55625,7 @@ } else { buffer.push("S"); } - return [points[0].x, points[1].x, points[3].y, points[1].y]; + return [points[0], points[7], points[2], points[3]]; } }); } @@ -53327,35 +55638,40 @@ dict, xref } = params; - this.data.annotationType = AnnotationType.POLYLINE; this.data.hasOwnCanvas = this.data.noRotate; this.data.noHTML = false; - this.data.vertices = []; + this.data.vertices = null; if (!(this instanceof PolygonAnnotation)) { this.setLineEndings(dict.getArray("LE")); this.data.lineEndings = this.lineEndings; } const rawVertices = dict.getArray("Vertices"); - if (!Array.isArray(rawVertices)) { + if (!isNumberArray(rawVertices, null)) { return; } - for (let i = 0, ii = rawVertices.length; i < ii; i += 2) { - this.data.vertices.push({ - x: rawVertices[i], - y: rawVertices[i + 1] - }); - } + const vertices = this.data.vertices = Float32Array.from(rawVertices); if (!this.appearance) { - const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); const strokeAlpha = dict.get("CA"); + let fillColor = getRgbColor(dict.getArray("IC"), null); + if (fillColor) { + fillColor = getPdfColorArray(fillColor); + } + let operator; + if (fillColor) { + if (this.color) { + operator = fillColor.every((c, i) => c === strokeColor[i]) ? "f" : "B"; + } else { + operator = "f"; + } + } else { + operator = "S"; + } const borderWidth = this.borderStyle.width || 1, borderAdjust = 2 * borderWidth; - const bbox = [Infinity, Infinity, -Infinity, -Infinity]; - for (const vertex of this.data.vertices) { - bbox[0] = Math.min(bbox[0], vertex.x - borderAdjust); - bbox[1] = Math.min(bbox[1], vertex.y - borderAdjust); - bbox[2] = Math.max(bbox[2], vertex.x + borderAdjust); - bbox[3] = Math.max(bbox[3], vertex.y + borderAdjust); + const bbox = BBOX_INIT.slice(); + for (let i = 0, ii = vertices.length; i < ii; i += 2) { + Util.rectBoundingBox(vertices[i] - borderAdjust, vertices[i + 1] - borderAdjust, vertices[i] + borderAdjust, vertices[i + 1] + borderAdjust, bbox); } if (!Util.intersect(this.rectangle, bbox)) { this.rectangle = bbox; @@ -53365,30 +55681,21 @@ extra: `${borderWidth} w`, strokeColor, strokeAlpha, + fillColor, + fillAlpha: fillColor ? strokeAlpha : null, pointsCallback: (buffer, points) => { - const vertices = this.data.vertices; - for (let i = 0, ii = vertices.length; i < ii; i++) { - buffer.push(`${vertices[i].x} ${vertices[i].y} ${i === 0 ? "m" : "l"}`); + for (let i = 0, ii = vertices.length; i < ii; i += 2) { + buffer.push(`${vertices[i]} ${vertices[i + 1]} ${i === 0 ? "m" : "l"}`); } - buffer.push("S"); - return [points[0].x, points[1].x, points[3].y, points[1].y]; + buffer.push(operator); + return [points[0], points[7], points[2], points[3]]; } }); } } } -class PolygonAnnotation extends PolylineAnnotation { - constructor(params) { - super(params); - this.data.annotationType = AnnotationType.POLYGON; - } -} -class CaretAnnotation extends MarkupAnnotation { - constructor(params) { - super(params); - this.data.annotationType = AnnotationType.CARET; - } -} +class PolygonAnnotation extends PolylineAnnotation {} +class CaretAnnotation extends MarkupAnnotation {} class InkAnnotation extends MarkupAnnotation { constructor(params) { super(params); @@ -53398,33 +55705,38 @@ dict, xref } = params; - this.data.annotationType = AnnotationType.INK; this.data.inkLists = []; + this.data.isEditable = !this.data.noHTML; + this.data.noHTML = false; + this.data.opacity = dict.get("CA") || 1; const rawInkLists = dict.getArray("InkList"); if (!Array.isArray(rawInkLists)) { return; } for (let i = 0, ii = rawInkLists.length; i < ii; ++i) { - this.data.inkLists.push([]); + if (!Array.isArray(rawInkLists[i])) { + continue; + } + const inkList = new Float32Array(rawInkLists[i].length); + this.data.inkLists.push(inkList); for (let j = 0, jj = rawInkLists[i].length; j < jj; j += 2) { - this.data.inkLists[i].push({ - x: xref.fetchIfRef(rawInkLists[i][j]), - y: xref.fetchIfRef(rawInkLists[i][j + 1]) - }); + const x = xref.fetchIfRef(rawInkLists[i][j]), + y = xref.fetchIfRef(rawInkLists[i][j + 1]); + if (typeof x === "number" && typeof y === "number") { + inkList[j] = x; + inkList[j + 1] = y; + } } } if (!this.appearance) { - const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); const strokeAlpha = dict.get("CA"); const borderWidth = this.borderStyle.width || 1, borderAdjust = 2 * borderWidth; - const bbox = [Infinity, Infinity, -Infinity, -Infinity]; - for (const inkLists of this.data.inkLists) { - for (const vertex of inkLists) { - bbox[0] = Math.min(bbox[0], vertex.x - borderAdjust); - bbox[1] = Math.min(bbox[1], vertex.y - borderAdjust); - bbox[2] = Math.max(bbox[2], vertex.x + borderAdjust); - bbox[3] = Math.max(bbox[3], vertex.y + borderAdjust); + const bbox = BBOX_INIT.slice(); + for (const inkList of this.data.inkLists) { + for (let i = 0, ii = inkList.length; i < ii; i += 2) { + Util.rectBoundingBox(inkList[i] - borderAdjust, inkList[i + 1] - borderAdjust, inkList[i] + borderAdjust, inkList[i + 1] + borderAdjust, bbox); } } if (!Util.intersect(this.rectangle, bbox)) { @@ -53437,12 +55749,12 @@ strokeAlpha, pointsCallback: (buffer, points) => { for (const inkList of this.data.inkLists) { - for (let i = 0, ii = inkList.length; i < ii; i++) { - buffer.push(`${inkList[i].x} ${inkList[i].y} ${i === 0 ? "m" : "l"}`); + for (let i = 0, ii = inkList.length; i < ii; i += 2) { + buffer.push(`${inkList[i]} ${inkList[i + 1]} ${i === 0 ? "m" : "l"}`); } buffer.push("S"); } - return [points[0].x, points[1].x, points[3].y, points[1].y]; + return [points[0], points[7], points[2], points[3]]; } }); } @@ -53452,36 +55764,40 @@ ap }) { const { + oldAnnotation, color, + date, opacity, paths, outlines, rect, rotation, - thickness + thickness, + user } = annotation; - const ink = new Dict(xref); - ink.set("Type", Name.get("Annot")); - ink.set("Subtype", Name.get("Ink")); - ink.set("CreationDate", `D:${getModificationDate()}`); - ink.set("Rect", rect); - ink.set("InkList", outlines?.points || paths.map(p => p.points)); - ink.set("F", 4); - ink.set("Rotate", rotation); + const ink = oldAnnotation || new Dict(xref); + ink.setIfNotExists("Type", Name.get("Annot")); + ink.setIfNotExists("Subtype", Name.get("Ink")); + ink.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate(date)}`); + ink.setIfArray("Rect", rect); + ink.setIfArray("InkList", outlines?.points || paths?.points); + ink.setIfNotExists("F", 4); + ink.setIfNumber("Rotate", rotation); + ink.setIfDefined("T", stringToAsciiOrUTF16BE(user)); if (outlines) { - ink.set("IT", Name.get("InkHighlight")); + ink.setIfName("IT", "InkHighlight"); } - const bs = new Dict(xref); - ink.set("BS", bs); - bs.set("W", thickness); - ink.set("C", Array.from(color, c => c / 255)); - ink.set("CA", opacity); - const n = new Dict(xref); - ink.set("AP", n); - if (apRef) { - n.set("N", apRef); - } else { - n.set("N", ap); + if (thickness > 0) { + const bs = new Dict(xref); + ink.set("BS", bs); + bs.set("W", thickness); + } + ink.setIfArray("C", getPdfColorArray(color)); + ink.setIfNumber("CA", opacity); + if (ap || apRef) { + const n = new Dict(xref); + ink.set("AP", n); + n.set("N", apRef || ap); } return ink; } @@ -53496,32 +55812,33 @@ thickness, opacity } = annotation; + if (!color) { + return null; + } const appearanceBuffer = [`${thickness} w 1 J 1 j`, `${getPdfColor(color, false)}`]; if (opacity !== 1) { appearanceBuffer.push("/R0 gs"); } - const buffer = []; - for (const { - bezier - } of paths) { - buffer.length = 0; - buffer.push(`${numberToString(bezier[0])} ${numberToString(bezier[1])} m`); - if (bezier.length === 2) { - buffer.push(`${numberToString(bezier[0])} ${numberToString(bezier[1])} l S`); - } else { - for (let i = 2, ii = bezier.length; i < ii; i += 6) { - const curve = bezier.slice(i, i + 6).map(numberToString).join(" "); - buffer.push(`${curve} c`); + for (const outline of paths.lines) { + appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} m`); + for (let i = 6, ii = outline.length; i < ii; i += 6) { + if (isNaN(outline[i])) { + appearanceBuffer.push(`${numberToString(outline[i + 4])} ${numberToString(outline[i + 5])} l`); + } else { + const [c1x, c1y, c2x, c2y, x, y] = outline.slice(i, i + 6); + appearanceBuffer.push([c1x, c1y, c2x, c2y, x, y].map(numberToString).join(" ") + " c"); } - buffer.push("S"); } - appearanceBuffer.push(buffer.join("\n")); + if (outline.length === 6) { + appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} l`); + } } + appearanceBuffer.push("S"); const appearance = appearanceBuffer.join("\n"); const appearanceStreamDict = new Dict(xref); appearanceStreamDict.set("FormType", 1); - appearanceStreamDict.set("Subtype", Name.get("Form")); - appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.setIfName("Subtype", "Form"); + appearanceStreamDict.setIfName("Type", "XObject"); appearanceStreamDict.set("BBox", rect); appearanceStreamDict.set("Length", appearance.length); if (opacity !== 1) { @@ -53529,14 +55846,12 @@ const extGState = new Dict(xref); const r0 = new Dict(xref); r0.set("CA", opacity); - r0.set("Type", Name.get("ExtGState")); + r0.setIfName("Type", "ExtGState"); extGState.set("R0", r0); resources.set("ExtGState", extGState); appearanceStreamDict.set("Resources", resources); } - const ap = new StringStream(appearance); - ap.dict = appearanceStreamDict; - return ap; + return new StringStream(appearance, appearanceStreamDict); } static async createNewAppearanceStreamForHighlight(annotation, xref, params) { const { @@ -53547,22 +55862,25 @@ }, opacity } = annotation; + if (!color) { + return null; + } const appearanceBuffer = [`${getPdfColor(color, true)}`, "/R0 gs"]; appearanceBuffer.push(`${numberToString(outline[4])} ${numberToString(outline[5])} m`); for (let i = 6, ii = outline.length; i < ii; i += 6) { - if (isNaN(outline[i]) || outline[i] === null) { + if (isNaN(outline[i])) { appearanceBuffer.push(`${numberToString(outline[i + 4])} ${numberToString(outline[i + 5])} l`); } else { - const curve = outline.slice(i, i + 6).map(numberToString).join(" "); - appearanceBuffer.push(`${curve} c`); + const [c1x, c1y, c2x, c2y, x, y] = outline.slice(i, i + 6); + appearanceBuffer.push([c1x, c1y, c2x, c2y, x, y].map(numberToString).join(" ") + " c"); } } appearanceBuffer.push("h f"); const appearance = appearanceBuffer.join("\n"); const appearanceStreamDict = new Dict(xref); appearanceStreamDict.set("FormType", 1); - appearanceStreamDict.set("Subtype", Name.get("Form")); - appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.setIfName("Subtype", "Form"); + appearanceStreamDict.setIfName("Type", "XObject"); appearanceStreamDict.set("BBox", rect); appearanceStreamDict.set("Length", appearance.length); const resources = new Dict(xref); @@ -53571,14 +55889,12 @@ appearanceStreamDict.set("Resources", resources); const r0 = new Dict(xref); extGState.set("R0", r0); - r0.set("BM", Name.get("Multiply")); + r0.setIfName("BM", "Multiply"); if (opacity !== 1) { r0.set("ca", opacity); - r0.set("Type", Name.get("ExtGState")); + r0.setIfName("Type", "ExtGState"); } - const ap = new StringStream(appearance); - ap.dict = appearanceStreamDict; - return ap; + return new StringStream(appearance, appearanceStreamDict); } } class HighlightAnnotation extends MarkupAnnotation { @@ -53588,15 +55904,13 @@ dict, xref } = params; - this.data.annotationType = AnnotationType.HIGHLIGHT; + this.data.isEditable = !this.data.noHTML; + this.data.noHTML = false; + this.data.opacity = dict.get("CA") || 1; const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); if (quadPoints) { - const resources = this.appearance?.dict.get("Resources"); - if (!this.appearance || !resources?.has("ExtGState")) { - if (this.appearance) { - warn("HighlightAnnotation - ignoring built-in appearance stream."); - } - const fillColor = this.color ? getPdfColorArray(this.color) : [1, 1, 0]; + if (!this.appearance) { + const fillColor = getPdfColorArray(this.color, [1, 1, 0]); const fillAlpha = dict.get("CA"); this._setDefaultAppearance({ xref, @@ -53604,8 +55918,8 @@ blendMode: "Multiply", fillAlpha, pointsCallback: (buffer, points) => { - buffer.push(`${points[0].x} ${points[0].y} m`, `${points[1].x} ${points[1].y} l`, `${points[3].x} ${points[3].y} l`, `${points[2].x} ${points[2].y} l`, "f"); - return [points[0].x, points[1].x, points[3].y, points[1].y]; + buffer.push(`${points[0]} ${points[1]} m`, `${points[2]} ${points[3]} l`, `${points[6]} ${points[7]} l`, `${points[4]} ${points[5]} l`, "f"); + return [points[0], points[7], points[2], points[3]]; } }); } @@ -53613,32 +55927,35 @@ this.data.popupRef = null; } } + get overlaysTextContent() { + return true; + } static createNewDict(annotation, xref, { apRef, ap }) { const { color, + date, + oldAnnotation, opacity, rect, rotation, user, quadPoints } = annotation; - const highlight = new Dict(xref); - highlight.set("Type", Name.get("Annot")); - highlight.set("Subtype", Name.get("Highlight")); - highlight.set("CreationDate", `D:${getModificationDate()}`); - highlight.set("Rect", rect); - highlight.set("F", 4); - highlight.set("Border", [0, 0, 0]); - highlight.set("Rotate", rotation); - highlight.set("QuadPoints", quadPoints); - highlight.set("C", Array.from(color, c => c / 255)); - highlight.set("CA", opacity); - if (user) { - highlight.set("T", isAscii(user) ? user : stringToUTF16String(user, true)); - } + const highlight = oldAnnotation || new Dict(xref); + highlight.setIfNotExists("Type", Name.get("Annot")); + highlight.setIfNotExists("Subtype", Name.get("Highlight")); + highlight.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate(date)}`); + highlight.setIfArray("Rect", rect); + highlight.setIfNotExists("F", 4); + highlight.setIfNotExists("Border", [0, 0, 0]); + highlight.setIfNumber("Rotate", rotation); + highlight.setIfArray("QuadPoints", quadPoints); + highlight.setIfArray("C", getPdfColorArray(color)); + highlight.setIfNumber("CA", opacity); + highlight.setIfDefined("T", stringToAsciiOrUTF16BE(user)); if (apRef || ap) { const n = new Dict(xref); highlight.set("AP", n); @@ -53653,6 +55970,9 @@ outlines, opacity } = annotation; + if (!color) { + return null; + } const appearanceBuffer = [`${getPdfColor(color, true)}`, "/R0 gs"]; const buffer = []; for (const outline of outlines) { @@ -53668,8 +55988,8 @@ const appearance = appearanceBuffer.join("\n"); const appearanceStreamDict = new Dict(xref); appearanceStreamDict.set("FormType", 1); - appearanceStreamDict.set("Subtype", Name.get("Form")); - appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.setIfName("Subtype", "Form"); + appearanceStreamDict.setIfName("Type", "XObject"); appearanceStreamDict.set("BBox", rect); appearanceStreamDict.set("Length", appearance.length); const resources = new Dict(xref); @@ -53678,14 +55998,12 @@ appearanceStreamDict.set("Resources", resources); const r0 = new Dict(xref); extGState.set("R0", r0); - r0.set("BM", Name.get("Multiply")); + r0.setIfName("BM", "Multiply"); if (opacity !== 1) { r0.set("ca", opacity); - r0.set("Type", Name.get("ExtGState")); + r0.setIfName("Type", "ExtGState"); } - const ap = new StringStream(appearance); - ap.dict = appearanceStreamDict; - return ap; + return new StringStream(appearance, appearanceStreamDict); } } class UnderlineAnnotation extends MarkupAnnotation { @@ -53695,11 +56013,10 @@ dict, xref } = params; - this.data.annotationType = AnnotationType.UNDERLINE; const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); if (quadPoints) { if (!this.appearance) { - const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); const strokeAlpha = dict.get("CA"); this._setDefaultAppearance({ xref, @@ -53707,8 +56024,8 @@ strokeColor, strokeAlpha, pointsCallback: (buffer, points) => { - buffer.push(`${points[2].x} ${points[2].y + 1.3} m`, `${points[3].x} ${points[3].y + 1.3} l`, "S"); - return [points[0].x, points[1].x, points[3].y, points[1].y]; + buffer.push(`${points[4]} ${points[5] + 1.3} m`, `${points[6]} ${points[7] + 1.3} l`, "S"); + return [points[0], points[7], points[2], points[3]]; } }); } @@ -53716,6 +56033,9 @@ this.data.popupRef = null; } } + get overlaysTextContent() { + return true; + } } class SquigglyAnnotation extends MarkupAnnotation { constructor(params) { @@ -53724,11 +56044,10 @@ dict, xref } = params; - this.data.annotationType = AnnotationType.SQUIGGLY; const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); if (quadPoints) { if (!this.appearance) { - const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); const strokeAlpha = dict.get("CA"); this._setDefaultAppearance({ xref, @@ -53736,11 +56055,11 @@ strokeColor, strokeAlpha, pointsCallback: (buffer, points) => { - const dy = (points[0].y - points[2].y) / 6; + const dy = (points[1] - points[5]) / 6; let shift = dy; - let x = points[2].x; - const y = points[2].y; - const xEnd = points[3].x; + let x = points[4]; + const y = points[5]; + const xEnd = points[6]; buffer.push(`${x} ${y + shift} m`); do { x += 2; @@ -53748,7 +56067,7 @@ buffer.push(`${x} ${y + shift} l`); } while (x < xEnd); buffer.push("S"); - return [points[2].x, xEnd, y - 2 * dy, y + 2 * dy]; + return [points[4], y - 2 * dy, xEnd, y + 2 * dy]; } }); } @@ -53756,6 +56075,9 @@ this.data.popupRef = null; } } + get overlaysTextContent() { + return true; + } } class StrikeOutAnnotation extends MarkupAnnotation { constructor(params) { @@ -53764,11 +56086,10 @@ dict, xref } = params; - this.data.annotationType = AnnotationType.STRIKEOUT; const quadPoints = this.data.quadPoints = getQuadPoints(dict, null); if (quadPoints) { if (!this.appearance) { - const strokeColor = this.color ? getPdfColorArray(this.color) : [0, 0, 0]; + const strokeColor = getPdfColorArray(this.color, [0, 0, 0]); const strokeAlpha = dict.get("CA"); this._setDefaultAppearance({ xref, @@ -53776,8 +56097,8 @@ strokeColor, strokeAlpha, pointsCallback: (buffer, points) => { - buffer.push(`${(points[0].x + points[2].x) / 2} ` + `${(points[0].y + points[2].y) / 2} m`, `${(points[1].x + points[3].x) / 2} ` + `${(points[1].y + points[3].y) / 2} l`, "S"); - return [points[0].x, points[1].x, points[3].y, points[1].y]; + buffer.push(`${(points[0] + points[4]) / 2} ` + `${(points[1] + points[5]) / 2} m`, `${(points[2] + points[6]) / 2} ` + `${(points[3] + points[7]) / 2} l`, "S"); + return [points[0], points[7], points[2], points[3]]; } }); } @@ -53785,108 +56106,103 @@ this.data.popupRef = null; } } + get overlaysTextContent() { + return true; + } } class StampAnnotation extends MarkupAnnotation { + #savedHasOwnCanvas = null; constructor(params) { super(params); - this.data.annotationType = AnnotationType.STAMP; this.data.hasOwnCanvas = this.data.noRotate; + this.data.isEditable = !this.data.noHTML; this.data.noHTML = false; } - static async createImage(bitmap, xref) { - const { - width, - height - } = bitmap; - const canvas = new OffscreenCanvas(width, height); - const ctx = canvas.getContext("2d", { - alpha: true - }); - ctx.drawImage(bitmap, 0, 0); - const data = ctx.getImageData(0, 0, width, height).data; - const buf32 = new Uint32Array(data.buffer); - const hasAlpha = buf32.some(FeatureTest.isLittleEndian ? x => x >>> 24 !== 0xff : x => (x & 0xff) !== 0xff); - if (hasAlpha) { - ctx.fillStyle = "white"; - ctx.fillRect(0, 0, width, height); - ctx.drawImage(bitmap, 0, 0); + mustBeViewedWhenEditing(isEditing, modifiedIds = null) { + if (isEditing) { + if (!this.data.isEditable) { + return true; + } + this.#savedHasOwnCanvas ??= this.data.hasOwnCanvas; + this.data.hasOwnCanvas = true; + return true; } - const jpegBufferPromise = canvas.convertToBlob({ - type: "image/jpeg", - quality: 1 - }).then(blob => blob.arrayBuffer()); - const xobjectName = Name.get("XObject"); - const imageName = Name.get("Image"); - const image = new Dict(xref); - image.set("Type", xobjectName); - image.set("Subtype", imageName); - image.set("BitsPerComponent", 8); - image.set("ColorSpace", Name.get("DeviceRGB")); - image.set("Filter", Name.get("DCTDecode")); - image.set("BBox", [0, 0, width, height]); - image.set("Width", width); - image.set("Height", height); - let smaskStream = null; - if (hasAlpha) { - const alphaBuffer = new Uint8Array(buf32.length); - if (FeatureTest.isLittleEndian) { - for (let i = 0, ii = buf32.length; i < ii; i++) { - alphaBuffer[i] = buf32[i] >>> 24; - } - } else { - for (let i = 0, ii = buf32.length; i < ii; i++) { - alphaBuffer[i] = buf32[i] & 0xff; - } - } - const smask = new Dict(xref); - smask.set("Type", xobjectName); - smask.set("Subtype", imageName); - smask.set("BitsPerComponent", 8); - smask.set("ColorSpace", Name.get("DeviceGray")); - smask.set("Width", width); - smask.set("Height", height); - smaskStream = new Stream(alphaBuffer, 0, 0, smask); + if (this.#savedHasOwnCanvas !== null) { + this.data.hasOwnCanvas = this.#savedHasOwnCanvas; + this.#savedHasOwnCanvas = null; } - const imageStream = new Stream(await jpegBufferPromise, 0, 0, image); - return { - imageStream, - smaskStream, - width, - height - }; + return !modifiedIds?.has(this.data.id); } static createNewDict(annotation, xref, { apRef, ap }) { const { + date, + oldAnnotation, rect, rotation, user } = annotation; - const stamp = new Dict(xref); - stamp.set("Type", Name.get("Annot")); - stamp.set("Subtype", Name.get("Stamp")); - stamp.set("CreationDate", `D:${getModificationDate()}`); - stamp.set("Rect", rect); - stamp.set("F", 4); - stamp.set("Border", [0, 0, 0]); - stamp.set("Rotate", rotation); - if (user) { - stamp.set("T", isAscii(user) ? user : stringToUTF16String(user, true)); - } + const stamp = oldAnnotation || new Dict(xref); + stamp.setIfNotExists("Type", Name.get("Annot")); + stamp.setIfNotExists("Subtype", Name.get("Stamp")); + stamp.set(oldAnnotation ? "M" : "CreationDate", `D:${getModificationDate(date)}`); + stamp.setIfArray("Rect", rect); + stamp.setIfNotExists("F", 4); + stamp.setIfNotExists("Border", [0, 0, 0]); + stamp.setIfNumber("Rotate", rotation); + stamp.setIfDefined("T", stringToAsciiOrUTF16BE(user)); if (apRef || ap) { const n = new Dict(xref); stamp.set("AP", n); - if (apRef) { - n.set("N", apRef); - } else { - n.set("N", ap); - } + n.set("N", apRef || ap); } return stamp; } + static async #createNewAppearanceStreamForDrawing(annotation, xref) { + const { + areContours, + color, + rect, + lines, + thickness + } = annotation; + if (!color) { + return null; + } + const appearanceBuffer = [`${thickness} w 1 J 1 j`, `${getPdfColor(color, areContours)}`]; + for (const line of lines) { + appearanceBuffer.push(`${numberToString(line[4])} ${numberToString(line[5])} m`); + for (let i = 6, ii = line.length; i < ii; i += 6) { + if (isNaN(line[i])) { + appearanceBuffer.push(`${numberToString(line[i + 4])} ${numberToString(line[i + 5])} l`); + } else { + const [c1x, c1y, c2x, c2y, x, y] = line.slice(i, i + 6); + appearanceBuffer.push([c1x, c1y, c2x, c2y, x, y].map(numberToString).join(" ") + " c"); + } + } + if (line.length === 6) { + appearanceBuffer.push(`${numberToString(line[4])} ${numberToString(line[5])} l`); + } + } + appearanceBuffer.push(areContours ? "F" : "S"); + const appearance = appearanceBuffer.join("\n"); + const appearanceStreamDict = new Dict(xref); + appearanceStreamDict.set("FormType", 1); + appearanceStreamDict.setIfName("Subtype", "Form"); + appearanceStreamDict.setIfName("Type", "XObject"); + appearanceStreamDict.set("BBox", rect); + appearanceStreamDict.set("Length", appearance.length); + return new StringStream(appearance, appearanceStreamDict); + } static async createNewAppearanceStream(annotation, xref, params) { + if (annotation.oldAnnotation) { + return null; + } + if (annotation.isSignature) { + return this.#createNewAppearanceStreamForDrawing(annotation, xref); + } const { rotation } = annotation; @@ -53902,39 +56218,344 @@ const appearance = `q ${width} 0 0 ${height} 0 0 cm /Im0 Do Q`; const appearanceStreamDict = new Dict(xref); appearanceStreamDict.set("FormType", 1); - appearanceStreamDict.set("Subtype", Name.get("Form")); - appearanceStreamDict.set("Type", Name.get("XObject")); + appearanceStreamDict.setIfName("Subtype", "Form"); + appearanceStreamDict.setIfName("Type", "XObject"); appearanceStreamDict.set("BBox", [0, 0, width, height]); appearanceStreamDict.set("Resources", resources); if (rotation) { const matrix = getRotationMatrix(rotation, width, height); appearanceStreamDict.set("Matrix", matrix); } - const ap = new StringStream(appearance); - ap.dict = appearanceStreamDict; - return ap; + return new StringStream(appearance, appearanceStreamDict); } } class FileAttachmentAnnotation extends MarkupAnnotation { constructor(params) { super(params); const { - dict, - xref + annotationGlobals, + dict } = params; - const file = new FileSpec(dict.get("FS"), xref); - this.data.annotationType = AnnotationType.FILEATTACHMENT; + const fsDict = dict.get("FS"); this.data.hasOwnCanvas = this.data.noRotate; this.data.noHTML = false; - this.data.file = file.serializable; + this.data.fileId = this._getAttachmentId(fsDict, dict.getRaw("FS"), annotationGlobals); + this.data.file = new FileSpec(fsDict).serializable; const name = dict.get("Name"); this.data.name = name instanceof Name ? stringToPDFString(name.name) : "PushPin"; const fillAlpha = dict.get("ca"); this.data.fillAlpha = typeof fillAlpha === "number" && fillAlpha >= 0 && fillAlpha <= 1 ? fillAlpha : null; } } +class MediaAnnotation extends Annotation { + static #MEDIA_MIME_TYPE_RE = /^(?:video|audio)\//; + constructor(params) { + super(params); + this.data.noHTML = true; + } + _setMediaData({ + assetRef, + assetDict, + filename, + contentType + }, annotationGlobals) { + this.data.noHTML = false; + this.data.richMedia = { + fileId: this._getAttachmentId(assetDict, assetRef, annotationGlobals), + filename, + contentType + }; + } + static _getContentType(assetDict, filename, contentType = null) { + if (typeof contentType === "string" && MediaAnnotation.#MEDIA_MIME_TYPE_RE.test(contentType)) { + return contentType; + } + const stream = FileSpec.pickPlatformItem(assetDict.get("EF")); + const subtype = stream instanceof BaseStream ? stream.dict?.get("Subtype") : null; + if (subtype instanceof Name && MediaAnnotation.#MEDIA_MIME_TYPE_RE.test(subtype.name)) { + return subtype.name; + } + const ext = filename.split(".").at(-1)?.toLowerCase(); + switch (ext) { + case "mp4": + case "m4v": + return "video/mp4"; + case "webm": + return "video/webm"; + case "ogv": + return "video/ogg"; + case "mov": + return "video/quicktime"; + case "mp3": + return "audio/mpeg"; + case "m4a": + return "audio/mp4"; + case "wav": + return "audio/wav"; + case "oga": + case "ogg": + return "audio/ogg"; + default: + return null; + } + } +} +class RichMediaAnnotation extends MediaAnnotation { + constructor(params) { + super(params); + const { + dict, + xref, + annotationGlobals + } = params; + const content = dict.get("RichMediaContent"); + if (!(content instanceof Dict)) { + return; + } + const asset = RichMediaAnnotation.#findAsset(content, xref); + if (!asset) { + warn("RichMedia annotation has no playable asset."); + return; + } + this._setMediaData(asset, annotationGlobals); + } + static #findAsset(content, xref) { + const configurations = content.get("Configurations"); + if (!Array.isArray(configurations)) { + return null; + } + for (const configRef of configurations) { + const config = xref.fetchIfRef(configRef); + if (!(config instanceof Dict)) { + continue; + } + const instances = config.get("Instances"); + if (!Array.isArray(instances)) { + continue; + } + for (const instanceRef of instances) { + const instance = xref.fetchIfRef(instanceRef); + if (!(instance instanceof Dict)) { + continue; + } + if (isName(instance.get("Subtype"), "Flash")) { + continue; + } + const rawAsset = instance.getRaw("Asset"); + const asset = xref.fetchIfRef(rawAsset); + if (!(asset instanceof Dict)) { + continue; + } + if (!FileSpec.hasEmbeddedFile(asset)) { + continue; + } + const { + filename + } = new FileSpec(asset).serializable; + const contentType = MediaAnnotation._getContentType(asset, filename); + if (!contentType) { + continue; + } + return { + assetRef: rawAsset instanceof Ref ? rawAsset : null, + assetDict: asset, + filename, + contentType + }; + } + } + return null; + } +} +class ScreenAnnotation extends MediaAnnotation { + constructor(params) { + super(params); + const { + dict, + xref, + annotationGlobals + } = params; + const asset = ScreenAnnotation.#findAsset(dict, xref); + if (!asset) { + return; + } + this._setMediaData(asset, annotationGlobals); + } + static #findAsset(dict, xref) { + for (const action of this.#renditionActions(dict)) { + const asset = this.#findRenditionAsset(action.get("R"), xref, new RefSet()); + if (asset) { + return asset; + } + } + return null; + } + static *#renditionActions(dict) { + const action = dict.get("A"); + if (action instanceof Dict && isName(action.get("S"), "Rendition") && this.#isPlayAction(action)) { + yield action; + } + const additionalActions = dict.get("AA"); + if (additionalActions instanceof Dict) { + for (const [, aa] of additionalActions) { + if (aa instanceof Dict && isName(aa.get("S"), "Rendition") && this.#isPlayAction(aa)) { + yield aa; + } + } + } + } + static #isPlayAction(action) { + const operation = action.get("OP"); + return operation === undefined || operation === AnnotationRenditionOperation.PLAY_OR_RESUME || operation === AnnotationRenditionOperation.PLAY; + } + static #findRenditionAsset(rendition, xref, seen) { + if (!(rendition instanceof Dict)) { + return null; + } + const subtype = rendition.get("S"); + if (isName(subtype, "MR")) { + return this.#findClipAsset(rendition.get("C"), xref); + } + if (isName(subtype, "SR")) { + const renditions = rendition.get("R"); + if (Array.isArray(renditions)) { + for (const ref of renditions) { + if (ref instanceof Ref) { + if (seen.has(ref)) { + continue; + } + seen.put(ref); + } + const asset = this.#findRenditionAsset(xref.fetchIfRef(ref), xref, seen); + if (asset) { + return asset; + } + } + } + } + return null; + } + static #findClipAsset(clip, xref) { + if (!(clip instanceof Dict) || !isName(clip.get("S"), "MCD")) { + return null; + } + const rawData = clip.getRaw("D"); + const data = xref.fetchIfRef(rawData); + const contentTypeHint = clip.get("CT"); + let explicitType = typeof contentTypeHint === "string" ? contentTypeHint : null; + let assetDict, filename; + if (data instanceof BaseStream) { + assetDict = data.dict; + const name = clip.get("N"); + filename = typeof name === "string" ? stringToPDFString(name) : ""; + if (!explicitType) { + const subtype = data.dict.get("Subtype"); + if (subtype instanceof Name) { + explicitType = subtype.name; + } + } + } else if (data instanceof Dict) { + if (!FileSpec.hasEmbeddedFile(data)) { + return null; + } + assetDict = data; + ({ + filename + } = new FileSpec(data).serializable); + } else { + return null; + } + const contentType = MediaAnnotation._getContentType(assetDict, filename, explicitType); + if (!contentType) { + return null; + } + return { + assetRef: rawData instanceof Ref ? rawData : null, + assetDict, + filename, + contentType + }; + } +} + +;// ./src/core/calculate_md5.js + +const PARAMS = { + get r() { + return shadow(this, "r", new Uint8Array([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21])); + }, + get k() { + return shadow(this, "k", new Int32Array([-680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, -145523070, -1120210379, 718787259, -343485551])); + } +}; +function calculateMD5(data, offset, length) { + let h0 = 1732584193, + h1 = -271733879, + h2 = -1732584194, + h3 = 271733878; + const paddedLength = length + 72 & ~63; + const padded = new Uint8Array(paddedLength); + let i, j; + for (i = 0; i < length; ++i) { + padded[i] = data[offset++]; + } + padded[i++] = 0x80; + const n = paddedLength - 8; + if (i < n) { + i = n; + } + padded[i++] = length << 3 & 0xff; + padded[i++] = length >> 5 & 0xff; + padded[i++] = length >> 13 & 0xff; + padded[i++] = length >> 21 & 0xff; + padded[i++] = length >>> 29 & 0xff; + i += 3; + const w = new Int32Array(16); + const { + k, + r + } = PARAMS; + for (i = 0; i < paddedLength;) { + for (j = 0; j < 16; ++j, i += 4) { + w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24; + } + let a = h0, + b = h1, + c = h2, + d = h3, + f, + g; + for (j = 0; j < 64; ++j) { + if (j < 16) { + f = b & c | ~b & d; + g = j; + } else if (j < 32) { + f = d & b | ~d & c; + g = 5 * j + 1 & 15; + } else if (j < 48) { + f = b ^ c ^ d; + g = 3 * j + 5 & 15; + } else { + f = c ^ (b | ~d); + g = 7 * j & 15; + } + const tmp = d, + rotateArg = a + f + k[j] + w[g] | 0, + rotate = r[j]; + d = c; + c = b; + b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0; + a = tmp; + } + h0 = h0 + a | 0; + h1 = h1 + b | 0; + h2 = h2 + c | 0; + h3 = h3 + d | 0; + } + return new Uint8Array([h0 & 0xFF, h0 >> 8 & 0xFF, h0 >> 16 & 0xFF, h0 >>> 24 & 0xFF, h1 & 0xFF, h1 >> 8 & 0xFF, h1 >> 16 & 0xFF, h1 >>> 24 & 0xFF, h2 & 0xFF, h2 >> 8 & 0xFF, h2 >> 16 & 0xFF, h2 >>> 24 & 0xFF, h3 & 0xFF, h3 >> 8 & 0xFF, h3 >> 16 & 0xFF, h3 >>> 24 & 0xFF]); +} -;// CONCATENATED MODULE: ./src/core/dataset_reader.js +;// ./src/core/dataset_reader.js @@ -53947,10 +56568,7 @@ } } class DatasetXMLParser extends SimpleXMLParser { - constructor(options) { - super(options); - this.node = null; - } + node = null; onEndElement(name) { const node = super.onEndElement(name); if (node && name === "xfa:datasets") { @@ -53991,7 +56609,1370 @@ } } -;// CONCATENATED MODULE: ./src/core/xref.js +;// ./src/core/intersector.js +class SingleIntersector { + #annotation; + minX = Infinity; + minY = Infinity; + maxX = -Infinity; + maxY = -Infinity; + #quadPoints = null; + #text = []; + #extraChars = []; + #lastIntersectingQuadIndex = -1; + #canTakeExtraChars = false; + constructor(annotation) { + this.#annotation = annotation; + const quadPoints = annotation.data.quadPoints; + if (!quadPoints) { + [this.minX, this.minY, this.maxX, this.maxY] = annotation.data.rect; + return; + } + for (let i = 0, ii = quadPoints.length; i < ii; i += 8) { + this.minX = Math.min(this.minX, quadPoints[i]); + this.maxX = Math.max(this.maxX, quadPoints[i + 2]); + this.minY = Math.min(this.minY, quadPoints[i + 5]); + this.maxY = Math.max(this.maxY, quadPoints[i + 1]); + } + if (quadPoints.length > 8) { + this.#quadPoints = quadPoints; + } + } + #intersects(x, y) { + if (this.minX >= x || this.maxX <= x || this.minY >= y || this.maxY <= y) { + return false; + } + const quadPoints = this.#quadPoints; + if (!quadPoints) { + return true; + } + if (this.#lastIntersectingQuadIndex >= 0) { + const i = this.#lastIntersectingQuadIndex; + if (!(quadPoints[i] >= x || quadPoints[i + 2] <= x || quadPoints[i + 5] >= y || quadPoints[i + 1] <= y)) { + return true; + } + this.#lastIntersectingQuadIndex = -1; + } + for (let i = 0, ii = quadPoints.length; i < ii; i += 8) { + if (!(quadPoints[i] >= x || quadPoints[i + 2] <= x || quadPoints[i + 5] >= y || quadPoints[i + 1] <= y)) { + this.#lastIntersectingQuadIndex = i; + return true; + } + } + return false; + } + addGlyph(x, y, glyph) { + if (!this.#intersects(x, y)) { + this.disableExtraChars(); + return false; + } + if (this.#extraChars.length > 0) { + this.#text.push(this.#extraChars.join("")); + this.#extraChars.length = 0; + } + this.#text.push(glyph); + this.#canTakeExtraChars = true; + return true; + } + addExtraChar(char) { + if (this.#canTakeExtraChars) { + this.#extraChars.push(char); + } + } + disableExtraChars() { + if (!this.#canTakeExtraChars) { + return; + } + this.#canTakeExtraChars = false; + this.#extraChars.length = 0; + } + setText() { + this.#annotation.data.overlaidText = this.#text.join(""); + } +} +const STEPS = 64; +class Intersector { + #intersectors = []; + #grid = []; + #minX; + #maxX; + #minY; + #maxY; + #invXRatio; + #invYRatio; + constructor(annotations) { + let minX = Infinity; + let minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; + const intersectors = this.#intersectors; + for (const annotation of annotations) { + if (!annotation.data.quadPoints && !annotation.data.rect) { + continue; + } + const intersector = new SingleIntersector(annotation); + intersectors.push(intersector); + minX = Math.min(minX, intersector.minX); + minY = Math.min(minY, intersector.minY); + maxX = Math.max(maxX, intersector.maxX); + maxY = Math.max(maxY, intersector.maxY); + } + this.#minX = minX; + this.#minY = minY; + this.#maxX = maxX; + this.#maxY = maxY; + this.#invXRatio = (STEPS - 1) / (maxX - minX); + this.#invYRatio = (STEPS - 1) / (maxY - minY); + for (const intersector of intersectors) { + const iMin = this.#getGridIndex(intersector.minX, intersector.minY); + const iMax = this.#getGridIndex(intersector.maxX, intersector.maxY); + const w = (iMax - iMin) % STEPS; + const h = Math.floor((iMax - iMin) / STEPS); + for (let i = iMin; i <= iMin + h * STEPS; i += STEPS) { + for (let j = 0; j <= w; j++) { + (this.#grid[i + j] ??= []).push(intersector); + } + } + } + } + #getGridIndex(x, y) { + const i = Math.floor((x - this.#minX) * this.#invXRatio); + const j = Math.floor((y - this.#minY) * this.#invYRatio); + return i + j * STEPS; + } + addGlyph(transform, width, height, glyph) { + const x = transform[4] + width / 2; + const y = transform[5] + height / 2; + if (x < this.#minX || y < this.#minY || x > this.#maxX || y > this.#maxY) { + return; + } + const intersectors = this.#grid[this.#getGridIndex(x, y)]; + if (!intersectors) { + return; + } + for (const intersector of intersectors) { + intersector.addGlyph(x, y, glyph); + } + } + addExtraChar(char) { + for (const intersector of this.#intersectors) { + intersector.addExtraChar(char); + } + } + setText() { + for (const intersector of this.#intersectors) { + intersector.setText(); + } + } +} + +;// ./src/core/calculate_sha_other.js + +class Word64 { + constructor(highInteger, lowInteger) { + this.high = highInteger | 0; + this.low = lowInteger | 0; + } + and(word) { + this.high &= word.high; + this.low &= word.low; + } + xor(word) { + this.high ^= word.high; + this.low ^= word.low; + } + shiftRight(places) { + if (places >= 32) { + this.low = this.high >>> places - 32 | 0; + this.high = 0; + } else { + this.low = this.low >>> places | this.high << 32 - places; + this.high = this.high >>> places | 0; + } + } + rotateRight(places) { + let low, high; + if (places & 32) { + high = this.low; + low = this.high; + } else { + low = this.low; + high = this.high; + } + places &= 31; + this.low = low >>> places | high << 32 - places; + this.high = high >>> places | low << 32 - places; + } + not() { + this.high = ~this.high; + this.low = ~this.low; + } + add(word) { + const lowAdd = (this.low >>> 0) + (word.low >>> 0); + let highAdd = (this.high >>> 0) + (word.high >>> 0); + if (lowAdd > 0xffffffff) { + highAdd += 1; + } + this.low = lowAdd | 0; + this.high = highAdd | 0; + } + copyTo(bytes, offset) { + bytes[offset] = this.high >>> 24 & 0xff; + bytes[offset + 1] = this.high >> 16 & 0xff; + bytes[offset + 2] = this.high >> 8 & 0xff; + bytes[offset + 3] = this.high & 0xff; + bytes[offset + 4] = this.low >>> 24 & 0xff; + bytes[offset + 5] = this.low >> 16 & 0xff; + bytes[offset + 6] = this.low >> 8 & 0xff; + bytes[offset + 7] = this.low & 0xff; + } + assign(word) { + this.high = word.high; + this.low = word.low; + } +} +const calculate_sha_other_PARAMS = { + get k() { + return shadow(this, "k", [new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019), new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe), new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2), new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694), new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3), new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5), new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4), new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926), new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b), new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910), new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8), new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3), new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9), new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178), new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493), new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)]); + } +}; +function ch(result, x, y, z, tmp) { + result.assign(x); + result.and(y); + tmp.assign(x); + tmp.not(); + tmp.and(z); + result.xor(tmp); +} +function maj(result, x, y, z, tmp) { + result.assign(x); + result.and(y); + tmp.assign(x); + tmp.and(z); + result.xor(tmp); + tmp.assign(y); + tmp.and(z); + result.xor(tmp); +} +function sigma(result, x, tmp) { + result.assign(x); + result.rotateRight(28); + tmp.assign(x); + tmp.rotateRight(34); + result.xor(tmp); + tmp.assign(x); + tmp.rotateRight(39); + result.xor(tmp); +} +function sigmaPrime(result, x, tmp) { + result.assign(x); + result.rotateRight(14); + tmp.assign(x); + tmp.rotateRight(18); + result.xor(tmp); + tmp.assign(x); + tmp.rotateRight(41); + result.xor(tmp); +} +function littleSigma(result, x, tmp) { + result.assign(x); + result.rotateRight(1); + tmp.assign(x); + tmp.rotateRight(8); + result.xor(tmp); + tmp.assign(x); + tmp.shiftRight(7); + result.xor(tmp); +} +function littleSigmaPrime(result, x, tmp) { + result.assign(x); + result.rotateRight(19); + tmp.assign(x); + tmp.rotateRight(61); + result.xor(tmp); + tmp.assign(x); + tmp.shiftRight(6); + result.xor(tmp); +} +function calculateSHA512(data, offset, length, mode384 = false) { + let h0, h1, h2, h3, h4, h5, h6, h7; + if (!mode384) { + h0 = new Word64(0x6a09e667, 0xf3bcc908); + h1 = new Word64(0xbb67ae85, 0x84caa73b); + h2 = new Word64(0x3c6ef372, 0xfe94f82b); + h3 = new Word64(0xa54ff53a, 0x5f1d36f1); + h4 = new Word64(0x510e527f, 0xade682d1); + h5 = new Word64(0x9b05688c, 0x2b3e6c1f); + h6 = new Word64(0x1f83d9ab, 0xfb41bd6b); + h7 = new Word64(0x5be0cd19, 0x137e2179); + } else { + h0 = new Word64(0xcbbb9d5d, 0xc1059ed8); + h1 = new Word64(0x629a292a, 0x367cd507); + h2 = new Word64(0x9159015a, 0x3070dd17); + h3 = new Word64(0x152fecd8, 0xf70e5939); + h4 = new Word64(0x67332667, 0xffc00b31); + h5 = new Word64(0x8eb44a87, 0x68581511); + h6 = new Word64(0xdb0c2e0d, 0x64f98fa7); + h7 = new Word64(0x47b5481d, 0xbefa4fa4); + } + const paddedLength = Math.ceil((length + 17) / 128) * 128; + const padded = new Uint8Array(paddedLength); + let i, j; + for (i = 0; i < length; ++i) { + padded[i] = data[offset++]; + } + padded[i++] = 0x80; + const n = paddedLength - 16; + if (i < n) { + i = n; + } + i += 11; + padded[i++] = length >>> 29 & 0xff; + padded[i++] = length >> 21 & 0xff; + padded[i++] = length >> 13 & 0xff; + padded[i++] = length >> 5 & 0xff; + padded[i++] = length << 3 & 0xff; + const w = new Array(80); + for (i = 0; i < 80; i++) { + w[i] = new Word64(0, 0); + } + const { + k + } = calculate_sha_other_PARAMS; + let a = new Word64(0, 0), + b = new Word64(0, 0), + c = new Word64(0, 0); + let d = new Word64(0, 0), + e = new Word64(0, 0), + f = new Word64(0, 0); + let g = new Word64(0, 0), + h = new Word64(0, 0); + const t1 = new Word64(0, 0), + t2 = new Word64(0, 0); + const tmp1 = new Word64(0, 0), + tmp2 = new Word64(0, 0); + let tmp3; + for (i = 0; i < paddedLength;) { + for (j = 0; j < 16; ++j) { + w[j].high = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3]; + w[j].low = padded[i + 4] << 24 | padded[i + 5] << 16 | padded[i + 6] << 8 | padded[i + 7]; + i += 8; + } + for (j = 16; j < 80; ++j) { + tmp3 = w[j]; + littleSigmaPrime(tmp3, w[j - 2], tmp2); + tmp3.add(w[j - 7]); + littleSigma(tmp1, w[j - 15], tmp2); + tmp3.add(tmp1); + tmp3.add(w[j - 16]); + } + a.assign(h0); + b.assign(h1); + c.assign(h2); + d.assign(h3); + e.assign(h4); + f.assign(h5); + g.assign(h6); + h.assign(h7); + for (j = 0; j < 80; ++j) { + t1.assign(h); + sigmaPrime(tmp1, e, tmp2); + t1.add(tmp1); + ch(tmp1, e, f, g, tmp2); + t1.add(tmp1); + t1.add(k[j]); + t1.add(w[j]); + sigma(t2, a, tmp2); + maj(tmp1, a, b, c, tmp2); + t2.add(tmp1); + tmp3 = h; + h = g; + g = f; + f = e; + d.add(t1); + e = d; + d = c; + c = b; + b = a; + tmp3.assign(t1); + tmp3.add(t2); + a = tmp3; + } + h0.add(a); + h1.add(b); + h2.add(c); + h3.add(d); + h4.add(e); + h5.add(f); + h6.add(g); + h7.add(h); + } + let result; + if (!mode384) { + result = new Uint8Array(64); + h0.copyTo(result, 0); + h1.copyTo(result, 8); + h2.copyTo(result, 16); + h3.copyTo(result, 24); + h4.copyTo(result, 32); + h5.copyTo(result, 40); + h6.copyTo(result, 48); + h7.copyTo(result, 56); + } else { + result = new Uint8Array(48); + h0.copyTo(result, 0); + h1.copyTo(result, 8); + h2.copyTo(result, 16); + h3.copyTo(result, 24); + h4.copyTo(result, 32); + h5.copyTo(result, 40); + } + return result; +} +function calculateSHA384(data, offset, length) { + return calculateSHA512(data, offset, length, true); +} + +;// ./src/core/calculate_sha256.js + +const calculate_sha256_PARAMS = { + get k() { + return shadow(this, "k", [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]); + } +}; +function rotr(x, n) { + return x >>> n | x << 32 - n; +} +function calculate_sha256_ch(x, y, z) { + return x & y ^ ~x & z; +} +function calculate_sha256_maj(x, y, z) { + return x & y ^ x & z ^ y & z; +} +function calculate_sha256_sigma(x) { + return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22); +} +function calculate_sha256_sigmaPrime(x) { + return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25); +} +function calculate_sha256_littleSigma(x) { + return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3; +} +function calculate_sha256_littleSigmaPrime(x) { + return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10; +} +function calculateSHA256(data, offset, length) { + let h0 = 0x6a09e667, + h1 = 0xbb67ae85, + h2 = 0x3c6ef372, + h3 = 0xa54ff53a, + h4 = 0x510e527f, + h5 = 0x9b05688c, + h6 = 0x1f83d9ab, + h7 = 0x5be0cd19; + const paddedLength = Math.ceil((length + 9) / 64) * 64; + const padded = new Uint8Array(paddedLength); + let i, j; + for (i = 0; i < length; ++i) { + padded[i] = data[offset++]; + } + padded[i++] = 0x80; + const n = paddedLength - 8; + if (i < n) { + i = n; + } + i += 3; + padded[i++] = length >>> 29 & 0xff; + padded[i++] = length >> 21 & 0xff; + padded[i++] = length >> 13 & 0xff; + padded[i++] = length >> 5 & 0xff; + padded[i++] = length << 3 & 0xff; + const w = new Uint32Array(64); + const { + k + } = calculate_sha256_PARAMS; + for (i = 0; i < paddedLength;) { + for (j = 0; j < 16; ++j) { + w[j] = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3]; + i += 4; + } + for (j = 16; j < 64; ++j) { + w[j] = calculate_sha256_littleSigmaPrime(w[j - 2]) + w[j - 7] + calculate_sha256_littleSigma(w[j - 15]) + w[j - 16] | 0; + } + let a = h0, + b = h1, + c = h2, + d = h3, + e = h4, + f = h5, + g = h6, + h = h7, + t1, + t2; + for (j = 0; j < 64; ++j) { + t1 = h + calculate_sha256_sigmaPrime(e) + calculate_sha256_ch(e, f, g) + k[j] + w[j]; + t2 = calculate_sha256_sigma(a) + calculate_sha256_maj(a, b, c); + h = g; + g = f; + f = e; + e = d + t1 | 0; + d = c; + c = b; + b = a; + a = t1 + t2 | 0; + } + h0 = h0 + a | 0; + h1 = h1 + b | 0; + h2 = h2 + c | 0; + h3 = h3 + d | 0; + h4 = h4 + e | 0; + h5 = h5 + f | 0; + h6 = h6 + g | 0; + h7 = h7 + h | 0; + } + return new Uint8Array([h0 >> 24 & 0xFF, h0 >> 16 & 0xFF, h0 >> 8 & 0xFF, h0 & 0xFF, h1 >> 24 & 0xFF, h1 >> 16 & 0xFF, h1 >> 8 & 0xFF, h1 & 0xFF, h2 >> 24 & 0xFF, h2 >> 16 & 0xFF, h2 >> 8 & 0xFF, h2 & 0xFF, h3 >> 24 & 0xFF, h3 >> 16 & 0xFF, h3 >> 8 & 0xFF, h3 & 0xFF, h4 >> 24 & 0xFF, h4 >> 16 & 0xFF, h4 >> 8 & 0xFF, h4 & 0xFF, h5 >> 24 & 0xFF, h5 >> 16 & 0xFF, h5 >> 8 & 0xFF, h5 & 0xFF, h6 >> 24 & 0xFF, h6 >> 16 & 0xFF, h6 >> 8 & 0xFF, h6 & 0xFF, h7 >> 24 & 0xFF, h7 >> 16 & 0xFF, h7 >> 8 & 0xFF, h7 & 0xFF]); +} + +;// ./src/core/decrypt_stream.js + +const chunkSize = 512; +class DecryptStream extends DecodeStream { + #nextChunk = null; + constructor(str, maybeLength, decrypt) { + super(maybeLength); + this.stream = str; + this.dict = str.dict; + this.decrypt = decrypt; + } + readBlock() { + let chunk = this.#nextChunk ?? this.stream.getBytes(chunkSize); + if (!chunk?.length) { + this.eof = true; + return; + } + this.#nextChunk = this.stream.getBytes(chunkSize); + const hasMoreData = this.#nextChunk?.length > 0; + const decrypt = this.decrypt; + chunk = decrypt(chunk, !hasMoreData); + const bufferLength = this.bufferLength, + newLength = bufferLength + chunk.length, + buffer = this.ensureBuffer(newLength); + buffer.set(chunk, bufferLength); + this.bufferLength = newLength; + } + getOriginalStream() { + return this; + } +} + +;// ./src/core/crypto.js + + + + + + +class ARCFourCipher { + a = 0; + b = 0; + constructor(key) { + const s = new Uint8Array(256); + const keyLength = key.length; + for (let i = 0; i < 256; ++i) { + s[i] = i; + } + for (let i = 0, j = 0; i < 256; ++i) { + const tmp = s[i]; + j = j + tmp + key[i % keyLength] & 0xff; + s[i] = s[j]; + s[j] = tmp; + } + this.s = s; + } + encryptBlock(data) { + let a = this.a, + b = this.b; + const s = this.s; + const n = data.length; + const output = new Uint8Array(n); + for (let i = 0; i < n; ++i) { + a = a + 1 & 0xff; + const tmp = s[a]; + b = b + tmp & 0xff; + const tmp2 = s[b]; + s[a] = tmp2; + s[b] = tmp; + output[i] = data[i] ^ s[tmp + tmp2 & 0xff]; + } + this.a = a; + this.b = b; + return output; + } + decryptBlock(data) { + return this.encryptBlock(data); + } + encrypt(data) { + return this.encryptBlock(data); + } +} +class NullCipher { + decryptBlock(data) { + return data; + } + encrypt(data) { + return data; + } +} +class AESBaseCipher { + _s = new Uint8Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]); + _inv_s = new Uint8Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]); + _mix = new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]); + _mixCol = new Uint8Array(256).map((_, i) => i < 128 ? i << 1 : i << 1 ^ 0x1b); + constructor() { + this.buffer = new Uint8Array(16); + this.bufferPosition = 0; + } + _expandKey(cipherKey) { + unreachable("Cannot call `_expandKey` on the base class"); + } + _decrypt(input, key) { + let t, u, v; + const state = new Uint8Array(16); + state.set(input); + for (let j = 0, k = this._keySize; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + for (let i = this._cyclesOfRepetition - 1; i >= 1; --i) { + t = state[13]; + state[13] = state[9]; + state[9] = state[5]; + state[5] = state[1]; + state[1] = t; + t = state[14]; + u = state[10]; + state[14] = state[6]; + state[10] = state[2]; + state[6] = t; + state[2] = u; + t = state[15]; + u = state[11]; + v = state[7]; + state[15] = state[3]; + state[11] = t; + state[7] = u; + state[3] = v; + for (let j = 0; j < 16; ++j) { + state[j] = this._inv_s[state[j]]; + } + for (let j = 0, k = i * 16; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + for (let j = 0; j < 16; j += 4) { + const s0 = this._mix[state[j]]; + const s1 = this._mix[state[j + 1]]; + const s2 = this._mix[state[j + 2]]; + const s3 = this._mix[state[j + 3]]; + t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8; + state[j] = t >>> 24 & 0xff; + state[j + 1] = t >> 16 & 0xff; + state[j + 2] = t >> 8 & 0xff; + state[j + 3] = t & 0xff; + } + } + t = state[13]; + state[13] = state[9]; + state[9] = state[5]; + state[5] = state[1]; + state[1] = t; + t = state[14]; + u = state[10]; + state[14] = state[6]; + state[10] = state[2]; + state[6] = t; + state[2] = u; + t = state[15]; + u = state[11]; + v = state[7]; + state[15] = state[3]; + state[11] = t; + state[7] = u; + state[3] = v; + for (let j = 0; j < 16; ++j) { + state[j] = this._inv_s[state[j]]; + state[j] ^= key[j]; + } + return state; + } + _encrypt(input, key) { + const s = this._s; + let t, u, v; + const state = new Uint8Array(16); + state.set(input); + for (let j = 0; j < 16; ++j) { + state[j] ^= key[j]; + } + for (let i = 1; i < this._cyclesOfRepetition; i++) { + for (let j = 0; j < 16; ++j) { + state[j] = s[state[j]]; + } + v = state[1]; + state[1] = state[5]; + state[5] = state[9]; + state[9] = state[13]; + state[13] = v; + v = state[2]; + u = state[6]; + state[2] = state[10]; + state[6] = state[14]; + state[10] = v; + state[14] = u; + v = state[3]; + u = state[7]; + t = state[11]; + state[3] = state[15]; + state[7] = v; + state[11] = u; + state[15] = t; + for (let j = 0; j < 16; j += 4) { + const s0 = state[j]; + const s1 = state[j + 1]; + const s2 = state[j + 2]; + const s3 = state[j + 3]; + t = s0 ^ s1 ^ s2 ^ s3; + state[j] ^= t ^ this._mixCol[s0 ^ s1]; + state[j + 1] ^= t ^ this._mixCol[s1 ^ s2]; + state[j + 2] ^= t ^ this._mixCol[s2 ^ s3]; + state[j + 3] ^= t ^ this._mixCol[s3 ^ s0]; + } + for (let j = 0, k = i * 16; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + } + for (let j = 0; j < 16; ++j) { + state[j] = s[state[j]]; + } + v = state[1]; + state[1] = state[5]; + state[5] = state[9]; + state[9] = state[13]; + state[13] = v; + v = state[2]; + u = state[6]; + state[2] = state[10]; + state[6] = state[14]; + state[10] = v; + state[14] = u; + v = state[3]; + u = state[7]; + t = state[11]; + state[3] = state[15]; + state[7] = v; + state[11] = u; + state[15] = t; + for (let j = 0, k = this._keySize; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + return state; + } + _decryptBlock2(data, finalize) { + const sourceLength = data.length; + let buffer = this.buffer, + bufferLength = this.bufferPosition; + const result = []; + let iv = this.iv; + for (let i = 0; i < sourceLength; ++i) { + buffer[bufferLength] = data[i]; + ++bufferLength; + if (bufferLength < 16) { + continue; + } + const plain = this._decrypt(buffer, this._key); + for (let j = 0; j < 16; ++j) { + plain[j] ^= iv[j]; + } + iv = buffer; + result.push(plain); + buffer = new Uint8Array(16); + bufferLength = 0; + } + this.buffer = buffer; + this.bufferLength = bufferLength; + this.iv = iv; + if (result.length === 0) { + return new Uint8Array(0); + } + let outputLength = 16 * result.length; + if (finalize) { + const lastBlock = result.at(-1); + let psLen = lastBlock[15]; + if (psLen <= 16) { + for (let i = 15, ii = 16 - psLen; i >= ii; --i) { + if (lastBlock[i] !== psLen) { + psLen = 0; + break; + } + } + outputLength -= psLen; + result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); + } + } + const output = new Uint8Array(outputLength); + for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { + output.set(result[i], j); + } + return output; + } + decryptBlock(data, finalize, iv = null) { + const sourceLength = data.length; + const buffer = this.buffer; + let bufferLength = this.bufferPosition; + if (iv) { + this.iv = iv; + } else { + for (let i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) { + buffer[bufferLength] = data[i]; + } + if (bufferLength < 16) { + this.bufferLength = bufferLength; + return new Uint8Array(0); + } + this.iv = buffer; + data = data.subarray(16); + } + this.buffer = new Uint8Array(16); + this.bufferLength = 0; + this.decryptBlock = this._decryptBlock2; + return this.decryptBlock(data, finalize); + } + encrypt(data, iv) { + const sourceLength = data.length; + let buffer = this.buffer, + bufferLength = this.bufferPosition; + const result = []; + iv ||= new Uint8Array(16); + for (let i = 0; i < sourceLength; ++i) { + buffer[bufferLength] = data[i]; + ++bufferLength; + if (bufferLength < 16) { + continue; + } + for (let j = 0; j < 16; ++j) { + buffer[j] ^= iv[j]; + } + const cipher = this._encrypt(buffer, this._key); + iv = cipher; + result.push(cipher); + buffer = new Uint8Array(16); + bufferLength = 0; + } + this.buffer = buffer; + this.bufferLength = bufferLength; + this.iv = iv; + if (result.length === 0) { + return new Uint8Array(0); + } + const outputLength = 16 * result.length; + const output = new Uint8Array(outputLength); + for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { + output.set(result[i], j); + } + return output; + } +} +class AES128Cipher extends AESBaseCipher { + _rcon = new Uint8Array([0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]); + constructor(key) { + super(); + this._cyclesOfRepetition = 10; + this._keySize = 160; + this._key = this._expandKey(key); + } + _expandKey(cipherKey) { + const b = 176; + const s = this._s; + const rcon = this._rcon; + const result = new Uint8Array(b); + result.set(cipherKey); + for (let j = 16, i = 1; j < b; ++i) { + let t1 = result[j - 3]; + let t2 = result[j - 2]; + let t3 = result[j - 1]; + let t4 = result[j - 4]; + t1 = s[t1]; + t2 = s[t2]; + t3 = s[t3]; + t4 = s[t4]; + t1 ^= rcon[i]; + for (let n = 0; n < 4; ++n) { + result[j] = t1 ^= result[j - 16]; + j++; + result[j] = t2 ^= result[j - 16]; + j++; + result[j] = t3 ^= result[j - 16]; + j++; + result[j] = t4 ^= result[j - 16]; + j++; + } + } + return result; + } +} +class AES256Cipher extends AESBaseCipher { + constructor(key) { + super(); + this._cyclesOfRepetition = 14; + this._keySize = 224; + this._key = this._expandKey(key); + } + _expandKey(cipherKey) { + const b = 240; + const s = this._s; + const result = new Uint8Array(b); + result.set(cipherKey); + let r = 1; + let t1, t2, t3, t4; + for (let j = 32, i = 1; j < b; ++i) { + if (j % 32 === 16) { + t1 = s[t1]; + t2 = s[t2]; + t3 = s[t3]; + t4 = s[t4]; + } else if (j % 32 === 0) { + t1 = result[j - 3]; + t2 = result[j - 2]; + t3 = result[j - 1]; + t4 = result[j - 4]; + t1 = s[t1]; + t2 = s[t2]; + t3 = s[t3]; + t4 = s[t4]; + t1 ^= r; + if ((r <<= 1) >= 256) { + r = (r ^ 0x1b) & 0xff; + } + } + for (let n = 0; n < 4; ++n) { + result[j] = t1 ^= result[j - 32]; + j++; + result[j] = t2 ^= result[j - 32]; + j++; + result[j] = t3 ^= result[j - 32]; + j++; + result[j] = t4 ^= result[j - 32]; + j++; + } + } + return result; + } +} +class PDFBase { + _hash(password, input, userBytes) { + unreachable("Abstract method `_hash` called"); + } + checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) { + const hashData = new Uint8Array(password.length + 56); + hashData.set(password, 0); + hashData.set(ownerValidationSalt, password.length); + hashData.set(userBytes, password.length + ownerValidationSalt.length); + const result = this._hash(password, hashData, userBytes); + return isArrayEqual(result, ownerPassword); + } + checkUserPassword(password, userValidationSalt, userPassword) { + const hashData = new Uint8Array(password.length + 8); + hashData.set(password, 0); + hashData.set(userValidationSalt, password.length); + const result = this._hash(password, hashData, []); + return isArrayEqual(result, userPassword); + } + getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) { + const hashData = new Uint8Array(password.length + 56); + hashData.set(password, 0); + hashData.set(ownerKeySalt, password.length); + hashData.set(userBytes, password.length + ownerKeySalt.length); + const key = this._hash(password, hashData, userBytes); + const cipher = new AES256Cipher(key); + return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16)); + } + getUserKey(password, userKeySalt, userEncryption) { + const hashData = new Uint8Array(password.length + 8); + hashData.set(password, 0); + hashData.set(userKeySalt, password.length); + const key = this._hash(password, hashData, []); + const cipher = new AES256Cipher(key); + return cipher.decryptBlock(userEncryption, false, new Uint8Array(16)); + } +} +class PDF17 extends PDFBase { + _hash(password, input, userBytes) { + return calculateSHA256(input, 0, input.length); + } +} +class PDF20 extends PDFBase { + _hash(password, input, userBytes) { + let k = calculateSHA256(input, 0, input.length).subarray(0, 32); + let e = [0]; + let i = 0; + while (i < 64 || e.at(-1) > i - 32) { + const combinedLength = password.length + k.length + userBytes.length, + combinedArray = new Uint8Array(combinedLength); + let writeOffset = 0; + combinedArray.set(password, writeOffset); + writeOffset += password.length; + combinedArray.set(k, writeOffset); + writeOffset += k.length; + combinedArray.set(userBytes, writeOffset); + const k1 = new Uint8Array(combinedLength * 64); + for (let j = 0, pos = 0; j < 64; j++, pos += combinedLength) { + k1.set(combinedArray, pos); + } + const cipher = new AES128Cipher(k.subarray(0, 16)); + e = cipher.encrypt(k1, k.subarray(16, 32)); + const remainder = Math.sumPrecise(e.slice(0, 16)) % 3; + if (remainder === 0) { + k = calculateSHA256(e, 0, e.length); + } else if (remainder === 1) { + k = calculateSHA384(e, 0, e.length); + } else if (remainder === 2) { + k = calculateSHA512(e, 0, e.length); + } + i++; + } + return k.subarray(0, 32); + } +} +class CipherTransform { + #cipherCache = new Map(); + embeddedFilterName = null; + constructor(resolveCipher, stringFilterName = null, streamFilterName = null) { + this.resolveCipher = resolveCipher; + this.streamFilterName = streamFilterName; + this.stringFilterName = stringFilterName; + } + #getCipher(filterName = null) { + const key = filterName instanceof Name ? filterName.name : "__default__"; + return this.#cipherCache.getOrInsertComputed(key, () => this.resolveCipher(filterName)); + } + createStream(stream, length, cryptFilterName = null) { + const defaultFilterName = this.embeddedFilterName && isDict(stream.dict, "EmbeddedFile") ? this.embeddedFilterName : this.streamFilterName; + const Cipher = this.#getCipher(cryptFilterName || defaultFilterName); + const cipher = new Cipher(); + return new DecryptStream(stream, length, function cipherTransformDecryptStream(data, finalize) { + return cipher.decryptBlock(data, finalize); + }); + } + decryptString(s) { + const Cipher = this.#getCipher(this.stringFilterName); + const cipher = new Cipher(); + let data = stringToBytes(s); + data = cipher.decryptBlock(data, true); + return bytesToString(data); + } + encryptString(s) { + const Cipher = this.#getCipher(this.stringFilterName); + const cipher = new Cipher(); + if (cipher instanceof AESBaseCipher) { + const strLen = s.length; + const pad = 16 - strLen % 16; + s += String.fromCharCode(pad).repeat(pad); + const iv = new Uint8Array(16); + crypto.getRandomValues(iv); + let data = stringToBytes(s); + data = cipher.encrypt(data, iv); + const buf = new Uint8Array(16 + data.length); + buf.set(iv); + buf.set(data, 16); + return bytesToString(buf); + } + let data = stringToBytes(s); + data = cipher.encrypt(data); + return bytesToString(data); + } +} +class CipherTransformFactory { + #fileId; + static get _defaultPasswordBytes() { + return shadow(this, "_defaultPasswordBytes", new Uint8Array([0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a])); + } + #createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) { + if (password) { + const passwordLength = Math.min(127, password.length); + password = password.subarray(0, passwordLength); + } else { + password = []; + } + const pdfAlgorithm = revision === 6 ? new PDF20() : new PDF17(); + if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)) { + return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption); + } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt, uBytes, ownerPassword)) { + return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, ownerEncryption); + } + return null; + } + #prepareKeyData(fileId, password, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata) { + const hashDataSize = 40 + ownerPassword.length + fileId.length; + const hashData = new Uint8Array(hashDataSize); + let i = 0, + j, + n; + if (password) { + n = Math.min(32, password.length); + for (; i < n; ++i) { + hashData[i] = password[i]; + } + } + j = 0; + while (i < 32) { + hashData[i++] = CipherTransformFactory._defaultPasswordBytes[j++]; + } + hashData.set(ownerPassword, i); + i += ownerPassword.length; + hashData[i++] = flags & 0xff; + hashData[i++] = flags >> 8 & 0xff; + hashData[i++] = flags >> 16 & 0xff; + hashData[i++] = flags >>> 24 & 0xff; + hashData.set(fileId, i); + i += fileId.length; + if (revision >= 4 && !encryptMetadata) { + hashData.fill(0xff, i, i + 4); + i += 4; + } + let hash = calculateMD5(hashData, 0, i); + const keyLengthInBytes = keyLength >> 3; + if (revision >= 3) { + for (j = 0; j < 50; ++j) { + hash = calculateMD5(hash, 0, keyLengthInBytes); + } + } + const encryptionKey = hash.subarray(0, keyLengthInBytes); + let cipher, checkData; + if (revision >= 3) { + i = 0; + hashData.set(CipherTransformFactory._defaultPasswordBytes, i); + i += 32; + hashData.set(fileId, i); + i += fileId.length; + cipher = new ARCFourCipher(encryptionKey); + checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i)); + n = encryptionKey.length; + const derivedKey = new Uint8Array(n); + for (j = 1; j <= 19; ++j) { + for (let k = 0; k < n; ++k) { + derivedKey[k] = encryptionKey[k] ^ j; + } + cipher = new ARCFourCipher(derivedKey); + checkData = cipher.encryptBlock(checkData); + } + } else { + cipher = new ARCFourCipher(encryptionKey); + checkData = cipher.encryptBlock(CipherTransformFactory._defaultPasswordBytes); + } + return checkData.every((data, k) => userPassword[k] === data) ? encryptionKey : null; + } + #decodeUserPassword(password, ownerPassword, revision, keyLength) { + const hashData = new Uint8Array(32); + let i = 0; + const n = Math.min(32, password.length); + for (; i < n; ++i) { + hashData[i] = password[i]; + } + let j = 0; + while (i < 32) { + hashData[i++] = CipherTransformFactory._defaultPasswordBytes[j++]; + } + let hash = calculateMD5(hashData, 0, i); + const keyLengthInBytes = keyLength >> 3; + if (revision >= 3) { + for (j = 0; j < 50; ++j) { + hash = calculateMD5(hash, 0, hash.length); + } + } + let cipher, userPassword; + if (revision >= 3) { + userPassword = ownerPassword; + const derivedKey = new Uint8Array(keyLengthInBytes); + for (j = 19; j >= 0; j--) { + for (let k = 0; k < keyLengthInBytes; ++k) { + derivedKey[k] = hash[k] ^ j; + } + cipher = new ARCFourCipher(derivedKey); + userPassword = cipher.encryptBlock(userPassword); + } + } else { + cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes)); + userPassword = cipher.encryptBlock(ownerPassword); + } + return userPassword; + } + #buildObjectKey(num, gen, encryptionKey, isAes = false) { + const n = encryptionKey.length; + const key = new Uint8Array(n + 9); + key.set(encryptionKey); + let i = n; + key[i++] = num & 0xff; + key[i++] = num >> 8 & 0xff; + key[i++] = num >> 16 & 0xff; + key[i++] = gen & 0xff; + key[i++] = gen >> 8 & 0xff; + if (isAes) { + key[i++] = 0x73; + key[i++] = 0x41; + key[i++] = 0x6c; + key[i++] = 0x54; + } + const hash = calculateMD5(key, 0, i); + return hash.subarray(0, Math.min(n + 5, 16)); + } + constructor(dict, fileId, password) { + const filter = dict.get("Filter"); + if (!isName(filter, "Standard")) { + throw new FormatError("unknown encryption method"); + } + this.filterName = filter.name; + this.dict = dict; + this.#fileId = fileId; + const algorithm = dict.get("V"); + if (!Number.isInteger(algorithm) || algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm !== 5) { + throw new FormatError("unsupported encryption algorithm"); + } + this.algorithm = algorithm; + let keyLength = dict.get("Length"); + if (!keyLength) { + if (algorithm <= 3) { + keyLength = 40; + } else { + const cfDict = dict.get("CF"); + const streamCryptoName = dict.get("StmF"); + if (cfDict instanceof Dict && streamCryptoName instanceof Name) { + cfDict.suppressEncryption = true; + const handlerDict = cfDict.get(streamCryptoName.name); + keyLength = handlerDict?.get("Length") || 128; + if (keyLength < 40) { + keyLength <<= 3; + } + } + } + } + if (!Number.isInteger(keyLength) || keyLength < 40 || keyLength % 8 !== 0) { + throw new FormatError("invalid key length"); + } + let cf = null; + let stmf = Name.get("Identity"); + let strf = Name.get("Identity"); + let eff = stmf; + if (algorithm >= 4) { + cf = dict.get("CF"); + if (cf instanceof Dict) { + cf.suppressEncryption = true; + } + stmf = dict.get("StmF") || Name.get("Identity"); + strf = dict.get("StrF") || Name.get("Identity"); + eff = dict.get("EFF") || stmf; + } + this.cf = cf; + this.stmf = stmf; + this.strf = strf; + this.eff = eff; + const ownerBytes = stringToBytes(dict.get("O")), + userBytes = stringToBytes(dict.get("U")); + const ownerPassword = ownerBytes.subarray(0, 32); + const userPassword = userBytes.subarray(0, 32); + const flags = dict.get("P"); + const revision = dict.get("R"); + const encryptMetadata = (algorithm === 4 || algorithm === 5) && dict.get("EncryptMetadata") !== false; + this.encryptMetadata = encryptMetadata; + const fileIdBytes = stringToBytes(fileId); + let passwordBytes; + if (password) { + if (revision === 6) { + try { + password = utf8StringToString(password); + } catch { + warn("CipherTransformFactory: Unable to convert UTF8 encoded password."); + } + } + passwordBytes = stringToBytes(password); + } + let encryptionKey; + if (algorithm !== 5) { + encryptionKey = this.#prepareKeyData(fileIdBytes, passwordBytes, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata); + } else { + const ownerValidationSalt = ownerBytes.subarray(32, 40); + const ownerKeySalt = ownerBytes.subarray(40, 48); + const uBytes = userBytes.subarray(0, 48); + const userValidationSalt = userBytes.subarray(32, 40); + const userKeySalt = userBytes.subarray(40, 48); + const ownerEncryption = stringToBytes(dict.get("OE")); + const userEncryption = stringToBytes(dict.get("UE")); + const perms = stringToBytes(dict.get("Perms")); + encryptionKey = this.#createEncryptionKey20(revision, passwordBytes, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms); + } + if (!encryptionKey) { + if (!password) { + if (this.algorithm >= 4 && isName(this.stmf, "Identity") && isName(this.strf, "Identity")) { + const effCF = this.cf?.get(this.eff.name); + const authEvent = effCF?.get("AuthEvent"); + if (isName(authEvent, "EFOpen")) { + this.encryptionKey = null; + return; + } + } + throw new PasswordException("No password given", PasswordResponses.NEED_PASSWORD); + } + const decodedPassword = this.#decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength); + encryptionKey = this.#prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata); + } + if (!encryptionKey) { + throw new PasswordException("Incorrect Password", PasswordResponses.INCORRECT_PASSWORD); + } + if (algorithm === 4 && encryptionKey.length < 16) { + this.encryptionKey = new Uint8Array(16); + this.encryptionKey.set(encryptionKey); + } else { + this.encryptionKey = encryptionKey; + } + } + setPassword(password) { + const transform = new CipherTransformFactory(this.dict, this.#fileId, password); + this.encryptionKey = transform.encryptionKey; + } + createCipherTransform(num, gen) { + if (this.algorithm === 4 || this.algorithm === 5) { + const resolveCipher = filterName => { + if (!(filterName instanceof Name)) { + throw new FormatError("Invalid crypt filter name."); + } + const cryptFilter = this.cf.get(filterName.name); + const cfm = cryptFilter?.get("CFM"); + if (!cfm || cfm.name === "None") { + return NullCipher; + } + if (!this.encryptionKey) { + throw new PasswordException("No password given", PasswordResponses.NEED_PASSWORD); + } + if (this.algorithm === 5) { + return AES256Cipher.bind(null, this.encryptionKey); + } + if (cfm.name === "V2") { + return ARCFourCipher.bind(null, this.#buildObjectKey(num, gen, this.encryptionKey, false)); + } + if (cfm.name === "AESV2") { + return AES128Cipher.bind(null, this.#buildObjectKey(num, gen, this.encryptionKey, true)); + } + if (cfm.name === "AESV3") { + return AES256Cipher.bind(null, this.encryptionKey); + } + throw new FormatError("Unknown crypto method"); + }; + const transform = new CipherTransform(resolveCipher, this.strf, this.stmf); + transform.embeddedFilterName = this.eff; + return transform; + } + const resolveCipher = () => ARCFourCipher.bind(null, this.#buildObjectKey(num, gen, this.encryptionKey, false)); + return new CipherTransform(resolveCipher); + } +} + +;// ./src/core/xref.js @@ -53999,7 +57980,6 @@ class XRef { - #firstXRefStmPos = null; constructor(stream, pdfManager) { this.stream = stream; this.pdfManager = pdfManager; @@ -54183,17 +58163,17 @@ } processXRefStream(stream) { if (!("streamState" in this)) { - const streamParameters = stream.dict; - const byteWidths = streamParameters.get("W"); - let range = streamParameters.get("Index"); - if (!range) { - range = [0, streamParameters.get("Size")]; - } + const { + dict, + pos + } = stream; + const byteWidths = dict.get("W"); + const range = dict.get("Index") || [0, dict.get("Size")]; this.streamState = { entryRanges: range, byteWidths, entryNum: 0, - streamPos: stream.pos + streamPos: pos }; } this.readXRefStream(stream); @@ -54476,6 +58456,27 @@ if (this.topDict) { return this.topDict; } + if (!trailerDicts.length) { + for (const num in this.entries) { + const entry = this.entries[num]; + if (!entry) { + continue; + } + const ref = Ref.get(parseInt(num, 10), entry.gen); + let obj; + try { + obj = this.fetch(ref); + } catch { + continue; + } + if (obj instanceof BaseStream) { + obj = obj.dict; + } + if (obj instanceof Dict && obj.has("Root")) { + return obj; + } + } + } throw new InvalidPDFException("Invalid PDF structure."); } readXRef(recoveryMode = false) { @@ -54507,7 +58508,6 @@ if (Number.isInteger(obj) && !this._xrefStms.has(obj)) { this._xrefStms.add(obj); this.startXRefQueue.push(obj); - this.#firstXRefStmPos ??= obj; } } else if (Number.isInteger(obj)) { if (!Number.isInteger(parser.getObj()) || !isCmd(parser.getObj(), "obj") || !((obj = parser.getObj()) instanceof BaseStream)) { @@ -54545,9 +58545,6 @@ } throw new XRefParseException(); } - get lastXRefStreamPos() { - return this.#firstXRefStmPos ?? (this._xrefStms.size > 0 ? Math.max(...this._xrefStms) : null); - } getEntry(i) { const xrefEntry = this.entries[i]; if (xrefEntry && !xrefEntry.free && xrefEntry.offset) { @@ -54575,7 +58572,6 @@ } let xrefEntry = this.getEntry(num); if (xrefEntry === null) { - this._cacheMap.set(num, xrefEntry); return xrefEntry; } if (this._pendingRefs.has(ref)) { @@ -54664,6 +58660,10 @@ throw new FormatError(`invalid object offset in the ObjStm stream: ${offset}`); } nums[i] = num; + const entry = this.getEntry(num); + if (entry?.offset === tableOffset && entry.gen !== i) { + entry.gen = i; + } offsets[i] = offset; } const start = (stream.start || 0) + first; @@ -54717,7 +58717,11 @@ } } -;// CONCATENATED MODULE: ./src/core/document.js +;// ./src/core/document.js + + + + @@ -54738,9 +58742,9 @@ -const DEFAULT_USER_UNIT = 1.0; const LETTER_SIZE_MEDIABOX = [0, 0, 612, 792]; class Page { + #resourcesPromise = null; constructor({ pdfManager, xref, @@ -54751,6 +58755,7 @@ fontCache, builtInCMapCache, standardFontDataCache, + globalColorSpaceCache, globalImageCache, systemFontCache, nonBlendModesSet, @@ -54764,11 +58769,11 @@ this.fontCache = fontCache; this.builtInCMapCache = builtInCMapCache; this.standardFontDataCache = standardFontDataCache; + this.globalColorSpaceCache = globalColorSpaceCache; this.globalImageCache = globalImageCache; this.systemFontCache = systemFontCache; this.nonBlendModesSet = nonBlendModesSet; this.evaluatorOptions = pdfManager.evaluatorOptions; - this.resourcesPromise = null; this.xfaFactory = xfaFactory; const idCounters = { obj: 0 @@ -54782,7 +58787,25 @@ } }; } - _getInheritableProperty(key, getArray = false) { + #createPartialEvaluator(handler, pageIndex = this.pageIndex) { + return new PartialEvaluator({ + xref: this.xref, + handler, + pageIndex, + idFactory: this._localIdFactory, + fontCache: this.fontCache, + builtInCMapCache: this.builtInCMapCache, + standardFontDataCache: this.standardFontDataCache, + globalColorSpaceCache: this.globalColorSpaceCache, + globalImageCache: this.globalImageCache, + systemFontCache: this.systemFontCache, + options: this.evaluatorOptions + }); + } + createAnnotationEvaluator(handler) { + return this.#createPartialEvaluator(handler); + } + #getInheritableProperty(key, getArray = false) { const value = getInheritableProperty({ dict: this.pageDict, key, @@ -54804,16 +58827,15 @@ return this.pageDict.getArray("Contents"); } get resources() { - const resources = this._getInheritableProperty("Resources"); + const resources = this.#getInheritableProperty("Resources"); return shadow(this, "resources", resources instanceof Dict ? resources : Dict.empty); } - _getBoundingBox(name) { + getBoundingBox(name) { if (this.xfaData) { return this.xfaData.bbox; } - let box = this._getInheritableProperty(name, true); - if (Array.isArray(box) && box.length === 4) { - box = Util.normalizeRect(box); + const box = lookupNormalRect(this.#getInheritableProperty(name, true), null); + if (box) { if (box[2] - box[0] > 0 && box[3] - box[1] > 0) { return box; } @@ -54822,17 +58844,14 @@ return null; } get mediaBox() { - return shadow(this, "mediaBox", this._getBoundingBox("MediaBox") || LETTER_SIZE_MEDIABOX); + return shadow(this, "mediaBox", this.getBoundingBox("MediaBox") || LETTER_SIZE_MEDIABOX); } get cropBox() { - return shadow(this, "cropBox", this._getBoundingBox("CropBox") || this.mediaBox); + return shadow(this, "cropBox", this.getBoundingBox("CropBox") || this.mediaBox); } get userUnit() { - let obj = this.pageDict.get("UserUnit"); - if (typeof obj !== "number" || obj <= 0) { - obj = DEFAULT_USER_UNIT; - } - return shadow(this, "userUnit", obj); + const obj = this.pageDict.get("UserUnit"); + return shadow(this, "userUnit", typeof obj === "number" && obj > 0 ? obj : 1.0); } get view() { const { @@ -54849,7 +58868,7 @@ return shadow(this, "view", mediaBox); } get rotate() { - let rotate = this._getInheritableProperty("Rotate") || 0; + let rotate = this.#getInheritableProperty("Rotate") || 0; if (rotate % 90 !== 0) { rotate = 0; } else if (rotate >= 360) { @@ -54859,30 +58878,50 @@ } return shadow(this, "rotate", rotate); } - _onSubStreamError(reason, objId) { + #onSubStreamError(reason, objId) { if (this.evaluatorOptions.ignoreErrors) { warn(`getContentStream - ignoring sub-stream (${objId}): "${reason}".`); return; } throw reason; } - getContentStream() { - return this.pdfManager.ensure(this, "content").then(content => { - if (content instanceof BaseStream) { - return content; + async getContentStream() { + const content = await this.pdfManager.ensure(this, "content"); + if (content instanceof BaseStream && !content.isImageStream) { + if (content.isAsync) { + const bytes = await content.asyncGetBytes(); + if (bytes) { + return new Stream(bytes, 0, bytes.length, content.dict); + } + } + return content; + } + if (Array.isArray(content)) { + const promises = []; + for (let i = 0, ii = content.length; i < ii; i++) { + const item = content[i]; + if (item instanceof BaseStream && item.isAsync) { + promises.push(item.asyncGetBytes().then(bytes => { + if (bytes) { + content[i] = new Stream(bytes, 0, bytes.length, item.dict); + } + })); + } } - if (Array.isArray(content)) { - return new StreamsSequenceStream(content, this._onSubStreamError.bind(this)); + if (promises.length > 0) { + await Promise.all(promises); } - return new NullStream(); - }); + return new StreamsSequenceStream(content, this.#onSubStreamError.bind(this)); + } + return new NullStream(); } get xfaData() { return shadow(this, "xfaData", this.xfaFactory ? { bbox: this.xfaFactory.getBoundingBox(this.pageIndex) } : null); } - #replaceIdByRef(annotations, deletedAnnotations, existingAnnotations) { + async #replaceIdByRef(annotations, deletedAnnotations, existingAnnotations) { + const promises = []; for (const annotation of annotations) { if (annotation.id) { const ref = Ref.fromString(annotation.id); @@ -54891,37 +58930,46 @@ continue; } if (annotation.deleted) { - deletedAnnotations.put(ref); + deletedAnnotations.put(ref, ref); + if (annotation.popupRef) { + const popupRef = Ref.fromString(annotation.popupRef); + if (popupRef) { + deletedAnnotations.put(popupRef, popupRef); + } + } continue; } + if (annotation.popup?.deleted) { + const popupRef = Ref.fromString(annotation.popupRef); + if (popupRef) { + deletedAnnotations.put(popupRef, popupRef); + } + } existingAnnotations?.put(ref); annotation.ref = ref; + promises.push(this.xref.fetchAsync(ref).then(obj => { + if (obj instanceof Dict) { + annotation.oldAnnotation = obj.clone(); + } + }, () => { + warn(`Cannot fetch \`oldAnnotation\` for: ${ref}.`); + })); delete annotation.id; } } + await Promise.all(promises); } - async saveNewAnnotations(handler, task, annotations, imagePromises) { + async saveNewAnnotations(handler, task, annotations, imagePromises, changes) { if (this.xfaFactory) { throw new Error("XFA: Cannot save new annotations."); } - const partialEvaluator = new PartialEvaluator({ - xref: this.xref, - handler, - pageIndex: this.pageIndex, - idFactory: this._localIdFactory, - fontCache: this.fontCache, - builtInCMapCache: this.builtInCMapCache, - standardFontDataCache: this.standardFontDataCache, - globalImageCache: this.globalImageCache, - systemFontCache: this.systemFontCache, - options: this.evaluatorOptions - }); - const deletedAnnotations = new RefSet(); + const partialEvaluator = this.#createPartialEvaluator(handler); + const deletedAnnotations = new RefSetCache(); const existingAnnotations = new RefSet(); - this.#replaceIdByRef(annotations, deletedAnnotations, existingAnnotations); + await this.#replaceIdByRef(annotations, deletedAnnotations, existingAnnotations); const pageDict = this.pageDict; const annotationsArray = this.annotations.filter(a => !(a instanceof Ref && deletedAnnotations.has(a))); - const newData = await AnnotationFactory.saveNewAnnotations(partialEvaluator, task, annotations, imagePromises); + const newData = await AnnotationFactory.saveNewAnnotations(partialEvaluator, this.xref, task, annotations, imagePromises, changes); for (const { ref } of newData.annotations) { @@ -54929,234 +58977,199 @@ annotationsArray.push(ref); } } - const savedDict = pageDict.get("Annots"); - pageDict.set("Annots", annotationsArray); - const buffer = []; - await writeObject(this.ref, pageDict, buffer, this.xref); - if (savedDict) { - pageDict.set("Annots", savedDict); - } - const objects = newData.dependencies; - objects.push({ - ref: this.ref, - data: buffer.join("") - }, ...newData.annotations); - return objects; - } - save(handler, task, annotationStorage) { - const partialEvaluator = new PartialEvaluator({ - xref: this.xref, - handler, - pageIndex: this.pageIndex, - idFactory: this._localIdFactory, - fontCache: this.fontCache, - builtInCMapCache: this.builtInCMapCache, - standardFontDataCache: this.standardFontDataCache, - globalImageCache: this.globalImageCache, - systemFontCache: this.systemFontCache, - options: this.evaluatorOptions + const dict = pageDict.clone(); + dict.set("Annots", annotationsArray); + changes.put(this.ref, { + data: dict }); - return this._parsedAnnotations.then(function (annotations) { - const newRefsPromises = []; - for (const annotation of annotations) { - if (!annotation.mustBePrinted(annotationStorage)) { - continue; - } - newRefsPromises.push(annotation.save(partialEvaluator, task, annotationStorage).catch(function (reason) { - warn("save - ignoring annotation data during " + `"${task.name}" task: "${reason}".`); - return null; - })); - } - return Promise.all(newRefsPromises).then(function (newRefs) { - return newRefs.filter(newRef => !!newRef); + for (const deletedRef of deletedAnnotations) { + changes.put(deletedRef, { + data: null }); - }); + } + } + async save(handler, task, annotationStorage, changes) { + const partialEvaluator = this.#createPartialEvaluator(handler); + const annotations = await this._parsedAnnotations; + const promises = []; + for (const annotation of annotations) { + promises.push(annotation.save(partialEvaluator, task, annotationStorage, changes).catch(function (reason) { + warn("save - ignoring annotation data during " + `"${task.name}" task: "${reason}".`); + return null; + })); + } + return Promise.all(promises); } - loadResources(keys) { - if (!this.resourcesPromise) { - this.resourcesPromise = this.pdfManager.ensure(this, "resources"); + async loadResources(keys) { + await (this.#resourcesPromise ??= this.pdfManager.ensure(this, "resources")); + await ObjectLoader.load(this.resources, keys, this.xref); + } + async #getMergedResources(streamDict, keys) { + const localResources = streamDict?.get("Resources"); + if (!(localResources instanceof Dict && localResources.size)) { + return this.resources; } - return this.resourcesPromise.then(() => { - const objectLoader = new ObjectLoader(this.resources, keys, this.xref); - return objectLoader.load(); + await ObjectLoader.load(localResources, keys, this.xref); + return Dict.merge({ + xref: this.xref, + dictArray: [localResources, this.resources], + mergeSubDicts: true }); } - getOperatorList({ + async getOperatorList({ handler, sink, task, intent, cacheKey, - annotationStorage = null + pageIndex = this.pageIndex, + annotationStorage = null, + modifiedIds = null }) { const contentStreamPromise = this.getContentStream(); - const resourcesPromise = this.loadResources(["ColorSpace", "ExtGState", "Font", "Pattern", "Properties", "Shading", "XObject"]); - const partialEvaluator = new PartialEvaluator({ - xref: this.xref, - handler, - pageIndex: this.pageIndex, - idFactory: this._localIdFactory, - fontCache: this.fontCache, - builtInCMapCache: this.builtInCMapCache, - standardFontDataCache: this.standardFontDataCache, - globalImageCache: this.globalImageCache, - systemFontCache: this.systemFontCache, - options: this.evaluatorOptions - }); - const newAnnotationsByPage = !this.xfaFactory ? getNewAnnotationsMap(annotationStorage) : null; - let deletedAnnotations = null; + const resourcesPromise = this.loadResources(RESOURCES_KEYS_OPERATOR_LIST); + const partialEvaluator = this.#createPartialEvaluator(handler, pageIndex); + const newAnnotsByPage = !this.xfaFactory ? getNewAnnotationsMap(annotationStorage) : null; + const newAnnots = newAnnotsByPage?.get(this.pageIndex); let newAnnotationsPromise = Promise.resolve(null); - if (newAnnotationsByPage) { - const newAnnotations = newAnnotationsByPage.get(this.pageIndex); - if (newAnnotations) { - const annotationGlobalsPromise = this.pdfManager.ensureDoc("annotationGlobals"); - let imagePromises; - const missingBitmaps = new Set(); - for (const { - bitmapId, - bitmap - } of newAnnotations) { - if (bitmapId && !bitmap && !missingBitmaps.has(bitmapId)) { - missingBitmaps.add(bitmapId); - } + let deletedAnnotations = null; + if (newAnnots) { + const annotationGlobalsPromise = this.pdfManager.ensureDoc("annotationGlobals"); + let imagePromises; + const missingBitmaps = new Set(); + for (const { + bitmapId, + bitmap + } of newAnnots) { + if (bitmapId && !bitmap && !missingBitmaps.has(bitmapId)) { + missingBitmaps.add(bitmapId); } - const { - isOffscreenCanvasSupported - } = this.evaluatorOptions; - if (missingBitmaps.size > 0) { - const annotationWithBitmaps = newAnnotations.slice(); - for (const [key, annotation] of annotationStorage) { - if (!key.startsWith(AnnotationEditorPrefix)) { - continue; - } - if (annotation.bitmap && missingBitmaps.has(annotation.bitmapId)) { - annotationWithBitmaps.push(annotation); - } + } + const { + isOffscreenCanvasSupported + } = this.evaluatorOptions; + if (missingBitmaps.size > 0) { + const annotationWithBitmaps = newAnnots.slice(); + for (const [key, annotation] of annotationStorage) { + if (!key.startsWith(AnnotationEditorPrefix)) { + continue; } - imagePromises = AnnotationFactory.generateImages(annotationWithBitmaps, this.xref, isOffscreenCanvasSupported); - } else { - imagePromises = AnnotationFactory.generateImages(newAnnotations, this.xref, isOffscreenCanvasSupported); - } - deletedAnnotations = new RefSet(); - this.#replaceIdByRef(newAnnotations, deletedAnnotations, null); - newAnnotationsPromise = annotationGlobalsPromise.then(annotationGlobals => { - if (!annotationGlobals) { - return null; + if (annotation.bitmap && missingBitmaps.has(annotation.bitmapId)) { + annotationWithBitmaps.push(annotation); } - return AnnotationFactory.printNewAnnotations(annotationGlobals, partialEvaluator, task, newAnnotations, imagePromises); - }); + } + imagePromises = AnnotationFactory.generateImages(annotationWithBitmaps, this.xref, isOffscreenCanvasSupported); + } else { + imagePromises = AnnotationFactory.generateImages(newAnnots, this.xref, isOffscreenCanvasSupported); } + deletedAnnotations = new RefSet(); + newAnnotationsPromise = Promise.all([annotationGlobalsPromise, this.#replaceIdByRef(newAnnots, deletedAnnotations, null)]).then(([annotationGlobals]) => { + if (!annotationGlobals) { + return null; + } + return AnnotationFactory.printNewAnnotations(annotationGlobals, partialEvaluator, task, newAnnots, imagePromises); + }); } - const dataPromises = Promise.all([contentStreamPromise, resourcesPromise]); - const pageListPromise = dataPromises.then(([contentStream]) => { + const pageListPromise = Promise.all([contentStreamPromise, resourcesPromise]).then(async ([contentStream]) => { + const resources = await this.#getMergedResources(contentStream.dict, RESOURCES_KEYS_OPERATOR_LIST); const opList = new OperatorList(intent, sink); handler.send("StartRenderPage", { - transparency: partialEvaluator.hasBlendModes(this.resources, this.nonBlendModesSet), - pageIndex: this.pageIndex, + transparency: partialEvaluator.hasBlendModes(resources, this.nonBlendModesSet), + pageIndex, cacheKey }); - return partialEvaluator.getOperatorList({ + await partialEvaluator.getOperatorList({ stream: contentStream, task, - resources: this.resources, + resources, operatorList: opList - }).then(function () { - return opList; }); + return opList; }); - return Promise.all([pageListPromise, this._parsedAnnotations, newAnnotationsPromise]).then(function ([pageOpList, annotations, newAnnotations]) { - if (newAnnotations) { - annotations = annotations.filter(a => !(a.ref && deletedAnnotations.has(a.ref))); - for (let i = 0, ii = newAnnotations.length; i < ii; i++) { - const newAnnotation = newAnnotations[i]; - if (newAnnotation.refToReplace) { - const j = annotations.findIndex(a => a.ref && isRefsEqual(a.ref, newAnnotation.refToReplace)); - if (j >= 0) { - annotations.splice(j, 1, newAnnotation); - newAnnotations.splice(i--, 1); - ii--; - } + let [pageOpList, annotations, newAnnotations] = await Promise.all([pageListPromise, this._parsedAnnotations, newAnnotationsPromise]); + if (newAnnotations) { + annotations = annotations.filter(a => !(a.ref && deletedAnnotations.has(a.ref))); + for (let i = 0, ii = newAnnotations.length; i < ii; i++) { + const newAnnotation = newAnnotations[i]; + if (newAnnotation.refToReplace) { + const j = annotations.findIndex(a => a.ref && isRefsEqual(a.ref, newAnnotation.refToReplace)); + if (j >= 0) { + annotations.splice(j, 1, newAnnotation); + newAnnotations.splice(i--, 1); + ii--; } } - annotations = annotations.concat(newAnnotations); - } - if (annotations.length === 0 || intent & RenderingIntentFlag.ANNOTATIONS_DISABLE) { - pageOpList.flush(true); - return { - length: pageOpList.totalLength - }; } - const renderForms = !!(intent & RenderingIntentFlag.ANNOTATIONS_FORMS), - intentAny = !!(intent & RenderingIntentFlag.ANY), - intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY), - intentPrint = !!(intent & RenderingIntentFlag.PRINT); - const opListPromises = []; - for (const annotation of annotations) { - if (intentAny || intentDisplay && annotation.mustBeViewed(annotationStorage, renderForms) || intentPrint && annotation.mustBePrinted(annotationStorage)) { - opListPromises.push(annotation.getOperatorList(partialEvaluator, task, intent, renderForms, annotationStorage).catch(function (reason) { - warn("getOperatorList - ignoring annotation data during " + `"${task.name}" task: "${reason}".`); - return { - opList: null, - separateForm: false, - separateCanvas: false - }; - })); - } + annotations = annotations.concat(newAnnotations); + } + if (annotations.length === 0 || intent & RenderingIntentFlag.ANNOTATIONS_DISABLE) { + pageOpList.flush(true); + return { + length: pageOpList.totalLength + }; + } + const renderForms = !!(intent & RenderingIntentFlag.ANNOTATIONS_FORMS), + isEditing = !!(intent & RenderingIntentFlag.IS_EDITING), + intentAny = !!(intent & RenderingIntentFlag.ANY), + intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY), + intentPrint = !!(intent & RenderingIntentFlag.PRINT); + const opListPromises = []; + for (const annotation of annotations) { + if (intentAny || intentDisplay && annotation.mustBeViewed(annotationStorage, renderForms) && annotation.mustBeViewedWhenEditing(isEditing, modifiedIds) || intentPrint && annotation.mustBePrinted(annotationStorage)) { + opListPromises.push(annotation.getOperatorList(partialEvaluator, task, intent, annotationStorage).catch(function (reason) { + warn("getOperatorList - ignoring annotation data during " + `"${task.name}" task: "${reason}".`); + return { + opList: null, + separateForm: false, + separateCanvas: false + }; + })); } - return Promise.all(opListPromises).then(function (opLists) { - let form = false, - canvas = false; - for (const { - opList, - separateForm, - separateCanvas - } of opLists) { - pageOpList.addOpList(opList); - form ||= separateForm; - canvas ||= separateCanvas; - } - pageOpList.flush(true, { - form, - canvas - }); - return { - length: pageOpList.totalLength - }; - }); + } + const opLists = await Promise.all(opListPromises); + let form = false, + canvas = false; + for (const { + opList, + separateForm, + separateCanvas + } of opLists) { + pageOpList.addOpList(opList); + form ||= separateForm; + canvas ||= separateCanvas; + } + pageOpList.flush(true, { + form, + canvas }); + return { + length: pageOpList.totalLength + }; } - extractTextContent({ + async extractTextContent({ handler, task, includeMarkedContent, disableNormalization, - sink + sink, + intersector = null }) { const contentStreamPromise = this.getContentStream(); - const resourcesPromise = this.loadResources(["ExtGState", "Font", "Properties", "XObject"]); - const dataPromises = Promise.all([contentStreamPromise, resourcesPromise]); - return dataPromises.then(([contentStream]) => { - const partialEvaluator = new PartialEvaluator({ - xref: this.xref, - handler, - pageIndex: this.pageIndex, - idFactory: this._localIdFactory, - fontCache: this.fontCache, - builtInCMapCache: this.builtInCMapCache, - standardFontDataCache: this.standardFontDataCache, - globalImageCache: this.globalImageCache, - systemFontCache: this.systemFontCache, - options: this.evaluatorOptions - }); - return partialEvaluator.getTextContent({ - stream: contentStream, - task, - resources: this.resources, - includeMarkedContent, - disableNormalization, - sink, - viewBox: this.view - }); + const resourcesPromise = this.loadResources(RESOURCES_KEYS_TEXT_CONTENT); + const langPromise = this.pdfManager.ensureCatalog("lang"); + const [contentStream,, lang] = await Promise.all([contentStreamPromise, resourcesPromise, langPromise]); + const resources = await this.#getMergedResources(contentStream.dict, RESOURCES_KEYS_TEXT_CONTENT); + const partialEvaluator = this.#createPartialEvaluator(handler); + return partialEvaluator.getTextContent({ + stream: contentStream, + task, + resources, + includeMarkedContent, + disableNormalization, + sink, + viewBox: this.view, + lang, + intersector }); } async getStructTree() { @@ -55165,8 +59178,13 @@ return null; } await this._parsedAnnotations; - const structTree = await this.pdfManager.ensure(this, "_parseStructTree", [structTreeRoot]); - return structTree.serializable; + try { + const structTree = await this.pdfManager.ensure(this, "_parseStructTree", [structTreeRoot]); + return await this.pdfManager.ensure(structTree, "serializable"); + } catch (ex) { + warn(`getStructTree: "${ex}".`); + return null; + } } _parseStructTree(structTreeRoot) { const tree = new StructTreePage(structTreeRoot, this.pageDict); @@ -55184,34 +59202,39 @@ const intentAny = !!(intent & RenderingIntentFlag.ANY), intentDisplay = !!(intent & RenderingIntentFlag.DISPLAY), intentPrint = !!(intent & RenderingIntentFlag.PRINT); + const highlightedAnnotations = []; for (const annotation of annotations) { const isVisible = intentAny || intentDisplay && annotation.viewable; if (isVisible || intentPrint && annotation.printable) { annotationsData.push(annotation.data); } if (annotation.hasTextContent && isVisible) { - partialEvaluator ||= new PartialEvaluator({ - xref: this.xref, - handler, - pageIndex: this.pageIndex, - idFactory: this._localIdFactory, - fontCache: this.fontCache, - builtInCMapCache: this.builtInCMapCache, - standardFontDataCache: this.standardFontDataCache, - globalImageCache: this.globalImageCache, - systemFontCache: this.systemFontCache, - options: this.evaluatorOptions - }); + partialEvaluator ??= this.#createPartialEvaluator(handler); textContentPromises.push(annotation.extractTextContent(partialEvaluator, task, [-Infinity, -Infinity, Infinity, Infinity]).catch(function (reason) { warn(`getAnnotationsData - ignoring textContent during "${task.name}" task: "${reason}".`); })); + } else if (annotation.overlaysTextContent && isVisible) { + highlightedAnnotations.push(annotation); } } + if (highlightedAnnotations.length > 0) { + const intersector = new Intersector(highlightedAnnotations); + textContentPromises.push(this.extractTextContent({ + handler, + task, + includeMarkedContent: false, + disableNormalization: false, + sink: null, + intersector + }).then(() => { + intersector.setText(); + })); + } await Promise.all(textContentPromises); return annotationsData; } get annotations() { - const annots = this._getInheritableProperty("Annots"); + const annots = this.#getInheritableProperty("Annots"); return shadow(this, "annotations", Array.isArray(annots) ? annots : []); } get _parsedAnnotations() { @@ -55219,13 +59242,14 @@ if (annots.length === 0) { return annots; } - const annotationGlobals = await this.pdfManager.ensureDoc("annotationGlobals"); + const [annotationGlobals, fieldObjects] = await Promise.all([this.pdfManager.ensureDoc("annotationGlobals"), this.pdfManager.ensureDoc("fieldObjects")]); if (!annotationGlobals) { return []; } + const orphanFields = fieldObjects?.orphanFields; const annotationPromises = []; for (const annotationRef of annots) { - annotationPromises.push(AnnotationFactory.create(this.xref, annotationRef, annotationGlobals, this._localIdFactory, false, this.ref).catch(function (reason) { + annotationPromises.push(AnnotationFactory.create(this.xref, annotationRef, annotationGlobals, this._localIdFactory, false, orphanFields, null, this.ref).catch(function (reason) { warn(`_parsedAnnotations: "${reason}".`); return null; })); @@ -55260,12 +59284,45 @@ const actions = collectActions(this.xref, this.pageDict, PageActionEventType); return shadow(this, "jsActions", actions); } + async collectAnnotationsByType(handler, task, types, promises, annotationGlobals) { + const { + pageIndex + } = this; + if (Object.hasOwn(this, "_parsedAnnotations")) { + const cachedAnnotations = await this._parsedAnnotations; + for (const { + data + } of cachedAnnotations) { + if (!types || types.has(data.annotationType)) { + data.pageIndex = pageIndex; + promises.push(Promise.resolve(data)); + } + } + return; + } + const annots = await this.pdfManager.ensure(this, "annotations"); + let partialEvaluator; + for (const annotationRef of annots) { + promises.push(AnnotationFactory.create(this.xref, annotationRef, annotationGlobals, this._localIdFactory, false, null, types, this.ref).then(async annotation => { + if (!annotation) { + return null; + } + annotation.data.pageIndex = pageIndex; + if (annotation.hasTextContent && annotation.viewable) { + partialEvaluator ??= this.#createPartialEvaluator(handler); + await annotation.extractTextContent(partialEvaluator, task, [-Infinity, -Infinity, Infinity, Infinity]); + } + return annotation.data; + }).catch(function (reason) { + warn(`collectAnnotationsByType: "${reason}".`); + return null; + })); + } + } } const PDF_HEADER_SIGNATURE = new Uint8Array([0x25, 0x50, 0x44, 0x46, 0x2d]); const STARTXREF_SIGNATURE = new Uint8Array([0x73, 0x74, 0x61, 0x72, 0x74, 0x78, 0x72, 0x65, 0x66]); const ENDOBJ_SIGNATURE = new Uint8Array([0x65, 0x6e, 0x64, 0x6f, 0x62, 0x6a]); -const FINGERPRINT_FIRST_BYTES = 1024; -const EMPTY_FINGERPRINT = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; function find(stream, signature, limit = 1024, backwards = false) { const signatureLength = signature.length; const scanBytes = stream.peekBytes(limit); @@ -55304,6 +59361,8 @@ return false; } class PDFDocument { + #pagePromises = new Map(); + #version = null; constructor(pdfManager, stream) { if (stream.length <= 0) { throw new InvalidPDFException("The PDF file is empty, i.e. its size is zero bytes."); @@ -55311,8 +59370,6 @@ this.pdfManager = pdfManager; this.stream = stream; this.xref = new XRef(stream, pdfManager); - this._pagePromises = new Map(); - this._version = null; const idCounters = { font: 0 }; @@ -55407,7 +59464,7 @@ version += String.fromCharCode(ch); } if (PDF_VERSION_REGEXP.test(version)) { - this._version = version; + this.#version = version; } else { warn(`Invalid PDF header version: ${version}`); } @@ -55428,7 +59485,7 @@ } return shadow(this, "numPages", num); } - _hasOnlyDocumentSignatures(fields, recursionDepth = 0) { + #hasOnlyDocumentSignatures(fields, recursionDepth = 0) { const RECURSION_LIMIT = 10; if (!Array.isArray(fields)) { return false; @@ -55440,10 +59497,10 @@ } if (field.has("Kids")) { if (++recursionDepth > RECURSION_LIMIT) { - warn("_hasOnlyDocumentSignatures: maximum recursion depth reached"); + warn("#hasOnlyDocumentSignatures: maximum recursion depth reached"); return false; } - return this._hasOnlyDocumentSignatures(field.get("Kids"), recursionDepth); + return this.#hasOnlyDocumentSignatures(field.get("Kids"), recursionDepth); } const isSignature = isName(field.get("FT"), "Sig"); const rectangle = field.get("Rect"); @@ -55452,23 +59509,16 @@ }); } get _xfaStreams() { - const acroForm = this.catalog.acroForm; + const { + acroForm + } = this.catalog; if (!acroForm) { return null; } const xfa = acroForm.get("XFA"); - const entries = { - "xdp:xdp": "", - template: "", - datasets: "", - config: "", - connectionSet: "", - localeSet: "", - stylesheet: "", - "/xdp:xdp": "" - }; + const entries = new Map(["xdp:xdp", "template", "datasets", "config", "connectionSet", "localeSet", "stylesheet", "/xdp:xdp"].map(e => [e, null])); if (xfa instanceof BaseStream && !xfa.isEmpty) { - entries["xdp:xdp"] = xfa; + entries.set("xdp:xdp", xfa); return entries; } if (!Array.isArray(xfa) || xfa.length === 0) { @@ -55483,14 +59533,14 @@ } else { name = xfa[i]; } - if (!entries.hasOwnProperty(name)) { + if (!entries.has(name)) { continue; } const data = this.xref.fetchIfRef(xfa[i + 1]); if (!(data instanceof BaseStream) || data.isEmpty) { continue; } - entries[name] = data; + entries.set(name, data); } return entries; } @@ -55500,7 +59550,7 @@ return shadow(this, "xfaDatasets", null); } for (const key of ["datasets", "xdp:xdp"]) { - const stream = streams[key]; + const stream = streams.get(key); if (!stream) { continue; } @@ -55523,7 +59573,7 @@ return null; } const data = Object.create(null); - for (const [key, stream] of Object.entries(streams)) { + for (const [key, stream] of streams) { if (!stream) { continue; } @@ -55549,24 +59599,14 @@ get htmlForXfa() { return this.xfaFactory ? this.xfaFactory.getPages() : null; } - async loadXfaImages() { - const xfaImagesDict = await this.pdfManager.ensureCatalog("xfaImages"); - if (!xfaImagesDict) { + async #loadXfaImages() { + const xfaImages = await this.pdfManager.ensureCatalog("xfaImages"); + if (!xfaImages) { return; } - const keys = xfaImagesDict.getKeys(); - const objectLoader = new ObjectLoader(xfaImagesDict, keys, this.xref); - await objectLoader.load(); - const xfaImages = new Map(); - for (const key of keys) { - const stream = xfaImagesDict.get(key); - if (stream instanceof BaseStream) { - xfaImages.set(key, stream.getBytes()); - } - } this.xfaFactory.setImages(xfaImages); } - async loadXfaFonts(handler, task) { + async #loadXfaFonts(handler, task) { const acroForm = await this.pdfManager.ensureCatalog("acroForm"); if (!acroForm) { return; @@ -55575,22 +59615,27 @@ if (!(resources instanceof Dict)) { return; } - const objectLoader = new ObjectLoader(resources, ["Font"], this.xref); - await objectLoader.load(); + await ObjectLoader.load(resources, ["Font"], this.xref); const fontRes = resources.get("Font"); if (!(fontRes instanceof Dict)) { return; } - const options = Object.assign(Object.create(null), this.pdfManager.evaluatorOptions); - options.useSystemFonts = false; + const options = Object.assign(Object.create(null), this.pdfManager.evaluatorOptions, { + useSystemFonts: false + }); + const { + builtInCMapCache, + fontCache, + standardFontDataCache + } = this.catalog; const partialEvaluator = new PartialEvaluator({ xref: this.xref, handler, pageIndex: -1, idFactory: this._globalIdFactory, - fontCache: this.catalog.fontCache, - builtInCMapCache: this.catalog.builtInCMapCache, - standardFontDataCache: this.catalog.standardFontDataCache, + fontCache, + builtInCMapCache, + standardFontDataCache, options }); const operatorList = new OperatorList(); @@ -55606,18 +59651,18 @@ return this; } }; - const fonts = new Map(); - fontRes.forEach((fontName, font) => { - fonts.set(fontName, font); + const parseFont = (fontName, fallbackFontDict, cssFontInfo) => partialEvaluator.handleSetFont(resources, [Name.get(fontName), 1], null, operatorList, task, initialState, fallbackFontDict, cssFontInfo).catch(reason => { + warn(`loadXfaFonts: "${reason}".`); + return null; }); const promises = []; - for (const [fontName, font] of fonts) { + for (const [fontName, font] of fontRes) { const descriptor = font.get("FontDescriptor"); if (!(descriptor instanceof Dict)) { continue; } let fontFamily = descriptor.get("FontFamily"); - fontFamily = fontFamily.replaceAll(/[ ]+(\d)/g, "$1"); + fontFamily = fontFamily.replaceAll(/ +(\d)/g, "$1"); const fontWeight = descriptor.get("FontWeight"); const italicAngle = -descriptor.get("ItalicAngle"); const cssFontInfo = { @@ -55628,10 +59673,7 @@ if (!validateCSSFont(cssFontInfo)) { continue; } - promises.push(partialEvaluator.handleSetFont(resources, [Name.get(fontName), 1], null, operatorList, task, initialState, null, cssFontInfo).catch(function (reason) { - warn(`loadXfaFonts: "${reason}".`); - return null; - })); + promises.push(parseFont(fontName, null, cssFontInfo)); } await Promise.all(promises); const missingFonts = this.xfaFactory.setFonts(pdfFonts); @@ -55672,25 +59714,24 @@ italicAngle: 12 }]) { const name = `${missing}-${fontInfo.name}`; - const dict = getXfaFontDict(name); - promises.push(partialEvaluator.handleSetFont(resources, [Name.get(name), 1], null, operatorList, task, initialState, dict, { + promises.push(parseFont(name, getXfaFontDict(name), { fontFamily: missing, fontWeight: fontInfo.fontWeight, italicAngle: fontInfo.italicAngle - }).catch(function (reason) { - warn(`loadXfaFonts: "${reason}".`); - return null; })); } } await Promise.all(promises); this.xfaFactory.appendFonts(pdfFonts, reallyMissingFonts); } - async serializeXfaData(annotationStorage) { + loadXfaResources(handler, task) { + return Promise.all([this.#loadXfaFonts(handler, task).catch(() => {}), this.#loadXfaImages()]); + } + serializeXfaData(annotationStorage) { return this.xfaFactory ? this.xfaFactory.serializeData(annotationStorage) : null; } get version() { - return this.catalog.version || this._version; + return this.catalog.version || this.#version; } get formInfo() { const formInfo = { @@ -55699,7 +59740,9 @@ hasXfa: false, hasSignatures: false }; - const acroForm = this.catalog.acroForm; + const { + acroForm + } = this.catalog; if (!acroForm) { return shadow(this, "formInfo", formInfo); } @@ -55711,7 +59754,7 @@ formInfo.hasXfa = Array.isArray(xfa) && xfa.length > 0 || xfa instanceof BaseStream && !xfa.isEmpty; const sigFlags = acroForm.get("SigFlags"); const hasSignatures = !!(sigFlags & 0x1); - const hasOnlyDocumentSignatures = hasSignatures && this._hasOnlyDocumentSignatures(fields); + const hasOnlyDocumentSignatures = hasSignatures && this.#hasOnlyDocumentSignatures(fields); formInfo.hasAcroForm = hasFields && !hasOnlyDocumentSignatures; formInfo.hasSignatures = hasSignatures; } catch (ex) { @@ -55723,19 +59766,24 @@ return shadow(this, "formInfo", formInfo); } get documentInfo() { + const { + catalog, + formInfo, + xref + } = this; const docInfo = { PDFFormatVersion: this.version, - Language: this.catalog.lang, - EncryptFilterName: this.xref.encrypt ? this.xref.encrypt.filterName : null, + Language: catalog.lang, + EncryptFilterName: xref.encrypt?.filterName ?? null, IsLinearized: !!this.linearization, - IsAcroFormPresent: this.formInfo.hasAcroForm, - IsXFAPresent: this.formInfo.hasXfa, - IsCollectionPresent: !!this.catalog.collection, - IsSignaturesPresent: this.formInfo.hasSignatures + IsAcroFormPresent: formInfo.hasAcroForm, + IsXFAPresent: formInfo.hasXfa, + IsCollectionPresent: !!catalog.collection, + IsSignaturesPresent: formInfo.hasSignatures }; let infoDict; try { - infoDict = this.xref.trailer.get("Info"); + infoDict = xref.trailer.get("Info"); } catch (err) { if (err instanceof MissingDataException) { throw err; @@ -55745,8 +59793,7 @@ if (!(infoDict instanceof Dict)) { return shadow(this, "documentInfo", docInfo); } - for (const key of infoDict.getKeys()) { - const value = infoDict.get(key); + for (const [key, value] of infoDict) { switch (key) { case "Title": case "Author": @@ -55787,9 +59834,7 @@ warn(`Bad value, for custom key "${key}", in Info: ${value}.`); continue; } - if (!docInfo.Custom) { - docInfo.Custom = Object.create(null); - } + docInfo.Custom ??= Object.create(null); docInfo.Custom[key] = customValue; continue; } @@ -55798,30 +59843,24 @@ return shadow(this, "documentInfo", docInfo); } get fingerprints() { + const FINGERPRINT_FIRST_BYTES = 1024; + const EMPTY_FINGERPRINT = "\x00".repeat(16); function validate(data) { - return typeof data === "string" && data.length > 0 && data !== EMPTY_FINGERPRINT; + return typeof data === "string" && data.length === 16 && data !== EMPTY_FINGERPRINT; } - function hexString(hash) { - const buf = []; - for (const num of hash) { - const hex = num.toString(16); - buf.push(hex.padStart(2, "0")); - } - return buf.join(""); - } - const idArray = this.xref.trailer.get("ID"); + const id = this.xref.trailer.get("ID"); let hashOriginal, hashModified; - if (Array.isArray(idArray) && validate(idArray[0])) { - hashOriginal = stringToBytes(idArray[0]); - if (idArray[1] !== idArray[0] && validate(idArray[1])) { - hashModified = stringToBytes(idArray[1]); + if (Array.isArray(id) && validate(id[0])) { + hashOriginal = stringToBytes(id[0]); + if (id[1] !== id[0] && validate(id[1])) { + hashModified = stringToBytes(id[1]); } } else { hashOriginal = calculateMD5(this.stream.getByteRange(0, FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES); } - return shadow(this, "fingerprints", [hexString(hashOriginal), hashModified ? hexString(hashModified) : null]); + return shadow(this, "fingerprints", [hashOriginal.toHex(), hashModified?.toHex() ?? null]); } - async _getLinearizationPage(pageIndex) { + async #getLinearizationPage(pageIndex) { const { catalog, linearization, @@ -55835,7 +59874,7 @@ if (type instanceof Ref) { type = await xref.fetchAsync(type); } - if (isName(type, "Page") || !obj.has("Type") && !obj.has("Kids")) { + if (isName(type, "Page") || !obj.has("Type") && !obj.has("Kids") && obj.has("Contents")) { if (!catalog.pageKidsCountCache.has(ref)) { catalog.pageKidsCountCache.put(ref, 1); } @@ -55852,7 +59891,7 @@ } } getPage(pageIndex) { - const cachedPromise = this._pagePromises.get(pageIndex); + const cachedPromise = this.#pagePromises.get(pageIndex); if (cachedPromise) { return cachedPromise; } @@ -55865,28 +59904,27 @@ if (xfaFactory) { promise = Promise.resolve([Dict.empty, null]); } else if (linearization?.pageFirst === pageIndex) { - promise = this._getLinearizationPage(pageIndex); + promise = this.#getLinearizationPage(pageIndex); } else { promise = catalog.getPageDict(pageIndex); } - promise = promise.then(([pageDict, ref]) => { - return new Page({ - pdfManager: this.pdfManager, - xref: this.xref, - pageIndex, - pageDict, - ref, - globalIdFactory: this._globalIdFactory, - fontCache: catalog.fontCache, - builtInCMapCache: catalog.builtInCMapCache, - standardFontDataCache: catalog.standardFontDataCache, - globalImageCache: catalog.globalImageCache, - systemFontCache: catalog.systemFontCache, - nonBlendModesSet: catalog.nonBlendModesSet, - xfaFactory - }); - }); - this._pagePromises.set(pageIndex, promise); + promise = promise.then(([pageDict, ref]) => new Page({ + pdfManager: this.pdfManager, + xref: this.xref, + pageIndex, + pageDict, + ref, + globalIdFactory: this._globalIdFactory, + fontCache: catalog.fontCache, + builtInCMapCache: catalog.builtInCMapCache, + standardFontDataCache: catalog.standardFontDataCache, + globalColorSpaceCache: catalog.globalColorSpaceCache, + globalImageCache: catalog.globalImageCache, + systemFontCache: catalog.systemFontCache, + nonBlendModesSet: catalog.nonBlendModesSet, + xfaFactory + })); + this.#pagePromises.set(pageIndex, promise); return promise; } async checkFirstPage(recoveryMode = false) { @@ -55897,7 +59935,7 @@ await this.getPage(0); } catch (reason) { if (reason instanceof XRefEntryException) { - this._pagePromises.delete(0); + this.#pagePromises.delete(0); await this.cleanup(); throw new XRefParseException(); } @@ -55926,7 +59964,7 @@ } await this.getPage(numPages - 1); } catch (reason) { - this._pagePromises.delete(numPages - 1); + this.#pagePromises.delete(numPages - 1); await this.cleanup(); if (reason instanceof XRefEntryException && !recoveryMode) { throw new XRefParseException(); @@ -55958,24 +59996,34 @@ fontCache: catalog.fontCache, builtInCMapCache: catalog.builtInCMapCache, standardFontDataCache: catalog.standardFontDataCache, + globalColorSpaceCache: this.globalColorSpaceCache, globalImageCache: catalog.globalImageCache, systemFontCache: catalog.systemFontCache, nonBlendModesSet: catalog.nonBlendModesSet, xfaFactory: null })); } - this._pagePromises.set(pageIndex, promise); + this.#pagePromises.set(pageIndex, promise); } catalog.setActualNumPages(pagesTree.size); } } - fontFallback(id, handler) { - return this.catalog.fontFallback(id, handler); + async fontFallback(id, handler) { + const { + catalog, + pdfManager + } = this; + for (const translatedFont of await Promise.all(catalog.fontCache)) { + if (translatedFont.loadedName === id) { + translatedFont.fallback(handler, pdfManager.evaluatorOptions); + return; + } + } } async cleanup(manuallyTriggered = false) { return this.catalog ? this.catalog.cleanup(manuallyTriggered) : clearGlobalCaches(); } - async #collectFieldObjects(name, fieldRef, promises, annotationGlobals, visitedRefs) { + async #collectFieldObjects(name, parentRef, fieldRef, promises, annotationGlobals, visitedRefs, orphanFields) { const { xref } = this; @@ -55987,13 +60035,19 @@ if (!(field instanceof Dict)) { return; } + let subtype = await field.getAsync("Subtype"); + subtype = subtype instanceof Name ? subtype.name : null; + switch (subtype) { + case "Link": + return; + } if (field.has("T")) { const partName = stringToPDFString(await field.getAsync("T")); name = name === "" ? partName : `${name}.${partName}`; } else { let obj = field; while (true) { - obj = obj.getRaw("Parent"); + obj = obj.getRaw("Parent") || parentRef; if (obj instanceof Ref) { if (visitedRefs.has(obj)) { break; @@ -56010,10 +60064,10 @@ } } } - if (!promises.has(name)) { - promises.set(name, []); + if (parentRef && !field.has("Parent") && isName(field.get("Subtype"), "Widget")) { + orphanFields.put(fieldRef, parentRef); } - promises.get(name).push(AnnotationFactory.create(xref, fieldRef, annotationGlobals, null, true, null).then(annotation => annotation?.getFieldObject()).catch(function (reason) { + promises.getOrInsertComputed(name, makeArr).push(AnnotationFactory.create(xref, fieldRef, annotationGlobals, null, true, orphanFields, null, null).then(annotation => annotation?.getFieldObject()).catch(function (reason) { warn(`#collectFieldObjects: "${reason}".`); return null; })); @@ -56023,23 +60077,28 @@ const kids = await field.getAsync("Kids"); if (Array.isArray(kids)) { for (const kid of kids) { - await this.#collectFieldObjects(name, kid, promises, annotationGlobals, visitedRefs); + await this.#collectFieldObjects(name, fieldRef, kid, promises, annotationGlobals, visitedRefs, orphanFields); } } } get fieldObjects() { - if (!this.formInfo.hasFields) { - return shadow(this, "fieldObjects", Promise.resolve(null)); - } - const promise = Promise.all([this.pdfManager.ensureDoc("annotationGlobals"), this.pdfManager.ensureCatalog("acroForm")]).then(async ([annotationGlobals, acroForm]) => { + const promise = this.pdfManager.ensureDoc("formInfo").then(async formInfo => { + if (!formInfo.hasFields) { + return null; + } + const annotationGlobals = await this.annotationGlobals; if (!annotationGlobals) { return null; } + const { + acroForm + } = annotationGlobals; const visitedRefs = new RefSet(); const allFields = Object.create(null); const fieldPromises = new Map(); - for (const fieldRef of await acroForm.getAsync("Fields")) { - await this.#collectFieldObjects("", fieldRef, fieldPromises, annotationGlobals, visitedRefs); + const orphanFields = new RefSetCache(); + for (const fieldRef of acroForm.get("Fields")) { + await this.#collectFieldObjects("", null, fieldRef, fieldPromises, annotationGlobals, visitedRefs, orphanFields); } const allPromises = []; for (const [name, promises] of fieldPromises) { @@ -56051,7 +60110,10 @@ })); } await Promise.all(allPromises); - return allFields; + return { + allFields: objectSize(allFields) > 0 ? allFields : null, + orphanFields + }; }); return shadow(this, "fieldObjects", promise); } @@ -56064,17 +60126,13 @@ if (catalogJsActions) { return true; } - if (fieldObjects) { - return Object.values(fieldObjects).some(fieldObject => fieldObject.some(object => object.actions !== null)); + if (fieldObjects?.allFields) { + return Object.values(fieldObjects.allFields).some(fieldObject => fieldObject.some(object => object.actions !== null)); } return false; } get calculationOrderIds() { - const acroForm = this.catalog.acroForm; - if (!acroForm?.has("CO")) { - return shadow(this, "calculationOrderIds", null); - } - const calculationOrder = acroForm.get("CO"); + const calculationOrder = this.catalog.acroForm?.get("CO"); if (!Array.isArray(calculationOrder) || calculationOrder.length === 0) { return shadow(this, "calculationOrderIds", null); } @@ -56084,17 +60142,24 @@ ids.push(id.toString()); } } - if (ids.length === 0) { - return shadow(this, "calculationOrderIds", null); - } - return shadow(this, "calculationOrderIds", ids); + return shadow(this, "calculationOrderIds", ids.length ? ids : null); } get annotationGlobals() { return shadow(this, "annotationGlobals", AnnotationFactory.createGlobals(this.pdfManager)); } + async toJSObject(value, firstCall = true) { + throw new Error("Not implemented: toJSObject"); + } } -;// CONCATENATED MODULE: ./src/core/pdf_manager.js +;// ./src/core/pdf_manager.js + + + + + + + @@ -56111,16 +60176,33 @@ return null; } class BasePdfManager { - constructor(args) { - if (this.constructor === BasePdfManager) { - unreachable("Cannot initialize BasePdfManager."); - } - this._docBaseUrl = parseDocBaseUrl(args.docBaseUrl); - this._docId = args.docId; - this._password = args.password; - this.enableXfa = args.enableXfa; - args.evaluatorOptions.isOffscreenCanvasSupported &&= FeatureTest.isOffscreenCanvasSupported; - this.evaluatorOptions = args.evaluatorOptions; + constructor({ + docBaseUrl, + docId, + enableXfa, + evaluatorOptions, + handler, + password + }) { + this._docBaseUrl = parseDocBaseUrl(docBaseUrl); + this._docId = docId; + this._password = password; + this.enableXfa = enableXfa; + evaluatorOptions.isOffscreenCanvasSupported &&= FeatureTest.isOffscreenCanvasSupported; + evaluatorOptions.isImageDecoderSupported &&= FeatureTest.isImageDecoderSupported; + this.evaluatorOptions = Object.freeze(evaluatorOptions); + ImageResizer.setOptions(evaluatorOptions); + JpegStream.setOptions(evaluatorOptions); + OperatorList.setOptions(evaluatorOptions); + const options = { + ...evaluatorOptions, + handler + }; + IccColorSpace.setOptions(options); + CmykICCBasedCS.setOptions(options); + PDFFunctionFactory.setOptions(options); + Pattern.setOptions(options); + WasmImage.setOptions(options); } get docId() { return this._docId; @@ -56131,9 +60213,6 @@ get docBaseUrl() { return this._docBaseUrl; } - get catalog() { - return this.pdfDocument.catalog; - } ensureDoc(prop, args) { return this.ensure(this.pdfDocument, prop, args); } @@ -56143,21 +60222,19 @@ ensureCatalog(prop, args) { return this.ensure(this.pdfDocument.catalog, prop, args); } + async initDocument(recoveryMode) { + await this.ensureDoc("checkHeader"); + await this.ensureDoc("parseStartXRef"); + await this.ensureDoc("parse", [recoveryMode]); + await this.ensureDoc("checkFirstPage", [recoveryMode]); + await this.ensureDoc("checkLastPage", [recoveryMode]); + } getPage(pageIndex) { return this.pdfDocument.getPage(pageIndex); } fontFallback(id, handler) { return this.pdfDocument.fontFallback(id, handler); } - loadXfaFonts(handler, task) { - return this.pdfDocument.loadXfaFonts(handler, task); - } - loadXfaImages() { - return this.pdfDocument.loadXfaImages(); - } - serializeXfaData(annotationStorage) { - return this.pdfDocument.serializeXfaData(annotationStorage); - } cleanup(manuallyTriggered = false) { return this.pdfDocument.cleanup(manuallyTriggered); } @@ -56175,6 +60252,7 @@ } updatePassword(password) { this._password = password; + this.pdfDocument.xref.encrypt?.setPassword(password); } terminate(reason) { unreachable("Abstract method `terminate` called"); @@ -56217,7 +60295,7 @@ try { const value = obj[prop]; if (typeof value === "function") { - return value.apply(obj, args); + return await value.apply(obj, args); } return value; } catch (ex) { @@ -56244,15 +60322,13 @@ } } -;// CONCATENATED MODULE: ./src/shared/message_handler.js +;// ./src/shared/message_handler.js const CallbackKind = { - UNKNOWN: 0, DATA: 1, ERROR: 2 }; const StreamKind = { - UNKNOWN: 0, CANCEL: 1, CANCEL_COMPLETE: 2, CLOSE: 3, @@ -56262,26 +60338,30 @@ PULL_COMPLETE: 7, START_COMPLETE: 8 }; -function wrapReason(reason) { - if (!(reason instanceof Error || typeof reason === "object" && reason !== null)) { +function onFn() {} +function wrapReason(ex) { + if (ex instanceof AbortException || ex instanceof InvalidPDFException || ex instanceof PasswordException || ex instanceof ResponseException || ex instanceof UnknownErrorException) { + return ex; + } + if (!(ex instanceof Error || typeof ex === "object" && ex !== null)) { unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.'); } - switch (reason.name) { + switch (ex.name) { case "AbortException": - return new AbortException(reason.message); - case "MissingPDFException": - return new MissingPDFException(reason.message); + return new AbortException(ex.message); + case "InvalidPDFException": + return new InvalidPDFException(ex.message); case "PasswordException": - return new PasswordException(reason.message, reason.code); - case "UnexpectedResponseException": - return new UnexpectedResponseException(reason.message, reason.status); + return new PasswordException(ex.message, ex.code); + case "ResponseException": + return new ResponseException(ex.message, ex.status, ex.missing); case "UnknownErrorException": - return new UnknownErrorException(reason.message, reason.details); - default: - return new UnknownErrorException(reason.message, reason.toString()); + return new UnknownErrorException(ex.message, ex.details); } + return new UnknownErrorException(ex.message, ex.toString()); } class MessageHandler { + #messageAC = new AbortController(); constructor(sourceName, targetName, comObj) { this.sourceName = sourceName; this.targetName = targetName; @@ -56292,66 +60372,68 @@ this.streamControllers = Object.create(null); this.callbackCapabilities = Object.create(null); this.actionHandler = Object.create(null); - this._onComObjOnMessage = event => { - const data = event.data; - if (data.targetName !== this.sourceName) { - return; - } - if (data.stream) { - this.#processStreamMessage(data); - return; + comObj.addEventListener("message", this.#onMessage.bind(this), { + signal: this.#messageAC.signal + }); + } + #onMessage({ + data + }) { + if (data.targetName !== this.sourceName) { + return; + } + if (data.stream) { + this.#processStreamMessage(data); + return; + } + if (data.callback) { + const callbackId = data.callbackId; + const capability = this.callbackCapabilities[callbackId]; + if (!capability) { + throw new Error(`Cannot resolve callback ${callbackId}`); } - if (data.callback) { - const callbackId = data.callbackId; - const capability = this.callbackCapabilities[callbackId]; - if (!capability) { - throw new Error(`Cannot resolve callback ${callbackId}`); - } - delete this.callbackCapabilities[callbackId]; - if (data.callback === CallbackKind.DATA) { - capability.resolve(data.data); - } else if (data.callback === CallbackKind.ERROR) { - capability.reject(wrapReason(data.reason)); - } else { - throw new Error("Unexpected callback case"); - } - return; + delete this.callbackCapabilities[callbackId]; + if (data.callback === CallbackKind.DATA) { + capability.resolve(data.data); + } else if (data.callback === CallbackKind.ERROR) { + capability.reject(wrapReason(data.reason)); + } else { + throw new Error("Unexpected callback case"); } - const action = this.actionHandler[data.action]; - if (!action) { - throw new Error(`Unknown action from worker: ${data.action}`); - } - if (data.callbackId) { - const cbSourceName = this.sourceName; - const cbTargetName = data.sourceName; - new Promise(function (resolve) { - resolve(action(data.data)); - }).then(function (result) { - comObj.postMessage({ - sourceName: cbSourceName, - targetName: cbTargetName, - callback: CallbackKind.DATA, - callbackId: data.callbackId, - data: result - }); - }, function (reason) { - comObj.postMessage({ - sourceName: cbSourceName, - targetName: cbTargetName, - callback: CallbackKind.ERROR, - callbackId: data.callbackId, - reason: wrapReason(reason) - }); + return; + } + const action = this.actionHandler[data.action]; + if (!action) { + throw new Error(`Unknown action from worker: ${data.action}`); + } + if (data.callbackId) { + const sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + Promise.try(action, data.data).then(function (result) { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.DATA, + callbackId: data.callbackId, + data: result }); - return; - } - if (data.streamId) { - this.#createStreamSink(data); - return; - } - action(data.data); - }; - comObj.addEventListener("message", this._onComObjOnMessage); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.ERROR, + callbackId: data.callbackId, + reason: wrapReason(reason) + }); + }); + return; + } + if (data.streamId) { + this.#createStreamSink(data); + return; + } + action(data.data); } on(actionName, handler) { const ah = this.actionHandler; @@ -56501,9 +60583,7 @@ streamSink.sinkCapability.resolve(); streamSink.ready = streamSink.sinkCapability.promise; this.streamSinks[streamId] = streamSink; - new Promise(function (resolve) { - resolve(action(data.data, streamSink)); - }).then(function () { + Promise.try(action, data.data, streamSink).then(function () { comObj.postMessage({ sourceName, targetName, @@ -56558,9 +60638,7 @@ streamSink.sinkCapability.resolve(); } streamSink.desiredSize = data.desiredSize; - new Promise(function (resolve) { - resolve(streamSink.onPull?.()); - }).then(function () { + Promise.try(streamSink.onPull || onFn).then(function () { comObj.postMessage({ sourceName, targetName, @@ -56611,9 +60689,8 @@ if (!streamSink) { break; } - new Promise(function (resolve) { - resolve(streamSink.onCancel?.(wrapReason(data.reason))); - }).then(function () { + const dataReason = wrapReason(data.reason); + Promise.try(streamSink.onCancel || onFn, dataReason).then(function () { comObj.postMessage({ sourceName, targetName, @@ -56630,7 +60707,7 @@ reason: wrapReason(reason) }); }); - streamSink.sinkCapability.reject(wrapReason(data.reason)); + streamSink.sinkCapability.reject(dataReason); streamSink.isCancelled = true; delete this.streamSinks[streamId]; break; @@ -56643,62 +60720,2878 @@ delete this.streamControllers[streamId]; } destroy() { - this.comObj.removeEventListener("message", this._onComObjOnMessage); + this.#messageAC?.abort(); + this.#messageAC = null; + } +} + +;// ./src/core/writer.js + + + + + + + +async function writeObject(ref, obj, buffer, { + encrypt = null, + encryptRef = null +}) { + const transform = encrypt && encryptRef !== ref ? encrypt.createCipherTransform(ref.num, ref.gen) : null; + buffer.push(`${ref.num} ${ref.gen} obj\n`); + await writeValue(obj, buffer, transform); + buffer.push("\nendobj\n"); +} +async function writeDict(dict, buffer, transform) { + buffer.push("<<"); + for (const [key, rawObj] of dict.getRawEntries()) { + buffer.push(` /${escapePDFName(key)} `); + await writeValue(rawObj, buffer, transform); + } + buffer.push(">>"); +} +async function writeStream(stream, buffer, transform) { + stream = stream.getOriginalStream(); + stream.reset(); + let bytes = stream.getBytes(); + const { + dict + } = stream; + const [filter, params] = await Promise.all([dict.getAsync("Filter"), dict.getAsync("DecodeParms")]); + const filterZero = Array.isArray(filter) ? await dict.xref.fetchIfRefAsync(filter[0]) : filter; + const isFilterZeroFlateDecode = isName(filterZero, "FlateDecode"); + const isFilterZeroImageDecode = isName(filterZero, "DCTDecode") || isName(filterZero, "JPXDecode") || isName(filterZero, "JBIG2Decode") || isName(filterZero, "CCITTFaxDecode") || isName(filterZero, "LZWDecode"); + const isFilterZeroCompressedObject = isFilterZeroFlateDecode || isFilterZeroImageDecode || isName(filterZero, "BrotliDecode"); + const MIN_LENGTH_FOR_COMPRESSING = 256; + if (!isFilterZeroCompressedObject && bytes.length >= MIN_LENGTH_FOR_COMPRESSING) { + try { + const cs = new CompressionStream("deflate"); + const writer = cs.writable.getWriter(); + await writer.ready; + writer.write(bytes).then(async () => { + await writer.ready; + await writer.close(); + }).catch(() => {}); + bytes = await new Response(cs.readable).bytes(); + let newFilter, newParams; + if (!filter) { + newFilter = Name.get("FlateDecode"); + } else if (!isFilterZeroFlateDecode) { + newFilter = Array.isArray(filter) ? [Name.get("FlateDecode"), ...filter] : [Name.get("FlateDecode"), filter]; + if (params) { + newParams = Array.isArray(params) ? [null, ...params] : [null, params]; + } + } + if (newFilter) { + dict.set("Filter", newFilter); + } + if (newParams) { + dict.set("DecodeParms", newParams); + } + } catch (ex) { + info(`writeStream - cannot compress data: "${ex}".`); + } + } + let string = bytesToString(bytes); + if (transform) { + string = transform.encryptString(string); + } + dict.set("Length", string.length); + await writeDict(dict, buffer, transform); + buffer.push(" stream\n", string, "\nendstream"); +} +async function writeArray(array, buffer, transform) { + buffer.push("["); + for (let i = 0, ii = array.length; i < ii; i++) { + await writeValue(array[i], buffer, transform); + if (i < ii - 1) { + buffer.push(" "); + } + } + buffer.push("]"); +} +async function writeValue(value, buffer, transform) { + if (value instanceof Name) { + buffer.push(`/${escapePDFName(value.name)}`); + } else if (value instanceof Ref) { + buffer.push(`${value.num} ${value.gen} R`); + } else if (Array.isArray(value) || ArrayBuffer.isView(value)) { + await writeArray(value, buffer, transform); + } else if (typeof value === "string") { + if (transform) { + value = transform.encryptString(value); + } + buffer.push(`(${escapeString(value)})`); + } else if (typeof value === "number") { + buffer.push(value.toFixed(10).replace(/\.?0+$/, "")); + } else if (typeof value === "boolean") { + buffer.push(value.toString()); + } else if (value instanceof Dict) { + await writeDict(value, buffer, transform); + } else if (value instanceof BaseStream) { + await writeStream(value, buffer, transform); + } else if (value === null) { + buffer.push("null"); + } else { + warn(`Unhandled value in writer: ${typeof value}, please file a bug.`); + } +} +function writeInt(number, size, offset, buffer) { + for (let i = size + offset - 1; i > offset - 1; i--) { + buffer[i] = number & 0xff; + number >>= 8; + } + return offset + size; +} +function writeString(string, offset, buffer) { + const ii = string.length; + for (let i = 0; i < ii; i++) { + buffer[offset + i] = string.charCodeAt(i) & 0xff; + } + return offset + ii; +} +function computeMD5(filesize, xrefInfo) { + const time = Math.floor(Date.now() / 1000); + const filename = xrefInfo.filename || ""; + const md5Buffer = [time.toString(), filename, filesize.toString(), ...xrefInfo.infoMap.values()]; + const md5BufferLen = Math.sumPrecise(md5Buffer.map(str => str.length)); + const array = new Uint8Array(md5BufferLen); + let offset = 0; + for (const str of md5Buffer) { + offset = writeString(str, offset, array); + } + return bytesToString(calculateMD5(array, 0, array.length)); +} +function writeXFADataForAcroform(str, changes) { + const xml = new SimpleXMLParser({ + hasAttributes: true + }).parseFromString(str); + for (const { + xfa + } of changes) { + if (!xfa) { + continue; + } + const { + path, + value + } = xfa; + if (!path) { + continue; + } + const nodePath = parseXFAPath(path); + let node = xml.documentElement.searchNode(nodePath, 0); + if (!node && nodePath.length > 1) { + node = xml.documentElement.searchNode([nodePath.at(-1)], 0); + } + if (node) { + node.childNodes = Array.isArray(value) ? value.map(val => new SimpleDOMNode("value", val)) : [new SimpleDOMNode("#text", value)]; + } else { + warn(`Node not found for path: ${path}`); + } + } + const buffer = []; + xml.documentElement.dump(buffer); + return buffer.join(""); +} +async function updateAcroform({ + xref, + acroForm, + acroFormRef, + hasXfa, + hasXfaDatasetsEntry, + xfaDatasetsRef, + needAppearances, + changes +}) { + if (hasXfa && !hasXfaDatasetsEntry && !xfaDatasetsRef) { + warn("XFA - Cannot save it"); + } + if (!needAppearances && (!hasXfa || !xfaDatasetsRef || hasXfaDatasetsEntry)) { + return; + } + const dict = acroForm.clone(); + if (hasXfa && !hasXfaDatasetsEntry) { + const newXfa = acroForm.get("XFA").slice(); + newXfa.splice(2, 0, "datasets"); + newXfa.splice(3, 0, xfaDatasetsRef); + dict.set("XFA", newXfa); + } + if (needAppearances) { + dict.set("NeedAppearances", true); + } + changes.put(acroFormRef, { + data: dict + }); +} +function updateXFA({ + xfaData, + xfaDatasetsRef, + changes, + xref +}) { + if (xfaData === null) { + const datasets = xref.fetchIfRef(xfaDatasetsRef); + xfaData = writeXFADataForAcroform(datasets.getString(), changes); + } + const xfaDataStream = new StringStream(xfaData, new Dict(xref)); + xfaDataStream.dict.setIfName("Type", "EmbeddedFile"); + changes.put(xfaDatasetsRef, { + data: xfaDataStream + }); +} +async function getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer) { + buffer.push("xref\n"); + const indexes = getIndexes(newRefs); + let indexesPosition = 0; + for (const { + ref, + data + } of newRefs) { + if (ref.num === indexes[indexesPosition]) { + buffer.push(`${indexes[indexesPosition]} ${indexes[indexesPosition + 1]}\n`); + indexesPosition += 2; + } + if (data !== null) { + buffer.push(`${baseOffset.toString().padStart(10, "0")} ${Math.min(ref.gen, 0xffff).toString().padStart(5, "0")} n\r\n`); + baseOffset += data.length; + } else { + buffer.push(`0000000000 ${Math.min(ref.gen + 1, 0xffff).toString().padStart(5, "0")} f\r\n`); + } + } + computeIDs(baseOffset, xrefInfo, newXref); + buffer.push("trailer\n"); + await writeDict(newXref, buffer, null); + buffer.push("\nstartxref\n", baseOffset.toString(), "\n%%EOF\n"); +} +function getIndexes(newRefs) { + const indexes = []; + for (const { + ref + } of newRefs) { + if (ref.num === indexes.at(-2) + indexes.at(-1)) { + indexes[indexes.length - 1] += 1; + } else { + indexes.push(ref.num, 1); + } + } + return indexes; +} +async function getXRefStreamTable(xrefInfo, baseOffset, newRefs, newXref, buffer) { + const xrefTableData = []; + let maxOffset = 0; + let maxGen = 0; + for (const { + ref, + data, + objStreamRef, + index + } of newRefs) { + let gen; + maxOffset = Math.max(maxOffset, baseOffset); + if (objStreamRef) { + gen = index; + xrefTableData.push([2, objStreamRef.num, gen]); + } else if (data !== null) { + gen = Math.min(ref.gen, 0xffff); + xrefTableData.push([1, baseOffset, gen]); + baseOffset += data.length; + } else { + gen = Math.min(ref.gen + 1, 0xffff); + xrefTableData.push([0, 0, gen]); + } + maxGen = Math.max(maxGen, gen); + } + newXref.set("Index", getIndexes(newRefs)); + const offsetSize = getSizeInBytes(maxOffset); + const maxGenSize = getSizeInBytes(maxGen); + const sizes = [1, offsetSize, maxGenSize]; + newXref.set("W", sizes); + computeIDs(baseOffset, xrefInfo, newXref); + const structSize = Math.sumPrecise(sizes); + const data = new Uint8Array(structSize * xrefTableData.length); + const stream = new Stream(data); + stream.dict = newXref; + let offset = 0; + for (const [type, objOffset, gen] of xrefTableData) { + offset = writeInt(type, sizes[0], offset, data); + offset = writeInt(objOffset, sizes[1], offset, data); + offset = writeInt(gen, sizes[2], offset, data); + } + await writeObject(xrefInfo.newRef, stream, buffer, {}); + buffer.push("startxref\n", baseOffset.toString(), "\n%%EOF\n"); +} +function computeIDs(baseOffset, xrefInfo, newXref) { + if (Array.isArray(xrefInfo.fileIds) && xrefInfo.fileIds.length > 0) { + const md5 = computeMD5(baseOffset, xrefInfo); + newXref.set("ID", [xrefInfo.fileIds[0] || md5, md5]); + } +} +function getTrailerDict(xrefInfo, changes, useXrefStream) { + const newXref = new Dict(null); + newXref.setIfDefined("Prev", xrefInfo?.startXRef); + const refForXrefTable = xrefInfo.newRef; + if (useXrefStream) { + changes.put(refForXrefTable, { + data: "" + }); + newXref.set("Size", refForXrefTable.num + 1); + newXref.setIfName("Type", "XRef"); + } else { + newXref.set("Size", refForXrefTable.num); + } + newXref.setIfDefined("Root", xrefInfo?.rootRef); + newXref.setIfDefined("Info", xrefInfo?.infoRef); + newXref.setIfDefined("Encrypt", xrefInfo?.encryptRef); + return newXref; +} +async function writeChanges(changes, xref, buffer = []) { + const newRefs = []; + for (const [ref, { + data, + objStreamRef, + index + }] of changes.items()) { + if (objStreamRef) { + newRefs.push({ + ref, + data, + objStreamRef, + index + }); + continue; + } + if (data === null || typeof data === "string") { + newRefs.push({ + ref, + data + }); + continue; + } + await writeObject(ref, data, buffer, xref); + newRefs.push({ + ref, + data: buffer.join("") + }); + buffer.length = 0; + } + return newRefs.sort((a, b) => a.ref.num - b.ref.num); +} +async function incrementalUpdate({ + originalData, + xrefInfo, + changes, + xref = null, + hasXfa = false, + xfaDatasetsRef = null, + hasXfaDatasetsEntry = false, + needAppearances, + acroFormRef = null, + acroForm = null, + xfaData = null, + useXrefStream = false +}) { + await updateAcroform({ + xref, + acroForm, + acroFormRef, + hasXfa, + hasXfaDatasetsEntry, + xfaDatasetsRef, + needAppearances, + changes + }); + if (hasXfa) { + updateXFA({ + xfaData, + xfaDatasetsRef, + changes, + xref + }); + } + const newXref = getTrailerDict(xrefInfo, changes, useXrefStream); + const buffer = []; + const newRefs = await writeChanges(changes, xref, buffer); + let baseOffset = originalData.length; + const lastByte = originalData.at(-1); + if (lastByte !== 0x0a && lastByte !== 0x0d) { + buffer.push("\n"); + baseOffset += 1; + } + for (const { + data + } of newRefs) { + if (data !== null) { + buffer.push(data); + } + } + await (useXrefStream ? getXRefStreamTable(xrefInfo, baseOffset, newRefs, newXref, buffer) : getXRefTable(xrefInfo, baseOffset, newRefs, newXref, buffer)); + const totalLength = originalData.length + Math.sumPrecise(buffer.map(str => str.length)); + const array = new Uint8Array(totalLength); + array.set(originalData); + let offset = originalData.length; + for (const str of buffer) { + offset = writeString(str, offset, array); } + return array; } -;// CONCATENATED MODULE: ./src/core/worker_stream.js +;// ./src/core/editor/pdf_editor.js + + + + + + + + + + + + +const MAX_LEAVES_PER_PAGES_NODE = 16; +const MAX_IN_NAME_TREE_NODE = 64; +class PageData { + constructor(page, documentData) { + this.page = page; + this.documentData = documentData; + this.annotations = null; + this.pointingNamedDestinations = null; + documentData.pagesMap.put(page.ref, this); + } +} +class DocumentData { + constructor(document) { + this.document = document; + this.destinations = null; + this.pageLabels = null; + this.pagesMap = new RefSetCache(); + this.oldRefMapping = new RefSetCache(); + this.dedupNamedDestinations = new Map(); + this.usedNamedDestinations = new Set(); + this.postponedRefCopies = new RefSetCache(); + this.resourceStreamPromises = new Map(); + this.usedStructParents = new Set(); + this.oldStructParentMapping = new Map(); + this.structTreeRoot = null; + this.parentTree = null; + this.idTree = null; + this.roleMap = null; + this.classMap = null; + this.namespaces = null; + this.structTreeAF = null; + this.structTreePronunciationLexicon = []; + this.acroForm = null; + this.acroFormDefaultAppearance = ""; + this.acroFormDefaultResources = null; + this.acroFormQ = 0; + this.hasSignatureAnnotations = false; + this.fieldToParent = new RefSetCache(); + this.outline = null; + this.embeddedFiles = null; + } +} +class XRefWrapper { + constructor(entries, getNewRef) { + this.entries = entries; + this._getNewRef = getNewRef; + } + getNewTemporaryRef() { + return this._getNewRef(); + } + fetchIfRef(obj) { + return obj instanceof Ref ? this.fetch(obj) : obj; + } + fetch(ref) { + if (!(ref instanceof Ref)) { + throw new Error("ref object is not a reference"); + } + return this.entries[ref.num]; + } + async fetchIfRefAsync(obj) { + return obj instanceof Ref ? this.fetchAsync(obj) : obj; + } + async fetchAsync(ref) { + return this.fetch(ref); + } +} +class PDFEditor { + isSingleFile = false; + #newAnnotationsParams = null; + #primaryDocument = null; + #resourceStreamCache = new Map(); + currentDocument = null; + oldPages = []; + newPages = []; + xref = [null]; + xrefWrapper = new XRefWrapper(this.xref, () => this.newRef); + newRefCount = 1; + namesDict = null; + version = "1.7"; + pageLabels = null; + namedDestinations = new Map(); + parentTree = new Map(); + structTreeKids = []; + idTree = new Map(); + classMap = new Dict(); + roleMap = new Dict(); + namespaces = new Map(); + structTreeAF = []; + structTreePronunciationLexicon = []; + fields = []; + acroFormDefaultAppearance = ""; + acroFormDefaultResources = null; + acroFormNeedAppearances = false; + acroFormSigFlags = 0; + acroFormCalculationOrder = null; + acroFormQ = 0; + outlineItems = null; + embeddedFiles = new Map(); + constructor({ + useObjectStreams = true, + title = "", + author = "" + } = {}) { + [this.rootRef, this.rootDict] = this.newDict; + [this.infoRef, this.infoDict] = this.newDict; + [this.pagesRef, this.pagesDict] = this.newDict; + this.useObjectStreams = useObjectStreams; + this.objStreamRefs = useObjectStreams ? new Set() : null; + this.title = title; + this.author = author; + } + get newRef() { + return Ref.get(this.newRefCount++, 0); + } + get newDict() { + const ref = this.newRef; + const dict = this.xref[ref.num] = new Dict(); + return [ref, dict]; + } + async #cloneObject(obj, xref) { + const ref = this.newRef; + this.xref[ref.num] = await this.#collectDependencies(obj, true, xref); + return ref; + } + cloneDict(dict) { + const newDict = dict.clone(); + newDict.xref = this.xrefWrapper; + return newDict; + } + async #collectDependencies(obj, mustClone, xref, resourceStreamPath = new RefSet()) { + if (obj instanceof Ref) { + const { + currentDocument: { + oldRefMapping + } + } = this; + const existingRef = oldRefMapping.get(obj); + if (existingRef) { + return existingRef; + } + const oldRef = obj; + obj = await xref.fetchAsync(oldRef); + if (typeof obj === "number") { + return obj; + } + if (obj instanceof BaseStream && this.#isResourceStream(obj.dict)) { + return this.#collectResourceStream(oldRef, obj, xref, resourceStreamPath); + } + const newRef = this.newRef; + oldRefMapping.put(oldRef, newRef); + this.xref[newRef.num] = await this.#collectDependencies(obj, true, xref, resourceStreamPath); + return newRef; + } + const promises = []; + const { + currentDocument: { + postponedRefCopies + } + } = this; + if (Array.isArray(obj)) { + if (mustClone) { + obj = obj.slice(); + } + for (let i = 0, ii = obj.length; i < ii; i++) { + const postponedActions = obj[i] instanceof Ref && postponedRefCopies.get(obj[i]); + if (postponedActions) { + postponedActions.push(ref => obj[i] = ref); + continue; + } + promises.push(this.#collectDependencies(obj[i], true, xref, resourceStreamPath).then(newObj => obj[i] = newObj)); + } + await Promise.all(promises); + return obj; + } + let dict; + if (obj instanceof BaseStream) { + ({ + dict + } = obj = obj.getOriginalStream().clone()); + dict.xref = this.xrefWrapper; + } else if (obj instanceof Dict) { + if (mustClone) { + obj = obj.clone(); + obj.xref = this.xrefWrapper; + } + dict = obj; + } + if (dict) { + for (const [key, rawObj] of dict.getRawEntries()) { + const postponedActions = rawObj instanceof Ref && postponedRefCopies.get(rawObj); + if (postponedActions) { + postponedActions.push(ref => dict.set(key, ref)); + continue; + } + promises.push(this.#collectDependencies(rawObj, true, xref, resourceStreamPath).then(newObj => dict.set(key, newObj))); + } + await Promise.all(promises); + } + return obj; + } + #isResourceStream(dict) { + const subtype = dict.get("Subtype"); + return isName(subtype, "Image") || dict.has("Length1") || isName(subtype, "Type1C") || isName(subtype, "CIDFontType0C") || isName(subtype, "OpenType"); + } + #rawStreamBytes(stream) { + const original = stream.getOriginalStream(); + original.reset(); + return original.getBytes(); + } + async #serializeDict(dict) { + const buffer = []; + await writeValue(dict, buffer, null); + return buffer.join(""); + } + #resourceStreamKey(dictStr, bytes) { + const SAMPLE_SIZE = 256; + const SAMPLE_COUNT = 4; + const { + length + } = bytes; + const hash = new MurmurHash3_64(); + hash.update(dictStr); + hash.update(`#${length}`); + if (length <= SAMPLE_SIZE * SAMPLE_COUNT) { + hash.update(bytes); + } else { + const step = Math.floor((length - SAMPLE_SIZE) / (SAMPLE_COUNT - 1)); + for (let i = 0; i < SAMPLE_COUNT; i++) { + const start = Math.min(i * step, length - SAMPLE_SIZE); + hash.update(bytes.subarray(start, start + SAMPLE_SIZE)); + } + } + return hash.hexdigest(); + } + async #collectResourceStream(oldRef, stream, xref, resourceStreamPath) { + const { + currentDocument: { + oldRefMapping, + resourceStreamPromises + } + } = this; + if (resourceStreamPath.has(oldRef)) { + let ref = oldRefMapping.get(oldRef); + if (!ref) { + ref = this.newRef; + oldRefMapping.put(oldRef, ref); + } + return ref; + } + const key = oldRef.toString(); + const pending = resourceStreamPromises.get(key); + if (pending) { + return pending; + } + const childPath = new RefSet(resourceStreamPath); + childPath.put(oldRef); + const promise = Promise.resolve().then(async () => { + const collected = await this.#collectDependencies(stream, true, xref, childPath); + const cycleRef = oldRefMapping.get(oldRef); + if (cycleRef) { + this.xref[cycleRef.num] = collected; + return cycleRef; + } + const ref = await this.#dedupResourceStream(collected); + oldRefMapping.put(oldRef, ref); + return ref; + }); + resourceStreamPromises.set(key, promise); + try { + return await promise; + } finally { + if (resourceStreamPromises.get(key) === promise) { + resourceStreamPromises.delete(key); + } + } + } + async #dedupResourceStream(stream) { + const dictStr = await this.#serializeDict(stream.dict); + const bytes = this.#rawStreamBytes(stream); + const key = this.#resourceStreamKey(dictStr, bytes); + const bucket = this.#resourceStreamCache.getOrInsertComputed(key, makeArr); + for (const entry of bucket) { + if (entry.dictStr === dictStr && isArrayEqual(this.#rawStreamBytes(entry.stream), bytes)) { + return entry.ref; + } + } + const ref = this.newRef; + this.xref[ref.num] = stream; + bucket.push({ + ref, + dictStr, + stream + }); + return ref; + } + async #cloneStructTreeNode(parentStructRef, node, xref, removedStructElements, dedupIDs, dedupClasses, dedupRoles, visited = new RefSet()) { + const { + currentDocument: { + pagesMap, + oldRefMapping + } + } = this; + const pg = node.getRaw("Pg"); + if (pg instanceof Ref && !pagesMap.has(pg)) { + return null; + } + let kids; + const k = kids = node.getRaw("K"); + if (k instanceof Ref) { + if (visited.has(k)) { + return null; + } + kids = await xref.fetchAsync(k); + if (!Array.isArray(kids)) { + kids = [k]; + } + } + kids = Array.isArray(kids) ? kids : [kids]; + const newKids = []; + const structElemIndices = []; + for (let kid of kids) { + const kidRef = kid instanceof Ref ? kid : null; + if (kidRef) { + if (visited.has(kidRef)) { + continue; + } + visited.put(kidRef); + kid = await xref.fetchAsync(kidRef); + } + if (typeof kid === "number") { + newKids.push(kid); + continue; + } + if (!(kid instanceof Dict)) { + continue; + } + const pgRef = kid.getRaw("Pg"); + if (pgRef instanceof Ref && !pagesMap.has(pgRef)) { + continue; + } + const type = kid.get("Type"); + if (!type || isName(type, "StructElem")) { + let setAsSpan = false; + if (kidRef && removedStructElements.has(kidRef)) { + if (!isName(kid.get("S"), "Link")) { + continue; + } + setAsSpan = true; + } + const newKidRef = await this.#cloneStructTreeNode(kidRef, kid, xref, removedStructElements, dedupIDs, dedupClasses, dedupRoles, visited); + if (newKidRef) { + structElemIndices.push(newKids.length); + newKids.push(newKidRef); + if (kidRef) { + oldRefMapping.put(kidRef, newKidRef); + } + if (setAsSpan) { + this.xref[newKidRef.num].setIfName("S", "Span"); + } + } + continue; + } + if (isName(type, "OBJR")) { + if (!kidRef) { + continue; + } + const newKidRef = oldRefMapping.get(kidRef); + if (!newKidRef) { + continue; + } + const newKid = this.xref[newKidRef.num]; + const objRef = newKid.getRaw("Obj"); + if (objRef instanceof Ref) { + const obj = this.xref[objRef.num]; + if (obj instanceof Dict && !obj.has("StructParent") && parentStructRef) { + const structParent = this.parentTree.size; + this.parentTree.set(structParent, [oldRefMapping, parentStructRef]); + obj.set("StructParent", structParent); + } + } + newKids.push(newKidRef); + continue; + } + if (isName(type, "MCR")) { + const newKid = await this.#collectDependencies(kidRef || kid, true, xref); + newKids.push(newKid); + continue; + } + if (kidRef) { + const newKidRef = await this.#collectDependencies(kidRef, true, xref); + newKids.push(newKidRef); + } + } + if (kids.length !== 0 && newKids.length === 0) { + return null; + } + const newNodeRef = this.newRef; + const newNode = this.xref[newNodeRef.num] = this.cloneDict(node); + newNode.delete("ID"); + newNode.delete("C"); + newNode.delete("K"); + newNode.delete("P"); + newNode.delete("S"); + await this.#collectDependencies(newNode, false, xref); + const classNames = node.get("C"); + if (classNames instanceof Name) { + const newClassName = dedupClasses.get(classNames.name); + newNode.set("C", newClassName ? Name.get(newClassName) : classNames); + } else if (Array.isArray(classNames)) { + const newClassNames = []; + for (const className of classNames) { + if (className instanceof Name) { + const newClassName = dedupClasses.get(className.name); + newClassNames.push(newClassName ? Name.get(newClassName) : className); + } + } + newNode.set("C", newClassNames); + } + const roleName = node.get("S"); + if (roleName instanceof Name) { + const newRoleName = dedupRoles.get(roleName.name); + newNode.set("S", newRoleName ? Name.get(newRoleName) : roleName); + } + const id = node.get("ID"); + if (typeof id === "string") { + const stringId = stringToPDFString(id, false); + const newId = dedupIDs.get(stringId); + newNode.set("ID", newId ? stringToAsciiOrUTF16BE(newId) : id); + } + let attributes = newNode.get("A"); + if (attributes) { + if (!Array.isArray(attributes)) { + attributes = [attributes]; + } + for (let attr of attributes) { + attr = this.xrefWrapper.fetchIfRef(attr); + if (isName(attr.get("O"), "Table") && attr.has("Headers")) { + const headers = this.xrefWrapper.fetchIfRef(attr.getRaw("Headers")); + if (Array.isArray(headers)) { + for (let i = 0, ii = headers.length; i < ii; i++) { + const newId = dedupIDs.get(stringToPDFString(headers[i], false)); + if (newId) { + headers[i] = newId; + } + } + } + } + } + } + for (const index of structElemIndices) { + const structElemRef = newKids[index]; + const structElem = this.xref[structElemRef.num]; + structElem.set("P", newNodeRef); + } + if (newKids.length === 1) { + newNode.set("K", newKids[0]); + } else if (newKids.length > 1) { + newNode.set("K", newKids); + } + return newNodeRef; + } + #getFilteredPageIndices({ + document, + includePages, + excludePages + }) { + if (!document) { + return []; + } + const compile = list => { + if (!list?.length) { + return null; + } + const indices = new Set(); + const ranges = []; + for (const item of list) { + if (Array.isArray(item)) { + ranges.push(item); + } else { + indices.add(item); + } + } + return { + indices, + ranges + }; + }; + const matches = (index, { + indices, + ranges + }) => indices.has(index) || ranges.some(([start, end]) => index >= start && index <= end); + const inc = compile(includePages); + const exc = compile(excludePages); + const result = []; + for (let i = 0, ii = document.numPages; i < ii; i++) { + if (exc && matches(i, exc)) { + continue; + } + if (!inc || matches(i, inc)) { + result.push(i); + } + } + return result; + } + #resolveInsertAfterIndices(pageInfos) { + const counts = new Array(pageInfos.length); + const sequence = []; + const insertAfterList = []; + for (let i = 0; i < pageInfos.length; i++) { + const info = pageInfos[i]; + let count; + if (info.image) { + count = counts[i] = 1; + } else if (!info.document) { + counts[i] = 0; + continue; + } else { + count = counts[i] = this.#getFilteredPageIndices(info).length; + } + if (info.pageIndices) { + continue; + } + if (info.insertAfter === undefined) { + for (let j = 0; j < count; j++) { + sequence.push(i); + } + } else { + insertAfterList.push({ + i, + insertAfter: info.insertAfter, + count + }); + } + } + if (insertAfterList.length === 0) { + return pageInfos; + } + const hasContent = info => !!(info.document || info.image); + for (let i = 0; i < pageInfos.length; i++) { + const info = pageInfos[i]; + if (hasContent(info) && info.pageIndices && info.pageIndices.length < counts[i]) { + throw new Error("extractPages: partial pageIndices cannot be combined with insertAfter entries."); + } + } + insertAfterList.sort((a, b) => a.insertAfter - b.insertAfter || a.i - b.i); + if (sequence.length === 0 && pageInfos.some(info => hasContent(info) && info.pageIndices)) { + const updatedPageInfos = pageInfos.slice(); + let maxExistingPos = -1; + for (const info of pageInfos) { + if (!hasContent(info) || !info.pageIndices) { + continue; + } + for (const idx of info.pageIndices) { + if (idx > maxExistingPos) { + maxExistingPos = idx; + } + } + } + let offset = 0; + for (const { + i, + insertAfter, + count + } of insertAfterList) { + const threshold = Math.min(Math.max(insertAfter, -1) + offset, maxExistingPos); + for (let j = 0; j < updatedPageInfos.length; j++) { + const existingInfo = updatedPageInfos[j]; + if (!hasContent(existingInfo) || !existingInfo.pageIndices || existingInfo.pageIndices.every(idx => idx <= threshold)) { + continue; + } + updatedPageInfos[j] = { + ...existingInfo, + pageIndices: existingInfo.pageIndices.map(idx => idx > threshold ? idx + count : idx) + }; + } + const pageIndices = []; + for (let k = 0; k < count; k++) { + pageIndices.push(threshold + 1 + k); + } + const result = { + ...updatedPageInfos[i], + pageIndices + }; + delete result.insertAfter; + updatedPageInfos[i] = result; + offset += count; + maxExistingPos += count; + } + return updatedPageInfos; + } + let offset = 0; + for (const { + i, + insertAfter, + count + } of insertAfterList) { + const insertPos = Math.max(insertAfter, -1) + 1 + offset; + sequence.splice(insertPos, 0, ...new Array(count).fill(i)); + offset += count; + } + const pageIndicesArr = new Array(pageInfos.length); + for (let pos = 0; pos < sequence.length; pos++) { + const infoIdx = sequence[pos]; + (pageIndicesArr[infoIdx] ||= []).push(pos); + } + return pageInfos.map((info, i) => { + if (!hasContent(info) || info.pageIndices) { + return info; + } + const result = { + ...info, + pageIndices: pageIndicesArr[i] || [] + }; + delete result.insertAfter; + return result; + }); + } + async extractPages(pageInfos, annotationStorage, primaryDocument, handler, task) { + this.#primaryDocument = primaryDocument; + pageInfos = this.#resolveInsertAfterIndices(pageInfos); + const promises = []; + let newIndex = 0; + const reservePageSlot = newPageIndex => { + if (!Number.isInteger(newPageIndex) || newPageIndex < 0) { + throw new Error("extractPages: invalid page index."); + } + if (this.oldPages[newPageIndex] !== undefined) { + throw new Error("extractPages: overlapping pageIndices."); + } + this.oldPages[newPageIndex] = null; + }; + const docPageInfos = pageInfos.filter(info => !!info.document); + this.isSingleFile = docPageInfos.length === 1 || docPageInfos.length > 0 && docPageInfos.every(info => info.document === docPageInfos[0].document); + const allDocumentData = []; + if (annotationStorage) { + this.#newAnnotationsParams = { + handler, + task, + newAnnotationsByPage: getNewAnnotationsMap(annotationStorage), + imagesPromises: AnnotationFactory.generateImages(annotationStorage.values(), this.xrefWrapper, true) + }; + } + const imageEntries = []; + for (const pageInfo of pageInfos) { + const { + document, + image, + includePages, + excludePages, + pageIndices + } = pageInfo; + if (image) { + if (pageIndices) { + newIndex = -1; + if (pageIndices.length > 1) { + throw new Error("extractPages: too many pageIndices."); + } + } + let newPageIndex; + if (pageIndices?.length) { + newPageIndex = pageIndices[0]; + } else if (newIndex !== -1) { + newPageIndex = newIndex++; + } else { + for (newPageIndex = 0; this.oldPages[newPageIndex] !== undefined; newPageIndex++) {} + } + reservePageSlot(newPageIndex); + imageEntries.push({ + image, + slot: newPageIndex + }); + continue; + } + if (!document) { + continue; + } + if (pageIndices) { + newIndex = -1; + } + const filteredPageIndices = this.#getFilteredPageIndices({ + document, + includePages, + excludePages + }); + if (pageIndices && pageIndices.length > filteredPageIndices.length) { + throw new Error("extractPages: too many pageIndices."); + } + const documentData = new DocumentData(document); + allDocumentData.push(documentData); + promises.push(this.#collectDocumentData(documentData)); + let pageIndex = 0; + for (const i of filteredPageIndices) { + let newPageIndex; + if (pageIndices) { + newPageIndex = pageIndices[pageIndex++]; + } + if (newPageIndex === undefined) { + if (newIndex !== -1) { + newPageIndex = newIndex++; + } else { + for (newPageIndex = 0; this.oldPages[newPageIndex] !== undefined; newPageIndex++) {} + } + } + reservePageSlot(newPageIndex); + promises.push(document.getPage(i).then(page => { + this.oldPages[newPageIndex] = new PageData(page, documentData); + })); + } + } + await Promise.all(promises); + for (let i = 0, ii = this.oldPages.length; i < ii; i++) { + if (this.oldPages[i] === undefined) { + throw new Error("extractPages: sparse pageIndices."); + } + } + promises.length = 0; + this.#collectValidDestinations(allDocumentData); + this.#collectOutlineDestinations(allDocumentData); + this.#collectPageLabels(); + for (const page of this.oldPages) { + if (page) { + promises.push(this.#postCollectPageData(page)); + } + } + await Promise.all(promises); + this.#findDuplicateNamedDestinations(); + this.#setPostponedRefCopies(allDocumentData); + const imageSlots = new Map(); + for (const entry of imageEntries) { + imageSlots.set(entry.slot, entry); + } + const modalPageSize = imageSlots.size > 0 ? this.#modalPageSize() : null; + for (let i = 0, ii = this.oldPages.length; i < ii; i++) { + const imageEntry = imageSlots.get(i); + if (imageEntry) { + this.newPages[i] = await this.#makeImagePage(imageEntry.image, modalPageSize); + } else { + this.newPages[i] = await this.#makePageCopy(i, null); + } + } + this.#fixPostponedRefCopies(allDocumentData); + await this.#mergeStructTrees(allDocumentData); + await this.#mergeAcroForms(allDocumentData); + this.#buildOutline(allDocumentData); + await this.#collectEmbeddedFiles(allDocumentData); + return this.writePDF(); + } + async #collectDocumentData(documentData) { + const { + document: { + pdfManager, + xref + } + } = documentData; + await Promise.all([pdfManager.ensureCatalog("destinations").then(destinations => documentData.destinations = destinations), pdfManager.ensureCatalog("rawPageLabels").then(pageLabels => documentData.pageLabels = pageLabels), pdfManager.ensureCatalog("structTreeRoot").then(structTreeRoot => documentData.structTreeRoot = structTreeRoot), pdfManager.ensureCatalog("acroForm").then(acroForm => documentData.acroForm = acroForm), pdfManager.ensureCatalog("documentOutlineForEditor").then(outline => documentData.outline = outline), pdfManager.ensureCatalog("rawEmbeddedFiles").then(ef => documentData.embeddedFiles = ef)]); + const structTreeRoot = documentData.structTreeRoot; + if (structTreeRoot) { + const rootDict = structTreeRoot.dict; + const parentTree = rootDict.get("ParentTree"); + if (parentTree) { + const numberTree = new NumberTree(parentTree, xref); + documentData.parentTree = numberTree.getAll(true); + } + const idTree = rootDict.get("IDTree"); + if (idTree) { + const nameTree = new NameTree(idTree, xref); + documentData.idTree = nameTree.getAll(true); + } + documentData.roleMap = rootDict.get("RoleMap") || null; + documentData.classMap = rootDict.get("ClassMap") || null; + let namespaces = rootDict.get("Namespaces") || null; + if (namespaces && !Array.isArray(namespaces)) { + namespaces = [namespaces]; + } + documentData.namespaces = namespaces; + documentData.structTreeAF = rootDict.get("AF") || null; + documentData.structTreePronunciationLexicon = rootDict.get("PronunciationLexicon") || null; + } + } + async #postCollectPageData(pageData) { + const { + page: { + xref, + annotations + }, + documentData: { + pagesMap, + destinations, + usedNamedDestinations, + fieldToParent + } + } = pageData; + if (!annotations) { + return; + } + const promises = []; + let newAnnotations = []; + let newIndex = 0; + let { + hasSignatureAnnotations + } = pageData.documentData; + for (const annotationRef of annotations) { + const newAnnotationIndex = newIndex++; + promises.push(xref.fetchIfRefAsync(annotationRef).then(async annotationDict => { + if (!isName(annotationDict.get("Subtype"), "Link")) { + if (isName(annotationDict.get("Subtype"), "Widget")) { + hasSignatureAnnotations ||= isName(annotationDict.get("FT"), "Sig"); + const parentRef = annotationDict.get("Parent") || null; + annotationDict.delete("Parent"); + fieldToParent.put(annotationRef, parentRef); + } + newAnnotations[newAnnotationIndex] = annotationRef; + return; + } + const action = annotationDict.get("A"); + const dest = action instanceof Dict ? action.get("D") : annotationDict.get("Dest"); + if (!dest || Array.isArray(dest) && (!(dest[0] instanceof Ref) || pagesMap.has(dest[0]))) { + newAnnotations[newAnnotationIndex] = annotationRef; + } else if (typeof dest === "string") { + const destString = stringToPDFString(dest, true); + if (destinations.has(destString)) { + newAnnotations[newAnnotationIndex] = annotationRef; + usedNamedDestinations.add(destString); + } + } + })); + } + await Promise.all(promises); + newAnnotations = newAnnotations.filter(annot => !!annot); + pageData.annotations = newAnnotations.length > 0 ? newAnnotations : null; + pageData.documentData.hasSignatureAnnotations ||= hasSignatureAnnotations; + } + #setPostponedRefCopies(allDocumentData) { + for (const { + postponedRefCopies, + pagesMap + } of allDocumentData) { + for (const oldPageRef of pagesMap.keys()) { + postponedRefCopies.put(oldPageRef, []); + } + } + } + #fixPostponedRefCopies(allDocumentData) { + for (const { + postponedRefCopies, + oldRefMapping + } of allDocumentData) { + for (const [oldRef, actions] of postponedRefCopies.items()) { + const newRef = oldRefMapping.get(oldRef); + for (const action of actions) { + action(newRef); + } + } + postponedRefCopies.clear(); + } + } + #visitObject(obj, callback, visited = new RefSet()) { + if (obj instanceof Ref) { + if (!visited.has(obj)) { + visited.put(obj); + this.#visitObject(this.xref[obj.num], callback, visited); + } + return; + } + if (Array.isArray(obj)) { + for (const item of obj) { + this.#visitObject(item, callback, visited); + } + return; + } + let dict; + if (obj instanceof BaseStream) { + ({ + dict + } = obj); + } else if (obj instanceof Dict) { + dict = obj; + } + if (dict) { + callback(dict); + for (const value of dict.getRawValues()) { + this.#visitObject(value, callback, visited); + } + } + } + async #mergeStructTrees(allDocumentData) { + let newStructParentId = 0; + const { + parentTree: newParentTree + } = this; + for (let i = 0, ii = this.newPages.length; i < ii; i++) { + if (!this.oldPages[i]) { + continue; + } + const { + documentData: { + parentTree, + oldRefMapping, + oldStructParentMapping, + usedStructParents, + document: { + xref + } + } + } = this.oldPages[i]; + if (!parentTree) { + continue; + } + const pageRef = this.newPages[i]; + const pageDict = this.xref[pageRef.num]; + const visited = new RefSet(); + visited.put(pageRef); + this.#visitObject(pageDict, dict => { + const structParent = dict.get("StructParent") ?? dict.get("StructParents"); + if (typeof structParent !== "number") { + return; + } + usedStructParents.add(structParent); + let parent = parentTree.get(structParent); + const parentRef = parent instanceof Ref ? parent : null; + if (parentRef) { + const array = xref.fetch(parentRef); + if (Array.isArray(array)) { + parent = array; + } + } + if (Array.isArray(parent) && parent.every(ref => ref === null)) { + parent = null; + } + if (!parent) { + if (dict.has("StructParent")) { + dict.delete("StructParent"); + } else { + dict.delete("StructParents"); + } + return; + } + let newStructParent = oldStructParentMapping.get(structParent); + if (newStructParent === undefined) { + newStructParent = newStructParentId++; + oldStructParentMapping.set(structParent, newStructParent); + newParentTree.set(newStructParent, [oldRefMapping, parent]); + } + if (dict.has("StructParent")) { + dict.set("StructParent", newStructParent); + } else { + dict.set("StructParents", newStructParent); + } + }, visited); + } + const { + structTreeKids, + idTree: newIdTree, + classMap: newClassMap, + roleMap: newRoleMap, + namespaces: newNamespaces, + structTreeAF: newStructTreeAF, + structTreePronunciationLexicon: newStructTreePronunciationLexicon + } = this; + for (const documentData of allDocumentData) { + const { + document: { + xref + }, + oldRefMapping, + parentTree, + usedStructParents, + structTreeRoot, + idTree, + classMap, + roleMap, + namespaces, + structTreeAF, + structTreePronunciationLexicon + } = documentData; + if (!structTreeRoot) { + continue; + } + this.currentDocument = documentData; + const removedStructElements = new RefSet(); + for (const [key, value] of parentTree || []) { + if (!usedStructParents.has(key) && value instanceof Ref) { + removedStructElements.put(value); + } + } + const dedupIDs = new Map(); + for (const [id, nodeRef] of idTree || []) { + let _id = id; + if (newIdTree.has(id)) { + for (let i = 1;; i++) { + const newId = `${id}_${i}`; + if (!newIdTree.has(newId)) { + dedupIDs.set(id, newId); + _id = newId; + break; + } + } + } + newIdTree.set(_id, nodeRef); + } + const dedupClasses = new Map(); + if (classMap?.size > 0) { + for (let [className, classDict] of classMap) { + classDict = await this.#collectDependencies(classDict, true, xref); + if (newClassMap.has(className)) { + for (let i = 1;; i++) { + const newClassName = `${className}_${i}`; + if (!newClassMap.has(newClassName)) { + dedupClasses.set(className, newClassName); + className = newClassName; + break; + } + } + } + newClassMap.set(className, classDict); + } + } + const dedupRoles = new Map(); + if (roleMap?.size > 0) { + for (const [roleName, mappedName] of roleMap) { + const newMappedName = newRoleMap.get(roleName); + if (!newMappedName) { + newRoleMap.set(roleName, mappedName); + continue; + } + if (newMappedName === mappedName) { + continue; + } + for (let i = 1;; i++) { + const newRoleName = `${roleName}_${i}`; + if (!newRoleMap.has(newRoleName)) { + dedupRoles.set(roleName, newRoleName); + newRoleMap.set(newRoleName, mappedName); + break; + } + } + } + } + if (namespaces?.length > 0) { + for (const namespaceRef of namespaces) { + const namespace = await xref.fetchIfRefAsync(namespaceRef); + let ns = namespace.get("NS"); + if (!ns || newNamespaces.has(ns)) { + continue; + } + ns = stringToPDFString(ns, false); + const newNamespace = await this.#collectDependencies(namespace, true, xref); + newNamespaces.set(ns, newNamespace); + } + } + if (structTreeAF) { + for (const afRef of structTreeAF) { + newStructTreeAF.push(await this.#collectDependencies(afRef, true, xref)); + } + } + if (structTreePronunciationLexicon) { + for (const lexiconRef of structTreePronunciationLexicon) { + newStructTreePronunciationLexicon.push(await this.#collectDependencies(lexiconRef, true, xref)); + } + } + let kids = structTreeRoot.dict.get("K"); + if (!kids) { + continue; + } + kids = Array.isArray(kids) ? kids : [kids]; + for (let kid of kids) { + const kidRef = kid instanceof Ref ? kid : null; + if (kidRef && removedStructElements.has(kidRef)) { + continue; + } + kid = await xref.fetchIfRefAsync(kid); + const newKidRef = await this.#cloneStructTreeNode(kidRef, kid, xref, removedStructElements, dedupIDs, dedupClasses, dedupRoles); + if (newKidRef) { + structTreeKids.push(newKidRef); + } + } + for (const [id, nodeRef] of idTree || []) { + const newNodeRef = nodeRef instanceof Ref && oldRefMapping.get(nodeRef); + const newId = dedupIDs.get(id) || id; + if (newNodeRef) { + newIdTree.set(newId, newNodeRef); + } else { + newIdTree.delete(newId); + } + } + } + for (const [key, [oldRefMapping, parent]] of newParentTree) { + if (!parent) { + newParentTree.delete(key); + continue; + } + if (!Array.isArray(parent)) { + const newParent = oldRefMapping.get(parent); + if (newParent === undefined) { + newParentTree.delete(key); + } else { + newParentTree.set(key, newParent); + } + continue; + } + const newParents = parent.map(ref => ref instanceof Ref && oldRefMapping.get(ref) || null); + if (newParents.length === 0 || newParents.every(ref => ref === null)) { + newParentTree.delete(key); + continue; + } + newParentTree.set(key, newParents); + } + this.currentDocument = null; + } + #collectValidDestinations(allDocumentData) { + for (const documentData of allDocumentData) { + if (!documentData.destinations) { + continue; + } + const { + destinations, + pagesMap + } = documentData; + const newDestinations = documentData.destinations = new Map(); + for (const [key, dest] of Object.entries(destinations)) { + const pageRef = dest[0]; + const pageData = pageRef instanceof Ref && pagesMap.get(pageRef); + if (!pageData) { + continue; + } + (pageData.pointingNamedDestinations ||= new Set()).add(key); + newDestinations.set(key, dest); + } + } + } + #findDuplicateNamedDestinations() { + const { + namedDestinations + } = this; + const getUniqueDestinationName = name => { + if (!namedDestinations.has(name)) { + return name; + } + for (let i = 1;; i++) { + const dedupedName = `${name}_${i}`; + if (!namedDestinations.has(dedupedName)) { + return dedupedName; + } + } + }; + for (let i = 0, ii = this.oldPages.length; i < ii; i++) { + const page = this.oldPages[i]; + if (!page) { + continue; + } + const { + documentData: { + destinations, + dedupNamedDestinations, + usedNamedDestinations + } + } = page; + let { + pointingNamedDestinations + } = page; + if (!pointingNamedDestinations) { + continue; + } + page.pointingNamedDestinations = pointingNamedDestinations = pointingNamedDestinations.intersection(usedNamedDestinations); + for (const pointingDest of pointingNamedDestinations) { + if (!usedNamedDestinations.has(pointingDest)) { + continue; + } + const dest = destinations.get(pointingDest).slice(); + if (!namedDestinations.has(pointingDest)) { + namedDestinations.set(pointingDest, dest); + continue; + } + const newName = getUniqueDestinationName(`${pointingDest}_p${i + 1}`); + dedupNamedDestinations.set(pointingDest, newName); + namedDestinations.set(newName, dest); + } + } + } + #fixNamedDestinations(annotations, dedupNamedDestinations) { + if (dedupNamedDestinations.size === 0) { + return; + } + const fixDestination = (dict, key, dest) => { + if (typeof dest === "string") { + dict.set(key, dedupNamedDestinations.get(stringToPDFString(dest, true)) || dest); + } + }; + for (const annotRef of annotations) { + const annotDict = this.xref[annotRef.num]; + if (!isName(annotDict.get("Subtype"), "Link")) { + continue; + } + const action = annotDict.get("A"); + if (action instanceof Dict && action.has("D")) { + const dest = action.get("D"); + fixDestination(action, "D", dest); + continue; + } + const dest = annotDict.get("Dest"); + fixDestination(annotDict, "Dest", dest); + } + } + #collectOutlineDestinations(allDocumentData) { + const collect = (items, destinations, usedNamedDestinations) => { + for (const item of items) { + if (typeof item.dest === "string" && destinations?.has(item.dest)) { + usedNamedDestinations.add(item.dest); + } + if (item.items.length > 0) { + collect(item.items, destinations, usedNamedDestinations); + } + } + }; + for (const documentData of allDocumentData) { + const { + outline, + destinations, + usedNamedDestinations + } = documentData; + if (outline?.length) { + collect(outline, destinations, usedNamedDestinations); + } + } + } + #isValidOutlineDest(item, documentData) { + const { + dest, + action, + url, + unsafeUrl, + attachment, + setOCGState + } = item; + if (action || url || unsafeUrl || attachment || setOCGState) { + return true; + } + if (!dest) { + return false; + } + if (typeof dest === "string") { + const name = documentData.dedupNamedDestinations.get(dest) || dest; + return this.namedDestinations.has(name); + } + if (Array.isArray(dest) && dest[0] instanceof Ref) { + return !!documentData.oldRefMapping.get(dest[0]); + } + return false; + } + #filterOutlineItems(items, documentData) { + const result = []; + for (const item of items) { + const filteredChildren = this.#filterOutlineItems(item.items, documentData); + const hasValidOwnDest = this.#isValidOutlineDest(item, documentData); + if (hasValidOwnDest || filteredChildren.length > 0) { + result.push({ + ...item, + dest: hasValidOwnDest ? item.dest : null, + rawDict: hasValidOwnDest ? item.rawDict : null, + items: filteredChildren, + _documentData: documentData + }); + } + } + return result; + } + #buildOutline(allDocumentData) { + const outlineItems = []; + for (const documentData of allDocumentData) { + const { + outline + } = documentData; + if (!outline?.length) { + continue; + } + outlineItems.push(...this.#filterOutlineItems(outline, documentData)); + } + this.outlineItems = outlineItems.length > 0 ? outlineItems : null; + } + async #setOutlineItemDest(itemDict, item) { + const { + dest, + rawDict + } = item; + const documentData = item._documentData; + if (dest) { + if (typeof dest === "string") { + const name = documentData.dedupNamedDestinations.get(dest) || dest; + itemDict.set("Dest", stringToAsciiOrUTF16BE(name)); + } else if (Array.isArray(dest)) { + const newDest = dest.slice(); + if (newDest[0] instanceof Ref) { + newDest[0] = documentData.oldRefMapping.get(newDest[0]) || newDest[0]; + } + itemDict.set("Dest", newDest); + } + return; + } + const actionDict = rawDict?.get("A"); + if (actionDict instanceof Dict) { + this.currentDocument = documentData; + const actionRef = await this.#cloneObject(actionDict, documentData.document.xref); + this.currentDocument = null; + itemDict.set("A", actionRef); + } + } + async #makeOutline() { + const { + outlineItems + } = this; + if (!outlineItems?.length) { + return; + } + const [outlineRootRef, outlineRootDict] = this.newDict; + outlineRootDict.setIfName("Type", "Outlines"); + const assignRefs = items => { + for (const item of items) { + [item._ref] = this.newDict; + if (item.items.length > 0) { + assignRefs(item.items); + } + } + }; + assignRefs(outlineItems); + const fillItems = async (items, parentRef) => { + let totalCount = 0; + for (let i = 0; i < items.length; i++) { + const item = items[i]; + const dict = this.xref[item._ref.num]; + dict.set("Title", stringToAsciiOrUTF16BE(item.title)); + dict.set("Parent", parentRef); + if (i > 0) { + dict.set("Prev", items[i - 1]._ref); + } + if (i < items.length - 1) { + dict.set("Next", items[i + 1]._ref); + } + if (item.items.length > 0) { + dict.set("First", item.items[0]._ref); + dict.set("Last", item.items.at(-1)._ref); + const childCount = await fillItems(item.items, item._ref); + if (item.count !== undefined) { + dict.set("Count", item.count < 0 ? -childCount : childCount); + } + totalCount += item.count !== undefined && item.count < 0 ? 1 : childCount + 1; + } else { + totalCount += 1; + } + await this.#setOutlineItemDest(dict, item); + const flags = (item.bold ? 2 : 0) | (item.italic ? 1 : 0); + if (flags !== 0) { + dict.set("F", flags); + } + if (item.color && (item.color[0] !== 0 || item.color[1] !== 0 || item.color[2] !== 0)) { + dict.set("C", [item.color[0] / 255, item.color[1] / 255, item.color[2] / 255]); + } + } + return totalCount; + }; + const totalCount = await fillItems(outlineItems, outlineRootRef); + outlineRootDict.set("First", outlineItems[0]._ref); + outlineRootDict.set("Last", outlineItems.at(-1)._ref); + outlineRootDict.set("Count", totalCount); + this.rootDict.set("Outlines", outlineRootRef); + } + async #mergeAcroForms(allDocumentData) { + this.#setAcroFormDefaultBasicValues(allDocumentData); + this.#setAcroFormDefaultAppearance(allDocumentData); + this.#setAcroFormQ(allDocumentData); + await this.#setAcroFormDefaultResources(allDocumentData); + const newFields = this.fields; + for (const documentData of allDocumentData) { + let fields = documentData.acroForm?.get("Fields") || null; + if (!fields && documentData.fieldToParent.size > 0) { + fields = this.#fixFields(documentData.fieldToParent, documentData.document.xref); + } + if (Array.isArray(fields) && fields.length > 0) { + this.currentDocument = documentData; + await this.#cloneFields(newFields, fields); + this.currentDocument = null; + } + } + this.#setAcroFormCalculationOrder(allDocumentData); + } + #setAcroFormQ(allDocumentData) { + let firstQ = 0; + let firstDocData = null; + for (const documentData of allDocumentData) { + const q = documentData.acroForm?.get("Q"); + if (typeof q !== "number" || q === 0) { + continue; + } + if (firstDocData?.acroFormQ > 0) { + documentData.acroFormQ = q; + continue; + } + if (firstQ === 0) { + firstQ = q; + firstDocData = documentData; + continue; + } + if (q === firstQ) { + continue; + } + firstDocData.acroFormQ ||= firstQ; + documentData.acroFormQ = q; + firstQ = 0; + } + if (firstQ > 0) { + this.acroFormQ = firstQ; + } + } + #setAcroFormDefaultBasicValues(allDocumentData) { + let sigFlags = 0; + let needAppearances = false; + for (const documentData of allDocumentData) { + if (!documentData.acroForm) { + continue; + } + const sf = documentData.acroForm.get("SigFlags"); + if (typeof sf === "number" && documentData.hasSignatureAnnotations) { + sigFlags |= sf; + } + if (documentData.acroForm.get("NeedAppearances") === true) { + needAppearances = true; + } + } + this.acroFormSigFlags = sigFlags; + this.acroFormNeedAppearances = needAppearances; + } + #setAcroFormCalculationOrder(allDocumentData) { + const calculationOrder = []; + for (const documentData of allDocumentData) { + const co = documentData.acroForm?.get("CO") || null; + if (!Array.isArray(co)) { + continue; + } + const { + oldRefMapping + } = documentData; + for (const coRef of co) { + const newCoRef = coRef instanceof Ref && oldRefMapping.get(coRef); + if (newCoRef) { + calculationOrder.push(newCoRef); + } + } + } + this.acroFormCalculationOrder = calculationOrder.length > 0 ? calculationOrder : null; + } + #setAcroFormDefaultAppearance(allDocumentData) { + let firstDA = null; + let firstDocData = null; + for (const documentData of allDocumentData) { + const da = documentData.acroForm?.get("DA") || null; + if (!da || typeof da !== "string") { + continue; + } + if (firstDocData?.acroFormDefaultAppearance) { + documentData.acroFormDefaultAppearance = da; + continue; + } + if (!firstDA) { + firstDA = da; + firstDocData = documentData; + continue; + } + if (da === firstDA) { + continue; + } + firstDocData.acroFormDefaultAppearance ||= firstDA; + documentData.acroFormDefaultAppearance = da; + firstDA = null; + } + if (firstDA) { + this.acroFormDefaultAppearance = firstDA; + } + } + async #setAcroFormDefaultResources(allDocumentData) { + let firstDR = null; + let firstDRRef = null; + let firstDocData = null; + for (const documentData of allDocumentData) { + const dr = documentData.acroForm?.get("DR") || null; + if (!dr || !(dr instanceof Dict)) { + continue; + } + if (firstDocData?.acroFormDefaultResources) { + documentData.acroFormDefaultResources = dr; + continue; + } + if (!firstDR) { + firstDR = dr; + firstDRRef = documentData.acroForm.getRaw("DR"); + firstDocData = documentData; + continue; + } + if (deepCompare(firstDR, dr)) { + continue; + } + firstDocData.acroFormDefaultResources ||= firstDR; + documentData.acroFormDefaultResources = dr; + firstDR = null; + firstDRRef = null; + } + if (firstDR) { + this.currentDocument = firstDocData; + this.acroFormDefaultResources = await this.#collectDependencies(firstDRRef, true, firstDocData.document.xref); + this.currentDocument = null; + } + } + #fixFields(fieldToParent, xref) { + const newFields = []; + const processed = new RefSet(); + for (const [fieldRef, parentRef] of fieldToParent) { + if (!parentRef) { + newFields.push(fieldRef); + continue; + } + let parent = parentRef; + let lastNonNullParent = parentRef; + while (true) { + parent = xref.fetchIfRef(parent)?.getRaw("Parent") || null; + if (!parent) { + break; + } + lastNonNullParent = parent; + } + if (lastNonNullParent instanceof Ref && !processed.has(lastNonNullParent)) { + newFields.push(lastNonNullParent); + processed.put(lastNonNullParent); + } + } + return newFields; + } + async #cloneFields(newFields, fields) { + const processed = new RefSet(); + const stack = [{ + kids: fields, + newKids: newFields, + pos: 0, + oldParentRef: null, + parentRef: null, + parent: null + }]; + const { + document: { + xref + }, + oldRefMapping, + fieldToParent, + acroFormDefaultAppearance, + acroFormDefaultResources, + acroFormQ + } = this.currentDocument; + const daToFix = []; + const drToFix = []; + while (stack.length > 0) { + const data = stack.at(-1); + const { + kids, + newKids, + parent, + pos + } = data; + if (pos === kids.length) { + stack.pop(); + if (newKids.length === 0 || !parent) { + continue; + } + const parentDict = this.xref[data.parentRef.num] = this.cloneDict(parent); + parentDict.delete("Parent"); + parentDict.delete("Kids"); + await this.#collectDependencies(parentDict, false, xref); + parentDict.set("Kids", newKids); + if (stack.length > 0) { + const lastData = stack.at(-1); + if (!lastData.parentRef && lastData.oldParentRef) { + const parentRef = lastData.parentRef = this.newRef; + parentDict.set("Parent", parentRef); + oldRefMapping.put(lastData.oldParentRef, parentRef); + } + lastData.newKids.push(data.parentRef); + } + continue; + } + const oldKidRef = kids[data.pos++]; + if (!(oldKidRef instanceof Ref) || processed.has(oldKidRef)) { + continue; + } + processed.put(oldKidRef); + const kid = xref.fetchIfRef(oldKidRef); + if (kid.has("Kids")) { + const kidsArray = kid.get("Kids"); + if (!Array.isArray(kidsArray)) { + continue; + } + stack.push({ + kids: kidsArray, + newKids: [], + pos: 0, + oldParentRef: oldKidRef, + parentRef: null, + parent: kid + }); + continue; + } + if (!fieldToParent.has(oldKidRef)) { + continue; + } + const newRef = oldRefMapping.get(oldKidRef); + if (!newRef) { + continue; + } + newKids.push(newRef); + if (!data.parentRef && data.oldParentRef) { + data.parentRef = this.newRef; + oldRefMapping.put(data.oldParentRef, data.parentRef); + } + const newKid = this.xref[newRef.num]; + if (data.parentRef) { + newKid.set("Parent", data.parentRef); + } + if (acroFormDefaultAppearance && isName(newKid.get("FT"), "Tx") && !newKid.has("DA")) { + daToFix.push(newKid); + } + if (acroFormDefaultResources && !newKid.has("Kids") && newKid.get("AP") instanceof Dict) { + drToFix.push(newKid); + } + if (acroFormQ && !newKid.has("Q")) { + newKid.set("Q", acroFormQ); + } + } + for (const field of daToFix) { + const da = getInheritableProperty({ + dict: field, + key: "DA" + }); + if (!da) { + field.set("DA", acroFormDefaultAppearance); + } + } + const resourcesValuesCache = new Map(); + for (const field of drToFix) { + const ap = field.get("AP"); + for (const [, value] of ap) { + if (!(value instanceof BaseStream)) { + continue; + } + let resources = value.dict.getRaw("Resources"); + if (!resources) { + const newResourcesRef = await resourcesValuesCache.getOrInsertComputed(acroFormDefaultResources, () => this.#cloneObject(acroFormDefaultResources, xref)); + value.dict.set("Resources", newResourcesRef); + continue; + } + resources = xref.fetchIfRef(resources); + for (const [resKey, resValue] of acroFormDefaultResources.getRawEntries()) { + if (!resources.has(resKey)) { + let newResValue = resValue; + if (resValue instanceof Ref) { + newResValue = await this.#collectDependencies(resValue, true, xref); + } else if (resValue instanceof Dict || resValue instanceof BaseStream || Array.isArray(resValue)) { + newResValue = await resourcesValuesCache.getOrInsertComputed(resValue, () => this.#cloneObject(resValue, xref)); + } + resources.set(resKey, newResValue); + } + } + } + } + } + async #collectPageLabels() { + if (!this.isSingleFile) { + return; + } + const firstRealPage = this.oldPages.find(p => !!p); + if (!firstRealPage) { + return; + } + const { + documentData: { + document, + pageLabels + } + } = firstRealPage; + if (!pageLabels) { + return; + } + const numPages = document.numPages; + const labelsByPageIndex = new Map(); + const oldPageIndices = new Set(this.oldPages.filter(p => !!p).map(({ + page: { + pageIndex + } + }) => pageIndex)); + let currentLabel = null; + let stFirstIndex = -1; + for (let i = 0; i < numPages; i++) { + const newLabel = pageLabels.get(i); + if (newLabel) { + currentLabel = newLabel; + stFirstIndex = currentLabel.has("St") ? i : -1; + } + if (!oldPageIndices.has(i)) { + continue; + } + if (stFirstIndex !== -1) { + const st = currentLabel.get("St"); + currentLabel = this.cloneDict(currentLabel); + currentLabel.set("St", st + (i - stFirstIndex)); + stFirstIndex = -1; + } + labelsByPageIndex.set(i, currentLabel); + } + const defaultLabel = index => { + const label = new Dict(); + label.setIfName("S", "D"); + label.set("St", index + 1); + return label; + }; + currentLabel = null; + const newPageLabels = this.pageLabels = []; + for (let i = 0, ii = this.oldPages.length; i < ii; i++) { + const pageData = this.oldPages[i]; + const label = pageData ? labelsByPageIndex.get(pageData.page.pageIndex) || defaultLabel(i) : defaultLabel(i); + if (label === currentLabel) { + continue; + } + currentLabel = label; + newPageLabels.push([i, currentLabel]); + } + } + async #makePageCopy(pageIndex) { + const { + page, + documentData, + annotations, + pointingNamedDestinations + } = this.oldPages[pageIndex]; + this.currentDocument = documentData; + const { + dedupNamedDestinations, + oldRefMapping + } = documentData; + const { + xref, + rotate, + mediaBox, + resources, + ref: oldPageRef + } = page; + const pageRef = this.newRef; + const pageDict = this.xref[pageRef.num] = this.cloneDict(page.pageDict); + oldRefMapping.put(oldPageRef, pageRef); + if (pointingNamedDestinations) { + for (const pointingDest of pointingNamedDestinations) { + const name = dedupNamedDestinations.get(pointingDest) || pointingDest; + const dest = this.namedDestinations.get(name); + dest[0] = pageRef; + } + } + for (const key of ["Rotate", "MediaBox", "CropBox", "BleedBox", "TrimBox", "ArtBox", "Resources", "Annots", "Parent", "UserUnit"]) { + pageDict.delete(key); + } + const lastRef = this.newRefCount; + await this.#collectDependencies(pageDict, false, xref); + pageDict.set("Rotate", rotate); + pageDict.set("MediaBox", mediaBox); + for (const boxName of ["CropBox", "BleedBox", "TrimBox", "ArtBox"]) { + const box = page.getBoundingBox(boxName); + if (box?.some((value, index) => value !== mediaBox[index])) { + pageDict.set(boxName, box); + } + } + const userUnit = page.userUnit; + if (userUnit !== 1) { + pageDict.set("UserUnit", userUnit); + } + pageDict.setIfDict("Resources", await this.#collectDependencies(resources, true, xref)); + let newAnnots = null; + if (annotations) { + const newAnnotations = await this.#collectDependencies(annotations, true, xref); + this.#fixNamedDestinations(newAnnotations, dedupNamedDestinations); + if (Array.isArray(newAnnotations) && newAnnotations.length > 0) { + newAnnots = newAnnotations; + } + } + const newAnnotations = documentData.document === this.#primaryDocument ? this.#newAnnotationsParams?.newAnnotationsByPage?.get(page.pageIndex) : null; + if (newAnnotations) { + const { + handler, + task, + imagesPromises + } = this.#newAnnotationsParams; + const changes = new RefSetCache(); + const newData = await AnnotationFactory.saveNewAnnotations(page.createAnnotationEvaluator(handler), this.xrefWrapper, task, newAnnotations, imagesPromises, changes); + for (const [ref, { + data + }] of changes.items()) { + this.xref[ref.num] = data; + } + newAnnots ||= []; + for (const { + ref + } of newData.annotations) { + newAnnots.push(ref); + } + } + pageDict.setIfArray("Annots", newAnnots); + if (this.useObjectStreams) { + const newLastRef = this.newRefCount; + const pageObjectRefs = []; + for (let i = lastRef; i < newLastRef; i++) { + const obj = this.xref[i]; + if (obj instanceof BaseStream) { + continue; + } + pageObjectRefs.push(Ref.get(i, 0)); + } + for (let i = 0; i < pageObjectRefs.length; i += 0xffff) { + const objStreamRef = this.newRef; + this.objStreamRefs.add(objStreamRef.num); + this.xref[objStreamRef.num] = pageObjectRefs.slice(i, i + 0xffff); + } + } + this.currentDocument = null; + return pageRef; + } + #modalPageSize() { + const counts = new Map(); + for (const pageData of this.oldPages) { + if (!pageData) { + continue; + } + const { + page + } = pageData; + const [x0, y0, x1, y1] = page.view; + let width = x1 - x0; + let height = y1 - y0; + if (width <= 0 || height <= 0) { + continue; + } + if (page.rotate % 180 !== 0) { + [width, height] = [height, width]; + } + const key = `${width}x${height}`; + const entry = counts.get(key); + if (entry) { + entry.count++; + } else { + counts.set(key, { + width, + height, + count: 1 + }); + } + } + if (counts.size === 0) { + const [,, width, height] = LETTER_SIZE_MEDIABOX; + return { + width, + height + }; + } + let best = null; + for (const entry of counts.values()) { + if (!best || entry.count > best.count || entry.count === best.count && entry.width * entry.height > best.width * best.height) { + best = entry; + } + } + return { + width: best.width, + height: best.height + }; + } + async #makeImagePage(bitmap, pageSize) { + const { + width: pageW, + height: pageH + } = pageSize; + const DEFAULT_MARGIN_RATIO = 0.1; + const margin = pageW * DEFAULT_MARGIN_RATIO; + const availW = Math.max(1, pageW - 2 * margin); + const availH = Math.max(1, pageH - 2 * margin); + const lastRef = this.newRefCount; + const { + imageStream, + smaskStream, + width: imgW, + height: imgH + } = await createImage(bitmap, this.xrefWrapper, { + closeBitmap: true + }); + const scale = Math.min(availW / imgW, availH / imgH); + const drawW = imgW * scale; + const drawH = imgH * scale; + const tx = (pageW - drawW) / 2; + const ty = (pageH - drawH) / 2; + if (smaskStream) { + const smaskRef = this.newRef; + this.xref[smaskRef.num] = smaskStream; + imageStream.dict.set("SMask", smaskRef); + } + const imageRef = this.newRef; + this.xref[imageRef.num] = imageStream; + const xobjectDict = new Dict(this.xrefWrapper); + xobjectDict.set("Im0", imageRef); + const resourcesDict = new Dict(this.xrefWrapper); + resourcesDict.set("XObject", xobjectDict); + resourcesDict.set("ProcSet", [Name.get("PDF"), Name.get("ImageC")]); + const content = `q ${numberToString(drawW)} 0 0 ${numberToString(drawH)} ` + `${numberToString(tx)} ${numberToString(ty)} cm /Im0 Do Q`; + const contentsStream = new StringStream(content, new Dict(this.xrefWrapper)); + const contentsRef = this.newRef; + this.xref[contentsRef.num] = contentsStream; + const pageRef = this.newRef; + const pageDict = this.xref[pageRef.num] = new Dict(this.xrefWrapper); + pageDict.setIfName("Type", "Page"); + pageDict.set("MediaBox", [0, 0, pageW, pageH]); + pageDict.set("Resources", resourcesDict); + pageDict.set("Contents", contentsRef); + if (this.useObjectStreams) { + const newLastRef = this.newRefCount; + const pageObjectRefs = []; + for (let i = lastRef; i < newLastRef; i++) { + const obj = this.xref[i]; + if (obj instanceof BaseStream) { + continue; + } + pageObjectRefs.push(Ref.get(i, 0)); + } + for (let i = 0; i < pageObjectRefs.length; i += 0xffff) { + const objStreamRef = this.newRef; + this.objStreamRefs.add(objStreamRef.num); + this.xref[objStreamRef.num] = pageObjectRefs.slice(i, i + 0xffff); + } + } + return pageRef; + } + #makePageTree() { + const { + newPages: pages, + rootDict, + pagesRef, + pagesDict + } = this; + rootDict.set("Pages", pagesRef); + pagesDict.setIfName("Type", "Pages"); + pagesDict.set("Count", pages.length); + const maxLeaves = MAX_LEAVES_PER_PAGES_NODE <= 1 ? pages.length : MAX_LEAVES_PER_PAGES_NODE; + const stack = [{ + dict: pagesDict, + kids: pages, + parentRef: pagesRef + }]; + while (stack.length > 0) { + const { + dict, + kids, + parentRef + } = stack.pop(); + if (kids.length <= maxLeaves) { + dict.set("Kids", kids); + for (const ref of kids) { + this.xref[ref.num].set("Parent", parentRef); + } + continue; + } + const chunkSize = Math.max(maxLeaves, Math.ceil(kids.length / maxLeaves)); + const kidsChunks = []; + for (let i = 0; i < kids.length; i += chunkSize) { + kidsChunks.push(kids.slice(i, i + chunkSize)); + } + const kidsRefs = []; + dict.set("Kids", kidsRefs); + for (const chunk of kidsChunks) { + const [kidRef, kidDict] = this.newDict; + kidsRefs.push(kidRef); + kidDict.setIfName("Type", "Pages"); + kidDict.set("Parent", parentRef); + kidDict.set("Count", chunk.length); + stack.push({ + dict: kidDict, + kids: chunk, + parentRef: kidRef + }); + } + } + } + #makeNameNumTree(map, areNames) { + const allEntries = map.sort(areNames ? ([keyA], [keyB]) => keyA.localeCompare(keyB) : ([keyA], [keyB]) => keyA - keyB); + const maxLeaves = MAX_IN_NAME_TREE_NODE <= 1 ? allEntries.length : MAX_IN_NAME_TREE_NODE; + const [treeRef, treeDict] = this.newDict; + const stack = [{ + dict: treeDict, + entries: allEntries, + isRoot: true + }]; + const valueType = areNames ? "Names" : "Nums"; + while (stack.length > 0) { + const { + dict, + entries, + isRoot + } = stack.pop(); + if (entries.length <= maxLeaves) { + if (!isRoot) { + dict.set("Limits", [entries[0][0], entries.at(-1)[0]]); + } + dict.set(valueType, entries.flat()); + continue; + } + const entriesChunks = []; + const chunkSize = Math.max(maxLeaves, Math.ceil(entries.length / maxLeaves)); + for (let i = 0; i < entries.length; i += chunkSize) { + entriesChunks.push(entries.slice(i, i + chunkSize)); + } + const entriesRefs = []; + dict.set("Kids", entriesRefs); + for (const chunk of entriesChunks) { + const [entriesRef, entriesDict] = this.newDict; + entriesRefs.push(entriesRef); + entriesDict.set("Limits", [chunk[0][0], chunk.at(-1)[0]]); + stack.push({ + dict: entriesDict, + entries: chunk + }); + } + } + return treeRef; + } + #makePageLabelsTree() { + const { + pageLabels + } = this; + if (!pageLabels?.length) { + return; + } + const { + rootDict + } = this; + const pageLabelsRef = this.#makeNameNumTree(this.pageLabels, false); + rootDict.set("PageLabels", pageLabelsRef); + } + async #collectEmbeddedFiles(allDocumentData) { + const { + embeddedFiles + } = this; + for (const documentData of allDocumentData) { + const { + embeddedFiles: docEmbeddedFiles, + document: { + xref + } + } = documentData; + if (!docEmbeddedFiles?.size) { + continue; + } + this.currentDocument = documentData; + for (const [key, valueRef] of docEmbeddedFiles) { + let name = key; + if (embeddedFiles.has(name)) { + const displayName = stringToPDFString(key, true); + for (let i = 1;; i++) { + const deduped = `${displayName}_${i}`; + if (!embeddedFiles.has(deduped)) { + name = deduped; + break; + } + } + } + embeddedFiles.set(name, await this.#collectDependencies(valueRef, true, xref)); + } + this.currentDocument = null; + } + } + #makeEmbeddedFilesTree() { + const { + embeddedFiles + } = this; + if (embeddedFiles.size === 0) { + return; + } + if (!this.namesDict) { + [this.namesRef, this.namesDict] = this.newDict; + this.rootDict.set("Names", this.namesRef); + } + this.namesDict.set("EmbeddedFiles", this.#makeNameNumTree(Array.from(embeddedFiles.entries()), true)); + } + #makeDestinationsTree() { + const { + namedDestinations + } = this; + if (namedDestinations.size === 0) { + return; + } + if (!this.namesDict) { + [this.namesRef, this.namesDict] = this.newDict; + this.rootDict.set("Names", this.namesRef); + } + this.namesDict.set("Dests", this.#makeNameNumTree(Array.from(namedDestinations.entries()), true)); + } + #makeStructTree() { + const { + structTreeKids + } = this; + if (!structTreeKids?.length) { + return; + } + const { + rootDict + } = this; + const structTreeRef = this.newRef; + const structTree = this.xref[structTreeRef.num] = new Dict(); + structTree.setIfName("Type", "StructTreeRoot"); + structTree.setIfArray("K", structTreeKids); + for (const kidRef of structTreeKids) { + const kid = this.xref[kidRef.num]; + const type = kid.get("Type"); + if (!type || isName(type, "StructElem")) { + kid.set("P", structTreeRef); + } + } + if (this.parentTree.size > 0) { + const parentTreeRef = this.#makeNameNumTree(Array.from(this.parentTree.entries()), false); + const parentTree = this.xref[parentTreeRef.num]; + parentTree.setIfName("Type", "ParentTree"); + structTree.set("ParentTree", parentTreeRef); + structTree.set("ParentTreeNextKey", this.parentTree.size); + } + if (this.idTree.size > 0) { + const idTreeRef = this.#makeNameNumTree(Array.from(this.idTree.entries()), true); + const idTree = this.xref[idTreeRef.num]; + idTree.setIfName("Type", "IDTree"); + structTree.set("IDTree", idTreeRef); + } + if (this.classMap.size > 0) { + const classMapRef = this.newRef; + this.xref[classMapRef.num] = this.classMap; + structTree.set("ClassMap", classMapRef); + } + if (this.roleMap.size > 0) { + const roleMapRef = this.newRef; + this.xref[roleMapRef.num] = this.roleMap; + structTree.set("RoleMap", roleMapRef); + } + if (this.namespaces.size > 0) { + const namespacesRef = this.newRef; + this.xref[namespacesRef.num] = Array.from(this.namespaces.values()); + structTree.set("Namespaces", namespacesRef); + } + if (this.structTreeAF.length > 0) { + const structTreeAFRef = this.newRef; + this.xref[structTreeAFRef.num] = this.structTreeAF; + structTree.set("AF", structTreeAFRef); + } + if (this.structTreePronunciationLexicon.length > 0) { + const structTreePronunciationLexiconRef = this.newRef; + this.xref[structTreePronunciationLexiconRef.num] = this.structTreePronunciationLexicon; + structTree.set("PronunciationLexicon", structTreePronunciationLexiconRef); + } + rootDict.set("StructTreeRoot", structTreeRef); + } + #makeAcroForm() { + if (this.fields.length === 0) { + return; + } + const { + rootDict + } = this; + const acroFormRef = this.newRef; + const acroForm = this.xref[acroFormRef.num] = new Dict(); + rootDict.set("AcroForm", acroFormRef); + acroForm.set("Fields", this.fields); + if (this.acroFormNeedAppearances) { + acroForm.set("NeedAppearances", true); + } + if (this.acroFormSigFlags > 0) { + acroForm.set("SigFlags", this.acroFormSigFlags); + } + acroForm.setIfArray("CO", this.acroFormCalculationOrder); + acroForm.setIfDict("DR", this.acroFormDefaultResources); + if (this.acroFormDefaultAppearance) { + acroForm.set("DA", this.acroFormDefaultAppearance); + } + if (this.acroFormQ > 0) { + acroForm.set("Q", this.acroFormQ); + } + } + async #makeRoot() { + const { + rootDict + } = this; + rootDict.setIfName("Type", "Catalog"); + rootDict.setIfName("Version", this.version); + this.#makeAcroForm(); + this.#makePageTree(); + this.#makePageLabelsTree(); + this.#makeEmbeddedFilesTree(); + this.#makeDestinationsTree(); + this.#makeStructTree(); + await this.#makeOutline(); + } + #makeInfo() { + const infoMap = new Map(); + if (this.isSingleFile) { + const firstRealPage = this.oldPages.find(p => !!p); + const { + xref: { + trailer + } + } = firstRealPage.documentData.document; + const oldInfoDict = trailer.get("Info"); + for (const [key, value] of oldInfoDict || []) { + if (typeof value === "string") { + infoMap.set(key, stringToPDFString(value)); + } + } + } + infoMap.delete("ModDate"); + infoMap.set("CreationDate", getModificationDate()); + infoMap.set("Creator", "PDF.js"); + infoMap.set("Producer", "Firefox"); + if (this.author) { + infoMap.set("Author", this.author); + } + if (this.title) { + infoMap.set("Title", this.title); + } + for (const [key, value] of infoMap) { + this.infoDict.set(key, stringToAsciiOrUTF16BE(value)); + } + return infoMap; + } + async #makeEncrypt() { + if (!this.isSingleFile) { + return [null, null, null]; + } + const firstRealPage = this.oldPages.find(p => !!p); + const { + documentData + } = firstRealPage; + const { + document: { + xref: { + trailer, + encrypt + } + } + } = documentData; + if (!trailer.has("Encrypt")) { + return [null, null, null]; + } + const encryptDict = trailer.get("Encrypt"); + if (!(encryptDict instanceof Dict)) { + return [null, null, null]; + } + this.currentDocument = documentData; + const result = [await this.#cloneObject(encryptDict, trailer.xref), encrypt, trailer.get("ID")]; + this.currentDocument = null; + return result; + } + async #createChanges() { + const changes = new RefSetCache(); + changes.put(Ref.get(0, 0xffff), { + data: null + }); + for (let i = 1, ii = this.xref.length; i < ii; i++) { + if (this.objStreamRefs?.has(i)) { + await this.#createObjectStream(Ref.get(i, 0), this.xref[i], changes); + } else { + changes.put(Ref.get(i, 0), { + data: this.xref[i] + }); + } + } + return [changes, this.newRef]; + } + async #createObjectStream(objStreamRef, objRefs, changes) { + const streamBuffer = [""]; + const objOffsets = []; + let offset = 0; + const buffer = []; + for (let i = 0, ii = objRefs.length; i < ii; i++) { + const objRef = objRefs[i]; + changes.put(objRef, { + data: null, + objStreamRef, + index: i + }); + objOffsets.push(`${objRef.num} ${offset}`); + const data = this.xref[objRef.num]; + await writeValue(data, buffer, null); + const obj = buffer.join(""); + buffer.length = 0; + streamBuffer.push(obj); + offset += obj.length + 1; + } + streamBuffer[0] = objOffsets.join("\n"); + const dict = new Dict(); + dict.setIfName("Type", "ObjStm"); + dict.set("N", objRefs.length); + dict.set("First", streamBuffer[0].length + 1); + const objStream = new StringStream(streamBuffer.join("\n"), dict); + changes.put(objStreamRef, { + data: objStream + }); + } + async writePDF() { + await this.#makeRoot(); + const infoMap = this.#makeInfo(); + const [encryptRef, encrypt, fileIds] = await this.#makeEncrypt(); + const [changes, xrefTableRef] = await this.#createChanges(); + const header = stringToBytes(`%PDF-${this.version}\n%\xfa\xde\xfa\xce`); + return incrementalUpdate({ + originalData: header, + changes, + xrefInfo: { + startXRef: null, + rootRef: this.rootRef, + infoRef: this.infoRef, + encryptRef, + newRef: xrefTableRef, + fileIds: fileIds || [null, null], + infoMap + }, + useXrefStream: this.useObjectStreams, + xref: { + encrypt, + encryptRef + } + }); + } +} -class PDFWorkerStream { - constructor(msgHandler) { - this._msgHandler = msgHandler; - this._contentLength = null; - this._fullRequestReader = null; - this._rangeRequestReaders = []; +;// ./src/shared/base_pdf_stream.js + +class BasePDFStream { + #PDFStreamReader = null; + #PDFStreamRangeReader = null; + _fullReader = null; + _rangeReaders = new Set(); + _source = null; + constructor(source, PDFStreamReader, PDFStreamRangeReader) { + this._source = source; + this.#PDFStreamReader = PDFStreamReader; + this.#PDFStreamRangeReader = PDFStreamRangeReader; + } + get _progressiveDataLength() { + return this._fullReader?._loaded ?? 0; } getFullReader() { - assert(!this._fullRequestReader, "PDFWorkerStream.getFullReader can only be called once."); - this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler); - return this._fullRequestReader; + assert(!this._fullReader, "BasePDFStream.getFullReader can only be called once."); + return this._fullReader = new this.#PDFStreamReader(this); } getRangeReader(begin, end) { - const reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler); - this._rangeRequestReaders.push(reader); + if (end <= this._progressiveDataLength) { + return null; + } + const reader = new this.#PDFStreamRangeReader(this, begin, end); + this._rangeReaders.add(reader); return reader; } cancelAllRequests(reason) { - this._fullRequestReader?.cancel(reason); - for (const reader of this._rangeRequestReaders.slice(0)) { + this._fullReader?.cancel(reason); + for (const reader of new Set(this._rangeReaders)) { reader.cancel(reason); } } } -class PDFWorkerStreamReader { - constructor(msgHandler) { - this._msgHandler = msgHandler; - this.onProgress = null; - this._contentLength = null; - this._isRangeSupported = false; - this._isStreamingSupported = false; - const readableStream = this._msgHandler.sendWithStream("GetReader"); - this._reader = readableStream.getReader(); - this._headersReady = this._msgHandler.sendWithPromise("ReaderHeadersReady").then(data => { - this._isStreamingSupported = data.isStreamingSupported; - this._isRangeSupported = data.isRangeSupported; - this._contentLength = data.contentLength; +class BasePDFStreamReader { + onProgress = null; + _contentLength = 0; + _filename = null; + _headersCapability = Promise.withResolvers(); + _isRangeSupported = false; + _isStreamingSupported = false; + _loaded = 0; + _stream = null; + constructor(stream) { + this._stream = stream; + } + _callOnProgress() { + this.onProgress?.({ + loaded: this._loaded, + total: this._contentLength }); } get headersReady() { - return this._headersReady; + return this._headersCapability.promise; + } + get filename() { + return this._filename; } get contentLength() { return this._contentLength; } + get isRangeSupported() { + return this._isRangeSupported; + } get isStreamingSupported() { return this._isStreamingSupported; } - get isRangeSupported() { - return this._isRangeSupported; + async read() { + unreachable("Abstract method `read` called"); + } + cancel(reason) { + unreachable("Abstract method `cancel` called"); + } +} +class BasePDFStreamRangeReader { + _stream = null; + constructor(stream, begin, end) { + this._stream = stream; + } + async read() { + unreachable("Abstract method `read` called"); + } + cancel(reason) { + unreachable("Abstract method `cancel` called"); + } +} + +;// ./src/core/worker_stream.js + +class PDFWorkerStream extends BasePDFStream { + constructor(source) { + super(source, PDFWorkerStreamReader, PDFWorkerStreamRangeReader); + } +} +class PDFWorkerStreamReader extends BasePDFStreamReader { + _reader = null; + constructor(stream) { + super(stream); + const { + msgHandler + } = stream._source; + const readableStream = msgHandler.sendWithStream("GetReader"); + this._reader = readableStream.getReader(); + msgHandler.sendWithPromise("ReaderHeadersReady").then(data => { + this._contentLength = data.contentLength; + this._isStreamingSupported = data.isStreamingSupported; + this._isRangeSupported = data.isRangeSupported; + this._headersCapability.resolve(); + }, this._headersCapability.reject); } async read() { const { @@ -56720,19 +63613,19 @@ this._reader.cancel(reason); } } -class PDFWorkerStreamRangeReader { - constructor(begin, end, msgHandler) { - this._msgHandler = msgHandler; - this.onProgress = null; - const readableStream = this._msgHandler.sendWithStream("GetRangeReader", { +class PDFWorkerStreamRangeReader extends BasePDFStreamRangeReader { + _reader = null; + constructor(stream, begin, end) { + super(stream, begin, end); + const { + msgHandler + } = stream._source; + const readableStream = msgHandler.sendWithStream("GetRangeReader", { begin, end }); this._reader = readableStream.getReader(); } - get isStreamingSupported() { - return false; - } async read() { const { value, @@ -56754,7 +63647,9 @@ } } -;// CONCATENATED MODULE: ./src/core/worker.js +;// ./src/core/worker.js + + @@ -56787,21 +63682,24 @@ } } class WorkerMessageHandler { + static { + if (typeof window === "undefined" && !isNodeJS && typeof self !== "undefined" && typeof self.postMessage === "function" && "onmessage" in self) { + this.initializeFromPort(self); + } + } static setup(handler, port) { let testMessageProcessed = false; - handler.on("test", function (data) { + handler.on("test", data => { if (testMessageProcessed) { return; } testMessageProcessed = true; handler.send("test", data instanceof Uint8Array); }); - handler.on("configure", function (data) { + handler.on("configure", data => { setVerbosityLevel(data.verbosity); }); - handler.on("GetDocRequest", function (data) { - return WorkerMessageHandler.createDocumentHandler(data, port); - }); + handler.on("GetDocRequest", data => this.createDocumentHandler(data, port)); } static createDocumentHandler(docParams, port) { let pdfManager; @@ -56813,16 +63711,16 @@ docId, apiVersion } = docParams; - const workerVersion = "4.1.392"; + const workerVersion = "6.1.200"; if (apiVersion !== workerVersion) { throw new Error(`The API version "${apiVersion}" does not match ` + `the Worker version "${workerVersion}".`); } - const enumerableProperties = []; - for (const property in []) { - enumerableProperties.push(property); + const buildMsg = (type, prop) => `The \`${type}.prototype\` contains unexpected enumerable property ` + `"${prop}", thus breaking e.g. \`for...in\` iteration of ${type}s.`; + for (const prop in {}) { + throw new Error(buildMsg("Object", prop)); } - if (enumerableProperties.length) { - throw new Error("The `Array.prototype` contains unexpected enumerable properties: " + enumerableProperties.join(", ") + "; thus breaking e.g. `for...in` iteration of `Array`s."); + for (const prop in []) { + throw new Error(buildMsg("Array", prop)); } const workerHandlerName = docId + "_worker"; let handler = new MessageHandler(workerHandlerName, docId, port); @@ -56839,16 +63737,13 @@ WorkerTasks.delete(task); } async function loadDocument(recoveryMode) { - await pdfManager.ensureDoc("checkHeader"); - await pdfManager.ensureDoc("parseStartXRef"); - await pdfManager.ensureDoc("parse", [recoveryMode]); - await pdfManager.ensureDoc("checkFirstPage", [recoveryMode]); - await pdfManager.ensureDoc("checkLastPage", [recoveryMode]); + await pdfManager.initDocument(recoveryMode); const isPureXfa = await pdfManager.ensureDoc("isPureXfa"); if (isPureXfa) { - const task = new WorkerTask("loadXfaFonts"); + const task = new WorkerTask("loadXfaResources"); startWorkerTask(task); - await Promise.all([pdfManager.loadXfaFonts(handler, task).catch(reason => {}).then(() => finishWorkerTask(task)), pdfManager.loadXfaImages()]); + await pdfManager.ensureDoc("loadXfaResources", [handler, task]); + finishWorkerTask(task); } const [numPages, fingerprints] = await Promise.all([pdfManager.ensureDoc("numPages"), pdfManager.ensureDoc("fingerprints")]); const htmlForXfa = isPureXfa ? await pdfManager.ensureDoc("htmlForXfa") : null; @@ -56858,12 +63753,11 @@ htmlForXfa }; } - function getPdfManager({ + async function getPdfManager({ data, password, disableAutoFetch, rangeChunkSize, - length, docBaseUrl, enableXfa, evaluatorOptions @@ -56876,104 +63770,93 @@ enableXfa, evaluatorOptions, handler, - length, + length: 0, password, rangeChunkSize }; - const pdfManagerCapability = Promise.withResolvers(); - let newPdfManager; if (data) { - try { - pdfManagerArgs.source = data; - newPdfManager = new LocalPdfManager(pdfManagerArgs); - pdfManagerCapability.resolve(newPdfManager); - } catch (ex) { - pdfManagerCapability.reject(ex); - } - return pdfManagerCapability.promise; + pdfManagerArgs.source = data; + return new LocalPdfManager(pdfManagerArgs); } - let pdfStream, + const pdfStream = new PDFWorkerStream({ + msgHandler: handler + }), + fullReader = pdfStream.getFullReader(); + const { + promise, + resolve, + reject + } = Promise.withResolvers(); + let newPdfManager, cachedChunks = []; - try { - pdfStream = new PDFWorkerStream(handler); - } catch (ex) { - pdfManagerCapability.reject(ex); - return pdfManagerCapability.promise; - } - const fullRequest = pdfStream.getFullReader(); - fullRequest.headersReady.then(function () { - if (!fullRequest.isRangeSupported) { + cancelXHRs = reason => pdfStream.cancelAllRequests(reason); + fullReader.headersReady.then(() => { + if (!fullReader.isRangeSupported) { return; } pdfManagerArgs.source = pdfStream; - pdfManagerArgs.length = fullRequest.contentLength; - pdfManagerArgs.disableAutoFetch ||= fullRequest.isStreamingSupported; + pdfManagerArgs.length = fullReader.contentLength; + pdfManagerArgs.disableAutoFetch ||= fullReader.isStreamingSupported; newPdfManager = new NetworkPdfManager(pdfManagerArgs); for (const chunk of cachedChunks) { newPdfManager.sendProgressiveData(chunk); } - cachedChunks = []; - pdfManagerCapability.resolve(newPdfManager); + cachedChunks = null; + resolve(newPdfManager); cancelXHRs = null; - }).catch(function (reason) { - pdfManagerCapability.reject(reason); + }).catch(reason => { + reject(reason); cancelXHRs = null; }); - let loaded = 0; - const flushChunks = function () { - const pdfFile = arrayBuffersToBytes(cachedChunks); - if (length && pdfFile.length !== length) { - warn("reported HTTP length is different from actual"); + async function readData() { + let loaded = 0; + while (true) { + const { + value, + done + } = await fullReader.read(); + ensureNotTerminated(); + if (done) { + break; + } + loaded += value.byteLength; + if (!fullReader.isStreamingSupported) { + handler.send("DocProgress", { + loaded, + total: fullReader.contentLength + }); + } + if (newPdfManager) { + newPdfManager.sendProgressiveData(value); + } else { + cachedChunks.push(value); + } } - try { - pdfManagerArgs.source = pdfFile; + if (!newPdfManager) { + pdfManagerArgs.source = arrayBuffersToBytes(cachedChunks); + cachedChunks = null; newPdfManager = new LocalPdfManager(pdfManagerArgs); - pdfManagerCapability.resolve(newPdfManager); - } catch (ex) { - pdfManagerCapability.reject(ex); + resolve(newPdfManager); } - cachedChunks = []; - }; - new Promise(function (resolve, reject) { - const readChunk = function ({ - value, - done - }) { - try { - ensureNotTerminated(); - if (done) { - if (!newPdfManager) { - flushChunks(); - } - cancelXHRs = null; - return; - } - loaded += value.byteLength; - if (!fullRequest.isStreamingSupported) { - handler.send("DocProgress", { - loaded, - total: Math.max(loaded, fullRequest.contentLength || 0) - }); - } - if (newPdfManager) { - newPdfManager.sendProgressiveData(value); - } else { - cachedChunks.push(value); - } - fullRequest.read().then(readChunk, reject); - } catch (e) { - reject(e); - } - }; - fullRequest.read().then(readChunk, reject); - }).catch(function (e) { - pdfManagerCapability.reject(e); + cancelXHRs = null; + } + readData().catch(reason => { + reject(reason); cancelXHRs = null; }); - cancelXHRs = function (reason) { - pdfStream.cancelAllRequests(reason); - }; - return pdfManagerCapability.promise; + return promise; + } + async function getPassword(ex) { + const task = new WorkerTask(`PasswordException: response ${ex.code}`); + startWorkerTask(task); + try { + const res = await handler.sendWithPromise("PasswordRequest", ex); + return res.password; + } finally { + Promise.resolve().then(() => { + finishWorkerTask(task); + }); + } } function setupDoc(data) { function onSuccess(doc) { @@ -56983,24 +63866,18 @@ }); } function onFailure(ex) { - ensureNotTerminated(); + if (terminated) { + return; + } if (ex instanceof PasswordException) { - const task = new WorkerTask(`PasswordException: response ${ex.code}`); - startWorkerTask(task); - handler.sendWithPromise("PasswordRequest", ex).then(function ({ - password - }) { - finishWorkerTask(task); + getPassword(ex).then(password => { pdfManager.updatePassword(password); pdfManagerReady(); - }).catch(function () { - finishWorkerTask(task); + }).catch(() => { handler.send("DocException", ex); }); - } else if (ex instanceof InvalidPDFException || ex instanceof MissingPDFException || ex instanceof UnexpectedResponseException || ex instanceof UnknownErrorException) { - handler.send("DocException", ex); } else { - handler.send("DocException", new UnknownErrorException(ex.message, ex.toString())); + handler.send("DocException", wrapReason(ex)); } } function pdfManagerReady() { @@ -57014,7 +63891,7 @@ pdfManager.requestLoadedStream().then(function () { ensureNotTerminated(); loadDocument(true).then(onSuccess, onFailure); - }); + }, onFailure); }); } ensureNotTerminated(); @@ -57028,7 +63905,7 @@ handler.send("DataLoaded", { length: stream.bytes.byteLength }); - }); + }, () => {}); }).then(pdfManagerReady, onFailure); } handler.on("GetPage", function (data) { @@ -57037,6 +63914,7 @@ return { rotate, ref, + refStr: ref?.toString() ?? null, userUnit, view }; @@ -57071,15 +63949,62 @@ handler.on("GetAttachments", function (data) { return pdfManager.ensureCatalog("attachments"); }); + handler.on("GetAttachmentContent", async function (id) { + let passwordEx; + while (true) { + const password = passwordEx ? await getPassword(passwordEx) : null; + try { + if (password) { + pdfManager.updatePassword(password); + } + return await pdfManager.ensureCatalog("attachmentContent", [id]); + } catch (ex) { + if (ex instanceof PasswordException) { + passwordEx = ex; + continue; + } + throw ex; + } + } + }); handler.on("GetDocJSActions", function (data) { return pdfManager.ensureCatalog("jsActions"); }); handler.on("GetPageJSActions", function ({ pageIndex }) { - return pdfManager.getPage(pageIndex).then(function (page) { - return pdfManager.ensure(page, "jsActions"); - }); + return pdfManager.getPage(pageIndex).then(page => pdfManager.ensure(page, "jsActions")); + }); + handler.on("GetAnnotationsByType", async function ({ + types, + pageIndexesToSkip + }) { + const [numPages, annotationGlobals] = await Promise.all([pdfManager.ensureDoc("numPages"), pdfManager.ensureDoc("annotationGlobals")]); + if (!annotationGlobals) { + return null; + } + const pagePromises = []; + const annotationPromises = []; + let task = null; + try { + for (let i = 0, ii = numPages; i < ii; i++) { + if (pageIndexesToSkip?.has(i)) { + continue; + } + if (!task) { + task = new WorkerTask("GetAnnotationsByType"); + startWorkerTask(task); + } + pagePromises.push(pdfManager.getPage(i).then(page => page.collectAnnotationsByType(handler, task, types, annotationPromises, annotationGlobals))); + } + await Promise.all(pagePromises); + const annotations = await Promise.all(annotationPromises); + return annotations.filter(a => !!a); + } finally { + if (task) { + finishWorkerTask(task); + } + } }); handler.on("GetOutline", function (data) { return pdfManager.ensureCatalog("documentOutline"); @@ -57091,15 +64016,13 @@ return pdfManager.ensureCatalog("permissions"); }); handler.on("GetMetadata", function (data) { - return Promise.all([pdfManager.ensureDoc("documentInfo"), pdfManager.ensureCatalog("metadata")]); + return Promise.all([pdfManager.ensureDoc("documentInfo"), pdfManager.ensureCatalog("metadata"), pdfManager.ensureCatalog("hasStructTree")]); }); handler.on("GetMarkInfo", function (data) { return pdfManager.ensureCatalog("markInfo"); }); handler.on("GetData", function (data) { - return pdfManager.requestLoadedStream().then(function (stream) { - return stream.bytes; - }); + return pdfManager.requestLoadedStream().then(stream => stream.bytes); }); handler.on("GetAnnotations", function ({ pageIndex, @@ -57108,17 +64031,13 @@ return pdfManager.getPage(pageIndex).then(function (page) { const task = new WorkerTask(`GetAnnotations: page ${pageIndex}`); startWorkerTask(task); - return page.getAnnotationsData(handler, task, intent).then(data => { - finishWorkerTask(task); - return data; - }, reason => { + return page.getAnnotationsData(handler, task, intent).finally(() => { finishWorkerTask(task); - throw reason; }); }); }); handler.on("GetFieldObjects", function (data) { - return pdfManager.ensureDoc("fieldObjects"); + return pdfManager.ensureDoc("fieldObjects").then(fieldObjects => fieldObjects?.allFields || null); }); handler.on("HasJSActions", function (data) { return pdfManager.ensureDoc("hasJSActions"); @@ -57126,16 +64045,106 @@ handler.on("GetCalculationOrderIds", function (data) { return pdfManager.ensureDoc("calculationOrderIds"); }); + handler.on("ExtractPages", async function ({ + pageInfos, + annotationStorage + }) { + if (!pageInfos) { + warn("extractPages: nothing to extract."); + return null; + } + if (!Array.isArray(pageInfos)) { + pageInfos = [pageInfos]; + } + let newDocumentId = 0; + for (const pageInfo of pageInfos) { + if (pageInfo.image) { + continue; + } + if (pageInfo.document === null) { + pageInfo.document = pdfManager.pdfDocument; + } else if (ArrayBuffer.isView(pageInfo.document)) { + const manager = new LocalPdfManager({ + source: pageInfo.document, + docId: `${docId}_extractPages_${newDocumentId++}`, + handler, + password: pageInfo.password ?? null, + evaluatorOptions: Object.assign({}, pdfManager.evaluatorOptions) + }); + let recoveryMode = false; + let isValid = true; + while (true) { + try { + await manager.requestLoadedStream(); + await manager.initDocument(recoveryMode); + break; + } catch (e) { + if (e instanceof XRefParseException) { + if (recoveryMode === false) { + recoveryMode = true; + continue; + } else { + isValid = false; + warn("extractPages: XRefParseException."); + } + } else if (e instanceof PasswordException) { + try { + const password = await getPassword(e); + manager.updatePassword(password); + } catch { + isValid = false; + warn("extractPages: invalid password."); + } + } else { + isValid = false; + warn("extractPages: invalid document."); + } + if (!isValid) { + break; + } + } + } + if (!isValid) { + pageInfo.document = null; + } + const isPureXfa = await manager.ensureDoc("isPureXfa"); + if (isPureXfa) { + pageInfo.document = null; + warn("extractPages does not support pure XFA documents."); + } else { + pageInfo.document = manager.pdfDocument; + } + } else { + warn("extractPages: invalid document."); + } + } + let task; + try { + const pdfEditor = new PDFEditor(); + task = new WorkerTask(`ExtractPages: ${pageInfos.length} page(s)`); + startWorkerTask(task); + const buffer = await pdfEditor.extractPages(pageInfos, annotationStorage, pdfManager.pdfDocument, handler, task); + return buffer; + } catch (reason) { + warn(`extractPages: "${reason}".`); + return null; + } finally { + if (task) { + finishWorkerTask(task); + } + } + }); handler.on("SaveDocument", async function ({ isPureXfa, numPages, annotationStorage, filename }) { - const globalPromises = [pdfManager.requestLoadedStream(), pdfManager.ensureCatalog("acroForm"), pdfManager.ensureCatalog("acroFormRef"), pdfManager.ensureDoc("startXRef"), pdfManager.ensureDoc("xref"), pdfManager.ensureDoc("linearization"), pdfManager.ensureCatalog("structTreeRoot")]; + const globalPromises = [pdfManager.requestLoadedStream(), pdfManager.ensureCatalog("acroForm"), pdfManager.ensureCatalog("acroFormRef"), pdfManager.ensureDoc("startXRef"), pdfManager.ensureDoc("xref"), pdfManager.ensureCatalog("structTreeRoot")]; + const changes = new RefSetCache(); const promises = []; const newAnnotationsByPage = !isPureXfa ? getNewAnnotationsMap(annotationStorage) : null; - const [stream, acroForm, acroFormRef, startXRef, xref, linearization, _structTreeRoot] = await Promise.all(globalPromises); + const [stream, acroForm, acroFormRef, startXRef, xref, _structTreeRoot] = await Promise.all(globalPromises); const catalogRef = xref.trailer.getRaw("Root") || null; let structTreeRoot; if (newAnnotationsByPage) { @@ -57149,7 +64158,6 @@ } } else if (await _structTreeRoot.canUpdateStructTree({ pdfManager, - xref, newAnnotationsByPage })) { structTreeRoot = _structTreeRoot; @@ -57159,60 +64167,56 @@ for (const [pageIndex, annotations] of newAnnotationsByPage) { newAnnotationPromises.push(pdfManager.getPage(pageIndex).then(page => { const task = new WorkerTask(`Save (editor): page ${pageIndex}`); - return page.saveNewAnnotations(handler, task, annotations, imagePromises).finally(function () { + startWorkerTask(task); + return page.saveNewAnnotations(handler, task, annotations, imagePromises, changes).finally(() => { finishWorkerTask(task); }); })); } if (structTreeRoot === null) { - promises.push(Promise.all(newAnnotationPromises).then(async newRefs => { + promises.push(Promise.all(newAnnotationPromises).then(async () => { await StructTreeRoot.createStructureTree({ newAnnotationsByPage, xref, catalogRef, pdfManager, - newRefs + changes }); - return newRefs; })); } else if (structTreeRoot) { - promises.push(Promise.all(newAnnotationPromises).then(async newRefs => { + promises.push(Promise.all(newAnnotationPromises).then(async () => { await structTreeRoot.updateStructureTree({ newAnnotationsByPage, pdfManager, - newRefs + changes }); - return newRefs; })); } } if (isPureXfa) { - promises.push(pdfManager.serializeXfaData(annotationStorage)); + promises.push(pdfManager.ensureDoc("serializeXfaData", [annotationStorage])); } else { for (let pageIndex = 0; pageIndex < numPages; pageIndex++) { promises.push(pdfManager.getPage(pageIndex).then(function (page) { const task = new WorkerTask(`Save: page ${pageIndex}`); - return page.save(handler, task, annotationStorage).finally(function () { + startWorkerTask(task); + return page.save(handler, task, annotationStorage, changes).finally(() => { finishWorkerTask(task); }); })); } } const refs = await Promise.all(promises); - let newRefs = []; let xfaData = null; if (isPureXfa) { xfaData = refs[0]; if (!xfaData) { return stream.bytes; } - } else { - newRefs = refs.flat(2); - if (newRefs.length === 0) { - return stream.bytes; - } + } else if (changes.size === 0) { + return stream.bytes; } - const needAppearances = acroFormRef && acroForm instanceof Dict && newRefs.some(ref => ref.needAppearances); + const needAppearances = acroFormRef && acroForm instanceof Dict && changes.values().some(ref => ref.needAppearances); const xfa = acroForm instanceof Dict && acroForm.get("XFA") || null; let xfaDatasetsRef = null; let hasXfaDatasetsEntry = false; @@ -57231,30 +64235,30 @@ } let newXrefInfo = Object.create(null); if (xref.trailer) { - const infoObj = Object.create(null); + const infoMap = new Map(); const xrefInfo = xref.trailer.get("Info") || null; if (xrefInfo instanceof Dict) { - xrefInfo.forEach((key, value) => { + for (const [key, value] of xrefInfo) { if (typeof value === "string") { - infoObj[key] = stringToPDFString(value); + infoMap.set(key, stringToPDFString(value)); } - }); + } } newXrefInfo = { rootRef: catalogRef, encryptRef: xref.trailer.getRaw("Encrypt") || null, newRef: xref.getNewTemporaryRef(), infoRef: xref.trailer.getRaw("Info") || null, - info: infoObj, + infoMap, fileIds: xref.trailer.get("ID") || null, - startXRef: linearization ? startXRef : xref.lastXRefStreamPos ?? startXRef, + startXRef, filename }; } return incrementalUpdate({ originalData: stream.bytes, xrefInfo: newXrefInfo, - newRefs, + changes, xref, hasXfa: !!xfa, xfaDatasetsRef, @@ -57269,8 +64273,11 @@ }); }); handler.on("GetOperatorList", function (data, sink) { - const pageIndex = data.pageIndex; - pdfManager.getPage(pageIndex).then(function (page) { + const { + pageId, + pageIndex + } = data; + pdfManager.getPage(pageId).then(function (page) { const task = new WorkerTask(`GetOperatorList: page ${pageIndex}`); startWorkerTask(task); const start = verbosity >= VerbosityLevel.INFOS ? Date.now() : 0; @@ -57280,29 +64287,32 @@ task, intent: data.intent, cacheKey: data.cacheKey, - annotationStorage: data.annotationStorage - }).then(function (operatorListInfo) { - finishWorkerTask(task); + annotationStorage: data.annotationStorage, + modifiedIds: data.modifiedIds, + pageIndex + }).then(operatorListInfo => { if (start) { info(`page=${pageIndex + 1} - getOperatorList: time=` + `${Date.now() - start}ms, len=${operatorListInfo.length}`); } sink.close(); - }, function (reason) { - finishWorkerTask(task); + }, reason => { if (task.terminated) { return; } sink.error(reason); + }).finally(() => { + finishWorkerTask(task); }); }); }); handler.on("GetTextContent", function (data, sink) { const { + pageId, pageIndex, includeMarkedContent, disableNormalization } = data; - pdfManager.getPage(pageIndex).then(function (page) { + pdfManager.getPage(pageId).then(function (page) { const task = new WorkerTask("GetTextContent: page " + pageIndex); startWorkerTask(task); const start = verbosity >= VerbosityLevel.INFOS ? Date.now() : 0; @@ -57312,25 +64322,23 @@ sink, includeMarkedContent, disableNormalization - }).then(function () { - finishWorkerTask(task); + }).then(() => { if (start) { info(`page=${pageIndex + 1} - getTextContent: time=` + `${Date.now() - start}ms`); } sink.close(); - }, function (reason) { - finishWorkerTask(task); + }, reason => { if (task.terminated) { return; } sink.error(reason); + }).finally(() => { + finishWorkerTask(task); }); }); }); handler.on("GetStructTree", function (data) { - return pdfManager.getPage(data.pageIndex).then(function (page) { - return pdfManager.ensure(page, "getStructTree"); - }); + return pdfManager.getPage(data.pageIndex).then(page => pdfManager.ensure(page, "getStructTree")); }); handler.on("FontFallback", function (data) { return pdfManager.fontFallback(data.id, handler); @@ -57338,7 +64346,7 @@ handler.on("Cleanup", function (data) { return pdfManager.cleanup(true); }); - handler.on("Terminate", function (data) { + handler.on("Terminate", async function (data) { terminated = true; const waitOn = []; if (pdfManager) { @@ -57349,17 +64357,14 @@ } else { clearGlobalCaches(); } - if (cancelXHRs) { - cancelXHRs(new AbortException("Worker was terminated.")); - } + cancelXHRs?.(new AbortException("Worker was terminated.")); for (const task of WorkerTasks) { waitOn.push(task.finished); task.terminate(); } - return Promise.all(waitOn).then(function () { - handler.destroy(); - handler = null; - }); + await Promise.all(waitOn); + handler.destroy(); + handler = null; }); handler.on("Ready", function (data) { setupDoc(docParams); @@ -57369,23 +64374,17 @@ } static initializeFromPort(port) { const handler = new MessageHandler("worker", "main", port); - WorkerMessageHandler.setup(handler, port); + this.setup(handler, port); handler.send("ready", null); } } -function isMessagePort(maybePort) { - return typeof maybePort.postMessage === "function" && "onmessage" in maybePort; -} -if (typeof window === "undefined" && !isNodeJS && typeof self !== "undefined" && isMessagePort(self)) { - WorkerMessageHandler.initializeFromPort(self); -} -;// CONCATENATED MODULE: ./src/pdf.worker.js +;// ./src/pdf.worker.js -const pdfjsVersion = "4.1.392"; -const pdfjsBuild = "fcb76a78d"; +globalThis.pdfjsWorker = { + WorkerMessageHandler: WorkerMessageHandler +}; -var __webpack_exports__WorkerMessageHandler = __webpack_exports__.WorkerMessageHandler; -export { __webpack_exports__WorkerMessageHandler as WorkerMessageHandler }; +export { WorkerMessageHandler }; //# sourceMappingURL=pdf.worker.mjs.map \ No newline at end of file diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/debugger.css webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/debugger.css --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/debugger.css 2026-01-20 14:08:39.345689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/debugger.css 2026-07-09 07:12:41.852801600 +0000 @@ -22,7 +22,10 @@ font: message-box; } #PDFBug { - background-color: rgb(255 255 255); + color-scheme: only light; + + background-color: white; + color: black; border: 1px solid rgb(102 102 102); position: fixed; top: 32px; @@ -109,3 +112,34 @@ background-color: rgb(255 255 255 / 0.6); color: rgb(0 0 0); } + +.pdfBugGroupsLayer { + position: absolute; + inset: 0; + pointer-events: none; + + > * { + position: absolute; + outline-color: red; + outline-width: 2px; + + --hover-outline-style: solid !important; + --hover-background-color: rgb(255 0 0 / 0.2); + + &:hover { + outline-style: var(--hover-outline-style); + background-color: var(--hover-background-color); + cursor: pointer; + } + + .showDebugBoxes & { + outline-style: dashed; + } + } +} + +.showDebugBoxes { + .pdfBugGroupsLayer { + pointer-events: all; + } +} diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/debugger.mjs webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/debugger.mjs --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/debugger.mjs 2026-01-20 14:08:39.345689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/debugger.mjs 2026-07-09 07:12:41.852801600 +0000 @@ -200,6 +200,10 @@ active: false, // Stepper specific functions. create(pageIndex) { + const pageContainer = document.querySelector( + `#viewer div[data-page-number="${pageIndex + 1}"]` + ); + const debug = document.createElement("div"); debug.id = "stepper" + pageIndex; debug.hidden = true; @@ -210,7 +214,12 @@ b.value = pageIndex; stepperChooser.append(b); const initBreakPoints = breakPoints[pageIndex] || []; - const stepper = new Stepper(debug, pageIndex, initBreakPoints); + const stepper = new Stepper( + debug, + pageIndex, + initBreakPoints, + pageContainer + ); steppers.push(stepper); if (steppers.length === 1) { this.selectStepper(pageIndex, false); @@ -277,7 +286,7 @@ return simpleObj; } - constructor(panel, pageIndex, initialBreakPoints) { + constructor(panel, pageIndex, initialBreakPoints, pageContainer) { this.panel = panel; this.breakPoint = 0; this.nextBreakPoint = null; @@ -286,11 +295,20 @@ this.currentIdx = -1; this.operatorListIdx = 0; this.indentLevel = 0; + this.operatorsGroups = null; + this.pageContainer = pageContainer; } init(operatorList) { const panel = this.panel; const content = this.#c("div", "c=continue, s=step"); + + const showBoxesToggle = this.#c("label", "Show bounding boxes"); + const showBoxesCheckbox = this.#c("input"); + showBoxesCheckbox.type = "checkbox"; + showBoxesToggle.prepend(showBoxesCheckbox); + content.append(this.#c("br"), showBoxesToggle); + const table = this.#c("table"); content.append(table); table.cellSpacing = 0; @@ -305,6 +323,21 @@ panel.append(content); this.table = table; this.updateOperatorList(operatorList); + + const hoverStyle = this.#c("style"); + this.hoverStyle = hoverStyle; + content.prepend(hoverStyle); + table.addEventListener("mouseover", this.#handleStepHover.bind(this)); + table.addEventListener("mouseleave", e => { + hoverStyle.innerText = ""; + }); + + showBoxesCheckbox.addEventListener("change", () => { + this.pageContainer.classList.toggle( + "showDebugBoxes", + showBoxesCheckbox.checked + ); + }); } updateOperatorList(operatorList) { @@ -374,6 +407,14 @@ table.classList.add("showText"); decArgs.append(table); table.append(charCodeRow, fontCharRow, unicodeRow); + } else if (fn === "constructPath") { + const [op, [path], minMax] = args; + decArgs = this.#c("td"); + decArgs.append(JSON.stringify(this.#simplifyArgs(path))); + decArgs.append(this.#c("br")); + decArgs.append(`minMax: ${JSON.stringify(this.#simplifyArgs(minMax))}`); + decArgs.append(this.#c("br")); + decArgs.append(`→ ${opMap[op]}`); } else if (fn === "restore" && this.indentLevel > 0) { this.indentLevel--; } @@ -397,10 +438,193 @@ this.table.append(chunk); } - getNextBreakPoint() { - this.breakPoints.sort(function (a, b) { - return a - b; + setOperatorBBoxes(bboxes, metadata) { + let boxesContainer = this.pageContainer.querySelector(".pdfBugGroupsLayer"); + if (!boxesContainer) { + boxesContainer = this.#c("div"); + boxesContainer.classList.add("pdfBugGroupsLayer"); + this.pageContainer.append(boxesContainer); + + boxesContainer.addEventListener( + "click", + this.#handleDebugBoxClick.bind(this) + ); + boxesContainer.addEventListener( + "mouseover", + this.#handleDebugBoxHover.bind(this) + ); + } + boxesContainer.innerHTML = ""; + + const dependents = new Map(); + for (const [dependentIdx, { dependencies: ownDependencies }] of metadata) { + for (const dependencyIdx of ownDependencies) { + dependents + .getOrInsertComputed(dependencyIdx, () => new Set()) + .add(dependentIdx); + } + } + + const groups = Array.from({ length: bboxes.length }, (_, i) => { + let minX = null; + let minY = null; + let maxX = null; + let maxY = null; + if (!bboxes.isEmpty(i)) { + minX = bboxes.minX(i); + minY = bboxes.minY(i); + maxX = bboxes.maxX(i); + maxY = bboxes.maxY(i); + } + + return { + minX, + minY, + maxX, + maxY, + dependencies: Array.from(metadata.get(i)?.dependencies ?? []).sort(), + dependents: Array.from(dependents.get(i) ?? []).sort(), + isRenderingOperation: metadata.get(i)?.isRenderingOperation ?? false, + idx: i, + }; }); + this.operatorsGroups = groups; + + const operatorsGroupsByZindex = groups.toSorted((a, b) => { + if (a.minX === null) { + return b.minX === null ? 0 : 1; + } + if (b.minX === null) { + return -1; + } + + const diffs = [ + a.minY - b.minY, + a.minX - b.minX, + b.maxY - a.maxY, + b.maxX - a.maxX, + ]; + for (const diff of diffs) { + if (Math.abs(diff) > 0.01) { + return Math.sign(diff); + } + } + for (const diff of diffs) { + if (Math.abs(diff) > 0.0001) { + return Math.sign(diff); + } + } + return 0; + }); + + for (let i = 0; i < operatorsGroupsByZindex.length; i++) { + const group = operatorsGroupsByZindex[i]; + if (group.minX !== null) { + const el = this.#c("div"); + el.style.left = `${group.minX * 100}%`; + el.style.top = `${group.minY * 100}%`; + el.style.width = `${(group.maxX - group.minX) * 100}%`; + el.style.height = `${(group.maxY - group.minY) * 100}%`; + el.dataset.idx = group.idx; + boxesContainer.append(el); + } + } + } + + #handleStepHover(e) { + const tr = e.target.closest("tr"); + if (!tr || tr.dataset.idx === undefined) { + return; + } + + const index = +tr.dataset.idx; + this.#highlightStepsGroup(index); + } + + #handleDebugBoxHover(e) { + if (e.target.dataset.idx === undefined) { + return; + } + + const idx = Number(e.target.dataset.idx); + this.#highlightStepsGroup(idx); + } + + #handleDebugBoxClick(e) { + if (e.target.dataset.idx === undefined) { + return; + } + + const idx = Number(e.target.dataset.idx); + + this.table.childNodes[idx].scrollIntoView(); + } + + #highlightStepsGroup(index) { + const group = this.operatorsGroups?.[index]; + if (!group) { + return; + } + + const renderingColor = `rgba(0, 0, 0, 0.1)`; + const dependencyColor = `rgba(0, 255, 255, 0.1)`; + const dependentColor = `rgba(255, 0, 0, 0.1)`; + + const solid = color => `background-color: ${color}`; + // Used for operations that have an empty bounding box + const striped = color => ` + background-image: repeating-linear-gradient( + -45deg, + white, + white 10px, + ${color} 10px, + ${color} 20px + ) + `; + + const select = idx => `#${this.panel.id} tr[data-idx="${idx}"]`; + const selectN = idxs => + idxs.length === 0 ? "q:not(q)" : idxs.map(select).join(", "); + + const isEmpty = idx => + !this.operatorsGroups[idx] || this.operatorsGroups[idx].minX === null; + + const selfColor = group.isRenderingOperation + ? renderingColor + : dependentColor; + + this.hoverStyle.innerText = `${select(index)} { + ${group.minX === null ? striped(selfColor) : solid(selfColor)} + }`; + if (group.dependencies.length > 0) { + this.hoverStyle.innerText += ` + ${selectN(group.dependencies.filter(idx => !isEmpty(idx)))} { + ${solid(dependencyColor)} + } + ${selectN(group.dependencies.filter(isEmpty))} { + ${striped(dependencyColor)} + }`; + } + if (group.dependents.length > 0) { + this.hoverStyle.innerText += ` + ${selectN(group.dependents.filter(idx => !isEmpty(idx)))} { + ${solid(dependentColor)} + } + ${selectN(group.dependents.filter(isEmpty))} { + ${striped(dependentColor)} + }`; + } + + this.hoverStyle.innerText += ` + #viewer [data-page-number="${this.pageIndex + 1}"] .pdfBugGroupsLayer [data-idx="${index}"] { + background-color: var(--hover-background-color); + outline-style: var(--hover-outline-style); + } + `; + } + + getNextBreakPoint() { + this.breakPoints.sort((a, b) => a - b); for (const breakPoint of this.breakPoints) { if (breakPoint > this.currentIdx) { return breakPoint; @@ -433,6 +657,10 @@ this.goTo(idx); } + shouldSkip(idx) { + return false; + } + goTo(idx) { const allRows = this.panel.getElementsByClassName("line"); for (const row of allRows) { @@ -446,19 +674,11 @@ } } -const Stats = (function Stats() { +const Stats = (function () { let stats = []; function clear(node) { node.textContent = ""; // Remove any `node` contents from the DOM. } - function getStatIndex(pageNumber) { - for (const [i, stat] of stats.entries()) { - if (stat.pageNumber === pageNumber) { - return i; - } - } - return false; - } return { // Properties/functions needed by PDFBug. id: "Stats", @@ -473,8 +693,8 @@ if (!stat) { return; } - const statsIndex = getStatIndex(pageNumber); - if (statsIndex !== false) { + const statsIndex = stats.findIndex(s => s.pageNumber === pageNumber); + if (statsIndex !== -1) { stats[statsIndex].div.remove(); stats.splice(statsIndex, 1); } @@ -487,9 +707,7 @@ statsDiv.textContent = stat.toString(); wrapper.append(title, statsDiv); stats.push({ pageNumber, div: wrapper }); - stats.sort(function (a, b) { - return a.pageNumber - b.pageNumber; - }); + stats.sort((a, b) => a.pageNumber - b.pageNumber); clear(this.panel); for (const entry of stats) { this.panel.append(entry.div); Binary files /srv/release.debian.org/tmp/VF6ub91wkM/webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/iccs/CGATS001Compat-v2-micro.icc and /srv/release.debian.org/tmp/_1F8999xD6/webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/iccs/CGATS001Compat-v2-micro.icc differ diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/iccs/LICENSE webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/iccs/LICENSE --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/iccs/LICENSE 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/iccs/LICENSE 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,116 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see +http://creativecommons.org/publicdomain/zero/1.0/ diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/altText_disclaimer.svg webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/altText_disclaimer.svg --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/altText_disclaimer.svg 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/altText_disclaimer.svg 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,3 @@ + + + diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/altText_spinner.svg webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/altText_spinner.svg --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/altText_spinner.svg 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/altText_spinner.svg 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,30 @@ + + + + + + + + + diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/altText_warning.svg webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/altText_warning.svg --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/altText_warning.svg 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/altText_warning.svg 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,3 @@ + + + diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/checkmark.svg webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/checkmark.svg --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/checkmark.svg 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/checkmark.svg 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/comment-actionsButton.svg webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/comment-actionsButton.svg --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/comment-actionsButton.svg 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/comment-actionsButton.svg 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,3 @@ + + + diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/comment-closeButton.svg webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/comment-closeButton.svg --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/comment-closeButton.svg 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/comment-closeButton.svg 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,3 @@ + + + diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/comment-editButton.svg webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/comment-editButton.svg --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/comment-editButton.svg 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/comment-editButton.svg 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,8 @@ + + + + + + + + diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/comment-popup-editButton.svg webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/comment-popup-editButton.svg --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/comment-popup-editButton.svg 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/comment-popup-editButton.svg 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/editor-toolbar-edit.svg webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/editor-toolbar-edit.svg --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/editor-toolbar-edit.svg 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/editor-toolbar-edit.svg 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,3 @@ + + + diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/messageBar_closingButton.svg webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/messageBar_closingButton.svg --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/messageBar_closingButton.svg 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/messageBar_closingButton.svg 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,3 @@ + + + diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/messageBar_info.svg webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/messageBar_info.svg --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/messageBar_info.svg 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/messageBar_info.svg 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,3 @@ + + + diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/messageBar_warning.svg webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/messageBar_warning.svg --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/messageBar_warning.svg 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/messageBar_warning.svg 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,3 @@ + + + diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/pages_closeButton.svg webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/pages_closeButton.svg --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/pages_closeButton.svg 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/pages_closeButton.svg 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/pages_selected.svg webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/pages_selected.svg --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/pages_selected.svg 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/pages_selected.svg 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/pages_viewArrow.svg webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/pages_viewArrow.svg --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/pages_viewArrow.svg 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/pages_viewArrow.svg 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/pages_viewButton.svg webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/pages_viewButton.svg --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/pages_viewButton.svg 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/pages_viewButton.svg 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/toolbarButton-editorSignature.svg webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/toolbarButton-editorSignature.svg --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/toolbarButton-editorSignature.svg 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/toolbarButton-editorSignature.svg 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,6 @@ + + + + + + diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/toolbarButton-sidebarToggle.svg webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/toolbarButton-sidebarToggle.svg --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/toolbarButton-sidebarToggle.svg 2026-01-20 14:08:39.352689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/toolbarButton-sidebarToggle.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/toolbarButton-viewsManagerToggle.svg webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/toolbarButton-viewsManagerToggle.svg --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/images/toolbarButton-viewsManagerToggle.svg 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/images/toolbarButton-viewsManagerToggle.svg 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,3 @@ + + + diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ach/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ach/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ach/viewer.ftl 2026-01-20 14:08:39.354791400 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ach/viewer.ftl 2026-07-09 07:12:41.855909800 +0000 @@ -71,24 +71,12 @@ pdfjs-document-properties-button-label = Jami me gin acoya… pdfjs-document-properties-file-name = Nying pwail: pdfjs-document-properties-file-size = Dit pa pwail: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Wiye: pdfjs-document-properties-author = Ngat mucoyo: pdfjs-document-properties-subject = Subjek: pdfjs-document-properties-keywords = Lok mapire tek: pdfjs-document-properties-creation-date = Nino dwe me cwec: pdfjs-document-properties-modification-date = Nino dwe me yub: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Lacwec: pdfjs-document-properties-producer = Layub PDF: pdfjs-document-properties-version = Kit PDF: @@ -185,9 +173,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = Bal otime kun cano PDF. @@ -213,13 +198,3 @@ pdfjs-password-ok-button = OK pdfjs-password-cancel-button = Juki pdfjs-web-fonts-disabled = Kijuko dit pa coc me kakube woko: pe romo tic ki dit pa coc me PDF ma kiketo i kine. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/af/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/af/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/af/viewer.ftl 2026-01-20 14:08:39.354791400 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/af/viewer.ftl 2026-07-09 07:12:41.855909800 +0000 @@ -71,37 +71,17 @@ pdfjs-document-properties-button-label = Dokumenteienskappe… pdfjs-document-properties-file-name = Lêernaam: pdfjs-document-properties-file-size = Lêergrootte: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } kG ({ $size_b } grepe) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MG ({ $size_b } grepe) pdfjs-document-properties-title = Titel: pdfjs-document-properties-author = Outeur: pdfjs-document-properties-subject = Onderwerp: pdfjs-document-properties-keywords = Sleutelwoorde: pdfjs-document-properties-creation-date = Skeppingsdatum: pdfjs-document-properties-modification-date = Wysigingsdatum: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Skepper: pdfjs-document-properties-producer = PDF-vervaardiger: pdfjs-document-properties-version = PDF-weergawe: pdfjs-document-properties-page-count = Aantal bladsye: -## Variables: -## $width (Number) - the width of the (current) page -## $height (Number) - the height of the (current) page -## $unit (String) - the unit of measurement of the (current) page -## $name (String) - the name of the (current) page -## $orientation (String) - the orientation of the (current) page - - ## pdfjs-document-properties-close-button = Sluit @@ -172,9 +152,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = 'n Fout het voorgekom met die laai van die PDF. @@ -200,13 +177,3 @@ pdfjs-password-ok-button = OK pdfjs-password-cancel-button = Kanselleer pdfjs-web-fonts-disabled = Webfonte is gedeaktiveer: kan nie PDF-fonte wat ingebed is, gebruik nie. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/an/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/an/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/an/viewer.ftl 2026-01-20 14:08:39.355689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/an/viewer.ftl 2026-07-09 07:12:41.855909800 +0000 @@ -89,24 +89,12 @@ pdfjs-document-properties-button-label = Propiedatz d'o documento... pdfjs-document-properties-file-name = Nombre de fichero: pdfjs-document-properties-file-size = Grandaria d'o fichero: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Titol: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Afer: pdfjs-document-properties-keywords = Parolas clau: pdfjs-document-properties-creation-date = Calendata de creyación: pdfjs-document-properties-modification-date = Calendata de modificación: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Creyador: pdfjs-document-properties-producer = Creyador de PDF: pdfjs-document-properties-version = Versión de PDF: @@ -213,9 +201,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = S'ha produciu una error en cargar o PDF. @@ -226,10 +211,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -245,13 +226,3 @@ pdfjs-password-ok-button = Acceptar pdfjs-password-cancel-button = Cancelar pdfjs-web-fonts-disabled = As fuents web son desactivadas: no se puet incrustar fichers PDF. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ar/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ar/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ar/viewer.ftl 2026-01-20 14:08:39.356689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ar/viewer.ftl 2026-07-09 07:12:41.855909800 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = الصفحة الحالية (عرض URL من الصفحة الحالية) pdfjs-bookmark-button-label = الصفحة الحالية -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = افتح في تطبيق -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = افتح في تطبيق ## Secondary toolbar and context menu @@ -81,6 +75,9 @@ pdfjs-cursor-hand-tool-button = .title = فعّل أداة اليد pdfjs-cursor-hand-tool-button-label = أداة اليد +pdfjs-scroll-page-button = + .title = استخدم تمرير الصفحة +pdfjs-scroll-page-button-label = تمرير الصفحة pdfjs-scroll-vertical-button = .title = استخدم التمرير الرأسي pdfjs-scroll-vertical-button-label = التمرير الرأسي @@ -108,13 +105,13 @@ pdfjs-document-properties-file-name = اسم الملف: pdfjs-document-properties-file-size = حجم الملف: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } ك.بايت ({ $size_b } بايت) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } م.بايت ({ $size_b } بايت) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } ك.بايت ({ $b } بايتات) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } م.بايت ({ $b } بايتات) pdfjs-document-properties-title = العنوان: pdfjs-document-properties-author = المؤلف: pdfjs-document-properties-subject = الموضوع: @@ -122,9 +119,8 @@ pdfjs-document-properties-creation-date = تاريخ الإنشاء: pdfjs-document-properties-modification-date = تاريخ التعديل: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }، { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = المنشئ: pdfjs-document-properties-producer = منتج PDF: pdfjs-document-properties-version = إصدارة PDF: @@ -187,6 +183,9 @@ pdfjs-thumbs-button = .title = اعرض مُصغرات pdfjs-thumbs-button-label = مُصغّرات +pdfjs-current-outline-item-button = + .title = ابحث عن عنصر المخطّط التفصيلي الحالي +pdfjs-current-outline-item-button-label = عنصر المخطّط التفصيلي الحالي pdfjs-findbar-button = .title = ابحث في المستند pdfjs-findbar-button-label = ابحث @@ -202,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = مصغّرة صفحة { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = حدّد الصفحة { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = الصفحة { $page } من { $total } ## Find panel button title and messages @@ -216,10 +224,33 @@ pdfjs-find-next-button-label = التالي pdfjs-find-highlight-checkbox = أبرِز الكل pdfjs-find-match-case-checkbox-label = طابق حالة الأحرف -pdfjs-find-match-diacritics-checkbox-label = طابِق الحركات +pdfjs-find-match-diacritics-checkbox-label = طابِق التشكيل pdfjs-find-entire-word-checkbox-label = كلمات كاملة pdfjs-find-reached-top = تابعت من الأسفل بعدما وصلت إلى بداية المستند pdfjs-find-reached-bottom = تابعت من الأعلى بعدما وصلت إلى نهاية المستند +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [zero] لا مطابقة + [one] { $current } من أصل { $total } مطابقة + [two] { $current } من أصل { $total } مطابقة + [few] { $current } من أصل { $total } مطابقة + [many] { $current } من أصل { $total } مطابقة + *[other] { $current } من أصل { $total } مطابقة + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [zero] { $limit } مطابقة + [one] أكثر من { $limit } مطابقة + [two] أكثر من { $limit } مطابقة + [few] أكثر من { $limit } مطابقة + [many] أكثر من { $limit } مطابقة + *[other] أكثر من { $limit } مطابقات + } pdfjs-find-not-found = لا وجود للعبارة ## Predefined zoom values @@ -249,10 +280,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }، { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -260,30 +287,493 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [تعليق { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password pdfjs-password-label = أدخل لكلمة السر لفتح هذا الملف. pdfjs-password-invalid = كلمة سر خطأ. من فضلك أعد المحاولة. -pdfjs-password-ok-button = حسنا +pdfjs-password-ok-button = حسنًا pdfjs-password-cancel-button = ألغِ pdfjs-web-fonts-disabled = خطوط الوب مُعطّلة: تعذّر استخدام خطوط PDF المُضمّنة. ## Editing +pdfjs-editor-free-text-button = + .title = نص +pdfjs-editor-color-picker-free-text-input = + .title = غيِّر لون النص +pdfjs-editor-free-text-button-label = نص +pdfjs-editor-ink-button = + .title = ارسم +pdfjs-editor-color-picker-ink-input = + .title = غيِّر لون الرسم +pdfjs-editor-ink-button-label = ارسم +pdfjs-editor-stamp-button = + .title = أضِف أو حرّر الصور +pdfjs-editor-stamp-button-label = أضِف أو حرّر الصور +pdfjs-editor-highlight-button = + .title = أبرِز +pdfjs-editor-highlight-button-label = أبرِز +pdfjs-highlight-floating-button1 = + .title = أبرِز + .aria-label = أبرِز +pdfjs-highlight-floating-button-label = أبرِز +pdfjs-comment-floating-button = + .title = علق + .aria-label = علق +pdfjs-comment-floating-button-label = علق +pdfjs-editor-comment-button = + .title = علق + .aria-label = علق +pdfjs-editor-comment-button-label = التعليق +pdfjs-editor-signature-button = + .title = أضِف توقيع +pdfjs-editor-signature-button-label = أضِف توقيع + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = محرِّر الإبراز +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = محرِّر الرسم +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = محرِّر التوقيع: { $description } +pdfjs-editor-stamp-editor = + .aria-label = محرِّر الصور ## Remove button for the various kind of editor. +pdfjs-editor-remove-ink-button = + .title = أزِل الرسم +pdfjs-editor-remove-freetext-button = + .title = أزِل النص +pdfjs-editor-remove-stamp-button = + .title = أزِل الصورة +pdfjs-editor-remove-highlight-button = + .title = أزِل الإبراز +pdfjs-editor-remove-signature-button = + .title = أزِل التوقيع ## +# Editor Parameters +pdfjs-editor-free-text-color-input = اللون +pdfjs-editor-free-text-size-input = الحجم +pdfjs-editor-ink-color-input = اللون +pdfjs-editor-ink-thickness-input = السماكة +pdfjs-editor-ink-opacity-input = العتامة +pdfjs-editor-stamp-add-image-button = + .title = أضِف صورة +pdfjs-editor-stamp-add-image-button-label = أضِف صورة +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = السماكة +pdfjs-editor-free-highlight-thickness-title = + .title = غيّر السُمك عند إبراز عناصر أُخرى غير النص +pdfjs-editor-add-signature-container = + .aria-label = عناصر التحكم في التوقيع والتوقيعات المحفوظة +pdfjs-editor-signature-add-signature-button = + .title = أضِف توقيع جديد +pdfjs-editor-signature-add-signature-button-label = أضِف توقيع جديد +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = التوقيع المحفوظ: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = محرِّر النص + .default-content = ابدأ في كتابة… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [zero] تعليق + [one] تعليق + [two] تعليقات + [few] تعليقات + [many] تعليقات + *[other] تعليقات + } +pdfjs-editor-comments-sidebar-close-button = + .title = أغلِق الشريط الجانبي + .aria-label = أغلِق الشريط الجانبي +pdfjs-editor-comments-sidebar-close-button-label = أغلِق الشريط الجانبي +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = هل رأيت شيئاً جديرًا بالملاحظة؟ ابرزه واترك تعليقًا. +pdfjs-editor-comments-sidebar-no-comments-link = اطّلع على المزيد ## Alt-text dialog +pdfjs-editor-alt-text-button-label = نص بديل +pdfjs-editor-alt-text-edit-button = + .aria-label = حرّر النص البديل +pdfjs-editor-alt-text-dialog-label = اختر خيار +pdfjs-editor-alt-text-dialog-description = يساعد النص البديل عندما لا يتمكن الأشخاص من رؤية الصورة أو عندما لا يتم تحميلها. +pdfjs-editor-alt-text-add-description-label = أضِف وصف +pdfjs-editor-alt-text-add-description-description = استهدف جملتين تصفان الموضوع أو الإعداد أو الإجراءات. +pdfjs-editor-alt-text-mark-decorative-label = علّمها على أنها زخرفية +pdfjs-editor-alt-text-mark-decorative-description = يُستخدم هذا في الصور المزخرفة، مثل الحدود أو العلامات المائية. +pdfjs-editor-alt-text-cancel-button = ألغِ +pdfjs-editor-alt-text-save-button = احفظ +pdfjs-editor-alt-text-decorative-tooltip = عُلّمت على أنها زخرفية +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = على سبيل المثال، "يجلس شاب على الطاولة لتناول وجبة" +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = نص بديل ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. +pdfjs-editor-resizer-top-left = + .aria-label = الزاوية اليُسرى العُليا — غيّر الحجم +pdfjs-editor-resizer-top-middle = + .aria-label = أعلى الوسط - غيّر الحجم +pdfjs-editor-resizer-top-right = + .aria-label = الزاوية اليُمنى العُليا - غيّر الحجم +pdfjs-editor-resizer-middle-right = + .aria-label = اليمين الأوسط - غيّر الحجم +pdfjs-editor-resizer-bottom-right = + .aria-label = الزاوية اليُمنى السُفلى - غيّر الحجم +pdfjs-editor-resizer-bottom-middle = + .aria-label = أسفل الوسط - غيّر الحجم +pdfjs-editor-resizer-bottom-left = + .aria-label = الزاوية اليُسرى السُفلية - غيّر الحجم +pdfjs-editor-resizer-middle-left = + .aria-label = مُنتصف اليسار - غيّر الحجم ## Color picker +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = أبرِز اللون +pdfjs-editor-colorpicker-button = + .title = غيّر اللون +pdfjs-editor-colorpicker-dropdown = + .aria-label = اختيارات الألوان +pdfjs-editor-colorpicker-yellow = + .title = أصفر +pdfjs-editor-colorpicker-green = + .title = أخضر +pdfjs-editor-colorpicker-blue = + .title = أزرق +pdfjs-editor-colorpicker-pink = + .title = وردي +pdfjs-editor-colorpicker-red = + .title = أحمر + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = أظهِر الكل +pdfjs-editor-highlight-show-all-button = + .title = أظهِر الكل + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = حرّر النص البديل (وصف الصورة) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = أضِف النص البديل (وصف الصورة) +pdfjs-editor-new-alt-text-textarea = + .placeholder = اكتب وصفك هنا… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = وصف مختصر للأشخاص الذين لا يستطيعون رؤية الصورة أو عندما لا يتم تحميل الصورة. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = أُنشئ هذا النص البديل تلقائيًا وقد يكون غير دقيق. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = اطّلع على المزيد +pdfjs-editor-new-alt-text-create-automatically-button-label = أنشئ نص بديل تلقائيًا +pdfjs-editor-new-alt-text-not-now-button = ليس الآن +pdfjs-editor-new-alt-text-error-title = لم يتمكن من إنشاء نص بديل تلقائيًا +pdfjs-editor-new-alt-text-error-description = يُرجى كتابة نص بديلك أو المحاولة مرة أخرى لاحقًا. +pdfjs-editor-new-alt-text-error-close-button = أغلق +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = يُنزّل نموذج الذكاء الاصطناعي للنص البديل ({ $downloadedSize } من { $totalSize } م.بايت) + .aria-valuetext = يُنزّل نموذج الذكاء الاصطناعي للنص البديل ({ $downloadedSize } من { $totalSize } م.بايت) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = أُضِيف نص بديل +pdfjs-editor-new-alt-text-added-button-label = أُضِيف نص بديل +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = نص بديل مفقود +pdfjs-editor-new-alt-text-missing-button-label = نص بديل مفقود +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = راجع النص البديل +pdfjs-editor-new-alt-text-to-review-button-label = راجع النص البديل +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = أُنشئ تلقائيًا: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = إعدادات النص البديل للصورة +pdfjs-image-alt-text-settings-button-label = إعدادات النص البديل للصورة +pdfjs-editor-alt-text-settings-dialog-label = إعدادات النص البديل للصورة +pdfjs-editor-alt-text-settings-automatic-title = نص بديل تلقائي +pdfjs-editor-alt-text-settings-create-model-button-label = أنشئ نص بديل تلقائيًا +pdfjs-editor-alt-text-settings-create-model-description = يقترح أوصافًا لمساعدة الأشخاص الذين لا يستطيعون رؤية الصورة أو عندما لا يتم تحميل الصورة. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = نموذج الذكاء الاصطناعي للنص البديل ({ $totalSize } م.بايت) +pdfjs-editor-alt-text-settings-ai-model-description = يتم تشغيله محليًا على جهازك حتى تظل بياناتك خاصة. مطلوب للنص البديل التلقائي. +pdfjs-editor-alt-text-settings-delete-model-button = احذف +pdfjs-editor-alt-text-settings-download-model-button = نزّل +pdfjs-editor-alt-text-settings-downloading-model-button = يُنزل… +pdfjs-editor-alt-text-settings-editor-title = مُحرِّر النص البديل +pdfjs-editor-alt-text-settings-show-dialog-button-label = أظهِر مُحرِّر النص البديل على الفور عند إضافة صورة +pdfjs-editor-alt-text-settings-show-dialog-description = يساعدك على التأكد من أن جميع صورك تحتوي على نص بديل. +pdfjs-editor-alt-text-settings-close-button = أغلق + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = أُضيف إبراز +pdfjs-editor-freetext-added-alert = أُضيف النص +pdfjs-editor-ink-added-alert = أُضيف رسم +pdfjs-editor-stamp-added-alert = أُضيف صورة +pdfjs-editor-signature-added-alert = أُضيف توقيع + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = أُزِيل البرز +pdfjs-editor-undo-bar-message-freetext = أُزيل النص +pdfjs-editor-undo-bar-message-ink = أُزِيلت الرسمة +pdfjs-editor-undo-bar-message-stamp = أُزيلت الصورة +pdfjs-editor-undo-bar-message-signature = أُزيل التوقيع +pdfjs-editor-undo-bar-message-comment = أُزيل التعليق +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [zero] أُزيل لا تعليق + [one] أُزيل تعليق + [two] أُزيل تعليقين + [few] أُزيلت { $count } تعليقات + [many] أُزيل { $count } تعليق + *[other] أُزيل { $count } تعليق + } +pdfjs-editor-undo-bar-undo-button = + .title = تراجع +pdfjs-editor-undo-bar-undo-button-label = تراجع +pdfjs-editor-undo-bar-close-button = + .title = أغلق +pdfjs-editor-undo-bar-close-button-label = أغلق + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = يتيح هذا النموذج للمستخدم إنشاء توقيع لإضافته إلى مستند PDF. ويمكن للمستخدم تحرير الاسم (الذي يعمل أيضًا كنص بديل)، وحفظ التوقيع بشكل اختياري للاستخدام المتكرر. +pdfjs-editor-add-signature-dialog-title = أضِف توقيعًا + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = اكتب + .title = اكتب +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = ارسم + .title = ارسم +pdfjs-editor-add-signature-image-button = صورة + .title = صورة + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = اكتب توقيعك + .placeholder = اكتب توقيعك +pdfjs-editor-add-signature-draw-placeholder = ارسم توقيعك +pdfjs-editor-add-signature-draw-thickness-range-label = السماكة +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = سمك الرسم: { $thickness } +pdfjs-editor-add-signature-image-placeholder = اسحب الملف هنا لرفعه +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] أو اختر ملفات الصور + *[other] أو تصفح ملفات الصور + } + +## Controls + +pdfjs-editor-add-signature-description-label = الوصف (نص بديل) +pdfjs-editor-add-signature-description-input = + .title = الوصف (نص بديل) +pdfjs-editor-add-signature-description-default-when-drawing = توقيع +pdfjs-editor-add-signature-clear-button-label = امحُ التوقيع +pdfjs-editor-add-signature-clear-button = + .title = امحُ التوقيع +pdfjs-editor-add-signature-save-checkbox = احفظ التوقيع +pdfjs-editor-add-signature-save-warning-message = لقد وصلت إلى الحد الأقصى وهو 5 توقيعات محفوظة. أزِل توقيع واحد لحفظ المزيد. +pdfjs-editor-add-signature-image-upload-error-title = تعذر رفع الصورة. +pdfjs-editor-add-signature-image-upload-error-description = تحقق من اتصال الشبكة لديك أو جرّب صورة أخرى. +pdfjs-editor-add-signature-image-no-data-error-title = لا يمكن تحويل هذه الصورة إلى توقيع +pdfjs-editor-add-signature-image-no-data-error-description = من فضلك حاول رفع صورة أخرى. +pdfjs-editor-add-signature-error-close-button = أغلق + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = ألغِ +pdfjs-editor-add-signature-add-button = أضِف +pdfjs-editor-edit-signature-update-button = حدّث + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = حرّر التعليق +pdfjs-editor-edit-comment-popup-button = + .title = حرّر التعليق +pdfjs-editor-delete-comment-popup-button-label = أزِل التعليق +pdfjs-editor-delete-comment-popup-button = + .title = أزِل التعليق +pdfjs-show-comment-button = + .title = أظهر التعليق + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = حرّر التعليق +pdfjs-editor-edit-comment-dialog-save-button-when-editing = حدّث +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = أضِف تعليقًا +pdfjs-editor-edit-comment-dialog-save-button-when-adding = أضف +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = ابدأ الكتابة… +pdfjs-editor-edit-comment-dialog-cancel-button = ألغِ + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = أضف التعليق + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = تبديل الشريط الجانبي (يحتوي المستند على صور مصغرة/مخطط تفصيلي/مرفقات/طبقات) +pdfjs-toggle-views-manager-button1-label = أدِر الصفحات +pdfjs-views-manager-sidebar = + .aria-label = الشريط الجانبي +pdfjs-views-manager-sidebar-resizer = + .aria-label = أداة تغيير حجم الشريط الجانبي +pdfjs-views-manager-view-selector-button = + .title = المناظير +pdfjs-views-manager-view-selector-button-label = المناظير +pdfjs-views-manager-pages-title = الصفحات +pdfjs-views-manager-outlines-title1 = مخطط المستند + .title = مخطط المستند (انقر نقرًا مزدوجًا لتوسيع/طي كافة العناصر) +pdfjs-views-manager-attachments-title = المرفقات +pdfjs-views-manager-layers-title1 = ‏‏طبقات + .title = الطبقات (انقر نقرًا مزدوجًا لإعادة تعيين كافة الطبقات إلى الحالة المبدئية) +pdfjs-views-manager-pages-option-label = الصفحات +pdfjs-views-manager-outlines-option-label = مخطط المستند +pdfjs-views-manager-attachments-option-label = المرفقات +pdfjs-views-manager-layers-option-label = ‏‏الطبقات +pdfjs-views-manager-add-file-button = + .title = أضف ملف +pdfjs-views-manager-add-file-button-label = أضف ملف +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [zero] { $count } محدّد + [one] { $count } محدّد + [two] { $count } محدّدان + [few] { $count } محدّد + [many] { $count } محدّد + *[other] { $count } محدّد + } +pdfjs-views-manager-pages-status-none-action-label = حدّد الصفحات +pdfjs-views-manager-pages-status-action-button-label = أدِر +pdfjs-views-manager-pages-status-copy-button-label = انسخ +pdfjs-views-manager-pages-status-cut-button-label = قصّ +pdfjs-views-manager-pages-status-delete-button-label = احذف +pdfjs-views-manager-pages-status-export-selected-button-label = حُدِّد التصدير… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [zero] لا صفحات قُصت + [one] صفحة قُصت + [two] { $count } صفحتان قُصت + [few] { $count } صفحات قُصت + [many] { $count } صفحةً قُصت + *[other] { $count } صفحة قُصت + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [zero] لا صفحة منسوخة + [one] صفحة منسوخة + [two] صفحتان منسوختان + [few] { $count } صفحات منسوخة + [many] { $count } صفحةً منسوخةً + *[other] { $count } صفحة منسوخة + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [zero] لا صفحات محذوفة + [one] حُذف صفحة + [two] حُذف صفحتان + [few] حُذف { $count } صفحات + [many] حُذف { $count } صفحةً + *[other] حُذف { $count } صفحة + } +pdfjs-views-manager-pages-status-waiting-ready-label = يجهز ملفك… +pdfjs-views-manager-pages-status-waiting-uploading-label = يرفع ملف… +pdfjs-views-manager-status-warning-cut-label = تعذّر القص. أنعش الصفحة وحاول مجددًا. +pdfjs-views-manager-status-warning-copy-label = تعذّر النسخ. أنعش الصفحة وحاول مجددًا. +pdfjs-views-manager-status-warning-delete-label = تعذّر الحذف. حدِّث الصفحة وحاول مجددًا. +pdfjs-views-manager-status-warning-save-label = تعذّر الحفظ. أنعش الصفحة وحاول مجددًا. +pdfjs-views-manager-status-undo-button-label = تراجع +pdfjs-views-manager-status-done-button-label = تمّ +pdfjs-views-manager-status-close-button = + .title = أغلق +pdfjs-views-manager-status-close-button-label = أغلق +pdfjs-views-manager-paste-button-label = ألصق +pdfjs-views-manager-paste-button-before = + .title = ألصق قبل الصفحة الأولى +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = ألصق بعد الصفحة { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = جديد +pdfjs-views-manager-waiting-for-file = يرفع ملف… +pdfjs-toggle-views-manager-button1 = + .title = أدِر الصفحات + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = أزِل التوقيع المحفوظ +pdfjs-editor-delete-signature-button-label1 = أزِل التوقيع المحفوظ + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = عدّل الوصف + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = عدّل الوصف diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ast/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ast/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ast/viewer.ftl 2026-01-20 14:08:39.357689900 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ast/viewer.ftl 2026-07-09 07:12:41.855909800 +0000 @@ -77,22 +77,10 @@ pdfjs-document-properties-button-label = Propiedaes del documentu… pdfjs-document-properties-file-name = Nome del ficheru: pdfjs-document-properties-file-size = Tamañu del ficheru: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Títulu: pdfjs-document-properties-keywords = Pallabres clave: pdfjs-document-properties-creation-date = Data de creación: pdfjs-document-properties-modification-date = Data de modificación: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-producer = Productor del PDF: pdfjs-document-properties-version = Versión del PDF: pdfjs-document-properties-page-count = Númberu de páxines: @@ -178,24 +166,7 @@ pdfjs-loading-error = Asocedió un fallu mentanto se cargaba'l PDF. -## Annotations - -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } - ## Password pdfjs-password-ok-button = Aceptar pdfjs-password-cancel-button = Encaboxar - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/az/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/az/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/az/viewer.ftl 2026-01-20 14:08:39.357689900 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/az/viewer.ftl 2026-07-09 07:12:41.855909800 +0000 @@ -89,24 +89,12 @@ pdfjs-document-properties-button-label = Sənəd xüsusiyyətləri… pdfjs-document-properties-file-name = Fayl adı: pdfjs-document-properties-file-size = Fayl ölçüsü: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bayt) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bayt) pdfjs-document-properties-title = Başlık: pdfjs-document-properties-author = Müəllif: pdfjs-document-properties-subject = Mövzu: pdfjs-document-properties-keywords = Açar sözlər: pdfjs-document-properties-creation-date = Yaradılış Tarixi : pdfjs-document-properties-modification-date = Dəyişdirilmə Tarixi : -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Yaradan: pdfjs-document-properties-producer = PDF yaradıcısı: pdfjs-document-properties-version = PDF versiyası: @@ -213,9 +201,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = PDF yüklenərkən bir səhv yarandı. @@ -226,10 +211,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -245,13 +226,3 @@ pdfjs-password-ok-button = Tamam pdfjs-password-cancel-button = Ləğv et pdfjs-web-fonts-disabled = Web Şriftlər söndürülüb: yerləşdirilmiş PDF şriftlərini istifadə etmək mümkün deyil. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/be/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/be/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/be/viewer.ftl 2026-01-20 14:08:39.358689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/be/viewer.ftl 2026-07-09 07:12:41.855909800 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Дзейная старонка (паглядзець URL-адрас з дзейнай старонкі) pdfjs-bookmark-button-label = Цяперашняя старонка -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Адкрыць у праграме -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Адкрыць у праграме ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Назва файла: pdfjs-document-properties-file-size = Памер файла: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } КБ ({ $size_b } байт) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } байт) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } КБ ({ $b } байтаў) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } МБ ({ $b } байтаў) pdfjs-document-properties-title = Загаловак: pdfjs-document-properties-author = Аўтар: pdfjs-document-properties-subject = Тэма: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Дата стварэння: pdfjs-document-properties-modification-date = Дата змянення: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Стваральнік: pdfjs-document-properties-producer = Вырабнік PDF: pdfjs-document-properties-version = Версія PDF: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Мініяцюра старонкі { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Выбраць старонку { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Старонка { $page } з { $total } ## Find panel button title and messages @@ -272,10 +274,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -283,6 +281,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } Annotation] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -296,9 +297,13 @@ pdfjs-editor-free-text-button = .title = Тэкст +pdfjs-editor-color-picker-free-text-input = + .title = Змяніць колер тэксту pdfjs-editor-free-text-button-label = Тэкст pdfjs-editor-ink-button = .title = Маляваць +pdfjs-editor-color-picker-ink-input = + .title = Змяніць колер малюнка pdfjs-editor-ink-button-label = Маляваць pdfjs-editor-stamp-button = .title = Дадаць або змяніць выявы @@ -306,12 +311,37 @@ pdfjs-editor-highlight-button = .title = Вылучэнне pdfjs-editor-highlight-button-label = Вылучэнне -pdfjs-highlight-floating-button = - .title = Вылучэнне pdfjs-highlight-floating-button1 = .title = Падфарбаваць .aria-label = Падфарбаваць pdfjs-highlight-floating-button-label = Падфарбаваць +pdfjs-comment-floating-button = + .title = Каментаваць + .aria-label = Каментаваць +pdfjs-comment-floating-button-label = Каментаваць +pdfjs-editor-comment-button = + .title = Каментарый + .aria-label = Каментарый +pdfjs-editor-comment-button-label = Каментарый +pdfjs-editor-signature-button = + .title = Дадаць подпіс +pdfjs-editor-signature-button-label = Дадаць подпіс + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Рэдактар вылучэнняў +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Рэдактар малюнкаў +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Рэдактар подпісаў: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Рэдактар выяў ## Remove button for the various kind of editor. @@ -323,6 +353,8 @@ .title = Выдаліць выяву pdfjs-editor-remove-highlight-button = .title = Выдаліць падфарбоўку +pdfjs-editor-remove-signature-button = + .title = Выдаліць подпіс ## @@ -339,19 +371,42 @@ pdfjs-editor-free-highlight-thickness-input = Таўшчыня pdfjs-editor-free-highlight-thickness-title = .title = Змяняць таўшчыню пры вылучэнні іншых элементаў, акрамя тэксту -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Элементы кіравання подпісамі і захаваныя подпісы +pdfjs-editor-signature-add-signature-button = + .title = Дадаць новы подпіс +pdfjs-editor-signature-add-signature-button-label = Дадаць новы подпіс +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Захаваны подпіс: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Тэкставы рэдактар -pdfjs-free-text-default-content = Пачніце набор тэксту… -pdfjs-ink = - .aria-label = Графічны рэдактар -pdfjs-ink-canvas = - .aria-label = Выява, створаная карыстальнікам + .default-content = Пачніце ўводзіць… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Каментарый + [few] Каментарыі + *[many] Каментарыі + } +pdfjs-editor-comments-sidebar-close-button = + .title = Закрыць бакавую панэль + .aria-label = Закрыць бакавую панэль +pdfjs-editor-comments-sidebar-close-button-label = Закрыць бакавую панэль +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Бачыце штосьці вартае ўвагі? Вылучыце і пакіньце каментарый. +pdfjs-editor-comments-sidebar-no-comments-link = Падрабязней ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Альтэрнатыўны тэкст -pdfjs-editor-alt-text-edit-button-label = Змяніць альтэрнатыўны тэкст +pdfjs-editor-alt-text-edit-button = + .aria-label = Змяніць альтэрнатыўны тэкст pdfjs-editor-alt-text-dialog-label = Выберыце варыянт pdfjs-editor-alt-text-dialog-description = Альтэрнатыўны тэкст дапамагае, калі людзі не бачаць выяву або калі яна не загружаецца. pdfjs-editor-alt-text-add-description-label = Дадаць апісанне @@ -364,18 +419,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Напрыклад, «Малады чалавек садзіцца за стол есці» +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Альтэрнатыўны тэкст ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Верхні левы кут — змяніць памер -pdfjs-editor-resizer-label-top-middle = Уверсе пасярэдзіне — змяніць памер -pdfjs-editor-resizer-label-top-right = Верхні правы кут — змяніць памер -pdfjs-editor-resizer-label-middle-right = Пасярэдзіне справа — змяніць памер -pdfjs-editor-resizer-label-bottom-right = Правы ніжні кут — змяніць памер -pdfjs-editor-resizer-label-bottom-middle = Пасярэдзіне ўнізе — змяніць памер -pdfjs-editor-resizer-label-bottom-left = Левы ніжні кут — змяніць памер -pdfjs-editor-resizer-label-middle-left = Пасярэдзіне злева — змяніць памер +pdfjs-editor-resizer-top-left = + .aria-label = Верхні левы кут — змяніць памер +pdfjs-editor-resizer-top-middle = + .aria-label = Уверсе пасярэдзіне — змяніць памер +pdfjs-editor-resizer-top-right = + .aria-label = Верхні правы кут — змяніць памер +pdfjs-editor-resizer-middle-right = + .aria-label = Пасярэдзіне справа — змяніць памер +pdfjs-editor-resizer-bottom-right = + .aria-label = Правы ніжні кут — змяніць памер +pdfjs-editor-resizer-bottom-middle = + .aria-label = Пасярэдзіне ўнізе — змяніць памер +pdfjs-editor-resizer-bottom-left = + .aria-label = Левы ніжні кут — змяніць памер +pdfjs-editor-resizer-middle-left = + .aria-label = Пасярэдзіне злева — змяніць памер ## Color picker @@ -402,3 +468,288 @@ pdfjs-editor-highlight-show-all-button-label = Паказаць усе pdfjs-editor-highlight-show-all-button = .title = Паказаць усе + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Рэдагаваць тэкст для атрыбута alt (апісанне выявы) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Дадаць тэкст для атрыбута alt (апісанне выявы) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Напішыце сваё апісанне тут… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Кароткае апісанне для людзей, якія не бачаць выяву, ці калі выява не загружаецца. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Гэты тэкст для атрыбута alt быў створаны аўтаматычна і можа быць недакладным +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Даведацца больш +pdfjs-editor-new-alt-text-create-automatically-button-label = Ствараць тэкст для атрыбута alt аўтаматычна +pdfjs-editor-new-alt-text-not-now-button = Не зараз +pdfjs-editor-new-alt-text-error-title = Не ўдалося аўтаматычна стварыць тэкст для атрыбута alt +pdfjs-editor-new-alt-text-error-description = Калі ласка, напішыце ўласны тэкст для атрыбута alt або паўтарыце спробу пазней. +pdfjs-editor-new-alt-text-error-close-button = Закрыць +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Сцягванне мадэлі ШІ для тэксту для атрыбута alt ({ $downloadedSize } з { $totalSize } МБ) + .aria-valuetext = Сцягванне мадэлі ШІ для тэксту для атрыбута alt ({ $downloadedSize } з { $totalSize } МБ) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Тэкст для атрыбута alt дададзены +pdfjs-editor-new-alt-text-added-button-label = Тэкст для атрыбута alt дададзены +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Адсутнічае тэкст для атрыбута alt +pdfjs-editor-new-alt-text-missing-button-label = Адсутнічае тэкст для атрыбута alt +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Водгук на тэкст для атрыбута alt +pdfjs-editor-new-alt-text-to-review-button-label = Водгук на тэкст для атрыбута alt +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Створаны аўтаматычна: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Налады альтэрнатыўнага тэксту для выявы +pdfjs-image-alt-text-settings-button-label = Налады альтэрнатыўнага тэксту для выявы +pdfjs-editor-alt-text-settings-dialog-label = Налады альтэрнатыўнага тэксту для выявы +pdfjs-editor-alt-text-settings-automatic-title = Аўтаматычны тэкст для атрыбута alt +pdfjs-editor-alt-text-settings-create-model-button-label = Ствараць тэкст для атрыбута alt аўтаматычна +pdfjs-editor-alt-text-settings-create-model-description = Прапануе апісанні, каб дапамагчы людзям, якія не бачаць выяву, ці калі выява не загружаецца. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Мадэль ШІ для тэксту для атрыбута alt ({ $totalSize } МБ) +pdfjs-editor-alt-text-settings-ai-model-description = Працуе лакальна на вашай прыладзе, таму вашы звесткі застаюцца прыватнымі. Патрабуецца для аўтаматычнага альтэрнатыўнага тэксту. +pdfjs-editor-alt-text-settings-delete-model-button = Выдаліць +pdfjs-editor-alt-text-settings-download-model-button = Сцягнуць +pdfjs-editor-alt-text-settings-downloading-model-button = Сцягванне… +pdfjs-editor-alt-text-settings-editor-title = Рэдактар тэксту для атрыбута alt +pdfjs-editor-alt-text-settings-show-dialog-button-label = Адразу паказваць рэдактар тэксту для атрыбута alt пры даданні выявы +pdfjs-editor-alt-text-settings-show-dialog-description = Дапамагае пераканацца, што ўсе вашы выявы маюць альтэрнатыўны тэкст. +pdfjs-editor-alt-text-settings-close-button = Закрыць + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Вылучэнне дададзена +pdfjs-editor-freetext-added-alert = Тэкст дададзены +pdfjs-editor-ink-added-alert = Малюнак дададзены +pdfjs-editor-stamp-added-alert = Выява дададзена +pdfjs-editor-signature-added-alert = Подпіс дададзены + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Падсвятленне выдалена +pdfjs-editor-undo-bar-message-freetext = Тэкст выдалены +pdfjs-editor-undo-bar-message-ink = Малюнак выдалены +pdfjs-editor-undo-bar-message-stamp = Відарыс выдалены +pdfjs-editor-undo-bar-message-signature = Подпіс выдалены +pdfjs-editor-undo-bar-message-comment = Каментарый выдалены +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } анатацыя выдалена + [few] { $count } анатацыі выдалена + *[many] { $count } анатацый выдалена + } +pdfjs-editor-undo-bar-undo-button = + .title = Адмяніць +pdfjs-editor-undo-bar-undo-button-label = Адмяніць +pdfjs-editor-undo-bar-close-button = + .title = Закрыць +pdfjs-editor-undo-bar-close-button-label = Закрыць + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Гэты рэжым дазваляе карыстальніку ствараць подпіс для дадання ў дакумент PDF. Карыстальнік можа рэдагаваць імя (якое таксама служыць альтэрнатыўным тэкстам) і пры жаданні захаваць подпіс для паўторнага выкарыстання. +pdfjs-editor-add-signature-dialog-title = Дадаць подпіс + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Увод + .title = Увод +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Маляваць + .title = Маляваць +pdfjs-editor-add-signature-image-button = Выява + .title = Выява + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Увядзіце свой подпіс + .placeholder = Увядзіце свой подпіс +pdfjs-editor-add-signature-draw-placeholder = Намалюйце свой подпіс +pdfjs-editor-add-signature-draw-thickness-range-label = Таўшчыня +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Таўшчыня малюнка: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Перацягнуць файл сюды, каб загрузіць +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Або праглядайце файлы малюнкаў + *[other] Або праглядайце файлы малюнкаў + } + +## Controls + +pdfjs-editor-add-signature-description-label = Апісанне (альтэрнатыўны тэкст) +pdfjs-editor-add-signature-description-input = + .title = Апісанне (альтэрнатыўны тэкст) +pdfjs-editor-add-signature-description-default-when-drawing = Подпіс +pdfjs-editor-add-signature-clear-button-label = Выдаліць подпіс +pdfjs-editor-add-signature-clear-button = + .title = Выдаліць подпіс +pdfjs-editor-add-signature-save-checkbox = Захаваць подпіс +pdfjs-editor-add-signature-save-warning-message = Вы дасягнулі ліміту ў 5 захаваных подпісаў. Выдаліце адзін, каб захаваць іншы. +pdfjs-editor-add-signature-image-upload-error-title = Не ўдалося загрузіць выяву +pdfjs-editor-add-signature-image-upload-error-description = Праверце падключэнне да сеткі ці паспрабуйце іншую выяву. +pdfjs-editor-add-signature-image-no-data-error-title = Не ўдалося пераўтварыць гэту выяву ў подпіс +pdfjs-editor-add-signature-image-no-data-error-description = Калі ласка, паспрабуйце зацягнуць іншую выяву. +pdfjs-editor-add-signature-error-close-button = Закрыць + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Скасаваць +pdfjs-editor-add-signature-add-button = Дадаць +pdfjs-editor-edit-signature-update-button = Абнавіць + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Змяніць каментарый +pdfjs-editor-edit-comment-popup-button = + .title = Змяніць каментарый +pdfjs-editor-delete-comment-popup-button-label = Выдаліць каментарый +pdfjs-editor-delete-comment-popup-button = + .title = Выдаліць каментарый +pdfjs-show-comment-button = + .title = Паказаць каментарый + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Змяніць каментарый +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Абнавіць +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Дадаць каментарый +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Дадаць +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Пачніце набор тэксту… +pdfjs-editor-edit-comment-dialog-cancel-button = Скасаваць + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Дадаць каментарый + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Паказаць/схаваць бакавую панэль (дакумент мае мініяцюры/змест/далучэнні/пласты) +pdfjs-toggle-views-manager-button1-label = Кіраванне старонкамі +pdfjs-views-manager-sidebar = + .aria-label = Бакавая панэль +pdfjs-views-manager-sidebar-resizer = + .aria-label = Змена памеру бакавой панэлі +pdfjs-views-manager-view-selector-button = + .title = Выгляд +pdfjs-views-manager-view-selector-button-label = Выгляд +pdfjs-views-manager-pages-title = Старонкі +pdfjs-views-manager-outlines-title1 = Структура дакумента + .title = Структура дакумента (націсніце двойчы, каб разгарнуць/згарнуць усе элементы) +pdfjs-views-manager-attachments-title = Далучэнні +pdfjs-views-manager-layers-title1 = Пласты + .title = Пласты (націсніце двойчы каб скінуць у прадвызначаны стан) +pdfjs-views-manager-pages-option-label = Старонкі +pdfjs-views-manager-outlines-option-label = Структура дакумента +pdfjs-views-manager-attachments-option-label = Далучэнні +pdfjs-views-manager-layers-option-label = Пласты +pdfjs-views-manager-add-file-button = + .title = Дадаць файл +pdfjs-views-manager-add-file-button-label = Дадаць файл +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] Вылучана { $count } + [few] Вылучаны { $count } + *[many] Вылучана { $count } + } +pdfjs-views-manager-pages-status-none-action-label = Выбраць старонкі +pdfjs-views-manager-pages-status-action-button-label = Кіраваць +pdfjs-views-manager-pages-status-copy-button-label = Капіяваць +pdfjs-views-manager-pages-status-cut-button-label = Выразаць +pdfjs-views-manager-pages-status-delete-button-label = Выдаліць +pdfjs-views-manager-pages-status-export-selected-button-label = Экспартаваць выбранае… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] Выразана { $count } старонка + [few] Выразана { $count } старонкі + *[many] Выразана { $count } старонак + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] Скапіравана { $count } старонка + [few] Скапіравана { $count } старонкі + *[many] Скапіравана { $count } старонак + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] Выдалена { $count } старонка + [few] Выдалена { $count } старонкі + *[many] Выдалена { $count } старонак + } +pdfjs-views-manager-pages-status-waiting-ready-label = Рыхтуецца ваш файл… +pdfjs-views-manager-pages-status-waiting-uploading-label = Зацягваецца файл… +pdfjs-views-manager-status-warning-cut-label = Не ўдалося выразаць. Абнавіце старонку і паспрабуйце зноў. +pdfjs-views-manager-status-warning-copy-label = Не ўдалося скапіяваць. Абнавіце старонку і паспрабуйце зноў. +pdfjs-views-manager-status-warning-delete-label = Не ўдалося выдаліць. Абнавіце старонку і паспрабуйце зноў. +pdfjs-views-manager-status-warning-save-label = Не ўдалося захаваць. Абнавіце старонку і паспрабуйце зноў. +pdfjs-views-manager-status-undo-button-label = Адмяніць +pdfjs-views-manager-status-done-button-label = Гатова +pdfjs-views-manager-status-close-button = + .title = Закрыць +pdfjs-views-manager-status-close-button-label = Закрыць +pdfjs-views-manager-paste-button-label = Уставіць +pdfjs-views-manager-paste-button-before = + .title = Уставіць перад першай старонкай +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Уставіць пасля старонкі { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = НОВАЕ +pdfjs-views-manager-waiting-for-file = Зацягваецца файл… +pdfjs-toggle-views-manager-button1 = + .title = Кіраванне старонкамі + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Выдаліць захаваны подпіс +pdfjs-editor-delete-signature-button-label1 = Выдаліць захаваны подпіс + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Рэдагаваць апісанне + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Рэдагаваць апісанне diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/bg/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/bg/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/bg/viewer.ftl 2026-01-20 14:08:39.359689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/bg/viewer.ftl 2026-07-09 07:12:41.855909800 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Текуща страница (преглед на адреса на страницата) pdfjs-bookmark-button-label = Текуща страница -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Отваряне в приложение -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Отваряне в приложение ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Име на файл: pdfjs-document-properties-file-size = Големина на файл: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } КБ ({ $size_b } байта) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } байта) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } КБ ({ $b } байта) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } МБ ({ $b } байта) pdfjs-document-properties-title = Заглавие: pdfjs-document-properties-author = Автор: pdfjs-document-properties-subject = Тема: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Дата на създаване: pdfjs-document-properties-modification-date = Дата на промяна: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Създател: pdfjs-document-properties-producer = PDF произведен от: pdfjs-document-properties-version = Издание на PDF: @@ -270,10 +263,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +270,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Анотация { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -301,8 +293,6 @@ pdfjs-editor-stamp-button = .title = Добавяне или променяне на изображения pdfjs-editor-stamp-button-label = Добавяне или променяне на изображения -pdfjs-editor-remove-button = - .title = Премахване ## Remove button for the various kind of editor. @@ -326,19 +316,15 @@ pdfjs-editor-stamp-add-image-button = .title = Добавяне на изображение pdfjs-editor-stamp-add-image-button-label = Добавяне на изображение -pdfjs-free-text = +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Текстов редактор -pdfjs-free-text-default-content = Започнете да пишете… -pdfjs-ink = - .aria-label = Промяна на рисунка -pdfjs-ink-canvas = - .aria-label = Изображение, създадено от потребител + .default-content = Започнете да пишете… +pdfjs-editor-comments-sidebar-close-button-label = Затваряне на страничната лента ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Алтернативен текст -pdfjs-editor-alt-text-edit-button-label = Промяна на алтернативния текст pdfjs-editor-alt-text-dialog-label = Изберете от възможностите pdfjs-editor-alt-text-dialog-description = Алтернативният текст помага на потребителите, когато не могат да видят изображението или то не се зарежда. pdfjs-editor-alt-text-add-description-label = Добавяне на описание @@ -355,14 +341,22 @@ ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Горен ляв ъгъл — преоразмеряване -pdfjs-editor-resizer-label-top-middle = Горе в средата — преоразмеряване -pdfjs-editor-resizer-label-top-right = Горен десен ъгъл — преоразмеряване -pdfjs-editor-resizer-label-middle-right = Дясно в средата — преоразмеряване -pdfjs-editor-resizer-label-bottom-right = Долен десен ъгъл — преоразмеряване -pdfjs-editor-resizer-label-bottom-middle = Долу в средата — преоразмеряване -pdfjs-editor-resizer-label-bottom-left = Долен ляв ъгъл — преоразмеряване -pdfjs-editor-resizer-label-middle-left = Ляво в средата — преоразмеряване +pdfjs-editor-resizer-top-left = + .aria-label = Горен ляв ъгъл — преоразмеряване +pdfjs-editor-resizer-top-middle = + .aria-label = Горе в средата — преоразмеряване +pdfjs-editor-resizer-top-right = + .aria-label = Горен десен ъгъл — преоразмеряване +pdfjs-editor-resizer-middle-right = + .aria-label = Дясно в средата — преоразмеряване +pdfjs-editor-resizer-bottom-right = + .aria-label = Долен десен ъгъл — преоразмеряване +pdfjs-editor-resizer-bottom-middle = + .aria-label = Долу в средата — преоразмеряване +pdfjs-editor-resizer-bottom-left = + .aria-label = Долен ляв ъгъл — преоразмеряване +pdfjs-editor-resizer-middle-left = + .aria-label = Ляво в средата — преоразмеряване ## Color picker @@ -382,3 +376,17 @@ .title = Розово pdfjs-editor-colorpicker-red = .title = Червено + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Научете повече +pdfjs-editor-new-alt-text-not-now-button = Не сега + +## Image alt-text settings + +pdfjs-editor-alt-text-settings-delete-model-button = Изтриване + +## Controls + +pdfjs-editor-add-signature-image-upload-error-description = Проверете мрежовата си връзка или опитайте с друго изображение. diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/bn/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/bn/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/bn/viewer.ftl 2026-01-20 14:08:39.359689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/bn/viewer.ftl 2026-07-09 07:12:41.855909800 +0000 @@ -85,24 +85,12 @@ pdfjs-document-properties-button-label = নথি বৈশিষ্ট্য… pdfjs-document-properties-file-name = ফাইলের নাম: pdfjs-document-properties-file-size = ফাইলের আকার: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } কেবি ({ $size_b } বাইট) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } এমবি ({ $size_b } বাইট) pdfjs-document-properties-title = শিরোনাম: pdfjs-document-properties-author = লেখক: pdfjs-document-properties-subject = বিষয়: pdfjs-document-properties-keywords = কীওয়ার্ড: pdfjs-document-properties-creation-date = তৈরির তারিখ: pdfjs-document-properties-modification-date = পরিবর্তনের তারিখ: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = প্রস্তুতকারক: pdfjs-document-properties-producer = পিডিএফ প্রস্তুতকারক: pdfjs-document-properties-version = পিডিএফ সংষ্করণ: @@ -203,9 +191,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = পিডিএফ লোড করার সময় ত্রুটি দেখা দিয়েছে। @@ -216,10 +201,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -235,13 +216,3 @@ pdfjs-password-ok-button = ঠিক আছে pdfjs-password-cancel-button = বাতিল pdfjs-web-fonts-disabled = ওয়েব ফন্ট নিষ্ক্রিয়: সংযুক্ত পিডিএফ ফন্ট ব্যবহার করা যাচ্ছে না। - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/bo/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/bo/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/bo/viewer.ftl 2026-01-20 14:08:39.359689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/bo/viewer.ftl 2026-07-09 07:12:41.855909800 +0000 @@ -89,24 +89,12 @@ pdfjs-document-properties-button-label = Document Properties… pdfjs-document-properties-file-name = File name: pdfjs-document-properties-file-size = File size: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Title: pdfjs-document-properties-author = Author: pdfjs-document-properties-subject = Subject: pdfjs-document-properties-keywords = Keywords: pdfjs-document-properties-creation-date = Creation Date: pdfjs-document-properties-modification-date = Modification Date: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Creator: pdfjs-document-properties-producer = PDF Producer: pdfjs-document-properties-version = PDF Version: @@ -207,9 +195,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = An error occurred while loading the PDF. @@ -235,13 +220,3 @@ pdfjs-password-ok-button = OK pdfjs-password-cancel-button = Cancel pdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/bqi/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/bqi/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/bqi/viewer.ftl 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/bqi/viewer.ftl 2026-07-09 07:12:41.855909800 +0000 @@ -0,0 +1,67 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-print-button = + .title = چاپ +pdfjs-print-button-label = چاپ + +## + +pdfjs-document-properties-linearized-yes = هری + +## Print + +pdfjs-print-progress-close-button = لقو + +## Password + +pdfjs-password-ok-button = خا +pdfjs-password-cancel-button = لقو + +## Editing + +pdfjs-editor-stamp-button = + .title = ٱووردن یا آلشت شؽواتا +pdfjs-editor-stamp-button-label = ٱووردن یا آلشت شؽواتا + +## Default editor aria labels + +pdfjs-editor-stamp-editor = + .aria-label = آلشتگر شؽوات + +## + +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = آلشتگر هؽل + .default-content = ناهاڌن پا هؽل کردن... +pdfjs-editor-comments-sidebar-no-comments-link = قلوه دووسته بۊین + +## Alt-text dialog + +pdfjs-editor-alt-text-cancel-button = لقو + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = قلوه دووسته بۊین + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = لقو + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = آلشت منشڌ +pdfjs-editor-edit-comment-popup-button = + .title = آلشت منشڌ + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = آلشت منشڌ +pdfjs-editor-edit-comment-dialog-cancel-button = لقو diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/br/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/br/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/br/viewer.ftl 2026-01-20 14:08:39.359689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/br/viewer.ftl 2026-07-09 07:12:41.855909800 +0000 @@ -49,12 +49,6 @@ # Length of the translation matters since we are in a mobile context, with limited screen estate. pdfjs-download-button-label = Pellgargañ pdfjs-bookmark-button-label = Pajenn a-vremañ -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Digeriñ en arload -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Digeriñ en arload ## Secondary toolbar and context menu @@ -105,24 +99,12 @@ pdfjs-document-properties-button-label = Perzhioù an teul… pdfjs-document-properties-file-name = Anv restr: pdfjs-document-properties-file-size = Ment ar restr: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } Ke ({ $size_b } eizhbit) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } Me ({ $size_b } eizhbit) pdfjs-document-properties-title = Titl: pdfjs-document-properties-author = Aozer: pdfjs-document-properties-subject = Danvez: pdfjs-document-properties-keywords = Gerioù-alc'hwez: pdfjs-document-properties-creation-date = Deiziad krouiñ: pdfjs-document-properties-modification-date = Deiziad kemmañ: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Krouer: pdfjs-document-properties-producer = Kenderc'her PDF: pdfjs-document-properties-version = Handelv PDF: @@ -212,8 +194,9 @@ pdfjs-find-next-button = .title = Kavout an tamm frazenn war-lerc'h o klotañ ganti pdfjs-find-next-button-label = War-lerc'h -pdfjs-find-highlight-checkbox = Usskediñ pep tra +pdfjs-find-highlight-checkbox = Sklêrijennañ pep tra pdfjs-find-match-case-checkbox-label = Teurel evezh ouzh ar pennlizherennoù +pdfjs-find-match-diacritics-checkbox-label = Doujañ d’an tiredoù pdfjs-find-entire-word-checkbox-label = Gerioù a-bezh pdfjs-find-reached-top = Tizhet eo bet derou ar bajenn, kenderc'hel diouzh an diaz pdfjs-find-reached-bottom = Tizhet eo bet dibenn ar bajenn, kenderc'hel diouzh ar c'hrec'h @@ -246,10 +229,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -277,9 +256,13 @@ pdfjs-editor-stamp-button = .title = Ouzhpennañ pe aozañ skeudennoù pdfjs-editor-stamp-button-label = Ouzhpennañ pe aozañ skeudennoù - -## Remove button for the various kind of editor. - +pdfjs-editor-highlight-button = + .title = Sklerijennañ +pdfjs-editor-highlight-button-label = Sklerijennañ +pdfjs-highlight-floating-button1 = + .title = Sklerijennañ + .aria-label = Sklerijennañ +pdfjs-highlight-floating-button-label = Sklerijennañ ## @@ -292,22 +275,49 @@ pdfjs-editor-stamp-add-image-button = .title = Ouzhpennañ ur skeudenn pdfjs-editor-stamp-add-image-button-label = Ouzhpennañ ur skeudenn -pdfjs-free-text = - .aria-label = Aozer testennoù -pdfjs-ink = - .aria-label = Aozer tresoù -pdfjs-ink-canvas = - .aria-label = Skeudenn bet krouet gant an implijer·ez +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Tevded ## Alt-text dialog pdfjs-editor-alt-text-add-description-label = Ouzhpennañ un deskrivadur pdfjs-editor-alt-text-cancel-button = Nullañ pdfjs-editor-alt-text-save-button = Enrollañ - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Da skouer, “Ur paotr yaouank ouzh taol o tebriñ boued” ## Color picker +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Liv sklêrijennañ +pdfjs-editor-colorpicker-button = + .title = Cheñch liv +pdfjs-editor-colorpicker-yellow = + .title = Melen +pdfjs-editor-colorpicker-blue = + .title = Glas +pdfjs-editor-colorpicker-pink = + .title = Roz +pdfjs-editor-colorpicker-red = + .title = Ruz + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Diskouez pep tra +pdfjs-editor-highlight-show-all-button = + .title = Diskouez pep tra + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Gouzout hiroc’h +pdfjs-editor-new-alt-text-error-close-button = Serriñ + +## Image alt-text settings + +pdfjs-editor-alt-text-settings-delete-model-button = Dilemel +pdfjs-editor-alt-text-settings-download-model-button = Pellgargañ +pdfjs-editor-alt-text-settings-downloading-model-button = O pellgargañ… +pdfjs-editor-alt-text-settings-close-button = Serriñ diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/brx/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/brx/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/brx/viewer.ftl 2026-01-20 14:08:39.360689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/brx/viewer.ftl 2026-07-09 07:12:41.855909800 +0000 @@ -65,24 +65,12 @@ pdfjs-document-properties-button-label = फोरमान बिलाइनि आखुथाय... pdfjs-document-properties-file-name = फाइलनि मुं: pdfjs-document-properties-file-size = फाइलनि महर: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } बाइट) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } बाइट) pdfjs-document-properties-title = बिमुं: pdfjs-document-properties-author = लिरगिरि: pdfjs-document-properties-subject = आयदा: pdfjs-document-properties-keywords = गाहाय सोदोब: pdfjs-document-properties-creation-date = सोरजिनाय अक्ट': pdfjs-document-properties-modification-date = सुद्रायनाय अक्ट': -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = सोरजिग्रा: pdfjs-document-properties-producer = PDF दिहुनग्रा: pdfjs-document-properties-version = PDF बिसान: @@ -174,9 +162,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = PDF ल'ड खालामनाय समाव मोनसे गोरोन्थि जाबाय। @@ -187,10 +172,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -206,13 +187,3 @@ pdfjs-password-ok-button = OK pdfjs-password-cancel-button = नेवसि pdfjs-web-fonts-disabled = वेब फन्टखौ लोरबां खालामबाय: अरजाबहोनाय PDF फन्टखौ बाहायनो हायाखै। - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/bs/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/bs/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/bs/viewer.ftl 2026-01-20 14:08:39.360689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/bs/viewer.ftl 2026-07-09 07:12:41.855909800 +0000 @@ -39,6 +39,18 @@ pdfjs-print-button = .title = Štampaj pdfjs-print-button-label = Štampaj +pdfjs-save-button = + .title = Sačuvaj +pdfjs-save-button-label = Sačuvaj +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Preuzmi +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Preuzmi +pdfjs-bookmark-button = + .title = Trenutna stranica (Prikaži URL sa trenutne stranice) +pdfjs-bookmark-button-label = Trenutna stranica ## Secondary toolbar and context menu @@ -63,6 +75,27 @@ pdfjs-cursor-hand-tool-button = .title = Omogući ručni alat pdfjs-cursor-hand-tool-button-label = Ručni alat +pdfjs-scroll-page-button = + .title = Koristite pomicanje stranice +pdfjs-scroll-page-button-label = Pomicanje stranice +pdfjs-scroll-vertical-button = + .title = Koristite vertikalno pomicanje +pdfjs-scroll-vertical-button-label = Vertikalno pomicanje +pdfjs-scroll-horizontal-button = + .title = Koristite horizontalno pomicanje +pdfjs-scroll-horizontal-button-label = Horizontalno pomicanje +pdfjs-scroll-wrapped-button = + .title = Koristite omotno pomicanje +pdfjs-scroll-wrapped-button-label = Omotno pomicanje +pdfjs-spread-none-button = + .title = Ne izrađuj duplerice +pdfjs-spread-none-button-label = Bez duplerica +pdfjs-spread-odd-button = + .title = Izradi duplerice koje počinju s neparnim stranicama +pdfjs-spread-odd-button-label = Neparne duplerice +pdfjs-spread-even-button = + .title = Izradi duplerice koje počinju s parnim stranicama +pdfjs-spread-even-button-label = Parne duplerice ## Document properties dialog @@ -72,13 +105,13 @@ pdfjs-document-properties-file-name = Naziv fajla: pdfjs-document-properties-file-size = Veličina fajla: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajta) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajta) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bajtova) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtova) pdfjs-document-properties-title = Naslov: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Predmet: @@ -86,9 +119,8 @@ pdfjs-document-properties-creation-date = Datum kreiranja: pdfjs-document-properties-modification-date = Datum promjene: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Kreator: pdfjs-document-properties-producer = PDF stvaratelj: pdfjs-document-properties-version = PDF verzija: @@ -115,6 +147,11 @@ ## +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Brzi web pregled: +pdfjs-document-properties-linearized-yes = Da +pdfjs-document-properties-linearized-no = Ne pdfjs-document-properties-close-button = Zatvori ## Print @@ -131,6 +168,8 @@ pdfjs-toggle-sidebar-button = .title = Uključi/isključi bočnu traku +pdfjs-toggle-sidebar-notification-button = + .title = Uključi/isključi bočnu traku (dokument sadrži obris/priloge/slojeve) pdfjs-toggle-sidebar-button-label = Uključi/isključi bočnu traku pdfjs-document-outline-button = .title = Prikaži outline dokumenta (dvoklik za skupljanje/širenje svih stavki) @@ -138,12 +177,19 @@ pdfjs-attachments-button = .title = Prikaži priloge pdfjs-attachments-button-label = Prilozi +pdfjs-layers-button = + .title = Prikaži slojeve (dvostruki klik da biste vratili sve slojeve na zadano stanje) +pdfjs-layers-button-label = Slojevi pdfjs-thumbs-button = .title = Prikaži thumbnailove pdfjs-thumbs-button-label = Thumbnailovi +pdfjs-current-outline-item-button = + .title = Pronađi trenutnu stavku strukture +pdfjs-current-outline-item-button-label = Trenutna stavka strukture pdfjs-findbar-button = .title = Pronađi u dokumentu pdfjs-findbar-button-label = Pronađi +pdfjs-additional-layers = Dodatni slojevi ## Thumbnails panel item (tooltip and alt text for images) @@ -169,8 +215,27 @@ pdfjs-find-next-button-label = Sljedeće pdfjs-find-highlight-checkbox = Označi sve pdfjs-find-match-case-checkbox-label = Osjetljivost na karaktere +pdfjs-find-match-diacritics-checkbox-label = Podudaranje dijakritika +pdfjs-find-entire-word-checkbox-label = Cijele riječi pdfjs-find-reached-top = Dostigao sam vrh dokumenta, nastavljam sa dna pdfjs-find-reached-bottom = Dostigao sam kraj dokumenta, nastavljam sa vrha +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } od { $total } podudaranje + [few] { $current } od { $total } podudaranja + *[other] { $current } od { $total } podudaranja + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Više od { $limit } podudaranja + [few] Više od { $limit } podudaranja + *[other] Više od { $limit } podudaranja + } pdfjs-find-not-found = Fraza nije pronađena ## Predefined zoom values @@ -185,6 +250,10 @@ ## PDF page +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Stranica { $page } ## Loading indicator messages @@ -203,6 +272,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } pribilješka] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -214,10 +286,303 @@ ## Editing +pdfjs-editor-free-text-button = + .title = Tekst +pdfjs-editor-free-text-button-label = Tekst +pdfjs-editor-ink-button = + .title = Crtanje +pdfjs-editor-ink-button-label = Crtanje +pdfjs-editor-stamp-button = + .title = Dodajte ili uredite slike +pdfjs-editor-stamp-button-label = Dodajte ili uredite slike +pdfjs-editor-highlight-button = + .title = Istaknite +pdfjs-editor-highlight-button-label = Istaknite +pdfjs-highlight-floating-button1 = + .title = Istaknite + .aria-label = Istaknite +pdfjs-highlight-floating-button-label = Istaknite +pdfjs-editor-signature-button = + .title = Dodaj potpis +pdfjs-editor-signature-button-label = Dodaj potpis + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Uređivač istaknutih elemenata +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Uređivač crteža +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Uređivač potpisa: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Uređivač slika + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Ukloni crtež +pdfjs-editor-remove-freetext-button = + .title = Ukloni tekst +pdfjs-editor-remove-stamp-button = + .title = Ukloni sliku +pdfjs-editor-remove-highlight-button = + .title = Ukloni istaknuti dio +pdfjs-editor-remove-signature-button = + .title = Ukloni potpis + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Boja +pdfjs-editor-free-text-size-input = Veličina +pdfjs-editor-ink-color-input = Boja +pdfjs-editor-ink-thickness-input = Debljina +pdfjs-editor-ink-opacity-input = Neprozirnost +pdfjs-editor-stamp-add-image-button = + .title = Dodaj sliku +pdfjs-editor-stamp-add-image-button-label = Dodaj sliku +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Debljina +pdfjs-editor-free-highlight-thickness-title = + .title = Promijenite debljinu prilikom označavanja stavki koje nisu tekst +pdfjs-editor-add-signature-container = + .aria-label = Kontrole potpisa i sačuvani potpisi +pdfjs-editor-signature-add-signature-button = + .title = Dodaj novi potpis +pdfjs-editor-signature-add-signature-button-label = Dodaj novi potpis +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Sačuvani potpis: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Uređivač teksta + .default-content = Počnite kucati… ## Alt-text dialog +pdfjs-editor-alt-text-button-label = Alternativni tekst +pdfjs-editor-alt-text-edit-button = + .aria-label = Uredi alternativni tekst +pdfjs-editor-alt-text-dialog-label = Odaberite opciju +pdfjs-editor-alt-text-dialog-description = Alternativni tekst (Alt tekst) pomaže kada ljudi ne mogu vidjeti sliku ili kada se ona ne učitava. +pdfjs-editor-alt-text-add-description-label = Dodajte opis +pdfjs-editor-alt-text-add-description-description = Ciljajte na 1-2 rečenice koje opisuju temu, okruženje ili radnju. +pdfjs-editor-alt-text-mark-decorative-label = Označi kao dekorativno +pdfjs-editor-alt-text-mark-decorative-description = Ovo se koristi za ukrasne slike, poput okvira ili vodenih žigova. +pdfjs-editor-alt-text-cancel-button = Otkaži +pdfjs-editor-alt-text-save-button = Sačuvaj +pdfjs-editor-alt-text-decorative-tooltip = Označeno kao dekorativno +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Na primjer, „Mladić sjeda za stol da jede obrok“ +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternativni tekst ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. +pdfjs-editor-resizer-top-left = + .aria-label = Gornji lijevi ugao — promjena veličine +pdfjs-editor-resizer-top-middle = + .aria-label = Gore u sredini — promijeni veličinu +pdfjs-editor-resizer-top-right = + .aria-label = Gornji desni ugao — promijeni veličinu +pdfjs-editor-resizer-middle-right = + .aria-label = Sredina desno — promijeni veličinu +pdfjs-editor-resizer-bottom-right = + .aria-label = Donji desni ugao — promijeni veličinu +pdfjs-editor-resizer-bottom-middle = + .aria-label = Donji srednji dio — promijeni veličinu +pdfjs-editor-resizer-bottom-left = + .aria-label = Donji lijevi ugao — promijeni veličinu +pdfjs-editor-resizer-middle-left = + .aria-label = Sredina lijevo — promijeni veličinu + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Boja isticanja +pdfjs-editor-colorpicker-button = + .title = Promijeni boju +pdfjs-editor-colorpicker-dropdown = + .aria-label = Izbor boja +pdfjs-editor-colorpicker-yellow = + .title = Žuta +pdfjs-editor-colorpicker-green = + .title = Zelena +pdfjs-editor-colorpicker-blue = + .title = Plava +pdfjs-editor-colorpicker-pink = + .title = Roza +pdfjs-editor-colorpicker-red = + .title = Crvena + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Prikaži sve +pdfjs-editor-highlight-show-all-button = + .title = Prikaži sve + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Uredi alternativni tekst (opis slike) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Dodaj alternativni tekst (opis slike) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Ovdje napišite svoj opis… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Kratak opis za osobe koje ne mogu vidjeti sliku ili kada se slika ne učitava. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Ovaj alternativni tekst je kreiran automatski i moguće je da je netačan. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Saznajte više +pdfjs-editor-new-alt-text-create-automatically-button-label = Automatski kreiraj alternativni tekst +pdfjs-editor-new-alt-text-not-now-button = Ne sada +pdfjs-editor-new-alt-text-error-title = Nije moguće automatski kreirati alternativni tekst +pdfjs-editor-new-alt-text-error-description = Molimo vas da napišete vlastiti alternativni tekst ili pokušate ponovo kasnije. +pdfjs-editor-new-alt-text-error-close-button = Zatvori +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Preuzimanje alternativnog tekstualnog AI modela ({ $downloadedSize } od { $totalSize } MB) + .aria-valuetext = Preuzimanje alternativnog tekstualnog AI modela ({ $downloadedSize } od { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternativni tekst je dodan +pdfjs-editor-new-alt-text-added-button-label = Alternativni tekst je dodan +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Nedostaje alternativni tekst +pdfjs-editor-new-alt-text-missing-button-label = Nedostaje alternativni tekst +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Alternativni tekst recenzije +pdfjs-editor-new-alt-text-to-review-button-label = Alternativni tekst recenzije +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automatski kreirano: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Postavke alternativnog teksta slike +pdfjs-image-alt-text-settings-button-label = Postavke alternativnog teksta slike +pdfjs-editor-alt-text-settings-dialog-label = Postavke alternativnog teksta slike +pdfjs-editor-alt-text-settings-automatic-title = Automatski alternativni tekst +pdfjs-editor-alt-text-settings-create-model-button-label = Automatski kreiraj alternativni tekst +pdfjs-editor-alt-text-settings-create-model-description = Predlaže opise kako bi pomogao ljudima koji ne vide sliku ili kada se slika ne učitava. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Alternativni tekst AI model ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Radi lokalno na vašem uređaju tako da vaši podaci ostaju privatni. Potrebno za automatski alternativni tekst. +pdfjs-editor-alt-text-settings-delete-model-button = Izbriši +pdfjs-editor-alt-text-settings-download-model-button = Preuzmi +pdfjs-editor-alt-text-settings-downloading-model-button = Preuzimam… +pdfjs-editor-alt-text-settings-editor-title = Uređivač alternativnog teksta +pdfjs-editor-alt-text-settings-show-dialog-button-label = Odmah prikaži uređivač alternativnog teksta prilikom dodavanja slike +pdfjs-editor-alt-text-settings-show-dialog-description = Pomaže vam da osigurate da sve vaše slike imaju alternativni tekst. +pdfjs-editor-alt-text-settings-close-button = Zatvori + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Istaknuto je uklonjeno +pdfjs-editor-undo-bar-message-freetext = Tekst uklonjen +pdfjs-editor-undo-bar-message-ink = Crtež uklonjen +pdfjs-editor-undo-bar-message-stamp = Slika uklonjena +pdfjs-editor-undo-bar-message-signature = Potpis uklonjen +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } bilješka uklonjena + [few] { $count } bilješke uklonjene + *[other] { $count } bilješki uklonjeno + } +pdfjs-editor-undo-bar-undo-button = + .title = Poništi +pdfjs-editor-undo-bar-undo-button-label = Poništi +pdfjs-editor-undo-bar-close-button = + .title = Zatvori +pdfjs-editor-undo-bar-close-button-label = Zatvori + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Ovaj modalni prozor omogućava korisniku da kreira potpis koji će dodati PDF dokumentu. Korisnik može urediti ime (koje služi i kao alternativni tekst) i opcionalno sačuvati potpis za ponovnu upotrebu. +pdfjs-editor-add-signature-dialog-title = Dodaj potpis + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Ukucaj + .title = Ukucaj +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Napiši + .title = Napiši +pdfjs-editor-add-signature-image-button = Slika + .title = Slika + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Ukucajte svoj potpis + .placeholder = Ukucajte svoj potpis +pdfjs-editor-add-signature-draw-placeholder = Napišite svoj potpis +pdfjs-editor-add-signature-draw-thickness-range-label = Debljina +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Debljina pisanja: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Prevucite datoteku ovdje da biste je učitali +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Ili odaberite slikovne datoteke + *[other] Ili pregledajte slikovne datoteke + } + +## Controls + +pdfjs-editor-add-signature-description-label = Opis (alternativni tekst) +pdfjs-editor-add-signature-description-input = + .title = Opis (alternativni tekst) +pdfjs-editor-add-signature-description-default-when-drawing = Potpis +pdfjs-editor-add-signature-clear-button-label = Očisti potpis +pdfjs-editor-add-signature-clear-button = + .title = Očisti potpis +pdfjs-editor-add-signature-save-checkbox = Sačuvaj potpis +pdfjs-editor-add-signature-save-warning-message = Dostigli ste ograničenje od 5 sačuvanih potpisa. Uklonite jedan da biste sačuvali više. +pdfjs-editor-add-signature-image-upload-error-title = Nije moguće učitati sliku +pdfjs-editor-add-signature-image-upload-error-description = Provjerite mrežnu vezu ili pokušajte s drugom slikom. +pdfjs-editor-add-signature-image-no-data-error-title = Nije moguće pretvoriti ovu sliku u potpis +pdfjs-editor-add-signature-image-no-data-error-description = Molimo pokušajte učitati drugu sliku. +pdfjs-editor-add-signature-error-close-button = Zatvori + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Otkaži +pdfjs-editor-add-signature-add-button = Dodaj +pdfjs-editor-edit-signature-update-button = Ažuriraj + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Ukloni sačuvani potpis +pdfjs-editor-delete-signature-button-label1 = Ukloni sačuvani potpis + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Uredi opis + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Uredi opis diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ca/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ca/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ca/viewer.ftl 2026-01-20 14:08:39.360689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ca/viewer.ftl 2026-07-09 07:12:41.855909800 +0000 @@ -45,12 +45,6 @@ pdfjs-bookmark-button = .title = Pàgina actual (mostra l'URL de la pàgina actual) pdfjs-bookmark-button-label = Pàgina actual -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Obre en una aplicació -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Obre en una aplicació ## Secondary toolbar and context menu @@ -104,24 +98,12 @@ pdfjs-document-properties-button-label = Propietats del document… pdfjs-document-properties-file-name = Nom del fitxer: pdfjs-document-properties-file-size = Mida del fitxer: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Títol: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Assumpte: pdfjs-document-properties-keywords = Paraules clau: pdfjs-document-properties-creation-date = Data de creació: pdfjs-document-properties-modification-date = Data de modificació: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Creador: pdfjs-document-properties-producer = Generador de PDF: pdfjs-document-properties-version = Versió de PDF: @@ -249,10 +231,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -277,23 +255,20 @@ pdfjs-editor-ink-button = .title = Dibuixa pdfjs-editor-ink-button-label = Dibuixa + +## + # Editor Parameters pdfjs-editor-free-text-color-input = Color pdfjs-editor-free-text-size-input = Mida pdfjs-editor-ink-color-input = Color pdfjs-editor-ink-thickness-input = Gruix pdfjs-editor-ink-opacity-input = Opacitat -pdfjs-free-text = - .aria-label = Editor de text -pdfjs-free-text-default-content = Escriviu… -pdfjs-ink = - .aria-label = Editor de dibuix -pdfjs-ink-canvas = - .aria-label = Imatge creada per l'usuari ## Alt-text dialog +pdfjs-editor-alt-text-cancel-button = Cancel·la -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. +## Dialog buttons +pdfjs-editor-add-signature-cancel-button = Cancel·la diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/cak/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/cak/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/cak/viewer.ftl 2026-01-20 14:08:39.360689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/cak/viewer.ftl 2026-07-09 07:12:41.855909800 +0000 @@ -96,24 +96,12 @@ pdfjs-document-properties-button-label = Taq richinil wuj… pdfjs-document-properties-file-name = Rub'i' yakb'äl: pdfjs-document-properties-file-size = Runimilem yakb'äl: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = B'i'aj: pdfjs-document-properties-author = B'anel: pdfjs-document-properties-subject = Taqikil: pdfjs-document-properties-keywords = Kixe'el taq tzij: pdfjs-document-properties-creation-date = Ruq'ijul xtz'uk: pdfjs-document-properties-modification-date = Ruq'ijul xjalwachïx: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Q'inonel: pdfjs-document-properties-producer = PDF b'anöy: pdfjs-document-properties-version = PDF ruwäch: @@ -241,10 +229,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -269,23 +253,12 @@ pdfjs-editor-ink-button = .title = Tiwachib'ëx pdfjs-editor-ink-button-label = Tiwachib'ëx + +## + # Editor Parameters pdfjs-editor-free-text-color-input = B'onil pdfjs-editor-free-text-size-input = Nimilem pdfjs-editor-ink-color-input = B'onil pdfjs-editor-ink-thickness-input = Rupimil pdfjs-editor-ink-opacity-input = Q'equmal -pdfjs-free-text = - .aria-label = Nuk'unel tz'ib'atzij -pdfjs-free-text-default-content = Titikitisäx rutz'ib'axik… -pdfjs-ink = - .aria-label = Nuk'unel wachib'äl -pdfjs-ink-canvas = - .aria-label = Wachib'äl nuk'un ruma okisaxel - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ckb/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ckb/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ckb/viewer.ftl 2026-01-20 14:08:39.361689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ckb/viewer.ftl 2026-07-09 07:12:41.855909800 +0000 @@ -80,24 +80,12 @@ pdfjs-document-properties-button-label = تایبەتمەندییەکانی بەڵگەنامە... pdfjs-document-properties-file-name = ناوی پەڕگە: pdfjs-document-properties-file-size = قەبارەی پەڕگە: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } کب ({ $size_b } بایت) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } مب ({ $size_b } بایت) pdfjs-document-properties-title = سەردێڕ: pdfjs-document-properties-author = نووسەر pdfjs-document-properties-subject = بابەت: pdfjs-document-properties-keywords = کلیلەوشە: pdfjs-document-properties-creation-date = بەرواری درووستکردن: pdfjs-document-properties-modification-date = بەرواری دەستکاریکردن: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = درووستکەر: pdfjs-document-properties-producer = بەرهەمهێنەری PDF: pdfjs-document-properties-version = وەشانی PDF: @@ -198,9 +186,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = هەڵەیەک ڕوویدا لە کاتی بارکردنی PDF. @@ -211,10 +196,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -230,13 +211,3 @@ pdfjs-password-ok-button = باشە pdfjs-password-cancel-button = پاشگەزبوونەوە pdfjs-web-fonts-disabled = جۆرەپیتی وێب ناچالاکە: نەتوانی جۆرەپیتی تێخراوی ناو pdfـەکە بەکاربێت. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/cs/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/cs/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/cs/viewer.ftl 2026-01-20 14:08:39.361689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/cs/viewer.ftl 2026-07-09 07:12:41.855909800 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Aktuální stránka (zobrazit URL od aktuální stránky) pdfjs-bookmark-button-label = Aktuální stránka -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Otevřít v aplikaci -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Otevřít v aplikaci ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Název souboru: pdfjs-document-properties-file-size = Velikost souboru: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajtů) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajtů) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kB ({ $b } bajtů) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtů) pdfjs-document-properties-title = Název stránky: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Předmět: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Datum vytvoření: pdfjs-document-properties-modification-date = Datum úpravy: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Vytvořil: pdfjs-document-properties-producer = Tvůrce PDF: pdfjs-document-properties-version = Verze PDF: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Náhled strany { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Vybrat stranu { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Strana { $page } z { $total } ## Find panel button title and messages @@ -250,7 +252,7 @@ ## Predefined zoom values pdfjs-page-scale-width = Podle šířky -pdfjs-page-scale-fit = Podle výšky +pdfjs-page-scale-fit = Podle stránky pdfjs-page-scale-auto = Automatická velikost pdfjs-page-scale-actual = Skutečná velikost # Variables: @@ -274,10 +276,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -285,6 +283,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Anotace typu { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -298,9 +299,13 @@ pdfjs-editor-free-text-button = .title = Text +pdfjs-editor-color-picker-free-text-input = + .title = Změna barvy textu pdfjs-editor-free-text-button-label = Text pdfjs-editor-ink-button = .title = Kreslení +pdfjs-editor-color-picker-ink-input = + .title = Změna barvy kresby pdfjs-editor-ink-button-label = Kreslení pdfjs-editor-stamp-button = .title = Přidání či úprava obrázků @@ -308,12 +313,37 @@ pdfjs-editor-highlight-button = .title = Zvýraznění pdfjs-editor-highlight-button-label = Zvýraznění -pdfjs-highlight-floating-button = - .title = Zvýraznit pdfjs-highlight-floating-button1 = .title = Zvýraznit .aria-label = Zvýraznit pdfjs-highlight-floating-button-label = Zvýraznit +pdfjs-comment-floating-button = + .title = Komentář + .aria-label = Komentář +pdfjs-comment-floating-button-label = Komentář +pdfjs-editor-comment-button = + .title = Komentář + .aria-label = Komentář +pdfjs-editor-comment-button-label = Komentář +pdfjs-editor-signature-button = + .title = Přidat podpis +pdfjs-editor-signature-button-label = Přidat podpis + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Editor zvýraznění +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Editor kresby +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Editor podpisu: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Editor obrázků ## Remove button for the various kind of editor. @@ -325,6 +355,8 @@ .title = Odebrat obrázek pdfjs-editor-remove-highlight-button = .title = Odebrat zvýraznění +pdfjs-editor-remove-signature-button = + .title = Odebrat podpis ## @@ -341,19 +373,43 @@ pdfjs-editor-free-highlight-thickness-input = Tloušťka pdfjs-editor-free-highlight-thickness-title = .title = Změna tloušťky při zvýrazňování jiných položek než textu -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Ovládací prvky pro podpisy a uložené podpisy +pdfjs-editor-signature-add-signature-button = + .title = Přidat nový podpis +pdfjs-editor-signature-add-signature-button-label = Přidat nový podpis +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Uložený podpis: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Textový editor -pdfjs-free-text-default-content = Začněte psát… -pdfjs-ink = - .aria-label = Editor kreslení -pdfjs-ink-canvas = - .aria-label = Uživatelem vytvořený obrázek + .default-content = Začněte psát... +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Komentář + [few] Komentáře + [many] Komentáře + *[other] Komentáře + } +pdfjs-editor-comments-sidebar-close-button = + .title = Zavřít postranní lištu + .aria-label = Zavřít postranní lištu +pdfjs-editor-comments-sidebar-close-button-label = Zavřít postranní lištu +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Vidíte něco pozoruhodného? Zvýrazněte to a zanechte komentář. +pdfjs-editor-comments-sidebar-no-comments-link = Zjistit více ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Náhradní popis -pdfjs-editor-alt-text-edit-button-label = Upravit náhradní popis +pdfjs-editor-alt-text-edit-button = + .aria-label = Upravit alternativní text pdfjs-editor-alt-text-dialog-label = Vyberte možnost pdfjs-editor-alt-text-dialog-description = Náhradní popis pomáhá, když lidé obrázek nevidí nebo když se nenačítá. pdfjs-editor-alt-text-add-description-label = Přidat popis @@ -366,18 +422,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Například: “Mladý muž si sedá ke stolu, aby se najedl.” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternativní text ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Levý horní roh — změna velikosti -pdfjs-editor-resizer-label-top-middle = Horní střed — změna velikosti -pdfjs-editor-resizer-label-top-right = Pravý horní roh — změna velikosti -pdfjs-editor-resizer-label-middle-right = Vpravo uprostřed — změna velikosti -pdfjs-editor-resizer-label-bottom-right = Pravý dolní roh — změna velikosti -pdfjs-editor-resizer-label-bottom-middle = Střed dole — změna velikosti -pdfjs-editor-resizer-label-bottom-left = Levý dolní roh — změna velikosti -pdfjs-editor-resizer-label-middle-left = Vlevo uprostřed — změna velikosti +pdfjs-editor-resizer-top-left = + .aria-label = Levý horní roh — změna velikosti +pdfjs-editor-resizer-top-middle = + .aria-label = Horní střed — změna velikosti +pdfjs-editor-resizer-top-right = + .aria-label = Pravý horní roh — změna velikosti +pdfjs-editor-resizer-middle-right = + .aria-label = Vpravo uprostřed — změna velikosti +pdfjs-editor-resizer-bottom-right = + .aria-label = Pravý dolní roh — změna velikosti +pdfjs-editor-resizer-bottom-middle = + .aria-label = Střed dole — změna velikosti +pdfjs-editor-resizer-bottom-left = + .aria-label = Levý dolní roh — změna velikosti +pdfjs-editor-resizer-middle-left = + .aria-label = Vlevo uprostřed — změna velikosti ## Color picker @@ -404,3 +471,293 @@ pdfjs-editor-highlight-show-all-button-label = Zobrazit vše pdfjs-editor-highlight-show-all-button = .title = Zobrazit vše + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Upravit alternativní text (popis obrázku) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Přidat alternativní text (popis obrázku) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Sem napište svůj popis… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Krátký popis pro lidi, kteří neuvidí obrázek nebo když se obrázek nenačítá. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Tento alternativní text byl vytvořen automaticky a může být nepřesný. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Více informací +pdfjs-editor-new-alt-text-create-automatically-button-label = Vytvořit alternativní text automaticky +pdfjs-editor-new-alt-text-not-now-button = Teď ne +pdfjs-editor-new-alt-text-error-title = Nepodařilo se automaticky vytvořit alternativní text +pdfjs-editor-new-alt-text-error-description = Napište prosím vlastní alternativní text nebo to zkuste znovu později. +pdfjs-editor-new-alt-text-error-close-button = Zavřít +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Stahuje se model AI pro alternativní texty ({ $downloadedSize } z { $totalSize } MB) + .aria-valuetext = Stahuje se model AI pro alternativní texty ({ $downloadedSize } z { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternativní text byl přidán +pdfjs-editor-new-alt-text-added-button-label = Alternativní text byl přidán +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Chybí alternativní text +pdfjs-editor-new-alt-text-missing-button-label = Chybí alternativní text +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Zkontrolovat alternativní text +pdfjs-editor-new-alt-text-to-review-button-label = Zkontrolovat alternativní text +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Vytvořeno automaticky: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Nastavení alternativního textu obrázku +pdfjs-image-alt-text-settings-button-label = Nastavení alternativního textu obrázku +pdfjs-editor-alt-text-settings-dialog-label = Nastavení alternativního textu obrázku +pdfjs-editor-alt-text-settings-automatic-title = Automatický alternativní text +pdfjs-editor-alt-text-settings-create-model-button-label = Vytvořit alternativní text automaticky +pdfjs-editor-alt-text-settings-create-model-description = Navrhuje popisy, které pomohou lidem, kteří nevidí obrázek nebo když se obrázek nenačte. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model AI pro alternativní text ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Běží lokálně na vašem zařízení, takže vaše data zůstávají v bezpečí. Vyžadováno pro automatický alternativní text. +pdfjs-editor-alt-text-settings-delete-model-button = Smazat +pdfjs-editor-alt-text-settings-download-model-button = Stáhnout +pdfjs-editor-alt-text-settings-downloading-model-button = Probíhá stahování... +pdfjs-editor-alt-text-settings-editor-title = Editor alternativního textu +pdfjs-editor-alt-text-settings-show-dialog-button-label = Při přidávání obrázku hned zobrazit editor alternativního textu +pdfjs-editor-alt-text-settings-show-dialog-description = Pomůže vám zajistit, aby všechny vaše obrázky obsahovaly alternativní text. +pdfjs-editor-alt-text-settings-close-button = Zavřít + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Přidáno zvýraznění +pdfjs-editor-freetext-added-alert = Text přidán +pdfjs-editor-ink-added-alert = Kresba byla přidána +pdfjs-editor-stamp-added-alert = Obrázek byl přidán +pdfjs-editor-signature-added-alert = Byl přidán podpis + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Zvýraznění odebráno +pdfjs-editor-undo-bar-message-freetext = Text odstraněn +pdfjs-editor-undo-bar-message-ink = Kresba odstraněna +pdfjs-editor-undo-bar-message-stamp = Obrázek odebrán +pdfjs-editor-undo-bar-message-signature = Podpis odebrán +pdfjs-editor-undo-bar-message-comment = Komentář odebrán +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } anotace odebrána + [few] { $count } anotace odebrány + [many] { $count } anotací odebráno + *[other] { $count } anotací odebráno + } +pdfjs-editor-undo-bar-undo-button = + .title = Zpět +pdfjs-editor-undo-bar-undo-button-label = Zpět +pdfjs-editor-undo-bar-close-button = + .title = Zavřít +pdfjs-editor-undo-bar-close-button-label = Zavřít + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Tento způsob umožňuje uživateli vytvořit podpis, který se přidá do dokumentu PDF. Uživatel může upravit jméno (které slouží zároveň jako alternativní text) a podpis uložit pro pozdější použití. +pdfjs-editor-add-signature-dialog-title = Přidat podpis + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Psát + .title = Psát +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Kreslit + .title = Kreslit +pdfjs-editor-add-signature-image-button = Obrázek + .title = Obrázek + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Zadejte svůj podpis + .placeholder = Zadejte svůj podpis +pdfjs-editor-add-signature-draw-placeholder = Nakreslete svůj podpis +pdfjs-editor-add-signature-draw-thickness-range-label = Tloušťka +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Tloušťka kresby: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Přetáhněte sem soubor, který chcete nahrát +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Nebo vyberte soubory obrazu + *[other] Nebo vyberte soubory obrazu + } + +## Controls + +pdfjs-editor-add-signature-description-label = Popis (alternativní text) +pdfjs-editor-add-signature-description-input = + .title = Popis (alternativní text) +pdfjs-editor-add-signature-description-default-when-drawing = Podpis +pdfjs-editor-add-signature-clear-button-label = Vymazání podpisu +pdfjs-editor-add-signature-clear-button = + .title = Vymazání podpisu +pdfjs-editor-add-signature-save-checkbox = Uložit podpis +pdfjs-editor-add-signature-save-warning-message = Dosáhli jste limitu 5 uložených podpisů. Chcete-li uložit další, jeden odstraňte. +pdfjs-editor-add-signature-image-upload-error-title = Obrázek se nepodařilo nahrát +pdfjs-editor-add-signature-image-upload-error-description = Zkontrolujte připojení k síti nebo zkuste jiný obrázek. +pdfjs-editor-add-signature-image-no-data-error-title = Nelze převést tento obrázek na podpis +pdfjs-editor-add-signature-image-no-data-error-description = Zkuste nahrát jiný obrázek. +pdfjs-editor-add-signature-error-close-button = Zavřít + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Zrušit +pdfjs-editor-add-signature-add-button = Přidat +pdfjs-editor-edit-signature-update-button = Aktualizovat + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Upravit komentář +pdfjs-editor-edit-comment-popup-button = + .title = Upravit komentář +pdfjs-editor-delete-comment-popup-button-label = Odebrat komentář +pdfjs-editor-delete-comment-popup-button = + .title = Odebrat komentář +pdfjs-show-comment-button = + .title = Zobrazit komentář + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Upravit komentář +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualizovat +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Přidání komentáře +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Přidat +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Začněte psát… +pdfjs-editor-edit-comment-dialog-cancel-button = Zrušit + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Přidání komentáře + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Přepnout postranní lištu (dokument obsahuje náhledy/osnovu/přílohy/vrstvy) +pdfjs-toggle-views-manager-button1-label = Spravovat strany +pdfjs-views-manager-sidebar = + .aria-label = Postranní lišta +pdfjs-views-manager-sidebar-resizer = + .aria-label = Změna velikosti v postranní liště +pdfjs-views-manager-view-selector-button = + .title = Zobrazení +pdfjs-views-manager-view-selector-button-label = Zobrazení +pdfjs-views-manager-pages-title = Stránky +pdfjs-views-manager-outlines-title1 = Osnova dokumentu + .title = Osnova dokumentu (dvojité klepnutí rozbalí/sbalí všechny položky) +pdfjs-views-manager-attachments-title = Přílohy +pdfjs-views-manager-layers-title1 = Vrstvy + .title = Vrstvy (dvojité klepnutí obnoví všechny vrstvy do výchozího stavu) +pdfjs-views-manager-pages-option-label = Stránky +pdfjs-views-manager-outlines-option-label = Osnova dokumentu +pdfjs-views-manager-attachments-option-label = Přílohy +pdfjs-views-manager-layers-option-label = Vrstvy +pdfjs-views-manager-add-file-button = + .title = Přidat soubor +pdfjs-views-manager-add-file-button-label = Přidat soubor +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } vybrána + [few] { $count } vybrány + [many] { $count } vybráno + *[other] { $count } vybráno + } +pdfjs-views-manager-pages-status-none-action-label = Výběr stránek +pdfjs-views-manager-pages-status-action-button-label = Správa +pdfjs-views-manager-pages-status-copy-button-label = Kopírovat +pdfjs-views-manager-pages-status-cut-button-label = Vyjmout +pdfjs-views-manager-pages-status-delete-button-label = Smazat +pdfjs-views-manager-pages-status-export-selected-button-label = Exportovat vybrané… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 stránka vyjmuta + [few] { $count } stránky vyjmuty + [many] { $count } stránek vyjmuto + *[other] { $count } stránek vyjmuto + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 stránka zkopírována + [few] { $count } stránky zkopírovány + [many] { $count } stránek zkopírováno + *[other] { $count } stránek zkopírováno + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 stránka smazána + [few] { $count } stránky smazány + [many] { $count } stránek smazáno + *[other] { $count } stránek smazáno + } +pdfjs-views-manager-pages-status-waiting-ready-label = Příprava vašeho souboru… +pdfjs-views-manager-pages-status-waiting-uploading-label = Nahrávání souboru… +pdfjs-views-manager-status-warning-cut-label = Nelze vyjmout. Obnovte stránku a zkuste to znovu. +pdfjs-views-manager-status-warning-copy-label = Kopírování se nezdařilo. Obnovte stránku a zkuste to znovu. +pdfjs-views-manager-status-warning-delete-label = Smazání se nezdařilo. Obnovte stránku a zkuste to znovu. +pdfjs-views-manager-status-warning-save-label = Nepodařilo se uložit. Obnovte stránku a zkuste to znovu. +pdfjs-views-manager-status-undo-button-label = Zpět +pdfjs-views-manager-status-done-button-label = Hotovo +pdfjs-views-manager-status-close-button = + .title = Zavřít +pdfjs-views-manager-status-close-button-label = Zavřít +pdfjs-views-manager-paste-button-label = Vložit +pdfjs-views-manager-paste-button-before = + .title = Vloží před první stránku +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Vložit za stránku { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NOVÉ +pdfjs-views-manager-waiting-for-file = Nahrávání souboru… +pdfjs-toggle-views-manager-button1 = + .title = Spravovat strany + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Odebrat uložený podpis +pdfjs-editor-delete-signature-button-label1 = Odebrat uložený podpis + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Upravit popis + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Upravit popis diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/cy/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/cy/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/cy/viewer.ftl 2026-01-20 14:08:39.361689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/cy/viewer.ftl 2026-07-09 07:12:41.855909800 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Tudalen Gyfredol (Gweld URL o'r Dudalen Gyfredol) pdfjs-bookmark-button-label = Tudalen Gyfredol -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Agor yn yr ap -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Agor yn yr ap ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Enw ffeil: pdfjs-document-properties-file-size = Maint ffeil: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } beit) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } beit) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } beit) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } beit) pdfjs-document-properties-title = Teitl: pdfjs-document-properties-author = Awdur: pdfjs-document-properties-subject = Pwnc: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Dyddiad Creu: pdfjs-document-properties-modification-date = Dyddiad Addasu: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Crewr: pdfjs-document-properties-producer = Cynhyrchydd PDF: pdfjs-document-properties-version = Fersiwn PDF: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Llun Bach Tudalen { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Dewis tudalen { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Tudalen { $page } o { $total } ## Find panel button title and messages @@ -278,10 +280,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -289,6 +287,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Anodiad { $type } ] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -302,9 +303,13 @@ pdfjs-editor-free-text-button = .title = Testun +pdfjs-editor-color-picker-free-text-input = + .title = Newid lliw testun pdfjs-editor-free-text-button-label = Testun pdfjs-editor-ink-button = .title = Lluniadu +pdfjs-editor-color-picker-ink-input = + .title = Newid lliw lluniadu pdfjs-editor-ink-button-label = Lluniadu pdfjs-editor-stamp-button = .title = Ychwanegu neu olygu delweddau @@ -312,8 +317,37 @@ pdfjs-editor-highlight-button = .title = Amlygu pdfjs-editor-highlight-button-label = Amlygu -pdfjs-highlight-floating-button = +pdfjs-highlight-floating-button1 = .title = Amlygu + .aria-label = Amlygu +pdfjs-highlight-floating-button-label = Amlygu +pdfjs-comment-floating-button = + .title = Sylw + .aria-label = Sylw +pdfjs-comment-floating-button-label = Sylw +pdfjs-editor-comment-button = + .title = Sylw + .aria-label = Sylw +pdfjs-editor-comment-button-label = Sylw +pdfjs-editor-signature-button = + .title = Ychwanegu llofnod +pdfjs-editor-signature-button-label = Ychwanegu llofnod + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Golygydd amlygu +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Golygydd lluniadu +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Golygydd llofnod: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Golygydd delweddau ## Remove button for the various kind of editor. @@ -325,6 +359,8 @@ .title = Dileu delwedd pdfjs-editor-remove-highlight-button = .title = Tynnu amlygiad +pdfjs-editor-remove-signature-button = + .title = Dileu llofnod ## @@ -341,19 +377,45 @@ pdfjs-editor-free-highlight-thickness-input = Trwch pdfjs-editor-free-highlight-thickness-title = .title = Newid trwch wrth amlygu eitemau heblaw testun -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Rheolyddion llofnodion a llofnodion wedi'u cadw +pdfjs-editor-signature-add-signature-button = + .title = Ychwanegu llofnod newydd +pdfjs-editor-signature-add-signature-button-label = Ychwanegu llofnod newydd +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Llofnod wedi'i gadw: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Golygydd Testun -pdfjs-free-text-default-content = Cychwyn teipio… -pdfjs-ink = - .aria-label = Golygydd Lluniadu -pdfjs-ink-canvas = - .aria-label = Delwedd wedi'i chreu gan ddefnyddwyr + .default-content = Cychwyn teipio… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [zero] Sylwadau + [one] Sylw + [two] Sylw + [few] Sylw + [many] Sylw + *[other] Sylw + } +pdfjs-editor-comments-sidebar-close-button = + .title = Cau'r bar ochr + .aria-label = Cau'r bar ochr +pdfjs-editor-comments-sidebar-close-button-label = Cau'r bar ochr +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Gweld rhywbeth nodedig? Amlygwch ef a gadael sylw. +pdfjs-editor-comments-sidebar-no-comments-link = Dysgu rhagor ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Testun amgen (alt) -pdfjs-editor-alt-text-edit-button-label = Golygu testun amgen +pdfjs-editor-alt-text-edit-button = + .aria-label = Golygu testun amgen pdfjs-editor-alt-text-dialog-label = Dewisiadau pdfjs-editor-alt-text-dialog-description = Mae testun amgen (testun alt) yn helpu pan na all pobl weld y ddelwedd neu pan nad yw'n llwytho. pdfjs-editor-alt-text-add-description-label = Ychwanegu disgrifiad @@ -366,18 +428,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Er enghraifft, “Mae dyn ifanc yn eistedd wrth fwrdd i fwyta pryd bwyd” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Testun amgen (alt) ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Y gornel chwith uchaf — newid maint -pdfjs-editor-resizer-label-top-middle = Canol uchaf - newid maint -pdfjs-editor-resizer-label-top-right = Y gornel dde uchaf - newid maint -pdfjs-editor-resizer-label-middle-right = De canol - newid maint -pdfjs-editor-resizer-label-bottom-right = Y gornel dde isaf — newid maint -pdfjs-editor-resizer-label-bottom-middle = Canol gwaelod — newid maint -pdfjs-editor-resizer-label-bottom-left = Y gornel chwith isaf — newid maint -pdfjs-editor-resizer-label-middle-left = Chwith canol — newid maint +pdfjs-editor-resizer-top-left = + .aria-label = Y gornel chwith uchaf — newid maint +pdfjs-editor-resizer-top-middle = + .aria-label = Canol uchaf - newid maint +pdfjs-editor-resizer-top-right = + .aria-label = Y gornel dde uchaf - newid maint +pdfjs-editor-resizer-middle-right = + .aria-label = De canol - newid maint +pdfjs-editor-resizer-bottom-right = + .aria-label = Y gornel dde isaf — newid maint +pdfjs-editor-resizer-bottom-middle = + .aria-label = Canol gwaelod — newid maint +pdfjs-editor-resizer-bottom-left = + .aria-label = Y gornel chwith isaf — newid maint +pdfjs-editor-resizer-middle-left = + .aria-label = Chwith canol — newid maint ## Color picker @@ -404,3 +477,303 @@ pdfjs-editor-highlight-show-all-button-label = Dangos y cyfan pdfjs-editor-highlight-show-all-button = .title = Dangos y cyfan + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Golygu testun amgen (disgrifiad o ddelwedd) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Ychwanegwch destun amgen (disgrifiad delwedd) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Ysgrifennwch eich disgrifiad yma… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Disgrifiad byr ar gyfer pobl sydd ddim yn gallu gweld y ddelwedd neu pan nad yw'r ddelwedd yn llwytho. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Cafodd y testun amgen hwn ei greu'n awtomatig a gall fod yn anghywir. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Rhagor +pdfjs-editor-new-alt-text-create-automatically-button-label = Creu testun amgen yn awtomatig +pdfjs-editor-new-alt-text-not-now-button = Nid nawr +pdfjs-editor-new-alt-text-error-title = Methu â chreu testun amgen yn awtomatig +pdfjs-editor-new-alt-text-error-description = Ysgrifennwch eich testun amgen eich hun neu ceisiwch eto yn nes ymlaen. +pdfjs-editor-new-alt-text-error-close-button = Cau +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Wrthi'n llwytho i lawr model AI testun amgen ( { $downloadedSize } o { $totalSize } MB) + .aria-valuetext = Wrthi'n llwytho i lawr model AI testun amgen ( { $downloadedSize } o { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Ychwanegwyd testun amgen +pdfjs-editor-new-alt-text-added-button-label = Ychwanegwyd testun amgen +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Testun amgen coll +pdfjs-editor-new-alt-text-missing-button-label = Testun amgen coll +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Adolygu'r testun amgen +pdfjs-editor-new-alt-text-to-review-button-label = Adolygu'r testun amgen +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Crëwyd yn awtomatig: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Gosodiadau testun amgen delwedd +pdfjs-image-alt-text-settings-button-label = Gosodiadau testun amgen delwedd +pdfjs-editor-alt-text-settings-dialog-label = Gosodiadau testun amgen delwedd +pdfjs-editor-alt-text-settings-automatic-title = Testun amgen awtomatig +pdfjs-editor-alt-text-settings-create-model-button-label = Creu testun amgen yn awtomatig +pdfjs-editor-alt-text-settings-create-model-description = Yn awgrymu disgrifiadau i helpu pobl sydd ddim yn gallu gweld y ddelwedd neu pan nad yw'r ddelwedd yn llwytho. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model AI testun amgen ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Yn rhedeg yn lleol ar eich dyfais fel bod eich data'n aros yn breifat. Yn ofynnol ar gyfer testun amgen awtomatig. +pdfjs-editor-alt-text-settings-delete-model-button = Dileu +pdfjs-editor-alt-text-settings-download-model-button = Llwytho i Lawr +pdfjs-editor-alt-text-settings-downloading-model-button = Wrthi'n llwytho i lawr… +pdfjs-editor-alt-text-settings-editor-title = Golygydd testun amgen +pdfjs-editor-alt-text-settings-show-dialog-button-label = Dangoswch y golygydd testun amgen yn syth wrth ychwanegu delwedd +pdfjs-editor-alt-text-settings-show-dialog-description = Yn eich helpu i wneud yn siŵr bod gan eich holl ddelweddau destun amgen. +pdfjs-editor-alt-text-settings-close-button = Cau + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Amlygu wedi'i ychwanegu +pdfjs-editor-freetext-added-alert = Testun wedi'i ychwanegu +pdfjs-editor-ink-added-alert = Lluniadu wedi'i ychwanegu +pdfjs-editor-stamp-added-alert = Delwedd wedi'i hychwanegu +pdfjs-editor-signature-added-alert = Llofnod wedi'i ychwanegu + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Tynnwyd yr amlygu +pdfjs-editor-undo-bar-message-freetext = Tynnwyd y testun +pdfjs-editor-undo-bar-message-ink = Tynnwyd y lluniad +pdfjs-editor-undo-bar-message-stamp = Tynnwyd y ddelwedd +pdfjs-editor-undo-bar-message-signature = Llofnod wedi'i dynnu +pdfjs-editor-undo-bar-message-comment = Sylw wedi'i dynnu +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [zero] { $count } anodiad wedi'u tynnu + [one] { $count } anodiad wedi'i dynnu + [two] { $count } anodiad wedi'u tynnu + [few] { $count } anodiad wedi'u tynnu + [many] { $count } anodiad wedi'u tynnu + *[other] { $count } anodiad wedi'u tynnu + } +pdfjs-editor-undo-bar-undo-button = + .title = Dadwneud +pdfjs-editor-undo-bar-undo-button-label = Dadwneud +pdfjs-editor-undo-bar-close-button = + .title = Cau +pdfjs-editor-undo-bar-close-button-label = Cau + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Mae'r modd hwn yn caniatáu i'r defnyddiwr greu llofnod i'w ychwanegu at ddogfen PDF. Gall y defnyddiwr olygu'r enw (sydd hefyd yn gweithredu fel y testun amgen), ac yn ddewisol cadw'r llofnod i'w ddefnyddio dro ar ôl tro. +pdfjs-editor-add-signature-dialog-title = Ychwanegu llofnod + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Math + .title = Math +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Lluniadu + .title = Lluniadu +pdfjs-editor-add-signature-image-button = Delwedd + .title = Delwedd + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Teipiwch eich llofnod + .placeholder = Teipiwch eich llofnod +pdfjs-editor-add-signature-draw-placeholder = Lluniwch eich llofnod +pdfjs-editor-add-signature-draw-thickness-range-label = Trwch +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Trwch y llinell: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Llusgwch ffeil yma i'w llwytho +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Neu ddewis ffeiliau delwedd + *[other] Neu bori ffeiliau delwedd + } + +## Controls + +pdfjs-editor-add-signature-description-label = Disgrifiad (testun amgen) +pdfjs-editor-add-signature-description-input = + .title = Disgrifiad (testun amgen) +pdfjs-editor-add-signature-description-default-when-drawing = Llofnod +pdfjs-editor-add-signature-clear-button-label = Diddymu llofnod +pdfjs-editor-add-signature-clear-button = + .title = Diddymu llofnod +pdfjs-editor-add-signature-save-checkbox = Cadw llofnod +pdfjs-editor-add-signature-save-warning-message = Rydych chi wedi cyrraedd y terfyn o 5 llofnod sydd wedi'u cadw. Tynnwch un i gadw rhagor +pdfjs-editor-add-signature-image-upload-error-title = Methu llwytho'r ddelwedd. +pdfjs-editor-add-signature-image-upload-error-description = Gwiriwch eich cysylltiad rhwydwaith neu rhowch gynnig ar ddelwedd arall. +pdfjs-editor-add-signature-image-no-data-error-title = Methu trosi'r ddelwedd hon yn llofnod +pdfjs-editor-add-signature-image-no-data-error-description = Ceisiwch lwytho delwedd wahanol. +pdfjs-editor-add-signature-error-close-button = Cau + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Diddymu +pdfjs-editor-add-signature-add-button = Ychwanegu +pdfjs-editor-edit-signature-update-button = Diweddaru + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Golygu sylw +pdfjs-editor-edit-comment-popup-button = + .title = Golygu sylw +pdfjs-editor-delete-comment-popup-button-label = Tynnu sylw +pdfjs-editor-delete-comment-popup-button = + .title = Tynnu sylw +pdfjs-show-comment-button = + .title = Dangos sylw + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Golygu sylw +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Diweddaru +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Ychwanegu sylw +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Ychwanegu +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Cychwyn teipio… +pdfjs-editor-edit-comment-dialog-cancel-button = Diddymu + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Ychwanegu sylw + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Togl y Bar Ochr (dogfen yn cynnwys lluniau bach/amlinelliad/atodiadau/haenau) +pdfjs-toggle-views-manager-button1-label = Rheoli tudalennau +pdfjs-views-manager-sidebar = + .aria-label = Bar Ochr +pdfjs-views-manager-sidebar-resizer = + .aria-label = Newid maint bar ochr +pdfjs-views-manager-view-selector-button = + .title = Golygon +pdfjs-views-manager-view-selector-button-label = Golygon +pdfjs-views-manager-pages-title = Tudalennau +pdfjs-views-manager-outlines-title1 = Amlinelliad Dogfen + .title = Amlinelliad dogfen (clic dwbl i ehangu/leihau pob eitem) +pdfjs-views-manager-attachments-title = Atodiadau +pdfjs-views-manager-layers-title1 = Haenau + .title = Haenau clic dwbl i ailosod pob haen i'r cyflwr ragosodedig) +pdfjs-views-manager-pages-option-label = Tudalennau +pdfjs-views-manager-outlines-option-label = Amlinelliad dogfen +pdfjs-views-manager-attachments-option-label = Atodiadau +pdfjs-views-manager-layers-option-label = Haenau +pdfjs-views-manager-add-file-button = + .title = Ychwanegu ffeil +pdfjs-views-manager-add-file-button-label = Ychwanegu ffeil +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [zero] { $count } wedi'u dewis + [one] { $count } wedi'i dewis + [two] { $count } wedi'u dewis + [few] { $count } wedi'u dewis + [many] { $count } wedi'u dewis + *[other] { $count } wedi'u dewis + } +pdfjs-views-manager-pages-status-none-action-label = Dewiswch dudalennau +pdfjs-views-manager-pages-status-action-button-label = Rheoli +pdfjs-views-manager-pages-status-copy-button-label = Copïo +pdfjs-views-manager-pages-status-cut-button-label = Torri +pdfjs-views-manager-pages-status-delete-button-label = Dileu +pdfjs-views-manager-pages-status-export-selected-button-label = Wedi dewis allforio… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [zero] { $count } tudalennau wedi'u torri + [one] { $count } dudalen wedi'i thorri + [two] { $count } dudalen wedi'u torri + [few] { $count } tudalen wedi'u torri + [many] { $count } tudalen wedi'u torri + *[other] { $count } tudalen wedi'u torri + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [zero] { $count } tudalennau wedi'u copïo + [one] { $count } tudalen wedi'i chopïo + [two] { $count } tudalen wedi'u copïo + [few] { $count } tudalen wedi'u copïo + [many] { $count } tudalen wedi'u copïo + *[other] { $count } tudalen wedi'u copïo + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [zero] { $count } tudalennau wedi'u dileu + [one] { $count } tudalen wedi'i dileu + [two] { $count } dudalen wedi'u dileu + [few] { $count } tudalen wedi'u dileu + [many] { $count } tudalen wedi'u dileu + *[other] { $count } tudalen wedi'u dileu + } +pdfjs-views-manager-pages-status-waiting-ready-label = Yn paratoi eich ffeil… +pdfjs-views-manager-pages-status-waiting-uploading-label = Yn llwytho ffeil i fyny… +pdfjs-views-manager-status-warning-cut-label = Methu torri. Adnewyddwch y dudalen a cheisio eto. +pdfjs-views-manager-status-warning-copy-label = Methu copïo. Adnewyddwch y dudalen a cheisio eto. +pdfjs-views-manager-status-warning-delete-label = Methu dileu. Adnewyddwch y dudalen a cheisio eto. +pdfjs-views-manager-status-warning-save-label = Methu cadw. Adnewyddwch y dudalen a cheisio eto. +pdfjs-views-manager-status-undo-button-label = Dadwneud +pdfjs-views-manager-status-done-button-label = Gorffen +pdfjs-views-manager-status-close-button = + .title = Cau +pdfjs-views-manager-status-close-button-label = Cau +pdfjs-views-manager-paste-button-label = Gludo +pdfjs-views-manager-paste-button-before = + .title = Gludo cyn y dudalen gyntaf +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Gludo ar ôl tudalen { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NEWYDD +pdfjs-views-manager-waiting-for-file = Yn llwytho ffeil i fyny… +pdfjs-toggle-views-manager-button1 = + .title = Rheoli tudalennau + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Tynnu llofnod sydd wedi'i gadw +pdfjs-editor-delete-signature-button-label1 = Tynnwch y llofnod sydd wedi'i gadw + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Golygu disgrifiad + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Golygu disgrifiad diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/da/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/da/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/da/viewer.ftl 2026-01-20 14:08:39.362689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/da/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Aktuel side (vis URL fra den aktuelle side) pdfjs-bookmark-button-label = Aktuel side -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Åbn i app -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Åbn i app ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Filnavn: pdfjs-document-properties-file-size = Filstørrelse: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) pdfjs-document-properties-title = Titel: pdfjs-document-properties-author = Forfatter: pdfjs-document-properties-subject = Emne: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Oprettet: pdfjs-document-properties-modification-date = Redigeret: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Program: pdfjs-document-properties-producer = PDF-producent: pdfjs-document-properties-version = PDF-version: @@ -179,7 +172,7 @@ .title = Slå sidepanel til eller fra (dokumentet indeholder disposition/vedhæftede filer/lag) pdfjs-toggle-sidebar-button-label = Slå sidepanel til eller fra pdfjs-document-outline-button = - .title = Vis dokumentets disposition (dobbeltklik for at vise/skjule alle elementer) + .title = Vis dokumentets disposition (dobbeltklik for at udvide/sammenfolde alle elementer) pdfjs-document-outline-button-label = Dokument-disposition pdfjs-attachments-button = .title = Vis vedhæftede filer @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniature af side { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Vælg side { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Side { $page } af { $total } ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type }kommentar] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Tekst +pdfjs-editor-color-picker-free-text-input = + .title = Skift tekstfarve pdfjs-editor-free-text-button-label = Tekst pdfjs-editor-ink-button = .title = Tegn +pdfjs-editor-color-picker-ink-input = + .title = Skift tegne-farve pdfjs-editor-ink-button-label = Tegn pdfjs-editor-stamp-button = .title = Tilføj eller rediger billeder @@ -304,6 +309,37 @@ pdfjs-editor-highlight-button = .title = Fremhæv pdfjs-editor-highlight-button-label = Fremhæv +pdfjs-highlight-floating-button1 = + .title = Fremhæv + .aria-label = Fremhæv +pdfjs-highlight-floating-button-label = Fremhæv +pdfjs-comment-floating-button = + .title = Kommenter + .aria-label = Kommenter +pdfjs-comment-floating-button-label = Kommenter +pdfjs-editor-comment-button = + .title = Kommentar + .aria-label = Kommentar +pdfjs-editor-comment-button-label = Kommentar +pdfjs-editor-signature-button = + .title = Tilføj signatur +pdfjs-editor-signature-button-label = Tilføj signatur + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Redigering af fremhævning +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Redigering af tegninger +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Redigering af signatur: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Redigering af billeder ## Remove button for the various kind of editor. @@ -315,6 +351,8 @@ .title = Fjern billede pdfjs-editor-remove-highlight-button = .title = Fjern fremhævning +pdfjs-editor-remove-signature-button = + .title = Fjern signatur ## @@ -331,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Tykkelse pdfjs-editor-free-highlight-thickness-title = .title = Ændr tykkelse, når andre elementer end tekst fremhæves -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Indstillinger for signaturer og gemte signaturer +pdfjs-editor-signature-add-signature-button = + .title = Tilføj ny signatur +pdfjs-editor-signature-add-signature-button-label = Tilføj ny signatur +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Gemt signatur: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Teksteditor -pdfjs-free-text-default-content = Begynd at skrive… -pdfjs-ink = - .aria-label = Tegnings-editor -pdfjs-ink-canvas = - .aria-label = Brugeroprettet billede + .default-content = Begynd at skrive… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Kommentar + *[other] Kommentarer + } +pdfjs-editor-comments-sidebar-close-button = + .title = Luk sidepanelet + .aria-label = Luk sidepanelet +pdfjs-editor-comments-sidebar-close-button-label = Luk sidepanelet +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Har du fundet noget interessant? Fremhæv det og gem en kommentar. +pdfjs-editor-comments-sidebar-no-comments-link = Læs mere ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Alternativ tekst -pdfjs-editor-alt-text-edit-button-label = Rediger alternativ tekst +pdfjs-editor-alt-text-edit-button = + .aria-label = Rediger alternativ tekst pdfjs-editor-alt-text-dialog-label = Vælg en indstilling pdfjs-editor-alt-text-dialog-description = Alternativ tekst hjælper folk, som ikke kan se billedet eller når det ikke indlæses. pdfjs-editor-alt-text-add-description-label = Tilføj en beskrivelse @@ -356,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = For eksempel: "En ung mand sætter sig ved et bord for at spise et måltid mad" +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternativ tekst ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Øverste venstre hjørne — tilpas størrelse -pdfjs-editor-resizer-label-top-middle = Øverste i midten — tilpas størrelse -pdfjs-editor-resizer-label-top-right = Øverste højre hjørne — tilpas størrelse -pdfjs-editor-resizer-label-middle-right = Midten til højre — tilpas størrelse -pdfjs-editor-resizer-label-bottom-right = Nederste højre hjørne - tilpas størrelse -pdfjs-editor-resizer-label-bottom-middle = Nederst i midten - tilpas størrelse -pdfjs-editor-resizer-label-bottom-left = Nederste venstre hjørne - tilpas størrelse -pdfjs-editor-resizer-label-middle-left = Midten til venstre — tilpas størrelse +pdfjs-editor-resizer-top-left = + .aria-label = Øverste venstre hjørne — tilpas størrelse +pdfjs-editor-resizer-top-middle = + .aria-label = Øverste i midten — tilpas størrelse +pdfjs-editor-resizer-top-right = + .aria-label = Øverste højre hjørne — tilpas størrelse +pdfjs-editor-resizer-middle-right = + .aria-label = Midten til højre — tilpas størrelse +pdfjs-editor-resizer-bottom-right = + .aria-label = Nederste højre hjørne - tilpas størrelse +pdfjs-editor-resizer-bottom-middle = + .aria-label = Nederst i midten - tilpas størrelse +pdfjs-editor-resizer-bottom-left = + .aria-label = Nederste venstre hjørne - tilpas størrelse +pdfjs-editor-resizer-middle-left = + .aria-label = Midten til venstre — tilpas størrelse ## Color picker @@ -387,3 +458,282 @@ .title = Lyserød pdfjs-editor-colorpicker-red = .title = Rød + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Vis alle +pdfjs-editor-highlight-show-all-button = + .title = Vis alle + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Rediger alternativ tekst (billedbeskrivelse) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Tilføj alternativ tekst (billedbeskrivelse) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Skriv din beskrivelse her... +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Kort beskrivelse til personer, der ikke kan se billedet, eller når billedet ikke indlæses. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Denne alternative tekst blev oprettet automatisk og kan være upræcis. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Læs mere +pdfjs-editor-new-alt-text-create-automatically-button-label = Opret alternativ tekst automatisk +pdfjs-editor-new-alt-text-not-now-button = Ikke nu +pdfjs-editor-new-alt-text-error-title = Kunne ikke oprette alternativ tekst automatisk +pdfjs-editor-new-alt-text-error-description = Skriv din egen alternative tekst, eller prøv igen senere. +pdfjs-editor-new-alt-text-error-close-button = Luk +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Henter alternativ tekst AI-model ({ $downloadedSize } af { $totalSize } MB) + .aria-valuetext = Henter alternativ tekst AI-model ({ $downloadedSize } af { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternativ tekst tilføjet +pdfjs-editor-new-alt-text-added-button-label = Alternativ tekst tilføjet +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Mangler alternativ tekst +pdfjs-editor-new-alt-text-missing-button-label = Mangler alternativ tekst +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Gennemgå alternativ tekst +pdfjs-editor-new-alt-text-to-review-button-label = Gennemgå alternativ tekst +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Oprettet automatisk: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Indstillinger for alternativ tekst til billeder +pdfjs-image-alt-text-settings-button-label = Indstillinger for alternativ tekst til billeder +pdfjs-editor-alt-text-settings-dialog-label = Indstillinger for alternativ tekst til billeder +pdfjs-editor-alt-text-settings-automatic-title = Automatisk alternativ tekst +pdfjs-editor-alt-text-settings-create-model-button-label = Opret alternativ tekst automatisk +pdfjs-editor-alt-text-settings-create-model-description = Foreslår beskrivelser for at hjælpe folk, der ikke kan se billedet, eller når billedet ikke indlæses. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = AI-model til at oprette alternative tekster ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Kører lokalt på din enhed, så dine data forbliver private. Påkrævet for at anvende automatisk alternativ tekst. +pdfjs-editor-alt-text-settings-delete-model-button = Slet +pdfjs-editor-alt-text-settings-download-model-button = Hent +pdfjs-editor-alt-text-settings-downloading-model-button = Henter… +pdfjs-editor-alt-text-settings-editor-title = Redigering af alternativ tekst +pdfjs-editor-alt-text-settings-show-dialog-button-label = Vis redigering af alternativ tekst med det samme, når et billede tilføjes +pdfjs-editor-alt-text-settings-show-dialog-description = Hjælper dig med at sikre, at alle dine billeder har alternativ tekst. +pdfjs-editor-alt-text-settings-close-button = Luk + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Fremhævning tilføjet +pdfjs-editor-freetext-added-alert = Tekst tilføjet +pdfjs-editor-ink-added-alert = Tegning tilføjet +pdfjs-editor-stamp-added-alert = Billede tilføjet +pdfjs-editor-signature-added-alert = Signatur tilføjet + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Fremhævning fjernet +pdfjs-editor-undo-bar-message-freetext = Tekst fjernet +pdfjs-editor-undo-bar-message-ink = Tegning fjernet +pdfjs-editor-undo-bar-message-stamp = Billede fjernet +pdfjs-editor-undo-bar-message-signature = Signatur fjernet +pdfjs-editor-undo-bar-message-comment = Kommentar fjernet +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } kommentar fjernet + *[other] { $count } kommentarer fjernet + } +pdfjs-editor-undo-bar-undo-button = + .title = Fortryd +pdfjs-editor-undo-bar-undo-button-label = Fortryd +pdfjs-editor-undo-bar-close-button = + .title = Luk +pdfjs-editor-undo-bar-close-button-label = Luk + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Modal-vinduet gør det muligt for brugeren at oprette en signatur, som kan føjes til PDF-dokumenter. Brugeren kan redigere navnet (der også fungerer som alternativ tekst) og eventuelt gemme signaturen, så den kan bruges igen. +pdfjs-editor-add-signature-dialog-title = Tilføj en signatur + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Indtast + .title = Indtast +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Tegn + .title = Tegn +pdfjs-editor-add-signature-image-button = Billede + .title = Billede + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Indtast din signatur + .placeholder = Indtast din signatur +pdfjs-editor-add-signature-draw-placeholder = Tegn din signatur +pdfjs-editor-add-signature-draw-thickness-range-label = Tykkelse +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Linjetykkelse: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Træk en fil herhen for at uploade den +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Eller vælg billedfiler + *[other] Eller vælg billedfiler + } + +## Controls + +pdfjs-editor-add-signature-description-label = Beskrivelse (alternativ tekst) +pdfjs-editor-add-signature-description-input = + .title = Beskrivelse (alternativ tekst) +pdfjs-editor-add-signature-description-default-when-drawing = Underskrift +pdfjs-editor-add-signature-clear-button-label = Ryd signatur +pdfjs-editor-add-signature-clear-button = + .title = Ryd signatur +pdfjs-editor-add-signature-save-checkbox = Gem signatur +pdfjs-editor-add-signature-save-warning-message = Du har nået grænsen på 5 gemte signaturer. Fjern en for at tilføje en ny. +pdfjs-editor-add-signature-image-upload-error-title = Kunne ikke uploade billede +pdfjs-editor-add-signature-image-upload-error-description = Kontroller din netværksforbindelse eller prøv med et andet billede. +pdfjs-editor-add-signature-image-no-data-error-title = Kan ikke konvertere dette billede til en signatur +pdfjs-editor-add-signature-image-no-data-error-description = Prøv at uploade et andet billede. +pdfjs-editor-add-signature-error-close-button = Luk + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Annuller +pdfjs-editor-add-signature-add-button = Tilføj +pdfjs-editor-edit-signature-update-button = Opdater + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Rediger kommentar +pdfjs-editor-edit-comment-popup-button = + .title = Rediger kommentar +pdfjs-editor-delete-comment-popup-button-label = Fjern kommentar +pdfjs-editor-delete-comment-popup-button = + .title = Fjern kommentar +pdfjs-show-comment-button = + .title = Vis kommentar + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Rediger kommentar +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Opdater +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Tilføj kommentar +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Tilføj +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Begynd at skrive… +pdfjs-editor-edit-comment-dialog-cancel-button = Annuller + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Tilføj kommentar + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Slå sidepanel til eller fra (dokumentet indeholder miniaturer/disposition/vedhæftede filer/lag) +pdfjs-toggle-views-manager-button1-label = Håndter sider +pdfjs-views-manager-sidebar = + .aria-label = Sidepanel +pdfjs-views-manager-view-selector-button = + .title = Visninger +pdfjs-views-manager-view-selector-button-label = Visninger +pdfjs-views-manager-pages-title = Sider +pdfjs-views-manager-attachments-title = Vedhæftede filer +pdfjs-views-manager-layers-title1 = Lag + .title = Lag (dobbeltklik for at nulstille alle lag til standard-tilstanden) +pdfjs-views-manager-pages-option-label = Sider +pdfjs-views-manager-outlines-option-label = Dokument-disposition +pdfjs-views-manager-attachments-option-label = Vedhæftede filer +pdfjs-views-manager-layers-option-label = Lag +pdfjs-views-manager-add-file-button = + .title = Tilføj fil +pdfjs-views-manager-add-file-button-label = Tilføj fil +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } valgt + *[other] { $count } valgt + } +pdfjs-views-manager-pages-status-none-action-label = Vælg sider +pdfjs-views-manager-pages-status-action-button-label = Håndter +pdfjs-views-manager-pages-status-copy-button-label = Kopier +pdfjs-views-manager-pages-status-cut-button-label = Klip +pdfjs-views-manager-pages-status-delete-button-label = Slet +pdfjs-views-manager-pages-status-export-selected-button-label = Eksporter valgte… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 side klippet + *[other] { $count } sider klippet + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 side kopieret + *[other] { $count } sider kopieret + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 side slettet + *[other] { $count } sider slettet + } +pdfjs-views-manager-pages-status-waiting-ready-label = Gør din fil klar… +pdfjs-views-manager-pages-status-waiting-uploading-label = Uploader fil… +pdfjs-views-manager-status-undo-button-label = Fortryd +pdfjs-views-manager-status-done-button-label = Færdig +pdfjs-views-manager-status-close-button = + .title = Luk +pdfjs-views-manager-status-close-button-label = Luk +pdfjs-views-manager-paste-button-label = Indsæt +pdfjs-views-manager-paste-button-before = + .title = Indsæt før første side +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Indsæt efter side { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NY +pdfjs-views-manager-waiting-for-file = Uploader fil… +pdfjs-toggle-views-manager-button1 = + .title = Håndter sider + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Fjern gemt signatur +pdfjs-editor-delete-signature-button-label1 = Fjern gemt signatur + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Rediger beskrivelse + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Rediger beskrivelse diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/de/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/de/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/de/viewer.ftl 2026-01-20 14:08:39.362689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/de/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Aktuelle Seite (URL von aktueller Seite anzeigen) pdfjs-bookmark-button-label = Aktuelle Seite -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Mit App öffnen -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Mit App öffnen ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Dateiname: pdfjs-document-properties-file-size = Dateigröße: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } Bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } Bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } Bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } Bytes) pdfjs-document-properties-title = Titel: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Thema: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Erstelldatum: pdfjs-document-properties-modification-date = Bearbeitungsdatum: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date } { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Anwendung: pdfjs-document-properties-producer = PDF erstellt mit: pdfjs-document-properties-version = PDF-Version: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniaturansicht von Seite { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Seite { $page } auswählen +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Seite { $page } von { $total } ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Anlage: { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Text +pdfjs-editor-color-picker-free-text-input = + .title = Textfarbe ändern pdfjs-editor-free-text-button-label = Text pdfjs-editor-ink-button = .title = Zeichnen +pdfjs-editor-color-picker-ink-input = + .title = Zeichnungsfarbe ändern pdfjs-editor-ink-button-label = Zeichnen pdfjs-editor-stamp-button = .title = Grafiken hinzufügen oder bearbeiten @@ -304,12 +309,37 @@ pdfjs-editor-highlight-button = .title = Hervorheben pdfjs-editor-highlight-button-label = Hervorheben -pdfjs-highlight-floating-button = - .title = Hervorheben pdfjs-highlight-floating-button1 = .title = Hervorheben .aria-label = Hervorheben pdfjs-highlight-floating-button-label = Hervorheben +pdfjs-comment-floating-button = + .title = Kommentieren + .aria-label = Kommentieren +pdfjs-comment-floating-button-label = Kommentieren +pdfjs-editor-comment-button = + .title = Kommentar + .aria-label = Kommentar +pdfjs-editor-comment-button-label = Kommentar +pdfjs-editor-signature-button = + .title = Unterschrift hinzufügen +pdfjs-editor-signature-button-label = Unterschrift hinzufügen + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Hervorhebungs-Editor +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Zeichnungseditor +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Unterschrifts-Editor: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Grafik-Editor ## Remove button for the various kind of editor. @@ -321,6 +351,8 @@ .title = Grafik entfernen pdfjs-editor-remove-highlight-button = .title = Hervorhebung entfernen +pdfjs-editor-remove-signature-button = + .title = Unterschrift entfernen ## @@ -337,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Linienstärke pdfjs-editor-free-highlight-thickness-title = .title = Linienstärke beim Hervorheben anderer Elemente als Text ändern -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Signaturkontrollen und gespeicherte Signaturen +pdfjs-editor-signature-add-signature-button = + .title = Neue Unterschrift hinzufügen +pdfjs-editor-signature-add-signature-button-label = Neue Unterschrift hinzufügen +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Gespeicherte Signatur: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Texteditor -pdfjs-free-text-default-content = Schreiben beginnen… -pdfjs-ink = - .aria-label = Zeichnungseditor -pdfjs-ink-canvas = - .aria-label = Vom Benutzer erstelltes Bild + .default-content = Schreiben beginnen… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Kommentar + *[other] Kommentare + } +pdfjs-editor-comments-sidebar-close-button = + .title = Sidebar schließen + .aria-label = Sidebar schließen +pdfjs-editor-comments-sidebar-close-button-label = Sidebar schließen +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Haben Sie etwas Bemerkenswertes entdeckt? Heben Sie es hervor und hinterlassen Sie einen Kommentar. +pdfjs-editor-comments-sidebar-no-comments-link = Weitere Informationen ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Alternativ-Text -pdfjs-editor-alt-text-edit-button-label = Alternativ-Text bearbeiten +pdfjs-editor-alt-text-edit-button = + .aria-label = Alternativ-Text bearbeiten pdfjs-editor-alt-text-dialog-label = Option wählen pdfjs-editor-alt-text-dialog-description = Alt-Text (Alternativtext) hilft, wenn Personen die Grafik nicht sehen können oder wenn sie nicht geladen wird. pdfjs-editor-alt-text-add-description-label = Beschreibung hinzufügen @@ -362,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Zum Beispiel: "Ein junger Mann setzt sich an einen Tisch, um zu essen." +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternativ-Text ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Linke obere Ecke - Größe ändern -pdfjs-editor-resizer-label-top-middle = Oben mittig - Größe ändern -pdfjs-editor-resizer-label-top-right = Rechts oben - Größe ändern -pdfjs-editor-resizer-label-middle-right = Mitte rechts - Größe ändern -pdfjs-editor-resizer-label-bottom-right = Rechte untere Ecke - Größe ändern -pdfjs-editor-resizer-label-bottom-middle = Unten mittig - Größe ändern -pdfjs-editor-resizer-label-bottom-left = Linke untere Ecke - Größe ändern -pdfjs-editor-resizer-label-middle-left = Mitte links - Größe ändern +pdfjs-editor-resizer-top-left = + .aria-label = Linke obere Ecke - Größe ändern +pdfjs-editor-resizer-top-middle = + .aria-label = Oben mittig - Größe ändern +pdfjs-editor-resizer-top-right = + .aria-label = Rechts oben - Größe ändern +pdfjs-editor-resizer-middle-right = + .aria-label = Mitte rechts - Größe ändern +pdfjs-editor-resizer-bottom-right = + .aria-label = Rechte untere Ecke - Größe ändern +pdfjs-editor-resizer-bottom-middle = + .aria-label = Unten mittig - Größe ändern +pdfjs-editor-resizer-bottom-left = + .aria-label = Linke untere Ecke - Größe ändern +pdfjs-editor-resizer-middle-left = + .aria-label = Mitte links - Größe ändern ## Color picker @@ -400,3 +465,283 @@ pdfjs-editor-highlight-show-all-button-label = Alle anzeigen pdfjs-editor-highlight-show-all-button = .title = Alle anzeigen + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Alternativ-Text (Grafikbeschreibung) bearbeiten +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Alternativ-Text (Grafikbeschreibung) hinzufügen +pdfjs-editor-new-alt-text-textarea = + .placeholder = Schreiben Sie Ihre Beschreibung hier… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Kurze Beschreibung für Personen, die die Grafik nicht sehen können, oder wenn die Grafik nicht geladen wird. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Dieser Alternativ-Text wurde automatisch erstellt und könnte ungenau sein. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Weitere Informationen +pdfjs-editor-new-alt-text-create-automatically-button-label = Alternativ-Text automatisch erstellen +pdfjs-editor-new-alt-text-not-now-button = Nicht jetzt +pdfjs-editor-new-alt-text-error-title = Alternativ-Text konnte nicht automatisch erstellt werden +pdfjs-editor-new-alt-text-error-description = Bitte schreiben Sie Ihren eigenen Alternativ-Text oder versuchen Sie es später erneut. +pdfjs-editor-new-alt-text-error-close-button = Schließen +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Alternativ-Text-KI-Modell wird heruntergeladen ({ $downloadedSize } von { $totalSize } MB) + .aria-valuetext = Alternativ-Text-KI-Modell wird heruntergeladen ({ $downloadedSize } von { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternativ-Text hinzugefügt +pdfjs-editor-new-alt-text-added-button-label = Alternativ-Text hinzugefügt +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Fehlender Alternativ-Text +pdfjs-editor-new-alt-text-missing-button-label = Fehlender Alternativ-Text +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Alternativ-Text überprüfen +pdfjs-editor-new-alt-text-to-review-button-label = Alternativ-Text überprüfen +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automatisch erstellt: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Alternativ-Text-Einstellungen für Grafiken +pdfjs-image-alt-text-settings-button-label = Alternativ-Text-Einstellungen für Grafiken +pdfjs-editor-alt-text-settings-dialog-label = Alternativ-Text-Einstellungen für Grafiken +pdfjs-editor-alt-text-settings-automatic-title = Automatischer Alternativ-Text +pdfjs-editor-alt-text-settings-create-model-button-label = Alternativ-Text automatisch erstellen +pdfjs-editor-alt-text-settings-create-model-description = Schlägt Beschreibungen vor, um Personen zu helfen, die die Grafik nicht sehen können, oder wenn die Grafik nicht geladen wird. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Alternativ-Text-KI-Modell ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Wird lokal auf Ihrem Gerät ausgeführt, sodass Ihre Daten privat bleiben. Erforderlich für automatischen Alternativ-Text. +pdfjs-editor-alt-text-settings-delete-model-button = Löschen +pdfjs-editor-alt-text-settings-download-model-button = Herunterladen +pdfjs-editor-alt-text-settings-downloading-model-button = Wird heruntergeladen… +pdfjs-editor-alt-text-settings-editor-title = Alternativ-Texteditor +pdfjs-editor-alt-text-settings-show-dialog-button-label = Alternativ-Texteditor beim Hinzufügen einer Grafik anzeigen +pdfjs-editor-alt-text-settings-show-dialog-description = Hilft Ihnen, sicherzustellen, dass alle Ihre Grafiken Alternativ-Text haben. +pdfjs-editor-alt-text-settings-close-button = Schließen + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Hervorhebung hinzugefügt +pdfjs-editor-freetext-added-alert = Text hinzugefügt +pdfjs-editor-ink-added-alert = Zeichnung hinzugefügt +pdfjs-editor-stamp-added-alert = Bild hinzugefügt +pdfjs-editor-signature-added-alert = Signatur hinzugefügt + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Hervorhebung entfernt +pdfjs-editor-undo-bar-message-freetext = Text entfernt +pdfjs-editor-undo-bar-message-ink = Zeichnung entfernt +pdfjs-editor-undo-bar-message-stamp = Grafik entfernt +pdfjs-editor-undo-bar-message-signature = Unterschrift entfernt +pdfjs-editor-undo-bar-message-comment = Kommentar entfernt +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } Anmerkung entfernt + *[other] { $count } Anmerkungen entfernt + } +pdfjs-editor-undo-bar-undo-button = + .title = Rückgängig +pdfjs-editor-undo-bar-undo-button-label = Rückgängig +pdfjs-editor-undo-bar-close-button = + .title = Schließen +pdfjs-editor-undo-bar-close-button-label = Schließen + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Dieses Modal ermöglicht es dem Benutzer, eine Unterschrift zu erstellen, um sie zu einem PDF-Dokument hinzuzufügen. Der Benutzer kann den Namen bearbeiten (der auch als Alt-Text dient) und optional die Unterschrift zur wiederholten Verwendung speichern. +pdfjs-editor-add-signature-dialog-title = Unterschrift hinzufügen + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Eintippen + .title = Eintippen +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Zeichnen + .title = Zeichnen +pdfjs-editor-add-signature-image-button = Grafik + .title = Grafik + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Tippen Sie Ihre Unterschrift ein + .placeholder = Tippen Sie Ihre Unterschrift ein +pdfjs-editor-add-signature-draw-placeholder = Ihre Unterschrift zeichnen +pdfjs-editor-add-signature-draw-thickness-range-label = Linienstärke +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Zeichnungsstärke: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Datei zum Hochladen hierher ziehen +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Oder Grafikdateien wählen + *[other] Oder Bilddateien durchsuchen + } + +## Controls + +pdfjs-editor-add-signature-description-label = Beschreibung (alternativer Text) +pdfjs-editor-add-signature-description-input = + .title = Beschreibung (alternativer Text) +pdfjs-editor-add-signature-description-default-when-drawing = Unterschrift +pdfjs-editor-add-signature-clear-button-label = Unterschrift löschen +pdfjs-editor-add-signature-clear-button = + .title = Unterschrift löschen +pdfjs-editor-add-signature-save-checkbox = Unterschrift speichern +pdfjs-editor-add-signature-save-warning-message = Sie haben die Grenze von 5 gespeicherten Unterschriften erreicht. Entfernen Sie eine, um weitere zu speichern. +pdfjs-editor-add-signature-image-upload-error-title = Grafik konnte nicht hochgeladen werden +pdfjs-editor-add-signature-image-upload-error-description = Überprüfen Sie Ihre Netzwerkverbindung, oder versuchen Sie es mit einer anderen Grafik. +pdfjs-editor-add-signature-image-no-data-error-title = Kann Grafik nicht in eine Signatur umwandeln +pdfjs-editor-add-signature-image-no-data-error-description = Bitte versuchen Sie, eine andere Grafik hochzuladen. +pdfjs-editor-add-signature-error-close-button = Schließen + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Abbrechen +pdfjs-editor-add-signature-add-button = Hinzufügen +pdfjs-editor-edit-signature-update-button = Aktualisieren + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Kommentar bearbeiten +pdfjs-editor-edit-comment-popup-button = + .title = Kommentar bearbeiten +pdfjs-editor-delete-comment-popup-button-label = Kommentar entfernen +pdfjs-editor-delete-comment-popup-button = + .title = Kommentar entfernen +pdfjs-show-comment-button = + .title = Kommentar anzeigen + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Kommentar bearbeiten +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualisieren +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Kommentar hinzufügen +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Hinzufügen +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Schreiben beginnen… +pdfjs-editor-edit-comment-dialog-cancel-button = Abbrechen + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Kommentar hinzufügen + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Sidebar umschalten (Dokument enthält Miniaturansichten/Dokumentstruktur/Anhänge/Ebenen) +pdfjs-toggle-views-manager-button1-label = Seiten verwalten +pdfjs-views-manager-sidebar = + .aria-label = Sidebar +pdfjs-views-manager-sidebar-resizer = + .aria-label = Größenanpassung der Sidebar +pdfjs-views-manager-view-selector-button = + .title = Ansichten +pdfjs-views-manager-view-selector-button-label = Ansichten +pdfjs-views-manager-pages-title = Seiten +pdfjs-views-manager-outlines-title1 = Dokumentstruktur + .title = Dokumentstruktur (Doppelklick zum Ein- bzw. Ausblenden aller Einträge) +pdfjs-views-manager-attachments-title = Anhänge +pdfjs-views-manager-layers-title1 = Ebenen + .title = Ebenen (Doppelklick, um alle Ebenen auf den Standard-Zustand zurückzusetzen) +pdfjs-views-manager-pages-option-label = Seiten +pdfjs-views-manager-outlines-option-label = Dokumentstruktur +pdfjs-views-manager-attachments-option-label = Anhänge +pdfjs-views-manager-layers-option-label = Ebenen +pdfjs-views-manager-add-file-button = + .title = Datei hinzufügen +pdfjs-views-manager-add-file-button-label = Datei hinzufügen +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } ausgewählt + *[other] { $count } ausgewählt + } +pdfjs-views-manager-pages-status-none-action-label = Seiten auswählen +pdfjs-views-manager-pages-status-action-button-label = Verwalten +pdfjs-views-manager-pages-status-copy-button-label = Kopieren +pdfjs-views-manager-pages-status-cut-button-label = Ausschneiden +pdfjs-views-manager-pages-status-delete-button-label = Löschen +pdfjs-views-manager-pages-status-export-selected-button-label = Ausgewählte exportieren… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 Seite ausgeschnitten + *[other] { $count } Seiten ausgeschnitten + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 Seite kopiert + *[other] { $count } Seiten kopiert + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 Seite gelöscht + *[other] { $count } Seiten gelöscht + } +pdfjs-views-manager-pages-status-waiting-ready-label = Ihre Datei wird vorbereitet… +pdfjs-views-manager-pages-status-waiting-uploading-label = Datei wird hochgeladen… +pdfjs-views-manager-status-warning-cut-label = Ausschneiden war nicht möglich. Aktualisieren Sie die Seite und versuchen Sie es erneut. +pdfjs-views-manager-status-warning-copy-label = Kopieren nicht möglich. Aktualisieren Sie die Seite und versuchen Sie es erneut. +pdfjs-views-manager-status-warning-delete-label = Löschen war nicht möglich. Aktualisieren Sie die Seite und versuchen Sie es erneut. +pdfjs-views-manager-status-warning-save-label = Speichern nicht möglich. Aktualisieren Sie die Seite und versuchen Sie es erneut. +pdfjs-views-manager-status-undo-button-label = Rückgängig +pdfjs-views-manager-status-done-button-label = Fertig +pdfjs-views-manager-status-close-button = + .title = Schließen +pdfjs-views-manager-status-close-button-label = Schließen +pdfjs-views-manager-paste-button-label = Einfügen +pdfjs-views-manager-paste-button-before = + .title = Vor der ersten Seite einfügen +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Nach Seite { $page } einfügen +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NEU +pdfjs-views-manager-waiting-for-file = Datei wird hochgeladen… +pdfjs-toggle-views-manager-button1 = + .title = Seiten verwalten + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Gespeicherte Signatur entfernen +pdfjs-editor-delete-signature-button-label1 = Gespeicherte Signatur entfernen + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Beschreibung bearbeiten + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Beschreibung bearbeiten diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/dsb/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/dsb/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/dsb/viewer.ftl 2026-01-20 14:08:39.362689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/dsb/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Aktualny bok (URL z aktualnego boka pokazaś) pdfjs-bookmark-button-label = Aktualny bok -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = W nałoženju wócyniś -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = W nałoženju wócyniś ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Mě dataje: pdfjs-document-properties-file-size = Wjelikosć dataje: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajtow) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajtow) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bajtow) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtow) pdfjs-document-properties-title = Titel: pdfjs-document-properties-author = Awtor: pdfjs-document-properties-subject = Tema: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Datum napóranja: pdfjs-document-properties-modification-date = Datum změny: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Awtor: pdfjs-document-properties-producer = PDF-gótowaŕ: pdfjs-document-properties-version = PDF-wersija: @@ -174,10 +167,10 @@ ## Tooltips and alt text for side panel toolbar buttons pdfjs-toggle-sidebar-button = - .title = Bócnicu pokazaś/schowaś + .title = Bocnicu pokazaś/schowaś pdfjs-toggle-sidebar-notification-button = .title = Bocnicu pśešaltowaś (dokument rozrědowanje/pśipiski/warstwy wopśimujo) -pdfjs-toggle-sidebar-button-label = Bócnicu pokazaś/schowaś +pdfjs-toggle-sidebar-button-label = Bocnicu pokazaś/schowaś pdfjs-document-outline-button = .title = Dokumentowe naraźenje pokazaś (dwójne kliknjenje, aby se wšykne zapiski pokazali/schowali) pdfjs-document-outline-button-label = Dokumentowa struktura @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniatura boka { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Bok { $page } wubraś +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Bok { $page } z { $total } ## Find panel button title and messages @@ -274,10 +276,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -285,6 +283,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Typ pśipiskow: { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -298,9 +299,13 @@ pdfjs-editor-free-text-button = .title = Tekst +pdfjs-editor-color-picker-free-text-input = + .title = Tekstowu barwu změniś pdfjs-editor-free-text-button-label = Tekst pdfjs-editor-ink-button = .title = Kresliś +pdfjs-editor-color-picker-ink-input = + .title = Kresleńsku barwu změniś pdfjs-editor-ink-button-label = Kresliś pdfjs-editor-stamp-button = .title = Wobraze pśidaś abo wobźěłaś @@ -308,12 +313,37 @@ pdfjs-editor-highlight-button = .title = Wuzwignuś pdfjs-editor-highlight-button-label = Wuzwignuś -pdfjs-highlight-floating-button = - .title = Wuzwignjenje pdfjs-highlight-floating-button1 = .title = Wuzwignuś .aria-label = Wuzwignuś pdfjs-highlight-floating-button-label = Wuzwignuś +pdfjs-comment-floating-button = + .title = Komentěrowaś + .aria-label = Komentěrowaś +pdfjs-comment-floating-button-label = Komentěrowaś +pdfjs-editor-comment-button = + .title = Komentěrowaś + .aria-label = Komentěrowaś +pdfjs-editor-comment-button-label = Komentar +pdfjs-editor-signature-button = + .title = Signaturu pśidaś +pdfjs-editor-signature-button-label = Signaturu pśidaś + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Editor wuzwignjenja +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Kresleński editor +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Signaturowy editor: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Wobrazowy editor ## Remove button for the various kind of editor. @@ -325,6 +355,8 @@ .title = Wobraz wótwónoźeś pdfjs-editor-remove-highlight-button = .title = Wuzwignjenje wótpóraś +pdfjs-editor-remove-signature-button = + .title = Signaturu wótwónoźeś ## @@ -341,19 +373,43 @@ pdfjs-editor-free-highlight-thickness-input = Tłustosć pdfjs-editor-free-highlight-thickness-title = .title = Tłustosć změniś, gaž se zapiski wuzwiguju, kótarež tekst njejsu -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Wóźeńske elementy signaturow a skłaźone signatury +pdfjs-editor-signature-add-signature-button = + .title = Nowu signaturu pśidaś +pdfjs-editor-signature-add-signature-button-label = Nowu signaturu pśidaś +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Skłaźona signatura: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Tekstowy editor -pdfjs-free-text-default-content = Zachopśo pisaś… -pdfjs-ink = - .aria-label = Kresleński editor -pdfjs-ink-canvas = - .aria-label = Wobraz napórany wót wužywarja + .default-content = Zachopśo pisaś … +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] { $count } komentar + [two] { $count } komentara + [few] { $count } komentary + *[other] { $count } komentarow + } +pdfjs-editor-comments-sidebar-close-button = + .title = Bocnicu zacyniś + .aria-label = Bocnicu zacyniś +pdfjs-editor-comments-sidebar-close-button-label = Bocnicu zacyniś +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Wiźiśo něco wobspomnjeśa gódnego? Wuzwigniśo to a zawóstajśo komentar. +pdfjs-editor-comments-sidebar-no-comments-link = Dalšne informacije ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Alternatiwny tekst -pdfjs-editor-alt-text-edit-button-label = Alternatiwny tekst wobźěłaś +pdfjs-editor-alt-text-edit-button = + .aria-label = Alternatiwny tekst wobźěłaś pdfjs-editor-alt-text-dialog-label = Nastajenje wubraś pdfjs-editor-alt-text-dialog-description = Alternatiwny tekst pomaga, gaž luźe njamógu wobraz wiźeś abo gaž se wobraz njezacytajo. pdfjs-editor-alt-text-add-description-label = Wopisanje pśidaś @@ -366,18 +422,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Na pśikład, „Młody muski za blidom sejźi, aby jěź jědł“ +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternatiwny tekst ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Górjejce nalěwo – wjelikosć změniś -pdfjs-editor-resizer-label-top-middle = Górjejce wesrjejź – wjelikosć změniś -pdfjs-editor-resizer-label-top-right = Górjejce napšawo – wjelikosć změniś -pdfjs-editor-resizer-label-middle-right = Wesrjejź napšawo – wjelikosć změniś -pdfjs-editor-resizer-label-bottom-right = Dołojce napšawo – wjelikosć změniś -pdfjs-editor-resizer-label-bottom-middle = Dołojce wesrjejź – wjelikosć změniś -pdfjs-editor-resizer-label-bottom-left = Dołojce nalěwo – wjelikosć změniś -pdfjs-editor-resizer-label-middle-left = Wesrjejź nalěwo – wjelikosć změniś +pdfjs-editor-resizer-top-left = + .aria-label = Górjejce nalěwo – wjelikosć změniś +pdfjs-editor-resizer-top-middle = + .aria-label = Górjejce wesrjejź – wjelikosć změniś +pdfjs-editor-resizer-top-right = + .aria-label = Górjejce napšawo – wjelikosć změniś +pdfjs-editor-resizer-middle-right = + .aria-label = Wesrjejź napšawo – wjelikosć změniś +pdfjs-editor-resizer-bottom-right = + .aria-label = Dołojce napšawo – wjelikosć změniś +pdfjs-editor-resizer-bottom-middle = + .aria-label = Dołojce wesrjejź – wjelikosć změniś +pdfjs-editor-resizer-bottom-left = + .aria-label = Dołojce nalěwo – wjelikosć změniś +pdfjs-editor-resizer-middle-left = + .aria-label = Wesrjejź nalěwo – wjelikosć změniś ## Color picker @@ -404,3 +471,293 @@ pdfjs-editor-highlight-show-all-button-label = Wšykne pokazaś pdfjs-editor-highlight-show-all-button = .title = Wšykne pokazaś + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Alternatiwny tekst wobźěłaś (wobrazowe wopisanje) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Alternatiwny tekst pśidaś (wobrazowe wopisanje) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Pišćo how swójo wopisanje… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Krotke wopisanje za luźe, kótarež njamóžośo wobraz wiźeś abo gaž se wobraz njezacytajo. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Toś ten alternatiwny tekst jo se awtomatiski napórał a jo snaź njedokradny. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Dalšne informacije +pdfjs-editor-new-alt-text-create-automatically-button-label = Alternatiwny tekst awtomatiski napóraś +pdfjs-editor-new-alt-text-not-now-button = Nic něnto +pdfjs-editor-new-alt-text-error-title = Alternatiwny tekst njedajo se awtomatiski napóraś +pdfjs-editor-new-alt-text-error-description = Pšosym pišćo swój alternatiwny tekst abo wopytajśo pózdźej hyšći raz. +pdfjs-editor-new-alt-text-error-close-button = Zacyniś +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Model KI za alternatiwny tekst se ześěgujo ({ $downloadedSize } z { $totalSize } MB) + .aria-valuetext = Model KI za alternatiwny tekst se ześěgujo ({ $downloadedSize } z { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternatiwny tekst jo se pśidał +pdfjs-editor-new-alt-text-added-button-label = Alternatiwny tekst jo se pśidał +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Alternatiwny tekst felujo +pdfjs-editor-new-alt-text-missing-button-label = Alternatiwny tekst felujo +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Alternatiwny tekst pśeglědowaś +pdfjs-editor-new-alt-text-to-review-button-label = Alternatiwny tekst pśeglědowaś +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Awtomatiski napórany: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Nastajenja alternatiwnego wobrazowego teksta +pdfjs-image-alt-text-settings-button-label = Nastajenja alternatiwnego wobrazowego teksta +pdfjs-editor-alt-text-settings-dialog-label = Nastajenja alternatiwnego wobrazowego teksta +pdfjs-editor-alt-text-settings-automatic-title = Awtomatiski alternatiwny tekst +pdfjs-editor-alt-text-settings-create-model-button-label = Alternatiwny tekst awtomatiski napóraś +pdfjs-editor-alt-text-settings-create-model-description = Naraźujo wopisanja, aby pomagał ludam, kótarež njamóžośo wobraz wiźeś abo gaž se wobraz njezacytajo. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model KI alternatiwnego teksta ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Běžy lokalnje na wašom rěźe, aby waše daty priwatne wóstali. Za awtomatiski alternatiwny tekst trjebny. +pdfjs-editor-alt-text-settings-delete-model-button = Lašowaś +pdfjs-editor-alt-text-settings-download-model-button = Ześěgnuś +pdfjs-editor-alt-text-settings-downloading-model-button = Ześěgujo se… +pdfjs-editor-alt-text-settings-editor-title = Editor za alternatiwny tekst +pdfjs-editor-alt-text-settings-show-dialog-button-label = Editor alternatiwnego teksta ned pokazaś, gaž se wobraz pśidawa +pdfjs-editor-alt-text-settings-show-dialog-description = Pomaga, wam wšym swójim wobrazam alternatiwny tekst pśidaś. +pdfjs-editor-alt-text-settings-close-button = Zacyniś + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Wuzwignjenje pśidane +pdfjs-editor-freetext-added-alert = Tekst pśidany +pdfjs-editor-ink-added-alert = Kreslanka pśidana +pdfjs-editor-stamp-added-alert = Wobraz pśidany +pdfjs-editor-signature-added-alert = Signatura pśidana + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Wótwónoźone wuzwignuś +pdfjs-editor-undo-bar-message-freetext = Tekst jo se wótwónoźeł +pdfjs-editor-undo-bar-message-ink = Kreslanka jo se wótwónoźeła +pdfjs-editor-undo-bar-message-stamp = Wobraz jo se wótwónoźeł +pdfjs-editor-undo-bar-message-signature = Signatura jo se wótwónoźeła +pdfjs-editor-undo-bar-message-comment = Komentar jo se wótwónoźeł +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } pśipisk jo se wótwónoźeł + [two] { $count } pśipiska stej se wótwónoźełej + [few] { $count } pśipiski su se wótwónoźeli + *[other] { $count } pśipiskow jo se wótwónoźeło + } +pdfjs-editor-undo-bar-undo-button = + .title = Anulěrowaś +pdfjs-editor-undo-bar-undo-button-label = Anulěrowaś +pdfjs-editor-undo-bar-close-button = + .title = Zacyniś +pdfjs-editor-undo-bar-close-button-label = Zacyniś + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Toś ten modalny dialog wužywarjeju zmóžnja, signaturu napóraś, aby PDF-dokument pśidał. Wužywaŕ móžo mě wobźěłaś (kótarež teke ako alternatiwny tekst słužy) a pó žycenju signaturu za wóspjetne wužywanje składowaś. +pdfjs-editor-add-signature-dialog-title = Signaturu pśidaś + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Typ + .title = Typ +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Kresliś + .title = Kresliś +pdfjs-editor-add-signature-image-button = Wobraz + .title = Wobraz + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Zapódajśo swóju signaturu + .placeholder = Zapódajśo swóju signaturu +pdfjs-editor-add-signature-draw-placeholder = Kresliśo swóju signaturu +pdfjs-editor-add-signature-draw-thickness-range-label = Tłustosć +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Tłustosć kreslanki: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Śěgniśo dataju sem, aby ju nagrał +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Abo wubjeŕśo wobrazowe dataje + *[other] Abo pśepytajśo wobrazowe dataje + } + +## Controls + +pdfjs-editor-add-signature-description-label = Wopisanje (alternatiwny tekst) +pdfjs-editor-add-signature-description-input = + .title = Wopisanje (alternatiwny tekst) +pdfjs-editor-add-signature-description-default-when-drawing = Signatura +pdfjs-editor-add-signature-clear-button-label = Signaturu lašowaś +pdfjs-editor-add-signature-clear-button = + .title = Signaturu lašowaś +pdfjs-editor-add-signature-save-checkbox = Signaturu składowaś +pdfjs-editor-add-signature-save-warning-message = Sćo dojśpił limit 5 skłaźonych signaturow. Wótwónoźćo jadnu, aby wěcej składował. +pdfjs-editor-add-signature-image-upload-error-title = Wobraz njedajo se nagraś +pdfjs-editor-add-signature-image-upload-error-description = Pśeglědajśo swój seśowy zwisk abo wopytajśo drugi wobraz. +pdfjs-editor-add-signature-image-no-data-error-title = Toś ten wobraz njedajo se do signatury pśetwóriś +pdfjs-editor-add-signature-image-no-data-error-description = Wopytajśo pšosym drugi wobraz nagraś. +pdfjs-editor-add-signature-error-close-button = Zacyniś + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Pśetergnuś +pdfjs-editor-add-signature-add-button = Pśidaś +pdfjs-editor-edit-signature-update-button = Aktualizěrowaś + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Komentar wobźěłaś +pdfjs-editor-edit-comment-popup-button = + .title = Komentar wobźěłaś +pdfjs-editor-delete-comment-popup-button-label = Komentar wótwónoźeś +pdfjs-editor-delete-comment-popup-button = + .title = Komentar wótwónoźeś +pdfjs-show-comment-button = + .title = Komentar pokazaś + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Komentar wobźěłaś +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualizěrowaś +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Komentar pśidaś +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Pśidaś +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Zachopśo pisaś… +pdfjs-editor-edit-comment-dialog-cancel-button = Pśetergnuś + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Komentar pśidaś + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Bocnicu pśešaltowaś (dokument miniatury/rozrědowanje/pśipiski/warstwy wopśimujo) +pdfjs-toggle-views-manager-button1-label = Boki zastojaś +pdfjs-views-manager-sidebar = + .aria-label = Bocnica +pdfjs-views-manager-sidebar-resizer = + .aria-label = Pśiměrjenje wjelikosći bocnice +pdfjs-views-manager-view-selector-button = + .title = Naglědy +pdfjs-views-manager-view-selector-button-label = Naglědy +pdfjs-views-manager-pages-title = Boki +pdfjs-views-manager-outlines-title1 = Dokumentowa struktura + .title = Dokumentowa struktura (klikniśo dwójcy, aby wšykne zapiski pokazał/schował) +pdfjs-views-manager-attachments-title = Pśidanki +pdfjs-views-manager-layers-title1 = Rowniny + .title = Rowniny (klikniśo dwójcy, aby wšykne rowniny na standardny status slědk stajił) +pdfjs-views-manager-pages-option-label = Boki +pdfjs-views-manager-outlines-option-label = Dokumentowa struktura +pdfjs-views-manager-attachments-option-label = Pśidanki +pdfjs-views-manager-layers-option-label = Rowniny +pdfjs-views-manager-add-file-button = + .title = Dataju pśidaś +pdfjs-views-manager-add-file-button-label = Dataju pśidaś +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } wubrany + [two] { $count } wubranej + [few] { $count } wubrane + *[other] { $count } wubrane + } +pdfjs-views-manager-pages-status-none-action-label = Boki wubraś +pdfjs-views-manager-pages-status-action-button-label = Zastojaś +pdfjs-views-manager-pages-status-copy-button-label = Kopěrowaś +pdfjs-views-manager-pages-status-cut-button-label = Wurězaś +pdfjs-views-manager-pages-status-delete-button-label = Lašowaś +pdfjs-views-manager-pages-status-export-selected-button-label = Wubrane eksportěrowaś… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] { $count } bok wurězany + [two] { $count } boka wurězanej + [few] { $count } boki wurězane + *[other] { $count } bokow wurězane + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] { $count } bok kopěrowany + [two] { $count } boka kopěrowanej + [few] { $count } boki kopěrowane + *[other] { $count } bokow kopěrowane + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] { $count } bok wulašowany + [two] { $count } boka wulašowanej + [few] { $count } boki wulašowane + *[other] { $count } bokow wulašowane + } +pdfjs-views-manager-pages-status-waiting-ready-label = Waša dataja se pśigótujo… +pdfjs-views-manager-pages-status-waiting-uploading-label = Dataja se nagrawa… +pdfjs-views-manager-status-warning-cut-label = Njedajo se wurězaś. Aktualizěrujśo bok a wopytajśo hyšći raz. +pdfjs-views-manager-status-warning-copy-label = Njedajo se kopěrowaś. Aktualizěrujśo bok a wopytajśo hyšći raz. +pdfjs-views-manager-status-warning-delete-label = Njedajo se lašowaś. Aktualizěrujśo bok a wopytajśo hyšći raz. +pdfjs-views-manager-status-warning-save-label = Njedajo se składowaś. Aktualizěrujśo bok a wopytajśo hyšći raz. +pdfjs-views-manager-status-undo-button-label = Anulěrowaś +pdfjs-views-manager-status-done-button-label = Dokóńcony +pdfjs-views-manager-status-close-button = + .title = Zacyniś +pdfjs-views-manager-status-close-button-label = Zacyniś +pdfjs-views-manager-paste-button-label = Zasajźiś +pdfjs-views-manager-paste-button-before = + .title = Pśed prědnym bokom zasajźiś +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Za bokom { $page } zasajźiś +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NOWY +pdfjs-views-manager-waiting-for-file = Dataja se nagrawa… +pdfjs-toggle-views-manager-button1 = + .title = Boki zastojaś + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Skłaźonu signaturu wótwónoźeś +pdfjs-editor-delete-signature-button-label1 = Skłaźonu signaturu wótwónoźeś + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Wopisanje wobźěłaś + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Wopisanje wobźěłaś diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/el/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/el/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/el/viewer.ftl 2026-01-20 14:08:39.363689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/el/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Τρέχουσα σελίδα (Προβολή URL από τρέχουσα σελίδα) pdfjs-bookmark-button-label = Τρέχουσα σελίδα -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Άνοιγμα σε εφαρμογή -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Άνοιγμα σε εφαρμογή ## Secondary toolbar and context menu @@ -94,7 +88,7 @@ .title = Χρήση κυκλικής κύλισης pdfjs-scroll-wrapped-button-label = Κυκλική κύλιση pdfjs-spread-none-button = - .title = Να μη γίνει σύνδεση επεκτάσεων σελίδων + .title = Να μην γίνει σύνδεση των επεκτάσεων σελίδων pdfjs-spread-none-button-label = Χωρίς επεκτάσεις pdfjs-spread-odd-button = .title = Σύνδεση επεκτάσεων σελίδων ξεκινώντας από τις μονές σελίδες @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Όνομα αρχείου: pdfjs-document-properties-file-size = Μέγεθος αρχείου: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) pdfjs-document-properties-title = Τίτλος: pdfjs-document-properties-author = Συγγραφέας: pdfjs-document-properties-subject = Θέμα: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Ημερομηνία δημιουργίας: pdfjs-document-properties-modification-date = Ημερομηνία τροποποίησης: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Δημιουργός: pdfjs-document-properties-producer = Παραγωγός PDF: pdfjs-document-properties-version = Έκδοση PDF: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Μικρογραφία σελίδας { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Επιλογή σελίδας { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Σελίδα { $page } από { $total } ## Find panel button title and messages @@ -265,15 +267,11 @@ pdfjs-loading-error = Προέκυψε σφάλμα κατά τη φόρτωση του PDF. pdfjs-invalid-file-error = Μη έγκυρο ή κατεστραμμένο αρχείο PDF. pdfjs-missing-file-error = Λείπει αρχείο PDF. -pdfjs-unexpected-response-error = Μη αναμενόμενη απόκριση από το διακομιστή. +pdfjs-unexpected-response-error = Απρόσμενη απάντηση διακομιστή. pdfjs-rendering-error = Προέκυψε σφάλμα κατά την εμφάνιση της σελίδας. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,11 +279,14 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Σχόλιο «{ $type }»] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password pdfjs-password-label = Εισαγάγετε τον κωδικό πρόσβασης για να ανοίξετε αυτό το αρχείο PDF. -pdfjs-password-invalid = Μη έγκυρος κωδικός πρόσβασης. Παρακαλώ δοκιμάστε ξανά. +pdfjs-password-invalid = Μη έγκυρος κωδικός πρόσβασης. Δοκιμάστε ξανά. pdfjs-password-ok-button = OK pdfjs-password-cancel-button = Ακύρωση pdfjs-web-fonts-disabled = Οι γραμματοσειρές ιστού είναι ανενεργές: δεν είναι δυνατή η χρήση των ενσωματωμένων γραμματοσειρών PDF. @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Κείμενο +pdfjs-editor-color-picker-free-text-input = + .title = Αλλαγή χρώματος κειμένου pdfjs-editor-free-text-button-label = Κείμενο pdfjs-editor-ink-button = .title = Σχέδιο +pdfjs-editor-color-picker-ink-input = + .title = Αλλαγή χρώματος σχεδίου pdfjs-editor-ink-button-label = Σχέδιο pdfjs-editor-stamp-button = .title = Προσθήκη ή επεξεργασία εικόνων @@ -304,12 +309,37 @@ pdfjs-editor-highlight-button = .title = Επισήμανση pdfjs-editor-highlight-button-label = Επισήμανση -pdfjs-highlight-floating-button = - .title = Επισήμανση pdfjs-highlight-floating-button1 = .title = Επισήμανση .aria-label = Επισήμανση pdfjs-highlight-floating-button-label = Επισήμανση +pdfjs-comment-floating-button = + .title = Σχόλιο + .aria-label = Σχόλιο +pdfjs-comment-floating-button-label = Σχόλιο +pdfjs-editor-comment-button = + .title = Σχόλιο + .aria-label = Σχόλιο +pdfjs-editor-comment-button-label = Σχόλιο +pdfjs-editor-signature-button = + .title = Προσθήκη υπογραφής +pdfjs-editor-signature-button-label = Προσθήκη υπογραφής + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Επεξεργασία επισήμανσης +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Επεξεργασία σχεδίου +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Επεξεργασία υπογραφής: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Επεξεργασία εικόνας ## Remove button for the various kind of editor. @@ -321,6 +351,8 @@ .title = Αφαίρεση εικόνας pdfjs-editor-remove-highlight-button = .title = Αφαίρεση επισήμανσης +pdfjs-editor-remove-signature-button = + .title = Αφαίρεση υπογραφής ## @@ -337,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Πάχος pdfjs-editor-free-highlight-thickness-title = .title = Αλλαγή πάχους κατά την επισήμανση στοιχείων εκτός κειμένου -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Στοιχεία ελέγχου υπογραφής και αποθηκευμένες υπογραφές +pdfjs-editor-signature-add-signature-button = + .title = Προσθήκη νέας υπογραφής +pdfjs-editor-signature-add-signature-button-label = Προσθήκη νέας υπογραφής +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Αποθηκευμένη υπογραφή: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Επεξεργασία κειμένου -pdfjs-free-text-default-content = Ξεκινήστε να πληκτρολογείτε… -pdfjs-ink = - .aria-label = Επεξεργασία σχεδίων -pdfjs-ink-canvas = - .aria-label = Εικόνα από τον χρήστη + .default-content = Ξεκινήστε να πληκτρολογείτε… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Σχόλια + *[other] Σχόλια + } +pdfjs-editor-comments-sidebar-close-button = + .title = Κλείσιμο πλευρικής στήλης + .aria-label = Κλείσιμο πλευρικής στήλης +pdfjs-editor-comments-sidebar-close-button-label = Κλείσιμο πλευρικής στήλης +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Βλέπετε κάτι αξιοσημείωτο; Επισημάνετε το και αφήστε ένα σχόλιο. +pdfjs-editor-comments-sidebar-no-comments-link = Μάθετε περισσότερα ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Εναλλακτικό κείμενο -pdfjs-editor-alt-text-edit-button-label = Επεξεργασία εναλλακτικού κειμένου +pdfjs-editor-alt-text-edit-button = + .aria-label = Επεξεργασία εναλλακτικού κειμένου pdfjs-editor-alt-text-dialog-label = Διαλέξτε μια επιλογή pdfjs-editor-alt-text-dialog-description = Το εναλλακτικό κείμενο είναι χρήσιμο όταν οι άνθρωποι δεν μπορούν να δουν την εικόνα ή όταν αυτή δεν φορτώνεται. pdfjs-editor-alt-text-add-description-label = Προσθήκη περιγραφής @@ -362,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Για παράδειγμα, «Ένας νεαρός άνδρας κάθεται σε ένα τραπέζι για να φάει ένα γεύμα» +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Εναλλακτικό κείμενο ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Επάνω αριστερή γωνία — αλλαγή μεγέθους -pdfjs-editor-resizer-label-top-middle = Μέσο επάνω πλευράς — αλλαγή μεγέθους -pdfjs-editor-resizer-label-top-right = Επάνω δεξιά γωνία — αλλαγή μεγέθους -pdfjs-editor-resizer-label-middle-right = Μέσο δεξιάς πλευράς — αλλαγή μεγέθους -pdfjs-editor-resizer-label-bottom-right = Κάτω δεξιά γωνία — αλλαγή μεγέθους -pdfjs-editor-resizer-label-bottom-middle = Μέσο κάτω πλευράς — αλλαγή μεγέθους -pdfjs-editor-resizer-label-bottom-left = Κάτω αριστερή γωνία — αλλαγή μεγέθους -pdfjs-editor-resizer-label-middle-left = Μέσο αριστερής πλευράς — αλλαγή μεγέθους +pdfjs-editor-resizer-top-left = + .aria-label = Επάνω αριστερή γωνία — αλλαγή μεγέθους +pdfjs-editor-resizer-top-middle = + .aria-label = Μέσο επάνω πλευράς — αλλαγή μεγέθους +pdfjs-editor-resizer-top-right = + .aria-label = Επάνω δεξιά γωνία — αλλαγή μεγέθους +pdfjs-editor-resizer-middle-right = + .aria-label = Μέσο δεξιάς πλευράς — αλλαγή μεγέθους +pdfjs-editor-resizer-bottom-right = + .aria-label = Κάτω δεξιά γωνία — αλλαγή μεγέθους +pdfjs-editor-resizer-bottom-middle = + .aria-label = Μέσο κάτω πλευράς — αλλαγή μεγέθους +pdfjs-editor-resizer-bottom-left = + .aria-label = Κάτω αριστερή γωνία — αλλαγή μεγέθους +pdfjs-editor-resizer-middle-left = + .aria-label = Μέσο αριστερής πλευράς — αλλαγή μεγέθους ## Color picker @@ -400,3 +465,283 @@ pdfjs-editor-highlight-show-all-button-label = Εμφάνιση όλων pdfjs-editor-highlight-show-all-button = .title = Εμφάνιση όλων + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Επεξεργασία εναλλακτικού κειμένου (περιγραφή εικόνας) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Προσθήκη εναλλακτικού κειμένου (περιγραφή εικόνας) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Γράψτε την περιγραφή σας εδώ… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Σύντομη περιγραφή για άτομα που δεν μπορούν να δουν την εικόνα ή όταν η εικόνα δεν φορτώνεται. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Αυτό το εναλλακτικό κείμενο δημιουργήθηκε αυτόματα και ενδέχεται να είναι ανακριβές. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Μάθετε περισσότερα +pdfjs-editor-new-alt-text-create-automatically-button-label = Αυτόματη δημιουργία εναλλακτικού κειμένου +pdfjs-editor-new-alt-text-not-now-button = Όχι τώρα +pdfjs-editor-new-alt-text-error-title = Δεν ήταν δυνατή η αυτόματη δημιουργία εναλλακτικού κειμένου +pdfjs-editor-new-alt-text-error-description = Γράψτε το δικό σας εναλλακτικό κείμενο ή δοκιμάστε ξανά αργότερα. +pdfjs-editor-new-alt-text-error-close-button = Κλείσιμο +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Λήψη μοντέλου ΤΝ εναλλακτικού κειμένου ({ $downloadedSize } από { $totalSize } MB) + .aria-valuetext = Λήψη μοντέλου ΤΝ εναλλακτικού κειμένου ({ $downloadedSize } από { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Προστέθηκε εναλλακτικό κείμενο +pdfjs-editor-new-alt-text-added-button-label = Προστέθηκε εναλλακτικό κείμενο +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Απουσία εναλλακτικού κειμένου +pdfjs-editor-new-alt-text-missing-button-label = Απουσία εναλλακτικού κειμένου +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Έλεγχος εναλλακτικού κειμένου +pdfjs-editor-new-alt-text-to-review-button-label = Έλεγχος εναλλακτικού κειμένου +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Αυτόματη δημιουργία: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Ρυθμίσεις εναλλακτικού κειμένου εικόνας +pdfjs-image-alt-text-settings-button-label = Ρυθμίσεις εναλλακτικού κειμένου εικόνας +pdfjs-editor-alt-text-settings-dialog-label = Ρυθμίσεις εναλλακτικού κειμένου εικόνας +pdfjs-editor-alt-text-settings-automatic-title = Αυτόματο εναλλακτικό κείμενο +pdfjs-editor-alt-text-settings-create-model-button-label = Αυτόματη δημιουργία εναλλακτικού κειμένου +pdfjs-editor-alt-text-settings-create-model-description = Προτείνει περιγραφές για άτομα που δεν μπορούν να δουν την εικόνα ή όταν η εικόνα δεν φορτώνεται. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Μοντέλο ΤΝ εναλλακτικού κειμένου ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Εκτελείται τοπικά στη συσκευή σας, ώστε τα δεδομένα σας να παραμένουν ιδιωτικά. Απαιτείται για τη δημιουργία του αυτόματου εναλλακτικού κειμένου. +pdfjs-editor-alt-text-settings-delete-model-button = Διαγραφή +pdfjs-editor-alt-text-settings-download-model-button = Λήψη +pdfjs-editor-alt-text-settings-downloading-model-button = Λήψη… +pdfjs-editor-alt-text-settings-editor-title = Επεξεργασία εναλλακτικού κειμένου +pdfjs-editor-alt-text-settings-show-dialog-button-label = Άμεση εμφάνιση της επεξεργασίας εναλλακτικού κειμένου κατά την προσθήκη εικόνας +pdfjs-editor-alt-text-settings-show-dialog-description = Σας βοηθά να βεβαιωθείτε ότι όλες οι εικόνες σας έχουν εναλλακτικό κείμενο. +pdfjs-editor-alt-text-settings-close-button = Κλείσιμο + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Προστέθηκε επισήμανση +pdfjs-editor-freetext-added-alert = Προστέθηκε κείμενο +pdfjs-editor-ink-added-alert = Προστέθηκε σχέδιο +pdfjs-editor-stamp-added-alert = Προστέθηκε εικόνα +pdfjs-editor-signature-added-alert = Προστέθηκε υπογραφή + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Η επισήμανση αφαιρέθηκε +pdfjs-editor-undo-bar-message-freetext = Το κείμενο αφαιρέθηκε +pdfjs-editor-undo-bar-message-ink = Το σχέδιο αφαιρέθηκε +pdfjs-editor-undo-bar-message-stamp = Η εικόνα αφαιρέθηκε +pdfjs-editor-undo-bar-message-signature = Η υπογραφή αφαιρέθηκε +pdfjs-editor-undo-bar-message-comment = Το σχόλιο αφαιρέθηκε +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] Αφαιρέθηκε { $count } σχολιασμός + *[other] Αφαιρέθηκαν { $count } σχολιασμοί + } +pdfjs-editor-undo-bar-undo-button = + .title = Αναίρεση +pdfjs-editor-undo-bar-undo-button-label = Αναίρεση +pdfjs-editor-undo-bar-close-button = + .title = Κλείσιμο +pdfjs-editor-undo-bar-close-button-label = Κλείσιμο + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Αυτό το παράθυρο διαλόγου επιτρέπει στον χρήστη να δημιουργήσει μια υπογραφή για να την προσθέσει σε ένα έγγραφο PDF. Ο χρήστης μπορεί να επεξεργαστεί το όνομα (το οποίο χρησιμεύει και ως εναλλακτικό κείμενο) και, προαιρετικά, να αποθηκεύσει την υπογραφή για επαναλαμβανόμενη χρήση. +pdfjs-editor-add-signature-dialog-title = Προσθήκη υπογραφής + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Πληκτρολόγηση + .title = Πληκτρολόγηση +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Σχέδιο + .title = Σχέδιο +pdfjs-editor-add-signature-image-button = Εικόνα + .title = Εικόνα + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Πληκτρολογήστε την υπογραφή σας + .placeholder = Πληκτρολογήστε την υπογραφή σας +pdfjs-editor-add-signature-draw-placeholder = Σχεδιάστε την υπογραφή σας +pdfjs-editor-add-signature-draw-thickness-range-label = Πάχος +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Πάχος σχεδίου: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Σύρετε ένα αρχείο εδώ για μεταφόρτωση +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Ή επιλέξτε αρχεία εικόνας + *[other] Ή περιηγηθείτε σε αρχεία εικόνας + } + +## Controls + +pdfjs-editor-add-signature-description-label = Περιγραφή (εναλλακτικό κείμενο) +pdfjs-editor-add-signature-description-input = + .title = Περιγραφή (εναλλακτικό κείμενο) +pdfjs-editor-add-signature-description-default-when-drawing = Υπογραφή +pdfjs-editor-add-signature-clear-button-label = Απαλοιφή υπογραφής +pdfjs-editor-add-signature-clear-button = + .title = Απαλοιφή υπογραφής +pdfjs-editor-add-signature-save-checkbox = Αποθήκευση υπογραφής +pdfjs-editor-add-signature-save-warning-message = Έχετε φτάσει το όριο των 5 αποθηκευμένων υπογραφών. Αφαιρέστε μία για να αποθηκεύσετε περισσότερες. +pdfjs-editor-add-signature-image-upload-error-title = Δεν ήταν δυνατή η μεταφόρτωση της εικόνας +pdfjs-editor-add-signature-image-upload-error-description = Ελέγξτε τη σύνδεση δικτύου σας ή δοκιμάστε μια άλλη εικόνα. +pdfjs-editor-add-signature-image-no-data-error-title = Δεν είναι δυνατή η μετατροπή αυτής της εικόνας σε υπογραφή +pdfjs-editor-add-signature-image-no-data-error-description = Δοκιμάστε να μεταφορτώσετε μια άλλη εικόνα. +pdfjs-editor-add-signature-error-close-button = Κλείσιμο + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Ακύρωση +pdfjs-editor-add-signature-add-button = Προσθήκη +pdfjs-editor-edit-signature-update-button = Ενημέρωση + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Επεξεργασία σχολίου +pdfjs-editor-edit-comment-popup-button = + .title = Επεξεργασία σχολίου +pdfjs-editor-delete-comment-popup-button-label = Αφαίρεση σχολίου +pdfjs-editor-delete-comment-popup-button = + .title = Αφαίρεση σχολίου +pdfjs-show-comment-button = + .title = Εμφάνιση σχολίου + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Επεξεργασία σχολίου +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Ενημέρωση +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Προσθήκη σχολίου +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Προσθήκη +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Ξεκινήστε να πληκτρολογείτε… +pdfjs-editor-edit-comment-dialog-cancel-button = Ακύρωση + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Προσθήκη σχολίου + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = (Απ)ενεργοποίηση πλαϊνής γραμμής (το έγγραφο περιέχει μικρογραφίες/περίγραμμα/συνημμένα/επίπεδα) +pdfjs-toggle-views-manager-button1-label = Διαχείριση σελίδων +pdfjs-views-manager-sidebar = + .aria-label = Πλαϊνή γραμμή +pdfjs-views-manager-sidebar-resizer = + .aria-label = Αλλαγή μεγέθους πλαϊνής γραμμής +pdfjs-views-manager-view-selector-button = + .title = Προβολές +pdfjs-views-manager-view-selector-button-label = Προβολές +pdfjs-views-manager-pages-title = Σελίδες +pdfjs-views-manager-outlines-title1 = Διάρθρωση εγγράφου + .title = Διάρθρωση εγγράφου (διπλό κλικ για ανάπτυξη/σύμπτυξη όλων των στοιχείων) +pdfjs-views-manager-attachments-title = Συνημμένα +pdfjs-views-manager-layers-title1 = Επίπεδα + .title = Επίπεδα (διπλό κλικ για επαναφορά όλων των επιπέδων στην προεπιλεγμένη κατάσταση) +pdfjs-views-manager-pages-option-label = Σελίδες +pdfjs-views-manager-outlines-option-label = Διάρθρωση εγγράφου +pdfjs-views-manager-attachments-option-label = Συνημμένα +pdfjs-views-manager-layers-option-label = Επίπεδα +pdfjs-views-manager-add-file-button = + .title = Προσθήκη αρχείου +pdfjs-views-manager-add-file-button-label = Προσθήκη αρχείου +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } επιλεγμένη + *[other] { $count } επιλεγμένες + } +pdfjs-views-manager-pages-status-none-action-label = Επιλογή σελίδων +pdfjs-views-manager-pages-status-action-button-label = Διαχείριση +pdfjs-views-manager-pages-status-copy-button-label = Αντιγραφή +pdfjs-views-manager-pages-status-cut-button-label = Αποκοπή +pdfjs-views-manager-pages-status-delete-button-label = Διαγραφή +pdfjs-views-manager-pages-status-export-selected-button-label = Εξαγωγή επιλεγμένων… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] Αποκόπηκε 1 σελίδα + *[other] Αποκόπηκαν { $count } σελίδες + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] Αντιγράφηκε 1 σελίδα + *[other] Αντιγράφηκαν { $count } σελίδες + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] Διαγράφηκε 1 σελίδα + *[other] Διαγράφηκαν { $count } σελίδες + } +pdfjs-views-manager-pages-status-waiting-ready-label = Προετοιμασία αρχείου… +pdfjs-views-manager-pages-status-waiting-uploading-label = Μεταφόρτωση αρχείου… +pdfjs-views-manager-status-warning-cut-label = Δεν ήταν δυνατή η αποκοπή. Ανανεώστε τη σελίδα και δοκιμάστε ξανά. +pdfjs-views-manager-status-warning-copy-label = Δεν ήταν δυνατή η αντιγραφή. Ανανεώστε τη σελίδα και δοκιμάστε ξανά. +pdfjs-views-manager-status-warning-delete-label = Δεν ήταν δυνατή η διαγραφή. Ανανεώστε τη σελίδα και δοκιμάστε ξανά. +pdfjs-views-manager-status-warning-save-label = Δεν ήταν δυνατή η αποθήκευση. Ανανεώστε τη σελίδα και δοκιμάστε ξανά. +pdfjs-views-manager-status-undo-button-label = Αναίρεση +pdfjs-views-manager-status-done-button-label = Τέλος +pdfjs-views-manager-status-close-button = + .title = Κλείσιμο +pdfjs-views-manager-status-close-button-label = Κλείσιμο +pdfjs-views-manager-paste-button-label = Επικόλληση +pdfjs-views-manager-paste-button-before = + .title = Επικόλληση πριν από την πρώτη σελίδα +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Επικόλληση μετά τη σελίδα { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = ΝΕΟ +pdfjs-views-manager-waiting-for-file = Μεταφόρτωση αρχείου… +pdfjs-toggle-views-manager-button1 = + .title = Διαχείριση σελίδων + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Αφαίρεση αποθηκευμένης υπογραφής +pdfjs-editor-delete-signature-button-label1 = Αφαίρεση αποθηκευμένης υπογραφής + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Επεξεργασία περιγραφής + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Επεξεργασία περιγραφής diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/en-CA/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/en-CA/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/en-CA/viewer.ftl 2026-01-20 14:08:39.363689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/en-CA/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Current Page (View URL from Current Page) pdfjs-bookmark-button-label = Current Page -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Open in app -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Open in app ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = File name: pdfjs-document-properties-file-size = File size: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) pdfjs-document-properties-title = Title: pdfjs-document-properties-author = Author: pdfjs-document-properties-subject = Subject: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Creation Date: pdfjs-document-properties-modification-date = Modification Date: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Creator: pdfjs-document-properties-producer = PDF Producer: pdfjs-document-properties-version = PDF Version: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Thumbnail of Page { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Select page { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Page { $page } of { $total } ## Find panel button title and messages @@ -226,6 +228,21 @@ pdfjs-find-entire-word-checkbox-label = Whole Words pdfjs-find-reached-top = Reached top of document, continued from bottom pdfjs-find-reached-bottom = Reached end of document, continued from top +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } of { $total } match + *[other] { $current } of { $total } matches + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] More than { $limit } match + *[other] More than { $limit } matches + } pdfjs-find-not-found = Phrase not found ## Predefined zoom values @@ -255,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -266,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } Annotation] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -279,16 +295,64 @@ pdfjs-editor-free-text-button = .title = Text +pdfjs-editor-color-picker-free-text-input = + .title = Change text colour pdfjs-editor-free-text-button-label = Text pdfjs-editor-ink-button = .title = Draw +pdfjs-editor-color-picker-ink-input = + .title = Change drawing colour pdfjs-editor-ink-button-label = Draw pdfjs-editor-stamp-button = .title = Add or edit images pdfjs-editor-stamp-button-label = Add or edit images +pdfjs-editor-highlight-button = + .title = Highlight +pdfjs-editor-highlight-button-label = Highlight +pdfjs-highlight-floating-button1 = + .title = Highlight + .aria-label = Highlight +pdfjs-highlight-floating-button-label = Highlight +pdfjs-comment-floating-button = + .title = Comment + .aria-label = Comment +pdfjs-comment-floating-button-label = Comment +pdfjs-editor-comment-button = + .title = Comment + .aria-label = Comment +pdfjs-editor-comment-button-label = Comment +pdfjs-editor-signature-button = + .title = Add signature +pdfjs-editor-signature-button-label = Add signature + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Highlight editor +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Drawing editor +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Signature editor: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Image editor ## Remove button for the various kind of editor. +pdfjs-editor-remove-ink-button = + .title = Remove drawing +pdfjs-editor-remove-freetext-button = + .title = Remove text +pdfjs-editor-remove-stamp-button = + .title = Remove image +pdfjs-editor-remove-highlight-button = + .title = Remove highlight +pdfjs-editor-remove-signature-button = + .title = Remove signature ## @@ -301,20 +365,80 @@ pdfjs-editor-stamp-add-image-button = .title = Add image pdfjs-editor-stamp-add-image-button-label = Add image -pdfjs-free-text = +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Thickness +pdfjs-editor-free-highlight-thickness-title = + .title = Change thickness when highlighting items other than text +pdfjs-editor-add-signature-container = + .aria-label = Signature controls and saved signatures +pdfjs-editor-signature-add-signature-button = + .title = Add new signature +pdfjs-editor-signature-add-signature-button-label = Add new signature +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Saved signature: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Text Editor -pdfjs-free-text-default-content = Start typing… -pdfjs-ink = - .aria-label = Draw Editor -pdfjs-ink-canvas = - .aria-label = User-created image + .default-content = Start typing… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Comment + *[other] Comments + } +pdfjs-editor-comments-sidebar-close-button = + .title = Close the sidebar + .aria-label = Close the sidebar +pdfjs-editor-comments-sidebar-close-button-label = Close the sidebar +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = See something noteworthy? Highlight it and leave a comment. +pdfjs-editor-comments-sidebar-no-comments-link = Learn more ## Alt-text dialog +pdfjs-editor-alt-text-button-label = Alt text +pdfjs-editor-alt-text-edit-button = + .aria-label = Edit alt text +pdfjs-editor-alt-text-dialog-label = Choose an option +pdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people can’t see the image or when it doesn’t load. +pdfjs-editor-alt-text-add-description-label = Add a description +pdfjs-editor-alt-text-add-description-description = Aim for 1-2 sentences that describe the subject, setting, or actions. +pdfjs-editor-alt-text-mark-decorative-label = Mark as decorative +pdfjs-editor-alt-text-mark-decorative-description = This is used for ornamental images, like borders or watermarks. +pdfjs-editor-alt-text-cancel-button = Cancel +pdfjs-editor-alt-text-save-button = Save +pdfjs-editor-alt-text-decorative-tooltip = Marked as decorative +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = For example, “A young man sits down at a table to eat a meal” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alt text ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. +pdfjs-editor-resizer-top-left = + .aria-label = Top left corner — resize +pdfjs-editor-resizer-top-middle = + .aria-label = Top middle — resize +pdfjs-editor-resizer-top-right = + .aria-label = Top right corner — resize +pdfjs-editor-resizer-middle-right = + .aria-label = Middle right — resize +pdfjs-editor-resizer-bottom-right = + .aria-label = Bottom right corner — resize +pdfjs-editor-resizer-bottom-middle = + .aria-label = Bottom middle — resize +pdfjs-editor-resizer-bottom-left = + .aria-label = Bottom left corner — resize +pdfjs-editor-resizer-middle-left = + .aria-label = Middle left — resize ## Color picker @@ -334,3 +458,290 @@ .title = Pink pdfjs-editor-colorpicker-red = .title = Red + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Show all +pdfjs-editor-highlight-show-all-button = + .title = Show all + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Edit alt text (image description) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Add alt text (image description) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Write your description here… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Short description for people who can’t see the image or when the image doesn’t load. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = This alt text was created automatically and may be inaccurate. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Learn more +pdfjs-editor-new-alt-text-create-automatically-button-label = Create alt text automatically +pdfjs-editor-new-alt-text-not-now-button = Not now +pdfjs-editor-new-alt-text-error-title = Couldn’t create alt text automatically +pdfjs-editor-new-alt-text-error-description = Please write your own alt text or try again later. +pdfjs-editor-new-alt-text-error-close-button = Close +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB) + .aria-valuetext = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alt text added +pdfjs-editor-new-alt-text-added-button-label = Alt text added +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Missing alt text +pdfjs-editor-new-alt-text-missing-button-label = Missing alt text +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Review alt text +pdfjs-editor-new-alt-text-to-review-button-label = Review alt text +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Created automatically: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Image alt text settings +pdfjs-image-alt-text-settings-button-label = Image alt text settings +pdfjs-editor-alt-text-settings-dialog-label = Image alt text settings +pdfjs-editor-alt-text-settings-automatic-title = Automatic alt text +pdfjs-editor-alt-text-settings-create-model-button-label = Create alt text automatically +pdfjs-editor-alt-text-settings-create-model-description = Suggests descriptions to help people who can’t see the image or when the image doesn’t load. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Alt text AI model ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Runs locally on your device so your data stays private. Required for automatic alt text. +pdfjs-editor-alt-text-settings-delete-model-button = Delete +pdfjs-editor-alt-text-settings-download-model-button = Download +pdfjs-editor-alt-text-settings-downloading-model-button = Downloading… +pdfjs-editor-alt-text-settings-editor-title = Alt text editor +pdfjs-editor-alt-text-settings-show-dialog-button-label = Show alt text editor right away when adding an image +pdfjs-editor-alt-text-settings-show-dialog-description = Helps you make sure all your images have alt text. +pdfjs-editor-alt-text-settings-close-button = Close + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Highlight added +pdfjs-editor-freetext-added-alert = Text added +pdfjs-editor-ink-added-alert = Drawing added +pdfjs-editor-stamp-added-alert = Image added +pdfjs-editor-signature-added-alert = Signature added + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Highlight removed +pdfjs-editor-undo-bar-message-freetext = Text removed +pdfjs-editor-undo-bar-message-ink = Drawing removed +pdfjs-editor-undo-bar-message-stamp = Image removed +pdfjs-editor-undo-bar-message-signature = Signature removed +pdfjs-editor-undo-bar-message-comment = Comment removed +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } annotation removed + *[other] { $count } annotations removed + } +pdfjs-editor-undo-bar-undo-button = + .title = Undo +pdfjs-editor-undo-bar-undo-button-label = Undo +pdfjs-editor-undo-bar-close-button = + .title = Close +pdfjs-editor-undo-bar-close-button-label = Close + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = This modal allows the user to create a signature to add to a PDF document. The user can edit the name (which also serves as the alt text), and optionally save the signature for repeated use. +pdfjs-editor-add-signature-dialog-title = Add a signature + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Type + .title = Type +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Draw + .title = Draw +pdfjs-editor-add-signature-image-button = Image + .title = Image + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Type your signature + .placeholder = Type your signature +pdfjs-editor-add-signature-draw-placeholder = Draw your signature +pdfjs-editor-add-signature-draw-thickness-range-label = Thickness +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Drawing thickness: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Drag a file here to upload +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Or choose image files + *[other] Or browse image files + } + +## Controls + +pdfjs-editor-add-signature-description-label = Description (alt text) +pdfjs-editor-add-signature-description-input = + .title = Description (alt text) +pdfjs-editor-add-signature-description-default-when-drawing = Signature +pdfjs-editor-add-signature-clear-button-label = Clear signature +pdfjs-editor-add-signature-clear-button = + .title = Clear signature +pdfjs-editor-add-signature-save-checkbox = Save signature +pdfjs-editor-add-signature-save-warning-message = You’ve reached the limit of 5 saved signatures. Remove one to save more. +pdfjs-editor-add-signature-image-upload-error-title = Couldn’t upload image +pdfjs-editor-add-signature-image-upload-error-description = Check your network connection or try another image. +pdfjs-editor-add-signature-image-no-data-error-title = Can’t convert this image into a signature +pdfjs-editor-add-signature-image-no-data-error-description = Please try uploading a different image. +pdfjs-editor-add-signature-error-close-button = Close + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Cancel +pdfjs-editor-add-signature-add-button = Add +pdfjs-editor-edit-signature-update-button = Update + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Edit comment +pdfjs-editor-edit-comment-popup-button = + .title = Edit comment +pdfjs-editor-delete-comment-popup-button-label = Remove comment +pdfjs-editor-delete-comment-popup-button = + .title = Remove comment +pdfjs-show-comment-button = + .title = Show comment + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Edit comment +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Update +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Add comment +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Add +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Start typing… +pdfjs-editor-edit-comment-dialog-cancel-button = Cancel + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Add comment + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Toggle Sidebar (document contains thumbnails/outline/attachments/layers) +pdfjs-toggle-views-manager-button1-label = Manage pages +pdfjs-views-manager-sidebar = + .aria-label = Sidebar +pdfjs-views-manager-sidebar-resizer = + .aria-label = Sidebar resizer +pdfjs-views-manager-view-selector-button = + .title = Views +pdfjs-views-manager-view-selector-button-label = Views +pdfjs-views-manager-pages-title = Pages +pdfjs-views-manager-outlines-title1 = Document outline + .title = Document outline (double-click to expand/collapse all items) +pdfjs-views-manager-attachments-title = Attachments +pdfjs-views-manager-layers-title1 = Layers + .title = Layers (double-click to reset all layers to the default state) +pdfjs-views-manager-pages-option-label = Pages +pdfjs-views-manager-outlines-option-label = Document outline +pdfjs-views-manager-attachments-option-label = Attachments +pdfjs-views-manager-layers-option-label = Layers +pdfjs-views-manager-add-file-button = + .title = Add file +pdfjs-views-manager-add-file-button-label = Add file +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } selected + *[other] { $count } selected + } +pdfjs-views-manager-pages-status-none-action-label = Select pages +pdfjs-views-manager-pages-status-action-button-label = Manage +pdfjs-views-manager-pages-status-copy-button-label = Copy +pdfjs-views-manager-pages-status-cut-button-label = Cut +pdfjs-views-manager-pages-status-delete-button-label = Delete +pdfjs-views-manager-pages-status-export-selected-button-label = Export selected… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 page cut + *[other] { $count } pages cut + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 page copied + *[other] { $count } pages copied + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 page deleted + *[other] { $count } pages deleted + } +pdfjs-views-manager-pages-status-waiting-ready-label = Getting your file ready… +pdfjs-views-manager-pages-status-waiting-uploading-label = Uploading file… +pdfjs-views-manager-status-warning-cut-label = Couldn’t cut. Refresh page and try again. +pdfjs-views-manager-status-warning-copy-label = Couldn’t copy. Refresh page and try again. +pdfjs-views-manager-status-warning-delete-label = Couldn’t delete. Refresh page and try again. +pdfjs-views-manager-status-warning-save-label = Couldn’t save. Refresh page and try again. +pdfjs-views-manager-status-undo-button-label = Undo +pdfjs-views-manager-status-done-button-label = Done +pdfjs-views-manager-status-close-button = + .title = Close +pdfjs-views-manager-status-close-button-label = Close +pdfjs-views-manager-paste-button-label = Paste +pdfjs-views-manager-paste-button-before = + .title = Paste before the first page +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Paste after page { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NEW +pdfjs-views-manager-waiting-for-file = Uploading file… +pdfjs-toggle-views-manager-button1 = + .title = Manage pages + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Remove saved signature +pdfjs-editor-delete-signature-button-label1 = Remove saved signature + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Edit description + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Edit description diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/en-GB/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/en-GB/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/en-GB/viewer.ftl 2026-01-20 14:08:39.363689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/en-GB/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Current Page (View URL from Current Page) pdfjs-bookmark-button-label = Current Page -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Open in app -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Open in app ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = File name: pdfjs-document-properties-file-size = File size: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) pdfjs-document-properties-title = Title: pdfjs-document-properties-author = Author: pdfjs-document-properties-subject = Subject: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Creation Date: pdfjs-document-properties-modification-date = Modification Date: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Creator: pdfjs-document-properties-producer = PDF Producer: pdfjs-document-properties-version = PDF Version: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Thumbnail of Page { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Select page { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Page { $page } of { $total } ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } Annotation] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Text +pdfjs-editor-color-picker-free-text-input = + .title = Change text colour pdfjs-editor-free-text-button-label = Text pdfjs-editor-ink-button = .title = Draw +pdfjs-editor-color-picker-ink-input = + .title = Change drawing colour pdfjs-editor-ink-button-label = Draw pdfjs-editor-stamp-button = .title = Add or edit images @@ -304,12 +309,37 @@ pdfjs-editor-highlight-button = .title = Highlight pdfjs-editor-highlight-button-label = Highlight -pdfjs-highlight-floating-button = - .title = Highlight pdfjs-highlight-floating-button1 = .title = Highlight .aria-label = Highlight pdfjs-highlight-floating-button-label = Highlight +pdfjs-comment-floating-button = + .title = Comment + .aria-label = Comment +pdfjs-comment-floating-button-label = Comment +pdfjs-editor-comment-button = + .title = Comment + .aria-label = Comment +pdfjs-editor-comment-button-label = Comment +pdfjs-editor-signature-button = + .title = Add signature +pdfjs-editor-signature-button-label = Add signature + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Highlight editor +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Drawing editor +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Signature editor: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Image editor ## Remove button for the various kind of editor. @@ -321,6 +351,8 @@ .title = Remove image pdfjs-editor-remove-highlight-button = .title = Remove highlight +pdfjs-editor-remove-signature-button = + .title = Remove signature ## @@ -337,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Thickness pdfjs-editor-free-highlight-thickness-title = .title = Change thickness when highlighting items other than text -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Signature controls and saved signatures +pdfjs-editor-signature-add-signature-button = + .title = Add new signature +pdfjs-editor-signature-add-signature-button-label = Add new signature +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Saved signature: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Text Editor -pdfjs-free-text-default-content = Start typing… -pdfjs-ink = - .aria-label = Draw Editor -pdfjs-ink-canvas = - .aria-label = User-created image + .default-content = Start typing… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Comment + *[other] Comments + } +pdfjs-editor-comments-sidebar-close-button = + .title = Close the sidebar + .aria-label = Close the sidebar +pdfjs-editor-comments-sidebar-close-button-label = Close the sidebar +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = See something noteworthy? Highlight it and leave a comment. +pdfjs-editor-comments-sidebar-no-comments-link = Learn more ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Alt text -pdfjs-editor-alt-text-edit-button-label = Edit alt text +pdfjs-editor-alt-text-edit-button = + .aria-label = Edit alt text pdfjs-editor-alt-text-dialog-label = Choose an option pdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people can’t see the image or when it doesn’t load. pdfjs-editor-alt-text-add-description-label = Add a description @@ -362,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = For example, “A young man sits down at a table to eat a meal” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alt text ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Top left corner — resize -pdfjs-editor-resizer-label-top-middle = Top middle — resize -pdfjs-editor-resizer-label-top-right = Top right corner — resize -pdfjs-editor-resizer-label-middle-right = Middle right — resize -pdfjs-editor-resizer-label-bottom-right = Bottom right corner — resize -pdfjs-editor-resizer-label-bottom-middle = Bottom middle — resize -pdfjs-editor-resizer-label-bottom-left = Bottom left corner — resize -pdfjs-editor-resizer-label-middle-left = Middle left — resize +pdfjs-editor-resizer-top-left = + .aria-label = Top left corner — resize +pdfjs-editor-resizer-top-middle = + .aria-label = Top middle — resize +pdfjs-editor-resizer-top-right = + .aria-label = Top right corner — resize +pdfjs-editor-resizer-middle-right = + .aria-label = Middle right — resize +pdfjs-editor-resizer-bottom-right = + .aria-label = Bottom right corner — resize +pdfjs-editor-resizer-bottom-middle = + .aria-label = Bottom middle — resize +pdfjs-editor-resizer-bottom-left = + .aria-label = Bottom left corner — resize +pdfjs-editor-resizer-middle-left = + .aria-label = Middle left — resize ## Color picker @@ -400,3 +465,283 @@ pdfjs-editor-highlight-show-all-button-label = Show all pdfjs-editor-highlight-show-all-button = .title = Show all + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Edit alt text (image description) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Add alt text (image description) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Write your description here… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Short description for people who can’t see the image or when the image doesn’t load. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = This alt text was created automatically and may be inaccurate. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Learn more +pdfjs-editor-new-alt-text-create-automatically-button-label = Create alt text automatically +pdfjs-editor-new-alt-text-not-now-button = Not now +pdfjs-editor-new-alt-text-error-title = Couldn’t create alt text automatically +pdfjs-editor-new-alt-text-error-description = Please write your own alt text or try again later. +pdfjs-editor-new-alt-text-error-close-button = Close +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB) + .aria-valuetext = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alt text added +pdfjs-editor-new-alt-text-added-button-label = Alt text added +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Missing alt text +pdfjs-editor-new-alt-text-missing-button-label = Missing alt text +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Review alt text +pdfjs-editor-new-alt-text-to-review-button-label = Review alt text +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Created automatically: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Image alt text settings +pdfjs-image-alt-text-settings-button-label = Image alt text settings +pdfjs-editor-alt-text-settings-dialog-label = Image alt text settings +pdfjs-editor-alt-text-settings-automatic-title = Automatic alt text +pdfjs-editor-alt-text-settings-create-model-button-label = Create alt text automatically +pdfjs-editor-alt-text-settings-create-model-description = Suggests descriptions to help people who can’t see the image or when the image doesn’t load. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Alt text AI model ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Runs locally on your device so your data stays private. Required for automatic alt text. +pdfjs-editor-alt-text-settings-delete-model-button = Delete +pdfjs-editor-alt-text-settings-download-model-button = Download +pdfjs-editor-alt-text-settings-downloading-model-button = Downloading… +pdfjs-editor-alt-text-settings-editor-title = Alt text editor +pdfjs-editor-alt-text-settings-show-dialog-button-label = Show alt text editor right away when adding an image +pdfjs-editor-alt-text-settings-show-dialog-description = Helps you make sure all your images have alt text. +pdfjs-editor-alt-text-settings-close-button = Close + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Highlight added +pdfjs-editor-freetext-added-alert = Text added +pdfjs-editor-ink-added-alert = Drawing added +pdfjs-editor-stamp-added-alert = Image added +pdfjs-editor-signature-added-alert = Signature added + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Highlight removed +pdfjs-editor-undo-bar-message-freetext = Text removed +pdfjs-editor-undo-bar-message-ink = Drawing removed +pdfjs-editor-undo-bar-message-stamp = Image removed +pdfjs-editor-undo-bar-message-signature = Signature removed +pdfjs-editor-undo-bar-message-comment = Comment removed +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } annotation removed + *[other] { $count } annotations removed + } +pdfjs-editor-undo-bar-undo-button = + .title = Undo +pdfjs-editor-undo-bar-undo-button-label = Undo +pdfjs-editor-undo-bar-close-button = + .title = Close +pdfjs-editor-undo-bar-close-button-label = Close + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = This modal allows the user to create a signature to add to a PDF document. The user can edit the name (which also serves as the alt text), and optionally save the signature for repeated use. +pdfjs-editor-add-signature-dialog-title = Add a signature + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Type + .title = Type +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Draw + .title = Draw +pdfjs-editor-add-signature-image-button = Image + .title = Image + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Type your signature + .placeholder = Type your signature +pdfjs-editor-add-signature-draw-placeholder = Draw your signature +pdfjs-editor-add-signature-draw-thickness-range-label = Thickness +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Drawing thickness: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Drag a file here to upload +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Or choose image files + *[other] Or browse image files + } + +## Controls + +pdfjs-editor-add-signature-description-label = Description (alt text) +pdfjs-editor-add-signature-description-input = + .title = Description (alt text) +pdfjs-editor-add-signature-description-default-when-drawing = Signature +pdfjs-editor-add-signature-clear-button-label = Clear signature +pdfjs-editor-add-signature-clear-button = + .title = Clear signature +pdfjs-editor-add-signature-save-checkbox = Save signature +pdfjs-editor-add-signature-save-warning-message = You’ve reached the limit of 5 saved signatures. Remove one to save more. +pdfjs-editor-add-signature-image-upload-error-title = Couldn’t upload image +pdfjs-editor-add-signature-image-upload-error-description = Check your network connection or try another image. +pdfjs-editor-add-signature-image-no-data-error-title = Can’t convert this image into a signature +pdfjs-editor-add-signature-image-no-data-error-description = Please try uploading a different image. +pdfjs-editor-add-signature-error-close-button = Close + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Cancel +pdfjs-editor-add-signature-add-button = Add +pdfjs-editor-edit-signature-update-button = Update + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Edit comment +pdfjs-editor-edit-comment-popup-button = + .title = Edit comment +pdfjs-editor-delete-comment-popup-button-label = Remove comment +pdfjs-editor-delete-comment-popup-button = + .title = Remove comment +pdfjs-show-comment-button = + .title = Show comment + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Edit comment +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Update +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Add comment +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Add +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Start typing… +pdfjs-editor-edit-comment-dialog-cancel-button = Cancel + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Add comment + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Toggle Sidebar (document contains thumbnails/outline/attachments/layers) +pdfjs-toggle-views-manager-button1-label = Manage pages +pdfjs-views-manager-sidebar = + .aria-label = Sidebar +pdfjs-views-manager-sidebar-resizer = + .aria-label = Sidebar resizer +pdfjs-views-manager-view-selector-button = + .title = Views +pdfjs-views-manager-view-selector-button-label = Views +pdfjs-views-manager-pages-title = Pages +pdfjs-views-manager-outlines-title1 = Document outline + .title = Document outline (double-click to expand/collapse all items) +pdfjs-views-manager-attachments-title = Attachments +pdfjs-views-manager-layers-title1 = Layers + .title = Layers (double-click to reset all layers to the default state) +pdfjs-views-manager-pages-option-label = Pages +pdfjs-views-manager-outlines-option-label = Document outline +pdfjs-views-manager-attachments-option-label = Attachments +pdfjs-views-manager-layers-option-label = Layers +pdfjs-views-manager-add-file-button = + .title = Add file +pdfjs-views-manager-add-file-button-label = Add file +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } selected + *[other] { $count } selected + } +pdfjs-views-manager-pages-status-none-action-label = Select pages +pdfjs-views-manager-pages-status-action-button-label = Manage +pdfjs-views-manager-pages-status-copy-button-label = Copy +pdfjs-views-manager-pages-status-cut-button-label = Cut +pdfjs-views-manager-pages-status-delete-button-label = Delete +pdfjs-views-manager-pages-status-export-selected-button-label = Export selected… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 page cut + *[other] { $count } pages cut + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 page copied + *[other] { $count } pages copied + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 page deleted + *[other] { $count } pages deleted + } +pdfjs-views-manager-pages-status-waiting-ready-label = Getting your file ready… +pdfjs-views-manager-pages-status-waiting-uploading-label = Uploading file… +pdfjs-views-manager-status-warning-cut-label = Couldn’t cut. Refresh page and try again. +pdfjs-views-manager-status-warning-copy-label = Couldn’t copy. Refresh page and try again. +pdfjs-views-manager-status-warning-delete-label = Couldn’t delete. Refresh page and try again. +pdfjs-views-manager-status-warning-save-label = Couldn’t save. Refresh page and try again. +pdfjs-views-manager-status-undo-button-label = Undo +pdfjs-views-manager-status-done-button-label = Done +pdfjs-views-manager-status-close-button = + .title = Close +pdfjs-views-manager-status-close-button-label = Close +pdfjs-views-manager-paste-button-label = Paste +pdfjs-views-manager-paste-button-before = + .title = Paste before the first page +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Paste after page { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NEW +pdfjs-views-manager-waiting-for-file = Uploading file… +pdfjs-toggle-views-manager-button1 = + .title = Manage pages + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Remove saved signature +pdfjs-editor-delete-signature-button-label1 = Remove saved signature + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Edit description + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Edit description diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/en-US/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/en-US/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/en-US/viewer.ftl 2026-01-20 14:08:39.364689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/en-US/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -113,14 +113,14 @@ pdfjs-document-properties-file-size = File size: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) # Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) pdfjs-document-properties-title = Title: pdfjs-document-properties-author = Author: @@ -130,9 +130,8 @@ pdfjs-document-properties-modification-date = Modification Date: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Creator: pdfjs-document-properties-producer = PDF Producer: @@ -181,23 +180,6 @@ ## Tooltips and alt text for side panel toolbar buttons -pdfjs-toggle-sidebar-button = - .title = Toggle Sidebar -pdfjs-toggle-sidebar-notification-button = - .title = Toggle Sidebar (document contains outline/attachments/layers) -pdfjs-toggle-sidebar-button-label = Toggle Sidebar -pdfjs-document-outline-button = - .title = Show Document Outline (double-click to expand/collapse all items) -pdfjs-document-outline-button-label = Document Outline -pdfjs-attachments-button = - .title = Show Attachments -pdfjs-attachments-button-label = Attachments -pdfjs-layers-button = - .title = Show Layers (double-click to reset all layers to the default state) -pdfjs-layers-button-label = Layers -pdfjs-thumbs-button = - .title = Show Thumbnails -pdfjs-thumbs-button-label = Thumbnails pdfjs-current-outline-item-button = .title = Find Current Outline Item pdfjs-current-outline-item-button-label = Current Outline Item @@ -210,14 +192,20 @@ # Variables: # $page (Number) - the page number -pdfjs-thumb-page-title = - .title = Page { $page } +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Page { $page } of { $total } # Variables: # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Thumbnail of Page { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Select page { $page } + ## Find panel button title and messages pdfjs-find-input = @@ -284,9 +272,8 @@ ## Annotations # Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } # .alt: This is used as a tooltip. # Variables: @@ -308,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Text +pdfjs-editor-color-picker-free-text-input = + .title = Change text color pdfjs-editor-free-text-button-label = Text pdfjs-editor-ink-button = .title = Draw +pdfjs-editor-color-picker-ink-input = + .title = Change drawing color pdfjs-editor-ink-button-label = Draw pdfjs-editor-stamp-button = .title = Add or edit images @@ -322,6 +313,35 @@ .title = Highlight .aria-label = Highlight pdfjs-highlight-floating-button-label = Highlight +pdfjs-comment-floating-button = + .title = Comment + .aria-label = Comment +pdfjs-comment-floating-button-label = Comment +pdfjs-editor-comment-button = + .title = Comment + .aria-label = Comment +pdfjs-editor-comment-button-label = Comment +pdfjs-editor-signature-button = + .title = Add signature +pdfjs-editor-signature-button-label = Add signature + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Highlight editor +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Drawing editor + +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Signature editor: { $description } + +pdfjs-editor-stamp-editor = + .aria-label = Image editor ## Remove button for the various kind of editor. @@ -333,6 +353,8 @@ .title = Remove image pdfjs-editor-remove-highlight-button = .title = Remove highlight +pdfjs-editor-remove-signature-button = + .title = Remove signature ## @@ -349,21 +371,50 @@ pdfjs-editor-free-highlight-thickness-input = Thickness pdfjs-editor-free-highlight-thickness-title = .title = Change thickness when highlighting items other than text +pdfjs-editor-add-signature-container = + .aria-label = Signature controls and saved signatures +pdfjs-editor-signature-add-signature-button = + .title = Add new signature +pdfjs-editor-signature-add-signature-button-label = Add new signature + +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Saved signature: { $description } -pdfjs-free-text = +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Text Editor -pdfjs-free-text-default-content = Start typing… -pdfjs-ink = - .aria-label = Draw Editor -pdfjs-ink-canvas = - .aria-label = User-created image + .default-content = Start typing… + +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Comment + *[other] Comments + } + +pdfjs-editor-comments-sidebar-close-button = + .title = Close the sidebar + .aria-label = Close the sidebar +pdfjs-editor-comments-sidebar-close-button-label = Close the sidebar + +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = See something noteworthy? Highlight it and leave a comment. +pdfjs-editor-comments-sidebar-no-comments-link = Learn more ## Alt-text dialog # Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alt text pdfjs-editor-alt-text-button-label = Alt text -pdfjs-editor-alt-text-edit-button-label = Edit alt text +pdfjs-editor-alt-text-edit-button = + .aria-label = Edit alt text pdfjs-editor-alt-text-dialog-label = Choose an option pdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people can’t see the image or when it doesn’t load. pdfjs-editor-alt-text-add-description-label = Add a description @@ -381,14 +432,22 @@ ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Top left corner — resize -pdfjs-editor-resizer-label-top-middle = Top middle — resize -pdfjs-editor-resizer-label-top-right = Top right corner — resize -pdfjs-editor-resizer-label-middle-right = Middle right — resize -pdfjs-editor-resizer-label-bottom-right = Bottom right corner — resize -pdfjs-editor-resizer-label-bottom-middle = Bottom middle — resize -pdfjs-editor-resizer-label-bottom-left = Bottom left corner — resize -pdfjs-editor-resizer-label-middle-left = Middle left — resize +pdfjs-editor-resizer-top-left = + .aria-label = Top left corner — resize +pdfjs-editor-resizer-top-middle = + .aria-label = Top middle — resize +pdfjs-editor-resizer-top-right = + .aria-label = Top right corner — resize +pdfjs-editor-resizer-middle-right = + .aria-label = Middle right — resize +pdfjs-editor-resizer-bottom-right = + .aria-label = Bottom right corner — resize +pdfjs-editor-resizer-bottom-middle = + .aria-label = Bottom middle — resize +pdfjs-editor-resizer-bottom-left = + .aria-label = Bottom left corner — resize +pdfjs-editor-resizer-middle-left = + .aria-label = Middle left — resize ## Color picker @@ -416,3 +475,313 @@ pdfjs-editor-highlight-show-all-button-label = Show all pdfjs-editor-highlight-show-all-button = .title = Show all + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Edit alt text (image description) + +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Add alt text (image description) + +pdfjs-editor-new-alt-text-textarea = + .placeholder = Write your description here… + +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Short description for people who can’t see the image or when the image doesn’t load. + +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = This alt text was created automatically and may be inaccurate. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Learn more + +pdfjs-editor-new-alt-text-create-automatically-button-label = Create alt text automatically +pdfjs-editor-new-alt-text-not-now-button = Not now +pdfjs-editor-new-alt-text-error-title = Couldn’t create alt text automatically +pdfjs-editor-new-alt-text-error-description = Please write your own alt text or try again later. +pdfjs-editor-new-alt-text-error-close-button = Close + +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB) + .aria-valuetext = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB) + +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alt text added +pdfjs-editor-new-alt-text-added-button-label = Alt text added + +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Missing alt text +pdfjs-editor-new-alt-text-missing-button-label = Missing alt text + +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Review alt text +pdfjs-editor-new-alt-text-to-review-button-label = Review alt text + +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Created automatically: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Image alt text settings +pdfjs-image-alt-text-settings-button-label = Image alt text settings + +pdfjs-editor-alt-text-settings-dialog-label = Image alt text settings +pdfjs-editor-alt-text-settings-automatic-title = Automatic alt text +pdfjs-editor-alt-text-settings-create-model-button-label = Create alt text automatically +pdfjs-editor-alt-text-settings-create-model-description = Suggests descriptions to help people who can’t see the image or when the image doesn’t load. + +pdfjs-editor-alt-text-settings-editor-title = Alt text editor +pdfjs-editor-alt-text-settings-show-dialog-button-label = Show alt text editor right away when adding an image +pdfjs-editor-alt-text-settings-show-dialog-description = Helps you make sure all your images have alt text. +pdfjs-editor-alt-text-settings-close-button = Close + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Highlight added +pdfjs-editor-freetext-added-alert = Text added +pdfjs-editor-ink-added-alert = Drawing added +pdfjs-editor-stamp-added-alert = Image added +pdfjs-editor-signature-added-alert = Signature added + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Highlight removed +pdfjs-editor-undo-bar-message-freetext = Text removed +pdfjs-editor-undo-bar-message-ink = Drawing removed +pdfjs-editor-undo-bar-message-stamp = Image removed +pdfjs-editor-undo-bar-message-signature = Signature removed +pdfjs-editor-undo-bar-message-comment = Comment removed +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } annotation removed + *[other] { $count } annotations removed + } + +pdfjs-editor-undo-bar-undo-button = + .title = Undo +pdfjs-editor-undo-bar-undo-button-label = Undo +pdfjs-editor-undo-bar-close-button = + .title = Close +pdfjs-editor-undo-bar-close-button-label = Close + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = This modal allows the user to create a signature to add to a PDF document. The user can edit the name (which also serves as the alt text), and optionally save the signature for repeated use. +pdfjs-editor-add-signature-dialog-title = Add a signature + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Type + .title = Type +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Draw + .title = Draw +pdfjs-editor-add-signature-image-button = Image + .title = Image + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Type your signature + .placeholder = Type your signature +pdfjs-editor-add-signature-draw-placeholder = Draw your signature +pdfjs-editor-add-signature-draw-thickness-range-label = Thickness + +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Drawing thickness: { $thickness } + +pdfjs-editor-add-signature-image-placeholder = Drag a file here to upload +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Or choose image files + *[other] Or browse image files + } + +## Controls + +pdfjs-editor-add-signature-description-label = Description (alt text) +pdfjs-editor-add-signature-description-input = + .title = Description (alt text) +pdfjs-editor-add-signature-description-default-when-drawing = Signature + + +pdfjs-editor-add-signature-clear-button-label = Clear signature +pdfjs-editor-add-signature-clear-button = + .title = Clear signature +pdfjs-editor-add-signature-save-checkbox = Save signature +pdfjs-editor-add-signature-save-warning-message = You’ve reached the limit of 5 saved signatures. Remove one to save more. +pdfjs-editor-add-signature-image-upload-error-title = Couldn’t upload image +pdfjs-editor-add-signature-image-upload-error-description = Check your network connection or try another image. +pdfjs-editor-add-signature-image-no-data-error-title = Can’t convert this image into a signature +pdfjs-editor-add-signature-image-no-data-error-description = Please try uploading a different image. +pdfjs-editor-add-signature-error-close-button = Close + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Cancel +pdfjs-editor-add-signature-add-button = Add + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Remove saved signature +pdfjs-editor-delete-signature-button-label1 = Remove saved signature + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Edit description + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Edit description + +## Dialog buttons + +pdfjs-editor-edit-signature-update-button = Update + +## Comment popup + +pdfjs-show-comment-button = + .title = Show comment + +pdfjs-editor-edit-comment-popup-button-label = Edit comment +pdfjs-editor-edit-comment-popup-button = + .title = Edit comment +pdfjs-editor-delete-comment-popup-button-label = Remove comment +pdfjs-editor-delete-comment-popup-button = + .title = Remove comment + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Edit comment +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Update + +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Add comment +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Add + +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Start typing… + +pdfjs-editor-edit-comment-dialog-cancel-button = Cancel + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Add comment + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-button1 = + .title = Manage pages +pdfjs-toggle-views-manager-notification-button = + .title = Toggle Sidebar (document contains thumbnails/outline/attachments/layers) +pdfjs-toggle-views-manager-button1-label = Manage pages + +pdfjs-views-manager-sidebar = + .aria-label = Sidebar +pdfjs-views-manager-sidebar-resizer = + .aria-label = Sidebar resizer +pdfjs-views-manager-view-selector-button = + .title = Views +pdfjs-views-manager-view-selector-button-label = Views +pdfjs-views-manager-pages-title = Pages +pdfjs-views-manager-outlines-title1 = Document outline + .title = Document outline (double-click to expand/collapse all items) +pdfjs-views-manager-attachments-title = Attachments +pdfjs-views-manager-layers-title1 = Layers + .title = Layers (double-click to reset all layers to the default state) + +pdfjs-views-manager-pages-option-label = Pages +pdfjs-views-manager-outlines-option-label = Document outline +pdfjs-views-manager-attachments-option-label = Attachments +pdfjs-views-manager-layers-option-label = Layers + +pdfjs-views-manager-add-file-button = + .title = Add file +pdfjs-views-manager-add-file-button-label = Add file + +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } selected + *[other] { $count } selected + } +pdfjs-views-manager-pages-status-none-action-label = Select pages +pdfjs-views-manager-pages-status-action-button-label = Manage +pdfjs-views-manager-pages-status-copy-button-label = Copy +pdfjs-views-manager-pages-status-cut-button-label = Cut +pdfjs-views-manager-pages-status-delete-button-label = Delete +pdfjs-views-manager-pages-status-export-selected-button-label = Export selected… + +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 page cut + *[other] { $count } pages cut + } + +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 page copied + *[other] { $count } pages copied + } + +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 page deleted + *[other] { $count } pages deleted + } + +pdfjs-views-manager-pages-status-waiting-ready-label = Getting your file ready… +pdfjs-views-manager-pages-status-waiting-uploading-label = Uploading file… + +pdfjs-views-manager-status-warning-cut-label = Couldn’t cut. Refresh page and try again. +pdfjs-views-manager-status-warning-copy-label = Couldn’t copy. Refresh page and try again. +pdfjs-views-manager-status-warning-delete-label = Couldn’t delete. Refresh page and try again. +pdfjs-views-manager-status-warning-save-label = Couldn’t save. Refresh page and try again. +pdfjs-views-manager-status-undo-button-label = Undo +pdfjs-views-manager-status-done-button-label = Done +pdfjs-views-manager-status-close-button = + .title = Close +pdfjs-views-manager-status-close-button-label = Close + +pdfjs-views-manager-paste-button-label = Paste +pdfjs-views-manager-paste-button-before = + .title = Paste before the first page + +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Paste after page { $page } + +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NEW + +pdfjs-views-manager-waiting-for-file = Uploading file… diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/eo/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/eo/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/eo/viewer.ftl 2026-01-20 14:08:39.364689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/eo/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Nuna paĝo (Montri adreson de la nuna paĝo) pdfjs-bookmark-button-label = Nuna paĝo -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Malfermi en programo -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Malfermi en programo ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Nomo de dosiero: pdfjs-document-properties-file-size = Grando de dosiero: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KO ({ $size_b } oktetoj) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MO ({ $size_b } oktetoj) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KO ({ $b } oktetoj) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } Mo ({ $b } oktetoj) pdfjs-document-properties-title = Titolo: pdfjs-document-properties-author = Aŭtoro: pdfjs-document-properties-subject = Temo: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Dato de kreado: pdfjs-document-properties-modification-date = Dato de modifo: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Kreinto: pdfjs-document-properties-producer = Produktinto de PDF: pdfjs-document-properties-version = Versio de PDF: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniaturo de paĝo { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Elekti paĝon { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Paĝo { $page } el { $total } ## Find panel button title and messages @@ -221,7 +223,7 @@ .title = Serĉi la venontan aperon de la frazo pdfjs-find-next-button-label = Antaŭen pdfjs-find-highlight-checkbox = Elstarigi ĉiujn -pdfjs-find-match-case-checkbox-label = Distingi inter majuskloj kaj minuskloj +pdfjs-find-match-case-checkbox-label = Distingi usklecon pdfjs-find-match-diacritics-checkbox-label = Respekti supersignojn pdfjs-find-entire-word-checkbox-label = Tutaj vortoj pdfjs-find-reached-top = Komenco de la dokumento atingita, daŭrigado ekde la fino @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Prinoto: { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Teksto +pdfjs-editor-color-picker-free-text-input = + .title = Ŝanĝi koloron de teksto pdfjs-editor-free-text-button-label = Teksto pdfjs-editor-ink-button = .title = Desegni +pdfjs-editor-color-picker-ink-input = + .title = Ŝanĝi desegnan koloron pdfjs-editor-ink-button-label = Desegni pdfjs-editor-stamp-button = .title = Aldoni aŭ modifi bildojn @@ -304,8 +309,37 @@ pdfjs-editor-highlight-button = .title = Elstarigi pdfjs-editor-highlight-button-label = Elstarigi -pdfjs-highlight-floating-button = +pdfjs-highlight-floating-button1 = .title = Elstarigi + .aria-label = Elstarigi +pdfjs-highlight-floating-button-label = Elstarigi +pdfjs-comment-floating-button = + .title = Komenti + .aria-label = Komenti +pdfjs-comment-floating-button-label = Komenti +pdfjs-editor-comment-button = + .title = Komenti + .aria-label = Komenti +pdfjs-editor-comment-button-label = Komenti +pdfjs-editor-signature-button = + .title = Aldoni subskribon +pdfjs-editor-signature-button-label = Aldoni subskribon + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Redaktilo de elstaraĵo +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Redaktilo de desegno +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Redaktilo de subskribo: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Redaktilo de bildo ## Remove button for the various kind of editor. @@ -317,6 +351,8 @@ .title = Forigi bildon pdfjs-editor-remove-highlight-button = .title = Forigi elstaraĵon +pdfjs-editor-remove-signature-button = + .title = Forigi subskribon ## @@ -333,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Dikeco pdfjs-editor-free-highlight-thickness-title = .title = Ŝanĝi dikecon dum elstarigo de netekstaj elementoj -pdfjs-free-text = - .aria-label = Tekstan redaktilon -pdfjs-free-text-default-content = Ektajpi… -pdfjs-ink = - .aria-label = Desegnan redaktilon -pdfjs-ink-canvas = - .aria-label = Bildo kreita de uzanto +pdfjs-editor-add-signature-container = + .aria-label = Kontrolado de subskriboj kaj konservitaj subskriboj +pdfjs-editor-signature-add-signature-button = + .title = Aldoni novan subskribon +pdfjs-editor-signature-add-signature-button-label = Aldoni novan subskribon +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Konservita subskribo: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Teksta redaktilo + .default-content = Komencu tajpi… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Komenti + *[other] Komentoj + } +pdfjs-editor-comments-sidebar-close-button = + .title = Fermi la flankan strion + .aria-label = Fermi la flankan strion +pdfjs-editor-comments-sidebar-close-button-label = Fermi la flankan strion +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Ĉu vi rimarkas ion interesan? Elstarigu tion kaj aldonu komenton. +pdfjs-editor-comments-sidebar-no-comments-link = Pli da informo ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Alternativa teksto -pdfjs-editor-alt-text-edit-button-label = Redakti alternativan tekston +pdfjs-editor-alt-text-edit-button = + .aria-label = Redakti alternativan tekston pdfjs-editor-alt-text-dialog-label = Elektu eblon pdfjs-editor-alt-text-dialog-description = Alternativa teksto helpas personojn, en la okazoj kiam ili ne povas vidi aŭ ŝargi la bildon. pdfjs-editor-alt-text-add-description-label = Aldoni priskribon @@ -358,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Ekzemple: “Juna persono sidiĝas ĉetable por ekmanĝi” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternativa teksto ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Supra maldekstra angulo — ŝangi grandon -pdfjs-editor-resizer-label-top-middle = Supra mezo — ŝanĝi grandon -pdfjs-editor-resizer-label-top-right = Supran dekstran angulon — ŝanĝi grandon -pdfjs-editor-resizer-label-middle-right = Dekstra mezo — ŝanĝi grandon -pdfjs-editor-resizer-label-bottom-right = Malsupra deksta angulo — ŝanĝi grandon -pdfjs-editor-resizer-label-bottom-middle = Malsupra mezo — ŝanĝi grandon -pdfjs-editor-resizer-label-bottom-left = Malsupra maldekstra angulo — ŝanĝi grandon -pdfjs-editor-resizer-label-middle-left = Maldekstra mezo — ŝanĝi grandon +pdfjs-editor-resizer-top-left = + .aria-label = Supra maldekstra angulo — ŝangi grandon +pdfjs-editor-resizer-top-middle = + .aria-label = Supra mezo — ŝanĝi grandon +pdfjs-editor-resizer-top-right = + .aria-label = Supran dekstran angulon — ŝanĝi grandon +pdfjs-editor-resizer-middle-right = + .aria-label = Dekstra mezo — ŝanĝi grandon +pdfjs-editor-resizer-bottom-right = + .aria-label = Malsupra deksta angulo — ŝanĝi grandon +pdfjs-editor-resizer-bottom-middle = + .aria-label = Malsupra mezo — ŝanĝi grandon +pdfjs-editor-resizer-bottom-left = + .aria-label = Malsupra maldekstra angulo — ŝanĝi grandon +pdfjs-editor-resizer-middle-left = + .aria-label = Maldekstra mezo — ŝanĝi grandon ## Color picker @@ -396,3 +465,283 @@ pdfjs-editor-highlight-show-all-button-label = Montri ĉiujn pdfjs-editor-highlight-show-all-button = .title = Montri ĉiujn + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Modifi alternativan tekston (priskribo de bildo) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Aldoni alternativan tekston (priskribo de bildo) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Skribu vian priskribon ĉi tie… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Mallonga priskribo por personoj kiuj ne povas vidi la bildon kaj por montri kiam la bildo ne ŝargeblas. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Tiu ĉi alternativa teksto estis aŭtomate kreita kaj povus esti malĝusta. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Pli da informo +pdfjs-editor-new-alt-text-create-automatically-button-label = Aŭtomate krei alternativan tekston +pdfjs-editor-new-alt-text-not-now-button = Ne nun +pdfjs-editor-new-alt-text-error-title = Ne eblis aŭtomate krei alternativan tekston +pdfjs-editor-new-alt-text-error-description = Bonvolu skribi vian propran alternativan tekston aŭ provi denove poste. +pdfjs-editor-new-alt-text-error-close-button = Fermi +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Elŝuto de modelo de artefarita intelekto por alternativa teksto ({ $downloadedSize } el { $totalSize } MO) + .aria-valuetext = Elŝuto de modelo de artefarita intelekto por alternativa teksto ({ $downloadedSize } el { $totalSize } MO) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternativa teksto aldonita +pdfjs-editor-new-alt-text-added-button-label = Alternativa teksto aldonita +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Mankas alternativa teksto +pdfjs-editor-new-alt-text-missing-button-label = Mankas alternativa teksto +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Kontroli alternativan tekston +pdfjs-editor-new-alt-text-to-review-button-label = Kontroli alternativan tekston +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Aŭtomate kreita: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Agordoj por alternativa teksto de bildoj +pdfjs-image-alt-text-settings-button-label = Agordoj por alternativa teksto de bildoj +pdfjs-editor-alt-text-settings-dialog-label = Agordoj por alternativa teksto de bildoj +pdfjs-editor-alt-text-settings-automatic-title = Aŭtomata alternativa teksto +pdfjs-editor-alt-text-settings-create-model-button-label = Aŭtomate krei alternativan tekston +pdfjs-editor-alt-text-settings-create-model-description = Tio ĉi sugestas priskribojn por helpi personojn kiuj ne povas vidi aŭ ŝargi la bildon. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modelo de artefarita intelekto por alternativa teksto ({ $totalSize } MO) +pdfjs-editor-alt-text-settings-ai-model-description = Ĝi funkcias en via aparato, do viaj datumoj restas privataj. Ĝi estas postulata por aŭtomata kreado de alternativa teksto. +pdfjs-editor-alt-text-settings-delete-model-button = Forigi +pdfjs-editor-alt-text-settings-download-model-button = Elŝuti +pdfjs-editor-alt-text-settings-downloading-model-button = Elŝuto… +pdfjs-editor-alt-text-settings-editor-title = Redaktilo de alternativa teksto +pdfjs-editor-alt-text-settings-show-dialog-button-label = Montri redaktilon de alternativa teksto tuj post aldono de bildo +pdfjs-editor-alt-text-settings-show-dialog-description = Tio ĉi helpas vin kontroli ĉu ĉiuj bildoj havas alternativan tekston. +pdfjs-editor-alt-text-settings-close-button = Fermi + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Elstarigo aldonita +pdfjs-editor-freetext-added-alert = Teksto aldonita +pdfjs-editor-ink-added-alert = Desegno aldonita +pdfjs-editor-stamp-added-alert = Bildo aldonita +pdfjs-editor-signature-added-alert = Subskribo aldonita + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Elstaraĵo forigita +pdfjs-editor-undo-bar-message-freetext = Teksto forigita +pdfjs-editor-undo-bar-message-ink = Desegno forigita +pdfjs-editor-undo-bar-message-stamp = Bildo forigita +pdfjs-editor-undo-bar-message-signature = Subskribo forigita +pdfjs-editor-undo-bar-message-comment = Komento forigita +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] unu prinoto forigita + *[other] { $count } prinotoj forigitaj + } +pdfjs-editor-undo-bar-undo-button = + .title = Malfari +pdfjs-editor-undo-bar-undo-button-label = Malfari +pdfjs-editor-undo-bar-close-button = + .title = Fermi +pdfjs-editor-undo-bar-close-button-label = Fermi + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Tiu ĉi fenestro permesas al la uzanto krei subskribon por aldoni al dokumento PDF. La uzanto povas modifi la nomon (kiu estas cetere la alternativa teksto) kaj havas la eblon konservi la subskribon por posta uzo. +pdfjs-editor-add-signature-dialog-title = Aldoni subskribon + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Tajpi + .title = Tajpi +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Desegni + .title = Desegni +pdfjs-editor-add-signature-image-button = Bildo + .title = Bildo + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Tajpu vian subskribon + .placeholder = Tajpu vian subskribon +pdfjs-editor-add-signature-draw-placeholder = Desegni vian subskribon +pdfjs-editor-add-signature-draw-thickness-range-label = Dikeco +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Dikeco de desegno: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Trenu dosieron ĉi tien por alŝuti ĝin +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Aŭ elektu bildan dosieron + *[other] Aŭ elektu bildan dosieron + } + +## Controls + +pdfjs-editor-add-signature-description-label = Priskribo (alternativa teksto) +pdfjs-editor-add-signature-description-input = + .title = Priskribo (alternativa teksto) +pdfjs-editor-add-signature-description-default-when-drawing = Subskribo +pdfjs-editor-add-signature-clear-button-label = Viŝi subskribon +pdfjs-editor-add-signature-clear-button = + .title = Viŝi subskribon +pdfjs-editor-add-signature-save-checkbox = Konservi subskribon +pdfjs-editor-add-signature-save-warning-message = Vi atingis la limon de kvin konservitaj subskriboj. Forigi unu por povi konservi pli da. +pdfjs-editor-add-signature-image-upload-error-title = Ne eblis alŝuti bildon +pdfjs-editor-add-signature-image-upload-error-description = Kontrolu vian retaliron aŭ provu alŝuti alian bildon. +pdfjs-editor-add-signature-image-no-data-error-title = Ne eblas konverti tiun ĉi bildon al subskribo +pdfjs-editor-add-signature-image-no-data-error-description = Bonvolu provi alŝuti novan bildon. +pdfjs-editor-add-signature-error-close-button = Fermi + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Nuligi +pdfjs-editor-add-signature-add-button = Aldoni +pdfjs-editor-edit-signature-update-button = Ĝisdatigi + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Modifi komenton +pdfjs-editor-edit-comment-popup-button = + .title = Modifi komenton +pdfjs-editor-delete-comment-popup-button-label = Forigi komenton +pdfjs-editor-delete-comment-popup-button = + .title = Forigi komenton +pdfjs-show-comment-button = + .title = Montri komenton + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Modifi komenton +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Ĝisdatigi +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Aldoni komenton +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Aldoni +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Ektajpi… +pdfjs-editor-edit-comment-dialog-cancel-button = Nuligi + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Aldoni komenton + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Montri/kaŝi flankan strion (la dokumento enhavas miniaturojn/konturon/kunsendaĵojn/tavolojn) +pdfjs-toggle-views-manager-button1-label = Administri paĝojn +pdfjs-views-manager-sidebar = + .aria-label = Flanka strio +pdfjs-views-manager-sidebar-resizer = + .aria-label = Dimensiigilo por la flanka strio +pdfjs-views-manager-view-selector-button = + .title = Vidoj +pdfjs-views-manager-view-selector-button-label = Vidoj +pdfjs-views-manager-pages-title = Paĝoj +pdfjs-views-manager-outlines-title1 = Konturo de dokumento + .title = Konturo de dokumento (alklaku duoble por faldi/malfaldi ĉiujn elementojn) +pdfjs-views-manager-attachments-title = Kunsendaĵoj +pdfjs-views-manager-layers-title1 = Tavoloj + .title = Tavoloj (alklaku duoble por ke ĉiuj tavoloj reiru al la norma stato) +pdfjs-views-manager-pages-option-label = Paĝoj +pdfjs-views-manager-outlines-option-label = Konturo de dokumento +pdfjs-views-manager-attachments-option-label = Kunsendaĵoj +pdfjs-views-manager-layers-option-label = Tavoloj +pdfjs-views-manager-add-file-button = + .title = Aldoni dosieron +pdfjs-views-manager-add-file-button-label = Aldoni dosieron +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } elektita + *[other] { $count } elektitaj + } +pdfjs-views-manager-pages-status-none-action-label = Elekti paĝojn +pdfjs-views-manager-pages-status-action-button-label = Administri +pdfjs-views-manager-pages-status-copy-button-label = Kopii +pdfjs-views-manager-pages-status-cut-button-label = Eltondi +pdfjs-views-manager-pages-status-delete-button-label = Forigi +pdfjs-views-manager-pages-status-export-selected-button-label = Eksporti elektitajn… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 paĝo eltondita + *[other] { $count } paĝoj eltonditaj + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 paĝo kopiita + *[other] { $count } paĝoj kopiitaj + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 paĝo forigita + *[other] { $count } paĝoj forigitaj + } +pdfjs-views-manager-pages-status-waiting-ready-label = Pretigo de via dosiero… +pdfjs-views-manager-pages-status-waiting-uploading-label = Dosiero alŝutata… +pdfjs-views-manager-status-warning-cut-label = Ne eblis eltondi. Refreŝigu la paĝon kaj provu denove. +pdfjs-views-manager-status-warning-copy-label = Ne eblis kopii. Refreŝigu la paĝon kaj provu denove. +pdfjs-views-manager-status-warning-delete-label = Ne eblis forigi. Refreŝigu la paĝon kaj provu denove. +pdfjs-views-manager-status-warning-save-label = Ne eblis konservi. Refreŝigu la paĝon kaj provu denove. +pdfjs-views-manager-status-undo-button-label = Malfari +pdfjs-views-manager-status-done-button-label = Farita +pdfjs-views-manager-status-close-button = + .title = Fermi +pdfjs-views-manager-status-close-button-label = Fermi +pdfjs-views-manager-paste-button-label = Alglui +pdfjs-views-manager-paste-button-before = + .title = Alglui antaŭ la unua paĝo +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Alglui post la paĝo { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NOVA +pdfjs-views-manager-waiting-for-file = Dosiero alŝutata… +pdfjs-toggle-views-manager-button1 = + .title = Administri paĝojn + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Forigi konservitan subskribon +pdfjs-editor-delete-signature-button-label1 = Forigi konservitan subskribon + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Modifi priskribon + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Modifi priskribon diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/es-AR/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/es-AR/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/es-AR/viewer.ftl 2026-01-20 14:08:39.365689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/es-AR/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Página actual (Ver URL de la página actual) pdfjs-bookmark-button-label = Página actual -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Abrir en la aplicación -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Abrir en la aplicación ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Nombre de archivo: pdfjs-document-properties-file-size = Tamaño de archovo: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) pdfjs-document-properties-title = Título: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Asunto: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Fecha de creación: pdfjs-document-properties-modification-date = Fecha de modificación: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Creador: pdfjs-document-properties-producer = PDF Productor: pdfjs-document-properties-version = Versión de PDF: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniatura de página { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Seleccionar página { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Página { $page } de { $total } ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } Anotación] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Texto +pdfjs-editor-color-picker-free-text-input = + .title = Cambiar color del texto pdfjs-editor-free-text-button-label = Texto pdfjs-editor-ink-button = .title = Dibujar +pdfjs-editor-color-picker-ink-input = + .title = Cambiar color del dibujo pdfjs-editor-ink-button-label = Dibujar pdfjs-editor-stamp-button = .title = Agregar o editar imágenes @@ -304,12 +309,37 @@ pdfjs-editor-highlight-button = .title = Resaltar pdfjs-editor-highlight-button-label = Resaltar -pdfjs-highlight-floating-button = - .title = Resaltar pdfjs-highlight-floating-button1 = .title = Resaltar .aria-label = Resaltar pdfjs-highlight-floating-button-label = Resaltar +pdfjs-comment-floating-button = + .title = Comentar + .aria-label = Comentar +pdfjs-comment-floating-button-label = Comentar +pdfjs-editor-comment-button = + .title = Comentar + .aria-label = Comentar +pdfjs-editor-comment-button-label = Comentar +pdfjs-editor-signature-button = + .title = Agregar firma +pdfjs-editor-signature-button-label = Agregar firma + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Editor de resaltado +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Editor de dibujos +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Editor de firmas: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Editor de imágenes ## Remove button for the various kind of editor. @@ -321,6 +351,8 @@ .title = Eliminar imagen pdfjs-editor-remove-highlight-button = .title = Eliminar resaltado +pdfjs-editor-remove-signature-button = + .title = Eliminar firma ## @@ -337,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Grosor pdfjs-editor-free-highlight-thickness-title = .title = Cambiar el grosor al resaltar elementos que no sean texto -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Controles de firma y firmas guardadas +pdfjs-editor-signature-add-signature-button = + .title = Agregar nueva firma +pdfjs-editor-signature-add-signature-button-label = Agregar nueva firma +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Firma guardada: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Editor de texto -pdfjs-free-text-default-content = Empezar a tipear… -pdfjs-ink = - .aria-label = Editor de dibujos -pdfjs-ink-canvas = - .aria-label = Imagen creada por el usuario + .default-content = Comenzar a tipear… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Comentario + *[other] Comentarios + } +pdfjs-editor-comments-sidebar-close-button = + .title = Cerrar la barra lateral + .aria-label = Cerrar la barra lateral +pdfjs-editor-comments-sidebar-close-button-label = Cerrar la barra lateral +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = ¿Ve algo digno de mención? Resáltelo y deje un comentario. +pdfjs-editor-comments-sidebar-no-comments-link = Conocer más ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Texto alternativo -pdfjs-editor-alt-text-edit-button-label = Editar el texto alternativo +pdfjs-editor-alt-text-edit-button = + .aria-label = Editar texto alternativo pdfjs-editor-alt-text-dialog-label = Eligir una opción pdfjs-editor-alt-text-dialog-description = El texto alternativo (texto alternativo) ayuda cuando las personas no pueden ver la imagen o cuando no se carga. pdfjs-editor-alt-text-add-description-label = Agregar una descripción @@ -362,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Por ejemplo: “Un joven se sienta a la mesa a comer” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Texto alternativo ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Esquina superior izquierda — cambiar el tamaño -pdfjs-editor-resizer-label-top-middle = Arriba en el medio — cambiar el tamaño -pdfjs-editor-resizer-label-top-right = Esquina superior derecha — cambiar el tamaño -pdfjs-editor-resizer-label-middle-right = Al centro a la derecha — cambiar el tamaño -pdfjs-editor-resizer-label-bottom-right = Esquina inferior derecha — cambiar el tamaño -pdfjs-editor-resizer-label-bottom-middle = Abajo en el medio — cambiar el tamaño -pdfjs-editor-resizer-label-bottom-left = Esquina inferior izquierda — cambiar el tamaño -pdfjs-editor-resizer-label-middle-left = Al centro a la izquierda — cambiar el tamaño +pdfjs-editor-resizer-top-left = + .aria-label = Esquina superior izquierda — cambiar el tamaño +pdfjs-editor-resizer-top-middle = + .aria-label = Arriba en el medio — cambiar el tamaño +pdfjs-editor-resizer-top-right = + .aria-label = Esquina superior derecha — cambiar el tamaño +pdfjs-editor-resizer-middle-right = + .aria-label = Al centro a la derecha — cambiar el tamaño +pdfjs-editor-resizer-bottom-right = + .aria-label = Esquina inferior derecha — cambiar el tamaño +pdfjs-editor-resizer-bottom-middle = + .aria-label = Abajo en el medio — cambiar el tamaño +pdfjs-editor-resizer-bottom-left = + .aria-label = Esquina inferior izquierda — cambiar el tamaño +pdfjs-editor-resizer-middle-left = + .aria-label = Al centro a la izquierda — cambiar el tamaño ## Color picker @@ -400,3 +465,283 @@ pdfjs-editor-highlight-show-all-button-label = Mostrar todo pdfjs-editor-highlight-show-all-button = .title = Mostrar todo + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descripción de la imagen) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Agregar texto alternativo (descripción de la imagen) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Escribir la descripción aquí… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Descripción corta para las personas que no pueden ver la imagen o cuando la imagen no se carga. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo fue creado automáticamente y puede ser incorrecto. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Conocer más +pdfjs-editor-new-alt-text-create-automatically-button-label = Crear texto alternativo automáticamente +pdfjs-editor-new-alt-text-not-now-button = No ahora +pdfjs-editor-new-alt-text-error-title = No se pudo crear el texto alternativo automáticamente +pdfjs-editor-new-alt-text-error-description = Escriba su propio texto alternativo o pruebe nuevamente más tarde. +pdfjs-editor-new-alt-text-error-close-button = Cerrar +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Descargando modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) + .aria-valuetext = Descargando modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Texto alternativo agregado +pdfjs-editor-new-alt-text-added-button-label = Texto alternativo agregado +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Falta el texto alternativo +pdfjs-editor-new-alt-text-missing-button-label = Falta el texto alternativo +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Calificar el texto alternativo +pdfjs-editor-new-alt-text-to-review-button-label = Revisar el texto alternativo +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creado automáticamente: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Configuración de texto alternativo de la imagen +pdfjs-image-alt-text-settings-button-label = Configuración de texto alternativo de la imagen +pdfjs-editor-alt-text-settings-dialog-label = Configuración de texto alternativo de la imagen +pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo automático +pdfjs-editor-alt-text-settings-create-model-button-label = Crear texto alternativo automáticamente +pdfjs-editor-alt-text-settings-create-model-description = Sugiere descripciones para ayudar a las personas que no pueden ver la imagen o cuando la imagen no se carga. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modelo de IA de texto alternativo ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Se ejecuta localmente en el dispositivo para que los datos se mantengan privados. Requerido para texto alternativo automático. +pdfjs-editor-alt-text-settings-delete-model-button = Borrar +pdfjs-editor-alt-text-settings-download-model-button = Descargar +pdfjs-editor-alt-text-settings-downloading-model-button = Descargando… +pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar el editor de texto alternativo inmediatamente al agregar una imagen +pdfjs-editor-alt-text-settings-show-dialog-description = Te ayuda a asegurarse de que todas las imágenes tengan texto alternativo. +pdfjs-editor-alt-text-settings-close-button = Cerrar + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Resaltado agregado +pdfjs-editor-freetext-added-alert = Texto agregado +pdfjs-editor-ink-added-alert = Dibujo agregado +pdfjs-editor-stamp-added-alert = Imagen agregada +pdfjs-editor-signature-added-alert = Firma agregada + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Resaltado eliminado +pdfjs-editor-undo-bar-message-freetext = Texto eliminado +pdfjs-editor-undo-bar-message-ink = Dibujo eliminado +pdfjs-editor-undo-bar-message-stamp = Imagen eliminado +pdfjs-editor-undo-bar-message-signature = Firma eliminada +pdfjs-editor-undo-bar-message-comment = Comentario eliminado +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } anotación eliminada + *[other] { $count } anotaciones eliminadas + } +pdfjs-editor-undo-bar-undo-button = + .title = Deshacer +pdfjs-editor-undo-bar-undo-button-label = Deshacer +pdfjs-editor-undo-bar-close-button = + .title = Cerrar +pdfjs-editor-undo-bar-close-button-label = Cerrar + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Este modal permite al usuario crear una firma para agregar a un documento PDF. El usuario puede editar el nombre (que también sirve como texto alternativo) y opcionalmente guardar la firma para un uso repetido. +pdfjs-editor-add-signature-dialog-title = Agregar una firma + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Tipear + .title = Tipear +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Dibujar + .title = Dibujar +pdfjs-editor-add-signature-image-button = Imagen + .title = Imagen + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Escribir la firma + .placeholder = Escribir la firma +pdfjs-editor-add-signature-draw-placeholder = Dibujar la firma +pdfjs-editor-add-signature-draw-thickness-range-label = Grosor +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Grosor del dibujo: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Arrastrar un archivo acá para subirlo +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] O seleccionar archivos de imágenes + *[other] O seleccionar archivos de imágenes + } + +## Controls + +pdfjs-editor-add-signature-description-label = Descripción (texto alternativo) +pdfjs-editor-add-signature-description-input = + .title = Descripción (texto alternativo) +pdfjs-editor-add-signature-description-default-when-drawing = Firma +pdfjs-editor-add-signature-clear-button-label = Borrar firma +pdfjs-editor-add-signature-clear-button = + .title = Borrar firma +pdfjs-editor-add-signature-save-checkbox = Guardar firma +pdfjs-editor-add-signature-save-warning-message = Se alcanzó el límite de 5 firmas guardadas. Elimine una para guardar más. +pdfjs-editor-add-signature-image-upload-error-title = No se pudo subir la imagen +pdfjs-editor-add-signature-image-upload-error-description = Verifique la conexión de red o pruebe con otra imagen. +pdfjs-editor-add-signature-image-no-data-error-title = No se puede convertir esta imagen en una firma +pdfjs-editor-add-signature-image-no-data-error-description = Intente subir una imagen diferente. +pdfjs-editor-add-signature-error-close-button = Cerrar + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Cancelar +pdfjs-editor-add-signature-add-button = Agregar +pdfjs-editor-edit-signature-update-button = Actualizar + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Editar comentario +pdfjs-editor-edit-comment-popup-button = + .title = Editar comentario +pdfjs-editor-delete-comment-popup-button-label = Eliminar comentario +pdfjs-editor-delete-comment-popup-button = + .title = Eliminar comentario +pdfjs-show-comment-button = + .title = Mostrar comentario + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Editar comentario +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Actualizar +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Agregar comentario +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Agregar +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Empezar a tipear… +pdfjs-editor-edit-comment-dialog-cancel-button = Cancelar + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Agregar comentario + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Alternar barra lateral (el documento contiene miniaturas/esquemas/adjuntos/capas) +pdfjs-toggle-views-manager-button1-label = Administrar páginas +pdfjs-views-manager-sidebar = + .aria-label = Barra lateral +pdfjs-views-manager-sidebar-resizer = + .aria-label = Redimensionador de barra lateral +pdfjs-views-manager-view-selector-button = + .title = Vistas +pdfjs-views-manager-view-selector-button-label = Vistas +pdfjs-views-manager-pages-title = Páginas +pdfjs-views-manager-outlines-title1 = Esquema del documento + .title = Esquema del documento (doble clic para expandir/colapsar todos los ítems) +pdfjs-views-manager-attachments-title = Adjuntos +pdfjs-views-manager-layers-title1 = Capas + .title = Capas (doble clic para restablecer todas las cañas al estado predeterminado) +pdfjs-views-manager-pages-option-label = Páginas +pdfjs-views-manager-outlines-option-label = Esquema del documento +pdfjs-views-manager-attachments-option-label = Adjuntos +pdfjs-views-manager-layers-option-label = Capas +pdfjs-views-manager-add-file-button = + .title = Agregar archivo +pdfjs-views-manager-add-file-button-label = Agregar archivo +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } seleccionada + *[other] { $count } seleccionadas + } +pdfjs-views-manager-pages-status-none-action-label = Seleccionar páginas +pdfjs-views-manager-pages-status-action-button-label = Administrar +pdfjs-views-manager-pages-status-copy-button-label = Copiar +pdfjs-views-manager-pages-status-cut-button-label = Cortar +pdfjs-views-manager-pages-status-delete-button-label = Borrar +pdfjs-views-manager-pages-status-export-selected-button-label = Exportar seleccionado… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 página cortada + *[other] { $count } páginas cortadas + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 página copiada + *[other] { $count } páginas copiadas + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 página borrada + *[other] { $count } páginas borradas + } +pdfjs-views-manager-pages-status-waiting-ready-label = Preparando el archivo… +pdfjs-views-manager-pages-status-waiting-uploading-label = Subiendo el archivo… +pdfjs-views-manager-status-warning-cut-label = No se pudo cortar. Refresque la página y pruebe de nuevo. +pdfjs-views-manager-status-warning-copy-label = No se pudo copiar. Refresque la página y pruebe de nuevo. +pdfjs-views-manager-status-warning-delete-label = No se pudo borrar. Refresque la página y pruebe de nuevo. +pdfjs-views-manager-status-warning-save-label = No se pudo guardar. Refresque la página y pruebe de nuevo. +pdfjs-views-manager-status-undo-button-label = Deshacer +pdfjs-views-manager-status-done-button-label = Listo +pdfjs-views-manager-status-close-button = + .title = Cerrar +pdfjs-views-manager-status-close-button-label = Cerrar +pdfjs-views-manager-paste-button-label = Pegar +pdfjs-views-manager-paste-button-before = + .title = Pegar antes de la primera página +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Pegar después de la página { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NUEVO +pdfjs-views-manager-waiting-for-file = Subiendo archivo… +pdfjs-toggle-views-manager-button1 = + .title = Administrar páginas + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Eliminar firma guardada +pdfjs-editor-delete-signature-button-label1 = Eliminar firma guardada + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Editar descripción + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Editar descripción diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/es-CL/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/es-CL/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/es-CL/viewer.ftl 2026-01-20 14:08:39.365689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/es-CL/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Página actual (Ver URL de la página actual) pdfjs-bookmark-button-label = Página actual -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Abrir en una aplicación -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Abrir en una aplicación ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Nombre de archivo: pdfjs-document-properties-file-size = Tamaño del archivo: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) pdfjs-document-properties-title = Título: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Asunto: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Fecha de creación: pdfjs-document-properties-modification-date = Fecha de modificación: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Creador: pdfjs-document-properties-producer = Productor del PDF: pdfjs-document-properties-version = Versión de PDF: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniatura de la página { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Selecciona la página { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Página { $page } de { $total } ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,10 +279,13 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } Anotación] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password -pdfjs-password-label = Ingrese la contraseña para abrir este archivo PDF. +pdfjs-password-label = Ingresa la contraseña para abrir este archivo PDF. pdfjs-password-invalid = Contraseña inválida. Por favor, vuelve a intentarlo. pdfjs-password-ok-button = Aceptar pdfjs-password-cancel-button = Cancelar @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Texto +pdfjs-editor-color-picker-free-text-input = + .title = Cambiar color del texto pdfjs-editor-free-text-button-label = Texto pdfjs-editor-ink-button = .title = Dibujar +pdfjs-editor-color-picker-ink-input = + .title = Cambiar color del dibujo pdfjs-editor-ink-button-label = Dibujar pdfjs-editor-stamp-button = .title = Añadir o editar imágenes @@ -304,12 +309,37 @@ pdfjs-editor-highlight-button = .title = Destacar pdfjs-editor-highlight-button-label = Destacar -pdfjs-highlight-floating-button = - .title = Destacar pdfjs-highlight-floating-button1 = .title = Destacar .aria-label = Destacar pdfjs-highlight-floating-button-label = Destacar +pdfjs-comment-floating-button = + .title = Comentario + .aria-label = Comentario +pdfjs-comment-floating-button-label = Comentario +pdfjs-editor-comment-button = + .title = Comentar + .aria-label = Comentar +pdfjs-editor-comment-button-label = Comentar +pdfjs-editor-signature-button = + .title = Añadir firma +pdfjs-editor-signature-button-label = Añadir firma + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Editor de destacados +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Editor de dibujos +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Editor de firmas: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Editor de imágenes ## Remove button for the various kind of editor. @@ -321,6 +351,8 @@ .title = Eliminar imagen pdfjs-editor-remove-highlight-button = .title = Quitar resaltado +pdfjs-editor-remove-signature-button = + .title = Eliminar firma ## @@ -337,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Grosor pdfjs-editor-free-highlight-thickness-title = .title = Cambia el grosor al resaltar elementos que no sean texto -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Controles de firma y firmas guardadas +pdfjs-editor-signature-add-signature-button = + .title = Añadir nueva firma +pdfjs-editor-signature-add-signature-button-label = Añadir nueva firma +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Firma guardada: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Editor de texto -pdfjs-free-text-default-content = Empieza a escribir… -pdfjs-ink = - .aria-label = Editor de dibujos -pdfjs-ink-canvas = - .aria-label = Imagen creada por el usuario + .default-content = Empieza a escribir… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Comentario + *[other] Comentarios + } +pdfjs-editor-comments-sidebar-close-button = + .title = Cerrar la barra lateral + .aria-label = Cerrar la barra lateral +pdfjs-editor-comments-sidebar-close-button-label = Cerrar la barra lateral +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = ¿Ves algo interesante? Resáltalo y deja un comentario. +pdfjs-editor-comments-sidebar-no-comments-link = Más información ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Texto alternativo -pdfjs-editor-alt-text-edit-button-label = Editar texto alternativo +pdfjs-editor-alt-text-edit-button = + .aria-label = Editar texto alternativo pdfjs-editor-alt-text-dialog-label = Elige una opción pdfjs-editor-alt-text-dialog-description = El texto alternativo (alt text) ayuda cuando las personas no pueden ver la imagen o cuando no se carga. pdfjs-editor-alt-text-add-description-label = Añade una descripción @@ -362,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Por ejemplo: “Un joven se sienta a la mesa a comer” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Texto alternativo ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Esquina superior izquierda — cambiar el tamaño -pdfjs-editor-resizer-label-top-middle = Borde superior en el medio — cambiar el tamaño -pdfjs-editor-resizer-label-top-right = Esquina superior derecha — cambiar el tamaño -pdfjs-editor-resizer-label-middle-right = Borde derecho en el medio — cambiar el tamaño -pdfjs-editor-resizer-label-bottom-right = Esquina inferior derecha — cambiar el tamaño -pdfjs-editor-resizer-label-bottom-middle = Borde inferior en el medio — cambiar el tamaño -pdfjs-editor-resizer-label-bottom-left = Esquina inferior izquierda — cambiar el tamaño -pdfjs-editor-resizer-label-middle-left = Borde izquierdo en el medio — cambiar el tamaño +pdfjs-editor-resizer-top-left = + .aria-label = Esquina superior izquierda — cambiar el tamaño +pdfjs-editor-resizer-top-middle = + .aria-label = Borde superior en el medio — cambiar el tamaño +pdfjs-editor-resizer-top-right = + .aria-label = Esquina superior derecha — cambiar el tamaño +pdfjs-editor-resizer-middle-right = + .aria-label = Borde derecho en el medio — cambiar el tamaño +pdfjs-editor-resizer-bottom-right = + .aria-label = Esquina inferior derecha — cambiar el tamaño +pdfjs-editor-resizer-bottom-middle = + .aria-label = Borde inferior en el medio — cambiar el tamaño +pdfjs-editor-resizer-bottom-left = + .aria-label = Esquina inferior izquierda — cambiar el tamaño +pdfjs-editor-resizer-middle-left = + .aria-label = Borde izquierdo en el medio — cambiar el tamaño ## Color picker @@ -400,3 +465,283 @@ pdfjs-editor-highlight-show-all-button-label = Mostrar todo pdfjs-editor-highlight-show-all-button = .title = Mostrar todo + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descripción de la imagen) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Añadir texto alternativo (descripción de la imagen) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Escribe tu descripción aquí… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Breve descripción para las personas que no pueden ver la imagen o cuando la imagen no se carga. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo fue creado automáticamente y puede ser incorrecto. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Aprender más +pdfjs-editor-new-alt-text-create-automatically-button-label = Crear texto alternativo automáticamente +pdfjs-editor-new-alt-text-not-now-button = Ahora no +pdfjs-editor-new-alt-text-error-title = No se pudo crear el texto alternativo automáticamente +pdfjs-editor-new-alt-text-error-description = Escribe tu propio texto alternativo o vuelve a intentarlo más tarde. +pdfjs-editor-new-alt-text-error-close-button = Cerrar +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Descargando el modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) + .aria-valuetext = Descargando el modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Se añadió el texto alternativo +pdfjs-editor-new-alt-text-added-button-label = Se añadió el texto alternativo +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Falta el texto alternativo +pdfjs-editor-new-alt-text-missing-button-label = Falta el texto alternativo +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Revisar el texto alternativo +pdfjs-editor-new-alt-text-to-review-button-label = Revisar el texto alternativo +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creado automáticamente: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Ajustes del texto alternativo de la imagen +pdfjs-image-alt-text-settings-button-label = Ajustes del texto alternativo de la imagen +pdfjs-editor-alt-text-settings-dialog-label = Ajustes del texto alternativo de la imagen +pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo automático +pdfjs-editor-alt-text-settings-create-model-button-label = Crear texto alternativo automáticamente +pdfjs-editor-alt-text-settings-create-model-description = Sugiere descripciones para ayudar a las personas que no pueden ver la imagen o cuando la imagen no se carga. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modelo de IA de texto alternativo ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Se ejecuta localmente en tu dispositivo para que tus datos permanezcan privados. Necesario para el texto alternativo automático. +pdfjs-editor-alt-text-settings-delete-model-button = Eliminar +pdfjs-editor-alt-text-settings-download-model-button = Descargar +pdfjs-editor-alt-text-settings-downloading-model-button = Bajando… +pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar el editor de texto alternativo inmediatamente al añadir una imagen +pdfjs-editor-alt-text-settings-show-dialog-description = Te ayuda a asegurarte de que todas tus imágenes tengan texto alternativo. +pdfjs-editor-alt-text-settings-close-button = Cerrar + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Destacado añadido +pdfjs-editor-freetext-added-alert = Texto añadido +pdfjs-editor-ink-added-alert = Dibujo añadido +pdfjs-editor-stamp-added-alert = Imagen añadida +pdfjs-editor-signature-added-alert = Firma añadida + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Resaltado eliminado +pdfjs-editor-undo-bar-message-freetext = Texto eliminado +pdfjs-editor-undo-bar-message-ink = Dibujo eliminado +pdfjs-editor-undo-bar-message-stamp = Imagen eliminada +pdfjs-editor-undo-bar-message-signature = Firma eliminada +pdfjs-editor-undo-bar-message-comment = Comentario eliminado +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } anotación eliminada + *[other] { $count } anotaciones eliminadas + } +pdfjs-editor-undo-bar-undo-button = + .title = Deshacer +pdfjs-editor-undo-bar-undo-button-label = Deshacer +pdfjs-editor-undo-bar-close-button = + .title = Cerrar +pdfjs-editor-undo-bar-close-button-label = Cerrar + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Este modal permite al usuario crear una firma para agregarla a un documento PDF. El usuario puede editar el nombre (que también sirve como texto alternativo) y, opcionalmente, guardar la firma para usarla nuevamente. +pdfjs-editor-add-signature-dialog-title = Añadir una firma + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Escribir + .title = Escribir +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Dibujar + .title = Dibujar +pdfjs-editor-add-signature-image-button = Imagen + .title = Imagen + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Escribe tu firma + .placeholder = Escribe tu firma +pdfjs-editor-add-signature-draw-placeholder = Dibuja tu firma +pdfjs-editor-add-signature-draw-thickness-range-label = Grosor +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Grosor del dibujo: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Arrastre un archivo aquí para cargarlo +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] O elige archivos de imagen + *[other] O busca archivos de imagen + } + +## Controls + +pdfjs-editor-add-signature-description-label = Descripción (texto alternativo) +pdfjs-editor-add-signature-description-input = + .title = Descripción (texto alternativo) +pdfjs-editor-add-signature-description-default-when-drawing = Firma +pdfjs-editor-add-signature-clear-button-label = Limpiar firma +pdfjs-editor-add-signature-clear-button = + .title = Limpiar firma +pdfjs-editor-add-signature-save-checkbox = Guardar firma +pdfjs-editor-add-signature-save-warning-message = Has alcanzado el límite de 5 firmas guardadas. Elimina una para guardar más. +pdfjs-editor-add-signature-image-upload-error-title = No se pudo subir la imagen +pdfjs-editor-add-signature-image-upload-error-description = Verifica tu conexión de red o prueba con otra imagen. +pdfjs-editor-add-signature-image-no-data-error-title = No se puede convertir esta imagen en una firma +pdfjs-editor-add-signature-image-no-data-error-description = Por favor, intenta cargar una imagen diferente. +pdfjs-editor-add-signature-error-close-button = Cerrar + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Cancelar +pdfjs-editor-add-signature-add-button = Añadir +pdfjs-editor-edit-signature-update-button = Actualizar + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Editar comentario +pdfjs-editor-edit-comment-popup-button = + .title = Editar comentario +pdfjs-editor-delete-comment-popup-button-label = Eliminar comentario +pdfjs-editor-delete-comment-popup-button = + .title = Eliminar comentario +pdfjs-show-comment-button = + .title = Mostrar comentario + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Editar comentario +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Actualizar +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Añadir comentario +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Añadir +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Empieza a escribir… +pdfjs-editor-edit-comment-dialog-cancel-button = Cancelar + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Añadir comentario + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Cambiar barra lateral (índice de contenidos del documento/miniaturas/adjuntos/capas) +pdfjs-toggle-views-manager-button1-label = Gestionar páginas +pdfjs-views-manager-sidebar = + .aria-label = Barra lateral +pdfjs-views-manager-sidebar-resizer = + .aria-label = Redimensionador de la barra lateral +pdfjs-views-manager-view-selector-button = + .title = Vistas +pdfjs-views-manager-view-selector-button-label = Vistas +pdfjs-views-manager-pages-title = Páginas +pdfjs-views-manager-outlines-title1 = Esquema del documento + .title = Esquema del documento (doble clic para expandir/contraer todos los elementos) +pdfjs-views-manager-attachments-title = Adjuntos +pdfjs-views-manager-layers-title1 = Capas + .title = Capas (doble clic para restablecer todas las capas a su estado predeterminado) +pdfjs-views-manager-pages-option-label = Páginas +pdfjs-views-manager-outlines-option-label = Esquema del documento +pdfjs-views-manager-attachments-option-label = Adjuntos +pdfjs-views-manager-layers-option-label = Capas +pdfjs-views-manager-add-file-button = + .title = Añadir archivo +pdfjs-views-manager-add-file-button-label = Añadir archivo +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } seleccionado + *[other] { $count } seleccionados + } +pdfjs-views-manager-pages-status-none-action-label = Seleccionar páginas +pdfjs-views-manager-pages-status-action-button-label = Administrar +pdfjs-views-manager-pages-status-copy-button-label = Copiar +pdfjs-views-manager-pages-status-cut-button-label = Cortar +pdfjs-views-manager-pages-status-delete-button-label = Eliminar +pdfjs-views-manager-pages-status-export-selected-button-label = Exportar selección… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 página cortada + *[other] { $count } páginas cortadas + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 página copiada + *[other] { $count } páginas copiadas + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 página eliminada + *[other] { $count } páginas eliminadas + } +pdfjs-views-manager-pages-status-waiting-ready-label = Preparando tu archivo… +pdfjs-views-manager-pages-status-waiting-uploading-label = Subiendo archivo… +pdfjs-views-manager-status-warning-cut-label = No se pudo cortar. Actualiza la página y vuelve a intentarlo. +pdfjs-views-manager-status-warning-copy-label = No se pudo copiar. Actualiza la página y vuelve a intentarlo. +pdfjs-views-manager-status-warning-delete-label = No se pudo eliminar. Actualiza la página y vuelve a intentarlo. +pdfjs-views-manager-status-warning-save-label = No se pudo guardar. Actualiza la página y vuelve a intentarlo. +pdfjs-views-manager-status-undo-button-label = Deshacer +pdfjs-views-manager-status-done-button-label = Hecho +pdfjs-views-manager-status-close-button = + .title = Cerrar +pdfjs-views-manager-status-close-button-label = Cerrar +pdfjs-views-manager-paste-button-label = Pegar +pdfjs-views-manager-paste-button-before = + .title = Pegar antes de la primera página +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Pegar después de la página { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NUEVO +pdfjs-views-manager-waiting-for-file = Subiendo archivo… +pdfjs-toggle-views-manager-button1 = + .title = Gestionar páginas + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Eliminar firma guardada +pdfjs-editor-delete-signature-button-label1 = Eliminar firma guardada + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Editar descripción + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Editar descripción diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/es-ES/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/es-ES/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/es-ES/viewer.ftl 2026-01-20 14:08:39.365689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/es-ES/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Página actual (Ver URL de la página actual) pdfjs-bookmark-button-label = Página actual -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Abrir en aplicación -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Abrir en aplicación ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Nombre de archivo: pdfjs-document-properties-file-size = Tamaño de archivo: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) pdfjs-document-properties-title = Título: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Asunto: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Fecha de creación: pdfjs-document-properties-modification-date = Fecha de modificación: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Creador: pdfjs-document-properties-producer = Productor PDF: pdfjs-document-properties-version = Versión PDF: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniatura de la página { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Seleccionar página { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Página { $page } de { $total } ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Anotación { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Texto +pdfjs-editor-color-picker-free-text-input = + .title = Cambiar el color del texto pdfjs-editor-free-text-button-label = Texto pdfjs-editor-ink-button = .title = Dibujar +pdfjs-editor-color-picker-ink-input = + .title = Cambiar el color del dibujo pdfjs-editor-ink-button-label = Dibujar pdfjs-editor-stamp-button = .title = Añadir o editar imágenes @@ -304,12 +309,37 @@ pdfjs-editor-highlight-button = .title = Resaltar pdfjs-editor-highlight-button-label = Resaltar -pdfjs-highlight-floating-button = - .title = Resaltar pdfjs-highlight-floating-button1 = .title = Resaltar .aria-label = Resaltar pdfjs-highlight-floating-button-label = Resaltar +pdfjs-comment-floating-button = + .title = Comentario + .aria-label = Comentario +pdfjs-comment-floating-button-label = Comentario +pdfjs-editor-comment-button = + .title = Comentario + .aria-label = Comentario +pdfjs-editor-comment-button-label = Comentario +pdfjs-editor-signature-button = + .title = Añadir firma +pdfjs-editor-signature-button-label = Añadir firma + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Editor de resaltado +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Editor de dibujos +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Editor de firmas: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Editor de imágenes ## Remove button for the various kind of editor. @@ -321,6 +351,8 @@ .title = Eliminar imagen pdfjs-editor-remove-highlight-button = .title = Quitar resaltado +pdfjs-editor-remove-signature-button = + .title = Eliminar firma ## @@ -337,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Grosor pdfjs-editor-free-highlight-thickness-title = .title = Cambiar el grosor al resaltar elementos que no sean texto -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Controles de firma y firmas guardadas +pdfjs-editor-signature-add-signature-button = + .title = Añadir nueva firma +pdfjs-editor-signature-add-signature-button-label = Añadir nueva firma +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Firma guardada: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Editor de texto -pdfjs-free-text-default-content = Empezar a escribir… -pdfjs-ink = - .aria-label = Editor de dibujos -pdfjs-ink-canvas = - .aria-label = Imagen creada por el usuario + .default-content = Empiece a escribir… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Comentario + *[other] Comentarios + } +pdfjs-editor-comments-sidebar-close-button = + .title = Cerrar la barra lateral + .aria-label = Cerrar la barra lateral +pdfjs-editor-comments-sidebar-close-button-label = Cerrar la barra lateral +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = ¿Ve algo interesante? Resáltelo y deje un comentario. +pdfjs-editor-comments-sidebar-no-comments-link = Saber más ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Texto alternativo -pdfjs-editor-alt-text-edit-button-label = Editar el texto alternativo +pdfjs-editor-alt-text-edit-button = + .aria-label = Editar el texto alternativo pdfjs-editor-alt-text-dialog-label = Eligir una opción pdfjs-editor-alt-text-dialog-description = El texto alternativo (texto alternativo) ayuda cuando las personas no pueden ver la imagen o cuando no se carga. pdfjs-editor-alt-text-add-description-label = Añadir una descripción @@ -362,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Por ejemplo: “Un joven se sienta a la mesa a comer” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Texto alternativo ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Esquina superior izquierda — redimensionar -pdfjs-editor-resizer-label-top-middle = Borde superior en el medio — redimensionar -pdfjs-editor-resizer-label-top-right = Esquina superior derecha — redimensionar -pdfjs-editor-resizer-label-middle-right = Borde derecho en el medio — redimensionar -pdfjs-editor-resizer-label-bottom-right = Esquina inferior derecha — redimensionar -pdfjs-editor-resizer-label-bottom-middle = Borde inferior en el medio — redimensionar -pdfjs-editor-resizer-label-bottom-left = Esquina inferior izquierda — redimensionar -pdfjs-editor-resizer-label-middle-left = Borde izquierdo en el medio — redimensionar +pdfjs-editor-resizer-top-left = + .aria-label = Esquina superior izquierda — redimensionar +pdfjs-editor-resizer-top-middle = + .aria-label = Borde superior en el medio — redimensionar +pdfjs-editor-resizer-top-right = + .aria-label = Esquina superior derecha — redimensionar +pdfjs-editor-resizer-middle-right = + .aria-label = Borde derecho en el medio — redimensionar +pdfjs-editor-resizer-bottom-right = + .aria-label = Esquina inferior derecha — redimensionar +pdfjs-editor-resizer-bottom-middle = + .aria-label = Borde inferior en el medio — redimensionar +pdfjs-editor-resizer-bottom-left = + .aria-label = Esquina inferior izquierda — redimensionar +pdfjs-editor-resizer-middle-left = + .aria-label = Borde izquierdo en el medio — redimensionar ## Color picker @@ -400,3 +465,283 @@ pdfjs-editor-highlight-show-all-button-label = Mostrar todo pdfjs-editor-highlight-show-all-button = .title = Mostrar todo + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descripción de la imagen) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Añadir texto alternativo (descripción de la imagen) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Escribir la descripción aquí… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Breve descripción para las personas que no pueden ver la imagen o cuando la imagen no se carga. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo fue creado automáticamente y puede ser inexacto. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Saber más +pdfjs-editor-new-alt-text-create-automatically-button-label = Crear texto alternativo automáticamente +pdfjs-editor-new-alt-text-not-now-button = Ahora no +pdfjs-editor-new-alt-text-error-title = No se ha podido crear el texto alternativo automáticamente +pdfjs-editor-new-alt-text-error-description = Escriba su propio texto alternativo o inténtelo de nuevo más tarde. +pdfjs-editor-new-alt-text-error-close-button = Cerrar +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Descargando el modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) + .aria-valuetext = Descargando el modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Se añadió el texto alternativo +pdfjs-editor-new-alt-text-added-button-label = Se añadió el texto alternativo +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Falta el texto alternativo +pdfjs-editor-new-alt-text-missing-button-label = Falta el texto alternativo +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Revisar el texto alternativo +pdfjs-editor-new-alt-text-to-review-button-label = Revisar el texto alternativo +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creado automáticamente: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Ajustes del texto alternativo de la imagen +pdfjs-image-alt-text-settings-button-label = Ajustes del texto alternativo de la imagen +pdfjs-editor-alt-text-settings-dialog-label = Ajustes del texto alternativo de la imagen +pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo automático +pdfjs-editor-alt-text-settings-create-model-button-label = Crear texto alternativo automáticamente +pdfjs-editor-alt-text-settings-create-model-description = Sugiere descripciones para ayudar a las personas que no pueden ver la imagen o cuando la imagen no se carga. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modelo de IA de texto alternativo ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Se ejecuta localmente en el dispositivo para que los datos se mantengan privados. Requerido para texto alternativo automático. +pdfjs-editor-alt-text-settings-delete-model-button = Eliminar +pdfjs-editor-alt-text-settings-download-model-button = Descargar +pdfjs-editor-alt-text-settings-downloading-model-button = Descargando… +pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar el editor de texto alternativo inmediatamente al añadir una imagen +pdfjs-editor-alt-text-settings-show-dialog-description = Le ayuda a asegurarse de que todas sus imágenes tengan texto alternativo. +pdfjs-editor-alt-text-settings-close-button = Cerrar + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Resaltado añadido +pdfjs-editor-freetext-added-alert = Texto añadido +pdfjs-editor-ink-added-alert = Dibujo añadido +pdfjs-editor-stamp-added-alert = Imagen añadida +pdfjs-editor-signature-added-alert = Firma añadida + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Resaltado eliminado +pdfjs-editor-undo-bar-message-freetext = Texto eliminado +pdfjs-editor-undo-bar-message-ink = Dibujo eliminado +pdfjs-editor-undo-bar-message-stamp = Imagen eliminada +pdfjs-editor-undo-bar-message-signature = Firma eliminada +pdfjs-editor-undo-bar-message-comment = Comentario eliminado +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } anotación eliminada + *[other] { $count } anotaciones eliminadas + } +pdfjs-editor-undo-bar-undo-button = + .title = Deshacer +pdfjs-editor-undo-bar-undo-button-label = Deshacer +pdfjs-editor-undo-bar-close-button = + .title = Cerrar +pdfjs-editor-undo-bar-close-button-label = Cerrar + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Este modal permite al usuario crear una firma para añadirla a un documento PDF. El usuario puede editar el nombre (que también sirve como texto alternativo) y, opcionalmente, guardar la firma para usarla nuevamente. +pdfjs-editor-add-signature-dialog-title = Añadir una firma + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Escribir + .title = Escribir +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Dibujar + .title = Dibujar +pdfjs-editor-add-signature-image-button = Imagen + .title = Imagen + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Escriba su firma + .placeholder = Escriba su firma +pdfjs-editor-add-signature-draw-placeholder = Dibuje su firma +pdfjs-editor-add-signature-draw-thickness-range-label = Grosor +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Grosor del dibujo: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Arrastre un archivo aquí para cargarlo +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] O seleccione archivos de imágenes + *[other] O seleccione archivos de imágenes + } + +## Controls + +pdfjs-editor-add-signature-description-label = Descripción (texto alternativo) +pdfjs-editor-add-signature-description-input = + .title = Descripción (texto alternativo) +pdfjs-editor-add-signature-description-default-when-drawing = Firma +pdfjs-editor-add-signature-clear-button-label = Borrar firma +pdfjs-editor-add-signature-clear-button = + .title = Borrar firma +pdfjs-editor-add-signature-save-checkbox = Guardar firma +pdfjs-editor-add-signature-save-warning-message = Ha alcanzado el límite de 5 firmas guardadas. Elimine una para guardar más. +pdfjs-editor-add-signature-image-upload-error-title = No se ha podido subir la imagen +pdfjs-editor-add-signature-image-upload-error-description = Compruebe su conexión de red o pruebe con otra imagen. +pdfjs-editor-add-signature-image-no-data-error-title = No se puede convertir esta imagen en una firma +pdfjs-editor-add-signature-image-no-data-error-description = Por favor, intente cargar una imagen diferente. +pdfjs-editor-add-signature-error-close-button = Cerrar + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Cancelar +pdfjs-editor-add-signature-add-button = Añadir +pdfjs-editor-edit-signature-update-button = Actualizar + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Editar comentario +pdfjs-editor-edit-comment-popup-button = + .title = Editar comentario +pdfjs-editor-delete-comment-popup-button-label = Eliminar comentario +pdfjs-editor-delete-comment-popup-button = + .title = Eliminar comentario +pdfjs-show-comment-button = + .title = Mostrar comentario + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Editar comentario +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Actualizar +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Añadir comentario +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Añadir +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Empezar a escribir… +pdfjs-editor-edit-comment-dialog-cancel-button = Cancelar + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Añadir comentario + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Alternar barra lateral (el documento contiene miniaturas/esquemas/adjuntos/capas) +pdfjs-toggle-views-manager-button1-label = Administrar páginas +pdfjs-views-manager-sidebar = + .aria-label = Barra lateral +pdfjs-views-manager-sidebar-resizer = + .aria-label = Redimensionador de la barra lateral +pdfjs-views-manager-view-selector-button = + .title = Vistas +pdfjs-views-manager-view-selector-button-label = Vistas +pdfjs-views-manager-pages-title = Páginas +pdfjs-views-manager-outlines-title1 = Esquema del documento + .title = Esquema del documento (doble-clic para expandir/contraer todos los elementos) +pdfjs-views-manager-attachments-title = Adjuntos +pdfjs-views-manager-layers-title1 = Capas + .title = Capas (doble clic para restablecer todas las capas a su estado predeterminado) +pdfjs-views-manager-pages-option-label = Páginas +pdfjs-views-manager-outlines-option-label = Esquema del documento +pdfjs-views-manager-attachments-option-label = Adjuntos +pdfjs-views-manager-layers-option-label = Capas +pdfjs-views-manager-add-file-button = + .title = Añadir archivo +pdfjs-views-manager-add-file-button-label = Añadir archivo +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } seleccionado + *[other] { $count } seleccionados + } +pdfjs-views-manager-pages-status-none-action-label = Seleccionar páginas +pdfjs-views-manager-pages-status-action-button-label = Administrar +pdfjs-views-manager-pages-status-copy-button-label = Copiar +pdfjs-views-manager-pages-status-cut-button-label = Cortar +pdfjs-views-manager-pages-status-delete-button-label = Eliminar +pdfjs-views-manager-pages-status-export-selected-button-label = Exportar selección… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 página cortada + *[other] { $count } páginas cortadas + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 página copiada + *[other] { $count } páginas cortadas + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 página eliminada + *[other] { $count } páginas eliminadas + } +pdfjs-views-manager-pages-status-waiting-ready-label = Preparando su archivo… +pdfjs-views-manager-pages-status-waiting-uploading-label = Subiendo el archivo… +pdfjs-views-manager-status-warning-cut-label = No se pudo cortar. Refresque la página y pruebe de nuevo. +pdfjs-views-manager-status-warning-copy-label = No se pudo copiar. Refresque la página y pruebe de nuevo. +pdfjs-views-manager-status-warning-delete-label = No se pudo cortar. Refresque la página y pruebe de nuevo. +pdfjs-views-manager-status-warning-save-label = No se pudo cortar. Refresque la página y pruebe de nuevo. +pdfjs-views-manager-status-undo-button-label = Deshacer +pdfjs-views-manager-status-done-button-label = Hecho +pdfjs-views-manager-status-close-button = + .title = Cerrar +pdfjs-views-manager-status-close-button-label = Cerrar +pdfjs-views-manager-paste-button-label = Pegar +pdfjs-views-manager-paste-button-before = + .title = Pegar antes de la primera página +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Pegar después de la página { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NUEVO +pdfjs-views-manager-waiting-for-file = Subiendo el archivo… +pdfjs-toggle-views-manager-button1 = + .title = Administrar páginas + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Eliminar firma guardada +pdfjs-editor-delete-signature-button-label1 = Eliminar firma guardada + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Editar descripción + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Editar descripción diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/es-MX/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/es-MX/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/es-MX/viewer.ftl 2026-01-20 14:08:39.366689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/es-MX/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -42,15 +42,15 @@ pdfjs-save-button = .title = Guardar pdfjs-save-button-label = Guardar +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Descargar +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Descargar pdfjs-bookmark-button = .title = Página actual (Ver URL de la página actual) pdfjs-bookmark-button-label = Página actual -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Abrir en la aplicación -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Abrir en la aplicación ## Secondary toolbar and context menu @@ -105,13 +105,13 @@ pdfjs-document-properties-file-name = Nombre del archivo: pdfjs-document-properties-file-size = Tamaño del archivo: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) pdfjs-document-properties-title = Título: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Asunto: @@ -119,9 +119,8 @@ pdfjs-document-properties-creation-date = Fecha de creación: pdfjs-document-properties-modification-date = Fecha de modificación: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Creador: pdfjs-document-properties-producer = Productor PDF: pdfjs-document-properties-version = Versión PDF: @@ -202,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniatura de la página { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Seleccionar página { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Página { $page } de { $total } ## Find panel button title and messages @@ -220,6 +228,21 @@ pdfjs-find-entire-word-checkbox-label = Palabras completas pdfjs-find-reached-top = Se alcanzó el inicio del documento, se buscará al final pdfjs-find-reached-bottom = Se alcanzó el final del documento, se buscará al inicio +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } de { $total } coincidencia + *[other] { $current } de { $total } coincidencias + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Más de { $limit } coincidencia + *[other] Más de { $limit } coincidencias + } pdfjs-find-not-found = No se encontró la frase ## Predefined zoom values @@ -249,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -260,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } anotación] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -273,27 +295,453 @@ pdfjs-editor-free-text-button = .title = Texto +pdfjs-editor-color-picker-free-text-input = + .title = Cambiar el color del texto pdfjs-editor-free-text-button-label = Texto pdfjs-editor-ink-button = .title = Dibujar +pdfjs-editor-color-picker-ink-input = + .title = Cambiar el color del dibujo pdfjs-editor-ink-button-label = Dibujar +pdfjs-editor-stamp-button = + .title = Agregar o editar imágenes +pdfjs-editor-stamp-button-label = Agregar o editar imágenes +pdfjs-editor-highlight-button = + .title = Destacar +pdfjs-editor-highlight-button-label = Destacar +pdfjs-highlight-floating-button1 = + .title = Destacados + .aria-label = Destacados +pdfjs-highlight-floating-button-label = Destacados +pdfjs-comment-floating-button = + .title = Comentario + .aria-label = Comentario +pdfjs-comment-floating-button-label = Comentario +pdfjs-editor-comment-button = + .title = Comentario + .aria-label = Comentario +pdfjs-editor-comment-button-label = Comentario +pdfjs-editor-signature-button = + .title = Agregar firma +pdfjs-editor-signature-button-label = Añadir firma + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Editor de destacados +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Editor de dibujos +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Editor de firmas: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Editor de imágenes + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Eliminar dibujo +pdfjs-editor-remove-freetext-button = + .title = Eliminar texto +pdfjs-editor-remove-stamp-button = + .title = Eliminar imagen +pdfjs-editor-remove-highlight-button = + .title = Eliminar destacado +pdfjs-editor-remove-signature-button = + .title = Eliminar firma + +## + # Editor Parameters pdfjs-editor-free-text-color-input = Color pdfjs-editor-free-text-size-input = Tamaño pdfjs-editor-ink-color-input = Color pdfjs-editor-ink-thickness-input = Grossor pdfjs-editor-ink-opacity-input = Opacidad -pdfjs-free-text = +pdfjs-editor-stamp-add-image-button = + .title = Agregar imagen +pdfjs-editor-stamp-add-image-button-label = Agregar imagen +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Espesor +pdfjs-editor-free-highlight-thickness-title = + .title = Cambiar el grosor al resaltar elementos que no sean texto +pdfjs-editor-add-signature-container = + .aria-label = Controles de firma y firmas guardadas +pdfjs-editor-signature-add-signature-button = + .title = Agregar nueva firma +pdfjs-editor-signature-add-signature-button-label = Agregar nueva firma +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Firma guardada: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Editor de texto -pdfjs-free-text-default-content = Empieza a escribir… -pdfjs-ink = - .aria-label = Editor de dibujo -pdfjs-ink-canvas = - .aria-label = Imagen creada por el usuario + .default-content = Comenzar a escribir… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Comentario + *[other] Comentarios + } +pdfjs-editor-comments-sidebar-close-button = + .title = Cerrar la barra lateral + .aria-label = Cerrar la barra lateral +pdfjs-editor-comments-sidebar-close-button-label = Cerrar la barra lateral +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = ¿Ves algo interesante? Resáltalo y deja un comentario. +pdfjs-editor-comments-sidebar-no-comments-link = Saber más ## Alt-text dialog +pdfjs-editor-alt-text-button-label = Texto alternativo +pdfjs-editor-alt-text-edit-button = + .aria-label = Editar texto alternativo +pdfjs-editor-alt-text-dialog-label = Elige una opción +pdfjs-editor-alt-text-dialog-description = El texto alternativo (texto alternativo) ayuda cuando las personas no pueden ver la imagen o cuando no se carga. +pdfjs-editor-alt-text-add-description-label = Añadir una descripción +pdfjs-editor-alt-text-add-description-description = Intente escribir 1 o 2 oraciones que describan el tema, el entorno o las acciones. +pdfjs-editor-alt-text-mark-decorative-label = Marcar como decorativo +pdfjs-editor-alt-text-mark-decorative-description = Se utiliza para imágenes ornamentales, como bordes o marcas de agua. +pdfjs-editor-alt-text-cancel-button = Cancelar +pdfjs-editor-alt-text-save-button = Guardar +pdfjs-editor-alt-text-decorative-tooltip = Marcado como decorativo +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Por ejemplo: “Un joven se sienta a la mesa a comer” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Texto alternativo ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. +pdfjs-editor-resizer-top-left = + .aria-label = Esquina superior izquierda — redimensionar +pdfjs-editor-resizer-top-middle = + .aria-label = Borde superior en el medio — redimensionar +pdfjs-editor-resizer-top-right = + .aria-label = Esquina superior derecha — redimensionar +pdfjs-editor-resizer-middle-right = + .aria-label = Borde derecho en el medio — redimensionar +pdfjs-editor-resizer-bottom-right = + .aria-label = Esquina inferior derecha — redimensionar +pdfjs-editor-resizer-bottom-middle = + .aria-label = Borde inferior en el medio — redimensionar +pdfjs-editor-resizer-bottom-left = + .aria-label = Esquina inferior izquierda — redimensionar +pdfjs-editor-resizer-middle-left = + .aria-label = Borde izquierdo en el medio — redimensionar + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Color de resaltado +pdfjs-editor-colorpicker-button = + .title = Cambiar color +pdfjs-editor-colorpicker-dropdown = + .aria-label = Opciones de color +pdfjs-editor-colorpicker-yellow = + .title = Amarillo +pdfjs-editor-colorpicker-green = + .title = Verde +pdfjs-editor-colorpicker-blue = + .title = Azul +pdfjs-editor-colorpicker-pink = + .title = Rosa +pdfjs-editor-colorpicker-red = + .title = Rojo + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Mostrar todo +pdfjs-editor-highlight-show-all-button = + .title = Mostrar todo + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descripción de la imagen) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Agregar texto alternativo (descripción de la imagen) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Escribe tu descripción aquí… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Breve descripción para las personas que no pueden ver la imagen o cuando la imagen no se carga. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo fue creado automáticamente y puede ser inexacto. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Saber más +pdfjs-editor-new-alt-text-create-automatically-button-label = Crear texto alternativo automáticamente +pdfjs-editor-new-alt-text-not-now-button = Ahora no +pdfjs-editor-new-alt-text-error-title = No se pudo crear el texto alternativo automáticamente +pdfjs-editor-new-alt-text-error-description = Escribe tu propio texto alternativo o inténtalo de nuevo más tarde. +pdfjs-editor-new-alt-text-error-close-button = Cerrar +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Descargando el modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) + .aria-valuetext = Descargando el modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Se agregó el texto alternativo +pdfjs-editor-new-alt-text-added-button-label = Se agregó el texto alternativo +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Falta el texto alternativo +pdfjs-editor-new-alt-text-missing-button-label = Falta texto alternativo +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Revisar el texto alternativo +pdfjs-editor-new-alt-text-to-review-button-label = Revisar el texto alternativo +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creado automáticamente: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Ajustes del texto alternativo de la imagen +pdfjs-image-alt-text-settings-button-label = Ajustes del texto alternativo de la imagen +pdfjs-editor-alt-text-settings-dialog-label = Ajustes del texto alternativo de la imagen +pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo automático +pdfjs-editor-alt-text-settings-create-model-button-label = Crear texto alternativo automáticamente +pdfjs-editor-alt-text-settings-create-model-description = Sugiere descripciones para ayudar a las personas que no pueden ver la imagen o cuando la imagen no se carga. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modelo de IA de texto alternativo ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Se ejecuta localmente en el dispositivo para que los datos se mantengan privados. Requerido para texto alternativo automático. +pdfjs-editor-alt-text-settings-delete-model-button = Eliminar +pdfjs-editor-alt-text-settings-download-model-button = Descargar +pdfjs-editor-alt-text-settings-downloading-model-button = Descargando… +pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar el editor de texto alternativo inmediatamente al añadir una imagen +pdfjs-editor-alt-text-settings-show-dialog-description = Te ayuda a asegurarte de que todas tus imágenes tengan texto alternativo. +pdfjs-editor-alt-text-settings-close-button = Cerrar + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Destacado añadido +pdfjs-editor-freetext-added-alert = Texto agregado +pdfjs-editor-ink-added-alert = Dibujo agregado +pdfjs-editor-stamp-added-alert = Imagen agregada +pdfjs-editor-signature-added-alert = Firma agregada + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Resaltado eliminado +pdfjs-editor-undo-bar-message-freetext = Texto eliminado +pdfjs-editor-undo-bar-message-ink = Dibujo eliminado +pdfjs-editor-undo-bar-message-stamp = Imagen eliminada +pdfjs-editor-undo-bar-message-signature = Firma eliminada +pdfjs-editor-undo-bar-message-comment = Comentario eliminado +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } anotación eliminada + *[other] { $count } anotaciones eliminadas + } +pdfjs-editor-undo-bar-undo-button = + .title = Deshacer +pdfjs-editor-undo-bar-undo-button-label = Deshacer +pdfjs-editor-undo-bar-close-button = + .title = Cerrar +pdfjs-editor-undo-bar-close-button-label = Cerrar + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Este modal permite al usuario crear una firma para añadirla a un documento PDF. El usuario puede editar el nombre (que también sirve como texto alternativo) y, opcionalmente, guardar la firma para utilizarla en otras ocasiones. +pdfjs-editor-add-signature-dialog-title = Agregar una firma + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Tipo + .title = Tipo +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Dibujar + .title = Dibujar +pdfjs-editor-add-signature-image-button = Imagen + .title = Imagen + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Escribe tu firma + .placeholder = Escribe tu firma +pdfjs-editor-add-signature-draw-placeholder = Dibuja tu firma +pdfjs-editor-add-signature-draw-thickness-range-label = Grossor +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Grosor del dibujo: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Arrastra un archivo aquí para cargarlo +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] O elegir archivos de imagen + *[other] O buscar archivos de imagen + } + +## Controls + +pdfjs-editor-add-signature-description-label = Descripción (texto alternativo) +pdfjs-editor-add-signature-description-input = + .title = Descripción (texto alternativo) +pdfjs-editor-add-signature-description-default-when-drawing = Firma +pdfjs-editor-add-signature-clear-button-label = Limpiar firma +pdfjs-editor-add-signature-clear-button = + .title = Limpiar firma +pdfjs-editor-add-signature-save-checkbox = Guardar firma +pdfjs-editor-add-signature-save-warning-message = Has alcanzado el límite de 5 firmas guardadas. Elimina una para guardar más. +pdfjs-editor-add-signature-image-upload-error-title = No se pudo cargar la imagen +pdfjs-editor-add-signature-image-upload-error-description = Verifica tu conexión de red o prueba con otra imagen. +pdfjs-editor-add-signature-image-no-data-error-title = No se puede convertir esta imagen en una firma +pdfjs-editor-add-signature-image-no-data-error-description = Intenta cargar una imagen diferente. +pdfjs-editor-add-signature-error-close-button = Cerrar + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Cancelar +pdfjs-editor-add-signature-add-button = Agregar +pdfjs-editor-edit-signature-update-button = Actualizar + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Editar comentario +pdfjs-editor-edit-comment-popup-button = + .title = Editar comentario +pdfjs-editor-delete-comment-popup-button-label = Eliminar comentario +pdfjs-editor-delete-comment-popup-button = + .title = Eliminar comentario +pdfjs-show-comment-button = + .title = Mostrar comentario + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Editar comentario +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Actualizar +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Agregar comentario +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Agregar +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Empieza a escribir… +pdfjs-editor-edit-comment-dialog-cancel-button = Cancelar + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Añadir comentario + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Cambiar barra lateral (índice de contenidos del documento/miniaturas/adjuntos/capas) +pdfjs-toggle-views-manager-button1-label = Administrar páginas +pdfjs-views-manager-sidebar = + .aria-label = Barra lateral +pdfjs-views-manager-sidebar-resizer = + .aria-label = Cambiar tamaño de la barra lateral +pdfjs-views-manager-view-selector-button = + .title = Vistas +pdfjs-views-manager-view-selector-button-label = Vistas +pdfjs-views-manager-pages-title = Páginas +pdfjs-views-manager-outlines-title1 = Esquema del documento + .title = Esquema del documento (haz doble clic para expandir/contraer todos los elementos) +pdfjs-views-manager-attachments-title = Adjuntos +pdfjs-views-manager-layers-title1 = Capas + .title = Capas (haz doble clic para restablecer todas las capas a su estado predeterminado) +pdfjs-views-manager-pages-option-label = Páginas +pdfjs-views-manager-outlines-option-label = Esquema del documento +pdfjs-views-manager-attachments-option-label = Adjuntos +pdfjs-views-manager-layers-option-label = Capas +pdfjs-views-manager-add-file-button = + .title = Agregar archivo +pdfjs-views-manager-add-file-button-label = Agregar archivo +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } seleccionado + *[other] { $count } seleccionados + } +pdfjs-views-manager-pages-status-none-action-label = Seleccionar páginas +pdfjs-views-manager-pages-status-action-button-label = Administrar +pdfjs-views-manager-pages-status-copy-button-label = Copiar +pdfjs-views-manager-pages-status-cut-button-label = Cortar +pdfjs-views-manager-pages-status-delete-button-label = Eliminar +pdfjs-views-manager-pages-status-export-selected-button-label = Exportar seleccionado… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 página cortada + *[other] { $count } páginas cortadas + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 pagina copiada + *[other] { $count } paginas copiadas + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 pagina eliminada + *[other] { $count } paginas eliminadas + } +pdfjs-views-manager-pages-status-waiting-ready-label = Preparando tu archivo… +pdfjs-views-manager-pages-status-waiting-uploading-label = Subiendo archivo… +pdfjs-views-manager-status-warning-cut-label = No se pudo cortar. Actualiza la página y vuelve a intentarlo. +pdfjs-views-manager-status-warning-copy-label = No se pudo pegar. Actualiza la página y vuelve a intentarlo. +pdfjs-views-manager-status-warning-delete-label = No se pudo eliminar. Actualiza la página y vuelve a intentarlo. +pdfjs-views-manager-status-warning-save-label = No se pudo guardar. Actualiza la página y vuelve a intentarlo. +pdfjs-views-manager-status-undo-button-label = Deshacer +pdfjs-views-manager-status-done-button-label = Hecho +pdfjs-views-manager-status-close-button = + .title = Cerrar +pdfjs-views-manager-status-close-button-label = Cerrar +pdfjs-views-manager-paste-button-label = Pegar +pdfjs-views-manager-paste-button-before = + .title = Pegar antes de la primera página +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Pegar después de la página { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NUEVO +pdfjs-views-manager-waiting-for-file = Subiendo archivo… +pdfjs-toggle-views-manager-button1 = + .title = Administrar páginas + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Eliminar la firma guardada +pdfjs-editor-delete-signature-button-label1 = Eliminar la firma guardada + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Editar descripción + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Editar descripción diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/et/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/et/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/et/viewer.ftl 2026-01-20 14:08:39.366689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/et/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -92,24 +92,12 @@ pdfjs-document-properties-button-label = Dokumendi omadused… pdfjs-document-properties-file-name = Faili nimi: pdfjs-document-properties-file-size = Faili suurus: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KiB ({ $size_b } baiti) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MiB ({ $size_b } baiti) pdfjs-document-properties-title = Pealkiri: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Teema: pdfjs-document-properties-keywords = Märksõnad: pdfjs-document-properties-creation-date = Loodud: pdfjs-document-properties-modification-date = Muudetud: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date } { $time } pdfjs-document-properties-creator = Looja: pdfjs-document-properties-producer = Generaator: pdfjs-document-properties-version = Generaatori versioon: @@ -237,10 +225,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date } { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -257,12 +241,6 @@ pdfjs-password-cancel-button = Loobu pdfjs-web-fonts-disabled = Veebifondid on keelatud: PDFiga kaasatud fonte pole võimalik kasutada. -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. +## Image alt-text settings +pdfjs-editor-alt-text-settings-delete-model-button = Kustuta diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/eu/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/eu/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/eu/viewer.ftl 2026-01-20 14:08:39.366689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/eu/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -21,7 +21,7 @@ # Variables: # $pageNumber (Number) - the currently visible page # $pagesCount (Number) - the total number of pages in the document -pdfjs-page-of-pages = { $pagesCount }/{ $pageNumber } +pdfjs-page-of-pages = ({ $pageNumber } / { $pagesCount }) pdfjs-zoom-out-button = .title = Urrundu zooma pdfjs-zoom-out-button-label = Urrundu zooma @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Uneko orria (ikusi uneko orriaren URLa) pdfjs-bookmark-button-label = Uneko orria -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Ireki aplikazioan -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Ireki aplikazioan ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Fitxategi-izena: pdfjs-document-properties-file-size = Fitxategiaren tamaina: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } byte) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byte) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } byte) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte) pdfjs-document-properties-title = Izenburua: pdfjs-document-properties-author = Egilea: pdfjs-document-properties-subject = Gaia: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Sortze-data: pdfjs-document-properties-modification-date = Aldatze-data: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Sortzailea: pdfjs-document-properties-producer = PDFaren ekoizlea: pdfjs-document-properties-version = PDF bertsioa: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = { $page }. orriaren koadro txikia +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Hautatu { $page } orria +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = { $page } / { $total } orria ## Find panel button title and messages @@ -231,8 +233,8 @@ # $total (Number) - the total number of matches in the document pdfjs-find-match-count = { $total -> - [one] { $total }/{ $current }. bat-etortzea - *[other] { $total }/{ $current }. bat-etortzea + [one] { $current }/{ $total } bat-etortzea + *[other] { $current }/{ $total } bat-etortzea } # Variables: # $limit (Number) - the maximum number of matches @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } ohartarazpena] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Testua +pdfjs-editor-color-picker-free-text-input = + .title = Aldatu testuaren kolorea pdfjs-editor-free-text-button-label = Testua pdfjs-editor-ink-button = .title = Marrazkia +pdfjs-editor-color-picker-ink-input = + .title = Aldatu marrazteko kolorea pdfjs-editor-ink-button-label = Marrazkia pdfjs-editor-stamp-button = .title = Gehitu edo editatu irudiak @@ -304,12 +309,37 @@ pdfjs-editor-highlight-button = .title = Nabarmendu pdfjs-editor-highlight-button-label = Nabarmendu -pdfjs-highlight-floating-button = - .title = Nabarmendu pdfjs-highlight-floating-button1 = .title = Nabarmendu .aria-label = Nabarmendu pdfjs-highlight-floating-button-label = Nabarmendu +pdfjs-comment-floating-button = + .title = Iruzkina + .aria-label = Iruzkina +pdfjs-comment-floating-button-label = Iruzkina +pdfjs-editor-comment-button = + .title = Iruzkina + .aria-label = Iruzkina +pdfjs-editor-comment-button-label = Iruzkina +pdfjs-editor-signature-button = + .title = Gehitu sinadura +pdfjs-editor-signature-button-label = Gehitu sinadura + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Nabarmendutakoen editorea +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Marrazkien editorea +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Sinaduren editorea: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Irudien editorea ## Remove button for the various kind of editor. @@ -321,6 +351,8 @@ .title = Kendu irudia pdfjs-editor-remove-highlight-button = .title = Kendu nabarmentzea +pdfjs-editor-remove-signature-button = + .title = Kendu sinadura ## @@ -337,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Loditasuna pdfjs-editor-free-highlight-thickness-title = .title = Aldatu loditasuna testua ez beste elementuak nabarmentzean -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Sinaduren kontrolak eta gordetako sinadurak +pdfjs-editor-signature-add-signature-button = + .title = Gehitu sinadura berria +pdfjs-editor-signature-add-signature-button-label = Gehitu sinadura berria +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Gordetako sinadura: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Testu-editorea -pdfjs-free-text-default-content = Hasi idazten… -pdfjs-ink = - .aria-label = Marrazki-editorea -pdfjs-ink-canvas = - .aria-label = Erabiltzaileak sortutako irudia + .default-content = Hasi idazten… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Iruzkina + *[other] Iruzkinak + } +pdfjs-editor-comments-sidebar-close-button = + .title = Itxi alboko barra + .aria-label = Itxi alboko barra +pdfjs-editor-comments-sidebar-close-button-label = Itxi alboko barra +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Azpimarratzeko zerbait ikusi duzu? Nabarmen ezazu eta utzi iruzkina. +pdfjs-editor-comments-sidebar-no-comments-link = Argibide gehiago ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Testu alternatiboa -pdfjs-editor-alt-text-edit-button-label = Editatu testu alternatiboa +pdfjs-editor-alt-text-edit-button = + .aria-label = Editatu testu alternatiboa pdfjs-editor-alt-text-dialog-label = Aukeratu aukera pdfjs-editor-alt-text-dialog-description = Testu alternatiboak laguntzen du jendeak ezin duenean irudia ikusi edo ez denean kargatzen. pdfjs-editor-alt-text-add-description-label = Gehitu azalpena @@ -362,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Adibidez, "gizon gaztea mahaian eserita dago bazkaltzeko" +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Testu alternatiboa ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Goiko ezkerreko izkina — aldatu tamaina -pdfjs-editor-resizer-label-top-middle = Goian erdian — aldatu tamaina -pdfjs-editor-resizer-label-top-right = Goiko eskuineko izkina — aldatu tamaina -pdfjs-editor-resizer-label-middle-right = Erdian eskuinean — aldatu tamaina -pdfjs-editor-resizer-label-bottom-right = Beheko eskuineko izkina — aldatu tamaina -pdfjs-editor-resizer-label-bottom-middle = Behean erdian — aldatu tamaina -pdfjs-editor-resizer-label-bottom-left = Beheko ezkerreko izkina — aldatu tamaina -pdfjs-editor-resizer-label-middle-left = Erdian ezkerrean — aldatu tamaina +pdfjs-editor-resizer-top-left = + .aria-label = Goiko ezkerreko izkina — aldatu tamaina +pdfjs-editor-resizer-top-middle = + .aria-label = Goian erdian — aldatu tamaina +pdfjs-editor-resizer-top-right = + .aria-label = Goiko eskuineko izkina — aldatu tamaina +pdfjs-editor-resizer-middle-right = + .aria-label = Erdian eskuinean — aldatu tamaina +pdfjs-editor-resizer-bottom-right = + .aria-label = Beheko eskuineko izkina — aldatu tamaina +pdfjs-editor-resizer-bottom-middle = + .aria-label = Behean erdian — aldatu tamaina +pdfjs-editor-resizer-bottom-left = + .aria-label = Beheko ezkerreko izkina — aldatu tamaina +pdfjs-editor-resizer-middle-left = + .aria-label = Erdian ezkerrean — aldatu tamaina ## Color picker @@ -400,3 +465,287 @@ pdfjs-editor-highlight-show-all-button-label = Erakutsi denak pdfjs-editor-highlight-show-all-button = .title = Erakutsi denak + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Editatu testu alternatiboa (irudiaren azalpena) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Gehitu testu alternatiboa (irudiaren azalpena) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Idatzi zure azalpena hemen… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Azalpen laburra irudia ikusi ezin duen jendearentzat edo irudia kargatu ezin denerako. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Testu alternatibo hau automatikoki sortu da eta okerra izan liteke. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Argibide gehiago +pdfjs-editor-new-alt-text-create-automatically-button-label = Sortu testu alternatiboa automatikoki +pdfjs-editor-new-alt-text-not-now-button = Une honetan ez +pdfjs-editor-new-alt-text-error-title = Ezin da testu alternatiboa automatikoki sortu +pdfjs-editor-new-alt-text-error-description = Idatzi zure testu alternatibo propioa edo saiatu berriro geroago. +pdfjs-editor-new-alt-text-error-close-button = Itxi +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Testu alternatiboaren AA modeloa deskargatzen ({ $downloadedSize }/{ $totalSize } MB) + .aria-valuetext = Testu alternatiboaren AA modeloa deskargatzen ({ $downloadedSize }/{ $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Testu alternatiboa gehituta +pdfjs-editor-new-alt-text-added-button-label = Testu alternatiboa gehituta +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Testu alternatiboa falta da +pdfjs-editor-new-alt-text-missing-button-label = Testu alternatiboa falta da +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Berrikusi testu alternatiboa +pdfjs-editor-new-alt-text-to-review-button-label = Berrikusi testu alternatiboa +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automatikoki sortua: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Irudiaren testu alternatiboaren ezarpenak +pdfjs-image-alt-text-settings-button-label = Irudiaren testu alternatiboaren ezarpenak +pdfjs-editor-alt-text-settings-dialog-label = Irudiaren testu alternatiboaren ezarpenak +pdfjs-editor-alt-text-settings-automatic-title = Testu alternatibo automatikoa +pdfjs-editor-alt-text-settings-create-model-button-label = Sortu testu alternatiboa automatikoki +pdfjs-editor-alt-text-settings-create-model-description = Azalpenak iradokitzen ditu irudia ikusi ezin duen jendearentzat edo irudia kargatu ezin denerako. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Testu alternatiboaren AA modeloa ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Zure gailuan modu lokalean exekutatzen da eta zure datuak pribatu mantentzen dira. Testu alternatibo automatikorako beharrezkoa. +pdfjs-editor-alt-text-settings-delete-model-button = Ezabatu +pdfjs-editor-alt-text-settings-download-model-button = Deskargatu +pdfjs-editor-alt-text-settings-downloading-model-button = Deskargatzen… +pdfjs-editor-alt-text-settings-editor-title = Testu alternatiboaren editorea +pdfjs-editor-alt-text-settings-show-dialog-button-label = Erakutsi testu alternatiboa irudi bat gehitzean berehala +pdfjs-editor-alt-text-settings-show-dialog-description = Zure irudiek testu alternatiboa duela ziurtatzen laguntzen dizu. +pdfjs-editor-alt-text-settings-close-button = Itxi + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Nabarmentzea gehituta +pdfjs-editor-freetext-added-alert = Testua gehituta +pdfjs-editor-ink-added-alert = Marrazkia gehituta +pdfjs-editor-stamp-added-alert = Irudia gehituta +pdfjs-editor-signature-added-alert = Sinadura gehituta + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Nabarmentzea kenduta +pdfjs-editor-undo-bar-message-freetext = Testua kenduta +pdfjs-editor-undo-bar-message-ink = Marrazkia kenduta +pdfjs-editor-undo-bar-message-stamp = Irudia kenduta +pdfjs-editor-undo-bar-message-signature = Sinadura kenduta +pdfjs-editor-undo-bar-message-comment = Iruzkina kenduta +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] Esku-ohar bat kenduta + *[other] { $count } esku-ohar kenduta + } +pdfjs-editor-undo-bar-undo-button = + .title = Desegin +pdfjs-editor-undo-bar-undo-button-label = Desegin +pdfjs-editor-undo-bar-close-button = + .title = Itxi +pdfjs-editor-undo-bar-close-button-label = Itxi + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = + Leiho modal honek PDF dokumentu batera gehitzeko sinadurak + sortzea ahalbidetzen dio erabiltzaileari. Erabiltzaileak izena edita + dezake (testu alternatibo modura ere erabiltzen dena) eta sinadura + gordetzeko aukera du gehiagotan erabili ahal izateko. +pdfjs-editor-add-signature-dialog-title = Gehitu sinadura + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Idatzi + .title = Idatzi +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Marraztu + .title = Marraztu +pdfjs-editor-add-signature-image-button = Irudia + .title = Irudia + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Idatzi zure sinadura + .placeholder = Idatzi zure sinadura +pdfjs-editor-add-signature-draw-placeholder = Marraztu zure sinadura +pdfjs-editor-add-signature-draw-thickness-range-label = Loditasuna +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Marrazteko loditasuna: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Igotzeko, jaregin fitxategia hemen +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Edo aukeratu irudi-fitxategiak + *[other] Edo arakatu irudi-fitxategiak + } + +## Controls + +pdfjs-editor-add-signature-description-label = Azalpena (testu alternatiboa) +pdfjs-editor-add-signature-description-input = + .title = Azalpena (testu alternatiboa) +pdfjs-editor-add-signature-description-default-when-drawing = Sinadura +pdfjs-editor-add-signature-clear-button-label = Garbitu sinadura +pdfjs-editor-add-signature-clear-button = + .title = Garbitu sinadura +pdfjs-editor-add-signature-save-checkbox = Gorde sinadura +pdfjs-editor-add-signature-save-warning-message = Gordetako sinadura kopuruaren mugara heldu zara (5). Gehiago gorde ahal izateko, ken ezazu bat. +pdfjs-editor-add-signature-image-upload-error-title = Ezin da irudia igo +pdfjs-editor-add-signature-image-upload-error-description = Egiaztatu zure sareko konexioa edo saiatu beste irudi batekin. +pdfjs-editor-add-signature-image-no-data-error-title = Ezin da irudia sinaduran bihurtu +pdfjs-editor-add-signature-image-no-data-error-description = Saiatu beste irudi bat igotzen. +pdfjs-editor-add-signature-error-close-button = Itxi + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Utzi +pdfjs-editor-add-signature-add-button = Gehitu +pdfjs-editor-edit-signature-update-button = Eguneratu + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Editatu iruzkina +pdfjs-editor-edit-comment-popup-button = + .title = Editatu iruzkina +pdfjs-editor-delete-comment-popup-button-label = Kendu iruzkina +pdfjs-editor-delete-comment-popup-button = + .title = Kendu iruzkina +pdfjs-show-comment-button = + .title = Erakutsi iruzkina + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Editatu iruzkina +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Eguneratu +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Gehitu iruzkina +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Gehitu +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Hasi idazten… +pdfjs-editor-edit-comment-dialog-cancel-button = Utzi + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Gehitu iruzkina + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Txandakatu alboko barra (dokumentuak koadro txikiak/eskema/eranskinak/geruzak ditu) +pdfjs-toggle-views-manager-button1-label = Kudeatu orriak +pdfjs-views-manager-sidebar = + .aria-label = Alboko barra +pdfjs-views-manager-sidebar-resizer = + .aria-label = Alboko barra neurriz aldatzekoa +pdfjs-views-manager-view-selector-button = + .title = Ikuspegiak +pdfjs-views-manager-view-selector-button-label = Ikuspegiak +pdfjs-views-manager-pages-title = Orriak +pdfjs-views-manager-outlines-title1 = Dokumentuaren eskema + .title = Dokumentuaren eskema (klik bikoitza elementu guztiak zabaltzeko/tolesteko) +pdfjs-views-manager-attachments-title = Eranskinak +pdfjs-views-manager-layers-title1 = Geruzak + .title = Geruzak (klik bikoitza geruza guztiak egoera lehenetsira berrezartzeko) +pdfjs-views-manager-pages-option-label = Orriak +pdfjs-views-manager-outlines-option-label = Dokumentuaren eskema +pdfjs-views-manager-attachments-option-label = Eranskinak +pdfjs-views-manager-layers-option-label = Geruzak +pdfjs-views-manager-add-file-button = + .title = Gehitu fitxategia +pdfjs-views-manager-add-file-button-label = Gehitu fitxategia +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } hautatuta + *[other] { $count } hautatuta + } +pdfjs-views-manager-pages-status-none-action-label = Hautatu orriak +pdfjs-views-manager-pages-status-action-button-label = Kudeatu +pdfjs-views-manager-pages-status-copy-button-label = Kopiatu +pdfjs-views-manager-pages-status-cut-button-label = Ebaki +pdfjs-views-manager-pages-status-delete-button-label = Ezabatu +pdfjs-views-manager-pages-status-export-selected-button-label = Esportatu hautatutakoa… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] Orri bat moztuta + *[other] { $count } orri moztuta + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] Orri bat kopiatuta + *[other] { $count } orri kopiatuta + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] Orri bat ezabatuta + *[other] { $count } orri ezabatuta + } +pdfjs-views-manager-pages-status-waiting-ready-label = Zuee fitxategia prestatzen… +pdfjs-views-manager-pages-status-waiting-uploading-label = Fitxategia igotzen… +pdfjs-views-manager-status-warning-cut-label = Ezin da moztu. Berritu orria eta saiatu berriro. +pdfjs-views-manager-status-warning-copy-label = Ezin da kopiatu. Berritu orria eta saiatu berriro. +pdfjs-views-manager-status-warning-delete-label = Ezin da ezabatu. Berritu orria eta saiatu berriro. +pdfjs-views-manager-status-warning-save-label = Ezin da gorde. Berritu orria eta saiatu berriro. +pdfjs-views-manager-status-undo-button-label = Desegin +pdfjs-views-manager-status-done-button-label = Eginda +pdfjs-views-manager-status-close-button = + .title = Itxi +pdfjs-views-manager-status-close-button-label = Itxi +pdfjs-views-manager-paste-button-label = Itsatsi +pdfjs-views-manager-paste-button-before = + .title = Itsatsi lehen orriaren aurretik +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Itsatsi { $page }. orriaren aurretik +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = BERRIA +pdfjs-views-manager-waiting-for-file = Fitxategia igotzen… +pdfjs-toggle-views-manager-button1 = + .title = Kudeatu orriak + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Kendu gordetako sinadura +pdfjs-editor-delete-signature-button-label1 = Kendu gordetako sinadura + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Editatu azalpena + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Editatu azalpena diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/fa/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/fa/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/fa/viewer.ftl 2026-01-20 14:08:39.367689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/fa/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -39,7 +39,18 @@ pdfjs-print-button = .title = چاپ pdfjs-print-button-label = چاپ +pdfjs-save-button = + .title = ذخیره pdfjs-save-button-label = ذخیره +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = دریافت +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = دریافت +pdfjs-bookmark-button = + .title = صفحه فعلی (مشاهده نشانی اینترنتی از صفحه فعلی) +pdfjs-bookmark-button-label = صفحه فعلی ## Secondary toolbar and context menu @@ -64,28 +75,34 @@ pdfjs-cursor-hand-tool-button = .title = فعال کردن ابزارِ دست pdfjs-cursor-hand-tool-button-label = ابزار دست +pdfjs-scroll-page-button = + .title = استفاده از پیمایش صفحه +pdfjs-scroll-page-button-label = پیمایش صفحه pdfjs-scroll-vertical-button = .title = استفاده از پیمایش عمودی pdfjs-scroll-vertical-button-label = پیمایش عمودی pdfjs-scroll-horizontal-button = .title = استفاده از پیمایش افقی pdfjs-scroll-horizontal-button-label = پیمایش افقی +pdfjs-spread-none-button = + .title = صفحات پیوسته را یکی نکنید +pdfjs-spread-none-button-label = بدون صفحات پیوسته ## Document properties dialog pdfjs-document-properties-button = .title = خصوصیات سند... pdfjs-document-properties-button-label = خصوصیات سند... -pdfjs-document-properties-file-name = نام فایل: +pdfjs-document-properties-file-name = نام پرونده: pdfjs-document-properties-file-size = حجم پرونده: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } کیلوبایت ({ $size_b } بایت) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } مگابایت ({ $size_b } بایت) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } کیلوبایت ({ $b } بایت) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } مگابایت ({ $b } بایت) pdfjs-document-properties-title = عنوان: pdfjs-document-properties-author = نویسنده: pdfjs-document-properties-subject = موضوع: @@ -93,9 +110,8 @@ pdfjs-document-properties-creation-date = تاریخ ایجاد: pdfjs-document-properties-modification-date = تاریخ ویرایش: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }، { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = ایجاد کننده: pdfjs-document-properties-producer = ایجاد کننده PDF: pdfjs-document-properties-version = نسخه PDF: @@ -216,6 +232,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } Annotation] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -233,14 +252,71 @@ pdfjs-editor-ink-button = .title = کشیدن pdfjs-editor-ink-button-label = کشیدن +pdfjs-editor-stamp-button = + .title = افزودن یا ویرایش تصاویر +pdfjs-editor-stamp-button-label = افزودن یا ویرایش تصاویر +pdfjs-editor-highlight-button = + .title = برجسته کردن +pdfjs-editor-highlight-button-label = برجسته کردن +pdfjs-highlight-floating-button1 = + .title = برجسته کردن + .aria-label = برجسته کردن +pdfjs-highlight-floating-button-label = برجسته کردن + +## + # Editor Parameters pdfjs-editor-free-text-color-input = رنگ pdfjs-editor-free-text-size-input = اندازه pdfjs-editor-ink-color-input = رنگ +pdfjs-editor-stamp-add-image-button = + .title = افزودن تصویر +pdfjs-editor-stamp-add-image-button-label = افزودن تصویر +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = ویرایشگر متن + .default-content = شروع به نوشتن کنید… ## Alt-text dialog - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - +pdfjs-editor-alt-text-add-description-label = افزودن توضیحات +pdfjs-editor-alt-text-cancel-button = انصراف +pdfjs-editor-alt-text-save-button = ذخیره + +## Color picker + +pdfjs-editor-colorpicker-button = + .title = تغییر رنگ +pdfjs-editor-colorpicker-dropdown = + .aria-label = انتخاب رنگ +pdfjs-editor-colorpicker-yellow = + .title = زرد +pdfjs-editor-colorpicker-green = + .title = سبز +pdfjs-editor-colorpicker-blue = + .title = آبی +pdfjs-editor-colorpicker-pink = + .title = صورتی +pdfjs-editor-colorpicker-red = + .title = قرمز + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = نمایش همه +pdfjs-editor-highlight-show-all-button = + .title = نمایش همه + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = بیشتر بدانید +pdfjs-editor-new-alt-text-not-now-button = اکنون نه +pdfjs-editor-new-alt-text-error-close-button = بستن + +## Image alt-text settings + +pdfjs-editor-alt-text-settings-delete-model-button = حذف +pdfjs-editor-alt-text-settings-download-model-button = دریافت +pdfjs-editor-alt-text-settings-downloading-model-button = در حال دریافت… +pdfjs-editor-alt-text-settings-close-button = بستن diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ff/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ff/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ff/viewer.ftl 2026-01-20 14:08:39.367689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ff/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -89,24 +89,12 @@ pdfjs-document-properties-button-label = Keeroraaɗi Winndannde… pdfjs-document-properties-file-name = Innde fiilde: pdfjs-document-properties-file-size = Ɓetol fiilde: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bite) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bite) pdfjs-document-properties-title = Tiitoonde: pdfjs-document-properties-author = Binnduɗo: pdfjs-document-properties-subject = Toɓɓere: pdfjs-document-properties-keywords = Kelmekele jiytirɗe: pdfjs-document-properties-creation-date = Ñalnde Sosaa: pdfjs-document-properties-modification-date = Ñalnde Waylaa: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Cosɗo: pdfjs-document-properties-producer = Paggiiɗo PDF: pdfjs-document-properties-version = Yamre PDF: @@ -207,9 +195,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = Juumre waɗii tuma nde loowata PDF oo. @@ -235,13 +220,3 @@ pdfjs-password-ok-button = OK pdfjs-password-cancel-button = Haaytu pdfjs-web-fonts-disabled = Ponte geese ko daaƴaaɗe: horiima huutoraade ponte PDF coomtoraaɗe. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/fi/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/fi/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/fi/viewer.ftl 2026-01-20 14:08:39.367689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/fi/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Nykyinen sivu (Näytä URL-osoite nykyiseltä sivulta) pdfjs-bookmark-button-label = Nykyinen sivu -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Avaa sovelluksessa -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Avaa sovelluksessa ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Tiedoston nimi: pdfjs-document-properties-file-size = Tiedoston koko: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } kt ({ $size_b } tavua) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } Mt ({ $size_b } tavua) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kt ({ $b } tavua) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } Mt ({ $b } tavua) pdfjs-document-properties-title = Otsikko: pdfjs-document-properties-author = Tekijä: pdfjs-document-properties-subject = Aihe: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Luomispäivämäärä: pdfjs-document-properties-modification-date = Muokkauspäivämäärä: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Luoja: pdfjs-document-properties-producer = PDF-tuottaja: pdfjs-document-properties-version = PDF-versio: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Pienoiskuva sivusta { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Valitse sivu { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Sivu { $page }/{ $total } ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type }-merkintä] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Teksti +pdfjs-editor-color-picker-free-text-input = + .title = Muuta tekstin väriä pdfjs-editor-free-text-button-label = Teksti pdfjs-editor-ink-button = .title = Piirros +pdfjs-editor-color-picker-ink-input = + .title = Vaihda piirustuksen väriä pdfjs-editor-ink-button-label = Piirros pdfjs-editor-stamp-button = .title = Lisää tai muokkaa kuvia @@ -304,12 +309,37 @@ pdfjs-editor-highlight-button = .title = Korostus pdfjs-editor-highlight-button-label = Korostus -pdfjs-highlight-floating-button = - .title = Korostus pdfjs-highlight-floating-button1 = .title = Korostus .aria-label = Korostus pdfjs-highlight-floating-button-label = Korostus +pdfjs-comment-floating-button = + .title = Kommentti + .aria-label = Kommentti +pdfjs-comment-floating-button-label = Kommentti +pdfjs-editor-comment-button = + .title = Kommentti + .aria-label = Kommentti +pdfjs-editor-comment-button-label = Kommentti +pdfjs-editor-signature-button = + .title = Lisää allekirjoitus +pdfjs-editor-signature-button-label = Lisää allekirjoitus + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Korostusmuokkain +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Piirustusmuokkain +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Allekirjoituksen muokkain: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Kuvamuokkain ## Remove button for the various kind of editor. @@ -321,6 +351,8 @@ .title = Poista kuva pdfjs-editor-remove-highlight-button = .title = Poista korostus +pdfjs-editor-remove-signature-button = + .title = Poista allekirjoitus ## @@ -337,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Paksuus pdfjs-editor-free-highlight-thickness-title = .title = Muuta paksuutta korostaessasi muita kohteita kuin tekstiä -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Allekirjoitussäätimet ja tallennetut allekirjoitukset +pdfjs-editor-signature-add-signature-button = + .title = Lisää uusi allekirjoitus +pdfjs-editor-signature-add-signature-button-label = Lisää uusi allekirjoitus +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Tallennettu allekirjoitus: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Tekstimuokkain -pdfjs-free-text-default-content = Aloita kirjoittaminen… -pdfjs-ink = - .aria-label = Piirrustusmuokkain -pdfjs-ink-canvas = - .aria-label = Käyttäjän luoma kuva + .default-content = Aloita kirjoittaminen… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Kommentti + *[other] Kommenttia + } +pdfjs-editor-comments-sidebar-close-button = + .title = Sulje sivupaneeli + .aria-label = Sulje sivupaneeli +pdfjs-editor-comments-sidebar-close-button-label = Sulje sivupaneeli +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Näetkö jotain huomionarvoista? Korosta se ja jätä kommentti. +pdfjs-editor-comments-sidebar-no-comments-link = Lue lisää ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Vaihtoehtoinen teksti -pdfjs-editor-alt-text-edit-button-label = Muokkaa vaihtoehtoista tekstiä +pdfjs-editor-alt-text-edit-button = + .aria-label = Muokkaa vaihtoehtoista tekstiä pdfjs-editor-alt-text-dialog-label = Valitse vaihtoehto pdfjs-editor-alt-text-dialog-description = Vaihtoehtoinen teksti ("alt-teksti") auttaa ihmisiä, jotka eivät näe kuvaa tai kun kuva ei lataudu. pdfjs-editor-alt-text-add-description-label = Lisää kuvaus @@ -362,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Esimerkiksi "Nuori mies istuu pöytään syömään aterian" +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Vaihtoehtoinen teksti ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Vasen yläkulma - muuta kokoa -pdfjs-editor-resizer-label-top-middle = Ylhäällä keskellä - muuta kokoa -pdfjs-editor-resizer-label-top-right = Oikea yläkulma - muuta kokoa -pdfjs-editor-resizer-label-middle-right = Keskellä oikealla - muuta kokoa -pdfjs-editor-resizer-label-bottom-right = Oikea alakulma - muuta kokoa -pdfjs-editor-resizer-label-bottom-middle = Alhaalla keskellä - muuta kokoa -pdfjs-editor-resizer-label-bottom-left = Vasen alakulma - muuta kokoa -pdfjs-editor-resizer-label-middle-left = Keskellä vasemmalla - muuta kokoa +pdfjs-editor-resizer-top-left = + .aria-label = Vasen yläkulma - muuta kokoa +pdfjs-editor-resizer-top-middle = + .aria-label = Ylhäällä keskellä - muuta kokoa +pdfjs-editor-resizer-top-right = + .aria-label = Oikea yläkulma - muuta kokoa +pdfjs-editor-resizer-middle-right = + .aria-label = Keskellä oikealla - muuta kokoa +pdfjs-editor-resizer-bottom-right = + .aria-label = Oikea alakulma - muuta kokoa +pdfjs-editor-resizer-bottom-middle = + .aria-label = Alhaalla keskellä - muuta kokoa +pdfjs-editor-resizer-bottom-left = + .aria-label = Vasen alakulma - muuta kokoa +pdfjs-editor-resizer-middle-left = + .aria-label = Keskellä vasemmalla - muuta kokoa ## Color picker @@ -400,3 +465,283 @@ pdfjs-editor-highlight-show-all-button-label = Näytä kaikki pdfjs-editor-highlight-show-all-button = .title = Näytä kaikki + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Muokkaa vaihtoehtoista tekstiä (kuvan kuvaus) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Lisää vaihtoehtoinen teksti (kuvan kuvaus) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Kirjoita kuvaus tähän… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Lyhyt kuvaus ihmisille, jotka eivät näe kuvaa tai kun kuva ei lataudu. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Tämä vaihtoehtoinen teksti luotiin automaattisesti, ja se voi olla epätarkka. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Lue lisää +pdfjs-editor-new-alt-text-create-automatically-button-label = Luo vaihtoehtoinen teksti automaattisesti +pdfjs-editor-new-alt-text-not-now-button = Ei nyt +pdfjs-editor-new-alt-text-error-title = Vaihtoehtotekstiä ei voitu luoda automaattisesti +pdfjs-editor-new-alt-text-error-description = Kirjoita oma vaihtoehtoinen teksti tai yritä myöhemmin uudelleen. +pdfjs-editor-new-alt-text-error-close-button = Sulje +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Ladataan vaihtoehtoisen tekstin tekoälymallia ({ $downloadedSize } / { $totalSize } Mt) + .aria-valuetext = Ladataan vaihtoehtoisen tekstin tekoälymallia ({ $downloadedSize } / { $totalSize } Mt) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Vaihtoehtoinen teksti lisätty +pdfjs-editor-new-alt-text-added-button-label = Vaihtoehtoinen teksti lisätty +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Vaihtoehtoinen teksti puuttuu +pdfjs-editor-new-alt-text-missing-button-label = Vaihtoehtoinen teksti puuttuu +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Tarkista vaihtoehtoinen teksti +pdfjs-editor-new-alt-text-to-review-button-label = Tarkista vaihtoehtoinen teksti +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Luotu automaattisesti: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Kuvan vaihtoehtoisen tekstin asetukset +pdfjs-image-alt-text-settings-button-label = Kuvan vaihtoehtoisen tekstin asetukset +pdfjs-editor-alt-text-settings-dialog-label = Kuvan vaihtoehtoisen tekstin asetukset +pdfjs-editor-alt-text-settings-automatic-title = Automaattinen vaihtoehtoinen teksti +pdfjs-editor-alt-text-settings-create-model-button-label = Luo vaihtoehtoinen teksti automaattisesti +pdfjs-editor-alt-text-settings-create-model-description = Ehdottaa kuvauksia, jotka auttavat ihmisiä, jotka eivät näe kuvaa tai kun kuva ei lataudu. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Vaihtoehtoisen tekstin tekoälymalli ({ $totalSize } Mt) +pdfjs-editor-alt-text-settings-ai-model-description = Toimii paikallisesti laitteellasi, joten tietosi pysyvät yksityisinä. Vaadittu automaattiselle vaihtoehtoiselle tekstille. +pdfjs-editor-alt-text-settings-delete-model-button = Poista +pdfjs-editor-alt-text-settings-download-model-button = Lataa +pdfjs-editor-alt-text-settings-downloading-model-button = Ladataan… +pdfjs-editor-alt-text-settings-editor-title = Vaihtoehtoisen tekstin muokkain +pdfjs-editor-alt-text-settings-show-dialog-button-label = Näytä vaihtoehtoisen tekstin muokkain heti, kun lisäät kuvan +pdfjs-editor-alt-text-settings-show-dialog-description = Auttaa varmistamaan, että kaikissa kuvissasi on vaihtoehtoinen teksti. +pdfjs-editor-alt-text-settings-close-button = Sulje + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Korostus lisätty +pdfjs-editor-freetext-added-alert = Teksti lisätty +pdfjs-editor-ink-added-alert = Piirustus lisätty +pdfjs-editor-stamp-added-alert = Kuva lisätty +pdfjs-editor-signature-added-alert = Allekirjoitus lisätty + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Korostus poistettu +pdfjs-editor-undo-bar-message-freetext = Teksti poistettu +pdfjs-editor-undo-bar-message-ink = Piirustus poistettu +pdfjs-editor-undo-bar-message-stamp = Kuva poistettu +pdfjs-editor-undo-bar-message-signature = Allekirjoitus poistettu +pdfjs-editor-undo-bar-message-comment = Kommentti poistettu +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } merkintä poistettu + *[other] { $count } merkintää poistettu + } +pdfjs-editor-undo-bar-undo-button = + .title = Kumoa +pdfjs-editor-undo-bar-undo-button-label = Kumoa +pdfjs-editor-undo-bar-close-button = + .title = Sulje +pdfjs-editor-undo-bar-close-button-label = Sulje + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Tämän ikkunan avulla käyttäjä voi luoda allekirjoituksen PDF-asiakirjaan lisättäväksi. Käyttäjä voi muokata nimeä (joka toimii myös vaihtoehtoisena tekstinä) ja valinnaisesti tallentaa allekirjoituksen toistuvaa käyttöä varten. +pdfjs-editor-add-signature-dialog-title = Lisää allekirjoitus + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Kirjoita + .title = Kirjoita +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Piirrä + .title = Piirrä +pdfjs-editor-add-signature-image-button = Kuva + .title = Kuva + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Kirjoita allekirjoituksesi + .placeholder = Kirjoita allekirjoituksesi +pdfjs-editor-add-signature-draw-placeholder = Piirrä allekirjoituksesi +pdfjs-editor-add-signature-draw-thickness-range-label = Paksuus +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Piirustuksen paksuus: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Lähetä tiedosto vetämällä se tähän +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Tai selaa kuvatiedostoja + *[other] Tai selaa kuvatiedostoja + } + +## Controls + +pdfjs-editor-add-signature-description-label = Kuvaus (vaihtoehtoinen teksti) +pdfjs-editor-add-signature-description-input = + .title = Kuvaus (vaihtoehtoinen teksti) +pdfjs-editor-add-signature-description-default-when-drawing = Allekirjoitus +pdfjs-editor-add-signature-clear-button-label = Tyhjennä allekirjoitus +pdfjs-editor-add-signature-clear-button = + .title = Tyhjennä allekirjoitus +pdfjs-editor-add-signature-save-checkbox = Tallenna allekirjoitus +pdfjs-editor-add-signature-save-warning-message = Olet saavuttanut viiden tallennetun allekirjoituksen rajan. Poista yksi säästääksesi lisää. +pdfjs-editor-add-signature-image-upload-error-title = Kuvaa ei voitu lähettää +pdfjs-editor-add-signature-image-upload-error-description = Tarkista verkkoyhteyden tila tai kokeile toista kuvaa. +pdfjs-editor-add-signature-image-no-data-error-title = Tätä kuvaa ei voida muuntaa allekirjoitukseksi +pdfjs-editor-add-signature-image-no-data-error-description = Yritä lähettää eri kuva. +pdfjs-editor-add-signature-error-close-button = Sulje + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Peruuta +pdfjs-editor-add-signature-add-button = Lisää +pdfjs-editor-edit-signature-update-button = Päivitä + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Muokkaa kommenttia +pdfjs-editor-edit-comment-popup-button = + .title = Muokkaa kommenttia +pdfjs-editor-delete-comment-popup-button-label = Poista kommentti +pdfjs-editor-delete-comment-popup-button = + .title = Poista kommentti +pdfjs-show-comment-button = + .title = Näytä kommentti + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Muokkaa kommenttia +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Päivitä +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Lisää kommentti +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Lisää +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Aloita kirjoittaminen… +pdfjs-editor-edit-comment-dialog-cancel-button = Peruuta + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Lisää kommentti + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Näytä/piilota sivupaneeli (dokumentissa on pienoiskuvat/sisällys/liitteitä/tasoja) +pdfjs-toggle-views-manager-button1-label = Hallitse sivuja +pdfjs-views-manager-sidebar = + .aria-label = Sivupaneeli +pdfjs-views-manager-sidebar-resizer = + .aria-label = Sivupaneelin koon muuttaja +pdfjs-views-manager-view-selector-button = + .title = Näkymät +pdfjs-views-manager-view-selector-button-label = Näkymät +pdfjs-views-manager-pages-title = Sivut +pdfjs-views-manager-outlines-title1 = Dokumentin sisällys + .title = Dokumentin sisällys (napsauta kahdesti laajentaaksesi/supistaaksesi kohteet) +pdfjs-views-manager-attachments-title = Liitteet +pdfjs-views-manager-layers-title1 = Tasot + .title = Tasot (napsauta kahdesti nollataksesi tasot niiden oletustilaan) +pdfjs-views-manager-pages-option-label = Sivut +pdfjs-views-manager-outlines-option-label = Dokumentin sisällys +pdfjs-views-manager-attachments-option-label = Liitteet +pdfjs-views-manager-layers-option-label = Tasot +pdfjs-views-manager-add-file-button = + .title = Lisää tiedosto +pdfjs-views-manager-add-file-button-label = Lisää tiedosto +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } valittu + *[other] { $count } valittu + } +pdfjs-views-manager-pages-status-none-action-label = Valitse sivut +pdfjs-views-manager-pages-status-action-button-label = Hallitse +pdfjs-views-manager-pages-status-copy-button-label = Kopioi +pdfjs-views-manager-pages-status-cut-button-label = Leikkaa +pdfjs-views-manager-pages-status-delete-button-label = Poista +pdfjs-views-manager-pages-status-export-selected-button-label = Vie valitut… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 sivu leikattu + *[other] { $count } sivua leikattu + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 sivu kopioitu + *[other] { $count } sivua kopioitu + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 sivu poistettu + *[other] { $count } sivua poistettu + } +pdfjs-views-manager-pages-status-waiting-ready-label = Tiedostoa valmistellaan… +pdfjs-views-manager-pages-status-waiting-uploading-label = Lähetetään tiedostoa… +pdfjs-views-manager-status-warning-cut-label = Leikkaaminen epäonnistui. Päivitä sivu ja yritä uudelleen. +pdfjs-views-manager-status-warning-copy-label = Kopiointi epäonnistui. Päivitä sivu ja yritä uudelleen. +pdfjs-views-manager-status-warning-delete-label = Poisto epäonnistui. Päivitä sivu ja yritä uudelleen. +pdfjs-views-manager-status-warning-save-label = Tallentaminen epäonnistui. Päivitä sivu ja yritä uudelleen. +pdfjs-views-manager-status-undo-button-label = Kumoa +pdfjs-views-manager-status-done-button-label = Valmis +pdfjs-views-manager-status-close-button = + .title = Sulje +pdfjs-views-manager-status-close-button-label = Sulje +pdfjs-views-manager-paste-button-label = Liitä +pdfjs-views-manager-paste-button-before = + .title = Liitä ennen ensimmäistä sivua +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Liitä sivun { $page } jälkeen +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = UUTTA +pdfjs-views-manager-waiting-for-file = Lähetetään tiedostoa… +pdfjs-toggle-views-manager-button1 = + .title = Hallitse sivuja + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Poista tallennettu allekirjoitus +pdfjs-editor-delete-signature-button-label1 = Poista tallennettu allekirjoitus + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Muokkaa kuvausta + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Muokkaa kuvausta diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/fr/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/fr/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/fr/viewer.ftl 2026-01-20 14:08:39.368689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/fr/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Page courante (montrer l’adresse de la page courante) pdfjs-bookmark-button-label = Page courante -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Ouvrir dans une application -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Ouvrir dans une application ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Nom du fichier : pdfjs-document-properties-file-size = Taille du fichier : # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } Ko ({ $size_b } octets) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } Mo ({ $size_b } octets) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } Ko ({ $b } octets) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } Mo ({ $b } octets) pdfjs-document-properties-title = Titre : pdfjs-document-properties-author = Auteur : pdfjs-document-properties-subject = Sujet : @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Date de création : pdfjs-document-properties-modification-date = Modifié le : # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date } à { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Créé par : pdfjs-document-properties-producer = Outil de conversion PDF : pdfjs-document-properties-version = Version PDF : @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Vignette de la page { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Sélectionner la page { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Page { $page } sur { $total } ## Find panel button title and messages @@ -266,10 +268,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date } à { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -277,6 +275,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Annotation { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -290,9 +291,13 @@ pdfjs-editor-free-text-button = .title = Texte +pdfjs-editor-color-picker-free-text-input = + .title = Changer la couleur du texte pdfjs-editor-free-text-button-label = Texte pdfjs-editor-ink-button = .title = Dessiner +pdfjs-editor-color-picker-ink-input = + .title = Changer la couleur pour dessiner pdfjs-editor-ink-button-label = Dessiner pdfjs-editor-stamp-button = .title = Ajouter ou modifier des images @@ -300,8 +305,37 @@ pdfjs-editor-highlight-button = .title = Surligner pdfjs-editor-highlight-button-label = Surligner -pdfjs-highlight-floating-button = +pdfjs-highlight-floating-button1 = .title = Surligner + .aria-label = Surligner +pdfjs-highlight-floating-button-label = Surligner +pdfjs-comment-floating-button = + .title = Commenter + .aria-label = Commenter +pdfjs-comment-floating-button-label = Commenter +pdfjs-editor-comment-button = + .title = Commenter + .aria-label = Commenter +pdfjs-editor-comment-button-label = Commenter +pdfjs-editor-signature-button = + .title = Ajouter une signature +pdfjs-editor-signature-button-label = Ajouter une signature + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Éditeur de surlignage +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Éditeur de dessins +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Éditeur de signature : { $description } +pdfjs-editor-stamp-editor = + .aria-label = Éditeur d’images ## Remove button for the various kind of editor. @@ -313,6 +347,8 @@ .title = Supprimer l’image pdfjs-editor-remove-highlight-button = .title = Supprimer le surlignage +pdfjs-editor-remove-signature-button = + .title = Retirer la signature ## @@ -329,19 +365,41 @@ pdfjs-editor-free-highlight-thickness-input = Épaisseur pdfjs-editor-free-highlight-thickness-title = .title = Modifier l’épaisseur pour le surlignage d’éléments non textuels -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Contrôles de signature et signatures enregistrées +pdfjs-editor-signature-add-signature-button = + .title = Ajouter une nouvelle signature +pdfjs-editor-signature-add-signature-button-label = Ajouter une nouvelle signature +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Signature enregistrée : { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Éditeur de texte -pdfjs-free-text-default-content = Commencer à écrire… -pdfjs-ink = - .aria-label = Éditeur de dessin -pdfjs-ink-canvas = - .aria-label = Image créée par l’utilisateur·trice + .default-content = Commencez à écrire… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Commentaire + *[other] Commentaires + } +pdfjs-editor-comments-sidebar-close-button = + .title = Fermer le panneau latéral + .aria-label = Fermer le panneau latéral +pdfjs-editor-comments-sidebar-close-button-label = Fermer le panneau latéral +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Vous remarquez quelque chose d’intéressant ? Mettez-le en surbrillance et ajoutez un commentaire. +pdfjs-editor-comments-sidebar-no-comments-link = En savoir plus ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Texte alternatif -pdfjs-editor-alt-text-edit-button-label = Modifier le texte alternatif +pdfjs-editor-alt-text-edit-button = + .aria-label = Modifier le texte alternatif pdfjs-editor-alt-text-dialog-label = Sélectionnez une option pdfjs-editor-alt-text-dialog-description = Le texte alternatif est utile lorsque des personnes ne peuvent pas voir l’image ou que l’image ne se charge pas. pdfjs-editor-alt-text-add-description-label = Ajouter une description @@ -354,18 +412,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Par exemple, « Un jeune homme est assis à une table pour prendre un repas » +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Texte alternatif ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Coin supérieur gauche — redimensionner -pdfjs-editor-resizer-label-top-middle = Milieu haut — redimensionner -pdfjs-editor-resizer-label-top-right = Coin supérieur droit — redimensionner -pdfjs-editor-resizer-label-middle-right = Milieu droit — redimensionner -pdfjs-editor-resizer-label-bottom-right = Coin inférieur droit — redimensionner -pdfjs-editor-resizer-label-bottom-middle = Centre bas — redimensionner -pdfjs-editor-resizer-label-bottom-left = Coin inférieur gauche — redimensionner -pdfjs-editor-resizer-label-middle-left = Milieu gauche — redimensionner +pdfjs-editor-resizer-top-left = + .aria-label = Coin supérieur gauche — redimensionner +pdfjs-editor-resizer-top-middle = + .aria-label = Milieu haut — redimensionner +pdfjs-editor-resizer-top-right = + .aria-label = Coin supérieur droit — redimensionner +pdfjs-editor-resizer-middle-right = + .aria-label = Milieu droit — redimensionner +pdfjs-editor-resizer-bottom-right = + .aria-label = Coin inférieur droit — redimensionner +pdfjs-editor-resizer-bottom-middle = + .aria-label = Centre bas — redimensionner +pdfjs-editor-resizer-bottom-left = + .aria-label = Coin inférieur gauche — redimensionner +pdfjs-editor-resizer-middle-left = + .aria-label = Milieu gauche — redimensionner ## Color picker @@ -392,3 +461,283 @@ pdfjs-editor-highlight-show-all-button-label = Tout afficher pdfjs-editor-highlight-show-all-button = .title = Tout afficher + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Modifier le texte alternatif (description de l’image) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Ajouter du texte alternatif (description de l’image) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Rédigez votre description ici… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Courte description pour les personnes qui ne peuvent pas voir l’image ou lorsque l’image ne se charge pas. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Ce texte alternatif a été créé automatiquement et peut être inexact. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = En savoir plus +pdfjs-editor-new-alt-text-create-automatically-button-label = Créer automatiquement le texte alternatif +pdfjs-editor-new-alt-text-not-now-button = Pas maintenant +pdfjs-editor-new-alt-text-error-title = Impossible de créer automatiquement le texte alternatif +pdfjs-editor-new-alt-text-error-description = Veuillez rédiger votre propre texte alternatif ou réessayer plus tard. +pdfjs-editor-new-alt-text-error-close-button = Fermer +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Téléchargement du modèle d’IA de texte alternatif ({ $downloadedSize } sur { $totalSize } Mo) + .aria-valuetext = Téléchargement du modèle d’IA de texte alternatif ({ $downloadedSize } sur { $totalSize } Mo) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Texte alternatif ajouté +pdfjs-editor-new-alt-text-added-button-label = Texte alternatif ajouté +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Texte alternatif manquant +pdfjs-editor-new-alt-text-missing-button-label = Texte alternatif manquant +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Réviser le texte alternatif +pdfjs-editor-new-alt-text-to-review-button-label = Réviser le texte alternatif +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Créé automatiquement : { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Paramètres du texte alternatif des images +pdfjs-image-alt-text-settings-button-label = Paramètres du texte alternatif des images +pdfjs-editor-alt-text-settings-dialog-label = Paramètres du texte alternatif des images +pdfjs-editor-alt-text-settings-automatic-title = Texte alternatif automatique +pdfjs-editor-alt-text-settings-create-model-button-label = Créer automatiquement le texte alternatif +pdfjs-editor-alt-text-settings-create-model-description = Suggère des descriptions pour aider les personnes qui ne peuvent pas voir l’image ou lorsque l’image ne se charge pas. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modèle d’IA de texte alternatif ({ $totalSize } Mo) +pdfjs-editor-alt-text-settings-ai-model-description = Fonctionne localement sur votre appareil, vos données restent privées. Obligatoire pour la génération automatique de texte alternatif. +pdfjs-editor-alt-text-settings-delete-model-button = Supprimer +pdfjs-editor-alt-text-settings-download-model-button = Télécharger +pdfjs-editor-alt-text-settings-downloading-model-button = Téléchargement… +pdfjs-editor-alt-text-settings-editor-title = Éditeur de texte alternatif +pdfjs-editor-alt-text-settings-show-dialog-button-label = Afficher l’éditeur de texte alternatif immédiatement lors de l’ajout d’une image +pdfjs-editor-alt-text-settings-show-dialog-description = Vous aide à vous assurer que toutes vos images ont du texte alternatif. +pdfjs-editor-alt-text-settings-close-button = Fermer + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Surlignage ajouté +pdfjs-editor-freetext-added-alert = Texte ajouté +pdfjs-editor-ink-added-alert = Dessin ajouté +pdfjs-editor-stamp-added-alert = Image ajoutée +pdfjs-editor-signature-added-alert = Signature ajoutée + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Surlignage supprimé +pdfjs-editor-undo-bar-message-freetext = Texte supprimé +pdfjs-editor-undo-bar-message-ink = Dessin supprimé +pdfjs-editor-undo-bar-message-stamp = Image supprimée +pdfjs-editor-undo-bar-message-signature = Signature retirée +pdfjs-editor-undo-bar-message-comment = Commentaire supprimé +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } annotation supprimée + *[other] { $count } annotations supprimées + } +pdfjs-editor-undo-bar-undo-button = + .title = Annuler +pdfjs-editor-undo-bar-undo-button-label = Annuler +pdfjs-editor-undo-bar-close-button = + .title = Fermer +pdfjs-editor-undo-bar-close-button-label = Fermer + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Cette fenêtre permet de créer une signature à ajouter à un document au format PDF. Il est possible d’en modifier le nom (qui sert également de texte alternatif) et, éventuellement, de l’enregistrer pour une utilisation répétée. +pdfjs-editor-add-signature-dialog-title = Ajout d’une signature + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Saisir + .title = Saisir au clavier +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Dessiner + .title = Dessiner +pdfjs-editor-add-signature-image-button = Image + .title = Image + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Saisissez votre signature + .placeholder = Saisissez votre signature +pdfjs-editor-add-signature-draw-placeholder = Tracez votre signature +pdfjs-editor-add-signature-draw-thickness-range-label = Épaisseur +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Épaisseur du trait : { $thickness } +pdfjs-editor-add-signature-image-placeholder = Déposez un fichier ici pour l’envoyer +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Ou choisissez parmi les fichiers image + *[other] Ou parcourez les fichiers image + } + +## Controls + +pdfjs-editor-add-signature-description-label = Description (texte alternatif) +pdfjs-editor-add-signature-description-input = + .title = Description (texte alternatif) +pdfjs-editor-add-signature-description-default-when-drawing = Signature +pdfjs-editor-add-signature-clear-button-label = Effacer la signature +pdfjs-editor-add-signature-clear-button = + .title = Effacer la signature +pdfjs-editor-add-signature-save-checkbox = Enregistrer la signature +pdfjs-editor-add-signature-save-warning-message = Vous avez atteint la limite de 5 signatures enregistrées. Supprimez-en une pour en enregistrer une autre. +pdfjs-editor-add-signature-image-upload-error-title = Impossible d’envoyer l’image +pdfjs-editor-add-signature-image-upload-error-description = Vérifiez votre connexion réseau ou essayez avec une autre image. +pdfjs-editor-add-signature-image-no-data-error-title = Impossible de convertir cette image en signature +pdfjs-editor-add-signature-image-no-data-error-description = Veuillez essayer d’envoyer une autre image. +pdfjs-editor-add-signature-error-close-button = Fermer + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Annuler +pdfjs-editor-add-signature-add-button = Ajouter +pdfjs-editor-edit-signature-update-button = Mettre à jour + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Modifier le commentaire +pdfjs-editor-edit-comment-popup-button = + .title = Modifier le commentaire +pdfjs-editor-delete-comment-popup-button-label = Supprimer le commentaire +pdfjs-editor-delete-comment-popup-button = + .title = Supprimer le commentaire +pdfjs-show-comment-button = + .title = Voir les commentaires + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Modifier le commentaire +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Mettre à jour +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Ajouter un commentaire +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Ajouter +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Commencer à écrire… +pdfjs-editor-edit-comment-dialog-cancel-button = Annuler + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Ajouter un commentaire + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Afficher/Masquer le panneau latéral (le document contient des vignettes/plan/pièces jointes/calques) +pdfjs-toggle-views-manager-button1-label = Gérer les pages +pdfjs-views-manager-sidebar = + .aria-label = Panneau latéral +pdfjs-views-manager-sidebar-resizer = + .aria-label = Redimensionner le panneau latéral +pdfjs-views-manager-view-selector-button = + .title = Vues +pdfjs-views-manager-view-selector-button-label = Vues +pdfjs-views-manager-pages-title = Pages +pdfjs-views-manager-outlines-title1 = Structure du document + .title = Structure du document (double-cliquer pour développer/réduire tous les éléments) +pdfjs-views-manager-attachments-title = Pièces jointes +pdfjs-views-manager-layers-title1 = Calques + .title = Calques (double-cliquer pour réinitialiser tous les calques à leur état par défaut) +pdfjs-views-manager-pages-option-label = Pages +pdfjs-views-manager-outlines-option-label = Signets du document +pdfjs-views-manager-attachments-option-label = Pièces jointes +pdfjs-views-manager-layers-option-label = Calques +pdfjs-views-manager-add-file-button = + .title = Ajouter un fichier +pdfjs-views-manager-add-file-button-label = Ajouter un fichier +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } page sélectionnée + *[other] { $count } pages sélectionnées + } +pdfjs-views-manager-pages-status-none-action-label = Sélectionner des pages +pdfjs-views-manager-pages-status-action-button-label = Gérer +pdfjs-views-manager-pages-status-copy-button-label = Copier +pdfjs-views-manager-pages-status-cut-button-label = Couper +pdfjs-views-manager-pages-status-delete-button-label = Supprimer +pdfjs-views-manager-pages-status-export-selected-button-label = Exporter la sélection… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 page coupée + *[other] { $count } pages coupées + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 page copiée + *[other] { $count } pages copiées + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 page supprimée + *[other] { $count } pages supprimées + } +pdfjs-views-manager-pages-status-waiting-ready-label = Préparation de votre fichier… +pdfjs-views-manager-pages-status-waiting-uploading-label = Envoi du fichier… +pdfjs-views-manager-status-warning-cut-label = Impossible de couper. Actualisez la page et essayez à nouveau. +pdfjs-views-manager-status-warning-copy-label = Copie impossible. Actualisez la page et essayez à nouveau. +pdfjs-views-manager-status-warning-delete-label = Suppression impossible. Actualisez la page et essayez à nouveau. +pdfjs-views-manager-status-warning-save-label = Enregistrement impossible. Actualisez la page et essayez à nouveau. +pdfjs-views-manager-status-undo-button-label = Annuler +pdfjs-views-manager-status-done-button-label = Terminer +pdfjs-views-manager-status-close-button = + .title = Fermer +pdfjs-views-manager-status-close-button-label = Fermer +pdfjs-views-manager-paste-button-label = Coller +pdfjs-views-manager-paste-button-before = + .title = Coller avant la première page +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Coller après la page { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NOUVEAU +pdfjs-views-manager-waiting-for-file = Envoi du fichier… +pdfjs-toggle-views-manager-button1 = + .title = Gérer les pages + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Supprimer la signature enregistrée +pdfjs-editor-delete-signature-button-label1 = Supprimer la signature enregistrée + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Modifier la description + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Modifier la description diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/fur/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/fur/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/fur/viewer.ftl 2026-01-20 14:08:39.368689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/fur/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -6,7 +6,7 @@ ## Main toolbar buttons (tooltips and alt text for images) pdfjs-previous-button = - .title = Pagjine precedente + .title = Pagjine di prime pdfjs-previous-button-label = Indaûr pdfjs-next-button = .title = Prossime pagjine @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Pagjine corinte (mostre URL de pagjine atuâl) pdfjs-bookmark-button-label = Pagjine corinte -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Vierç te aplicazion -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Vierç te aplicazion ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Non dal file: pdfjs-document-properties-file-size = Dimension dal file: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) pdfjs-document-properties-title = Titul: pdfjs-document-properties-author = Autôr: pdfjs-document-properties-subject = Ogjet: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Date di creazion: pdfjs-document-properties-modification-date = Date di modifiche: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Creatôr pdfjs-document-properties-producer = Gjeneradôr PDF: pdfjs-document-properties-version = Version PDF: @@ -270,10 +263,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +270,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Anotazion { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +286,13 @@ pdfjs-editor-free-text-button = .title = Test +pdfjs-editor-color-picker-free-text-input = + .title = Cambie colôr dal test pdfjs-editor-free-text-button-label = Test pdfjs-editor-ink-button = .title = Dissen +pdfjs-editor-color-picker-ink-input = + .title = Cambie colôr dal dissen pdfjs-editor-ink-button-label = Dissen pdfjs-editor-stamp-button = .title = Zonte o modifiche imagjins @@ -304,12 +300,37 @@ pdfjs-editor-highlight-button = .title = Evidenzie pdfjs-editor-highlight-button-label = Evidenzie -pdfjs-highlight-floating-button = - .title = Evidenzie pdfjs-highlight-floating-button1 = .title = Evidenzie .aria-label = Evidenzie pdfjs-highlight-floating-button-label = Evidenzie +pdfjs-comment-floating-button = + .title = Comente + .aria-label = Comente +pdfjs-comment-floating-button-label = Comente +pdfjs-editor-comment-button = + .title = Comente + .aria-label = Comente +pdfjs-editor-comment-button-label = Comente +pdfjs-editor-signature-button = + .title = Zonte firme +pdfjs-editor-signature-button-label = Zonte firme + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Modifiche evidenziazions +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Modifiche dissens +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Editôr firmis: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Modifiche imagjins ## Remove button for the various kind of editor. @@ -321,6 +342,8 @@ .title = Gjave imagjin pdfjs-editor-remove-highlight-button = .title = Gjave evidenziazion +pdfjs-editor-remove-signature-button = + .title = Gjave firme ## @@ -337,19 +360,41 @@ pdfjs-editor-free-highlight-thickness-input = Spessôr pdfjs-editor-free-highlight-thickness-title = .title = Modifiche il spessôr de selezion pai elements che no son testuâi -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Controi firme e firmis salvadis +pdfjs-editor-signature-add-signature-button = + .title = Zonte gnove firme +pdfjs-editor-signature-add-signature-button-label = Zonte gnove firme +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Firme salvade: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Editôr di test -pdfjs-free-text-default-content = Scomence a scrivi… -pdfjs-ink = - .aria-label = Editôr dissens -pdfjs-ink-canvas = - .aria-label = Imagjin creade dal utent + .default-content = Scomence a scrivi… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Coment + *[other] Coments + } +pdfjs-editor-comments-sidebar-close-button = + .title = Siere la sbare laterâl + .aria-label = Siere la sbare laterâl +pdfjs-editor-comments-sidebar-close-button-label = Siere la sbare laterâl +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Âstu cjatât alc di interessant? Evidenzilu e lasse un coment. +pdfjs-editor-comments-sidebar-no-comments-link = Plui informazions ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Test alternatîf -pdfjs-editor-alt-text-edit-button-label = Modifiche test alternatîf +pdfjs-editor-alt-text-edit-button = + .aria-label = Modifiche test alternatîf pdfjs-editor-alt-text-dialog-label = Sielç une opzion pdfjs-editor-alt-text-dialog-description = Il test alternatîf (“alt text”) al jude cuant che lis personis no puedin viodi la imagjin o cuant che la imagjine no ven cjariade. pdfjs-editor-alt-text-add-description-label = Zonte une descrizion @@ -362,18 +407,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Par esempli, “Un zovin si sente a taule par mangjâ” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Test alternatîf ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Cjanton in alt a çampe — ridimensione -pdfjs-editor-resizer-label-top-middle = Bande superiôr tal mieç — ridimensione -pdfjs-editor-resizer-label-top-right = Cjanton in alt a diestre — ridimensione -pdfjs-editor-resizer-label-middle-right = Bande diestre tal mieç — ridimensione -pdfjs-editor-resizer-label-bottom-right = Cjanton in bas a diestre — ridimensione -pdfjs-editor-resizer-label-bottom-middle = Bande inferiôr tal mieç — ridimensione -pdfjs-editor-resizer-label-bottom-left = Cjanton in bas a çampe — ridimensione -pdfjs-editor-resizer-label-middle-left = Bande di çampe tal mieç — ridimensione +pdfjs-editor-resizer-top-left = + .aria-label = Cjanton in alt a çampe — ridimensione +pdfjs-editor-resizer-top-middle = + .aria-label = Bande superiôr tal mieç — ridimensione +pdfjs-editor-resizer-top-right = + .aria-label = Cjanton in alt a diestre — ridimensione +pdfjs-editor-resizer-middle-right = + .aria-label = Bande diestre tal mieç — ridimensione +pdfjs-editor-resizer-bottom-right = + .aria-label = Cjanton in bas a diestre — ridimensione +pdfjs-editor-resizer-bottom-middle = + .aria-label = Bande inferiôr tal mieç — ridimensione +pdfjs-editor-resizer-bottom-left = + .aria-label = Cjanton in bas a çampe — ridimensione +pdfjs-editor-resizer-middle-left = + .aria-label = Bande di çampe tal mieç — ridimensione ## Color picker @@ -400,3 +456,193 @@ pdfjs-editor-highlight-show-all-button-label = Mostre dut pdfjs-editor-highlight-show-all-button = .title = Mostre dut + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Modifiche test alternatîf (descrizion de imagjin) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Zonte test alternatîf (descrizion de imagjin) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Scrîf achì la tô descrizion… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Curte descrizion par personis che no rivin a viodi la imagjin, o che e ven mostrade cuant che no si rive a cjariâle. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Chest test alternatîf al è stât creât in automatic e al è pussibil che nol sedi cret. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Plui informazions +pdfjs-editor-new-alt-text-create-automatically-button-label = Cree test alternatîf in automatic +pdfjs-editor-new-alt-text-not-now-button = No cumò +pdfjs-editor-new-alt-text-error-title = Impussibil creâ test alternatîf in automatic +pdfjs-editor-new-alt-text-error-description = Scrîf il to test alternatîf o prove plui tart. +pdfjs-editor-new-alt-text-error-close-button = Siere +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Daûr a discjariâil model IA pal test alternatîf ({ $downloadedSize } di { $totalSize } MB) + .aria-valuetext = Daûr a discjariâ il model IA pal test alternatîf ({ $downloadedSize } di { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Test alternatîf zontât +pdfjs-editor-new-alt-text-added-button-label = Test alternatîf zontât +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Al mancje il test alternatîf +pdfjs-editor-new-alt-text-missing-button-label = Al mancje il test alternatîf +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Verifiche test alternatîf +pdfjs-editor-new-alt-text-to-review-button-label = Verifiche test alternatîf +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creât in automatic: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Impostazions test alternatîf pes imagjins +pdfjs-image-alt-text-settings-button-label = Impostazions test alternatîf pes imagjins +pdfjs-editor-alt-text-settings-dialog-label = Impostazions test alternatîf pes imagjins +pdfjs-editor-alt-text-settings-automatic-title = Test alternatîf automatic +pdfjs-editor-alt-text-settings-create-model-button-label = Cree test alternatîf in automatic +pdfjs-editor-alt-text-settings-create-model-description = Al sugjerìs descrizions par judâ lis personis che no rivin a viodi la imagjin o cuant che la imagjin no ven cjariade. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model IA pal test alternatîf ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Al ven eseguît in locâl sul to dispositîf, cussì che i tiei dâts a restin riservâts. Al è necessari pe gjenerazion automatiche dal test alternatîf. +pdfjs-editor-alt-text-settings-delete-model-button = Elimine +pdfjs-editor-alt-text-settings-download-model-button = Discjame +pdfjs-editor-alt-text-settings-downloading-model-button = Daûr a discjariâ… +pdfjs-editor-alt-text-settings-editor-title = Modifiche test alternatîf +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostre l'editôr dal test alternatîf a pene che e ven zontade une imagjin +pdfjs-editor-alt-text-settings-show-dialog-description = Ti jude a sigurâti che dutis lis tôs imagjins a vedin il test alternatîf. +pdfjs-editor-alt-text-settings-close-button = Siere + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Evidenziazion zontade +pdfjs-editor-freetext-added-alert = Test zontât +pdfjs-editor-ink-added-alert = Dissen zontât +pdfjs-editor-stamp-added-alert = Imagjin zontade +pdfjs-editor-signature-added-alert = Firme zontade + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Evidenziazion gjavade +pdfjs-editor-undo-bar-message-freetext = Test gjavât +pdfjs-editor-undo-bar-message-ink = Dissen gjavât +pdfjs-editor-undo-bar-message-stamp = Imagjin gjavade +pdfjs-editor-undo-bar-message-signature = Firme gjavade +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } note gjavade + *[other] { $count } notis gjavadis + } +pdfjs-editor-undo-bar-undo-button = + .title = Anule +pdfjs-editor-undo-bar-undo-button-label = Anule +pdfjs-editor-undo-bar-close-button = + .title = Siere +pdfjs-editor-undo-bar-close-button-label = Siere + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Chest barcon al permet al utent di creâ une firme di zontâ a un document PDF. L’utent al pues modificâ il non (che al vignarà doprât ancje come test alternatîf) e, se lu desidere, salvâ la firme par tornâ a doprâle un doman. +pdfjs-editor-add-signature-dialog-title = Zonte une firme + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Scrîf + .title = Scrîf +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Dissegne + .title = Dissegne +pdfjs-editor-add-signature-image-button = Imagjin + .title = Imagjin + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Scrîf la tô firme + .placeholder = Scrîf la tô firme +pdfjs-editor-add-signature-draw-placeholder = Dissegne la tô firme +pdfjs-editor-add-signature-draw-thickness-range-label = Spessôr +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Spessôr de tresse: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Strissine un file achì par cjariâlu +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Opûr sielç i files imagjin + *[other] Opûr sgarfe pai files imagjin + } + +## Controls + +pdfjs-editor-add-signature-description-label = Descrizion (test alternatîf) +pdfjs-editor-add-signature-description-input = + .title = Descrizion (test alternatîf) +pdfjs-editor-add-signature-description-default-when-drawing = Firme +pdfjs-editor-add-signature-clear-button-label = Nete firme +pdfjs-editor-add-signature-clear-button = + .title = Nete firme +pdfjs-editor-add-signature-save-checkbox = Salve firme +pdfjs-editor-add-signature-save-warning-message = Tu sês rivât/rivade al limit di 5 firmis salvadis. Gjave une par salvânt une altre. +pdfjs-editor-add-signature-image-upload-error-title = Impussibil cjariâ la imagjin +pdfjs-editor-add-signature-image-upload-error-description = Controle la conession di rêt o prove cuntune altre imagjin. +pdfjs-editor-add-signature-image-no-data-error-title = Impussibil convertî cheste imagjin intune firme +pdfjs-editor-add-signature-image-no-data-error-description = Prove a cjariâ une altre imagjin. +pdfjs-editor-add-signature-error-close-button = Siere + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Anule +pdfjs-editor-add-signature-add-button = Zonte +pdfjs-editor-edit-signature-update-button = Inzorne + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Modifiche coment +pdfjs-editor-edit-comment-popup-button = + .title = Modifiche coment +pdfjs-editor-delete-comment-popup-button-label = Gjave coment +pdfjs-editor-delete-comment-popup-button = + .title = Gjave coment +pdfjs-show-comment-button = + .title = Mostre coment + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Modifiche coment +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Inzorne +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Zonte coment +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Zonte +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Scomence a scrivi… +pdfjs-editor-edit-comment-dialog-cancel-button = Anule + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Zonte coment + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Gjave firme salvade +pdfjs-editor-delete-signature-button-label1 = Gjave firme salvade + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Modifiche descrizion + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Modifiche descrizion diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/fy-NL/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/fy-NL/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/fy-NL/viewer.ftl 2026-01-20 14:08:39.368689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/fy-NL/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Aktuele side (URL fan aktuele side besjen) pdfjs-bookmark-button-label = Aktuele side -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Iepenje yn app -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Iepenje yn app ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Bestânsnamme: pdfjs-document-properties-file-size = Bestânsgrutte: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) pdfjs-document-properties-title = Titel: pdfjs-document-properties-author = Auteur: pdfjs-document-properties-subject = Underwerp: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Oanmaakdatum: pdfjs-document-properties-modification-date = Bewurkingsdatum: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Makker: pdfjs-document-properties-producer = PDF-makker: pdfjs-document-properties-version = PDF-ferzje: @@ -188,8 +181,8 @@ .title = Lagen toane (dûbelklik om alle lagen nei de standertsteat werom te setten) pdfjs-layers-button-label = Lagen pdfjs-thumbs-button = - .title = Foarbylden toane -pdfjs-thumbs-button-label = Foarbylden + .title = Miniatueren toane +pdfjs-thumbs-button-label = Miniatueren pdfjs-current-outline-item-button = .title = Aktueel item yn ynhâldsopjefte sykje pdfjs-current-outline-item-button-label = Aktueel item yn ynhâldsopjefte @@ -207,7 +200,16 @@ # Variables: # $page (Number) - the page number pdfjs-thumb-page-canvas = - .aria-label = Foarbyld fan side { $page } + .aria-label = Miniatuer fan side { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Side { $page } selektearje +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Side { $page } fan { $total } ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type }-annotaasje] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Tekst +pdfjs-editor-color-picker-free-text-input = + .title = Tekstleur wizigje pdfjs-editor-free-text-button-label = Tekst pdfjs-editor-ink-button = .title = Tekenje +pdfjs-editor-color-picker-ink-input = + .title = Tekenkleur wizigje pdfjs-editor-ink-button-label = Tekenje pdfjs-editor-stamp-button = .title = Ofbyldingen tafoegje of bewurkje @@ -304,12 +309,37 @@ pdfjs-editor-highlight-button = .title = Markearje pdfjs-editor-highlight-button-label = Markearje -pdfjs-highlight-floating-button = - .title = Markearje pdfjs-highlight-floating-button1 = .title = Markearje .aria-label = Markearje pdfjs-highlight-floating-button-label = Markearje +pdfjs-comment-floating-button = + .title = Opmerking + .aria-label = Opmerking +pdfjs-comment-floating-button-label = Opmerking +pdfjs-editor-comment-button = + .title = Opmerking + .aria-label = Opmerking +pdfjs-editor-comment-button-label = Opmerking +pdfjs-editor-signature-button = + .title = Hantekening tafoegje +pdfjs-editor-signature-button-label = Hantekening tafoegje + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Markearingsbewurker +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Tekeningbewurker +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Undertekeningsbewurker: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Ofbyldingsbewurker ## Remove button for the various kind of editor. @@ -321,6 +351,8 @@ .title = Ofbylding fuortsmite pdfjs-editor-remove-highlight-button = .title = Markearring fuortsmite +pdfjs-editor-remove-signature-button = + .title = Hantekening fuortsmite ## @@ -337,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Tsjokte pdfjs-editor-free-highlight-thickness-title = .title = Tsjokte wizigje by aksintuearring fan oare items as tekst -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Undertekeningsynstellingen en bewarre ûndertekeningen +pdfjs-editor-signature-add-signature-button = + .title = Nije hantekening tafoegje +pdfjs-editor-signature-add-signature-button-label = Nije hantekening tafoegje +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Bewarre ûndertekening: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Tekstbewurker -pdfjs-free-text-default-content = Begjin mei typen… -pdfjs-ink = - .aria-label = Tekeningbewurker -pdfjs-ink-canvas = - .aria-label = Troch brûker makke ôfbylding + .default-content = Start mei typen… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Opmerking + *[other] Opmerkingen + } +pdfjs-editor-comments-sidebar-close-button = + .title = De sydbalke slute + .aria-label = De sydbalke slute +pdfjs-editor-comments-sidebar-close-button-label = De sydbalke slute +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Sjogge jo wat it neamen wurdich? Markearje it en lit in opmerking efter. +pdfjs-editor-comments-sidebar-no-comments-link = Mear ynfo ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Alternative tekst -pdfjs-editor-alt-text-edit-button-label = Alternative tekst bewurkje +pdfjs-editor-alt-text-edit-button = + .aria-label = Alternative tekst bewurkje pdfjs-editor-alt-text-dialog-label = Kies in opsje pdfjs-editor-alt-text-dialog-description = Alternative tekst helpt wannear’t minsken de ôfbylding net sjen kinne of wannear’t dizze net laden wurdt. pdfjs-editor-alt-text-add-description-label = Foegje in beskriuwing ta @@ -362,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Bygelyks, ‘In jonge man sit oan in tafel om te iten’ +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternative tekst ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Linkerboppehoek – formaat wizigje -pdfjs-editor-resizer-label-top-middle = Midden boppe – formaat wizigje -pdfjs-editor-resizer-label-top-right = Rjochterboppehoek – formaat wizigje -pdfjs-editor-resizer-label-middle-right = Midden rjochts – formaat wizigje -pdfjs-editor-resizer-label-bottom-right = Rjochterûnderhoek – formaat wizigje -pdfjs-editor-resizer-label-bottom-middle = Midden ûnder – formaat wizigje -pdfjs-editor-resizer-label-bottom-left = Linkerûnderhoek – formaat wizigje -pdfjs-editor-resizer-label-middle-left = Links midden – formaat wizigje +pdfjs-editor-resizer-top-left = + .aria-label = Linkerboppehoek – formaat wizigje +pdfjs-editor-resizer-top-middle = + .aria-label = Midden boppe – formaat wizigje +pdfjs-editor-resizer-top-right = + .aria-label = Rjochterboppehoek – formaat wizigje +pdfjs-editor-resizer-middle-right = + .aria-label = Midden rjochts – formaat wizigje +pdfjs-editor-resizer-bottom-right = + .aria-label = Rjochterûnderhoek – formaat wizigje +pdfjs-editor-resizer-bottom-middle = + .aria-label = Midden ûnder – formaat wizigje +pdfjs-editor-resizer-bottom-left = + .aria-label = Linkerûnderhoek – formaat wizigje +pdfjs-editor-resizer-middle-left = + .aria-label = Links midden – formaat wizigje ## Color picker @@ -400,3 +465,283 @@ pdfjs-editor-highlight-show-all-button-label = Alles toane pdfjs-editor-highlight-show-all-button = .title = Alles toane + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Alternative tekst (ôfbyldingsbeskriuwing) bewurkje +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Alternative tekst (ôfbyldingsbeskriuwing) tafoegje +pdfjs-editor-new-alt-text-textarea = + .placeholder = Skriuw hjir jo beskriuwing… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Koarte beskriuwing foar minsken dy’t de ôfbylding net sjen kinne of wannear’t de ôfbylding net laden wurdt. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Dizze alternative tekst is automatysk makke en is mooglik net korrekt. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Mear ynfo +pdfjs-editor-new-alt-text-create-automatically-button-label = Alternative tekst automatysk oanmeitsje +pdfjs-editor-new-alt-text-not-now-button = No net +pdfjs-editor-new-alt-text-error-title = Kin alternative tekst net automatysk oanmeitsje +pdfjs-editor-new-alt-text-error-description = Skriuw jo eigen alternative tekst of probearje it letter nochris. +pdfjs-editor-new-alt-text-error-close-button = Slute +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = AI-model foar alternative tekst downloade ({ $downloadedSize } fan { $totalSize } MB) + .aria-valuetext = AI-model foar alternative tekst downloade ({ $downloadedSize } fan { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternative tekst tafoege +pdfjs-editor-new-alt-text-added-button-label = Alternative tekst tafoege +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Alternative tekst ûntbrekt +pdfjs-editor-new-alt-text-missing-button-label = Alternative tekst ûntbrekt +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Alternative tekst beoardiele +pdfjs-editor-new-alt-text-to-review-button-label = Alternative tekst beoardiele +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automatysk oanmakke: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Ynstellingen foar alternative tekst fan ôfbyldingen +pdfjs-image-alt-text-settings-button-label = Ynstellingen foar alternative tekst fan ôfbyldingen +pdfjs-editor-alt-text-settings-dialog-label = Ynstellingen foar alternative tekst fan ôfbyldingen +pdfjs-editor-alt-text-settings-automatic-title = Automatyske alternative tekst +pdfjs-editor-alt-text-settings-create-model-button-label = Alternative tekst automatysk oanmeitsje +pdfjs-editor-alt-text-settings-create-model-description = Stelt beskriuwingen foar om minsken te helpen dy’t de ôfbylding net sjen kinne of foar wa’t de ôfbylding net laden wurdt. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = AI-model foar alternative tekst ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Wurdt lokaal op jo apparaat útfierd, sadat jo gegevens privee bliuwe. Fereaske foar automatyske alternative tekst. +pdfjs-editor-alt-text-settings-delete-model-button = Fuortsmite +pdfjs-editor-alt-text-settings-download-model-button = Downloade +pdfjs-editor-alt-text-settings-downloading-model-button = Downloade… +pdfjs-editor-alt-text-settings-editor-title = Alternative-tekstbewurker +pdfjs-editor-alt-text-settings-show-dialog-button-label = Alternative-tekstbewurker daliks toane by tafoegjen fan in ôfbylding +pdfjs-editor-alt-text-settings-show-dialog-description = Helpt jo derfoar te soargjen dat al jo ôfbyldingen alternative tekst hawwe. +pdfjs-editor-alt-text-settings-close-button = Slute + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Markearring tafoege +pdfjs-editor-freetext-added-alert = Tekst tafoege +pdfjs-editor-ink-added-alert = Tekening tafoege +pdfjs-editor-stamp-added-alert = Ofbylding tafoege +pdfjs-editor-signature-added-alert = Hantekening tafoege + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Markearring fuortsmiten +pdfjs-editor-undo-bar-message-freetext = Tekst fuortsmiten +pdfjs-editor-undo-bar-message-ink = Tekening fuortsmiten +pdfjs-editor-undo-bar-message-stamp = Ofbylding fuortsmiten +pdfjs-editor-undo-bar-message-signature = Hantekening fuortsmiten +pdfjs-editor-undo-bar-message-comment = Opmerking fuortsmiten +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } annotaasje fuortsmiten + *[other] { $count } annotaasjes fuortsmiten + } +pdfjs-editor-undo-bar-undo-button = + .title = Ungedien meitsje +pdfjs-editor-undo-bar-undo-button-label = Ungedien meitsje +pdfjs-editor-undo-bar-close-button = + .title = Slute +pdfjs-editor-undo-bar-close-button-label = Slute + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Mei dizze modal kin de brûker in hantekening meitsje om oan in PDF-dokumint ta te foegjen. De brûker kin de namme bewurkje (dy't ek tsjinnet as alternative tekst), en opsjoneel de ûndertekening bewarje foar werhelle gebrûk. +pdfjs-editor-add-signature-dialog-title = In hantekening tafoegje + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Type + .title = Type +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Tekenje + .title = Tekenje +pdfjs-editor-add-signature-image-button = Ofbylding + .title = Ofbylding + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Jo hantekening type + .placeholder = Jo hantekening type +pdfjs-editor-add-signature-draw-placeholder = Jo hantekening tekenje +pdfjs-editor-add-signature-draw-thickness-range-label = Tsjokte +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Tekentsjokte: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Sleep bestân hjirhinne om op te laden +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Of kies ôfbyldingsbestannen + *[other] Of kies ôfbyldingsbestannen + } + +## Controls + +pdfjs-editor-add-signature-description-label = Beskriuwing (alternative tekst) +pdfjs-editor-add-signature-description-input = + .title = Beskriuwing (alternative tekst) +pdfjs-editor-add-signature-description-default-when-drawing = Hantekening +pdfjs-editor-add-signature-clear-button-label = Hantekening wiskje +pdfjs-editor-add-signature-clear-button = + .title = Hantekening wiskje +pdfjs-editor-add-signature-save-checkbox = Hantekening bewarje +pdfjs-editor-add-signature-save-warning-message = Jo hawwe de limyt fan 5 bewarre hantekeningen berikt. Ferwiderje ien om in oar te bewarjen. +pdfjs-editor-add-signature-image-upload-error-title = Kin de ôfbylding net oplade +pdfjs-editor-add-signature-image-upload-error-description = Kontrolearje jo netwurkferbining of probearje in oare ôfbylding. +pdfjs-editor-add-signature-image-no-data-error-title = Kin dizze ôfbylding net nei in hantekening konvertearje +pdfjs-editor-add-signature-image-no-data-error-description = Probearje in oare ôfbylding op te laden. +pdfjs-editor-add-signature-error-close-button = Slute + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Annulearje +pdfjs-editor-add-signature-add-button = Tafoegje +pdfjs-editor-edit-signature-update-button = Bywurkje + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Opmerking bewurkje +pdfjs-editor-edit-comment-popup-button = + .title = Opmerking bewurkje +pdfjs-editor-delete-comment-popup-button-label = Opmerking fuortsmite +pdfjs-editor-delete-comment-popup-button = + .title = Opmerking fuortsmite +pdfjs-show-comment-button = + .title = Opmerking toane + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Opmerking bewurkje +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Bywurkje +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Opmerking tafoegje +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Tafoegje +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Begjin mei typen… +pdfjs-editor-edit-comment-dialog-cancel-button = Annulearje + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Opmerking tafoegje + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Sidebalke yn-/útskeakelje (dokumint befettet miniatueren/oersjoch/bylagen/lagen) +pdfjs-toggle-views-manager-button1-label = Siden beheare +pdfjs-views-manager-sidebar = + .aria-label = Sidebalke +pdfjs-views-manager-sidebar-resizer = + .aria-label = Gruttewiziging sydbalke +pdfjs-views-manager-view-selector-button = + .title = Werjeften +pdfjs-views-manager-view-selector-button-label = Werjeften +pdfjs-views-manager-pages-title = Siden +pdfjs-views-manager-outlines-title1 = Dokumintoersjoch + .title = Dokumintoersjoch (dûbelklik om alle items út/yn te klappen) +pdfjs-views-manager-attachments-title = Bylagen +pdfjs-views-manager-layers-title1 = Lagen + .title = Lagen (dûbelklik om alle lagen nei de standertstatus werom te setten) +pdfjs-views-manager-pages-option-label = Siden +pdfjs-views-manager-outlines-option-label = Dokumintoersjoch +pdfjs-views-manager-attachments-option-label = Bylagen +pdfjs-views-manager-layers-option-label = Lagen +pdfjs-views-manager-add-file-button = + .title = Bestân tafoegje +pdfjs-views-manager-add-file-button-label = Bestân tafoegje +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } selektearre + *[other] { $count } selektearre + } +pdfjs-views-manager-pages-status-none-action-label = Siden selektearje +pdfjs-views-manager-pages-status-action-button-label = Beheare +pdfjs-views-manager-pages-status-copy-button-label = Kopiearje +pdfjs-views-manager-pages-status-cut-button-label = Knippe +pdfjs-views-manager-pages-status-delete-button-label = Fuortsmite +pdfjs-views-manager-pages-status-export-selected-button-label = Selektearre eksportearje… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 side knipt + *[other] { $count } siden knipt + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 side kopiearre + *[other] { $count } siden kopiearre + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 side fuortsmiten + *[other] { $count } siden fuortsmiten + } +pdfjs-views-manager-pages-status-waiting-ready-label = Jo bestân tariede… +pdfjs-views-manager-pages-status-waiting-uploading-label = Bestân oplade… +pdfjs-views-manager-status-warning-cut-label = Kin net knippe. Ferfarskje de side en probearje it opnij. +pdfjs-views-manager-status-warning-copy-label = Kin net kopiearje. Ferfarskje de side en probearje it opnij. +pdfjs-views-manager-status-warning-delete-label = Kin net fuortsmite. Ferfarskje de side en probearje it opnij. +pdfjs-views-manager-status-warning-save-label = Kin net bewarje. Ferfarskje de side en probearje it opnij. +pdfjs-views-manager-status-undo-button-label = Ungedien meitsje +pdfjs-views-manager-status-done-button-label = Dien +pdfjs-views-manager-status-close-button = + .title = Slute +pdfjs-views-manager-status-close-button-label = Slute +pdfjs-views-manager-paste-button-label = Plakke +pdfjs-views-manager-paste-button-before = + .title = Plakke foar de earste side +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Plakke nei side { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NIJ +pdfjs-views-manager-waiting-for-file = Bestân oplade… +pdfjs-toggle-views-manager-button1 = + .title = Siden beheare + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Bewarre ûndertekening fuortsmite +pdfjs-editor-delete-signature-button-label1 = Bewarre ûndertekening fuortsmite + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Beskriuwing bewurkje + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Beskriuwing bewurkje diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ga-IE/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ga-IE/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ga-IE/viewer.ftl 2026-01-20 14:08:39.368689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ga-IE/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -71,37 +71,17 @@ pdfjs-document-properties-button-label = Airíonna na Cáipéise… pdfjs-document-properties-file-name = Ainm an chomhaid: pdfjs-document-properties-file-size = Méid an chomhaid: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } beart) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } beart) pdfjs-document-properties-title = Teideal: pdfjs-document-properties-author = Údar: pdfjs-document-properties-subject = Ábhar: pdfjs-document-properties-keywords = Eochairfhocail: pdfjs-document-properties-creation-date = Dáta Cruthaithe: pdfjs-document-properties-modification-date = Dáta Athraithe: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Cruthaitheoir: pdfjs-document-properties-producer = Cruthaitheoir an PDF: pdfjs-document-properties-version = Leagan PDF: pdfjs-document-properties-page-count = Líon Leathanach: -## Variables: -## $width (Number) - the width of the (current) page -## $height (Number) - the height of the (current) page -## $unit (String) - the unit of measurement of the (current) page -## $name (String) - the name of the (current) page -## $orientation (String) - the orientation of the (current) page - - ## pdfjs-document-properties-close-button = Dún @@ -173,9 +153,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = Tharla earráid agus an cháipéis PDF á lódáil. @@ -201,13 +178,3 @@ pdfjs-password-ok-button = OK pdfjs-password-cancel-button = Cealaigh pdfjs-web-fonts-disabled = Tá clófhoirne Gréasáin díchumasaithe: ní féidir clófhoirne leabaithe PDF a úsáid. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/gd/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/gd/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/gd/viewer.ftl 2026-01-20 14:08:39.369689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/gd/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -45,12 +45,6 @@ pdfjs-bookmark-button = .title = An duilleag làithreach (Seall an URL on duilleag làithreach) pdfjs-bookmark-button-label = An duilleag làithreach -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Fosgail san aplacaid -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Fosgail san aplacaid ## Secondary toolbar and context menu @@ -104,24 +98,12 @@ pdfjs-document-properties-button-label = Roghainnean na sgrìobhainne… pdfjs-document-properties-file-name = Ainm an fhaidhle: pdfjs-document-properties-file-size = Meud an fhaidhle: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Tiotal: pdfjs-document-properties-author = Ùghdar: pdfjs-document-properties-subject = Cuspair: pdfjs-document-properties-keywords = Faclan-luirg: pdfjs-document-properties-creation-date = Latha a chruthachaidh: pdfjs-document-properties-modification-date = Latha atharrachaidh: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Cruthadair: pdfjs-document-properties-producer = Saothraiche a' PDF: pdfjs-document-properties-version = Tionndadh a' PDF: @@ -249,10 +231,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -277,23 +255,12 @@ pdfjs-editor-ink-button = .title = Tarraing pdfjs-editor-ink-button-label = Tarraing + +## + # Editor Parameters pdfjs-editor-free-text-color-input = Dath pdfjs-editor-free-text-size-input = Meud pdfjs-editor-ink-color-input = Dath pdfjs-editor-ink-thickness-input = Tighead pdfjs-editor-ink-opacity-input = Trìd-dhoilleireachd -pdfjs-free-text = - .aria-label = An deasaiche teacsa -pdfjs-free-text-default-content = Tòisich air sgrìobhadh… -pdfjs-ink = - .aria-label = An deasaiche tharraingean -pdfjs-ink-canvas = - .aria-label = Dealbh a chruthaich cleachdaiche - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/gl/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/gl/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/gl/viewer.ftl 2026-01-20 14:08:39.369689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/gl/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Páxina actual (ver o URL da páxina actual) pdfjs-bookmark-button-label = Páxina actual -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Abrir cunha aplicación -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Abrir cunha aplicación ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Nome do ficheiro: pdfjs-document-properties-file-size = Tamaño do ficheiro: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) pdfjs-document-properties-title = Título: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Asunto: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Data de creación: pdfjs-document-properties-modification-date = Data de modificación: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Creado por: pdfjs-document-properties-producer = Xenerador do PDF: pdfjs-document-properties-version = Versión de PDF: @@ -270,10 +263,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +270,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Anotación { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -301,15 +293,45 @@ pdfjs-editor-stamp-button = .title = Engadir ou editar imaxes pdfjs-editor-stamp-button-label = Engadir ou editar imaxes +pdfjs-editor-highlight-button = + .title = Destacar +pdfjs-editor-highlight-button-label = Destacar +pdfjs-highlight-floating-button1 = + .title = Destacar + .aria-label = Destacar +pdfjs-highlight-floating-button-label = Destacar +pdfjs-editor-signature-button = + .title = Engadir sinatura +pdfjs-editor-signature-button-label = Engadir sinatura + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Editor de destacados +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Editor de debuxos +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Editor de sinaturas: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Editor de imaxes ## Remove button for the various kind of editor. +pdfjs-editor-remove-ink-button = + .title = Eliminar debuxo pdfjs-editor-remove-freetext-button = .title = Eliminar o texto pdfjs-editor-remove-stamp-button = .title = Eliminar a imaxe pdfjs-editor-remove-highlight-button = .title = Eliminar o resaltado +pdfjs-editor-remove-signature-button = + .title = Eliminar sinatura ## @@ -324,21 +346,32 @@ pdfjs-editor-stamp-add-image-button-label = Engadir imaxe # This refers to the thickness of the line used for free highlighting (not bound to text) pdfjs-editor-free-highlight-thickness-input = Grosor -pdfjs-free-text = +pdfjs-editor-free-highlight-thickness-title = + .title = Cambiar o grosor ao resaltar elementos que non sexan texto +pdfjs-editor-add-signature-container = + .aria-label = Controis de sinaturas e sinaturas gardadas +pdfjs-editor-signature-add-signature-button = + .title = Engadir nova sinatura +pdfjs-editor-signature-add-signature-button-label = Engadir nova sinatura +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Sinatura gardada: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Editor de texto -pdfjs-free-text-default-content = Comezar a teclear… -pdfjs-ink = - .aria-label = Editor de debuxos -pdfjs-ink-canvas = - .aria-label = Imaxe creada por unha usuaria + .default-content = Empeza a escribir... ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Texto alternativo -pdfjs-editor-alt-text-edit-button-label = Editar o texto alternativo +pdfjs-editor-alt-text-edit-button = + .aria-label = Editar o texto alternativo pdfjs-editor-alt-text-dialog-label = Escoller unha opción +pdfjs-editor-alt-text-dialog-description = O texto alternativo (texto alt) axuda cando as persoas non poden ver a imaxe ou cando non se carga. pdfjs-editor-alt-text-add-description-label = Engadir unha descrición +pdfjs-editor-alt-text-add-description-description = Tenta escribir 1-2 frases que describan o tema, o escenario ou as accións. pdfjs-editor-alt-text-mark-decorative-label = Marcar como decorativo pdfjs-editor-alt-text-mark-decorative-description = Utilízase para imaxes ornamentais, como bordos ou marcas de auga. pdfjs-editor-alt-text-cancel-button = Cancelar @@ -347,18 +380,212 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Por exemplo, «Un mozo séntase á mesa para comer» +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Texto alternativo ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Esquina superior esquerda: cambia o tamaño -pdfjs-editor-resizer-label-top-middle = Medio superior: cambia o tamaño -pdfjs-editor-resizer-label-top-right = Esquina superior dereita: cambia o tamaño -pdfjs-editor-resizer-label-middle-right = Medio dereito: cambia o tamaño -pdfjs-editor-resizer-label-bottom-right = Esquina inferior dereita: cambia o tamaño -pdfjs-editor-resizer-label-bottom-middle = Abaixo medio: cambia o tamaño -pdfjs-editor-resizer-label-bottom-left = Esquina inferior esquerda: cambia o tamaño -pdfjs-editor-resizer-label-middle-left = Medio esquerdo: cambia o tamaño +pdfjs-editor-resizer-top-left = + .aria-label = Esquina superior esquerda: cambia o tamaño +pdfjs-editor-resizer-top-middle = + .aria-label = Medio superior: cambia o tamaño +pdfjs-editor-resizer-top-right = + .aria-label = Esquina superior dereita: cambia o tamaño +pdfjs-editor-resizer-middle-right = + .aria-label = Medio dereito: cambia o tamaño +pdfjs-editor-resizer-bottom-right = + .aria-label = Esquina inferior dereita: cambia o tamaño +pdfjs-editor-resizer-bottom-middle = + .aria-label = Abaixo medio: cambia o tamaño +pdfjs-editor-resizer-bottom-left = + .aria-label = Esquina inferior esquerda: cambia o tamaño +pdfjs-editor-resizer-middle-left = + .aria-label = Medio esquerdo: cambia o tamaño ## Color picker +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Cor de resaltado +pdfjs-editor-colorpicker-button = + .title = Cambiar de cor +pdfjs-editor-colorpicker-dropdown = + .aria-label = Opcións de cor +pdfjs-editor-colorpicker-yellow = + .title = Amarelo +pdfjs-editor-colorpicker-green = + .title = Verde +pdfjs-editor-colorpicker-blue = + .title = Azul +pdfjs-editor-colorpicker-pink = + .title = Rosa +pdfjs-editor-colorpicker-red = + .title = Vermello + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Amosar todo +pdfjs-editor-highlight-show-all-button = + .title = Amosar todo + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descrición da imaxe) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Engadir texto alternativo (descrición da imaxe) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Escribe a túa descrición aquí... +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Breve descrición para as persoas que non poden ver a imaxe ou cando a imaxe non carga. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo creouse automaticamente e pode ser inexacto. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Máis información +pdfjs-editor-new-alt-text-create-automatically-button-label = Crea texto alternativo automaticamente +pdfjs-editor-new-alt-text-not-now-button = Agora non +pdfjs-editor-new-alt-text-error-title = Non se puido crear o texto alternativo automaticamente +pdfjs-editor-new-alt-text-error-description = Escribe o teu propio texto alternativo ou téntao de novo máis tarde. +pdfjs-editor-new-alt-text-error-close-button = Pechar +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Descargando o modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) + .aria-valuetext = Descargando o modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Texto alternativo engadido +pdfjs-editor-new-alt-text-added-button-label = Texto alternativo engadido +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Falta o texto alternativo +pdfjs-editor-new-alt-text-missing-button-label = Falta o texto alternativo +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Revisar o texto alternativo +pdfjs-editor-new-alt-text-to-review-button-label = Revisar o texto alternativo +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creado automaticamente: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Configuración do texto alternativo da imaxe +pdfjs-image-alt-text-settings-button-label = Configuración do texto alternativo da imaxe +pdfjs-editor-alt-text-settings-dialog-label = Configuración do texto alternativo da imaxe +pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo automático +pdfjs-editor-alt-text-settings-create-model-button-label = Crear texto alternativo automaticamente +pdfjs-editor-alt-text-settings-create-model-description = Suxire descricións para axudar ás persoas que non poden ver a imaxe ou cando a imaxe non se carga. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modelo de IA de texto alternativo ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Funciona localmente no teu dispositivo para que os teus datos se manteñan privados. Necesario para o texto alternativo automático. +pdfjs-editor-alt-text-settings-delete-model-button = Eliminar +pdfjs-editor-alt-text-settings-download-model-button = Descargar +pdfjs-editor-alt-text-settings-downloading-model-button = Descargando… +pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar o editor de texto alternativo inmediatamente ao engadir unha imaxe +pdfjs-editor-alt-text-settings-show-dialog-description = Axúdache a asegurarte de que todas as túas imaxes teñan texto alternativo. +pdfjs-editor-alt-text-settings-close-button = Pechar + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Resaltado engadido +pdfjs-editor-freetext-added-alert = Texto engadido +pdfjs-editor-ink-added-alert = Debuxo engadido +pdfjs-editor-stamp-added-alert = Imaxe engadida +pdfjs-editor-signature-added-alert = Sinatura engadida + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Resaltado eliminado +pdfjs-editor-undo-bar-message-freetext = Texto eliminado +pdfjs-editor-undo-bar-message-ink = Debuxo eliminado +pdfjs-editor-undo-bar-message-stamp = Imaxe eliminada +pdfjs-editor-undo-bar-message-signature = Sinatura eliminada +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] Eliminouse { $count } anotación + *[other] Elimináronse { $count } anotacións + } +pdfjs-editor-undo-bar-undo-button = + .title = Desfacer +pdfjs-editor-undo-bar-undo-button-label = Desfacer +pdfjs-editor-undo-bar-close-button = + .title = Pechar +pdfjs-editor-undo-bar-close-button-label = Pechar + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Este modal permite ao usuario crear unha sinatura para engadila a un documento PDF. O usuario pode editar o nome (que tamén serve como texto alternativo) e, opcionalmente, gardar a sinatura para usala novamente. +pdfjs-editor-add-signature-dialog-title = Engadir unha sinatura + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Tipo + .title = Tipo +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Debuxar + .title = Debuxar +pdfjs-editor-add-signature-image-button = Imaxe + .title = Imaxe + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Escribe a túa sinatura + .placeholder = Escribe a túa sinatura +pdfjs-editor-add-signature-draw-placeholder = Debuxa a túa sinatura +pdfjs-editor-add-signature-draw-thickness-range-label = Grosor +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Grosor do debuxo: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Arrastra un ficheiro aquí para cargalo +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Ou selecciona ficheiros de imaxes + *[other] Ou navega ficheiros de imaxes + } + +## Controls + +pdfjs-editor-add-signature-description-label = Descrición (texto alternativo) +pdfjs-editor-add-signature-description-input = + .title = Descrición (texto alternativo) +pdfjs-editor-add-signature-description-default-when-drawing = Sinatura +pdfjs-editor-add-signature-clear-button-label = Borrar a sinatura +pdfjs-editor-add-signature-clear-button = + .title = Borrar a sinatura +pdfjs-editor-add-signature-save-checkbox = Gardar a sinatura +pdfjs-editor-add-signature-save-warning-message = Acadaches o límite de 5 sinaturas gardadas. Elimina unha para gardar máis. +pdfjs-editor-add-signature-image-upload-error-title = Non se puido cargar a imaxe +pdfjs-editor-add-signature-image-upload-error-description = Comproba a túa conexión de rede ou proba con outra imaxe. +pdfjs-editor-add-signature-error-close-button = Pechar + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Cancelar +pdfjs-editor-add-signature-add-button = Engadir +pdfjs-editor-edit-signature-update-button = Actualizar + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Eliminar a sinatura gardada +pdfjs-editor-delete-signature-button-label1 = Eliminar a sinatura gardada + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Editar descrición + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Editar descrición diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/gn/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/gn/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/gn/viewer.ftl 2026-01-20 14:08:39.369689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/gn/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Kuatiarogue ag̃agua (Ehecha URL kuatiarogue ag̃agua) pdfjs-bookmark-button-label = Kuatiarogue Ag̃agua -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Embojuruja tembiporu’ípe -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Embojuruja tembiporu’ípe ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Marandurenda réra: pdfjs-document-properties-file-size = Marandurenda tuichakue: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) pdfjs-document-properties-title = Teratee: pdfjs-document-properties-author = Apohára: pdfjs-document-properties-subject = Mba’egua: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Teñoihague arange: pdfjs-document-properties-modification-date = Iñambue hague arange: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Apo’ypyha: pdfjs-document-properties-producer = PDF mbosako’iha: pdfjs-document-properties-version = PDF mbojuehegua: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Kuatiarogue mba’emirĩ { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Eiporavo kuatiarogue { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Kuatiarogue { $page } { $total } mba’e ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Jehaipy { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Moñe’ẽrã +pdfjs-editor-color-picker-free-text-input = + .title = Emoambue moñe’ẽrã sa’y pdfjs-editor-free-text-button-label = Moñe’ẽrã pdfjs-editor-ink-button = .title = Moha’ãnga +pdfjs-editor-color-picker-ink-input = + .title = Emoambue ta’ãnga sa’y pdfjs-editor-ink-button-label = Moha’ãnga pdfjs-editor-stamp-button = .title = Embojuaju térã embosako’i ta’ãnga @@ -304,6 +309,37 @@ pdfjs-editor-highlight-button = .title = Mbosa’y pdfjs-editor-highlight-button-label = Mbosa’y +pdfjs-highlight-floating-button1 = + .title = Mbosa’y + .aria-label = Mbosa’y +pdfjs-highlight-floating-button-label = Mbosa’y +pdfjs-comment-floating-button = + .title = Je’erei + .aria-label = Je’erei +pdfjs-comment-floating-button-label = Je’erei +pdfjs-editor-comment-button = + .title = Je’erei + .aria-label = Je’erei +pdfjs-editor-comment-button-label = Je’erei +pdfjs-editor-signature-button = + .title = Embojuaju teraguapy +pdfjs-editor-signature-button-label = Embojuaju teraguapy + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Jehechaukarã mbosako’iha +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Ta’ãnga’apo moheñoiha +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Teraguapy mbosako’iha: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Ta’ãnga mbosako’iha ## Remove button for the various kind of editor. @@ -315,6 +351,8 @@ .title = Emboguete ta’ãnga pdfjs-editor-remove-highlight-button = .title = Eipe’a jehechaveha +pdfjs-editor-remove-signature-button = + .title = Embogue teraguapy ## @@ -331,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Anambusu pdfjs-editor-free-highlight-thickness-title = .title = Emoambue anambusukue embosa’ývo mba’eporu ha’e’ỹva moñe’ẽrã -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Teraguapy ñemaña ha teraguapy ñongatupyre +pdfjs-editor-signature-add-signature-button = + .title = Embojuaju teraguapy pyahu +pdfjs-editor-signature-add-signature-button-label = Embojuaju teraguapy pyahu +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Teraguapy ñongatupyre: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Moñe’ẽrã moheñoiha -pdfjs-free-text-default-content = Ehai ñepyrũ… -pdfjs-ink = - .aria-label = Ta’ãnga moheñoiha -pdfjs-ink-canvas = - .aria-label = Ta’ãnga omoheñóiva poruhára + .default-content = Eñepyrũ ehai… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Je’erei + *[other] Je’ereieta + } +pdfjs-editor-comments-sidebar-close-button = + .title = Emboty ta'ãngarupa yke + .aria-label = Emboty ta'ãngarupa yke +pdfjs-editor-comments-sidebar-close-button-label = Emboty ta'ãngarupa yke +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = ¿Ehechápa peteĩ mbaʼe iporãva? Emomba’e ha eheja jehaipy. +pdfjs-editor-comments-sidebar-no-comments-link = Kuaave ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Moñe’ẽrã mokõiháva -pdfjs-editor-alt-text-edit-button-label = Embojuruja moñe’ẽrã mokõiháva +pdfjs-editor-alt-text-edit-button = + .aria-label = Embojuruja moñe’ẽrã mokõiháva pdfjs-editor-alt-text-dialog-label = Eiporavo poravorã pdfjs-editor-alt-text-dialog-description = Moñe’ẽrã ykepegua (moñe’ẽrã ykepegua) nepytyvõ nderehecháiramo ta’ãnga térã nahenyhẽiramo. pdfjs-editor-alt-text-add-description-label = Embojuaju ñemoha’ãnga @@ -356,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Techapyrã: “Peteĩ mitãrusu oguapy mesápe okaru hag̃ua” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Moñe’ẽrã mokõiháva ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Yvate asu gotyo — emoambue tuichakue -pdfjs-editor-resizer-label-top-middle = Yvate mbytépe — emoambue tuichakue -pdfjs-editor-resizer-label-top-right = Yvate akatúape — emoambue tuichakue -pdfjs-editor-resizer-label-middle-right = Mbyte akatúape — emoambue tuichakue -pdfjs-editor-resizer-label-bottom-right = Yvy gotyo akatúape — emoambue tuichakue -pdfjs-editor-resizer-label-bottom-middle = Yvy gotyo mbytépe — emoambue tuichakue -pdfjs-editor-resizer-label-bottom-left = Iguýpe asu gotyo — emoambue tuichakue -pdfjs-editor-resizer-label-middle-left = Mbyte asu gotyo — emoambue tuichakue +pdfjs-editor-resizer-top-left = + .aria-label = Yvate asu gotyo — emoambue tuichakue +pdfjs-editor-resizer-top-middle = + .aria-label = Yvate mbytépe — emoambue tuichakue +pdfjs-editor-resizer-top-right = + .aria-label = Yvate akatúape — emoambue tuichakue +pdfjs-editor-resizer-middle-right = + .aria-label = Mbyte akatúape — emoambue tuichakue +pdfjs-editor-resizer-bottom-right = + .aria-label = Yvy gotyo akatúape — emoambue tuichakue +pdfjs-editor-resizer-bottom-middle = + .aria-label = Yvy gotyo mbytépe — emoambue tuichakue +pdfjs-editor-resizer-bottom-left = + .aria-label = Iguýpe asu gotyo — emoambue tuichakue +pdfjs-editor-resizer-middle-left = + .aria-label = Mbyte asu gotyo — emoambue tuichakue ## Color picker @@ -387,3 +458,289 @@ .title = Pytãngy pdfjs-editor-colorpicker-red = .title = Pyha + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Techaukapa +pdfjs-editor-highlight-show-all-button = + .title = Techaukapa + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Embosako’i moñe’ẽrã mokõiha (ta’ãngáre ñeñe’ẽ) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Embojuaju moñe’ẽrã mokõiha (ta’ãngáre ñeñe’ẽ) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Edescribi ko’ápe… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Ñemyesakã mbykymi opavave ohecha’ỹva upe ta’ãnga térã pe ta’ãnga nahenyhẽiramo. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Ko moñe’ẽrã mokõiha oñemoheñói ijehegui ha ikatu ndoikoporãi. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Eikuaave +pdfjs-editor-new-alt-text-create-automatically-button-label = Emoheñói moñe’ẽrã mokõiha ijeheguíva +pdfjs-editor-new-alt-text-not-now-button = Ani ko’ág̃a +pdfjs-editor-new-alt-text-error-title = Noñemoheñói moñe’ẽrã mokõiha ijeheguíva +pdfjs-editor-new-alt-text-error-description = Ehai ne moñe’ẽrã mokõiha térã eha’ã jey ag̃amieve. +pdfjs-editor-new-alt-text-error-close-button = Mboty +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Emboguejyhína IA moñe’ẽrã mokõiháva ({ $downloadedSize } { $totalSize } MB) mba’e + .aria-valuetext = Emboguejyhína IA moñe’ẽrã mokõiháva ({ $downloadedSize } { $totalSize } MB) mba’e +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Moñe’ẽrã mokõiha mbojuajupyre +pdfjs-editor-new-alt-text-added-button-label = Oñembojuaju moñe’ẽrã mokõiha +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Ndaipóri moñe’ẽrã mokõiha +pdfjs-editor-new-alt-text-missing-button-label = Ndaipóri moñe’ẽrã mokõiha +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Ehechajey moñe’ẽrã mokõiha +pdfjs-editor-new-alt-text-to-review-button-label = Ehechajey moñe’ẽrã mokõiha +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Heñóiva ijeheguiete: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Ta’ãnga moñe’ẽrã mokõiha ñemboheko +pdfjs-image-alt-text-settings-button-label = Ta’ãnga moñe’ẽrã mokõiha ñemboheko +pdfjs-editor-alt-text-settings-dialog-label = Ta’ãnga moñe’ẽrã mokõiha ñemboheko +pdfjs-editor-alt-text-settings-automatic-title = Moñe’ẽrã mokõiha ijeheguíva +pdfjs-editor-alt-text-settings-create-model-button-label = Emoheñói moñe’ẽrã mokõiha ijeheguíva +pdfjs-editor-alt-text-settings-create-model-description = Ñemyesakã mbykymi opavave tapicha ohecha’ỹva upe ta’ãnga térã pe ta’ãnga nahenyhẽiramo. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Peteĩva IA moñe’ẽrã mokõiha ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Oku’e mba’e’okaitépe umi mba’ekuaarã hekoñemi hag̃ua. Tekotevẽva moñe’ẽrã ykegua ijeheguívape. +pdfjs-editor-alt-text-settings-delete-model-button = Mboguete +pdfjs-editor-alt-text-settings-download-model-button = Mboguejy +pdfjs-editor-alt-text-settings-downloading-model-button = Emboguejyhína… +pdfjs-editor-alt-text-settings-editor-title = Moñe’ẽrã mokõiha mbosako’iha +pdfjs-editor-alt-text-settings-show-dialog-button-label = Ehechauka moñe’ẽrã mokõiha mbosako’iha embojuajúvo ta’ãnga +pdfjs-editor-alt-text-settings-show-dialog-description = Nepytyvõta ta’ãngakuéra orekotaha moñe’ẽrã mokõiha. +pdfjs-editor-alt-text-settings-close-button = Mboty + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Techaukarã juajupyre +pdfjs-editor-freetext-added-alert = Moñe’ẽrã juajupyre +pdfjs-editor-ink-added-alert = Ta’ãnga juajupyre +pdfjs-editor-stamp-added-alert = Ta’ãnga juajupyre +pdfjs-editor-signature-added-alert = Teraguapy juajupyre + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Mbosa’ýva mboguete +pdfjs-editor-undo-bar-message-freetext = Moñe’ẽrã mboguepyre +pdfjs-editor-undo-bar-message-ink = Ta’ãnga mboguepyre +pdfjs-editor-undo-bar-message-stamp = Ta’ãnga mboguepyre +pdfjs-editor-undo-bar-message-signature = Teraguapy mboguepyre +pdfjs-editor-undo-bar-message-comment = Je’epy mboguepyre +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } jehaikue mboguepyre + *[other] { $count } jehaikue mboguepyre + } +pdfjs-editor-undo-bar-undo-button = + .title = Mboguevi +pdfjs-editor-undo-bar-undo-button-label = Mboguevi +pdfjs-editor-undo-bar-close-button = + .title = Mboty +pdfjs-editor-undo-bar-close-button-label = Mboty + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-title = Embojuaju teraguapy + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Jehai + .title = Jehai +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Moha’ãnga + .title = Moha’ãnga +pdfjs-editor-add-signature-image-button = Ta’ãnga + .title = Ta’ãnga + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Ehai nde reraguapy + .placeholder = Ehai nde reraguapy +pdfjs-editor-add-signature-draw-placeholder = Emoha’ãnga nde reraguapy +pdfjs-editor-add-signature-draw-thickness-range-label = Anambusu +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Ta’ãnga anambusukue: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Egueru marandurenda ápe ehupi hag̃ua +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Eiporavo ta’ãnga marandurenda + *[other] Eiporavo ta’ãnga marandurenda + } + +## Controls + +pdfjs-editor-add-signature-description-label = Moha’ãnga (moñe’ẽrã ykepegua) +pdfjs-editor-add-signature-description-input = + .title = Moha’ãnga (moñe’ẽrã ykepegua) +pdfjs-editor-add-signature-description-default-when-drawing = Teraguapy +pdfjs-editor-add-signature-clear-button-label = Emboguete teraguapy +pdfjs-editor-add-signature-clear-button = + .title = Emboguete teraguapy +pdfjs-editor-add-signature-save-checkbox = Eñongatu teraguapy +pdfjs-editor-add-signature-save-warning-message = Ehupytýma 5 mboheraguapy ñongatupyre. Embogue peteĩ eñongatukuaa jey hag̃ua. +pdfjs-editor-add-signature-image-upload-error-title = Ndaikatúi ojehupi pe ta’ãnga +pdfjs-editor-add-signature-image-upload-error-description = Ehechajey ne ñanduti oikópa térã aha’ã ambue ta’ãnga ndive. +pdfjs-editor-add-signature-image-no-data-error-title = Ndaikatúi ejapo ko ta’ãngágui teraguapy +pdfjs-editor-add-signature-image-no-data-error-description = Eñeha’ãkena ehupi ambuéva ta’ãnga. +pdfjs-editor-add-signature-error-close-button = Mboty + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Heja +pdfjs-editor-add-signature-add-button = Mbojuaju +pdfjs-editor-edit-signature-update-button = Mbohekopyahu + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Je’erei mbosako’i +pdfjs-editor-edit-comment-popup-button = + .title = Je’erei mbosako’i +pdfjs-editor-delete-comment-popup-button-label = Je’erei mboguete +pdfjs-editor-delete-comment-popup-button = + .title = Je’erei mboguete +pdfjs-show-comment-button = + .title = Ehechauka je’epy + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Je’erei mbosako’i +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Mbohekopyahu +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Je’erei mbojuaju +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Mbojuaju +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Ehai ñepyrũ… +pdfjs-editor-edit-comment-dialog-cancel-button = Eheja + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Je’erei mbojuaju + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Embojopyru tenda ykegua (kuatia oguereko mba’e’i, kuaakaha/moirũha/ñuãha) +pdfjs-toggle-views-manager-button1-label = Eñangareko kuotiarogue +pdfjs-views-manager-sidebar = + .aria-label = Ta’ãngarupa yke +pdfjs-views-manager-sidebar-resizer = + .aria-label = Tuichakue mongu’eha tenda yképe +pdfjs-views-manager-view-selector-button = + .title = Hechaha +pdfjs-views-manager-view-selector-button-label = Hechaha +pdfjs-views-manager-pages-title = Kuatiarogue +pdfjs-views-manager-outlines-title1 = Kuatiaite jejapopy + .title = Kuatiaite jejapopy (eikutu jo’a emyasãi hag̃ua/emomichĩmbaite mba’eporuita) +pdfjs-views-manager-attachments-title = Moirũha +pdfjs-views-manager-layers-title1 = Ñuãhaita + .title = Ñuãhaita (eikutu jo’a erupaite jey hag̃ua ñuãhaita oĩ haguepevoi) +pdfjs-views-manager-pages-option-label = Kuatiarogueita +pdfjs-views-manager-outlines-option-label = Kuatiaite jejapopy +pdfjs-views-manager-attachments-option-label = Moirũhaita +pdfjs-views-manager-layers-option-label = Ñuãhaita +pdfjs-views-manager-add-file-button = + .title = Embojuaju marandurenda +pdfjs-views-manager-add-file-button-label = Embojuaju marandurenda +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } poravopyre + *[other] { $count } poravopyre + } +pdfjs-views-manager-pages-status-none-action-label = Eiporavo kuatiarogue +pdfjs-views-manager-pages-status-action-button-label = Ñangareko +pdfjs-views-manager-pages-status-copy-button-label = Monguatia +pdfjs-views-manager-pages-status-cut-button-label = Kytĩ +pdfjs-views-manager-pages-status-delete-button-label = Mboguete +pdfjs-views-manager-pages-status-export-selected-button-label = Eguerahauka poravopyre… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 kuatiarogue kytĩmbyre + *[other] { $count } kuatiarogue kytĩmbyre + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 kuatiarogue monguatiapyre + *[other] { $count } kuatiarogue monguatiapyre + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 kuatiarogue mboguepyre + *[other] { $count } kuatiarogue mboguepyre + } +pdfjs-views-manager-pages-status-waiting-ready-label = Embosako’ihína ne marandurenda… +pdfjs-views-manager-pages-status-waiting-uploading-label = Ehupihína marandurenda… +pdfjs-views-manager-status-warning-cut-label = Ndaikatúi oñekytĩ. Embopyahu kuatiarogue ha eha’ã jey. +pdfjs-views-manager-status-warning-copy-label = Ndaikatúi oñembokuatia. Embopyahu kuatiarogue ha eha’ã jey. +pdfjs-views-manager-status-warning-delete-label = Ndaikatúi embogue. Embopyahu kuatiarogue ha eha’ã jey. +pdfjs-views-manager-status-warning-save-label = Ndaikatúi eñongatu. Embopyahu kuatiarogue ha eha’ã jey. +pdfjs-views-manager-status-undo-button-label = Mboguevi +pdfjs-views-manager-status-done-button-label = Oĩma +pdfjs-views-manager-status-close-button = + .title = Mboty +pdfjs-views-manager-status-close-button-label = Mboty +pdfjs-views-manager-paste-button-label = Mboja +pdfjs-views-manager-paste-button-before = + .title = Emboja togue peteĩha mboyve +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Emboja kuatiarogue { $page } rire +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = PYAHU +pdfjs-views-manager-waiting-for-file = Ehupihína marandurenda… +pdfjs-toggle-views-manager-button1 = + .title = Eñangareko kuotiarogue + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Embogue teraguapy ñongatupyre +pdfjs-editor-delete-signature-button-label1 = Embogue teraguapy ñongatupyre + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Embosako’i moha’ãnga + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Embosako’i moha’ãnga diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/gu-IN/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/gu-IN/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/gu-IN/viewer.ftl 2026-01-20 14:08:39.369689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/gu-IN/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -89,24 +89,12 @@ pdfjs-document-properties-button-label = દસ્તાવેજ ગુણધર્મો… pdfjs-document-properties-file-name = ફાઇલ નામ: pdfjs-document-properties-file-size = ફાઇલ માપ: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } બાઇટ) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } બાઇટ) pdfjs-document-properties-title = શીર્ષક: pdfjs-document-properties-author = લેખક: pdfjs-document-properties-subject = વિષય: pdfjs-document-properties-keywords = કિવર્ડ: pdfjs-document-properties-creation-date = નિર્માણ તારીખ: pdfjs-document-properties-modification-date = ફેરફાર તારીખ: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = નિર્માતા: pdfjs-document-properties-producer = PDF નિર્માતા: pdfjs-document-properties-version = PDF આવૃત્તિ: @@ -207,9 +195,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = ભૂલ ઉદ્ભવી જ્યારે PDF ને લાવી રહ્યા હોય. @@ -235,13 +220,3 @@ pdfjs-password-ok-button = બરાબર pdfjs-password-cancel-button = રદ કરો pdfjs-web-fonts-disabled = વેબ ફોન્ટ નિષ્ક્રિય થયેલ છે: ઍમ્બેડ થયેલ PDF ફોન્ટને વાપરવાનું અસમર્થ. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/he/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/he/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/he/viewer.ftl 2026-01-20 14:08:39.370689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/he/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = עמוד נוכחי (הצגת כתובת האתר מהעמוד הנוכחי) pdfjs-bookmark-button-label = עמוד נוכחי -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = פתיחה ביישום -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = פתיחה ביישום ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = שם קובץ: pdfjs-document-properties-file-size = גודל הקובץ: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } ק״ב ({ $size_b } בתים) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } מ״ב ({ $size_b } בתים) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } ק״ב ({ $b } בתים) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } מ״ב ({ $b } בתים) pdfjs-document-properties-title = כותרת: pdfjs-document-properties-author = מחבר: pdfjs-document-properties-subject = נושא: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = תאריך יצירה: pdfjs-document-properties-modification-date = תאריך שינוי: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = יוצר: pdfjs-document-properties-producer = יצרן PDF: pdfjs-document-properties-version = גרסת PDF: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = תצוגה מקדימה של עמוד { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = בחירת עמוד { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = עמוד { $page } מתוך { $total } ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,11 +279,14 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [הערת { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password pdfjs-password-label = נא להכניס את הססמה לפתיחת קובץ PDF זה. -pdfjs-password-invalid = ססמה שגויה. נא לנסות שנית. +pdfjs-password-invalid = ססמה שגויה. נא לנסות שוב. pdfjs-password-ok-button = אישור pdfjs-password-cancel-button = ביטול pdfjs-web-fonts-disabled = גופני רשת מנוטרלים: לא ניתן להשתמש בגופני PDF מוטבעים. @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = טקסט +pdfjs-editor-color-picker-free-text-input = + .title = שינוי צבע הטקסט pdfjs-editor-free-text-button-label = טקסט pdfjs-editor-ink-button = .title = ציור +pdfjs-editor-color-picker-ink-input = + .title = שינוי צבע הציור pdfjs-editor-ink-button-label = ציור pdfjs-editor-stamp-button = .title = הוספה או עריכת תמונות @@ -304,12 +309,37 @@ pdfjs-editor-highlight-button = .title = סימון pdfjs-editor-highlight-button-label = סימון -pdfjs-highlight-floating-button = - .title = סימון pdfjs-highlight-floating-button1 = .title = סימון .aria-label = סימון pdfjs-highlight-floating-button-label = סימון +pdfjs-comment-floating-button = + .title = הערה + .aria-label = הערה +pdfjs-comment-floating-button-label = הערה +pdfjs-editor-comment-button = + .title = הערה + .aria-label = הערה +pdfjs-editor-comment-button-label = הערה +pdfjs-editor-signature-button = + .title = הוספת חתימה +pdfjs-editor-signature-button-label = הוספת חתימה + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = עורך סימונים +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = עורך ציורים +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = עורך החתימות: { $description } +pdfjs-editor-stamp-editor = + .aria-label = עורך תמונות ## Remove button for the various kind of editor. @@ -320,7 +350,9 @@ pdfjs-editor-remove-stamp-button = .title = הסרת תמונה pdfjs-editor-remove-highlight-button = - .title = הסרת הדגשה + .title = הסרת סימון +pdfjs-editor-remove-signature-button = + .title = הסרת חתימה ## @@ -336,20 +368,42 @@ # This refers to the thickness of the line used for free highlighting (not bound to text) pdfjs-editor-free-highlight-thickness-input = עובי pdfjs-editor-free-highlight-thickness-title = - .title = שינוי עובי בעת הדגשת פריטים שאינם טקסט -pdfjs-free-text = + .title = שינוי עובי בעת סימון פריטים שאינם טקסט +pdfjs-editor-add-signature-container = + .aria-label = פקדי חתימה וחתימות שמורות +pdfjs-editor-signature-add-signature-button = + .title = הוספת חתימה חדשה +pdfjs-editor-signature-add-signature-button-label = הוספת חתימה חדשה +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = חתימה שמורה: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = עורך טקסט -pdfjs-free-text-default-content = להתחיל להקליד… -pdfjs-ink = - .aria-label = עורך ציור -pdfjs-ink-canvas = - .aria-label = תמונה שנוצרה על־ידי משתמש + .default-content = נא להתחיל להקליד… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] הערה + *[other] הערות + } +pdfjs-editor-comments-sidebar-close-button = + .title = סגירת סרגל הצד + .aria-label = סגירת סרגל הצד +pdfjs-editor-comments-sidebar-close-button-label = סגירת סרגל הצד +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = ראית משהו ראוי לציון? ניתן לסמן אותו ולהשאיר הערה. +pdfjs-editor-comments-sidebar-no-comments-link = מידע נוסף ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = טקסט חלופי -pdfjs-editor-alt-text-edit-button-label = עריכת טקסט חלופי +pdfjs-editor-alt-text-edit-button = + .aria-label = עריכת טקסט חלופי pdfjs-editor-alt-text-dialog-label = בחירת אפשרות pdfjs-editor-alt-text-dialog-description = טקסט חלופי עוזר כשאנשים לא יכולים לראות את התמונה או כשהיא לא נטענת. pdfjs-editor-alt-text-add-description-label = הוספת תיאור @@ -362,23 +416,34 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = לדוגמה, ״גבר צעיר מתיישב ליד שולחן לאכול ארוחה״ +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = טקסט חלופי ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = פינה שמאלית עליונה - שינוי גודל -pdfjs-editor-resizer-label-top-middle = למעלה באמצע - שינוי גודל -pdfjs-editor-resizer-label-top-right = פינה ימנית עליונה - שינוי גודל -pdfjs-editor-resizer-label-middle-right = ימינה באמצע - שינוי גודל -pdfjs-editor-resizer-label-bottom-right = פינה ימנית תחתונה - שינוי גודל -pdfjs-editor-resizer-label-bottom-middle = למטה באמצע - שינוי גודל -pdfjs-editor-resizer-label-bottom-left = פינה שמאלית תחתונה - שינוי גודל -pdfjs-editor-resizer-label-middle-left = שמאלה באמצע - שינוי גודל +pdfjs-editor-resizer-top-left = + .aria-label = פינה שמאלית עליונה - שינוי גודל +pdfjs-editor-resizer-top-middle = + .aria-label = למעלה באמצע - שינוי גודל +pdfjs-editor-resizer-top-right = + .aria-label = פינה ימנית עליונה - שינוי גודל +pdfjs-editor-resizer-middle-right = + .aria-label = ימינה באמצע - שינוי גודל +pdfjs-editor-resizer-bottom-right = + .aria-label = פינה ימנית תחתונה - שינוי גודל +pdfjs-editor-resizer-bottom-middle = + .aria-label = למטה באמצע - שינוי גודל +pdfjs-editor-resizer-bottom-left = + .aria-label = פינה שמאלית תחתונה - שינוי גודל +pdfjs-editor-resizer-middle-left = + .aria-label = שמאלה באמצע - שינוי גודל ## Color picker # This means "Color used to highlight text" -pdfjs-editor-highlight-colorpicker-label = צבע הדגשה +pdfjs-editor-highlight-colorpicker-label = צבע סימון pdfjs-editor-colorpicker-button = .title = שינוי צבע pdfjs-editor-colorpicker-dropdown = @@ -400,3 +465,283 @@ pdfjs-editor-highlight-show-all-button-label = הצגת הכול pdfjs-editor-highlight-show-all-button = .title = הצגת הכול + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = עריכת טקסט חלופי (תיאור תמונה) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = הוספת טקסט חלופי (תיאור תמונה) +pdfjs-editor-new-alt-text-textarea = + .placeholder = נא לכתוב את התיאור שלך כאן… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = תיאור קצר לאנשים שאינם יכולים לראות את התמונה או כאשר התמונה אינה נטענת. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = טקסט חלופי זה נוצר באופן אוטומטי ועשוי להיות לא מדויק. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = מידע נוסף +pdfjs-editor-new-alt-text-create-automatically-button-label = יצירת טקסט חלופי באופן אוטומטי +pdfjs-editor-new-alt-text-not-now-button = לא כעת +pdfjs-editor-new-alt-text-error-title = לא ניתן היה ליצור טקסט חלופי באופן אוטומטי +pdfjs-editor-new-alt-text-error-description = נא לכתוב טקסט חלופי משלך או לנסות שוב מאוחר יותר. +pdfjs-editor-new-alt-text-error-close-button = סגירה +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = בתהליך הורדת מודל AI של טקסט חלופי ({ $downloadedSize } מתוך { $totalSize } מ״ב) + .aria-valuetext = בתהליך הורדת מודל AI של טקסט חלופי ({ $downloadedSize } מתוך { $totalSize } מ״ב) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = נוסף טקסט חלופי +pdfjs-editor-new-alt-text-added-button-label = נוסף טקסט חלופי +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = חסר טקסט חלופי +pdfjs-editor-new-alt-text-missing-button-label = חסר טקסט חלופי +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = סקירת טקסט חלופי +pdfjs-editor-new-alt-text-to-review-button-label = סקירת טקסט חלופי +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = נוצר באופן אוטומטי: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = הגדרות טקסט חלופי של תמונה +pdfjs-image-alt-text-settings-button-label = הגדרות טקסט חלופי של תמונה +pdfjs-editor-alt-text-settings-dialog-label = הגדרות טקסט חלופי של תמונה +pdfjs-editor-alt-text-settings-automatic-title = טקסט חלופי אוטומטי +pdfjs-editor-alt-text-settings-create-model-button-label = יצירת טקסט חלופי באופן אוטומטי +pdfjs-editor-alt-text-settings-create-model-description = הצעת תיאורים כדי לסייע לאנשים שאינם יכולים לראות את התמונה או כאשר התמונה אינה נטענת. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = מודל AI לטקסט חלופי ({ $totalSize } מ״ב) +pdfjs-editor-alt-text-settings-ai-model-description = פועל באופן מקומי במכשיר שלך כך שהנתונים שלך נשארים פרטיים. נדרש עבור טקסט חלופי אוטומטי. +pdfjs-editor-alt-text-settings-delete-model-button = מחיקה +pdfjs-editor-alt-text-settings-download-model-button = הורדה +pdfjs-editor-alt-text-settings-downloading-model-button = בהורדה… +pdfjs-editor-alt-text-settings-editor-title = עורך טקסט חלופי +pdfjs-editor-alt-text-settings-show-dialog-button-label = הצגת עורך טקסט חלופי מיד בעת הוספת תמונה +pdfjs-editor-alt-text-settings-show-dialog-description = מסייע לך לוודא שלכל התמונות שלך יש טקסט חלופי. +pdfjs-editor-alt-text-settings-close-button = סגירה + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = הסימון נוסף +pdfjs-editor-freetext-added-alert = הטקסט נוסף +pdfjs-editor-ink-added-alert = הציור נוסף +pdfjs-editor-stamp-added-alert = התמונה נוספה +pdfjs-editor-signature-added-alert = החתימה נוספה + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = הסימון הוסר +pdfjs-editor-undo-bar-message-freetext = הטקסט הוסר +pdfjs-editor-undo-bar-message-ink = הציור הוסר +pdfjs-editor-undo-bar-message-stamp = התמונה הוסרה +pdfjs-editor-undo-bar-message-signature = החתימה הוסרה +pdfjs-editor-undo-bar-message-comment = ההערה הוסרה +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] הערה אחת הוסרה + *[other] { $count } הערות הוסרו + } +pdfjs-editor-undo-bar-undo-button = + .title = ביטול פעולה +pdfjs-editor-undo-bar-undo-button-label = ביטול פעלה +pdfjs-editor-undo-bar-close-button = + .title = סגירה +pdfjs-editor-undo-bar-close-button-label = סגירה + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = מודל זה מאפשר למשתמש ליצור חתימה להוספה למסמך PDF. המשתמש יכול לערוך את השם (שמשמש גם כטקסט האלטרנטיבי), ובאופן אופציונלי לשמור את החתימה לשימוש חוזר. +pdfjs-editor-add-signature-dialog-title = הוספת חתימה + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = הקלדה + .title = הקלדה +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = ציור + .title = ציור +pdfjs-editor-add-signature-image-button = תמונה + .title = תמונה + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = נא להקליד את החתימה שלך + .placeholder = נא להקליד את החתימה שלך +pdfjs-editor-add-signature-draw-placeholder = נא לצייר את החתימה שלך +pdfjs-editor-add-signature-draw-thickness-range-label = עובי +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = עובי הציור: { $thickness } +pdfjs-editor-add-signature-image-placeholder = יש לגרור לכאן קובץ להעלאה +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] או לבחור בקובצי תמונה + *[other] או לעיין בקובצי תמונה + } + +## Controls + +pdfjs-editor-add-signature-description-label = תיאור (טקסט חלופי) +pdfjs-editor-add-signature-description-input = + .title = תיאור (טקסט חלופי) +pdfjs-editor-add-signature-description-default-when-drawing = חתימה +pdfjs-editor-add-signature-clear-button-label = ניקוי חתימה +pdfjs-editor-add-signature-clear-button = + .title = ניקוי חתימה +pdfjs-editor-add-signature-save-checkbox = שמירת החתימה +pdfjs-editor-add-signature-save-warning-message = הגעת למגבלה של 5 חתימות שמורות. יש להסיר אחד כדי לשמור עוד. +pdfjs-editor-add-signature-image-upload-error-title = לא ניתן להעלות את התמונה +pdfjs-editor-add-signature-image-upload-error-description = נא לבדוק את החיבור שלך לרשת או לנסות תמונה אחרת. +pdfjs-editor-add-signature-image-no-data-error-title = לא ניתן להמיר את התמונה הזו לחתימה +pdfjs-editor-add-signature-image-no-data-error-description = נא לנסות להעלות תמונה אחרת. +pdfjs-editor-add-signature-error-close-button = סגירה + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = ביטול +pdfjs-editor-add-signature-add-button = הוספה +pdfjs-editor-edit-signature-update-button = עדכון + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = עריכת הערה +pdfjs-editor-edit-comment-popup-button = + .title = עריכת הערה +pdfjs-editor-delete-comment-popup-button-label = הסרת הערה +pdfjs-editor-delete-comment-popup-button = + .title = הסרת הערה +pdfjs-show-comment-button = + .title = הצגת הערה + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = עריכת הערה +pdfjs-editor-edit-comment-dialog-save-button-when-editing = עדכון +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = הוספת הערה +pdfjs-editor-edit-comment-dialog-save-button-when-adding = הוספה +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = להתחיל להקליד… +pdfjs-editor-edit-comment-dialog-cancel-button = ביטול + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = הוספת הערה + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = החלפת תצוגת סרגל צד (מסמך שמכיל תמונות ממוזערות/תוכן עניינים/קבצים מצורפים/שכבות) +pdfjs-toggle-views-manager-button1-label = ניהול עמודים +pdfjs-views-manager-sidebar = + .aria-label = סרגל צד +pdfjs-views-manager-sidebar-resizer = + .aria-label = שינוי גודל סרגל הצד +pdfjs-views-manager-view-selector-button = + .title = תצוגות +pdfjs-views-manager-view-selector-button-label = תצוגות +pdfjs-views-manager-pages-title = עמודים +pdfjs-views-manager-outlines-title1 = תוכן העניינים של המסמך + .title = הצגת תוכן העניינים של המסמך (יש ללחוץ לחיצה כפולה כדי להרחיב או לצמצם את כל הפריטים) +pdfjs-views-manager-attachments-title = קבצים מצורפים +pdfjs-views-manager-layers-title1 = שכבות + .title = הצגת שכבות (יש ללחוץ לחיצה כפולה כדי לאפס את כל השכבות למצב ברירת המחדל) +pdfjs-views-manager-pages-option-label = עמודים +pdfjs-views-manager-outlines-option-label = תוכן העניינים של המסמך +pdfjs-views-manager-attachments-option-label = קבצים מצורפים +pdfjs-views-manager-layers-option-label = שכבות +pdfjs-views-manager-add-file-button = + .title = הוספת קובץ +pdfjs-views-manager-add-file-button-label = הוספת קובץ +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] אחד נבחר + *[other] { $count } נבחרו + } +pdfjs-views-manager-pages-status-none-action-label = בחירת עמודים +pdfjs-views-manager-pages-status-action-button-label = ניהול +pdfjs-views-manager-pages-status-copy-button-label = העתקה +pdfjs-views-manager-pages-status-cut-button-label = גזירה +pdfjs-views-manager-pages-status-delete-button-label = מחיקה +pdfjs-views-manager-pages-status-export-selected-button-label = ייצוא הפריטים שנבחרו… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] עמוד אחד נגזר + *[other] { $count } עמודים נגזרו + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] עמוד אחד הועתק + *[other] { $count } עמודים הועתקו + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] עמוד אחד נמחק + *[other] { $count } עמודים נמחקו + } +pdfjs-views-manager-pages-status-waiting-ready-label = בתהליך הכנת הקובץ שלך… +pdfjs-views-manager-pages-status-waiting-uploading-label = בתהליך העלאת הקובץ… +pdfjs-views-manager-status-warning-cut-label = לא ניתן היה לגזור. נא לרענן את הדף ולנסות שוב. +pdfjs-views-manager-status-warning-copy-label = לא ניתן היה להעתיק. נא לרענן את הדף ולנסות שוב. +pdfjs-views-manager-status-warning-delete-label = לא ניתן היה למחוק. נא לרענן את הדף ולנסות שוב. +pdfjs-views-manager-status-warning-save-label = לא ניתן היה לשמור. נא לרענן את הדף ולנסות שוב. +pdfjs-views-manager-status-undo-button-label = ביטול פעולה +pdfjs-views-manager-status-done-button-label = סיום +pdfjs-views-manager-status-close-button = + .title = סגירה +pdfjs-views-manager-status-close-button-label = סגירה +pdfjs-views-manager-paste-button-label = הדבקה +pdfjs-views-manager-paste-button-before = + .title = להדביק לפני העמוד הראשון +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = להדביק אחרי עמוד { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = חדש +pdfjs-views-manager-waiting-for-file = בתהליך העלאת הקובץ… +pdfjs-toggle-views-manager-button1 = + .title = ניהול עמודים + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = הסרת חתימה שמורה +pdfjs-editor-delete-signature-button-label1 = הסרת חתימה שמורה + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = עריכת תיאור + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = עריכת תיאור diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/hi-IN/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/hi-IN/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/hi-IN/viewer.ftl 2026-01-20 14:08:39.370689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/hi-IN/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -39,12 +39,6 @@ pdfjs-print-button = .title = छापें pdfjs-print-button-label = छापें -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = ऐप में खोलें -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = ऐप में खोलें ## Secondary toolbar and context menu @@ -89,24 +83,12 @@ pdfjs-document-properties-button-label = दस्तावेज़ विशेषता... pdfjs-document-properties-file-name = फ़ाइल नाम: pdfjs-document-properties-file-size = फाइल आकारः -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = शीर्षक: pdfjs-document-properties-author = लेखकः pdfjs-document-properties-subject = विषय: pdfjs-document-properties-keywords = कुंजी-शब्द: pdfjs-document-properties-creation-date = निर्माण दिनांक: pdfjs-document-properties-modification-date = संशोधन दिनांक: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = निर्माता: pdfjs-document-properties-producer = PDF उत्पादक: pdfjs-document-properties-version = PDF संस्करण: @@ -207,9 +189,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = PDF लोड करते समय एक त्रुटि हुई. @@ -220,10 +199,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -240,14 +215,7 @@ pdfjs-password-cancel-button = रद्द करें pdfjs-web-fonts-disabled = वेब फॉन्ट्स निष्क्रिय हैं: अंतःस्थापित PDF फॉन्टस के उपयोग में असमर्थ. -## Editing +## # Editor Parameters pdfjs-editor-free-text-color-input = रंग - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/hr/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/hr/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/hr/viewer.ftl 2026-01-20 14:08:39.370689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/hr/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -31,8 +31,8 @@ pdfjs-zoom-select = .title = Zumiranje pdfjs-presentation-mode-button = - .title = Prebaci u prezentacijski način rada -pdfjs-presentation-mode-button-label = Prezentacijski način rada + .title = Prebaci u modus prezentacija +pdfjs-presentation-mode-button-label = Modus prezentacija pdfjs-open-file-button = .title = Otvori datoteku pdfjs-open-file-button-label = Otvori @@ -42,6 +42,15 @@ pdfjs-save-button = .title = Spremi pdfjs-save-button-label = Spremi +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Preuzimanja +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Preuzimanja +pdfjs-bookmark-button = + .title = Trenutačna stranica (pogledaj URL s trenutačne stranice) +pdfjs-bookmark-button-label = Trenutačna stranica ## Secondary toolbar and context menu @@ -52,20 +61,23 @@ .title = Idi na prvu stranicu pdfjs-first-page-button-label = Idi na prvu stranicu pdfjs-last-page-button = - .title = Idi na posljednju stranicu -pdfjs-last-page-button-label = Idi na posljednju stranicu + .title = Idi na zadnju stranicu +pdfjs-last-page-button-label = Idi na zadnju stranicu pdfjs-page-rotate-cw-button = - .title = Rotiraj u smjeru kazaljke na satu -pdfjs-page-rotate-cw-button-label = Rotiraj u smjeru kazaljke na satu + .title = Okreni nadesno +pdfjs-page-rotate-cw-button-label = Okreni nadesno pdfjs-page-rotate-ccw-button = - .title = Rotiraj obrnutno od smjera kazaljke na satu -pdfjs-page-rotate-ccw-button-label = Rotiraj obrnutno od smjera kazaljke na satu + .title = Okreni nalijevo +pdfjs-page-rotate-ccw-button-label = Okreni nalijevo pdfjs-cursor-text-select-tool-button = - .title = Omogući alat za označavanje teksta + .title = Aktiviraj alat za biranje teksta pdfjs-cursor-text-select-tool-button-label = Alat za označavanje teksta pdfjs-cursor-hand-tool-button = - .title = Omogući ručni alat + .title = Aktiviraj ručni alat pdfjs-cursor-hand-tool-button-label = Ručni alat +pdfjs-scroll-page-button = + .title = Koristi klizanje stranice +pdfjs-scroll-page-button-label = Klizanje stranice pdfjs-scroll-vertical-button = .title = Koristi okomito pomicanje pdfjs-scroll-vertical-button-label = Okomito pomicanje @@ -90,16 +102,16 @@ pdfjs-document-properties-button = .title = Svojstva dokumenta … pdfjs-document-properties-button-label = Svojstva dokumenta … -pdfjs-document-properties-file-name = Naziv datoteke: +pdfjs-document-properties-file-name = Ime datoteke: pdfjs-document-properties-file-size = Veličina datoteke: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajtova) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajtova) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bajtova) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtova) pdfjs-document-properties-title = Naslov: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Predmet: @@ -107,9 +119,8 @@ pdfjs-document-properties-creation-date = Datum stvaranja: pdfjs-document-properties-modification-date = Datum promjene: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Stvaratelj: pdfjs-document-properties-producer = PDF stvaratelj: pdfjs-document-properties-version = PDF verzija: @@ -161,13 +172,13 @@ .title = Prikazivanje i sklanjanje bočne trake (dokument sadrži strukturu/privitke/slojeve) pdfjs-toggle-sidebar-button-label = Prikaži/sakrij bočnu traku pdfjs-document-outline-button = - .title = Prikaži strukturu dokumenta (dvostruki klik za rasklapanje/sklapanje svih stavki) + .title = Prikaži strukturu dokumenta (dvoklik za rasklapanje/sklapanje svih stavki) pdfjs-document-outline-button-label = Struktura dokumenta pdfjs-attachments-button = .title = Prikaži privitke pdfjs-attachments-button-label = Privitci pdfjs-layers-button = - .title = Prikaži slojeve (dvoklik za vraćanje svih slojeva u zadano stanje) + .title = Prikaži slojeve (dvoklik za vraćanje svih slojeva u standardno stanje) pdfjs-layers-button-label = Slojevi pdfjs-thumbs-button = .title = Prikaži minijature @@ -190,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Minijatura stranice { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Odaberi stranicu { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Stranica { $page } od { $total } ## Find panel button title and messages @@ -201,12 +221,30 @@ pdfjs-find-previous-button-label = Prethodno pdfjs-find-next-button = .title = Pronađi sljedeće pojavljivanje ovog izraza -pdfjs-find-next-button-label = Sljedeće +pdfjs-find-next-button-label = Dalje pdfjs-find-highlight-checkbox = Istankni sve pdfjs-find-match-case-checkbox-label = Razlikovanje velikih i malih slova +pdfjs-find-match-diacritics-checkbox-label = Razlikuj dijakritičke znakove pdfjs-find-entire-word-checkbox-label = Cijele riječi pdfjs-find-reached-top = Dosegnut početak dokumenta, nastavak s kraja pdfjs-find-reached-bottom = Dosegnut kraj dokumenta, nastavak s početka +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } od { $total } rezultata + [few] { $current } od { $total } rezultata + *[other] { $current } od { $total } rezultata + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Više od { $limit } rezultat + [few] Više od { $limit } rezultata + *[other] Više od { $limit } rezultata + } pdfjs-find-not-found = Izraz nije pronađen ## Predefined zoom values @@ -231,15 +269,11 @@ pdfjs-loading-error = Došlo je do greške pri učitavanju PDF-a. pdfjs-invalid-file-error = Neispravna ili oštećena PDF datoteka. pdfjs-missing-file-error = Nedostaje PDF datoteka. -pdfjs-unexpected-response-error = Neočekivani odgovor poslužitelja. +pdfjs-unexpected-response-error = Neočekivani odgovor servera. pdfjs-rendering-error = Došlo je do greške prilikom iscrtavanja stranice. ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -247,6 +281,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } Bilješka] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -260,20 +297,427 @@ pdfjs-editor-free-text-button = .title = Tekst +pdfjs-editor-color-picker-free-text-input = + .title = Promijeni boju teksta pdfjs-editor-free-text-button-label = Tekst +pdfjs-editor-ink-button = + .title = Crtanje +pdfjs-editor-color-picker-ink-input = + .title = Promijeni boju crteža +pdfjs-editor-ink-button-label = Crtanje +pdfjs-editor-stamp-button = + .title = Dodaj ili uredi slike +pdfjs-editor-stamp-button-label = Dodaj ili uredi slike +pdfjs-editor-highlight-button = + .title = Istakni +pdfjs-editor-highlight-button-label = Istakni +pdfjs-highlight-floating-button1 = + .title = Istakni + .aria-label = Istakni +pdfjs-highlight-floating-button-label = Istakni +pdfjs-comment-floating-button = + .title = Komentiraj + .aria-label = Komentiraj +pdfjs-comment-floating-button-label = Komentiraj +pdfjs-editor-comment-button = + .title = Komentar + .aria-label = Komentar +pdfjs-editor-comment-button-label = Komentar +pdfjs-editor-signature-button = + .title = Dodaj potpis +pdfjs-editor-signature-button-label = Dodaj potpis + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Uređivač za isticanje teksta +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Uređivač crteža +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Uređivač potpisa: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Uređivač slika + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Ukloni crtež +pdfjs-editor-remove-freetext-button = + .title = Ukloni tekst +pdfjs-editor-remove-stamp-button = + .title = Ukloni sliku +pdfjs-editor-remove-highlight-button = + .title = Ukloni isticanje +pdfjs-editor-remove-signature-button = + .title = Ukloni potpis + +## + # Editor Parameters pdfjs-editor-free-text-color-input = Boja pdfjs-editor-free-text-size-input = Veličina pdfjs-editor-ink-color-input = Boja pdfjs-editor-ink-thickness-input = Debljina pdfjs-editor-ink-opacity-input = Neprozirnost -pdfjs-free-text = +pdfjs-editor-stamp-add-image-button = + .title = Dodaj sliku +pdfjs-editor-stamp-add-image-button-label = Dodaj sliku +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Debljina +pdfjs-editor-free-highlight-thickness-title = + .title = Promjeni debljinu pri isticanju drugih stavki osim teksta +pdfjs-editor-add-signature-container = + .aria-label = Kontrole potpisa i spremljeni potpisi +pdfjs-editor-signature-add-signature-button = + .title = Dodaj novi potpis +pdfjs-editor-signature-add-signature-button-label = Dodaj novi potpis +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Spremljeni potpis: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Uređivač teksta -pdfjs-free-text-default-content = Počni tipkati … + .default-content = Počni tipkati … +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Komentar + [few] Komentara + *[other] Komentara + } +pdfjs-editor-comments-sidebar-close-button = + .title = Zatvori bočnu traku + .aria-label = Zatvori bočnu traku +pdfjs-editor-comments-sidebar-close-button-label = Zatvori bočnu traku +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Vidiš nešto vrijedno pažnje? Istakni to i ostavi komentar. +pdfjs-editor-comments-sidebar-no-comments-link = Saznaj više ## Alt-text dialog +pdfjs-editor-alt-text-button-label = Alternativni tekst +pdfjs-editor-alt-text-edit-button = + .aria-label = Uredi alternativni tekst +pdfjs-editor-alt-text-dialog-label = Odaberi jednu opciju +pdfjs-editor-alt-text-dialog-description = Alternativni tekst pomaže slijepim osobama ili kada se slika ne učita. +pdfjs-editor-alt-text-add-description-label = Dodaj opis +pdfjs-editor-alt-text-add-description-description = Sažmi sadržaj predmeta, okruženje ili radnje u jednoj ili dvije rečenice. +pdfjs-editor-alt-text-mark-decorative-label = Označi kao ukrasno +pdfjs-editor-alt-text-mark-decorative-description = Ovo se koristi za ukrasne slike, poput rubova ili vodenih žigova. +pdfjs-editor-alt-text-cancel-button = Odustani +pdfjs-editor-alt-text-save-button = Spremi +pdfjs-editor-alt-text-decorative-tooltip = Označeno kao ukrasno +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Na primjer, „Mladić sjeda za stol kako bi jeo” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternativni tekst ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. +pdfjs-editor-resizer-top-left = + .aria-label = Gornji lijevi kut – promijeni veličinu +pdfjs-editor-resizer-top-middle = + .aria-label = Sredina gore – promijeni veličinu +pdfjs-editor-resizer-top-right = + .aria-label = Gornji desni kut – promijeni veličinu +pdfjs-editor-resizer-middle-right = + .aria-label = Sredina desno – promijeni veličinu +pdfjs-editor-resizer-bottom-right = + .aria-label = Donji desni kut – promijeni veličinu +pdfjs-editor-resizer-bottom-middle = + .aria-label = Sredina dolje – promjeni veličinu +pdfjs-editor-resizer-bottom-left = + .aria-label = Donji lijevi kut – promijeni veličinu +pdfjs-editor-resizer-middle-left = + .aria-label = Sredina lijevo – promijeni veličinu + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Boja isticanja +pdfjs-editor-colorpicker-button = + .title = Promjeni boju +pdfjs-editor-colorpicker-dropdown = + .aria-label = Izbor boja +pdfjs-editor-colorpicker-yellow = + .title = Žuta +pdfjs-editor-colorpicker-green = + .title = Zelena +pdfjs-editor-colorpicker-blue = + .title = Plava +pdfjs-editor-colorpicker-pink = + .title = Ružičasta +pdfjs-editor-colorpicker-red = + .title = Crvena + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Prikaži sve +pdfjs-editor-highlight-show-all-button = + .title = Prikaži sve + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Uredi alternativni tekst (opis slike) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Dodaj alternativni tekst (opis slike) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Ovdje upiši tvoj opis … +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Kratki opis koji pomažu osobama koji ne mogu vidjeti sliku ili kada se slika ne učita. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Ovaj je alternativni tekst stvoren automatski i može biti netočan. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Saznaj više +pdfjs-editor-new-alt-text-create-automatically-button-label = Automatski stvori alternativni tekst +pdfjs-editor-new-alt-text-not-now-button = Ne sada +pdfjs-editor-new-alt-text-error-title = Nije bilo moguće automatski izraditi alternativni tekst +pdfjs-editor-new-alt-text-error-description = Napiši vlastiti alternativni tekst ili pokušaj kasnije ponovo. +pdfjs-editor-new-alt-text-error-close-button = Zatvori +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Preuzimanje alternativnog teksta UI modela ({ $downloadedSize } od { $totalSize } MB) + .aria-valuetext = Preuzimanje alternativnog teksta UI modela ({ $downloadedSize } od { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternativni tekst je dodan +pdfjs-editor-new-alt-text-added-button-label = Alternativni tekst je dodan +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Nedostaje alternativni tekst +pdfjs-editor-new-alt-text-missing-button-label = Nedostaje alternativni tekst +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Pregledaj alternativni tekst +pdfjs-editor-new-alt-text-to-review-button-label = Pregledaj alternativni tekst +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Stvoreno automatski: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Postavke alternativnog teksta slike +pdfjs-image-alt-text-settings-button-label = Postavke alternativnog teksta slike +pdfjs-editor-alt-text-settings-dialog-label = Postavke alternativnog teksta slike +pdfjs-editor-alt-text-settings-automatic-title = Automatski alternativni tekst +pdfjs-editor-alt-text-settings-create-model-button-label = Stvori alternativni tekst automatski +pdfjs-editor-alt-text-settings-create-model-description = Predlaže opise koji pomažu osobama koji ne mogu vidjeti sliku ili kada se slika ne učita. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Alternativni tekst UI modela ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Radi lokalno na tvom uređaju kako bi tvoji podaci ostali privatni. Potrebno za automatski alternativni tekst. +pdfjs-editor-alt-text-settings-delete-model-button = Izbriši +pdfjs-editor-alt-text-settings-download-model-button = Preuzmi +pdfjs-editor-alt-text-settings-downloading-model-button = Preuzimanje … +pdfjs-editor-alt-text-settings-editor-title = Uređivač alternativnog teksta +pdfjs-editor-alt-text-settings-show-dialog-button-label = Prikaži uređivač alternativnog teksta odmah pri dodavanju slike +pdfjs-editor-alt-text-settings-show-dialog-description = Pomaže osigurati da sve tvoje slike imaju alternativni tekst. +pdfjs-editor-alt-text-settings-close-button = Zatvori + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Isticanje je dodano +pdfjs-editor-freetext-added-alert = Tekst je dodan +pdfjs-editor-ink-added-alert = Crtež je dodan +pdfjs-editor-stamp-added-alert = Slika je dodana +pdfjs-editor-signature-added-alert = Potpis je dodan + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Isticanje uklonjeno +pdfjs-editor-undo-bar-message-freetext = Tekst uklonjen +pdfjs-editor-undo-bar-message-ink = Crtež uklonjen +pdfjs-editor-undo-bar-message-stamp = Slika uklonjena +pdfjs-editor-undo-bar-message-signature = Potpis uklonjen +pdfjs-editor-undo-bar-message-comment = Komentar je uklonjen +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } pribilješka uklonjena + [few] { $count } pribilješke uklonjene + *[other] { $count } pribilješki uklonjeno + } +pdfjs-editor-undo-bar-undo-button = + .title = Poništi +pdfjs-editor-undo-bar-undo-button-label = Poništi +pdfjs-editor-undo-bar-close-button = + .title = Zatvori +pdfjs-editor-undo-bar-close-button-label = Zatvori + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Ovaj prozor omogućuje korisniku stvoriti potpis i dodati ga u PDF dokument. Korisnik može urediti ime (koje služi i kao alternativni tekst) i opcionalno spremiti potpis za ponovnu upotrebu. +pdfjs-editor-add-signature-dialog-title = Dodaj potpis + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Utipkaj + .title = Utipkaj +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Crtaj + .title = Crtaj +pdfjs-editor-add-signature-image-button = Slika + .title = Slika + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Utipkaj svoj potpis + .placeholder = Utipkaj svoj potpis +pdfjs-editor-add-signature-draw-placeholder = Nacrtaj svoj potpis +pdfjs-editor-add-signature-draw-thickness-range-label = Debljina +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Debljina crtanja: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Povuci datoteku za prijenos ovamo +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Ili odaberi slikovne datoteke + *[other] Ili odaberi slikovne datoteke + } + +## Controls + +pdfjs-editor-add-signature-description-label = Opis (alternativni tekst) +pdfjs-editor-add-signature-description-input = + .title = Opis (alternativni tekst) +pdfjs-editor-add-signature-description-default-when-drawing = Potpis +pdfjs-editor-add-signature-clear-button-label = Izbriši potpis +pdfjs-editor-add-signature-clear-button = + .title = Izbriši potpis +pdfjs-editor-add-signature-save-checkbox = Spremi potpis +pdfjs-editor-add-signature-save-warning-message = Dosegnuto je ograničenje od 5 spremljenih potpisa. Za spremanje novih ukloni jedan potpis. +pdfjs-editor-add-signature-image-upload-error-title = Nije moguće prenijeti sliku +pdfjs-editor-add-signature-image-upload-error-description = Provjeri mrežnu vezu ili pokušaj s jednom drugom slikom. +pdfjs-editor-add-signature-image-no-data-error-title = Ova se slika ne može pretvoriti u potpis +pdfjs-editor-add-signature-image-no-data-error-description = Probaj prenijeti jednu drugu sliku. +pdfjs-editor-add-signature-error-close-button = Zatvori + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Odustani +pdfjs-editor-add-signature-add-button = Dodaj +pdfjs-editor-edit-signature-update-button = Aktualiziraj + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Uredi komentar +pdfjs-editor-edit-comment-popup-button = + .title = Uredi komentar +pdfjs-editor-delete-comment-popup-button-label = Ukloni komentar +pdfjs-editor-delete-comment-popup-button = + .title = Ukloni komentar +pdfjs-show-comment-button = + .title = Prikaži komentar + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Uredi komentar +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualiziraj +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Dodaj komentar +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Dodaj +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Počni tipkati … +pdfjs-editor-edit-comment-dialog-cancel-button = Odustani + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Dodaj komentar + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-button1-label = Upravljaj stranicama +pdfjs-views-manager-sidebar = + .aria-label = Bočna traka +pdfjs-views-manager-view-selector-button = + .title = Prikazi +pdfjs-views-manager-view-selector-button-label = Prikazi +pdfjs-views-manager-pages-title = Stranice +pdfjs-views-manager-outlines-title1 = Struktura dokumenta + .title = Struktura dokumenta (sažmi/proširi sve stavke dvostrukim klikom) +pdfjs-views-manager-attachments-title = Privici +pdfjs-views-manager-layers-title1 = Slojevi + .title = Slojevi (ponovo postavi sve slojeve na zadano stanje dvostrukim klikom) +pdfjs-views-manager-pages-option-label = Stranice +pdfjs-views-manager-outlines-option-label = Struktura dokumenta +pdfjs-views-manager-attachments-option-label = Privici +pdfjs-views-manager-layers-option-label = Slojevi +pdfjs-views-manager-add-file-button = + .title = Dodaj datoteku +pdfjs-views-manager-add-file-button-label = Dodaj datoteku +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } odabrana + [few] { $count } odabrane + *[other] { $count } odabranih + } +pdfjs-views-manager-pages-status-none-action-label = Odaberi stranice +pdfjs-views-manager-pages-status-action-button-label = Upravljaj +pdfjs-views-manager-pages-status-copy-button-label = Kopiraj +pdfjs-views-manager-pages-status-cut-button-label = Izreži +pdfjs-views-manager-pages-status-delete-button-label = Izbriši +pdfjs-views-manager-status-warning-cut-label = Nije moguće izrezati. Osvježi stranicu i pokušaj ponovo. +pdfjs-views-manager-status-warning-copy-label = Nije moguće kopirati. Osvježi stranicu i pokušaj ponovo. +pdfjs-views-manager-status-warning-delete-label = Nije moguće izbrisati. Osvježi stranicu i pokušaj ponovo. +pdfjs-views-manager-status-warning-save-label = Nije moguće spremiti. Osvježi stranicu i pokušaj ponovo. +pdfjs-views-manager-status-undo-button-label = Poništi +pdfjs-views-manager-status-done-button-label = Gotovo +pdfjs-views-manager-status-close-button = + .title = Zatvori +pdfjs-views-manager-status-close-button-label = Zatvori +pdfjs-views-manager-paste-button-label = Umetni +pdfjs-views-manager-paste-button-before = + .title = Umetni prije prve stranice +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Umetni nakon stranice { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NOVO +pdfjs-toggle-views-manager-button1 = + .title = Upravljaj stranicama + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Ukloni spremljeni potpis +pdfjs-editor-delete-signature-button-label1 = Ukloni spremljeni potpis + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Uredi opis + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Uredi opis diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/hsb/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/hsb/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/hsb/viewer.ftl 2026-01-20 14:08:39.370689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/hsb/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Aktualna strona (URL z aktualneje strony pokazać) pdfjs-bookmark-button-label = Aktualna strona -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = W nałoženju wočinić -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = W nałoženju wočinić ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Mjeno dataje: pdfjs-document-properties-file-size = Wulkosć dataje: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajtow) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajtow) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bajtow) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtow) pdfjs-document-properties-title = Titul: pdfjs-document-properties-author = Awtor: pdfjs-document-properties-subject = Předmjet: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Datum wutworjenja: pdfjs-document-properties-modification-date = Datum změny: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Awtor: pdfjs-document-properties-producer = PDF-zhotowjer: pdfjs-document-properties-version = PDF-wersija: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniatura strony { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Stronu { $page } wubrać +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Strona { $page } z { $total } ## Find panel button title and messages @@ -274,10 +276,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -285,6 +283,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Typ přispomnjenki: { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -298,9 +299,13 @@ pdfjs-editor-free-text-button = .title = Tekst +pdfjs-editor-color-picker-free-text-input = + .title = Tekstowu barbu změnić pdfjs-editor-free-text-button-label = Tekst pdfjs-editor-ink-button = .title = Rysować +pdfjs-editor-color-picker-ink-input = + .title = Rysowansku barbu změnić pdfjs-editor-ink-button-label = Rysować pdfjs-editor-stamp-button = .title = Wobrazy přidać abo wobdźěłać @@ -308,12 +313,37 @@ pdfjs-editor-highlight-button = .title = Wuzběhnyć pdfjs-editor-highlight-button-label = Wuzběhnyć -pdfjs-highlight-floating-button = - .title = Wuzběhnyć pdfjs-highlight-floating-button1 = .title = Wuzběhnjenje .aria-label = Wuzběhnjenje pdfjs-highlight-floating-button-label = Wuzběhnjenje +pdfjs-comment-floating-button = + .title = Komentować + .aria-label = Komentować +pdfjs-comment-floating-button-label = Komentować +pdfjs-editor-comment-button = + .title = Komentować + .aria-label = Komentować +pdfjs-editor-comment-button-label = Komentować +pdfjs-editor-signature-button = + .title = Signaturu přidać +pdfjs-editor-signature-button-label = Signaturu přidać + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Wuzběhowanski editor +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Rysowanski editor +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Signaturowy editor: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Wobrazowy editor ## Remove button for the various kind of editor. @@ -325,6 +355,8 @@ .title = Wobraz wotstronić pdfjs-editor-remove-highlight-button = .title = Wuzběhnjenje wotstronić +pdfjs-editor-remove-signature-button = + .title = Signaturu wotstronić ## @@ -341,19 +373,43 @@ pdfjs-editor-free-highlight-thickness-input = Tołstosć pdfjs-editor-free-highlight-thickness-title = .title = Tołstosć změnić, hdyž so zapiski wuzběhuja, kotrež tekst njejsu -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Wodźenske elementy signaturow a składowane signatury +pdfjs-editor-signature-add-signature-button = + .title = Nowu signaturu přidać +pdfjs-editor-signature-add-signature-button-label = Nowu signaturu přidać +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Składowana signatura: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Tekstowy editor -pdfjs-free-text-default-content = Započńće pisać… -pdfjs-ink = - .aria-label = Rysowanski editor -pdfjs-ink-canvas = - .aria-label = Wobraz wutworjeny wot wužiwarja + .default-content = Započńće pisać … +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] { $count } komentar + [two] { $count } komentaraj + [few] { $count } komentary + *[other] { $count } komentarow + } +pdfjs-editor-comments-sidebar-close-button = + .title = Bóčnicu začinić + .aria-label = Bóčnicu začinić +pdfjs-editor-comments-sidebar-close-button-label = Bóčnicu začinić +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Widźiće něšto přispomnjenja hódneho? Wuzběhńće to a zawostajće komentar. +pdfjs-editor-comments-sidebar-no-comments-link = Dalše informacije ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Alternatiwny tekst -pdfjs-editor-alt-text-edit-button-label = Alternatiwny tekst wobdźěłać +pdfjs-editor-alt-text-edit-button = + .aria-label = Alternatiwny tekst wobdźěłać pdfjs-editor-alt-text-dialog-label = Nastajenje wubrać pdfjs-editor-alt-text-dialog-description = Alternatiwny tekst pomha, hdyž ludźo njemóža wobraz widźeć abo hdyž so wobraz njezačita. pdfjs-editor-alt-text-add-description-label = Wopisanje přidać @@ -366,18 +422,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Na přikład, „Młody muž za blidom sedźi, zo by jědź jědł“ +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternatiwny tekst ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Horjeka nalěwo – wulkosć změnić -pdfjs-editor-resizer-label-top-middle = Horjeka wosrjedź – wulkosć změnić -pdfjs-editor-resizer-label-top-right = Horjeka naprawo – wulkosć změnić -pdfjs-editor-resizer-label-middle-right = Wosrjedź naprawo – wulkosć změnić -pdfjs-editor-resizer-label-bottom-right = Deleka naprawo – wulkosć změnić -pdfjs-editor-resizer-label-bottom-middle = Deleka wosrjedź – wulkosć změnić -pdfjs-editor-resizer-label-bottom-left = Deleka nalěwo – wulkosć změnić -pdfjs-editor-resizer-label-middle-left = Wosrjedź nalěwo – wulkosć změnić +pdfjs-editor-resizer-top-left = + .aria-label = Horjeka nalěwo – wulkosć změnić +pdfjs-editor-resizer-top-middle = + .aria-label = Horjeka wosrjedź – wulkosć změnić +pdfjs-editor-resizer-top-right = + .aria-label = Horjeka naprawo – wulkosć změnić +pdfjs-editor-resizer-middle-right = + .aria-label = Wosrjedź naprawo – wulkosć změnić +pdfjs-editor-resizer-bottom-right = + .aria-label = Deleka naprawo – wulkosć změnić +pdfjs-editor-resizer-bottom-middle = + .aria-label = Deleka wosrjedź – wulkosć změnić +pdfjs-editor-resizer-bottom-left = + .aria-label = Deleka nalěwo – wulkosć změnić +pdfjs-editor-resizer-middle-left = + .aria-label = Wosrjedź nalěwo – wulkosć změnić ## Color picker @@ -404,3 +471,293 @@ pdfjs-editor-highlight-show-all-button-label = Wšě pokazać pdfjs-editor-highlight-show-all-button = .title = Wšě pokazać + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Alternatiwny tekst wobdźěłać (wobrazowe wopisanje) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Alternatiwny tekst přidać (wobrazowe wopisanje) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Pisajće tu swoje wopisanje… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Krótke wopisanje za ludźi, kotřiž njemóžeće wobraz widźeć abo hdyž so wobraz njezačita. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Tutón alternatiwny tekst je so awtomatisce wutworił a je snano njedokładny. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Dalše informacije +pdfjs-editor-new-alt-text-create-automatically-button-label = Alternatiwny tekst awtomatisce wutworić +pdfjs-editor-new-alt-text-not-now-button = Nic nětko +pdfjs-editor-new-alt-text-error-title = Alternatiwny tekst njeda so awtomatisce wutworić +pdfjs-editor-new-alt-text-error-description = Prošu pisajće swój alternatiwny tekst abo spytajće pozdźišo hišće raz. +pdfjs-editor-new-alt-text-error-close-button = Začinić +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Model KI za alternatiwny tekst so sćahuje ({ $downloadedSize } z { $totalSize } MB) + .aria-valuetext = Model KI za alternatiwny tekst so sćahuje ({ $downloadedSize } z { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternatiwny tekst je so přidał +pdfjs-editor-new-alt-text-added-button-label = Alternatiwny tekst je so přidał +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Alternatiwny tekst faluje +pdfjs-editor-new-alt-text-missing-button-label = Alternatiwny tekst faluje +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Alternatiwny tekst přepruwować +pdfjs-editor-new-alt-text-to-review-button-label = Alternatiwny tekst přepruwować +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Awtomatisce wutworjeny: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Nastajenja alternatiwneho wobrazoweho teksta +pdfjs-image-alt-text-settings-button-label = Nastajenja alternatiwneho wobrazoweho teksta +pdfjs-editor-alt-text-settings-dialog-label = Nastajenja alternatiwneho wobrazoweho teksta +pdfjs-editor-alt-text-settings-automatic-title = Awtomatiski alternatiwny tekst +pdfjs-editor-alt-text-settings-create-model-button-label = Alternatiwny tekst awtomatisce wutworić +pdfjs-editor-alt-text-settings-create-model-description = Namjetuje wopisanja, zo by ludźom pomhał, kotřiž njemóžeće wobraz widźeć abo hdyž so wobraz njezačita. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model KI alternatiwneho teksta ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Běži lokalnje na wašim graće, zo bychu waše daty priwatne wostali. Za awtomatiski alternatiwny tekst trěbny. +pdfjs-editor-alt-text-settings-delete-model-button = Zhašeć +pdfjs-editor-alt-text-settings-download-model-button = Sćahnyć +pdfjs-editor-alt-text-settings-downloading-model-button = Sćahuje so… +pdfjs-editor-alt-text-settings-editor-title = Editor za alternatiwny tekst +pdfjs-editor-alt-text-settings-show-dialog-button-label = Editor alternatiwneho teksta hnydom pokazać, hdyž so wobraz přidawa +pdfjs-editor-alt-text-settings-show-dialog-description = Pomha, wam wšěm swojim wobrazam alternatiwny tekst přidać. +pdfjs-editor-alt-text-settings-close-button = Začinić + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Wuzběhnjenje přidate +pdfjs-editor-freetext-added-alert = Tekst přidaty +pdfjs-editor-ink-added-alert = Rysowanka přidata +pdfjs-editor-stamp-added-alert = Wobraz přidaty +pdfjs-editor-signature-added-alert = Signatura přidata + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Wotstronjene wuzběhnyć +pdfjs-editor-undo-bar-message-freetext = Tekst je so wotstronił +pdfjs-editor-undo-bar-message-ink = Rysowanka je so wotstroniła +pdfjs-editor-undo-bar-message-stamp = Wobraz je so wotstronił +pdfjs-editor-undo-bar-message-signature = Signatura je so wotstroniła +pdfjs-editor-undo-bar-message-comment = Komentar je so wotstronił +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } přispomnjenka je so wotstroniła + [two] { $count } přispomnjence stej so wotstroniłoj + [few] { $count } přispomnjenki su so wotstronili + *[other] { $count } přispomnjenkow je so wotstroniło + } +pdfjs-editor-undo-bar-undo-button = + .title = Cofnyć +pdfjs-editor-undo-bar-undo-button-label = Cofnyć +pdfjs-editor-undo-bar-close-button = + .title = Začinić +pdfjs-editor-undo-bar-close-button-label = Začinić + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Tutón modalny dialog wužiwarjej zmóžnja, signaturu wutworić, zo by PDF-dokument přidał. Wužiwar móže mjeno wobdźěłać (kotrež tež jako alternatiwny tekst słuži) a po přeću signaturu za wospjetne wužiwanje składować. +pdfjs-editor-add-signature-dialog-title = Signaturu přidać + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Typ + .title = Typ +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Rysować + .title = Rysować +pdfjs-editor-add-signature-image-button = Wobraz + .title = Wobraz + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Zapodajće swoju signaturu + .placeholder = Zapodajće swoju signaturu +pdfjs-editor-add-signature-draw-placeholder = Rysujće swoju signaturu +pdfjs-editor-add-signature-draw-thickness-range-label = Tołstosć +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Tołstosć rysowanki: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Ćehńće dataju sem, zo byšće ju nahrał +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Abo přepytajće wobrazowe dataje + *[other] Abo přepytajće wobrazowe dataje + } + +## Controls + +pdfjs-editor-add-signature-description-label = Wopisanje (alternatiwny tekst) +pdfjs-editor-add-signature-description-input = + .title = Wopisanje (alternatiwny tekst) +pdfjs-editor-add-signature-description-default-when-drawing = Signatura +pdfjs-editor-add-signature-clear-button-label = Signaturu zhašeć +pdfjs-editor-add-signature-clear-button = + .title = Signaturu zhašeć +pdfjs-editor-add-signature-save-checkbox = Signaturu składować +pdfjs-editor-add-signature-save-warning-message = Sće limit 5 składowanych signaturow docpěł. Wotstrońće jednu, zo byšće wjace składował. +pdfjs-editor-add-signature-image-upload-error-title = Wobraz njeda so nahrać +pdfjs-editor-add-signature-image-upload-error-description = Přepruwujće swój syćowy zwisk abo spytajće druhi wobraz. +pdfjs-editor-add-signature-image-no-data-error-title = Tutón wobraz njeda so do signatury přetworić +pdfjs-editor-add-signature-image-no-data-error-description = Spytajće prošu druhi wobraz nahrać. +pdfjs-editor-add-signature-error-close-button = Začinić + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Přetorhnyć +pdfjs-editor-add-signature-add-button = Přidać +pdfjs-editor-edit-signature-update-button = Aktualizować + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Komentar wobdźěłać +pdfjs-editor-edit-comment-popup-button = + .title = Komentar wobdźěłać +pdfjs-editor-delete-comment-popup-button-label = Komentar wotstronić +pdfjs-editor-delete-comment-popup-button = + .title = Komentar wotstronić +pdfjs-show-comment-button = + .title = Komentar pokazać + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Komentar wobdźěłać +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualizować +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Komentar přidać +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Přidać +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Započńće pisać… +pdfjs-editor-edit-comment-dialog-cancel-button = Přetorhnyć + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Komentar přidać + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Bóčnicu přepinać (dokument miniatury/rozrjad/přiwěški/woršty wobsahuje) +pdfjs-toggle-views-manager-button1-label = Strony rjadować +pdfjs-views-manager-sidebar = + .aria-label = Bóčnica +pdfjs-views-manager-sidebar-resizer = + .aria-label = Přiměrjenje wulkosće bóčnicy +pdfjs-views-manager-view-selector-button = + .title = Napohlady +pdfjs-views-manager-view-selector-button-label = Napohlady +pdfjs-views-manager-pages-title = Strony +pdfjs-views-manager-outlines-title1 = Dokumentowa struktura + .title = Dokumentowa struktura (klikńće dwójce, zo byšće wšě zapiski pokazał/schował) +pdfjs-views-manager-attachments-title = Přiwěški +pdfjs-views-manager-layers-title1 = Runiny + .title = Runiny (klikńće dwójce, zo byšće wšě runiny na standardny status wróćo stajił) +pdfjs-views-manager-pages-option-label = Strony +pdfjs-views-manager-outlines-option-label = Dokumentowa struktura +pdfjs-views-manager-attachments-option-label = Přiwěški +pdfjs-views-manager-layers-option-label = Runiny +pdfjs-views-manager-add-file-button = + .title = Dataju přidać +pdfjs-views-manager-add-file-button-label = Dataju přidać +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } wubrany + [two] { $count } wubranej + [few] { $count } wubrane + *[other] { $count } wubranych + } +pdfjs-views-manager-pages-status-none-action-label = Strony wubrać +pdfjs-views-manager-pages-status-action-button-label = Rjadować +pdfjs-views-manager-pages-status-copy-button-label = Kopěrować +pdfjs-views-manager-pages-status-cut-button-label = Wutřihać +pdfjs-views-manager-pages-status-delete-button-label = Zhašeć +pdfjs-views-manager-pages-status-export-selected-button-label = Wubrane eksportować… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] { $count } strona wutřihana + [two] { $count } stronje wutřihanej + [few] { $count } strony wutřihane + *[other] { $count } stronow wutřihane + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] { $count } strona kopěrowana + [two] { $count } strona kopěrowanej + [few] { $count } strona kopěrowane + *[other] { $count } strona kopěrowane + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] { $count } strona zhašana + [two] { $count } strona zhašanej + [few] { $count } strona zhašane + *[other] { $count } strona zhašane + } +pdfjs-views-manager-pages-status-waiting-ready-label = Waša dataja so přihotuje… +pdfjs-views-manager-pages-status-waiting-uploading-label = Dataja so nahrawa… +pdfjs-views-manager-status-warning-cut-label = Njeda so wutřihać. Aktualizujće stronu a spytajće hišće raz. +pdfjs-views-manager-status-warning-copy-label = Njeda so kopěrować. Aktualizujće stronu a spytajće hišće raz. +pdfjs-views-manager-status-warning-delete-label = Njeda so zhašeć. Aktualizujće stronu a spytajće hišće raz. +pdfjs-views-manager-status-warning-save-label = Njeda so składować. Aktualizujće stronu a spytajće hišće raz. +pdfjs-views-manager-status-undo-button-label = Cofnyć +pdfjs-views-manager-status-done-button-label = Dokónčeny +pdfjs-views-manager-status-close-button = + .title = Začinić +pdfjs-views-manager-status-close-button-label = Začinić +pdfjs-views-manager-paste-button-label = Zasadźić +pdfjs-views-manager-paste-button-before = + .title = Před prěnjej stronu zasadźić +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Za stronu { $page } zasadźić +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NOWY +pdfjs-views-manager-waiting-for-file = Dataja so nahrawa… +pdfjs-toggle-views-manager-button1 = + .title = Strony rjadować + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Składowanu signaturu wotstronić +pdfjs-editor-delete-signature-button-label1 = Składowanu signaturu wotstronić + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Wopisanje wobdźěłać + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Wopisanje wobdźěłać diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/hu/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/hu/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/hu/viewer.ftl 2026-01-20 14:08:39.371689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/hu/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Jelenlegi oldal (webcím megtekintése a jelenlegi oldalról) pdfjs-bookmark-button-label = Jelenlegi oldal -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Megnyitás alkalmazásban -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Megnyitás alkalmazásban ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Fájlnév: pdfjs-document-properties-file-size = Fájlméret: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bájt) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bájt) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kB ({ $b } bájt) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bájt) pdfjs-document-properties-title = Cím: pdfjs-document-properties-author = Szerző: pdfjs-document-properties-subject = Tárgy: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Létrehozás dátuma: pdfjs-document-properties-modification-date = Módosítás dátuma: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Létrehozta: pdfjs-document-properties-producer = PDF előállító: pdfjs-document-properties-version = PDF verzió: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = { $page }. oldal bélyegképe +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = { $page }. oldal kiválasztása +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = { $page }. / { $total } oldal ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } megjegyzés] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Szöveg +pdfjs-editor-color-picker-free-text-input = + .title = Szövegszín módosítása pdfjs-editor-free-text-button-label = Szöveg pdfjs-editor-ink-button = .title = Rajzolás +pdfjs-editor-color-picker-ink-input = + .title = Rajzolási szín módosítása pdfjs-editor-ink-button-label = Rajzolás pdfjs-editor-stamp-button = .title = Képek hozzáadása vagy szerkesztése @@ -304,8 +309,37 @@ pdfjs-editor-highlight-button = .title = Kiemelés pdfjs-editor-highlight-button-label = Kiemelés -pdfjs-highlight-floating-button = +pdfjs-highlight-floating-button1 = .title = Kiemelés + .aria-label = Kiemelés +pdfjs-highlight-floating-button-label = Kiemelés +pdfjs-comment-floating-button = + .title = Megjegyzés + .aria-label = Megjegyzés +pdfjs-comment-floating-button-label = Megjegyzés +pdfjs-editor-comment-button = + .title = Megjegyzés + .aria-label = Megjegyzés +pdfjs-editor-comment-button-label = Megjegyzés +pdfjs-editor-signature-button = + .title = Aláírás hozzáadása +pdfjs-editor-signature-button-label = Aláírás hozzáadása + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Kiemelésszerkesztő +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Rajzszerkesztő +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Aláírás-szerkesztő: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Képszerkesztő ## Remove button for the various kind of editor. @@ -317,6 +351,8 @@ .title = Kép eltávolítása pdfjs-editor-remove-highlight-button = .title = Kiemelés eltávolítása +pdfjs-editor-remove-signature-button = + .title = Aláírás eltávolítása ## @@ -333,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Vastagság pdfjs-editor-free-highlight-thickness-title = .title = Vastagság módosítása, ha nem szöveges elemeket emel ki -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Aláírás-vezérlők és mentett aláírások +pdfjs-editor-signature-add-signature-button = + .title = Új aláírás hozzáadása +pdfjs-editor-signature-add-signature-button-label = Új aláírás hozzáadása +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Mentett aláírás: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Szövegszerkesztő -pdfjs-free-text-default-content = Kezdjen el gépelni… -pdfjs-ink = - .aria-label = Rajzszerkesztő -pdfjs-ink-canvas = - .aria-label = Felhasználó által készített kép + .default-content = Kezdjen gépelni… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Megjegyzés + *[other] Megjegyzések + } +pdfjs-editor-comments-sidebar-close-button = + .title = Oldalsáv bezárása + .aria-label = Oldalsáv bezárása +pdfjs-editor-comments-sidebar-close-button-label = Oldalsáv bezárása +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Lát valami figyelemre méltót? Jelölje ki és írjon megjegyzést. +pdfjs-editor-comments-sidebar-no-comments-link = További tudnivalók ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Alternatív szöveg -pdfjs-editor-alt-text-edit-button-label = Alternatív szöveg szerkesztése +pdfjs-editor-alt-text-edit-button = + .aria-label = Alternatív szöveg szerkesztése pdfjs-editor-alt-text-dialog-label = Válasszon egy lehetőséget pdfjs-editor-alt-text-dialog-description = Az alternatív szöveg segít, ha az emberek nem látják a képet, vagy ha az nem töltődik be. pdfjs-editor-alt-text-add-description-label = Leírás hozzáadása @@ -358,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Például: „Egy fiatal férfi leül enni egy asztalhoz” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternatív szöveg ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Bal felső sarok – átméretezés -pdfjs-editor-resizer-label-top-middle = Felül középen – átméretezés -pdfjs-editor-resizer-label-top-right = Jobb felső sarok – átméretezés -pdfjs-editor-resizer-label-middle-right = Jobbra középen – átméretezés -pdfjs-editor-resizer-label-bottom-right = Jobb alsó sarok – átméretezés -pdfjs-editor-resizer-label-bottom-middle = Alul középen – átméretezés -pdfjs-editor-resizer-label-bottom-left = Bal alsó sarok – átméretezés -pdfjs-editor-resizer-label-middle-left = Balra középen – átméretezés +pdfjs-editor-resizer-top-left = + .aria-label = Bal felső sarok – átméretezés +pdfjs-editor-resizer-top-middle = + .aria-label = Felül középen – átméretezés +pdfjs-editor-resizer-top-right = + .aria-label = Jobb felső sarok – átméretezés +pdfjs-editor-resizer-middle-right = + .aria-label = Jobbra középen – átméretezés +pdfjs-editor-resizer-bottom-right = + .aria-label = Jobb alsó sarok – átméretezés +pdfjs-editor-resizer-bottom-middle = + .aria-label = Alul középen – átméretezés +pdfjs-editor-resizer-bottom-left = + .aria-label = Bal alsó sarok – átméretezés +pdfjs-editor-resizer-middle-left = + .aria-label = Balra középen – átméretezés ## Color picker @@ -396,3 +465,283 @@ pdfjs-editor-highlight-show-all-button-label = Összes megjelenítése pdfjs-editor-highlight-show-all-button = .title = Összes megjelenítése + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Alternatív szöveg szerkesztése (képleírás) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Alternatív szöveg hozzáadása (képleírás) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Írja ide a leírását… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Rövid leírás azoknak, akik nem látják a képet, vagy arra az esetre, ha a kép nem tölt be. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Ez az alternatív szöveg automatikusan lett létrehozva, és pontatlan lehet. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = További tudnivalók +pdfjs-editor-new-alt-text-create-automatically-button-label = Alternatív szöveg automatikus létrehozása +pdfjs-editor-new-alt-text-not-now-button = Most nem +pdfjs-editor-new-alt-text-error-title = Az alternatív szöveg automatikus létrehozása nem sikerült +pdfjs-editor-new-alt-text-error-description = Írja meg a saját alternatív szövegét, vagy próbálja újra később. +pdfjs-editor-new-alt-text-error-close-button = Bezárás +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Alternatív szöveg MI modell letöltése ({ $downloadedSize } / { $totalSize } MB) + .aria-valuetext = Alternatív szöveg MI modell letöltése ({ $downloadedSize } / { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternatív szöveg hozzáadva +pdfjs-editor-new-alt-text-added-button-label = Alternatív szöveg hozzáadva +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Hiányzó alternatív szöveg +pdfjs-editor-new-alt-text-missing-button-label = Hiányzó alternatív szöveg +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Alternatív szöveg áttekintése +pdfjs-editor-new-alt-text-to-review-button-label = Alternatív szöveg szerkesztése +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automatikusan létrehozva: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Kép alternatív szövegének beállításai +pdfjs-image-alt-text-settings-button-label = Kép alternatív szövegének beállításai +pdfjs-editor-alt-text-settings-dialog-label = Kép alternatív szövegének beállításai +pdfjs-editor-alt-text-settings-automatic-title = Automatikus alternatív szöveg +pdfjs-editor-alt-text-settings-create-model-button-label = Alternatív szöveg automatikus létrehozása +pdfjs-editor-alt-text-settings-create-model-description = Leírásokat javasol, hogy segítsen azoknak, akik nem látják a képet, vagy arra az esetre, ha a kép nem tölt be. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Alternatív szöveg MI modellje ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Helyben fut az eszközén, így az adatai privátok maradnak. Az automatikus alternatív szövegekhez szükséges. +pdfjs-editor-alt-text-settings-delete-model-button = Törlés +pdfjs-editor-alt-text-settings-download-model-button = Letöltés +pdfjs-editor-alt-text-settings-downloading-model-button = Letöltés… +pdfjs-editor-alt-text-settings-editor-title = Alternatív szöveg szerkesztője +pdfjs-editor-alt-text-settings-show-dialog-button-label = Az alternatív szöveg szerkesztőjének azonnali megjelenítése egy kép hozzáadásakor +pdfjs-editor-alt-text-settings-show-dialog-description = Segít elérni, hogy az összes képén legyen alternatív szöveg. +pdfjs-editor-alt-text-settings-close-button = Bezárás + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Kiemelés hozzáadva +pdfjs-editor-freetext-added-alert = Szöveg hozzáadva +pdfjs-editor-ink-added-alert = Rajz hozzáadva +pdfjs-editor-stamp-added-alert = Kép hozzáadva +pdfjs-editor-signature-added-alert = Aláírás hozzáadva + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Kiemelés eltávolítva +pdfjs-editor-undo-bar-message-freetext = Szöveg eltávolítva +pdfjs-editor-undo-bar-message-ink = Rajz eltávolítva +pdfjs-editor-undo-bar-message-stamp = Kép eltávolítva +pdfjs-editor-undo-bar-message-signature = Aláírás eltávolítva +pdfjs-editor-undo-bar-message-comment = Megjegyzés eltávolítva +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } kommentár eltávolítva + *[other] { $count } kommentár eltávolítva + } +pdfjs-editor-undo-bar-undo-button = + .title = Visszavonás +pdfjs-editor-undo-bar-undo-button-label = Visszavonás +pdfjs-editor-undo-bar-close-button = + .title = Bezárás +pdfjs-editor-undo-bar-close-button-label = Bezárás + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Ez a mód lehetővé teszi a felhasználónak, hogy aláírást hozzon létre, és ezt egy PDF dokumentumhoz adja. A felhasználó szerkesztheti a nevet (ez egyben alternatív szövegként is szolgál), és ismételt felhasználás céljából tetszés szerint mentheti az aláírást. +pdfjs-editor-add-signature-dialog-title = Aláírás hozzáadása + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Beírás + .title = Beírás +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Rajzolás + .title = Rajzolás +pdfjs-editor-add-signature-image-button = Kép + .title = Kép + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Írja be az aláírását + .placeholder = Írja be az aláírását +pdfjs-editor-add-signature-draw-placeholder = Rajzolja le az aláírását +pdfjs-editor-add-signature-draw-thickness-range-label = Vastagság +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Rajzolási vastagság: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Húzzon ide egy fájlt a feltöltéshez +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Vagy tallózzon a képfájlok között + *[other] Vagy tallózzon a képfájlok között + } + +## Controls + +pdfjs-editor-add-signature-description-label = Leírás (alternatív szöveg) +pdfjs-editor-add-signature-description-input = + .title = Leírás (alternatív szöveg) +pdfjs-editor-add-signature-description-default-when-drawing = Aláírás +pdfjs-editor-add-signature-clear-button-label = Aláírás törlése +pdfjs-editor-add-signature-clear-button = + .title = Aláírás törlése +pdfjs-editor-add-signature-save-checkbox = Aláírás mentése +pdfjs-editor-add-signature-save-warning-message = Elérte a mentett aláírások 5 darabos korlátját. A mentéshez távolítson el egyet. +pdfjs-editor-add-signature-image-upload-error-title = A kép nem tölthető fel +pdfjs-editor-add-signature-image-upload-error-description = Ellenőrizze a hálózati kapcsolatot, vagy próbálkozzon egy másik képpel. +pdfjs-editor-add-signature-image-no-data-error-title = Ez a kép nem alakítható át aláírássá +pdfjs-editor-add-signature-image-no-data-error-description = Próbáljon meg másik képet feltölteni. +pdfjs-editor-add-signature-error-close-button = Bezárás + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Mégse +pdfjs-editor-add-signature-add-button = Hozzáadás +pdfjs-editor-edit-signature-update-button = Frissítés + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Megjegyzés szerkesztése +pdfjs-editor-edit-comment-popup-button = + .title = Megjegyzés szerkesztése +pdfjs-editor-delete-comment-popup-button-label = Megjegyzés eltávolítása +pdfjs-editor-delete-comment-popup-button = + .title = Megjegyzés eltávolítása +pdfjs-show-comment-button = + .title = Megjegyzés megjelenítése + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Megjegyzés szerkesztése +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Frissítés +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Megjegyzés hozzáadása +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Hozzáadás +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Kezdjen el gépelni… +pdfjs-editor-edit-comment-dialog-cancel-button = Mégse + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Megjegyzés hozzáadása + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Oldalsáv be/ki (a dokumentum bélyegképeket/vázlatot/mellékleteket/rétegeket tartalmaz) +pdfjs-toggle-views-manager-button1-label = Oldalak kezelése +pdfjs-views-manager-sidebar = + .aria-label = Oldalsáv +pdfjs-views-manager-sidebar-resizer = + .aria-label = Oldalsáv-átméretező +pdfjs-views-manager-view-selector-button = + .title = Nézetek +pdfjs-views-manager-view-selector-button-label = Nézetek +pdfjs-views-manager-pages-title = Oldalak +pdfjs-views-manager-outlines-title1 = Dokumentumvázlat + .title = Dokumentumvázlat (dupla kattintás az összes elem kinyitásához/becsukásához) +pdfjs-views-manager-attachments-title = Mellékletek +pdfjs-views-manager-layers-title1 = Rétegek + .title = Rétegek (dupla kattintás az összes réteg eredeti állapotba való visszaállításához) +pdfjs-views-manager-pages-option-label = Oldalak +pdfjs-views-manager-outlines-option-label = Dokumentumvázlat +pdfjs-views-manager-attachments-option-label = Mellékletek +pdfjs-views-manager-layers-option-label = Rétegek +pdfjs-views-manager-add-file-button = + .title = Fájl hozzáadása +pdfjs-views-manager-add-file-button-label = Fájl hozzáadása +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } kiválasztva + *[other] { $count } kiválasztva + } +pdfjs-views-manager-pages-status-none-action-label = Oldalak kiválasztása +pdfjs-views-manager-pages-status-action-button-label = Kezelés +pdfjs-views-manager-pages-status-copy-button-label = Másolás +pdfjs-views-manager-pages-status-cut-button-label = Kivágás +pdfjs-views-manager-pages-status-delete-button-label = Törlés +pdfjs-views-manager-pages-status-export-selected-button-label = Kiválasztottak exportálása… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 oldal kivágva + *[other] { $count } oldal kivágva + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 oldal másolva + *[other] { $count } oldal másolva + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 oldal törölve + *[other] { $count } oldal törölve + } +pdfjs-views-manager-pages-status-waiting-ready-label = A fájl előkészítése… +pdfjs-views-manager-pages-status-waiting-uploading-label = Fájl feltöltése… +pdfjs-views-manager-status-warning-cut-label = Nem sikerült kivágni. Frissítse az oldalt, és próbálja újra. +pdfjs-views-manager-status-warning-copy-label = Nem sikerült másolni. Frissítse az oldalt, és próbálja újra. +pdfjs-views-manager-status-warning-delete-label = Nem sikerült törölni. Frissítse az oldalt, és próbálja újra. +pdfjs-views-manager-status-warning-save-label = Nem sikerült menteni. Frissítse az oldalt, és próbálja újra. +pdfjs-views-manager-status-undo-button-label = Visszavonás +pdfjs-views-manager-status-done-button-label = Kész +pdfjs-views-manager-status-close-button = + .title = Bezárás +pdfjs-views-manager-status-close-button-label = Bezárás +pdfjs-views-manager-paste-button-label = Beillesztés +pdfjs-views-manager-paste-button-before = + .title = Beillesztés az első oldal elé +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Beillesztés a(z) { $page }. oldal után +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = ÚJ +pdfjs-views-manager-waiting-for-file = Fájl feltöltése… +pdfjs-toggle-views-manager-button1 = + .title = Oldalak kezelése + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Mentett aláírás eltávolítása +pdfjs-editor-delete-signature-button-label1 = Mentett aláírás eltávolítása + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Leírás szerkesztése + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Leírás szerkesztése diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/hy-AM/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/hy-AM/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/hy-AM/viewer.ftl 2026-01-20 14:08:39.371689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/hy-AM/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -29,16 +29,28 @@ .title = Խոշորացնել pdfjs-zoom-in-button-label = Խոշորացնել pdfjs-zoom-select = - .title = Մասշտաբ + .title = Դիտափոխում pdfjs-presentation-mode-button = .title = Անցնել Ներկայացման եղանակին pdfjs-presentation-mode-button-label = Ներկայացման եղանակ pdfjs-open-file-button = - .title = Բացել նիշք + .title = Բացել ֆայլ pdfjs-open-file-button-label = Բացել pdfjs-print-button = .title = Տպել pdfjs-print-button-label = Տպել +pdfjs-save-button = + .title = Պահել +pdfjs-save-button-label = Պահել +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Ներբեռնել +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Ներբեռնել +pdfjs-bookmark-button = + .title = Ընթացիկ էջ (Դիտել URL-ը ընթացիկ էջից) +pdfjs-bookmark-button-label = Ընթացիկ էջ ## Secondary toolbar and context menu @@ -63,6 +75,9 @@ pdfjs-cursor-hand-tool-button = .title = Միացնել Ձեռքի գործիքը pdfjs-cursor-hand-tool-button-label = Ձեռքի գործիք +pdfjs-scroll-page-button = + .title = Օգտագործեք էջի գլորումը +pdfjs-scroll-page-button-label = Էջի գլորում pdfjs-scroll-vertical-button = .title = Օգտագործել ուղղահայաց ոլորում pdfjs-scroll-vertical-button-label = Ուղղահայաց ոլորում @@ -87,16 +102,16 @@ pdfjs-document-properties-button = .title = Փաստաթղթի հատկությունները… pdfjs-document-properties-button-label = Փաստաթղթի հատկությունները… -pdfjs-document-properties-file-name = Նիշքի անունը. -pdfjs-document-properties-file-size = Նիշք չափը. +pdfjs-document-properties-file-name = Ֆայլի անունը. +pdfjs-document-properties-file-size = Ֆայլի չափը. # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } ԿԲ ({ $size_b } բայթ) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } ՄԲ ({ $size_b } բայթ) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } ԿԲ ({ $b } բայթ) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } ՄԲ ({ $b } բայթ) pdfjs-document-properties-title = Վերնագիր. pdfjs-document-properties-author = Հեղինակ․ pdfjs-document-properties-subject = Վերնագիր. @@ -104,9 +119,8 @@ pdfjs-document-properties-creation-date = Ստեղծելու ամսաթիվը. pdfjs-document-properties-modification-date = Փոփոխելու ամսաթիվը. # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Ստեղծող. pdfjs-document-properties-producer = PDF-ի հեղինակը. pdfjs-document-properties-version = PDF-ի տարբերակը. @@ -153,20 +167,29 @@ ## Tooltips and alt text for side panel toolbar buttons pdfjs-toggle-sidebar-button = - .title = Բացել/Փակել Կողային վահանակը -pdfjs-toggle-sidebar-button-label = Բացել/Փակել Կողային վահանակը + .title = Բացել/Փակել կողագոտին +pdfjs-toggle-sidebar-notification-button = + .title = Փոխարկել Կողագոտին (փաստաթուղթը պարունակում է ուրվագիծ/կցորդներ) +pdfjs-toggle-sidebar-button-label = Բացել/Փակել կողագոտին pdfjs-document-outline-button = .title = Ցուցադրել փաստաթղթի ուրվագիծը (կրկնակի սեղմեք՝ միավորները ընդարձակելու/կոծկելու համար) pdfjs-document-outline-button-label = Փաստաթղթի բովանդակությունը pdfjs-attachments-button = .title = Ցուցադրել կցորդները pdfjs-attachments-button-label = Կցորդներ +pdfjs-layers-button = + .title = Ցուցադրել շերտերը (կրկնակի սեղմեք բոլոր շերտերը սկզբնական վիճակին վերականգնելու համար) +pdfjs-layers-button-label = Շերտեր pdfjs-thumbs-button = - .title = Ցուցադրել Մանրապատկերը + .title = Ցուցադրել մանրապատկերը pdfjs-thumbs-button-label = Մանրապատկերը +pdfjs-current-outline-item-button = + .title = Գտեք ընթացիկ ուրվագծային տարրը +pdfjs-current-outline-item-button-label = Ընթացիկ ուրվագծային տարր pdfjs-findbar-button = .title = Գտնել փաստաթղթում pdfjs-findbar-button-label = Որոնում +pdfjs-additional-layers = Լրացուցիչ շերտեր ## Thumbnails panel item (tooltip and alt text for images) @@ -192,9 +215,25 @@ pdfjs-find-next-button-label = Հաջորդը pdfjs-find-highlight-checkbox = Գունանշել բոլորը pdfjs-find-match-case-checkbox-label = Մեծ(փոքր)ատառ հաշվի առնել +pdfjs-find-match-diacritics-checkbox-label = Համապատասխանեցնել տարբերիչները pdfjs-find-entire-word-checkbox-label = Ամբողջ բառերը pdfjs-find-reached-top = Հասել եք փաստաթղթի վերևին, կշարունակվի ներքևից pdfjs-find-reached-bottom = Հասել եք փաստաթղթի վերջին, կշարունակվի վերևից +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current }՝ { $total } համընկնումից + *[other] { $current } of { $total } համընկնումներից + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Ավելի քան { $limit } համընկնում + *[other] Ավելի քան { $limit } համընկնումներ + } pdfjs-find-not-found = Արտահայտությունը չգտնվեց ## Predefined zoom values @@ -209,6 +248,10 @@ ## PDF page +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Էջ { $page } ## Loading indicator messages @@ -220,10 +263,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -231,6 +270,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } Ծանոթություն] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -242,10 +284,354 @@ ## Editing +pdfjs-editor-free-text-button = + .title = Գրվածք +pdfjs-editor-color-picker-free-text-input = + .title = Փոխել տեքստի գույնը +pdfjs-editor-free-text-button-label = Գրվածք +pdfjs-editor-ink-button = + .title = Նկարել +pdfjs-editor-color-picker-ink-input = + .title = Փոխել նկարելու գույնը +pdfjs-editor-ink-button-label = Նկարել +pdfjs-editor-stamp-button = + .title = Հավելել կամ խմբագրել պատկերներ +pdfjs-editor-stamp-button-label = Հավելել կամ խմբագրել պատկերներ +pdfjs-editor-highlight-button = + .title = Գունանշում +pdfjs-editor-highlight-button-label = Գունանշում +pdfjs-highlight-floating-button1 = + .title = Գունանշում + .aria-label = Գունանշում +pdfjs-highlight-floating-button-label = Գունանշում +pdfjs-comment-floating-button = + .title = Մեկնաբանություն + .aria-label = Մեկնաբանություն +pdfjs-comment-floating-button-label = Մեկնաբանություն +pdfjs-editor-signature-button = + .title = Ավելացնել ստորագրություն +pdfjs-editor-signature-button-label = Ավելացնել ստորագրություն + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Գունանշել խմբագիրը +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Նկարելու խմբագիր +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Ստորագրության խմբագիր՝ { $description } +pdfjs-editor-stamp-editor = + .aria-label = Պատկերի խմբագիր + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Հեռացնել նկարումը +pdfjs-editor-remove-freetext-button = + .title = Հեռացնել գրվածքը +pdfjs-editor-remove-stamp-button = + .title = Հեռացնել պատկերը +pdfjs-editor-remove-highlight-button = + .title = Հեռացնել գունանշումը +pdfjs-editor-remove-signature-button = + .title = Հեռացնել ստորագրությունը + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Գույն +pdfjs-editor-free-text-size-input = Չափ +pdfjs-editor-ink-color-input = Գույն +pdfjs-editor-ink-thickness-input = Հաստություն +pdfjs-editor-ink-opacity-input = Մգություն +pdfjs-editor-stamp-add-image-button = + .title = Հավելել պատկեր +pdfjs-editor-stamp-add-image-button-label = Հավելել պատկեր +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Հաստություն +pdfjs-editor-free-highlight-thickness-title = + .title = Փոխել հաստությունը՝ տեքստից բացի այլ տարրեր գունանշելիս +pdfjs-editor-add-signature-container = + .aria-label = Ստորագրության կառավարման տարրեր և պահված ստորագրություններ +pdfjs-editor-signature-add-signature-button = + .title = Ավելացնել նոր ստորագրություն +pdfjs-editor-signature-add-signature-button-label = Ավելացնել նոր ստորագրություն +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Պահված ստորագրություն՝ { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Գրվածքի խմբագիր + .default-content = Սկսեք մուտքագրել... +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Մեկնաբանություն + *[other] Մեկնաբանություններ + } +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Տեսնո՞ւմ եք ինչ-որ ուշագրավ բան։ Գունանշեք այն և թողեք մեկնաբանություն։ +pdfjs-editor-comments-sidebar-no-comments-link = Իմանալ ավելին ## Alt-text dialog +pdfjs-editor-alt-text-button-label = Այլընտրանքային գրվածք +pdfjs-editor-alt-text-edit-button = + .aria-label = Խմբագրել այլընտրանքային գրվածքը +pdfjs-editor-alt-text-dialog-label = Ընտրեք տառատեսակը +pdfjs-editor-alt-text-dialog-description = Այլընտրանքային տեքստը (alternative text) օգնում է, երբ մարդիկ չեն կարողանում տեսնել պատկերը կամ երբ այն չի բեռնվում։ +pdfjs-editor-alt-text-add-description-label = Հավելել նկարագրություն +pdfjs-editor-alt-text-add-description-description = Ձգտեք գրել 1-2 նախադասություն, որոնք նկարագրում են թեման, միջավայրը կամ գործողությունները։ +pdfjs-editor-alt-text-mark-decorative-label = Նշել որպես դեկորատիվ +pdfjs-editor-alt-text-mark-decorative-description = Սա օգտագործվում է դեկորատիվ պատկերների համար, ինչպիսիք են եզրագծերը կամ ջրանիշերը։ +pdfjs-editor-alt-text-cancel-button = Չեղարկել +pdfjs-editor-alt-text-save-button = Պահել +pdfjs-editor-alt-text-decorative-tooltip = Նշել որպես դեկորատիվ +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Օրինակ՝ «Մի երիտասարդ նստում է սեղանի շուրջ՝ ուտելու» +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Այլընտրանքային գրվածք ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. +pdfjs-editor-resizer-top-left = + .aria-label = Վերին ձախ անկյուն՝ չափափոխել +pdfjs-editor-resizer-top-middle = + .aria-label = Վերևի մեջտեղում՝ չափափոխել +pdfjs-editor-resizer-top-right = + .aria-label = Վերին ձախ անկյուն՝ չափափոխել +pdfjs-editor-resizer-middle-right = + .aria-label = Մեջտեղի աջ կողմում՝ չափափոխել +pdfjs-editor-resizer-bottom-right = + .aria-label = Վերին ձախ անկյուն՝ չափափոխել +pdfjs-editor-resizer-bottom-middle = + .aria-label = Վերևի մեջտեղում՝ չափափոխել +pdfjs-editor-resizer-bottom-left = + .aria-label = Վերին ձախ անկյուն՝ չափափոխել +pdfjs-editor-resizer-middle-left = + .aria-label = Մեջտեղի ձախ կողմում՝ չափափոխել + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Գունանշման գույն +pdfjs-editor-colorpicker-button = + .title = Փոխել գույնը +pdfjs-editor-colorpicker-dropdown = + .aria-label = Գույների ընտրություն +pdfjs-editor-colorpicker-yellow = + .title = Դեղին +pdfjs-editor-colorpicker-green = + .title = Կանաչ +pdfjs-editor-colorpicker-blue = + .title = Կապույտ +pdfjs-editor-colorpicker-pink = + .title = Վարդագույն +pdfjs-editor-colorpicker-red = + .title = Կարմիր + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Ցուցադրել բոլորը +pdfjs-editor-highlight-show-all-button = + .title = Ցուցադրել բոլորը + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Խմբագրել այլընտրանքային տեքստը (պատկերի նկարագրությունը) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Ավելացնել այլընտրանքային գրվածք (պատկերի նկարագրություն) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Գրեք ձեր նկարագրությունն այստեղ… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Կարճ նկարագրություն նրանց համար, ովքեր չեն կարող տեսնել պատկերը կամ երբ պատկերը չի բեռնվում։ +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Այս այլընտրանքային տեքստը ստեղծվել է ինքնաշխատ և կարող է սխալ լինել։ +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Իմանալ ավելին +pdfjs-editor-new-alt-text-create-automatically-button-label = Ինքնաշխատ ստեղծել այլընտրանքային գրվածք +pdfjs-editor-new-alt-text-not-now-button = Ոչ հիմա +pdfjs-editor-new-alt-text-error-title = Հնարավոր չէ ինքնաշխատ ստեղծել այլընտրանքային գրվածք +pdfjs-editor-new-alt-text-error-description = Խնդրում ենք գրել ձեր սեփական այլընտրանքային տեքստը կամ փորձել կրկին ավելի ուշ։ +pdfjs-editor-new-alt-text-error-close-button = Փակել +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Ներբեռնվում է այլընտրանքային գրվածքի ահեստական բանականության մոդելը ({ $downloadedSize }՝ { $totalSize } ՄԲ-ից) + .aria-valuetext = Ներբեռնվում է այլընտրանքային գրվածքի ահեստական բանականության մոդելը ({ $downloadedSize }՝ { $totalSize } ՄԲ-ից) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Այլընտրանքային գրվածքն ավելացված է +pdfjs-editor-new-alt-text-added-button-label = Այլընտրանքային գրվածքն ավելացված է +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Այլընտրանքային գրվածքը բացակայում է +pdfjs-editor-new-alt-text-missing-button-label = Այլընտրանքային գրվածքը բացակայում է +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Վերանայել այլընտրանքային գրվածքը +pdfjs-editor-new-alt-text-to-review-button-label = Վերանայել այլընտրանքային գրվածքը +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Ստեղծվել է ինքնաշխատվ՝ { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Պատկերի այլընտրանքային գրվածքի կարգավորումներ +pdfjs-image-alt-text-settings-button-label = Պատկերի այլընտրանքային գրվածքի կարգավորումներ +pdfjs-editor-alt-text-settings-dialog-label = Պատկերի այլընտրանքային գրվածքի կարգավորումներ +pdfjs-editor-alt-text-settings-automatic-title = Ինքնաշխատ այլընտրանքային գրվածք +pdfjs-editor-alt-text-settings-create-model-button-label = Ինքնաշխատ ստեղծել այլընտրանքային գրվածք +pdfjs-editor-alt-text-settings-create-model-description = Կարճ նկարագրություն նրանց համար, ովքեր չեն կարող տեսնել պատկերը կամ երբ պատկերը չի բեռնվում։ +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Այլընտրանքային գրվածքի արհեստական բանականության մոդել ({ $totalSize } ՄԲ) +pdfjs-editor-alt-text-settings-ai-model-description = Աշխատում է տեղայնորեն ձեր սարքի վրա, որպեսզի ձեր տվյալները մնան գաղտնի: Պահանջվում է ինքնաշխատ այլընտրանքային գրվածքի համար: +pdfjs-editor-alt-text-settings-delete-model-button = Ջնջել +pdfjs-editor-alt-text-settings-download-model-button = Ներբեռնել +pdfjs-editor-alt-text-settings-downloading-model-button = Ներբեռնվում է… +pdfjs-editor-alt-text-settings-editor-title = Այլընտրանքային գրվածքի խմբագիր +pdfjs-editor-alt-text-settings-show-dialog-button-label = Պատկեր ավելացնելիս անմիջապես ցուցադրել այլընտրանքային գրվածքի խմբագիրը +pdfjs-editor-alt-text-settings-show-dialog-description = Օգնում է համոզվել, որ ձեր բոլոր պատկերներն ունեն այլընտրանքային գրվածք։ +pdfjs-editor-alt-text-settings-close-button = Փակել + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Գունանշումը ավելացվել է +pdfjs-editor-freetext-added-alert = Գրվածքը ավելացվել է +pdfjs-editor-ink-added-alert = Նկարումը ավելացվել է +pdfjs-editor-stamp-added-alert = Պատկերն ավելացված է +pdfjs-editor-signature-added-alert = Ստորագրությունն ավելացված է + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Գունանշումը հեռացված է +pdfjs-editor-undo-bar-message-freetext = Գրվածքը հեռացվել է +pdfjs-editor-undo-bar-message-ink = Նկարվածը հեռացվել է +pdfjs-editor-undo-bar-message-stamp = Պատկերը հեռացվել է +pdfjs-editor-undo-bar-message-signature = Ստորագրությունը հեռացված է +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } մեկնաբանությունը հեռացվել է + *[other] { $count } մեկնաբանությունները հեռացվել են + } +pdfjs-editor-undo-bar-undo-button = + .title = Հետարկել +pdfjs-editor-undo-bar-undo-button-label = Հետարկել +pdfjs-editor-undo-bar-close-button = + .title = Փակել +pdfjs-editor-undo-bar-close-button-label = Փակել + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Այս յուրահատկությունը հնարավորություն է տալիս օգտվողին ստեղծել ստորագրություն՝ PDF փաստաթղթում ավելացնելու համար: Օգտվողը կարող է խմբագրել անունը (որը նաև ծառայում է որպես alt տեքստ) և լրացուցիչ պահել այն՝ հետագա օգտագործման համար: +pdfjs-editor-add-signature-dialog-title = Ավելացնել ստորագրություն + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Տեսակ + .title = Տեսակ +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Նկարել + .title = Նկարել +pdfjs-editor-add-signature-image-button = Պատկեր + .title = Պատկեր + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Մուտքագրել ստորագրություն + .placeholder = Մուտքագրել ստորագրություն +pdfjs-editor-add-signature-draw-placeholder = Նկարեք ձեր ստորագրությունը +pdfjs-editor-add-signature-draw-thickness-range-label = Հաստություն +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Նկարելու հաստությունը՝ { $thickness } +pdfjs-editor-add-signature-image-placeholder = Քաշեք ֆայլը այստեղ՝ վերբեռնելու համար +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Կամ ընտրեք պատկերի ֆայլը + *[other] Կամ ընտրեք պատկերի ֆայլերը + } + +## Controls + +pdfjs-editor-add-signature-description-label = Նկարագրություն (այլընտրանքային գրվածք) +pdfjs-editor-add-signature-description-input = + .title = Նկարագրություն (այլընտրանքային գրվածք) +pdfjs-editor-add-signature-description-default-when-drawing = Ստորագրություն +pdfjs-editor-add-signature-clear-button-label = Մաքրել ստորագրությունը +pdfjs-editor-add-signature-clear-button = + .title = Մաքրել ստորագրությունը +pdfjs-editor-add-signature-save-checkbox = Պահել ստորագրությունը +pdfjs-editor-add-signature-save-warning-message = Դուք հասել եք պահպանված ստորագրությունների 5 սահմանաչափին։ Հեռացրեք մեկը՝ ավելին պահելու համար։ +pdfjs-editor-add-signature-image-upload-error-title = Չհաջողվեց վերբեռնել պատկերը +pdfjs-editor-add-signature-image-upload-error-description = Ստուգեք ձեր ցանցային կապակցումը կամ փորձեք մեկ այլ պատկեր։ +pdfjs-editor-add-signature-image-no-data-error-title = Այս պատկերը հնարավոր չէ վերածել ստորագրության +pdfjs-editor-add-signature-image-no-data-error-description = Խնդրում եմ փորձեք վերբեռնել այլ պատկեր։ +pdfjs-editor-add-signature-error-close-button = Փակել + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Չեղարկել +pdfjs-editor-add-signature-add-button = Ավելացնել +pdfjs-editor-edit-signature-update-button = Թարմացնել + +## Edit a comment dialog + +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Ավելացնել մեկնաբանություն +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Ավելացնել +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Մուտքագրեք այստեղ… +pdfjs-editor-edit-comment-dialog-cancel-button = Չեղարկել + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Ավելացնել մեկնաբանություն + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-views-manager-add-file-button = + .title = Ավելացնել ֆայլ +pdfjs-views-manager-add-file-button-label = Ավելացնել ֆայլ + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Հեռացնել պահված ստորագրությունը +pdfjs-editor-delete-signature-button-label1 = Հեռացնել պահված ստորագրությունը + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Խմբագրել նկարագրությունը + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Խմբագրել նկարագրությունը diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/hye/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/hye/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/hye/viewer.ftl 2026-01-20 14:08:39.371689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/hye/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -92,24 +92,12 @@ pdfjs-document-properties-button-label = Փաստաթղթի յատկութիւնները… pdfjs-document-properties-file-name = Նիշքի անունը․ pdfjs-document-properties-file-size = Նիշք չափը. -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } ԿԲ ({ $size_b } բայթ) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } ՄԲ ({ $size_b } բայթ) pdfjs-document-properties-title = Վերնագիր pdfjs-document-properties-author = Հեղինակ․ pdfjs-document-properties-subject = առարկայ pdfjs-document-properties-keywords = Հիմնաբառեր pdfjs-document-properties-creation-date = Ստեղծման ամսաթիւ pdfjs-document-properties-modification-date = Փոփոխութեան ամսաթիւ. -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Ստեղծող pdfjs-document-properties-producer = PDF-ի Արտադրողը. pdfjs-document-properties-version = PDF-ի տարբերակը. @@ -237,10 +225,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -256,13 +240,3 @@ pdfjs-password-ok-button = Լաւ pdfjs-password-cancel-button = Չեղարկել pdfjs-web-fonts-disabled = Վեբ-տառատեսակները անջատուած են. հնարաւոր չէ աւգտագործել ներկառուցուած PDF տառատեսակները։ - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ia/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ia/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ia/viewer.ftl 2026-01-20 14:08:39.372689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ia/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Pagina actual (vide le URL del pagina actual) pdfjs-bookmark-button-label = Pagina actual -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Aperir in app -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Aperir in app ## Secondary toolbar and context menu @@ -67,8 +61,8 @@ .title = Ir al prime pagina pdfjs-first-page-button-label = Ir al prime pagina pdfjs-last-page-button = - .title = Ir al prime pagina -pdfjs-last-page-button-label = Ir al prime pagina + .title = Ir al ultime pagina +pdfjs-last-page-button-label = Ir al ultime pagina pdfjs-page-rotate-cw-button = .title = Rotar in senso horari pdfjs-page-rotate-cw-button-label = Rotar in senso horari @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Nomine del file: pdfjs-document-properties-file-size = Dimension de file: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) pdfjs-document-properties-title = Titulo: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Subjecto: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Data de creation: pdfjs-document-properties-modification-date = Data de modification: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Creator: pdfjs-document-properties-producer = Productor PDF: pdfjs-document-properties-version = Version PDF: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Vignette del pagina { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Seliger pagina { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Pagina { $page } de { $total } ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } Annotation] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Texto +pdfjs-editor-color-picker-free-text-input = + .title = Cambiar color de texto pdfjs-editor-free-text-button-label = Texto pdfjs-editor-ink-button = .title = Designar +pdfjs-editor-color-picker-ink-input = + .title = Cambiar color de designo pdfjs-editor-ink-button-label = Designar pdfjs-editor-stamp-button = .title = Adder o rediger imagines @@ -304,6 +309,37 @@ pdfjs-editor-highlight-button = .title = Evidentia pdfjs-editor-highlight-button-label = Evidentia +pdfjs-highlight-floating-button1 = + .title = Evidentiar + .aria-label = Evidentiar +pdfjs-highlight-floating-button-label = Evidentiar +pdfjs-comment-floating-button = + .title = Commento + .aria-label = Commento +pdfjs-comment-floating-button-label = Commento +pdfjs-editor-comment-button = + .title = Commento + .aria-label = Commento +pdfjs-editor-comment-button-label = Commento +pdfjs-editor-signature-button = + .title = Adder signatura +pdfjs-editor-signature-button-label = Adder signatura + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Editor de evidentiation +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Editor de designos +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Editor de signaturas: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Editor de imagines ## Remove button for the various kind of editor. @@ -315,6 +351,8 @@ .title = Remover imagine pdfjs-editor-remove-highlight-button = .title = Remover evidentia +pdfjs-editor-remove-signature-button = + .title = Remover signatura ## @@ -331,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Spissor pdfjs-editor-free-highlight-thickness-title = .title = Cambiar spissor evidentiante elementos differente de texto -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Controlos de signatura e signaturas salvate +pdfjs-editor-signature-add-signature-button = + .title = Adder nove signatura +pdfjs-editor-signature-add-signature-button-label = Adder nove signatura +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Signatura salvate: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Editor de texto -pdfjs-free-text-default-content = Comenciar a scriber… -pdfjs-ink = - .aria-label = Editor de designos -pdfjs-ink-canvas = - .aria-label = Imagine create per le usator + .default-content = Initiar a inserer… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Commento + *[other] Commentos + } +pdfjs-editor-comments-sidebar-close-button = + .title = Clauder le barra lateral + .aria-label = Clauder le barra lateral +pdfjs-editor-comments-sidebar-close-button-label = Clauder le barra lateral +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Vide tu alco notabile? Evidentia lo e lassa un commentario. +pdfjs-editor-comments-sidebar-no-comments-link = Pro saper plus ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Texto alternative -pdfjs-editor-alt-text-edit-button-label = Rediger texto alternative +pdfjs-editor-alt-text-edit-button = + .aria-label = Rediger texto alternative pdfjs-editor-alt-text-dialog-label = Elige un option pdfjs-editor-alt-text-dialog-description = Le texto alternative (alt text) adjuta quando le personas non pote vider le imagine o quando illo non carga. pdfjs-editor-alt-text-add-description-label = Adder un description @@ -356,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Per exemplo, “Un juvene sede a un tabula pro mangiar un repasto” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Texto alternative ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Angulo superior sinistre — redimensionar -pdfjs-editor-resizer-label-top-middle = Medio superior — redimensionar -pdfjs-editor-resizer-label-top-right = Angulo superior dextre — redimensionar -pdfjs-editor-resizer-label-middle-right = Medio dextre — redimensionar -pdfjs-editor-resizer-label-bottom-right = Angulo inferior dextre — redimensionar -pdfjs-editor-resizer-label-bottom-middle = Medio inferior — redimensionar -pdfjs-editor-resizer-label-bottom-left = Angulo inferior sinistre — redimensionar -pdfjs-editor-resizer-label-middle-left = Medio sinistre — redimensionar +pdfjs-editor-resizer-top-left = + .aria-label = Angulo superior sinistre — redimensionar +pdfjs-editor-resizer-top-middle = + .aria-label = Medio superior — redimensionar +pdfjs-editor-resizer-top-right = + .aria-label = Angulo superior dextre — redimensionar +pdfjs-editor-resizer-middle-right = + .aria-label = Medio dextre — redimensionar +pdfjs-editor-resizer-bottom-right = + .aria-label = Angulo inferior dextre — redimensionar +pdfjs-editor-resizer-bottom-middle = + .aria-label = Medio inferior — redimensionar +pdfjs-editor-resizer-bottom-left = + .aria-label = Angulo inferior sinistre — redimensionar +pdfjs-editor-resizer-middle-left = + .aria-label = Medio sinistre — redimensionar ## Color picker @@ -387,3 +458,290 @@ .title = Rosate pdfjs-editor-colorpicker-red = .title = Rubie + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Monstrar toto +pdfjs-editor-highlight-show-all-button = + .title = Monstrar toto + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Rediger texto alternative (description del imagine) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Adder texto alternative (description del imagine) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Scribe tu description ci… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Breve description pro personas qui non pote vider le imagine o quando le imagine non se carga. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Iste texto alternative ha essite create automaticamente e pote esser inexacte. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Pro saper plus +pdfjs-editor-new-alt-text-create-automatically-button-label = Crear texto alternative automaticamente +pdfjs-editor-new-alt-text-not-now-button = Non ora +pdfjs-editor-new-alt-text-error-title = Impossibile crear texto alternative automaticamente +pdfjs-editor-new-alt-text-error-description = Scribe tu proprie texto alternative o retenta plus tarde. +pdfjs-editor-new-alt-text-error-close-button = Clauder +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Discargante modello de intelligentia artificial del texto alternative ({ $downloadedSize } de { $totalSize } MB) + .aria-valuetext = Discargante modello de intelligentia artificial del texto alternative ({ $downloadedSize } de { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Texto alternative addite +pdfjs-editor-new-alt-text-added-button-label = Texto alternative addite +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Texto alternative mancante +pdfjs-editor-new-alt-text-missing-button-label = Texto alternative mancante +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Revider texto alternative +pdfjs-editor-new-alt-text-to-review-button-label = Revider texto alternative +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automaticamente create: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Parametros del texto alternative del imagine +pdfjs-image-alt-text-settings-button-label = Parametros del texto alternative del imagine +pdfjs-editor-alt-text-settings-dialog-label = Parametros del texto alternative del imagine +pdfjs-editor-alt-text-settings-automatic-title = Texto alternative automatic +pdfjs-editor-alt-text-settings-create-model-button-label = Crear texto alternative automaticamente +pdfjs-editor-alt-text-settings-create-model-description = Suggere descriptiones pro adjutar le personas qui non pote vider le imagine o quando le imagine non carga. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modello de intelligentia artificial del texto alternative ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Flue localmente sur tu apparato assi tu datos remane private. Necessari pro texto alternative automatic. +pdfjs-editor-alt-text-settings-delete-model-button = Deler +pdfjs-editor-alt-text-settings-download-model-button = Discargar +pdfjs-editor-alt-text-settings-downloading-model-button = Discargante… +pdfjs-editor-alt-text-settings-editor-title = Rediger texto alternative +pdfjs-editor-alt-text-settings-show-dialog-button-label = Monstrar le redactor de texto alternative a pena on adde un imagine +pdfjs-editor-alt-text-settings-show-dialog-description = Te adjuta a verifica que tote tu imagines ha un texto alternative. +pdfjs-editor-alt-text-settings-close-button = Clauder + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Evidentia addite +pdfjs-editor-freetext-added-alert = Texto addite +pdfjs-editor-ink-added-alert = Designo addite +pdfjs-editor-stamp-added-alert = Imagine addite +pdfjs-editor-signature-added-alert = Firma addite + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Evidentiation removite +pdfjs-editor-undo-bar-message-freetext = Texto removite +pdfjs-editor-undo-bar-message-ink = Designo removite +pdfjs-editor-undo-bar-message-stamp = Imagine removite +pdfjs-editor-undo-bar-message-signature = Signatura removite +pdfjs-editor-undo-bar-message-comment = Commento removite +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } annotation removite + *[other] { $count } annotationes removite + } +pdfjs-editor-undo-bar-undo-button = + .title = Disfacer +pdfjs-editor-undo-bar-undo-button-label = Disfacer +pdfjs-editor-undo-bar-close-button = + .title = Clauder +pdfjs-editor-undo-bar-close-button-label = Clauder + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Iste formulario permitte al usator crear un firma a adder a un documento PDF. Le usator pote modificar le nomine (le qual tamben servi de texto alternative) e, si desirate, salvar le firma pro uso repetite. +pdfjs-editor-add-signature-dialog-title = Adder un signatura + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Typar + .title = Typar +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Designar + .title = Designar +pdfjs-editor-add-signature-image-button = Imagine + .title = Imagine + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Insere tu firma + .placeholder = Insere tu firma +pdfjs-editor-add-signature-draw-placeholder = Designa tu firma +pdfjs-editor-add-signature-draw-thickness-range-label = Spissor +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Spissor de designo: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Trahe un file hic pro incargar lo +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] O elige files de imagine + *[other] O folietta files de imagine + } + +## Controls + +pdfjs-editor-add-signature-description-label = Description (texto alternative) +pdfjs-editor-add-signature-description-input = + .title = Description (texto alternative) +pdfjs-editor-add-signature-description-default-when-drawing = Signatura +pdfjs-editor-add-signature-clear-button-label = Rader signatura +pdfjs-editor-add-signature-clear-button = + .title = Rader signatura +pdfjs-editor-add-signature-save-checkbox = Salvar signatura +pdfjs-editor-add-signature-save-warning-message = Tu ha attingite le limite de 5 firmas salvate. Remove un pro salvar un altere. +pdfjs-editor-add-signature-image-upload-error-title = Non poteva incargar le imagine +pdfjs-editor-add-signature-image-upload-error-description = Verifica tu connexion al rete o tenta un altere imagine. +pdfjs-editor-add-signature-image-no-data-error-title = Impossibile converter iste imagine in un firma +pdfjs-editor-add-signature-image-no-data-error-description = Essaya cargar un imagine differente. +pdfjs-editor-add-signature-error-close-button = Clauder + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Cancellar +pdfjs-editor-add-signature-add-button = Adder +pdfjs-editor-edit-signature-update-button = Actualisar + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Rediger commento +pdfjs-editor-edit-comment-popup-button = + .title = Rediger commento +pdfjs-editor-delete-comment-popup-button-label = Remover commento +pdfjs-editor-delete-comment-popup-button = + .title = Remover commento +pdfjs-show-comment-button = + .title = Monstrar commento + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Rediger commento +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Actualisar +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Adder commento +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Adder +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Comenciar a scriber… +pdfjs-editor-edit-comment-dialog-cancel-button = Cancellar + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Adder commento + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Monstrar/celar le barra lateral (le documento contine miniaturas/structura/attachamentos/stratos) +pdfjs-toggle-views-manager-button1-label = Gerer paginas +pdfjs-views-manager-sidebar = + .aria-label = Barra lateral +pdfjs-views-manager-sidebar-resizer = + .aria-label = Saltar al declaration +pdfjs-views-manager-view-selector-button = + .title = Vistas +pdfjs-views-manager-view-selector-button-label = Vistas +pdfjs-views-manager-pages-title = Paginas +pdfjs-views-manager-outlines-title1 = Structura de documento + .title = Structura de documento (clicca-duplemente pro expander/collaber tote elementos) +pdfjs-views-manager-attachments-title = Annexos +pdfjs-views-manager-layers-title1 = Stratos + .title = Stratos (clicca-duplemente pro reinitialisar tote le stratos al stato predefinite) +pdfjs-views-manager-pages-option-label = Paginas +pdfjs-views-manager-outlines-option-label = Schema del documento +pdfjs-views-manager-attachments-option-label = Annexos +pdfjs-views-manager-layers-option-label = Stratos +pdfjs-views-manager-add-file-button = + .title = Adder file +pdfjs-views-manager-add-file-button-label = Adder file +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } seligite + *[other] { $count } seligite + } +pdfjs-views-manager-pages-status-none-action-label = Seliger paginas +pdfjs-views-manager-pages-status-action-button-label = Gerer +pdfjs-views-manager-pages-status-copy-button-label = Copiar +pdfjs-views-manager-pages-status-cut-button-label = Secar +pdfjs-views-manager-pages-status-delete-button-label = Deler +pdfjs-views-manager-pages-status-export-selected-button-label = Exportar seligite… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 pagina secate + *[other] { $count } paginas secate + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 pagina copiate + *[other] { $count } paginas copiate + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 pagina delite + *[other] { $count } paginas delite + } +pdfjs-views-manager-pages-status-waiting-ready-label = Preparante file… +pdfjs-views-manager-pages-status-waiting-uploading-label = Cargante file… +pdfjs-views-manager-status-warning-cut-label = Impossibile secar. Refresca le pagina e retenta. +pdfjs-views-manager-status-warning-copy-label = Impossibile copiar. Refresca le pagina e retenta. +pdfjs-views-manager-status-warning-delete-label = Impossibile deler. Refresca le pagina e retenta. +pdfjs-views-manager-status-warning-save-label = Impossibile salvar. Refresca le pagina e retenta. +pdfjs-views-manager-status-undo-button-label = Disfacer +pdfjs-views-manager-status-done-button-label = Facite +pdfjs-views-manager-status-close-button = + .title = Clauder +pdfjs-views-manager-status-close-button-label = Clauder +pdfjs-views-manager-paste-button-label = Collar +pdfjs-views-manager-paste-button-before = + .title = Collar ante le prime pagina +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Colla post pagina { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NOVA +pdfjs-views-manager-waiting-for-file = Cargante file… +pdfjs-toggle-views-manager-button1 = + .title = Gerer paginas + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Remover signatura salvate +pdfjs-editor-delete-signature-button-label1 = Remover signatura salvate + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Rediger description + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Rediger description diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/id/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/id/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/id/viewer.ftl 2026-01-20 14:08:39.372689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/id/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -42,6 +42,12 @@ pdfjs-save-button = .title = Simpan pdfjs-save-button-label = Simpan +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Unduh +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Unduh pdfjs-bookmark-button = .title = Laman Saat Ini (Lihat URL dari Laman Sekarang) pdfjs-bookmark-button-label = Laman Saat Ini @@ -99,13 +105,13 @@ pdfjs-document-properties-file-name = Nama berkas: pdfjs-document-properties-file-size = Ukuran berkas: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } byte) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byte) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } byte) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte) pdfjs-document-properties-title = Judul: pdfjs-document-properties-author = Penyusun: pdfjs-document-properties-subject = Subjek: @@ -113,9 +119,8 @@ pdfjs-document-properties-creation-date = Tanggal Dibuat: pdfjs-document-properties-modification-date = Tanggal Dimodifikasi: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Pembuat: pdfjs-document-properties-producer = Pemroduksi PDF: pdfjs-document-properties-version = Versi PDF: @@ -214,6 +219,13 @@ pdfjs-find-entire-word-checkbox-label = Seluruh teks pdfjs-find-reached-top = Sampai di awal dokumen, dilanjutkan dari bawah pdfjs-find-reached-bottom = Sampai di akhir dokumen, dilanjutkan dari atas +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = { $current } dari { $total } yang cocok +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = Lebih dari { $limit } kecocokan pdfjs-find-not-found = Frasa tidak ditemukan ## Predefined zoom values @@ -243,10 +255,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -254,6 +262,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Anotasi { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -267,27 +278,312 @@ pdfjs-editor-free-text-button = .title = Teks +pdfjs-editor-color-picker-free-text-input = + .title = Ubah warna teks pdfjs-editor-free-text-button-label = Teks pdfjs-editor-ink-button = .title = Gambar +pdfjs-editor-color-picker-ink-input = + .title = Ubah warna gambar pdfjs-editor-ink-button-label = Gambar +pdfjs-editor-stamp-button = + .title = Tambah atau edit gambar +pdfjs-editor-stamp-button-label = Tambah atau edit gambar +pdfjs-editor-highlight-button = + .title = Sorot +pdfjs-editor-highlight-button-label = Sorot +pdfjs-highlight-floating-button1 = + .title = Sorot + .aria-label = Sorot +pdfjs-highlight-floating-button-label = Sorot +pdfjs-comment-floating-button = + .title = Komentar + .aria-label = Komentar +pdfjs-comment-floating-button-label = Komentar +pdfjs-editor-signature-button = + .title = Tambahkan tanda tangan +pdfjs-editor-signature-button-label = Tambahkan tanda tangan + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Editor sorot +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Editor gambar +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Editor tanda tangan: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Editor gambar + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Hapus gambar +pdfjs-editor-remove-freetext-button = + .title = Hapus teks +pdfjs-editor-remove-stamp-button = + .title = Hapus gambar +pdfjs-editor-remove-highlight-button = + .title = Hapus sorotan +pdfjs-editor-remove-signature-button = + .title = Hapus tanda tangan + +## + # Editor Parameters pdfjs-editor-free-text-color-input = Warna pdfjs-editor-free-text-size-input = Ukuran pdfjs-editor-ink-color-input = Warna pdfjs-editor-ink-thickness-input = Ketebalan pdfjs-editor-ink-opacity-input = Opasitas -pdfjs-free-text = +pdfjs-editor-stamp-add-image-button = + .title = Tambahkan gambar +pdfjs-editor-stamp-add-image-button-label = Tambahkan gambar +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Ketebalan +pdfjs-editor-free-highlight-thickness-title = + .title = Ubah ketebalan saat menyorot item selain teks +pdfjs-editor-add-signature-container = + .aria-label = Kontrol tanda tangan dan tanda tangan tersimpan +pdfjs-editor-signature-add-signature-button = + .title = Tambahkan tanda tangan baru +pdfjs-editor-signature-add-signature-button-label = Tambahkan tanda tangan baru +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Tanda tangan tersimpan: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Editor Teks -pdfjs-free-text-default-content = Mulai mengetik… -pdfjs-ink = - .aria-label = Editor Gambar -pdfjs-ink-canvas = - .aria-label = Gambar yang dibuat pengguna + .default-content = Mulai mengetik… ## Alt-text dialog +pdfjs-editor-alt-text-button-label = Teks alternatif +pdfjs-editor-alt-text-edit-button = + .aria-label = Edit teks alternatif +pdfjs-editor-alt-text-dialog-label = Pilih opsi +pdfjs-editor-alt-text-dialog-description = Teks alternatif membantu ketika orang tidak dapat melihat gambar atau ketika tidak termuat. +pdfjs-editor-alt-text-add-description-label = Tambahkan deskripsi +pdfjs-editor-alt-text-add-description-description = Upayakan 1-2 kalimat yang menggambarkan subjek, latar, atau tindakan. +pdfjs-editor-alt-text-mark-decorative-label = Tandai sebagai dekoratif +pdfjs-editor-alt-text-mark-decorative-description = Ini digunakan untuk gambar hias, seperti batas atau tanda air. +pdfjs-editor-alt-text-cancel-button = Batal +pdfjs-editor-alt-text-save-button = Simpan +pdfjs-editor-alt-text-decorative-tooltip = Ditandai sebagai dekoratif +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = Misalnya, “Seorang pemuda duduk di meja untuk makan” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Teks alternatif ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. +pdfjs-editor-resizer-top-left = + .aria-label = Pojok kiri atas — ubah ukuran +pdfjs-editor-resizer-top-middle = + .aria-label = Tengah atas — ubah ukuran +pdfjs-editor-resizer-top-right = + .aria-label = Pojok kanan atas — ubah ukuran +pdfjs-editor-resizer-middle-right = + .aria-label = Kanan tengah — ubah ukuran +pdfjs-editor-resizer-bottom-right = + .aria-label = Pojok kanan bawah — ubah ukuran +pdfjs-editor-resizer-bottom-middle = + .aria-label = Tengah bawah — ubah ukuran +pdfjs-editor-resizer-bottom-left = + .aria-label = Pojok kiri bawah — ubah ukuran +pdfjs-editor-resizer-middle-left = + .aria-label = Kiri tengah — ubah ukuran + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Warna sorot +pdfjs-editor-colorpicker-button = + .title = Ubah warna +pdfjs-editor-colorpicker-dropdown = + .aria-label = Pilihan warna +pdfjs-editor-colorpicker-yellow = + .title = Kuning +pdfjs-editor-colorpicker-green = + .title = Hijau +pdfjs-editor-colorpicker-blue = + .title = Biru +pdfjs-editor-colorpicker-pink = + .title = Merah Jambu +pdfjs-editor-colorpicker-red = + .title = Merah + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Tampilkan semua +pdfjs-editor-highlight-show-all-button = + .title = Tampilkan semua + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Edit teks alternatif (deskripsi gambar) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Tambahkan teks alternatif (deskripsi gambar) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Tulis deskripsi Anda di sini… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Deskripsi singkat untuk orang yang tidak dapat melihat gambar atau saat gambar tidak termuat. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Teks alternatif ini dibuat secara otomatis dan mungkin tidak akurat. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Pelajari lebih lanjut +pdfjs-editor-new-alt-text-create-automatically-button-label = Buat teks alternatif secara otomatis +pdfjs-editor-new-alt-text-not-now-button = Jangan sekarang +pdfjs-editor-new-alt-text-error-title = Tidak bisa membuat teks alternatif secara otomatis +pdfjs-editor-new-alt-text-error-description = Silakan tulis teks alternatif Anda sendiri atau coba lagi nanti. +pdfjs-editor-new-alt-text-error-close-button = Tutup +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Mengunduh model AI teks alternatif ({ $downloadedSize } dari { $totalSize } MB) + .aria-valuetext = Mengunduh model AI teks alternatif ({ $downloadedSize } dari { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Teks alternatif ditambahkan +pdfjs-editor-new-alt-text-added-button-label = Teks alternatif ditambahkan +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Teks alternatif hilang +pdfjs-editor-new-alt-text-missing-button-label = Teks alternatif hilang +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Tinjau teks alternatif +pdfjs-editor-new-alt-text-to-review-button-label = Tinjau teks alternatif +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Dibuat secara otomatis: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Pengaturan teks alternatif gambar +pdfjs-image-alt-text-settings-button-label = Pengaturan teks alternatif gambar +pdfjs-editor-alt-text-settings-dialog-label = Pengaturan teks alternatif gambar +pdfjs-editor-alt-text-settings-automatic-title = Teks alternatif otomatis +pdfjs-editor-alt-text-settings-create-model-button-label = Buat teks alternatif secara otomatis +pdfjs-editor-alt-text-settings-create-model-description = Menyarankan deskripsi untuk membantu orang yang tidak dapat melihat gambar atau ketika gambar tidak termuat. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model AI teks alternatif ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Berjalan secara lokal di perangkat Anda sehingga data Anda tetap pribadi. Diperlukan untuk teks alternatif otomatis. +pdfjs-editor-alt-text-settings-delete-model-button = Hapus +pdfjs-editor-alt-text-settings-download-model-button = Unduh +pdfjs-editor-alt-text-settings-downloading-model-button = Mengunduh… +pdfjs-editor-alt-text-settings-editor-title = Editor teks alternatif +pdfjs-editor-alt-text-settings-show-dialog-button-label = Tampilkan editor teks alternatif segera saat menambahkan gambar +pdfjs-editor-alt-text-settings-show-dialog-description = Membantu Anda memastikan semua gambar Anda memiliki teks alternatif. +pdfjs-editor-alt-text-settings-close-button = Tutup + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Sorotan ditambahkan +pdfjs-editor-freetext-added-alert = Teks ditambahkan +pdfjs-editor-ink-added-alert = Gambar ditambahkan +pdfjs-editor-stamp-added-alert = Citra ditambahkan +pdfjs-editor-signature-added-alert = Tanda tangan ditambahkan + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Sorotan dihapus +pdfjs-editor-undo-bar-message-freetext = Teks dihapus +pdfjs-editor-undo-bar-message-ink = Gambar dihapus +pdfjs-editor-undo-bar-message-stamp = Gambar dihapus +pdfjs-editor-undo-bar-message-signature = Tanda tangan dihapus +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = { $count } anotasi dihapus +pdfjs-editor-undo-bar-undo-button = + .title = Urungkan +pdfjs-editor-undo-bar-undo-button-label = Urungkan +pdfjs-editor-undo-bar-close-button = + .title = Tutup +pdfjs-editor-undo-bar-close-button-label = Tutup + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Modal ini memungkinkan pengguna untuk membuat tanda tangan yang dapat ditambahkan ke dokumen PDF. Pengguna dapat mengedit nama (yang juga berfungsi sebagai teks alternatif), dan jika diinginkan, menyimpan tanda tangan untuk digunakan kembali. +pdfjs-editor-add-signature-dialog-title = Tambahkan tanda tangan + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Tipe + .title = Tipe +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Gambarkan + .title = Gambarkan +pdfjs-editor-add-signature-image-button = Gambar + .title = Gambar + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Ketik tanda tangan Anda + .placeholder = Ketik tanda tangan Anda +pdfjs-editor-add-signature-draw-placeholder = Buat tanda tangan Anda +pdfjs-editor-add-signature-draw-thickness-range-label = Ketebalan +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Ketebalan gambar: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Seret berkas ke sini untuk mengunggah +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Atau pilih berkas gambar + *[other] Atau cari berkas gambar + } + +## Controls + +pdfjs-editor-add-signature-description-label = Deskripsi (teks alternatif) +pdfjs-editor-add-signature-description-input = + .title = Deskripsi (teks alternatif) +pdfjs-editor-add-signature-description-default-when-drawing = Tanda tangan +pdfjs-editor-add-signature-clear-button-label = Hapus tanda tangan +pdfjs-editor-add-signature-clear-button = + .title = Hapus tanda tangan +pdfjs-editor-add-signature-save-checkbox = Simpan tanda tangan +pdfjs-editor-add-signature-save-warning-message = Anda telah mencapai batas 5 tanda tangan tersimpan. Hapus untuk menyimpan lebih banyak. +pdfjs-editor-add-signature-image-upload-error-title = Tidak dapat mengunggah gambar +pdfjs-editor-add-signature-image-upload-error-description = Periksa sambungan jaringan Anda atau coba gambar lain. +pdfjs-editor-add-signature-image-no-data-error-title = Tak bisa mengonversi citra ini menjadi tanda tangan +pdfjs-editor-add-signature-image-no-data-error-description = Coba unggah gambar lain. +pdfjs-editor-add-signature-error-close-button = Tutup + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Batal +pdfjs-editor-add-signature-add-button = Tambah +pdfjs-editor-edit-signature-update-button = Perbarui + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Hapus tanda tangan tersimpan +pdfjs-editor-delete-signature-button-label1 = Hapus tanda tangan tersimpan + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Edit deskripsi + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Edit deskripsi diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/is/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/is/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/is/viewer.ftl 2026-01-20 14:08:39.372689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/is/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Núverandi síða (Skoða vefslóð frá núverandi síðu) pdfjs-bookmark-button-label = Núverandi síða -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Opna í smáforriti -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Opna í smáforriti ## Secondary toolbar and context menu @@ -108,16 +102,16 @@ pdfjs-document-properties-button = .title = Eiginleikar skjals… pdfjs-document-properties-button-label = Eiginleikar skjals… -pdfjs-document-properties-file-name = Skráarnafn: +pdfjs-document-properties-file-name = Skráarheiti: pdfjs-document-properties-file-size = Skrárstærð: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bæti) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bæti) pdfjs-document-properties-title = Titill: pdfjs-document-properties-author = Hönnuður: pdfjs-document-properties-subject = Efni: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Búið til: pdfjs-document-properties-modification-date = Dags breytingar: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Höfundur: pdfjs-document-properties-producer = PDF framleiðandi: pdfjs-document-properties-version = PDF útgáfa: @@ -174,10 +167,10 @@ ## Tooltips and alt text for side panel toolbar buttons pdfjs-toggle-sidebar-button = - .title = Víxla hliðarspjaldi af/á + .title = Víxla hliðarstiku af/á pdfjs-toggle-sidebar-notification-button = - .title = Víxla hliðarslá (skjal inniheldur yfirlit/viðhengi/lög) -pdfjs-toggle-sidebar-button-label = Víxla hliðarspjaldi af/á + .title = Víxla hliðarstiku af/á (skjal inniheldur yfirlit/viðhengi/lög) +pdfjs-toggle-sidebar-button-label = Víxla hliðarstiku af/á pdfjs-document-outline-button = .title = Sýna yfirlit skjals (tvísmelltu til að opna/loka öllum hlutum) pdfjs-document-outline-button-label = Efnisskipan skjals @@ -270,10 +263,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,10 +270,13 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } Skýring] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password -pdfjs-password-label = Sláðu inn lykilorð til að opna þessa PDF skrá. +pdfjs-password-label = Settu inn lykilorð til að opna þessa PDF-skrá. pdfjs-password-invalid = Ógilt lykilorð. Reyndu aftur. pdfjs-password-ok-button = Í lagi pdfjs-password-cancel-button = Hætta við @@ -304,12 +296,13 @@ pdfjs-editor-highlight-button = .title = Áherslulita pdfjs-editor-highlight-button-label = Áherslulita -pdfjs-highlight-floating-button = - .title = Áherslulita pdfjs-highlight-floating-button1 = .title = Áherslulita .aria-label = Áherslulita pdfjs-highlight-floating-button-label = Áherslulita +pdfjs-editor-signature-button = + .title = Bæta við undirritun +pdfjs-editor-signature-button-label = Bæta við undirritun ## Remove button for the various kind of editor. @@ -321,6 +314,8 @@ .title = Fjarlægja mynd pdfjs-editor-remove-highlight-button = .title = Fjarlægja áherslulit +pdfjs-editor-remove-signature-button = + .title = Fjarlægja undirskrift ## @@ -337,19 +332,24 @@ pdfjs-editor-free-highlight-thickness-input = Þykkt pdfjs-editor-free-highlight-thickness-title = .title = Breyta þykkt við áherslulitun annarra atriða en texta -pdfjs-free-text = +pdfjs-editor-signature-add-signature-button = + .title = Bæta við nýrri undirritun +pdfjs-editor-signature-add-signature-button-label = Bæta við nýrri undirritun +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Vistuð undirskrift: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Textaritill -pdfjs-free-text-default-content = Byrjaðu að skrifa… -pdfjs-ink = - .aria-label = Teikniritill -pdfjs-ink-canvas = - .aria-label = Mynd gerð af notanda + .default-content = Byrjaðu að skrifa… ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Alt-varatexti -pdfjs-editor-alt-text-edit-button-label = Breyta alt-varatexta +pdfjs-editor-alt-text-edit-button = + .aria-label = Breyta alt-myndatexta pdfjs-editor-alt-text-dialog-label = Veldu valkost pdfjs-editor-alt-text-dialog-description = Alt-varatexti (auka-myndatexti) hjálpar þegar fólk getur ekki séð myndina eða þegar hún hleðst ekki inn. pdfjs-editor-alt-text-add-description-label = Bættu við lýsingu @@ -362,18 +362,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Til dæmis: „Ungur maður sest við borð til að snæða máltíð“ +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alt-myndatexti ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Efst í vinstra horni - breyta stærð -pdfjs-editor-resizer-label-top-middle = Efst á miðju - breyta stærð -pdfjs-editor-resizer-label-top-right = Efst í hægra horni - breyta stærð -pdfjs-editor-resizer-label-middle-right = Miðja til hægri - breyta stærð -pdfjs-editor-resizer-label-bottom-right = Neðst í hægra horni - breyta stærð -pdfjs-editor-resizer-label-bottom-middle = Neðst á miðju - breyta stærð -pdfjs-editor-resizer-label-bottom-left = Neðst í vinstra horni - breyta stærð -pdfjs-editor-resizer-label-middle-left = Miðja til vinstri - breyta stærð +pdfjs-editor-resizer-top-left = + .aria-label = Efst í vinstra horni - breyta stærð +pdfjs-editor-resizer-top-middle = + .aria-label = Efst á miðju - breyta stærð +pdfjs-editor-resizer-top-right = + .aria-label = Efst í hægra horni - breyta stærð +pdfjs-editor-resizer-middle-right = + .aria-label = Miðja til hægri - breyta stærð +pdfjs-editor-resizer-bottom-right = + .aria-label = Neðst í hægra horni - breyta stærð +pdfjs-editor-resizer-bottom-middle = + .aria-label = Neðst á miðju - breyta stærð +pdfjs-editor-resizer-bottom-left = + .aria-label = Neðst í vinstra horni - breyta stærð +pdfjs-editor-resizer-middle-left = + .aria-label = Miðja til vinstri - breyta stærð ## Color picker @@ -400,3 +411,162 @@ pdfjs-editor-highlight-show-all-button-label = Birta allt pdfjs-editor-highlight-show-all-button = .title = Birta allt + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Breyta alt-myndatexta (lýsingu á mynd) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Bæta við alt-myndatexta (lýsingu á mynd) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Skrifaðu lýsinguna þína hér… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Stutt lýsing fyrir fólk sem getur ekki séð myndina eða þegar myndin hleðst ekki inn. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Þessi alt-myndatexti var búinn til sjálfvirkt og gæti verið ónákvæmur. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Kanna nánar +pdfjs-editor-new-alt-text-create-automatically-button-label = Útbúa alt-myndatexta sjálfvirkt +pdfjs-editor-new-alt-text-not-now-button = Ekki núna +pdfjs-editor-new-alt-text-error-title = Gat ekki búið til alt-myndatexta sjálfkrafa +pdfjs-editor-new-alt-text-error-description = Skrifaðu þinn eiginn alt-myndatexta eða reyndu aftur síðar. +pdfjs-editor-new-alt-text-error-close-button = Loka +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Sækir gervigreindarlíkan með alt-myndatextum ({ $downloadedSize } af { $totalSize } MB) + .aria-valuetext = Sækir gervigreindarlíkan með alt-myndatextum ({ $downloadedSize } af { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alt-myndatexta bætt við +pdfjs-editor-new-alt-text-added-button-label = Alt-myndatexta bætt við +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Vantar alt-myndatexta +pdfjs-editor-new-alt-text-missing-button-label = Vantar alt-myndatexta +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Yfirfara alt-myndatexta +pdfjs-editor-new-alt-text-to-review-button-label = Yfirfara myndatexta +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Útbúið sjálfvirkt: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Stillingar fyrir alt-texta myndar +pdfjs-image-alt-text-settings-button-label = Stillingar fyrir alt-texta myndar +pdfjs-editor-alt-text-settings-dialog-label = Stillingar fyrir alt-texta myndar +pdfjs-editor-alt-text-settings-automatic-title = Sjálfvirkur alt-myndatexti +pdfjs-editor-alt-text-settings-create-model-button-label = Útbúa alt-myndatexta sjálfvirkt +pdfjs-editor-alt-text-settings-create-model-description = Stingur upp á lýsingum til að hjálpa fólki sem getur ekki séð myndina eða þegar myndin hleðst ekki inn. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Gervigreindarlíkan alt-myndatexta ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Keyrir staðbundið á tækinu þínu svo gögnin þín haldast undir þinni stjórn. Nauðsynlegt fyrir sjálfvirka alt-myndatexta. +pdfjs-editor-alt-text-settings-delete-model-button = Eyða +pdfjs-editor-alt-text-settings-download-model-button = Sækja +pdfjs-editor-alt-text-settings-downloading-model-button = Sæki… +pdfjs-editor-alt-text-settings-editor-title = Ritill fyrir alt-myndatexta +pdfjs-editor-alt-text-settings-show-dialog-button-label = Sýna alt-myndatextaritil strax þegar mynd er bætt við +pdfjs-editor-alt-text-settings-show-dialog-description = Hjálpar þér að tryggja að allar myndirnar þínar séu með alt-myndatexta. +pdfjs-editor-alt-text-settings-close-button = Loka + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-stamp-added-alert = Mynd bætt við +pdfjs-editor-signature-added-alert = Undirritun bætt við + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Áherslulitun fjarlægð +pdfjs-editor-undo-bar-message-freetext = Texti fjarlægður +pdfjs-editor-undo-bar-message-ink = Teikning fjarlægð +pdfjs-editor-undo-bar-message-stamp = Mynd fjarlægð +pdfjs-editor-undo-bar-message-signature = Undirskrift fjarlægð +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } glósa fjarlægð + *[other] { $count } glósur fjarlægðar + } +pdfjs-editor-undo-bar-undo-button = + .title = Afturkalla +pdfjs-editor-undo-bar-undo-button-label = Afturkalla +pdfjs-editor-undo-bar-close-button = + .title = Loka +pdfjs-editor-undo-bar-close-button-label = Loka + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Þessi gluggi gerir notandanum kleift að búa til undirskrift til að bæta við PDF-skjal. Notandinn getur breytt nafninu (sem einnig þjónar sem alt-texti), og valið að vista undirskriftina til endurtekinnar notkunar. +pdfjs-editor-add-signature-dialog-title = Bæta við undirskrift + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Tegund + .title = Tegund +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Teikna + .title = Teikna +pdfjs-editor-add-signature-image-button = Mynd + .title = Mynd + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Skrifaðu inn undirskriftina þína + .placeholder = Skrifaðu inn undirskriftina þína +pdfjs-editor-add-signature-draw-placeholder = Teiknaðu undirskriftina þína +pdfjs-editor-add-signature-draw-thickness-range-label = Þykkt +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Sverleiki teikningar: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Dragðu skrá hingað til að senda inn +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Eða skoðaðu myndskrár + *[other] Eða skoðaðu myndskrár + } + +## Controls + +pdfjs-editor-add-signature-description-label = Lýsing (alt-hjálpartexti) +pdfjs-editor-add-signature-description-input = + .title = Lýsing (alt-hjálpartexti) +pdfjs-editor-add-signature-description-default-when-drawing = Undirskrift +pdfjs-editor-add-signature-clear-button-label = Hreinsa undirskrift +pdfjs-editor-add-signature-clear-button = + .title = Hreinsa undirskrift +pdfjs-editor-add-signature-save-checkbox = Vista undirskrift +pdfjs-editor-add-signature-save-warning-message = Þú hefur náð hámarki 5 vistaðra undirskrifta. Fjarlægðu eina til að geta vistað fleiri. +pdfjs-editor-add-signature-image-upload-error-title = Ekki tókst að senda inn mynd +pdfjs-editor-add-signature-image-upload-error-description = Athugaðu nettenginguna þína eða prófaðu aðra mynd. +pdfjs-editor-add-signature-image-no-data-error-title = Get ekki breytt þessari mynd í undirskrift +pdfjs-editor-add-signature-image-no-data-error-description = Reyndu að senda inn aðra mynd. +pdfjs-editor-add-signature-error-close-button = Loka + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Hætta við +pdfjs-editor-add-signature-add-button = Bæta við +pdfjs-editor-edit-signature-update-button = Uppfæra + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Fjarlægja vistaða undirskrift +pdfjs-editor-delete-signature-button-label1 = Fjarlægja vistaða undirskrift + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Breyta lýsingu + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Breyta lýsingu diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/it/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/it/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/it/viewer.ftl 2026-01-20 14:08:39.372689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/it/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Pagina corrente (mostra URL della pagina corrente) pdfjs-bookmark-button-label = Pagina corrente -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Apri in app -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Apri in app ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Nome file: pdfjs-document-properties-file-size = Dimensione file: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } byte) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byte) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } byte) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte) pdfjs-document-properties-title = Titolo: pdfjs-document-properties-author = Autore: pdfjs-document-properties-subject = Oggetto: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Data creazione: pdfjs-document-properties-modification-date = Data modifica: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Autore originale: pdfjs-document-properties-producer = Produttore PDF: pdfjs-document-properties-version = Versione PDF: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniatura della pagina { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Seleziona pagina { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Pagina { $page } di { $total } ## Find panel button title and messages @@ -226,7 +228,6 @@ pdfjs-find-entire-word-checkbox-label = Parole intere pdfjs-find-reached-top = Raggiunto l’inizio della pagina, continua dalla fine pdfjs-find-reached-bottom = Raggiunta la fine della pagina, continua dall’inizio - # Variables: # $current (Number) - the index of the currently active find result # $total (Number) - the total number of matches in the document @@ -235,7 +236,6 @@ [one] { $current } di { $total } corrispondenza *[other] { $current } di { $total } corrispondenze } - # Variables: # $limit (Number) - the maximum number of matches pdfjs-find-match-count-limit = @@ -243,7 +243,6 @@ [one] Più di una { $limit } corrispondenza *[other] Più di { $limit } corrispondenze } - pdfjs-find-not-found = Testo non trovato ## Predefined zoom values @@ -273,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -284,11 +279,14 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Annotazione: { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password pdfjs-password-label = Inserire la password per aprire questo file PDF. -pdfjs-password-invalid = Password non corretta. Riprovare. +pdfjs-password-invalid = Password non corretta. Riprova. pdfjs-password-ok-button = OK pdfjs-password-cancel-button = Annulla pdfjs-web-fonts-disabled = I web font risultano disattivati: impossibile utilizzare i caratteri incorporati nel PDF. @@ -297,22 +295,51 @@ pdfjs-editor-free-text-button = .title = Testo +pdfjs-editor-color-picker-free-text-input = + .title = Cambia colore del testo pdfjs-editor-free-text-button-label = Testo pdfjs-editor-ink-button = - .title = Disegno -pdfjs-editor-ink-button-label = Disegno + .title = Disegna +pdfjs-editor-color-picker-ink-input = + .title = Cambia colore del disegno +pdfjs-editor-ink-button-label = Disegna pdfjs-editor-stamp-button = .title = Aggiungi o rimuovi immagine pdfjs-editor-stamp-button-label = Aggiungi o rimuovi immagine pdfjs-editor-highlight-button = .title = Evidenzia pdfjs-editor-highlight-button-label = Evidenzia -pdfjs-highlight-floating-button = - .title = Evidenzia pdfjs-highlight-floating-button1 = .title = Evidenzia .aria-label = Evidenzia pdfjs-highlight-floating-button-label = Evidenzia +pdfjs-comment-floating-button = + .title = Commenta + .aria-label = Commenta +pdfjs-comment-floating-button-label = Commenta +pdfjs-editor-comment-button = + .title = Commenta + .aria-label = Commenta +pdfjs-editor-comment-button-label = Commenta +pdfjs-editor-signature-button = + .title = Aggiungi firma +pdfjs-editor-signature-button-label = Aggiungi firma + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Modifica evidenziazioni +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Modifica disegni +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Editor firme: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Modifica immagini ## Remove button for the various kind of editor. @@ -324,6 +351,8 @@ .title = Rimuovi immagine pdfjs-editor-remove-highlight-button = .title = Rimuovi evidenziazione +pdfjs-editor-remove-signature-button = + .title = Rimuovi firma ## @@ -340,20 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Spessore pdfjs-editor-free-highlight-thickness-title = .title = Modifica lo spessore della selezione per elementi non testuali - -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Controlli firma e firme salvate +pdfjs-editor-signature-add-signature-button = + .title = Aggiungi nuova firma +pdfjs-editor-signature-add-signature-button-label = Aggiungi nuova firma +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Firma salvata: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Editor di testo -pdfjs-free-text-default-content = Inizia a digitare… -pdfjs-ink = - .aria-label = Editor disegni -pdfjs-ink-canvas = - .aria-label = Immagine creata dall’utente + .default-content = Inizia a digitare… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Commento + *[other] Commenti + } +pdfjs-editor-comments-sidebar-close-button = + .title = Chiudi la barra laterale + .aria-label = Chiudi la barra laterale +pdfjs-editor-comments-sidebar-close-button-label = Chiudi la barra laterale +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Hai notato qualcosa di interessante? Evidenzialo e aggiungi un commento. +pdfjs-editor-comments-sidebar-no-comments-link = Ulteriori informazioni ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Testo alternativo -pdfjs-editor-alt-text-edit-button-label = Modifica testo alternativo +pdfjs-editor-alt-text-edit-button = + .aria-label = Modifica testo alternativo pdfjs-editor-alt-text-dialog-label = Scegli un’opzione pdfjs-editor-alt-text-dialog-description = Il testo alternativo (“alt text”) aiuta quando le persone non possono vedere l’immagine o quando l’immagine non viene caricata. pdfjs-editor-alt-text-add-description-label = Aggiungi una descrizione @@ -366,24 +416,34 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Ad esempio, “Un giovane si siede a tavola per mangiare” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Testo alternativo ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Angolo in alto a sinistra — ridimensiona -pdfjs-editor-resizer-label-top-middle = Lato superiore nel mezzo — ridimensiona -pdfjs-editor-resizer-label-top-right = Angolo in alto a destra — ridimensiona -pdfjs-editor-resizer-label-middle-right = Lato destro nel mezzo — ridimensiona -pdfjs-editor-resizer-label-bottom-right = Angolo in basso a destra — ridimensiona -pdfjs-editor-resizer-label-bottom-middle = Lato inferiore nel mezzo — ridimensiona -pdfjs-editor-resizer-label-bottom-left = Angolo in basso a sinistra — ridimensiona -pdfjs-editor-resizer-label-middle-left = Lato sinistro nel mezzo — ridimensiona +pdfjs-editor-resizer-top-left = + .aria-label = Angolo in alto a sinistra — ridimensiona +pdfjs-editor-resizer-top-middle = + .aria-label = Lato superiore nel mezzo — ridimensiona +pdfjs-editor-resizer-top-right = + .aria-label = Angolo in alto a destra — ridimensiona +pdfjs-editor-resizer-middle-right = + .aria-label = Lato destro nel mezzo — ridimensiona +pdfjs-editor-resizer-bottom-right = + .aria-label = Angolo in basso a destra — ridimensiona +pdfjs-editor-resizer-bottom-middle = + .aria-label = Lato inferiore nel mezzo — ridimensiona +pdfjs-editor-resizer-bottom-left = + .aria-label = Angolo in basso a sinistra — ridimensiona +pdfjs-editor-resizer-middle-left = + .aria-label = Lato sinistro nel mezzo — ridimensiona ## Color picker # This means "Color used to highlight text" pdfjs-editor-highlight-colorpicker-label = Colore evidenziatore - pdfjs-editor-colorpicker-button = .title = Cambia colore pdfjs-editor-colorpicker-dropdown = @@ -405,3 +465,283 @@ pdfjs-editor-highlight-show-all-button-label = Mostra tutto pdfjs-editor-highlight-show-all-button = .title = Mostra tutto + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Modifica testo alternativo (descrizione dell’immagine) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Aggiungi testo alternativo (descrizione dell’immagine) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Scrivi qui la tua descrizione… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Breve descrizione per le persone che non possono vedere l’immagine, o mostrata quando l’immagine non si carica. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Questo testo alternativo è stato creato automaticamente e potrebbe non essere accurato. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Ulteriori informazioni +pdfjs-editor-new-alt-text-create-automatically-button-label = Crea automaticamente testo alternativo +pdfjs-editor-new-alt-text-not-now-button = Non adesso +pdfjs-editor-new-alt-text-error-title = Impossibile creare automaticamente il testo alternativo +pdfjs-editor-new-alt-text-error-description = Scrivi il testo alternativo o riprova più tardi. +pdfjs-editor-new-alt-text-error-close-button = Chiudi +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Download in corso del modello IA per il testo alternativo ({ $downloadedSize } di { $totalSize } MB) + .aria-valuetext = Download in corso del modello IA per il testo alternativo ({ $downloadedSize } di { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Aggiunto testo alternativo +pdfjs-editor-new-alt-text-added-button-label = Aggiunto testo alternativo +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Testo alternativo mancante +pdfjs-editor-new-alt-text-missing-button-label = Testo alternativo mancante +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Verifica testo alternativo +pdfjs-editor-new-alt-text-to-review-button-label = Verifica testo alternativo +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creato automaticamente: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Impostazioni testo alternativo per le immagini +pdfjs-image-alt-text-settings-button-label = Impostazioni testo alternativo per le immagini +pdfjs-editor-alt-text-settings-dialog-label = Impostazioni testo alternativo per le immagini +pdfjs-editor-alt-text-settings-automatic-title = Testo alternativo automatico +pdfjs-editor-alt-text-settings-create-model-button-label = Crea testo alternativo automaticamente +pdfjs-editor-alt-text-settings-create-model-description = Suggerisce una descrizione per le persone che non possono vedere l’immagine, o mostrata quando l’immagine non si carica. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modello IA per il testo alternativo ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Viene eseguito localmente sul tuo dispositivo in modo che i tuoi dati rimangano riservati. È richiesto per la generazione automatica del testo alternativo. +pdfjs-editor-alt-text-settings-delete-model-button = Elimina +pdfjs-editor-alt-text-settings-download-model-button = Scarica +pdfjs-editor-alt-text-settings-downloading-model-button = Download… +pdfjs-editor-alt-text-settings-editor-title = Modifica testo alternativo +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostra l’editor del testo alternativo non appena si aggiunge un’immagine +pdfjs-editor-alt-text-settings-show-dialog-description = Ti aiuta ad assicurarti che tutte le tue immagini abbiano il testo alternativo. +pdfjs-editor-alt-text-settings-close-button = Chiudi + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Aggiunta evidenziazione +pdfjs-editor-freetext-added-alert = Aggiunto testo +pdfjs-editor-ink-added-alert = Aggiunto disegno +pdfjs-editor-stamp-added-alert = Aggiunta immagine +pdfjs-editor-signature-added-alert = Aggiunta firma + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Evidenziazione rimossa +pdfjs-editor-undo-bar-message-freetext = Testo rimosso +pdfjs-editor-undo-bar-message-ink = Disegno rimosso +pdfjs-editor-undo-bar-message-stamp = Immagine rimossa +pdfjs-editor-undo-bar-message-signature = Firma rimossa +pdfjs-editor-undo-bar-message-comment = Commento rimosso +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } annotazione rimossa + *[other] { $count } annotazioni rimosse + } +pdfjs-editor-undo-bar-undo-button = + .title = Annulla +pdfjs-editor-undo-bar-undo-button-label = Annulla +pdfjs-editor-undo-bar-close-button = + .title = Chiudi +pdfjs-editor-undo-bar-close-button-label = Chiudi + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Questa finestra consente all’utente di creare una firma da aggiungere a un documento PDF. L’utente può modificare il nome (che verrà utilizzato anche come testo alternativo) e, se lo desidera, salvare la firma per riutilizzarla in futuro. +pdfjs-editor-add-signature-dialog-title = Aggiungi una firma + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Scrivi + .title = Scrivi +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Disegna + .title = Disegna +pdfjs-editor-add-signature-image-button = Immagine + .title = Immagine + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Digita la tua firma + .placeholder = Digita la tua firma +pdfjs-editor-add-signature-draw-placeholder = Disegna la tua firma +pdfjs-editor-add-signature-draw-thickness-range-label = Spessore +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Spessore del tratto: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Trascina un file qui per caricarlo +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Oppure scegli un file immagine + *[other] Oppure sfoglia i file immagine + } + +## Controls + +pdfjs-editor-add-signature-description-label = Descrizione (testo alternativo) +pdfjs-editor-add-signature-description-input = + .title = Descrizione (testo alternativo) +pdfjs-editor-add-signature-description-default-when-drawing = Firma +pdfjs-editor-add-signature-clear-button-label = Cancella firma +pdfjs-editor-add-signature-clear-button = + .title = Cancella firma +pdfjs-editor-add-signature-save-checkbox = Salva firma +pdfjs-editor-add-signature-save-warning-message = Hai raggiunto il limite di 5 firme salvate. Rimuovine una per salvarne altre. +pdfjs-editor-add-signature-image-upload-error-title = Impossibile caricare l’immagine +pdfjs-editor-add-signature-image-upload-error-description = Controlla la connessione di rete o prova con un’altra immagine. +pdfjs-editor-add-signature-image-no-data-error-title = Impossibile convertire questa immagine in una firma +pdfjs-editor-add-signature-image-no-data-error-description = Prova a caricare un’altra immagine. +pdfjs-editor-add-signature-error-close-button = Chiudi + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Annulla +pdfjs-editor-add-signature-add-button = Aggiungi +pdfjs-editor-edit-signature-update-button = Aggiorna + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Modifica commento +pdfjs-editor-edit-comment-popup-button = + .title = Modifica commento +pdfjs-editor-delete-comment-popup-button-label = Elimina commento +pdfjs-editor-delete-comment-popup-button = + .title = Elimina commento +pdfjs-show-comment-button = + .title = Mostra commento + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Modifica commento +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aggiorna +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Aggiungi commento +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Aggiungi +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Inizia a digitare… +pdfjs-editor-edit-comment-dialog-cancel-button = Annulla + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Aggiungi commento + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Attiva/disattiva barra laterale (il documento contiene miniature, struttura, allegati, livelli) +pdfjs-toggle-views-manager-button1-label = Gestisci pagine +pdfjs-views-manager-sidebar = + .aria-label = Barra laterale +pdfjs-views-manager-sidebar-resizer = + .aria-label = Regolatore della larghezza della barra laterale +pdfjs-views-manager-view-selector-button = + .title = Viste +pdfjs-views-manager-view-selector-button-label = Viste +pdfjs-views-manager-pages-title = Pagine +pdfjs-views-manager-outlines-title1 = Struttura del documento + .title = Struttura del documento (doppio clic per espandere/comprimere tutti gli elementi) +pdfjs-views-manager-attachments-title = Allegati +pdfjs-views-manager-layers-title1 = Livelli + .title = Livelli (doppio clic per ripristinare tutti i livelli allo stato predefinito) +pdfjs-views-manager-pages-option-label = Pagine +pdfjs-views-manager-outlines-option-label = Struttura del documento +pdfjs-views-manager-attachments-option-label = Allegati +pdfjs-views-manager-layers-option-label = Livelli +pdfjs-views-manager-add-file-button = + .title = Aggiungi file +pdfjs-views-manager-add-file-button-label = Aggiungi file +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } selezionata + *[other] { $count } selezionate + } +pdfjs-views-manager-pages-status-none-action-label = Seleziona pagine +pdfjs-views-manager-pages-status-action-button-label = Gestisci +pdfjs-views-manager-pages-status-copy-button-label = Copia +pdfjs-views-manager-pages-status-cut-button-label = Taglia +pdfjs-views-manager-pages-status-delete-button-label = Elimina +pdfjs-views-manager-pages-status-export-selected-button-label = Esporta selezionate… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] { $count } pagina tagliata + *[other] { $count } pagine tagliate + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] { $count } pagina copiata + *[other] { $count } pagine copiate + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] { $count } pagina eliminata + *[other] { $count } pagine eliminate + } +pdfjs-views-manager-pages-status-waiting-ready-label = Preparazione file… +pdfjs-views-manager-pages-status-waiting-uploading-label = Caricamento file… +pdfjs-views-manager-status-warning-cut-label = Taglio non riuscito. Ricarica la pagina e riprova. +pdfjs-views-manager-status-warning-copy-label = Copia non riuscita. Ricarica la pagina e riprova. +pdfjs-views-manager-status-warning-delete-label = Eliminazione non riuscita. Ricarica la pagina e riprova. +pdfjs-views-manager-status-warning-save-label = Salvataggio non riuscito. Ricarica la pagina e prova di nuovo. +pdfjs-views-manager-status-undo-button-label = Annulla +pdfjs-views-manager-status-done-button-label = Fatto +pdfjs-views-manager-status-close-button = + .title = Chiudi +pdfjs-views-manager-status-close-button-label = Chiudi +pdfjs-views-manager-paste-button-label = Incolla +pdfjs-views-manager-paste-button-before = + .title = Incolla dopo la prima pagina +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Incolla dopo pagina { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NOVITÀ +pdfjs-views-manager-waiting-for-file = Caricamento file… +pdfjs-toggle-views-manager-button1 = + .title = Gestisci pagine + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Rimuovi firma salvata +pdfjs-editor-delete-signature-button-label1 = Rimuovi firma salvata + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Modifica descrizione + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Modifica descrizione diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ja/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ja/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ja/viewer.ftl 2026-01-20 14:08:39.373689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ja/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = 現在のページの URL です (現在のページを表示する URL) pdfjs-bookmark-button-label = 現在のページ -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = アプリで開く -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = アプリで開く ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = ファイル名: pdfjs-document-properties-file-size = ファイルサイズ: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } バイト) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } バイト) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } バイト) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } バイト) pdfjs-document-properties-title = タイトル: pdfjs-document-properties-author = 作成者: pdfjs-document-properties-subject = 件名: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = 作成日: pdfjs-document-properties-modification-date = 更新日: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = アプリケーション: pdfjs-document-properties-producer = PDF 作成: pdfjs-document-properties-version = PDF のバージョン: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = { $page } ページの縮小版 +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = { $page } ページを選択します +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = { $page } / { $total } ページ ## Find panel button title and messages @@ -229,18 +231,10 @@ # Variables: # $current (Number) - the index of the currently active find result # $total (Number) - the total number of matches in the document -pdfjs-find-match-count = - { $total -> - [one] { $total } 件中 { $current } 件目 - *[other] { $total } 件中 { $current } 件目 - } +pdfjs-find-match-count = { $total } 件中 { $current } 件目 # Variables: # $limit (Number) - the maximum number of matches -pdfjs-find-match-count-limit = - { $limit -> - [one] { $limit } 件以上一致 - *[other] { $limit } 件以上一致 - } +pdfjs-find-match-count-limit = { $limit } 件以上一致 pdfjs-find-not-found = 見つかりませんでした ## Predefined zoom values @@ -270,10 +264,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,11 +271,14 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } 注釈] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password pdfjs-password-label = この PDF ファイルを開くためのパスワードを入力してください。 -pdfjs-password-invalid = 無効なパスワードです。もう一度やり直してください。 +pdfjs-password-invalid = パスワードが正しくありません。もう一度試してください。 pdfjs-password-ok-button = OK pdfjs-password-cancel-button = キャンセル pdfjs-web-fonts-disabled = ウェブフォントが無効になっています: 埋め込まれた PDF のフォントを使用できません。 @@ -294,9 +287,13 @@ pdfjs-editor-free-text-button = .title = フリーテキスト注釈を追加します +pdfjs-editor-color-picker-free-text-input = + .title = テキスト色を変更します pdfjs-editor-free-text-button-label = フリーテキスト注釈 pdfjs-editor-ink-button = .title = インク注釈を追加します +pdfjs-editor-color-picker-ink-input = + .title = インク色を変更します pdfjs-editor-ink-button-label = インク注釈 pdfjs-editor-stamp-button = .title = 画像を追加または編集します @@ -304,8 +301,37 @@ pdfjs-editor-highlight-button = .title = 強調します pdfjs-editor-highlight-button-label = 強調 -pdfjs-highlight-floating-button = - .title = 強調 +pdfjs-highlight-floating-button1 = + .title = 強調します + .aria-label = 強調します +pdfjs-highlight-floating-button-label = 強調 +pdfjs-comment-floating-button = + .title = コメントを追加します + .aria-label = コメントを追加します +pdfjs-comment-floating-button-label = コメント +pdfjs-editor-comment-button = + .title = コメントを編集します + .aria-label = コメントを編集します +pdfjs-editor-comment-button-label = コメント +pdfjs-editor-signature-button = + .title = 署名を追加します +pdfjs-editor-signature-button-label = 署名を追加 + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = 強調エディター +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = 描画エディター +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = 署名エディター: { $description } +pdfjs-editor-stamp-editor = + .aria-label = 画像エディター ## Remove button for the various kind of editor. @@ -317,6 +343,8 @@ .title = 画像を削除します pdfjs-editor-remove-highlight-button = .title = 強調を削除します +pdfjs-editor-remove-signature-button = + .title = 署名を削除します ## @@ -333,19 +361,37 @@ pdfjs-editor-free-highlight-thickness-input = 太さ pdfjs-editor-free-highlight-thickness-title = .title = テキスト以外のアイテムを強調する時の太さを変更します -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = 署名コントロールと保存された署名 +pdfjs-editor-signature-add-signature-button = + .title = 新しい署名を追加します +pdfjs-editor-signature-add-signature-button-label = 新しい署名を追加 +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = 保存された署名: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = フリーテキスト注釈エディター -pdfjs-free-text-default-content = テキストを入力してください... -pdfjs-ink = - .aria-label = インク注釈エディター -pdfjs-ink-canvas = - .aria-label = ユーザー作成画像 + .default-content = テキストを入力してください... +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = コメント +pdfjs-editor-comments-sidebar-close-button = + .title = サイドバーを閉じます + .aria-label = サイドバーを閉じる +pdfjs-editor-comments-sidebar-close-button-label = サイドバーを閉じる +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = 気になることがあれば、選択してコメントを残してください。 +pdfjs-editor-comments-sidebar-no-comments-link = 詳細情報 ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = 代替テキスト -pdfjs-editor-alt-text-edit-button-label = 代替テキストを編集 +pdfjs-editor-alt-text-edit-button = + .aria-label = 代替テキストを編集 pdfjs-editor-alt-text-dialog-label = オプションの選択 pdfjs-editor-alt-text-dialog-description = 代替テキストは画像が表示されない場合や読み込まれない場合にユーザーの助けになります。 pdfjs-editor-alt-text-add-description-label = 説明を追加 @@ -358,18 +404,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = 例:「若い人がテーブルの席について食事をしています」 +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = 代替テキスト ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = 左上隅 — サイズ変更 -pdfjs-editor-resizer-label-top-middle = 上中央 — サイズ変更 -pdfjs-editor-resizer-label-top-right = 右上隅 — サイズ変更 -pdfjs-editor-resizer-label-middle-right = 右中央 — サイズ変更 -pdfjs-editor-resizer-label-bottom-right = 右下隅 — サイズ変更 -pdfjs-editor-resizer-label-bottom-middle = 下中央 — サイズ変更 -pdfjs-editor-resizer-label-bottom-left = 左下隅 — サイズ変更 -pdfjs-editor-resizer-label-middle-left = 左中央 — サイズ変更 +pdfjs-editor-resizer-top-left = + .aria-label = 左上隅 — サイズ変更 +pdfjs-editor-resizer-top-middle = + .aria-label = 上中央 — サイズ変更 +pdfjs-editor-resizer-top-right = + .aria-label = 右上隅 — サイズ変更 +pdfjs-editor-resizer-middle-right = + .aria-label = 右中央 — サイズ変更 +pdfjs-editor-resizer-bottom-right = + .aria-label = 右下隅 — サイズ変更 +pdfjs-editor-resizer-bottom-middle = + .aria-label = 下中央 — サイズ変更 +pdfjs-editor-resizer-bottom-left = + .aria-label = 左下隅 — サイズ変更 +pdfjs-editor-resizer-middle-left = + .aria-label = 左中央 — サイズ変更 ## Color picker @@ -394,5 +451,265 @@ ## This is a toggle button to show/hide all the highlights. pdfjs-editor-highlight-show-all-button-label = すべて表示 +# (^m^) en-US: .title = Show all pdfjs-editor-highlight-show-all-button = .title = 強調の表示を切り替えます + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = 代替テキストを編集 (画像の説明) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = 代替テキストを追加 (画像の説明) +pdfjs-editor-new-alt-text-textarea = + .placeholder = ここに説明を記入してください... +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = 画像が読み込まれない場合や見えない人のための短い説明です。 +pdfjs-editor-new-alt-text-disclaimer1 = この代替テキストは自動的に生成されたため正確でない可能性があります。 +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 詳細情報 +pdfjs-editor-new-alt-text-create-automatically-button-label = 代替テキストを自動生成 +pdfjs-editor-new-alt-text-not-now-button = 後で +pdfjs-editor-new-alt-text-error-title = 代替テキストを自動生成できませんでした +pdfjs-editor-new-alt-text-error-description = ご自分で代替テキストを書くか後でもう一度試してください。 +pdfjs-editor-new-alt-text-error-close-button = 閉じる +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = 代替テキスト AI モデルをダウンロードしています ({ $downloadedSize } / { $totalSize } MB) + .aria-valuetext = 代替テキスト AI モデルをダウンロードしています ({ $downloadedSize } / { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = 代替テキストを追加しました +pdfjs-editor-new-alt-text-added-button-label = 代替テキストを追加しました +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = 代替テキストがありません +pdfjs-editor-new-alt-text-missing-button-label = 代替テキストがありません +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = 代替テキストをレビュー +pdfjs-editor-new-alt-text-to-review-button-label = 代替テキストをレビュー +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 自動生成されました: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = 画像の代替テキスト設定 +pdfjs-image-alt-text-settings-button-label = 画像の代替テキスト設定 +pdfjs-editor-alt-text-settings-dialog-label = 画像の代替テキスト設定 +pdfjs-editor-alt-text-settings-automatic-title = 自動代替テキスト +pdfjs-editor-alt-text-settings-create-model-button-label = 代替テキストを自動生成 +pdfjs-editor-alt-text-settings-create-model-description = 画像が読み込まれない場合や見えない人のために説明を提案します。 +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = 代替テキスト AI モデル ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = ローカルの端末上で実行されるためデータは非公開になります。代替テキストの自動生成に必要です。 +pdfjs-editor-alt-text-settings-delete-model-button = 削除 +pdfjs-editor-alt-text-settings-download-model-button = ダウンロード +pdfjs-editor-alt-text-settings-downloading-model-button = ダウンロード中... +pdfjs-editor-alt-text-settings-editor-title = 代替テキストエディター +pdfjs-editor-alt-text-settings-show-dialog-button-label = 画像の追加時に代替テキストエディターを表示する +pdfjs-editor-alt-text-settings-show-dialog-description = すべての画像に代替テキストを追加する助けになります。 +pdfjs-editor-alt-text-settings-close-button = 閉じる + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = 強調表示を追加しました +pdfjs-editor-freetext-added-alert = フリーテキスト注釈を追加しました +pdfjs-editor-ink-added-alert = インク注釈を追加しました +pdfjs-editor-stamp-added-alert = 画像を追加しました +pdfjs-editor-signature-added-alert = 署名を追加しました + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = 強調表示が削除されました +pdfjs-editor-undo-bar-message-freetext = フリーテキスト注釈が削除されました +pdfjs-editor-undo-bar-message-ink = インク注釈が削除されました +pdfjs-editor-undo-bar-message-stamp = 画像が削除されました +pdfjs-editor-undo-bar-message-signature = 署名が削除されました +pdfjs-editor-undo-bar-message-comment = コメントが削除されました +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = { $count } 個の注釈が削除されました +pdfjs-editor-undo-bar-undo-button = + .title = 元に戻す +pdfjs-editor-undo-bar-undo-button-label = 元に戻す +pdfjs-editor-undo-bar-close-button = + .title = 閉じる +pdfjs-editor-undo-bar-close-button-label = 閉じる + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = このダイアログではユーザーが署名を作成して PDF 文書に追加できます。 +pdfjs-editor-add-signature-dialog-title = 署名を追加 + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = タイプ + .title = キーボード入力します +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = 手書き + .title = 手書き入力します +pdfjs-editor-add-signature-image-button = 画像 + .title = 画像を指定します + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = 署名をキーボード入力 + .placeholder = 署名をキーボード入力 +pdfjs-editor-add-signature-draw-placeholder = 署名を手書き入力 +pdfjs-editor-add-signature-draw-thickness-range-label = 線の太さ +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = 線の太さ: { $thickness } +pdfjs-editor-add-signature-image-placeholder = ファイルをここにドラッグしてアップロード +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] または画像ファイルを選択 + *[other] または画像ファイルを参照 + } + +## Controls + +pdfjs-editor-add-signature-description-label = 説明 (代替テキスト) +pdfjs-editor-add-signature-description-input = + .title = 説明 (代替テキスト) を追加します +pdfjs-editor-add-signature-description-default-when-drawing = 署名 +pdfjs-editor-add-signature-clear-button-label = 署名を消去 +pdfjs-editor-add-signature-clear-button = + .title = 署名を消去します +pdfjs-editor-add-signature-save-checkbox = 署名を保存 +pdfjs-editor-add-signature-save-warning-message = 保存された署名が上限の 5 個に達しました。さらに保存するにはいずれかを削除してください。 +pdfjs-editor-add-signature-image-upload-error-title = 画像をアップロードできません +pdfjs-editor-add-signature-image-upload-error-description = ネットワーク接続を確認するか別の画像を試してください。 +pdfjs-editor-add-signature-image-no-data-error-title = この画像は署名に変換できません +pdfjs-editor-add-signature-image-no-data-error-description = 別の画像をアップロードしてください。 +pdfjs-editor-add-signature-error-close-button = 閉じる + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = キャンセル +pdfjs-editor-add-signature-add-button = 追加 +pdfjs-editor-edit-signature-update-button = 更新 + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = コメントを編集 +pdfjs-editor-edit-comment-popup-button = + .title = コメントを編集します +pdfjs-editor-delete-comment-popup-button-label = コメントを削除 +pdfjs-editor-delete-comment-popup-button = + .title = コメントを削除します +pdfjs-show-comment-button = + .title = コメントを表示します + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = コメントを編集 +pdfjs-editor-edit-comment-dialog-save-button-when-editing = 更新 +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = コメントを追加 +pdfjs-editor-edit-comment-dialog-save-button-when-adding = 追加 +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = コメントを入力してください... +pdfjs-editor-edit-comment-dialog-cancel-button = キャンセル + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = コメントを追加します + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = サイドバーを切り替えます (文書に含まれるサムネイル、アウトライン、添付データ、レイヤー) +pdfjs-toggle-views-manager-button1-label = ページを管理 +pdfjs-views-manager-sidebar = + .aria-label = サイドバー +pdfjs-views-manager-sidebar-resizer = + .aria-label = サイドバーの幅変更 +pdfjs-views-manager-view-selector-button = + .title = ビュー +pdfjs-views-manager-view-selector-button-label = ビュー +pdfjs-views-manager-pages-title = ページ +pdfjs-views-manager-outlines-title1 = 文書のアウトライン + .title = 文書のアウトライン (ダブルクリックですべての項目を展開/折りたたみ) +pdfjs-views-manager-attachments-title = 添付データ +pdfjs-views-manager-layers-title1 = レイヤー + .title = レイヤー (ダブルクリックですべてのレイヤーを既定状態にリセット) +pdfjs-views-manager-pages-option-label = ページ +pdfjs-views-manager-outlines-option-label = 文書のアウトライン +pdfjs-views-manager-attachments-option-label = 添付データ +pdfjs-views-manager-layers-option-label = レイヤー +pdfjs-views-manager-add-file-button = + .title = ファイルを追加します +pdfjs-views-manager-add-file-button-label = ファイルを追加 +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = { $count } ページ選択中 +pdfjs-views-manager-pages-status-none-action-label = ページを選択 +pdfjs-views-manager-pages-status-action-button-label = 管理 +pdfjs-views-manager-pages-status-copy-button-label = コピー +pdfjs-views-manager-pages-status-cut-button-label = 切り取り +pdfjs-views-manager-pages-status-delete-button-label = 削除 +pdfjs-views-manager-pages-status-export-selected-button-label = 選択したページをエクスポート... +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = { $count } ページを切り取りしました +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = { $count } ページをコピーしました +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = { $count } ページを削除しました +pdfjs-views-manager-pages-status-waiting-ready-label = ファイルを準備しています... +pdfjs-views-manager-pages-status-waiting-uploading-label = ファイルをアップロードしています... +pdfjs-views-manager-status-warning-cut-label = 切り取りできませんでした。ページを更新してもう一度試してください。 +pdfjs-views-manager-status-warning-copy-label = コピーできませんでした。ページを更新してもう一度試してください。 +pdfjs-views-manager-status-warning-delete-label = 削除できませんでした。ページを更新してもう一度試してください。 +pdfjs-views-manager-status-warning-save-label = 保存できませんでした。ページを更新してもう一度試してください。 +pdfjs-views-manager-status-undo-button-label = 元に戻す +pdfjs-views-manager-status-done-button-label = 完了 +pdfjs-views-manager-status-close-button = + .title = 閉じる +pdfjs-views-manager-status-close-button-label = 閉じる +pdfjs-views-manager-paste-button-label = 貼り付け +pdfjs-views-manager-paste-button-before = + .title = 最初のページの前に貼り付けます +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = { $page } ページの後に貼り付けます +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = 新機能 +pdfjs-views-manager-waiting-for-file = ファイルをアップロードしています... +pdfjs-toggle-views-manager-button1 = + .title = ページを管理 + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = 保存された署名を削除します +pdfjs-editor-delete-signature-button-label1 = 保存された署名を削除 + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = 説明を編集 + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = 説明の編集 diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ka/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ka/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ka/viewer.ftl 2026-01-20 14:08:39.373689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ka/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -31,8 +31,8 @@ pdfjs-zoom-select = .title = ზომა pdfjs-presentation-mode-button = - .title = ჩვენების რეჟიმზე გადართვა -pdfjs-presentation-mode-button-label = ჩვენების რეჟიმი + .title = წარდგენის რეჟიმზე გადართვა +pdfjs-presentation-mode-button-label = წარდგენის რეჟიმი pdfjs-open-file-button = .title = ფაილის გახსნა pdfjs-open-file-button-label = გახსნა @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = მიმდინარე გვერდი (ბმული ამ გვერდისთვის) pdfjs-bookmark-button-label = მიმდინარე გვერდი -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = გახსნა პროგრამით -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = გახსნა პროგრამით ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = ფაილის სახელი: pdfjs-document-properties-file-size = ფაილის მოცულობა: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } კბ ({ $size_b } ბაიტი) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } მბ ({ $size_b } ბაიტი) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } კბაიტი ({ $b } ბაიტი) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } მბაიტი ({ $b } ბაიტი) pdfjs-document-properties-title = სათაური: pdfjs-document-properties-author = შემქმნელი: pdfjs-document-properties-subject = თემა: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = შექმნის დრო: pdfjs-document-properties-modification-date = ჩასწორების დრო: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = შემდგენელი: pdfjs-document-properties-producer = PDF-შემდგენელი: pdfjs-document-properties-version = PDF-ვერსია: @@ -176,7 +169,7 @@ pdfjs-toggle-sidebar-button = .title = გვერდითა ზოლის გამოჩენა/დამალვა pdfjs-toggle-sidebar-notification-button = - .title = გვერდითი ზოლის გამოჩენა (შეიცავს სარჩევს/დანართს/ფენებს) + .title = გვერდითი ზოლის გამოჩენა (შეიცავს სარჩევს/დანართს/შრეებს) pdfjs-toggle-sidebar-button-label = გვერდითა ზოლის გამოჩენა/დამალვა pdfjs-document-outline-button = .title = დოკუმენტის სარჩევის ჩვენება (ორმაგი წკაპით თითოეულის ჩამოშლა/აკეცვა) @@ -185,8 +178,8 @@ .title = დანართების ჩვენება pdfjs-attachments-button-label = დანართები pdfjs-layers-button = - .title = ფენების გამოჩენა (ორმაგი წკაპით ყველა ფენის ნაგულისხმევზე დაბრუნება) -pdfjs-layers-button-label = ფენები + .title = შრეების გამოჩენა (ორმაგი წკაპით ყველა შრის ნაგულისხმევზე დაბრუნება) +pdfjs-layers-button-label = შრეები pdfjs-thumbs-button = .title = შეთვალიერება pdfjs-thumbs-button-label = ესკიზები @@ -196,7 +189,7 @@ pdfjs-findbar-button = .title = პოვნა დოკუმენტში pdfjs-findbar-button-label = ძიება -pdfjs-additional-layers = დამატებითი ფენები +pdfjs-additional-layers = დამატებითი შრეები ## Thumbnails panel item (tooltip and alt text for images) @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = გვერდის შეთვალიერება { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = მონიშნეთ { $page } გვერდი +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = გვერდი { $page }, სულ { $total } ## Find panel button title and messages @@ -215,10 +217,10 @@ .title = ძიება .placeholder = პოვნა დოკუმენტში… pdfjs-find-previous-button = - .title = ფრაზის წინა კონტექსტის პოვნა + .title = წინა დამთხვევის პოვნა pdfjs-find-previous-button-label = წინა pdfjs-find-next-button = - .title = ფრაზის შემდეგი კონტექსტის პოვნა + .title = მომდევნო დამთხვევის პოვნა pdfjs-find-next-button-label = შემდეგი pdfjs-find-highlight-checkbox = ყველაფრის მონიშვნა pdfjs-find-match-case-checkbox-label = მთავრულით @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } შენიშვნა] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,29 +295,64 @@ pdfjs-editor-free-text-button = .title = წარწერა -pdfjs-editor-free-text-button-label = ტექსტი +pdfjs-editor-color-picker-free-text-input = + .title = წარწერის ფერის შეცვლა +pdfjs-editor-free-text-button-label = წარწერა pdfjs-editor-ink-button = - .title = ხაზვა -pdfjs-editor-ink-button-label = ხაზვა + .title = მოხაზვა +pdfjs-editor-color-picker-ink-input = + .title = მოხაზულის ფერის შეცვლა +pdfjs-editor-ink-button-label = მოხაზვა pdfjs-editor-stamp-button = .title = სურათების დართვა ან ჩასწორება pdfjs-editor-stamp-button-label = სურათების დართვა ან ჩასწორება -pdfjs-editor-remove-button = - .title = მოცილება pdfjs-editor-highlight-button = .title = მონიშვნა pdfjs-editor-highlight-button-label = მონიშვნა +pdfjs-highlight-floating-button1 = + .title = მონიშვნა + .aria-label = მონიშვნა +pdfjs-highlight-floating-button-label = მონიშვნა +pdfjs-comment-floating-button = + .title = შენიშვნა + .aria-label = შენიშვნა +pdfjs-comment-floating-button-label = შენიშვნა +pdfjs-editor-comment-button = + .title = შენიშვნა + .aria-label = შენიშვნა +pdfjs-editor-comment-button-label = შენიშვნა +pdfjs-editor-signature-button = + .title = ხელმოწერის დამატება +pdfjs-editor-signature-button-label = ხელმოწერის დამატება + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = მონიშვნის ჩასწორება +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = მოხაზულის ჩასწორება +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = ხელმოწერის ჩასწორება: { $description } +pdfjs-editor-stamp-editor = + .aria-label = სურათის ჩასწორება ## Remove button for the various kind of editor. pdfjs-editor-remove-ink-button = - .title = დახაზულის მოცილება + .title = მოხაზულის მოცილება pdfjs-editor-remove-freetext-button = .title = წარწერის მოცილება pdfjs-editor-remove-stamp-button = .title = სურათის მოცილება pdfjs-editor-remove-highlight-button = .title = მონიშვნის მოცილება +pdfjs-editor-remove-signature-button = + .title = ხელმოწერის მოცილება ## @@ -329,19 +365,45 @@ pdfjs-editor-stamp-add-image-button = .title = სურათის დამატება pdfjs-editor-stamp-add-image-button-label = სურათის დამატება -pdfjs-free-text = - .aria-label = ნაწერის ჩასწორება -pdfjs-free-text-default-content = აკრიფეთ… -pdfjs-ink = - .aria-label = დახაზულის შესწორება -pdfjs-ink-canvas = - .aria-label = მომხმარებლის შექმნილი სურათი +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = სისქე +pdfjs-editor-free-highlight-thickness-title = + .title = სისქის შეცვლა წარწერის გარდა სხვა ნაწილების მონიშვნისას +pdfjs-editor-add-signature-container = + .aria-label = ხელმოწერის მართვა და შენახული ხელმოწერები +pdfjs-editor-signature-add-signature-button = + .title = ახალი ხელმოწერის დამატება +pdfjs-editor-signature-add-signature-button-label = ახალი ხელმოწერის დამატება +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = შენახული ხელმოწერა: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = წარწერის ჩასწორება + .default-content = დაიწყეთ აკრეფა… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] შენიშვნა + *[other] შენიშვნა + } +pdfjs-editor-comments-sidebar-close-button = + .title = გვერდითი ზოლის დახურვა + .aria-label = გვერდითი ზოლის დახურვა +pdfjs-editor-comments-sidebar-close-button-label = გვერდითი ზოლის დახურვა +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = რამე საყურადღებოს წააწყდით? გააფერადეთ და დაურთეთ შენიშვნა. +pdfjs-editor-comments-sidebar-no-comments-link = ვრცლად ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = თანდართული წარწერა -pdfjs-editor-alt-text-edit-button-label = თანდართული წარწერის ჩასწორება +pdfjs-editor-alt-text-edit-button = + .aria-label = დართული წარწერის ჩასწორება pdfjs-editor-alt-text-dialog-label = არჩევა pdfjs-editor-alt-text-dialog-description = თანდართული (შემნაცვლებელი) წარწერა გამოსადეგია მათთვის, ვინც ვერ ხედავს სურათებს ან გამოისახება მაშინ, როცა სურათი ვერ ჩაიტვირთება. pdfjs-editor-alt-text-add-description-label = აღწერილობის მითითება @@ -354,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = მაგალითად, „ახალგაზრდა მამაკაცი მაგიდასთან ზის და სადილობს“ +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = დართული წარწერა ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = ზევით მარცხნივ — ზომაცვლა -pdfjs-editor-resizer-label-top-middle = ზევით შუაში — ზომაცვლა -pdfjs-editor-resizer-label-top-right = ზევით მარჯვნივ — ზომაცვლა -pdfjs-editor-resizer-label-middle-right = შუაში მარჯვნივ — ზომაცვლა -pdfjs-editor-resizer-label-bottom-right = ქვევით მარჯვნივ — ზომაცვლა -pdfjs-editor-resizer-label-bottom-middle = ქვევით შუაში — ზომაცვლა -pdfjs-editor-resizer-label-bottom-left = ზვევით მარცხნივ — ზომაცვლა -pdfjs-editor-resizer-label-middle-left = შუაში მარცხნივ — ზომაცვლა +pdfjs-editor-resizer-top-left = + .aria-label = ზევით მარცხნივ — ზომაცვლა +pdfjs-editor-resizer-top-middle = + .aria-label = ზევით შუაში — ზომაცვლა +pdfjs-editor-resizer-top-right = + .aria-label = ზევით მარჯვნივ — ზომაცვლა +pdfjs-editor-resizer-middle-right = + .aria-label = შუაში მარჯვნივ — ზომაცვლა +pdfjs-editor-resizer-bottom-right = + .aria-label = ქვევით მარჯვნივ — ზომაცვლა +pdfjs-editor-resizer-bottom-middle = + .aria-label = ქვევით შუაში — ზომაცვლა +pdfjs-editor-resizer-bottom-left = + .aria-label = ზვევით მარცხნივ — ზომაცვლა +pdfjs-editor-resizer-middle-left = + .aria-label = შუაში მარცხნივ — ზომაცვლა ## Color picker @@ -385,3 +458,290 @@ .title = ვარდისფერი pdfjs-editor-colorpicker-red = .title = წითელი + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = ყველას ჩვენება +pdfjs-editor-highlight-show-all-button = + .title = ყველას ჩვენება + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = დართული წარწერის ჩასწორება (სურათის აღწერის) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = დართული წარწერის დამატება (სურათის აღწერის) +pdfjs-editor-new-alt-text-textarea = + .placeholder = დაწერეთ თქვენი აღწერილობა აქ… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = მოკლე აღწერა მათთვის, ვინც ვერ ხედავს სურათს ან ვისთანაც ვერ ჩაიტვირთება სურათი. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = ეს დართული წარწერა ავტომატურადაა შედგენილი და შესაძლოა, უმართებულო იყოს. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = ვრცლად +pdfjs-editor-new-alt-text-create-automatically-button-label = დართული წარწერის თვითშედგენა +pdfjs-editor-new-alt-text-not-now-button = ახლა არა +pdfjs-editor-new-alt-text-error-title = დართული წარწერის შედგენა ვერ მოხერხდა +pdfjs-editor-new-alt-text-error-description = გთხოვთ დაწეროთ საკუთარი დანართი და კვლავ სცადოთ მოგვიანებით. +pdfjs-editor-new-alt-text-error-close-button = დახურვა +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = ჩამოიტვირთება დართული წარწერის შესადეგი AI-მოდელი ({ $downloadedSize } ზომით { $totalSize } მბაიტი) + .aria-valuetext = ჩამოიტვირთება დართული წარწერის შესადეგი AI-მოდელი ({ $downloadedSize } ზომით { $totalSize } მბაიტი) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = დართული წარწერა დამატებულია +pdfjs-editor-new-alt-text-added-button-label = დართული წარწერა დამატებულია +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = აკლია დართული წარწერა +pdfjs-editor-new-alt-text-missing-button-label = აკლია დართული წარწერა +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = დართული წარწერის გადახედვა +pdfjs-editor-new-alt-text-to-review-button-label = დართული წარწერის გადახედვა +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = შედგენილია ავტომატურად: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = სურათის დართული წარწერის პარამეტრები +pdfjs-image-alt-text-settings-button-label = სურათის დართული წარწერის პარამეტრები +pdfjs-editor-alt-text-settings-dialog-label = სურათის დართული წარწერის პარამეტრები +pdfjs-editor-alt-text-settings-automatic-title = ავტომატურად დართული წარწერა +pdfjs-editor-alt-text-settings-create-model-button-label = დართული წარწერის თვითშედგენა +pdfjs-editor-alt-text-settings-create-model-description = აღწერს სურათს მათთვის, ვინც ვერ ხედავს ან ვისთანაც ვერ ჩაიტვირთება. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = დართული წარწერის შესადგენი AI-მოდელი ({ $totalSize } მბაიტი) +pdfjs-editor-alt-text-settings-ai-model-description = ეშვება ადგილობრივად თქვენს მოწყობილობაზე, ასე რომ მონაცემები დარჩება პირადი. საჭიროა დართული წარწერების თვითშედგენისთვის. +pdfjs-editor-alt-text-settings-delete-model-button = წაშლა +pdfjs-editor-alt-text-settings-download-model-button = ჩამოტვირთვა +pdfjs-editor-alt-text-settings-downloading-model-button = ჩამოიტვრითება... +pdfjs-editor-alt-text-settings-editor-title = დართული წარწერის ჩამსწორებელი +pdfjs-editor-alt-text-settings-show-dialog-button-label = გამოჩნდეს დართული წარწერის ჩამსწორებელი სურათის დამატებისთანავე +pdfjs-editor-alt-text-settings-show-dialog-description = უზრუნველყოფს, რომ თქვენს ყველა სურათს ახლდეს დართული წარწერა. +pdfjs-editor-alt-text-settings-close-button = დახურვა + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = მონიშვნა დამატებულია +pdfjs-editor-freetext-added-alert = წარწერა დამატებულია +pdfjs-editor-ink-added-alert = მოხაზვა დამატებული +pdfjs-editor-stamp-added-alert = სურათი დამატებულია +pdfjs-editor-signature-added-alert = ხელმოწერა დამატებულია + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = მონიშვნა მოცილებულია +pdfjs-editor-undo-bar-message-freetext = წარწერა მოცილებულია +pdfjs-editor-undo-bar-message-ink = მოხაზულის მოცილებულია +pdfjs-editor-undo-bar-message-stamp = სურათი მოცილებულია +pdfjs-editor-undo-bar-message-signature = ხელმოწერა მოცილებულია +pdfjs-editor-undo-bar-message-comment = შენიშვნა მოცილებულია +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } შენიშვნა მოცილებულია + *[other] { $count } შენიშვნა მოცილებულია + } +pdfjs-editor-undo-bar-undo-button = + .title = დაბრუნება +pdfjs-editor-undo-bar-undo-button-label = დაბრუნება +pdfjs-editor-undo-bar-close-button = + .title = დახურვა +pdfjs-editor-undo-bar-close-button-label = დახურვა + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = ეს არე საშუალებას აძლევს მომხმარებელს, შექმნას საკუთარი ხელმოწერა PDF-დოკუმენტისთვის. მომხმარებელს შეეძლება ჩაასწოროს სახელი (რომელიც დართული ტექსტის მოვალეობასაც ასრულებს) და სურვილისამებრ შეინახოს ხელმოწერა განმეორებით გამოსაყენებლად. +pdfjs-editor-add-signature-dialog-title = ხელმოწერის დამატება + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = აკრეფა + .title = აკრეფა +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = მოხაზვა + .title = მოხაზვა +pdfjs-editor-add-signature-image-button = სურათი + .title = სურათი + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = აკრიფეთ ხელმოწერა + .placeholder = აკრიფეთ ხელმოწერა +pdfjs-editor-add-signature-draw-placeholder = მოხაზეთ ხელმოწერა +pdfjs-editor-add-signature-draw-thickness-range-label = სისქე +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = მოხაზულის სისქე: { $thickness } +pdfjs-editor-add-signature-image-placeholder = ჩავლებით გადმოიტანეთ ასატვირთად +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] ან ამოარჩიეთ სურათებიდან + *[other] ან ამოარჩიეთ სურათებიდან + } + +## Controls + +pdfjs-editor-add-signature-description-label = აღწერილობა (დართული წარწერა) +pdfjs-editor-add-signature-description-input = + .title = აღწერილობა (დართული წარწერა) +pdfjs-editor-add-signature-description-default-when-drawing = ხელმოწერა +pdfjs-editor-add-signature-clear-button-label = ხელმოწერის წაშლა +pdfjs-editor-add-signature-clear-button = + .title = ხელმოწერის წაშლა +pdfjs-editor-add-signature-save-checkbox = ხელმოწერის შენახვა +pdfjs-editor-add-signature-save-warning-message = მიღწეულია 5 ხელმოწერის შენახვის ზღვარი. მოაცილეთ რომელიმე ახლის შესანახად. +pdfjs-editor-add-signature-image-upload-error-title = ვერ აიტვირთა სურათი +pdfjs-editor-add-signature-image-upload-error-description = შეამოწმეთ ქსელთან კავშირი ან მოსინჯეთ სხვა სურათი. +pdfjs-editor-add-signature-image-no-data-error-title = ვერ გარდაიქმნება ეს სურათი ხელმოწერად +pdfjs-editor-add-signature-image-no-data-error-description = გთხოვთ, სცადოთ სხვა სურათის ატვირთვა. +pdfjs-editor-add-signature-error-close-button = დახურვა + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = გაუქმება +pdfjs-editor-add-signature-add-button = დამატება +pdfjs-editor-edit-signature-update-button = განახლება + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = შენიშვნის ჩასწორება +pdfjs-editor-edit-comment-popup-button = + .title = შენიშვნის ჩასწორება +pdfjs-editor-delete-comment-popup-button-label = შენიშვნის მოცილება +pdfjs-editor-delete-comment-popup-button = + .title = შენიშვნის მოცილება +pdfjs-show-comment-button = + .title = შენიშვნის გამოჩენა + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = შენიშვნის ჩასწორება +pdfjs-editor-edit-comment-dialog-save-button-when-editing = განახლება +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = შენიშვნის დამატება +pdfjs-editor-edit-comment-dialog-save-button-when-adding = დამატება +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = აკრიფეთ… +pdfjs-editor-edit-comment-dialog-cancel-button = გაუქმება + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = შენიშვნის დამატება + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = გვერდითი ზოლის გამოჩენა (შეიცავს შესათვალიერებელს/სარჩევს/დანართს) +pdfjs-toggle-views-manager-button1-label = გვერდების მართვა +pdfjs-views-manager-sidebar = + .aria-label = გვერდითი ზოლი +pdfjs-views-manager-sidebar-resizer = + .aria-label = გვერდითი ზოლის ზომაცვლა +pdfjs-views-manager-view-selector-button = + .title = ხედები +pdfjs-views-manager-view-selector-button-label = ხედები +pdfjs-views-manager-pages-title = გვერდები +pdfjs-views-manager-outlines-title1 = დოკუმენტის სარჩევი + .title = დოკუმენტის სარჩევი (ორმაგი წკაპით ყველა ჩანაწერის ჩამოშლა/აკეცვა) +pdfjs-views-manager-attachments-title = დანართები +pdfjs-views-manager-layers-title1 = შრეები + .title = შრეები (ორმაგი წკაპით ყველა შრის ნაგულისხმევზე დაბრუნება) +pdfjs-views-manager-pages-option-label = გვერდები +pdfjs-views-manager-outlines-option-label = დოკუმენტის სარჩევი +pdfjs-views-manager-attachments-option-label = დანართები +pdfjs-views-manager-layers-option-label = შრეები +pdfjs-views-manager-add-file-button = + .title = ფაილის დამატება +pdfjs-views-manager-add-file-button-label = ფაილის დამატება +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } შერჩეული + *[other] { $count } შერჩეული + } +pdfjs-views-manager-pages-status-none-action-label = გვერდების შერჩევა +pdfjs-views-manager-pages-status-action-button-label = მართვა +pdfjs-views-manager-pages-status-copy-button-label = ასლი +pdfjs-views-manager-pages-status-cut-button-label = ამოჭრა +pdfjs-views-manager-pages-status-delete-button-label = წაშლა +pdfjs-views-manager-pages-status-export-selected-button-label = შერჩეულის გატანა… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 გვერდი ამოიჭრა + *[other] { $count } გვერდი ამოიჭრა + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 გვერდის ასლი აღებულია + *[other] { $count } გვერდის ასლი აღებულია + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 გვერდი წაიშალა + *[other] { $count } გვერდი წაიშალა + } +pdfjs-views-manager-pages-status-waiting-ready-label = მზადდება თქვენი ფაილი… +pdfjs-views-manager-pages-status-waiting-uploading-label = ფაილი აიტვირთება… +pdfjs-views-manager-status-warning-cut-label = ვერ ამოიჭრა. განაახლეთ გვერდი და კვლავ სცადეთ. +pdfjs-views-manager-status-warning-copy-label = ასლი ვერ აიღო. განაახლეთ გვერდი და კვლავ სცადეთ. +pdfjs-views-manager-status-warning-delete-label = ვერ წაიშალა. განაახლეთ გვერდი და კვლავ სცადეთ. +pdfjs-views-manager-status-warning-save-label = ვერ შეინახა. განაახლეთ გვერდი და კვლავ სცადეთ. +pdfjs-views-manager-status-undo-button-label = დაბრუნება +pdfjs-views-manager-status-done-button-label = მზადაა +pdfjs-views-manager-status-close-button = + .title = დახურვა +pdfjs-views-manager-status-close-button-label = დახურვა +pdfjs-views-manager-paste-button-label = ჩასმა +pdfjs-views-manager-paste-button-before = + .title = ჩასმა პირველი გვერდის წინ +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = ჩასმა { $page } გვერდის შემდეგ +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = ᲡᲘᲐᲮᲚᲔ +pdfjs-views-manager-waiting-for-file = ფაილი აიტვირთება… +pdfjs-toggle-views-manager-button1 = + .title = გვერდების მართვა + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = შენახული ხელმოწერის მოცილება +pdfjs-editor-delete-signature-button-label1 = შენახული ხელმოწერის მოცილება + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = აღწერილობის ჩასწორება + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = აღწერილობის ჩასწორება diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/kab/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/kab/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/kab/viewer.ftl 2026-01-20 14:08:39.373689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/kab/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Asebter amiran (Sken-d tansa URL seg usebter amiran) pdfjs-bookmark-button-label = Asebter amiran -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Ldi deg usnas -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Ldi deg usnas ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Isem n ufaylu: pdfjs-document-properties-file-size = Teɣzi n ufaylu: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KAṬ ({ $size_b } ibiten) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MAṬ ({ $size_b } iṭamḍanen) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } yibiten) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } yibiten) pdfjs-document-properties-title = Azwel: pdfjs-document-properties-author = Ameskar: pdfjs-document-properties-subject = Amgay: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Azemz n tmerna: pdfjs-document-properties-modification-date = Azemz n usnifel: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Yerna-t: pdfjs-document-properties-producer = Afecku n uselket PDF: pdfjs-document-properties-version = Lqem PDF: @@ -270,10 +263,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +270,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Tabzimt { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,15 +286,67 @@ pdfjs-editor-free-text-button = .title = Aḍris +pdfjs-editor-color-picker-free-text-input = + .title = Senfel ini n uḍris pdfjs-editor-free-text-button-label = Aḍris pdfjs-editor-ink-button = .title = Suneɣ +pdfjs-editor-color-picker-ink-input = + .title = Senfel ini n usuneɣ pdfjs-editor-ink-button-label = Suneɣ pdfjs-editor-stamp-button = .title = Rnu neɣ ẓreg tugniwin pdfjs-editor-stamp-button-label = Rnu neɣ ẓreg tugniwin -pdfjs-editor-remove-button = - .title = Kkes +pdfjs-editor-highlight-button = + .title = Derrer +pdfjs-editor-highlight-button-label = Derrer +pdfjs-highlight-floating-button1 = + .title = Derrer + .aria-label = Derrer +pdfjs-highlight-floating-button-label = Derrer +pdfjs-comment-floating-button = + .title = Wennet + .aria-label = Wennet +pdfjs-comment-floating-button-label = Awennit +pdfjs-editor-comment-button = + .title = Wennet + .aria-label = Wennet +pdfjs-editor-comment-button-label = Awennit +pdfjs-editor-signature-button = + .title = Rnu azmul +pdfjs-editor-signature-button-label = Rnu azmul + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Amaẓrag usebrureq +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Amaẓrag n usuneɣ +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = usuneɣ n uzmul: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Amaẓrag n tugna + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Kkes asuneɣ +pdfjs-editor-remove-freetext-button = + .title = Kkes aḍris +pdfjs-editor-remove-stamp-button = + .title = Kkes tugna +pdfjs-editor-remove-highlight-button = + .title = Kkes aderrer +pdfjs-editor-remove-signature-button = + .title = Kkes azmul + +## + # Editor Parameters pdfjs-editor-free-text-color-input = Initen pdfjs-editor-free-text-size-input = Teɣzi @@ -312,26 +356,271 @@ pdfjs-editor-stamp-add-image-button = .title = Rnu tawlaft pdfjs-editor-stamp-add-image-button-label = Rnu tawlaft -pdfjs-free-text = +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Tuzert +pdfjs-editor-free-highlight-thickness-title = + .title = Beddel tuzert mi ara d-tesbeggneḍ iferdisen niḍen ur nelli d aḍris +pdfjs-editor-add-signature-container = + .aria-label = Isenqaden n uzmul d yizmulen yettwaskelsen +pdfjs-editor-signature-add-signature-button = + .title = Rnu azmul amaynut +pdfjs-editor-signature-add-signature-button-label = Rnu azmul amaynut +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Yettwasekles uzmul: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Amaẓrag n uḍris -pdfjs-free-text-default-content = Bdu tira... -pdfjs-ink = - .aria-label = Amaẓrag n usuneɣ -pdfjs-ink-canvas = - .aria-label = Tugna yettwarnan sɣur useqdac + .default-content = Bdu tira… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Awennit + *[other] Iwenniten + } +pdfjs-editor-comments-sidebar-close-button = + .title = Mdel agalis adisan + .aria-label = Mdel agalis adisan +pdfjs-editor-comments-sidebar-close-button-label = Mdel agalis adisan +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Twalaḍ ayen i ak⋅akem-iɛeǧben? Sebrureq-it, ternuḍ eǧǧ awennit. +pdfjs-editor-comments-sidebar-no-comments-link = Issin ugar ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Aḍris amaskal -pdfjs-editor-alt-text-edit-button-label = Ẓreg aḍris amaskal +pdfjs-editor-alt-text-edit-button = + .aria-label = Ẓreg aḍris amaskal pdfjs-editor-alt-text-dialog-label = Fren taxtirt +pdfjs-editor-alt-text-dialog-description = Aḍris amaskal yettallel mi ara yili imdanen ur ttwalin ara tugna neɣ mi ara yili ur d-tuli ara. pdfjs-editor-alt-text-add-description-label = Rnu aglam +pdfjs-editor-alt-text-add-description-description = Yettuwelleh tira n tefyirt neɣ n snat ideg ara d-yettwaglem asentel, akatar neɣ tigawin. pdfjs-editor-alt-text-mark-decorative-label = Creḍ d adlag +pdfjs-editor-alt-text-mark-decorative-description = Taxtiṛt-a tettwaseqdacay i tugniwin n ucebbaḥ, am tamiwin neɣ i tecraḍ tifrawanin. pdfjs-editor-alt-text-cancel-button = Sefsex pdfjs-editor-alt-text-save-button = Sekles pdfjs-editor-alt-text-decorative-tooltip = Yettwacreḍ d adlag +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = D amedya, “Yiwen yilemẓi iqqim ɣer ṭṭabla,ad yečč imekli” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Aḍris amaskal ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. +pdfjs-editor-resizer-top-left = + .aria-label = Tiɣmert n ufella n zelmeḍ — semsawi teɣzi +pdfjs-editor-resizer-top-middle = + .aria-label = Talemmat n ufella — semsawi teɣzi +pdfjs-editor-resizer-top-right = + .aria-label = Tiɣmert n ufella n yeffus — semsawi teɣzi +pdfjs-editor-resizer-middle-right = + .aria-label = Talemmast tayeffust — semsawi teɣzi +pdfjs-editor-resizer-bottom-right = + .aria-label = Tiɣmert n wadda n yeffus — semsawi teɣzi +pdfjs-editor-resizer-bottom-middle = + .aria-label = Talemmat n wadda — semsawi teɣzi +pdfjs-editor-resizer-bottom-left = + .aria-label = Tiɣmert n wadda n zelmeḍ — semsawi teɣzi +pdfjs-editor-resizer-middle-left = + .aria-label = Talemmast tazelmdaḍt — semsawi teɣzi + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Ini n uderrer +pdfjs-editor-colorpicker-button = + .title = Senfel ini +pdfjs-editor-colorpicker-dropdown = + .aria-label = Afran n yiniten +pdfjs-editor-colorpicker-yellow = + .title = Awraɣ +pdfjs-editor-colorpicker-green = + .title = Azegzaw +pdfjs-editor-colorpicker-blue = + .title = Amidadi +pdfjs-editor-colorpicker-pink = + .title = Axuxi +pdfjs-editor-colorpicker-red = + .title = Azggaɣ + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Sken akk +pdfjs-editor-highlight-show-all-button = + .title = Sken akk + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Ẓreg aḍris niḍen (aglam n tugna) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Rnu aḍris niḍen (aglam n tugna) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Aru aglam-ik dagi… +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Issin ugar +pdfjs-editor-new-alt-text-create-automatically-button-label = Rnu aḍris niḍen s wudem awurman +pdfjs-editor-new-alt-text-not-now-button = Mačči tura +pdfjs-editor-new-alt-text-error-title = D awezɣi timerna n uḍris niḍen s wudem awurman +pdfjs-editor-new-alt-text-error-description = Ttxil-k⋅m aru aḍris-ik⋅im niḍen neɣ ɛreḍ tikkelt niḍen. +pdfjs-editor-new-alt-text-error-close-button = Mdel +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Asader n tmudemt n IA n uḍris amlellay ({ $downloadedSize } n { $totalSize } MB) + .aria-valuetext = Asader n tmudemt n IA n uḍris amlellay ({ $downloadedSize } n { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Yettwarna weḍris amlellay +pdfjs-editor-new-alt-text-added-button-label = Yettwarna weḍris amlellay +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Ixuṣ uḍris amlellay +pdfjs-editor-new-alt-text-missing-button-label = Ixuṣ uḍris amlellay +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Senqed aḍris amlellay +pdfjs-editor-new-alt-text-to-review-button-label = Senqed aḍris amlellay +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Yettwarna s wudem awurman: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Iɣewwaṛen n weḍris amlellay n tugna +pdfjs-image-alt-text-settings-button-label = Iɣewwaṛen n weḍris amlellay n tugna +pdfjs-editor-alt-text-settings-dialog-label = Iɣewwaṛen n weḍris amlellay n tugna +pdfjs-editor-alt-text-settings-automatic-title = Aḍris amlellay awurman +pdfjs-editor-alt-text-settings-create-model-button-label = Rnu aḍris niḍen s wudem awurman +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Tamudemt n IA n uḍris amlellay ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-delete-model-button = Kkes +pdfjs-editor-alt-text-settings-download-model-button = Sader +pdfjs-editor-alt-text-settings-downloading-model-button = Asader… +pdfjs-editor-alt-text-settings-editor-title = Amaẓrag n weḍris amlellay +pdfjs-editor-alt-text-settings-show-dialog-button-label = Sken amaẓrag n uḍris amlellay akken kan ara ternuḍ tugna +pdfjs-editor-alt-text-settings-show-dialog-description = Yettall ad tḍemneḍ tugniwin sɛant aḍris amlellay. +pdfjs-editor-alt-text-settings-close-button = Mdel + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Yettwarna usebrureq +pdfjs-editor-freetext-added-alert = Yettwarna uḍris +pdfjs-editor-ink-added-alert = Yettwarna usuneɣ +pdfjs-editor-stamp-added-alert = Tugna tettwarna +pdfjs-editor-signature-added-alert = Azmul yettwarna + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Yettwakkes usebrureq +pdfjs-editor-undo-bar-message-freetext = Aḍris yettwakkes +pdfjs-editor-undo-bar-message-ink = Asuneɣ yettwakkes +pdfjs-editor-undo-bar-message-stamp = Tugna tettwakkes +pdfjs-editor-undo-bar-message-signature = Azmul yettwakkes +pdfjs-editor-undo-bar-undo-button = + .title = Sefsex +pdfjs-editor-undo-bar-undo-button-label = Sefsex +pdfjs-editor-undo-bar-close-button = + .title = Mdel +pdfjs-editor-undo-bar-close-button-label = Mdel + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-title = Rnu azmul + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Anaw + .title = Anaw +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Suneɣ + .title = Suneɣ +pdfjs-editor-add-signature-image-button = Tugna + .title = Tugna + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Zru azmul-ik + .placeholder = Zru azmul-ik +pdfjs-editor-add-signature-draw-placeholder = Suneɣ azmul-ik +pdfjs-editor-add-signature-draw-thickness-range-label = Tuzert +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Tuzert n usuneɣ: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Seḥnucceḍ afaylu da akken ad t-saliṭ +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] neɣ fren ifuyla n tugna + *[other] neɣ inig ifuyla n tugna + } + +## Controls + +pdfjs-editor-add-signature-description-label = Aglam (aḍris amlellay) +pdfjs-editor-add-signature-description-input = + .title = Aglam (aḍris amlellay) +pdfjs-editor-add-signature-description-default-when-drawing = Azmul +pdfjs-editor-add-signature-clear-button-label = Sfeḍ azmul +pdfjs-editor-add-signature-clear-button = + .title = Sfeḍ azmul +pdfjs-editor-add-signature-save-checkbox = Sekles azmul +pdfjs-editor-add-signature-image-upload-error-title = Ur izmir ara ad yessali tugna +pdfjs-editor-add-signature-image-upload-error-description = Ssefqed tuqqna-inek⋅inem n uẓeṭṭa neɣ ɛreḍ tugna-nniḍen. +pdfjs-editor-add-signature-image-no-data-error-title = D awezɣi aselket n tugna-a ɣer uzmul +pdfjs-editor-add-signature-image-no-data-error-description = Ttxil-k⋅m ɛreḍ ad tzedmeḍ tugna niḍen +pdfjs-editor-add-signature-error-close-button = Mdel + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Semmet +pdfjs-editor-add-signature-add-button = Rnu +pdfjs-editor-edit-signature-update-button = Leqqem + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Ẓreg awennit +pdfjs-editor-edit-comment-popup-button = + .title = Ẓreg awennit +pdfjs-editor-delete-comment-popup-button-label = Kkes awennit +pdfjs-editor-delete-comment-popup-button = + .title = Kkes awennit +pdfjs-show-comment-button = + .title = Sken awennit + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Ẓreg awennit +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Rnu awennit +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Bdu tira... +pdfjs-editor-edit-comment-dialog-cancel-button = Sefsex + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Kkes azmul yettwakelsen +pdfjs-editor-delete-signature-button-label1 = Kkes azmul yettwakelsen + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Ẓreg aglam + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Ẓreg aglam diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/kk/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/kk/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/kk/viewer.ftl 2026-01-20 14:08:39.373689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/kk/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Ағымдағы бет (Ағымдағы беттен URL адресін көру) pdfjs-bookmark-button-label = Ағымдағы бет -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Қолданбада ашу -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Қолданбада ашу ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Файл аты: pdfjs-document-properties-file-size = Файл өлшемі: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } КБ ({ $size_b } байт) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } байт) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } КБ ({ $b } байт) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } МБ ({ $b } байт) pdfjs-document-properties-title = Тақырыбы: pdfjs-document-properties-author = Авторы: pdfjs-document-properties-subject = Тақырыбы: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Жасалған күні: pdfjs-document-properties-modification-date = Түзету күні: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Жасаған: pdfjs-document-properties-producer = PDF өндірген: pdfjs-document-properties-version = PDF нұсқасы: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = { $page } парағы үшін кіші көрінісі +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = { $page } бетін таңдау +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Бет { $page }/{ $total } ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } аңдатпасы] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Мәтін +pdfjs-editor-color-picker-free-text-input = + .title = Мәтін түсін өзгерту pdfjs-editor-free-text-button-label = Мәтін pdfjs-editor-ink-button = .title = Сурет салу +pdfjs-editor-color-picker-ink-input = + .title = Сызба түсін өзгерту pdfjs-editor-ink-button-label = Сурет салу pdfjs-editor-stamp-button = .title = Суреттерді қосу немесе түзету @@ -304,12 +309,37 @@ pdfjs-editor-highlight-button = .title = Ерекшелеу pdfjs-editor-highlight-button-label = Ерекшелеу -pdfjs-highlight-floating-button = - .title = Ерекшелеу pdfjs-highlight-floating-button1 = .title = Ерекшелеу .aria-label = Ерекшелеу pdfjs-highlight-floating-button-label = Ерекшелеу +pdfjs-comment-floating-button = + .title = Түсіндірме + .aria-label = Түсіндірме +pdfjs-comment-floating-button-label = Түсіндірме +pdfjs-editor-comment-button = + .title = Түсіндірме + .aria-label = Түсіндірме +pdfjs-editor-comment-button-label = Түсіндірме +pdfjs-editor-signature-button = + .title = Қолтаңбаны қосу +pdfjs-editor-signature-button-label = Қолтаңбаны қосу + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Ерекшелеу түзеткіші +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Сурет салу түзеткіші +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Қолтаңба түзеткіші: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Сурет редакторы ## Remove button for the various kind of editor. @@ -321,6 +351,8 @@ .title = Суретті өшіру pdfjs-editor-remove-highlight-button = .title = Түспен ерекшелеуді өшіру +pdfjs-editor-remove-signature-button = + .title = Қолтаңбаны өшіру ## @@ -337,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Қалыңдығы pdfjs-editor-free-highlight-thickness-title = .title = Мәтіннен басқа элементтерді ерекшелеу кезінде қалыңдықты өзгерту -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Қолтаңбаларды басқару және сақталған қолтаңбалар +pdfjs-editor-signature-add-signature-button = + .title = Жаңа қолтаңбаны қосу +pdfjs-editor-signature-add-signature-button-label = Жаңа қолтаңбаны қосу +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Сақталған қолтаңба: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Мәтін түзеткіші -pdfjs-free-text-default-content = Теруді бастау… -pdfjs-ink = - .aria-label = Сурет түзеткіші -pdfjs-ink-canvas = - .aria-label = Пайдаланушы жасаған сурет + .default-content = Теріп бастаңыз… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Түсіндірмелер + *[other] Түсіндірмелер + } +pdfjs-editor-comments-sidebar-close-button = + .title = Бүйір панелін жабу + .aria-label = Бүйір панелін жабу +pdfjs-editor-comments-sidebar-close-button-label = Бүйір панелін жабу +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Назар аударарлық бірдеңе көрдіңіз бе? Оны ерекшелеп, түсіндірме қалдырыңыз. +pdfjs-editor-comments-sidebar-no-comments-link = Көбірек білу ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Балама мәтін -pdfjs-editor-alt-text-edit-button-label = Балама мәтінді өңдеу +pdfjs-editor-alt-text-edit-button = + .aria-label = Балама мәтінді өңдеу pdfjs-editor-alt-text-dialog-label = Опцияны таңдау pdfjs-editor-alt-text-dialog-description = Балама мәтін адамдар суретті көре алмағанда немесе ол жүктелмегенде көмектеседі. pdfjs-editor-alt-text-add-description-label = Сипаттаманы қосу @@ -362,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Мысалы, "Жас жігіт тамақ ішу үшін үстел басына отырады" +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Балама мәтін ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Жоғарғы сол жақ бұрыш — өлшемін өзгерту -pdfjs-editor-resizer-label-top-middle = Жоғарғы ортасы — өлшемін өзгерту -pdfjs-editor-resizer-label-top-right = Жоғарғы оң жақ бұрыш — өлшемін өзгерту -pdfjs-editor-resizer-label-middle-right = Ортаңғы оң жақ — өлшемін өзгерту -pdfjs-editor-resizer-label-bottom-right = Төменгі оң жақ бұрыш — өлшемін өзгерту -pdfjs-editor-resizer-label-bottom-middle = Төменгі ортасы — өлшемін өзгерту -pdfjs-editor-resizer-label-bottom-left = Төменгі сол жақ бұрыш — өлшемін өзгерту -pdfjs-editor-resizer-label-middle-left = Ортаңғы сол жақ — өлшемін өзгерту +pdfjs-editor-resizer-top-left = + .aria-label = Жоғарғы сол жақ бұрыш — өлшемін өзгерту +pdfjs-editor-resizer-top-middle = + .aria-label = Жоғарғы ортасы — өлшемін өзгерту +pdfjs-editor-resizer-top-right = + .aria-label = Жоғарғы оң жақ бұрыш — өлшемін өзгерту +pdfjs-editor-resizer-middle-right = + .aria-label = Ортаңғы оң жақ — өлшемін өзгерту +pdfjs-editor-resizer-bottom-right = + .aria-label = Төменгі оң жақ бұрыш — өлшемін өзгерту +pdfjs-editor-resizer-bottom-middle = + .aria-label = Төменгі ортасы — өлшемін өзгерту +pdfjs-editor-resizer-bottom-left = + .aria-label = Төменгі сол жақ бұрыш — өлшемін өзгерту +pdfjs-editor-resizer-middle-left = + .aria-label = Ортаңғы сол жақ — өлшемін өзгерту ## Color picker @@ -400,3 +465,283 @@ pdfjs-editor-highlight-show-all-button-label = Барлығын көрсету pdfjs-editor-highlight-show-all-button = .title = Барлығын көрсету + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Балама мәтінді өңдеу (сурет сипаттамасы) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Балама мәтінді қосу (сурет сипаттамасы) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Сипаттамаңызды осында жазыңыз… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Суретті көре алмайтын адамдар үшін немесе сурет жүктелмеген кезіне арналған қысқаша сипаттама. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Бұл балама мәтін автоматты түрде жасалды және дәлсіз болуы мүмкін. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Көбірек білу +pdfjs-editor-new-alt-text-create-automatically-button-label = Балама мәтінді автоматты түрде жасау +pdfjs-editor-new-alt-text-not-now-button = Қазір емес +pdfjs-editor-new-alt-text-error-title = Балама мәтінді автоматты түрде жасау мүмкін болмады +pdfjs-editor-new-alt-text-error-description = Өзіңіздің балама мәтініңізді жазыңыз немесе кейінірек қайталап көріңіз. +pdfjs-editor-new-alt-text-error-close-button = Жабу +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Балама мәтін үшін ЖИ моделі жүктеп алынуда ({ $downloadedSize }/{ $totalSize } МБ) + .aria-valuetext = Балама мәтін үшін ЖИ моделі жүктеп алынуда ({ $downloadedSize }/{ $totalSize } МБ) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Балама мәтін қосылды +pdfjs-editor-new-alt-text-added-button-label = Балама мәтін қосылды +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Балама мәтін жоқ +pdfjs-editor-new-alt-text-missing-button-label = Балама мәтін жоқ +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Балама мәтінге пікір қалдыру +pdfjs-editor-new-alt-text-to-review-button-label = Балама мәтінге пікір қалдыру +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Автоматты түрде жасалды: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Суреттің балама мәтінінің баптаулары +pdfjs-image-alt-text-settings-button-label = Суреттің балама мәтінінің баптаулары +pdfjs-editor-alt-text-settings-dialog-label = Суреттің балама мәтінінің баптаулары +pdfjs-editor-alt-text-settings-automatic-title = Автоматты балама мәтін +pdfjs-editor-alt-text-settings-create-model-button-label = Балама мәтінді автоматты түрде жасау +pdfjs-editor-alt-text-settings-create-model-description = Суретті көре алмайтын адамдар үшін немесе сурет жүктелмеген кезіне арналған сипаттамаларды ұсынады. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Баламалы мәтіннің ЖИ моделі ({ $totalSize } МБ) +pdfjs-editor-alt-text-settings-ai-model-description = Деректеріңіз жеке болып қалуы үшін құрылғыңызда жергілікті түрде жұмыс істейді. Автоматты балама мәтін үшін қажет. +pdfjs-editor-alt-text-settings-delete-model-button = Өшіру +pdfjs-editor-alt-text-settings-download-model-button = Жүктеп алу +pdfjs-editor-alt-text-settings-downloading-model-button = Жүктеліп алынуда… +pdfjs-editor-alt-text-settings-editor-title = Баламалы мәтін редакторы +pdfjs-editor-alt-text-settings-show-dialog-button-label = Суретті қосқанда балама мәтін редакторын бірден көрсету +pdfjs-editor-alt-text-settings-show-dialog-description = Барлық суреттерде балама мәтін бар екеніне көз жеткізуге көмектеседі. +pdfjs-editor-alt-text-settings-close-button = Жабу + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Ерекшелеу қосылды +pdfjs-editor-freetext-added-alert = Мәтін қосылды +pdfjs-editor-ink-added-alert = Сызба қосылды +pdfjs-editor-stamp-added-alert = Сурет қосылды +pdfjs-editor-signature-added-alert = Қолтаңба қосылды + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Ерекшелеу өшірілді +pdfjs-editor-undo-bar-message-freetext = Мәтін өшірілді +pdfjs-editor-undo-bar-message-ink = Сызба өшірілді +pdfjs-editor-undo-bar-message-stamp = Сурет өшірілді +pdfjs-editor-undo-bar-message-signature = Қолтаңба өшірілді +pdfjs-editor-undo-bar-message-comment = Түсіндірме өшірілді +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } анимация өшірілді + *[other] { $count } анимация өшірілді + } +pdfjs-editor-undo-bar-undo-button = + .title = Болдырмау +pdfjs-editor-undo-bar-undo-button-label = Болдырмау +pdfjs-editor-undo-bar-close-button = + .title = Жабу +pdfjs-editor-undo-bar-close-button-label = Жабу + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Бұл модальді терезе пайдаланушыға PDF құжатына қосу үшін қолтаңба жасауға мүмкіндік береді. Пайдаланушы өз атын (ол балама мәтін ретінде де қолданылады) өңдей алады және қолтаңбаны кейін қайта пайдалану үшін сақтай алады. +pdfjs-editor-add-signature-dialog-title = Қолтаңба қосу + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Енгізу + .title = Енгізу +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Сурет салу + .title = Сурет салу +pdfjs-editor-add-signature-image-button = Сурет + .title = Сурет + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Қолтаңбаңызды теріңіз + .placeholder = Қолтаңбаңызды теріңіз +pdfjs-editor-add-signature-draw-placeholder = Қолтаңбаңызды сызыңыз +pdfjs-editor-add-signature-draw-thickness-range-label = Қалыңдығы +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Сызба қалыңздығы: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Жүктеп жіберу үшін файлды осы жерге сүйреңіз +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Немесе сурет файлдарын таңдаңыз + *[other] Немесе сурет файлдарын шолыңыз + } + +## Controls + +pdfjs-editor-add-signature-description-label = Сипаттама (балама мәтін) +pdfjs-editor-add-signature-description-input = + .title = Сипаттама (балама мәтін) +pdfjs-editor-add-signature-description-default-when-drawing = Қолтаңба +pdfjs-editor-add-signature-clear-button-label = Қолтаңбаны өшіру +pdfjs-editor-add-signature-clear-button = + .title = Қолтаңбаны өшіру +pdfjs-editor-add-signature-save-checkbox = Қолтаңбаны сақтау +pdfjs-editor-add-signature-save-warning-message = Сақталған 5 қолтаңбаның шегіне жеттіңіз. Көбірек сақтау үшін біреуін алып тастаңыз. +pdfjs-editor-add-signature-image-upload-error-title = Суретті жүктеп жіберу мүмкін емес. +pdfjs-editor-add-signature-image-upload-error-description = Желі байланысын тексеріңіз немесе басқа бейнені қолданып көріңіз. +pdfjs-editor-add-signature-image-no-data-error-title = Бұл суретті қолтаңбаға түрлендіру мүмкін емес +pdfjs-editor-add-signature-image-no-data-error-description = Басқа суретті жүктеп салып көріңіз. +pdfjs-editor-add-signature-error-close-button = Жабу + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Бас тарту +pdfjs-editor-add-signature-add-button = Қосу +pdfjs-editor-edit-signature-update-button = Жаңарту + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Түсіндірмені түзету +pdfjs-editor-edit-comment-popup-button = + .title = Түсіндірмені түзету +pdfjs-editor-delete-comment-popup-button-label = Түсіндірмені өшіру +pdfjs-editor-delete-comment-popup-button = + .title = Түсіндірмені өшіру +pdfjs-show-comment-button = + .title = Түсіндірмені көрсету + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Түсіндірмені түзету +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Жаңарту +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Түсіндірмені қосу +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Қосу +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Теріп бастаңыз… +pdfjs-editor-edit-comment-dialog-cancel-button = Бас тарту + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Пікір қосу + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Бүйір панелін көрсету/жасыру (құжатта кіші көріністер/құрылымы/салынымдар/қабаттар бар) +pdfjs-toggle-views-manager-button1-label = Беттерді басқару +pdfjs-views-manager-sidebar = + .aria-label = Бүйір панелі +pdfjs-views-manager-sidebar-resizer = + .aria-label = Бүйір панелінің өлшемін өзгертуші +pdfjs-views-manager-view-selector-button = + .title = Көріністер +pdfjs-views-manager-view-selector-button-label = Көріністер +pdfjs-views-manager-pages-title = Беттер +pdfjs-views-manager-outlines-title1 = Құжат құрылымы + .title = Құжат құрылымы (барлық нәрселерді жаю/жию үшін қос шерту) +pdfjs-views-manager-attachments-title = Салынымдар +pdfjs-views-manager-layers-title1 = Қабаттар + .title = Қабаттар (барлық нәрселерді жаю/жию үшін қос шерту) +pdfjs-views-manager-pages-option-label = Беттер +pdfjs-views-manager-outlines-option-label = Құжаттың құрылымы +pdfjs-views-manager-attachments-option-label = Салынымдар +pdfjs-views-manager-layers-option-label = Қабаттар +pdfjs-views-manager-add-file-button = + .title = Файлды қосу +pdfjs-views-manager-add-file-button-label = Файлды қосу +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } таңдалды + *[other] { $count } таңдалды + } +pdfjs-views-manager-pages-status-none-action-label = Беттерді таңдау +pdfjs-views-manager-pages-status-action-button-label = Басқару +pdfjs-views-manager-pages-status-copy-button-label = Көшіріп алу +pdfjs-views-manager-pages-status-cut-button-label = Қиып алу +pdfjs-views-manager-pages-status-delete-button-label = Өшіру +pdfjs-views-manager-pages-status-export-selected-button-label = Таңдалғанды экспорттау… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 бет қиып алынды + *[other] { $count } қиып алынды + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 бет көшірілді + *[other] { $count } бет көшірілді + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 бет өшірілді + *[other] { $count } бет өшірілді + } +pdfjs-views-manager-pages-status-waiting-ready-label = Файлыңыз дайындалуда… +pdfjs-views-manager-pages-status-waiting-uploading-label = Файл жүктеп салынуда… +pdfjs-views-manager-status-warning-cut-label = Қиып алу мүмкін болмады. Бетті жаңартып, қайталап көріңіз. +pdfjs-views-manager-status-warning-copy-label = Көшіру мүмкін болмады. Бетті жаңартып, қайталап көріңіз. +pdfjs-views-manager-status-warning-delete-label = Өшіру мүмкін болмады. Бетті жаңартып, қайталап көріңіз. +pdfjs-views-manager-status-warning-save-label = Сақтау мүмкін болмады. Бетті жаңартып, қайталап көріңіз. +pdfjs-views-manager-status-undo-button-label = Болдырмау +pdfjs-views-manager-status-done-button-label = Дайын +pdfjs-views-manager-status-close-button = + .title = Жабу +pdfjs-views-manager-status-close-button-label = Жабу +pdfjs-views-manager-paste-button-label = Кірістіру +pdfjs-views-manager-paste-button-before = + .title = Бірінші беттің алдына кірістіру +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = { $page } бетінен кейін кірістіру +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = ЖАҢА +pdfjs-views-manager-waiting-for-file = Файл жүктеп салынуда… +pdfjs-toggle-views-manager-button1 = + .title = Беттерді басқару + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Сақталған қолтаңбаны өшіру +pdfjs-editor-delete-signature-button-label1 = Сақталған қолтаңбаны өшіру + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Сипаттаманы түзету + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Сипаттаманы түзету diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/km/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/km/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/km/viewer.ftl 2026-01-20 14:08:39.374689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/km/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -71,24 +71,12 @@ pdfjs-document-properties-button-label = លក្ខណ​សម្បត្តិ​ឯកសារ… pdfjs-document-properties-file-name = ឈ្មោះ​ឯកសារ៖ pdfjs-document-properties-file-size = ទំហំ​ឯកសារ៖ -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } បៃ) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } បៃ) pdfjs-document-properties-title = ចំណងជើង៖ pdfjs-document-properties-author = អ្នក​និពន្ធ៖ pdfjs-document-properties-subject = ប្រធានបទ៖ pdfjs-document-properties-keywords = ពាក្យ​គន្លឹះ៖ pdfjs-document-properties-creation-date = កាលបរិច្ឆេទ​បង្កើត៖ pdfjs-document-properties-modification-date = កាលបរិច្ឆេទ​កែប្រែ៖ -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = អ្នក​បង្កើត៖ pdfjs-document-properties-producer = កម្មវិធី​បង្កើត PDF ៖ pdfjs-document-properties-version = កំណែ PDF ៖ @@ -183,9 +171,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = មាន​កំហុស​បាន​កើតឡើង​ពេល​កំពុង​ផ្ទុក PDF ។ @@ -214,10 +199,44 @@ ## Editing +pdfjs-editor-highlight-button = + .title = រំលេច +pdfjs-editor-highlight-button-label = រំលេច +pdfjs-highlight-floating-button-label = រំលេច ## Alt-text dialog +pdfjs-editor-alt-text-cancel-button = បោះបង់ + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = បង្ហាញ​ទាំងអស់ +pdfjs-editor-highlight-show-all-button = + .title = បង្ហាញ​ទាំងអស់ + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +pdfjs-editor-new-alt-text-not-now-button = មិន​មែន​ឥឡូវ + +## Image alt-text settings + +pdfjs-editor-alt-text-settings-delete-model-button = លុប + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = បោះបង់ + +## Edit a comment dialog + +pdfjs-editor-edit-comment-dialog-cancel-button = បោះបង់ -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... +pdfjs-views-manager-pages-status-delete-button-label = លុប diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/kn/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/kn/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/kn/viewer.ftl 2026-01-20 14:08:39.374689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/kn/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -71,24 +71,12 @@ pdfjs-document-properties-button-label = ಡಾಕ್ಯುಮೆಂಟ್‌ ಗುಣಗಳು... pdfjs-document-properties-file-name = ಕಡತದ ಹೆಸರು: pdfjs-document-properties-file-size = ಕಡತದ ಗಾತ್ರ: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } ಬೈಟ್‍ಗಳು) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } ಬೈಟ್‍ಗಳು) pdfjs-document-properties-title = ಶೀರ್ಷಿಕೆ: pdfjs-document-properties-author = ಕರ್ತೃ: pdfjs-document-properties-subject = ವಿಷಯ: pdfjs-document-properties-keywords = ಮುಖ್ಯಪದಗಳು: pdfjs-document-properties-creation-date = ರಚಿಸಿದ ದಿನಾಂಕ: pdfjs-document-properties-modification-date = ಮಾರ್ಪಡಿಸಲಾದ ದಿನಾಂಕ: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = ರಚಿಸಿದವರು: pdfjs-document-properties-producer = PDF ಉತ್ಪಾದಕ: pdfjs-document-properties-version = PDF ಆವೃತ್ತಿ: @@ -97,14 +85,6 @@ pdfjs-document-properties-page-size-orientation-portrait = ಭಾವಚಿತ್ರ pdfjs-document-properties-page-size-orientation-landscape = ಪ್ರಕೃತಿ ಚಿತ್ರ -## Variables: -## $width (Number) - the width of the (current) page -## $height (Number) - the height of the (current) page -## $unit (String) - the unit of measurement of the (current) page -## $name (String) - the name of the (current) page -## $orientation (String) - the orientation of the (current) page - - ## pdfjs-document-properties-close-button = ಮುಚ್ಚು @@ -173,9 +153,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = PDF ಅನ್ನು ಲೋಡ್ ಮಾಡುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ. @@ -201,13 +178,3 @@ pdfjs-password-ok-button = OK pdfjs-password-cancel-button = ರದ್ದು ಮಾಡು pdfjs-web-fonts-disabled = ಜಾಲ ಅಕ್ಷರಶೈಲಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ: ಅಡಕಗೊಳಿಸಿದ PDF ಅಕ್ಷರಶೈಲಿಗಳನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ko/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ko/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ko/viewer.ftl 2026-01-20 14:08:39.374689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ko/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -49,14 +49,8 @@ # Length of the translation matters since we are in a mobile context, with limited screen estate. pdfjs-download-button-label = 다운로드 pdfjs-bookmark-button = - .title = 현재 페이지 (현재 페이지에서 URL 보기) + .title = 현재 페이지 (URL 보기) pdfjs-bookmark-button-label = 현재 페이지 -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = 앱에서 열기 -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = 앱에서 열기 ## Secondary toolbar and context menu @@ -91,8 +85,8 @@ .title = 가로 스크롤 사용 pdfjs-scroll-horizontal-button-label = 가로 스크롤 pdfjs-scroll-wrapped-button = - .title = 래핑(자동 줄 바꿈) 스크롤 사용 -pdfjs-scroll-wrapped-button-label = 래핑 스크롤 + .title = 자동 줄바꿈 스크롤 사용 +pdfjs-scroll-wrapped-button-label = 자동 줄바꿈 스크롤 pdfjs-spread-none-button = .title = 한 페이지 보기 pdfjs-spread-none-button-label = 펼침 없음 @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = 파일 이름: pdfjs-document-properties-file-size = 파일 크기: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b }바이트) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b }바이트) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } 바이트) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } 바이트) pdfjs-document-properties-title = 제목: pdfjs-document-properties-author = 작성자: pdfjs-document-properties-subject = 주제: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = 작성 날짜: pdfjs-document-properties-modification-date = 수정 날짜: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = 작성 프로그램: pdfjs-document-properties-producer = PDF 변환 소프트웨어: pdfjs-document-properties-version = PDF 버전: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = { $page } 페이지 미리보기 +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = { $page } 페이지 선택 +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = { $page } / { $total } 페이지 ## Find panel button title and messages @@ -262,10 +264,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date } { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -273,6 +271,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } 주석] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -286,9 +287,13 @@ pdfjs-editor-free-text-button = .title = 텍스트 +pdfjs-editor-color-picker-free-text-input = + .title = 텍스트 색상 변경 pdfjs-editor-free-text-button-label = 텍스트 pdfjs-editor-ink-button = .title = 그리기 +pdfjs-editor-color-picker-ink-input = + .title = 그리기 색상 변경 pdfjs-editor-ink-button-label = 그리기 pdfjs-editor-stamp-button = .title = 이미지 추가 또는 편집 @@ -296,12 +301,37 @@ pdfjs-editor-highlight-button = .title = 강조 표시 pdfjs-editor-highlight-button-label = 강조 표시 -pdfjs-highlight-floating-button = - .title = 강조 표시 pdfjs-highlight-floating-button1 = .title = 강조 표시 .aria-label = 강조 표시 pdfjs-highlight-floating-button-label = 강조 표시 +pdfjs-comment-floating-button = + .title = 주석 + .aria-label = 주석 +pdfjs-comment-floating-button-label = 주석 +pdfjs-editor-comment-button = + .title = 주석 + .aria-label = 주석 +pdfjs-editor-comment-button-label = 주석 +pdfjs-editor-signature-button = + .title = 서명 추가 +pdfjs-editor-signature-button-label = 서명 추가 + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = 강조 표시 편집기 +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = 그리기 편집기 +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = 서명 편집기: { $description } +pdfjs-editor-stamp-editor = + .aria-label = 이미지 편집기 ## Remove button for the various kind of editor. @@ -313,6 +343,8 @@ .title = 이미지 제거 pdfjs-editor-remove-highlight-button = .title = 강조 표시 제거 +pdfjs-editor-remove-signature-button = + .title = 서명 제거 ## @@ -329,19 +361,37 @@ pdfjs-editor-free-highlight-thickness-input = 두께 pdfjs-editor-free-highlight-thickness-title = .title = 텍스트 이외의 항목을 강조 표시할 때 두께 변경 -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = 서명 제어 및 저장된 서명 +pdfjs-editor-signature-add-signature-button = + .title = 새 서명 추가 +pdfjs-editor-signature-add-signature-button-label = 새 서명 추가 +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = 저장된 서명: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = 텍스트 편집기 -pdfjs-free-text-default-content = 입력하세요… -pdfjs-ink = - .aria-label = 그리기 편집기 -pdfjs-ink-canvas = - .aria-label = 사용자 생성 이미지 + .default-content = 입력하세요… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = 주석 +pdfjs-editor-comments-sidebar-close-button = + .title = 사이드바 닫기 + .aria-label = 사이드바 닫기 +pdfjs-editor-comments-sidebar-close-button-label = 사이드바 닫기 +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = 눈에 띄는 내용이 있나요? 해당 부분을 강조 표시하고 주석을 남겨주세요. +pdfjs-editor-comments-sidebar-no-comments-link = 더 알아보기 ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = 대체 텍스트 -pdfjs-editor-alt-text-edit-button-label = 대체 텍스트 편집 +pdfjs-editor-alt-text-edit-button = + .aria-label = 대체 텍스트 편집 pdfjs-editor-alt-text-dialog-label = 옵션을 선택하세요 pdfjs-editor-alt-text-dialog-description = 대체 텍스트는 사람들이 이미지를 볼 수 없거나 이미지가 로드되지 않을 때 도움이 됩니다. pdfjs-editor-alt-text-add-description-label = 설명 추가 @@ -354,18 +404,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = 예를 들어, “한 청년이 식탁에 앉아 식사를 하고 있습니다.” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = 대체 텍스트 ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = 왼쪽 위 — 크기 조정 -pdfjs-editor-resizer-label-top-middle = 가운데 위 - 크기 조정 -pdfjs-editor-resizer-label-top-right = 오른쪽 위 — 크기 조정 -pdfjs-editor-resizer-label-middle-right = 오른쪽 가운데 — 크기 조정 -pdfjs-editor-resizer-label-bottom-right = 오른쪽 아래 - 크기 조정 -pdfjs-editor-resizer-label-bottom-middle = 가운데 아래 — 크기 조정 -pdfjs-editor-resizer-label-bottom-left = 왼쪽 아래 - 크기 조정 -pdfjs-editor-resizer-label-middle-left = 왼쪽 가운데 — 크기 조정 +pdfjs-editor-resizer-top-left = + .aria-label = 왼쪽 위 — 크기 조정 +pdfjs-editor-resizer-top-middle = + .aria-label = 가운데 위 - 크기 조정 +pdfjs-editor-resizer-top-right = + .aria-label = 오른쪽 위 — 크기 조정 +pdfjs-editor-resizer-middle-right = + .aria-label = 오른쪽 가운데 — 크기 조정 +pdfjs-editor-resizer-bottom-right = + .aria-label = 오른쪽 아래 - 크기 조정 +pdfjs-editor-resizer-bottom-middle = + .aria-label = 가운데 아래 — 크기 조정 +pdfjs-editor-resizer-bottom-left = + .aria-label = 왼쪽 아래 - 크기 조정 +pdfjs-editor-resizer-middle-left = + .aria-label = 왼쪽 가운데 — 크기 조정 ## Color picker @@ -392,3 +453,263 @@ pdfjs-editor-highlight-show-all-button-label = 모두 보기 pdfjs-editor-highlight-show-all-button = .title = 모두 보기 + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = 대체 텍스트 (이미지 설명) 편집 +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = 대체 텍스트 (이미지 설명) 추가 +pdfjs-editor-new-alt-text-textarea = + .placeholder = 여기에 설명을 작성하세요… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = 이미지가 보이지 않거나 이미지가 로딩되지 않는 경우를 위한 간단한 설명입니다. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = 이 대체 텍스트는 자동으로 생성되었으므로 정확하지 않을 수 있습니다. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 더 알아보기 +pdfjs-editor-new-alt-text-create-automatically-button-label = 자동으로 대체 텍스트 생성 +pdfjs-editor-new-alt-text-not-now-button = 나중에 +pdfjs-editor-new-alt-text-error-title = 대체 텍스트를 자동으로 생성할 수 없습니다. +pdfjs-editor-new-alt-text-error-description = 대체 텍스트를 직접 작성하거나 나중에 다시 시도하세요. +pdfjs-editor-new-alt-text-error-close-button = 닫기 +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = 대체 텍스트 AI 모델 다운로드 중 ({ $downloadedSize } / { $totalSize } MB) + .aria-valuetext = 대체 텍스트 AI 모델 다운로드 중 ({ $downloadedSize } / { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = 대체 텍스트 추가됨 +pdfjs-editor-new-alt-text-added-button-label = 대체 텍스트 추가됨 +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = 대체 텍스트 누락 +pdfjs-editor-new-alt-text-missing-button-label = 대체 텍스트 누락 +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = 대체 텍스트 검토 +pdfjs-editor-new-alt-text-to-review-button-label = 대체 텍스트 검토 +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 자동으로 생성됨: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = 이미지 대체 텍스트 설정 +pdfjs-image-alt-text-settings-button-label = 이미지 대체 텍스트 설정 +pdfjs-editor-alt-text-settings-dialog-label = 이미지 대체 텍스트 설정 +pdfjs-editor-alt-text-settings-automatic-title = 자동 대체 텍스트 +pdfjs-editor-alt-text-settings-create-model-button-label = 자동으로 대체 텍스트 생성 +pdfjs-editor-alt-text-settings-create-model-description = 이미지가 보이지 않거나 이미지가 로딩되지 않을 때 도움이 되는 설명을 제안합니다. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = 대체 텍스트 AI 모델 ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = 사용자의 장치에서 로컬로 실행되므로 데이터가 비공개로 유지됩니다. 자동 대체 텍스트에 필요합니다. +pdfjs-editor-alt-text-settings-delete-model-button = 삭제 +pdfjs-editor-alt-text-settings-download-model-button = 다운로드 +pdfjs-editor-alt-text-settings-downloading-model-button = 다운로드 중… +pdfjs-editor-alt-text-settings-editor-title = 대체 텍스트 편집기 +pdfjs-editor-alt-text-settings-show-dialog-button-label = 이미지 추가 시 바로 대체 텍스트 편집기 표시 +pdfjs-editor-alt-text-settings-show-dialog-description = 모든 이미지에 대체 텍스트가 있는지 확인하는 데 도움이 됩니다. +pdfjs-editor-alt-text-settings-close-button = 닫기 + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = 강조 표시 추가됨 +pdfjs-editor-freetext-added-alert = 텍스트 추가됨 +pdfjs-editor-ink-added-alert = 그리기 추가됨 +pdfjs-editor-stamp-added-alert = 이미지 추가됨 +pdfjs-editor-signature-added-alert = 서명 추가됨 + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = 강조 표시 제거됨 +pdfjs-editor-undo-bar-message-freetext = 텍스트 제거됨 +pdfjs-editor-undo-bar-message-ink = 그리기 제거됨 +pdfjs-editor-undo-bar-message-stamp = 이미지 제거됨 +pdfjs-editor-undo-bar-message-signature = 서명 제거됨 +pdfjs-editor-undo-bar-message-comment = 주석 제거됨 +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = 주석 { $count }개 제거됨 +pdfjs-editor-undo-bar-undo-button = + .title = 실행 취소 +pdfjs-editor-undo-bar-undo-button-label = 실행 취소 +pdfjs-editor-undo-bar-close-button = + .title = 닫기 +pdfjs-editor-undo-bar-close-button-label = 닫기 + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = 이 모달로 PDF 문서에 추가 할 서명을 만들 수 있습니다. 사용자는 이름(대체 텍스트 역할도 함)을 편집하고, 반복해 사용할 수 있도록 서명을 저장할 수도 있습니다. +pdfjs-editor-add-signature-dialog-title = 서명 추가 + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = 입력 + .title = 입력 +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = 그리기 + .title = 그리기 +pdfjs-editor-add-signature-image-button = 이미지 + .title = 이미지 + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = 서명 입력 + .placeholder = 서명 입력 +pdfjs-editor-add-signature-draw-placeholder = 서명 그리기 +pdfjs-editor-add-signature-draw-thickness-range-label = 두께 +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = 그리기 두께: { $thickness } +pdfjs-editor-add-signature-image-placeholder = 이미지 파일을 여기에 끌어서 놓으세요 +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] 또는 이미지 파일 찾아보기 + *[other] 또는 이미지 파일 찾아보기 + } + +## Controls + +pdfjs-editor-add-signature-description-label = 설명 (대체 텍스트) +pdfjs-editor-add-signature-description-input = + .title = 설명 (대체 텍스트) +pdfjs-editor-add-signature-description-default-when-drawing = 서명 +pdfjs-editor-add-signature-clear-button-label = 서명 지우기 +pdfjs-editor-add-signature-clear-button = + .title = 서명 지우기 +pdfjs-editor-add-signature-save-checkbox = 서명 저장 +pdfjs-editor-add-signature-save-warning-message = 저장된 서명의 한계에 도달했습니다. 더 저장하려면 하나를 제거하세요. +pdfjs-editor-add-signature-image-upload-error-title = 이미지를 업로드할 수 없음 +pdfjs-editor-add-signature-image-upload-error-description = 네트워크 연결을 확인하거나 다른 이미지로 시도하세요. +pdfjs-editor-add-signature-image-no-data-error-title = 이 이미지를 서명으로 변환할 수 없음 +pdfjs-editor-add-signature-image-no-data-error-description = 다른 이미지를 업로드 해 주세요. +pdfjs-editor-add-signature-error-close-button = 닫기 + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = 취소 +pdfjs-editor-add-signature-add-button = 추가 +pdfjs-editor-edit-signature-update-button = 업데이트 + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = 주석 편집 +pdfjs-editor-edit-comment-popup-button = + .title = 주석 편집 +pdfjs-editor-delete-comment-popup-button-label = 주석 제거 +pdfjs-editor-delete-comment-popup-button = + .title = 주석 제거 +pdfjs-show-comment-button = + .title = 주석 보기 + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = 주석 편집 +pdfjs-editor-edit-comment-dialog-save-button-when-editing = 업데이트 +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = 주석 추가 +pdfjs-editor-edit-comment-dialog-save-button-when-adding = 추가 +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = 입력하세요… +pdfjs-editor-edit-comment-dialog-cancel-button = 취소 + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = 주석 추가 + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = 사이드바 표시/숨기기 (문서에 미리보기/아웃라인/첨부파일/레이어 포함됨) +pdfjs-toggle-views-manager-button1-label = 페이지 관리 +pdfjs-views-manager-sidebar = + .aria-label = 사이드바 +pdfjs-views-manager-sidebar-resizer = + .aria-label = 사이드바 크기 조정 +pdfjs-views-manager-view-selector-button = + .title = 보기 +pdfjs-views-manager-view-selector-button-label = 보기 +pdfjs-views-manager-pages-title = 페이지 +pdfjs-views-manager-outlines-title1 = 문서 아웃라인 + .title = 문서 아웃라인 (더블 클릭해서 모든 항목 펼치기/접기) +pdfjs-views-manager-attachments-title = 첨부파일 +pdfjs-views-manager-layers-title1 = 레이어 + .title = 레이어 (더블 클릭해서 모든 레이어를 기본 상태로 재설정) +pdfjs-views-manager-pages-option-label = 페이지 +pdfjs-views-manager-outlines-option-label = 문서 아웃라인 +pdfjs-views-manager-attachments-option-label = 첨부파일 +pdfjs-views-manager-layers-option-label = 레이어 +pdfjs-views-manager-add-file-button = + .title = 파일 추가 +pdfjs-views-manager-add-file-button-label = 파일 추가 +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = { $count }개 선택됨 +pdfjs-views-manager-pages-status-none-action-label = 페이지 선택 +pdfjs-views-manager-pages-status-action-button-label = 관리 +pdfjs-views-manager-pages-status-copy-button-label = 복사 +pdfjs-views-manager-pages-status-cut-button-label = 잘라내기 +pdfjs-views-manager-pages-status-delete-button-label = 삭제 +pdfjs-views-manager-pages-status-export-selected-button-label = 선택한 페이지 내보내기… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = { $count }개 페이지 잘림 +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = { $count }개 페이지 복사됨 +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = { $count }개 페이지 삭제됨 +pdfjs-views-manager-pages-status-waiting-ready-label = 파일 준비 중… +pdfjs-views-manager-pages-status-waiting-uploading-label = 파일 업로드 중… +pdfjs-views-manager-status-warning-cut-label = 잘라낼 수 없습니다. 페이지를 새로 고침하고 다시 시도하세요. +pdfjs-views-manager-status-warning-copy-label = 복사할 수 없습니다. 페이지를 새로 고침하고 다시 시도하세요. +pdfjs-views-manager-status-warning-delete-label = 삭제할 수 없습니다. 페이지를 새로 고침하고 다시 시도하세요. +pdfjs-views-manager-status-warning-save-label = 저장할 수 없습니다. 페이지를 새로 고침하고 다시 시도하세요. +pdfjs-views-manager-status-undo-button-label = 실행 취소 +pdfjs-views-manager-status-done-button-label = 완료 +pdfjs-views-manager-status-close-button = + .title = 닫기 +pdfjs-views-manager-status-close-button-label = 닫기 +pdfjs-views-manager-paste-button-label = 붙여넣기 +pdfjs-views-manager-paste-button-before = + .title = 첫 페이지 앞에 붙여넣기 +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = { $page } 페이지 뒤에 붙여넣기 +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = 신규 +pdfjs-views-manager-waiting-for-file = 파일 업로드 중… +pdfjs-toggle-views-manager-button1 = + .title = 페이지 관리 + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = 저장된 서명 제거 +pdfjs-editor-delete-signature-button-label1 = 저장된 서명 제거 + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = 설명 편집 + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = 설명 편집 diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/lij/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/lij/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/lij/viewer.ftl 2026-01-20 14:08:39.374689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/lij/viewer.ftl 2026-07-09 07:12:41.856801500 +0000 @@ -89,24 +89,12 @@ pdfjs-document-properties-button-label = Propietæ do documento… pdfjs-document-properties-file-name = Nomme schedaio: pdfjs-document-properties-file-size = Dimenscion schedaio: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } byte) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byte) pdfjs-document-properties-title = Titolo: pdfjs-document-properties-author = Aoto: pdfjs-document-properties-subject = Ogetto: pdfjs-document-properties-keywords = Paròlle ciave: pdfjs-document-properties-creation-date = Dæta creaçion: pdfjs-document-properties-modification-date = Dæta cangiamento: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Aotô originale: pdfjs-document-properties-producer = Produtô PDF: pdfjs-document-properties-version = Verscion PDF: @@ -207,9 +195,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = S'é verificou 'n'erô itno caregamento do PDF. @@ -235,13 +220,3 @@ pdfjs-password-ok-button = Va ben pdfjs-password-cancel-button = Anulla pdfjs-web-fonts-disabled = I font do web en dizativæ: inposcibile adeuviâ i carateri do PDF. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/lo/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/lo/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/lo/viewer.ftl 2026-01-20 14:08:39.375689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/lo/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -45,12 +45,6 @@ pdfjs-bookmark-button = .title = ໜ້າປັດຈຸບັນ (ເບິ່ງ URL ຈາກໜ້າປັດຈຸບັນ) pdfjs-bookmark-button-label = ຫນ້າ​ປັດ​ຈຸ​ບັນ -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = ເປີດໃນ App -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = ເປີດໃນ App ## Secondary toolbar and context menu @@ -104,24 +98,12 @@ pdfjs-document-properties-button-label = ຄຸນສົມບັດເອກະສານ... pdfjs-document-properties-file-name = ຊື່ໄຟລ໌: pdfjs-document-properties-file-size = ຂະຫນາດໄຟລ໌: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } ໄບຕ໌) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } ໄບຕ໌) pdfjs-document-properties-title = ຫົວຂໍ້: pdfjs-document-properties-author = ຜູ້ຂຽນ: pdfjs-document-properties-subject = ຫົວຂໍ້: pdfjs-document-properties-keywords = ຄໍາທີ່ຕ້ອງການຄົ້ນຫາ: pdfjs-document-properties-creation-date = ວັນທີສ້າງ: pdfjs-document-properties-modification-date = ວັນທີແກ້ໄຂ: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = ຜູ້ສ້າງ: pdfjs-document-properties-producer = ຜູ້ຜະລິດ PDF: pdfjs-document-properties-version = ເວີຊັ່ນ PDF: @@ -249,10 +231,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -277,23 +255,12 @@ pdfjs-editor-ink-button = .title = ແຕ້ມ pdfjs-editor-ink-button-label = ແຕ້ມ + +## + # Editor Parameters pdfjs-editor-free-text-color-input = ສີ pdfjs-editor-free-text-size-input = ຂະຫນາດ pdfjs-editor-ink-color-input = ສີ pdfjs-editor-ink-thickness-input = ຄວາມຫນາ pdfjs-editor-ink-opacity-input = ຄວາມໂປ່ງໃສ -pdfjs-free-text = - .aria-label = ຕົວແກ້ໄຂຂໍ້ຄວາມ -pdfjs-free-text-default-content = ເລີ່ມພິມ... -pdfjs-ink = - .aria-label = ຕົວແກ້ໄຂຮູບແຕ້ມ -pdfjs-ink-canvas = - .aria-label = ຮູບພາບທີ່ຜູ້ໃຊ້ສ້າງ - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/locale.json webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/locale.json --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/locale.json 2026-01-20 14:08:39.375689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/locale.json 2026-07-09 07:12:41.860801500 +0000 @@ -1 +1 @@ -{"ach":"ach/viewer.ftl","af":"af/viewer.ftl","an":"an/viewer.ftl","ar":"ar/viewer.ftl","ast":"ast/viewer.ftl","az":"az/viewer.ftl","be":"be/viewer.ftl","bg":"bg/viewer.ftl","bn":"bn/viewer.ftl","bo":"bo/viewer.ftl","br":"br/viewer.ftl","brx":"brx/viewer.ftl","bs":"bs/viewer.ftl","ca":"ca/viewer.ftl","cak":"cak/viewer.ftl","ckb":"ckb/viewer.ftl","cs":"cs/viewer.ftl","cy":"cy/viewer.ftl","da":"da/viewer.ftl","de":"de/viewer.ftl","dsb":"dsb/viewer.ftl","el":"el/viewer.ftl","en-ca":"en-CA/viewer.ftl","en-gb":"en-GB/viewer.ftl","en-us":"en-US/viewer.ftl","eo":"eo/viewer.ftl","es-ar":"es-AR/viewer.ftl","es-cl":"es-CL/viewer.ftl","es-es":"es-ES/viewer.ftl","es-mx":"es-MX/viewer.ftl","et":"et/viewer.ftl","eu":"eu/viewer.ftl","fa":"fa/viewer.ftl","ff":"ff/viewer.ftl","fi":"fi/viewer.ftl","fr":"fr/viewer.ftl","fur":"fur/viewer.ftl","fy-nl":"fy-NL/viewer.ftl","ga-ie":"ga-IE/viewer.ftl","gd":"gd/viewer.ftl","gl":"gl/viewer.ftl","gn":"gn/viewer.ftl","gu-in":"gu-IN/viewer.ftl","he":"he/viewer.ftl","hi-in":"hi-IN/viewer.ftl","hr":"hr/viewer.ftl","hsb":"hsb/viewer.ftl","hu":"hu/viewer.ftl","hy-am":"hy-AM/viewer.ftl","hye":"hye/viewer.ftl","ia":"ia/viewer.ftl","id":"id/viewer.ftl","is":"is/viewer.ftl","it":"it/viewer.ftl","ja":"ja/viewer.ftl","ka":"ka/viewer.ftl","kab":"kab/viewer.ftl","kk":"kk/viewer.ftl","km":"km/viewer.ftl","kn":"kn/viewer.ftl","ko":"ko/viewer.ftl","lij":"lij/viewer.ftl","lo":"lo/viewer.ftl","lt":"lt/viewer.ftl","ltg":"ltg/viewer.ftl","lv":"lv/viewer.ftl","meh":"meh/viewer.ftl","mk":"mk/viewer.ftl","mr":"mr/viewer.ftl","ms":"ms/viewer.ftl","my":"my/viewer.ftl","nb-no":"nb-NO/viewer.ftl","ne-np":"ne-NP/viewer.ftl","nl":"nl/viewer.ftl","nn-no":"nn-NO/viewer.ftl","oc":"oc/viewer.ftl","pa-in":"pa-IN/viewer.ftl","pl":"pl/viewer.ftl","pt-br":"pt-BR/viewer.ftl","pt-pt":"pt-PT/viewer.ftl","rm":"rm/viewer.ftl","ro":"ro/viewer.ftl","ru":"ru/viewer.ftl","sat":"sat/viewer.ftl","sc":"sc/viewer.ftl","scn":"scn/viewer.ftl","sco":"sco/viewer.ftl","si":"si/viewer.ftl","sk":"sk/viewer.ftl","skr":"skr/viewer.ftl","sl":"sl/viewer.ftl","son":"son/viewer.ftl","sq":"sq/viewer.ftl","sr":"sr/viewer.ftl","sv-se":"sv-SE/viewer.ftl","szl":"szl/viewer.ftl","ta":"ta/viewer.ftl","te":"te/viewer.ftl","tg":"tg/viewer.ftl","th":"th/viewer.ftl","tl":"tl/viewer.ftl","tr":"tr/viewer.ftl","trs":"trs/viewer.ftl","uk":"uk/viewer.ftl","ur":"ur/viewer.ftl","uz":"uz/viewer.ftl","vi":"vi/viewer.ftl","wo":"wo/viewer.ftl","xh":"xh/viewer.ftl","zh-cn":"zh-CN/viewer.ftl","zh-tw":"zh-TW/viewer.ftl"} \ No newline at end of file +{"ach":"ach/viewer.ftl","af":"af/viewer.ftl","an":"an/viewer.ftl","ar":"ar/viewer.ftl","ast":"ast/viewer.ftl","az":"az/viewer.ftl","be":"be/viewer.ftl","bg":"bg/viewer.ftl","bn":"bn/viewer.ftl","bo":"bo/viewer.ftl","bqi":"bqi/viewer.ftl","br":"br/viewer.ftl","brx":"brx/viewer.ftl","bs":"bs/viewer.ftl","ca":"ca/viewer.ftl","cak":"cak/viewer.ftl","ckb":"ckb/viewer.ftl","cs":"cs/viewer.ftl","cy":"cy/viewer.ftl","da":"da/viewer.ftl","de":"de/viewer.ftl","dsb":"dsb/viewer.ftl","el":"el/viewer.ftl","en-ca":"en-CA/viewer.ftl","en-gb":"en-GB/viewer.ftl","en-us":"en-US/viewer.ftl","eo":"eo/viewer.ftl","es-ar":"es-AR/viewer.ftl","es-cl":"es-CL/viewer.ftl","es-es":"es-ES/viewer.ftl","es-mx":"es-MX/viewer.ftl","et":"et/viewer.ftl","eu":"eu/viewer.ftl","fa":"fa/viewer.ftl","ff":"ff/viewer.ftl","fi":"fi/viewer.ftl","fr":"fr/viewer.ftl","fur":"fur/viewer.ftl","fy-nl":"fy-NL/viewer.ftl","ga-ie":"ga-IE/viewer.ftl","gd":"gd/viewer.ftl","gl":"gl/viewer.ftl","gn":"gn/viewer.ftl","gu-in":"gu-IN/viewer.ftl","he":"he/viewer.ftl","hi-in":"hi-IN/viewer.ftl","hr":"hr/viewer.ftl","hsb":"hsb/viewer.ftl","hu":"hu/viewer.ftl","hy-am":"hy-AM/viewer.ftl","hye":"hye/viewer.ftl","ia":"ia/viewer.ftl","id":"id/viewer.ftl","is":"is/viewer.ftl","it":"it/viewer.ftl","ja":"ja/viewer.ftl","ka":"ka/viewer.ftl","kab":"kab/viewer.ftl","kk":"kk/viewer.ftl","km":"km/viewer.ftl","kn":"kn/viewer.ftl","ko":"ko/viewer.ftl","lij":"lij/viewer.ftl","lo":"lo/viewer.ftl","lt":"lt/viewer.ftl","ltg":"ltg/viewer.ftl","lv":"lv/viewer.ftl","meh":"meh/viewer.ftl","mk":"mk/viewer.ftl","ml":"ml/viewer.ftl","mr":"mr/viewer.ftl","ms":"ms/viewer.ftl","my":"my/viewer.ftl","nb-no":"nb-NO/viewer.ftl","ne-np":"ne-NP/viewer.ftl","nl":"nl/viewer.ftl","nn-no":"nn-NO/viewer.ftl","oc":"oc/viewer.ftl","pa-in":"pa-IN/viewer.ftl","pl":"pl/viewer.ftl","pt-br":"pt-BR/viewer.ftl","pt-pt":"pt-PT/viewer.ftl","rm":"rm/viewer.ftl","ro":"ro/viewer.ftl","ru":"ru/viewer.ftl","sat":"sat/viewer.ftl","sc":"sc/viewer.ftl","scn":"scn/viewer.ftl","sco":"sco/viewer.ftl","si":"si/viewer.ftl","sk":"sk/viewer.ftl","skr":"skr/viewer.ftl","sl":"sl/viewer.ftl","son":"son/viewer.ftl","sq":"sq/viewer.ftl","sr":"sr/viewer.ftl","sv-se":"sv-SE/viewer.ftl","szl":"szl/viewer.ftl","ta":"ta/viewer.ftl","te":"te/viewer.ftl","tg":"tg/viewer.ftl","th":"th/viewer.ftl","tl":"tl/viewer.ftl","tr":"tr/viewer.ftl","trs":"trs/viewer.ftl","uk":"uk/viewer.ftl","ur":"ur/viewer.ftl","uz":"uz/viewer.ftl","vi":"vi/viewer.ftl","wo":"wo/viewer.ftl","xh":"xh/viewer.ftl","zh-cn":"zh-CN/viewer.ftl","zh-tw":"zh-TW/viewer.ftl"} \ No newline at end of file diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/lt/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/lt/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/lt/viewer.ftl 2026-01-20 14:08:39.375689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/lt/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -92,24 +92,12 @@ pdfjs-document-properties-button-label = Dokumento savybės… pdfjs-document-properties-file-name = Failo vardas: pdfjs-document-properties-file-size = Failo dydis: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } B) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } B) pdfjs-document-properties-title = Antraštė: pdfjs-document-properties-author = Autorius: pdfjs-document-properties-subject = Tema: pdfjs-document-properties-keywords = Reikšminiai žodžiai: pdfjs-document-properties-creation-date = Sukūrimo data: pdfjs-document-properties-modification-date = Modifikavimo data: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Kūrėjas: pdfjs-document-properties-producer = PDF generatorius: pdfjs-document-properties-version = PDF versija: @@ -237,10 +225,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -256,13 +240,3 @@ pdfjs-password-ok-button = Gerai pdfjs-password-cancel-button = Atsisakyti pdfjs-web-fonts-disabled = Saityno šriftai išjungti – PDF faile esančių šriftų naudoti negalima. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ltg/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ltg/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ltg/viewer.ftl 2026-01-20 14:08:39.375689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ltg/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -89,24 +89,12 @@ pdfjs-document-properties-button-label = Dokumenta īstatiejumi… pdfjs-document-properties-file-name = Faila nūsaukums: pdfjs-document-properties-file-size = Faila izmārs: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } biti) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } biti) pdfjs-document-properties-title = Nūsaukums: pdfjs-document-properties-author = Autors: pdfjs-document-properties-subject = Tema: pdfjs-document-properties-keywords = Atslāgi vuordi: pdfjs-document-properties-creation-date = Izveides datums: pdfjs-document-properties-modification-date = lobuošonys datums: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Radeituojs: pdfjs-document-properties-producer = PDF producents: pdfjs-document-properties-version = PDF verseja: @@ -206,9 +194,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = Īluodejūt PDF nūtyka klaida. @@ -234,13 +219,3 @@ pdfjs-password-ok-button = Labi pdfjs-password-cancel-button = Atceļt pdfjs-web-fonts-disabled = Šķārsteikla fonti nav aktivizāti: Navar īgult PDF fontus. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/lv/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/lv/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/lv/viewer.ftl 2026-01-20 14:08:39.376689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/lv/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -89,24 +89,12 @@ pdfjs-document-properties-button-label = Dokumenta iestatījumi… pdfjs-document-properties-file-name = Faila nosaukums: pdfjs-document-properties-file-size = Faila izmērs: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } biti) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } biti) pdfjs-document-properties-title = Nosaukums: pdfjs-document-properties-author = Autors: pdfjs-document-properties-subject = Tēma: pdfjs-document-properties-keywords = Atslēgas vārdi: pdfjs-document-properties-creation-date = Izveides datums: pdfjs-document-properties-modification-date = LAbošanas datums: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Radītājs: pdfjs-document-properties-producer = PDF producents: pdfjs-document-properties-version = PDF versija: @@ -207,9 +195,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = Ielādējot PDF notika kļūda. @@ -235,13 +220,3 @@ pdfjs-password-ok-button = Labi pdfjs-password-cancel-button = Atcelt pdfjs-web-fonts-disabled = Tīmekļa fonti nav aktivizēti: Nevar iegult PDF fontus. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/meh/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/meh/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/meh/viewer.ftl 2026-01-20 14:08:39.376689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/meh/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -11,16 +11,6 @@ .title = Nasa´a ka´nu/Nasa´a luli pdfjs-open-file-button-label = Síne -## Secondary toolbar and context menu - - -## Document properties dialog - -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } - ## Variables: ## $width (Number) - the width of the (current) page ## $height (Number) - the height of the (current) page @@ -47,41 +37,12 @@ pdfjs-findbar-button-label = Nánuku -## Thumbnails panel item (tooltip and alt text for images) - - -## Find panel button title and messages - - ## Predefined zoom values # Variables: # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - -## Loading indicator messages - - -## Annotations - -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } - ## Password pdfjs-password-cancel-button = Nkuvi-ka - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/mk/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/mk/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/mk/viewer.ftl 2026-01-20 14:08:39.376689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/mk/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -39,6 +39,18 @@ pdfjs-print-button = .title = Печатење pdfjs-print-button-label = Печати +pdfjs-save-button = + .title = Снимање +pdfjs-save-button-label = Сними +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Преземање +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Преземи +pdfjs-bookmark-button = + .title = Тековна страница (Преглед на URL од тековна страница) +pdfjs-bookmark-button-label = Тековна страница ## Secondary toolbar and context menu @@ -60,6 +72,30 @@ pdfjs-cursor-text-select-tool-button = .title = Овозможи алатка за избор на текст pdfjs-cursor-text-select-tool-button-label = Алатка за избор на текст +pdfjs-cursor-hand-tool-button = + .title = Овозможување на рачна алатка +pdfjs-cursor-hand-tool-button-label = Рачна алатка +pdfjs-scroll-page-button = + .title = Употреба на поместување на страница +pdfjs-scroll-page-button-label = Поместување на страница +pdfjs-scroll-vertical-button = + .title = Употреба на вертикално поместување +pdfjs-scroll-vertical-button-label = Вертикално поместување +pdfjs-scroll-horizontal-button = + .title = Употреба на хоризонтално поместување +pdfjs-scroll-horizontal-button-label = Хоризонтално поместување +pdfjs-scroll-wrapped-button = + .title = Употреба на последователно поместување +pdfjs-scroll-wrapped-button-label = Последователно поместување +pdfjs-spread-none-button = + .title = Не спојувај спротивни страници +pdfjs-spread-none-button-label = Без спојување +pdfjs-spread-odd-button = + .title = Спој страници почнувајќи со непарен број +pdfjs-spread-odd-button-label = Непарнo спојување +pdfjs-spread-even-button = + .title = Спој страници почнувајќи со парен број +pdfjs-spread-even-button-label = Парно спојување ## Document properties dialog @@ -69,13 +105,13 @@ pdfjs-document-properties-file-name = Име на датотека: pdfjs-document-properties-file-size = Големина на датотеката: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } КБ ({ $size_b } бајти) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } бајти) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } бајти) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } бајти) pdfjs-document-properties-title = Наслов: pdfjs-document-properties-author = Автор: pdfjs-document-properties-subject = Тема: @@ -83,10 +119,10 @@ pdfjs-document-properties-creation-date = Датум на создавање: pdfjs-document-properties-modification-date = Датум на промена: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } -pdfjs-document-properties-creator = Креатор: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +pdfjs-document-properties-creator = Автор: +pdfjs-document-properties-producer = Составувач на PDF: pdfjs-document-properties-version = Верзија на PDF: pdfjs-document-properties-page-count = Број на страници: pdfjs-document-properties-page-size = Големина на страница: @@ -97,6 +133,7 @@ pdfjs-document-properties-page-size-name-a-three = A3 pdfjs-document-properties-page-size-name-a-four = A4 pdfjs-document-properties-page-size-name-letter = Писмо +pdfjs-document-properties-page-size-name-legal = Правно ## Variables: ## $width (Number) - the width of the (current) page @@ -110,6 +147,9 @@ ## +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = Брз мрежен преглед: pdfjs-document-properties-linearized-yes = Да pdfjs-document-properties-linearized-no = Не pdfjs-document-properties-close-button = Затвори @@ -128,16 +168,28 @@ pdfjs-toggle-sidebar-button = .title = Вклучи странична лента +pdfjs-toggle-sidebar-notification-button = + .title = Вклучи странична лента (документот содржи преглед, прилози, или слоеви) pdfjs-toggle-sidebar-button-label = Вклучи странична лента -pdfjs-document-outline-button-label = Содржина на документот +pdfjs-document-outline-button = + .title = Прикажи го прегедот на документот (дво клик за да се прикажат/скријат сите елементи) +pdfjs-document-outline-button-label = Преглед на документот pdfjs-attachments-button = - .title = Прикажи додатоци + .title = Прикажување на прилози +pdfjs-attachments-button-label = Прилози +pdfjs-layers-button = + .title = Прикажи слоеви (двоклик за ресетирање на сите слоеви) +pdfjs-layers-button-label = Слоеви pdfjs-thumbs-button = - .title = Прикажување на икони -pdfjs-thumbs-button-label = Икони + .title = Прикажување на иконки +pdfjs-thumbs-button-label = Иконки +pdfjs-current-outline-item-button = + .title = Барање на тековниот елемент од прегледот +pdfjs-current-outline-item-button-label = Тековен елемент од прегледот pdfjs-findbar-button = .title = Најди во документот pdfjs-findbar-button-label = Најди +pdfjs-additional-layers = Дополнителни слоеви ## Thumbnails panel item (tooltip and alt text for images) @@ -148,12 +200,21 @@ # Variables: # $page (Number) - the page number pdfjs-thumb-page-canvas = - .aria-label = Икона од страница { $page } + .aria-label = Иконка од страница { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Изберете страница { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Страница { $page } од { $total } ## Find panel button title and messages pdfjs-find-input = - .title = Пронајди + .title = Пребарување .placeholder = Пронајди во документот… pdfjs-find-previous-button = .title = Најди ја предходната појава на фразата @@ -163,9 +224,25 @@ pdfjs-find-next-button-label = Следно pdfjs-find-highlight-checkbox = Означи сѐ pdfjs-find-match-case-checkbox-label = Токму така +pdfjs-find-match-diacritics-checkbox-label = Вклучи дијакритички знаци pdfjs-find-entire-word-checkbox-label = Цели зборови pdfjs-find-reached-top = Барањето стигна до почетокот на документот и почнува од крајот pdfjs-find-reached-bottom = Барањето стигна до крајот на документот и почнува од почеток +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } од { $total } совпаѓање + *[other] { $current } од { $total } совпаѓања + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Повеќе од { $limit } совпаѓање + *[other] Повеќе од { $limit } совпаѓања + } pdfjs-find-not-found = Фразата не е пронајдена ## Predefined zoom values @@ -180,6 +257,10 @@ ## PDF page +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Страница { $page } ## Loading indicator messages @@ -191,14 +272,20 @@ ## Annotations +# .alt: This is used as a tooltip. # Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } напомена] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password -pdfjs-password-label = Внесете ја лозинката за да ја отворите оваа датотека. +pdfjs-password-label = Внесете ја лозинката за да ја отворите оваа PDF датотека. pdfjs-password-invalid = Невалидна лозинка. Обидете се повторно. pdfjs-password-ok-button = Во ред pdfjs-password-cancel-button = Откажи @@ -206,10 +293,455 @@ ## Editing +pdfjs-editor-free-text-button = + .title = Текст +pdfjs-editor-color-picker-free-text-input = + .title = Промена на боја на текст +pdfjs-editor-free-text-button-label = Текст +pdfjs-editor-ink-button = + .title = Цртање +pdfjs-editor-color-picker-ink-input = + .title = Промена на боја за цртање +pdfjs-editor-ink-button-label = Цртај +pdfjs-editor-stamp-button = + .title = Додавање или уредување на слики +pdfjs-editor-stamp-button-label = Додај или уреди слики +pdfjs-editor-highlight-button = + .title = Нагласување +pdfjs-editor-highlight-button-label = Нагласи +pdfjs-highlight-floating-button1 = + .title = Нагласување + .aria-label = Нагласување +pdfjs-highlight-floating-button-label = Нагласи +pdfjs-comment-floating-button = + .title = Коментар + .aria-label = Коментар +pdfjs-comment-floating-button-label = Коментар +pdfjs-editor-comment-button = + .title = Коментар + .aria-label = Коментар +pdfjs-editor-comment-button-label = Коментар +pdfjs-editor-signature-button = + .title = Додавање на потпис +pdfjs-editor-signature-button-label = Додај потпис + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Уредувач на нагласувања +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Уредувач за цртање +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Уредувач на потпис: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Уредувач на слика + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Отстранување на цртеж +pdfjs-editor-remove-freetext-button = + .title = Отстранување на текст +pdfjs-editor-remove-stamp-button = + .title = Отстранување на слика +pdfjs-editor-remove-highlight-button = + .title = Отстранување на нагласувања +pdfjs-editor-remove-signature-button = + .title = Отстранување на потпис + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Боја +pdfjs-editor-free-text-size-input = Големина +pdfjs-editor-ink-color-input = Боја +pdfjs-editor-ink-thickness-input = Дебелина +pdfjs-editor-ink-opacity-input = Прозрачност +pdfjs-editor-stamp-add-image-button = + .title = Додавање на слика +pdfjs-editor-stamp-add-image-button-label = Додај слика +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Дебелина +pdfjs-editor-free-highlight-thickness-title = + .title = Промени ја дебелината при нагласување на елементи што не се текст +pdfjs-editor-add-signature-container = + .aria-label = Контрола на потписи и снимени потписи +pdfjs-editor-signature-add-signature-button = + .title = Додавање на нов потпис +pdfjs-editor-signature-add-signature-button-label = Додај нов потпис +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Снимен потпис: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Уредувач на текст + .default-content = Почнуи со пишување… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Коментар + *[other] Коментари + } +pdfjs-editor-comments-sidebar-close-button = + .title = Затвори ја страничната лента + .aria-label = Затвори ја страничната лента +pdfjs-editor-comments-sidebar-close-button-label = Затвори ја страничната лента +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Гледате нешто вредно за внимание? Истакнете го и напишете коментар. +pdfjs-editor-comments-sidebar-no-comments-link = Дознајте повеќе ## Alt-text dialog +pdfjs-editor-alt-text-button-label = Дополнителен текст +pdfjs-editor-alt-text-edit-button = + .aria-label = Уреди го дополнителниот текст +pdfjs-editor-alt-text-dialog-label = Изберете опција +pdfjs-editor-alt-text-dialog-description = Алтернативниот текст помага кога луѓе не можат да видат сликата или кога сликата не се вчитува +pdfjs-editor-alt-text-add-description-label = Додај опис +pdfjs-editor-alt-text-add-description-description = Додајте 1-2 реченици што го објаснуваат предметот, околината, или дејствата. +pdfjs-editor-alt-text-mark-decorative-label = Означи како декоративно +pdfjs-editor-alt-text-mark-decorative-description = Ова се користи за орнаментални слики, како граници или водени жигови. +pdfjs-editor-alt-text-cancel-button = Откажи +pdfjs-editor-alt-text-save-button = Сними +pdfjs-editor-alt-text-decorative-tooltip = Означено како декоративно +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = На пример: „Момче седнува на маса за да јаде“. +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Дополнителен текст ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. +pdfjs-editor-resizer-top-left = + .aria-label = Горен лев ќош — промени големина +pdfjs-editor-resizer-top-middle = + .aria-label = Горе на средина — промени големина +pdfjs-editor-resizer-top-right = + .aria-label = Горен десен ќош — промени големина +pdfjs-editor-resizer-middle-right = + .aria-label = Средина десно — промени големина +pdfjs-editor-resizer-bottom-right = + .aria-label = Долен десен ќош — промени големина +pdfjs-editor-resizer-bottom-middle = + .aria-label = Долу на средина — промени големина +pdfjs-editor-resizer-bottom-left = + .aria-label = Долен лев ќош — промени големина +pdfjs-editor-resizer-middle-left = + .aria-label = Средина лево — промени големина + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Боја за нагласување +pdfjs-editor-colorpicker-button = + .title = Менување на боја +pdfjs-editor-colorpicker-dropdown = + .aria-label = Избор на бои +pdfjs-editor-colorpicker-yellow = + .title = Жолта +pdfjs-editor-colorpicker-green = + .title = Зелена +pdfjs-editor-colorpicker-blue = + .title = Сина +pdfjs-editor-colorpicker-pink = + .title = Розова +pdfjs-editor-colorpicker-red = + .title = Црвена + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Прикажи сѐ +pdfjs-editor-highlight-show-all-button = + .title = Прикажи сѐ + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Уреди го алтернативниот текст (опис на слика) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Додај алтернативен текст (опис на слика) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Напиши опис… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Краток опис за луѓе кои не можат да ја видат сликата или кога сликата не се вчитува. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Овој алтернативен текст е креиран автоматски и може да биде неточен. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Дознајте повеќе +pdfjs-editor-new-alt-text-create-automatically-button-label = Креирај го алтернативниот текст автоматски +pdfjs-editor-new-alt-text-not-now-button = Не сега +pdfjs-editor-new-alt-text-error-title = Алтернатиовниот текст не може да се креира автоматски +pdfjs-editor-new-alt-text-error-description = Напишете Ваш алтернативен текст или обидете се повторно подоцна. +pdfjs-editor-new-alt-text-error-close-button = Затвори +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Преземање на алтернативен текст модел на ВИ ({ $downloadedSize } од { $totalSize } MB) + .aria-valuetext = Преземање на алтернативен текст модел на ВИ ({ $downloadedSize } од { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Алтернативниот текст е додаден +pdfjs-editor-new-alt-text-added-button-label = Алтернативниот текст е додаден +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Недостасува алтернативен текст +pdfjs-editor-new-alt-text-missing-button-label = Недостасува алтернативен текст +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Прегледај го алтернативниот текст +pdfjs-editor-new-alt-text-to-review-button-label = Прегледај го алтернативниот текст +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Креирано автоматски: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Поставки за алтернативен текст на слика +pdfjs-image-alt-text-settings-button-label = Поставки за алтернативен текст на слика +pdfjs-editor-alt-text-settings-dialog-label = Поставки за алтернативен текст на слика +pdfjs-editor-alt-text-settings-automatic-title = Автоматски алтернативен текст +pdfjs-editor-alt-text-settings-create-model-button-label = Креирај го алтернативниот текст автоматски +pdfjs-editor-alt-text-settings-create-model-description = Предлага описи за да им помогне на луѓето кои не можат да ја видат сликата или кога сликата не се вчитува. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Модел на вештачка интелигенција со алтернативен текст ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Работи локално на вашиот уред, така што вашите податоци остануваат приватни. Задолжително за автоматски алтернативен текст. +pdfjs-editor-alt-text-settings-delete-model-button = Избриши +pdfjs-editor-alt-text-settings-download-model-button = Преземи +pdfjs-editor-alt-text-settings-downloading-model-button = Се презема… +pdfjs-editor-alt-text-settings-editor-title = Уредувач на алтернативен текст +pdfjs-editor-alt-text-settings-show-dialog-button-label = Прикажи го уредувачот на алтернативен текст веднаш при додавање на слика +pdfjs-editor-alt-text-settings-show-dialog-description = Ви помага да се осигурате дека сите ваши слики имаат алтернативен текст. +pdfjs-editor-alt-text-settings-close-button = Затвори + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Нагласувањето е додадено +pdfjs-editor-freetext-added-alert = Текстот е додаден +pdfjs-editor-ink-added-alert = Цртежот е додаден +pdfjs-editor-stamp-added-alert = Сликата е додадена +pdfjs-editor-signature-added-alert = Потписот е додаден + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Нагласувањето е отстрането +pdfjs-editor-undo-bar-message-freetext = Текстот е отстранет +pdfjs-editor-undo-bar-message-ink = Цртежот е отстранет +pdfjs-editor-undo-bar-message-stamp = Сликата е отстранета +pdfjs-editor-undo-bar-message-signature = Потписот е отстранет +pdfjs-editor-undo-bar-message-comment = Коментарот е отстранет +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } напомена е отстранета + *[other] { $count } напомени е отстранета + } +pdfjs-editor-undo-bar-undo-button = + .title = Врати +pdfjs-editor-undo-bar-undo-button-label = Врати +pdfjs-editor-undo-bar-close-button = + .title = Затвори +pdfjs-editor-undo-bar-close-button-label = Затвори + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Овој прозорец му овозможува на корисникот да креира потпис за да го додаде во PDF документ. Корисникот може да го уреди името (кое исто така служи како алтернативен текст) и опционално да го зачува потписот за повторна употреба. +pdfjs-editor-add-signature-dialog-title = Додавање на потпис + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Типкај + .title = Типкај +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Цртај + .title = Цртај +pdfjs-editor-add-signature-image-button = Слика + .title = Слика + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Типкајте го Вашиот потпис + .placeholder = Типкајте го Вашиот потпис +pdfjs-editor-add-signature-draw-placeholder = Нацртајте го Вашиот потпис +pdfjs-editor-add-signature-draw-thickness-range-label = Дебелина +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Дебелина на цртежот: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Повлечете датотека тука за да ја прикачите +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Или прелистајте датотеки со слики + *[other] Или прелистајте датотеки со слики + } + +## Controls + +pdfjs-editor-add-signature-description-label = Опис (алтернативен текст) +pdfjs-editor-add-signature-description-input = + .title = Опис (алтернативен текст) +pdfjs-editor-add-signature-description-default-when-drawing = Потпис +pdfjs-editor-add-signature-clear-button-label = Избриши го потписот +pdfjs-editor-add-signature-clear-button = + .title = Бришење на потписот +pdfjs-editor-add-signature-save-checkbox = Сними го потписот +pdfjs-editor-add-signature-save-warning-message = Можете да снимите најмногу 5 потписи. Отстранете еден за да снимите нов. +pdfjs-editor-add-signature-image-upload-error-title = Сликата не може да се прикачи +pdfjs-editor-add-signature-image-upload-error-description = Проверете ја мрежната врска или обидете се со друга слика. +pdfjs-editor-add-signature-image-no-data-error-title = Оваа слика не може да се конвертира во потпис +pdfjs-editor-add-signature-image-no-data-error-description = Обидете се да прикачите друга слика. +pdfjs-editor-add-signature-error-close-button = Затвори + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Откажи +pdfjs-editor-add-signature-add-button = Додај +pdfjs-editor-edit-signature-update-button = Ажурирај + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Уреди коментар +pdfjs-editor-edit-comment-popup-button = + .title = Уреди коментар +pdfjs-editor-delete-comment-popup-button-label = Отстрани го коментарот +pdfjs-editor-delete-comment-popup-button = + .title = Отстрани го коментарот +pdfjs-show-comment-button = + .title = Прикажи го коментарот + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Уреди коментар +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Ажурирај +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Додај коментар +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Додај +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Започнете со пишување… +pdfjs-editor-edit-comment-dialog-cancel-button = Откажи + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Додај коментар + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Вклучи странична лента (документот содржи преглед, прилози, или слоеви) +pdfjs-toggle-views-manager-button1-label = Управувај со страниците +pdfjs-views-manager-sidebar = + .aria-label = Странична лента +pdfjs-views-manager-sidebar-resizer = + .aria-label = Променувач на големината на страничната лента +pdfjs-views-manager-view-selector-button = + .title = Погледи +pdfjs-views-manager-view-selector-button-label = Погледи +pdfjs-views-manager-pages-title = Страници +pdfjs-views-manager-outlines-title1 = Преглед на документот + .title = Преглед на документот (двоклик за прикажување/криење на сите ставки) +pdfjs-views-manager-attachments-title = Прилози +pdfjs-views-manager-layers-title1 = Слоеви + .title = Слоеви (двоклик за ресетирање на сите слоеви) +pdfjs-views-manager-pages-option-label = Страници +pdfjs-views-manager-outlines-option-label = Преглед на документот +pdfjs-views-manager-attachments-option-label = Прилози +pdfjs-views-manager-layers-option-label = Слоеви +pdfjs-views-manager-add-file-button = + .title = Додај датотека +pdfjs-views-manager-add-file-button-label = Додај датотека +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } избран + *[other] { $count } избрани + } +pdfjs-views-manager-pages-status-none-action-label = Избери страници +pdfjs-views-manager-pages-status-action-button-label = Управувај +pdfjs-views-manager-pages-status-copy-button-label = Копирај +pdfjs-views-manager-pages-status-cut-button-label = Исечи +pdfjs-views-manager-pages-status-delete-button-label = Избриши +pdfjs-views-manager-pages-status-export-selected-button-label = Извези ги избраните… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 исечена страница + *[other] { $count } исечени страници + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 копирана страница + *[other] { $count } копирани страници + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 избришана страница + *[other] { $count } избришани страници + } +pdfjs-views-manager-pages-status-waiting-ready-label = Вашата датотека се подготвува… +pdfjs-views-manager-pages-status-waiting-uploading-label = Датотеката се прикачува… +pdfjs-views-manager-status-warning-cut-label = Сечењето на успеа. Освежете ја страницата и обидете се повторно. +pdfjs-views-manager-status-warning-copy-label = Копирањето на успеа. Освежете ја страницата и обидете се повторно. +pdfjs-views-manager-status-warning-delete-label = Бришењето на успеа. Освежете ја страницата и обидете се повторно. +pdfjs-views-manager-status-warning-save-label = Снимањето на успеа. Освежете ја страницата и обидете се повторно. +pdfjs-views-manager-status-undo-button-label = Врати +pdfjs-views-manager-status-done-button-label = Готово +pdfjs-views-manager-status-close-button = + .title = Затвори +pdfjs-views-manager-status-close-button-label = Затвори +pdfjs-views-manager-paste-button-label = Залепи +pdfjs-views-manager-paste-button-before = + .title = Залепи пред првата страница +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Залепи по страница { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = НОВО +pdfjs-views-manager-waiting-for-file = Датотеката се прикачува… +pdfjs-toggle-views-manager-button1 = + .title = Управување со страниците + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Отстрани го зачуваниот потпис +pdfjs-editor-delete-signature-button-label1 = Отстрани го зачуваниот потпис + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Уреди опис + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Уреди опис diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ml/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ml/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ml/viewer.ftl 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ml/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -0,0 +1,509 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +## Main toolbar buttons (tooltips and alt text for images) + +pdfjs-previous-button = + .title = മുമ്പുള്ള താള്‍ +pdfjs-previous-button-label = മുമ്പു് +pdfjs-next-button = + .title = അടുത്ത താള്‍ +pdfjs-next-button-label = അടുത്തതു് +# .title: Tooltip for the pageNumber input. +pdfjs-page-input = + .title = താള്‍ +# Variables: +# $pagesCount (Number) - the total number of pages in the document +# This string follows an input field with the number of the page currently displayed. +pdfjs-of-pages = { $pagesCount } ലെ +# Variables: +# $pageNumber (Number) - the currently visible page +# $pagesCount (Number) - the total number of pages in the document +pdfjs-page-of-pages = ({ $pagesCount } ലെ { $pageNumber }) +pdfjs-zoom-out-button = + .title = ചെറുതാക്കുക +pdfjs-zoom-out-button-label = ചെറുതാക്കുക +pdfjs-zoom-in-button = + .title = വലുതാക്കുക +pdfjs-zoom-in-button-label = വലുതാക്കുക +pdfjs-zoom-select = + .title = വ്യാപ്തി മാറ്റുക +pdfjs-presentation-mode-button = + .title = പ്രസന്റേഷന്‍ രീതിയിലേക്കു് മാറ്റുക +pdfjs-presentation-mode-button-label = പ്രസന്റേഷന്‍ രീതി +pdfjs-open-file-button = + .title = ഫയല്‍ തുറക്കുക +pdfjs-open-file-button-label = തുറക്കുക +pdfjs-print-button = + .title = അച്ചടിക്കുക +pdfjs-print-button-label = അച്ചടിക്കുക +pdfjs-save-button = + .title = കരുതിവയ്ക്കുക +pdfjs-save-button-label = കരുതിവയ്ക്കുക +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = ഇറക്കിവയ്ക്കുക +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = ഇറക്കിവയ്ക്കുക +pdfjs-bookmark-button = + .title = നിലവിലെ താൾ (നിലവിലെ താളിൽ നിന്നു് യൂ.ആർ.എൽ കാണുക) +pdfjs-bookmark-button-label = നിലവിലുള്ള താൾ + +## Secondary toolbar and context menu + +pdfjs-tools-button = + .title = ഉപകരണങ്ങള്‍ +pdfjs-tools-button-label = ഉപകരണങ്ങള്‍ +pdfjs-first-page-button = + .title = ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക +pdfjs-first-page-button-label = ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക +pdfjs-last-page-button = + .title = അവസാന താളിലേയ്ക്കു് പോകുക +pdfjs-last-page-button-label = അവസാന താളിലേയ്ക്കു് പോകുക +pdfjs-page-rotate-cw-button = + .title = ഘടികാരദിശയില്‍ കറക്കുക +pdfjs-page-rotate-cw-button-label = ഘടികാരദിശയില്‍ കറക്കുക +pdfjs-page-rotate-ccw-button = + .title = ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക +pdfjs-page-rotate-ccw-button-label = ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക +pdfjs-cursor-text-select-tool-button = + .title = ടെക്സ്റ്റ് തിരഞ്ഞെടുക്കൽ ടൂള്‍ പ്രാപ്തമാക്കുക +pdfjs-cursor-text-select-tool-button-label = എഴുത്തു് തിരഞ്ഞെടുക്കൽ കരു +pdfjs-cursor-hand-tool-button = + .title = കൈക്കരു പ്രാപ്തമാക്കുക +pdfjs-cursor-hand-tool-button-label = കൈക്കരു + +## Document properties dialog + +pdfjs-document-properties-button = + .title = രേഖയുടെ വിശേഷതകള്‍... +pdfjs-document-properties-button-label = രേഖയുടെ വിശേഷതകള്‍... +pdfjs-document-properties-file-name = ഫയലിന്റെ പേര്‌: +pdfjs-document-properties-file-size = ഫയലിന്റെ വലിപ്പം:‌‌ +# Variables: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } ബൈറ്റുകൾ) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } ബൈറ്റുകൾ) +pdfjs-document-properties-title = തലക്കെട്ട്‌ +pdfjs-document-properties-author = രചയിതാവ്: +pdfjs-document-properties-subject = വിഷയം: +pdfjs-document-properties-keywords = പെരുമുരികൾ: +pdfjs-document-properties-creation-date = പൂര്‍ത്തിയാകുന്ന തീയതി: +pdfjs-document-properties-modification-date = മാറ്റം വരുത്തിയ തീയതി: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +pdfjs-document-properties-creator = സൃഷ്ടികര്‍ത്താവ്: +pdfjs-document-properties-producer = പിഡിഎഫ് പ്രൊഡ്യൂസര്‍: +pdfjs-document-properties-version = പിഡിഎഫ് പതിപ്പ്: +pdfjs-document-properties-page-count = താളിന്റെ എണ്ണം: +pdfjs-document-properties-page-size = താൾ വലുപ്പം +pdfjs-document-properties-page-size-unit-inches = ഇഞ്ചു് +pdfjs-document-properties-page-size-unit-millimeters = മില്ലീമീറ്റർ +pdfjs-document-properties-page-size-orientation-portrait = ഛായപടം രീതിയില്‍ +pdfjs-document-properties-page-size-orientation-landscape = ഭൂദൃശ്യത്തിന്റെ ആകൃതിയില്‍ +pdfjs-document-properties-page-size-name-a-three = ആ 3 +pdfjs-document-properties-page-size-name-a-four = ആ 4 +pdfjs-document-properties-page-size-name-letter = കത്തു് +pdfjs-document-properties-page-size-name-legal = നിയമപരം + +## Variables: +## $width (Number) - the width of the (current) page +## $height (Number) - the height of the (current) page +## $unit (String) - the unit of measurement of the (current) page +## $name (String) - the name of the (current) page +## $orientation (String) - the orientation of the (current) page + +pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation }) +pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name },{ $orientation }) + +## + +# The linearization status of the document; usually called "Fast Web View" in +# English locales of Adobe software. +pdfjs-document-properties-linearized = വിരവോള ഗോളാന്തരക്കാഴ്ച : +pdfjs-document-properties-linearized-yes = അതെ +pdfjs-document-properties-linearized-no = ഇല്ല +pdfjs-document-properties-close-button = അടയ്ക്കുക + +## Print + +pdfjs-print-progress-message = അച്ചടിപ്പിനു് പ്രമാണം ഒരുക്കുന്നു... +# Variables: +# $progress (Number) - percent value +pdfjs-print-progress-percent = { $progress }% +pdfjs-print-progress-close-button = റദ്ദാക്കുക +pdfjs-printing-not-supported = മുന്നറിയിപ്പു്: ഈ അന്വേഷിയന്ത്രമിൽ അച്ചടിപ്പു് മുഴുവനായി പിന്തുണയ്ക്കാരില്ല. +pdfjs-printing-not-ready = മുന്നറിയിപ്പു്: അച്ചടിക്കാനായി ഈ പിഡിഎഫ മൊത്തം ലഭ്യമാക്കിയിട്ടില്ല + +## Tooltips and alt text for side panel toolbar buttons + +pdfjs-toggle-sidebar-button = + .title = അണിവക്കം ടോഗിൾ ചെയ്യുക +pdfjs-toggle-sidebar-button-label = അണിവക്കം ടോഗിൾ ചെയ്യുക +pdfjs-document-outline-button = + .title = ഡോക്യുമെന്റിന്റെ ബാഹ്യരേഖ കാണിക്കുക (എല്ലാ ഇനങ്ങളും വിപുലീകരിക്കാനും ചുരുക്കാനും ഇരട്ട ക്ലിക്കുചെയ്യുക) +pdfjs-document-outline-button-label = രേഖയുടെ ഔട്ട്ലൈന്‍ +pdfjs-attachments-button = + .title = അറ്റാച്മെന്റുകള്‍ കാണിയ്ക്കുക +pdfjs-attachments-button-label = അറ്റാച്മെന്റുകള്‍ +pdfjs-layers-button-label = പാളികൾ +pdfjs-thumbs-button = + .title = തംബ്നെയിലുകള്‍ കാണിയ്ക്കുക +pdfjs-thumbs-button-label = തംബ്നെയിലുകള്‍ +pdfjs-findbar-button = + .title = രേഖയില്‍ കണ്ടുപിടിയ്ക്കുക +pdfjs-findbar-button-label = കണ്ടെത്തുക +pdfjs-additional-layers = കൂടാത്ത പാളികൾ + +## Thumbnails panel item (tooltip and alt text for images) + +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-title = + .title = താള്‍ { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-canvas = + .aria-label = { $page } താളിനുള്ള തംബ്നെയില്‍ + +## Find panel button title and messages + +pdfjs-find-input = + .title = കണ്ടെത്തുക + .placeholder = ഡോക്യുമെന്റില്‍ കണ്ടെത്തുക… +pdfjs-find-previous-button = + .title = വാചകം ഇതിനു മുന്‍പ്‌ ആവര്‍ത്തിച്ചത്‌ കണ്ടെത്തുക +pdfjs-find-previous-button-label = മുമ്പു് +pdfjs-find-next-button = + .title = വാചകം വീണ്ടും ആവര്‍ത്തിക്കുന്നത്‌ കണ്ടെത്തുക +pdfjs-find-next-button-label = അടുത്തതു് +pdfjs-find-highlight-checkbox = എല്ലാം എടുത്തുകാണിയ്ക്കുക +pdfjs-find-match-case-checkbox-label = അക്ഷരങ്ങള്‍ ഒത്തുനോക്കുക +pdfjs-find-entire-word-checkbox-label = മുഴുവൻ വാക്കുകൾ +pdfjs-find-reached-top = രേഖയുടെ മുകളില്‍ എത്തിയിരിക്കുന്നു, താഴെ നിന്നും തുടരുന്നു +pdfjs-find-reached-bottom = രേഖയുടെ അവസാനം വരെ എത്തിയിരിക്കുന്നു, മുകളില്‍ നിന്നും തുടരുന്നു +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } / { $total } പൊരുത്തങ്ങള്‍ + *[other] { $current } / { $total } പൊരുത്തങ്ങള്‍ + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] { $limit } പൊരുത്തങ്ങളില്‍ കൂടുതല്‍ + *[other] { $limit } പൊരുത്തങ്ങളില്‍ കൂടുതല്‍ + } +pdfjs-find-not-found = വാചകം കണ്ടെത്താനായില്ല + +## Predefined zoom values + +pdfjs-page-scale-width = താളിന്റെ വീതി +pdfjs-page-scale-fit = താള്‍ പാകത്തിനാക്കുക +pdfjs-page-scale-auto = സ്വയമായി വലുതാക്കുക +pdfjs-page-scale-actual = യഥാര്‍ത്ഥ വ്യാപ്തി +# Variables: +# $scale (Number) - percent value for page scale +pdfjs-page-scale-percent = { $scale }% + +## PDF page + +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = താള്‍ { $page } + +## Loading indicator messages + +pdfjs-loading-error = പിഡിഎഫ് ലഭ്യമാക്കുമ്പോള്‍ പിശക് ഉണ്ടായിരിയ്ക്കുന്നു. +pdfjs-invalid-file-error = തെറ്റായ അല്ലെങ്കില്‍ തകരാറുള്ള പിഡിഎഫ് ഫയല്‍. +pdfjs-missing-file-error = പിഡിഎഫ് ഫയല്‍ ലഭ്യമല്ല. +pdfjs-unexpected-response-error = പ്രതീക്ഷിക്കാത്ത സെര്‍വര്‍ മറുപടി. +pdfjs-rendering-error = താള്‍ റെണ്ടര്‍ ചെയ്യുമ്പോള്‍‌ പിശകുണ്ടായിരിയ്ക്കുന്നു. + +## Annotations + +# .alt: This is used as a tooltip. +# Variables: +# $type (String) - an annotation type from a list defined in the PDF spec +# (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +pdfjs-text-annotation-type = + .alt = [{ $type } Annotation] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } + +## Password + +pdfjs-password-label = ഈ പിഡിഎഫ് ഫയല്‍ തുറക്കുന്നതിനു് ഒളിവാക്ക് നല്‍കുക. +pdfjs-password-invalid = തെറ്റായ ഒളിവാക്ക്, ദയവായി വീണ്ടും ശ്രമിയ്ക്കുക. +pdfjs-password-ok-button = ശരി +pdfjs-password-cancel-button = റദ്ദാക്കുക +pdfjs-web-fonts-disabled = വെബിനുള്ള അക്ഷരസഞ്ചയങ്ങള്‍ പ്രവര്‍ത്തന രഹിതം: എംബഡ്ഡ് ചെയ്ത പിഡിഎഫ് അക്ഷരസഞ്ചയങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ സാധ്യമല്ല. + +## Editing + +pdfjs-editor-free-text-button = + .title = എഴുത്തു് +pdfjs-editor-free-text-button-label = എഴുത്തു് +pdfjs-editor-ink-button = + .title = വരയ്ക്കുക +pdfjs-editor-ink-button-label = വരയ്ക്കുക +pdfjs-editor-stamp-button = + .title = ചിത്രങ്ങളെ ചേർക്കുക അല്ലെങ്കിൽ തിരുത്തുക +pdfjs-editor-stamp-button-label = ചിത്രങ്ങളെ ചേർക്കുക അല്ലെങ്കിൽ തിരുത്തുക +pdfjs-editor-highlight-button = + .title = അടയാളപ്പെടുക +pdfjs-editor-highlight-button-label = അടയാളപ്പെടുക +pdfjs-highlight-floating-button1 = + .title = അടയാളപ്പെടുക + .aria-label = അടയാളപ്പെടുക +pdfjs-highlight-floating-button-label = അടയാളപ്പെടുക +pdfjs-editor-signature-button = + .title = പുതിയ ഒപ്പു് ചേൎക്കുക +pdfjs-editor-signature-button-label = പുതിയ ഒപ്പു് ചേൎക്കുക + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = ആലേഖ്യം മാറ്റുക +pdfjs-editor-remove-freetext-button = + .title = എഴുത്തു് മാറ്റുക +pdfjs-editor-remove-stamp-button = + .title = ചിത്രം മാറ്റുക +pdfjs-editor-remove-highlight-button = + .title = അടയാളപ്പെട്ടുതു് മാറ്റുക +pdfjs-editor-remove-signature-button = + .title = ഒപ്പു് മാറ്റുക + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = നിറം +pdfjs-editor-free-text-size-input = വലുപ്പം +pdfjs-editor-ink-color-input = നിറം +pdfjs-editor-ink-thickness-input = കനം +pdfjs-editor-ink-opacity-input = അതാര്യത +pdfjs-editor-stamp-add-image-button = + .title = ചിത്രം ചേർക്കുക +pdfjs-editor-stamp-add-image-button-label = ചിത്രം ചേർക്കുക +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = കനം +pdfjs-editor-signature-add-signature-button = + .title = പുതിയ ഒപ്പു് ചേൎക്കുക +pdfjs-editor-signature-add-signature-button-label = പുതിയ ഒപ്പു് ചേൎക്കുക +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = കരുതിവച്ച ഒപ്പു് : { $description } +pdfjs-editor-comments-sidebar-close-button = + .title = അണിവക്കം അടയ്ക്കുക + .aria-label = അണിവക്കം അടയ്ക്കുക +pdfjs-editor-comments-sidebar-close-button-label = അണിവക്കം അടയ്ക്കുക + +## Alt-text dialog + +pdfjs-editor-alt-text-button-label = മറുയെഴുത്തു് +pdfjs-editor-alt-text-edit-button = + .aria-label = മറുയെഴുത്തു് തിരുത്തുക +pdfjs-editor-alt-text-dialog-label = സാധ്യത തിരഞ്ഞെടുക്കൂ +pdfjs-editor-alt-text-add-description-label = ഒരു വിവരണം ചേർക്കുക +pdfjs-editor-alt-text-cancel-button = റദ്ദാക്കുക +pdfjs-editor-alt-text-save-button = കരുതിവയ്ക്കുക +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = ഉദാഹരണം, “ഒരു ചെറുപ്പക്കാരൻ ഭക്ഷണം കഴിക്കാൻ മേശയിലിരുന്നു” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = മറുയെഴുത്തു് + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = അടയാളന്നിറം +pdfjs-editor-colorpicker-button = + .title = നിറം മാറ്റുക +pdfjs-editor-colorpicker-dropdown = + .aria-label = നിറസാധ്യതകൾ +pdfjs-editor-colorpicker-yellow = + .title = മഞ്ഞ +pdfjs-editor-colorpicker-green = + .title = പച്ച +pdfjs-editor-colorpicker-blue = + .title = നീല +pdfjs-editor-colorpicker-pink = + .title = പാടല +pdfjs-editor-colorpicker-red = + .title = ചുമന്ന + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = എല്ലാം കാണിക്കുക +pdfjs-editor-highlight-show-all-button = + .title = എല്ലാം കാണിക്കുക + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = മറുയെഴുത്തു് തിരുത്തുക (ചിത്ര വിവരണം) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = മറുയെഴുത്തു് ചേൎക്കുക (ചിത്ര വിവരണം) +pdfjs-editor-new-alt-text-textarea = + .placeholder = താങ്ങളുടെ വിവരണം ഇവിടെ എഴുതുക... +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = ഈ മറുയെഴുത്തു് തന്നെതാനെയുണ്ടാക്കിയതുകൊണ്ടു് തെറ്റായതാവാം. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = കൂടുതല്‍ അറിയുക +pdfjs-editor-new-alt-text-create-automatically-button-label = തന്നെതാനെ മറുയെഴുത്തു് ഉണ്ടാക്കുക +pdfjs-editor-new-alt-text-not-now-button = ഇപ്പോഴല്ല +pdfjs-editor-new-alt-text-error-title = തന്നെതാനെ മറുയെഴുത്തു് ഉണ്ടാക്കാൻ പറ്റിയില്ല +pdfjs-editor-new-alt-text-error-description = തനതായ മറുയെഴുത്തു് ഇടുക അല്ലെങ്കിൽ പിന്നീടു് ശ്രമിയ്ക്കുക. +pdfjs-editor-new-alt-text-error-close-button = അടയ്ക്കുക +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = മറുയെഴുത്തു് ചേൎത്തു +pdfjs-editor-new-alt-text-added-button-label = മറുയെഴുത്തു് ചേൎത്തു +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = മറുയെഴുത്തു് കാണാന്നില്ല +pdfjs-editor-new-alt-text-missing-button-label = മറുയെഴുത്തു് കാണാന്നില്ല +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = മറുയെഴുത്തു് അവലോകിക്കുക +pdfjs-editor-new-alt-text-to-review-button-label = മറുയെഴുത്തു് അവലോകിക്കുക +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = തന്നെതാനെ ഉണ്ടാക്കി : { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = ചിത്ര മറുയെഴുത്തു് ക്രമീകരണങ്ങൾ +pdfjs-image-alt-text-settings-button-label = ചിത്ര മറുയെഴുത്തു് ക്രമീകരണങ്ങൾ +pdfjs-editor-alt-text-settings-dialog-label = ചിത്ര മറുയെഴുത്തു് ക്രമീകരണങ്ങൾ +pdfjs-editor-alt-text-settings-automatic-title = യാന്ത്രിക മറുയെഴുത്തു് +pdfjs-editor-alt-text-settings-create-model-button-label = തന്നെതാനെ മറുയെഴുത്തു് ഉണ്ടാക്കുക +pdfjs-editor-alt-text-settings-delete-model-button = മായ്ക്കുക +pdfjs-editor-alt-text-settings-download-model-button = ഇറക്കിവയ്ക്കുക +pdfjs-editor-alt-text-settings-downloading-model-button = ഇറക്കിവയ്ക്കുന്നു +pdfjs-editor-alt-text-settings-show-dialog-description = താങ്ങളുടെ എല്ലാ പടങ്ങളിലും മറുയെഴുത്തുണ്ടെന്നു് തീൎച്ചപ്പെടുത്താൻ തുണയ്ക്കുന്നു. +pdfjs-editor-alt-text-settings-close-button = അടയ്ക്കുക + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = അടയാളം മാറ്റി +pdfjs-editor-undo-bar-message-freetext = എഴുത്തു് മാറ്റി +pdfjs-editor-undo-bar-message-ink = ആലേഖ്യം മാറ്റി +pdfjs-editor-undo-bar-message-stamp = ചിത്രം മാറ്റി +pdfjs-editor-undo-bar-message-signature = ഒപ്പു് മാറ്റി +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } കുറിപ്പെഴുതലുകൾ മാറ്റി + *[other] { $count } കുറിപ്പെഴുതലുകൾ മാറ്റി + } +pdfjs-editor-undo-bar-undo-button = + .title = പഴയപോലെയാക്കുക +pdfjs-editor-undo-bar-undo-button-label = പഴയപോലെയാക്കുക +pdfjs-editor-undo-bar-close-button = + .title = അടയ്ക്കുക +pdfjs-editor-undo-bar-close-button-label = അടയ്ക്കുക + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-title = ഒപ്പു് ചേൎക്കുക + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = തരം + .title = തരം +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = വരയ്ക്കുക + .title = വരയ്ക്കുക +pdfjs-editor-add-signature-image-button = ചിത്രം + .title = ചിത്രം + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = താങ്ങളുടെ ഒപ്പു് ഇവിടെ എഴുതുക + .placeholder = താങ്ങളുടെ ഒപ്പു് ഇവിടെ എഴുതുക +pdfjs-editor-add-signature-draw-placeholder = താങ്ങളുടെ ഒപ്പു് വരയ്ക്കുക +pdfjs-editor-add-signature-draw-thickness-range-label = കനം +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = വരപ്പുകനം: { $thickness } +pdfjs-editor-add-signature-image-placeholder = കയറ്റുവയ്ക്കാൻ വേണ്ടി ഫയലിനു് ഇവിടോട്ടു് വലിച്ചിടുക +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] അല്ലെങ്കിൽ ചിത്രം ഫയലുകൾ തപ്പുക + *[other] അല്ലെങ്കിൽ ചിത്രം ഫയലുകൾ തപ്പുക + } + +## Controls + +pdfjs-editor-add-signature-description-label = വിവരണം (ഇതരയെഴുതു്) +pdfjs-editor-add-signature-description-input = + .title = വിവരണം (ഇതരയെഴുതു്) +pdfjs-editor-add-signature-description-default-when-drawing = ഒപ്പു് +pdfjs-editor-add-signature-clear-button-label = ഒപ്പു് മായ്ക്കുക +pdfjs-editor-add-signature-clear-button = + .title = ഒപ്പു് മായ്ക്കുക +pdfjs-editor-add-signature-save-checkbox = ഒപ്പു് കരുതിവയ്ക്കുക +pdfjs-editor-add-signature-save-warning-message = താങ്ങളുടെ ഒപ്പുകളുടെ എണ്ണം 5 ആയി. കൂടുതൽ കരുതിവയ്ക്കാൻ വേണ്ടി ഒരെണ്ണം മാറ്റണ്ടിവരും. +pdfjs-editor-add-signature-image-upload-error-title = ചിത്രം കയറ്റുവയ്ക്കാൻ പറ്റിയില്ല +pdfjs-editor-add-signature-image-upload-error-description = താങ്ങളുടെ ശൃംഖല സമ്പൎക്കം പരിശോധിക്കുക അല്ലെങ്കിൽ വേറെയൊരു ചിത്രം ഇട്ടുനോക്കുക +pdfjs-editor-add-signature-error-close-button = അടയ്ക്കുക + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = റദ്ദാക്കുക +pdfjs-editor-add-signature-add-button = ചേൎക്കുക +pdfjs-editor-edit-signature-update-button = പുതുക്കുക + +## Edit a comment dialog + +pdfjs-editor-edit-comment-dialog-cancel-button = റദ്ദാക്കുക + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-views-manager-status-close-button = + .title = അടയ്ക്കുക +pdfjs-views-manager-status-close-button-label = അടയ്ക്കുക + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = കരുതിവച്ച ഒപ്പു് മാറ്റുക +pdfjs-editor-delete-signature-button-label1 = കരുതിവച്ച ഒപ്പു് മാറ്റുക + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = വിവരണം തിരുത്തുക + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = വിവരണം തിരുത്തുക diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/mr/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/mr/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/mr/viewer.ftl 2026-01-20 14:08:39.376689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/mr/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -77,24 +77,12 @@ pdfjs-document-properties-button-label = दस्तऐवज गुणधर्म… pdfjs-document-properties-file-name = फाइलचे नाव: pdfjs-document-properties-file-size = फाइल आकार: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } बाइट्स) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } बाइट्स) pdfjs-document-properties-title = शिर्षक: pdfjs-document-properties-author = लेखक: pdfjs-document-properties-subject = विषय: pdfjs-document-properties-keywords = मुख्यशब्द: pdfjs-document-properties-creation-date = निर्माण दिनांक: pdfjs-document-properties-modification-date = दुरूस्ती दिनांक: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = निर्माता: pdfjs-document-properties-producer = PDF निर्माता: pdfjs-document-properties-version = PDF आवृत्ती: @@ -195,9 +183,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = PDF लोड करतेवेळी त्रुटी आढळली. @@ -208,10 +193,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -227,13 +208,3 @@ pdfjs-password-ok-button = ठीक आहे pdfjs-password-cancel-button = रद्द करा pdfjs-web-fonts-disabled = वेब टंक असमर्थीत आहेत: एम्बेडेड PDF टंक वापर अशक्य. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ms/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ms/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ms/viewer.ftl 2026-01-20 14:08:39.377689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ms/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -89,24 +89,12 @@ pdfjs-document-properties-button-label = Sifat Dokumen… pdfjs-document-properties-file-name = Nama fail: pdfjs-document-properties-file-size = Saiz fail: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bait) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bait) pdfjs-document-properties-title = Tajuk: pdfjs-document-properties-author = Pengarang: pdfjs-document-properties-subject = Subjek: pdfjs-document-properties-keywords = Kata kunci: pdfjs-document-properties-creation-date = Masa Dicipta: pdfjs-document-properties-modification-date = Tarikh Ubahsuai: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Pencipta: pdfjs-document-properties-producer = Pengeluar PDF: pdfjs-document-properties-version = Versi PDF: @@ -207,9 +195,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = Masalah berlaku semasa menuatkan sebuah PDF. @@ -235,13 +220,3 @@ pdfjs-password-ok-button = OK pdfjs-password-cancel-button = Batal pdfjs-web-fonts-disabled = Fon web dinyahdayakan: tidak dapat menggunakan fon terbenam PDF. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/my/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/my/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/my/viewer.ftl 2026-01-20 14:08:39.377689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/my/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -65,37 +65,17 @@ pdfjs-document-properties-button-label = မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ pdfjs-document-properties-file-name = ဖိုင် : pdfjs-document-properties-file-size = ဖိုင်ဆိုဒ် : -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } ကီလိုဘိုတ် ({ $size_b }ဘိုတ်) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = ခေါင်းစဉ်‌ - pdfjs-document-properties-author = ရေးသားသူ: pdfjs-document-properties-subject = အကြောင်းအရာ: pdfjs-document-properties-keywords = သော့ချက် စာလုံး: pdfjs-document-properties-creation-date = ထုတ်လုပ်ရက်စွဲ: pdfjs-document-properties-modification-date = ပြင်ဆင်ရက်စွဲ: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = ဖန်တီးသူ: pdfjs-document-properties-producer = PDF ထုတ်လုပ်သူ: pdfjs-document-properties-version = PDF ဗားရှင်း: pdfjs-document-properties-page-count = စာမျက်နှာအရေအတွက်: -## Variables: -## $width (Number) - the width of the (current) page -## $height (Number) - the height of the (current) page -## $unit (String) - the unit of measurement of the (current) page -## $name (String) - the name of the (current) page -## $orientation (String) - the orientation of the (current) page - - ## pdfjs-document-properties-close-button = ပိတ် @@ -166,9 +146,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = PDF ဖိုင် ကိုဆွဲတင်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။ @@ -194,13 +171,3 @@ pdfjs-password-ok-button = OK pdfjs-password-cancel-button = ပယ်​ဖျက်ပါ pdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/nb-NO/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/nb-NO/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/nb-NO/viewer.ftl 2026-01-20 14:08:39.377689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/nb-NO/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Gjeldende side (se URL fra gjeldende side) pdfjs-bookmark-button-label = Gjeldende side -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Åpne i app -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Åpne i app ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Filnavn: pdfjs-document-properties-file-size = Filstørrelse: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } byte) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte) pdfjs-document-properties-title = Dokumentegenskaper … pdfjs-document-properties-author = Forfatter: pdfjs-document-properties-subject = Emne: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Opprettet dato: pdfjs-document-properties-modification-date = Endret dato: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Opprettet av: pdfjs-document-properties-producer = PDF-verktøy: pdfjs-document-properties-version = PDF-versjon: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniatyrbilde av side { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Velg side { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Side { $page } av { $total } ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } annotasjon] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Tekst +pdfjs-editor-color-picker-free-text-input = + .title = Endre tekstfarge pdfjs-editor-free-text-button-label = Tekst pdfjs-editor-ink-button = .title = Tegn +pdfjs-editor-color-picker-ink-input = + .title = Endre tegnefarge pdfjs-editor-ink-button-label = Tegn pdfjs-editor-stamp-button = .title = Legg til eller rediger bilder @@ -304,6 +309,37 @@ pdfjs-editor-highlight-button = .title = Markere pdfjs-editor-highlight-button-label = Markere +pdfjs-highlight-floating-button1 = + .title = Markere + .aria-label = Markere +pdfjs-highlight-floating-button-label = Markere +pdfjs-comment-floating-button = + .title = Kommenter + .aria-label = Kommenter +pdfjs-comment-floating-button-label = Kommenter +pdfjs-editor-comment-button = + .title = Kommentar + .aria-label = Kommentar +pdfjs-editor-comment-button-label = Kommentar +pdfjs-editor-signature-button = + .title = Legg til signatur +pdfjs-editor-signature-button-label = Legg til signatur + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Redigering av markering +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Redigering av tegninger +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Signatur-redigerer: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Bilderedigerer ## Remove button for the various kind of editor. @@ -315,6 +351,8 @@ .title = Fjern bildet pdfjs-editor-remove-highlight-button = .title = Fjern utheving +pdfjs-editor-remove-signature-button = + .title = Fjern signatur ## @@ -323,7 +361,7 @@ pdfjs-editor-free-text-size-input = Størrelse pdfjs-editor-ink-color-input = Farge pdfjs-editor-ink-thickness-input = Tykkelse -pdfjs-editor-ink-opacity-input = Ugjennomsiktighet +pdfjs-editor-ink-opacity-input = Opasitet pdfjs-editor-stamp-add-image-button = .title = Legg til bilde pdfjs-editor-stamp-add-image-button-label = Legg til bilde @@ -331,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Tykkelse pdfjs-editor-free-highlight-thickness-title = .title = Endre tykkelse når du markerer andre elementer enn tekst -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Signaturkontroller og lagrede signaturer +pdfjs-editor-signature-add-signature-button = + .title = Legg til ny signatur +pdfjs-editor-signature-add-signature-button-label = Legg til ny signatur +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Lagret signatur: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Tekstredigering -pdfjs-free-text-default-content = Begynn å skrive… -pdfjs-ink = - .aria-label = Tegneredigering -pdfjs-ink-canvas = - .aria-label = Brukerskapt bilde + .default-content = Begynn å skrive… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Kommentar + *[other] Kommentarer + } +pdfjs-editor-comments-sidebar-close-button = + .title = Lukk sidestolpen + .aria-label = Lukk sidestolpen +pdfjs-editor-comments-sidebar-close-button-label = Lukk sidestolpen +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Ser du noe verdt å merke seg? Marker det og legg igjen en kommentar. +pdfjs-editor-comments-sidebar-no-comments-link = Les mer ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. -pdfjs-editor-alt-text-button-label = Alt-tekst -pdfjs-editor-alt-text-edit-button-label = Rediger alt-tekst tekst +pdfjs-editor-alt-text-button-label = Alternativ tekst +pdfjs-editor-alt-text-edit-button = + .aria-label = Rediger alternativ tekst pdfjs-editor-alt-text-dialog-label = Velg et alternativ pdfjs-editor-alt-text-dialog-description = Alt-tekst (alternativ tekst) hjelper når folk ikke kan se bildet eller når det ikke lastes inn. pdfjs-editor-alt-text-add-description-label = Legg til en beskrivelse @@ -356,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = For eksempel, «En ung mann setter seg ved et bord for å spise et måltid» +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternativ tekst ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Øverste venstre hjørne – endre størrelse -pdfjs-editor-resizer-label-top-middle = Øverst i midten — endre størrelse -pdfjs-editor-resizer-label-top-right = Øverste høyre hjørne – endre størrelse -pdfjs-editor-resizer-label-middle-right = Midt til høyre – endre størrelse -pdfjs-editor-resizer-label-bottom-right = Nederste høyre hjørne – endre størrelse -pdfjs-editor-resizer-label-bottom-middle = Nederst i midten — endre størrelse -pdfjs-editor-resizer-label-bottom-left = Nederste venstre hjørne – endre størrelse -pdfjs-editor-resizer-label-middle-left = Midt til venstre — endre størrelse +pdfjs-editor-resizer-top-left = + .aria-label = Øverste venstre hjørne – endre størrelse +pdfjs-editor-resizer-top-middle = + .aria-label = Øverst i midten — endre størrelse +pdfjs-editor-resizer-top-right = + .aria-label = Øverste høyre hjørne – endre størrelse +pdfjs-editor-resizer-middle-right = + .aria-label = Midt til høyre – endre størrelse +pdfjs-editor-resizer-bottom-right = + .aria-label = Nederste høyre hjørne – endre størrelse +pdfjs-editor-resizer-bottom-middle = + .aria-label = Nederst i midten — endre størrelse +pdfjs-editor-resizer-bottom-left = + .aria-label = Nederste venstre hjørne – endre størrelse +pdfjs-editor-resizer-middle-left = + .aria-label = Midt til venstre — endre størrelse ## Color picker @@ -387,3 +458,290 @@ .title = Rosa pdfjs-editor-colorpicker-red = .title = Rød + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Vis alle +pdfjs-editor-highlight-show-all-button = + .title = Vis alle + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Rediger alternativ tekst (bildebeskrivelse) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Legg til alternativ tekst (bildebeskrivelse) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Skriv din beskrivelse her… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Kort beskrivelse for folk som ikke kan se bildet eller når bildet ikke lastes inn. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Denne alternative teksten ble opprettet automatisk og kan være unøyaktig. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Les mer +pdfjs-editor-new-alt-text-create-automatically-button-label = Lag alternativ tekst automatisk +pdfjs-editor-new-alt-text-not-now-button = Ikke nå +pdfjs-editor-new-alt-text-error-title = Kunne ikke opprette alternativ tekst automatisk +pdfjs-editor-new-alt-text-error-description = Skriv din egen alternativ tekst eller prøv igjen senere. +pdfjs-editor-new-alt-text-error-close-button = Lukk +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Laster ned alternativ tekst AI-modell ({ $downloadedSize } av { $totalSize } MB) + .aria-valuetext = Laster ned alternativ tekst AI-modell ({ $downloadedSize } av { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternativ tekst lagt til +pdfjs-editor-new-alt-text-added-button-label = Alternativ tekst lagt til +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Mangler alternativ tekst +pdfjs-editor-new-alt-text-missing-button-label = Mangler alternativ tekst +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Gjennomgå alt-tekst +pdfjs-editor-new-alt-text-to-review-button-label = Gjennomgå alternativ tekst +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Opprettet automatisk: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Innstillinger for alternativ tekst for bilde +pdfjs-image-alt-text-settings-button-label = Innstillinger for alternativ tekst for bilde +pdfjs-editor-alt-text-settings-dialog-label = Innstillinger for alternativ tekst for bilde +pdfjs-editor-alt-text-settings-automatic-title = Automatisk alternativ tekst +pdfjs-editor-alt-text-settings-create-model-button-label = Opprett alternativ tekst automatisk +pdfjs-editor-alt-text-settings-create-model-description = Foreslår beskrivelser for å hjelpe folk som ikke kan se bildet eller når bildet ikke lastes inn. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Alternativ tekst AI-modell ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Kjører lokalt på enheten din slik at dataene dine forblir private. Nødvendig for automatisk alternativ tekst. +pdfjs-editor-alt-text-settings-delete-model-button = Slett +pdfjs-editor-alt-text-settings-download-model-button = Last ned +pdfjs-editor-alt-text-settings-downloading-model-button = Laster ned… +pdfjs-editor-alt-text-settings-editor-title = Alternativ tekst-redigerer +pdfjs-editor-alt-text-settings-show-dialog-button-label = Vis alternativ tekst-redigerer direkte når du legger til et bilde +pdfjs-editor-alt-text-settings-show-dialog-description = Hjelper deg å sørge for at alle bildene dine har alternativ tekst. +pdfjs-editor-alt-text-settings-close-button = Lukk + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Utheving lagt til +pdfjs-editor-freetext-added-alert = Tekst lagt til +pdfjs-editor-ink-added-alert = Tegning lagt til +pdfjs-editor-stamp-added-alert = Bilde lagt til +pdfjs-editor-signature-added-alert = Signatur lagt til + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Markering fjernet +pdfjs-editor-undo-bar-message-freetext = Tekst fjernet +pdfjs-editor-undo-bar-message-ink = Tegning fjernet +pdfjs-editor-undo-bar-message-stamp = Bilde fjernet +pdfjs-editor-undo-bar-message-signature = Signatur fjernet +pdfjs-editor-undo-bar-message-comment = Kommentar fjernet +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } kommentar fjernet + *[other] { $count } kommentarer fjernet + } +pdfjs-editor-undo-bar-undo-button = + .title = Angre +pdfjs-editor-undo-bar-undo-button-label = Angre +pdfjs-editor-undo-bar-close-button = + .title = Lukk +pdfjs-editor-undo-bar-close-button-label = Lukk + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Denne modalen lar brukeren lage en signatur for å legge til et PDF-dokument. Brukeren kan redigere navnet (som også fungerer som alt-teksten), og eventuelt lagre signaturen for gjentatt bruk. +pdfjs-editor-add-signature-dialog-title = Legg til en signatur + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Type + .title = Type +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Tegn + .title = Tegn +pdfjs-editor-add-signature-image-button = Bilde + .title = Bilde + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Skriv inn signaturen din + .placeholder = Skriv inn signaturen din +pdfjs-editor-add-signature-draw-placeholder = Tegn signaturen din +pdfjs-editor-add-signature-draw-thickness-range-label = Tykkelse +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Linjetykkelse: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Dra en fil her for å laste opp +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Eller velg bildefiler + *[other] Eller velg bildefiler + } + +## Controls + +pdfjs-editor-add-signature-description-label = Beskrivelse (alternativ tekst) +pdfjs-editor-add-signature-description-input = + .title = Beskrivelse (alternativ tekst) +pdfjs-editor-add-signature-description-default-when-drawing = Signatur +pdfjs-editor-add-signature-clear-button-label = Fjern signatur +pdfjs-editor-add-signature-clear-button = + .title = Fjern signatur +pdfjs-editor-add-signature-save-checkbox = Lagre signatur +pdfjs-editor-add-signature-save-warning-message = Du har nådd grensen på 5 lagrede signaturer. Fjern en for å lagre en ny. +pdfjs-editor-add-signature-image-upload-error-title = Kunne ikke laste opp bildet +pdfjs-editor-add-signature-image-upload-error-description = Sjekk nettverkstilkoblingen eller prøv et annet bilde. +pdfjs-editor-add-signature-image-no-data-error-title = Kan ikke konvertere dette bildet til en signatur +pdfjs-editor-add-signature-image-no-data-error-description = Prøv å laste opp et annet bilde. +pdfjs-editor-add-signature-error-close-button = Lukk + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Avbryt +pdfjs-editor-add-signature-add-button = Legg til +pdfjs-editor-edit-signature-update-button = Oppdater + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Rediger kommentar +pdfjs-editor-edit-comment-popup-button = + .title = Rediger kommentar +pdfjs-editor-delete-comment-popup-button-label = Fjern kommentar +pdfjs-editor-delete-comment-popup-button = + .title = Fjern kommentar +pdfjs-show-comment-button = + .title = Vis kommentar + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Rediger kommentar +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Oppdater +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Legg til kommentar +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Legg til +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Begynn å skrive… +pdfjs-editor-edit-comment-dialog-cancel-button = Avbryt + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Legg til kommentar + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Vis/skjul sidestolpe (dokumentet inneholder miniatyrbilder/disposisjon/vedlegg/lag) +pdfjs-toggle-views-manager-button1-label = Behandle sider +pdfjs-views-manager-sidebar = + .aria-label = Sidestolpe +pdfjs-views-manager-sidebar-resizer = + .aria-label = Endre størrelse på sidestolpen +pdfjs-views-manager-view-selector-button = + .title = Visninger +pdfjs-views-manager-view-selector-button-label = Visninger +pdfjs-views-manager-pages-title = Sider +pdfjs-views-manager-outlines-title1 = Dokumentoversikt + .title = Dokumentoversikt (dobbeltklikk for å utvide/skjule alle elementer) +pdfjs-views-manager-attachments-title = Vedlegg +pdfjs-views-manager-layers-title1 = Lag + .title = Lag (dobbeltklikk for å tilbakestille alle lag til standardtilstand) +pdfjs-views-manager-pages-option-label = Sider +pdfjs-views-manager-outlines-option-label = Dokumentdisposisjon +pdfjs-views-manager-attachments-option-label = Vedlegg +pdfjs-views-manager-layers-option-label = Lag +pdfjs-views-manager-add-file-button = + .title = Legg til fil +pdfjs-views-manager-add-file-button-label = Legg til fil +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } valgt + *[other] { $count } valgt + } +pdfjs-views-manager-pages-status-none-action-label = Velg sider +pdfjs-views-manager-pages-status-action-button-label = Behandle +pdfjs-views-manager-pages-status-copy-button-label = Kopier +pdfjs-views-manager-pages-status-cut-button-label = Klipp ut +pdfjs-views-manager-pages-status-delete-button-label = Slett +pdfjs-views-manager-pages-status-export-selected-button-label = Eksporter valgte… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 side klippet ut + *[other] { $count } sider klippet ut + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 side kopiert + *[other] { $count } sider kopiert + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 side slettet + *[other] { $count } sider slettet + } +pdfjs-views-manager-pages-status-waiting-ready-label = Klargjør filen din … +pdfjs-views-manager-pages-status-waiting-uploading-label = Laster opp filen … +pdfjs-views-manager-status-warning-cut-label = Kunne ikke klippe ut. Oppdater siden og prøv på nytt. +pdfjs-views-manager-status-warning-copy-label = Kunne ikke kopiere. Oppdater siden og prøv på nytt. +pdfjs-views-manager-status-warning-delete-label = Kunne ikke slette. Oppdater siden og prøv på nytt. +pdfjs-views-manager-status-warning-save-label = Kunne ikke lagre. Oppdater siden og prøv på nytt. +pdfjs-views-manager-status-undo-button-label = Angre +pdfjs-views-manager-status-done-button-label = Ferdig +pdfjs-views-manager-status-close-button = + .title = Lukk +pdfjs-views-manager-status-close-button-label = Lukk +pdfjs-views-manager-paste-button-label = Lim inn +pdfjs-views-manager-paste-button-before = + .title = Lim inn før første side +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Lim inn etter side { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NY +pdfjs-views-manager-waiting-for-file = Laster opp filen … +pdfjs-toggle-views-manager-button1 = + .title = Behandle sider + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Fjern lagret signatur +pdfjs-editor-delete-signature-button-label1 = Fjern lagret signatur + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Rediger beskrivelse + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Rediger beskrivelse diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ne-NP/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ne-NP/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ne-NP/viewer.ftl 2026-01-20 14:08:39.377689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ne-NP/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -83,24 +83,12 @@ pdfjs-document-properties-button-label = कागजात विशेषताहरू... pdfjs-document-properties-file-name = फाइल नाम: pdfjs-document-properties-file-size = फाइल आकार: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = शीर्षक: pdfjs-document-properties-author = लेखक: pdfjs-document-properties-subject = विषयः pdfjs-document-properties-keywords = शब्दकुञ्जीः pdfjs-document-properties-creation-date = सिर्जना गरिएको मिति: pdfjs-document-properties-modification-date = परिमार्जित मिति: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = सर्जक: pdfjs-document-properties-producer = PDF निर्माता: pdfjs-document-properties-version = PDF संस्करण @@ -113,14 +101,6 @@ pdfjs-document-properties-page-size-name-letter = अक्षर pdfjs-document-properties-page-size-name-legal = कानूनी -## Variables: -## $width (Number) - the width of the (current) page -## $height (Number) - the height of the (current) page -## $unit (String) - the unit of measurement of the (current) page -## $name (String) - the name of the (current) page -## $orientation (String) - the orientation of the (current) page - - ## pdfjs-document-properties-linearized-yes = हो @@ -194,9 +174,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = यो PDF लोड गर्दा एउटा त्रुटि देखापर्‍यो। @@ -222,13 +199,3 @@ pdfjs-password-ok-button = ठिक छ pdfjs-password-cancel-button = रद्द गर्नुहोस् pdfjs-web-fonts-disabled = वेब फन्ट असक्षम छन्: एम्बेडेड PDF फन्ट प्रयोग गर्न असमर्थ। - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/nl/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/nl/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/nl/viewer.ftl 2026-01-20 14:08:39.378689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/nl/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Huidige pagina (URL van huidige pagina bekijken) pdfjs-bookmark-button-label = Huidige pagina -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Openen in app -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Openen in app ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Bestandsnaam: pdfjs-document-properties-file-size = Bestandsgrootte: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) pdfjs-document-properties-title = Titel: pdfjs-document-properties-author = Auteur: pdfjs-document-properties-subject = Onderwerp: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Aanmaakdatum: pdfjs-document-properties-modification-date = Wijzigingsdatum: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Maker: pdfjs-document-properties-producer = PDF-producent: pdfjs-document-properties-version = PDF-versie: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniatuur van pagina { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Pagina { $page } selecteren +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Pagina { $page } van { $total } ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type }-aantekening] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Tekst +pdfjs-editor-color-picker-free-text-input = + .title = Tekstkleur wijzigen pdfjs-editor-free-text-button-label = Tekst pdfjs-editor-ink-button = .title = Tekenen +pdfjs-editor-color-picker-ink-input = + .title = Tekenkleur wijzigen pdfjs-editor-ink-button-label = Tekenen pdfjs-editor-stamp-button = .title = Afbeeldingen toevoegen of bewerken @@ -304,12 +309,37 @@ pdfjs-editor-highlight-button = .title = Markeren pdfjs-editor-highlight-button-label = Markeren -pdfjs-highlight-floating-button = - .title = Markeren pdfjs-highlight-floating-button1 = .title = Markeren .aria-label = Markeren pdfjs-highlight-floating-button-label = Markeren +pdfjs-comment-floating-button = + .title = Opmerking + .aria-label = Opmerking +pdfjs-comment-floating-button-label = Opmerking +pdfjs-editor-comment-button = + .title = Opmerking + .aria-label = Opmerking +pdfjs-editor-comment-button-label = Opmerking +pdfjs-editor-signature-button = + .title = Handtekening toevoegen +pdfjs-editor-signature-button-label = Handtekening toevoegen + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Markeringsbewerker +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Tekeningbewerker +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Ondertekening-editor: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Afbeeldingsbewerker ## Remove button for the various kind of editor. @@ -321,6 +351,8 @@ .title = Afbeelding verwijderen pdfjs-editor-remove-highlight-button = .title = Markering verwijderen +pdfjs-editor-remove-signature-button = + .title = Handtekening verwijderen ## @@ -337,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Dikte pdfjs-editor-free-highlight-thickness-title = .title = Dikte wijzigen bij accentuering van andere items dan tekst -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Ondertekeningsinstellingen en opgeslagen ondertekeningen +pdfjs-editor-signature-add-signature-button = + .title = Nieuwe handtekening toevoegen +pdfjs-editor-signature-add-signature-button-label = Nieuwe handtekening toevoegen +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Opgeslagen ondertekening: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Tekstbewerker -pdfjs-free-text-default-content = Begin met typen… -pdfjs-ink = - .aria-label = Tekeningbewerker -pdfjs-ink-canvas = - .aria-label = Door gebruiker gemaakte afbeelding + .default-content = Start met typen… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Opmerking + *[other] Opmerkingen + } +pdfjs-editor-comments-sidebar-close-button = + .title = De zijbalk sluiten + .aria-label = De zijbalk sluiten +pdfjs-editor-comments-sidebar-close-button-label = De zijbalk sluiten +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Ziet u iets noemenswaardigs? Markeer het en laat een opmerking achter. +pdfjs-editor-comments-sidebar-no-comments-link = Meer info ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Alternatieve tekst -pdfjs-editor-alt-text-edit-button-label = Alternatieve tekst bewerken +pdfjs-editor-alt-text-edit-button = + .aria-label = Alternatieve tekst bewerken pdfjs-editor-alt-text-dialog-label = Kies een optie pdfjs-editor-alt-text-dialog-description = Alternatieve tekst helpt wanneer mensen de afbeelding niet kunnen zien of wanneer deze niet wordt geladen. pdfjs-editor-alt-text-add-description-label = Voeg een beschrijving toe @@ -362,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Bijvoorbeeld: ‘Een jonge man gaat aan een tafel zitten om te eten’ +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternatieve tekst ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Linkerbovenhoek – formaat wijzigen -pdfjs-editor-resizer-label-top-middle = Midden boven – formaat wijzigen -pdfjs-editor-resizer-label-top-right = Rechterbovenhoek – formaat wijzigen -pdfjs-editor-resizer-label-middle-right = Midden rechts – formaat wijzigen -pdfjs-editor-resizer-label-bottom-right = Rechterbenedenhoek – formaat wijzigen -pdfjs-editor-resizer-label-bottom-middle = Midden onder – formaat wijzigen -pdfjs-editor-resizer-label-bottom-left = Linkerbenedenhoek – formaat wijzigen -pdfjs-editor-resizer-label-middle-left = Links midden – formaat wijzigen +pdfjs-editor-resizer-top-left = + .aria-label = Linkerbovenhoek – formaat wijzigen +pdfjs-editor-resizer-top-middle = + .aria-label = Midden boven – formaat wijzigen +pdfjs-editor-resizer-top-right = + .aria-label = Rechterbovenhoek – formaat wijzigen +pdfjs-editor-resizer-middle-right = + .aria-label = Midden rechts – formaat wijzigen +pdfjs-editor-resizer-bottom-right = + .aria-label = Rechterbenedenhoek – formaat wijzigen +pdfjs-editor-resizer-bottom-middle = + .aria-label = Midden onder – formaat wijzigen +pdfjs-editor-resizer-bottom-left = + .aria-label = Linkerbenedenhoek – formaat wijzigen +pdfjs-editor-resizer-middle-left = + .aria-label = Links midden – formaat wijzigen ## Color picker @@ -400,3 +465,283 @@ pdfjs-editor-highlight-show-all-button-label = Alles tonen pdfjs-editor-highlight-show-all-button = .title = Alles tonen + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Alternatieve tekst (afbeeldingsbeschrijving) bewerken +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Alternatieve tekst (afbeeldingsbeschrijving) toevoegen +pdfjs-editor-new-alt-text-textarea = + .placeholder = Schrijf hier uw beschrijving… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Korte beschrijving voor mensen die de afbeelding niet kunnen zien of wanneer de afbeelding niet wordt geladen. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Deze alternatieve tekst is automatisch gemaakt en is mogelijk onjuist. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Meer info +pdfjs-editor-new-alt-text-create-automatically-button-label = Alternatieve tekst automatisch aanmaken +pdfjs-editor-new-alt-text-not-now-button = Niet nu +pdfjs-editor-new-alt-text-error-title = Kan alternatieve tekst niet automatisch aanmaken +pdfjs-editor-new-alt-text-error-description = Schrijf uw eigen alternatieve tekst of probeer het later nog eens. +pdfjs-editor-new-alt-text-error-close-button = Sluiten +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = AI-model voor alternatieve tekst downloaden ({ $downloadedSize } van { $totalSize } MB) + .aria-valuetext = AI-model voor alternatieve tekst downloaden ({ $downloadedSize } van { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternatieve tekst toegevoegd +pdfjs-editor-new-alt-text-added-button-label = Alternatieve tekst toegevoegd +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Alternatieve tekst ontbreekt +pdfjs-editor-new-alt-text-missing-button-label = Alternatieve tekst ontbreekt +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Alternatieve tekst beoordelen +pdfjs-editor-new-alt-text-to-review-button-label = Alternatieve tekst beoordelen +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automatisch aangemaakt: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Instellingen voor alternatieve tekst van afbeeldingen +pdfjs-image-alt-text-settings-button-label = Instellingen voor alternatieve tekst van afbeeldingen +pdfjs-editor-alt-text-settings-dialog-label = Instellingen voor alternatieve tekst van afbeeldingen +pdfjs-editor-alt-text-settings-automatic-title = Automatische alternatieve tekst +pdfjs-editor-alt-text-settings-create-model-button-label = Alternatieve tekst automatisch aanmaken +pdfjs-editor-alt-text-settings-create-model-description = Stelt beschrijvingen voor om mensen te helpen die de afbeelding niet kunnen zien of voor wie de afbeelding niet wordt geladen. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = AI-model voor alternatieve tekst ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Wordt lokaal op uw apparaat uitgevoerd, zodat uw gegevens privé blijven. Vereist voor automatische alternatieve tekst. +pdfjs-editor-alt-text-settings-delete-model-button = Verwijderen +pdfjs-editor-alt-text-settings-download-model-button = Downloaden +pdfjs-editor-alt-text-settings-downloading-model-button = Downloaden… +pdfjs-editor-alt-text-settings-editor-title = Alternatieve-tekstbewerker +pdfjs-editor-alt-text-settings-show-dialog-button-label = Alternatieve-tekstbewerker meteen tonen bij toevoegen van een afbeelding +pdfjs-editor-alt-text-settings-show-dialog-description = Helpt u ervoor te zorgen dat al uw afbeeldingen alternatieve tekst hebben. +pdfjs-editor-alt-text-settings-close-button = Sluiten + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Markering toegevoegd +pdfjs-editor-freetext-added-alert = Tekst toegevoegd +pdfjs-editor-ink-added-alert = Tekening toegevoegd +pdfjs-editor-stamp-added-alert = Afbeelding toegevoegd +pdfjs-editor-signature-added-alert = Handtekening toegevoegd + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Markering verwijderd +pdfjs-editor-undo-bar-message-freetext = Tekst verwijderd +pdfjs-editor-undo-bar-message-ink = Tekening verwijderd +pdfjs-editor-undo-bar-message-stamp = Afbeelding verwijderd +pdfjs-editor-undo-bar-message-signature = Handtekening verwijderd +pdfjs-editor-undo-bar-message-comment = Opmerking verwijderd +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } annotatie verwijderd + *[other] { $count } annotaties verwijderd + } +pdfjs-editor-undo-bar-undo-button = + .title = Ongedaan maken +pdfjs-editor-undo-bar-undo-button-label = Ongedaan maken +pdfjs-editor-undo-bar-close-button = + .title = Sluiten +pdfjs-editor-undo-bar-close-button-label = Sluiten + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Met deze modal kan de gebruiker een handtekening maken om aan een PDF-document toe te voegen. De gebruiker kan de naam (die ook als alternatieve tekst dient) bewerken en optioneel de ondertekening opslaan voor herhaald gebruik. +pdfjs-editor-add-signature-dialog-title = Een handtekening toevoegen + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Typen + .title = Typen +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Tekenen + .title = Tekenen +pdfjs-editor-add-signature-image-button = Afbeelding + .title = Afbeelding + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Uw handtekening typen + .placeholder = Uw handtekening typen +pdfjs-editor-add-signature-draw-placeholder = Uw handtekening tekenen +pdfjs-editor-add-signature-draw-thickness-range-label = Dikte +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Tekendikte: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Sleep bestand hierheen om te uploaden +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Of kies afbeeldingsbestanden + *[other] Of kies afbeeldingsbestanden + } + +## Controls + +pdfjs-editor-add-signature-description-label = Beschrijving (alternatieve tekst) +pdfjs-editor-add-signature-description-input = + .title = Beschrijving (alternatieve tekst) +pdfjs-editor-add-signature-description-default-when-drawing = Handtekening +pdfjs-editor-add-signature-clear-button-label = Handtekening wissen +pdfjs-editor-add-signature-clear-button = + .title = Handtekening wissen +pdfjs-editor-add-signature-save-checkbox = Handtekening opslaan +pdfjs-editor-add-signature-save-warning-message = U hebt de limiet van 5 opgeslagen handtekeningen bereikt. Verwijder er een om een andere op te slaan. +pdfjs-editor-add-signature-image-upload-error-title = Kan afbeelding niet uploaden +pdfjs-editor-add-signature-image-upload-error-description = Controleer uw netwerkverbinding of probeer een andere afbeelding. +pdfjs-editor-add-signature-image-no-data-error-title = Kan deze afbeelding niet naar een handtekening converteren +pdfjs-editor-add-signature-image-no-data-error-description = Probeer een andere afbeelding te uploaden. +pdfjs-editor-add-signature-error-close-button = Sluiten + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Annuleren +pdfjs-editor-add-signature-add-button = Toevoegen +pdfjs-editor-edit-signature-update-button = Bijwerken + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Opmerking bewerken +pdfjs-editor-edit-comment-popup-button = + .title = Opmerking bewerken +pdfjs-editor-delete-comment-popup-button-label = Opmerking verwijderen +pdfjs-editor-delete-comment-popup-button = + .title = Opmerking verwijderen +pdfjs-show-comment-button = + .title = Opmerking tonen + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Opmerking bewerken +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Bijwerken +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Opmerking toevoegen +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Toevoegen +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Begin met typen… +pdfjs-editor-edit-comment-dialog-cancel-button = Annuleren + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Opmerking toevoegen + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Zijbalk in-/uitschakelen (document bevat miniaturen/overzicht/bijlagen/lagen) +pdfjs-toggle-views-manager-button1-label = Pagina’s beheren +pdfjs-views-manager-sidebar = + .aria-label = Zijbalk +pdfjs-views-manager-sidebar-resizer = + .aria-label = Groottewijziging zijbalk +pdfjs-views-manager-view-selector-button = + .title = Weergaven +pdfjs-views-manager-view-selector-button-label = Weergaven +pdfjs-views-manager-pages-title = Pagina’s +pdfjs-views-manager-outlines-title1 = Documentoverzicht + .title = Documentoverzicht (dubbelklik om alle items uit te vouwen/samen te vouwen) +pdfjs-views-manager-attachments-title = Bijlagen +pdfjs-views-manager-layers-title1 = Lagen + .title = Lagen (dubbelklik om alle lagen naar de standaardstatus terug te zetten) +pdfjs-views-manager-pages-option-label = Pagina’s +pdfjs-views-manager-outlines-option-label = Documentoverzicht +pdfjs-views-manager-attachments-option-label = Bijlagen +pdfjs-views-manager-layers-option-label = Lagen +pdfjs-views-manager-add-file-button = + .title = Bestand toevoegen +pdfjs-views-manager-add-file-button-label = Bestand toevoegen +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } geselecteerd + *[other] { $count } geselecteerd + } +pdfjs-views-manager-pages-status-none-action-label = Pagina’s selecteren +pdfjs-views-manager-pages-status-action-button-label = Beheren +pdfjs-views-manager-pages-status-copy-button-label = Kopiëren +pdfjs-views-manager-pages-status-cut-button-label = Knippen +pdfjs-views-manager-pages-status-delete-button-label = Verwijderen +pdfjs-views-manager-pages-status-export-selected-button-label = Geselecteerde exporteren… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 pagina geknipt + *[other] { $count } pagina’s geknipt + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 pagina gekopieerd + *[other] { $count } pagina’s gekopieerd + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 pagina verwijderd + *[other] { $count } pagina’s verwijderd + } +pdfjs-views-manager-pages-status-waiting-ready-label = Uw bestand voorbereiden… +pdfjs-views-manager-pages-status-waiting-uploading-label = Bestand uploaden… +pdfjs-views-manager-status-warning-cut-label = Kan niet knippen. Vernieuw de pagina en probeer het opnieuw. +pdfjs-views-manager-status-warning-copy-label = Kan niet kopiëren. Vernieuw de pagina en probeer het opnieuw. +pdfjs-views-manager-status-warning-delete-label = Kan niet verwijderen. Vernieuw de pagina en probeer het opnieuw. +pdfjs-views-manager-status-warning-save-label = Kan niet opslaan. Vernieuw de pagina en probeer het opnieuw. +pdfjs-views-manager-status-undo-button-label = Ongedaan maken +pdfjs-views-manager-status-done-button-label = Gereed +pdfjs-views-manager-status-close-button = + .title = Sluiten +pdfjs-views-manager-status-close-button-label = Sluiten +pdfjs-views-manager-paste-button-label = Plakken +pdfjs-views-manager-paste-button-before = + .title = Plakken voor de eerste pagina +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Plakken na pagina { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NIEUW +pdfjs-views-manager-waiting-for-file = Bestand uploaden… +pdfjs-toggle-views-manager-button1 = + .title = Pagina’s beheren + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Opgeslagen ondertekening verwijderen +pdfjs-editor-delete-signature-button-label1 = Opgeslagen ondertekening verwijderen + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Beschrijving bewerken + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Beschrijving bewerken diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/nn-NO/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/nn-NO/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/nn-NO/viewer.ftl 2026-01-20 14:08:39.378689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/nn-NO/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Gjeldande side (sjå URL frå gjeldande side) pdfjs-bookmark-button-label = Gjeldande side -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Opne i app -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Opne i app ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Filnamn: pdfjs-document-properties-file-size = Filstorleik: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kB ({ $b } byte) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte) pdfjs-document-properties-title = Tittel: pdfjs-document-properties-author = Forfattar: pdfjs-document-properties-subject = Emne: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Dato oppretta: pdfjs-document-properties-modification-date = Dato endra: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Oppretta av: pdfjs-document-properties-producer = PDF-verktøy: pdfjs-document-properties-version = PDF-versjon: @@ -135,8 +128,8 @@ pdfjs-document-properties-page-size = Sidestørrelse: pdfjs-document-properties-page-size-unit-inches = in pdfjs-document-properties-page-size-unit-millimeters = mm -pdfjs-document-properties-page-size-orientation-portrait = ståande -pdfjs-document-properties-page-size-orientation-landscape = liggande +pdfjs-document-properties-page-size-orientation-portrait = ståande (portrait) +pdfjs-document-properties-page-size-orientation-landscape = liggande (landscape) pdfjs-document-properties-page-size-name-a-three = A3 pdfjs-document-properties-page-size-name-a-four = A4 pdfjs-document-properties-page-size-name-letter = Brev @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniatyrbilde av side { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Vel side { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Side { $page } av { $total } ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date } { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } annotasjon] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,16 +295,64 @@ pdfjs-editor-free-text-button = .title = Tekst +pdfjs-editor-color-picker-free-text-input = + .title = Endre tekstfarge pdfjs-editor-free-text-button-label = Tekst pdfjs-editor-ink-button = .title = Teikne +pdfjs-editor-color-picker-ink-input = + .title = Endre teiknefarge pdfjs-editor-ink-button-label = Teikne pdfjs-editor-stamp-button = .title = Legg til eller rediger bilde pdfjs-editor-stamp-button-label = Legg til eller rediger bilde +pdfjs-editor-highlight-button = + .title = Markere +pdfjs-editor-highlight-button-label = Markere +pdfjs-highlight-floating-button1 = + .title = Markere + .aria-label = Markere +pdfjs-highlight-floating-button-label = Markere +pdfjs-comment-floating-button = + .title = Kommenter + .aria-label = Kommenter +pdfjs-comment-floating-button-label = Kommenter +pdfjs-editor-comment-button = + .title = Kommentar + .aria-label = Kommentar +pdfjs-editor-comment-button-label = Kommentar +pdfjs-editor-signature-button = + .title = Legg til signatur +pdfjs-editor-signature-button-label = Legg til signatur + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Markeringsredigerar +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Redigering av teikningar +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Signatur-redigerar: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Bildredigerar ## Remove button for the various kind of editor. +pdfjs-editor-remove-ink-button = + .title = Fjern teikninga +pdfjs-editor-remove-freetext-button = + .title = Fjern tekst +pdfjs-editor-remove-stamp-button = + .title = Fjern bildet +pdfjs-editor-remove-highlight-button = + .title = Fjern utheving +pdfjs-editor-remove-signature-button = + .title = Fjern signatur ## @@ -311,24 +360,50 @@ pdfjs-editor-free-text-color-input = Farge pdfjs-editor-free-text-size-input = Storleik pdfjs-editor-ink-color-input = Farge -pdfjs-editor-ink-thickness-input = Tjukkleik +pdfjs-editor-ink-thickness-input = Tjukn pdfjs-editor-ink-opacity-input = Ugjennomskinleg pdfjs-editor-stamp-add-image-button = .title = Legg til bilde pdfjs-editor-stamp-add-image-button-label = Legg til bilde -pdfjs-free-text = +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Tjukn +pdfjs-editor-free-highlight-thickness-title = + .title = Endre tjukn når du markerer andre element enn tekst +pdfjs-editor-add-signature-container = + .aria-label = Signaturkontroll og lagra signaturar +pdfjs-editor-signature-add-signature-button = + .title = Legg til ny signatur +pdfjs-editor-signature-add-signature-button-label = Legg til ny signatur +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Lagra signatur: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Tekstredigering -pdfjs-free-text-default-content = Byrje å skrive… -pdfjs-ink = - .aria-label = Teikneredigering -pdfjs-ink-canvas = - .aria-label = Brukarskapt bilde + .default-content = Begynn å skrive… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Kommentarar + *[other] Kommentararar + } +pdfjs-editor-comments-sidebar-close-button = + .title = Lat att sidestolpen + .aria-label = Lat att sidestolpen +pdfjs-editor-comments-sidebar-close-button-label = Lat att sidestolpen +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Ser du noko som er verdt å merke seg? Marker det og legg igjen ein kommentar. +pdfjs-editor-comments-sidebar-no-comments-link = Les meir ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Alt-tekst -pdfjs-editor-alt-text-edit-button-label = Rediger alt-tekst tekst +pdfjs-editor-alt-text-edit-button = + .aria-label = Rediger alt-tekst tekst pdfjs-editor-alt-text-dialog-label = Vel eit alternativ pdfjs-editor-alt-text-dialog-description = Alt-tekst (alternativ tekst) hjelper når folk ikkje kan sjå bildet eller når det ikkje vert lasta inn. pdfjs-editor-alt-text-add-description-label = Legg til ei skildring @@ -341,13 +416,38 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Til dømes, «Ein ung mann set seg ved eit bord for å ete eit måltid» +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alt-tekst ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. +pdfjs-editor-resizer-top-left = + .aria-label = Øvste venstre hjørne – endre størrelse +pdfjs-editor-resizer-top-middle = + .aria-label = Øvst i midten — endre størrelse +pdfjs-editor-resizer-top-right = + .aria-label = Øvste høgre hjørne – endre størrelse +pdfjs-editor-resizer-middle-right = + .aria-label = Midt til høgre – endre størrelse +pdfjs-editor-resizer-bottom-right = + .aria-label = Nedste høgre hjørne – endre størrelse +pdfjs-editor-resizer-bottom-middle = + .aria-label = Nedst i midten — endre størrelse +pdfjs-editor-resizer-bottom-left = + .aria-label = Nedste venstre hjørne – endre størrelse +pdfjs-editor-resizer-middle-left = + .aria-label = Midt til venstre — endre størrelse ## Color picker +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Uthevingsfarge +pdfjs-editor-colorpicker-button = + .title = Endre farge +pdfjs-editor-colorpicker-dropdown = + .aria-label = Fargeval pdfjs-editor-colorpicker-yellow = .title = Gul pdfjs-editor-colorpicker-green = @@ -358,3 +458,290 @@ .title = Rosa pdfjs-editor-colorpicker-red = .title = Raud + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Vis alle +pdfjs-editor-highlight-show-all-button = + .title = Vis alle + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Rediger alternativ tekst (bildeskildring) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Legg til alternativ tekst (bildeskildring) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Skriv skildringa di her… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Kort skildring for personar som ikkje kan sjå bildet, eller når bildet ikkje lastar inn. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Denne alternative teksten vart oppretta automatisk, og kan vere unøyaktig. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Les meir +pdfjs-editor-new-alt-text-create-automatically-button-label = Opprett alternativ tekt automatisk +pdfjs-editor-new-alt-text-not-now-button = Ikkje no +pdfjs-editor-new-alt-text-error-title = Klarte ikkje å opprette alternativ tekst automatisk +pdfjs-editor-new-alt-text-error-description = Skriv din eigen alternative tekst eller prøv igjen seinare. +pdfjs-editor-new-alt-text-error-close-button = Lat att +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Lastar ned KI-modell med alternativ tekst ({ $downloadedSize } av { $totalSize } MB) + .aria-valuetext = Lastar ned KI-modell med alternativ tekst ({ $downloadedSize } av { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternativ tekst lagt til +pdfjs-editor-new-alt-text-added-button-label = Alternativ tekst lagt til +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Manglande alternativ tekst +pdfjs-editor-new-alt-text-missing-button-label = Manglande alternativ tekst +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Vurder alternativ tekst +pdfjs-editor-new-alt-text-to-review-button-label = Vurder alternativ tekst +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Oppretta automatisk: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Alternative tekst-innstillingar for bilde +pdfjs-image-alt-text-settings-button-label = Alternative tekst-innstillingar for bilde +pdfjs-editor-alt-text-settings-dialog-label = Alternative tekst-innstillingar for bilde +pdfjs-editor-alt-text-settings-automatic-title = Automatisk alternativ tekst +pdfjs-editor-alt-text-settings-create-model-button-label = Opprett alternativ tekt automatisk +pdfjs-editor-alt-text-settings-create-model-description = Føreslår skildringar for å hjelpe folk som ikkje kan sjå bildet eller når bildet ikkje blir lasta inn. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = KI-modell for alternativ tekst ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Køyrer lokalt på eininga di slik at dataa dine blir verande private. Påkravd for automatisk alternativ tekst. +pdfjs-editor-alt-text-settings-delete-model-button = Slett +pdfjs-editor-alt-text-settings-download-model-button = Last ned +pdfjs-editor-alt-text-settings-downloading-model-button = Lastar ned… +pdfjs-editor-alt-text-settings-editor-title = Alternativ tekst-redigerar +pdfjs-editor-alt-text-settings-show-dialog-button-label = Vis alternativ tekst-redigerar direkte når du legg til eit bilde +pdfjs-editor-alt-text-settings-show-dialog-description = Hjelper deg med å sørgje for at alle bilda dine har alternativ tekst. +pdfjs-editor-alt-text-settings-close-button = Lat att + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Utheving lagt til +pdfjs-editor-freetext-added-alert = Tekst lagt til +pdfjs-editor-ink-added-alert = Teikning lagt til +pdfjs-editor-stamp-added-alert = Bilde lagt til +pdfjs-editor-signature-added-alert = Signatur lagt til + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Markering fjerna +pdfjs-editor-undo-bar-message-freetext = Tekst fjerna +pdfjs-editor-undo-bar-message-ink = Teikning fjerna +pdfjs-editor-undo-bar-message-stamp = Bilde fjerna +pdfjs-editor-undo-bar-message-signature = Signatur fjerna +pdfjs-editor-undo-bar-message-comment = Kommentar fjerna +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } kommentar fjerna + *[other] { $count } kommentarar fjerna + } +pdfjs-editor-undo-bar-undo-button = + .title = Angre +pdfjs-editor-undo-bar-undo-button-label = Angre +pdfjs-editor-undo-bar-close-button = + .title = Lat att +pdfjs-editor-undo-bar-close-button-label = Lat att + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Denne modalen lèt brukaren lage ein signatur for å leggje til eit PDF-dokument. Brukaren kan redigere namnet (som også fungerer som alt-teksten), og eventuelt lagre signaturen for gjenteken bruk. +pdfjs-editor-add-signature-dialog-title = Legg til ein signatur + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Type + .title = Type +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Teikne + .title = Teikne +pdfjs-editor-add-signature-image-button = Bilde + .title = Bilde + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Skriv inn signaturen din + .placeholder = Skriv inn signaturen din +pdfjs-editor-add-signature-draw-placeholder = Teikn signaturen din +pdfjs-editor-add-signature-draw-thickness-range-label = Tjukn +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Linjetjukn: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Drag ei fil hit for å laste opp +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Eller vel bildefiler + *[other] Eller vel bildefiler + } + +## Controls + +pdfjs-editor-add-signature-description-label = Skildring (alternativ tekst) +pdfjs-editor-add-signature-description-input = + .title = Skildring (alternativ tekst) +pdfjs-editor-add-signature-description-default-when-drawing = Signatur +pdfjs-editor-add-signature-clear-button-label = Fjern signatur +pdfjs-editor-add-signature-clear-button = + .title = Fjern signatur +pdfjs-editor-add-signature-save-checkbox = Lagre signatur +pdfjs-editor-add-signature-save-warning-message = Du har nådd grensa på 5 lagra signaturar. Fjern ein for å lagre ein ny. +pdfjs-editor-add-signature-image-upload-error-title = Klarte ikkje å oppdatere bilde +pdfjs-editor-add-signature-image-upload-error-description = Sjekk nettverkstilkoplinga eller prøv eit annet bilde. +pdfjs-editor-add-signature-image-no-data-error-title = Kan ikkje konvertere dette bildet til ein signatur +pdfjs-editor-add-signature-image-no-data-error-description = Prøv å laste opp eit anna bilde. +pdfjs-editor-add-signature-error-close-button = Lat att + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Avbryt +pdfjs-editor-add-signature-add-button = Legg til +pdfjs-editor-edit-signature-update-button = Oppdater + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Rediger kommentar +pdfjs-editor-edit-comment-popup-button = + .title = Rediger kommentar +pdfjs-editor-delete-comment-popup-button-label = Fjern kommentar +pdfjs-editor-delete-comment-popup-button = + .title = Fjern kommentar +pdfjs-show-comment-button = + .title = Vis kommentar + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Rediger kommentar +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Oppdater +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Legg til kommentar +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Legg til +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Byrje å skrive… +pdfjs-editor-edit-comment-dialog-cancel-button = Avbryt + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Legg til kommentar + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Vis/skjul sidestolpe (dokumentet inneheld miniatyrbilde/disposisjon/vedlegg/lag) +pdfjs-toggle-views-manager-button1-label = Handsam sider +pdfjs-views-manager-sidebar = + .aria-label = Sidestolpe +pdfjs-views-manager-sidebar-resizer = + .aria-label = Endre storleiken på sidestolpen +pdfjs-views-manager-view-selector-button = + .title = Vis +pdfjs-views-manager-view-selector-button-label = Visningar +pdfjs-views-manager-pages-title = Sider +pdfjs-views-manager-outlines-title1 = Dokumentoversikt + .title = Dokumentoversikt (dobbelklikk for å utvide/skjule alle element) +pdfjs-views-manager-attachments-title = Vedlegg +pdfjs-views-manager-layers-title1 = Lag + .title = Lag (dobbelklikk for å tilbakestille alle lag til standardtilstand) +pdfjs-views-manager-pages-option-label = Sider +pdfjs-views-manager-outlines-option-label = Dokumentdisposisjon +pdfjs-views-manager-attachments-option-label = Vedlegg +pdfjs-views-manager-layers-option-label = Lag +pdfjs-views-manager-add-file-button = + .title = Legg til fil +pdfjs-views-manager-add-file-button-label = Legg til fil +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } vald + *[other] { $count } valde + } +pdfjs-views-manager-pages-status-none-action-label = Vel sider +pdfjs-views-manager-pages-status-action-button-label = Handsam +pdfjs-views-manager-pages-status-copy-button-label = Kopier +pdfjs-views-manager-pages-status-cut-button-label = Klipp ut +pdfjs-views-manager-pages-status-delete-button-label = Slett +pdfjs-views-manager-pages-status-export-selected-button-label = Eksporter valde… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 side klipt ut + *[other] { $count } sider klipte ut + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 side kopiert + *[other] { $count } sider kopierte + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 side sletta + *[other] { $count } sider sletta + } +pdfjs-views-manager-pages-status-waiting-ready-label = Klargjer fila di… +pdfjs-views-manager-pages-status-waiting-uploading-label = Lastar opp fila… +pdfjs-views-manager-status-warning-cut-label = Klarte ikkje å klippe ut. Oppdater sida og prøv på nytt. +pdfjs-views-manager-status-warning-copy-label = Klarte ikkje å kopiere. Oppdater sida og prøv på nytt. +pdfjs-views-manager-status-warning-delete-label = Klarte ikkje å slette. Oppdater sida og prøv på nytt. +pdfjs-views-manager-status-warning-save-label = Klarte ikkje å lagre. Oppdater sida og prøv på nytt. +pdfjs-views-manager-status-undo-button-label = Angre +pdfjs-views-manager-status-done-button-label = Ferdig +pdfjs-views-manager-status-close-button = + .title = Lat att +pdfjs-views-manager-status-close-button-label = Lat att +pdfjs-views-manager-paste-button-label = Lim inn +pdfjs-views-manager-paste-button-before = + .title = Lim inn før første side +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Lim inn etter side { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NY +pdfjs-views-manager-waiting-for-file = Lastar opp fila… +pdfjs-toggle-views-manager-button1 = + .title = Handsam sider + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Fjern lagra signatur +pdfjs-editor-delete-signature-button-label1 = Fjern lagra signatur + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Rediger skildring + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Rediger skildring diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/oc/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/oc/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/oc/viewer.ftl 2026-01-20 14:08:39.378689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/oc/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Pagina actuala (mostrar l’adreça de la pagina actuala) pdfjs-bookmark-button-label = Pagina actuala -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Dobrir amb l’aplicacion -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Dobrir amb l’aplicacion ## Secondary toolbar and context menu @@ -110,24 +104,12 @@ pdfjs-document-properties-button-label = Proprietats del document… pdfjs-document-properties-file-name = Nom del fichièr : pdfjs-document-properties-file-size = Talha del fichièr : -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } Ko ({ $size_b } octets) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } Mo ({ $size_b } octets) pdfjs-document-properties-title = Títol : pdfjs-document-properties-author = Autor : pdfjs-document-properties-subject = Subjècte : pdfjs-document-properties-keywords = Mots claus : pdfjs-document-properties-creation-date = Data de creacion : pdfjs-document-properties-modification-date = Data de modificacion : -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, a { $time } pdfjs-document-properties-creator = Creator : pdfjs-document-properties-producer = Aisina de conversion PDF : pdfjs-document-properties-version = Version PDF : @@ -226,6 +208,21 @@ pdfjs-find-entire-word-checkbox-label = Mots entièrs pdfjs-find-reached-top = Naut de la pagina atenh, perseguida del bas pdfjs-find-reached-bottom = Bas de la pagina atench, perseguida al començament +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] Ocurréncia { $current } de { $total } + *[other] Ocurréncia { $current } de { $total } + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Mai de { $limit } ocurréncia + *[other] Mai de { $limit } ocurréncias + } pdfjs-find-not-found = Frasa pas trobada ## Predefined zoom values @@ -255,10 +252,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date } a { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -266,6 +259,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Anotacion { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -286,13 +282,24 @@ pdfjs-editor-stamp-button = .title = Apondre o modificar d’imatges pdfjs-editor-stamp-button-label = Apondre o modificar d’imatges +pdfjs-editor-highlight-button = + .title = Subrelinhar +pdfjs-editor-highlight-button-label = Subrelinhar +pdfjs-highlight-floating-button1 = + .title = Subrelinhar + .aria-label = Subrelinhar +pdfjs-highlight-floating-button-label = Subrelinhar ## Remove button for the various kind of editor. +pdfjs-editor-remove-ink-button = + .title = Levar lo dessenh pdfjs-editor-remove-freetext-button = .title = Suprimir lo tèxte pdfjs-editor-remove-stamp-button = .title = Suprimir l’imatge +pdfjs-editor-remove-highlight-button = + .title = Levar lo suslinhatge ## @@ -307,34 +314,30 @@ pdfjs-editor-stamp-add-image-button-label = Apondre imatge # This refers to the thickness of the line used for free highlighting (not bound to text) pdfjs-editor-free-highlight-thickness-input = Espessor -pdfjs-free-text = +pdfjs-editor-signature-add-signature-button = + .title = Apondre una signatura novèla +pdfjs-editor-signature-add-signature-button-label = Apondre una signatura novèla +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Editor de tèxte -pdfjs-free-text-default-content = Començatz d’escriure… -pdfjs-ink = - .aria-label = Editor de dessenh -pdfjs-ink-canvas = - .aria-label = Imatge creat per l’utilizaire + .default-content = Començatz de picar… ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Tèxt alternatiu -pdfjs-editor-alt-text-edit-button-label = Modificar lo tèxt alternatiu pdfjs-editor-alt-text-dialog-label = Causir una opcion pdfjs-editor-alt-text-add-description-label = Apondre una descripcion pdfjs-editor-alt-text-cancel-button = Anullar pdfjs-editor-alt-text-save-button = Enregistrar -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - - ## Color picker # This means "Color used to highlight text" pdfjs-editor-highlight-colorpicker-label = Color de suslinhatge pdfjs-editor-colorpicker-button = .title = Cambiar de color +pdfjs-editor-colorpicker-dropdown = + .aria-label = Causida de colors pdfjs-editor-colorpicker-yellow = .title = Jaune pdfjs-editor-colorpicker-green = @@ -352,3 +355,42 @@ pdfjs-editor-highlight-show-all-button-label = O afichar tot pdfjs-editor-highlight-show-all-button = .title = O afichar tot + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +pdfjs-editor-new-alt-text-not-now-button = Pas ara +pdfjs-editor-new-alt-text-error-close-button = Tampar + +## Image alt-text settings + +pdfjs-editor-alt-text-settings-automatic-title = Tèxte alternatiu automatic +pdfjs-editor-alt-text-settings-create-model-button-label = Crear un tèxte alternatiu automaticament +pdfjs-editor-alt-text-settings-delete-model-button = Suprimir +pdfjs-editor-alt-text-settings-download-model-button = Telecargar +pdfjs-editor-alt-text-settings-downloading-model-button = Telecargament… +pdfjs-editor-alt-text-settings-editor-title = Editor de tèxte alternatiu +pdfjs-editor-alt-text-settings-close-button = Tampar + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-freetext = Tèxte suprimit +pdfjs-editor-undo-bar-message-ink = Dessenh suprimit +pdfjs-editor-undo-bar-message-stamp = Imatge suprimit +pdfjs-editor-undo-bar-undo-button = + .title = Anullar +pdfjs-editor-undo-bar-undo-button-label = Anullar +pdfjs-editor-undo-bar-close-button = + .title = Tampar +pdfjs-editor-undo-bar-close-button-label = Tampar + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NÒU diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/pa-IN/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/pa-IN/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/pa-IN/viewer.ftl 2026-01-20 14:08:39.379689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/pa-IN/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = ਮੌਜੂਦਾ ਸਫ਼਼ਾ (ਮੌਜੂਦਾ ਸਫ਼ੇ ਤੋਂ URL ਵੇਖੋ) pdfjs-bookmark-button-label = ਮੌਜੂਦਾ ਸਫ਼਼ਾ -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = ਐਪ ਵਿੱਚ ਖੋਲ੍ਹੋ -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = ਐਪ ਵਿੱਚ ਖੋਲ੍ਹੋ ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = ਫਾਈਲ ਦਾ ਨਾਂ: pdfjs-document-properties-file-size = ਫਾਈਲ ਦਾ ਆਕਾਰ: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } ਬਾਈਟ) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } ਬਾਈਟ) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } ਬਾਈਟ) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } ਬਾਈਟ) pdfjs-document-properties-title = ਟਾਈਟਲ: pdfjs-document-properties-author = ਲੇਖਕ: pdfjs-document-properties-subject = ਵਿਸ਼ਾ: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = ਬਣਾਉਣ ਦੀ ਮਿਤੀ: pdfjs-document-properties-modification-date = ਸੋਧ ਦੀ ਮਿਤੀ: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = ਨਿਰਮਾਤਾ: pdfjs-document-properties-producer = PDF ਪ੍ਰੋਡਿਊਸਰ: pdfjs-document-properties-version = PDF ਵਰਜਨ: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = { $page } ਸਫ਼ੇ ਦਾ ਥੰਮਨੇਲ +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = { $page } ਸਫ਼ੇ ਨੂੰ ਚੁਣੋ +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = { $total } ਵਿੱਚੋਂ { $page } ਸਫ਼ਾ ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } ਵਿਆਖਿਆ] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = ਲਿਖਤ +pdfjs-editor-color-picker-free-text-input = + .title = ਲਿਖਤ ਦੇ ਰੰਗ ਨੂੰ ਬਦਲੋ pdfjs-editor-free-text-button-label = ਲਿਖਤ pdfjs-editor-ink-button = .title = ਵਾਹੋ +pdfjs-editor-color-picker-ink-input = + .title = ਡਰਾਇੰਗ ਰੰਗ ਨੂੰ ਬਦਲੋ pdfjs-editor-ink-button-label = ਵਾਹੋ pdfjs-editor-stamp-button = .title = ਚਿੱਤਰ ਜੋੜੋ ਜਾਂ ਸੋਧੋ @@ -304,6 +309,37 @@ pdfjs-editor-highlight-button = .title = ਹਾਈਲਾਈਟ pdfjs-editor-highlight-button-label = ਹਾਈਲਾਈਟ +pdfjs-highlight-floating-button1 = + .title = ਹਾਈਲਾਈਟ + .aria-label = ਹਾਈਲਾਈਟ +pdfjs-highlight-floating-button-label = ਹਾਈਲਾਈਟ +pdfjs-comment-floating-button = + .title = ਟਿੱਪਣੀ + .aria-label = ਟਿੱਪਣੀ +pdfjs-comment-floating-button-label = ਟਿੱਪਣੀ +pdfjs-editor-comment-button = + .title = ਟਿੱਪਣੀ + .aria-label = ਟਿੱਪਣੀ +pdfjs-editor-comment-button-label = ਟਿੱਪਣੀ +pdfjs-editor-signature-button = + .title = ਦਸਤਖ਼ਤ ਜੋੜੋ +pdfjs-editor-signature-button-label = ਦਸਤਖ਼ਤ ਜੋੜੋ + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = ਹਾਈਲਾਈਟ ਸੰਪਾਦਕ +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = ਡਰਾਇੰਗ ਸੰਪਾਦਕ +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = ਦਸਤਖ਼ਤ ਐਡੀਟਰ: { $description } +pdfjs-editor-stamp-editor = + .aria-label = ਚਿੱਤਰ ਸੰਪਾਦਕ ## Remove button for the various kind of editor. @@ -315,6 +351,8 @@ .title = ਚਿੱਤਰ ਨੂੰ ਹਟਾਓ pdfjs-editor-remove-highlight-button = .title = ਹਾਈਲਾਈਟ ਨੂੰ ਹਟਾਓ +pdfjs-editor-remove-signature-button = + .title = ਦਸਤਖ਼ਤ ਨੂੰ ਹਟਾਓ ## @@ -331,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = ਮੋਟਾਈ pdfjs-editor-free-highlight-thickness-title = .title = ਚੀਜ਼ਾਂ ਨੂੰ ਹੋਰ ਲਿਖਤਾਂ ਤੋਂ ਉਘਾੜਨ ਸਮੇਂ ਮੋਟਾਈ ਨੂੰ ਬਦਲੋ -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = ਦਸਤਖ਼ਤ ਕੰਟਰੋਲ ਅਤੇ ਸੰਭਾਲੇ ਹੋਏ ਦਸਤਖ਼ਤ +pdfjs-editor-signature-add-signature-button = + .title = ਨਵੇਂ ਦਸਤਖ਼ਤ ਨੂੰ ਜੋੜੋ +pdfjs-editor-signature-add-signature-button-label = ਨਵੇਂ ਦਸਤਖ਼ਤ ਨੂੰ ਜੋੜੋ +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = ਸੰਭਾਲੇ ਦਸਤਖ਼ਤ: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = ਲਿਖਤ ਐਡੀਟਰ -pdfjs-free-text-default-content = …ਲਿਖਣਾ ਸ਼ੁਰੂ ਕਰੋ -pdfjs-ink = - .aria-label = ਵਹਾਉਣ ਐਡੀਟਰ -pdfjs-ink-canvas = - .aria-label = ਵਰਤੋਂਕਾਰ ਵਲੋਂ ਬਣਾਇਆ ਚਿੱਤਰ + .default-content = …ਲਿਖਣਾ ਸ਼ੁਰੂ ਕਰੋ +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] ਟਿੱਪਣੀ + *[other] ਟਿੱਪਣੀਆਂ + } +pdfjs-editor-comments-sidebar-close-button = + .title = ਬਾਹੀ ਨੂੰ ਬੰਦ ਕਰੋ + .aria-label = ਬਾਹੀ ਨੂੰ ਬੰਦ ਕਰੋ +pdfjs-editor-comments-sidebar-close-button-label = ਬਾਹੀ ਨੂੰ ਬੰਦ ਕਰੋ +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = ਕੀ ਕੁਝ ਧਿਆਨ ਦੇਣ ਯੋਗ ਵੇਖਿਆ ਹੈ? ਇਸ ਨੂੰ ਉਘਾੜੋ ਅਤੇ ਟਿੱਪਣੀ ਦਿਓ। +pdfjs-editor-comments-sidebar-no-comments-link = ਹੋਰ ਜਾਣੋ ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = ਬਦਲਵੀਂ ਲਿਖਤ -pdfjs-editor-alt-text-edit-button-label = ਬਦਲਵੀ ਲਿਖਤ ਨੂੰ ਸੋਧੋ +pdfjs-editor-alt-text-edit-button = + .aria-label = ਬਦਲਵੀ ਲਿਖਤ ਨੂੰ ਸੋਧੋ pdfjs-editor-alt-text-dialog-label = ਚੋਣ ਕਰੋ pdfjs-editor-alt-text-dialog-description = ਚਿੱਤਰ ਨਾ ਦਿੱਸਣ ਜਾਂ ਲੋਡ ਨਾ ਹੋਣ ਦੀ ਹਾਲਤ ਵਿੱਚ Alt ਲਿਖਤ (ਬਦਲਵੀਂ ਲਿਖਤ) ਲੋਕਾਂ ਲਈ ਮਦਦਗਾਰ ਹੁੰਦੀ ਹੈ। pdfjs-editor-alt-text-add-description-label = ਵਰਣਨ ਜੋੜੋ @@ -356,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = ਮਿਸਾਲ ਵਜੋਂ, “ਗੱਭਰੂ ਭੋਜਨ ਲੈ ਕੇ ਮੇਜ਼ ਉੱਤੇ ਬੈਠਾ ਹੈ” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = ਬਦਲਵੀਂ ਲਿਖਤ ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = ਉੱਤੇ ਖੱਬਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ -pdfjs-editor-resizer-label-top-middle = ਉੱਤੇ ਮੱਧ — ਮੁੜ-ਆਕਾਰ ਕਰੋ -pdfjs-editor-resizer-label-top-right = ਉੱਤੇ ਸੱਜਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ -pdfjs-editor-resizer-label-middle-right = ਮੱਧ ਸੱਜਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ -pdfjs-editor-resizer-label-bottom-right = ਹੇਠਾਂ ਸੱਜਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ -pdfjs-editor-resizer-label-bottom-middle = ਹੇਠਾਂ ਮੱਧ — ਮੁੜ-ਆਕਾਰ ਕਰੋ -pdfjs-editor-resizer-label-bottom-left = ਹੇਠਾਂ ਖੱਬਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ -pdfjs-editor-resizer-label-middle-left = ਮੱਧ ਖੱਬਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-top-left = + .aria-label = ਉੱਤੇ ਖੱਬਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-top-middle = + .aria-label = ਉੱਤੇ ਮੱਧ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-top-right = + .aria-label = ਉੱਤੇ ਸੱਜਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-middle-right = + .aria-label = ਮੱਧ ਸੱਜਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-bottom-right = + .aria-label = ਹੇਠਾਂ ਸੱਜਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-bottom-middle = + .aria-label = ਹੇਠਾਂ ਮੱਧ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-bottom-left = + .aria-label = ਹੇਠਾਂ ਖੱਬਾ ਕੋਨਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ +pdfjs-editor-resizer-middle-left = + .aria-label = ਮੱਧ ਖੱਬਾ — ਮੁੜ-ਆਕਾਰ ਕਰੋ ## Color picker @@ -387,3 +458,290 @@ .title = ਗੁਲਾਬੀ pdfjs-editor-colorpicker-red = .title = ਲਾਲ + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = ਸਭ ਵੇਖੋ +pdfjs-editor-highlight-show-all-button = + .title = ਸਭ ਵੇਖੋ + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = ਬਦਲਵੀਂ ਲਿਖਤ (ਚਿੱਤਰ ਦਾ ਵਰਣਨ) ਨੂੰ ਸੋਧੋ +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = ਬਦਲਵੀਂ ਲਿਖਤ (ਚਿੱਤਰ ਦਾ ਵਰਣਨ) ਨੂੰ ਜੋੜੋ +pdfjs-editor-new-alt-text-textarea = + .placeholder = …ਆਪਣਾ ਵਰਣਨਾ ਇੱਥੇ ਲਿਖੋ +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = ਲੋਕ, ਜੋ ਕਿ ਚਿੱਤਰ ਨਹੀਂ ਵੇਖ ਸਕਦੇ ਜਾਂ ਜਦ ਵੀ ਚਿੱਤਰਾਂ ਨੂੰ ਲੋਡ ਨਹੀਂ ਜਾ ਸਕਦਾ, ਉਸ ਲਈ ਛੋਟਾ ਵੇਰਵਾ ਦਿਓ। +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = ਇਹ ਬਦਲਵੀਂ ਲਿਖਤ ਆਪਣੇ-ਆਪ ਤਿਆਰ ਕੀਤੀ ਗਈ ਸੀ ਅਤੇ ਗਲਤ ਵੀ ਹੋ ਸਕਦੀ ਹੈ। +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = ਹੋਰ ਜਾਣੋ +pdfjs-editor-new-alt-text-create-automatically-button-label = ਬਲਦਵੀਂ ਲਿਖਤ ਆਪਣੇ-ਆਪ ਬਣਾਓ +pdfjs-editor-new-alt-text-not-now-button = ਹੁਣੇ ਨਹੀਂ +pdfjs-editor-new-alt-text-error-title = ਬਦਲਵੀਂ ਲਿਖਤ ਆਪਣੇ-ਆਪ ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕੀ +pdfjs-editor-new-alt-text-error-description = ਆਪਣਾ ਖੁਦ ਦੀ ਬਦਲਵੀਂ ਲਿਖਤ ਲਿਖੋ ਜਾਂ ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ। +pdfjs-editor-new-alt-text-error-close-button = ਬੰਦ ਕਰੋ +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = ਬਦਲਵਾਂ ਲਿਖਤ AI ਮਾਡਲ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ ({ $totalSize } MB ਵਿੱਚੋਂ { $downloadedSize }) + .aria-valuetext = ਬਦਲਵਾਂ ਲਿਖਤ AI ਮਾਡਲ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ ({ $totalSize } MB ਵਿੱਚੋਂ { $downloadedSize }) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = ਬਦਲਵੀਂ ਲਿਖਤ ਜੋੜੀ +pdfjs-editor-new-alt-text-added-button-label = ਬਦਲਵੀਂ ਲਿਖਤ ਜੋੜੀ +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = ਬਦਲਵਾਂ ਲਿਖਤ ਗੁੰਮ ਹੈ +pdfjs-editor-new-alt-text-missing-button-label = ਬਦਲਵਾਂ ਲਿਖਤ ਗੁੰਮ ਹੈ +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = ਬਦਲਵੀਂ ਲਿਖਤ ਦਾ ਰੀਵਿਊ ਕਰੋ +pdfjs-editor-new-alt-text-to-review-button-label = ਬਦਲਵੀਂ ਲਿਖਤ ਦਾ ਰੀਵਿਊ ਕਰੋ +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = ਆਪਣੇ-ਆਪ ਬਣਾਇਆ: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = ਚਿੱਤਰ ਬਦਲਵੀਂ ਲਿਖਤ ਦੀਆਂ ਸੈਟਿੰਗਾਂ +pdfjs-image-alt-text-settings-button-label = ਚਿੱਤਰ ਬਦਲਵੀਂ ਲਿਖਤ ਦੀਆਂ ਸੈਟਿੰਗਾਂ +pdfjs-editor-alt-text-settings-dialog-label = ਚਿੱਤਰ ਬਦਲਵੀਂ ਲਿਖਤ ਦੀਆਂ ਸੈਟਿੰਗਾਂ +pdfjs-editor-alt-text-settings-automatic-title = ਆਟੋਮਮੈਟਿਕ ਬਦਲਵੀਂ ਲਿਖਤ +pdfjs-editor-alt-text-settings-create-model-button-label = ਬਲਦਵੀਂ ਲਿਖਤ ਆਪਣੇ-ਆਪ ਬਣਾਓ +pdfjs-editor-alt-text-settings-create-model-description = ਚਿੱਤਰ ਨਾ ਵੇਖ ਸਕਣ ਵਾਲੇ ਲੋਕਾਂ ਦੀ ਮਦਦ ਜਾਂ ਜਦ ਵੀ ਚਿੱਤਰਾਂ ਨੂੰ ਲੋਡ ਨਹੀਂ ਜਾ ਸਕਦਾ, ਉਸ ਲਈ ਛੋਟਾ ਵੇਰਵਾ ਦਿਓ। +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = ਬਦਲਵੀ ਲਿਖਤ ਲਈ AI ਮਾਡਲ ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਉੱਤੇ ਲੋਕਲ ਹੀ ਚੱਲਦਾ ਹੋਣ ਕਰਕੇ ਤੁਹਾਡਾ ਡਾਟਾ ਪ੍ਰਾਈਵੇਟ ਹੀ ਰਹਿੰਦਾ ਹੈ। ਆਟੋਮੈਟਿਕ ਬਦਲਵੀਂ ਲਿਖਤ ਲਈ ਚਾਹੀਦਾ ਹੈ। +pdfjs-editor-alt-text-settings-delete-model-button = ਹਟਾਓ +pdfjs-editor-alt-text-settings-download-model-button = ਡਾਊਨਲੋਡ +pdfjs-editor-alt-text-settings-downloading-model-button = …ਨੂੰ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ +pdfjs-editor-alt-text-settings-editor-title = ਬਦਲਵੀਂ ਲਿਖਤ ਐਡੀਟਰ +pdfjs-editor-alt-text-settings-show-dialog-button-label = ਜਦੋਂ ਵਿੱਚ ਚਿੱਤਰ ਜੋੜਿਆ ਜਾਵੇ ਤਾਂ ਫ਼ੌਰਨ ਬਦਲਵੀ ਲਿਖਤ ਸੰਪਾਦਕ ਵੇਖਾਓ +pdfjs-editor-alt-text-settings-show-dialog-description = ਤੁਹਾਡੀ ਮਦਦ ਕਰਦਾ ਹੈ ਕਿ ਤੁਹਾਡੇ ਸਾਰੇ ਚਿੱਤਰਾਂ ਲਈ ਬਦਲਵੀਂ ਲਿਖਤ ਮੌਜੂਦ ਹੋਵੇ। +pdfjs-editor-alt-text-settings-close-button = ਬੰਦ ਕਰੋ + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = ਹਾਈਲਾਈਟ ਨੂੰ ਜੋੜਿਆ +pdfjs-editor-freetext-added-alert = ਲਿਖਤ ਨੂੰ ਜੋੜਿਆ ਗਿਆ +pdfjs-editor-ink-added-alert = ਡਰਾਇੰਗ ਨੂੰ ਜੋੜਿਆ +pdfjs-editor-stamp-added-alert = ਚਿੱਤਰ ਨੂੰ ਜੋੜਿਆ +pdfjs-editor-signature-added-alert = ਦਸਤਖ਼ਤਾਂ ਨੂੰ ਜੋੜਿਆ + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = ਹਾਈਲਾਈਟ ਨੂੰ ਹਟਾਇਆ ਗਿਆ +pdfjs-editor-undo-bar-message-freetext = ਲਿਖਤ ਨੂੰ ਹਟਾਇਆ ਗਿਆ +pdfjs-editor-undo-bar-message-ink = ਡਰਾਇੰਗ ਨੂੰ ਹਟਾਇਆ ਗਿਆ +pdfjs-editor-undo-bar-message-stamp = ਚਿੱਤਰ ਨੂੰ ਹਟਾਇਆ ਗਿਆ +pdfjs-editor-undo-bar-message-signature = ਦਸਤਖ਼ਤ ਨੂੰ ਹਟਾਇਆ +pdfjs-editor-undo-bar-message-comment = ਟਿੱਪਣੀ ਨੂੰ ਹਟਾਇਆ ਗਿਆ +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } ਵਿਆਖਿਆ ਨੂੰ ਹਟਾਇਆ + *[other] { $count } ਵਿਆਖਿਆਵਾਂ ਨੂੰ ਹਟਾਇਆ + } +pdfjs-editor-undo-bar-undo-button = + .title = ਵਾਪਸ +pdfjs-editor-undo-bar-undo-button-label = ਵਾਪਸ +pdfjs-editor-undo-bar-close-button = + .title = ਬੰਦ ਕਰੋ +pdfjs-editor-undo-bar-close-button-label = ਬੰਦ ਕਰੋ + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = ਇਹ ਮਾਡਲ ਵਰਤੋਂਕਾਰ ਨੂੰ PDF ਦਸਤਾਵੇਜ਼ ਵਿੱਚ ਜੋੜਨ ਲਈ ਦਸਤਖ਼ਤ ਬਣਾਉਣ ਦਿੰਦਾ ਹੈ। ਵਰਤੋਂਕਾਰ ਨਾਂ ਨੂੰ ਸੋਧ ਸਕਦਾ ਹੈ (ਜੋ ਕਿ ਬਦਲਵੀਂ ਲਿਖਤ ਵਜੋਂ ਕੰਮ ਕਰੇਗਾ) ਅਤੇ ਦੁਬਾਰਾ ਵਰਤੋਂ ਕਰਨ ਲਈ ਦਸਤਖ਼ਤਾਂ ਨੂੰ ਸੰਭਾਲ ਵੀ ਸਕਦਾ ਹੈ। +pdfjs-editor-add-signature-dialog-title = ਦਸਤਖ਼ਤ ਨੂੰ ਜੋੜੋ + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = ਕਿਸਮ + .title = ਕਿਸਮ +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = ਵਾਹੋ + .title = ਵਾਹੋ +pdfjs-editor-add-signature-image-button = ਚਿੱਤਰ + .title = ਚਿੱਤਰ + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = ਆਪਣੇ ਦਸਤਖ਼ਤ ਨੂੰ ਟਾਈਪ ਕਰੋ + .placeholder = ਆਪਣੇ ਦਸਤਖ਼ਤ ਨੂੰ ਟਾਈਪ ਕਰੋ +pdfjs-editor-add-signature-draw-placeholder = ਆਪਣੇ ਦਸਤਖ਼ਤ ਨੂੰ ਵਾਹੋ +pdfjs-editor-add-signature-draw-thickness-range-label = ਮੋਟਾਈ +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = ਵਹਾਉਣ ਲਈ ਚੌੜਾਈ: { $thickness } +pdfjs-editor-add-signature-image-placeholder = ਅੱਪਲੋਡ ਕਰਨ ਲਈ ਫ਼ਾਇਲ ਨੂੰ ਇੱਥੇ ਖਿੱਚੋ +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] ਜਾਂ ਚਿੱਤਰ ਫ਼ਾਇਲਾਂ ਨੂੰ ਚੁਣੋ + *[other] ਜਾਂ ਚਿੱਤਰ ਫ਼ਾਇਲਾਂ ਦੀ ਝਲਕ ਵੇਖੋ + } + +## Controls + +pdfjs-editor-add-signature-description-label = ਵਰਣਨ (ਬਦਲਵੀਂ ਲਿਖਤ) +pdfjs-editor-add-signature-description-input = + .title = ਵਰਣਨ (ਬਦਲਵੀਂ ਲਿਖਤ) +pdfjs-editor-add-signature-description-default-when-drawing = ਦਸਤਖ਼ਤ +pdfjs-editor-add-signature-clear-button-label = ਦਸਤਖ਼ਤ ਨੂੰ ਮਿਟਾਓ +pdfjs-editor-add-signature-clear-button = + .title = ਦਸਤਖ਼ਤ ਨੂੰ ਮਿਟਾਓ +pdfjs-editor-add-signature-save-checkbox = ਦਸਤਖ਼ਤ ਨੂੰ ਸੰਭਾਲੋ +pdfjs-editor-add-signature-save-warning-message = ਤੁਸੀਂ ਵੱਧ ਤੋਂ ਵੱਧ 5 ਸੰਭਾਲੇ ਦਸਤਖ਼ਤਾਂ ਦੀ ਹੱਦ ਤੱਕ ਅੱਪੜੇ। ਹੋਰ ਸੰਭਾਲਣ ਲਈ ਇੱਕ ਨੂੰ ਹਟਾਓ। +pdfjs-editor-add-signature-image-upload-error-title = ਚਿੱਤਰ ਨੂੰ ਅੱਪਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ +pdfjs-editor-add-signature-image-upload-error-description = ਆਪਣੇ ਕਨੈਕਸ਼ਨ ਦੀ ਜਾਂਚ ਕਰੋ ਜਾਂ ਹੋਰ ਚਿੱਤਰ ਨੂੰ ਅਜ਼ਮਾਓ। +pdfjs-editor-add-signature-image-no-data-error-title = ਇਸ ਚਿੱਤਰ ਨੂੰ ਦਸਤਖ਼ਤ ਵਿੱਚ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ ਹੈ +pdfjs-editor-add-signature-image-no-data-error-description = ਵੱਖਰੇ ਚਿੱਤਰ ਨੂੰ ਅੱਪਲੋਡ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ। +pdfjs-editor-add-signature-error-close-button = ਬੰਦ ਕਰੋ + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = ਰੱਦ ਕਰੋ +pdfjs-editor-add-signature-add-button = ਜੋੜੋ +pdfjs-editor-edit-signature-update-button = ਅੱਪਡੇਟ + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = ਟਿੱਪਣੀ ਨੂੰ ਸੋਧੋ +pdfjs-editor-edit-comment-popup-button = + .title = ਟਿੱਪਣੀ ਨੂੰ ਸੋਧੋ +pdfjs-editor-delete-comment-popup-button-label = ਟਿੱਪਣੀ ਨੂੰ ਹਟਾਓ +pdfjs-editor-delete-comment-popup-button = + .title = ਟਿੱਪਣੀ ਨੂੰ ਹਟਾਓ +pdfjs-show-comment-button = + .title = ਟਿੱਪਣੀ ਨੂੰ ਵੇਖਾਓ + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = ਟਿੱਪਣੀ ਨੂੰ ਸੋਧੋ +pdfjs-editor-edit-comment-dialog-save-button-when-editing = ਅੱਪਡੇਟ ਕਰੋ +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = ਟਿੱਪਣੀ ਜੋੜੋ +pdfjs-editor-edit-comment-dialog-save-button-when-adding = ਜੋੜੋ +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = …ਲਿਖਣਾ ਸ਼ੁਰੂ ਕਰੋ +pdfjs-editor-edit-comment-dialog-cancel-button = ਰੱਦ ਕਰੋ + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = ਟਿੱਪਣੀ ਜੋੜੋ + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = ਬਾਹੀ ਨੂੰ ਬਦਲੋ (ਦਸਤਾਵੇਜ਼ ਥੰਮਨੇਲ/ਆਨਲਾਈਨਅਟੈਚਮੈਂਟ/ਪਰਤਾਂ ਰੱਖਦਾ ਹੈ) +pdfjs-toggle-views-manager-button1-label = ਸਫ਼ਿਆਂ ਦਾ ਇੰਤਜ਼ਾਮ +pdfjs-views-manager-sidebar = + .aria-label = ਬਾਹੀ +pdfjs-views-manager-sidebar-resizer = + .aria-label = ਬਾਹੀ ਦਾ ਆਕਾਰ-ਬਦਲ +pdfjs-views-manager-view-selector-button = + .title = ਵੇਖੋ +pdfjs-views-manager-view-selector-button-label = ਵੇਖੋ +pdfjs-views-manager-pages-title = ਸਫ਼ੇ +pdfjs-views-manager-outlines-title1 = ਦਸਤਾਵੇਜ਼ ਖਾਕਾ + .title = ਦਸਤਾਵੇਜ਼ ਖਾਕਾ (ਸਾਰੀਆਂ ਚੀਜ਼ਾਂ ਨੂੰ ਫੈਲਾਉਣ/ਸਮੇਟਣ ਲਈ ਦੋ ਵਾਰ ਕਲਿੱਕ ਕਰੋ) +pdfjs-views-manager-attachments-title = ਅਟੈਚਮੈਂਟਾਂ +pdfjs-views-manager-layers-title1 = ਲੇਅਰ + .title = ਲੇਅਰ (ਸਾਰੀਆਂ ਲੇਅਰਾਂ ਨੂੰ ਮੂਲ ਹਾਲਤ ਵਿੱਚ ਲੈ ਜਾਣ ਲਈ ਦੋ ਵਾਰ ਕਲਿੱਕ ਕਰੋ) +pdfjs-views-manager-pages-option-label = ਸਫ਼ੇ +pdfjs-views-manager-outlines-option-label = ਦਸਤਾਵੇਜ਼ ਆਉਟਲਾਈਨ +pdfjs-views-manager-attachments-option-label = ਅਟੈਚਮੈਂਟਾਂ +pdfjs-views-manager-layers-option-label = ਪਰਤਾਂ +pdfjs-views-manager-add-file-button = + .title = ਫ਼ਾਇਲ ਨੂੰ ਜੋੜੋ +pdfjs-views-manager-add-file-button-label = ਫ਼ਾਇਲ ਨੂੰ ਜੋੜੋ +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } ਚੁਣਿਆ + *[other] { $count } ਚੁਣੇ + } +pdfjs-views-manager-pages-status-none-action-label = ਸਫ਼ੇ ਚੁਣੋ +pdfjs-views-manager-pages-status-action-button-label = ਬੰਦੋਬਸਤ +pdfjs-views-manager-pages-status-copy-button-label = ਕਾਪੀ ਕਰੋ +pdfjs-views-manager-pages-status-cut-button-label = ਕੱਟੋ +pdfjs-views-manager-pages-status-delete-button-label = ਹਟਾਓ +pdfjs-views-manager-pages-status-export-selected-button-label = …ਚੁਣੇ ਨੂੰ ਐਕਸਪੋਰਟ ਕਰੋ +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 ਸਫ਼ੇ ਨੂੰ ਕੱਟਿਆਂ + *[other] { $count } ਸਫ਼ਿਆਂ ਨੂੰ ਕੱਟਿਆਂ + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 ਸਫ਼ੇ ਨੂੰ ਕਾਪੀ ਕੀਤਾ + *[other] { $count } ਸਫ਼ਿਆਂ ਨੂੰ ਕਾਪੀ ਕੀਤਾ + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 ਸਫ਼ੇ ਨੂੰ ਹਟਾਇਆ + *[other] { $count } ਸਫ਼ਿਆਂ ਨੂੰ ਹਟਾਇਆ + } +pdfjs-views-manager-pages-status-waiting-ready-label = …ਤੁਹਾਡੀ ਫ਼ਾਇਲ ਨੂੰ ਤਿਆਰ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ +pdfjs-views-manager-pages-status-waiting-uploading-label = …ਫ਼ਾਇਲ ਨੂੰ ਅੱਪਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ +pdfjs-views-manager-status-warning-cut-label = ਕੱਟਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ। ਸਫ਼ੇ ਨੂੰ ਤਾਜ਼ਾ ਕਰਕੇ ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ। +pdfjs-views-manager-status-warning-copy-label = ਕਾਪੀ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਸਫ਼ੇ ਨੂੰ ਤਾਜ਼ਾ ਕਰਕੇ ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ। +pdfjs-views-manager-status-warning-delete-label = ਹਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ। ਸਫ਼ੇ ਨੂੰ ਤਾਜ਼ਾ ਕਰਕੇ ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ। +pdfjs-views-manager-status-warning-save-label = ਸੰਭਾਲਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ। ਸਫ਼ੇ ਨੂੰ ਤਾਜ਼ਾ ਕਰਕੇ ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ। +pdfjs-views-manager-status-undo-button-label = ਵਾਪਸ +pdfjs-views-manager-status-done-button-label = ਮੁਕੰਮਲ +pdfjs-views-manager-status-close-button = + .title = ਬੰਦ ਕਰੋ +pdfjs-views-manager-status-close-button-label = ਬੰਦ ਕਰੋ +pdfjs-views-manager-paste-button-label = ਚੇਪੋ +pdfjs-views-manager-paste-button-before = + .title = ਪਹਿਲੇ ਸਫ਼ੇ ਦੇ ਬਾਅਦ ਚੇਪੋ +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = { $page } ਸਫ਼ੇ ਦੇ ਬਾਅਦ ਚੇਪੋ +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = ਨਵਾਂ +pdfjs-views-manager-waiting-for-file = …ਫ਼ਾਇਲ ਨੂੰ ਅੱਪਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ +pdfjs-toggle-views-manager-button1 = + .title = ਸਫ਼ਿਆਂ ਦਾ ਇੰਤਜ਼ਾਮ + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = ਸੰਭਾਲੇ ਹੋਏ ਦਸਤਖ਼ਤ ਨੂੰ ਹਟਾਓ +pdfjs-editor-delete-signature-button-label1 = ਸੰਭਾਲੇ ਹੋਏ ਦਸਤਖ਼ਤ ਨੂੰ ਹਟਾਓ + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = ਵਰਣਨ ਨੂੰ ਸੋਧੋ + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = ਵਰਣਨ ਨੂੰ ਸੋਧੋ diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/pl/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/pl/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/pl/viewer.ftl 2026-01-20 14:08:39.379689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/pl/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Bieżąca strona (adres do otwarcia na bieżącej stronie) pdfjs-bookmark-button-label = Bieżąca strona -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Otwórz w aplikacji -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Otwórz w aplikacji ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Nazwa pliku: pdfjs-document-properties-file-size = Rozmiar pliku: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } B) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } B) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } B) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } B) pdfjs-document-properties-title = Tytuł: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Temat: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Data utworzenia: pdfjs-document-properties-modification-date = Data modyfikacji: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Utworzony przez: pdfjs-document-properties-producer = PDF wyprodukowany przez: pdfjs-document-properties-version = Wersja PDF: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniatura { $page }. strony +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Zaznacz { $page }. stronę +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = { $page }. strona z { $total } ## Find panel button title and messages @@ -272,10 +274,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -283,10 +281,13 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Przypis: { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password -pdfjs-password-label = Wprowadź hasło, aby otworzyć ten dokument PDF. +pdfjs-password-label = Wpisz hasło, aby otworzyć ten dokument PDF. pdfjs-password-invalid = Nieprawidłowe hasło. Proszę spróbować ponownie. pdfjs-password-ok-button = OK pdfjs-password-cancel-button = Anuluj @@ -296,9 +297,13 @@ pdfjs-editor-free-text-button = .title = Tekst +pdfjs-editor-color-picker-free-text-input = + .title = Zmień kolor tekstu pdfjs-editor-free-text-button-label = Tekst pdfjs-editor-ink-button = .title = Rysunek +pdfjs-editor-color-picker-ink-input = + .title = Zmień kolor rysunku pdfjs-editor-ink-button-label = Rysunek pdfjs-editor-stamp-button = .title = Dodaj lub edytuj obrazy @@ -306,6 +311,37 @@ pdfjs-editor-highlight-button = .title = Wyróżnij pdfjs-editor-highlight-button-label = Wyróżnij +pdfjs-highlight-floating-button1 = + .title = Wyróżnij + .aria-label = Wyróżnij +pdfjs-highlight-floating-button-label = Wyróżnij +pdfjs-comment-floating-button = + .title = Dodaj komentarz + .aria-label = Dodaj komentarz +pdfjs-comment-floating-button-label = Dodaj komentarz +pdfjs-editor-comment-button = + .title = Dodaj komentarz + .aria-label = Dodaj komentarz +pdfjs-editor-comment-button-label = Dodaj komentarz +pdfjs-editor-signature-button = + .title = Dodaj podpis +pdfjs-editor-signature-button-label = Dodaj podpis + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Edytor wyróżnienia +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Edytor rysunku +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Edytor podpisu: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Edytor obrazu ## Remove button for the various kind of editor. @@ -317,6 +353,8 @@ .title = Usuń obraz pdfjs-editor-remove-highlight-button = .title = Usuń wyróżnienie +pdfjs-editor-remove-signature-button = + .title = Usuń podpis ## @@ -333,19 +371,41 @@ pdfjs-editor-free-highlight-thickness-input = Grubość pdfjs-editor-free-highlight-thickness-title = .title = Zmień grubość podczas wyróżniania elementów innych niż tekst -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Sterowanie podpisami i zachowane podpisy +pdfjs-editor-signature-add-signature-button = + .title = Dodaj nowy podpis +pdfjs-editor-signature-add-signature-button-label = Dodaj nowy podpis +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Zachowany podpis: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Edytor tekstu -pdfjs-free-text-default-content = Zacznij pisać… -pdfjs-ink = - .aria-label = Edytor rysunku -pdfjs-ink-canvas = - .aria-label = Obraz utworzony przez użytkownika + .default-content = Zacznij pisać… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Komentarz + *[other] Komentarze + } +pdfjs-editor-comments-sidebar-close-button = + .title = Zamknij panel boczny + .aria-label = Zamknij panel boczny +pdfjs-editor-comments-sidebar-close-button-label = Zamknij panel boczny +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Widzisz coś godnego uwagi? Wyróżnij to i zostaw komentarz. +pdfjs-editor-comments-sidebar-no-comments-link = Więcej informacji ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Tekst alternatywny -pdfjs-editor-alt-text-edit-button-label = Edytuj tekst alternatywny +pdfjs-editor-alt-text-edit-button = + .aria-label = Edytuj tekst alternatywny pdfjs-editor-alt-text-dialog-label = Wybierz opcję pdfjs-editor-alt-text-dialog-description = Tekst alternatywny pomaga, kiedy ktoś nie może zobaczyć obrazu lub gdy się nie wczytuje. pdfjs-editor-alt-text-add-description-label = Dodaj opis @@ -358,18 +418,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Na przykład: „Młody człowiek siada przy stole, aby zjeść posiłek” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Tekst alternatywny ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Lewy górny róg — zmień rozmiar -pdfjs-editor-resizer-label-top-middle = Górny środkowy — zmień rozmiar -pdfjs-editor-resizer-label-top-right = Prawy górny róg — zmień rozmiar -pdfjs-editor-resizer-label-middle-right = Prawy środkowy — zmień rozmiar -pdfjs-editor-resizer-label-bottom-right = Prawy dolny róg — zmień rozmiar -pdfjs-editor-resizer-label-bottom-middle = Dolny środkowy — zmień rozmiar -pdfjs-editor-resizer-label-bottom-left = Lewy dolny róg — zmień rozmiar -pdfjs-editor-resizer-label-middle-left = Lewy środkowy — zmień rozmiar +pdfjs-editor-resizer-top-left = + .aria-label = Lewy górny róg — zmień rozmiar +pdfjs-editor-resizer-top-middle = + .aria-label = Górny środkowy — zmień rozmiar +pdfjs-editor-resizer-top-right = + .aria-label = Prawy górny róg — zmień rozmiar +pdfjs-editor-resizer-middle-right = + .aria-label = Prawy środkowy — zmień rozmiar +pdfjs-editor-resizer-bottom-right = + .aria-label = Prawy dolny róg — zmień rozmiar +pdfjs-editor-resizer-bottom-middle = + .aria-label = Dolny środkowy — zmień rozmiar +pdfjs-editor-resizer-bottom-left = + .aria-label = Lewy dolny róg — zmień rozmiar +pdfjs-editor-resizer-middle-left = + .aria-label = Lewy środkowy — zmień rozmiar ## Color picker @@ -389,3 +460,295 @@ .title = Różowy pdfjs-editor-colorpicker-red = .title = Czerwony + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Pokaż wszystkie +pdfjs-editor-highlight-show-all-button = + .title = Pokaż wszystkie + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Edytuj tekst alternatywny (opis obrazu) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Dodaj tekst alternatywny (opis obrazu) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Napisz tutaj opis… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Krótki opis dla osób, które nie widzą obrazu lub kiedy obraz się nie wczytuje. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Ten tekst alternatywny został utworzony automatycznie i może być niepoprawny. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Więcej informacji +pdfjs-editor-new-alt-text-create-automatically-button-label = Automatycznie utwórz tekst alternatywny +pdfjs-editor-new-alt-text-not-now-button = Nie teraz +pdfjs-editor-new-alt-text-error-title = Nie można automatycznie utworzyć tekstu alternatywnego +pdfjs-editor-new-alt-text-error-description = Proszę napisać własny tekst alternatywny lub spróbować ponownie później. +pdfjs-editor-new-alt-text-error-close-button = Zamknij +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Pobieranie modelu SI tekstu alternatywnego ({ $downloadedSize } z { $totalSize } MB) + .aria-valuetext = Pobieranie modelu SI tekstu alternatywnego ({ $downloadedSize } z { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Dodano tekst alternatywny +pdfjs-editor-new-alt-text-added-button-label = Dodano tekst alternatywny +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Brak tekstu alternatywnego +pdfjs-editor-new-alt-text-missing-button-label = Brak tekstu alternatywnego +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Przejrzyj tekst alternatywny +pdfjs-editor-new-alt-text-to-review-button-label = Przejrzyj tekst alternatywny +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Utworzono automatycznie: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Ustawienia tekstu alternatywnego obrazów +pdfjs-image-alt-text-settings-button-label = Ustawienia tekstu alternatywnego obrazów +pdfjs-editor-alt-text-settings-dialog-label = Ustawienia tekstu alternatywnego obrazów +pdfjs-editor-alt-text-settings-automatic-title = Automatyczny tekst alternatywny +pdfjs-editor-alt-text-settings-create-model-button-label = Automatyczne tworzenie tekstu alternatywnego +pdfjs-editor-alt-text-settings-create-model-description = Podpowiada opisy, które mogą pomóc osobom, które nie widzą obrazu lub kiedy obraz się nie wczytuje. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model SI tekstu alternatywnego ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Działa lokalnie na urządzeniu użytkownika, więc Twoje dane pozostają prywatne. Wymagane do funkcji automatycznego tekstu alternatywnego. +pdfjs-editor-alt-text-settings-delete-model-button = Usuń +pdfjs-editor-alt-text-settings-download-model-button = Pobierz +pdfjs-editor-alt-text-settings-downloading-model-button = Pobieranie… +pdfjs-editor-alt-text-settings-editor-title = Edytor tekstu alternatywnego +pdfjs-editor-alt-text-settings-show-dialog-button-label = Wyświetlanie edytora tekstu alternatywnego od razu po dodaniu obrazu +pdfjs-editor-alt-text-settings-show-dialog-description = Pomaga upewnić się, że wszystkie obrazy mają tekst alternatywny. +pdfjs-editor-alt-text-settings-close-button = Zamknij + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Dodano wyróżnione +pdfjs-editor-freetext-added-alert = Dodano tekst +pdfjs-editor-ink-added-alert = Dodano rysunek +pdfjs-editor-stamp-added-alert = Dodano obraz +pdfjs-editor-signature-added-alert = Dodano podpis + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Usunięto wyróżnienie +pdfjs-editor-undo-bar-message-freetext = Usunięto tekst +pdfjs-editor-undo-bar-message-ink = Usunięto rysunek +pdfjs-editor-undo-bar-message-stamp = Usunięto obraz +pdfjs-editor-undo-bar-message-signature = Usunięto podpis +pdfjs-editor-undo-bar-message-comment = Usunięto komentarz +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] Usunięto przypis + [few] Usunięto { $count } przypisy + *[many] Usunięto { $count } przypisów + } +pdfjs-editor-undo-bar-undo-button = + .title = Cofnij +pdfjs-editor-undo-bar-undo-button-label = Cofnij +pdfjs-editor-undo-bar-close-button = + .title = Zamknij +pdfjs-editor-undo-bar-close-button-label = Zamknij + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = To okno umożliwia utworzenie podpisu, który można dodać do dokumentu PDF. Można zmienić nazwę (która służy także jako tekst alternatywny) i opcjonalnie zachować podpis do ponownego użycia. +pdfjs-editor-add-signature-dialog-title = Dodanie podpisu + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Wpisz + .title = Wpisz +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Narysuj + .title = Narysuj +pdfjs-editor-add-signature-image-button = Obraz + .title = Obraz + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Wpisz swój podpis + .placeholder = Wpisz swój podpis +pdfjs-editor-add-signature-draw-placeholder = Narysuj swój podpis +pdfjs-editor-add-signature-draw-thickness-range-label = Grubość +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Grubość kreski: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Przeciągnij tutaj plik, aby go przesłać +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Lub wybierz plik obrazu + *[other] Lub przeglądaj pliki obrazów + } + +## Controls + +pdfjs-editor-add-signature-description-label = Opis (tekst alternatywny) +pdfjs-editor-add-signature-description-input = + .title = Opis (tekst alternatywny) +pdfjs-editor-add-signature-description-default-when-drawing = Podpis +pdfjs-editor-add-signature-clear-button-label = Usuń podpis +pdfjs-editor-add-signature-clear-button = + .title = Usuń podpis +pdfjs-editor-add-signature-save-checkbox = Zachowaj podpis +pdfjs-editor-add-signature-save-warning-message = Osiągnięto ograniczenie wynoszące pięć zachowanych podpisów. Usuń jeden, aby zachować więcej. +pdfjs-editor-add-signature-image-upload-error-title = Nie można przesłać obrazu +pdfjs-editor-add-signature-image-upload-error-description = Sprawdź połączenie sieciowe lub spróbuj przesłać inny obraz. +pdfjs-editor-add-signature-image-no-data-error-title = Nie można przekonwertować tego obrazu na podpis +pdfjs-editor-add-signature-image-no-data-error-description = Spróbuj przesłać inny obraz. +pdfjs-editor-add-signature-error-close-button = Zamknij + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Anuluj +pdfjs-editor-add-signature-add-button = Dodaj +pdfjs-editor-edit-signature-update-button = Aktualizuj + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Edytuj komentarz +pdfjs-editor-edit-comment-popup-button = + .title = Edytuj komentarz +pdfjs-editor-delete-comment-popup-button-label = Usuń komentarz +pdfjs-editor-delete-comment-popup-button = + .title = Usuń komentarz +pdfjs-show-comment-button = + .title = Wyświetl komentarz + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Edytuj komentarz +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualizuj +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Dodaj komentarz +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Dodaj +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Zacznij pisać… +pdfjs-editor-edit-comment-dialog-cancel-button = Anuluj + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Dodaj komentarz + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Przełącz panel boczny (dokument zawiera miniatury/konspekt/załączniki/warstwy) +pdfjs-toggle-views-manager-button1-label = Zarządzaj stronami +pdfjs-views-manager-sidebar = + .aria-label = Panel boczny +pdfjs-views-manager-sidebar-resizer = + .aria-label = Zmiana rozmiaru panelu bocznego +pdfjs-views-manager-view-selector-button = + .title = Widoki +pdfjs-views-manager-view-selector-button-label = Widoki +pdfjs-views-manager-pages-title = Strony +pdfjs-views-manager-outlines-title1 = Konspekt dokumentu + .title = Konspekt dokumentu (podwójne kliknięcie rozwija lub zwija wszystkie pozycje) +pdfjs-views-manager-attachments-title = Załączniki +pdfjs-views-manager-layers-title1 = Warstwy + .title = Warstwy (podwójne kliknięcie przywraca wszystkie warstwy do stanu domyślnego) +pdfjs-views-manager-pages-option-label = Strony +pdfjs-views-manager-outlines-option-label = Konspekt dokumentu +pdfjs-views-manager-attachments-option-label = Załączniki +pdfjs-views-manager-layers-option-label = Warstwy +pdfjs-views-manager-add-file-button = + .title = Dodaj plik +pdfjs-views-manager-add-file-button-label = Dodaj plik +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } zaznaczona + [few] { $count } zaznaczone + *[many] { $count } zaznaczonych + } +pdfjs-views-manager-pages-status-none-action-label = Zaznacz strony +pdfjs-views-manager-pages-status-action-button-label = Zarządzaj +pdfjs-views-manager-pages-status-copy-button-label = Kopiuj +pdfjs-views-manager-pages-status-cut-button-label = Wytnij +pdfjs-views-manager-pages-status-delete-button-label = Usuń +pdfjs-views-manager-pages-status-export-selected-button-label = Eksportuj zaznaczone… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] Wycięto 1 stronę + [few] Wycięto { $count } strony + *[many] Wycięto { $count } stron + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] Skopiowano 1 stronę + [few] Skopiowano { $count } strony + *[many] Skopiowano { $count } stron + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] Usunięto 1 stronę + [few] Usunięto { $count } strony + *[many] Usunięto { $count } stron + } +pdfjs-views-manager-pages-status-waiting-ready-label = Przygotowywanie pliku… +pdfjs-views-manager-pages-status-waiting-uploading-label = Przesyłanie pliku… +pdfjs-views-manager-status-warning-cut-label = Nie udało się wyciąć. Odśwież stronę i spróbuj ponownie. +pdfjs-views-manager-status-warning-copy-label = Nie udało się skopiować. Odśwież stronę i spróbuj ponownie. +pdfjs-views-manager-status-warning-delete-label = Nie udało się usunąć. Odśwież stronę i spróbuj ponownie. +pdfjs-views-manager-status-warning-save-label = Nie udało się zachować. Odśwież stronę i spróbuj ponownie. +pdfjs-views-manager-status-undo-button-label = Cofnij +pdfjs-views-manager-status-done-button-label = Gotowe +pdfjs-views-manager-status-close-button = + .title = Zamknij +pdfjs-views-manager-status-close-button-label = Zamknij +pdfjs-views-manager-paste-button-label = Wklej +pdfjs-views-manager-paste-button-before = + .title = Wklej przed pierwszą stroną +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Wklej po { $page }. stronie +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = Nowe +pdfjs-views-manager-waiting-for-file = Przesyłanie pliku… +pdfjs-toggle-views-manager-button1 = + .title = Zarządzaj stronami + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Usuń zachowany podpis +pdfjs-editor-delete-signature-button-label1 = Usuń zachowany podpis + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Edytuj opis + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Edycja opisu diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/pt-BR/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/pt-BR/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/pt-BR/viewer.ftl 2026-01-20 14:08:39.379689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/pt-BR/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Página atual (ver URL da página atual) pdfjs-bookmark-button-label = Pagina atual -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Abrir em um aplicativo -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Abrir em um aplicativo ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Nome do arquivo: pdfjs-document-properties-file-size = Tamanho do arquivo: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) pdfjs-document-properties-title = Título: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Assunto: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Data da criação: pdfjs-document-properties-modification-date = Data da modificação: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Criação: pdfjs-document-properties-producer = Criador do PDF: pdfjs-document-properties-version = Versão do PDF: @@ -176,8 +169,8 @@ pdfjs-toggle-sidebar-button = .title = Exibir/ocultar painel lateral pdfjs-toggle-sidebar-notification-button = - .title = Exibir/ocultar painel (documento contém estrutura/anexos/camadas) -pdfjs-toggle-sidebar-button-label = Exibir/ocultar painel + .title = Exibir/ocultar painel lateral (documento contém estrutura/anexos/camadas) +pdfjs-toggle-sidebar-button-label = Exibir/ocultar painel lateral pdfjs-document-outline-button = .title = Mostrar estrutura do documento (duplo-clique expande/recolhe todos os itens) pdfjs-document-outline-button-label = Estrutura do documento @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniatura da página { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Selecionar página { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Página { $page } de { $total } ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Anotação { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Texto +pdfjs-editor-color-picker-free-text-input = + .title = Mudar cor do texto pdfjs-editor-free-text-button-label = Texto pdfjs-editor-ink-button = .title = Desenho +pdfjs-editor-color-picker-ink-input = + .title = Mudar cor do desenho pdfjs-editor-ink-button-label = Desenho pdfjs-editor-stamp-button = .title = Adicionar ou editar imagens @@ -304,12 +309,37 @@ pdfjs-editor-highlight-button = .title = Destaque pdfjs-editor-highlight-button-label = Destaque -pdfjs-highlight-floating-button = - .title = Destaque pdfjs-highlight-floating-button1 = .title = Destaque .aria-label = Destaque pdfjs-highlight-floating-button-label = Destaque +pdfjs-comment-floating-button = + .title = Comentário + .aria-label = Comentário +pdfjs-comment-floating-button-label = Comentário +pdfjs-editor-comment-button = + .title = Comentar + .aria-label = Comentar +pdfjs-editor-comment-button-label = Comentar +pdfjs-editor-signature-button = + .title = Adicionar assinatura +pdfjs-editor-signature-button-label = Adicionar assinatura + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Editor de destaque +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Editor de desenho +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Editor de assinatura: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Editor de imagem ## Remove button for the various kind of editor. @@ -321,6 +351,8 @@ .title = Remover imagem pdfjs-editor-remove-highlight-button = .title = Remover destaque +pdfjs-editor-remove-signature-button = + .title = Remover assinatura ## @@ -337,43 +369,76 @@ pdfjs-editor-free-highlight-thickness-input = Espessura pdfjs-editor-free-highlight-thickness-title = .title = Mudar espessura ao destacar itens que não são texto -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Controles de assinatura e assinaturas salvas +pdfjs-editor-signature-add-signature-button = + .title = Adicionar nova assinatura +pdfjs-editor-signature-add-signature-button-label = Adicionar nova assinatura +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Assinatura salva: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Editor de texto -pdfjs-free-text-default-content = Comece digitando… -pdfjs-ink = - .aria-label = Editor de desenho -pdfjs-ink-canvas = - .aria-label = Imagem criada pelo usuário + .default-content = Comece a digitar… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Comentário + *[other] Comentários + } +pdfjs-editor-comments-sidebar-close-button = + .title = Fechar painel lateral + .aria-label = Fechar painel lateral +pdfjs-editor-comments-sidebar-close-button-label = Fechar painel lateral +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Viu algo digno de atenção? Destaque e deixe um comentário. +pdfjs-editor-comments-sidebar-no-comments-link = Saiba mais ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Texto alternativo -pdfjs-editor-alt-text-edit-button-label = Editar texto alternativo +pdfjs-editor-alt-text-edit-button = + .aria-label = Editar texto alternativo pdfjs-editor-alt-text-dialog-label = Escolha uma opção -pdfjs-editor-alt-text-dialog-description = O texto alternativo ajuda quando uma imagem não aparece ou não for carregada. -pdfjs-editor-alt-text-add-description-label = Adicione uma descrição -pdfjs-editor-alt-text-add-description-description = Procure usar uma ou duas frases que descrevam o assunto, o cenário ou as ações. +pdfjs-editor-alt-text-dialog-description = O texto alternativo ajuda quando uma imagem não aparece ou não é carregada. +pdfjs-editor-alt-text-add-description-label = Adicionar uma descrição +pdfjs-editor-alt-text-add-description-description = Procure usar uma ou duas frases que descrevam o assunto, cenário ou ação. pdfjs-editor-alt-text-mark-decorative-label = Marcar como decorativa -pdfjs-editor-alt-text-mark-decorative-description = Isto é usado para imagens ornamentais, como bordas ou marcas d'água. +pdfjs-editor-alt-text-mark-decorative-description = Isto é usado em imagens ornamentais, como bordas ou marcas d'água. pdfjs-editor-alt-text-cancel-button = Cancelar pdfjs-editor-alt-text-save-button = Salvar pdfjs-editor-alt-text-decorative-tooltip = Marcado como decorativa # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Por exemplo, “Um jovem senta-se à mesa para comer uma refeição” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Texto alternativo ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Canto superior esquerdo — redimensionar -pdfjs-editor-resizer-label-top-middle = No centro do topo — redimensionar -pdfjs-editor-resizer-label-top-right = Canto superior direito — redimensionar -pdfjs-editor-resizer-label-middle-right = No meio à direita — redimensionar -pdfjs-editor-resizer-label-bottom-right = Canto inferior direito — redimensionar -pdfjs-editor-resizer-label-bottom-middle = No centro da base — redimensionar -pdfjs-editor-resizer-label-bottom-left = Canto inferior esquerdo — redimensionar -pdfjs-editor-resizer-label-middle-left = No meio à esquerda — redimensionar +pdfjs-editor-resizer-top-left = + .aria-label = Canto superior esquerdo — redimensionar +pdfjs-editor-resizer-top-middle = + .aria-label = No centro do topo — redimensionar +pdfjs-editor-resizer-top-right = + .aria-label = Canto superior direito — redimensionar +pdfjs-editor-resizer-middle-right = + .aria-label = No meio à direita — redimensionar +pdfjs-editor-resizer-bottom-right = + .aria-label = Canto inferior direito — redimensionar +pdfjs-editor-resizer-bottom-middle = + .aria-label = No centro da base — redimensionar +pdfjs-editor-resizer-bottom-left = + .aria-label = Canto inferior esquerdo — redimensionar +pdfjs-editor-resizer-middle-left = + .aria-label = No meio à esquerda — redimensionar ## Color picker @@ -397,6 +462,286 @@ ## Show all highlights ## This is a toggle button to show/hide all the highlights. -pdfjs-editor-highlight-show-all-button-label = Mostrar tudo +pdfjs-editor-highlight-show-all-button-label = Mostrar todos pdfjs-editor-highlight-show-all-button = - .title = Mostrar tudo + .title = Mostrar todos + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descrição da imagem) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Adicionar texto alternativo (descrição da imagem) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Você pode escrever uma descrição aqui… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Descrição curta para pessoas que não conseguem ver a imagem ou quando a imagem não é carregada. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo foi criado automaticamente, pode não estar correto. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Saiba mais +pdfjs-editor-new-alt-text-create-automatically-button-label = Criar texto alternativo automaticamente +pdfjs-editor-new-alt-text-not-now-button = Agora não +pdfjs-editor-new-alt-text-error-title = Não foi possível criar texto alternativo automaticamente +pdfjs-editor-new-alt-text-error-description = Escreva seu próprio texto alternativo ou tente novamente mais tarde. +pdfjs-editor-new-alt-text-error-close-button = Fechar +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Baixando modelo de inteligência artificial de texto alternativo ({ $downloadedSize } de { $totalSize } MB) + .aria-valuetext = Baixando modelo de inteligência artificial de texto alternativo ({ $downloadedSize } de { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Texto alternativo adicionado +pdfjs-editor-new-alt-text-added-button-label = Texto alternativo adicionado +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Sem texto alternativo +pdfjs-editor-new-alt-text-missing-button-label = Sem texto alternativo +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Revisar texto alternativo +pdfjs-editor-new-alt-text-to-review-button-label = Revisar texto alternativo +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Criado automaticamente: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Configurações de texto alternativo de imagens +pdfjs-image-alt-text-settings-button-label = Configurações de texto alternativo de imagens +pdfjs-editor-alt-text-settings-dialog-label = Configurações de texto alternativo de imagens +pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo automático +pdfjs-editor-alt-text-settings-create-model-button-label = Criar texto alternativo automaticamente +pdfjs-editor-alt-text-settings-create-model-description = Sugere uma descrição para ajudar pessoas que não conseguem ver a imagem ou quando a imagem não é carregada. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modelo de inteligência artificial de texto alternativo ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Funciona localmente no seu dispositivo para que seus dados permaneçam privativos. Necessário para texto alternativo automático. +pdfjs-editor-alt-text-settings-delete-model-button = Excluir +pdfjs-editor-alt-text-settings-download-model-button = Baixar +pdfjs-editor-alt-text-settings-downloading-model-button = Baixando… +pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar o editor de texto alternativo imediatamente ao adicionar uma imagem +pdfjs-editor-alt-text-settings-show-dialog-description = Ajuda a assegurar que todas as suas imagens tenham texto alternativo. +pdfjs-editor-alt-text-settings-close-button = Fechar + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Destaque adicionado +pdfjs-editor-freetext-added-alert = Texto adicionado +pdfjs-editor-ink-added-alert = Desenho adicionado +pdfjs-editor-stamp-added-alert = Imagem adicionada +pdfjs-editor-signature-added-alert = Assinatura adicionada + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Destaque removido +pdfjs-editor-undo-bar-message-freetext = Texto removido +pdfjs-editor-undo-bar-message-ink = Desenho removido +pdfjs-editor-undo-bar-message-stamp = Imagem removida +pdfjs-editor-undo-bar-message-signature = Assinatura removida +pdfjs-editor-undo-bar-message-comment = Comentário removido +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } anotação removida + *[other] { $count } anotações removidas + } +pdfjs-editor-undo-bar-undo-button = + .title = Desfazer +pdfjs-editor-undo-bar-undo-button-label = Desfazer +pdfjs-editor-undo-bar-close-button = + .title = Fechar +pdfjs-editor-undo-bar-close-button-label = Fechar + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Esta janela permite ao usuário criar uma assinatura para adicionar a um documento PDF. O usuário pode editar o nome (que também serve como texto alternativo) e, opcionalmente, salvar a assinatura usar novamente. +pdfjs-editor-add-signature-dialog-title = Adicionar uma assinatura + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Digitar + .title = Digitar +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Desenhar + .title = Desenhar +pdfjs-editor-add-signature-image-button = Imagem + .title = Imagem + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Digite sua assinatura + .placeholder = Digite sua assinatura +pdfjs-editor-add-signature-draw-placeholder = Desenhe sua assinatura +pdfjs-editor-add-signature-draw-thickness-range-label = Espessura +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Espessura do desenho: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Arraste um arquivo aqui para enviar +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Ou escolha arquivos de imagem + *[other] Ou escolha arquivos de imagem + } + +## Controls + +pdfjs-editor-add-signature-description-label = Descrição (texto alternativo) +pdfjs-editor-add-signature-description-input = + .title = Descrição (texto alternativo) +pdfjs-editor-add-signature-description-default-when-drawing = Assinatura +pdfjs-editor-add-signature-clear-button-label = Limpar assinatura +pdfjs-editor-add-signature-clear-button = + .title = Limpar assinatura +pdfjs-editor-add-signature-save-checkbox = Salvar assinatura +pdfjs-editor-add-signature-save-warning-message = Você atingiu o limite de 5 assinaturas salvas. Remova uma para salvar mais. +pdfjs-editor-add-signature-image-upload-error-title = Não foi possível enviar a imagem +pdfjs-editor-add-signature-image-upload-error-description = Verifique sua conexão de rede ou tente outra imagem. +pdfjs-editor-add-signature-image-no-data-error-title = Não é possível converter esta imagem em uma assinatura +pdfjs-editor-add-signature-image-no-data-error-description = Experimente enviar outra imagem. +pdfjs-editor-add-signature-error-close-button = Fechar + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Cancelar +pdfjs-editor-add-signature-add-button = Adicionar +pdfjs-editor-edit-signature-update-button = Atualizar + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Editar comentário +pdfjs-editor-edit-comment-popup-button = + .title = Editar comentário +pdfjs-editor-delete-comment-popup-button-label = Remover comentário +pdfjs-editor-delete-comment-popup-button = + .title = Remover comentário +pdfjs-show-comment-button = + .title = Mostrar comentário + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Editar comentário +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Atualizar +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Adicionar comentário +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Adicionar +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Começar a digitar… +pdfjs-editor-edit-comment-dialog-cancel-button = Cancelar + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Adicionar comentário + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Exibir/ocultar painel lateral (documento contém miniaturas/estrutura/anexos/camadas) +pdfjs-toggle-views-manager-button1-label = Gerenciar páginas +pdfjs-views-manager-sidebar = + .aria-label = Painel lateral +pdfjs-views-manager-sidebar-resizer = + .aria-label = Redimensionador do painel lateral +pdfjs-views-manager-view-selector-button = + .title = Exibição +pdfjs-views-manager-view-selector-button-label = Exibição +pdfjs-views-manager-pages-title = Páginas +pdfjs-views-manager-outlines-title1 = Estrutura do documento + .title = Estrutura do documento (duplo clique para expandir/recolher todos os itens) +pdfjs-views-manager-attachments-title = Anexos +pdfjs-views-manager-layers-title1 = Camadas + .title = Camadas (duplo clique para redefinir todas as camadas ao estado padrão) +pdfjs-views-manager-pages-option-label = Páginas +pdfjs-views-manager-outlines-option-label = Estrutura do documento +pdfjs-views-manager-attachments-option-label = Anexos +pdfjs-views-manager-layers-option-label = Camadas +pdfjs-views-manager-add-file-button = + .title = Adicionar arquivo +pdfjs-views-manager-add-file-button-label = Adicionar arquivo +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } selecionada + *[other] { $count } selecionadas + } +pdfjs-views-manager-pages-status-none-action-label = Selecionar páginas +pdfjs-views-manager-pages-status-action-button-label = Gerenciar +pdfjs-views-manager-pages-status-copy-button-label = Copiar +pdfjs-views-manager-pages-status-cut-button-label = Cortar +pdfjs-views-manager-pages-status-delete-button-label = Excluir +pdfjs-views-manager-pages-status-export-selected-button-label = Exportar selecionados… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 página cortada + *[other] { $count } páginas cortadas + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 página copiada + *[other] { $count } páginas copiadas + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 página excluída + *[other] { $count } páginas excluídas + } +pdfjs-views-manager-pages-status-waiting-ready-label = Preparando seu arquivo… +pdfjs-views-manager-pages-status-waiting-uploading-label = Enviando arquivo… +pdfjs-views-manager-status-warning-cut-label = Não foi possível cortar. Atualize a página e tente novamente. +pdfjs-views-manager-status-warning-copy-label = Não foi possível copiar. Atualize a página e tente novamente. +pdfjs-views-manager-status-warning-delete-label = Não foi possível excluir. Atualize a página e tente novamente. +pdfjs-views-manager-status-warning-save-label = Não foi possível salvar. Atualize a página e tente novamente. +pdfjs-views-manager-status-undo-button-label = Desfazer +pdfjs-views-manager-status-done-button-label = Pronto +pdfjs-views-manager-status-close-button = + .title = Fechar +pdfjs-views-manager-status-close-button-label = Fechar +pdfjs-views-manager-paste-button-label = Colar +pdfjs-views-manager-paste-button-before = + .title = Colar antes da primeira página +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Colar após a página { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NOVIDADE +pdfjs-views-manager-waiting-for-file = Enviando arquivo… +pdfjs-toggle-views-manager-button1 = + .title = Gerenciar páginas + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Remover assinatura salva +pdfjs-editor-delete-signature-button-label1 = Remover assinatura salva + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Mudar descrição + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Mudar descrição diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/pt-PT/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/pt-PT/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/pt-PT/viewer.ftl 2026-01-20 14:08:39.379689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/pt-PT/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Página atual (ver URL da página atual) pdfjs-bookmark-button-label = Pagina atual -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Abrir na aplicação -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Abrir na aplicação ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Nome do ficheiro: pdfjs-document-properties-file-size = Tamanho do ficheiro: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) pdfjs-document-properties-title = Título: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Assunto: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Data de criação: pdfjs-document-properties-modification-date = Data de modificação: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Criador: pdfjs-document-properties-producer = Produtor de PDF: pdfjs-document-properties-version = Versão do PDF: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniatura da página { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Selecionar a página { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Página { $page } de { $total } ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Anotação { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Texto +pdfjs-editor-color-picker-free-text-input = + .title = Alterar cor do texto pdfjs-editor-free-text-button-label = Texto pdfjs-editor-ink-button = .title = Desenhar +pdfjs-editor-color-picker-ink-input = + .title = Alterar a cor de desenho pdfjs-editor-ink-button-label = Desenhar pdfjs-editor-stamp-button = .title = Adicionar ou editar imagens @@ -304,8 +309,37 @@ pdfjs-editor-highlight-button = .title = Destaque pdfjs-editor-highlight-button-label = Destaque -pdfjs-highlight-floating-button = - .title = Destaque +pdfjs-highlight-floating-button1 = + .title = Realçar + .aria-label = Realçar +pdfjs-highlight-floating-button-label = Realçar +pdfjs-comment-floating-button = + .title = Comentário + .aria-label = Comentário +pdfjs-comment-floating-button-label = Comentário +pdfjs-editor-comment-button = + .title = Comentário + .aria-label = Comentário +pdfjs-editor-comment-button-label = Comentário +pdfjs-editor-signature-button = + .title = Adicionar assinatura +pdfjs-editor-signature-button-label = Adicionar assinatura + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Editor de realce +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Editor de desenho +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Editor de assinatura: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Editor de imagem ## Remove button for the various kind of editor. @@ -317,6 +351,8 @@ .title = Remover imagem pdfjs-editor-remove-highlight-button = .title = Remover destaque +pdfjs-editor-remove-signature-button = + .title = Remover assinatura ## @@ -333,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Espessura pdfjs-editor-free-highlight-thickness-title = .title = Alterar espessura quando destacar itens que não sejam texto -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Controlos de assinatura e assinaturas guardadas +pdfjs-editor-signature-add-signature-button = + .title = Adicionar nova assinatura +pdfjs-editor-signature-add-signature-button-label = Adicionar nova assinatura +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Assinatura guardada: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Editor de texto -pdfjs-free-text-default-content = Começar a digitar… -pdfjs-ink = - .aria-label = Editor de desenho -pdfjs-ink-canvas = - .aria-label = Imagem criada pelo utilizador + .default-content = Comece a escrever… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Comentário + *[other] Comentários + } +pdfjs-editor-comments-sidebar-close-button = + .title = Fechar barra lateral + .aria-label = Fechar barra lateral +pdfjs-editor-comments-sidebar-close-button-label = Fechar barra lateral +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Viu algo interessante? Realce e adicione um comentário. +pdfjs-editor-comments-sidebar-no-comments-link = Saber mais ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Texto alternativo -pdfjs-editor-alt-text-edit-button-label = Editar texto alternativo +pdfjs-editor-alt-text-edit-button = + .aria-label = Editar texto alternativo pdfjs-editor-alt-text-dialog-label = Escolher uma opção pdfjs-editor-alt-text-dialog-description = O texto alternativo (texto alternativo) ajuda quando as pessoas não conseguem ver a imagem ou quando a mesma não é carregada. pdfjs-editor-alt-text-add-description-label = Adicionar uma descrição @@ -358,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Por exemplo, “Um jovem senta-se à mesa para comer uma refeição” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Texto alternativo ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Canto superior esquerdo — redimensionar -pdfjs-editor-resizer-label-top-middle = Superior ao centro — redimensionar -pdfjs-editor-resizer-label-top-right = Canto superior direito — redimensionar -pdfjs-editor-resizer-label-middle-right = Centro à direita — redimensionar -pdfjs-editor-resizer-label-bottom-right = Canto inferior direito — redimensionar -pdfjs-editor-resizer-label-bottom-middle = Inferior ao centro — redimensionar -pdfjs-editor-resizer-label-bottom-left = Canto inferior esquerdo — redimensionar -pdfjs-editor-resizer-label-middle-left = Centro à esquerda — redimensionar +pdfjs-editor-resizer-top-left = + .aria-label = Canto superior esquerdo — redimensionar +pdfjs-editor-resizer-top-middle = + .aria-label = Superior ao centro — redimensionar +pdfjs-editor-resizer-top-right = + .aria-label = Canto superior direito — redimensionar +pdfjs-editor-resizer-middle-right = + .aria-label = Centro à direita — redimensionar +pdfjs-editor-resizer-bottom-right = + .aria-label = Canto inferior direito — redimensionar +pdfjs-editor-resizer-bottom-middle = + .aria-label = Inferior ao centro — redimensionar +pdfjs-editor-resizer-bottom-left = + .aria-label = Canto inferior esquerdo — redimensionar +pdfjs-editor-resizer-middle-left = + .aria-label = Centro à esquerda — redimensionar ## Color picker @@ -396,3 +465,283 @@ pdfjs-editor-highlight-show-all-button-label = Mostrar tudo pdfjs-editor-highlight-show-all-button = .title = Mostrar tudo + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Editar texto alternativo (descrição da imagem) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Adicionar texto alternativo (descrição da imagem) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Escreva a sua descrição aqui… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Descrição curta para as pessoas que não podem visualizar a imagem ou quando a imagem não carrega. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Este texto alternativo foi criado automaticamente e pode ser impreciso. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Saber mais +pdfjs-editor-new-alt-text-create-automatically-button-label = Criar texto alternativo automaticamente +pdfjs-editor-new-alt-text-not-now-button = Agora não +pdfjs-editor-new-alt-text-error-title = Não foi possível criar o texto alternativo automaticamente +pdfjs-editor-new-alt-text-error-description = Escreva o seu próprio texto alternativo ou tente novamente mais tarde. +pdfjs-editor-new-alt-text-error-close-button = Fechar +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = A transferir o modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) + .aria-valuetext = A transferir o modelo de IA de texto alternativo ({ $downloadedSize } de { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Texto alternativo adicionado +pdfjs-editor-new-alt-text-added-button-label = Texto alternativo adicionado +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Texto alternativo em falta +pdfjs-editor-new-alt-text-missing-button-label = Texto alternativo em falta +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Rever texto alternativo +pdfjs-editor-new-alt-text-to-review-button-label = Rever texto alternativo +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Criado automaticamente: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Definições de texto alternativo da imagem +pdfjs-image-alt-text-settings-button-label = Definições de texto alternativo da imagem +pdfjs-editor-alt-text-settings-dialog-label = Definições de texto alternativo das imagens +pdfjs-editor-alt-text-settings-automatic-title = Texto alternativo automático +pdfjs-editor-alt-text-settings-create-model-button-label = Criar texto alternativo automaticamente +pdfjs-editor-alt-text-settings-create-model-description = Sugere descrições para ajudar as pessoas que não podem visualizar a imagem ou quando a imagem não carrega. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modelo de IA de texto alternativo ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = É executado localmente no seu dispositivo para que os seus dados se mantenham privados. É necessário para o texto alternativo automático. +pdfjs-editor-alt-text-settings-delete-model-button = Eliminar +pdfjs-editor-alt-text-settings-download-model-button = Transferir +pdfjs-editor-alt-text-settings-downloading-model-button = A transferir… +pdfjs-editor-alt-text-settings-editor-title = Editor de texto alternativo +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mostrar editor de texto alternativo imediatamente ao adicionar uma imagem +pdfjs-editor-alt-text-settings-show-dialog-description = Ajuda a garantir que todas as suas imagens tenham um texto alternativo. +pdfjs-editor-alt-text-settings-close-button = Fechar + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Destaque adicionado +pdfjs-editor-freetext-added-alert = Texto adicionado +pdfjs-editor-ink-added-alert = Desenho adicionado +pdfjs-editor-stamp-added-alert = Imagem adicionada +pdfjs-editor-signature-added-alert = Assinatura adicionada + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Destaque removido +pdfjs-editor-undo-bar-message-freetext = Texto removido +pdfjs-editor-undo-bar-message-ink = Desenho removido +pdfjs-editor-undo-bar-message-stamp = Imagem removida +pdfjs-editor-undo-bar-message-signature = Assinatura removida +pdfjs-editor-undo-bar-message-comment = Comentário removido +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } anotação removida + *[other] { $count } anotações removidas + } +pdfjs-editor-undo-bar-undo-button = + .title = Anular +pdfjs-editor-undo-bar-undo-button-label = Anular +pdfjs-editor-undo-bar-close-button = + .title = Fechar +pdfjs-editor-undo-bar-close-button-label = Fechar + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Este modo permite ao utilizador criar uma assinatura para adicionar a um documento PDF. O utilizador pode editar o nome (que também funciona como texto alternativo) e, opcionalmente, guardar a assinatura para utilizações frequentes. +pdfjs-editor-add-signature-dialog-title = Adicionar uma assinatura + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Digitar + .title = Digitar +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Desenhar + .title = Desenhar +pdfjs-editor-add-signature-image-button = Imagem + .title = Imagem + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Digite a sua assinatura + .placeholder = Digite a sua assinatura +pdfjs-editor-add-signature-draw-placeholder = Desenhe a sua assinatura +pdfjs-editor-add-signature-draw-thickness-range-label = Espessura +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Espessura do desenho: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Arraste um ficheiro aqui para carregar +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Ou escolha ficheiros de imagem + *[other] Ou explore ficheiros de imagem + } + +## Controls + +pdfjs-editor-add-signature-description-label = Descrição (texto alternativo) +pdfjs-editor-add-signature-description-input = + .title = Descrição (texto alternativo) +pdfjs-editor-add-signature-description-default-when-drawing = Assinatura +pdfjs-editor-add-signature-clear-button-label = Limpar assinatura +pdfjs-editor-add-signature-clear-button = + .title = Limpar assinatura +pdfjs-editor-add-signature-save-checkbox = Guardar assinatura +pdfjs-editor-add-signature-save-warning-message = Atingiu o limite de 5 assinaturas guardadas. Remova uma para guardar mais. +pdfjs-editor-add-signature-image-upload-error-title = Não foi possível carregar a imagem +pdfjs-editor-add-signature-image-upload-error-description = Verifique a sua ligação à rede ou tente outra imagem. +pdfjs-editor-add-signature-image-no-data-error-title = Não é possível converter esta imagem para uma assinatura +pdfjs-editor-add-signature-image-no-data-error-description = Tente enviar uma imagem diferente. +pdfjs-editor-add-signature-error-close-button = Fechar + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Cancelar +pdfjs-editor-add-signature-add-button = Adicionar +pdfjs-editor-edit-signature-update-button = Atualizar + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Editar comentário +pdfjs-editor-edit-comment-popup-button = + .title = Editar comentário +pdfjs-editor-delete-comment-popup-button-label = Remover comentário +pdfjs-editor-delete-comment-popup-button = + .title = Remover comentário +pdfjs-show-comment-button = + .title = Mostrar comentário + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Editar comentário +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Atualizar +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Adicionar comentário +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Adicionar +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Comece a digitar… +pdfjs-editor-edit-comment-dialog-cancel-button = Cancelar + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Adicionar comentário + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Alternar barra lateral (o documento inclui miniaturas/esquema/anexos/camadas) +pdfjs-toggle-views-manager-button1-label = Gerir páginas +pdfjs-views-manager-sidebar = + .aria-label = Barra lateral +pdfjs-views-manager-sidebar-resizer = + .aria-label = Redimensionador da barra lateral +pdfjs-views-manager-view-selector-button = + .title = Vistas +pdfjs-views-manager-view-selector-button-label = Vistas +pdfjs-views-manager-pages-title = Páginas +pdfjs-views-manager-outlines-title1 = Esquema do documento + .title = Esquema do documento (duplo clique para expandir/colapsar todos os itens) +pdfjs-views-manager-attachments-title = Anexos +pdfjs-views-manager-layers-title1 = Camadas + .title = Camadas (duplo clique para repor todas as camadas para o estado predefinido) +pdfjs-views-manager-pages-option-label = Páginas +pdfjs-views-manager-outlines-option-label = Esquema do documento +pdfjs-views-manager-attachments-option-label = Anexos +pdfjs-views-manager-layers-option-label = Camadas +pdfjs-views-manager-add-file-button = + .title = Adicionar ficheiro +pdfjs-views-manager-add-file-button-label = Adicionar ficheiro +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } selecionada + *[other] { $count } selecionadas + } +pdfjs-views-manager-pages-status-none-action-label = Selecionar páginas +pdfjs-views-manager-pages-status-action-button-label = Gerir +pdfjs-views-manager-pages-status-copy-button-label = Copiar +pdfjs-views-manager-pages-status-cut-button-label = Cortar +pdfjs-views-manager-pages-status-delete-button-label = Eliminar +pdfjs-views-manager-pages-status-export-selected-button-label = Exportar selecionado… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 página cortada + *[other] { $count } páginas cortadas + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 página copiada + *[other] { $count } páginas copiadas + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 página eliminada + *[other] { $count } páginas eliminadas + } +pdfjs-views-manager-pages-status-waiting-ready-label = A preparar o seu ficheiro… +pdfjs-views-manager-pages-status-waiting-uploading-label = A carregar ficheiro… +pdfjs-views-manager-status-warning-cut-label = Não foi possível cortar. Atualize a página e tente novamente. +pdfjs-views-manager-status-warning-copy-label = Não foi possível copiar. Atualize a página e tente novamente. +pdfjs-views-manager-status-warning-delete-label = Não foi possível eliminar. Atualize a página e tente novamente. +pdfjs-views-manager-status-warning-save-label = Não foi possível guardar. Atualize a página e tente novamente. +pdfjs-views-manager-status-undo-button-label = Desfazer +pdfjs-views-manager-status-done-button-label = Feito +pdfjs-views-manager-status-close-button = + .title = Fechar +pdfjs-views-manager-status-close-button-label = Fechar +pdfjs-views-manager-paste-button-label = Colar +pdfjs-views-manager-paste-button-before = + .title = Colar antes da primeira página +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Colar depois da página { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NOVO +pdfjs-views-manager-waiting-for-file = A carregar ficheiro… +pdfjs-toggle-views-manager-button1 = + .title = Gerir páginas + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Remover assinatura guardada +pdfjs-editor-delete-signature-button-label1 = Remover assinatura guardada + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Editar descrição + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Editar descrição diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/rm/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/rm/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/rm/viewer.ftl 2026-01-20 14:08:39.380689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/rm/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Pagina actuala (mussar l'URL da la pagina actuala) pdfjs-bookmark-button-label = Pagina actuala -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Avrir en ina app -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Avrir en ina app ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Num da la datoteca: pdfjs-document-properties-file-size = Grondezza da la datoteca: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) pdfjs-document-properties-title = Titel: pdfjs-document-properties-author = Autur: pdfjs-document-properties-subject = Tema: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Data da creaziun: pdfjs-document-properties-modification-date = Data da modificaziun: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date } { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Creà da: pdfjs-document-properties-producer = Creà il PDF cun: pdfjs-document-properties-version = Versiun da PDF: @@ -270,10 +263,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +270,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Annotaziun da { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +286,13 @@ pdfjs-editor-free-text-button = .title = Text +pdfjs-editor-color-picker-free-text-input = + .title = Midar la colur dal text pdfjs-editor-free-text-button-label = Text pdfjs-editor-ink-button = .title = Dissegnar +pdfjs-editor-color-picker-ink-input = + .title = Midar la colur per dissegnar pdfjs-editor-ink-button-label = Dissegnar pdfjs-editor-stamp-button = .title = Agiuntar u modifitgar maletgs @@ -304,8 +300,37 @@ pdfjs-editor-highlight-button = .title = Marcar pdfjs-editor-highlight-button-label = Marcar -pdfjs-highlight-floating-button = - .title = Relevar +pdfjs-highlight-floating-button1 = + .title = Marcar + .aria-label = Marcar +pdfjs-highlight-floating-button-label = Marcar +pdfjs-comment-floating-button = + .title = Commentar + .aria-label = Commentar +pdfjs-comment-floating-button-label = Commentar +pdfjs-editor-comment-button = + .title = Commentari + .aria-label = Commentari +pdfjs-editor-comment-button-label = Commentari +pdfjs-editor-signature-button = + .title = Agiuntar ina signatura +pdfjs-editor-signature-button-label = Agiuntar ina signatura + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Editur per relevar +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Editur per dissegnar +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Editur da signatura: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Editur per maletgs ## Remove button for the various kind of editor. @@ -317,6 +342,8 @@ .title = Allontanar la grafica pdfjs-editor-remove-highlight-button = .title = Allontanar l'emfasa +pdfjs-editor-remove-signature-button = + .title = Allontanar la signatura ## @@ -333,19 +360,41 @@ pdfjs-editor-free-highlight-thickness-input = Grossezza pdfjs-editor-free-highlight-thickness-title = .title = Midar la grossezza cun relevar elements betg textuals -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Controllas da signatura e signaturas memorisadas +pdfjs-editor-signature-add-signature-button = + .title = Agiuntar ina nova signatura +pdfjs-editor-signature-add-signature-button-label = Agiuntar ina nova signatura +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Signatura memorisada: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Editur da text -pdfjs-free-text-default-content = Cumenzar a tippar… -pdfjs-ink = - .aria-label = Editur dissegn -pdfjs-ink-canvas = - .aria-label = Maletg creà da l'utilisader + .default-content = Cumenza a tippar… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Commentari + *[other] Commentaris + } +pdfjs-editor-comments-sidebar-close-button = + .title = Serrar la trav laterala + .aria-label = Serrar la trav laterala +pdfjs-editor-comments-sidebar-close-button-label = Serrar la trav laterala +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Vesas insatge interessant? Marchescha la passascha ed agiuntescha in commentari. +pdfjs-editor-comments-sidebar-no-comments-link = Ulteriuras infurmaziuns ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Text alternativ -pdfjs-editor-alt-text-edit-button-label = Modifitgar il text alternativ +pdfjs-editor-alt-text-edit-button = + .aria-label = Modifitgar il text alternativ pdfjs-editor-alt-text-dialog-label = Tscherner ina opziun pdfjs-editor-alt-text-dialog-description = Il text alternativ (alt text) gida en cas che persunas na vesan betg il maletg u sch'i na reussescha betg d'al chargiar. pdfjs-editor-alt-text-add-description-label = Agiuntar ina descripziun @@ -358,18 +407,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Per exempel: «In um giuven sesa a maisa per mangiar in past» +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Text alternativ ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Chantun sura a sanestra — redimensiunar -pdfjs-editor-resizer-label-top-middle = Sura amez — redimensiunar -pdfjs-editor-resizer-label-top-right = Chantun sura a dretga — redimensiunar -pdfjs-editor-resizer-label-middle-right = Da vart dretga amez — redimensiunar -pdfjs-editor-resizer-label-bottom-right = Chantun sut a dretga — redimensiunar -pdfjs-editor-resizer-label-bottom-middle = Sutvart amez — redimensiunar -pdfjs-editor-resizer-label-bottom-left = Chantun sut a sanestra — redimensiunar -pdfjs-editor-resizer-label-middle-left = Vart sanestra amez — redimensiunar +pdfjs-editor-resizer-top-left = + .aria-label = Chantun sura a sanestra — redimensiunar +pdfjs-editor-resizer-top-middle = + .aria-label = Sura amez — redimensiunar +pdfjs-editor-resizer-top-right = + .aria-label = Chantun sura a dretga — redimensiunar +pdfjs-editor-resizer-middle-right = + .aria-label = Da vart dretga amez — redimensiunar +pdfjs-editor-resizer-bottom-right = + .aria-label = Chantun sut a dretga — redimensiunar +pdfjs-editor-resizer-bottom-middle = + .aria-label = Sutvart amez — redimensiunar +pdfjs-editor-resizer-bottom-left = + .aria-label = Chantun sut a sanestra — redimensiunar +pdfjs-editor-resizer-middle-left = + .aria-label = Vart sanestra amez — redimensiunar ## Color picker @@ -396,3 +456,184 @@ pdfjs-editor-highlight-show-all-button-label = Mussar tut pdfjs-editor-highlight-show-all-button = .title = Mussar tut + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Modifitgar il text alternativ (descripziun dal maletg) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Agiuntar in text alternativ (descripziun dal maletg) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Scriva qua tia descripziun… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Curta descripziun per persunas che na vesan betg il maletg u per cass en ils quals il maletg na vegn betg chargià. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Quest text alternativ è vegnì creà automaticamain ed è eventualmain nunprecis. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Ulteriuras infurmaziuns +pdfjs-editor-new-alt-text-create-automatically-button-label = Crear automaticamain il text alternativ +pdfjs-editor-new-alt-text-not-now-button = Betg ussa +pdfjs-editor-new-alt-text-error-title = I n’è betg reussì da crear automaticamain il text alternativ +pdfjs-editor-new-alt-text-error-description = Scriva per plaschair tes agen text alternativ u emprova pli tard anc ina giada. +pdfjs-editor-new-alt-text-error-close-button = Serrar +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Telechargiar il model IA da text alternativ ({ $downloadedSize } da { $totalSize } MB) + .aria-valuetext = Telechargiar il model IA da text alternativ ({ $downloadedSize } da { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Agiuntà text alternativ +pdfjs-editor-new-alt-text-added-button-label = Text alternativ agiuntà +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Text alternativ manca +pdfjs-editor-new-alt-text-missing-button-label = Text alternativ manca +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Repassar il text alternativ +pdfjs-editor-new-alt-text-to-review-button-label = Repassar il text alternativ +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creà automaticamain: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Parameters dal text alternativ da maletgs +pdfjs-image-alt-text-settings-button-label = Parameters dal text alternativ da maletgs +pdfjs-editor-alt-text-settings-dialog-label = Parameters dal text alternativ da maletgs +pdfjs-editor-alt-text-settings-automatic-title = Text alternativ automatic +pdfjs-editor-alt-text-settings-create-model-button-label = Crear automaticamain text alternativ +pdfjs-editor-alt-text-settings-create-model-description = Propona descripziuns per gidar a persunas che na vesan betg il maletg u per cass en ils quals il maletg na vegn betg chargià. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model IA da text alternativ ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Vegn exequì localmain sin tes apparat per che tias datas restian privatas. Necessari per text alternativ automatic. +pdfjs-editor-alt-text-settings-delete-model-button = Stizzar +pdfjs-editor-alt-text-settings-download-model-button = Telechargiar +pdfjs-editor-alt-text-settings-downloading-model-button = Telechargiar… +pdfjs-editor-alt-text-settings-editor-title = Editur per text alternativ +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mussar l’editur per text alternativ directamain cun agiuntar in maletg +pdfjs-editor-alt-text-settings-show-dialog-description = Ta gida a garantir che tut tes maletgs hajan in text alternativ. +pdfjs-editor-alt-text-settings-close-button = Serrar + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Agiuntà ina emfasa +pdfjs-editor-freetext-added-alert = Agiuntà in text +pdfjs-editor-ink-added-alert = Agiuntà in dissegn +pdfjs-editor-stamp-added-alert = Agiuntà in maletg +pdfjs-editor-signature-added-alert = Agiuntà ina signatura + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Allontanà la marcaziun +pdfjs-editor-undo-bar-message-freetext = Allontanà il text +pdfjs-editor-undo-bar-message-ink = Allontanà il dissegn +pdfjs-editor-undo-bar-message-stamp = Allontanà il maletg +pdfjs-editor-undo-bar-message-signature = Allontanà la signatura +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } annotaziun allontanada + *[other] { $count } annotaziuns allontanadas + } +pdfjs-editor-undo-bar-undo-button = + .title = Revocar +pdfjs-editor-undo-bar-undo-button-label = Revocar +pdfjs-editor-undo-bar-close-button = + .title = Serrar +pdfjs-editor-undo-bar-close-button-label = Serrar + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Questa fanestra permetta a l’utilisader da crear ina signatura per l’agiuntar ad in document PDF. L’utilisader po modifitgar il num (che serva era sco text alternativ) e memorisar opziunalmain la signatura per l’utilisar anc ina giada en l’avegnir. +pdfjs-editor-add-signature-dialog-title = Agiuntar ina signatura + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Tippar + .title = Tippar +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Dissegnar + .title = Dissegnar +pdfjs-editor-add-signature-image-button = Maletg + .title = Maletg + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Tippa tia signatura + .placeholder = Tippa tia signatura +pdfjs-editor-add-signature-draw-placeholder = Dissegna tia signatura +pdfjs-editor-add-signature-draw-thickness-range-label = Grossezza +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Grossezza dal stritg: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Trair na qua ina datoteca per la transferir +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] U tscherner datotecas da maletg + *[other] U tscherner datotecas da maletg + } + +## Controls + +pdfjs-editor-add-signature-description-label = Descripziun (text alternativ) +pdfjs-editor-add-signature-description-input = + .title = Descripziun (text alternativ) +pdfjs-editor-add-signature-description-default-when-drawing = Signatura +pdfjs-editor-add-signature-clear-button-label = Stizzar la signatura +pdfjs-editor-add-signature-clear-button = + .title = Stizzar la signatura +pdfjs-editor-add-signature-save-checkbox = Memorisar la signatura +pdfjs-editor-add-signature-save-warning-message = Ti has cuntanschì il dumber maximal da 5 signaturas memorisadas. Allontanar ina per memorisar in’autra. +pdfjs-editor-add-signature-image-upload-error-title = Impussibel da transferir il maletg +pdfjs-editor-add-signature-image-upload-error-description = Controllescha tia connexiun cun la rait u emprova cun in’auter maletg. +pdfjs-editor-add-signature-image-no-data-error-title = Impussibel da convertir quest maletg en ina signatura +pdfjs-editor-add-signature-image-no-data-error-description = Emprova per plaschair da transferir in auter maletg. +pdfjs-editor-add-signature-error-close-button = Serrar + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Interrumper +pdfjs-editor-add-signature-add-button = Agiuntar +pdfjs-editor-edit-signature-update-button = Actualisar + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Modifitgar il commentari +pdfjs-editor-edit-comment-popup-button = + .title = Modifitgar il commentari +pdfjs-editor-delete-comment-popup-button-label = Allontanar il commentari +pdfjs-editor-delete-comment-popup-button = + .title = Allontanar il commentari + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Modifitgar il commentari +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Agiuntar in commentari +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Cumenzar a tippar… +pdfjs-editor-edit-comment-dialog-cancel-button = Interrumper + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Allontanar la signatura memorisada +pdfjs-editor-delete-signature-button-label1 = Allontanar la signatura memorisada + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Modifitgar la descripziun + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Modifitgar la descripziun diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ro/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ro/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ro/viewer.ftl 2026-01-20 14:08:39.380689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ro/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -37,8 +37,20 @@ .title = Deschide un fișier pdfjs-open-file-button-label = Deschide pdfjs-print-button = - .title = Tipărește -pdfjs-print-button-label = Tipărește + .title = Printează +pdfjs-print-button-label = Printează +pdfjs-save-button = + .title = Salvează +pdfjs-save-button-label = Salvează +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Descarcă +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Descarcă +pdfjs-bookmark-button = + .title = Pagina curentă (Vezi URL din pagina curentă) +pdfjs-bookmark-button-label = Pagină curentă ## Secondary toolbar and context menu @@ -63,6 +75,9 @@ pdfjs-cursor-hand-tool-button = .title = Activează instrumentul mână pdfjs-cursor-hand-tool-button-label = Unealta mână +pdfjs-scroll-page-button = + .title = Folosește derularea paginilor +pdfjs-scroll-page-button-label = Derulare pagini pdfjs-scroll-vertical-button = .title = Folosește derularea verticală pdfjs-scroll-vertical-button-label = Derulare verticală @@ -90,13 +105,13 @@ pdfjs-document-properties-file-name = Numele fișierului: pdfjs-document-properties-file-size = Mărimea fișierului: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } byți) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byți) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } octeți) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } octeți) pdfjs-document-properties-title = Titlu: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Subiect: @@ -104,9 +119,8 @@ pdfjs-document-properties-creation-date = Data creării: pdfjs-document-properties-modification-date = Data modificării: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Autor: pdfjs-document-properties-producer = Producător PDF: pdfjs-document-properties-version = Versiune PDF: @@ -142,31 +156,40 @@ ## Print -pdfjs-print-progress-message = Se pregătește documentul pentru tipărire… +pdfjs-print-progress-message = Se pregătește documentul pentru printare… # Variables: # $progress (Number) - percent value pdfjs-print-progress-percent = { $progress }% -pdfjs-print-progress-close-button = Renunță -pdfjs-printing-not-supported = Avertisment: Tipărirea nu este suportată în totalitate de acest browser. -pdfjs-printing-not-ready = Avertisment: PDF-ul nu este încărcat complet pentru tipărire. +pdfjs-print-progress-close-button = Anulează +pdfjs-printing-not-supported = Avertisment: Printarea nu este suportată complet de acest browser. +pdfjs-printing-not-ready = Avertisment: PDF-ul nu este încărcat complet pentru printare. ## Tooltips and alt text for side panel toolbar buttons pdfjs-toggle-sidebar-button = .title = Comută bara laterală +pdfjs-toggle-sidebar-notification-button = + .title = Comută bara laterală (documentul conține schițe/atașamente/straturi) pdfjs-toggle-sidebar-button-label = Comută bara laterală pdfjs-document-outline-button = - .title = Afișează schița documentului (dublu-clic pentru a extinde/restrânge toate elementele) -pdfjs-document-outline-button-label = Schița documentului + .title = Afișează schița documentului (dă dublu clic pentru a extinde/restrânge toate elementele) +pdfjs-document-outline-button-label = Schiță a documentului pdfjs-attachments-button = .title = Afișează atașamentele pdfjs-attachments-button-label = Atașamente +pdfjs-layers-button = + .title = Afișează straturile (dă dublu clic pentru resetarea tuturor straturilor la starea implicită) +pdfjs-layers-button-label = Straturi pdfjs-thumbs-button = .title = Afișează miniaturi pdfjs-thumbs-button-label = Miniaturi +pdfjs-current-outline-item-button = + .title = Găsește elementul pe schița actuală +pdfjs-current-outline-item-button-label = Element al schiței actuale pdfjs-findbar-button = .title = Caută în document pdfjs-findbar-button-label = Caută +pdfjs-additional-layers = Straturi suplimentare ## Thumbnails panel item (tooltip and alt text for images) @@ -178,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniatura paginii { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Selectează pagina { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Pagina { $page } din { $total } ## Find panel button title and messages @@ -192,9 +224,27 @@ pdfjs-find-next-button-label = Înainte pdfjs-find-highlight-checkbox = Evidențiază toate aparițiile pdfjs-find-match-case-checkbox-label = Ține cont de majuscule și minuscule +pdfjs-find-match-diacritics-checkbox-label = Respectă diacriticele pdfjs-find-entire-word-checkbox-label = Cuvinte întregi pdfjs-find-reached-top = Am ajuns la începutul documentului, continuă de la sfârșit pdfjs-find-reached-bottom = Am ajuns la sfârșitul documentului, continuă de la început +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } din { $total } rezultat + [few] { $current } din { $total } rezultate + *[other] { $current } din { $total } de rezultate + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Mai mult de { $limit } rezultat + [few] Mai mult de { $limit } rezultate + *[other] Mai mult de { $limit } de rezultate + } pdfjs-find-not-found = Nu s-a găsit textul ## Predefined zoom values @@ -209,6 +259,10 @@ ## PDF page +# Variables: +# $page (Number) - the page number +pdfjs-page-landmark = + .aria-label = Pagina { $page } ## Loading indicator messages @@ -220,10 +274,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -231,21 +281,474 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Adnotare { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password pdfjs-password-label = Introdu parola pentru a deschide acest fișier PDF. pdfjs-password-invalid = Parolă nevalidă. Te rugăm să încerci din nou. pdfjs-password-ok-button = OK -pdfjs-password-cancel-button = Renunță +pdfjs-password-cancel-button = Anulează pdfjs-web-fonts-disabled = Fonturile web sunt dezactivate: nu se pot folosi fonturile PDF încorporate. ## Editing +pdfjs-editor-free-text-button = + .title = Text +pdfjs-editor-color-picker-free-text-input = + .title = Schimbă culoarea textului +pdfjs-editor-free-text-button-label = Text +pdfjs-editor-ink-button = + .title = Desenează +pdfjs-editor-color-picker-ink-input = + .title = Schimbă culoarea de desen +pdfjs-editor-ink-button-label = Desenează +pdfjs-editor-stamp-button = + .title = Adaugă sau editează imagini +pdfjs-editor-stamp-button-label = Adaugă sau editează imagini +pdfjs-editor-highlight-button = + .title = Evidențiere +pdfjs-editor-highlight-button-label = Evidențiere +pdfjs-highlight-floating-button1 = + .title = Evidențiază + .aria-label = Evidențiere +pdfjs-highlight-floating-button-label = Evidențiază +pdfjs-comment-floating-button = + .title = Comentează + .aria-label = Comentariu +pdfjs-comment-floating-button-label = Comentează +pdfjs-editor-comment-button = + .title = Comentariu + .aria-label = Comentează +pdfjs-editor-comment-button-label = Comentariu +pdfjs-editor-signature-button = + .title = Adaugă semnătură +pdfjs-editor-signature-button-label = Adaugă semnătură + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Editor de evidențiere +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Editor de desen +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Editor de semnătură: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Editor de imagini + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Elimină desenul +pdfjs-editor-remove-freetext-button = + .title = Elimină textul +pdfjs-editor-remove-stamp-button = + .title = Elimină imaginea +pdfjs-editor-remove-highlight-button = + .title = Elimină evidențierea +pdfjs-editor-remove-signature-button = + .title = Elimină semnătura + +## + +# Editor Parameters +pdfjs-editor-free-text-color-input = Culoare +pdfjs-editor-free-text-size-input = Mărime +pdfjs-editor-ink-color-input = Culoare +pdfjs-editor-ink-thickness-input = Grosime +pdfjs-editor-ink-opacity-input = Opacitate +pdfjs-editor-stamp-add-image-button = + .title = Adaugă imagine +pdfjs-editor-stamp-add-image-button-label = Adaugă imagine +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Grosime +pdfjs-editor-free-highlight-thickness-title = + .title = Schimbă grosimea când evidențiezi alte elemente decât text +pdfjs-editor-add-signature-container = + .aria-label = Controale de semnături și semnături salvate +pdfjs-editor-signature-add-signature-button = + .title = Adaugă o semnătură nouă +pdfjs-editor-signature-add-signature-button-label = Adaugă o semnătură nouă +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Semnătură salvată: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Editor de text + .default-content = Începe să tastezi... +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Comentariu + *[other] Comentarii + } +pdfjs-editor-comments-sidebar-close-button = + .title = Închide bara laterală + .aria-label = Închide bara laterală +pdfjs-editor-comments-sidebar-close-button-label = Închide bara laterală +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Vezi ceva care merită comentat? Evidențiază-l și lasă un comentariu. +pdfjs-editor-comments-sidebar-no-comments-link = Află mai multe ## Alt-text dialog +pdfjs-editor-alt-text-button-label = Text alternativ +pdfjs-editor-alt-text-edit-button = + .aria-label = Editează textul alternativ +pdfjs-editor-alt-text-dialog-label = Alege o opțiune +pdfjs-editor-alt-text-dialog-description = Textul alternativ (alt text) ajută când oamenii nu pot vedea imaginea sau când nu se încarcă. +pdfjs-editor-alt-text-add-description-label = Adaugă o descriere +pdfjs-editor-alt-text-add-description-description = Încearcă să scrii 1-2 propoziții care să descrie subiectul, cadrul sau acțiunile. +pdfjs-editor-alt-text-mark-decorative-label = Marchează ca decorativ +pdfjs-editor-alt-text-mark-decorative-description = Este pentru imagini ornamentale, cum ar fi chenare sau filigrane. +pdfjs-editor-alt-text-cancel-button = Anulează +pdfjs-editor-alt-text-save-button = Salvează +pdfjs-editor-alt-text-decorative-tooltip = Marcat ca decorativ +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = De exemplu, „Un tânăr se așează la o masă să mănânce” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Text alternativ ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. +pdfjs-editor-resizer-top-left = + .aria-label = Colțul din stânga sus — redimensionează +pdfjs-editor-resizer-top-middle = + .aria-label = Mijloc de sus — redimensionează +pdfjs-editor-resizer-top-right = + .aria-label = Colțul din dreapta sus — redimensionează +pdfjs-editor-resizer-middle-right = + .aria-label = Mijloc dreapta — redimensionează +pdfjs-editor-resizer-bottom-right = + .aria-label = Colțul din dreapta jos — redimensionează +pdfjs-editor-resizer-bottom-middle = + .aria-label = Mijloc de jos - redimensionează +pdfjs-editor-resizer-bottom-left = + .aria-label = Colțul din stânga jos — redimensionează +pdfjs-editor-resizer-middle-left = + .aria-label = Mijloc stânga — redimensionează + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Culoare de evidențiere +pdfjs-editor-colorpicker-button = + .title = Schimbă culoarea +pdfjs-editor-colorpicker-dropdown = + .aria-label = Opțiuni de culoare +pdfjs-editor-colorpicker-yellow = + .title = Galben +pdfjs-editor-colorpicker-green = + .title = Verde +pdfjs-editor-colorpicker-blue = + .title = Albastru +pdfjs-editor-colorpicker-pink = + .title = Roz +pdfjs-editor-colorpicker-red = + .title = Roșu + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Afișează tot +pdfjs-editor-highlight-show-all-button = + .title = Afișează tot + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Editează textul alternativ (descrierea imaginii) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Adaugă text alternativ (descrierea imaginii) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Scrie descrierea aici... +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Scurtă descriere pentru cei care nu pot vedea imaginea sau pentru când nu se încarcă imaginea. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Acest text alternativ a fost creat automat și este posibil să nu fie exact. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Află mai multe +pdfjs-editor-new-alt-text-create-automatically-button-label = Creează automat texte alternative +pdfjs-editor-new-alt-text-not-now-button = Nu acum +pdfjs-editor-new-alt-text-error-title = Nu s-a putut crea automat textul alternativ +pdfjs-editor-new-alt-text-error-description = Te rugăm să scrii propriul text alternativ sau să încerci din nou mai târziu. +pdfjs-editor-new-alt-text-error-close-button = Închide +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Se descarcă modelul AI de text alternativ ({ $downloadedSize } de { $totalSize } MB) + .aria-valuetext = Se descarcă modelul AI de text alternativ ({ $downloadedSize } de { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Text alternativ adăugat +pdfjs-editor-new-alt-text-added-button-label = Text alternativ adăugat +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Text alternativ lipsă +pdfjs-editor-new-alt-text-missing-button-label = Text alternativ lipsă +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Revizuiește textul alternativ +pdfjs-editor-new-alt-text-to-review-button-label = Revizuiește textul alternativ +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creat automat: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Setări text alternativ imagini +pdfjs-image-alt-text-settings-button-label = Setări text alternativ imagini +pdfjs-editor-alt-text-settings-dialog-label = Setări text alternativ imagini +pdfjs-editor-alt-text-settings-automatic-title = Text alternativ automat +pdfjs-editor-alt-text-settings-create-model-button-label = Creează automat texte alternative +pdfjs-editor-alt-text-settings-create-model-description = Sugerează descrieri ca să îi ajuți pe cei care nu pot vedea imaginea sau pentru când nu se încarcă imaginea. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model AI de text alternativ ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Rulează local pe dispozitiv, deci datele tale rămân private. Necesar pentru text alternativ automat. +pdfjs-editor-alt-text-settings-delete-model-button = Șterge +pdfjs-editor-alt-text-settings-download-model-button = Descarcă +pdfjs-editor-alt-text-settings-downloading-model-button = Se descarcă… +pdfjs-editor-alt-text-settings-editor-title = Editor de text alternativ +pdfjs-editor-alt-text-settings-show-dialog-button-label = Afișează editorul de text alternativ imediat când adaugi o imagine +pdfjs-editor-alt-text-settings-show-dialog-description = Te ajută să te asiguri că toate imaginile au text alternativ. +pdfjs-editor-alt-text-settings-close-button = Închide + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Evidențiere adăugată +pdfjs-editor-freetext-added-alert = Text adăugat +pdfjs-editor-ink-added-alert = Desen adăugat +pdfjs-editor-stamp-added-alert = Imagine adăugată +pdfjs-editor-signature-added-alert = Semnătură adăugată + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Evidențiere eliminată +pdfjs-editor-undo-bar-message-freetext = Text eliminat +pdfjs-editor-undo-bar-message-ink = Desen eliminat +pdfjs-editor-undo-bar-message-stamp = Imagine eliminată +pdfjs-editor-undo-bar-message-signature = Semnătură eliminată +pdfjs-editor-undo-bar-message-comment = Comentariu eliminat +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } adnotare eliminată + [few] { $count } adnotări eliminate + *[other] { $count } de adnotări eliminate + } +pdfjs-editor-undo-bar-undo-button = + .title = Anulează +pdfjs-editor-undo-bar-undo-button-label = Anulează +pdfjs-editor-undo-bar-close-button = + .title = Închide +pdfjs-editor-undo-bar-close-button-label = Închide + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Această fereastră permite utilizatorului să creeze o semnătură de adăugat la un document PDF. Utilizatorul poate edita numele (care servește și ca text alternativ) și, opțional, poate salva semnătura pentru utilizare repetată. +pdfjs-editor-add-signature-dialog-title = Adaugă o semnătură + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Tip + .title = Tip +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Desenează + .title = Desenează +pdfjs-editor-add-signature-image-button = Imagine + .title = Imagine + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Tastează semnătura + .placeholder = Tastează semnătura +pdfjs-editor-add-signature-draw-placeholder = Desenează semnătura +pdfjs-editor-add-signature-draw-thickness-range-label = Grosime +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Grosimea desenului: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Trage aici un fișier pentru încărcare +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Sau alege fișiere de imagini + *[other] Sau răsfoiește prin fișiere de imagini + } + +## Controls + +pdfjs-editor-add-signature-description-label = Descriere (text alternativ) +pdfjs-editor-add-signature-description-input = + .title = Descriere (text alternativ) +pdfjs-editor-add-signature-description-default-when-drawing = Semnătură +pdfjs-editor-add-signature-clear-button-label = Șterge semnătura +pdfjs-editor-add-signature-clear-button = + .title = Șterge semnătura +pdfjs-editor-add-signature-save-checkbox = Salvează semnătura +pdfjs-editor-add-signature-save-warning-message = Ai atins limita de 5 semnături salvate. Elimină una dacă vrei să salvezi alta. +pdfjs-editor-add-signature-image-upload-error-title = Imaginea nu a putut fi încărcată +pdfjs-editor-add-signature-image-upload-error-description = Verifică-ți conexiunea la rețea sau încearcă cu o altă imagine. +pdfjs-editor-add-signature-image-no-data-error-title = Imaginea nu poate fi convertită în semnătură +pdfjs-editor-add-signature-image-no-data-error-description = Încearcă să încarci altă imagine. +pdfjs-editor-add-signature-error-close-button = Închide + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Anulează +pdfjs-editor-add-signature-add-button = Adaugă +pdfjs-editor-edit-signature-update-button = Actualizează + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Editează comentariul +pdfjs-editor-edit-comment-popup-button = + .title = Editează comentariul +pdfjs-editor-delete-comment-popup-button-label = Șterge comentariul +pdfjs-editor-delete-comment-popup-button = + .title = Șterge comentariul +pdfjs-show-comment-button = + .title = Afișează comentariul + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Editează comentariul +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Actualizează +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Adaugă un comentariu +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Adaugă +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Începe să tastezi… +pdfjs-editor-edit-comment-dialog-cancel-button = Anulează + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Adaugă un comentariu + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Comută bara laterală (documentul conține miniaturi/schițe/atașamente/straturi) +pdfjs-toggle-views-manager-button1-label = Gestionează paginile +pdfjs-views-manager-sidebar = + .aria-label = Bară laterală +pdfjs-views-manager-sidebar-resizer = + .aria-label = Redimensionare bară laterală +pdfjs-views-manager-view-selector-button = + .title = Vizualizări +pdfjs-views-manager-view-selector-button-label = Vizualizări +pdfjs-views-manager-pages-title = Pagini +pdfjs-views-manager-outlines-title1 = Structura documentului + .title = Structura documentului (dă dublu clic pentru extinderea/restrângerea elementelor) +pdfjs-views-manager-attachments-title = Atașamente +pdfjs-views-manager-layers-title1 = Straturi + .title = Straturi (dă dublu clic ca să resetezi toate straturile la starea implicită) +pdfjs-views-manager-pages-option-label = Pagini +pdfjs-views-manager-outlines-option-label = Schiță document +pdfjs-views-manager-attachments-option-label = Atașamente +pdfjs-views-manager-layers-option-label = Straturi +pdfjs-views-manager-add-file-button = + .title = Adaugă un fișier +pdfjs-views-manager-add-file-button-label = Adaugă un fișier +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } selectată + [few] { $count } selectate + *[other] { $count } selectate + } +pdfjs-views-manager-pages-status-none-action-label = Selectează pagini +pdfjs-views-manager-pages-status-action-button-label = Gestionează +pdfjs-views-manager-pages-status-copy-button-label = Copiază +pdfjs-views-manager-pages-status-cut-button-label = Taie +pdfjs-views-manager-pages-status-delete-button-label = Șterge +pdfjs-views-manager-pages-status-export-selected-button-label = Exportă selecția… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 pagină tăiată + [few] { $count } pagini tăiate + *[other] { $count } de pagini tăiate + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 pagină copiată + [few] { $count } pagini copiate + *[other] { $count } de pagini copiate + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 pagină ștearsă + [few] { $count } pagini șterse + *[other] { $count } de pagini șterse + } +pdfjs-views-manager-pages-status-waiting-ready-label = Se pregătește fișierul… +pdfjs-views-manager-pages-status-waiting-uploading-label = Se încarcă fișierul… +pdfjs-views-manager-status-warning-cut-label = Nu s-a putut tăia. Reîmprospătează pagina și încearcă din nou. +pdfjs-views-manager-status-warning-copy-label = Nu s-a putut copia. Reîmprospătează pagina și încearcă din nou. +pdfjs-views-manager-status-warning-delete-label = Nu s-a putut șterge. Reîmprospătează pagina și încearcă din nou. +pdfjs-views-manager-status-warning-save-label = Nu s-a putut salva. Reîmprospătează pagina și încearcă din nou. +pdfjs-views-manager-status-undo-button-label = Anulează +pdfjs-views-manager-status-done-button-label = Terminat +pdfjs-views-manager-status-close-button = + .title = Închide +pdfjs-views-manager-status-close-button-label = Închide +pdfjs-views-manager-paste-button-label = Lipește +pdfjs-views-manager-paste-button-before = + .title = Inserează înainte de prima pagină +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Inserează după pagina { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NOU +pdfjs-views-manager-waiting-for-file = Se încarcă fișierul… +pdfjs-toggle-views-manager-button1 = + .title = Gestionează paginile + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Elimină semnătura salvată +pdfjs-editor-delete-signature-button-label1 = Elimină semnătura salvată + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Editează descrierea + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Editează descrierea diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ru/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ru/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ru/viewer.ftl 2026-01-20 14:08:39.380689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ru/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -44,19 +44,13 @@ pdfjs-save-button-label = Сохранить # Used in Firefox for Android as a tooltip for the download button (“download” is a verb). pdfjs-download-button = - .title = Загрузить + .title = Скачать # Used in Firefox for Android as a label for the download button (“download” is a verb). # Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-download-button-label = Загрузить +pdfjs-download-button-label = Скачать pdfjs-bookmark-button = .title = Текущая страница (просмотр URL-адреса с текущей страницы) pdfjs-bookmark-button-label = Текущая страница -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Открыть в приложении -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Открыть в программе ## Secondary toolbar and context menu @@ -76,10 +70,10 @@ .title = Повернуть против часовой стрелки pdfjs-page-rotate-ccw-button-label = Повернуть против часовой стрелки pdfjs-cursor-text-select-tool-button = - .title = Включить Инструмент «Выделение текста» + .title = Включить инструмент «Выделение текста» pdfjs-cursor-text-select-tool-button-label = Инструмент «Выделение текста» pdfjs-cursor-hand-tool-button = - .title = Включить Инструмент «Рука» + .title = Включить инструмент «Рука» pdfjs-cursor-hand-tool-button-label = Инструмент «Рука» pdfjs-scroll-page-button = .title = Использовать прокрутку страниц @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Имя файла: pdfjs-document-properties-file-size = Размер файла: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } КБ ({ $size_b } байт) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } байт) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } КБ ({ $b } байт) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } МБ ({ $b } байт) pdfjs-document-properties-title = Заголовок: pdfjs-document-properties-author = Автор: pdfjs-document-properties-subject = Тема: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Дата создания: pdfjs-document-properties-modification-date = Дата изменения: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Приложение: pdfjs-document-properties-producer = Производитель PDF: pdfjs-document-properties-version = Версия PDF: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Миниатюра страницы { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Выбрать страницу { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Страница { $page } из { $total } ## Find panel button title and messages @@ -272,10 +274,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -283,6 +281,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Аннотация { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -296,9 +297,13 @@ pdfjs-editor-free-text-button = .title = Текст +pdfjs-editor-color-picker-free-text-input = + .title = Изменить цвет текста pdfjs-editor-free-text-button-label = Текст pdfjs-editor-ink-button = .title = Рисовать +pdfjs-editor-color-picker-ink-input = + .title = Изменить цвет прорисовки pdfjs-editor-ink-button-label = Рисовать pdfjs-editor-stamp-button = .title = Добавить или изменить изображения @@ -306,12 +311,37 @@ pdfjs-editor-highlight-button = .title = Выделение pdfjs-editor-highlight-button-label = Выделение -pdfjs-highlight-floating-button = - .title = Выделение pdfjs-highlight-floating-button1 = .title = Выделение .aria-label = Выделение pdfjs-highlight-floating-button-label = Выделение +pdfjs-comment-floating-button = + .title = Комментировать + .aria-label = Комментировать +pdfjs-comment-floating-button-label = Комментировать +pdfjs-editor-comment-button = + .title = Комментарий + .aria-label = Комментарий +pdfjs-editor-comment-button-label = Комментарий +pdfjs-editor-signature-button = + .title = Добавить подпись +pdfjs-editor-signature-button-label = Добавить подпись + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Редактор выделения +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Редактор изображений +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Редактор подписи: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Редактор изображений ## Remove button for the various kind of editor. @@ -323,6 +353,8 @@ .title = Удалить изображение pdfjs-editor-remove-highlight-button = .title = Удалить выделение +pdfjs-editor-remove-signature-button = + .title = Удалить подпись ## @@ -339,19 +371,42 @@ pdfjs-editor-free-highlight-thickness-input = Толщина pdfjs-editor-free-highlight-thickness-title = .title = Изменить толщину при выделении элементов, кроме текста -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Управление подписями и сохранённые подписи +pdfjs-editor-signature-add-signature-button = + .title = Добавить новую подпись +pdfjs-editor-signature-add-signature-button-label = Добавить новую подпись +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Сохранённая подпись: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Текстовый редактор -pdfjs-free-text-default-content = Начните вводить… -pdfjs-ink = - .aria-label = Редактор рисования -pdfjs-ink-canvas = - .aria-label = Созданное пользователем изображение + .default-content = Начните ввод... +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Комментарий + [few] Комментарии + *[many] Комментарии + } +pdfjs-editor-comments-sidebar-close-button = + .title = Закрыть боковую панель + .aria-label = Закрыть боковую панель +pdfjs-editor-comments-sidebar-close-button-label = Закрыть боковую панель +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Увидели что-то интересное? Выделите и оставьте комментарий. +pdfjs-editor-comments-sidebar-no-comments-link = Подробнее ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Альтернативный текст -pdfjs-editor-alt-text-edit-button-label = Изменить альтернативный текст +pdfjs-editor-alt-text-edit-button = + .aria-label = Изменить альтернативный текст pdfjs-editor-alt-text-dialog-label = Выберите вариант pdfjs-editor-alt-text-dialog-description = Альтернативный текст помогает, когда люди не видят изображение или оно не загружается. pdfjs-editor-alt-text-add-description-label = Добавить описание @@ -364,18 +419,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Например: «Молодой человек садится за стол, чтобы поесть» +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Альтернативный текст ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Левый верхний угол — изменить размер -pdfjs-editor-resizer-label-top-middle = Вверху посередине — изменить размер -pdfjs-editor-resizer-label-top-right = Верхний правый угол — изменить размер -pdfjs-editor-resizer-label-middle-right = В центре справа — изменить размер -pdfjs-editor-resizer-label-bottom-right = Нижний правый угол — изменить размер -pdfjs-editor-resizer-label-bottom-middle = Внизу посередине — изменить размер -pdfjs-editor-resizer-label-bottom-left = Нижний левый угол — изменить размер -pdfjs-editor-resizer-label-middle-left = В центре слева — изменить размер +pdfjs-editor-resizer-top-left = + .aria-label = Левый верхний угол — изменить размер +pdfjs-editor-resizer-top-middle = + .aria-label = Вверху посередине — изменить размер +pdfjs-editor-resizer-top-right = + .aria-label = Верхний правый угол — изменить размер +pdfjs-editor-resizer-middle-right = + .aria-label = В центре справа — изменить размер +pdfjs-editor-resizer-bottom-right = + .aria-label = Нижний правый угол — изменить размер +pdfjs-editor-resizer-bottom-middle = + .aria-label = Внизу посередине — изменить размер +pdfjs-editor-resizer-bottom-left = + .aria-label = Нижний левый угол — изменить размер +pdfjs-editor-resizer-middle-left = + .aria-label = В центре слева — изменить размер ## Color picker @@ -402,3 +468,288 @@ pdfjs-editor-highlight-show-all-button-label = Показать все pdfjs-editor-highlight-show-all-button = .title = Показать все + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Изменить альтернативный текст (описание изображения) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Добавить альтернативный текст (описание изображения) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Напишите здесь своё описание… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Короткое описание для людей, которые не видят изображение, или если изображение не загружается. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Этот альтернативный текст был создан автоматически и может быть неточным. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Подробнее +pdfjs-editor-new-alt-text-create-automatically-button-label = Автоматически создавать альтернативный текст +pdfjs-editor-new-alt-text-not-now-button = Не сейчас +pdfjs-editor-new-alt-text-error-title = Не удалось автоматически создать альтернативный текст +pdfjs-editor-new-alt-text-error-description = Пожалуйста, напишите свой альтернативный текст или попробуйте ещё раз позже. +pdfjs-editor-new-alt-text-error-close-button = Закрыть +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Загрузка модели ИИ для альтернативного текста ({ $downloadedSize } из { $totalSize } МБ) + .aria-valuetext = Загрузка модели ИИ для альтернативного текста ({ $downloadedSize } из { $totalSize } МБ) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Альтернативный текст добавлен +pdfjs-editor-new-alt-text-added-button-label = Альтернативный текст добавлен +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Отсутствует альтернативный текст +pdfjs-editor-new-alt-text-missing-button-label = Отсутствует альтернативный текст +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Оценить альтернативный текст +pdfjs-editor-new-alt-text-to-review-button-label = Оценить альтернативный текст +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Создано автоматически: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Настройки альтернативного текста для изображения +pdfjs-image-alt-text-settings-button-label = Настройки альтернативного текста для изображения +pdfjs-editor-alt-text-settings-dialog-label = Настройки альтернативного текста для изображения +pdfjs-editor-alt-text-settings-automatic-title = Автоматический альтернативный текст +pdfjs-editor-alt-text-settings-create-model-button-label = Автоматически создавать альтернативный текст +pdfjs-editor-alt-text-settings-create-model-description = Предлагает описания, чтобы помочь людям, которые не видят изображение, или если изображение не загружается. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = ИИ-модель альтернативного текста ({ $totalSize } МБ) +pdfjs-editor-alt-text-settings-ai-model-description = Запускается локально на вашем устройстве, поэтому ваши данные остаются конфиденциальными. Требуется для автоматического альтернативного текста. +pdfjs-editor-alt-text-settings-delete-model-button = Удалить +pdfjs-editor-alt-text-settings-download-model-button = Скачать +pdfjs-editor-alt-text-settings-downloading-model-button = Загрузка… +pdfjs-editor-alt-text-settings-editor-title = Редактор альтернативного текста +pdfjs-editor-alt-text-settings-show-dialog-button-label = Сразу показывать редактор альтернативного текста при добавлении изображения +pdfjs-editor-alt-text-settings-show-dialog-description = Помогает вам убедиться, что все ваши изображения имеют альтернативный текст. +pdfjs-editor-alt-text-settings-close-button = Закрыть + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Выделение добавлено +pdfjs-editor-freetext-added-alert = Текст добавлен +pdfjs-editor-ink-added-alert = Изображение добавлено +pdfjs-editor-stamp-added-alert = Изображение добавлено +pdfjs-editor-signature-added-alert = Подпись добавлена + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Выделение удалено +pdfjs-editor-undo-bar-message-freetext = Текст удалён +pdfjs-editor-undo-bar-message-ink = Рисунок удалён +pdfjs-editor-undo-bar-message-stamp = Изображение удалено +pdfjs-editor-undo-bar-message-signature = Подпись удалена +pdfjs-editor-undo-bar-message-comment = Комментарий удалён +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } аннотация удалена + [few] { $count } аннотации удалены + *[many] { $count } аннотаций удалены + } +pdfjs-editor-undo-bar-undo-button = + .title = Отменить +pdfjs-editor-undo-bar-undo-button-label = Отменить +pdfjs-editor-undo-bar-close-button = + .title = Закрыть +pdfjs-editor-undo-bar-close-button-label = Закрыть + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Это окно позволяет пользователю создать подпись для добавления в PDF-документ. Пользователь может отредактировать имя (которое также используется в качестве альтернативного текста) и, по желанию, сохранить подпись для повторного использования. +pdfjs-editor-add-signature-dialog-title = Добавить подпись + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Ввод + .title = Ввод +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Рисовать + .title = Рисовать +pdfjs-editor-add-signature-image-button = Изображение + .title = Изображение + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Введите свою подпись + .placeholder = Введите свою подпись +pdfjs-editor-add-signature-draw-placeholder = Нарисуйте свою подпись +pdfjs-editor-add-signature-draw-thickness-range-label = Толщина +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Толщина рисунка: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Перетащите сюда файл для загрузки +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Или просмотрите файлы изображений + *[other] Или просмотрите файлы изображений + } + +## Controls + +pdfjs-editor-add-signature-description-label = Описание (альтернативный текст) +pdfjs-editor-add-signature-description-input = + .title = Описание (альтернативный текст) +pdfjs-editor-add-signature-description-default-when-drawing = Подпись +pdfjs-editor-add-signature-clear-button-label = Удалить подпись +pdfjs-editor-add-signature-clear-button = + .title = Удалить подпись +pdfjs-editor-add-signature-save-checkbox = Сохранить подпись +pdfjs-editor-add-signature-save-warning-message = Вы достигли лимита в 5 сохранённых подписей. Удалите одну, чтобы сохранить другие. +pdfjs-editor-add-signature-image-upload-error-title = Не удалось загрузить изображение +pdfjs-editor-add-signature-image-upload-error-description = Проверьте подключение к сети или попробуйте другое изображение. +pdfjs-editor-add-signature-image-no-data-error-title = Не удалось преобразовать это изображение в подпись +pdfjs-editor-add-signature-image-no-data-error-description = Пожалуйста, попробуйте загрузить другое изображение. +pdfjs-editor-add-signature-error-close-button = Закрыть + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Отмена +pdfjs-editor-add-signature-add-button = Добавить +pdfjs-editor-edit-signature-update-button = Обновить + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Редактировать комментарий +pdfjs-editor-edit-comment-popup-button = + .title = Редактировать комментарий +pdfjs-editor-delete-comment-popup-button-label = Удалить комментарий +pdfjs-editor-delete-comment-popup-button = + .title = Удалить комментарий +pdfjs-show-comment-button = + .title = Показать комментарий + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Редактировать комментарий +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Обновить +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Добавить комментарий +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Добавить +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Начните ввод… +pdfjs-editor-edit-comment-dialog-cancel-button = Отмена + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Добавить комментарий + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Показать/скрыть боковую панель (документ содержит миниатюры/структуру/вложения/слои) +pdfjs-toggle-views-manager-button1-label = Управление страницами +pdfjs-views-manager-sidebar = + .aria-label = Боковая панель +pdfjs-views-manager-sidebar-resizer = + .aria-label = Изменение размера боковой панели +pdfjs-views-manager-view-selector-button = + .title = Вид +pdfjs-views-manager-view-selector-button-label = Вид +pdfjs-views-manager-pages-title = Страницы +pdfjs-views-manager-outlines-title1 = Структура документа + .title = Структура документа (щёлкните дважды, чтобы раскрыть/свернуть все элементы) +pdfjs-views-manager-attachments-title = Вложения +pdfjs-views-manager-layers-title1 = Слои + .title = Слои (щёлкните дважды, чтобы сбросить все слои в положение по умолчанию) +pdfjs-views-manager-pages-option-label = Страницы +pdfjs-views-manager-outlines-option-label = Структура документа +pdfjs-views-manager-attachments-option-label = Вложения +pdfjs-views-manager-layers-option-label = Слои +pdfjs-views-manager-add-file-button = + .title = Добавить файл +pdfjs-views-manager-add-file-button-label = Добавить файл +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] Выбрана { $count } + [few] Выбраны { $count } + *[many] Выбрано { $count } + } +pdfjs-views-manager-pages-status-none-action-label = Выбрать страницы +pdfjs-views-manager-pages-status-action-button-label = Управление +pdfjs-views-manager-pages-status-copy-button-label = Копировать +pdfjs-views-manager-pages-status-cut-button-label = Вырезать +pdfjs-views-manager-pages-status-delete-button-label = Удалить +pdfjs-views-manager-pages-status-export-selected-button-label = Экспортировать выбранное… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] Вырезана 1 страница + [few] Вырезаны { $count } страницы + *[many] Вырезано { $count } страниц + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] Скопирована 1 страница + [few] Скопированы { $count } страницы + *[many] Скопировано { $count } страниц + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] Удалена 1 страница + [few] Удалены { $count } страницы + *[many] Удалено { $count } страниц + } +pdfjs-views-manager-pages-status-waiting-ready-label = Идёт подготовка файла… +pdfjs-views-manager-pages-status-waiting-uploading-label = Выгрузка файла… +pdfjs-views-manager-status-warning-cut-label = Не удалось вырезать. Обновить страницу и попробовать ещё раз. +pdfjs-views-manager-status-warning-copy-label = Не удалось скопировать. Обновить страницу и попробовать ещё раз. +pdfjs-views-manager-status-warning-delete-label = Не удалось удалить. Обновить страницу и попробовать ещё раз. +pdfjs-views-manager-status-warning-save-label = Не удалось сохранить. Обновить страницу и попробовать ещё раз. +pdfjs-views-manager-status-undo-button-label = Отменить +pdfjs-views-manager-status-done-button-label = Готово +pdfjs-views-manager-status-close-button = + .title = Закрыть +pdfjs-views-manager-status-close-button-label = Закрыть +pdfjs-views-manager-paste-button-label = Вставить +pdfjs-views-manager-paste-button-before = + .title = Вставить перед первой страницей +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Вставить после страницы { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = НОВОЕ +pdfjs-views-manager-waiting-for-file = Загрузка файла… +pdfjs-toggle-views-manager-button1 = + .title = Управление страницами + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Удалить сохранённую подпись +pdfjs-editor-delete-signature-button-label1 = Удалить сохранённую подпись + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Изменить описание + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Изменить описание diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/sat/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sat/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/sat/viewer.ftl 2026-01-20 14:08:39.380689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sat/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = ᱱᱤᱛᱚᱜᱟᱜ ᱥᱟᱦᱴᱟ (ᱱᱤᱛᱚᱜᱟᱜ ᱥᱟᱦᱴᱟ ᱠᱷᱚᱱ URL ᱫᱮᱠᱷᱟᱣ ᱢᱮ) pdfjs-bookmark-button-label = ᱱᱤᱛᱚᱜᱟᱜ ᱥᱟᱦᱴᱟ -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = ᱮᱯ ᱨᱮ ᱡᱷᱤᱡᱽ ᱢᱮ -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = ᱮᱯ ᱨᱮ ᱡᱷᱤᱡᱽ ᱢᱮ ## Secondary toolbar and context menu @@ -110,24 +104,12 @@ pdfjs-document-properties-button-label = ᱫᱚᱞᱤᱞ ᱜᱩᱱᱠᱚ … pdfjs-document-properties-file-name = ᱨᱮᱫᱽ ᱧᱩᱛᱩᱢ : pdfjs-document-properties-file-size = ᱨᱮᱫᱽ ᱢᱟᱯ : -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } ᱵᱟᱭᱤᱴ ᱠᱚ) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } ᱵᱟᱭᱤᱴ ᱠᱚ) pdfjs-document-properties-title = ᱧᱩᱛᱩᱢ : pdfjs-document-properties-author = ᱚᱱᱚᱞᱤᱭᱟᱹ : pdfjs-document-properties-subject = ᱵᱤᱥᱚᱭ : pdfjs-document-properties-keywords = ᱠᱟᱹᱴᱷᱤ ᱥᱟᱵᱟᱫᱽ : pdfjs-document-properties-creation-date = ᱛᱮᱭᱟᱨ ᱢᱟᱸᱦᱤᱛ : pdfjs-document-properties-modification-date = ᱵᱚᱫᱚᱞ ᱦᱚᱪᱚ ᱢᱟᱹᱦᱤᱛ : -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = ᱵᱮᱱᱟᱣᱤᱡ : pdfjs-document-properties-producer = PDF ᱛᱮᱭᱟᱨ ᱚᱰᱚᱠᱤᱡ : pdfjs-document-properties-version = PDF ᱵᱷᱟᱹᱨᱥᱚᱱ : @@ -255,10 +237,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -286,6 +264,9 @@ pdfjs-editor-stamp-button = .title = ᱪᱤᱛᱟᱹᱨᱠᱚ ᱥᱮᱞᱮᱫ ᱥᱮ ᱥᱟᱯᱲᱟᱣ ᱢᱮ pdfjs-editor-stamp-button-label = ᱪᱤᱛᱟᱹᱨᱠᱚ ᱥᱮᱞᱮᱫ ᱥᱮ ᱥᱟᱯᱲᱟᱣ ᱢᱮ + +## + # Editor Parameters pdfjs-editor-free-text-color-input = ᱨᱚᱝ pdfjs-editor-free-text-size-input = ᱢᱟᱯ @@ -295,17 +276,3 @@ pdfjs-editor-stamp-add-image-button = .title = ᱪᱤᱛᱟᱹᱨ ᱥᱮᱞᱮᱫ ᱢᱮ pdfjs-editor-stamp-add-image-button-label = ᱪᱤᱛᱟᱹᱨ ᱥᱮᱞᱮᱫ ᱢᱮ -pdfjs-free-text = - .aria-label = ᱚᱞ ᱥᱟᱯᱲᱟᱣᱤᱭᱟᱹ -pdfjs-free-text-default-content = ᱚᱞ ᱮᱛᱦᱚᱵ ᱢᱮ … -pdfjs-ink = - .aria-label = ᱛᱮᱭᱟᱨ ᱥᱟᱯᱲᱟᱣᱤᱭᱟᱹ -pdfjs-ink-canvas = - .aria-label = ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱛᱮᱭᱟᱨ ᱠᱟᱫ ᱪᱤᱛᱟᱹᱨ - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/sc/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sc/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/sc/viewer.ftl 2026-01-20 14:08:39.381689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sc/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Pàgina atuale (ammustra s’URL de sa pàgina atuale) pdfjs-bookmark-button-label = Pàgina atuale -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Aberi in un’aplicatzione -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Aberi in un’aplicatzione ## Secondary toolbar and context menu @@ -101,24 +95,12 @@ pdfjs-document-properties-button-label = Propiedades de su documentu… pdfjs-document-properties-file-name = Nòmine de s'archìviu: pdfjs-document-properties-file-size = Mannària de s'archìviu: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Tìtulu: pdfjs-document-properties-author = Autoria: pdfjs-document-properties-subject = Ogetu: pdfjs-document-properties-keywords = Faeddos crae: pdfjs-document-properties-creation-date = Data de creatzione: pdfjs-document-properties-modification-date = Data de modìfica: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Creatzione: pdfjs-document-properties-producer = Produtore de PDF: pdfjs-document-properties-version = Versione de PDF: @@ -158,7 +140,7 @@ # Variables: # $progress (Number) - percent value pdfjs-print-progress-percent = { $progress }% -pdfjs-print-progress-close-button = Cantzella +pdfjs-print-progress-close-button = Annulla pdfjs-printing-not-supported = Atentzione: s'imprenta no est funtzionende de su totu in custu navigadore. pdfjs-printing-not-ready = Atentzione: su PDF no est istadu carrigadu de su totu pro s'imprenta. @@ -240,19 +222,12 @@ pdfjs-unexpected-response-error = Risposta imprevista de su serbidore. pdfjs-rendering-error = Faddina in sa visualizatzione de sa pàgina. -## Annotations - -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } - ## Password pdfjs-password-label = Inserta sa crae pro abèrrere custu archìviu PDF. pdfjs-password-invalid = Sa crae no est curreta. Torra a nche proare. pdfjs-password-ok-button = Andat bene -pdfjs-password-cancel-button = Cantzella +pdfjs-password-cancel-button = Annulla pdfjs-web-fonts-disabled = Is tipografias web sunt disativadas: is tipografias incrustadas a su PDF non podent èssere impreadas. ## Editing @@ -266,6 +241,27 @@ pdfjs-editor-stamp-button = .title = Agiunghe o modìfica immàgines pdfjs-editor-stamp-button-label = Agiunghe o modìfica immàgines +pdfjs-editor-highlight-button = + .title = Evidèntzia +pdfjs-editor-highlight-button-label = Evidèntzia +pdfjs-highlight-floating-button1 = + .title = Evidèntzia + .aria-label = Evidèntzia +pdfjs-highlight-floating-button-label = Evidèntzia + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Boga su disinnu +pdfjs-editor-remove-freetext-button = + .title = Boga su testu +pdfjs-editor-remove-stamp-button = + .title = Boga s’immàgine +pdfjs-editor-remove-highlight-button = + .title = Boga s’evidèntzia + +## + # Editor Parameters pdfjs-editor-free-text-color-input = Colore pdfjs-editor-free-text-size-input = Mannària @@ -274,17 +270,73 @@ pdfjs-editor-stamp-add-image-button = .title = Agiunghe un’immàgine pdfjs-editor-stamp-add-image-button-label = Agiunghe un’immàgine -pdfjs-free-text = +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Grussària +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Editore de testu -pdfjs-free-text-default-content = Cumintza a iscrìere… -pdfjs-ink = - .aria-label = Editore de disinnos -pdfjs-ink-canvas = - .aria-label = Immàgine creada dae s’utente + .default-content = Cumintza a iscrìere… ## Alt-text dialog +pdfjs-editor-alt-text-button-label = Testu alternativu +pdfjs-editor-alt-text-dialog-label = Sèbera un’optzione +pdfjs-editor-alt-text-dialog-description = Su testu alternativu (“alt text”) est ùtile pro persones chi non podent bìdere s’immàgine o cando non benit carrigada. +pdfjs-editor-alt-text-add-description-label = Agiunghe una descritzione +pdfjs-editor-alt-text-cancel-button = Annulla +pdfjs-editor-alt-text-save-button = Sarva + +## Color picker + +pdfjs-editor-colorpicker-button = + .title = Modifica su colore +pdfjs-editor-colorpicker-dropdown = + .aria-label = Colores a disponimentu +pdfjs-editor-colorpicker-yellow = + .title = Grogu +pdfjs-editor-colorpicker-green = + .title = Birde +pdfjs-editor-colorpicker-blue = + .title = Biaitu +pdfjs-editor-colorpicker-pink = + .title = Rosa + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +pdfjs-editor-new-alt-text-missing-button-label = Mancat su testu alternativu +pdfjs-editor-new-alt-text-to-review-button-label = Revisiona su testu alternativu +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Creadu in automàticu: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Cunfiguratzione de su testu alternativu de is immàgines +pdfjs-image-alt-text-settings-button-label = Cunfiguratzione de su testu alternativu de is immàgines +pdfjs-editor-alt-text-settings-dialog-label = Cunfiguratzione de su testu alternativu de is immàgines +pdfjs-editor-alt-text-settings-automatic-title = Testu alternativu automàticu +pdfjs-editor-alt-text-settings-create-model-button-label = Crea testu alternativu in automàticu +pdfjs-editor-alt-text-settings-create-model-description = Cussìgiat descritziones pro agiudare a gente chi non podet bìdere s’immàgine o cando non benit carrigada. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Modellu de IA pro su testu alternativu ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Est esecutadu in locale in manera chi is datos tuos abarrent in privadu. Rechestu pro sa generatzione automàtica de testu alternativu. +pdfjs-editor-alt-text-settings-delete-model-button = Cantzella +pdfjs-editor-alt-text-settings-download-model-button = Iscàrriga +pdfjs-editor-alt-text-settings-downloading-model-button = Iscarrighende… +pdfjs-editor-alt-text-settings-editor-title = Editore de testu alternativu +pdfjs-editor-alt-text-settings-show-dialog-button-label = Mustra deretu s’editore de testu alternativu cando siat agiunta un’immàgine +pdfjs-editor-alt-text-settings-show-dialog-description = T’agiudat a assegurare chi totu is immàgines tuas tèngiant unu testu alternativu. +pdfjs-editor-alt-text-settings-close-button = Serra + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Annulla -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. +## Edit a comment dialog +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Cumintza a iscrìere… diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/scn/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/scn/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/scn/viewer.ftl 2026-01-20 14:08:39.381689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/scn/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -12,20 +12,6 @@ .title = Cchiù granni pdfjs-zoom-in-button-label = Cchiù granni -## Secondary toolbar and context menu - - -## Document properties dialog - - -## Variables: -## $width (Number) - the width of the (current) page -## $height (Number) - the height of the (current) page -## $unit (String) - the unit of measurement of the (current) page -## $name (String) - the name of the (current) page -## $orientation (String) - the orientation of the (current) page - - ## # The linearization status of the document; usually called "Fast Web View" in @@ -37,38 +23,10 @@ pdfjs-print-progress-close-button = Sfai -## Tooltips and alt text for side panel toolbar buttons - - -## Thumbnails panel item (tooltip and alt text for images) - - -## Find panel button title and messages - - ## Predefined zoom values pdfjs-page-scale-width = Larghizza dâ pàggina -## PDF page - - -## Loading indicator messages - - -## Annotations - - ## Password pdfjs-password-cancel-button = Sfai - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/sco/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sco/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/sco/viewer.ftl 2026-01-20 14:08:39.381689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sco/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -89,24 +89,12 @@ pdfjs-document-properties-button-label = Document Properties… pdfjs-document-properties-file-name = File nemme: pdfjs-document-properties-file-size = File size: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Title: pdfjs-document-properties-author = Author: pdfjs-document-properties-subject = Subjeck: pdfjs-document-properties-keywords = Keywirds: pdfjs-document-properties-creation-date = Date o Makkin: pdfjs-document-properties-modification-date = Date o Chynges: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Makker: pdfjs-document-properties-producer = PDF Producer: pdfjs-document-properties-version = PDF Version: @@ -233,10 +221,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -252,13 +236,3 @@ pdfjs-password-ok-button = OK pdfjs-password-cancel-button = Stap pdfjs-web-fonts-disabled = Wab fonts are disabled: cannae yaise embeddit PDF fonts. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/si/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/si/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/si/viewer.ftl 2026-01-20 14:08:39.382689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/si/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -45,12 +45,6 @@ # Length of the translation matters since we are in a mobile context, with limited screen estate. pdfjs-download-button-label = බාගන්න pdfjs-bookmark-button-label = පවතින පිටුව -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = යෙදුමෙහි අරින්න -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = යෙදුමෙහි අරින්න ## Secondary toolbar and context menu @@ -86,24 +80,12 @@ pdfjs-document-properties-button-label = ලේඛනයේ ගුණාංග… pdfjs-document-properties-file-name = ගොනුවේ නම: pdfjs-document-properties-file-size = ගොනුවේ ප්‍රමාණය: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = කි.බ. { $size_kb } (බයිට { $size_b }) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = මෙ.බ. { $size_mb } (බයිට { $size_b }) pdfjs-document-properties-title = සිරැසිය: pdfjs-document-properties-author = කතෘ: pdfjs-document-properties-subject = මාතෘකාව: pdfjs-document-properties-keywords = මූල පද: pdfjs-document-properties-creation-date = සෑදූ දිනය: pdfjs-document-properties-modification-date = සංශෝධිත දිනය: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = නිර්මාතෘ: pdfjs-document-properties-producer = පීඩීඑෆ් සම්පාදක: pdfjs-document-properties-version = පීඩීඑෆ් අනුවාදය: @@ -188,7 +170,7 @@ pdfjs-find-entire-word-checkbox-label = සමස්ත වචන pdfjs-find-reached-top = ලේඛනයේ මුදුනට ළඟා විය, පහළ සිට ඉහළට pdfjs-find-reached-bottom = ලේඛනයේ අවසානයට ළඟා විය, ඉහළ සිට පහළට -pdfjs-find-not-found = වැකිකඩ හමු නොවිණි +pdfjs-find-not-found = වැකිකඩ හමු නොවුණි ## Predefined zoom values @@ -213,13 +195,6 @@ pdfjs-missing-file-error = මඟහැරුණු පීඩීඑෆ් ගොනුවකි. pdfjs-unexpected-response-error = අනපේක්‍ෂිත සේවාදායක ප්‍රතිචාරයකි. -## Annotations - -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } - ## Password pdfjs-password-label = මෙම පීඩීඑෆ් ගොනුව විවෘත කිරීමට මුරපදය යොදන්න. @@ -236,18 +211,18 @@ pdfjs-editor-ink-button = .title = අඳින්න pdfjs-editor-ink-button-label = අඳින්න +pdfjs-editor-stamp-button = + .title = රූප සංස්කරණය හෝ එක් කරන්න +pdfjs-editor-stamp-button-label = රූප සංස්කරණය හෝ එක් කරන්න + +## + # Editor Parameters pdfjs-editor-free-text-color-input = වර්ණය pdfjs-editor-free-text-size-input = තරම pdfjs-editor-ink-color-input = වර්ණය pdfjs-editor-ink-thickness-input = ඝණකම -pdfjs-free-text = - .aria-label = වදන් සකසනය -pdfjs-free-text-default-content = ලිවීීම අරඹන්න… ## Alt-text dialog - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - +pdfjs-editor-alt-text-mark-decorative-description = මෙය දාර හෝ දිය සලකුණු වැනි අලංකාර රූප සඳහා භාවිතා වේ. diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/sk/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sk/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/sk/viewer.ftl 2026-01-20 14:08:39.382689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sk/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Aktuálna stránka (zobraziť adresu URL z aktuálnej stránky) pdfjs-bookmark-button-label = Aktuálna stránka -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Otvoriť v aplikácii -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Otvoriť v aplikácii ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Názov súboru: pdfjs-document-properties-file-size = Veľkosť súboru: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } bajtov) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajtov) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kB ({ $b } bajtov) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtov) pdfjs-document-properties-title = Názov: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Predmet: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Dátum vytvorenia: pdfjs-document-properties-modification-date = Dátum úpravy: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Aplikácia: pdfjs-document-properties-producer = Tvorca PDF: pdfjs-document-properties-version = Verzia PDF: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniatúra strany { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Vybrať stranu { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Strana { $page } z { $total } ## Find panel button title and messages @@ -274,10 +276,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -285,6 +283,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Anotácia typu { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -298,9 +299,13 @@ pdfjs-editor-free-text-button = .title = Text +pdfjs-editor-color-picker-free-text-input = + .title = Zmeniť farbu textu pdfjs-editor-free-text-button-label = Text pdfjs-editor-ink-button = .title = Kresliť +pdfjs-editor-color-picker-ink-input = + .title = Zmeniť farbu kresby pdfjs-editor-ink-button-label = Kresliť pdfjs-editor-stamp-button = .title = Pridať alebo upraviť obrázky @@ -308,12 +313,37 @@ pdfjs-editor-highlight-button = .title = Zvýrazniť pdfjs-editor-highlight-button-label = Zvýrazniť -pdfjs-highlight-floating-button = - .title = Zvýrazniť pdfjs-highlight-floating-button1 = .title = Zvýrazniť .aria-label = Zvýrazniť pdfjs-highlight-floating-button-label = Zvýrazniť +pdfjs-comment-floating-button = + .title = Pridať komentár + .aria-label = Pridať komentár +pdfjs-comment-floating-button-label = Pridať komentár +pdfjs-editor-comment-button = + .title = Pridať komentár + .aria-label = Pridať komentár +pdfjs-editor-comment-button-label = Pridať komentár +pdfjs-editor-signature-button = + .title = Pridať podpis +pdfjs-editor-signature-button-label = Pridať podpis + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Editor zvýraznenia +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Editor kreslenia +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Editor podpisu: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Editor obrázkov ## Remove button for the various kind of editor. @@ -325,6 +355,8 @@ .title = Odstrániť obrázok pdfjs-editor-remove-highlight-button = .title = Odstrániť zvýraznenie +pdfjs-editor-remove-signature-button = + .title = Odstrániť podpis ## @@ -341,19 +373,43 @@ pdfjs-editor-free-highlight-thickness-input = Hrúbka pdfjs-editor-free-highlight-thickness-title = .title = Zmeňte hrúbku pre zvýrazňovanie iných položiek ako textu -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Ovládacie prvky pre podpisy a uložené podpisy +pdfjs-editor-signature-add-signature-button = + .title = Pridať nový podpis +pdfjs-editor-signature-add-signature-button-label = Pridať nový podpis +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Uložený podpis: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Textový editor -pdfjs-free-text-default-content = Začnite písať… -pdfjs-ink = - .aria-label = Editor kreslenia -pdfjs-ink-canvas = - .aria-label = Obrázok vytvorený používateľom + .default-content = Začnite písať… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Komentár + [few] Komentáre + [many] Komentárov + *[other] Komentárov + } +pdfjs-editor-comments-sidebar-close-button = + .title = Zavrieť bočný panel + .aria-label = Zavrieť bočný panel +pdfjs-editor-comments-sidebar-close-button-label = Zavrieť bočný panel +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Vidíte niečo pozoruhodné? Zvýraznite to a zanechajte komentár. +pdfjs-editor-comments-sidebar-no-comments-link = Ďalšie informácie ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Alternatívny text -pdfjs-editor-alt-text-edit-button-label = Upraviť alternatívny text +pdfjs-editor-alt-text-edit-button = + .aria-label = Upraviť alternatívny text pdfjs-editor-alt-text-dialog-label = Vyberte možnosť pdfjs-editor-alt-text-dialog-description = Alternatívny text (alt text) pomáha, keď ľudia obrázok nevidia alebo sa nenačítava. pdfjs-editor-alt-text-add-description-label = Pridať popis @@ -366,18 +422,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Napríklad: „Mladý muž si sadá za stôl, aby sa najedol“ +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternatívny text ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Ľavý horný roh – zmena veľkosti -pdfjs-editor-resizer-label-top-middle = Horný stred – zmena veľkosti -pdfjs-editor-resizer-label-top-right = Pravý horný roh – zmena veľkosti -pdfjs-editor-resizer-label-middle-right = Vpravo uprostred – zmena veľkosti -pdfjs-editor-resizer-label-bottom-right = Pravý dolný roh – zmena veľkosti -pdfjs-editor-resizer-label-bottom-middle = Stred dole – zmena veľkosti -pdfjs-editor-resizer-label-bottom-left = Ľavý dolný roh – zmena veľkosti -pdfjs-editor-resizer-label-middle-left = Vľavo uprostred – zmena veľkosti +pdfjs-editor-resizer-top-left = + .aria-label = Ľavý horný roh – zmena veľkosti +pdfjs-editor-resizer-top-middle = + .aria-label = Horný stred – zmena veľkosti +pdfjs-editor-resizer-top-right = + .aria-label = Pravý horný roh – zmena veľkosti +pdfjs-editor-resizer-middle-right = + .aria-label = Vpravo uprostred – zmena veľkosti +pdfjs-editor-resizer-bottom-right = + .aria-label = Pravý dolný roh – zmena veľkosti +pdfjs-editor-resizer-bottom-middle = + .aria-label = Stred dole – zmena veľkosti +pdfjs-editor-resizer-bottom-left = + .aria-label = Ľavý dolný roh – zmena veľkosti +pdfjs-editor-resizer-middle-left = + .aria-label = Vľavo uprostred – zmena veľkosti ## Color picker @@ -404,3 +471,293 @@ pdfjs-editor-highlight-show-all-button-label = Zobraziť všetko pdfjs-editor-highlight-show-all-button = .title = Zobraziť všetko + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Upraviť alternatívny text (popis obrázka) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Pridať alternatívny text (popis obrázka) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Sem napíšte svoj popis… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Krátky popis pre ľudí, ktorí nevidia obrázok alebo ak sa obrázok nenačíta. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Tento alternatívny text bol vytvorený automaticky a môže byť nepresný. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Ďalšie informácie +pdfjs-editor-new-alt-text-create-automatically-button-label = Automaticky vytvoriť alternatívny text +pdfjs-editor-new-alt-text-not-now-button = Teraz nie +pdfjs-editor-new-alt-text-error-title = Alternatívny text sa nepodarilo vytvoriť automaticky +pdfjs-editor-new-alt-text-error-description = Napíšte svoj vlastný alternatívny text alebo to skúste znova neskôr. +pdfjs-editor-new-alt-text-error-close-button = Zavrieť +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Sťahuje sa model AI pre alternatívne texty ({ $downloadedSize } z { $totalSize } MB) + .aria-valuetext = Sťahuje sa model AI pre alternatívne texty ({ $downloadedSize } z { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternatívny text bol pridaný +pdfjs-editor-new-alt-text-added-button-label = Alternatívny text bol pridaný +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Chýbajúci alternatívny text +pdfjs-editor-new-alt-text-missing-button-label = Chýbajúci alternatívny text +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Skontrolovať alternatívny text +pdfjs-editor-new-alt-text-to-review-button-label = Skontrolovať alternatívny text +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Vytvorené automaticky: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Nastavenia alternatívneho textu obrázka +pdfjs-image-alt-text-settings-button-label = Nastavenia alternatívneho textu obrázka +pdfjs-editor-alt-text-settings-dialog-label = Nastavenia alternatívneho textu obrázka +pdfjs-editor-alt-text-settings-automatic-title = Automatický alternatívny text +pdfjs-editor-alt-text-settings-create-model-button-label = Automaticky vytvoriť alternatívny text +pdfjs-editor-alt-text-settings-create-model-description = Navrhuje popisy, ktoré pomôžu ľuďom, ktorým sa obrázok nezobrazuje alebo ak sa obrázok nenačíta. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model AI pre alternatívne texty ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Beží lokálne na vašom zariadení, takže vaše dáta zostanú súkromné. Vyžaduje sa pre automatický alternatívny text. +pdfjs-editor-alt-text-settings-delete-model-button = Odstrániť +pdfjs-editor-alt-text-settings-download-model-button = Stiahnuť +pdfjs-editor-alt-text-settings-downloading-model-button = Sťahuje sa… +pdfjs-editor-alt-text-settings-editor-title = Editor alternatívneho textu +pdfjs-editor-alt-text-settings-show-dialog-button-label = Pri pridávaní obrázka ihneď zobraziť editor alternatívneho textu +pdfjs-editor-alt-text-settings-show-dialog-description = Pomáha vám zabezpečiť, aby všetky vaše obrázky mali alternatívny text. +pdfjs-editor-alt-text-settings-close-button = Zavrieť + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Zvýraznenie bolo pridané +pdfjs-editor-freetext-added-alert = Text bol pridaný +pdfjs-editor-ink-added-alert = Kresba bola pridaná +pdfjs-editor-stamp-added-alert = Obrázok bol pridaný +pdfjs-editor-signature-added-alert = Podpis bol pridaný + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Zvýraznenie bolo odstránené +pdfjs-editor-undo-bar-message-freetext = Text bol odstránený +pdfjs-editor-undo-bar-message-ink = Kreslenie bolo odstránené +pdfjs-editor-undo-bar-message-stamp = Obrázok bol odstránený +pdfjs-editor-undo-bar-message-signature = Podpis bol odstránený +pdfjs-editor-undo-bar-message-comment = Komentár odstránený +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } anotácia odstránená + [few] { $count } anotácie odstránené + [many] { $count } anotácií odstránených + *[other] { $count } anotácií odstránených + } +pdfjs-editor-undo-bar-undo-button = + .title = Späť +pdfjs-editor-undo-bar-undo-button-label = Späť +pdfjs-editor-undo-bar-close-button = + .title = Zavrieť +pdfjs-editor-undo-bar-close-button-label = Zavrieť + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Toto okno umožňuje používateľovi vytvoriť podpis, ktorý sa pridá do dokumentu PDF. Používateľ môže upraviť meno (ktoré zároveň slúži ako alternatívny text) a voliteľne uložiť podpis, ak ho plánuje v budúcnosti znova použiť. +pdfjs-editor-add-signature-dialog-title = Pridať podpis + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Typ + .title = Typ +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Kresliť + .title = Kresliť +pdfjs-editor-add-signature-image-button = Obrázok + .title = Obrázok + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Zadajte svoj podpis + .placeholder = Zadajte svoj podpis +pdfjs-editor-add-signature-draw-placeholder = Nakreslite svoj podpis +pdfjs-editor-add-signature-draw-thickness-range-label = Hrúbka +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Hrúbka ceruzky: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Sem presuňte súbor, ktorý chcete nahrať +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Alebo vyberte súbor s obrázkom + *[other] Alebo vyberte súbor s obrázkom + } + +## Controls + +pdfjs-editor-add-signature-description-label = Popis (alternatívny text) +pdfjs-editor-add-signature-description-input = + .title = Popis (alternatívny text) +pdfjs-editor-add-signature-description-default-when-drawing = Podpis +pdfjs-editor-add-signature-clear-button-label = Vymazať podpis +pdfjs-editor-add-signature-clear-button = + .title = Vymazať podpis +pdfjs-editor-add-signature-save-checkbox = Uložiť podpis +pdfjs-editor-add-signature-save-warning-message = Dosiahli ste limit 5 uložených podpisov. Ak chcete uložiť ďalší, jeden odstráňte. +pdfjs-editor-add-signature-image-upload-error-title = Obrázok sa nepodarilo nahrať +pdfjs-editor-add-signature-image-upload-error-description = Skontrolujte sieťové pripojenie alebo skúste iný obrázok. +pdfjs-editor-add-signature-image-no-data-error-title = Tento obrázok sa nedá previesť na podpis +pdfjs-editor-add-signature-image-no-data-error-description = Skúste nahrať iný obrázok. +pdfjs-editor-add-signature-error-close-button = Zavrieť + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Zrušiť +pdfjs-editor-add-signature-add-button = Pridať +pdfjs-editor-edit-signature-update-button = Aktualizovať + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Upraviť komentár +pdfjs-editor-edit-comment-popup-button = + .title = Upraviť komentár +pdfjs-editor-delete-comment-popup-button-label = Odstrániť komentár +pdfjs-editor-delete-comment-popup-button = + .title = Odstrániť komentár +pdfjs-show-comment-button = + .title = Zobraziť komentár + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Upraviť komentár +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Aktualizovať +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Pridať komentár +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Pridať +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Začnite písať… +pdfjs-editor-edit-comment-dialog-cancel-button = Zrušiť + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Pridať komentár + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Prepnúť bočný panel (dokument obsahuje miniatúry/prehľad/prílohy/vrstvy) +pdfjs-toggle-views-manager-button1-label = Spravovať strany +pdfjs-views-manager-sidebar = + .aria-label = Bočný panel +pdfjs-views-manager-sidebar-resizer = + .aria-label = Zmeniť veľkosť bočného panela +pdfjs-views-manager-view-selector-button = + .title = Zobrazenia +pdfjs-views-manager-view-selector-button-label = Zobrazenia +pdfjs-views-manager-pages-title = Strany +pdfjs-views-manager-outlines-title1 = Prehľad dokumentu + .title = Prehľad dokumentu (dvojitým kliknutím rozbalíte/zbalíte všetky položky) +pdfjs-views-manager-attachments-title = Prílohy +pdfjs-views-manager-layers-title1 = Vrstvy + .title = Vrstvy (dvojitým kliknutím obnovíte všetky vrstvy do predvoleného stavu) +pdfjs-views-manager-pages-option-label = Strany +pdfjs-views-manager-outlines-option-label = Prehľad dokumentu +pdfjs-views-manager-attachments-option-label = Prílohy +pdfjs-views-manager-layers-option-label = Vrstvy +pdfjs-views-manager-add-file-button = + .title = Pridať súbor +pdfjs-views-manager-add-file-button-label = Pridať súbor +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } označená + [few] { $count } označené + [many] { $count } označených + *[other] { $count } označených + } +pdfjs-views-manager-pages-status-none-action-label = Vybrať strany +pdfjs-views-manager-pages-status-action-button-label = Spravovať +pdfjs-views-manager-pages-status-copy-button-label = Kopírovať +pdfjs-views-manager-pages-status-cut-button-label = Vystrihnúť +pdfjs-views-manager-pages-status-delete-button-label = Odstrániť +pdfjs-views-manager-pages-status-export-selected-button-label = Exportovať vybrané… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] Vystrihnutá 1 strana + [few] Vystrihnuté { $count } strany + [many] Vystrihnutých { $count } strán + *[other] Vystrihnutých { $count } strán + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] Skopírovaná 1 strana + [few] Skopírované { $count } strany + [many] Skopírovaných { $count } strán + *[other] Skopírovaných { $count } strán + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] Odstránená 1 strana + [few] Odstránené { $count } strany + [many] Odstránených { $count } strán + *[other] Odstránených { $count } strán + } +pdfjs-views-manager-pages-status-waiting-ready-label = Váš súbor sa pripravuje… +pdfjs-views-manager-pages-status-waiting-uploading-label = Nahráva sa súbor… +pdfjs-views-manager-status-warning-cut-label = Vystrihnutie sa nepodarilo. Obnovte stránku a skúste to znova. +pdfjs-views-manager-status-warning-copy-label = Skopírovanie sa nepodarilo. Obnovte stránku a skúste to znova. +pdfjs-views-manager-status-warning-delete-label = Odstránenie sa nepodarilo. Obnovte stránku a skúste to znova. +pdfjs-views-manager-status-warning-save-label = Uloženie sa nepodarilo. Obnovte stránku a skúste to znova. +pdfjs-views-manager-status-undo-button-label = Späť +pdfjs-views-manager-status-done-button-label = Hotovo +pdfjs-views-manager-status-close-button = + .title = Zavrieť +pdfjs-views-manager-status-close-button-label = Zavrieť +pdfjs-views-manager-paste-button-label = Prilepiť +pdfjs-views-manager-paste-button-before = + .title = Vložiť pred prvú stranu +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Vložiť za stranu { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NOVÉ +pdfjs-views-manager-waiting-for-file = Nahráva sa súbor… +pdfjs-toggle-views-manager-button1 = + .title = Spravovať strany + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Odstrániť uložený podpis +pdfjs-editor-delete-signature-button-label1 = Odstrániť uložený podpis + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Upraviť popis + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Upraviť popis diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/skr/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/skr/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/skr/viewer.ftl 2026-01-20 14:08:39.383689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/skr/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = موجودہ ورقہ (موجودہ ورقے کنوں یوآرایل ݙیکھو) pdfjs-bookmark-button-label = موجودہ ورقہ -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = ایپ وچ کھولو -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = ایپ وچ کھولو ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = فائل دا ناں: pdfjs-document-properties-file-size = فائل دا سائز: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } کے بی ({ $size_b } بائٹس) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } ایم بی ({ $size_b } بائٹس) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } بائٹاں) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } بائٹاں) pdfjs-document-properties-title = عنوان: pdfjs-document-properties-author = تخلیق کار: pdfjs-document-properties-subject = موضوع: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = تخلیق دی تاریخ: pdfjs-document-properties-modification-date = ترمیم دی تاریخ: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = تخلیق کار: pdfjs-document-properties-producer = PDF پیدا کار: pdfjs-document-properties-version = PDF ورژن: @@ -226,6 +219,21 @@ pdfjs-find-entire-word-checkbox-label = تمام الفاظ pdfjs-find-reached-top = ورقے دے شروع تے پُج ڳیا، تلوں جاری کیتا ڳیا pdfjs-find-reached-bottom = ورقے دے پاند تے پُڄ ڳیا، اُتوں شروع کیتا ڳیا +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $total } وِچوں { $current } مشابہ + *[other] { $total } وِچوں { $current } مشابے + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] { $limit } توں ودھ مماثلت۔ + *[other] { $limit } توں ودھ مماثلتاں۔ + } pdfjs-find-not-found = فقرہ نئیں ملیا ## Predefined zoom values @@ -255,10 +263,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -266,6 +270,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } تشریح] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -283,9 +290,27 @@ pdfjs-editor-ink-button = .title = چھکو pdfjs-editor-ink-button-label = چھکو +pdfjs-editor-stamp-button = + .title = تصویراں کوں شامل کرو یا ترمیم کرو +pdfjs-editor-stamp-button-label = تصویراں کوں شامل کرو یا ترمیم کرو +pdfjs-editor-highlight-button = + .title = نمایاں کرو +pdfjs-editor-highlight-button-label = نمایاں کرو +pdfjs-highlight-floating-button1 = + .title = نمایاں کرو + .aria-label = نمایاں کرو +pdfjs-highlight-floating-button-label = نمایاں کرو ## Remove button for the various kind of editor. +pdfjs-editor-remove-ink-button = + .title = ڈرائینگ ہٹاؤ +pdfjs-editor-remove-freetext-button = + .title = متن ہٹاؤ +pdfjs-editor-remove-stamp-button = + .title = تصویر ہٹاؤ +pdfjs-editor-remove-highlight-button = + .title = نمایاں ہٹاؤ ## @@ -298,23 +323,58 @@ pdfjs-editor-stamp-add-image-button = .title = تصویر شامل کرو pdfjs-editor-stamp-add-image-button-label = تصویر شامل کرو -pdfjs-free-text = - .aria-label = ٹیکسٹ ایڈیٹر -pdfjs-free-text-default-content = ٹائپنگ شروع کرو … -pdfjs-ink = - .aria-label = ڈرا ایڈیٹر -pdfjs-ink-canvas = - .aria-label = صارف دی بݨائی ہوئی تصویر +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = مُٹاݨ +pdfjs-editor-free-highlight-thickness-title = + .title = متن توں ان٘ج ٻئے شئیں کوں نمایاں کرݨ ویلے مُٹاݨ کوں بدلو ## Alt-text dialog +pdfjs-editor-alt-text-button-label = Alt متن +pdfjs-editor-alt-text-dialog-label = ہِک اختیار چُݨو +pdfjs-editor-alt-text-dialog-description = Alt متن (متبادل متن) اِیں ویلے مَدَت کرین٘دا ہِے جہڑیلے لوک تصویر کوں نِھیں ݙیکھ سڳدے یا جہڑیلے اِیہ لوڈ کائنی تِھین٘دا۔ +pdfjs-editor-alt-text-add-description-label = تفصیل شامل کرو +pdfjs-editor-alt-text-add-description-description = 1-2 جملیاں دا مقصد جہڑے موضوع، ترتیب، یا اعمال کوں بیان کرین٘دے ہِن۔ +pdfjs-editor-alt-text-mark-decorative-label = آرائشی طور تے نشان زد کرو +pdfjs-editor-alt-text-mark-decorative-description = اِیہ آرائشی تصویراں کِیتے استعمال تِھین٘دا ہِے، جیویں بارڈر یا واٹر مارکس۔ +pdfjs-editor-alt-text-cancel-button = منسوخ +pdfjs-editor-alt-text-save-button = محفوظ +pdfjs-editor-alt-text-decorative-tooltip = آرائشی دے طور تے نشان زد تِھی ڳِیا +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = مثال دے طور تے، "ہِک جؤان کھاݨاں کھاوݨ کِیتے میز اُتّے ٻیٹھا ہِے" +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alt متن ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. +pdfjs-editor-resizer-top-left = + .aria-label = اُتلی کَھٻّی نُکّڑ — سائز بدلو +pdfjs-editor-resizer-top-middle = + .aria-label = اُتلا وِچلا — سائز بدلو +pdfjs-editor-resizer-top-right = + .aria-label = اُتلی سَڄّی نُکَّڑ — سائز بدلو +pdfjs-editor-resizer-middle-right = + .aria-label = وِچلا سڄّا — سائز بدلو +pdfjs-editor-resizer-bottom-right = + .aria-label = تلوِیں سَڄّی نُکَّڑ — سائز بدلو +pdfjs-editor-resizer-bottom-middle = + .aria-label = تلواں وِچلا — سائز بدلو +pdfjs-editor-resizer-bottom-left = + .aria-label = تلوِیں کَھٻّی نُکّڑ — سائز بدلو +pdfjs-editor-resizer-middle-left = + .aria-label = وِچلا کَھٻّا — سائز بدلو ## Color picker +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = نشابر رنگ +pdfjs-editor-colorpicker-button = + .title = رنگ بدلو +pdfjs-editor-colorpicker-dropdown = + .aria-label = رنگ اختیارات pdfjs-editor-colorpicker-yellow = .title = پیلا pdfjs-editor-colorpicker-green = @@ -325,3 +385,81 @@ .title = گلابی pdfjs-editor-colorpicker-red = .title = لال + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = سارے ݙکھاؤ +pdfjs-editor-highlight-show-all-button = + .title = سارے ݙکھاؤ + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = آلٹ عبارت وچ تبدیلی کرو (تصویر تفصیل) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = آلٹ عبارت شامل کرو (تصویر تفصیل) +pdfjs-editor-new-alt-text-textarea = + .placeholder = اتھ آپݨی وضاحت لکھو۔۔۔ +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = اُنہاں لوکاں کیتے مختصر تفصیل جہڑے تصویر کائنی ݙیکھ سڳدے یا ڄݙݨ تصویر لوڈ کائبی تھیندی۔ +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = آلٹ عبارت خودکار تخلیق تھئی ہے تے غلط تھی سڳدی ہے۔ +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = ٻیا سِکھو +pdfjs-editor-new-alt-text-create-automatically-button-label = آلٹ عبارت خودکار بݨاؤ +pdfjs-editor-new-alt-text-not-now-button = ہݨ کائناں +pdfjs-editor-new-alt-text-error-title = آلٹ عبارت خودکار نہ بݨاؤ +pdfjs-editor-new-alt-text-error-description = سوہݨا، آپݨی آلٹ عبارت لکھو یا ولدا بعد وچ کوشش کرو۔ +pdfjs-editor-new-alt-text-error-close-button = بند کرو +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = آلٹ عبارت اے آئی ماڈل({ $totalSize }ایم بی دے { $downloadedSize }) ڈاؤن لوڈ تھیندا پئے + .aria-valuetext = آلٹ عبارت اے آئی ماڈل({ $totalSize }ایم بی دے { $downloadedSize }) ڈاؤن لوڈ تھیندا پئے +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = آلٹ عبارت شامل تھی ڳئی +pdfjs-editor-new-alt-text-added-button-label = آلٹ عبارت شامل تھی ڳئی +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = متبادل عبارت غائب ہے +pdfjs-editor-new-alt-text-missing-button-label = متبادل عبارت غائب ہے +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = alt متن تے نظرثانی کرو +pdfjs-editor-new-alt-text-to-review-button-label = alt متن تے نظرثانی کرو +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = خودکار تخلیق تھئی: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = تصویر آلٹ عبارت ترتیباں +pdfjs-image-alt-text-settings-button-label = تصویر آلٹ عبارت ترتیباں +pdfjs-editor-alt-text-settings-dialog-label = تصویر آلٹ عبارت ترتیباں +pdfjs-editor-alt-text-settings-automatic-title = خودکار آلٹ عبارت +pdfjs-editor-alt-text-settings-create-model-button-label = آلٹ عبارت خودکار بݨاؤ +pdfjs-editor-alt-text-settings-create-model-description = اُنہاں لوکاں دی مدد کیتے تفصیل تجویز کرو جہڑے تصویر کائنی ݙیکھ سڳدے یا ڄݙݨ تصویر لوڈ کائبی تھیندی۔ +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = آلٹ عبارت اے آئی ماڈل ({ $totalSize } ایم بی) +pdfjs-editor-alt-text-settings-ai-model-description = تہاݙی ڈیوائس تے مقامی طور تے چلدا ہے تاں جو تہاݙا ڈیٹا نجی رہوے۔ خودکار آلٹ عبارت کیتے ضروری ہے۔ +pdfjs-editor-alt-text-settings-delete-model-button = مٹاؤ +pdfjs-editor-alt-text-settings-download-model-button = ڈاؤن لوڈ +pdfjs-editor-alt-text-settings-downloading-model-button = ڈاؤن لوڈ تھیندا پئے … +pdfjs-editor-alt-text-settings-editor-title = متبادل ٹیکسٹ ایڈیٹر +pdfjs-editor-alt-text-settings-show-dialog-button-label = تصویر شامل کرݨ ویلے فوری طور تے آلٹ ٹیکسٹ ایڈیٹر ݙکھاؤ +pdfjs-editor-alt-text-settings-show-dialog-description = ایہ تہاکوں یقینی بݨاوݨ وچ مدد کریندے جو تہاݙیاں ساریاں تصویراں وچ آلٹ عبارت ہے۔ +pdfjs-editor-alt-text-settings-close-button = بند کرو + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-undo-button = + .title = کیتا اݨ کیتا +pdfjs-editor-undo-bar-undo-button-label = کیتا اݨ کیتا +pdfjs-editor-undo-bar-close-button = + .title = بند کرو +pdfjs-editor-undo-bar-close-button-label = بند کرو diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/sl/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sl/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/sl/viewer.ftl 2026-01-20 14:08:39.383689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sl/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Trenutna stran (prikaži URL, ki vodi do trenutne strani) pdfjs-bookmark-button-label = Na trenutno stran -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Odpri v programu -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Odpri v programu ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Ime datoteke: pdfjs-document-properties-file-size = Velikost datoteke: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajtov) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajtov) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bajtov) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajtov) pdfjs-document-properties-title = Ime: pdfjs-document-properties-author = Avtor: pdfjs-document-properties-subject = Tema: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Datum nastanka: pdfjs-document-properties-modification-date = Datum spremembe: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Ustvaril: pdfjs-document-properties-producer = Izdelovalec PDF: pdfjs-document-properties-version = Različica PDF: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Sličica strani { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Izberi stran { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Stran { $page } od { $total } ## Find panel button title and messages @@ -225,7 +227,7 @@ pdfjs-find-match-diacritics-checkbox-label = Razlikuj diakritične znake pdfjs-find-entire-word-checkbox-label = Cele besede pdfjs-find-reached-top = Dosežen začetek dokumenta iz smeri konca -pdfjs-find-reached-bottom = Doseženo konec dokumenta iz smeri začetka +pdfjs-find-reached-bottom = Dosežen konec dokumenta, nadaljevanje od začetka # Variables: # $current (Number) - the index of the currently active find result # $total (Number) - the total number of matches in the document @@ -274,10 +276,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -285,6 +283,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Opomba vrste { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -298,16 +299,51 @@ pdfjs-editor-free-text-button = .title = Besedilo +pdfjs-editor-color-picker-free-text-input = + .title = Spremeni barvo besedila pdfjs-editor-free-text-button-label = Besedilo pdfjs-editor-ink-button = .title = Riši +pdfjs-editor-color-picker-ink-input = + .title = Spremeni barvo risbe pdfjs-editor-ink-button-label = Riši pdfjs-editor-stamp-button = .title = Dodajanje ali urejanje slik pdfjs-editor-stamp-button-label = Dodajanje ali urejanje slik pdfjs-editor-highlight-button = - .title = Poudarek -pdfjs-editor-highlight-button-label = Poudarek + .title = Označevalnik +pdfjs-editor-highlight-button-label = Označevalnik +pdfjs-highlight-floating-button1 = + .title = Označi + .aria-label = Označi +pdfjs-highlight-floating-button-label = Označi +pdfjs-comment-floating-button = + .title = Komentiraj + .aria-label = Komentiraj +pdfjs-comment-floating-button-label = Komentiraj +pdfjs-editor-comment-button = + .title = Komentiraj + .aria-label = Komentiraj +pdfjs-editor-comment-button-label = Komentiraj +pdfjs-editor-signature-button = + .title = Dodaj podpis +pdfjs-editor-signature-button-label = Dodaj podpis + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Urejevalnik označb +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Urejevalnik risb +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Urejevalnik podpisov: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Urejevalnik slik ## Remove button for the various kind of editor. @@ -319,6 +355,8 @@ .title = Odstrani sliko pdfjs-editor-remove-highlight-button = .title = Odstrani označbo +pdfjs-editor-remove-signature-button = + .title = Odstrani podpis ## @@ -335,19 +373,43 @@ pdfjs-editor-free-highlight-thickness-input = Debelina pdfjs-editor-free-highlight-thickness-title = .title = Spremeni debelino pri označevanju nebesedilnih elementov -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Kontrolniki za podpise in shranjeni podpisi +pdfjs-editor-signature-add-signature-button = + .title = Dodaj nov podpis +pdfjs-editor-signature-add-signature-button-label = Dodaj nov podpis +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Shranjen podpis: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Urejevalnik besedila -pdfjs-free-text-default-content = Začnite tipkati … -pdfjs-ink = - .aria-label = Urejevalnik risanja -pdfjs-ink-canvas = - .aria-label = Uporabnikova slika + .default-content = Začnite tipkati … +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Komentar + [two] Komentarja + [few] Komentarji + *[other] Komentarji + } +pdfjs-editor-comments-sidebar-close-button = + .title = Zapri stransko vrstico + .aria-label = Zapri stransko vrstico +pdfjs-editor-comments-sidebar-close-button-label = Zapri stransko vrstico +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Ste zasledili kaj omembe vrednega? Narišite oznako in dopišite komentar. +pdfjs-editor-comments-sidebar-no-comments-link = Več o tem ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Nadomestno besedilo -pdfjs-editor-alt-text-edit-button-label = Uredi nadomestno besedilo +pdfjs-editor-alt-text-edit-button = + .aria-label = Uredi nadomestno besedilo pdfjs-editor-alt-text-dialog-label = Izberite možnost pdfjs-editor-alt-text-dialog-description = Nadomestno besedilo se prikaže tistim, ki ne vidijo slike, ali če se ta ne naloži. pdfjs-editor-alt-text-add-description-label = Dodaj opis @@ -360,18 +422,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Na primer: "Mladenič sedi za mizo pri jedi" +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Nadomestno besedilo ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Zgornji levi kot – spremeni velikost -pdfjs-editor-resizer-label-top-middle = Zgoraj na sredini – spremeni velikost -pdfjs-editor-resizer-label-top-right = Zgornji desni kot – spremeni velikost -pdfjs-editor-resizer-label-middle-right = Desno na sredini – spremeni velikost -pdfjs-editor-resizer-label-bottom-right = Spodnji desni kot – spremeni velikost -pdfjs-editor-resizer-label-bottom-middle = Spodaj na sredini – spremeni velikost -pdfjs-editor-resizer-label-bottom-left = Spodnji levi kot – spremeni velikost -pdfjs-editor-resizer-label-middle-left = Levo na sredini – spremeni velikost +pdfjs-editor-resizer-top-left = + .aria-label = Zgornji levi kot – spremeni velikost +pdfjs-editor-resizer-top-middle = + .aria-label = Zgoraj na sredini – spremeni velikost +pdfjs-editor-resizer-top-right = + .aria-label = Zgornji desni kot – spremeni velikost +pdfjs-editor-resizer-middle-right = + .aria-label = Desno na sredini – spremeni velikost +pdfjs-editor-resizer-bottom-right = + .aria-label = Spodnji desni kot – spremeni velikost +pdfjs-editor-resizer-bottom-middle = + .aria-label = Spodaj na sredini – spremeni velikost +pdfjs-editor-resizer-bottom-left = + .aria-label = Spodnji levi kot – spremeni velikost +pdfjs-editor-resizer-middle-left = + .aria-label = Levo na sredini – spremeni velikost ## Color picker @@ -391,3 +464,300 @@ .title = Roza pdfjs-editor-colorpicker-red = .title = Rdeča + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Prikaži vse +pdfjs-editor-highlight-show-all-button = + .title = Prikaži vse + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Uredi nadomestno besedilo (opis slike) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Dodaj nadomestno besedilo (opis slike) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Tukaj napišite svoj opis … +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Kratek opis za ljudi, ki ne morejo videti slike, ali za primer, ko se slika ne naloži. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = To nadomestno besedilo je bilo ustvarjeno samodejno in je lahko netočno. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Več o tem +pdfjs-editor-new-alt-text-create-automatically-button-label = Samodejno ustvari nadomestno besedilo +pdfjs-editor-new-alt-text-not-now-button = Ne zdaj +pdfjs-editor-new-alt-text-error-title = Nadomestnega besedila ni bilo mogoče samodejno ustvariti +pdfjs-editor-new-alt-text-error-description = Sestavite svoje nadomestno besedilo ali poskusite znova pozneje. +pdfjs-editor-new-alt-text-error-close-button = Zapri +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Prenašanje modela UI za nadomestno besedilo ({ $downloadedSize } od { $totalSize } MB) + .aria-valuetext = Prenašanje modela UI za nadomestno besedilo ({ $downloadedSize } od { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Nadomestno besedilo dodano +pdfjs-editor-new-alt-text-added-button-label = Nadomestno besedilo dodano +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Nadomestno besedilo manjka +pdfjs-editor-new-alt-text-missing-button-label = Nadomestno besedilo manjka +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Oceni nadomestno besedilo +pdfjs-editor-new-alt-text-to-review-button-label = Oceni nadomestno besedilo +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Samodejno ustvarjeno: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Nastavitve nadomestnega besedila slike +pdfjs-image-alt-text-settings-button-label = Nastavitve nadomestnega besedila slike +pdfjs-editor-alt-text-settings-dialog-label = Nastavitve nadomestnega besedila slike +pdfjs-editor-alt-text-settings-automatic-title = Samodejno nadomestno besedilo +pdfjs-editor-alt-text-settings-create-model-button-label = Samodejno ustvari nadomestno besedilo +pdfjs-editor-alt-text-settings-create-model-description = Predlaga opise za pomoč ljudem, ki ne morejo videti slike, ali za primer, ko se slika ne naloži. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model UI za nadomestno besedilo ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Izvaja se lokalno na vaši napravi, tako da vaši podatki ostajajo zasebni. Zahtevano za samodejno nadomestno besedilo. +pdfjs-editor-alt-text-settings-delete-model-button = Izbriši +pdfjs-editor-alt-text-settings-download-model-button = Prenesi +pdfjs-editor-alt-text-settings-downloading-model-button = Prenašanje ... +pdfjs-editor-alt-text-settings-editor-title = Urejevalnik nadomestnega besedila +pdfjs-editor-alt-text-settings-show-dialog-button-label = Ob dodajanju slike takoj prikaži urejevalnik nadomestnega besedila +pdfjs-editor-alt-text-settings-show-dialog-description = Pomaga vam zagotoviti, da imajo vse vaše slike nadomestno besedilo. +pdfjs-editor-alt-text-settings-close-button = Zapri + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Označba dodana +pdfjs-editor-freetext-added-alert = Besedilo dodano +pdfjs-editor-ink-added-alert = Risba dodana +pdfjs-editor-stamp-added-alert = Slika dodana +pdfjs-editor-signature-added-alert = Podpis dodan + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Označba odstranjena +pdfjs-editor-undo-bar-message-freetext = Besedilo odstranjeno +pdfjs-editor-undo-bar-message-ink = Risba odstranjena +pdfjs-editor-undo-bar-message-stamp = Slika odstranjena +pdfjs-editor-undo-bar-message-signature = Podpis odstranjen +pdfjs-editor-undo-bar-message-comment = Komentar odstranjen +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } označba odstranjena + [two] { $count } označbi odstranjeni + [few] { $count } označbe odstranjene + *[other] { $count } označb odstranjenih + } +pdfjs-editor-undo-bar-undo-button = + .title = Razveljavi +pdfjs-editor-undo-bar-undo-button-label = Razveljavi +pdfjs-editor-undo-bar-close-button = + .title = Zapri +pdfjs-editor-undo-bar-close-button-label = Zapri + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Ta način omogoča uporabniku ustvariti podpis, ki ga želi dodati dokumentu PDF. Uporabnik lahko uredi ime (ki se uporablja tudi kot nadomestno besedilo) in podpis po želji shrani za ponovno uporabo. +pdfjs-editor-add-signature-dialog-title = Dodaj podpis + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Natipkaj + .title = Natipkaj +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Nariši + .title = Nariši +pdfjs-editor-add-signature-image-button = Slika + .title = Slika + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Natipkajte svoj podpis + .placeholder = Natipkajte svoj podpis +pdfjs-editor-add-signature-draw-placeholder = Narišite svoj podpis +pdfjs-editor-add-signature-draw-thickness-range-label = Debelina +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Debelina peresa: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Povlecite datoteko sem za nalaganje +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Ali prebrskajte slikovne datoteke + *[other] Ali prebrskajte slikovne datoteke + } + +## Controls + +pdfjs-editor-add-signature-description-label = Opis (nadomestno besedilo) +pdfjs-editor-add-signature-description-input = + .title = Opis (nadomestno besedilo) +pdfjs-editor-add-signature-description-default-when-drawing = Podpis +pdfjs-editor-add-signature-clear-button-label = Pobriši podpis +pdfjs-editor-add-signature-clear-button = + .title = Pobriši podpis +pdfjs-editor-add-signature-save-checkbox = Shrani podpis +pdfjs-editor-add-signature-save-warning-message = Dosegli ste omejitev 5 shranjenih podpisov. Če želite shraniti novega, enega odstranite. +pdfjs-editor-add-signature-image-upload-error-title = Slike ni bilo mogoče naložiti +pdfjs-editor-add-signature-image-upload-error-description = Preverite svojo povezavo z omrežjem ali poskusite z drugo sliko. +pdfjs-editor-add-signature-image-no-data-error-title = Te slike ni mogoče pretvoriti v podpis +pdfjs-editor-add-signature-image-no-data-error-description = Poskusite naložiti drugo sliko. +pdfjs-editor-add-signature-error-close-button = Zapri + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Prekliči +pdfjs-editor-add-signature-add-button = Dodaj +pdfjs-editor-edit-signature-update-button = Spremeni + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Uredi komentar +pdfjs-editor-edit-comment-popup-button = + .title = Uredi komentar +pdfjs-editor-delete-comment-popup-button-label = Odstrani komentar +pdfjs-editor-delete-comment-popup-button = + .title = Odstrani komentar +pdfjs-show-comment-button = + .title = Pokaži komentar + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Uredi komentar +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Spremeni +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Dodaj komentar +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Dodaj +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Začnite tipkati … +pdfjs-editor-edit-comment-dialog-cancel-button = Prekliči + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Dodaj komentar + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Preklopi stransko vrstico (dokument vsebuje sličice/oris/priponke/plasti) +pdfjs-toggle-views-manager-button1-label = Upravljanje strani +pdfjs-views-manager-sidebar = + .aria-label = Stranska vrstica +pdfjs-views-manager-sidebar-resizer = + .aria-label = Sprememba velikosti stranske vrstice +pdfjs-views-manager-view-selector-button = + .title = Pogledi +pdfjs-views-manager-view-selector-button-label = Pogledi +pdfjs-views-manager-pages-title = Strani +pdfjs-views-manager-outlines-title1 = Oris dokumenta + .title = Oris dokumenta (dvokliknite za razširitev ali strnitev vseh elementov) +pdfjs-views-manager-attachments-title = Priponke +pdfjs-views-manager-layers-title1 = Plasti + .title = Plasti (dvokliknite za ponastavitev vseh plasti na privzeto stanje) +pdfjs-views-manager-pages-option-label = Strani +pdfjs-views-manager-outlines-option-label = Oris dokumenta +pdfjs-views-manager-attachments-option-label = Priponke +pdfjs-views-manager-layers-option-label = Plasti +pdfjs-views-manager-add-file-button = + .title = Dodaj datoteko +pdfjs-views-manager-add-file-button-label = Dodaj datoteko +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } izbrana + [two] { $count } izbrani + [few] { $count } izbrane + *[other] { $count } izbranih + } +pdfjs-views-manager-pages-status-none-action-label = Izberite strani +pdfjs-views-manager-pages-status-action-button-label = Upravljaj +pdfjs-views-manager-pages-status-copy-button-label = Kopiraj +pdfjs-views-manager-pages-status-cut-button-label = Izreži +pdfjs-views-manager-pages-status-delete-button-label = Izbriši +pdfjs-views-manager-pages-status-export-selected-button-label = Izvozi izbor … +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] { $count } stran izrezana + [two] { $count } strani izrezani + [few] { $count } strani izrezane + *[other] { $count } strani izrezanih + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] { $count } stran kopirana + [two] { $count } strani kopirani + [few] { $count } strani kopirane + *[other] { $count } strani kopiranih + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] { $count } stran izbrisana + [two] { $count } strani izbrisani + [few] { $count } strani izbrisane + *[other] { $count } strani izbrisanih + } +pdfjs-views-manager-pages-status-waiting-ready-label = Pripravljanje datoteke za vas … +pdfjs-views-manager-pages-status-waiting-uploading-label = Nalaganje datoteke … +pdfjs-views-manager-status-warning-cut-label = Izrezovanje ni bilo mogoče. Osvežite stran in poskusite znova. +pdfjs-views-manager-status-warning-copy-label = Kopiranje ni bilo mogoče. Osvežite stran in poskusite znova. +pdfjs-views-manager-status-warning-delete-label = Brisanje ni bilo mogoče. Osvežite stran in poskusite znova. +pdfjs-views-manager-status-warning-save-label = Shranjevanje ni bilo mogoče. Osvežite stran in poskusite znova. +pdfjs-views-manager-status-undo-button-label = Razveljavi +pdfjs-views-manager-status-done-button-label = Končano +pdfjs-views-manager-status-close-button = + .title = Zapri +pdfjs-views-manager-status-close-button-label = Zapri +pdfjs-views-manager-paste-button-label = Prilepi +pdfjs-views-manager-paste-button-before = + .title = Prilepi pred prvo stran +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Prilepi za stranjo { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NOVO +pdfjs-views-manager-waiting-for-file = Nalaganje datoteke … +pdfjs-toggle-views-manager-button1 = + .title = Upravljanje strani + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Odstrani shranjen podpis +pdfjs-editor-delete-signature-button-label1 = Odstrani shranjen podpis + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Uredi opis + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Uredi opis diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/son/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/son/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/son/viewer.ftl 2026-01-20 14:08:39.383689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/son/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -65,37 +65,17 @@ pdfjs-document-properties-button-label = Takadda mayrawey… pdfjs-document-properties-file-name = Tuku maa: pdfjs-document-properties-file-size = Tuku adadu: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = KB { $size_kb } (cebsu-ize { $size_b }) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = MB { $size_mb } (cebsu-ize { $size_b }) pdfjs-document-properties-title = Tiiramaa: pdfjs-document-properties-author = Hantumkaw: pdfjs-document-properties-subject = Dalil: pdfjs-document-properties-keywords = Kufalkalimawey: pdfjs-document-properties-creation-date = Teeyan han: pdfjs-document-properties-modification-date = Barmayan han: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Teekaw: pdfjs-document-properties-producer = PDF berandikaw: pdfjs-document-properties-version = PDF dumi: pdfjs-document-properties-page-count = Moo hinna: -## Variables: -## $width (Number) - the width of the (current) page -## $height (Number) - the height of the (current) page -## $unit (String) - the unit of measurement of the (current) page -## $name (String) - the name of the (current) page -## $orientation (String) - the orientation of the (current) page - - ## pdfjs-document-properties-close-button = Daabu @@ -166,9 +146,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = Firka bangay kaŋ PDF goo ma zumandi. @@ -194,13 +171,3 @@ pdfjs-password-ok-button = Ayyo pdfjs-password-cancel-button = Naŋ pdfjs-web-fonts-disabled = Interneti šigirawey kay: ši hin ka goy nda PDF šigira hurantey. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/sq/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sq/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/sq/viewer.ftl 2026-01-20 14:08:39.383689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sq/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Faqja e Tanishme (Shihni URL nga Faqja e Tanishme) pdfjs-bookmark-button-label = Faqja e Tanishme -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Hape në aplikacion -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Hape në aplikacion ## Secondary toolbar and context menu @@ -102,13 +96,13 @@ pdfjs-document-properties-file-name = Emër kartele: pdfjs-document-properties-file-size = Madhësi kartele: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bajte) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bajte) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bajte) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bajte) pdfjs-document-properties-title = Titull: pdfjs-document-properties-author = Autor: pdfjs-document-properties-subject = Subjekt: @@ -116,9 +110,8 @@ pdfjs-document-properties-creation-date = Datë Krijimi: pdfjs-document-properties-modification-date = Datë Ndryshimi: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Krijues: pdfjs-document-properties-producer = Prodhues PDF-je: pdfjs-document-properties-version = Version PDF-je: @@ -199,6 +192,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniaturë e Faqes { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Përzgjidhni faqen { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Faqja { $page } nga { $total } gjithsej ## Find panel button title and messages @@ -261,10 +263,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -272,6 +270,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Nënvizim { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -285,9 +286,13 @@ pdfjs-editor-free-text-button = .title = Tekst +pdfjs-editor-color-picker-free-text-input = + .title = Ndryshoni ngjyrë teksti pdfjs-editor-free-text-button-label = Tekst pdfjs-editor-ink-button = .title = Vizatoni +pdfjs-editor-color-picker-ink-input = + .title = Ndryshoni ngjyrë vizatimi pdfjs-editor-ink-button-label = Vizatoni pdfjs-editor-stamp-button = .title = Shtoni ose përpunoni figura @@ -295,6 +300,37 @@ pdfjs-editor-highlight-button = .title = Theksim pdfjs-editor-highlight-button-label = Theksoje +pdfjs-highlight-floating-button1 = + .title = Theksim + .aria-label = Theksim +pdfjs-highlight-floating-button-label = Theksim +pdfjs-comment-floating-button = + .title = Komentoni + .aria-label = Komentoni +pdfjs-comment-floating-button-label = Komentoni +pdfjs-editor-comment-button = + .title = Koment + .aria-label = Koment +pdfjs-editor-comment-button-label = Komentoni +pdfjs-editor-signature-button = + .title = Shtoni nënshkrim +pdfjs-editor-signature-button-label = Shtoni nënshkrim + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Përpunues theksimesh +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Përpunues vizatimesh +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Përpunues nënshkrimesh: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Përpunues figurash ## Remove button for the various kind of editor. @@ -306,6 +342,8 @@ .title = Hiq figurë pdfjs-editor-remove-highlight-button = .title = Hiqe theksimin +pdfjs-editor-remove-signature-button = + .title = Hiqe nënshkrimin ## @@ -322,19 +360,41 @@ pdfjs-editor-free-highlight-thickness-input = Trashësi pdfjs-editor-free-highlight-thickness-title = .title = Ndryshoni trashësinë kur theksoni objekte tjetër nga tekst -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Kontrolle nënshkrimesh dhe nënshkrime të ruajtur +pdfjs-editor-signature-add-signature-button = + .title = Shtoni nënshkrim të ri +pdfjs-editor-signature-add-signature-button-label = Shtoni nënshkrim të ri +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Nënshkrim i ruajtur: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Përpunues Tekstesh -pdfjs-free-text-default-content = Filloni të shtypni… -pdfjs-ink = - .aria-label = Përpunues Vizatimesh -pdfjs-ink-canvas = - .aria-label = Figurë e krijuar nga përdoruesi + .default-content = Filloni të shtypni… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Koment + *[other] Komente + } +pdfjs-editor-comments-sidebar-close-button = + .title = Mbylleni anështyllën + .aria-label = Mbylleni anështyllën +pdfjs-editor-comments-sidebar-close-button-label = Mbylleni anështyllën +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Shihni diçka që ia vlen. Theksojeni dhe lini një koment. +pdfjs-editor-comments-sidebar-no-comments-link = Mësoni më tepër ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Tekst alternativ -pdfjs-editor-alt-text-edit-button-label = Përpunoni tekst alternativ +pdfjs-editor-alt-text-edit-button = + .aria-label = Përpunoni tekst alternativ pdfjs-editor-alt-text-dialog-label = Zgjidhni një mundësi pdfjs-editor-alt-text-dialog-description = Teksti alt (tekst alternativ) vjen në ndihmë kur njerëzit s’mund të shohin figurën, ose kur ajo nuk ngarkohet. pdfjs-editor-alt-text-add-description-label = Shtoni një përshkrim @@ -347,18 +407,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Për shembull, “Një djalosh ulet në një tryezë të hajë” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Tekst alternativ ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Cepi i sipërm majtas — ripërmasojeni -pdfjs-editor-resizer-label-top-middle = Mesi i pjesës sipër — ripërmasojeni -pdfjs-editor-resizer-label-top-right = Cepi i sipërm djathtas — ripërmasojeni -pdfjs-editor-resizer-label-middle-right = Djathtas në mes — ripërmasojeni -pdfjs-editor-resizer-label-bottom-right = Cepi i poshtëm djathtas — ripërmasojeni -pdfjs-editor-resizer-label-bottom-middle = Mesi i pjesës poshtë — ripërmasojeni -pdfjs-editor-resizer-label-bottom-left = Cepi i poshtëm — ripërmasojeni -pdfjs-editor-resizer-label-middle-left = Majtas në mes — ripërmasojeni +pdfjs-editor-resizer-top-left = + .aria-label = Cepi i sipërm majtas — ripërmasojeni +pdfjs-editor-resizer-top-middle = + .aria-label = Mesi i pjesës sipër — ripërmasojeni +pdfjs-editor-resizer-top-right = + .aria-label = Cepi i sipërm djathtas — ripërmasojeni +pdfjs-editor-resizer-middle-right = + .aria-label = Djathtas në mes — ripërmasojeni +pdfjs-editor-resizer-bottom-right = + .aria-label = Cepi i poshtëm djathtas — ripërmasojeni +pdfjs-editor-resizer-bottom-middle = + .aria-label = Mesi i pjesës poshtë — ripërmasojeni +pdfjs-editor-resizer-bottom-left = + .aria-label = Cepi i poshtëm — ripërmasojeni +pdfjs-editor-resizer-middle-left = + .aria-label = Majtas në mes — ripërmasojeni ## Color picker @@ -378,3 +449,287 @@ .title = Rozë pdfjs-editor-colorpicker-red = .title = E kuqe + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Shfaqi krejt +pdfjs-editor-highlight-show-all-button = + .title = Shfaqi krejt + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Përpunoni tekst alternativ (përshkrim figure) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Shtoni tekst alternativ (përshkrim figure) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Shkruani këtu përshkrimin tuaj… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Përshkrim i shkurtër për persona që s’munden të shohin figurën, ose për kur figura nuk ngarkohet dot. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Ky tekst alternativ qe krijuar automatikisht dhe mund të jetë i pasaktë. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Mësoni më tepër +pdfjs-editor-new-alt-text-create-automatically-button-label = Krijo automatikisht tekst alternativ +pdfjs-editor-new-alt-text-not-now-button = Jo tani +pdfjs-editor-new-alt-text-error-title = S’u krijua dot automatikisht tekst alternativ +pdfjs-editor-new-alt-text-error-description = Ju lutemi, shkruani tekstin tuaj alternativ, ose riprovoni më vonë. +pdfjs-editor-new-alt-text-error-close-button = Mbylle +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Po shkarkohet model IA teksti alternativ ({ $downloadedSize } nga { $totalSize } MB) + .aria-valuetext = Po shkarkohet model IA teksti alternativ ({ $downloadedSize } nga { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = U shtua tekst alternativ +pdfjs-editor-new-alt-text-added-button-label = U shtua tekst alternativ +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Mungon tekst alternativ +pdfjs-editor-new-alt-text-missing-button-label = Mungon tekst alternativ +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Shqyrtoni tekst alternativ +pdfjs-editor-new-alt-text-to-review-button-label = Shqyrtoni tekst alternativ +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Krijuar automatikisht: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Rregullime teksti alternativ figure +pdfjs-image-alt-text-settings-button-label = Rregullime teksti alternativ figure +pdfjs-editor-alt-text-settings-dialog-label = Rregullime teksti alternativ figure +pdfjs-editor-alt-text-settings-automatic-title = Tekst alternativ i automatizuar +pdfjs-editor-alt-text-settings-create-model-button-label = Krijo automatikisht tekst alternativ +pdfjs-editor-alt-text-settings-create-model-description = Sugjeron përshkrime, për të ndihmuar persona që s’munden të shohin figurën, ose për kur figura nuk ngarkohet dot. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Model IA teksti alternativ ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Xhiron lokalisht në pajisjen tuaj, pra të dhënat tuaja mbeten private. E domosdoshme për tekst të automatizuar alternativ. +pdfjs-editor-alt-text-settings-delete-model-button = Fshije +pdfjs-editor-alt-text-settings-download-model-button = Shkarkoje +pdfjs-editor-alt-text-settings-downloading-model-button = Po shkarkohet… +pdfjs-editor-alt-text-settings-editor-title = Përpunues teksti alternativ +pdfjs-editor-alt-text-settings-show-dialog-button-label = Shfaq menjëherë përpunues teksti alternativ, kur shtohet një figurë +pdfjs-editor-alt-text-settings-show-dialog-description = Ju ndihmon të siguroheni se krejt figurat tuaja kanë tekst alternativ. +pdfjs-editor-alt-text-settings-close-button = Mbylle + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = U shtua theksim +pdfjs-editor-freetext-added-alert = U shtua tekst +pdfjs-editor-ink-added-alert = U shtua vizatim +pdfjs-editor-stamp-added-alert = U shtua figurë +pdfjs-editor-signature-added-alert = U shtua nënshkrim + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = U hoq theksimi +pdfjs-editor-undo-bar-message-freetext = U hoq tekst +pdfjs-editor-undo-bar-message-ink = U hoq vizatim +pdfjs-editor-undo-bar-message-stamp = U hoq figurë +pdfjs-editor-undo-bar-message-signature = Nënshkrimi u hoq +pdfjs-editor-undo-bar-message-comment = Komenti u hoq +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] U hoq { $count } shënim + *[other] U hoqën { $count } shënime + } +pdfjs-editor-undo-bar-undo-button = + .title = Zhbëje +pdfjs-editor-undo-bar-undo-button-label = Zhbëje +pdfjs-editor-undo-bar-close-button = + .title = Mbylle +pdfjs-editor-undo-bar-close-button-label = Mbylle + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Kjo dritare modale i lejon përdoruesit të krijojë një nënshkrim për ta shtuar te një dokument PDF. Përdoruesi mund të përpunojë emrin (i cili shërben edhe si tekst alternativ) dhe, nëse do, ta ruajë nënshkrimin, për ta përdorur prapë. +pdfjs-editor-add-signature-dialog-title = Shtoni një nënshkrim + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Lloj + .title = Lloj +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Vizatoni + .title = Vizatoni +pdfjs-editor-add-signature-image-button = Figurë + .title = Figurë + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Shtypni nënshkrimin tuaj + .placeholder = Shtypni nënshkrimin tuaj +pdfjs-editor-add-signature-draw-placeholder = Vizatoni nënshkrimin tuaj +pdfjs-editor-add-signature-draw-thickness-range-label = Trashësi +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Trashësi vizatimi: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Tërhiqni këtu një kartelë për ngarkim +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Ose zgjidhni kartelë figure + *[other] Ose zgjidhni kartelë figure + } + +## Controls + +pdfjs-editor-add-signature-description-label = Përshkrim (tekst alternativ) +pdfjs-editor-add-signature-description-input = + .title = Përshkrim (tekst alternativ) +pdfjs-editor-add-signature-description-default-when-drawing = Nënshkrim +pdfjs-editor-add-signature-clear-button-label = Spastroje nënshkrimin +pdfjs-editor-add-signature-clear-button = + .title = Spastroje nënshkrimin +pdfjs-editor-add-signature-save-checkbox = Ruaje nënshkrimin +pdfjs-editor-add-signature-save-warning-message = Keni mbërritur në kufirin e 5 nënshkrimeve të ruajtura. Që të ruani tjetër, hiqni një. +pdfjs-editor-add-signature-image-upload-error-title = S’u ngarkua dot figurë +pdfjs-editor-add-signature-image-upload-error-description = Kontrolloni lidhjen tuaj në rrjet, ose provoni figurë tjetër. +pdfjs-editor-add-signature-image-no-data-error-title = S’shndërrohet dot kjo figurë në një nënshkrim +pdfjs-editor-add-signature-image-no-data-error-description = Ju lutemi, provoni të ngarkoni një figurë tjetër. +pdfjs-editor-add-signature-error-close-button = Mbylle + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Anuloje +pdfjs-editor-add-signature-add-button = Shtoje +pdfjs-editor-edit-signature-update-button = Përditësoje + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Përpunoni koment +pdfjs-editor-edit-comment-popup-button = + .title = Përpunoni koment +pdfjs-editor-delete-comment-popup-button-label = Hiqe komentin +pdfjs-editor-delete-comment-popup-button = + .title = Hiqe komentin +pdfjs-show-comment-button = + .title = Shfaqe komentin + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Përpunoni koment +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Përditësojeni +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Shtoni koment +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Shtoje +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Filloni të shtypni… +pdfjs-editor-edit-comment-dialog-cancel-button = Anuloje + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Shtoni koment + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Shfaqni/Fshihni Anështyllër (dokumenti përmban miniatura/përvijim/bashkëngjitje/shtresa) +pdfjs-toggle-views-manager-button1-label = Administroni faqe +pdfjs-views-manager-sidebar = + .aria-label = Anështyllë +pdfjs-views-manager-sidebar-resizer = + .aria-label = Ripërmasues anështylle +pdfjs-views-manager-view-selector-button = + .title = Pamje +pdfjs-views-manager-view-selector-button-label = Pamje +pdfjs-views-manager-pages-title = Faqe +pdfjs-views-manager-attachments-title = Bashkëngjitje +pdfjs-views-manager-layers-title1 = Shtresa + .title = Shtresa (dyklikoni që të rikthehen krejt shtresat te gjendja parazgjedhje) +pdfjs-views-manager-pages-option-label = Faqe +pdfjs-views-manager-outlines-option-label = Përvijim dokumenti +pdfjs-views-manager-attachments-option-label = Bashkëngjitje +pdfjs-views-manager-layers-option-label = Shtresa +pdfjs-views-manager-add-file-button = + .title = Shtoni kartelë +pdfjs-views-manager-add-file-button-label = Shtoni kartelë +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } e përzgjedhur + *[other] { $count } të përzgjedhura + } +pdfjs-views-manager-pages-status-none-action-label = Përzgjidhni faqe +pdfjs-views-manager-pages-status-action-button-label = Administrojini +pdfjs-views-manager-pages-status-copy-button-label = Kopjoje +pdfjs-views-manager-pages-status-cut-button-label = Prije +pdfjs-views-manager-pages-status-delete-button-label = Fshije +pdfjs-views-manager-pages-status-export-selected-button-label = Eksportoni të përzgjedhurit… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] Prerje e 1 faqeje + *[other] Prerje e { $count } faqesh + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 faqe e kopjuar + *[other] { $count } faqe të kopjuara + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 faqe e fshirë + *[other] { $count } faqe të fshira + } +pdfjs-views-manager-pages-status-waiting-ready-label = Po bëhet gati kartela juaj… +pdfjs-views-manager-pages-status-waiting-uploading-label = Po ngarkohet kartelë… +pdfjs-views-manager-status-warning-cut-label = S’u bë dot prerja. Rifreskoni faqen dhe riprovoni. +pdfjs-views-manager-status-warning-copy-label = S’u kopjua dot. Rifreskoni faqen dhe riprovoni. +pdfjs-views-manager-status-warning-delete-label = S’u fshi dot. Rifreskoni faqen dhe riprovoni. +pdfjs-views-manager-status-warning-save-label = S’u ruajt dot. Rifreskoni faqen dhe riprovoni. +pdfjs-views-manager-status-undo-button-label = Zhbëje +pdfjs-views-manager-status-done-button-label = U bë +pdfjs-views-manager-status-close-button = + .title = Mbylle +pdfjs-views-manager-status-close-button-label = Mbylle +pdfjs-views-manager-paste-button-label = Ngjite +pdfjs-views-manager-paste-button-before = + .title = Ngjite para faqes së parë +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Ngjite pas faqes { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = E RE +pdfjs-toggle-views-manager-button1 = + .title = Administroni faqe + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Hiqe nënshkrimin e ruajtur +pdfjs-editor-delete-signature-button-label1 = Hiqe nënshkrimin e ruajtur + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Përpunoni përshkrimin + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Përpunoni përshkrimin diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/sr/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sr/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/sr/viewer.ftl 2026-01-20 14:08:39.384689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sr/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -42,15 +42,15 @@ pdfjs-save-button = .title = Сачувај pdfjs-save-button-label = Сачувај +# Used in Firefox for Android as a tooltip for the download button (“download” is a verb). +pdfjs-download-button = + .title = Преузми +# Used in Firefox for Android as a label for the download button (“download” is a verb). +# Length of the translation matters since we are in a mobile context, with limited screen estate. +pdfjs-download-button-label = Преузми pdfjs-bookmark-button = .title = Тренутна страница (погледајте URL са тренутне странице) pdfjs-bookmark-button-label = Тренутна страница -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Отвори у апликацији -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Отвори у апликацији ## Secondary toolbar and context menu @@ -105,13 +105,13 @@ pdfjs-document-properties-file-name = Име датотеке: pdfjs-document-properties-file-size = Величина датотеке: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } B) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } B) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } бајтова) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } бајтова) pdfjs-document-properties-title = Наслов: pdfjs-document-properties-author = Аутор: pdfjs-document-properties-subject = Тема: @@ -119,9 +119,8 @@ pdfjs-document-properties-creation-date = Датум креирања: pdfjs-document-properties-modification-date = Датум модификације: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Стваралац: pdfjs-document-properties-producer = PDF произвођач: pdfjs-document-properties-version = PDF верзија: @@ -168,10 +167,10 @@ ## Tooltips and alt text for side panel toolbar buttons pdfjs-toggle-sidebar-button = - .title = Прикажи додатну палету + .title = Прикажи/сакриј бочни панел pdfjs-toggle-sidebar-notification-button = - .title = Прикажи/сакриј бочну траку (документ садржи контуру/прилоге/слојеве) -pdfjs-toggle-sidebar-button-label = Прикажи додатну палету + .title = Прикажи/сакриј бочни панел (документ садржи контуру/прилоге/слојеве) +pdfjs-toggle-sidebar-button-label = Прикажи/сакриј бочни панел pdfjs-document-outline-button = .title = Прикажи структуру документа (двоструким кликом проширујете/скупљате све ставке) pdfjs-document-outline-button-label = Контура документа @@ -202,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Сличица од странице { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Изабери страницу { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Страница { $page } од { $total } ## Find panel button title and messages @@ -220,6 +228,23 @@ pdfjs-find-entire-word-checkbox-label = Целе речи pdfjs-find-reached-top = Достигнут врх документа, наставио са дна pdfjs-find-reached-bottom = Достигнуто дно документа, наставио са врха +# Variables: +# $current (Number) - the index of the currently active find result +# $total (Number) - the total number of matches in the document +pdfjs-find-match-count = + { $total -> + [one] { $current } од { $total } поклапања + [few] { $current } од { $total } поклапања + *[other] { $current } од { $total } поклапања + } +# Variables: +# $limit (Number) - the maximum number of matches +pdfjs-find-match-count-limit = + { $limit -> + [one] Више од { $limit } поклапања + [few] Више од { $limit } поклапања + *[other] Више од { $limit } поклапања + } pdfjs-find-not-found = Фраза није пронађена ## Predefined zoom values @@ -249,10 +274,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -260,6 +281,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } коментар] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -273,27 +297,459 @@ pdfjs-editor-free-text-button = .title = Текст +pdfjs-editor-color-picker-free-text-input = + .title = Промени боју текста pdfjs-editor-free-text-button-label = Текст pdfjs-editor-ink-button = .title = Цртај +pdfjs-editor-color-picker-ink-input = + .title = Промени боју цртежа pdfjs-editor-ink-button-label = Цртај +pdfjs-editor-stamp-button = + .title = Додај или уреди слике +pdfjs-editor-stamp-button-label = Додај или уреди слике +pdfjs-editor-highlight-button = + .title = Означи +pdfjs-editor-highlight-button-label = Означи +pdfjs-highlight-floating-button1 = + .title = Означи + .aria-label = Означи +pdfjs-highlight-floating-button-label = Означи +pdfjs-comment-floating-button = + .title = Коментар + .aria-label = Коментар +pdfjs-comment-floating-button-label = Напомена +pdfjs-editor-comment-button = + .title = Коментар + .aria-label = Коментар +pdfjs-editor-comment-button-label = Коментар +pdfjs-editor-signature-button = + .title = Додај потпис +pdfjs-editor-signature-button-label = Додај потпис + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Уређивач истицања +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Уређивач цртања +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Уређивач потписа: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Уређивач слика + +## Remove button for the various kind of editor. + +pdfjs-editor-remove-ink-button = + .title = Уклони цртеж +pdfjs-editor-remove-freetext-button = + .title = Уклони текст +pdfjs-editor-remove-stamp-button = + .title = Уклони слику +pdfjs-editor-remove-highlight-button = + .title = Уклони ознаку +pdfjs-editor-remove-signature-button = + .title = Уклони потпис + +## + # Editor Parameters pdfjs-editor-free-text-color-input = Боја pdfjs-editor-free-text-size-input = Величина pdfjs-editor-ink-color-input = Боја pdfjs-editor-ink-thickness-input = Дебљина pdfjs-editor-ink-opacity-input = Опацитет -pdfjs-free-text = +pdfjs-editor-stamp-add-image-button = + .title = Додај слику +pdfjs-editor-stamp-add-image-button-label = Додај слику +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Дебљина +pdfjs-editor-free-highlight-thickness-title = + .title = Промени дебљину при означавању других ставки сем текста +pdfjs-editor-add-signature-container = + .aria-label = Контроле потписа и сачувани потписи +pdfjs-editor-signature-add-signature-button = + .title = Додај нови потпис +pdfjs-editor-signature-add-signature-button-label = Додај нови потпис +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Сачувани потпис: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Уређивач текста -pdfjs-free-text-default-content = Почни куцање… -pdfjs-ink = - .aria-label = Уређивач цртежа -pdfjs-ink-canvas = - .aria-label = Кориснички направљена слика + .default-content = Почни куцати… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Напомена + [few] Напомене + *[other] Напомене + } +pdfjs-editor-comments-sidebar-close-button = + .title = Затвори бочну површ + .aria-label = Затвори бочну површ +pdfjs-editor-comments-sidebar-close-button-label = Затвори бочну површ +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Видите нешто вредно пажње? Истакните то и оставите напомену. +pdfjs-editor-comments-sidebar-no-comments-link = Сазнајте више ## Alt-text dialog +pdfjs-editor-alt-text-button-label = Алтернативни текст +pdfjs-editor-alt-text-edit-button = + .aria-label = Уреди алтернативни текст +pdfjs-editor-alt-text-dialog-label = Одабери опцију +pdfjs-editor-alt-text-dialog-description = Алтернативни текст помаже слепим и слабовидим особама или када се слика не учита. +pdfjs-editor-alt-text-add-description-label = Додај опис +pdfjs-editor-alt-text-add-description-description = Сажмите у 1-2 реченице које описују предмет, окружење или радње. +pdfjs-editor-alt-text-mark-decorative-label = Означи као украсно +pdfjs-editor-alt-text-mark-decorative-description = Ово је за украсне слике, као што су ивице или водени печати. +pdfjs-editor-alt-text-cancel-button = Откажи +pdfjs-editor-alt-text-save-button = Сачувај +pdfjs-editor-alt-text-decorative-tooltip = Означено као украсно +# .placeholder: This is a placeholder for the alt text input area +pdfjs-editor-alt-text-textarea = + .placeholder = На пример: „Младић седа за сто да једе“ +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Алтернативни текст ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. +pdfjs-editor-resizer-top-left = + .aria-label = Горњи леви угао — промени величину +pdfjs-editor-resizer-top-middle = + .aria-label = Средина горе — промени величину +pdfjs-editor-resizer-top-right = + .aria-label = Горњи десни угао — промени величину +pdfjs-editor-resizer-middle-right = + .aria-label = Средина десно — промени величину +pdfjs-editor-resizer-bottom-right = + .aria-label = Доњи десни угао — промени величину +pdfjs-editor-resizer-bottom-middle = + .aria-label = Средина доле — промени величину +pdfjs-editor-resizer-bottom-left = + .aria-label = Доњи леви угао — промени величину +pdfjs-editor-resizer-middle-left = + .aria-label = Средина лево — промени величину + +## Color picker + +# This means "Color used to highlight text" +pdfjs-editor-highlight-colorpicker-label = Боја означавања +pdfjs-editor-colorpicker-button = + .title = Промени боју +pdfjs-editor-colorpicker-dropdown = + .aria-label = Избор боја +pdfjs-editor-colorpicker-yellow = + .title = Жута +pdfjs-editor-colorpicker-green = + .title = Зелена +pdfjs-editor-colorpicker-blue = + .title = Плава +pdfjs-editor-colorpicker-pink = + .title = Розе +pdfjs-editor-colorpicker-red = + .title = Црвена + +## Show all highlights +## This is a toggle button to show/hide all the highlights. + +pdfjs-editor-highlight-show-all-button-label = Прикажи све +pdfjs-editor-highlight-show-all-button = + .title = Прикажи све + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Уреди алтернативни текст (опис слике) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Додај алтернативни текст (опис слике) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Напиши опис овде… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Кратак опис за слепе и слабовиде људе или када се слика не успе учитати. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Овај алтернативни текст је направљен аутоматски и може бити нетачан. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Сазнајте више +pdfjs-editor-new-alt-text-create-automatically-button-label = Прави алтернативни текст аутоматски +pdfjs-editor-new-alt-text-not-now-button = Не сада +pdfjs-editor-new-alt-text-error-title = Није могуће самостално направити алтернативни текст +pdfjs-editor-new-alt-text-error-description = Напишите сопствени алтернативни текст или покушајте поново касније. +pdfjs-editor-new-alt-text-error-close-button = Затвори +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Преузимање ВИ модела за алтернативни текст ({ $downloadedSize } од { $totalSize } MB) + .aria-valuetext = Преузимање ВИ модела за алтернативни текст ({ $downloadedSize } од { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Алтернативни текст је додат +pdfjs-editor-new-alt-text-added-button-label = Алтернативни текст је додат +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Недостаје алтернативни текст +pdfjs-editor-new-alt-text-missing-button-label = Недостаје алтернативни текст +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Прегледај алтернативни текст +pdfjs-editor-new-alt-text-to-review-button-label = Прегледај алтернативни текст +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Аутоматски направљено: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Подешавања алтернативног текста слике +pdfjs-image-alt-text-settings-button-label = Подешавања алтернативног текста слике +pdfjs-editor-alt-text-settings-dialog-label = Подешавања алтернативног текста слике +pdfjs-editor-alt-text-settings-automatic-title = Аутоматски алтернативни текст +pdfjs-editor-alt-text-settings-create-model-button-label = Аутоматски прави алтернативни текст +pdfjs-editor-alt-text-settings-create-model-description = Предлаже описе како би се помогло људима који не виде слику или када се слика не учита. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = ВИ модел за алтернативни текст ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Ради локално на вашем уређају тако да ваши подаци остају приватни. Потребно за аутоматски алтернативни текст. +pdfjs-editor-alt-text-settings-delete-model-button = Обриши +pdfjs-editor-alt-text-settings-download-model-button = Преузми +pdfjs-editor-alt-text-settings-downloading-model-button = Преузимање… +pdfjs-editor-alt-text-settings-editor-title = Уређивач алтернативног текста +pdfjs-editor-alt-text-settings-show-dialog-button-label = Прикажи уређивач алтернативног текста одмах при додавању слике +pdfjs-editor-alt-text-settings-show-dialog-description = Помаже вам да све ваше слике имају алтернативни текст. +pdfjs-editor-alt-text-settings-close-button = Затвори + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Истицање је додато +pdfjs-editor-freetext-added-alert = Текст је додат +pdfjs-editor-ink-added-alert = Цртеж је додат +pdfjs-editor-stamp-added-alert = Слика је додата +pdfjs-editor-signature-added-alert = Потпис је додат + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Истицање је уклоњено +pdfjs-editor-undo-bar-message-freetext = Текст је уклоњен +pdfjs-editor-undo-bar-message-ink = Цртеж је уклоњен +pdfjs-editor-undo-bar-message-stamp = Слика је уклоњена +pdfjs-editor-undo-bar-message-signature = Потпис је уклоњен +pdfjs-editor-undo-bar-message-comment = Коментар је уклоњен +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] Уклоњена је { $count } забелешка + [few] Уклоњене су { $count } забелешке + *[other] Уклоњено је { $count } забелешки + } +pdfjs-editor-undo-bar-undo-button = + .title = Опозови +pdfjs-editor-undo-bar-undo-button-label = Опозови +pdfjs-editor-undo-bar-close-button = + .title = Затвори +pdfjs-editor-undo-bar-close-button-label = Затвори + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Овај прозор омогућава кориснику да направи потпис који ће додати у ПДФ документ. Корисник може да уреди име (које такође служи као алтернативни текст) и опционо сачува потпис за поновну употребу. +pdfjs-editor-add-signature-dialog-title = Додај потпис + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Куцај + .title = Куцај +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Цртај + .title = Цртај +pdfjs-editor-add-signature-image-button = Слика + .title = Слика + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Укуцајте свој потпис + .placeholder = Укуцајте свој потпис +pdfjs-editor-add-signature-draw-placeholder = Нацртајте свој потпис +pdfjs-editor-add-signature-draw-thickness-range-label = Дебљина +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Дебљина цртања: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Превуците датотеку овде за отпремање +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Или изаберите датотеке слика + *[other] Или потражите датотеке слика + } + +## Controls + +pdfjs-editor-add-signature-description-label = Опис (алтернативни текст) +pdfjs-editor-add-signature-description-input = + .title = Опис (алтернативни текст) +pdfjs-editor-add-signature-description-default-when-drawing = Потпис +pdfjs-editor-add-signature-clear-button-label = Обриши потпис +pdfjs-editor-add-signature-clear-button = + .title = Обриши потпис +pdfjs-editor-add-signature-save-checkbox = Сачувај потпис +pdfjs-editor-add-signature-save-warning-message = Достигли сте ограничење од 5 сачуваних потписа. Уклоните један да бисте сачували више. +pdfjs-editor-add-signature-image-upload-error-title = Није могуће отпремити слику +pdfjs-editor-add-signature-image-upload-error-description = Проверите своју мрежну везу или покушајте са другом сликом. +pdfjs-editor-add-signature-image-no-data-error-title = Ова слика се не може претворити у потпис +pdfjs-editor-add-signature-image-no-data-error-description = Покушајте да отпремите другу слику. +pdfjs-editor-add-signature-error-close-button = Затвори + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Откажи +pdfjs-editor-add-signature-add-button = Додај +pdfjs-editor-edit-signature-update-button = Ажурирај + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Уреди коментар +pdfjs-editor-edit-comment-popup-button = + .title = Уреди коментар +pdfjs-editor-delete-comment-popup-button-label = Уклони коментар +pdfjs-editor-delete-comment-popup-button = + .title = Уклони коментар +pdfjs-show-comment-button = + .title = Прикажи напомену + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Уреди напомену +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Ажурирај +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Додај напомену +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Додај +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Почните да куцате… +pdfjs-editor-edit-comment-dialog-cancel-button = Откажи + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Додај напомену + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Прикажи/сакриј бочну површ (документ садржи умањене сличице/оквир/прилоге/слојеве) +pdfjs-toggle-views-manager-button1-label = Управљај страницама +pdfjs-views-manager-sidebar = + .aria-label = Бочна површ +pdfjs-views-manager-sidebar-resizer = + .aria-label = Промена величине бочне површи +pdfjs-views-manager-view-selector-button = + .title = Прегледи +pdfjs-views-manager-view-selector-button-label = Прегледи +pdfjs-views-manager-pages-title = Странице +pdfjs-views-manager-outlines-title1 = Контура документа + .title = Контура документа (двоклик за ширење/скупљање свих ставки) +pdfjs-views-manager-attachments-title = Прилози +pdfjs-views-manager-layers-title1 = Слојеви + .title = Слојеви (двоклик за враћање свих слојева у подразумевано стање) +pdfjs-views-manager-pages-option-label = Странице +pdfjs-views-manager-outlines-option-label = Контура документа +pdfjs-views-manager-attachments-option-label = Прилози +pdfjs-views-manager-layers-option-label = Слојеви +pdfjs-views-manager-add-file-button = + .title = Додај датотеку +pdfjs-views-manager-add-file-button-label = Додај датотеку +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] Изабрана је { $count } страница + [few] Изабране су { $count } странице + *[other] Изабрано је { $count } страница + } +pdfjs-views-manager-pages-status-none-action-label = Изаберите странице +pdfjs-views-manager-pages-status-action-button-label = Управљај +pdfjs-views-manager-pages-status-copy-button-label = Умножи +pdfjs-views-manager-pages-status-cut-button-label = Исеци +pdfjs-views-manager-pages-status-delete-button-label = Обриши +pdfjs-views-manager-pages-status-export-selected-button-label = Извези изабрано… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] Исечена је 1 страница + [few] Исечене су { $count } странице + *[other] Исечено је { $count } страница + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] Умножена је 1 страница + [few] Умножене су { $count } странице + *[other] Умножено је { $count } страница + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] Обрисана је 1 страница + [few] Обрисане су { $count } странице + *[other] Обрисано је { $count } страница + } +pdfjs-views-manager-pages-status-waiting-ready-label = Припремам датотеку… +pdfjs-views-manager-pages-status-waiting-uploading-label = Отпремам датотеку… +pdfjs-views-manager-status-warning-cut-label = Не могу да исечем. Освежите страницу и покушајте поново. +pdfjs-views-manager-status-warning-copy-label = Не могу да умножим. Освежите страницу и покушајте поново. +pdfjs-views-manager-status-warning-delete-label = Не могу да обришем. Освежите страницу и покушајте поново. +pdfjs-views-manager-status-warning-save-label = Не могу да сачувам. Освежите страницу и покушајте поново. +pdfjs-views-manager-status-undo-button-label = Опозови +pdfjs-views-manager-status-done-button-label = Готово +pdfjs-views-manager-status-close-button = + .title = Затвори +pdfjs-views-manager-status-close-button-label = Затвори +pdfjs-views-manager-paste-button-label = Убаци +pdfjs-views-manager-paste-button-before = + .title = Убаци пре прве странице +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Убаци после странице { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = НОВО +pdfjs-views-manager-waiting-for-file = Отпремам датотеку… +pdfjs-toggle-views-manager-button1 = + .title = Управљај страницама + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Уклони сачувани потпис +pdfjs-editor-delete-signature-button-label1 = Уклони сачувани потпис + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Уреди опис + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Уреди опис diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/sv-SE/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sv-SE/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/sv-SE/viewer.ftl 2026-01-20 14:08:39.384689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/sv-SE/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Aktuell sida (Visa URL från aktuell sida) pdfjs-bookmark-button-label = Aktuell sida -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Öppna i app -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Öppna i app ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Filnamn: pdfjs-document-properties-file-size = Filstorlek: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } kB ({ $size_b } byte) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byte) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } kB ({ $b } byte) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } byte) pdfjs-document-properties-title = Titel: pdfjs-document-properties-author = Författare: pdfjs-document-properties-subject = Ämne: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Skapades: pdfjs-document-properties-modification-date = Ändrades: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Skapare: pdfjs-document-properties-producer = PDF-producent: pdfjs-document-properties-version = PDF-version: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Miniatyr av sida { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Välj sida { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Sida { $page } av { $total } ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date } { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type }-annotering] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,9 +295,13 @@ pdfjs-editor-free-text-button = .title = Text +pdfjs-editor-color-picker-free-text-input = + .title = Ändra textfärg pdfjs-editor-free-text-button-label = Text pdfjs-editor-ink-button = .title = Rita +pdfjs-editor-color-picker-ink-input = + .title = Ändra ritningsfärg pdfjs-editor-ink-button-label = Rita pdfjs-editor-stamp-button = .title = Lägg till eller redigera bilder @@ -304,12 +309,37 @@ pdfjs-editor-highlight-button = .title = Markera pdfjs-editor-highlight-button-label = Markera -pdfjs-highlight-floating-button = - .title = Markera pdfjs-highlight-floating-button1 = .title = Markera .aria-label = Markera pdfjs-highlight-floating-button-label = Markera +pdfjs-comment-floating-button = + .title = Kommentar + .aria-label = Kommentar +pdfjs-comment-floating-button-label = Kommentar +pdfjs-editor-comment-button = + .title = Kommentar + .aria-label = Kommentar +pdfjs-editor-comment-button-label = Kommentar +pdfjs-editor-signature-button = + .title = Lägg till signatur +pdfjs-editor-signature-button-label = Lägg till signatur + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Markeringsredigerare +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Ritredigerare +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Signaturredigerare: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Bildredigerare ## Remove button for the various kind of editor. @@ -321,6 +351,8 @@ .title = Ta bort bild pdfjs-editor-remove-highlight-button = .title = Ta bort markering +pdfjs-editor-remove-signature-button = + .title = Ta bort signatur ## @@ -337,19 +369,41 @@ pdfjs-editor-free-highlight-thickness-input = Tjocklek pdfjs-editor-free-highlight-thickness-title = .title = Ändra tjocklek när du markerar andra objekt än text -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = Signaturkontroller och sparade signaturer +pdfjs-editor-signature-add-signature-button = + .title = Lägg till ny signatur +pdfjs-editor-signature-add-signature-button-label = Lägg till ny signatur +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Sparad signatur: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Textredigerare -pdfjs-free-text-default-content = Börja skriva… -pdfjs-ink = - .aria-label = Ritredigerare -pdfjs-ink-canvas = - .aria-label = Användarskapad bild + .default-content = Börja skriva… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Kommentar + *[other] Kommentarer + } +pdfjs-editor-comments-sidebar-close-button = + .title = Stäng sidofältet + .aria-label = Stäng sidofältet +pdfjs-editor-comments-sidebar-close-button-label = Stäng sidofältet +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Ser du något anmärkningsvärt? Markera det och lämna en kommentar. +pdfjs-editor-comments-sidebar-no-comments-link = Läs mer ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Alternativ text -pdfjs-editor-alt-text-edit-button-label = Redigera alternativ text +pdfjs-editor-alt-text-edit-button = + .aria-label = Redigera alternativ text pdfjs-editor-alt-text-dialog-label = Välj ett alternativ pdfjs-editor-alt-text-dialog-description = Alt text (alternativ text) hjälper till när människor inte kan se bilden eller när den inte laddas. pdfjs-editor-alt-text-add-description-label = Lägg till en beskrivning @@ -362,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Till exempel, "En ung man sätter sig vid ett bord för att äta en måltid" +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternativ text ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Det övre vänstra hörnet — ändra storlek -pdfjs-editor-resizer-label-top-middle = Överst i mitten — ändra storlek -pdfjs-editor-resizer-label-top-right = Det övre högra hörnet — ändra storlek -pdfjs-editor-resizer-label-middle-right = Mitten höger — ändra storlek -pdfjs-editor-resizer-label-bottom-right = Nedre högra hörnet — ändra storlek -pdfjs-editor-resizer-label-bottom-middle = Nedre mitten — ändra storlek -pdfjs-editor-resizer-label-bottom-left = Nedre vänstra hörnet — ändra storlek -pdfjs-editor-resizer-label-middle-left = Mitten till vänster — ändra storlek +pdfjs-editor-resizer-top-left = + .aria-label = Det övre vänstra hörnet — ändra storlek +pdfjs-editor-resizer-top-middle = + .aria-label = Överst i mitten — ändra storlek +pdfjs-editor-resizer-top-right = + .aria-label = Det övre högra hörnet — ändra storlek +pdfjs-editor-resizer-middle-right = + .aria-label = Mitten höger — ändra storlek +pdfjs-editor-resizer-bottom-right = + .aria-label = Nedre högra hörnet — ändra storlek +pdfjs-editor-resizer-bottom-middle = + .aria-label = Nedre mitten — ändra storlek +pdfjs-editor-resizer-bottom-left = + .aria-label = Nedre vänstra hörnet — ändra storlek +pdfjs-editor-resizer-middle-left = + .aria-label = Mitten till vänster — ändra storlek ## Color picker @@ -400,3 +465,283 @@ pdfjs-editor-highlight-show-all-button-label = Visa alla pdfjs-editor-highlight-show-all-button = .title = Visa alla + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Redigera alternativ text (bildbeskrivning) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Lägg till alternativ text (bildbeskrivning) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Skriv din beskrivning här… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Kort beskrivning för personer som inte kan se bilden eller när bilden inte laddas. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Denna alternativa text skapades automatiskt och kan vara felaktig. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Läs mer +pdfjs-editor-new-alt-text-create-automatically-button-label = Skapa alternativ text automatiskt +pdfjs-editor-new-alt-text-not-now-button = Inte nu +pdfjs-editor-new-alt-text-error-title = Det gick inte att skapa alternativ text automatiskt +pdfjs-editor-new-alt-text-error-description = Skriv din egna alternativa text eller försök igen senare. +pdfjs-editor-new-alt-text-error-close-button = Stäng +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Hämtar AI-modell med alternativ text ({ $downloadedSize } av { $totalSize } MB) + .aria-valuetext = Hämtar AI-modell med alternativ text ({ $downloadedSize } av { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternativ text tillagd +pdfjs-editor-new-alt-text-added-button-label = Alternativ text tillagd +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Saknar alternativ text +pdfjs-editor-new-alt-text-missing-button-label = Saknar alternativ text +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Granska alternativ text +pdfjs-editor-new-alt-text-to-review-button-label = Granska alternativ text +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Skapas automatiskt: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Alternativ textinställningar för bild +pdfjs-image-alt-text-settings-button-label = Alternativ textinställningar för bild +pdfjs-editor-alt-text-settings-dialog-label = Alternativ textinställningar för bild +pdfjs-editor-alt-text-settings-automatic-title = Automatisk alternativ text +pdfjs-editor-alt-text-settings-create-model-button-label = Skapa alternativ text automatiskt +pdfjs-editor-alt-text-settings-create-model-description = Föreslår beskrivningar för att hjälpa personer som inte kan se bilden eller när bilden inte laddas. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = AI-modell för alternativ text ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Körs lokalt på din enhet så att din data förblir privat. Krävs för automatisk alternativ text. +pdfjs-editor-alt-text-settings-delete-model-button = Ta bort +pdfjs-editor-alt-text-settings-download-model-button = Hämta +pdfjs-editor-alt-text-settings-downloading-model-button = Hämtar… +pdfjs-editor-alt-text-settings-editor-title = Alternativ textredigerare +pdfjs-editor-alt-text-settings-show-dialog-button-label = Visa alternativ textredigerare direkt när du lägger till en bild +pdfjs-editor-alt-text-settings-show-dialog-description = Hjälper dig att se till att alla dina bilder har alternativ text. +pdfjs-editor-alt-text-settings-close-button = Stäng + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Markering tillagd +pdfjs-editor-freetext-added-alert = Text tillagd +pdfjs-editor-ink-added-alert = Ritning tillagd +pdfjs-editor-stamp-added-alert = Bild tillagd +pdfjs-editor-signature-added-alert = Signatur tillagd + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Markering borttagen +pdfjs-editor-undo-bar-message-freetext = Text borttagen +pdfjs-editor-undo-bar-message-ink = Ritning borttagen +pdfjs-editor-undo-bar-message-stamp = Bild borttagen +pdfjs-editor-undo-bar-message-signature = Signatur borttagen +pdfjs-editor-undo-bar-message-comment = Kommentar borttagen +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } anteckning har tagits bort + *[other] { $count } anteckningar har tagits bort + } +pdfjs-editor-undo-bar-undo-button = + .title = Ångra +pdfjs-editor-undo-bar-undo-button-label = Ångra +pdfjs-editor-undo-bar-close-button = + .title = Stäng +pdfjs-editor-undo-bar-close-button-label = Stäng + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Denna modal tillåter användaren att skapa en signatur för att lägga till i ett PDF-dokument. Användaren kan redigera namnet (som också fungerar som alternativ text) och eventuellt spara signaturen för upprepad användning. +pdfjs-editor-add-signature-dialog-title = Lägg till en signatur + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Typ + .title = Typ +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Rita + .title = Rita +pdfjs-editor-add-signature-image-button = Bild + .title = Bild + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Skriv din signatur + .placeholder = Skriv din signatur +pdfjs-editor-add-signature-draw-placeholder = Rita din signatur +pdfjs-editor-add-signature-draw-thickness-range-label = Tjocklek +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Ritningstjocklek: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Dra en fil hit för att ladda upp +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Eller välj bildfiler + *[other] Eller bläddra bland bildfiler + } + +## Controls + +pdfjs-editor-add-signature-description-label = Beskrivning (alternativ text) +pdfjs-editor-add-signature-description-input = + .title = Beskrivning (alternativ text) +pdfjs-editor-add-signature-description-default-when-drawing = Signatur +pdfjs-editor-add-signature-clear-button-label = Rensa signatur +pdfjs-editor-add-signature-clear-button = + .title = Rensa signatur +pdfjs-editor-add-signature-save-checkbox = Spara signatur +pdfjs-editor-add-signature-save-warning-message = Du har nått gränsen på 5 sparade signaturer. Ta bort en för att spara fler. +pdfjs-editor-add-signature-image-upload-error-title = Det gick inte att ladda upp bilden +pdfjs-editor-add-signature-image-upload-error-description = Kontrollera din nätverksanslutning eller försök med en annan bild. +pdfjs-editor-add-signature-image-no-data-error-title = Det går inte att konvertera den här bilden till en signatur +pdfjs-editor-add-signature-image-no-data-error-description = Prova att ladda upp en annan bild. +pdfjs-editor-add-signature-error-close-button = Stäng + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Avbryt +pdfjs-editor-add-signature-add-button = Lägg till +pdfjs-editor-edit-signature-update-button = Uppdatera + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Redigera kommentar +pdfjs-editor-edit-comment-popup-button = + .title = Redigera kommentar +pdfjs-editor-delete-comment-popup-button-label = Ta bort kommentar +pdfjs-editor-delete-comment-popup-button = + .title = Ta bort kommentar +pdfjs-show-comment-button = + .title = Visa kommentar + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Redigera kommentar +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Uppdatera +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Lägg till kommentar +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Lägg till +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Börja skriva… +pdfjs-editor-edit-comment-dialog-cancel-button = Avbryt + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Lägg till kommentar + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Visa/dölj sidofält (dokument innehåller miniatyrer/översikt/bilagor/lager) +pdfjs-toggle-views-manager-button1-label = Hantera sidor +pdfjs-views-manager-sidebar = + .aria-label = Sidofält +pdfjs-views-manager-sidebar-resizer = + .aria-label = Storleksändring av sidofält +pdfjs-views-manager-view-selector-button = + .title = Vyer +pdfjs-views-manager-view-selector-button-label = Vyer +pdfjs-views-manager-pages-title = Sidor +pdfjs-views-manager-outlines-title1 = Dokumentöversikt + .title = Dokumentöversikt (dubbelklicka för att expandera/komprimera alla objekt) +pdfjs-views-manager-attachments-title = Bilagor +pdfjs-views-manager-layers-title1 = Lager + .title = Lager (dubbelklicka för att återställa alla lager till standardläge) +pdfjs-views-manager-pages-option-label = Sidor +pdfjs-views-manager-outlines-option-label = Dokumentöversikt +pdfjs-views-manager-attachments-option-label = Bilagor +pdfjs-views-manager-layers-option-label = Lager +pdfjs-views-manager-add-file-button = + .title = Lägg till fil +pdfjs-views-manager-add-file-button-label = Lägg till fil +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } vald + *[other] { $count } valda + } +pdfjs-views-manager-pages-status-none-action-label = Välj sidor +pdfjs-views-manager-pages-status-action-button-label = Hantera +pdfjs-views-manager-pages-status-copy-button-label = Kopiera +pdfjs-views-manager-pages-status-cut-button-label = Klipp ut +pdfjs-views-manager-pages-status-delete-button-label = Ta bort +pdfjs-views-manager-pages-status-export-selected-button-label = Exportera markerad… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 sida klippt + *[other] { $count } sidor klippta + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 sida kopierad + *[other] { $count } sidor kopierade + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 sida borttagen + *[other] { $count } sidor borttagna + } +pdfjs-views-manager-pages-status-waiting-ready-label = Förbereder din fil… +pdfjs-views-manager-pages-status-waiting-uploading-label = Överför fil… +pdfjs-views-manager-status-warning-cut-label = Det gick inte att klippa. Uppdatera sidan och försök igen. +pdfjs-views-manager-status-warning-copy-label = Det gick inte att kopiera. Uppdatera sidan och försök igen. +pdfjs-views-manager-status-warning-delete-label = Det gick inte att ta bort. Uppdatera sidan och försök igen. +pdfjs-views-manager-status-warning-save-label = Det gick inte att spara. Uppdatera sidan och försök igen. +pdfjs-views-manager-status-undo-button-label = Ångra +pdfjs-views-manager-status-done-button-label = Klar +pdfjs-views-manager-status-close-button = + .title = Stäng +pdfjs-views-manager-status-close-button-label = Stäng +pdfjs-views-manager-paste-button-label = Klistra in +pdfjs-views-manager-paste-button-before = + .title = Klistra in före den första sidan +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Klistra in efter sida { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = NYTT +pdfjs-views-manager-waiting-for-file = Överför fil… +pdfjs-toggle-views-manager-button1 = + .title = Hantera sidor + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Ta bort sparad signatur +pdfjs-editor-delete-signature-button-label1 = Ta bort sparad signatur + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Redigera beskrivning + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Redigera beskrivning diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/szl/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/szl/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/szl/viewer.ftl 2026-01-20 14:08:39.384689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/szl/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -89,24 +89,12 @@ pdfjs-document-properties-button-label = Włosności dokumyntu… pdfjs-document-properties-file-name = Miano zbioru: pdfjs-document-properties-file-size = Srogość zbioru: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } B) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } B) pdfjs-document-properties-title = Tytuł: pdfjs-document-properties-author = Autōr: pdfjs-document-properties-subject = Tymat: pdfjs-document-properties-keywords = Kluczowe słowa: pdfjs-document-properties-creation-date = Data zrychtowanio: pdfjs-document-properties-modification-date = Data zmiany: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Zrychtowane ôd: pdfjs-document-properties-producer = PDF ôd: pdfjs-document-properties-version = Wersyjo PDF: @@ -213,9 +201,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = Przi ladowaniu PDFa pokozoł sie feler. @@ -226,10 +211,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -245,13 +226,3 @@ pdfjs-password-ok-button = OK pdfjs-password-cancel-button = Pociep pdfjs-web-fonts-disabled = Necowe fōnty sōm zastawiōne: niy idzie użyć wkludzōnych fōntōw PDF. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ta/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ta/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ta/viewer.ftl 2026-01-20 14:08:39.384689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ta/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -71,24 +71,12 @@ pdfjs-document-properties-button-label = ஆவண பண்புகள்... pdfjs-document-properties-file-name = கோப்பு பெயர்: pdfjs-document-properties-file-size = கோப்பின் அளவு: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } கிபை ({ $size_b } பைட்டுகள்) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } மெபை ({ $size_b } பைட்டுகள்) pdfjs-document-properties-title = தலைப்பு: pdfjs-document-properties-author = எழுதியவர் pdfjs-document-properties-subject = பொருள்: pdfjs-document-properties-keywords = முக்கிய வார்த்தைகள்: pdfjs-document-properties-creation-date = படைத்த தேதி : pdfjs-document-properties-modification-date = திருத்திய தேதி: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = உருவாக்குபவர்: pdfjs-document-properties-producer = பிடிஎஃப் தயாரிப்பாளர்: pdfjs-document-properties-version = PDF பதிப்பு: @@ -183,9 +171,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = PDF ஐ ஏற்றும் போது ஒரு பிழை ஏற்பட்டது. @@ -211,13 +196,3 @@ pdfjs-password-ok-button = சரி pdfjs-password-cancel-button = ரத்து pdfjs-web-fonts-disabled = வலை எழுத்துருக்கள் முடக்கப்பட்டுள்ளன: உட்பொதிக்கப்பட்ட PDF எழுத்துருக்களைப் பயன்படுத்த முடியவில்லை. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/te/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/te/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/te/viewer.ftl 2026-01-20 14:08:39.385689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/te/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -72,24 +72,12 @@ pdfjs-document-properties-button-label = పత్రము లక్షణాలు... pdfjs-document-properties-file-name = దస్త్రం పేరు: pdfjs-document-properties-file-size = దస్త్రం పరిమాణం: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = శీర్షిక: pdfjs-document-properties-author = మూలకర్త: pdfjs-document-properties-subject = విషయం: pdfjs-document-properties-keywords = కీ పదాలు: pdfjs-document-properties-creation-date = సృష్టించిన తేదీ: pdfjs-document-properties-modification-date = సవరించిన తేదీ: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = సృష్టికర్త: pdfjs-document-properties-producer = PDF ఉత్పాదకి: pdfjs-document-properties-version = PDF వర్షన్: @@ -189,9 +177,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = PDF లోడవుచున్నప్పుడు ఒక దోషం ఎదురైంది. @@ -202,10 +187,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -222,7 +203,7 @@ pdfjs-password-cancel-button = రద్దుచేయి pdfjs-web-fonts-disabled = వెబ్ ఫాంట్లు అచేతనించబడెను: ఎంబెడెడ్ PDF ఫాంట్లు ఉపయోగించలేక పోయింది. -## Editing +## # Editor Parameters pdfjs-editor-free-text-color-input = రంగు @@ -230,10 +211,3 @@ pdfjs-editor-ink-color-input = రంగు pdfjs-editor-ink-thickness-input = మందం pdfjs-editor-ink-opacity-input = అకిరణ్యత - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/tg/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/tg/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/tg/viewer.ftl 2026-01-20 14:08:39.385689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/tg/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Саҳифаи ҷорӣ (Дидани нишонии URL аз саҳифаи ҷорӣ) pdfjs-bookmark-button-label = Саҳифаи ҷорӣ -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Кушодан дар барнома -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Кушодан дар барнома ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Номи файл: pdfjs-document-properties-file-size = Андозаи файл: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } КБ ({ $size_b } байт) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } байт) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } КБ ({ $b } байт) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } МБ ({ $b } байт) pdfjs-document-properties-title = Сарлавҳа: pdfjs-document-properties-author = Муаллиф: pdfjs-document-properties-subject = Мавзуъ: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Санаи эҷод: pdfjs-document-properties-modification-date = Санаи тағйирот: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Эҷодкунанда: pdfjs-document-properties-producer = Таҳиякунандаи «PDF»: pdfjs-document-properties-version = Версияи «PDF»: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Тасвирчаи саҳифаи { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Интихоби саҳифаи { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Саҳифаи { $page } аз { $total } ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,6 +279,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [Ҳошиянависӣ - { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -294,13 +295,51 @@ pdfjs-editor-free-text-button = .title = Матн +pdfjs-editor-color-picker-free-text-input = + .title = Иваз кардани ранги матн pdfjs-editor-free-text-button-label = Матн pdfjs-editor-ink-button = .title = Расмкашӣ +pdfjs-editor-color-picker-ink-input = + .title = Иваз кардани ранги расмкашӣ pdfjs-editor-ink-button-label = Расмкашӣ pdfjs-editor-stamp-button = .title = Илова ё таҳрир кардани тасвирҳо pdfjs-editor-stamp-button-label = Илова ё таҳрир кардани тасвирҳо +pdfjs-editor-highlight-button = + .title = Ҷудокунӣ +pdfjs-editor-highlight-button-label = Ҷудокунӣ +pdfjs-highlight-floating-button1 = + .title = Ҷудокунӣ + .aria-label = Ҷудокунӣ +pdfjs-highlight-floating-button-label = Ҷудокунӣ +pdfjs-comment-floating-button = + .title = Шарҳ + .aria-label = Шарҳ +pdfjs-comment-floating-button-label = Шарҳ +pdfjs-editor-comment-button = + .title = Шарҳ + .aria-label = Шарҳ +pdfjs-editor-comment-button-label = Шарҳ +pdfjs-editor-signature-button = + .title = Илова кардани имзо +pdfjs-editor-signature-button-label = Илова кардани имзо + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Муҳаррири ҷудокунӣ +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Муҳаррири расмкашӣ +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Муҳаррири имзо: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Муҳаррири тасвир ## Remove button for the various kind of editor. @@ -312,6 +351,8 @@ .title = Тоза кардани тасвир pdfjs-editor-remove-highlight-button = .title = Тоза кардани ҷудокунӣ +pdfjs-editor-remove-signature-button = + .title = Тоза кардани имзо ## @@ -324,19 +365,45 @@ pdfjs-editor-stamp-add-image-button = .title = Илова кардани тасвир pdfjs-editor-stamp-add-image-button-label = Илова кардани тасвир -pdfjs-free-text = +# This refers to the thickness of the line used for free highlighting (not bound to text) +pdfjs-editor-free-highlight-thickness-input = Ғафсӣ +pdfjs-editor-free-highlight-thickness-title = + .title = Иваз кардани ғафсӣ ҳангоми ҷудокунии унсурҳо ба ғайр аз матн +pdfjs-editor-add-signature-container = + .aria-label = Идоракунии имзоҳо ва имзоҳои гузошташуда +pdfjs-editor-signature-add-signature-button = + .title = Илова кардани имзои нав +pdfjs-editor-signature-add-signature-button-label = Илова кардани имзои нав +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Имзои гузошташуда: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Муҳаррири матн -pdfjs-free-text-default-content = Нависед… -pdfjs-ink = - .aria-label = Муҳаррири расмкашӣ -pdfjs-ink-canvas = - .aria-label = Тасвири эҷодкардаи корбар + .default-content = Матнро ворид кунед… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Шарҳ + *[other] Шарҳҳо + } +pdfjs-editor-comments-sidebar-close-button = + .title = Пӯшидани навори ҷонибӣ + .aria-label = Пӯшидани навори ҷонибӣ +pdfjs-editor-comments-sidebar-close-button-label = Пӯшидани навори ҷонибӣ +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Чизи диққатангезро мушоҳида кардед? Онро қайд кунед ва ба он шарҳ гузоред. +pdfjs-editor-comments-sidebar-no-comments-link = Маълумоти бештар ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. -pdfjs-editor-alt-text-button-label = Матни ивазкунанда -pdfjs-editor-alt-text-edit-button-label = Таҳрир кардани матни ивазкунанда +pdfjs-editor-alt-text-button-label = Матни иловагӣ +pdfjs-editor-alt-text-edit-button = + .aria-label = Таҳрир кардани матни ивазкунанда pdfjs-editor-alt-text-dialog-label = Имконеро интихоб намоед pdfjs-editor-alt-text-dialog-description = Вақте ки одамон тасвирро дида наметавонанд ё вақте ки тасвир бор карда намешавад, матни иловагӣ (Alt text) кумак мерасонад. pdfjs-editor-alt-text-add-description-label = Илова кардани тавсиф @@ -349,18 +416,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Барои мисол, «Ман забони тоҷикиро дӯст медорам» +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Матни ивазкунанда ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Кунҷи чапи боло — тағйир додани андоза -pdfjs-editor-resizer-label-top-middle = Канори миёнаи боло — тағйир додани андоза -pdfjs-editor-resizer-label-top-right = Кунҷи рости боло — тағйир додани андоза -pdfjs-editor-resizer-label-middle-right = Канори миёнаи рост — тағйир додани андоза -pdfjs-editor-resizer-label-bottom-right = Кунҷи рости поён — тағйир додани андоза -pdfjs-editor-resizer-label-bottom-middle = Канори миёнаи поён — тағйир додани андоза -pdfjs-editor-resizer-label-bottom-left = Кунҷи чапи поён — тағйир додани андоза -pdfjs-editor-resizer-label-middle-left = Канори миёнаи чап — тағйир додани андоза +pdfjs-editor-resizer-top-left = + .aria-label = Кунҷи чапи боло — тағйир додани андоза +pdfjs-editor-resizer-top-middle = + .aria-label = Канори миёнаи боло — тағйир додани андоза +pdfjs-editor-resizer-top-right = + .aria-label = Кунҷи рости боло — тағйир додани андоза +pdfjs-editor-resizer-middle-right = + .aria-label = Канори миёнаи рост — тағйир додани андоза +pdfjs-editor-resizer-bottom-right = + .aria-label = Кунҷи рости поён — тағйир додани андоза +pdfjs-editor-resizer-bottom-middle = + .aria-label = Канори миёнаи поён — тағйир додани андоза +pdfjs-editor-resizer-bottom-left = + .aria-label = Кунҷи чапи поён — тағйир додани андоза +pdfjs-editor-resizer-middle-left = + .aria-label = Канори миёнаи чап — тағйир додани андоза ## Color picker @@ -387,3 +465,277 @@ pdfjs-editor-highlight-show-all-button-label = Ҳамаро намоиш додан pdfjs-editor-highlight-show-all-button = .title = Ҳамаро намоиш додан + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Таҳрир кардани матни иловагӣ (тафсири тасвир) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Илова кардани матни иловагӣ (тафсири тасвир) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Тафсири худро дар ин ҷо нависед… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Тавсифи мухтасар барои одамоне, ки аксҳоро дида наметавонанд ё вақте ки аксҳо кушода намешаванд. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Ин матни ивазкунанда ба таври худкор сохта шудааст ва шояд нодуруст бошад. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Маълумоти бештар +pdfjs-editor-new-alt-text-create-automatically-button-label = Ба таври худкор эҷод кардани матни иловагӣ +pdfjs-editor-new-alt-text-not-now-button = Ҳоло не +pdfjs-editor-new-alt-text-error-title = Матни иловагӣ ба таври худкор эҷод карда нашуд +pdfjs-editor-new-alt-text-error-description = Лутфан, матни иловагии худро ворид кунед ё баъдтар аз нав кӯшиш кунед. +pdfjs-editor-new-alt-text-error-close-button = Пӯшидан +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Боргирии модели зеҳни сунъӣ (AI) барои матни ивазкунанда ({ $downloadedSize } аз { $totalSize } МБ) + .aria-valuetext = Боргирии модели зеҳни сунъӣ (AI) барои матни ивазкунанда ({ $downloadedSize } аз { $totalSize } МБ) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Матни иловагӣ илова карда шуд +pdfjs-editor-new-alt-text-added-button-label = Матни иловагӣ илова карда шуд +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Матни иловагӣ вуҷуд надорад +pdfjs-editor-new-alt-text-missing-button-label = Матни иловагӣ вуҷуд надорад +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Бознигарӣ кардани матни иловагӣ +pdfjs-editor-new-alt-text-to-review-button-label = Бознигарӣ кардани матни иловагӣ +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Ба таври худкор сохта шудааст: «{ $generatedAltText }» + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Танзимоти матни иловагии тасвир +pdfjs-image-alt-text-settings-button-label = Танзимоти матни иловагии тасвир +pdfjs-editor-alt-text-settings-dialog-label = Танзимоти матни иловагии тасвир +pdfjs-editor-alt-text-settings-automatic-title = Матни иловагии худкор +pdfjs-editor-alt-text-settings-create-model-button-label = Ба таври худкор эҷод кардани матни иловагӣ +pdfjs-editor-alt-text-settings-create-model-description = Ин имкон барои расонидани кумак ба одамоне, ки аксҳоро дида наметавонанд ё вақте ки аксҳо кушода намешаванд, тавсифи аксҳоро пешниҳод мекунад. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Модели зеҳни сунъӣ «AI» барои матни ивазкунанда ({ $totalSize } МБ) +pdfjs-editor-alt-text-settings-ai-model-description = Дар дастгоҳи шумо ба таври маҳаллӣ кор мекунад, бинобар ин махфияти маълумоти шахсии шумо нигоҳ дошта мешавад. Барои матни ивазкунандаи худкор лозим аст. +pdfjs-editor-alt-text-settings-delete-model-button = Нест кардан +pdfjs-editor-alt-text-settings-download-model-button = Боргирӣ кардан +pdfjs-editor-alt-text-settings-downloading-model-button = Дар ҳоли боргирӣ… +pdfjs-editor-alt-text-settings-editor-title = Муҳаррири матни иловагӣ +pdfjs-editor-alt-text-settings-show-dialog-button-label = Дарҳол нишон додани муҳаррири матни ивазкунанда ҳангоми иловакунии тасвир +pdfjs-editor-alt-text-settings-show-dialog-description = Ба шумо кумак мекунад, ки боварӣ ҳосил кунед, ки ҳамаи тасвирҳои шумо дорои матни ивазкунанда мебошанд. +pdfjs-editor-alt-text-settings-close-button = Пӯшидан + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Ҷудокунӣ илова карда шуд +pdfjs-editor-freetext-added-alert = Матн илова карда шуд +pdfjs-editor-ink-added-alert = Расм илова карда шуд +pdfjs-editor-stamp-added-alert = Тасвир илова карда шуд +pdfjs-editor-signature-added-alert = Имзо илова карда шуд + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Ҷудосозӣ тоза карда шуд +pdfjs-editor-undo-bar-message-freetext = Матн тоза карда шуд +pdfjs-editor-undo-bar-message-ink = Расм тоза карда шуд +pdfjs-editor-undo-bar-message-stamp = Тасвир тоза карда шуд +pdfjs-editor-undo-bar-message-signature = Имзо тоза карда шуд +pdfjs-editor-undo-bar-message-comment = Шарҳ тоза карда шуд +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } ҳошиянависӣ тоза карда шуд + *[other] { $count } ҳошиянависӣ тоза карда шуданд + } +pdfjs-editor-undo-bar-undo-button = + .title = Бекор кардан +pdfjs-editor-undo-bar-undo-button-label = Бекор кардан +pdfjs-editor-undo-bar-close-button = + .title = Пӯшидан +pdfjs-editor-undo-bar-close-button-label = Пӯшидан + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Ин равзанаи зоҳирӣ ба корбар имкон медиҳад, ки тавонад имзоеро эҷод карда, ба ҳуҷҷати «PDF» илова намояд. Корбар метавонад номро таҳрир кунад (ном, инчунин, ҳамчун матни иловагӣ хизмат мекунад), ва ихтиёран имзоро барои истифодаи такрорӣ нигоҳ медорад. +pdfjs-editor-add-signature-dialog-title = Илова кардани имзо + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Нависед + .title = Нависед +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Имзо гузоред + .title = Имзо гузоред +pdfjs-editor-add-signature-image-button = Тасвир + .title = Тасвир + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Имзои худро бо ном нависед + .placeholder = Имзои худро бо ном нависед +pdfjs-editor-add-signature-draw-placeholder = Имзои худро кашида, гузоред +pdfjs-editor-add-signature-draw-thickness-range-label = Ғафсӣ +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Ғафсии имзо: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Барои бор кардани файл, онро дар ин ҷой кашида, гузоред +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Ё файлҳои тасвириро интихоб кунед + *[other] Ё файлҳои тасвириро интихоб кунед + } + +## Controls + +pdfjs-editor-add-signature-description-label = Тавсиф (матни иловагӣ) +pdfjs-editor-add-signature-description-input = + .title = Тавсиф (матни иловагӣ) +pdfjs-editor-add-signature-description-default-when-drawing = Имзо +pdfjs-editor-add-signature-clear-button-label = Пок кардани имзо +pdfjs-editor-add-signature-clear-button = + .title = Пок кардани имзо +pdfjs-editor-add-signature-save-checkbox = Нигоҳ доштани имзо +pdfjs-editor-add-signature-save-warning-message = Шумо ба ҳадди 5 имзои нигоҳдошташуда расидед. Барои нигоҳ доштани имзои нав, яке аз имзоҳои нигоҳдошташударо тоза намоед. +pdfjs-editor-add-signature-image-upload-error-title = Тасвир бор карда нашуд +pdfjs-editor-add-signature-image-upload-error-description = Пайвастшавии шабакаи худро санҷед ё тасвири дигареро кӯшиш кунед. +pdfjs-editor-add-signature-image-no-data-error-title = Ин тасвир ба имзо табдил дода нашуд +pdfjs-editor-add-signature-image-no-data-error-description = Лутфан, кӯшиш кунед, ки тасвири дигареро бор намоед. +pdfjs-editor-add-signature-error-close-button = Пӯшидан + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Бекор кардан +pdfjs-editor-add-signature-add-button = Илова кардан +pdfjs-editor-edit-signature-update-button = Навсозӣ кардан + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Таҳрир кардани шарҳ +pdfjs-editor-edit-comment-popup-button = + .title = Таҳрир кардани шарҳ +pdfjs-editor-delete-comment-popup-button-label = Тоза кардани шарҳ +pdfjs-editor-delete-comment-popup-button = + .title = Тоза кардани шарҳ +pdfjs-show-comment-button = + .title = Нишон додани шарҳ + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Таҳрир кардани шарҳ +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Навсозӣ кардан +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Илова кардани шарҳ +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Илова кардан +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Нависед… +pdfjs-editor-edit-comment-dialog-cancel-button = Бекор кардан + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Илова кардани шарҳ + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Фаъол кардани навори ҷонибӣ (ҳуҷҷат дорои тасвирчаҳо/сохтор/замимаҳо/қабатҳо мебошад) +pdfjs-toggle-views-manager-button1-label = Идоракунии саҳифаҳо +pdfjs-views-manager-sidebar = + .aria-label = Навори ҷонибӣ +pdfjs-views-manager-sidebar-resizer = + .aria-label = Тағйири андозаи навори ҷонибӣ +pdfjs-views-manager-view-selector-button = + .title = Намудҳо +pdfjs-views-manager-view-selector-button-label = Намудҳо +pdfjs-views-manager-pages-title = Саҳифаҳо +pdfjs-views-manager-attachments-title = Замимаҳо +pdfjs-views-manager-pages-option-label = Саҳифаҳо +pdfjs-views-manager-outlines-option-label = Сохтори ҳуҷҷат +pdfjs-views-manager-attachments-option-label = Замимаҳо +pdfjs-views-manager-layers-option-label = Қабатҳо +pdfjs-views-manager-add-file-button = + .title = Илова кардани файл +pdfjs-views-manager-add-file-button-label = Илова кардани файл +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } интихоб шуд + *[other] { $count } интихоб шуданд + } +pdfjs-views-manager-pages-status-none-action-label = Саҳифаҳоро интихоб намоед +pdfjs-views-manager-pages-status-action-button-label = Идора кардан +pdfjs-views-manager-pages-status-copy-button-label = Нусха бардоштан +pdfjs-views-manager-pages-status-cut-button-label = Буридан +pdfjs-views-manager-pages-status-delete-button-label = Нест кардан +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 саҳифа бурида шуд + *[other] { $count } саҳифа бурида шуданд + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 саҳифа нусха бардошта шуд + *[other] { $count } саҳифа нусха бардошта шуданд + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 саҳифа нест карда шуд + *[other] { $count } саҳифа нест карда шуданд + } +pdfjs-views-manager-pages-status-waiting-ready-label = Файли шумо омода мешавад… +pdfjs-views-manager-pages-status-waiting-uploading-label = Дар ҳоли боркунии файл… +pdfjs-views-manager-status-warning-cut-label = Бурида нашуд. Саҳифаро навсозӣ кунед ва аз нав кӯшиш намоед. +pdfjs-views-manager-status-warning-copy-label = Нусха бардошта нашуд. Саҳифаро навсозӣ кунед ва аз нав кӯшиш намоед. +pdfjs-views-manager-status-warning-delete-label = Нест карда нашуд. Саҳифаро навсозӣ кунед ва аз нав кӯшиш намоед. +pdfjs-views-manager-status-warning-save-label = Нигоҳ дошта нашуд. Саҳифаро навсозӣ кунед ва аз нав кӯшиш намоед. +pdfjs-views-manager-status-undo-button-label = Бекор кардан +pdfjs-views-manager-status-done-button-label = Тайёр +pdfjs-views-manager-status-close-button = + .title = Пӯшидан +pdfjs-views-manager-status-close-button-label = Пӯшидан +pdfjs-views-manager-paste-button-label = Гузоштан +pdfjs-views-manager-paste-button-before = + .title = Гузоштан пеш аз саҳифаи аввалин +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Гузоштан пас аз саҳифаи { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = НАВ +pdfjs-toggle-views-manager-button1 = + .title = Идоракунии саҳифаҳо + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Тоза кардани имзои гузошташуда +pdfjs-editor-delete-signature-button-label1 = Тоза кардани имзои гузошташуда + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Таҳрир кардани тавсиф + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Таҳрир кардани тавсиф diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/th/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/th/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/th/viewer.ftl 2026-01-20 14:08:39.385689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/th/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = หน้าปัจจุบัน (ดู URL จากหน้าปัจจุบัน) pdfjs-bookmark-button-label = หน้าปัจจุบัน -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = เปิดในแอป -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = เปิดในแอป ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = ชื่อไฟล์: pdfjs-document-properties-file-size = ขนาดไฟล์: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } ไบต์) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } ไบต์) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } ไบต์) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } ไบต์) pdfjs-document-properties-title = ชื่อเรื่อง: pdfjs-document-properties-author = ผู้สร้าง: pdfjs-document-properties-subject = ชื่อเรื่อง: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = วันที่สร้าง: pdfjs-document-properties-modification-date = วันที่แก้ไข: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = ผู้สร้าง: pdfjs-document-properties-producer = ผู้ผลิต PDF: pdfjs-document-properties-version = รุ่น PDF: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = ภาพขนาดย่อของหน้า { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = เลือกหน้า { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = หน้า { $page } จาก { $total } ## Find panel button title and messages @@ -262,10 +264,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -273,6 +271,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [คำอธิบายประกอบ { $type }] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -286,9 +287,13 @@ pdfjs-editor-free-text-button = .title = ข้อความ +pdfjs-editor-color-picker-free-text-input = + .title = เปลี่ยนสีข้อความ pdfjs-editor-free-text-button-label = ข้อความ pdfjs-editor-ink-button = .title = รูปวาด +pdfjs-editor-color-picker-ink-input = + .title = เปลี่ยนสีรูปวาด pdfjs-editor-ink-button-label = รูปวาด pdfjs-editor-stamp-button = .title = เพิ่มหรือแก้ไขภาพ @@ -296,8 +301,37 @@ pdfjs-editor-highlight-button = .title = เน้น pdfjs-editor-highlight-button-label = เน้น -pdfjs-highlight-floating-button = +pdfjs-highlight-floating-button1 = .title = เน้นสี + .aria-label = เน้นสี +pdfjs-highlight-floating-button-label = เน้นสี +pdfjs-comment-floating-button = + .title = แสดงความคิดเห็น + .aria-label = แสดงความคิดเห็น +pdfjs-comment-floating-button-label = แสดงความคิดเห็น +pdfjs-editor-comment-button = + .title = แสดงความคิดเห็น + .aria-label = แสดงความคิดเห็น +pdfjs-editor-comment-button-label = ความคิดเห็น +pdfjs-editor-signature-button = + .title = เพิ่มลายเซ็น +pdfjs-editor-signature-button-label = เพิ่มลายเซ็น + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = ตัวแก้ไขสีเน้น +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = ตัวแก้ไขรูปวาด +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = ตัวแก้ไขลายเซ็น: { $description } +pdfjs-editor-stamp-editor = + .aria-label = ตัวแก้ไขภาพ ## Remove button for the various kind of editor. @@ -309,6 +343,8 @@ .title = เอาภาพออก pdfjs-editor-remove-highlight-button = .title = เอาการเน้นสีออก +pdfjs-editor-remove-signature-button = + .title = ลบลายเซ็น ## @@ -325,19 +361,37 @@ pdfjs-editor-free-highlight-thickness-input = ความหนา pdfjs-editor-free-highlight-thickness-title = .title = เปลี่ยนความหนาเมื่อเน้นรายการอื่นๆ ที่ไม่ใช่ข้อความ -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = ส่วนควบคุมลายเซ็นและลายเซ็นที่บันทึกไว้ +pdfjs-editor-signature-add-signature-button = + .title = เพิ่มลายเซ็นใหม่ +pdfjs-editor-signature-add-signature-button-label = เพิ่มลายเซ็นใหม่ +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = ลายเซ็นที่บันทึกไว้: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = ตัวแก้ไขข้อความ -pdfjs-free-text-default-content = เริ่มพิมพ์… -pdfjs-ink = - .aria-label = ตัวแก้ไขรูปวาด -pdfjs-ink-canvas = - .aria-label = ภาพที่ผู้ใช้สร้างขึ้น + .default-content = เริ่มพิมพ์ได้เลย… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = ความคิดเห็น +pdfjs-editor-comments-sidebar-close-button = + .title = ปิดแถบข้าง + .aria-label = ปิดแถบข้าง +pdfjs-editor-comments-sidebar-close-button-label = ปิดแถบข้าง +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = เห็นอะไรที่น่าสนใจใช่ไหม? เน้นสีไว้และแสดงความคิดเห็นได้เลย +pdfjs-editor-comments-sidebar-no-comments-link = เรียนรู้เพิ่มเติม ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = ข้อความทดแทน -pdfjs-editor-alt-text-edit-button-label = แก้ไขข้อความทดแทน +pdfjs-editor-alt-text-edit-button = + .aria-label = แก้ไขข้อความทดแทน pdfjs-editor-alt-text-dialog-label = เลือกตัวเลือก pdfjs-editor-alt-text-dialog-description = ข้อความทดแทนสามารถช่วยเหลือได้เมื่อผู้ใช้มองไม่เห็นภาพ หรือภาพไม่โหลด pdfjs-editor-alt-text-add-description-label = เพิ่มคำอธิบาย @@ -350,18 +404,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = ตัวอย่างเช่น “ชายหนุ่มคนหนึ่งนั่งลงที่โต๊ะเพื่อรับประทานอาหารมื้อหนึ่ง” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = ข้อความทดแทน ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = มุมซ้ายบน — ปรับขนาด -pdfjs-editor-resizer-label-top-middle = ตรงกลางด้านบน — ปรับขนาด -pdfjs-editor-resizer-label-top-right = มุมขวาบน — ปรับขนาด -pdfjs-editor-resizer-label-middle-right = ตรงกลางด้านขวา — ปรับขนาด -pdfjs-editor-resizer-label-bottom-right = มุมขวาล่าง — ปรับขนาด -pdfjs-editor-resizer-label-bottom-middle = ตรงกลางด้านล่าง — ปรับขนาด -pdfjs-editor-resizer-label-bottom-left = มุมซ้ายล่าง — ปรับขนาด -pdfjs-editor-resizer-label-middle-left = ตรงกลางด้านซ้าย — ปรับขนาด +pdfjs-editor-resizer-top-left = + .aria-label = มุมซ้ายบน — ปรับขนาด +pdfjs-editor-resizer-top-middle = + .aria-label = ตรงกลางด้านบน — ปรับขนาด +pdfjs-editor-resizer-top-right = + .aria-label = มุมขวาบน — ปรับขนาด +pdfjs-editor-resizer-middle-right = + .aria-label = ตรงกลางด้านขวา — ปรับขนาด +pdfjs-editor-resizer-bottom-right = + .aria-label = มุมขวาล่าง — ปรับขนาด +pdfjs-editor-resizer-bottom-middle = + .aria-label = ตรงกลางด้านล่าง — ปรับขนาด +pdfjs-editor-resizer-bottom-left = + .aria-label = มุมซ้ายล่าง — ปรับขนาด +pdfjs-editor-resizer-middle-left = + .aria-label = ตรงกลางด้านซ้าย — ปรับขนาด ## Color picker @@ -388,3 +453,263 @@ pdfjs-editor-highlight-show-all-button-label = แสดงทั้งหมด pdfjs-editor-highlight-show-all-button = .title = แสดงทั้งหมด + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = แก้ไขข้อความทดแทน (คำอธิบายภาพ) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = เพิ่มข้อความทดแทน (คำอธิบายภาพ) +pdfjs-editor-new-alt-text-textarea = + .placeholder = เขียนคำอธิบายของคุณที่นี่… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = คำอธิบายสั้นๆ สำหรับผู้ที่ไม่สามารถมองเห็นภาพหรือเมื่อภาพไม่โหลด +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = ข้อความทดแทนนี้ถูกสร้างขึ้นโดยอัตโนมัติและอาจไม่ถูกต้อง +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = เรียนรู้เพิ่มเติม +pdfjs-editor-new-alt-text-create-automatically-button-label = สร้างข้อความทดแทนโดยอัตโนมัติ +pdfjs-editor-new-alt-text-not-now-button = ไม่ใช่ตอนนี้ +pdfjs-editor-new-alt-text-error-title = ไม่สามารถสร้างข้อความทดแทนโดยอัตโนมัติได้ +pdfjs-editor-new-alt-text-error-description = กรุณาเขียนข้อความทดแทนด้วยตัวเองหรือลองใหม่อีกครั้งในภายหลัง +pdfjs-editor-new-alt-text-error-close-button = ปิด +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = กำลังดาวน์โหลดโมเดล AI สำหรับข้อความทดแทน ({ $downloadedSize } จาก { $totalSize } MB) + .aria-valuetext = กำลังดาวน์โหลดโมเดล AI สำหรับข้อความทดแทน ({ $downloadedSize } จาก { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = เพิ่มข้อความทดแทนแล้ว +pdfjs-editor-new-alt-text-added-button-label = เพิ่มข้อความทดแทนแล้ว +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = ขาดข้อความทดแทน +pdfjs-editor-new-alt-text-missing-button-label = ขาดข้อความทดแทน +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = ตรวจสอบข้อความทดแทน +pdfjs-editor-new-alt-text-to-review-button-label = ตรวจสอบข้อความทดแทน +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = สร้างขึ้นโดยอัตโนมัติ: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = ตั้งค่าข้อความทดแทนภาพ +pdfjs-image-alt-text-settings-button-label = ตั้งค่าข้อความทดแทนภาพ +pdfjs-editor-alt-text-settings-dialog-label = ตั้งค่าข้อความทดแทนภาพ +pdfjs-editor-alt-text-settings-automatic-title = การทดแทนด้วยข้อความอัตโนมัติ +pdfjs-editor-alt-text-settings-create-model-button-label = สร้างข้อความทดแทนอัตโนมัติ +pdfjs-editor-alt-text-settings-create-model-description = แนะนำคำอธิบายเพื่อช่วยเหลือผู้ที่ไม่สามารถมองเห็นภาพหรือเมื่อภาพไม่โหลด +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = โมเดล AI สำหรับข้อความทดแทน ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = ทำงานในเครื่องของคุณเพื่อให้ข้อมูลของคุณเป็นส่วนตัว จำเป็นสำหรับข้อความทดแทนอัตโนมัติ +pdfjs-editor-alt-text-settings-delete-model-button = ลบ +pdfjs-editor-alt-text-settings-download-model-button = ดาวน์โหลด +pdfjs-editor-alt-text-settings-downloading-model-button = กำลังดาวน์โหลด… +pdfjs-editor-alt-text-settings-editor-title = ตัวแก้ไขข้อความทดแทน +pdfjs-editor-alt-text-settings-show-dialog-button-label = แสดงตัวแก้ไขข้อความทดแทนทันทีเมื่อเพิ่มภาพ +pdfjs-editor-alt-text-settings-show-dialog-description = ช่วยให้คุณแน่ใจว่าภาพทั้งหมดของคุณมีข้อความทดแทน +pdfjs-editor-alt-text-settings-close-button = ปิด + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = เพิ่มการเน้นสีแล้ว +pdfjs-editor-freetext-added-alert = เพิ่มข้อความแล้ว +pdfjs-editor-ink-added-alert = เพิ่มรูปวาดแล้ว +pdfjs-editor-stamp-added-alert = เพิ่มภาพแล้ว +pdfjs-editor-signature-added-alert = เพิ่มลายเซ็นแล้ว + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = เอาการเน้นสีออกแล้ว +pdfjs-editor-undo-bar-message-freetext = เอาข้อความออกแล้ว +pdfjs-editor-undo-bar-message-ink = เอาภาพวาดออกแล้ว +pdfjs-editor-undo-bar-message-stamp = เอาภาพออกแล้ว +pdfjs-editor-undo-bar-message-signature = ลบลายเซ็นแล้ว +pdfjs-editor-undo-bar-message-comment = เอาความคิดเห็นออกแล้ว +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = เอาคำอธิบายประกอบ { $count } รายการออกแล้ว +pdfjs-editor-undo-bar-undo-button = + .title = เลิกทำ +pdfjs-editor-undo-bar-undo-button-label = เลิกทำ +pdfjs-editor-undo-bar-close-button = + .title = ปิด +pdfjs-editor-undo-bar-close-button-label = ปิด + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = โมดัลนี้ช่วยให้ผู้ใช้สามารถสร้างลายเซ็นเพื่อใช้เพิ่มลงในเอกสาร PDF ได้ ผู้ใช้สามารถแก้ไขชื่อ (ซึ่งใช้เป็นข้อความทดแทนได้ด้วย) และสามารถเลือกบันทึกลายเซ็นเพื่อใช้งานซ้ำได้ +pdfjs-editor-add-signature-dialog-title = เพิ่มลายเซ็น + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = พิมพ์ + .title = พิมพ์ +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = วาด + .title = วาด +pdfjs-editor-add-signature-image-button = ภาพ + .title = ภาพ + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = พิมพ์ลายเซ็นของคุณ + .placeholder = พิมพ์ลายเซ็นของคุณ +pdfjs-editor-add-signature-draw-placeholder = วาดลายเซ็นของคุณ +pdfjs-editor-add-signature-draw-thickness-range-label = ความหนา +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = ความหนาของการวาด: { $thickness } +pdfjs-editor-add-signature-image-placeholder = ลากไฟล์มาที่นี่เพื่ออัปโหลด +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] หรือเลือกไฟล์ภาพ + *[other] หรือเรียกดูไฟล์ภาพ + } + +## Controls + +pdfjs-editor-add-signature-description-label = คำอธิบาย (ข้อความทดแทน) +pdfjs-editor-add-signature-description-input = + .title = คำอธิบาย (ข้อความทดแทน) +pdfjs-editor-add-signature-description-default-when-drawing = ลายเซ็น +pdfjs-editor-add-signature-clear-button-label = ล้างลายเซ็น +pdfjs-editor-add-signature-clear-button = + .title = ล้างลายเซ็น +pdfjs-editor-add-signature-save-checkbox = บันทึกลายเซ็น +pdfjs-editor-add-signature-save-warning-message = คุณมีลายเซ็นที่บันทึกถึงจำนวนสูงสุด 5 รายการแล้ว โปรดลบรายการหนึ่งออกเมื่อจะบันทึกเพิ่ม +pdfjs-editor-add-signature-image-upload-error-title = ไม่สามารถอัปโหลดภาพได้ +pdfjs-editor-add-signature-image-upload-error-description = ตรวจสอบการเชื่อมต่อเครือข่ายของคุณหรือลองใช้ภาพอื่น +pdfjs-editor-add-signature-image-no-data-error-title = ไม่สามารถแปลงภาพนี้ให้เป็นลายเซ็นได้ +pdfjs-editor-add-signature-image-no-data-error-description = โปรดลองอัปโหลดภาพอื่น +pdfjs-editor-add-signature-error-close-button = ปิด + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = ยกเลิก +pdfjs-editor-add-signature-add-button = เพิ่ม +pdfjs-editor-edit-signature-update-button = อัปเดต + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = แก้ไขความคิดเห็น +pdfjs-editor-edit-comment-popup-button = + .title = แก้ไขความคิดเห็น +pdfjs-editor-delete-comment-popup-button-label = เอาความคิดเห็นออก +pdfjs-editor-delete-comment-popup-button = + .title = เอาความคิดเห็นออก +pdfjs-show-comment-button = + .title = แสดงความคิดเห็น + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = แก้ไขความคิดเห็น +pdfjs-editor-edit-comment-dialog-save-button-when-editing = อัปเดต +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = เพิ่มความคิดเห็น +pdfjs-editor-edit-comment-dialog-save-button-when-adding = เพิ่ม +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = เริ่มพิมพ์… +pdfjs-editor-edit-comment-dialog-cancel-button = ยกเลิก + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = เพิ่มความคิดเห็น + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = เปิด/ปิดแถบข้าง (เอกสารมีภาพย่อ/เค้าร่าง/ไฟล์แนบ/เลเยอร์) +pdfjs-toggle-views-manager-button1-label = จัดการหน้า +pdfjs-views-manager-sidebar = + .aria-label = แถบข้าง +pdfjs-views-manager-sidebar-resizer = + .aria-label = ตัวปรับขนาดแถบข้าง +pdfjs-views-manager-view-selector-button = + .title = มุมมอง +pdfjs-views-manager-view-selector-button-label = มุมมอง +pdfjs-views-manager-pages-title = หน้า +pdfjs-views-manager-outlines-title1 = โครงร่างเอกสาร + .title = โครงร่างเอกสาร (คลิกสองครั้งเพื่อขยาย/ยุบรายการทั้งหมด) +pdfjs-views-manager-attachments-title = ไฟล์แนบ +pdfjs-views-manager-layers-title1 = เลเยอร์ + .title = เลเยอร์ (คลิกสองครั้งเพื่อล้างค่าเลเยอร์ทั้งหมดกลับสู่สถานะเริ่มต้น) +pdfjs-views-manager-pages-option-label = หน้า +pdfjs-views-manager-outlines-option-label = เค้าร่างเอกสาร +pdfjs-views-manager-attachments-option-label = ไฟล์แนบ +pdfjs-views-manager-layers-option-label = เลเยอร์ +pdfjs-views-manager-add-file-button = + .title = เพิ่มไฟล์ +pdfjs-views-manager-add-file-button-label = เพิ่มไฟล์ +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = เลือกอยู่ { $count } +pdfjs-views-manager-pages-status-none-action-label = เลือกหน้า +pdfjs-views-manager-pages-status-action-button-label = จัดการ +pdfjs-views-manager-pages-status-copy-button-label = คัดลอก +pdfjs-views-manager-pages-status-cut-button-label = ตัด +pdfjs-views-manager-pages-status-delete-button-label = ลบ +pdfjs-views-manager-pages-status-export-selected-button-label = ส่งออกรายการที่เลือก… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = ตัด { $count } หน้าแล้ว +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = คัดลอก { $count } หน้าแล้ว +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = ลบ { $count } หน้าแล้ว +pdfjs-views-manager-pages-status-waiting-ready-label = กำลังเตรียมไฟล์ของคุณให้พร้อม… +pdfjs-views-manager-pages-status-waiting-uploading-label = กำลังอัปโหลดไฟล์… +pdfjs-views-manager-status-warning-cut-label = ไม่สามารถตัดได้ โปรดรีเฟรชหน้าแล้วลองอีกครั้ง +pdfjs-views-manager-status-warning-copy-label = ไม่สามารถคัดลอกได้ โปรดรีเฟรชหน้าแล้วลองอีกครั้ง +pdfjs-views-manager-status-warning-delete-label = ไม่สามารถลบได้ โปรดรีเฟรชหน้าแล้วลองอีกครั้ง +pdfjs-views-manager-status-warning-save-label = ไม่สามารถบันทึกได้ โปรดรีเฟรชหน้าแล้วลองอีกครั้ง +pdfjs-views-manager-status-undo-button-label = เลิกทำ +pdfjs-views-manager-status-done-button-label = เสร็จสิ้น +pdfjs-views-manager-status-close-button = + .title = ปิด +pdfjs-views-manager-status-close-button-label = ปิด +pdfjs-views-manager-paste-button-label = วาง +pdfjs-views-manager-paste-button-before = + .title = วางก่อนหน้าแรก +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = วางหลังหน้า { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = ใหม่ +pdfjs-views-manager-waiting-for-file = กำลังอัปโหลดไฟล์… +pdfjs-toggle-views-manager-button1 = + .title = จัดการหน้า + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = ลบลายเซ็นที่บันทึกไว้ +pdfjs-editor-delete-signature-button-label1 = ลบลายเซ็นที่บันทึกไว้ + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = แก้ไขคำอธิบาย + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = แก้ไขคำอธิบาย diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/tl/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/tl/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/tl/viewer.ftl 2026-01-20 14:08:39.385689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/tl/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -89,24 +89,12 @@ pdfjs-document-properties-button-label = Mga Katangian ng Dokumento… pdfjs-document-properties-file-name = File name: pdfjs-document-properties-file-size = File size: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Pamagat: pdfjs-document-properties-author = May-akda: pdfjs-document-properties-subject = Paksa: pdfjs-document-properties-keywords = Mga keyword: pdfjs-document-properties-creation-date = Petsa ng Pagkakagawa: pdfjs-document-properties-modification-date = Petsa ng Pagkakabago: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Tagalikha: pdfjs-document-properties-producer = PDF Producer: pdfjs-document-properties-version = PDF Version: @@ -213,9 +201,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = Nagkaproblema habang niloload ang PDF. @@ -226,10 +211,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -245,13 +226,3 @@ pdfjs-password-ok-button = OK pdfjs-password-cancel-button = Kanselahin pdfjs-web-fonts-disabled = Naka-disable ang mga Web font: hindi kayang gamitin ang mga naka-embed na PDF font. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/tr/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/tr/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/tr/viewer.ftl 2026-01-20 14:08:39.386689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/tr/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Geçerli sayfa (geçerli sayfanın adresini görüntüle) pdfjs-bookmark-button-label = Geçerli sayfa -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Uygulamada aç -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Uygulamada aç ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Dosya adı: pdfjs-document-properties-file-size = Dosya boyutu: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bayt) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bayt) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bayt) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bayt) pdfjs-document-properties-title = Başlık: pdfjs-document-properties-author = Yazar: pdfjs-document-properties-subject = Konu: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Oluşturma tarihi: pdfjs-document-properties-modification-date = Değiştirme tarihi: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date } { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Oluşturan: pdfjs-document-properties-producer = PDF üreticisi: pdfjs-document-properties-version = PDF sürümü: @@ -167,7 +160,7 @@ # Variables: # $progress (Number) - percent value pdfjs-print-progress-percent = %{ $progress } -pdfjs-print-progress-close-button = İptal +pdfjs-print-progress-close-button = Vazgeç pdfjs-printing-not-supported = Uyarı: Yazdırma bu tarayıcı tarafından tam olarak desteklenmemektedir. pdfjs-printing-not-ready = Uyarı: PDF tamamen yüklenmedi ve yazdırmaya hazır değil. @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = { $page }. sayfanın küçük hâli +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = { $page }. sayfayı seç +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Sayfa { $page }/{ $total } ## Find panel button title and messages @@ -270,10 +272,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -281,22 +279,29 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } işareti] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password pdfjs-password-label = Bu PDF dosyasını açmak için parolasını yazın. pdfjs-password-invalid = Geçersiz parola. Lütfen yeniden deneyin. pdfjs-password-ok-button = Tamam -pdfjs-password-cancel-button = İptal +pdfjs-password-cancel-button = Vazgeç pdfjs-web-fonts-disabled = Web fontları devre dışı: Gömülü PDF fontları kullanılamıyor. ## Editing pdfjs-editor-free-text-button = .title = Metin +pdfjs-editor-color-picker-free-text-input = + .title = Metin rengini değiştir pdfjs-editor-free-text-button-label = Metin pdfjs-editor-ink-button = .title = Çiz +pdfjs-editor-color-picker-ink-input = + .title = Çizim rengini değiştir pdfjs-editor-ink-button-label = Çiz pdfjs-editor-stamp-button = .title = Resim ekle veya düzenle @@ -304,12 +309,37 @@ pdfjs-editor-highlight-button = .title = Vurgula pdfjs-editor-highlight-button-label = Vurgula -pdfjs-highlight-floating-button = - .title = Vurgula pdfjs-highlight-floating-button1 = .title = Vurgula .aria-label = Vurgula pdfjs-highlight-floating-button-label = Vurgula +pdfjs-comment-floating-button = + .title = Yorum ekle + .aria-label = Yorum ekle +pdfjs-comment-floating-button-label = Yorum ekle +pdfjs-editor-comment-button = + .title = Yorum ekle + .aria-label = Yorum ekle +pdfjs-editor-comment-button-label = Yorum ekle +pdfjs-editor-signature-button = + .title = İmza ekle +pdfjs-editor-signature-button-label = İmza ekle + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Vurgu düzenleyici +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Çizim düzenleyici +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = İmza düzenleyici: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Resim düzenleyici ## Remove button for the various kind of editor. @@ -321,6 +351,8 @@ .title = Resmi kaldır pdfjs-editor-remove-highlight-button = .title = Vurgulamayı kaldır +pdfjs-editor-remove-signature-button = + .title = İmzayı kaldır ## @@ -337,43 +369,76 @@ pdfjs-editor-free-highlight-thickness-input = Kalınlık pdfjs-editor-free-highlight-thickness-title = .title = Metin dışındaki öğeleri vurgularken kalınlığı değiştir -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = İmza yönetimi ve kayıtlı imzalar +pdfjs-editor-signature-add-signature-button = + .title = Yeni imza ekle +pdfjs-editor-signature-add-signature-button-label = Yeni imza ekle +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Kayıtlı imza: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Metin düzenleyicisi -pdfjs-free-text-default-content = Yazmaya başlayın… -pdfjs-ink = - .aria-label = Çizim düzenleyicisi -pdfjs-ink-canvas = - .aria-label = Kullanıcı tarafından oluşturulan resim + .default-content = Yazmaya başlayın… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Yorum + *[other] Yorumlar + } +pdfjs-editor-comments-sidebar-close-button = + .title = Kenar çubuğunu kapat + .aria-label = Kenar çubuğunu kapat +pdfjs-editor-comments-sidebar-close-button-label = Kenar çubuğunu kapat +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Not almaya değer bir şey mi gördünüz? Onu işaretleyip yorum yazabilirsiniz. +pdfjs-editor-comments-sidebar-no-comments-link = Daha fazla bilgi alın ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Alternatif metin -pdfjs-editor-alt-text-edit-button-label = Alternatif metni düzenle +pdfjs-editor-alt-text-edit-button = + .aria-label = Alternatif metni düzenle pdfjs-editor-alt-text-dialog-label = Bir seçenek seçin -pdfjs-editor-alt-text-dialog-description = Alternatif metin, insanlar görseli göremediğinde veya görsel yüklenmediğinde işe yarar. +pdfjs-editor-alt-text-dialog-description = Alternatif metin, insanlar resmi göremediğinde veya resim yüklenmediğinde işe yarar. pdfjs-editor-alt-text-add-description-label = Açıklama ekle pdfjs-editor-alt-text-add-description-description = Konuyu, ortamı veya eylemleri tanımlayan bir iki cümle yazmaya çalışın. pdfjs-editor-alt-text-mark-decorative-label = Dekoratif olarak işaretle -pdfjs-editor-alt-text-mark-decorative-description = Kenarlıklar veya filigranlar gibi dekoratif görüntüler için kullanılır. +pdfjs-editor-alt-text-mark-decorative-description = Kenarlıklar veya filigranlar gibi dekoratif resimler için kullanılır. pdfjs-editor-alt-text-cancel-button = Vazgeç pdfjs-editor-alt-text-save-button = Kaydet pdfjs-editor-alt-text-decorative-tooltip = Dekoratif olarak işaretlendi # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Örneğin, “Genç bir adam yemek yemek için masaya oturuyor” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Alternatif metin ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Sol üst köşe — yeniden boyutlandır -pdfjs-editor-resizer-label-top-middle = Üst orta — yeniden boyutlandır -pdfjs-editor-resizer-label-top-right = Sağ üst köşe — yeniden boyutlandır -pdfjs-editor-resizer-label-middle-right = Orta sağ — yeniden boyutlandır -pdfjs-editor-resizer-label-bottom-right = Sağ alt köşe — yeniden boyutlandır -pdfjs-editor-resizer-label-bottom-middle = Alt orta — yeniden boyutlandır -pdfjs-editor-resizer-label-bottom-left = Sol alt köşe — yeniden boyutlandır -pdfjs-editor-resizer-label-middle-left = Orta sol — yeniden boyutlandır +pdfjs-editor-resizer-top-left = + .aria-label = Sol üst köşe — yeniden boyutlandır +pdfjs-editor-resizer-top-middle = + .aria-label = Üst orta — yeniden boyutlandır +pdfjs-editor-resizer-top-right = + .aria-label = Sağ üst köşe — yeniden boyutlandır +pdfjs-editor-resizer-middle-right = + .aria-label = Orta sağ — yeniden boyutlandır +pdfjs-editor-resizer-bottom-right = + .aria-label = Sağ alt köşe — yeniden boyutlandır +pdfjs-editor-resizer-bottom-middle = + .aria-label = Alt orta — yeniden boyutlandır +pdfjs-editor-resizer-bottom-left = + .aria-label = Sol alt köşe — yeniden boyutlandır +pdfjs-editor-resizer-middle-left = + .aria-label = Orta sol — yeniden boyutlandır ## Color picker @@ -400,3 +465,283 @@ pdfjs-editor-highlight-show-all-button-label = Tümünü göster pdfjs-editor-highlight-show-all-button = .title = Tümünü göster + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Alt metni düzenle (resim açıklaması) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Alt metin ekle (resim açıklaması) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Açıklamanızı buraya yazın… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Görme engelli kişilere gösterilecek veya resmin yüklenemediği durumlarda gösterilecek kısa açıklama. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Bu alt metin otomatik olarak oluşturulmuştur ve hatalı olabilir. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Daha fazla bilgi alın +pdfjs-editor-new-alt-text-create-automatically-button-label = Otomatik olarak alt metin oluştur +pdfjs-editor-new-alt-text-not-now-button = Şimdi değil +pdfjs-editor-new-alt-text-error-title = Alt metin otomatik olarak oluşturulamadı +pdfjs-editor-new-alt-text-error-description = Lütfen kendi alt metninizi yazın veya daha sonra yeniden deneyin. +pdfjs-editor-new-alt-text-error-close-button = Kapat +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Alt metin yapay zekâ modeli indiriliyor ({ $downloadedSize } / { $totalSize } MB) + .aria-valuetext = Alt metin yapay zekâ modeli indiriliyor ({ $downloadedSize } / { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Alternatif metin eklendi +pdfjs-editor-new-alt-text-added-button-label = Alt metin eklendi +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Alternatif metin eksik +pdfjs-editor-new-alt-text-missing-button-label = Alt metin eksik +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Alternatif metni incele +pdfjs-editor-new-alt-text-to-review-button-label = Alt metni incele +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Otomatik olarak oluşturuldu: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Resim alt metni ayarları +pdfjs-image-alt-text-settings-button-label = Resim alt metni ayarları +pdfjs-editor-alt-text-settings-dialog-label = Resim alt metni ayarları +pdfjs-editor-alt-text-settings-automatic-title = Otomatik alt metin +pdfjs-editor-alt-text-settings-create-model-button-label = Otomatik olarak alt metin oluştur +pdfjs-editor-alt-text-settings-create-model-description = Görme engelli kişilere gösterilecek veya resmin yüklenemediği durumlarda gösterilecek açıklamalar önerir. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Alt metin yapay zekâ modeli ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Verilerinizin gizli kalması için cihazınızda yerel olarak çalışır. Otomatik alt metin için gereklidir. +pdfjs-editor-alt-text-settings-delete-model-button = Sil +pdfjs-editor-alt-text-settings-download-model-button = İndir +pdfjs-editor-alt-text-settings-downloading-model-button = İndiriliyor… +pdfjs-editor-alt-text-settings-editor-title = Alt metin düzenleyicisi +pdfjs-editor-alt-text-settings-show-dialog-button-label = Resim eklerken alt metin düzenleyicisini hemen göster +pdfjs-editor-alt-text-settings-show-dialog-description = Tüm resimlerinizin alt metne sahip olduğundan emin olmanızı sağlar. +pdfjs-editor-alt-text-settings-close-button = Kapat + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Vurgu eklendi +pdfjs-editor-freetext-added-alert = Metin eklendi +pdfjs-editor-ink-added-alert = Çizim eklendi +pdfjs-editor-stamp-added-alert = Resim eklendi +pdfjs-editor-signature-added-alert = İmza eklendi + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Vurgulama silindi +pdfjs-editor-undo-bar-message-freetext = Metin silindi +pdfjs-editor-undo-bar-message-ink = Çizim silindi +pdfjs-editor-undo-bar-message-stamp = Görsel silindi +pdfjs-editor-undo-bar-message-signature = İmza kaldırıldı +pdfjs-editor-undo-bar-message-comment = Yorum silindi +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } ek açıklama silindi + *[other] { $count } ek açıklama silindi + } +pdfjs-editor-undo-bar-undo-button = + .title = Geri al +pdfjs-editor-undo-bar-undo-button-label = Geri al +pdfjs-editor-undo-bar-close-button = + .title = Kapat +pdfjs-editor-undo-bar-close-button-label = Kapat + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Bu pencereden PDF belgesine eklemek üzere imza oluşturabilirsiniz. Adınızı düzenleyebilir (adınız alt metin olarak da kullanılır) ve isterseniz ileride tekrar kullanmak üzere imzayı kaydedebilirsiniz. +pdfjs-editor-add-signature-dialog-title = İmza ekle + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Yaz + .title = Yaz +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Çiz + .title = Çiz +pdfjs-editor-add-signature-image-button = Resim + .title = Resim + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = İmzanızı yazın + .placeholder = İmzanızı yazın +pdfjs-editor-add-signature-draw-placeholder = İmzanızı çizin +pdfjs-editor-add-signature-draw-thickness-range-label = Kalınlık +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Çizgi kalınlığı: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Yüklenecek dosyayı buraya sürükleyin +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Veya resim dosyalarına göz atın + *[other] Veya resim dosyalarına göz atın + } + +## Controls + +pdfjs-editor-add-signature-description-label = Açıklama (alt metin) +pdfjs-editor-add-signature-description-input = + .title = Açıklama (alt metin) +pdfjs-editor-add-signature-description-default-when-drawing = İmza +pdfjs-editor-add-signature-clear-button-label = İmzayı temizle +pdfjs-editor-add-signature-clear-button = + .title = İmzayı temizle +pdfjs-editor-add-signature-save-checkbox = İmzayı kaydet +pdfjs-editor-add-signature-save-warning-message = Kayıtlı 5 imza sınırına ulaştınız. Daha fazla imza kaydetmek için imzalardan birini kaldırın. +pdfjs-editor-add-signature-image-upload-error-title = Resim yüklenemedi +pdfjs-editor-add-signature-image-upload-error-description = Ağ bağlantınızı kontrol edin veya başka bir resim deneyin. +pdfjs-editor-add-signature-image-no-data-error-title = Bu resim imzaya dönüştürülemez +pdfjs-editor-add-signature-image-no-data-error-description = Lütfen farklı bir resim yüklemeyi deneyin. +pdfjs-editor-add-signature-error-close-button = Kapat + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Vazgeç +pdfjs-editor-add-signature-add-button = Ekle +pdfjs-editor-edit-signature-update-button = Güncelle + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Yorumu düzenle +pdfjs-editor-edit-comment-popup-button = + .title = Yorumu düzenle +pdfjs-editor-delete-comment-popup-button-label = Yorumu sil +pdfjs-editor-delete-comment-popup-button = + .title = Yorumu sil +pdfjs-show-comment-button = + .title = Yorumu göster + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Yorumu düzenle +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Güncelle +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Yorum ekle +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Ekle +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Yazmaya başlayın… +pdfjs-editor-edit-comment-dialog-cancel-button = Vazgeç + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Yorum ekle + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Kenar çubuğunu aç/kapat (Belge, küçük resimler/ana hat/ekler/katmanlar içeriyor) +pdfjs-toggle-views-manager-button1-label = Sayfaları yönet +pdfjs-views-manager-sidebar = + .aria-label = Kenar çubuğu +pdfjs-views-manager-sidebar-resizer = + .aria-label = Kenar çubuğu boyutlandırıcı +pdfjs-views-manager-view-selector-button = + .title = Görünümler +pdfjs-views-manager-view-selector-button-label = Görünümler +pdfjs-views-manager-pages-title = Sayfalar +pdfjs-views-manager-outlines-title1 = Belge ana hatları + .title = Belge ana hatları (Tüm öğeleri genişletmek/daraltmak için çift tıklayın) +pdfjs-views-manager-attachments-title = Ekler +pdfjs-views-manager-layers-title1 = Katmanlar + .title = Katmanlar (Tüm katmanları varsayılan duruma sıfırlamak için çift tıklayın) +pdfjs-views-manager-pages-option-label = Sayfalar +pdfjs-views-manager-outlines-option-label = Belge ana hatları +pdfjs-views-manager-attachments-option-label = Ekler +pdfjs-views-manager-layers-option-label = Katmanlar +pdfjs-views-manager-add-file-button = + .title = Dosya ekle +pdfjs-views-manager-add-file-button-label = Dosya ekle +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] { $count } seçili + *[other] { $count } seçili + } +pdfjs-views-manager-pages-status-none-action-label = Sayfaları seç +pdfjs-views-manager-pages-status-action-button-label = Yönet +pdfjs-views-manager-pages-status-copy-button-label = Kopyala +pdfjs-views-manager-pages-status-cut-button-label = Kes +pdfjs-views-manager-pages-status-delete-button-label = Sil +pdfjs-views-manager-pages-status-export-selected-button-label = Seçilenleri dışa aktar… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 sayfa kesildi + *[other] { $count } sayfa kesildi + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 sayfa kopyalandı + *[other] { $count } sayfa kopyalandı + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 sayfa silindi + *[other] { $count } sayfa silindi + } +pdfjs-views-manager-pages-status-waiting-ready-label = Dosyanız hazırlanıyor… +pdfjs-views-manager-pages-status-waiting-uploading-label = Dosya yükleniyor… +pdfjs-views-manager-status-warning-cut-label = Kesilemedi. Sayfayı tazeleyip yeniden deneyin. +pdfjs-views-manager-status-warning-copy-label = Kopyalanamadı. Sayfayı tazeleyip yeniden deneyin. +pdfjs-views-manager-status-warning-delete-label = Silinemedi. Sayfayı tazeleyip yeniden deneyin. +pdfjs-views-manager-status-warning-save-label = Kaydedilemedi. Sayfayı tazeleyip yeniden deneyin. +pdfjs-views-manager-status-undo-button-label = Geri al +pdfjs-views-manager-status-done-button-label = Tamam +pdfjs-views-manager-status-close-button = + .title = Kapat +pdfjs-views-manager-status-close-button-label = Kapat +pdfjs-views-manager-paste-button-label = Yapıştır +pdfjs-views-manager-paste-button-before = + .title = İlk sayfadan önce yapıştır +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = { $page }. sayfadan sonra yapıştır +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = YENİ +pdfjs-views-manager-waiting-for-file = Dosya yükleniyor… +pdfjs-toggle-views-manager-button1 = + .title = Sayfaları yönet + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Kayıtlı imzayı kaldır +pdfjs-editor-delete-signature-button-label1 = Kayıtlı imzayı kaldır + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Açıklamayı düzenle + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Açıklamayı düzenle diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/trs/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/trs/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/trs/viewer.ftl 2026-01-20 14:08:39.386689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/trs/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -89,24 +89,12 @@ pdfjs-document-properties-button-label = Nej sa nikāj ñanj… pdfjs-document-properties-file-name = Si yugui archîbo: pdfjs-document-properties-file-size = Dàj yachìj archîbo: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Si yugui: pdfjs-document-properties-author = Sí girirà: pdfjs-document-properties-subject = Dugui': pdfjs-document-properties-keywords = Nej nuguan' huìi: pdfjs-document-properties-creation-date = Gui gurugui' man: pdfjs-document-properties-modification-date = Nuguan' nahuin nakà: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Guiri ro' pdfjs-document-properties-producer = Sa ri PDF: pdfjs-document-properties-version = PDF Version: @@ -154,9 +142,6 @@ pdfjs-toggle-sidebar-button-label = Nadunā barrâ nù yi'nïn pdfjs-findbar-button-label = Narì' -## Thumbnails panel item (tooltip and alt text for images) - - ## Find panel button title and messages pdfjs-find-previous-button-label = Sa gachîn @@ -172,26 +157,7 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - -## Loading indicator messages - - -## Annotations - - ## Password pdfjs-password-ok-button = Ga'ue pdfjs-password-cancel-button = Duyichin' - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/uk/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/uk/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/uk/viewer.ftl 2026-01-20 14:08:39.386689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/uk/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Поточна сторінка (перегляд URL-адреси з поточної сторінки) pdfjs-bookmark-button-label = Поточна сторінка -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Відкрити у програмі -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Відкрити у програмі ## Secondary toolbar and context menu @@ -108,16 +102,16 @@ pdfjs-document-properties-button = .title = Властивості документа… pdfjs-document-properties-button-label = Властивості документа… -pdfjs-document-properties-file-name = Назва файла: -pdfjs-document-properties-file-size = Розмір файла: +pdfjs-document-properties-file-name = Назва файлу: +pdfjs-document-properties-file-size = Розмір файлу: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } КБ ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } МБ ({ $size_b } bytes) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } кБ ({ $b } байтів) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } МБ ({ $b } байтів) pdfjs-document-properties-title = Заголовок: pdfjs-document-properties-author = Автор: pdfjs-document-properties-subject = Тема: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Дата створення: pdfjs-document-properties-modification-date = Дата зміни: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Створено: pdfjs-document-properties-producer = Виробник PDF: pdfjs-document-properties-version = Версія PDF: @@ -182,14 +175,14 @@ .title = Показати схему документу (подвійний клік для розгортання/згортання елементів) pdfjs-document-outline-button-label = Схема документа pdfjs-attachments-button = - .title = Показати прикріплення -pdfjs-attachments-button-label = Прикріплення + .title = Показати вкладення +pdfjs-attachments-button-label = Вкладення pdfjs-layers-button = .title = Показати шари (двічі клацніть, щоб скинути всі шари до типового стану) pdfjs-layers-button-label = Шари pdfjs-thumbs-button = - .title = Показувати ескізи -pdfjs-thumbs-button-label = Ескізи + .title = Показати мініатюри +pdfjs-thumbs-button-label = Мініатюри pdfjs-current-outline-item-button = .title = Знайти поточний елемент змісту pdfjs-current-outline-item-button-label = Поточний елемент змісту @@ -272,10 +265,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -283,22 +272,29 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type }-анотація] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password -pdfjs-password-label = Введіть пароль для відкриття цього PDF-файла. -pdfjs-password-invalid = Невірний пароль. Спробуйте ще. +pdfjs-password-label = Введіть пароль для відкриття цього PDF-файлу. +pdfjs-password-invalid = Неправильний пароль. Спробуйте ще раз. pdfjs-password-ok-button = OK pdfjs-password-cancel-button = Скасувати -pdfjs-web-fonts-disabled = Веб-шрифти вимкнено: неможливо використати вбудовані у PDF шрифти. +pdfjs-web-fonts-disabled = Вебшрифти вимкнено: неможливо використати вбудовані у PDF шрифти. ## Editing pdfjs-editor-free-text-button = .title = Текст +pdfjs-editor-color-picker-free-text-input = + .title = Змінити колір тексту pdfjs-editor-free-text-button-label = Текст pdfjs-editor-ink-button = .title = Малювати +pdfjs-editor-color-picker-ink-input = + .title = Змінити колір малюнка pdfjs-editor-ink-button-label = Малювати pdfjs-editor-stamp-button = .title = Додати чи редагувати зображення @@ -306,12 +302,37 @@ pdfjs-editor-highlight-button = .title = Підсвітити pdfjs-editor-highlight-button-label = Підсвітити -pdfjs-highlight-floating-button = - .title = Підсвітити pdfjs-highlight-floating-button1 = .title = Підсвітити .aria-label = Підсвітити pdfjs-highlight-floating-button-label = Підсвітити +pdfjs-comment-floating-button = + .title = Коментувати + .aria-label = Коментувати +pdfjs-comment-floating-button-label = Коментувати +pdfjs-editor-comment-button = + .title = Коментар + .aria-label = Коментар +pdfjs-editor-comment-button-label = Коментар +pdfjs-editor-signature-button = + .title = Додати підпис +pdfjs-editor-signature-button-label = Додати підпис + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Редактор підсвічень +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Редактор малюнків +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Редактор підпису: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Редактор зображень ## Remove button for the various kind of editor. @@ -322,7 +343,9 @@ pdfjs-editor-remove-stamp-button = .title = Вилучити зображення pdfjs-editor-remove-highlight-button = - .title = Вилучити підсвічування + .title = Вилучити підсвічення +pdfjs-editor-remove-signature-button = + .title = Вилучити підпис ## @@ -338,20 +361,43 @@ # This refers to the thickness of the line used for free highlighting (not bound to text) pdfjs-editor-free-highlight-thickness-input = Товщина pdfjs-editor-free-highlight-thickness-title = - .title = Змінюйте товщину під час підсвічування елементів, крім тексту -pdfjs-free-text = + .title = Змінюйте товщину під час підсвічення елементів, крім тексту +pdfjs-editor-add-signature-container = + .aria-label = Елементи керування підписами та збережені підписи +pdfjs-editor-signature-add-signature-button = + .title = Додати новий підпис +pdfjs-editor-signature-add-signature-button-label = Додати новий підпис +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Збережений підпис: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = Текстовий редактор -pdfjs-free-text-default-content = Почніть вводити… -pdfjs-ink = - .aria-label = Графічний редактор -pdfjs-ink-canvas = - .aria-label = Зображення, створене користувачем + .default-content = Напишіть щось… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Коментар + [few] Коментарі + *[many] Коментарі + } +pdfjs-editor-comments-sidebar-close-button = + .title = Закрити бічну панель + .aria-label = Закрити бічну панель +pdfjs-editor-comments-sidebar-close-button-label = Закрити бічну панель +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Бачите щось варте уваги? Підсвітіть і додайте коментар. +pdfjs-editor-comments-sidebar-no-comments-link = Докладніше ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Альтернативний текст -pdfjs-editor-alt-text-edit-button-label = Змінити альтернативний текст +pdfjs-editor-alt-text-edit-button = + .aria-label = Редагувати альтернативний текст pdfjs-editor-alt-text-dialog-label = Вибрати варіант pdfjs-editor-alt-text-dialog-description = Альтернативний текст допомагає, коли зображення не видно або коли воно не завантажується. pdfjs-editor-alt-text-add-description-label = Додати опис @@ -364,23 +410,34 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Наприклад, “Молодий чоловік сідає за стіл їсти” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Альтернативний текст ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Верхній лівий кут – зміна розміру -pdfjs-editor-resizer-label-top-middle = Вгорі посередині – зміна розміру -pdfjs-editor-resizer-label-top-right = Верхній правий кут – зміна розміру -pdfjs-editor-resizer-label-middle-right = Праворуч посередині – зміна розміру -pdfjs-editor-resizer-label-bottom-right = Нижній правий кут – зміна розміру -pdfjs-editor-resizer-label-bottom-middle = Внизу посередині – зміна розміру -pdfjs-editor-resizer-label-bottom-left = Нижній лівий кут – зміна розміру -pdfjs-editor-resizer-label-middle-left = Ліворуч посередині – зміна розміру +pdfjs-editor-resizer-top-left = + .aria-label = Верхній лівий кут – зміна розміру +pdfjs-editor-resizer-top-middle = + .aria-label = Вгорі посередині – зміна розміру +pdfjs-editor-resizer-top-right = + .aria-label = Верхній правий кут – зміна розміру +pdfjs-editor-resizer-middle-right = + .aria-label = Праворуч посередині – зміна розміру +pdfjs-editor-resizer-bottom-right = + .aria-label = Нижній правий кут – зміна розміру +pdfjs-editor-resizer-bottom-middle = + .aria-label = Внизу посередині – зміна розміру +pdfjs-editor-resizer-bottom-left = + .aria-label = Нижній лівий кут – зміна розміру +pdfjs-editor-resizer-middle-left = + .aria-label = Ліворуч посередині – зміна розміру ## Color picker # This means "Color used to highlight text" -pdfjs-editor-highlight-colorpicker-label = Колір підсвічування +pdfjs-editor-highlight-colorpicker-label = Колір підсвічення pdfjs-editor-colorpicker-button = .title = Змінити колір pdfjs-editor-colorpicker-dropdown = @@ -402,3 +459,269 @@ pdfjs-editor-highlight-show-all-button-label = Показати все pdfjs-editor-highlight-show-all-button = .title = Показати все + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Редагувати альтернативний текст (опис зображення) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Додати альтернативний текст (опис зображення) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Напишіть свій опис тут… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Короткий опис для людей, які не бачать зображення, або якщо зображення не завантажується. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Цей альтернативний текст створено автоматично, тому він може бути неточним. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Докладніше +pdfjs-editor-new-alt-text-create-automatically-button-label = Автоматично створювати альтернативний текст +pdfjs-editor-new-alt-text-not-now-button = Не зараз +pdfjs-editor-new-alt-text-error-title = Не вдалося автоматично створити альтернативний текст +pdfjs-editor-new-alt-text-error-description = Напишіть власний альтернативний текст або повторіть спробу пізніше. +pdfjs-editor-new-alt-text-error-close-button = Закрити +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Завантаження моделі ШІ для альтернативного тексту ({ $downloadedSize } з { $totalSize } МБ) + .aria-valuetext = Завантаження моделі ШІ для альтернативного тексту ({ $downloadedSize } з { $totalSize } МБ) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Альтернативний текст додано +pdfjs-editor-new-alt-text-added-button-label = Альтернативний текст додано +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Відсутній альтернативний текст +pdfjs-editor-new-alt-text-missing-button-label = Відсутній альтернативний текст +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Переглянути альтернативний текст +pdfjs-editor-new-alt-text-to-review-button-label = Переглянути альтернативний текст +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Створено автоматично: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Налаштування альтернативного тексту зображення +pdfjs-image-alt-text-settings-button-label = Налаштування альтернативного тексту зображення +pdfjs-editor-alt-text-settings-dialog-label = Налаштування альтернативного тексту зображення +pdfjs-editor-alt-text-settings-automatic-title = Автоматичний альтернативний текст +pdfjs-editor-alt-text-settings-create-model-button-label = Автоматично створювати альтернативний текст +pdfjs-editor-alt-text-settings-create-model-description = Пропонує описи, щоб допомогти людям, які не бачать зображення, або якщо зображення не завантажується. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Модель ШІ для альтернативного тексту ({ $totalSize } МБ) +pdfjs-editor-alt-text-settings-ai-model-description = Працює локально на вашому пристрої, тому приватність ваших даних захищена. Призначена для автоматичного створення альтернативного тексту. +pdfjs-editor-alt-text-settings-delete-model-button = Видалити +pdfjs-editor-alt-text-settings-download-model-button = Завантажити +pdfjs-editor-alt-text-settings-downloading-model-button = Завантаження… +pdfjs-editor-alt-text-settings-editor-title = Редактор альтернативного тексту +pdfjs-editor-alt-text-settings-show-dialog-button-label = Показувати редактор альтернативного тексту під час додавання зображення +pdfjs-editor-alt-text-settings-show-dialog-description = Допомагає переконатися, що всі ваші зображення мають альтернативний текст. +pdfjs-editor-alt-text-settings-close-button = Закрити + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Підсвічення додано +pdfjs-editor-freetext-added-alert = Текст додано +pdfjs-editor-ink-added-alert = Малюнок додано +pdfjs-editor-stamp-added-alert = Зображення додано +pdfjs-editor-signature-added-alert = Підпис додано + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Підсвічення вилучено +pdfjs-editor-undo-bar-message-freetext = Текст вилучено +pdfjs-editor-undo-bar-message-ink = Малюнок вилучено +pdfjs-editor-undo-bar-message-stamp = Зображення вилучено +pdfjs-editor-undo-bar-message-signature = Підпис вилучено +pdfjs-editor-undo-bar-message-comment = Коментар вилучено +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = + { $count -> + [one] { $count } анотацію вилучено + [few] { $count } анотації вилучено + *[many] { $count } анотацій вилучено + } +pdfjs-editor-undo-bar-undo-button = + .title = Повернути +pdfjs-editor-undo-bar-undo-button-label = Повернути +pdfjs-editor-undo-bar-close-button = + .title = Закрити +pdfjs-editor-undo-bar-close-button-label = Закрити + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = У цьому вікні користувач може створити підпис для додавання до PDF-документа. Користувач може відредагувати назву (яка також слугує альтернативним текстом) і, за бажання, зберегти підпис для повторного використання. +pdfjs-editor-add-signature-dialog-title = Додати підпис + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Ввести + .title = Ввести +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Малювати + .title = Малювати +pdfjs-editor-add-signature-image-button = Зображення + .title = Зображення + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Введіть свій підпис + .placeholder = Введіть свій підпис +pdfjs-editor-add-signature-draw-placeholder = Намалюйте свій підпис +pdfjs-editor-add-signature-draw-thickness-range-label = Товщина +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Товщина лінії: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Перетягніть файл сюди, щоб вивантажити +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Або виберіть файли зображень + *[other] Або перегляньте файли зображень + } + +## Controls + +pdfjs-editor-add-signature-description-label = Опис (альтернативний текст) +pdfjs-editor-add-signature-description-input = + .title = Опис (альтернативний текст) +pdfjs-editor-add-signature-description-default-when-drawing = Підпис +pdfjs-editor-add-signature-clear-button-label = Очистити підпис +pdfjs-editor-add-signature-clear-button = + .title = Очистити підпис +pdfjs-editor-add-signature-save-checkbox = Зберегти підпис +pdfjs-editor-add-signature-save-warning-message = Ви досягли ліміту в 5 збережених підписів. Вилучіть один, щоб зберегти інший. +pdfjs-editor-add-signature-image-upload-error-title = Не вдалося вивантажити зображення +pdfjs-editor-add-signature-image-upload-error-description = Перевірте мережеве з'єднання або спробуйте інше зображення. +pdfjs-editor-add-signature-image-no-data-error-title = Не вдається конвертувати це зображення в підпис +pdfjs-editor-add-signature-image-no-data-error-description = Спробуйте вивантажити інше зображення. +pdfjs-editor-add-signature-error-close-button = Закрити + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Скасувати +pdfjs-editor-add-signature-add-button = Додати +pdfjs-editor-edit-signature-update-button = Оновити + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Редагувати коментар +pdfjs-editor-edit-comment-popup-button = + .title = Редагувати коментар +pdfjs-editor-delete-comment-popup-button-label = Вилучити коментар +pdfjs-editor-delete-comment-popup-button = + .title = Вилучити коментар +pdfjs-show-comment-button = + .title = Показати коментар + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Редагувати коментар +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Оновити +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Додати коментар +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Додати +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Почніть вводити… +pdfjs-editor-edit-comment-dialog-cancel-button = Скасувати + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Додати коментар + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Перемкнути бічну панель (документ містить мініатюри/ескіз/вкладення/шари) +pdfjs-views-manager-sidebar = + .aria-label = Бічна панель +pdfjs-views-manager-sidebar-resizer = + .aria-label = Зміна розміру бічної панелі +pdfjs-views-manager-view-selector-button = + .title = Вигляд +pdfjs-views-manager-view-selector-button-label = Вигляд +pdfjs-views-manager-pages-title = Сторінки +pdfjs-views-manager-attachments-title = Вкладення +pdfjs-views-manager-pages-option-label = Сторінки +pdfjs-views-manager-outlines-option-label = Схема документа +pdfjs-views-manager-attachments-option-label = Вкладення +pdfjs-views-manager-layers-option-label = Шари +pdfjs-views-manager-add-file-button = + .title = Додати файл +pdfjs-views-manager-add-file-button-label = Додати файл +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = + { $count -> + [one] Вибрано { $count } + [few] Вибрано { $count } + *[many] Вибрано { $count } + } +pdfjs-views-manager-pages-status-none-action-label = Вибрати сторінки +pdfjs-views-manager-pages-status-action-button-label = Керувати +pdfjs-views-manager-pages-status-copy-button-label = Копіювати +pdfjs-views-manager-pages-status-cut-button-label = Вирізати +pdfjs-views-manager-pages-status-delete-button-label = Видалити +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = + { $count -> + [one] 1 сторінку вирізано + [few] { $count } сторінки вирізано + *[many] { $count } сторінок вирізано + } +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = + { $count -> + [one] 1 сторінку скопійовано + [few] { $count } сторінки скопійовано + *[many] { $count } сторінок скопійовано + } +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = + { $count -> + [one] 1 сторінку видалено + [few] { $count } сторінки видалено + *[many] { $count } сторінок видалено + } +pdfjs-views-manager-pages-status-waiting-ready-label = Підготовка файлу… +pdfjs-views-manager-pages-status-waiting-uploading-label = Вивантаження файлу… +pdfjs-views-manager-status-warning-cut-label = Не вдалося вирізати. Оновіть сторінку та спробуйте ще раз. +pdfjs-views-manager-status-warning-copy-label = Не вдалося скопіювати. Оновіть сторінку та спробуйте ще раз. +pdfjs-views-manager-status-warning-delete-label = Не вдалося видалити. Оновіть сторінку та спробуйте ще раз. +pdfjs-views-manager-status-warning-save-label = Не вдалося зберегти. Оновіть сторінку та спробуйте ще раз. +pdfjs-views-manager-status-undo-button-label = Повернути +pdfjs-views-manager-status-close-button = + .title = Закрити +pdfjs-views-manager-status-close-button-label = Закрити +pdfjs-views-manager-paste-button-label = Вставити + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Видалити збережений підпис +pdfjs-editor-delete-signature-button-label1 = Видалити збережений підпис + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Редагувати опис + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Редагувати опис diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ur/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ur/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/ur/viewer.ftl 2026-01-20 14:08:39.387689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/ur/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -82,24 +82,12 @@ pdfjs-document-properties-button-label = دستاویز خواص… pdfjs-document-properties-file-name = نام مسل: pdfjs-document-properties-file-size = مسل سائز: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = عنوان: pdfjs-document-properties-author = تخلیق کار: pdfjs-document-properties-subject = موضوع: pdfjs-document-properties-keywords = کلیدی الفاظ: pdfjs-document-properties-creation-date = تخلیق کی تاریخ: pdfjs-document-properties-modification-date = ترمیم کی تاریخ: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }، { $time } pdfjs-document-properties-creator = تخلیق کار: pdfjs-document-properties-producer = PDF پیدا کار: pdfjs-document-properties-version = PDF ورژن: @@ -217,10 +205,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }.{ $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -236,13 +220,3 @@ pdfjs-password-ok-button = ٹھیک ہے pdfjs-password-cancel-button = منسوخ کریں pdfjs-web-fonts-disabled = ویب فانٹ نا اہل ہیں: شامل PDF فانٹ استعمال کرنے میں ناکام۔ - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/uz/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/uz/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/uz/viewer.ftl 2026-01-20 14:08:39.387689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/uz/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -58,37 +58,17 @@ pdfjs-document-properties-button-label = Hujjat xossalari pdfjs-document-properties-file-name = Fayl nomi: pdfjs-document-properties-file-size = Fayl hajmi: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes) pdfjs-document-properties-title = Nomi: pdfjs-document-properties-author = Muallifi: pdfjs-document-properties-subject = Mavzusi: pdfjs-document-properties-keywords = Kalit so‘zlar pdfjs-document-properties-creation-date = Yaratilgan sanasi: pdfjs-document-properties-modification-date = O‘zgartirilgan sanasi -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Yaratuvchi: pdfjs-document-properties-producer = PDF ishlab chiqaruvchi: pdfjs-document-properties-version = PDF versiyasi: pdfjs-document-properties-page-count = Sahifa soni: -## Variables: -## $width (Number) - the width of the (current) page -## $height (Number) - the height of the (current) page -## $unit (String) - the unit of measurement of the (current) page -## $name (String) - the name of the (current) page -## $orientation (String) - the orientation of the (current) page - - ## pdfjs-document-properties-close-button = Yopish @@ -148,9 +128,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = PDF yuklanayotganda xato yuz berdi. @@ -175,13 +152,3 @@ pdfjs-password-invalid = Parol - notoʻgʻri. Qaytadan urinib koʻring. pdfjs-password-ok-button = OK pdfjs-web-fonts-disabled = Veb shriftlar oʻchirilgan: ichki PDF shriftlardan foydalanib boʻlmmaydi. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/vi/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/vi/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/vi/viewer.ftl 2026-01-20 14:08:39.387689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/vi/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = Trang hiện tại (xem URL từ trang hiện tại) pdfjs-bookmark-button-label = Trang hiện tại -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = Mở trong ứng dụng -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = Mở trong ứng dụng ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = Tên tập tin: pdfjs-document-properties-file-size = Kích thước: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } byte) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } byte) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes) pdfjs-document-properties-title = Tiêu đề: pdfjs-document-properties-author = Tác giả: pdfjs-document-properties-subject = Chủ đề: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = Ngày tạo: pdfjs-document-properties-modification-date = Ngày sửa đổi: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = Người tạo: pdfjs-document-properties-producer = Phần mềm tạo PDF: pdfjs-document-properties-version = Phiên bản PDF: @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = Ảnh thu nhỏ của trang { $page } +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = Chọn trang { $page } +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = Trang { $page } / { $total } ## Find panel button title and messages @@ -262,10 +264,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date }, { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -273,6 +271,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } Chú thích] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -286,9 +287,13 @@ pdfjs-editor-free-text-button = .title = Văn bản +pdfjs-editor-color-picker-free-text-input = + .title = Thay đổi màu chữ pdfjs-editor-free-text-button-label = Văn bản pdfjs-editor-ink-button = .title = Vẽ +pdfjs-editor-color-picker-ink-input = + .title = Thay đổi màu vẽ pdfjs-editor-ink-button-label = Vẽ pdfjs-editor-stamp-button = .title = Thêm hoặc chỉnh sửa hình ảnh @@ -296,12 +301,37 @@ pdfjs-editor-highlight-button = .title = Đánh dấu pdfjs-editor-highlight-button-label = Đánh dấu -pdfjs-highlight-floating-button = - .title = Đánh dấu pdfjs-highlight-floating-button1 = .title = Đánh dấu .aria-label = Đánh dấu pdfjs-highlight-floating-button-label = Đánh dấu +pdfjs-comment-floating-button = + .title = Chú thích + .aria-label = Chú thích +pdfjs-comment-floating-button-label = Chú thích +pdfjs-editor-comment-button = + .title = Chú thích + .aria-label = Chú thích +pdfjs-editor-comment-button-label = Chú thích +pdfjs-editor-signature-button = + .title = Thêm chữ ký +pdfjs-editor-signature-button-label = Thêm chữ ký + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = Trình chỉnh sửa đánh dấu +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = Trình chỉnh sửa bản vẽ +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = Trình chỉnh sửa chữ ký: { $description } +pdfjs-editor-stamp-editor = + .aria-label = Trình chỉnh sửa hình ảnh ## Remove button for the various kind of editor. @@ -313,6 +343,8 @@ .title = Xóa ảnh pdfjs-editor-remove-highlight-button = .title = Xóa phần đánh dấu +pdfjs-editor-remove-signature-button = + .title = Xoá chữ ký ## @@ -329,19 +361,37 @@ pdfjs-editor-free-highlight-thickness-input = Độ dày pdfjs-editor-free-highlight-thickness-title = .title = Thay đổi độ dày khi đánh dấu các mục không phải là văn bản -pdfjs-free-text = - .aria-label = Trình sửa văn bản -pdfjs-free-text-default-content = Bắt đầu nhập… -pdfjs-ink = - .aria-label = Trình sửa nét vẽ -pdfjs-ink-canvas = - .aria-label = Hình ảnh do người dùng tạo +pdfjs-editor-add-signature-container = + .aria-label = Kiểm soát chữ ký và chữ ký đã lưu +pdfjs-editor-signature-add-signature-button = + .title = Thêm chữ ký mới +pdfjs-editor-signature-add-signature-button-label = Thêm chữ ký mới +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = Đã lưu chữ ký: { $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = Trình chỉnh sửa văn bản + .default-content = Bắt đầu nhập… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = Chú thích +pdfjs-editor-comments-sidebar-close-button = + .title = Đóng thanh lề + .aria-label = Đóng thanh lề +pdfjs-editor-comments-sidebar-close-button-label = Đóng thanh lề +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Bạn thấy điều gì đáng chú ý? Hãy đánh dấu và để lại chú thích. +pdfjs-editor-comments-sidebar-no-comments-link = Tìm hiểu thêm ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = Văn bản thay thế -pdfjs-editor-alt-text-edit-button-label = Chỉnh sửa văn bản thay thế +pdfjs-editor-alt-text-edit-button = + .aria-label = Chỉnh sửa văn bản thay thế pdfjs-editor-alt-text-dialog-label = Chọn một lựa chọn pdfjs-editor-alt-text-dialog-description = Văn bản thay thế sẽ hữu ích khi mọi người không thể thấy hình ảnh hoặc khi hình ảnh không tải. pdfjs-editor-alt-text-add-description-label = Thêm một mô tả @@ -354,18 +404,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = Ví dụ: “Một thanh niên ngồi xuống bàn để thưởng thức một bữa ăn” +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = Văn bản thay thế ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = Trên cùng bên trái — thay đổi kích thước -pdfjs-editor-resizer-label-top-middle = Trên cùng ở giữa — thay đổi kích thước -pdfjs-editor-resizer-label-top-right = Trên cùng bên phải — thay đổi kích thước -pdfjs-editor-resizer-label-middle-right = Ở giữa bên phải — thay đổi kích thước -pdfjs-editor-resizer-label-bottom-right = Dưới cùng bên phải — thay đổi kích thước -pdfjs-editor-resizer-label-bottom-middle = Ở giữa dưới cùng — thay đổi kích thước -pdfjs-editor-resizer-label-bottom-left = Góc dưới bên trái — thay đổi kích thước -pdfjs-editor-resizer-label-middle-left = Ở giữa bên trái — thay đổi kích thước +pdfjs-editor-resizer-top-left = + .aria-label = Trên cùng bên trái — thay đổi kích thước +pdfjs-editor-resizer-top-middle = + .aria-label = Trên cùng ở giữa — thay đổi kích thước +pdfjs-editor-resizer-top-right = + .aria-label = Trên cùng bên phải — thay đổi kích thước +pdfjs-editor-resizer-middle-right = + .aria-label = Ở giữa bên phải — thay đổi kích thước +pdfjs-editor-resizer-bottom-right = + .aria-label = Dưới cùng bên phải — thay đổi kích thước +pdfjs-editor-resizer-bottom-middle = + .aria-label = Ở giữa dưới cùng — thay đổi kích thước +pdfjs-editor-resizer-bottom-left = + .aria-label = Góc dưới bên trái — thay đổi kích thước +pdfjs-editor-resizer-middle-left = + .aria-label = Ở giữa bên trái — thay đổi kích thước ## Color picker @@ -392,3 +453,263 @@ pdfjs-editor-highlight-show-all-button-label = Hiện tất cả pdfjs-editor-highlight-show-all-button = .title = Hiện tất cả + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = Chỉnh sửa văn bản thay thế (mô tả hình ảnh) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = Thêm văn bản thay thế (mô tả hình ảnh) +pdfjs-editor-new-alt-text-textarea = + .placeholder = Viết mô tả của bạn ở đây… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = Mô tả ngắn gọn dành cho người không xem được ảnh hoặc khi không thể tải ảnh. +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = Văn bản thay thế này được tạo tự động và có thể không chính xác. +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Tìm hiểu thêm +pdfjs-editor-new-alt-text-create-automatically-button-label = Tạo văn bản thay thế tự động +pdfjs-editor-new-alt-text-not-now-button = Không phải bây giờ +pdfjs-editor-new-alt-text-error-title = Không thể tạo tự động văn bản thay thế +pdfjs-editor-new-alt-text-error-description = Vui lòng viết văn bản thay thế của riêng bạn hoặc thử lại sau. +pdfjs-editor-new-alt-text-error-close-button = Đóng +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = Đang tải xuống mô hình AI văn bản thay thế ({ $downloadedSize } / { $totalSize } MB) + .aria-valuetext = Đang tải xuống mô hình AI văn bản thay thế ({ $downloadedSize } / { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = Đã thêm văn bản thay thế +pdfjs-editor-new-alt-text-added-button-label = Đã thêm văn bản thay thế +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = Thiếu văn bản thay thế +pdfjs-editor-new-alt-text-missing-button-label = Thiếu văn bản thay thế +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = Xem lại văn bản thay thế +pdfjs-editor-new-alt-text-to-review-button-label = Xem lại văn bản thay thế +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Được tạo tự động: { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = Cài đặt văn bản thay thế của hình ảnh +pdfjs-image-alt-text-settings-button-label = Cài đặt văn bản thay thế của hình ảnh +pdfjs-editor-alt-text-settings-dialog-label = Cài đặt văn bản thay thế của hình ảnh +pdfjs-editor-alt-text-settings-automatic-title = Văn bản thay thế tự động +pdfjs-editor-alt-text-settings-create-model-button-label = Tạo văn bản thay thế tự động +pdfjs-editor-alt-text-settings-create-model-description = Đề xuất mô tả giúp ích cho những người không xem được ảnh hoặc khi không thể tải ảnh. +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = Mô hình AI văn bản khác ({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = Chạy cục bộ trên thiết bị của bạn để dữ liệu của bạn luôn ở chế độ riêng tư. Bắt buộc đối với văn bản thay thế tự động. +pdfjs-editor-alt-text-settings-delete-model-button = Xóa +pdfjs-editor-alt-text-settings-download-model-button = Tải xuống +pdfjs-editor-alt-text-settings-downloading-model-button = Đang tải xuống… +pdfjs-editor-alt-text-settings-editor-title = Trình soạn thảo văn bản thay thế +pdfjs-editor-alt-text-settings-show-dialog-button-label = Hiển thị ngay trình soạn thảo văn bản thay thế khi thêm hình ảnh +pdfjs-editor-alt-text-settings-show-dialog-description = Giúp bạn đảm bảo tất cả hình ảnh của bạn đều có văn bản thay thế. +pdfjs-editor-alt-text-settings-close-button = Đóng + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = Đã thêm tô sáng +pdfjs-editor-freetext-added-alert = Đã thêm chữ +pdfjs-editor-ink-added-alert = Đã thêm bản vẽ +pdfjs-editor-stamp-added-alert = Đã thêm ảnh +pdfjs-editor-signature-added-alert = Đã thêm chữ ký + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = Đã xóa đánh dấu +pdfjs-editor-undo-bar-message-freetext = Đã xóa văn bản +pdfjs-editor-undo-bar-message-ink = Đã xóa bản vẽ +pdfjs-editor-undo-bar-message-stamp = Đã xóa hình ảnh +pdfjs-editor-undo-bar-message-signature = Chữ ký đã bị xoá +pdfjs-editor-undo-bar-message-comment = Đã xoá chú thích +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = { $count } chú thích đã bị xóa +pdfjs-editor-undo-bar-undo-button = + .title = Hoàn tác +pdfjs-editor-undo-bar-undo-button-label = Hoàn tác +pdfjs-editor-undo-bar-close-button = + .title = Đóng +pdfjs-editor-undo-bar-close-button-label = Đóng + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = Phương thức này cho phép người dùng tạo một chữ ký để thêm vào tài liệu PDF. Người dùng có thể chỉnh sửa tên (cũng đóng vai trò là văn bản thay thế) và tùy chọn lưu chữ ký để sử dụng nhiều lần. +pdfjs-editor-add-signature-dialog-title = Thêm chữ ký + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = Đánh văn bản + .title = Đánh văn bản +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = Vẽ + .title = Vẽ +pdfjs-editor-add-signature-image-button = Hình ảnh + .title = Hình ảnh + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = Nhập chữ ký của bạn + .placeholder = Nhập chữ ký của bạn +pdfjs-editor-add-signature-draw-placeholder = Vẽ chữ ký của bạn +pdfjs-editor-add-signature-draw-thickness-range-label = Độ dày +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = Độ dày bút vẽ: { $thickness } +pdfjs-editor-add-signature-image-placeholder = Kéo một tập tin tại đây để tải lên +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] Hoặc chọn hình ảnh + *[other] Hoặc chọn hình ảnh + } + +## Controls + +pdfjs-editor-add-signature-description-label = Mô tả (văn bản thay thế) +pdfjs-editor-add-signature-description-input = + .title = Mô tả (văn bản thay thế) +pdfjs-editor-add-signature-description-default-when-drawing = Chữ ký +pdfjs-editor-add-signature-clear-button-label = Xoá chữ ký +pdfjs-editor-add-signature-clear-button = + .title = Xoá chữ ký +pdfjs-editor-add-signature-save-checkbox = Lưu chữ ký +pdfjs-editor-add-signature-save-warning-message = Bạn đã đạt đến giới hạn 5 chữ ký đã lưu. Hãy xóa một cái để lưu thêm. +pdfjs-editor-add-signature-image-upload-error-title = Không thể tải lên hình ảnh +pdfjs-editor-add-signature-image-upload-error-description = Kiểm tra kết nối mạng của bạn hoặc thử hình ảnh khác. +pdfjs-editor-add-signature-image-no-data-error-title = Không thể chuyển đổi hình ảnh này thành chữ ký +pdfjs-editor-add-signature-image-no-data-error-description = Vui lòng thử tải lên một hình ảnh khác. +pdfjs-editor-add-signature-error-close-button = Đóng + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = Hủy bỏ +pdfjs-editor-add-signature-add-button = Thêm +pdfjs-editor-edit-signature-update-button = Cập nhật + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Chỉnh sửa chú thích +pdfjs-editor-edit-comment-popup-button = + .title = Chỉnh sửa chú thích +pdfjs-editor-delete-comment-popup-button-label = Xoá chú thích +pdfjs-editor-delete-comment-popup-button = + .title = Xoá chú thích +pdfjs-show-comment-button = + .title = Hiển thị chú thích + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Chỉnh sửa chú thích +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Cập nhật +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Thêm chú thích +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Thêm +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Bắt đầu nhập… +pdfjs-editor-edit-comment-dialog-cancel-button = Hủy bỏ + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = Thêm chú thích + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = Bật tắt thanh lề (tài liệu bao gồm hình thu nhỏ/phác thảo/tập tin đính kèm/lớp) +pdfjs-toggle-views-manager-button1-label = Quản lý trang +pdfjs-views-manager-sidebar = + .aria-label = Thanh lề +pdfjs-views-manager-sidebar-resizer = + .aria-label = Công cụ điều chỉnh kích thước thanh lề +pdfjs-views-manager-view-selector-button = + .title = Chế độ hiển thị +pdfjs-views-manager-view-selector-button-label = Chế độ hiển thị +pdfjs-views-manager-pages-title = Trang +pdfjs-views-manager-outlines-title1 = Bản phác thảo tài liệu + .title = Bản phác thảo tài liệu (nhấp đúp chuột để mở rộng/thu gọn tất cả các mục) +pdfjs-views-manager-attachments-title = Đính kèm +pdfjs-views-manager-layers-title1 = Lớp + .title = Lớp (nhấp đúp chuột để đặt lại tất cả các lớp về trạng thái mặc định.) +pdfjs-views-manager-pages-option-label = Trang +pdfjs-views-manager-outlines-option-label = Bản phác thảo tài liệu +pdfjs-views-manager-attachments-option-label = Đính kèm +pdfjs-views-manager-layers-option-label = Lớp +pdfjs-views-manager-add-file-button = + .title = Thêm tập tin +pdfjs-views-manager-add-file-button-label = Thêm tập tin +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = { $count } đã chọn +pdfjs-views-manager-pages-status-none-action-label = Chọn trang +pdfjs-views-manager-pages-status-action-button-label = Quản lý +pdfjs-views-manager-pages-status-copy-button-label = Sao chép +pdfjs-views-manager-pages-status-cut-button-label = Cắt +pdfjs-views-manager-pages-status-delete-button-label = Dán +pdfjs-views-manager-pages-status-export-selected-button-label = Xuất các mục đã chọn… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = Đã cắt { $count } trang +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = Đã sao chép { $count } trang +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = Đã xoá { $count } trang +pdfjs-views-manager-pages-status-waiting-ready-label = Đang chuẩn bị tập tin của bạn… +pdfjs-views-manager-pages-status-waiting-uploading-label = Đang tải lên tập tin… +pdfjs-views-manager-status-warning-cut-label = Không thể cắt. Vui lòng làm mới trang và thử lại. +pdfjs-views-manager-status-warning-copy-label = Không thể sao chép. Vui lòng làm mới trang và thử lại. +pdfjs-views-manager-status-warning-delete-label = Không thể xoá. Vui lòng làm mới trang và thử lại. +pdfjs-views-manager-status-warning-save-label = Không thể lưu. Vui lòng làm mới trang và thử lại. +pdfjs-views-manager-status-undo-button-label = Hoàn tác +pdfjs-views-manager-status-done-button-label = Xong +pdfjs-views-manager-status-close-button = + .title = Đóng +pdfjs-views-manager-status-close-button-label = Đóng +pdfjs-views-manager-paste-button-label = Dán +pdfjs-views-manager-paste-button-before = + .title = Dán trước trang đầu +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = Dán sau trang { $page } +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = MỚI +pdfjs-views-manager-waiting-for-file = Đang tải lên tập tin… +pdfjs-toggle-views-manager-button1 = + .title = Quản lý trang + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = Xoá chữ ký đã lưu +pdfjs-editor-delete-signature-button-label1 = Xoá chữ ký đã lưu + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = Chỉnh sửa mô tả + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = Chỉnh sửa mô tả diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/wo/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/wo/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/wo/viewer.ftl 2026-01-20 14:08:39.387689600 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/wo/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -29,24 +29,10 @@ .title = Móol pdfjs-print-button-label = Móol -## Secondary toolbar and context menu - - ## Document properties dialog pdfjs-document-properties-title = Bopp: -## Variables: -## $width (Number) - the width of the (current) page -## $height (Number) - the height of the (current) page -## $unit (String) - the unit of measurement of the (current) page -## $name (String) - the name of the (current) page -## $orientation (String) - the orientation of the (current) page - - -## - - ## Print pdfjs-printing-not-supported = Artu: Joowkat bii nanguwul lool mool. @@ -92,9 +78,6 @@ pdfjs-page-scale-auto = Yambalaŋ ci saa si pdfjs-page-scale-actual = Dayo bi am -## PDF page - - ## Loading indicator messages pdfjs-loading-error = Am na njumte ci yebum dencukaay PDF bi. @@ -115,13 +98,3 @@ pdfjs-password-ok-button = OK pdfjs-password-cancel-button = Neenal - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/xh/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/xh/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/xh/viewer.ftl 2026-01-20 14:08:39.388689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/xh/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -71,37 +71,17 @@ pdfjs-document-properties-button-label = Iipropati zoxwebhu… pdfjs-document-properties-file-name = Igama lefayile: pdfjs-document-properties-file-size = Isayizi yefayile: -# Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB (iibhayiti{ $size_b }) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB (iibhayithi{ $size_b }) pdfjs-document-properties-title = Umxholo: pdfjs-document-properties-author = Umbhali: pdfjs-document-properties-subject = Umbandela: pdfjs-document-properties-keywords = Amagama aphambili: pdfjs-document-properties-creation-date = Umhla wokwenziwa kwayo: pdfjs-document-properties-modification-date = Umhla wokulungiswa kwayo: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } pdfjs-document-properties-creator = Umntu oyenzileyo: pdfjs-document-properties-producer = Umvelisi we-PDF: pdfjs-document-properties-version = Uhlelo lwe-PDF: pdfjs-document-properties-page-count = Inani lamaphepha: -## Variables: -## $width (Number) - the width of the (current) page -## $height (Number) - the height of the (current) page -## $unit (String) - the unit of measurement of the (current) page -## $name (String) - the name of the (current) page -## $orientation (String) - the orientation of the (current) page - - ## pdfjs-document-properties-close-button = Vala @@ -172,9 +152,6 @@ # $scale (Number) - percent value for page scale pdfjs-page-scale-percent = { $scale }% -## PDF page - - ## Loading indicator messages pdfjs-loading-error = Imposiso yenzekile xa kulayishwa i-PDF. @@ -200,13 +177,3 @@ pdfjs-password-ok-button = KULUNGILE pdfjs-password-cancel-button = Rhoxisa pdfjs-web-fonts-disabled = Iifonti zewebhu ziqhwalelisiwe: ayikwazi ukusebenzisa iifonti ze-PDF ezincanyathelisiweyo. - -## Editing - - -## Alt-text dialog - - -## Editor resizers -## This is used in an aria label to help to understand the role of the resizer. - diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/zh-CN/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/zh-CN/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/zh-CN/viewer.ftl 2026-01-20 14:08:39.388689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/zh-CN/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = 当前页面(在当前页面查看 URL) pdfjs-bookmark-button-label = 当前页面 -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = 在应用中打开 -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = 在应用中打开 ## Secondary toolbar and context menu @@ -111,13 +105,13 @@ pdfjs-document-properties-file-name = 文件名: pdfjs-document-properties-file-size = 文件大小: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } 字节) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } 字节) +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB({ $b } 字节) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB({ $b } 字节) pdfjs-document-properties-title = 标题: pdfjs-document-properties-author = 作者: pdfjs-document-properties-subject = 主题: @@ -125,9 +119,8 @@ pdfjs-document-properties-creation-date = 创建日期: pdfjs-document-properties-modification-date = 修改日期: # Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date }, { $time } +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } pdfjs-document-properties-creator = 创建者: pdfjs-document-properties-producer = PDF 生成器: pdfjs-document-properties-version = PDF 版本: @@ -174,10 +167,10 @@ ## Tooltips and alt text for side panel toolbar buttons pdfjs-toggle-sidebar-button = - .title = 切换侧栏 + .title = 打开/关闭侧栏 pdfjs-toggle-sidebar-notification-button = - .title = 切换侧栏(文档所含的大纲/附件/图层) -pdfjs-toggle-sidebar-button-label = 切换侧栏 + .title = 打开/关闭侧栏(文档所含的大纲/附件/图层) +pdfjs-toggle-sidebar-button-label = 打开/关闭侧栏 pdfjs-document-outline-button = .title = 显示文档大纲(双击展开/折叠所有项) pdfjs-document-outline-button-label = 文档大纲 @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = 页面 { $page } 的缩略图 +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = 选择第 { $page } 页 +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = 第 { $page } / { $total } 页 ## Find panel button title and messages @@ -262,10 +264,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date },{ $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -273,6 +271,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } 注释] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -286,9 +287,13 @@ pdfjs-editor-free-text-button = .title = 文本 +pdfjs-editor-color-picker-free-text-input = + .title = 更改文本颜色 pdfjs-editor-free-text-button-label = 文本 pdfjs-editor-ink-button = .title = 绘图 +pdfjs-editor-color-picker-ink-input = + .title = 更改绘图颜色 pdfjs-editor-ink-button-label = 绘图 pdfjs-editor-stamp-button = .title = 添加或编辑图像 @@ -296,12 +301,37 @@ pdfjs-editor-highlight-button = .title = 高亮 pdfjs-editor-highlight-button-label = 高亮 -pdfjs-highlight-floating-button = - .title = 高亮 pdfjs-highlight-floating-button1 = .title = 高亮 .aria-label = 高亮 pdfjs-highlight-floating-button-label = 高亮 +pdfjs-comment-floating-button = + .title = 批注 + .aria-label = 批注 +pdfjs-comment-floating-button-label = 批注 +pdfjs-editor-comment-button = + .title = 批注 + .aria-label = 批注 +pdfjs-editor-comment-button-label = 批注 +pdfjs-editor-signature-button = + .title = 添加签名 +pdfjs-editor-signature-button-label = 添加签名 + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = 高亮编辑器 +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = 绘图编辑器 +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = 签名编辑器:{ $description } +pdfjs-editor-stamp-editor = + .aria-label = 图像编辑器 ## Remove button for the various kind of editor. @@ -313,6 +343,8 @@ .title = 移除图像 pdfjs-editor-remove-highlight-button = .title = 移除高亮 +pdfjs-editor-remove-signature-button = + .title = 移除签名 ## @@ -329,23 +361,41 @@ pdfjs-editor-free-highlight-thickness-input = 粗细 pdfjs-editor-free-highlight-thickness-title = .title = 更改高亮粗细(用于文本以外项目) -pdfjs-free-text = +pdfjs-editor-add-signature-container = + .aria-label = 签名管理和保存的签名 +pdfjs-editor-signature-add-signature-button = + .title = 添加新签名 +pdfjs-editor-signature-add-signature-button-label = 添加新签名 +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = 保存的签名:{ $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = .aria-label = 文本编辑器 -pdfjs-free-text-default-content = 开始输入… -pdfjs-ink = - .aria-label = 绘图编辑器 -pdfjs-ink-canvas = - .aria-label = 用户创建图像 + .default-content = 在此键入… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = 批注 +pdfjs-editor-comments-sidebar-close-button = + .title = 关闭侧栏 + .aria-label = 关闭侧栏 +pdfjs-editor-comments-sidebar-close-button-label = 关闭侧栏 +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = 发现值得注意的地方?可为其添加高亮并批注。 +pdfjs-editor-comments-sidebar-no-comments-link = 详细了解 ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = 替换文字 -pdfjs-editor-alt-text-edit-button-label = 编辑替换文字 +pdfjs-editor-alt-text-edit-button = + .aria-label = 编辑替换文字 pdfjs-editor-alt-text-dialog-label = 选择一项 pdfjs-editor-alt-text-dialog-description = 替换文字可在用户无法看到或加载图像时,描述其内容。 pdfjs-editor-alt-text-add-description-label = 添加描述 -pdfjs-editor-alt-text-add-description-description = 描述主题、背景或动作,长度尽量控制在两句话内。 +pdfjs-editor-alt-text-add-description-description = 用一两个句子,描述主题、背景或动作。 pdfjs-editor-alt-text-mark-decorative-label = 标记为装饰 pdfjs-editor-alt-text-mark-decorative-description = 用于装饰的图像,例如边框和水印。 pdfjs-editor-alt-text-cancel-button = 取消 @@ -354,18 +404,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = 例如:一个少年坐到桌前,准备吃饭 +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = 替换文字 ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = 调整尺寸 - 左上角 -pdfjs-editor-resizer-label-top-middle = 调整尺寸 - 顶部中间 -pdfjs-editor-resizer-label-top-right = 调整尺寸 - 右上角 -pdfjs-editor-resizer-label-middle-right = 调整尺寸 - 右侧中间 -pdfjs-editor-resizer-label-bottom-right = 调整尺寸 - 右下角 -pdfjs-editor-resizer-label-bottom-middle = 调整大小 - 底部中间 -pdfjs-editor-resizer-label-bottom-left = 调整尺寸 - 左下角 -pdfjs-editor-resizer-label-middle-left = 调整尺寸 - 左侧中间 +pdfjs-editor-resizer-top-left = + .aria-label = 调整尺寸 - 左上角 +pdfjs-editor-resizer-top-middle = + .aria-label = 调整尺寸 - 顶部中间 +pdfjs-editor-resizer-top-right = + .aria-label = 调整尺寸 - 右上角 +pdfjs-editor-resizer-middle-right = + .aria-label = 调整尺寸 - 右侧中间 +pdfjs-editor-resizer-bottom-right = + .aria-label = 调整尺寸 - 右下角 +pdfjs-editor-resizer-bottom-middle = + .aria-label = 调整大小 - 底部中间 +pdfjs-editor-resizer-bottom-left = + .aria-label = 调整尺寸 - 左下角 +pdfjs-editor-resizer-middle-left = + .aria-label = 调整尺寸 - 左侧中间 ## Color picker @@ -392,3 +453,263 @@ pdfjs-editor-highlight-show-all-button-label = 显示全部 pdfjs-editor-highlight-show-all-button = .title = 显示全部 + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = 编辑替换文字(图像描述) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = 添加替换文字(图像描述) +pdfjs-editor-new-alt-text-textarea = + .placeholder = 请在此处撰写描述… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = 向无法看到或加载图像的用户提供的简短描述。 +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = 此段替换文字为自动创建,有可能不准确。 +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 详细了解 +pdfjs-editor-new-alt-text-create-automatically-button-label = 自动创建替换文字 +pdfjs-editor-new-alt-text-not-now-button = 暂时不要 +pdfjs-editor-new-alt-text-error-title = 无法自动创建替换文字 +pdfjs-editor-new-alt-text-error-description = 请自行撰写替换文字,或稍后再试。 +pdfjs-editor-new-alt-text-error-close-button = 关闭 +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = 正在下载提供替换文字的 AI 模型({ $downloadedSize }/{ $totalSize } MB) + .aria-valuetext = 正在下载提供替换文字的 AI 模型({ $downloadedSize }/{ $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = 已添加替换文字 +pdfjs-editor-new-alt-text-added-button-label = 已添加替换文字 +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = 缺少替换文字 +pdfjs-editor-new-alt-text-missing-button-label = 缺少替换文字 +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = 检查替换文字 +pdfjs-editor-new-alt-text-to-review-button-label = 检查替换文字 +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = [自动创建] { $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = 图像替换文字设置 +pdfjs-image-alt-text-settings-button-label = 图像替换文字设置 +pdfjs-editor-alt-text-settings-dialog-label = 图像替换文字设置 +pdfjs-editor-alt-text-settings-automatic-title = 自动创建替换文字 +pdfjs-editor-alt-text-settings-create-model-button-label = 自动创建替换文字 +pdfjs-editor-alt-text-settings-create-model-description = 向无法看到或加载图像的用户提供描述。 +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = 提供替换文字的 AI 模型({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = 在您的设备本地运行,可使数据保持私密。自动创建替换文字需要使用此模型。 +pdfjs-editor-alt-text-settings-delete-model-button = 删除 +pdfjs-editor-alt-text-settings-download-model-button = 下载 +pdfjs-editor-alt-text-settings-downloading-model-button = 正在下载… +pdfjs-editor-alt-text-settings-editor-title = 替换文字编辑器 +pdfjs-editor-alt-text-settings-show-dialog-button-label = 添加图像后立即显示替换文字编辑器 +pdfjs-editor-alt-text-settings-show-dialog-description = 帮助确保所有图像均拥有替换文字。 +pdfjs-editor-alt-text-settings-close-button = 关闭 + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = 已添加高亮 +pdfjs-editor-freetext-added-alert = 已添加文本 +pdfjs-editor-ink-added-alert = 已添加绘图 +pdfjs-editor-stamp-added-alert = 已添加图像 +pdfjs-editor-signature-added-alert = 已添加签名 + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = 已移除高亮 +pdfjs-editor-undo-bar-message-freetext = 已移除文本 +pdfjs-editor-undo-bar-message-ink = 已移除绘图 +pdfjs-editor-undo-bar-message-stamp = 已移除图像 +pdfjs-editor-undo-bar-message-signature = 签名已移除 +pdfjs-editor-undo-bar-message-comment = 已移除批注 +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = 已移除 { $count } 条注释 +pdfjs-editor-undo-bar-undo-button = + .title = 撤销 +pdfjs-editor-undo-bar-undo-button-label = 撤销 +pdfjs-editor-undo-bar-close-button = + .title = 关闭 +pdfjs-editor-undo-bar-close-button-label = 关闭 + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = 用户可通过此模态对话框创建要添加到 PDF 文档中的签名、编辑其名称(同时用作替换文字),并可保存签名以便重复使用。 +pdfjs-editor-add-signature-dialog-title = 添加签名 + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = 键入 + .title = 键入 +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = 绘制 + .title = 绘制 +pdfjs-editor-add-signature-image-button = 图像 + .title = 图像 + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = 键入签名 + .placeholder = 键入签名 +pdfjs-editor-add-signature-draw-placeholder = 绘制签名 +pdfjs-editor-add-signature-draw-thickness-range-label = 粗细 +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = 笔画粗细:{ $thickness } +pdfjs-editor-add-signature-image-placeholder = 拖放文件到此处以上传 +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] 或选取图像文件 + *[other] 或浏览图像文件 + } + +## Controls + +pdfjs-editor-add-signature-description-label = 描述(替换文字) +pdfjs-editor-add-signature-description-input = + .title = 描述(替换文字) +pdfjs-editor-add-signature-description-default-when-drawing = 签名 +pdfjs-editor-add-signature-clear-button-label = 清除签名 +pdfjs-editor-add-signature-clear-button = + .title = 清除签名 +pdfjs-editor-add-signature-save-checkbox = 保存签名 +pdfjs-editor-add-signature-save-warning-message = 最多可保存 5 个签名,请移除一个以继续保存。 +pdfjs-editor-add-signature-image-upload-error-title = 无法上传图像 +pdfjs-editor-add-signature-image-upload-error-description = 请检查网络连接,或尝试上传其他图像。 +pdfjs-editor-add-signature-image-no-data-error-title = 无法将此图像转换为签名 +pdfjs-editor-add-signature-image-no-data-error-description = 请尝试上传其他图像。 +pdfjs-editor-add-signature-error-close-button = 关闭 + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = 取消 +pdfjs-editor-add-signature-add-button = 添加 +pdfjs-editor-edit-signature-update-button = 更新 + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = 编辑批注 +pdfjs-editor-edit-comment-popup-button = + .title = 编辑批注 +pdfjs-editor-delete-comment-popup-button-label = 移除批注 +pdfjs-editor-delete-comment-popup-button = + .title = 移除批注 +pdfjs-show-comment-button = + .title = 显示批注 + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = 编辑批注 +pdfjs-editor-edit-comment-dialog-save-button-when-editing = 更新 +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = 添加批注 +pdfjs-editor-edit-comment-dialog-save-button-when-adding = 添加 +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = 开始键入… +pdfjs-editor-edit-comment-dialog-cancel-button = 取消 + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = 添加批注 + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = 打开/关闭侧栏(文档所含的缩略图/大纲/附件/图层) +pdfjs-toggle-views-manager-button1-label = 管理页面 +pdfjs-views-manager-sidebar = + .aria-label = 侧栏 +pdfjs-views-manager-sidebar-resizer = + .aria-label = 调整侧栏大小 +pdfjs-views-manager-view-selector-button = + .title = 视图 +pdfjs-views-manager-view-selector-button-label = 视图 +pdfjs-views-manager-pages-title = 页面 +pdfjs-views-manager-outlines-title1 = 文档大纲 + .title = 文档大纲(双击可展开/折叠所有项目) +pdfjs-views-manager-attachments-title = 附件 +pdfjs-views-manager-layers-title1 = 图层 + .title = 图层(双击可将所有图层重置为默认状态) +pdfjs-views-manager-pages-option-label = 页面 +pdfjs-views-manager-outlines-option-label = 文档大纲 +pdfjs-views-manager-attachments-option-label = 附件 +pdfjs-views-manager-layers-option-label = 图层 +pdfjs-views-manager-add-file-button = + .title = 添加文件 +pdfjs-views-manager-add-file-button-label = 添加文件 +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = 已选择 { $count } 页 +pdfjs-views-manager-pages-status-none-action-label = 选择页面 +pdfjs-views-manager-pages-status-action-button-label = 管理 +pdfjs-views-manager-pages-status-copy-button-label = 复制 +pdfjs-views-manager-pages-status-cut-button-label = 剪切 +pdfjs-views-manager-pages-status-delete-button-label = 删除 +pdfjs-views-manager-pages-status-export-selected-button-label = 导出选中的页面… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = 已剪切 { $count } 页 +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = 已复制 { $count } 页 +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = 已删除 { $count } 页 +pdfjs-views-manager-pages-status-waiting-ready-label = 正在准备文件… +pdfjs-views-manager-pages-status-waiting-uploading-label = 正在上传文件… +pdfjs-views-manager-status-warning-cut-label = 无法剪切,请刷新页面并重试。 +pdfjs-views-manager-status-warning-copy-label = 无法复制,请刷新页面并重试。 +pdfjs-views-manager-status-warning-delete-label = 无法删除,请刷新页面并重试。 +pdfjs-views-manager-status-warning-save-label = 无法保存,请刷新页面并重试。 +pdfjs-views-manager-status-undo-button-label = 撤销 +pdfjs-views-manager-status-done-button-label = 完成 +pdfjs-views-manager-status-close-button = + .title = 关闭 +pdfjs-views-manager-status-close-button-label = 关闭 +pdfjs-views-manager-paste-button-label = 粘贴 +pdfjs-views-manager-paste-button-before = + .title = 粘贴在第一页之前 +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = 粘贴在第 { $page } 页之后 +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = 新 +pdfjs-views-manager-waiting-for-file = 正在上传文件… +pdfjs-toggle-views-manager-button1 = + .title = 管理页面 + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = 移除已保存的签名 +pdfjs-editor-delete-signature-button-label1 = 移除已保存的签名 + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = 编辑描述 + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = 编辑描述 diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/zh-TW/viewer.ftl webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/zh-TW/viewer.ftl --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/locale/zh-TW/viewer.ftl 2026-01-20 14:08:39.388689800 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/locale/zh-TW/viewer.ftl 2026-07-09 07:12:41.860801500 +0000 @@ -51,12 +51,6 @@ pdfjs-bookmark-button = .title = 目前頁面(含目前檢視頁面的網址) pdfjs-bookmark-button-label = 目前頁面 -# Used in Firefox for Android. -pdfjs-open-in-app-button = - .title = 在應用程式中開啟 -# Used in Firefox for Android. -# Length of the translation matters since we are in a mobile context, with limited screen estate. -pdfjs-open-in-app-button-label = 用程式開啟 ## Secondary toolbar and context menu @@ -82,8 +76,8 @@ .title = 開啟頁面移動工具 pdfjs-cursor-hand-tool-button-label = 頁面移動工具 pdfjs-scroll-page-button = - .title = 使用頁面捲動功能 -pdfjs-scroll-page-button-label = 頁面捲動功能 + .title = 使用單頁捲動版面 +pdfjs-scroll-page-button-label = 單頁捲動 pdfjs-scroll-vertical-button = .title = 使用垂直捲動版面 pdfjs-scroll-vertical-button-label = 垂直捲動 @@ -108,31 +102,30 @@ pdfjs-document-properties-button = .title = 文件內容… pdfjs-document-properties-button-label = 文件內容… -pdfjs-document-properties-file-name = 檔案名稱: -pdfjs-document-properties-file-size = 檔案大小: +pdfjs-document-properties-file-name = 檔案名稱: +pdfjs-document-properties-file-size = 檔案大小: # Variables: -# $size_kb (Number) - the PDF file size in kilobytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-kb = { $size_kb } KB({ $size_b } 位元組) -# Variables: -# $size_mb (Number) - the PDF file size in megabytes -# $size_b (Number) - the PDF file size in bytes -pdfjs-document-properties-mb = { $size_mb } MB({ $size_b } 位元組) -pdfjs-document-properties-title = 標題: -pdfjs-document-properties-author = 作者: -pdfjs-document-properties-subject = 主旨: -pdfjs-document-properties-keywords = 關鍵字: -pdfjs-document-properties-creation-date = 建立日期: -pdfjs-document-properties-modification-date = 修改日期: -# Variables: -# $date (Date) - the creation/modification date of the PDF file -# $time (Time) - the creation/modification time of the PDF file -pdfjs-document-properties-date-string = { $date } { $time } -pdfjs-document-properties-creator = 建立者: -pdfjs-document-properties-producer = PDF 產生器: -pdfjs-document-properties-version = PDF 版本: -pdfjs-document-properties-page-count = 頁數: -pdfjs-document-properties-page-size = 頁面大小: +# $kb (Number) - the PDF file size in kilobytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB({ $b } 位元組) +# Variables: +# $mb (Number) - the PDF file size in megabytes +# $b (Number) - the PDF file size in bytes +pdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB({ $b } 位元組) +pdfjs-document-properties-title = 標題: +pdfjs-document-properties-author = 作者: +pdfjs-document-properties-subject = 主旨: +pdfjs-document-properties-keywords = 關鍵字: +pdfjs-document-properties-creation-date = 建立日期: +pdfjs-document-properties-modification-date = 修改日期: +# Variables: +# $dateObj (Date) - the creation/modification date and time of the PDF file +pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } +pdfjs-document-properties-creator = 建立者: +pdfjs-document-properties-producer = PDF 產生器: +pdfjs-document-properties-version = PDF 版本: +pdfjs-document-properties-page-count = 頁數: +pdfjs-document-properties-page-size = 頁面大小: pdfjs-document-properties-page-size-unit-inches = in pdfjs-document-properties-page-size-unit-millimeters = mm pdfjs-document-properties-page-size-orientation-portrait = 垂直 @@ -156,7 +149,7 @@ # The linearization status of the document; usually called "Fast Web View" in # English locales of Adobe software. -pdfjs-document-properties-linearized = 快速 Web 檢視: +pdfjs-document-properties-linearized = 快速 Web 檢視: pdfjs-document-properties-linearized-yes = 是 pdfjs-document-properties-linearized-no = 否 pdfjs-document-properties-close-button = 關閉 @@ -168,8 +161,8 @@ # $progress (Number) - percent value pdfjs-print-progress-percent = { $progress }% pdfjs-print-progress-close-button = 取消 -pdfjs-printing-not-supported = 警告: 此瀏覽器未完整支援列印功能。 -pdfjs-printing-not-ready = 警告: 此 PDF 未完成下載以供列印。 +pdfjs-printing-not-supported = 警告:此瀏覽器未完整支援列印功能。 +pdfjs-printing-not-ready = 警告:此 PDF 未完成下載以供列印。 ## Tooltips and alt text for side panel toolbar buttons @@ -208,6 +201,15 @@ # $page (Number) - the page number pdfjs-thumb-page-canvas = .aria-label = 第 { $page } 頁的縮圖 +# Variables: +# $page (Number) - the page number +pdfjs-thumb-page-checkbox1 = + .title = 選擇第 { $page } 頁 +# Variables: +# $page (Number) - the page number +# $total (Number) - the number of pages +pdfjs-thumb-page-title1 = + .title = 第 { $page } 頁,共 { $total } 頁 ## Find panel button title and messages @@ -262,10 +264,6 @@ ## Annotations -# Variables: -# $date (Date) - the modification date of the annotation -# $time (Time) - the modification time of the annotation -pdfjs-annotation-date-string = { $date } { $time } # .alt: This is used as a tooltip. # Variables: # $type (String) - an annotation type from a list defined in the PDF spec @@ -273,6 +271,9 @@ # Some common types are e.g.: "Check", "Text", "Comment", "Note" pdfjs-text-annotation-type = .alt = [{ $type } 註解] +# Variables: +# $dateObj (Date) - the modification date and time of the annotation +pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") } ## Password @@ -286,9 +287,13 @@ pdfjs-editor-free-text-button = .title = 文字 +pdfjs-editor-color-picker-free-text-input = + .title = 更改文字色彩 pdfjs-editor-free-text-button-label = 文字 pdfjs-editor-ink-button = .title = 繪圖 +pdfjs-editor-color-picker-ink-input = + .title = 更改繪圖色彩 pdfjs-editor-ink-button-label = 繪圖 pdfjs-editor-stamp-button = .title = 新增或編輯圖片 @@ -296,12 +301,37 @@ pdfjs-editor-highlight-button = .title = 強調 pdfjs-editor-highlight-button-label = 強調 -pdfjs-highlight-floating-button = - .title = 強調 pdfjs-highlight-floating-button1 = .title = 強調 .aria-label = 強調 pdfjs-highlight-floating-button-label = 強調 +pdfjs-comment-floating-button = + .title = 註解 + .aria-label = 註解 +pdfjs-comment-floating-button-label = 註解 +pdfjs-editor-comment-button = + .title = 註解 + .aria-label = 註解 +pdfjs-editor-comment-button-label = 註解 +pdfjs-editor-signature-button = + .title = 加入簽章 +pdfjs-editor-signature-button-label = 加入簽章 + +## Default editor aria labels + +# “Highlight” is a noun, the string is used on the editor for highlights. +pdfjs-editor-highlight-editor = + .aria-label = 強調樣式編輯器 +# “Drawing” is a noun, the string is used on the editor for drawings. +pdfjs-editor-ink-editor = + .aria-label = 繪圖編輯器 +# Used when a signature editor is selected/hovered. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-signature-editor1 = + .aria-description = 簽章編輯器:{ $description } +pdfjs-editor-stamp-editor = + .aria-label = 圖片編輯器 ## Remove button for the various kind of editor. @@ -312,7 +342,9 @@ pdfjs-editor-remove-stamp-button = .title = 移除圖片 pdfjs-editor-remove-highlight-button = - .title = 移除強調範圍 + .title = 移除選擇範圍的強調效果 +pdfjs-editor-remove-signature-button = + .title = 移除簽章 ## @@ -329,19 +361,37 @@ pdfjs-editor-free-highlight-thickness-input = 線條粗細 pdfjs-editor-free-highlight-thickness-title = .title = 更改強調文字以外的項目時的線條粗細 -pdfjs-free-text = - .aria-label = 文本編輯器 -pdfjs-free-text-default-content = 開始打字… -pdfjs-ink = - .aria-label = 圖形編輯器 -pdfjs-ink-canvas = - .aria-label = 使用者建立的圖片 +pdfjs-editor-add-signature-container = + .aria-label = 簽章控制元件與儲存的簽章 +pdfjs-editor-signature-add-signature-button = + .title = 新增簽章 +pdfjs-editor-signature-add-signature-button-label = 新增簽章 +# Used on the button to use an already saved signature. +# Variables: +# $description (String) - a string describing/labeling the signature. +pdfjs-editor-add-saved-signature-button = + .title = 已儲存簽章:{ $description } +# .default-content is used as a placeholder in an empty text editor. +pdfjs-free-text2 = + .aria-label = 文字編輯器 + .default-content = 請打字… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = 註解 +pdfjs-editor-comments-sidebar-close-button = + .title = 關閉側邊欄 + .aria-label = 關閉側邊欄 +pdfjs-editor-comments-sidebar-close-button-label = 關閉側邊欄 +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = 想把哪個部分記下來?可以畫螢光強調,並且留下註解。 +pdfjs-editor-comments-sidebar-no-comments-link = 更多資訊 ## Alt-text dialog -# Alternative text (alt text) helps when people can't see the image. pdfjs-editor-alt-text-button-label = 替代文字 -pdfjs-editor-alt-text-edit-button-label = 編輯替代文字 +pdfjs-editor-alt-text-edit-button = + .aria-label = 編輯替代文字 pdfjs-editor-alt-text-dialog-label = 挑選一種 pdfjs-editor-alt-text-dialog-description = 替代文字可協助盲人,或於圖片無法載入時提供說明。 pdfjs-editor-alt-text-add-description-label = 新增描述 @@ -354,18 +404,29 @@ # .placeholder: This is a placeholder for the alt text input area pdfjs-editor-alt-text-textarea = .placeholder = 例如:「有一位年輕男人坐在桌子前面吃飯」 +# Alternative text (alt text) helps when people can't see the image. +pdfjs-editor-alt-text-button = + .aria-label = 替代文字 ## Editor resizers ## This is used in an aria label to help to understand the role of the resizer. -pdfjs-editor-resizer-label-top-left = 左上角 — 調整大小 -pdfjs-editor-resizer-label-top-middle = 頂部中間 — 調整大小 -pdfjs-editor-resizer-label-top-right = 右上角 — 調整大小 -pdfjs-editor-resizer-label-middle-right = 中間右方 — 調整大小 -pdfjs-editor-resizer-label-bottom-right = 右下角 — 調整大小 -pdfjs-editor-resizer-label-bottom-middle = 底部中間 — 調整大小 -pdfjs-editor-resizer-label-bottom-left = 左下角 — 調整大小 -pdfjs-editor-resizer-label-middle-left = 中間左方 — 調整大小 +pdfjs-editor-resizer-top-left = + .aria-label = 左上角 — 調整大小 +pdfjs-editor-resizer-top-middle = + .aria-label = 頂部中間 — 調整大小 +pdfjs-editor-resizer-top-right = + .aria-label = 右上角 — 調整大小 +pdfjs-editor-resizer-middle-right = + .aria-label = 中間右方 — 調整大小 +pdfjs-editor-resizer-bottom-right = + .aria-label = 右下角 — 調整大小 +pdfjs-editor-resizer-bottom-middle = + .aria-label = 底部中間 — 調整大小 +pdfjs-editor-resizer-bottom-left = + .aria-label = 左下角 — 調整大小 +pdfjs-editor-resizer-middle-left = + .aria-label = 中間左方 — 調整大小 ## Color picker @@ -392,3 +453,263 @@ pdfjs-editor-highlight-show-all-button-label = 顯示全部 pdfjs-editor-highlight-show-all-button = .title = 顯示全部 + +## New alt-text dialog +## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy. + +# Modal header positioned above a text box where users can edit the alt text. +pdfjs-editor-new-alt-text-dialog-edit-label = 編輯替代文字(圖片描述) +# Modal header positioned above a text box where users can add the alt text. +pdfjs-editor-new-alt-text-dialog-add-label = 新增替代文字(圖片描述) +pdfjs-editor-new-alt-text-textarea = + .placeholder = 在此寫下您的描述文字… +# This text refers to the alt text box above this description. It offers a definition of alt text. +pdfjs-editor-new-alt-text-description = 為看不到圖片的讀者,或圖片無法載入時顯示的簡短描述。 +# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human. +pdfjs-editor-new-alt-text-disclaimer1 = 此替代文字是自動產生的,可能不夠精確。 +pdfjs-editor-new-alt-text-disclaimer-learn-more-url = 更多資訊 +pdfjs-editor-new-alt-text-create-automatically-button-label = 自動產生替代文字 +pdfjs-editor-new-alt-text-not-now-button = 暫時不要 +pdfjs-editor-new-alt-text-error-title = 無法自動產生替代文字 +pdfjs-editor-new-alt-text-error-description = 請自行填寫替代文字,或稍後再試一次。 +pdfjs-editor-new-alt-text-error-close-button = 關閉 +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +# $downloadedSize (Number) - the downloaded size (in MB) of the AI model. +pdfjs-editor-new-alt-text-ai-model-downloading-progress = 正在下載替代文字 AI 模型({ $downloadedSize } / { $totalSize } MB) + .aria-valuetext = 正在下載替代文字 AI 模型({ $downloadedSize } / { $totalSize } MB) +# This is a button that users can click to edit the alt text they have already added. +pdfjs-editor-new-alt-text-added-button = + .aria-label = 已新增替代文字 +pdfjs-editor-new-alt-text-added-button-label = 已新增替代文字 +# This is a button that users can click to open the alt text editor and add alt text when it is not present. +pdfjs-editor-new-alt-text-missing-button = + .aria-label = 缺少替代文字 +pdfjs-editor-new-alt-text-missing-button-label = 缺少替代文字 +# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated. +pdfjs-editor-new-alt-text-to-review-button = + .aria-label = 確認替代文字 +pdfjs-editor-new-alt-text-to-review-button-label = 確認替代文字 +# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear. +# Variables: +# $generatedAltText (String) - the generated alt-text. +pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = 自動產生:{ $generatedAltText } + +## Image alt-text settings + +pdfjs-image-alt-text-settings-button = + .title = 圖片替代文字設定 +pdfjs-image-alt-text-settings-button-label = 圖片替代文字設定 +pdfjs-editor-alt-text-settings-dialog-label = 圖片替代文字設定 +pdfjs-editor-alt-text-settings-automatic-title = 自動化替代文字 +pdfjs-editor-alt-text-settings-create-model-button-label = 自動產生替代文字 +pdfjs-editor-alt-text-settings-create-model-description = 為您建議圖片描述,幫助看不到圖片的讀者,或於圖片無法載入時顯示。 +# Variables: +# $totalSize (Number) - the total size (in MB) of the AI model. +pdfjs-editor-alt-text-settings-download-model-label = 替代文字 AI 模型({ $totalSize } MB) +pdfjs-editor-alt-text-settings-ai-model-description = 在您的本機裝置上運作,以確保您的資料隱私。必須下載此模型才可以自動產生替代文字。 +pdfjs-editor-alt-text-settings-delete-model-button = 刪除 +pdfjs-editor-alt-text-settings-download-model-button = 下載 +pdfjs-editor-alt-text-settings-downloading-model-button = 下載中… +pdfjs-editor-alt-text-settings-editor-title = 替代文字編輯器 +pdfjs-editor-alt-text-settings-show-dialog-button-label = 新增圖片後立即顯示替代文字編輯器 +pdfjs-editor-alt-text-settings-show-dialog-description = 幫助您確保所有圖片都有替代文字。 +pdfjs-editor-alt-text-settings-close-button = 關閉 + +## Accessibility labels (announced by screen readers) for objects added to the editor. + +pdfjs-editor-highlight-added-alert = 已加入強調範圍 +pdfjs-editor-freetext-added-alert = 已加入文字 +pdfjs-editor-ink-added-alert = 已新增繪圖 +pdfjs-editor-stamp-added-alert = 已新增圖片 +pdfjs-editor-signature-added-alert = 已新增簽章 + +## "Annotations removed" bar + +pdfjs-editor-undo-bar-message-highlight = 已移除強調 +pdfjs-editor-undo-bar-message-freetext = 已移除文字 +pdfjs-editor-undo-bar-message-ink = 已移除繪圖 +pdfjs-editor-undo-bar-message-stamp = 已移除圖片 +pdfjs-editor-undo-bar-message-signature = 已移除簽章 +pdfjs-editor-undo-bar-message-comment = 已移除註解 +# Variables: +# $count (Number) - the number of removed annotations. +pdfjs-editor-undo-bar-message-multiple = 已移除 { $count } 筆註解 +pdfjs-editor-undo-bar-undo-button = + .title = 還原 +pdfjs-editor-undo-bar-undo-button-label = 還原 +pdfjs-editor-undo-bar-close-button = + .title = 關閉 +pdfjs-editor-undo-bar-close-button-label = 關閉 + +## Add a signature dialog + +pdfjs-editor-add-signature-dialog-label = 此對話框讓使用者能夠建立簽章以加入 PDF 文件。使用者可以編輯他們的姓名(同時也是替代文字),並選擇性儲存簽章,以供未來重複使用。 +pdfjs-editor-add-signature-dialog-title = 加入簽章 + +## Tab names + +# Type is a verb (you can type your name as signature) +pdfjs-editor-add-signature-type-button = 打字 + .title = 打字 +# Draw is a verb (you can draw your signature) +pdfjs-editor-add-signature-draw-button = 手繪 + .title = 手繪 +pdfjs-editor-add-signature-image-button = 圖片 + .title = 圖片 + +## Tab panels + +pdfjs-editor-add-signature-type-input = + .aria-label = 輸入簽章 + .placeholder = 輸入簽章 +pdfjs-editor-add-signature-draw-placeholder = 手繪簽章 +pdfjs-editor-add-signature-draw-thickness-range-label = 線條粗細 +# Variables: +# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature. +pdfjs-editor-add-signature-draw-thickness-range = + .title = 繪製時的線條粗細:{ $thickness } +pdfjs-editor-add-signature-image-placeholder = 將檔案拖曳到此處即可上傳 +pdfjs-editor-add-signature-image-browse-link = + { PLATFORM() -> + [macos] 或選擇圖片檔案 + *[other] 或瀏覽圖片檔案 + } + +## Controls + +pdfjs-editor-add-signature-description-label = 描述(替代文字) +pdfjs-editor-add-signature-description-input = + .title = 描述(替代文字) +pdfjs-editor-add-signature-description-default-when-drawing = 簽章 +pdfjs-editor-add-signature-clear-button-label = 清除簽章 +pdfjs-editor-add-signature-clear-button = + .title = 清除簽章 +pdfjs-editor-add-signature-save-checkbox = 儲存簽章 +pdfjs-editor-add-signature-save-warning-message = 您已經儲存 5 式簽章,請移除任一式才能再新增。 +pdfjs-editor-add-signature-image-upload-error-title = 無法上傳圖片 +pdfjs-editor-add-signature-image-upload-error-description = 請檢查您的網路連線,或改用其他圖片。 +pdfjs-editor-add-signature-image-no-data-error-title = 無法將此圖片轉換成簽章 +pdfjs-editor-add-signature-image-no-data-error-description = 請試著上傳另一張圖片。 +pdfjs-editor-add-signature-error-close-button = 關閉 + +## Dialog buttons + +pdfjs-editor-add-signature-cancel-button = 取消 +pdfjs-editor-add-signature-add-button = 新增 +pdfjs-editor-edit-signature-update-button = 更新 + +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = 編輯註解 +pdfjs-editor-edit-comment-popup-button = + .title = 編輯註解 +pdfjs-editor-delete-comment-popup-button-label = 移除註解 +pdfjs-editor-delete-comment-popup-button = + .title = 移除註解 +pdfjs-show-comment-button = + .title = 顯示註解 + +## Edit a comment dialog + +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = 編輯註解 +pdfjs-editor-edit-comment-dialog-save-button-when-editing = 更新 +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = 新增註解 +pdfjs-editor-edit-comment-dialog-save-button-when-adding = 新增 +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = 在此打字… +pdfjs-editor-edit-comment-dialog-cancel-button = 取消 + +## Edit a comment button in the editor toolbar + +pdfjs-editor-add-comment-button = + .title = 新增註解 + +## The view manager is a sidebar displaying different views: +## - thumbnails; +## - outline; +## - attachments; +## - layers. +## The thumbnails view is used to edit the pdf: remove/insert pages, ... + +pdfjs-toggle-views-manager-notification-button = + .title = 切換側邊欄(包含縮圖、大綱、附件、圖層的文件) +pdfjs-toggle-views-manager-button1-label = 管理頁面 +pdfjs-views-manager-sidebar = + .aria-label = 側邊欄 +pdfjs-views-manager-sidebar-resizer = + .aria-label = 調整側邊欄大小 +pdfjs-views-manager-view-selector-button = + .title = 畫面 +pdfjs-views-manager-view-selector-button-label = 畫面 +pdfjs-views-manager-pages-title = 頁面 +pdfjs-views-manager-outlines-title1 = 文件大綱 + .title = 文件大綱(點兩下即可展開/摺疊所有項目) +pdfjs-views-manager-attachments-title = 附件 +pdfjs-views-manager-layers-title1 = 圖層 + .title = 圖層(點兩下即可將所有圖層重設回預設狀態) +pdfjs-views-manager-pages-option-label = 頁面 +pdfjs-views-manager-outlines-option-label = 文件大綱 +pdfjs-views-manager-attachments-option-label = 附件 +pdfjs-views-manager-layers-option-label = 圖層 +pdfjs-views-manager-add-file-button = + .title = 新增檔案 +pdfjs-views-manager-add-file-button-label = 新增檔案 +# Variables: +# $count (Number) - the number of selected pages. +pdfjs-views-manager-pages-status-action-label = 已選擇 { $count } 頁 +pdfjs-views-manager-pages-status-none-action-label = 選擇頁面 +pdfjs-views-manager-pages-status-action-button-label = 管理 +pdfjs-views-manager-pages-status-copy-button-label = 複製 +pdfjs-views-manager-pages-status-cut-button-label = 剪下 +pdfjs-views-manager-pages-status-delete-button-label = 刪除 +pdfjs-views-manager-pages-status-export-selected-button-label = 匯出選擇項目… +# Variables: +# $count (Number) - the number of selected pages to be cut. +pdfjs-views-manager-status-undo-cut-label = 已剪下 { $count } 頁 +# Variables: +# $count (Number) - the number of selected pages to be copied. +pdfjs-views-manager-pages-status-undo-copy-label = 已複製 { $count } 頁 +# Variables: +# $count (Number) - the number of selected pages to be deleted. +pdfjs-views-manager-pages-status-undo-delete-label = 已刪除 { $count } 頁 +pdfjs-views-manager-pages-status-waiting-ready-label = 正在準備您的檔案… +pdfjs-views-manager-pages-status-waiting-uploading-label = 正在上傳檔案… +pdfjs-views-manager-status-warning-cut-label = 無法剪下頁面,請重新整理頁面後再試一次。 +pdfjs-views-manager-status-warning-copy-label = 無法複製頁面,請重新整理頁面後再試一次。 +pdfjs-views-manager-status-warning-delete-label = 無法刪除頁面,請重新整理頁面後再試一次。 +pdfjs-views-manager-status-warning-save-label = 無法儲存頁面,請重新整理頁面後再試一次。 +pdfjs-views-manager-status-undo-button-label = 還原 +pdfjs-views-manager-status-done-button-label = 完成 +pdfjs-views-manager-status-close-button = + .title = 關閉 +pdfjs-views-manager-status-close-button-label = 關閉 +pdfjs-views-manager-paste-button-label = 貼上 +pdfjs-views-manager-paste-button-before = + .title = 貼到第一頁前 +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after = + .title = 貼到第 { $page } 頁後 +# Badge used to promote a new feature in the UI, keep it as short as possible. +# It's spelled uppercase for English, but it can be translated as usual. +pdfjs-new-badge-content = 新功能 +pdfjs-views-manager-waiting-for-file = 正在上傳檔案… +pdfjs-toggle-views-manager-button1 = + .title = 管理頁面 + +## Main menu for adding/removing signatures + +pdfjs-editor-delete-signature-button1 = + .title = 移除儲存的簽章 +pdfjs-editor-delete-signature-button-label1 = 移除儲存的簽章 + +## Editor toolbar + +pdfjs-editor-add-signature-edit-button-label = 編輯描述 + +## Edit signature description dialog + +pdfjs-editor-edit-signature-dialog-title = 編輯描述 diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/viewer.css webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/viewer.css --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/viewer.css 2026-01-20 14:08:39.398689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/viewer.css 2026-07-09 07:12:41.860801500 +0000 @@ -13,121 +13,772 @@ * limitations under the License. */ +.messageBar{ + --closing-button-icon:url(images/messageBar_closingButton.svg); + --message-bar-close-button-color:var(--text-primary-color); + --message-bar-close-button-color-hover:var(--text-primary-color); + --message-bar-close-button-border-radius:4px; + --message-bar-close-button-border:none; + --message-bar-close-button-hover-bg-color:light-dark( + rgb(21 20 26 / 0.14), + rgb(251 251 254 / 0.14) + ); + --message-bar-close-button-active-bg-color:light-dark( + rgb(21 20 26 / 0.21), + rgb(251 251 254 / 0.21) + ); + --message-bar-close-button-focus-bg-color:light-dark( + rgb(21 20 26 / 0.07), + rgb(251 251 254 / 0.07) + ); + + @media screen and (forced-colors: active){ + --message-bar-close-button-color:ButtonText; + --message-bar-close-button-border:1px solid ButtonText; + --message-bar-close-button-hover-bg-color:ButtonText; + --message-bar-close-button-active-bg-color:ButtonText; + --message-bar-close-button-focus-bg-color:ButtonText; + --message-bar-close-button-color-hover:HighlightText; + } + + display:flex; + position:relative; + padding:8px 8px 8px 16px; + flex-direction:column; + justify-content:center; + align-items:center; + gap:8px; + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + + border-radius:4px; + + border:1px solid var(--message-bar-border-color); + background:var(--message-bar-bg-color); + color:var(--message-bar-fg-color); + + > div{ + display:flex; + align-items:flex-start; + gap:8px; + align-self:stretch; + + &::before{ + content:""; + display:inline-block; + width:16px; + height:16px; + -webkit-mask-image:var(--message-bar-icon); + mask-image:var(--message-bar-icon); + -webkit-mask-size:cover; + mask-size:cover; + background-color:var(--message-bar-icon-color); + flex-shrink:0; + } + } + + button{ + cursor:pointer; + + &:focus-visible{ + outline:var(--focus-ring-outline); + outline-offset:2px; + } + } + + .closeButton{ + width:32px; + height:32px; + background:none; + border-radius:var(--message-bar-close-button-border-radius); + border:var(--message-bar-close-button-border); + + display:flex; + align-items:center; + justify-content:center; + + &::before{ + content:""; + display:inline-block; + width:16px; + height:16px; + -webkit-mask-image:var(--closing-button-icon); + mask-image:var(--closing-button-icon); + -webkit-mask-size:cover; + mask-size:cover; + background-color:var(--message-bar-close-button-color); + } + + &:is(:hover, :active, :focus)::before{ + background-color:var(--message-bar-close-button-color-hover); + } + + &:hover{ + background-color:var(--message-bar-close-button-hover-bg-color); + } + + &:active{ + background-color:var(--message-bar-close-button-active-bg-color); + } + + &:focus{ + background-color:var(--message-bar-close-button-focus-bg-color); + } + + > span{ + display:inline-block; + width:0; + height:0; + overflow:hidden; + } + } +} + +#editorUndoBar{ + --text-primary-color:light-dark(#15141a, #fbfbfe); + + --message-bar-icon:url(images/messageBar_info.svg); + --message-bar-icon-color:light-dark(#0060df, #73a7f3); + --message-bar-bg-color:light-dark(#deeafc, #003070); + --message-bar-fg-color:var(--text-primary-color); + --message-bar-border-color:light-dark( + rgb(0 0 0 / 0.08), + rgb(255 255 255 / 0.08) + ); + + --undo-button-bg-color:light-dark( + rgb(21 20 26 / 0.07), + rgb(255 255 255 / 0.08) + ); + --undo-button-bg-color-hover:light-dark( + rgb(21 20 26 / 0.14), + rgb(255 255 255 / 0.14) + ); + --undo-button-bg-color-active:light-dark( + rgb(21 20 26 / 0.21), + rgb(255 255 255 / 0.21) + ); + + --undo-button-border:1px solid light-dark(#0060df, #0df); + + --undo-button-fg-color:var(--message-bar-fg-color); + --undo-button-fg-color-hover:var(--undo-button-fg-color); + --undo-button-fg-color-active:var(--undo-button-fg-color); + + @media screen and (forced-colors: active){ + --text-primary-color:CanvasText; + + --message-bar-icon-color:CanvasText; + --message-bar-bg-color:Canvas; + --message-bar-border-color:CanvasText; + + --undo-button-bg-color:ButtonText; + --undo-button-bg-color-hover:SelectedItem; + --undo-button-bg-color-active:SelectedItem; + + --undo-button-fg-color:ButtonFace; + --undo-button-fg-color-hover:SelectedItemText; + --undo-button-fg-color-active:SelectedItemText; + + --undo-button-border:none; + } + + position:fixed; + top:50px; + left:50%; + transform:translateX(-50%); + z-index:10; + + padding-block:8px; + padding-inline:16px 8px; + + font:menu; + font-size:15px; + + cursor:default; + + button{ + cursor:pointer; + } + + #editorUndoBarUndoButton{ + border-radius:4px; + font-weight:590; + line-height:19.5px; + color:var(--undo-button-fg-color); + border:var(--undo-button-border); + padding:4px 16px; + margin-inline-start:8px; + height:32px; + + background-color:var(--undo-button-bg-color); + + &:hover{ + background-color:var(--undo-button-bg-color-hover); + color:var(--undo-button-fg-color-hover); + } + + &:active{ + background-color:var(--undo-button-bg-color-active); + color:var(--undo-button-fg-color-active); + } + } + + > div{ + align-items:center; + } +} + +.dialog{ + --dialog-bg-color:light-dark(white, #1c1b22); + --dialog-border-color:light-dark(white, #1c1b22); + --dialog-shadow:0 2px 14px 0 light-dark(rgb(58 57 68 / 0.2), #15141a); + --text-primary-color:light-dark(#15141a, #fbfbfe); + --text-secondary-color:light-dark(#5b5b66, #cfcfd8); + --hover-filter:brightness(0.9); + --link-fg-color:light-dark(#0060df, #0df); + --link-hover-fg-color:light-dark(#0250bb, #80ebff); + --separator-color:light-dark(#f0f0f4, #52525e); + + --textarea-border-color:#8f8f9d; + --textarea-bg-color:light-dark(white, #42414d); + --textarea-fg-color:var(--text-secondary-color); + + --radio-bg-color:light-dark(#f0f0f4, #2b2a33); + --radio-checked-bg-color:light-dark(#fbfbfe, #15141a); + --radio-border-color:#8f8f9d; + --radio-checked-border-color:light-dark(#0060df, #0df); + + --button-secondary-bg-color:light-dark( + rgb(21 20 26 / 0.07), + rgb(251 251 254 / 0.07) + ); + --button-secondary-fg-color:var(--text-primary-color); + --button-secondary-border-color:var(--button-secondary-bg-color); + --button-secondary-active-bg-color:light-dark( + rgb(21 20 26 / 0.21), + rgb(251 251 254 / 0.21) + ); + --button-secondary-active-fg-color:var(--button-secondary-fg-color); + --button-secondary-active-border-color:var(--button-secondary-bg-color); + --button-secondary-hover-bg-color:light-dark( + rgb(21 20 26 / 0.14), + rgb(251 251 254 / 0.14) + ); + --button-secondary-hover-fg-color:var(--button-secondary-fg-color); + --button-secondary-hover-border-color:var(--button-secondary-hover-bg-color); + --button-secondary-disabled-bg-color:var(--button-secondary-bg-color); + --button-secondary-disabled-border-color:var( + --button-secondary-border-color + ); + --button-secondary-disabled-fg-color:var(--button-secondary-fg-color); + + --button-primary-bg-color:light-dark(#0060df, #0df); + --button-primary-fg-color:light-dark(#fbfbfe, #15141a); + --button-primary-border-color:var(--button-primary-bg-color); + --button-primary-active-bg-color:light-dark(#054096, #aaf2ff); + --button-primary-active-fg-color:var(--button-primary-fg-color); + --button-primary-active-border-color:var(--button-primary-active-bg-color); + --button-primary-hover-bg-color:light-dark(#0250bb, #80ebff); + --button-primary-hover-fg-color:var(--button-primary-fg-color); + --button-primary-hover-border-color:var(--button-primary-hover-bg-color); + --button-primary-disabled-bg-color:var(--button-primary-bg-color); + --button-primary-disabled-border-color:var(--button-primary-border-color); + --button-primary-disabled-fg-color:var(--button-primary-fg-color); + --button-disabled-opacity:0.4; + + --input-text-bg-color:light-dark(white, #42414d); + --input-text-fg-color:var(--text-primary-color); + + @media (prefers-color-scheme: dark){ + --hover-filter:brightness(1.4); + --button-disabled-opacity:0.6; + } + + @media screen and (forced-colors: active){ + --dialog-bg-color:Canvas; + --dialog-border-color:CanvasText; + --dialog-shadow:none; + --text-primary-color:CanvasText; + --text-secondary-color:CanvasText; + --hover-filter:none; + --link-fg-color:LinkText; + --link-hover-fg-color:LinkText; + --separator-color:CanvasText; + + --textarea-border-color:ButtonBorder; + --textarea-bg-color:Field; + --textarea-fg-color:ButtonText; + + --radio-bg-color:ButtonFace; + --radio-checked-bg-color:ButtonFace; + --radio-border-color:ButtonText; + --radio-checked-border-color:ButtonText; + + --button-secondary-bg-color:ButtonFace; + --button-secondary-fg-color:ButtonText; + --button-secondary-border-color:ButtonText; + --button-secondary-active-bg-color:HighlightText; + --button-secondary-active-fg-color:SelectedItem; + --button-secondary-active-border-color:ButtonText; + --button-secondary-hover-bg-color:HighlightText; + --button-secondary-hover-fg-color:SelectedItem; + --button-secondary-hover-border-color:SelectedItem; + --button-secondary-disabled-fg-color:GrayText; + --button-secondary-disabled-border-color:GrayText; + + --button-primary-bg-color:ButtonText; + --button-primary-fg-color:ButtonFace; + --button-primary-border-color:ButtonText; + --button-primary-active-bg-color:SelectedItem; + --button-primary-active-fg-color:HighlightText; + --button-primary-active-border-color:ButtonText; + --button-primary-hover-bg-color:SelectedItem; + --button-primary-hover-fg-color:HighlightText; + --button-primary-hover-border-color:SelectedItem; + --button-primary-disabled-bg-color:GrayText; + --button-primary-disabled-fg-color:ButtonFace; + --button-primary-disabled-border-color:GrayText; + --button-disabled-opacity:1; + + --input-text-bg-color:Field; + --input-text-fg-color:FieldText; + } + + font:message-box; + font-size:13px; + font-weight:400; + line-height:150%; + border-radius:4px; + padding:12px 16px; + border:1px solid var(--dialog-border-color); + background:var(--dialog-bg-color); + color:var(--text-primary-color); + box-shadow:var(--dialog-shadow); + + .mainContainer{ + *:focus-visible{ + outline:var(--focus-ring-outline); + outline-offset:2px; + } + + .title{ + display:flex; + width:auto; + flex-direction:column; + justify-content:flex-end; + align-items:flex-start; + gap:12px; + + > span{ + font-size:13px; + font-style:normal; + font-weight:590; + line-height:150%; + } + } + + .dialogSeparator{ + width:100%; + height:0; + margin-block:4px; + border-top:1px solid var(--separator-color); + border-bottom:none; + } + + .dialogButtonsGroup{ + display:flex; + gap:12px; + align-self:flex-end; + } + + .radio{ + display:flex; + flex-direction:column; + align-items:flex-start; + gap:4px; + + > .radioButton{ + display:flex; + gap:8px; + align-self:stretch; + align-items:center; + + input{ + -webkit-appearance:none; + -moz-appearance:none; + appearance:none; + box-sizing:border-box; + width:16px; + height:16px; + border-radius:50%; + background-color:var(--radio-bg-color); + border:1px solid var(--radio-border-color); + + &:hover{ + filter:var(--hover-filter); + } + + &:checked{ + background-color:var(--radio-checked-bg-color); + border:4px solid var(--radio-checked-border-color); + } + } + } + + > .radioLabel{ + display:flex; + padding-inline-start:24px; + align-items:flex-start; + gap:10px; + align-self:stretch; + + > span{ + flex:1 0 0; + font-size:11px; + color:var(--text-secondary-color); + } + } + } + + button:not(:is(.toggle-button, .closeButton, .clearInputButton)){ + border-radius:4px; + border:1px solid; + font:menu; + font-weight:590; + font-size:13px; + padding:4px 16px; + width:auto; + height:32px; + + &:hover{ + cursor:pointer; + filter:var(--hover-filter); + } + + > span{ + color:inherit; + font:inherit; + } + + &.secondaryButton{ + color:var(--button-secondary-fg-color); + background-color:var(--button-secondary-bg-color); + border-color:var(--button-secondary-border-color); + + &:hover{ + color:var(--button-secondary-hover-fg-color); + background-color:var(--button-secondary-hover-bg-color); + border-color:var(--button-secondary-hover-border-color); + } + + &:active{ + color:var(--button-secondary-active-fg-color); + background-color:var(--button-secondary-active-bg-color); + border-color:var(--button-secondary-active-border-color); + } + + &:disabled{ + background-color:var(--button-secondary-disabled-bg-color); + border-color:var(--button-secondary-disabled-border-color); + color:var(--button-secondary-disabled-fg-color); + opacity:var(--button-disabled-opacity); + } + } + + &.primaryButton{ + color:var(--button-primary-fg-color); + background-color:var(--button-primary-bg-color); + border-color:var(--button-primary-border-color); + opacity:1; + + &:hover{ + color:var(--button-primary-hover-fg-color); + background-color:var(--button-primary-hover-bg-color); + border-color:var(--button-primary-hover-border-color); + } + + &:active{ + color:var(--button-primary-active-fg-color); + background-color:var(--button-primary-active-bg-color); + border-color:var(--button-primary-active-border-color); + } + + &:disabled{ + background-color:var(--button-primary-disabled-bg-color); + border-color:var(--button-primary-disabled-border-color); + color:var(--button-primary-disabled-fg-color); + opacity:var(--button-disabled-opacity); + } + } + + &:disabled{ + pointer-events:none; + } + } + + a{ + color:var(--link-fg-color); + + &:hover{ + color:var(--link-hover-fg-color); + } + } + + textarea{ + font:inherit; + padding:8px; + resize:none; + margin:0; + box-sizing:border-box; + border-radius:4px; + border:1px solid var(--textarea-border-color); + background:var(--textarea-bg-color); + color:var(--textarea-fg-color); + + &:focus{ + outline-offset:0; + border-color:transparent; + } + + &:disabled{ + pointer-events:none; + opacity:0.4; + } + } + + input[type="text"]{ + background-color:var(--input-text-bg-color); + color:var(--input-text-fg-color); + } + + .messageBar{ + --message-bar-bg-color:light-dark(#ffebcd, #5a3100); + --message-bar-fg-color:light-dark(#15141a, #fbfbfe); + --message-bar-border-color:light-dark( + rgb(0 0 0 / 0.08), + rgb(255 255 255 / 0.08) + ); + --message-bar-icon:url(images/messageBar_warning.svg); + --message-bar-icon-color:light-dark(#cd411e, #e49c49); + + @media screen and (forced-colors: active){ + --message-bar-bg-color:HighlightText; + --message-bar-fg-color:CanvasText; + --message-bar-border-color:CanvasText; + --message-bar-icon-color:CanvasText; + } + + align-self:stretch; + + > div{ + &::before, + > div{ + margin-block:4px; + } + + > div{ + display:flex; + flex-direction:column; + align-items:flex-start; + gap:8px; + flex:1 0 0; + + .title{ + font-size:13px; + font-weight:590; + } + + .description{ + font-size:13px; + } + } + } + } + + .toggler{ + display:flex; + align-items:center; + gap:8px; + align-self:stretch; + + > .togglerLabel{ + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + } + } + } +} + .textLayer{ + color-scheme:only light; + position:absolute; text-align:initial; inset:0; - overflow:hidden; + overflow:clip; opacity:1; line-height:1; + letter-spacing:normal; + word-spacing:normal; -webkit-text-size-adjust:none; -moz-text-size-adjust:none; text-size-adjust:none; forced-color-adjust:none; transform-origin:0 0; caret-color:CanvasText; -} + z-index:0; -.textLayer.highlighting{ + &.highlighting{ touch-action:none; } -.textLayer :is(span, br){ + :is(span, br){ color:transparent; position:absolute; white-space:pre; cursor:text; transform-origin:0% 0%; + -webkit-user-select:text; + -moz-user-select:text; + user-select:text; + } + --min-font-size:1; + --text-scale-factor:calc(var(--total-scale-factor) * var(--min-font-size)); + --min-font-size-inv:calc(1 / var(--min-font-size)); + + > :not(.markedContent), + .markedContent span:not(.markedContent){ + z-index:1; + + --font-height:0; + font-size:calc(var(--text-scale-factor) * var(--font-height)); + + --scale-x:1; + --rotate:0deg; + transform:rotate(var(--rotate)) scaleX(var(--scale-x)) scale(var(--min-font-size-inv)); } -.textLayer span.markedContent{ - top:0; - height:0; + .markedContent{ + display:contents; + } + + span[role="img"]{ + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + cursor:default; } -.textLayer .highlight{ + .highlight{ --highlight-bg-color:rgb(180 0 170 / 0.25); --highlight-selected-bg-color:rgb(0 100 0 / 0.25); --highlight-backdrop-filter:none; --highlight-selected-backdrop-filter:none; - margin:-1px; - padding:1px; - background-color:var(--highlight-bg-color); - -webkit-backdrop-filter:var(--highlight-backdrop-filter); - backdrop-filter:var(--highlight-backdrop-filter); - border-radius:4px; - } - -@media screen and (forced-colors: active){ - -.textLayer .highlight{ + @media screen and (forced-colors: active){ --highlight-bg-color:transparent; --highlight-selected-bg-color:transparent; --highlight-backdrop-filter:var(--hcm-highlight-filter); --highlight-selected-backdrop-filter:var( --hcm-highlight-selected-filter ); - } } -.textLayer .highlight.appended{ + margin:-1px; + padding:1px; + background-color:var(--highlight-bg-color); + backdrop-filter:var(--highlight-backdrop-filter); + border-radius:4px; + + &.appended{ position:initial; } -.textLayer .highlight.begin{ + &.begin{ border-radius:4px 0 0 4px; } -.textLayer .highlight.end{ + &.end{ border-radius:0 4px 4px 0; } -.textLayer .highlight.middle{ + &.middle{ border-radius:0; } -.textLayer .highlight.selected{ + &.selected{ background-color:var(--highlight-selected-bg-color); - -webkit-backdrop-filter:var(--highlight-selected-backdrop-filter); - backdrop-filter:var(--highlight-selected-backdrop-filter); + backdrop-filter:var(--highlight-selected-backdrop-filter); + scroll-margin-top:50px; } + } -.textLayer ::-moz-selection{ + ::-moz-selection{ background:rgba(0 0 255 / 0.25); - background:color-mix(in srgb, AccentColor, transparent 75%); + background:color-mix(in srgb, AccentColor, transparent 50%); + color:transparent; } -.textLayer ::selection{ + ::selection{ background:rgba(0 0 255 / 0.25); - background:color-mix(in srgb, AccentColor, transparent 75%); + background:color-mix(in srgb, AccentColor, transparent 50%); + color:transparent; } -.textLayer br::-moz-selection{ + &.selectionRendering{ + ::-moz-selection{ + background:transparent; + color:transparent; + } + ::selection{ + background:transparent; + color:transparent; + } + } + br::-moz-selection{ background:transparent; } - -.textLayer br::selection{ + br::selection{ background:transparent; } -.textLayer .endOfContent{ + .endOfContent{ display:block; position:absolute; inset:100% 0 0; - z-index:-1; + z-index:0; cursor:default; -webkit-user-select:none; -moz-user-select:none; user-select:none; } -.textLayer .endOfContent.active{ - top:0; - } + &.selecting .endOfContent{ + top:0; + } +} + +.textLayerImages{ + position:absolute; + inset:0; + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + + canvas{ + position:absolute; + transform-origin:0% 0%; + } +} .annotationLayer{ + color-scheme:only light; + --annotation-unfocused-field-background:url("data:image/svg+xml;charset=UTF-8,"); + --annotation-unfocused-field-filter:url("data:image/svg+xml;charset=UTF-8,#pdfjsFillableField"); --input-focus-border-color:Highlight; --input-focus-outline:1px solid Canvas; --input-unfocused-border-color:transparent; @@ -135,98 +786,134 @@ --input-hover-border-color:black; --link-outline:none; - position:absolute; - top:0; - left:0; - pointer-events:none; - transform-origin:0 0; -} - -@media screen and (forced-colors: active){ - -.annotationLayer{ + @media screen and (forced-colors: active){ --input-focus-border-color:CanvasText; --input-unfocused-border-color:ActiveText; --input-disabled-border-color:GrayText; --input-hover-border-color:Highlight; --link-outline:1.5px solid LinkText; -} - .annotationLayer .textWidgetAnnotation :is(input, textarea):required, .annotationLayer .choiceWidgetAnnotation select:required, .annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input:required{ + .textWidgetAnnotation :is(input, textarea):required, + .choiceWidgetAnnotation select:required, + .buttonWidgetAnnotation:is(.checkBox, .radioButton) input:required{ outline:1.5px solid selectedItem; } - .annotationLayer .linkAnnotation{ + .linkAnnotation{ outline:var(--link-outline); - } - .annotationLayer .linkAnnotation:hover{ - -webkit-backdrop-filter:var(--hcm-highlight-filter); - backdrop-filter:var(--hcm-highlight-filter); + &:hover{ + backdrop-filter:var(--hcm-highlight-filter); } - .annotationLayer .linkAnnotation > a:hover{ + & > a:hover{ opacity:0 !important; background:none !important; box-shadow:none; } + } - .annotationLayer .popupAnnotation .popup{ - outline:calc(1.5px * var(--scale-factor)) solid CanvasText !important; + .popupAnnotation .popup{ + outline:calc(1.5px * var(--total-scale-factor)) solid CanvasText !important; background-color:ButtonFace !important; color:ButtonText !important; } - .annotationLayer .highlightArea:hover::after{ + .highlightArea:hover::after{ position:absolute; top:0; left:0; width:100%; height:100%; - -webkit-backdrop-filter:var(--hcm-highlight-filter); - backdrop-filter:var(--hcm-highlight-filter); + backdrop-filter:var(--hcm-highlight-filter); content:""; pointer-events:none; } - .annotationLayer .popupAnnotation.focused .popup{ - outline:calc(3px * var(--scale-factor)) solid Highlight !important; + .popupAnnotation.focused .popup{ + outline:calc(3px * var(--total-scale-factor)) solid Highlight !important; } } -.annotationLayer[data-main-rotation="90"] .norotate{ + position:absolute; + top:0; + left:0; + pointer-events:none; + transform-origin:0 0; + + &[data-main-rotation="90"] .norotate{ transform:rotate(270deg) translateX(-100%); } - -.annotationLayer[data-main-rotation="180"] .norotate{ + &[data-main-rotation="180"] .norotate{ transform:rotate(180deg) translate(-100%, -100%); } - -.annotationLayer[data-main-rotation="270"] .norotate{ + &[data-main-rotation="270"] .norotate{ transform:rotate(90deg) translateY(-100%); } -.annotationLayer.disabled section, - .annotationLayer.disabled .popup{ + &.disabled{ + section, + .popup{ pointer-events:none; } + } -.annotationLayer canvas{ + .annotationContent{ position:absolute; width:100%; height:100%; pointer-events:none; + + &.freetext{ + background:transparent; + border:none; + inset:0; + overflow:visible; + white-space:nowrap; + font:10px sans-serif; + line-height:1.35; + } } -.annotationLayer section{ + section{ position:absolute; text-align:initial; pointer-events:auto; box-sizing:border-box; transform-origin:0 0; + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + + &:has(div.annotationContent){ + canvas.annotationContent{ + display:none; + } + } + + .overlaidText{ + position:absolute; + top:0; + left:0; + width:0; + height:0; + display:inline-block; + overflow:hidden; + } + } + .hasOwnCanvas:not(.sandboxModified) :is(input, textarea){ + display:none; + } + + .hasOwnCanvas.sandboxModified canvas.annotationContent{ + display:none; + } + + .textLayer.selecting ~ & section{ + pointer-events:none; } -.annotationLayer :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton) > a{ + :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton) > a{ position:absolute; font-size:1em; top:0; @@ -235,22 +922,21 @@ height:100%; } -.annotationLayer :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton):not(.hasBorder) + :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton):not(.hasBorder) > a:hover{ opacity:0.2; background-color:rgb(255 255 0); - box-shadow:0 2px 10px rgb(255 255 0); } -.annotationLayer .linkAnnotation.hasBorder:hover{ + .linkAnnotation.hasBorder:hover{ background-color:rgb(255 255 0 / 0.2); } -.annotationLayer .hasBorder{ + .hasBorder{ background-size:100% 100%; } -.annotationLayer .textAnnotation img{ + .textAnnotation img{ position:absolute; cursor:pointer; width:100%; @@ -259,126 +945,190 @@ left:0; } -.annotationLayer .textWidgetAnnotation :is(input, textarea), .annotationLayer .choiceWidgetAnnotation select, .annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input{ + .textWidgetAnnotation :is(input, textarea), + .choiceWidgetAnnotation select, + .buttonWidgetAnnotation:is(.checkBox, .radioButton) input{ background-image:var(--annotation-unfocused-field-background); border:2px solid var(--input-unfocused-border-color); box-sizing:border-box; - font:calc(9px * var(--scale-factor)) sans-serif; + font:calc(9px * var(--total-scale-factor)) sans-serif; height:100%; margin:0; vertical-align:top; width:100%; } -.annotationLayer .textWidgetAnnotation :is(input, textarea):required, .annotationLayer .choiceWidgetAnnotation select:required, .annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input:required{ + .textWidgetAnnotation :is(input, textarea):required, + .choiceWidgetAnnotation select:required, + .buttonWidgetAnnotation:is(.checkBox, .radioButton) input:required{ outline:1.5px solid red; } -.annotationLayer .choiceWidgetAnnotation select option{ + .choiceWidgetAnnotation select option{ padding:0; } -.annotationLayer .buttonWidgetAnnotation.radioButton input{ - border-radius:50%; - } - -.annotationLayer .textWidgetAnnotation textarea{ + .textWidgetAnnotation textarea{ resize:none; } -.annotationLayer .textWidgetAnnotation [disabled]:is(input, textarea), .annotationLayer .choiceWidgetAnnotation select[disabled], .annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input[disabled]{ + .textWidgetAnnotation :is(input, textarea)[disabled], + .choiceWidgetAnnotation select[disabled], + .buttonWidgetAnnotation:is(.checkBox, .radioButton) input[disabled]{ background:none; border:2px solid var(--input-disabled-border-color); cursor:not-allowed; } -.annotationLayer .textWidgetAnnotation :is(input, textarea):hover, .annotationLayer .choiceWidgetAnnotation select:hover, .annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input:hover{ + .textWidgetAnnotation :is(input, textarea):hover, + .choiceWidgetAnnotation select:hover, + .buttonWidgetAnnotation:is(.checkBox, .radioButton) input:hover{ border:2px solid var(--input-hover-border-color); } - -.annotationLayer .textWidgetAnnotation :is(input, textarea):hover, .annotationLayer .choiceWidgetAnnotation select:hover, .annotationLayer .buttonWidgetAnnotation.checkBox input:hover{ + .textWidgetAnnotation :is(input, textarea):hover, + .choiceWidgetAnnotation select:hover, + .buttonWidgetAnnotation.checkBox input:hover{ border-radius:2px; } -.annotationLayer .textWidgetAnnotation :is(input, textarea):focus, .annotationLayer .choiceWidgetAnnotation select:focus{ + .textWidgetAnnotation :is(input, textarea):focus, + .choiceWidgetAnnotation select:focus{ background:none; border:2px solid var(--input-focus-border-color); border-radius:2px; outline:var(--input-focus-outline); } -.annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) :focus{ + .buttonWidgetAnnotation:is(.checkBox, .radioButton) :focus{ background-image:none; background-color:transparent; } -.annotationLayer .buttonWidgetAnnotation.checkBox :focus{ + .buttonWidgetAnnotation.checkBox :focus{ border:2px solid var(--input-focus-border-color); border-radius:2px; outline:var(--input-focus-outline); } -.annotationLayer .buttonWidgetAnnotation.radioButton :focus{ + .buttonWidgetAnnotation.radioButton :focus{ border:2px solid var(--input-focus-border-color); outline:var(--input-focus-outline); } -.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::before, - .annotationLayer .buttonWidgetAnnotation.checkBox input:checked::after, - .annotationLayer .buttonWidgetAnnotation.radioButton input:checked::before{ - background-color:CanvasText; - content:""; - display:block; - position:absolute; - } + .buttonWidgetAnnotation:is(.checkBox, .radioButton){ + [data-canvas-name]{ + filter:var(--annotation-unfocused-field-filter); + } -.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::before, - .annotationLayer .buttonWidgetAnnotation.checkBox input:checked::after{ - height:80%; - left:45%; - width:1px; - } + &:focus-within [data-canvas-name]{ + filter:none; + } -.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::before{ - transform:rotate(45deg); - } + [data-canvas-name="checked"]{ + &:has(~ input:checked){ + display:block; + } -.annotationLayer .buttonWidgetAnnotation.checkBox input:checked::after{ - transform:rotate(-45deg); - } + &:has(~ input:not(:checked)){ + display:none; + } + } + + [data-canvas-name="unchecked"]{ + &:has(~ input:checked){ + display:none; + } -.annotationLayer .buttonWidgetAnnotation.radioButton input:checked::before{ - border-radius:50%; - height:50%; - left:25%; - top:25%; - width:50%; + &:has(~ input:not(:checked)){ + display:block; + } + } } -.annotationLayer .textWidgetAnnotation input.comb{ + .textWidgetAnnotation input.comb{ + --comb-width:0px; + --comb-letter-spacing:calc(var(--comb-width) - 1ch); + font-family:monospace; - padding-left:2px; - padding-right:0; + letter-spacing:var(--comb-letter-spacing); + overflow-x:hidden; + padding:0; + text-indent:calc( + var(--comb-offset, 0) * var(--comb-width) + var(--comb-letter-spacing) / 2 + ); } -.annotationLayer .textWidgetAnnotation input.comb:focus{ - width:103%; + .textWidgetAnnotation input.comb:focus{ + background-image:repeating-linear-gradient( + to right, + transparent 0 calc(var(--comb-width) - 1px), + var(--input-focus-border-color) calc(var(--comb-width) - 1px) + var(--comb-width) + ); } -.annotationLayer .buttonWidgetAnnotation:is(.checkBox, .radioButton) input{ + .buttonWidgetAnnotation:is(.checkBox, .radioButton) input{ -webkit-appearance:none; -moz-appearance:none; appearance:none; } -.annotationLayer .fileAttachmentAnnotation .popupTriggerArea{ + .buttonWidgetAnnotation:is(.checkBox, .radioButton):has( + [data-canvas-name="checked"] + ) + input:checked, + .buttonWidgetAnnotation:is(.checkBox, .radioButton):has( + [data-canvas-name="unchecked"] + ) + input:not(:checked){ + background-image:none; + } + + .fileAttachmentAnnotation .popupTriggerArea{ height:100%; width:100%; } -.annotationLayer .popupAnnotation{ + .mediaAnnotation{ + pointer-events:auto; + + .mediaContent{ + width:100%; + } + + video.mediaContent{ + height:100%; + -o-object-fit:contain; + object-fit:contain; + } + + audio.mediaContent{ + position:absolute; + bottom:0; + } + + .mediaPlayButton{ + height:100%; + width:100%; + margin:0; + padding:0; + border:none; + cursor:pointer; + background-color:transparent; + background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='40' fill='rgba(0,0,0,0.55)'/%3E%3Cpath d='M40 32 L70 50 L40 68 Z' fill='white'/%3E%3C/svg%3E"); + background-position:center; + background-repeat:no-repeat; + background-size:calc(48px * var(--total-scale-factor)); + + &:hover{ + background-color:rgba(255 255 255 / 0.1); + } + } + } + + .popupAnnotation{ position:absolute; - font-size:calc(9px * var(--scale-factor)); + font-size:calc(9px * var(--total-scale-factor)); pointer-events:none; width:-moz-max-content; width:max-content; @@ -386,58 +1136,67 @@ height:auto; } -.annotationLayer .popup{ + .popup{ background-color:rgb(255 255 153); - box-shadow:0 calc(2px * var(--scale-factor)) calc(5px * var(--scale-factor)) rgb(136 136 136); - border-radius:calc(2px * var(--scale-factor)); + color:black; + box-shadow:0 calc(2px * var(--total-scale-factor)) calc(5px * var(--total-scale-factor)) rgb(136 136 136); + border-radius:calc(2px * var(--total-scale-factor)); outline:1.5px solid rgb(255 255 74); - padding:calc(6px * var(--scale-factor)); + padding:calc(6px * var(--total-scale-factor)); cursor:pointer; font:message-box; white-space:normal; word-wrap:break-word; pointer-events:auto; + -webkit-user-select:text; + -moz-user-select:text; + user-select:text; } -.annotationLayer .popupAnnotation.focused .popup{ + .popupAnnotation.focused .popup{ outline-width:3px; } -.annotationLayer .popup *{ - font-size:calc(9px * var(--scale-factor)); + .popup *{ + font-size:calc(9px * var(--total-scale-factor)); } -.annotationLayer .popup > .header{ + .popup > .header{ display:inline-block; } -.annotationLayer .popup > .header h1{ + .popup > .header > .title{ display:inline; + font-weight:bold; } -.annotationLayer .popup > .header .popupDate{ + .popup > .header .popupDate{ display:inline-block; - margin-left:calc(5px * var(--scale-factor)); + margin-left:calc(5px * var(--total-scale-factor)); width:-moz-fit-content; width:fit-content; } -.annotationLayer .popupContent{ + .popupContent{ border-top:1px solid rgb(51 51 51); - margin-top:calc(2px * var(--scale-factor)); - padding-top:calc(2px * var(--scale-factor)); + margin-top:calc(2px * var(--total-scale-factor)); + padding-top:calc(2px * var(--total-scale-factor)); } -.annotationLayer .richText > *{ + .richText > *{ white-space:pre-wrap; - font-size:calc(9px * var(--scale-factor)); + font-size:calc(9px * var(--total-scale-factor)); } -.annotationLayer .popupTriggerArea{ + .popupTriggerArea{ cursor:pointer; + + &:hover{ + backdrop-filter:var(--hcm-highlight-filter); + } } -.annotationLayer section svg{ + section svg{ position:absolute; width:100%; height:100%; @@ -445,7 +1204,7 @@ left:0; } -.annotationLayer .annotationTextContent{ + .annotationTextContent{ position:absolute; width:100%; height:100%; @@ -455,14 +1214,14 @@ -moz-user-select:none; user-select:none; pointer-events:none; - } -.annotationLayer .annotationTextContent span{ + span{ width:100%; display:inline-block; } + } -.annotationLayer svg.quadrilateralsContainer{ + svg.quadrilateralsContainer{ contain:strict; width:0; height:0; @@ -471,6 +1230,7 @@ left:0; z-index:-1; } +} :root{ --xfa-unfocused-field-background:url("data:image/svg+xml;charset=UTF-8,"); @@ -487,6 +1247,8 @@ } .xfaLayer{ + color-scheme:only light; + background-color:transparent; } @@ -790,105 +1552,168 @@ } } -.canvasWrapper svg{ +.canvasWrapper{ + svg{ transform:none; - } -.canvasWrapper svg[data-main-rotation="90"] mask, - .canvasWrapper svg[data-main-rotation="90"] use:not(.clip, .mask){ - transform:matrix(0, 1, -1, 0, 1, 0); - } + &.moving{ + z-index:100000; + } -.canvasWrapper svg[data-main-rotation="180"] mask, - .canvasWrapper svg[data-main-rotation="180"] use:not(.clip, .mask){ - transform:matrix(-1, 0, 0, -1, 1, 1); + &.highlight, + &.highlightOutline{ + &[data-main-rotation="90"]{ + mask, + use:not(.clip, .mask){ + transform:matrix(0, 1, -1, 0, 1, 0); + } } -.canvasWrapper svg[data-main-rotation="270"] mask, - .canvasWrapper svg[data-main-rotation="270"] use:not(.clip, .mask){ - transform:matrix(0, -1, 1, 0, 0, 1); + &[data-main-rotation="180"]{ + mask, + use:not(.clip, .mask){ + transform:matrix(-1, 0, 0, -1, 1, 1); + } } -.canvasWrapper svg.highlight{ - --blend-mode:multiply; + &[data-main-rotation="270"]{ + mask, + use:not(.clip, .mask){ + transform:matrix(0, -1, 1, 0, 0, 1); + } + } + } + &.draw{ position:absolute; - mix-blend-mode:var(--blend-mode); + mix-blend-mode:normal; + + &[data-draw-rotation="90"]{ + transform:rotate(90deg); + } + + &[data-draw-rotation="180"]{ + transform:rotate(180deg); + } + + &[data-draw-rotation="270"]{ + transform:rotate(270deg); + } } -@media screen and (forced-colors: active){ + &.highlight{ + --blend-mode:multiply; -.canvasWrapper svg.highlight{ + @media screen and (forced-colors: active){ --blend-mode:difference; - } } -.canvasWrapper svg.highlight:not(.free){ + position:absolute; + mix-blend-mode:var(--blend-mode); + + &:not(.free){ fill-rule:evenodd; } + } -.canvasWrapper svg.highlightOutline{ + &.highlightOutline{ position:absolute; mix-blend-mode:normal; fill-rule:evenodd; fill:none; - } -.canvasWrapper svg.highlightOutline.hovered:not(.free):not(.selected){ + &:not(.free){ + &.hovered:not(.selected){ stroke:var(--hover-outline-color); stroke-width:var(--outline-width); } -.canvasWrapper svg.highlightOutline.selected:not(.free) .mainOutline{ + &.selected{ + .mainOutline{ stroke:var(--outline-around-color); stroke-width:calc( var(--outline-width) + 2 * var(--outline-around-width) ); } -.canvasWrapper svg.highlightOutline.selected:not(.free) .secondaryOutline{ + .secondaryOutline{ stroke:var(--outline-color); stroke-width:var(--outline-width); } + } + } -.canvasWrapper svg.highlightOutline.free.hovered:not(.selected){ + &.free{ + &.hovered:not(.selected){ stroke:var(--hover-outline-color); stroke-width:calc(2 * var(--outline-width)); } -.canvasWrapper svg.highlightOutline.free.selected .mainOutline{ + &.selected{ + .mainOutline{ stroke:var(--outline-around-color); stroke-width:calc( 2 * (var(--outline-width) + var(--outline-around-width)) ); } -.canvasWrapper svg.highlightOutline.free.selected .secondaryOutline{ + .secondaryOutline{ stroke:var(--outline-color); stroke-width:calc(2 * var(--outline-width)); } + } + } + } + } +} .toggle-button{ - --button-background-color:#f0f0f4; - --button-background-color-hover:#e0e0e6; - --button-background-color-active:#cfcfd8; - --color-accent-primary:#0060df; - --color-accent-primary-hover:#0250bb; - --color-accent-primary-active:#054096; - --border-interactive-color:#8f8f9d; + --button-background-color:color-mix(in srgb, currentColor 7%, transparent); + --button-background-color-hover:color-mix( + in srgb, + currentColor 14%, + transparent + ); + --button-background-color-active:color-mix( + in srgb, + currentColor 21%, + transparent + ); + --color-accent-primary:light-dark(#0060df, #0df); + --color-accent-primary-hover:light-dark(#0250bb, #80ebff); + --color-accent-primary-active:light-dark(#054096, #aaf2ff); --border-radius-circle:9999px; --border-width:1px; --size-item-small:16px; --size-item-large:32px; - --color-canvas:white; + --color-canvas:light-dark(white, #1c1b22); + --background-color-canvas:var(--color-canvas); + --border-color-interactive:light-dark(#8f8f9d, #f9f9fa); + --border-color-interactive-hover:var(--border-color-interactive); + --border-color-interactive-active:var(--border-color-interactive); + --focus-outline-offset:2px; + + @media (forced-colors: active){ + --color-accent-primary:ButtonText; + --color-accent-primary-hover:SelectedItem; + --color-accent-primary-active:SelectedItem; + --button-background-color:ButtonFace; + --border-color-interactive:ButtonText; + --border-color-interactive-hover:SelectedItem; + --border-color-interactive-active:ButtonText; + --color-canvas:ButtonText; + --background-color-canvas:Canvas; + } +} +.toggle-button{ --toggle-background-color:var(--button-background-color); --toggle-background-color-hover:var(--button-background-color-hover); --toggle-background-color-active:var(--button-background-color-active); --toggle-background-color-pressed:var(--color-accent-primary); --toggle-background-color-pressed-hover:var(--color-accent-primary-hover); --toggle-background-color-pressed-active:var(--color-accent-primary-active); - --toggle-border-color:var(--border-interactive-color); + --toggle-border-color:var(--border-color-interactive); --toggle-border-color-hover:var(--toggle-border-color); --toggle-border-color-active:var(--toggle-border-color); --toggle-border-radius:var(--border-radius-circle); @@ -898,7 +1723,7 @@ --toggle-dot-background-color:var(--toggle-border-color); --toggle-dot-background-color-hover:var(--toggle-dot-background-color); --toggle-dot-background-color-active:var(--toggle-dot-background-color); - --toggle-dot-background-color-on-pressed:var(--color-canvas); + --toggle-dot-background-color-on-pressed:var(--background-color-canvas); --toggle-dot-margin:1px; --toggle-dot-height:calc( var(--toggle-height) - 2 * var(--toggle-dot-margin) - 2 * @@ -908,6 +1733,7 @@ --toggle-dot-transform-x:calc( var(--toggle-width) - 4 * var(--toggle-dot-margin) - var(--toggle-dot-width) ); + --input-width:var(--toggle-width); -webkit-appearance:none; @@ -915,103 +1741,29 @@ appearance:none; padding:0; - margin:0; border:var(--toggle-border-width) solid var(--toggle-border-color); height:var(--toggle-height); width:var(--toggle-width); border-radius:var(--toggle-border-radius); - background:var(--toggle-background-color); + background-color:var(--toggle-background-color); box-sizing:border-box; - flex-shrink:0; -} - -@media (prefers-color-scheme: dark){ - -:where(html:not(.is-light)) .toggle-button{ - --button-background-color:color-mix(in srgb, currentColor 7%, transparent); - --button-background-color-hover:color-mix( - in srgb, - currentColor 14%, - transparent - ); - --button-background-color-active:color-mix( - in srgb, - currentColor 21%, - transparent - ); - --color-accent-primary:#0df; - --color-accent-primary-hover:#80ebff; - --color-accent-primary-active:#aaf2ff; - --border-interactive-color:#bfbfc9; - --color-canvas:#1c1b22; -} - } -:where(html.is-dark) .toggle-button{ - --button-background-color:color-mix(in srgb, currentColor 7%, transparent); - --button-background-color-hover:color-mix( - in srgb, - currentColor 14%, - transparent - ); - --button-background-color-active:color-mix( - in srgb, - currentColor 21%, - transparent - ); - --color-accent-primary:#0df; - --color-accent-primary-hover:#80ebff; - --color-accent-primary-active:#aaf2ff; - --border-interactive-color:#bfbfc9; - --color-canvas:#1c1b22; -} - -@media (forced-colors: active){ - -.toggle-button{ - --color-accent-primary:ButtonText; - --color-accent-primary-hover:SelectedItem; - --color-accent-primary-active:SelectedItem; - --border-interactive-color:ButtonText; - --button-background-color:ButtonFace; - --border-interactive-color-hover:SelectedItem; - --border-interactive-color-active:SelectedItem; - --border-interactive-color-disabled:GrayText; - --color-canvas:ButtonText; -} - } - -.toggle-button:focus-visible{ + &:focus-visible{ outline:var(--focus-outline); outline-offset:var(--focus-outline-offset); } -.toggle-button:enabled:hover{ - background:var(--toggle-background-color-hover); + &:enabled:hover{ + background-color:var(--toggle-background-color-hover); border-color:var(--toggle-border-color); } -.toggle-button:enabled:active{ - background:var(--toggle-background-color-active); + &:enabled:hover:active{ + background-color:var(--toggle-background-color-active); border-color:var(--toggle-border-color); } -.toggle-button[aria-pressed="true"]{ - background:var(--toggle-background-color-pressed); - border-color:transparent; - } - -.toggle-button[aria-pressed="true"]:enabled:hover{ - background:var(--toggle-background-color-pressed-hover); - border-color:transparent; - } - -.toggle-button[aria-pressed="true"]:enabled:active{ - background:var(--toggle-background-color-pressed-active); - border-color:transparent; - } - -.toggle-button::before{ + &::before{ display:block; content:""; background-color:var(--toggle-dot-background-color); @@ -1021,87 +1773,1595 @@ border-radius:var(--toggle-border-radius); translate:0; } +} + +.toggle-button[aria-pressed="true"]{ + background-color:var(--toggle-background-color-pressed); + border-color:transparent; + + &:enabled:hover{ + background-color:var(--toggle-background-color-pressed-hover); + border-color:transparent; + } + + &:enabled:hover:active{ + background-color:var(--toggle-background-color-pressed-active); + border-color:transparent; + } -.toggle-button[aria-pressed="true"]::before{ + &::before{ translate:var(--toggle-dot-transform-x); background-color:var(--toggle-dot-background-color-on-pressed); } -.toggle-button[aria-pressed="true"]:enabled:hover::before, - .toggle-button[aria-pressed="true"]:enabled:active::before{ + &:enabled:hover::before, + &:enabled:hover:active::before{ background-color:var(--toggle-dot-background-color-on-pressed); } -[dir="rtl"] .toggle-button[aria-pressed="true"]::before{ + &:-moz-locale-dir(rtl)::before, + &:dir(rtl)::before{ translate:calc(-1 * var(--toggle-dot-transform-x)); } +} @media (prefers-reduced-motion: no-preference){ - .toggle-button::before{ - transition:translate 100ms; - } + .toggle-button::before{ + transition:translate 100ms; } +} @media (prefers-contrast){ - .toggle-button:enabled:hover{ + .toggle-button:enabled:hover{ + border-color:var(--toggle-border-color-hover); + } + + .toggle-button:enabled:hover:active{ + border-color:var(--toggle-border-color-active); + } + + .toggle-button[aria-pressed="true"]:enabled{ + border-color:var(--toggle-border-color); + position:relative; + + &:hover{ border-color:var(--toggle-border-color-hover); + + &:active{ + background-color:var(--toggle-dot-background-color-active); + border-color:var(--toggle-dot-background-color-hover); + } } + } - .toggle-button:enabled:active{ - border-color:var(--toggle-border-color-active); + .toggle-button:enabled:hover::before, + .toggle-button:enabled:hover:active::before{ + background-color:var(--toggle-dot-background-color-hover); + } +} + +@media (forced-colors){ + .toggle-button{ + --toggle-dot-background-color:var(--color-accent-primary); + --toggle-dot-background-color-hover:var(--color-accent-primary-hover); + --toggle-dot-background-color-active:var(--color-accent-primary-active); + --toggle-dot-background-color-on-pressed:var(--button-background-color); + --toggle-border-color-hover:var(--border-color-interactive-hover); + --toggle-border-color-active:var(--border-color-interactive-active); + } + + .toggle-button[aria-pressed="true"]:enabled::after{ + border:1px solid var(--button-background-color); + content:""; + position:absolute; + height:var(--toggle-height); + width:var(--toggle-width); + display:block; + border-radius:var(--toggle-border-radius); + inset:-2px; + } + + .toggle-button[aria-pressed="true"]:enabled:hover:active::after{ + border-color:var(--toggle-border-color-active); + } +} + +:root{ + --clear-signature-button-icon:url(images/editor-toolbar-delete.svg); + --signature-bg:light-dark(#f9f9fb, #2b2a33); + --signature-hover-bg:light-dark(#f0f0f4, var(--signature-bg)); + --button-signature-bg:transparent; + --button-signature-color:var(--main-color); + --button-signature-active-bg:light-dark(#cfcfd8, #5b5b66); + --button-signature-active-border:none; + --button-signature-active-color:var(--button-signature-color); + --button-signature-border:none; + --button-signature-hover-bg:light-dark(#e0e0e6, #52525e); + --button-signature-hover-color:var(--button-signature-color); + + @media screen and (forced-colors: active){ + --signature-bg:HighlightText; + --signature-hover-bg:var(--signature-bg); + --button-signature-bg:HighlightText; + --button-signature-color:ButtonText; + --button-signature-active-bg:ButtonText; + --button-signature-active-color:HighlightText; + --button-signature-border:1px solid ButtonText; + --button-signature-hover-bg:Highlight; + --button-signature-hover-color:HighlightText; + } +} + +.signatureDialog{ + --primary-color:var(--text-primary-color); + --border-color:#8f8f9d; + --open-link-fg:var(--link-fg-color); + --open-link-hover-fg:var(--link-hover-fg-color); + + @media screen and (forced-colors: active){ + --primary-color:ButtonText; + --border-color:ButtonText; + --open-link-fg:ButtonText; + --open-link-hover-fg:ButtonText; + } + + width:570px; + max-width:100%; + min-width:300px; + padding:16px 0; + + .mainContainer{ + width:100%; + display:flex; + flex-direction:column; + align-items:flex-start; + gap:12px; + + span:not([role="sectionhead"]){ + font-size:13px; + font-style:normal; + font-weight:400; + line-height:normal; } - .toggle-button[aria-pressed="true"]:enabled{ - border-color:var(--toggle-border-color); - position:relative; + .title{ + margin-inline-start:16px; } + } - .toggle-button[aria-pressed="true"]:enabled:hover, - .toggle-button[aria-pressed="true"]:enabled:hover:active{ - border-color:var(--toggle-border-color-hover); + .inputWithClearButton{ + --button-dimension:24px; + --clear-button-icon:url(images/messageBar_closingButton.svg); + + width:100%; + position:relative; + display:flex; + align-items:center; + justify-content:center; + + > input{ + width:100%; + height:32px; + padding-inline:8px calc(4px + var(--button-dimension)); + box-sizing:border-box; + border-radius:4px; + border:1px solid var(--border-color); + } + + .clearInputButton{ + position:absolute; + inset-block-start:4px; + inset-inline-end:4px; + display:inline-block; + width:var(--button-dimension); + height:var(--button-dimension); + background-color:var(--input-text-fg-color); + -webkit-mask-size:cover; + mask-size:cover; + -webkit-mask-image:var(--clear-button-icon); + mask-image:var(--clear-button-icon); + padding:0; + border:0; } + } +} + +#addSignatureDialog{ + --secondary-color:var(--text-secondary-color); + --bg-hover:#e0e0e6; + --tab-top-line-active-color:#0060df; + --tab-top-line-active-hover-color:var(--tab-text-hover-color); + --tab-top-line-hover-color:#8f8f9d; + --tab-top-line-inactive-color:#cfcfd8; + --tab-bottom-line-active-color:var(--tab-top-line-inactive-color); + --tab-bottom-line-hover-color:var(--tab-top-line-inactive-color); + --tab-bottom-line-inactive-color:var(--tab-top-line-inactive-color); + --tab-bg:var(--dialog-bg-color); + --tab-bg-active-color:var(--tab-bg); + --tab-bg-active-hover-color:var(--bg-hover); + --tab-bg-hover:var(--bg-hover); + --tab-panel-border:none; + --tab-panel-border-radius:4px; + --tab-text-color:var(--primary-color); + --tab-text-active-color:var(--tab-top-line-active-color); + --tab-text-active-hover-color:var(--tab-text-hover-color); + --tab-text-hover-color:var(--tab-text-color); + --signature-placeholder-color:var(--secondary-color); + --signature-draw-placeholder-color:var(--primary-color); + --signature-color:var(--primary-color); + --clear-signature-button-border-width:0; + --clear-signature-button-border-style:solid; + --clear-signature-button-border-color:transparent; + --clear-signature-button-border-disabled-color:transparent; + --clear-signature-button-color:var(--primary-color); + --clear-signature-button-hover-color:var(--clear-signature-button-color); + --clear-signature-button-active-color:var(--clear-signature-button-color); + --clear-signature-button-disabled-color:var(--clear-signature-button-color); + --clear-signature-button-focus-color:var(--clear-signature-button-color); + --clear-signature-button-bg:var(--dialog-bg-color); + --clear-signature-button-bg-hover:var(--bg-hover); + --clear-signature-button-bg-active:#cfcfd8; + --clear-signature-button-bg-focus:#f0f0f4; + --clear-signature-button-bg-disabled:color-mix( + in srgb, + #f0f0f4, + transparent 40% + ); + --save-warning-color:var(--secondary-color); + --thickness-bg:var(--dialog-bg-color); + --thickness-label-color:var(--primary-color); + --thickness-slider-color:var(--primary-color); + --thickness-border:none; + --draw-cursor:url(images/cursor-editorInk.svg) 0 16, pointer; + + @media (prefers-color-scheme: dark){ + --dialog-bg-color:#42414d; + --bg-hover:#52525e; + --primary-color:#fbfbfe; + --secondary-color:#cfcfd8; + --tab-top-line-active-color:#0df; + --tab-top-line-inactive-color:#8f8f9d; + --clear-signature-button-bg-active:#5b5b66; + --clear-signature-button-bg-focus:#2b2a33; + --clear-signature-button-bg-disabled:color-mix( + in srgb, + #2b2a33, + transparent 40% + ); + } + + @media screen and (forced-colors: active){ + --secondary-color:ButtonText; + --bg:HighlightText; + --bg-hover:var(--bg); + --tab-top-line-active-color:ButtonText; + --tab-top-line-active-hover-color:HighlightText; + --tab-top-line-hover-color:SelectedItem; + --tab-top-line-inactive-color:ButtonText; + --tab-bottom-line-active-color:var(--tab-top-line-active-color); + --tab-bottom-line-hover-color:var(--tab-top-line-hover-color); + --tab-bg:var(--bg); + --tab-bg-active-color:SelectedItem; + --tab-bg-active-hover-color:SelectedItem; + --tab-panel-border:1px solid ButtonText; + --tab-panel-border-radius:8px; + --tab-text-color:ButtonText; + --tab-text-active-color:HighlightText; + --tab-text-active-hover-color:HighlightText; + --tab-text-hover-color:SelectedItem; + --signature-color:ButtonText; + --clear-signature-button-border-width:1px; + --clear-signature-button-border-style:solid; + --clear-signature-button-border-color:ButtonText; + --clear-signature-button-border-disabled-color:GrayText; + --clear-signature-button-color:ButtonText; + --clear-signature-button-hover-color:HighlightText; + --clear-signature-button-active-color:SelectedItem; + --clear-signature-button-focus-color:CanvasText; + --clear-signature-button-disabled-color:GrayText; + --clear-signature-button-bg:var(--bg); + --clear-signature-button-bg-hover:SelectedItem; + --clear-signature-button-bg-active:var(--bg); + --clear-signature-button-bg-focus:var(--bg); + --clear-signature-button-bg-disabled:var(--bg); + --thickness-bg:Canvas; + --thickness-label-color:CanvasText; + --thickness-slider-color:ButtonText; + --thickness-border:1px solid var(--border-color); + } + + #addSignatureDialogLabel{ + overflow:hidden; + position:absolute; + inset:0; + width:0; + height:0; + } + + &.waiting::after{ + content:""; + cursor:wait; + position:absolute; + inset:0; + width:100%; + height:100%; + } + + .mainContainer{ + [role="tablist"]{ + width:100%; + display:flex; + align-items:flex-start; + gap:0; + + > [role="tab"]{ + flex:1 0 0; + align-self:stretch; + background-color:var(--tab-bg); + padding-inline:0; + cursor:default; + + border-inline:0; + border-block-width:1px; + border-block-style:solid; + border-block-start-color:var(--tab-top-line-inactive-color); + border-block-end-color:var(--tab-bottom-line-inactive-color); + border-radius:0; + + font:menu; + font-size:13px; + font-style:normal; + line-height:normal; + font-weight:400; + color:var(--tab-text-color); + + &:hover{ + border-block-start-width:2px; + border-block-start-color:var(--tab-top-line-hover-color); + border-block-end-color:var(--tab-bottom-line-hover-color); + background-color:var(--tab-bg-hover); + color:var(--tab-text-hover-color); + } + + &:focus-visible{ + outline:2px solid var(--tab-top-line-active-color); + outline-offset:-2px; + } - .toggle-button[aria-pressed="true"]:enabled:active{ - background-color:var(--toggle-dot-background-color-active); - border-color:var(--toggle-dot-background-color-hover); + &[aria-selected="true"]{ + border-block-start-width:2px; + border-block-start-color:var(--tab-top-line-active-color); + border-block-end-color:var(--tab-bottom-line-active-color); + background-color:var(--tab-bg-active-color); + font-weight:590; + color:var(--tab-text-active-color); + + &:hover{ + border-block-start-color:var(--tab-top-line-active-hover-color); + background-color:var(--tab-bg-active-hover-color); + color:var(--tab-text-active-hover-color); + } + } + } } - .toggle-button:hover::before, - .toggle-button:active::before{ - background-color:var(--toggle-dot-background-color-hover); + #addSignatureActionContainer{ + width:100%; + height:auto; + display:flex; + flex-direction:column; + align-items:flex-end; + align-self:stretch; + gap:12px; + padding-inline:16px; + box-sizing:border-box; + + > [role="tabpanel"]{ + position:relative; + width:100%; + height:220px; + background-color:var(--signature-bg); + border:var(--tab-panel-border); + border-radius:var(--tab-panel-border-radius); + + > svg{ + position:absolute; + inset:0; + width:100%; + height:100%; + background-color:transparent; + } + + &#addSignatureTypeContainer{ + display:none; + + #addSignatureTypeInput{ + position:absolute; + inset:0; + width:100%; + height:100%; + border:0; + padding:0; + text-align:center; + color:var(--signature-color); + background-color:transparent; + border-radius:var(--tab-panel-border-radius); + + font-family:"Brush script", "Apple Chancery", "Segoe script", "Freestyle Script", "Palace Script MT", "Brush Script MT", TK, cursive, serif; + font-size:44px; + font-style:italic; + font-weight:400; + + &::-moz-placeholder{ + color:var(--signature-placeholder-color); + text-align:center; + + font:menu; + font-style:normal; + font-weight:274; + font-size:44px; + line-height:normal; + } + + &::placeholder{ + color:var(--signature-placeholder-color); + text-align:center; + + font:menu; + font-style:normal; + font-weight:274; + font-size:44px; + line-height:normal; + } + } + } + + &#addSignatureDrawContainer{ + display:none; + + > span{ + position:absolute; + top:0; + left:0; + width:100%; + height:100%; + display:grid; + align-items:center; + justify-content:center; + + background-color:transparent; + color:var(--signature-placeholder-color); + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + } + + > svg{ + stroke:var(--signature-color); + fill:none; + stroke-opacity:1; + stroke-linecap:round; + stroke-linejoin:round; + stroke-miterlimit:10; + + &:hover{ + cursor:var(--draw-cursor); + } + } + + #thickness{ + position:absolute; + width:100%; + inset-block-end:0; + display:grid; + align-items:center; + justify-content:center; + pointer-events:none; + + > span{ + color:var(--signature-draw-placeholder-color); + } + + > div{ + width:auto; + height:auto; + display:flex; + align-items:center; + justify-content:center; + gap:8px; + padding:6px 8px 7px; + margin:0; + background-color:var(--thickness-bg); + border-radius:4px 4px 0 0; + border-inline:var(--thickness-border); + border-top:var(--thickness-border); + pointer-events:auto; + position:relative; + top:1px; + + > label{ + color:var(--thickness-label-color); + } + + > input{ + width:100px; + height:14px; + background-color:transparent; + + &::-webkit-slider-runnable-track, + &::-moz-range-track, + &::-moz-range-progress{ + background-color:var(--thickness-slider-color); + } + + &::-webkit-slider-thumb, + &::-moz-range-thumb{ + background-color:var(--thickness-bg); + } + + border-radius:4.5px; + border:0; + color:var(--signature-color); + } + } + } + } + + &#addSignatureImageContainer{ + display:none; + + > svg{ + stroke:none; + stroke-width:0; + fill:var(--signature-color); + fill-opacity:1; + } + + #addSignatureImagePlaceholder{ + position:absolute; + top:0; + left:0; + width:100%; + height:100%; + background-color:transparent; + display:flex; + flex-direction:column; + align-items:center; + justify-content:center; + + span{ + color:var(--signature-placeholder-color); + } + + a{ + color:var(--open-link-fg); + text-decoration:underline; + cursor:pointer; + + &:hover{ + color:var(--open-link-hover-fg); + } + } + } + + #addSignatureFilePicker{ + visibility:hidden; + position:relative; + width:0; + height:0; + } + } + } + + &[data-selected="type"] > #addSignatureTypeContainer, + &[data-selected="draw"] > #addSignatureDrawContainer, + &[data-selected="image"] > #addSignatureImageContainer{ + display:block; + } + + #addSignatureControls{ + display:flex; + flex-direction:column; + justify-content:center; + align-items:flex-start; + gap:12px; + align-self:stretch; + + #horizontalContainer{ + display:flex; + align-items:flex-end; + gap:16px; + align-self:stretch; + + #addSignatureDescriptionContainer{ + display:flex; + flex-direction:column; + align-items:flex-start; + gap:4px; + flex:1 0 0; + + &:has(input:disabled) > label{ + opacity:0.4; + } + + > label{ + width:auto; + } + } + + #clearSignatureButton{ + display:flex; + height:32px; + padding:4px 8px; + align-items:center; + background-color:var(--clear-signature-button-bg); + border-width:var(--clear-signature-button-border-width); + border-style:var(--clear-signature-button-border-style); + border-color:var(--clear-signature-button-border-color); + border-radius:4px; + + > span{ + display:flex; + height:24px; + align-items:center; + gap:4px; + flex-shrink:0; + + color:var(--clear-signature-button-color); + + &::after{ + content:""; + display:inline-block; + width:16px; + height:16px; + -webkit-mask-image:var(--clear-signature-button-icon); + mask-image:var(--clear-signature-button-icon); + -webkit-mask-size:cover; + mask-size:cover; + background-color:var(--clear-signature-button-color); + flex-shrink:0; + } + } + + &:hover{ + background-color:var(--clear-signature-button-bg-hover); + + > span{ + color:var(--clear-signature-button-hover-color); + &::after{ + background-color:var(--clear-signature-button-hover-color); + } + } + } + + &:active{ + background-color:var(--clear-signature-button-bg-active); + + > span{ + color:var(--clear-signature-button-active-color); + &::after{ + background-color:var(--clear-signature-button-active-color); + } + } + } + + &:focus-visible{ + background-color:var(--clear-signature-button-bg-focus); + + > span{ + color:var(--clear-signature-button-focus-color); + &::after{ + background-color:var(--clear-signature-button-focus-color); + } + } + } + + &:disabled{ + background-color:var(--clear-signature-button-bg-disabled); + border-color:var(--clear-signature-button-border-disabled-color); + + > span{ + color:var(--clear-signature-button-disabled-color); + &::after{ + background-color:var( + --clear-signature-button-disabled-color + ); + } + } + } + } + } + + #addSignatureSaveContainer{ + display:grid; + grid-template-columns:max-content auto; + gap:4px; + width:100%; + + > input{ + margin:0; + + &:disabled + label{ + opacity:0.4; + } + } + + > label{ + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + } + + &:not(.fullStorage) #addSignatureSaveWarning{ + display:none; + } + + &.fullStorage #addSignatureSaveWarning{ + display:block; + opacity:1; + color:var(--save-warning-color); + font-size:11px; + } + } + } } } +} -@media (forced-colors){ +#editSignatureDescriptionDialog{ + .mainContainer{ + padding-inline:16px; + box-sizing:border-box; -.toggle-button{ - --toggle-dot-background-color:var(--color-accent-primary); - --toggle-dot-background-color-hover:var(--color-accent-primary-hover); - --toggle-dot-background-color-active:var(--color-accent-primary-active); - --toggle-dot-background-color-on-pressed:var(--button-background-color); - --toggle-background-color-disabled:var(--button-background-color-disabled); - --toggle-border-color-hover:var(--border-interactive-color-hover); - --toggle-border-color-active:var(--border-interactive-color-active); - --toggle-border-color-disabled:var(--border-interactive-color-disabled); + .title{ + margin-inline-start:0; + } + + #editSignatureDescriptionAndView{ + width:auto; + display:flex; + justify-content:flex-end; + align-items:flex-start; + gap:12px; + align-self:stretch; + + #editSignatureDescriptionContainer{ + display:flex; + flex-direction:column; + align-items:flex-start; + gap:4px; + flex:1 1 auto; + } + + > svg{ + width:210px; + height:180px; + padding:8px; + background-color:var(--signature-bg); + + > path{ + stroke:var(--button-signature-color); + stroke-width:1px; + stroke-linecap:round; + stroke-linejoin:round; + stroke-miterlimit:10; + vector-effect:non-scaling-stroke; + fill:none; + + &.contours{ + fill:var(--button-signature-color); + stroke-width:0.5px; + } + } + } + } + } } - .toggle-button[aria-pressed="true"]:enabled::after{ - border:1px solid var(--button-background-color); +#editorSignatureParamsToolbar{ + padding:8px; + + #addSignatureDoorHanger{ + gap:8px; + padding:2px; + + .toolbarAddSignatureButtonContainer{ + height:32px; + display:flex; + justify-content:space-between; + align-items:center; + align-self:stretch; + gap:8px; + + button{ + border:var(--button-signature-border); + border-radius:4px; + background-color:var(--button-signature-bg); + color:var(--button-signature-color); + + &:hover{ + background-color:var(--button-signature-hover-bg); + } + + &:active{ + border:var(--button-signature-active-border); + background-color:var(--button-signature-active-bg); + color:var(--button-signature-active-color); + + &::before{ + background-color:var(--button-signature-active-color); + } + } + + &:focus-visible{ + outline:var(--focus-ring-outline); + + &::before{ + background-color:var(--button-signature-color); + } + } + } + + .deleteButton{ + &::before{ + -webkit-mask-image:var(--clear-signature-button-icon); + mask-image:var(--clear-signature-button-icon); + } + } + + .toolbarAddSignatureButton{ + width:calc(0.8 * var(--editor-toolbar-min-width)); + height:100%; + min-height:var(--menuitem-height); + aspect-ratio:unset; + display:flex; + align-items:center; + justify-content:flex-start; + outline:none; + border-radius:4px; + box-sizing:border-box; + font:message-box; + position:relative; + flex:1 1 auto; + padding:0; + gap:8px; + text-align:start; + white-space:normal; + cursor:default; + overflow:hidden; + + > svg{ + display:inline-block; + height:100%; + aspect-ratio:1; + background-color:var(--signature-bg); + flex:none; + padding:4px; + box-sizing:border-box; + border:none; + border-radius:4px; + + > path{ + stroke:var(--button-signature-color); + stroke-width:1px; + stroke-linecap:round; + stroke-linejoin:round; + stroke-miterlimit:10; + vector-effect:non-scaling-stroke; + fill:none; + + &.contours{ + fill:var(--button-signature-color); + stroke-width:0.5px; + } + } + } + + &:is(:hover, :active) > svg{ + border-radius:4px 0 0 4px; + background-color:var(--signature-hover-bg); + } + + &:hover{ + > span{ + color:var(--button-signature-hover-color); + } + } + + &:active{ + background-color:var(--button-signature-active-bg); + } + + &:is([disabled="disabled"], [disabled]){ + opacity:0.5; + pointer-events:none; + } + + > span{ + height:auto; + text-overflow:ellipsis; + white-space:nowrap; + flex:1 1 auto; + font:menu; + font-size:13px; + font-style:normal; + font-weight:400; + line-height:normal; + overflow:hidden; + } + } + } + } +} + +.editDescription.altText{ + --alt-text-add-image:url(images/editor-toolbar-edit.svg) !important; + + &::before{ + width:16px !important; + height:16px !important; + } +} + +.commentPopup, +#commentManagerDialog{ + width:360px; + max-width:100%; + min-width:200px; + position:absolute; + padding:8px 16px 16px; + margin-left:0; + margin-top:0; + box-sizing:border-box; + + border-radius:8px; +} + +#commentManagerDialog{ + --comment-close-button-icon:url(images/comment-closeButton.svg); + + .mainContainer{ + width:100%; + height:auto; + display:flex; + flex-direction:column; + align-items:flex-start; + gap:4px; + + #commentManagerToolbar{ + width:100%; + height:32px; + display:flex; + justify-content:flex-start; + align-items:flex-start; + gap:8px; + align-self:stretch; + + cursor:move; + } + + #commentManagerTextInput{ + width:100%; + min-height:132px; + margin-bottom:12px; + } + } +} + +.annotationLayer.disabled :is(.annotationCommentButton){ + display:none; +} + +:is(.annotationLayer, .annotationEditorLayer){ + .annotationCommentButton{ + color-scheme:light dark; + --comment-button-bg:light-dark(white, #1c1b22); + --comment-button-fg:light-dark(#5b5b66, #fbfbfe); + --comment-button-active-bg:light-dark(#0041a4, #a6ecf4); + --comment-button-active-fg:light-dark(white, #15141a); + --comment-button-hover-bg:light-dark(#0053cb, #61dce9); + --comment-button-hover-fg:light-dark(white, #15141a); + --comment-button-selected-bg:light-dark(#0062fa, #00cadb); + --comment-button-border-color:light-dark(#8f8f9d, #bfbfc9); + --comment-button-active-border-color:var(--comment-button-active-bg); + --comment-button-focus-border-color:light-dark(#cfcfd8, #3a3944); + --comment-button-hover-border-color:var(--comment-button-hover-bg); + --comment-button-selected-border-color:var(--comment-button-selected-bg); + --comment-button-selected-fg:light-dark(white, #15141a); + --comment-button-dim:24px; + --comment-button-box-shadow:0 0.25px 0.75px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 2px 6px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4)); + --comment-button-focus-outline-color:light-dark(#0062fa, #00cadb); + + @media screen and (forced-colors: active){ + --comment-button-bg:ButtonFace; + --comment-button-fg:ButtonText; + --comment-button-hover-bg:SelectedItemText; + --comment-button-hover-fg:SelectedItem; + --comment-button-active-bg:SelectedItemText; + --comment-button-active-fg:SelectedItem; + --comment-button-border-color:ButtonBorder; + --comment-button-active-border-color:ButtonBorder; + --comment-button-hover-border-color:SelectedItem; + --comment-button-box-shadow:none; + --comment-button-focus-outline-color:CanvasText; + --comment-button-selected-bg:ButtonBorder; + --comment-button-selected-fg:ButtonFace; + } + + position:absolute; + width:var(--comment-button-dim); + height:var(--comment-button-dim); + background-color:var(--comment-button-bg); + border-radius:6px 6px 6px 0; + border:1px solid var(--comment-button-border-color); + box-shadow:var(--comment-button-box-shadow); + cursor:auto; + z-index:1; + padding:4px; + margin:0; + box-sizing:border-box; + pointer-events:auto; + + &:dir(rtl){ + border-radius:6px 6px 0; + } + + &::before{ content:""; - position:absolute; - height:var(--toggle-height); - width:var(--toggle-width); - display:block; - border-radius:var(--toggle-border-radius); - inset:-2px; + display:inline-block; + width:100%; + height:100%; + -webkit-mask-repeat:no-repeat; + mask-repeat:no-repeat; + -webkit-mask-size:cover; + mask-size:cover; + -webkit-mask-image:var(--comment-edit-button-icon); + mask-image:var(--comment-edit-button-icon); + background-color:var(--comment-button-fg); + margin:0; + padding:0; + transform:scaleX(var(--dir-factor)); + } + + &:focus-visible{ + outline:2px solid var(--comment-button-focus-outline-color); + outline-offset:1px; + border-color:var(--comment-button-focus-border-color); + } + + &:hover{ + background-color:var(--comment-button-hover-bg) !important; + border-color:var(--comment-button-hover-border-color); + + &::before{ + background-color:var(--comment-button-hover-fg); + } + } + + &:active{ + background-color:var(--comment-button-active-bg) !important; + border-color:var(--comment-button-active-border-color); + + &::before{ + background-color:var(--comment-button-active-fg); + } + } + + &.selected{ + background-color:var(--comment-button-selected-bg) !important; + border-color:var(--comment-button-selected-border-color); + + &::before{ + background-color:var(--comment-button-selected-fg); + } + } + } +} + +#editorCommentsSidebar, +.commentPopup{ + --comment-close-button-icon:url(images/comment-closeButton.svg); + --comment-popup-edit-button-icon:url(images/comment-popup-editButton.svg); + --comment-popup-delete-button-icon:url(images/editor-toolbar-delete.svg); + + --comment-date-fg-color:light-dark( + rgb(21 20 26 / 0.69), + rgb(251 251 254 / 0.69) + ); + --comment-bg-color:light-dark(#f9f9fb, #1c1b22); + --comment-hover-bg-color:light-dark(#e0e0e6, #2c2b33); + --comment-active-bg-color:light-dark(#d1d1d9, #3a3944); + --comment-hover-brightness:0.89; + --comment-hover-filter:brightness(var(--comment-hover-brightness)); + --comment-active-brightness:0.825; + --comment-active-filter:brightness(var(--comment-active-brightness)); + --comment-border-color:light-dark(#f0f0f4, #52525e); + --comment-focus-outline-color:light-dark(#0062fa, #00cadb); + --comment-fg-color:light-dark(#15141a, #fbfbfe); + --comment-count-bg-color:light-dark(#e2f7ff, #00317e); + --comment-indicator-active-fg-color:light-dark(#0041a4, #a6ecf4); + --comment-indicator-active-filter:brightness( + calc(1 / var(--comment-active-brightness)) + ); + --comment-indicator-focus-fg-color:light-dark(#5b5b66, #fbfbfe); + --comment-indicator-hover-fg-color:light-dark(#0053cb, #61dce9); + --comment-indicator-hover-filter:brightness( + calc(1 / var(--comment-hover-brightness)) + ); + --comment-indicator-selected-fg-color:light-dark(#0062fa, #00cadb); + + --button-comment-bg:transparent; + --button-comment-color:var(--main-color); + --button-comment-active-bg:light-dark(#cfcfd8, #5b5b66); + --button-comment-active-border:none; + --button-comment-active-color:var(--button-comment-color); + --button-comment-border:none; + --button-comment-hover-bg:light-dark(#e0e0e6, #52525e); + --button-comment-hover-color:var(--button-comment-color); + + --link-fg-color:light-dark(#0060df, #0df); + --link-hover-fg-color:light-dark(#0250bb, #80ebff); + + @media screen and (forced-colors: active){ + --comment-date-fg-color:CanvasText; + --comment-bg-color:Canvas; + --comment-hover-bg-color:Canvas; + --comment-hover-filter:none; + --comment-active-bg-color:Canvas; + --comment-active-filter:none; + --comment-border-color:CanvasText; + --comment-fg-color:CanvasText; + --comment-count-bg-color:Canvas; + --comment-indicator-active-fg-color:SelectedItem; + --comment-indicator-focus-fg-color:CanvasText; + --comment-indicator-hover-fg-color:CanvasText; + --comment-indicator-selected-fg-color:SelectedItem; + --button-comment-bg:ButtonFace; + --button-comment-color:ButtonText; + --button-comment-active-bg:Highlight; + --button-comment-active-color:HighlightText; + --button-comment-border:1px solid ButtonText; + --button-comment-hover-bg:Highlight; + --button-comment-hover-color:HighlightText; + --link-fg-color:LinkText; + --link-hover-fg-color:LinkText; + } +} + +#editorCommentsSidebar{ + display:flex; + height:auto; + padding-bottom:16px; + flex-direction:column; + align-items:flex-start; + overflow-y:visible; + + #editorCommentsSidebarHeader{ + width:100%; + box-sizing:border-box; + padding:16px; + display:flex; + align-items:center; + justify-content:space-between; + + .commentCount{ + display:flex; + align-items:baseline; + gap:6px; + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + + #editorCommentsSidebarTitle{ + font:menu; + font-style:normal; + font-weight:590; + line-height:normal; + font-size:17px; + color:var(--comment-fg-color); + } + + #editorCommentsSidebarCount{ + padding:0 4px; + border-radius:4px; + background-color:var(--comment-count-bg-color); + + color:var(--comment-fg-color); + text-align:center; + + font:menu; + font-size:13px; + font-style:normal; + font-weight:400; + line-height:normal; + } } - .toggle-button[aria-pressed="true"]:enabled:active::after{ - border-color:var(--toggle-border-color-active); + #editorCommentsSidebarCloseButton{ + width:32px; + height:32px; + padding:8px; + border-radius:4px; + border:var(--button-comment-border); + background-color:var(--button-comment-bg); + cursor:pointer; + + &::before{ + content:""; + display:inline-block; + width:100%; + height:100%; + -webkit-mask-repeat:no-repeat; + mask-repeat:no-repeat; + -webkit-mask-position:center; + mask-position:center; + -webkit-mask-image:var(--comment-close-button-icon); + mask-image:var(--comment-close-button-icon); + background-color:var(--button-comment-color); + } + + &:hover{ + background-color:var(--button-comment-hover-bg); + + &::before{ + background-color:var(--button-comment-hover-color); + } + } + + &:active{ + border:var(--button-comment-active-border); + background-color:var(--button-comment-active-bg); + + &::before{ + background-color:var(--button-comment-active-color); + } + } + + &:focus-visible{ + outline:var(--focus-ring-outline); + } + + > span{ + display:inline-block; + width:0; + height:0; + overflow:hidden; + } } } + #editorCommentsSidebarListContainer{ + overflow:auto; + width:100%; + + #editorCommentsSidebarList{ + display:flex; + width:auto; + padding:4px 16px; + gap:10px; + align-items:flex-start; + flex-direction:column; + list-style-type:none; + + .sidebarComment{ + display:flex; + width:auto; + padding:8px 16px 16px; + flex-direction:column; + align-items:flex-start; + align-self:stretch; + gap:4px; + + border-radius:8px; + border:0.5px solid var(--comment-border-color); + background-color:var(--comment-bg-color); + + &:not(.noComments){ + &:hover{ + @media screen and (forced-colors: active){ + background-color:var(--comment-hover-bg-color); + } + filter:var(--comment-hover-filter); + + time::after{ + display:inline-block; + background-color:var(--comment-indicator-hover-fg-color); + filter:var(--comment-indicator-hover-filter); + } + } + + &:active{ + @media screen and (forced-colors: active){ + background-color:var(--comment-active-bg-color); + } + filter:var(--comment-active-filter); + + time::after{ + display:inline-block; + background-color:var(--comment-indicator-active-fg-color); + filter:var(--comment-indicator-active-filter); + } + } + + &:is(:focus, :focus-visible) time::after{ + display:inline-block; + background-color:var(--comment-indicator-focus-fg-color); + } + + &:focus-visible{ + outline:2px solid var(--comment-focus-outline-color); + outline-offset:2px; + } + + &.selected{ + .sidebarCommentText{ + max-height:-moz-fit-content; + max-height:fit-content; + -webkit-line-clamp:unset; + } + + time::after{ + display:inline-block; + background-color:var(--comment-indicator-selected-fg-color); + } + } + } + + .sidebarCommentText{ + font:menu; + font-style:normal; + font-weight:400; + line-height:normal; + font-size:15px; + width:100%; + height:-moz-fit-content; + height:fit-content; + max-height:80px; + display:-webkit-box; + -webkit-box-orient:vertical; + -webkit-line-clamp:2; + overflow:hidden; + overflow-wrap:break-word; + + .richText{ + --total-scale-factor:1.5; + } + } + + &.noComments{ + .sidebarCommentText{ + max-height:-moz-fit-content; + max-height:fit-content; + -webkit-line-clamp:unset; + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + } + + a{ + font:menu; + font-style:normal; + font-weight:400; + line-height:normal; + font-size:15px; + width:100%; + height:auto; + overflow-wrap:break-word; + margin-block-start:15px; + color:var(--link-fg-color); + + &:focus-visible{ + outline:var(--focus-ring-outline); + } + + &:hover{ + color:var(--link-hover-fg-color); + } + } + } + + time{ + width:100%; + display:inline-flex; + align-items:center; + justify-content:space-between; + + font:menu; + font-style:normal; + font-weight:400; + line-height:normal; + font-size:13px; + + &::after{ + content:""; + display:none; + width:16px; + height:16px; + -webkit-mask-repeat:no-repeat; + mask-repeat:no-repeat; + -webkit-mask-position:center; + mask-position:center; + -webkit-mask-image:var(--comment-edit-button-icon); + mask-image:var(--comment-edit-button-icon); + transform:scaleX(var(--dir-factor)); + } + } + } + } + } +} + +.commentPopup{ + color-scheme:light dark; + + --divider-color:light-dark(#cfcfd8, #3a3944); + --comment-shadow:0 0.5px 2px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 4px 16px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4)); + + @media screen and (forced-colors: active){ + --divider-color:CanvasText; + --comment-shadow:none; + } + + display:flex; + flex-direction:column; + align-items:flex-start; + gap:12px; + z-index:100001; + pointer-events:auto; + margin-top:2px; + + border:0.5px solid var(--comment-border-color); + background:var(--comment-bg-color); + box-shadow:var(--comment-shadow); + + &:focus-visible{ + outline:none; + } + + &.dragging{ + cursor:move !important; + + *{ + cursor:move !important; + } + + button{ + pointer-events:none !important; + } + } + + &:not(.selected) .commentPopupButtons{ + visibility:hidden !important; + } + + hr{ + width:100%; + height:1px; + border:none; + border-top:1px solid var(--divider-color); + margin:0; + padding:0; + } + + .commentPopupTop{ + display:flex; + width:100%; + height:auto; + padding-bottom:4px; + justify-content:space-between; + align-items:center; + align-self:stretch; + cursor:move; + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + + .commentPopupTime{ + font:menu; + font-style:normal; + font-weight:400; + line-height:normal; + font-size:13px; + color:var(--comment-date-fg-color); + } + + .commentPopupButtons{ + display:flex; + align-items:center; + gap:2px; + cursor:default; + + > button{ + width:32px; + height:32px; + padding:8px; + border:var(--button-comment-border); + border-radius:4px; + background-color:var(--button-comment-bg); + color:var(--button-comment-color); + + &:hover{ + background-color:var(--button-comment-hover-bg); + + &::before{ + background-color:var(--button-comment-hover-color); + } + } + + &:active{ + border:var(--button-comment-active-border); + background-color:var(--button-comment-active-bg); + color:var(--button-comment-active-color); + + &::before{ + background-color:var(--button-comment-active-color); + } + } + + &:focus-visible{ + background-color:var(--button-comment-hover-bg); + outline:2px solid var(--comment-focus-outline-color); + outline-offset:0; + } + + &::before{ + content:""; + display:inline-block; + width:100%; + height:100%; + -webkit-mask-repeat:no-repeat; + mask-repeat:no-repeat; + -webkit-mask-position:center; + mask-position:center; + } + + &.commentPopupEdit::before{ + -webkit-mask-image:var(--comment-popup-edit-button-icon); + mask-image:var(--comment-popup-edit-button-icon); + } + + &.commentPopupDelete::before{ + -webkit-mask-image:var(--comment-popup-delete-button-icon); + mask-image:var(--comment-popup-delete-button-icon); + } + } + } + } + + .commentPopupText{ + width:100%; + height:auto; + + font:menu; + font-style:normal; + font-weight:400; + line-height:normal; + font-size:15px; + color:var(--comment-fg-color); + } +} + +.commentPopupText, +.sidebarCommentText .richText{ + margin-block:0; + + p:first-of-type{ + margin-block:0; + } + + > *{ + white-space:pre-wrap; + font-size:max(15px, calc(10px * var(--total-scale-factor))); + overflow-wrap:break-word; + } + + span{ + color:var(--comment-fg-color) !important; + } +} + :root{ + --editor-toolbar-vert-offset:6px; --outline-width:2px; --outline-color:#0060df; --outline-around-width:1px; @@ -1125,34 +3385,43 @@ --editorInk-editing-cursor:url(images/cursor-editorInk.svg) 0 16, pointer; --editorHighlight-editing-cursor:url(images/cursor-editorTextHighlight.svg) 24 24, text; --editorFreeHighlight-editing-cursor:url(images/cursor-editorFreeHighlight.svg) 1 18, pointer; -} -.visuallyHidden{ - position:absolute; - top:0; - left:0; - border:0; - margin:0; - padding:0; - width:0; - height:0; - overflow:hidden; - white-space:nowrap; - font-size:0; -} -.textLayer.highlighting{ - cursor:var(--editorFreeHighlight-editing-cursor); + --new-alt-text-warning-image:url(images/altText_warning.svg); } -.textLayer.highlighting:not(.free) span{ - cursor:var(--editorHighlight-editing-cursor); +.textLayer{ + &.highlighting{ + cursor:var(--editorFreeHighlight-editing-cursor); + + &:not(.free) span{ + cursor:var(--editorHighlight-editing-cursor); + + &[role="img"]{ + cursor:var(--editorFreeHighlight-editing-cursor); + } + } + + &.free span{ + cursor:var(--editorFreeHighlight-editing-cursor); + } } +} -.textLayer.highlighting.free span{ - cursor:var(--editorFreeHighlight-editing-cursor); +.page:has(.annotationEditorLayer.nonEditing) + .annotationLayer + .editorAnnotation{ + position:absolute; + pointer-events:none; +} + +#viewerContainer.pdfPresentationMode:fullscreen, +.annotationEditorLayer.disabled{ + .noAltTextBadge{ + display:none !important; } +} -@media (-webkit-min-device-pixel-ratio: 1.1), (min-resolution: 1.1dppx){ +@media (min-resolution: 1.1dppx){ :root{ --editorFreeText-editing-cursor:url(images/cursor-editorFreeText.svg) 0 16, text; } @@ -1184,9 +3453,24 @@ background:transparent; position:absolute; inset:0; - font-size:calc(100px * var(--scale-factor)); + font-size:calc(100px * var(--total-scale-factor)); transform-origin:0 0; cursor:auto; + + .selectedEditor{ + z-index:100000 !important; + } + + &.drawing *{ + pointer-events:none !important; + } + + &.getElements{ + pointer-events:auto !important; + > div{ + pointer-events:auto !important; + } + } } .annotationEditorLayer.waiting{ @@ -1200,6 +3484,17 @@ .annotationEditorLayer.disabled{ pointer-events:none; + + &.highlightEditing + :is( + .freeTextEditor, + .inkEditor, + .stampEditor, + .signatureEditor, + .commentPopup + ){ + pointer-events:auto; + } } .annotationEditorLayer.freetextEditing{ @@ -1210,7 +3505,12 @@ cursor:var(--editorInk-editing-cursor); } -.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor){ +.annotationEditorLayer .draw{ + box-sizing:border-box; +} + +.annotationEditorLayer + :is(.freeTextEditor, .inkEditor, .stampEditor, .signatureEditor){ position:absolute; background:transparent; z-index:1; @@ -1219,57 +3519,80 @@ max-width:100%; max-height:100%; border:var(--unfocus-outline); -} -.annotationEditorLayer .draggable.selectedEditor:is(.freeTextEditor, .inkEditor, .stampEditor){ + &.draggable.selectedEditor{ cursor:move; } -.annotationEditorLayer .moving:is(.freeTextEditor, .inkEditor, .stampEditor){ - touch-action:none; - } - -.annotationEditorLayer .selectedEditor:is(.freeTextEditor, .inkEditor, .stampEditor){ + &.selectedEditor{ border:var(--focus-outline); outline:var(--focus-outline-around); - } -.annotationEditorLayer .selectedEditor:is(.freeTextEditor, .inkEditor, .stampEditor)::before{ + &::before{ content:""; position:absolute; inset:0; border:var(--focus-outline-around); pointer-events:none; } + } -.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor):hover:not(.selectedEditor){ + &:hover:not(.selectedEditor){ border:var(--hover-outline); outline:var(--hover-outline-around); - } -.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor):hover:not(.selectedEditor)::before{ + &::before{ content:""; position:absolute; inset:0; border:var(--focus-outline-around); } + } +} -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar{ +.annotationEditorLayer + :is( + .freeTextEditor, + .inkEditor, + .stampEditor, + .highlightEditor, + .signatureEditor + ), +.textLayer{ + .editToolbar{ --editor-toolbar-delete-image:url(images/editor-toolbar-delete.svg); - --editor-toolbar-bg-color:#f0f0f4; + --editor-toolbar-bg-color:light-dark(#f0f0f4, #2b2a33); --editor-toolbar-highlight-image:url(images/toolbarButton-editorHighlight.svg); - --editor-toolbar-fg-color:#2e2e56; + --editor-toolbar-fg-color:light-dark(#2e2e56, #fbfbfe); --editor-toolbar-border-color:#8f8f9d; --editor-toolbar-hover-border-color:var(--editor-toolbar-border-color); - --editor-toolbar-hover-bg-color:#e0e0e6; + --editor-toolbar-hover-bg-color:light-dark(#e0e0e6, #52525e); --editor-toolbar-hover-fg-color:var(--editor-toolbar-fg-color); --editor-toolbar-hover-outline:none; - --editor-toolbar-focus-outline-color:#0060df; + --editor-toolbar-focus-outline-color:light-dark(#0060df, #0df); --editor-toolbar-shadow:0 2px 6px 0 rgb(58 57 68 / 0.2); - --editor-toolbar-vert-offset:6px; --editor-toolbar-height:28px; --editor-toolbar-padding:2px; + --alt-text-done-color:light-dark(#2ac3a2, #54ffbd); + --alt-text-warning-color:light-dark(#0090ed, #80ebff); + --alt-text-hover-done-color:var(--alt-text-done-color); + --alt-text-hover-warning-color:var(--alt-text-warning-color); + + @media screen and (forced-colors: active){ + --editor-toolbar-bg-color:ButtonFace; + --editor-toolbar-fg-color:ButtonText; + --editor-toolbar-border-color:ButtonText; + --editor-toolbar-hover-border-color:AccentColor; + --editor-toolbar-hover-bg-color:ButtonFace; + --editor-toolbar-hover-fg-color:AccentColor; + --editor-toolbar-hover-outline:2px solid var(--editor-toolbar-hover-border-color); + --editor-toolbar-focus-outline-color:ButtonBorder; + --editor-toolbar-shadow:none; + --alt-text-done-color:var(--editor-toolbar-fg-color); + --alt-text-warning-color:var(--editor-toolbar-fg-color); + --alt-text-hover-done-color:var(--editor-toolbar-hover-fg-color); + --alt-text-hover-warning-color:var(--editor-toolbar-hover-fg-color); + } display:flex; width:-moz-fit-content; @@ -1282,6 +3605,9 @@ pointer-events:auto; box-sizing:content-box; padding:var(--editor-toolbar-padding); + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; position:absolute; inset-inline-end:0; @@ -1291,93 +3617,50 @@ background-color:var(--editor-toolbar-bg-color); border:1px solid var(--editor-toolbar-border-color); box-shadow:var(--editor-toolbar-shadow); - } - -@media (prefers-color-scheme: dark){ - -:where(html:not(.is-light)) :is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar{ - --editor-toolbar-bg-color:#2b2a33; - --editor-toolbar-fg-color:#fbfbfe; - --editor-toolbar-hover-bg-color:#52525e; - --editor-toolbar-focus-outline-color:#0df; - } - } - -:where(html.is-dark) :is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar{ - --editor-toolbar-bg-color:#2b2a33; - --editor-toolbar-fg-color:#fbfbfe; - --editor-toolbar-hover-bg-color:#52525e; - --editor-toolbar-focus-outline-color:#0df; - } - -@media screen and (forced-colors: active){ - -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar{ - --editor-toolbar-bg-color:ButtonFace; - --editor-toolbar-fg-color:ButtonText; - --editor-toolbar-border-color:ButtonText; - --editor-toolbar-hover-border-color:AccentColor; - --editor-toolbar-hover-bg-color:ButtonFace; - --editor-toolbar-hover-fg-color:AccentColor; - --editor-toolbar-hover-outline:2px solid var(--editor-toolbar-hover-border-color); - --editor-toolbar-focus-outline-color:ButtonBorder; - --editor-toolbar-shadow:none; - } - } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar.hidden{ + &.hidden{ display:none; } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar:has(:focus-visible){ + &:has(:focus-visible){ border-color:transparent; } -[dir="ltr"] :is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar{ + &:dir(ltr){ transform-origin:100% 0; } -[dir="rtl"] :is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar{ + &:dir(rtl){ transform-origin:0 0; } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons{ + .buttons{ display:flex; justify-content:center; align-items:center; gap:0; height:100%; - } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons .divider{ - width:1px; + button{ + padding:0; + } + + .divider{ + width:0; height:calc( 2 * var(--editor-toolbar-padding) + var(--editor-toolbar-height) ); - background-color:var(--editor-toolbar-border-color); + border-left:1px solid var(--editor-toolbar-border-color); + border-right:none; display:inline-block; margin-inline:2px; } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons .highlightButton{ + .basic{ width:var(--editor-toolbar-height); - } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons .highlightButton::before{ + &::before{ content:""; - -webkit-mask-image:var(--editor-toolbar-highlight-image); - mask-image:var(--editor-toolbar-highlight-image); -webkit-mask-repeat:no-repeat; mask-repeat:no-repeat; -webkit-mask-position:center; @@ -1388,70 +3671,54 @@ height:100%; } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons .highlightButton:hover::before{ + &:hover::before{ background-color:var(--editor-toolbar-hover-fg-color); } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons .delete{ - width:var(--editor-toolbar-height); - } + &.highlightButton::before{ + -webkit-mask-image:var(--editor-toolbar-highlight-image); + mask-image:var(--editor-toolbar-highlight-image); + } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons .delete::before{ - content:""; - -webkit-mask-image:var(--editor-toolbar-delete-image); - mask-image:var(--editor-toolbar-delete-image); - -webkit-mask-repeat:no-repeat; - mask-repeat:no-repeat; - -webkit-mask-position:center; - mask-position:center; - display:inline-block; - background-color:var(--editor-toolbar-fg-color); - width:100%; - height:100%; + &.commentButton::before{ + -webkit-mask-image:var(--comment-edit-button-icon); + mask-image:var(--comment-edit-button-icon); } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons .delete:hover::before{ - background-color:var(--editor-toolbar-hover-fg-color); + &.deleteButton::before{ + -webkit-mask-image:var(--editor-toolbar-delete-image); + mask-image:var(--editor-toolbar-delete-image); } + } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons > *{ + > *{ height:var(--editor-toolbar-height); } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons > :not(.divider){ + > :not(.divider){ border:none; background-color:transparent; cursor:pointer; - } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons > :not(.divider):hover{ + &:hover{ border-radius:2px; background-color:var(--editor-toolbar-hover-bg-color); color:var(--editor-toolbar-hover-fg-color); outline:var(--editor-toolbar-hover-outline); outline-offset:1px; - } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons > :not(.divider):hover:active{ + &:active{ outline:none; } + } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons > :not(.divider):focus-visible{ + &:focus-visible{ border-radius:2px; outline:2px solid var(--editor-toolbar-focus-outline-color); } + } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons .altText{ + .altText{ --alt-text-add-image:url(images/altText_add.svg); --alt-text-done-image:url(images/altText_done.svg); @@ -1466,15 +3733,12 @@ font-weight:590; font-size:12px; color:var(--editor-toolbar-fg-color); - } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons .altText:disabled{ + &:disabled{ pointer-events:none; } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons .altText::before{ + &::before{ content:""; -webkit-mask-image:var(--alt-text-add-image); mask-image:var(--alt-text-add-image); @@ -1489,28 +3753,59 @@ margin-inline-end:4px; } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons .altText:hover::before{ + &:hover::before{ background-color:var(--editor-toolbar-hover-fg-color); } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons .altText.done::before{ + &.done::before{ -webkit-mask-image:var(--alt-text-done-image); mask-image:var(--alt-text-done-image); } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons .altText .tooltip{ - display:none; + &.new{ + &::before{ + width:16px; + height:16px; + -webkit-mask-image:var(--new-alt-text-warning-image); + mask-image:var(--new-alt-text-warning-image); + background-color:var(--alt-text-warning-color); + -webkit-mask-size:cover; + mask-size:cover; + } + + &:hover::before{ + background-color:var(--alt-text-hover-warning-color); + } + + &.done{ + &::before{ + -webkit-mask-image:var(--alt-text-done-image); + mask-image:var(--alt-text-done-image); + background-color:var(--alt-text-done-color); + } + + &:hover::before{ + background-color:var(--alt-text-hover-done-color); + } + } } -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons .altText .tooltip.show{ - --alt-text-tooltip-bg:#f0f0f4; - --alt-text-tooltip-fg:#15141a; + .tooltip{ + display:none; + word-wrap:anywhere; + + &.show{ + --alt-text-tooltip-bg:light-dark(#f0f0f4, #1c1b22); + --alt-text-tooltip-fg:light-dark(#15141a, #fbfbfe); --alt-text-tooltip-border:#8f8f9d; - --alt-text-tooltip-shadow:0px 2px 6px 0px rgb(58 57 68 / 0.2); + --alt-text-tooltip-shadow:0 2px 6px 0 light-dark(rgb(58 57 68 / 0.2), #15141a); + + @media screen and (forced-colors: active){ + --alt-text-tooltip-bg:Canvas; + --alt-text-tooltip-fg:CanvasText; + --alt-text-tooltip-border:CanvasText; + --alt-text-tooltip-shadow:none; + } display:inline-flex; flex-direction:column; @@ -1534,37 +3829,32 @@ pointer-events:none; } + } + } -@media (prefers-color-scheme: dark){ - -:where(html:not(.is-light)) :is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons .altText .tooltip.show{ - --alt-text-tooltip-bg:#1c1b22; - --alt-text-tooltip-fg:#fbfbfe; - --alt-text-tooltip-shadow:0px 2px 6px 0px #15141a; - } - } - -:where(html.is-dark) :is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons .altText .tooltip.show{ - --alt-text-tooltip-bg:#1c1b22; - --alt-text-tooltip-fg:#fbfbfe; - --alt-text-tooltip-shadow:0px 2px 6px 0px #15141a; - } - -@media screen and (forced-colors: active){ + .comment{ + width:var(--editor-toolbar-height); -:is(.annotationEditorLayer - :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor),.textLayer) .editToolbar .buttons .altText .tooltip.show{ - --alt-text-tooltip-bg:Canvas; - --alt-text-tooltip-fg:CanvasText; - --alt-text-tooltip-border:CanvasText; - --alt-text-tooltip-shadow:none; - } - } + &::before{ + content:""; + -webkit-mask-image:var(--comment-edit-button-icon); + mask-image:var(--comment-edit-button-icon); + -webkit-mask-repeat:no-repeat; + mask-repeat:no-repeat; + -webkit-mask-position:center; + mask-position:center; + display:inline-block; + background-color:var(--editor-toolbar-fg-color); + width:100%; + height:100%; + } + } + } + } +} .annotationEditorLayer .freeTextEditor{ - padding:calc(var(--freetext-padding) * var(--scale-factor)); + padding:calc(var(--freetext-padding) * var(--total-scale-factor)); width:auto; height:auto; touch-action:none; @@ -1578,6 +3868,7 @@ white-space:nowrap; font:10px sans-serif; line-height:var(--freetext-line-height); + text-align:start; -webkit-user-select:none; -moz-user-select:none; user-select:none; @@ -1628,429 +3919,250 @@ .annotationEditorLayer .stampEditor{ width:auto; height:auto; -} -.annotationEditorLayer .stampEditor canvas{ - width:100%; - height:100%; + canvas{ + position:absolute; + width:100%; + height:100%; + margin:0; + top:0; + left:0; + } + + .noAltTextBadge{ + --no-alt-text-badge-border-color:light-dark(#f0f0f4, #52525e); + --no-alt-text-badge-bg-color:light-dark(#cfcfd8, #fbfbfe); + --no-alt-text-badge-fg-color:light-dark(#5b5b66, #15141a); + + @media screen and (forced-colors: active){ + --no-alt-text-badge-border-color:ButtonText; + --no-alt-text-badge-bg-color:ButtonFace; + --no-alt-text-badge-fg-color:ButtonText; + } + + position:absolute; + inset-inline-end:5px; + inset-block-end:5px; + display:inline-flex; + width:32px; + height:32px; + padding:3px; + justify-content:center; + align-items:center; + pointer-events:none; + z-index:1; + + border-radius:2px; + border:1px solid var(--no-alt-text-badge-border-color); + background:var(--no-alt-text-badge-bg-color); + + &::before{ + content:""; + display:inline-block; + width:16px; + height:16px; + -webkit-mask-image:var(--new-alt-text-warning-image); + mask-image:var(--new-alt-text-warning-image); + -webkit-mask-size:cover; + mask-size:cover; + background-color:var(--no-alt-text-badge-fg-color); + } + } } -.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers{ +.annotationEditorLayer{ + :is(.freeTextEditor, .inkEditor, .stampEditor, .signatureEditor){ + & > .resizers{ position:absolute; inset:0; - } + z-index:1; -.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers.hidden{ + &.hidden{ display:none; } -.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers > .resizer{ + & > .resizer{ width:var(--resizer-size); height:var(--resizer-size); background:content-box var(--resizer-bg-color); border:var(--focus-outline-around); border-radius:2px; position:absolute; - } -.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers > .resizer.topLeft{ + &.topLeft{ top:var(--resizer-shift); left:var(--resizer-shift); } -.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers > .resizer.topMiddle{ + &.topMiddle{ top:var(--resizer-shift); left:calc(50% + var(--resizer-shift)); } -.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers > .resizer.topRight{ + &.topRight{ top:var(--resizer-shift); right:var(--resizer-shift); } -.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers > .resizer.middleRight{ + &.middleRight{ top:calc(50% + var(--resizer-shift)); right:var(--resizer-shift); } -.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers > .resizer.bottomRight{ + &.bottomRight{ bottom:var(--resizer-shift); right:var(--resizer-shift); } -.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers > .resizer.bottomMiddle{ + &.bottomMiddle{ bottom:var(--resizer-shift); left:calc(50% + var(--resizer-shift)); } -.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers > .resizer.bottomLeft{ + &.bottomLeft{ bottom:var(--resizer-shift); left:var(--resizer-shift); } -.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor) > .resizers > .resizer.middleLeft{ + &.middleLeft{ top:calc(50% + var(--resizer-shift)); left:var(--resizer-shift); } + } + } + } -.annotationEditorLayer[data-main-rotation="0"] - :is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.topLeft, - .annotationEditorLayer[data-main-rotation="90"] - :is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.topLeft, - .annotationEditorLayer[data-main-rotation="180"] - :is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.topLeft, - .annotationEditorLayer[data-main-rotation="270"] - :is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.topLeft, - .annotationEditorLayer[data-main-rotation="0"] - :is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.bottomRight, - .annotationEditorLayer[data-main-rotation="90"] - :is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.bottomRight, - .annotationEditorLayer[data-main-rotation="180"] - :is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.bottomRight, - .annotationEditorLayer[data-main-rotation="270"] - :is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.bottomRight{ + &[data-main-rotation="0"] + :is([data-editor-rotation="0"], [data-editor-rotation="180"]), + &[data-main-rotation="90"] + :is([data-editor-rotation="270"], [data-editor-rotation="90"]), + &[data-main-rotation="180"] + :is([data-editor-rotation="180"], [data-editor-rotation="0"]), + &[data-main-rotation="270"] + :is([data-editor-rotation="90"], [data-editor-rotation="270"]){ + & > .resizers > .resizer{ + &.topLeft, + &.bottomRight{ cursor:nwse-resize; } -.annotationEditorLayer[data-main-rotation="0"] - :is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.topMiddle, - .annotationEditorLayer[data-main-rotation="90"] - :is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.topMiddle, - .annotationEditorLayer[data-main-rotation="180"] - :is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.topMiddle, - .annotationEditorLayer[data-main-rotation="270"] - :is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.topMiddle, - .annotationEditorLayer[data-main-rotation="0"] - :is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.bottomMiddle, - .annotationEditorLayer[data-main-rotation="90"] - :is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.bottomMiddle, - .annotationEditorLayer[data-main-rotation="180"] - :is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.bottomMiddle, - .annotationEditorLayer[data-main-rotation="270"] - :is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.bottomMiddle{ + &.topMiddle, + &.bottomMiddle{ cursor:ns-resize; } -.annotationEditorLayer[data-main-rotation="0"] - :is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.topRight, - .annotationEditorLayer[data-main-rotation="90"] - :is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.topRight, - .annotationEditorLayer[data-main-rotation="180"] - :is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.topRight, - .annotationEditorLayer[data-main-rotation="270"] - :is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.topRight, - .annotationEditorLayer[data-main-rotation="0"] - :is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.bottomLeft, - .annotationEditorLayer[data-main-rotation="90"] - :is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.bottomLeft, - .annotationEditorLayer[data-main-rotation="180"] - :is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.bottomLeft, - .annotationEditorLayer[data-main-rotation="270"] - :is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.bottomLeft{ + &.topRight, + &.bottomLeft{ cursor:nesw-resize; } -.annotationEditorLayer[data-main-rotation="0"] - :is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.middleRight, - .annotationEditorLayer[data-main-rotation="90"] - :is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.middleRight, - .annotationEditorLayer[data-main-rotation="180"] - :is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.middleRight, - .annotationEditorLayer[data-main-rotation="270"] - :is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.middleRight, - .annotationEditorLayer[data-main-rotation="0"] - :is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.middleLeft, - .annotationEditorLayer[data-main-rotation="90"] - :is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.middleLeft, - .annotationEditorLayer[data-main-rotation="180"] - :is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.middleLeft, - .annotationEditorLayer[data-main-rotation="270"] - :is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.middleLeft{ + &.middleRight, + &.middleLeft{ cursor:ew-resize; } + } + } -.annotationEditorLayer[data-main-rotation="0"] - :is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.topLeft, - .annotationEditorLayer[data-main-rotation="90"] - :is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.topLeft, - .annotationEditorLayer[data-main-rotation="180"] - :is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.topLeft, - .annotationEditorLayer[data-main-rotation="270"] - :is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.topLeft, - .annotationEditorLayer[data-main-rotation="0"] - :is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.bottomRight, - .annotationEditorLayer[data-main-rotation="90"] - :is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.bottomRight, - .annotationEditorLayer[data-main-rotation="180"] - :is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.bottomRight, - .annotationEditorLayer[data-main-rotation="270"] - :is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.bottomRight{ + &[data-main-rotation="0"] + :is([data-editor-rotation="90"], [data-editor-rotation="270"]), + &[data-main-rotation="90"] + :is([data-editor-rotation="0"], [data-editor-rotation="180"]), + &[data-main-rotation="180"] + :is([data-editor-rotation="270"], [data-editor-rotation="90"]), + &[data-main-rotation="270"] + :is([data-editor-rotation="180"], [data-editor-rotation="0"]){ + & > .resizers > .resizer{ + &.topLeft, + &.bottomRight{ cursor:nesw-resize; } -.annotationEditorLayer[data-main-rotation="0"] - :is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.topMiddle, - .annotationEditorLayer[data-main-rotation="90"] - :is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.topMiddle, - .annotationEditorLayer[data-main-rotation="180"] - :is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.topMiddle, - .annotationEditorLayer[data-main-rotation="270"] - :is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.topMiddle, - .annotationEditorLayer[data-main-rotation="0"] - :is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.bottomMiddle, - .annotationEditorLayer[data-main-rotation="90"] - :is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.bottomMiddle, - .annotationEditorLayer[data-main-rotation="180"] - :is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.bottomMiddle, - .annotationEditorLayer[data-main-rotation="270"] - :is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.bottomMiddle{ + &.topMiddle, + &.bottomMiddle{ cursor:ew-resize; } -.annotationEditorLayer[data-main-rotation="0"] - :is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.topRight, - .annotationEditorLayer[data-main-rotation="90"] - :is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.topRight, - .annotationEditorLayer[data-main-rotation="180"] - :is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.topRight, - .annotationEditorLayer[data-main-rotation="270"] - :is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.topRight, - .annotationEditorLayer[data-main-rotation="0"] - :is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.bottomLeft, - .annotationEditorLayer[data-main-rotation="90"] - :is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.bottomLeft, - .annotationEditorLayer[data-main-rotation="180"] - :is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.bottomLeft, - .annotationEditorLayer[data-main-rotation="270"] - :is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.bottomLeft{ + &.topRight, + &.bottomLeft{ cursor:nwse-resize; } -.annotationEditorLayer[data-main-rotation="0"] - :is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.middleRight, - .annotationEditorLayer[data-main-rotation="90"] - :is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.middleRight, - .annotationEditorLayer[data-main-rotation="180"] - :is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.middleRight, - .annotationEditorLayer[data-main-rotation="270"] - :is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.middleRight, - .annotationEditorLayer[data-main-rotation="0"] - :is([data-editor-rotation="90"], [data-editor-rotation="270"]) > .resizers > .resizer.middleLeft, - .annotationEditorLayer[data-main-rotation="90"] - :is([data-editor-rotation="0"], [data-editor-rotation="180"]) > .resizers > .resizer.middleLeft, - .annotationEditorLayer[data-main-rotation="180"] - :is([data-editor-rotation="270"], [data-editor-rotation="90"]) > .resizers > .resizer.middleLeft, - .annotationEditorLayer[data-main-rotation="270"] - :is([data-editor-rotation="180"], [data-editor-rotation="0"]) > .resizers > .resizer.middleLeft{ + &.middleRight, + &.middleLeft{ cursor:ns-resize; } + } + } -.annotationEditorLayer + & :is( [data-main-rotation="0"] [data-editor-rotation="90"], [data-main-rotation="90"] [data-editor-rotation="0"], [data-main-rotation="180"] [data-editor-rotation="270"], [data-main-rotation="270"] [data-editor-rotation="180"] - ) .editToolbar{ + ){ + .editToolbar{ rotate:270deg; - } -[dir="ltr"] .annotationEditorLayer - :is( - [data-main-rotation="0"] [data-editor-rotation="90"], - [data-main-rotation="90"] [data-editor-rotation="0"], - [data-main-rotation="180"] [data-editor-rotation="270"], - [data-main-rotation="270"] [data-editor-rotation="180"] - ) .editToolbar{ + &:dir(ltr){ inset-inline-end:calc(0px - var(--editor-toolbar-vert-offset)); inset-block-start:0; } -[dir="rtl"] .annotationEditorLayer - :is( - [data-main-rotation="0"] [data-editor-rotation="90"], - [data-main-rotation="90"] [data-editor-rotation="0"], - [data-main-rotation="180"] [data-editor-rotation="270"], - [data-main-rotation="270"] [data-editor-rotation="180"] - ) .editToolbar{ + &:dir(rtl){ inset-inline-end:calc(100% + var(--editor-toolbar-vert-offset)); inset-block-start:0; } + } + } -.annotationEditorLayer + & :is( [data-main-rotation="0"] [data-editor-rotation="180"], [data-main-rotation="90"] [data-editor-rotation="90"], [data-main-rotation="180"] [data-editor-rotation="0"], [data-main-rotation="270"] [data-editor-rotation="270"] - ) .editToolbar{ + ){ + .editToolbar{ rotate:180deg; inset-inline-end:100%; - inset-block-start:calc(0pc - var(--editor-toolbar-vert-offset)); + inset-block-start:calc(0px - var(--editor-toolbar-vert-offset)); } + } -.annotationEditorLayer + & :is( [data-main-rotation="0"] [data-editor-rotation="270"], [data-main-rotation="90"] [data-editor-rotation="180"], [data-main-rotation="180"] [data-editor-rotation="90"], [data-main-rotation="270"] [data-editor-rotation="0"] - ) .editToolbar{ + ){ + .editToolbar{ rotate:90deg; - } -[dir="ltr"] .annotationEditorLayer - :is( - [data-main-rotation="0"] [data-editor-rotation="270"], - [data-main-rotation="90"] [data-editor-rotation="180"], - [data-main-rotation="180"] [data-editor-rotation="90"], - [data-main-rotation="270"] [data-editor-rotation="0"] - ) .editToolbar{ + &:dir(ltr){ inset-inline-end:calc(100% + var(--editor-toolbar-vert-offset)); inset-block-start:100%; } -[dir="rtl"] .annotationEditorLayer - :is( - [data-main-rotation="0"] [data-editor-rotation="270"], - [data-main-rotation="90"] [data-editor-rotation="180"], - [data-main-rotation="180"] [data-editor-rotation="90"], - [data-main-rotation="270"] [data-editor-rotation="0"] - ) .editToolbar{ + &:dir(rtl){ inset-inline-start:calc(0px - var(--editor-toolbar-vert-offset)); inset-block-start:0; } - -#altTextDialog{ - --dialog-bg-color:white; - --dialog-border-color:white; - --dialog-shadow:0 2px 14px 0 rgb(58 57 68 / 0.2); - --text-primary-color:#15141a; - --text-secondary-color:#5b5b66; - --hover-filter:brightness(0.9); - --focus-ring-color:#0060df; - --focus-ring-outline:2px solid var(--focus-ring-color); - - --textarea-border-color:#8f8f9d; - --textarea-bg-color:white; - --textarea-fg-color:var(--text-secondary-color); - - --radio-bg-color:#f0f0f4; - --radio-checked-bg-color:#fbfbfe; - --radio-border-color:#8f8f9d; - --radio-checked-border-color:#0060df; - - --button-cancel-bg-color:#f0f0f4; - --button-cancel-fg-color:var(--text-primary-color); - --button-cancel-border-color:var(--button-cancel-bg-color); - --button-cancel-hover-bg-color:var(--button-cancel-bg-color); - --button-cancel-hover-fg-color:var(--button-cancel-fg-color); - --button-cancel-hover-border-color:var(--button-cancel-hover-bg-color); - - --button-save-bg-color:#0060df; - --button-save-fg-color:#fbfbfe; - --button-save-hover-bg-color:var(--button-save-bg-color); - --button-save-hover-fg-color:var(--button-save-fg-color); - --button-save-hover-border-color:var(--button-save-hover-bg-color); - - font:message-box; - font-size:13px; - font-weight:400; - line-height:150%; - border-radius:4px; - padding:12px 16px; - border:1px solid var(--dialog-border-color); - background:var(--dialog-bg-color); - color:var(--text-primary-color); - box-shadow:var(--dialog-shadow); -} - -@media (prefers-color-scheme: dark){ - -:where(html:not(.is-light)) #altTextDialog{ - --dialog-bg-color:#1c1b22; - --dialog-border-color:#1c1b22; - --dialog-shadow:0 2px 14px 0 #15141a; - --text-primary-color:#fbfbfe; - --text-secondary-color:#cfcfd8; - --focus-ring-color:#0df; - --hover-filter:brightness(1.4); - - --textarea-bg-color:#42414d; - - --radio-bg-color:#2b2a33; - --radio-checked-bg-color:#15141a; - --radio-checked-border-color:#0df; - - --button-cancel-bg-color:#2b2a33; - --button-save-bg-color:#0df; - --button-save-fg-color:#15141a; -} + } } - -:where(html.is-dark) #altTextDialog{ - --dialog-bg-color:#1c1b22; - --dialog-border-color:#1c1b22; - --dialog-shadow:0 2px 14px 0 #15141a; - --text-primary-color:#fbfbfe; - --text-secondary-color:#cfcfd8; - --focus-ring-color:#0df; - --hover-filter:brightness(1.4); - - --textarea-bg-color:#42414d; - - --radio-bg-color:#2b2a33; - --radio-checked-bg-color:#15141a; - --radio-checked-border-color:#0df; - - --button-cancel-bg-color:#2b2a33; - --button-save-bg-color:#0df; - --button-save-fg-color:#15141a; -} - -@media screen and (forced-colors: active){ - -#altTextDialog{ - --dialog-bg-color:Canvas; - --dialog-border-color:CanvasText; - --dialog-shadow:none; - --text-primary-color:CanvasText; - --text-secondary-color:CanvasText; - --hover-filter:none; - --focus-ring-color:ButtonBorder; - - --textarea-border-color:ButtonBorder; - --textarea-bg-color:Field; - --textarea-fg-color:ButtonText; - - --radio-bg-color:ButtonFace; - --radio-checked-bg-color:ButtonFace; - --radio-border-color:ButtonText; - --radio-checked-border-color:ButtonText; - - --button-cancel-bg-color:ButtonFace; - --button-cancel-fg-color:ButtonText; - --button-cancel-border-color:ButtonText; - --button-cancel-hover-bg-color:AccentColor; - --button-cancel-hover-fg-color:AccentColorText; - - --button-save-bg-color:ButtonText; - --button-save-fg-color:ButtonFace; - --button-save-hover-bg-color:AccentColor; - --button-save-hover-fg-color:AccentColorText; } - } -#altTextDialog::backdrop{ +.dialog.altText{ + &::backdrop{ -webkit-mask:url(#alttext-manager-mask); mask:url(#alttext-manager-mask); } - -#altTextDialog.positioned{ + &.positioned{ margin:0; } -#altTextDialog #altTextContainer{ + & #altTextContainer{ width:300px; height:-moz-fit-content; height:fit-content; @@ -2058,195 +4170,258 @@ flex-direction:column; align-items:flex-start; gap:16px; - } - -#altTextDialog #altTextContainer *:focus-visible{ - outline:var(--focus-ring-outline); - outline-offset:2px; - } - -#altTextDialog #altTextContainer .radio{ - display:flex; - flex-direction:column; - align-items:flex-start; - gap:4px; - } - -#altTextDialog #altTextContainer .radio .radioButton{ - display:flex; - gap:8px; - align-self:stretch; - align-items:center; - } - -#altTextDialog #altTextContainer .radio .radioButton input{ - -webkit-appearance:none; - -moz-appearance:none; - appearance:none; - box-sizing:border-box; - width:16px; - height:16px; - border-radius:50%; - background-color:var(--radio-bg-color); - border:1px solid var(--radio-border-color); - } - -#altTextDialog #altTextContainer .radio .radioButton input:hover{ - filter:var(--hover-filter); - } - -#altTextDialog #altTextContainer .radio .radioButton input:checked{ - background-color:var(--radio-checked-bg-color); - border:4px solid var(--radio-checked-border-color); - } - -#altTextDialog #altTextContainer .radio .radioLabel{ - display:flex; - padding-inline-start:24px; - align-items:flex-start; - gap:10px; - align-self:stretch; - } - -#altTextDialog #altTextContainer .radio .radioLabel span{ - flex:1 0 0; - font-size:11px; - color:var(--text-secondary-color); - } -#altTextDialog #altTextContainer #overallDescription{ + & #overallDescription{ display:flex; flex-direction:column; align-items:flex-start; gap:4px; align-self:stretch; - } -#altTextDialog #altTextContainer #overallDescription span{ + & span{ align-self:stretch; } -#altTextDialog #altTextContainer #overallDescription .title{ + & .title{ font-size:13px; font-style:normal; font-weight:590; } + } -#altTextDialog #altTextContainer #addDescription{ + & #addDescription{ display:flex; flex-direction:column; align-items:stretch; gap:8px; - } -#altTextDialog #altTextContainer #addDescription .descriptionArea{ + & .descriptionArea{ flex:1; padding-inline:24px 10px; - } -#altTextDialog #altTextContainer #addDescription .descriptionArea textarea{ - font:inherit; + textarea{ width:100%; min-height:75px; - padding:8px; - resize:none; - margin:0; - box-sizing:border-box; - border-radius:4px; - border:1px solid var(--textarea-border-color); - background:var(--textarea-bg-color); - color:var(--textarea-fg-color); } + } + } -#altTextDialog #altTextContainer #addDescription .descriptionArea textarea:focus{ - outline-offset:0; - border-color:transparent; - } - -#altTextDialog #altTextContainer #addDescription .descriptionArea textarea:disabled{ - pointer-events:none; - opacity:0.4; - } - -#altTextDialog #altTextContainer #buttons{ + & #buttons{ display:flex; justify-content:flex-end; align-items:flex-start; gap:8px; align-self:stretch; } + } +} -#altTextDialog #altTextContainer #buttons button{ - border-radius:4px; - border:1px solid; - font:menu; - font-weight:600; - padding:4px 16px; - width:auto; - height:32px; +.dialog.newAltText{ + --new-alt-text-ai-disclaimer-icon:url(images/altText_disclaimer.svg); + --new-alt-text-spinner-icon:url(images/altText_spinner.svg); + --preview-image-bg-color:light-dark(#f0f0f4, #2b2a33); + --preview-image-border:none; + + @media screen and (forced-colors: active){ + --preview-image-bg-color:ButtonFace; + --preview-image-border:1px solid ButtonText; + } + + width:80%; + max-width:570px; + min-width:300px; + padding:0; + + &.noAi{ + #newAltTextDisclaimer, + #newAltTextCreateAutomatically{ + display:none !important; + } + } + + &.aiInstalling{ + #newAltTextCreateAutomatically{ + display:none !important; + } + #newAltTextDownloadModel{ + display:flex !important; + } + } + + &.error{ + #newAltTextNotNow{ + display:none !important; + } + + #newAltTextCancel{ + display:inline-block !important; + } + } + + &:not(.error) #newAltTextError{ + display:none !important; + } + + #newAltTextContainer{ + display:flex; + width:auto; + padding:16px; + flex-direction:column; + justify-content:flex-end; + align-items:flex-start; + gap:12px; + flex:0 1 auto; + line-height:normal; + + #mainContent{ + display:flex; + justify-content:flex-end; + align-items:flex-start; + gap:12px; + align-self:stretch; + flex:1 1 auto; + + #descriptionAndSettings{ + display:flex; + flex-direction:column; + align-items:flex-start; + gap:16px; + flex:1 0 0; + align-self:stretch; } -#altTextDialog #altTextContainer #buttons button:hover{ - cursor:pointer; - filter:var(--hover-filter); - } + #descriptionInstruction{ + display:flex; + flex-direction:column; + align-items:flex-start; + gap:8px; + align-self:stretch; + flex:1 1 auto; -#altTextDialog #altTextContainer #buttons button#altTextCancel{ - color:var(--button-cancel-fg-color); - background-color:var(--button-cancel-bg-color); - border-color:var(--button-cancel-border-color); - } + #newAltTextDescriptionContainer{ + width:100%; + height:70px; + position:relative; + + textarea{ + width:100%; + height:100%; + padding:8px; + + &::-moz-placeholder{ + color:var(--text-secondary-color); + } + + &::placeholder{ + color:var(--text-secondary-color); + } + } + + .altTextSpinner{ + display:none; + position:absolute; + width:16px; + height:16px; + inset-inline-start:8px; + inset-block-start:8px; + -webkit-mask-size:cover; + mask-size:cover; + background-color:var(--text-secondary-color); + pointer-events:none; + } + + &.loading{ + textarea::-moz-placeholder{ + color:transparent; + } + textarea::placeholder{ + color:transparent; + } -#altTextDialog #altTextContainer #buttons button#altTextCancel:hover{ - color:var(--button-cancel-hover-fg-color); - background-color:var(--button-cancel-hover-bg-color); - border-color:var(--button-cancel-hover-border-color); + .altTextSpinner{ + display:inline-block; + -webkit-mask-image:var(--new-alt-text-spinner-icon); + mask-image:var(--new-alt-text-spinner-icon); + } } + } -#altTextDialog #altTextContainer #buttons button#altTextSave{ - color:var(--button-save-hover-fg-color); - background-color:var(--button-save-hover-bg-color); - border-color:var(--button-save-hover-border-color); - opacity:1; + #newAltTextDescription{ + font-size:11px; } -#altTextDialog #altTextContainer #buttons button#altTextSave:hover{ - color:var(--button-save-hover-fg-color); - background-color:var(--button-save-hover-bg-color); - border-color:var(--button-save-hover-border-color); + #newAltTextDisclaimer{ + display:flex; + flex-direction:row; + align-items:flex-start; + gap:4px; + font-size:11px; + + &::before{ + content:""; + display:inline-block; + width:17px; + height:16px; + -webkit-mask-image:var(--new-alt-text-ai-disclaimer-icon); + mask-image:var(--new-alt-text-ai-disclaimer-icon); + -webkit-mask-size:cover; + mask-size:cover; + background-color:var(--text-secondary-color); + flex:1 0 auto; } + } + } -.colorPicker{ - --hover-outline-color:#0250bb; - --selected-outline-color:#0060df; - --swatch-border-color:#cfcfd8; -} + #newAltTextDownloadModel{ + display:flex; + align-items:center; + gap:4px; + align-self:stretch; -@media (prefers-color-scheme: dark){ + &::before{ + content:""; + display:inline-block; + width:16px; + height:16px; + -webkit-mask-image:var(--new-alt-text-spinner-icon); + mask-image:var(--new-alt-text-spinner-icon); + -webkit-mask-size:cover; + mask-size:cover; + background-color:var(--text-secondary-color); + } + } -:where(html:not(.is-light)) .colorPicker{ - --hover-outline-color:#80ebff; - --selected-outline-color:#aaf2ff; - --swatch-border-color:#52525e; -} - } + #newAltTextImagePreview{ + width:180px; + aspect-ratio:1; + display:flex; + justify-content:center; + align-items:center; + flex:0 0 auto; + background-color:var(--preview-image-bg-color); + border:var(--preview-image-border); -:where(html.is-dark) .colorPicker{ - --hover-outline-color:#80ebff; - --selected-outline-color:#aaf2ff; - --swatch-border-color:#52525e; + > canvas{ + max-width:100%; + max-height:100%; + } + } + } + } } -@media screen and (forced-colors: active){ - .colorPicker{ + --hover-outline-color:light-dark(#0250bb, #80ebff); + --selected-outline-color:light-dark(#0060df, #aaf2ff); + --swatch-border-color:light-dark(#cfcfd8, #52525e); + + @media screen and (forced-colors: active){ --hover-outline-color:Highlight; --selected-outline-color:var(--hover-outline-color); --swatch-border-color:ButtonText; -} } -.colorPicker .swatch{ + .swatch{ width:16px; height:16px; border:1px solid var(--swatch-border-color); @@ -2256,27 +4431,51 @@ forced-color-adjust:none; } -.colorPicker button:is(:hover, .selected) > .swatch{ + button:is(:hover, .selected) > .swatch{ border:none; } +} + +.basicColorPicker{ + width:28px; + + &::-moz-color-swatch{ + border-radius:100%; + margin:0; + } + + &::-webkit-color-swatch{ + border-radius:100%; + margin:0; + } +} -.annotationEditorLayer[data-main-rotation="0"] .highlightEditor:not(.free) > .editToolbar{ +.annotationEditorLayer{ + &[data-main-rotation="0"]{ + .highlightEditor:not(.free) > .editToolbar{ rotate:0deg; } + } -.annotationEditorLayer[data-main-rotation="90"] .highlightEditor:not(.free) > .editToolbar{ + &[data-main-rotation="90"]{ + .highlightEditor:not(.free) > .editToolbar{ rotate:270deg; } + } -.annotationEditorLayer[data-main-rotation="180"] .highlightEditor:not(.free) > .editToolbar{ + &[data-main-rotation="180"]{ + .highlightEditor:not(.free) > .editToolbar{ rotate:180deg; } + } -.annotationEditorLayer[data-main-rotation="270"] .highlightEditor:not(.free) > .editToolbar{ + &[data-main-rotation="270"]{ + .highlightEditor:not(.free) > .editToolbar{ rotate:90deg; } + } -.annotationEditorLayer .highlightEditor{ + .highlightEditor{ position:absolute; background:transparent; z-index:1; @@ -2287,13 +4486,12 @@ outline:none; pointer-events:none; transform-origin:0 0; - } -.annotationEditorLayer .highlightEditor:not(.free){ + &:not(.free){ transform:none; } -.annotationEditorLayer .highlightEditor .internal{ + .internal{ position:absolute; top:0; left:0; @@ -2302,21 +4500,23 @@ pointer-events:auto; } -.annotationEditorLayer .highlightEditor.disabled .internal{ + &.disabled .internal{ pointer-events:none; } -.annotationEditorLayer .highlightEditor.selectedEditor .internal{ + &.selectedEditor{ + .internal{ cursor:pointer; } + } -.annotationEditorLayer .highlightEditor .editToolbar{ + .editToolbar{ --editor-toolbar-colorpicker-arrow-image:url(images/toolbarButton-menuArrow.svg); transform-origin:center !important; - } -.annotationEditorLayer .highlightEditor .editToolbar .buttons .colorPicker{ + .buttons{ + .colorPicker{ position:relative; width:auto; display:flex; @@ -2324,9 +4524,8 @@ align-items:center; gap:4px; padding:4px; - } -.annotationEditorLayer .highlightEditor .editToolbar .buttons .colorPicker::after{ + &::after{ content:""; -webkit-mask-image:var(--editor-toolbar-colorpicker-arrow-image); mask-image:var(--editor-toolbar-colorpicker-arrow-image); @@ -2340,19 +4539,19 @@ height:12px; } -.annotationEditorLayer .highlightEditor .editToolbar .buttons .colorPicker:hover::after{ + &:hover::after{ background-color:var(--editor-toolbar-hover-fg-color); } -.annotationEditorLayer .highlightEditor .editToolbar .buttons .colorPicker:has(.dropdown:not(.hidden)){ + &:has(.dropdown:not(.hidden)){ background-color:var(--editor-toolbar-hover-bg-color); - } -.annotationEditorLayer .highlightEditor .editToolbar .buttons .colorPicker:has(.dropdown:not(.hidden))::after{ + &::after{ scale:-1; } + } -.annotationEditorLayer .highlightEditor .editToolbar .buttons .colorPicker .dropdown{ + .dropdown{ position:absolute; display:flex; justify-content:center; @@ -2366,9 +4565,8 @@ box-shadow:var(--editor-toolbar-shadow); inset-block-start:calc(100% + 4px); width:calc(100% + 2 * var(--editor-toolbar-padding)); - } -.annotationEditorLayer .highlightEditor .editToolbar .buttons .colorPicker .dropdown button{ + button{ width:100%; height:auto; border:none; @@ -2377,59 +4575,52 @@ justify-content:center; align-items:center; background:none; - } -.annotationEditorLayer .highlightEditor .editToolbar .buttons .colorPicker .dropdown button:is(:active, :focus-visible){ + &:is(:active, :focus-visible){ outline:none; } -.annotationEditorLayer .highlightEditor .editToolbar .buttons .colorPicker .dropdown button > .swatch{ + > .swatch{ outline-offset:2px; } -.annotationEditorLayer .highlightEditor .editToolbar .buttons .colorPicker .dropdown button[aria-selected="true"] > .swatch{ + &[aria-selected="true"] > .swatch{ outline:2px solid var(--selected-outline-color); } -.annotationEditorLayer .highlightEditor .editToolbar .buttons .colorPicker .dropdown button:is(:hover, :active, :focus-visible) > .swatch{ + &:is(:hover, :active, :focus-visible) > .swatch{ outline:2px solid var(--hover-outline-color); } + } + } + } + } + } + } +} .editorParamsToolbar:has(#highlightParamsToolbarContainer){ padding:unset; } #highlightParamsToolbarContainer{ - height:auto; - padding-inline:10px; - padding-block:10px 16px; gap:16px; - display:flex; - flex-direction:column; - box-sizing:border-box; -} - -#highlightParamsToolbarContainer .editorParamsLabel{ - width:-moz-fit-content; - width:fit-content; - inset-inline-start:0; - } + padding-inline:10px; + padding-block-end:12px; -#highlightParamsToolbarContainer .colorPicker{ + .colorPicker{ display:flex; flex-direction:column; gap:8px; - } -#highlightParamsToolbarContainer .colorPicker .dropdown{ + .dropdown{ display:flex; justify-content:space-between; align-items:center; flex-direction:row; height:auto; - } -#highlightParamsToolbarContainer .colorPicker .dropdown button{ + button{ width:auto; height:auto; border:none; @@ -2439,72 +4630,58 @@ align-items:center; background:none; flex:0 0 auto; - } + padding:0; -#highlightParamsToolbarContainer .colorPicker .dropdown button .swatch{ + .swatch{ width:24px; height:24px; } -#highlightParamsToolbarContainer .colorPicker .dropdown button:is(:active, :focus-visible){ + &:is(:active, :focus-visible){ outline:none; } -#highlightParamsToolbarContainer .colorPicker .dropdown button[aria-selected="true"] > .swatch{ + &[aria-selected="true"] > .swatch{ outline:2px solid var(--selected-outline-color); } -#highlightParamsToolbarContainer .colorPicker .dropdown button:is(:hover, :active, :focus-visible) > .swatch{ + &:is(:hover, :active, :focus-visible) > .swatch{ outline:2px solid var(--hover-outline-color); } + } + } + } -#highlightParamsToolbarContainer #editorHighlightThickness{ + #editorHighlightThickness{ display:flex; flex-direction:column; align-items:center; gap:4px; align-self:stretch; - } -#highlightParamsToolbarContainer #editorHighlightThickness .editorParamsLabel{ - width:100%; + .editorParamsLabel{ height:auto; align-self:stretch; } -#highlightParamsToolbarContainer #editorHighlightThickness .thicknessPicker{ + .thicknessPicker{ display:flex; justify-content:space-between; align-items:center; align-self:stretch; - --example-color:#bfbfc9; - } - -@media (prefers-color-scheme: dark){ - -:where(html:not(.is-light)) #highlightParamsToolbarContainer #editorHighlightThickness .thicknessPicker{ - --example-color:#80808e; - } - } - -:where(html.is-dark) #highlightParamsToolbarContainer #editorHighlightThickness .thicknessPicker{ - --example-color:#80808e; - } - -@media screen and (forced-colors: active){ + --example-color:light-dark(#bfbfc9, #80808e); -#highlightParamsToolbarContainer #editorHighlightThickness .thicknessPicker{ + @media screen and (forced-colors: active){ --example-color:CanvasText; - } } -:is(#highlightParamsToolbarContainer #editorHighlightThickness .thicknessPicker > .editorParamsSlider[disabled]){ + :is(& > .editorParamsSlider[disabled]){ opacity:0.4; } -#highlightParamsToolbarContainer #editorHighlightThickness .thicknessPicker::before, - #highlightParamsToolbarContainer #editorHighlightThickness .thicknessPicker::after{ + &::before, + &::after{ content:""; width:8px; aspect-ratio:1; @@ -2512,26 +4689,30 @@ border-radius:100%; background-color:var(--example-color); } - -#highlightParamsToolbarContainer #editorHighlightThickness .thicknessPicker::after{ + &::after{ width:24px; } -#highlightParamsToolbarContainer #editorHighlightThickness .thicknessPicker .editorParamsSlider{ + .editorParamsSlider{ width:unset; height:14px; } + } + } -#highlightParamsToolbarContainer #editorHighlightVisibility{ + #editorHighlightVisibility{ display:flex; flex-direction:column; align-items:flex-start; gap:8px; align-self:stretch; - } -#highlightParamsToolbarContainer #editorHighlightVisibility .divider{ - --divider-color:#d7d7db; + .divider{ + --divider-color:light-dark(#d7d7db, #8f8f9d); + + @media screen and (forced-colors: active){ + --divider-color:CanvasText; + } margin-block:4px; width:100%; @@ -2539,49 +4720,1458 @@ background-color:var(--divider-color); } -@media (prefers-color-scheme: dark){ + .toggler{ + display:flex; + justify-content:space-between; + align-items:center; + align-self:stretch; + } + } +} + +#altTextSettingsDialog{ + padding:16px; + + #altTextSettingsContainer{ + display:flex; + width:573px; + flex-direction:column; + gap:16px; + + .mainContainer{ + gap:16px; + } + + .description{ + color:var(--text-secondary-color); + } + + #aiModelSettings{ + display:flex; + flex-direction:column; + gap:12px; + } + + #automaticAltText, + #altTextEditor{ + display:flex; + flex-direction:column; + gap:8px; + } + + #createModelDescription, + #aiModelSettings, + #showAltTextDialogDescription{ + padding-inline-start:40px; + } + + #automaticSettings{ + display:flex; + flex-direction:column; + gap:16px; + } + } +} + +button.hasPopupMenu{ + &[aria-expanded="true"] + menu{ + visibility:visible; + } + + &[aria-expanded="false"] + menu{ + visibility:hidden; + } +} + +.popupMenu{ + --menuitem-checkmark-icon:url(images/checkmark.svg); + --menu-mark-icon-size:0; + --menu-icon-size:16px; + --menuitem-gap:5px; + --menuitem-border-color:transparent; + --menuitem-active-bg:color-mix( + in srgb, + var(--menu-text-color), + transparent 79% + ); + --menuitem-text-active-fg:var(--menu-text-color); + --menuitem-active-border-color:var(--menuitem-border-color); + --menuitem-focus-bg:color-mix( + in srgb, + var(--menu-text-color), + transparent 93% + ); + --menuitem-focus-outline-color:light-dark(#0062fa, #00cadb); + --menuitem-focus-border-color:light-dark(white, black); + + --menu-bg:light-dark(white, #23222b); + --menu-background-blend-mode:normal; + --menu-box-shadow:0 0.375px 1.5px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 3px 12px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4)); + --menu-border-color:light-dark(rgb(21 20 26 / 0.1), rgb(251 251 254 / 0.1)); + --menuitem-border-radius:8px; + --menu-backdrop-filter:none; + --menu-text-color:light-dark(#15141a, #fbfbfe); + --menu-text-disabled-color:var(--menu-text-color); + --menuitem-text-hover-fg:var(--menu-text-color); + --menuitem-hover-bg:color-mix( + in srgb, + var(--menu-text-color), + transparent 86% + ); + --menuitem-hover-background-blend-mode:normal; + --disabled-opacity:0.62; + + @media screen and (forced-colors: active){ + --menu-bg:Canvas; + --menu-background-blend-mode:normal; + --menu-box-shadow:none; + --menu-backdrop-filter:none; + --menu-text-color:ButtonText; + --menu-text-disabled-color:GrayText; + --menu-border-color:CanvasText; + --menuitem-border-color:none; + --menuitem-hover-bg:SelectedItemText; + --menuitem-text-hover-fg:SelectedItem; + --menuitem-active-bg:SelectedItemText; + --menuitem-active-border-color:ButtonText; + --menuitem-text-active-fg:SelectedItem; + --menuitem-focus-bg:ButtonFace; + --menuitem-focus-outline-color:CanvasText; + --menuitem-focus-border-color:none; + --disabled-opacity:1; + } + + display:flex; + flex-direction:column; + width:-moz-max-content; + width:max-content; + height:auto; + position:relative; + left:0; + top:1px; + margin:0; + padding:5px; + box-sizing:border-box; + + background:var(--menu-bg); + background-blend-mode:var(--menu-background-blend-mode); + box-shadow:var(--menu-box-shadow); + border-radius:6px; + border:1px solid var(--menu-border-color); + backdrop-filter:var(--menu-backdrop-filter); + + &.withMark{ + --menu-mark-icon-size:16px; + } + + > button{ + display:flex; + align-items:center; + position:relative; + width:100%; + height:26px; + padding-inline:calc(var(--menu-mark-icon-size) + var(--menuitem-gap)) var(--menuitem-gap); + gap:var(--menuitem-gap); + box-sizing:border-box; + border-radius:var(--menuitem-border-radius); + border:1px solid var(--menuitem-border-color); + background:transparent; + + &.selected::after{ + content:""; + display:inline-block; + width:11px; + height:11px; + -webkit-mask-repeat:no-repeat; + mask-repeat:no-repeat; + -webkit-mask-position:center; + mask-position:center; + -webkit-mask-image:var(--menuitem-checkmark-icon); + mask-image:var(--menuitem-checkmark-icon); + background-color:var(--menu-text-color); + position:absolute; + inset-inline-start:var(--menuitem-gap); + top:50%; + transform:translateY(-50%); + } + + &:disabled{ + opacity:var(--disabled-opacity); + + &.selected::after{ + background-color:var(--menu-text-disabled-color); + } + + &:not(.noIcon)::before{ + background-color:var(--menu-text-disabled-color); + } -:where(html:not(.is-light)) #highlightParamsToolbarContainer #editorHighlightVisibility .divider{ - --divider-color:#8f8f9d; + > span{ + color:var(--menu-text-disabled-color); + } } + + &:not(:disabled){ + &:hover{ + background:var(--menuitem-hover-bg); + background-blend-mode:var(--menuitem-hover-background-blend-mode); + + &:not(.noIcon)::before{ + background-color:var(--menuitem-text-hover-fg); + } + + > span{ + color:var(--menuitem-text-hover-fg); + } + + &.selected::after{ + background-color:var(--menuitem-text-hover-fg); + } + } + + &:active{ + background-color:var(--menuitem-active-bg); + border-color:var(--menuitem-active-border-color); + + > span{ + color:var(--menuitem-text-active-fg); + } } -:where(html.is-dark) #highlightParamsToolbarContainer #editorHighlightVisibility .divider{ - --divider-color:#8f8f9d; + &:focus-visible{ + border-color:var(--menuitem-focus-border-color); + background-color:var(--menuitem-focus-bg); + outline:2px solid var(--menuitem-focus-outline-color); + outline-offset:2px; + } } -@media screen and (forced-colors: active){ + &:not(.noIcon)::before{ + display:inline-block; + width:var(--menu-icon-size); + height:var(--menu-icon-size); + content:""; + -webkit-mask-size:cover; + mask-size:cover; + -webkit-mask-position:center; + mask-position:center; + background-color:var(--menu-text-color); + } -#highlightParamsToolbarContainer #editorHighlightVisibility .divider{ - --divider-color:CanvasText; + > span{ + display:flex; + align-items:center; + align-self:stretch; + width:100%; + min-width:-moz-max-content; + min-width:max-content; + text-align:start; + color:var(--menu-text-color); + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + padding-inline-start:6px; + + font:menu; + font-size:13px; + font-style:normal; + font-weight:510; + line-height:normal; } + } +} + +.treeView{ + --treeitem-color:light-dark(rgb(0 0 0 / 0.8), rgb(255 255 255 / 0.8)); + --treeitem-bg-color:light-dark(rgb(0 0 0 / 0.15), rgb(255 255 255 / 0.15)); + --treeitem-hover-color:light-dark(rgb(0 0 0 / 0.9), rgb(255 255 255 / 0.9)); + --treeitem-selected-color:light-dark( + rgb(0 0 0 / 0.9), + rgb(255 255 255 / 0.9) + ); + --treeitem-selected-bg-color:light-dark( + rgb(0 0 0 / 0.25), + rgb(255 255 255 / 0.25) + ); + --treeitem-expanded-icon:url(images/treeitem-expanded.svg); + --treeitem-collapsed-icon:url(images/treeitem-collapsed.svg); + + &.withNesting{ + .treeItemToggler{ + &::before{ + position:absolute; + display:inline-block; + width:16px; + height:16px; + inset-inline-end:4px; + + content:""; + background-color:var(--toolbar-icon-bg-color); + -webkit-mask-image:var(--treeitem-expanded-icon); + mask-image:var(--treeitem-expanded-icon); + -webkit-mask-size:cover; + mask-size:cover; + } + + position:relative; + float:inline-start; + height:0; + width:0; + color:rgb(255 255 255 / 0.5); + + &.treeItemsHidden{ + &::before{ + -webkit-mask-image:var(--treeitem-collapsed-icon); + mask-image:var(--treeitem-collapsed-icon); + transform:scaleX(var(--dir-factor)); + } + + ~ .treeItems{ + display:none; + } } -#highlightParamsToolbarContainer #editorHighlightVisibility .toggler{ + &:hover + a, + &:hover ~ .treeItems{ + background-color:var(--treeitem-bg-color); + background-clip:padding-box; + border-radius:2px; + color:var(--treeitem-hover-color); + } + } + + > .treeItem, + .treeItem > .treeItems{ + margin-inline-start:20px; + } + } + + &#layersView .treeItem > a{ + *{ + cursor:pointer; + } + + > label{ display:flex; - justify-content:space-between; + align-items:center; + padding-inline-start:4px; + > input{ + margin-top:1px; + } + } + } + + .treeItem{ + > a{ + text-decoration:none; + display:inline-block; + min-width:calc(100% - 4px); + height:auto; + margin-bottom:1px; + padding:2px 0 5px; + padding-inline-start:4px; + border-radius:2px; + color:var(--treeitem-color); + font-size:13px; + line-height:15px; + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + white-space:normal; + cursor:default; + + &:hover{ + background-color:var(--treeitem-bg-color); + background-clip:padding-box; + border-radius:2px; + color:var(--treeitem-hover-color); + } + } + + &.selected > a{ + background-color:var(--treeitem-selected-bg-color); + color:var(--treeitem-selected-color); + } + } +} + +#outerContainer{ + &.viewsManagerMoving{ + #viewsManager{ + visibility:visible; + } + } + + &.viewsManagerOpen{ + #viewsManager{ + visibility:visible; + inset-inline-start:8px; + } + + #viewerContainer:not(.pdfPresentationMode){ + inset-inline-start:var(--viewsManager-width, 0); + transition-property:inset-inline-start; + } + } + + &.viewsManagerResizing :is(#sidebarContainer, #viewerContainer, #loadingBar){ + transition-duration:0s; + } +} + +#viewsManager{ + --views-manager-button-icon:url(images/pages_viewButton.svg); + --views-manager-button-arrow-icon:url(images/pages_viewArrow.svg); + --views-manager-add-file-button-icon:url(images/toolbarButton-zoomIn.svg); + --current-outline-button-icon:url(images/toolbarButton-currentOutlineItem.svg); + --menuitem-thumbnailsView-icon:url(images/pages_viewButton.svg); + --menuitem-outlinesView-icon:url(images/toolbarButton-viewOutline.svg); + --menuitem-attachmentsView-icon:url(images/toolbarButton-viewAttachments.svg); + --menuitem-layersView-icon:url(images/toolbarButton-viewLayers.svg); + --manage-button-icon:url(images/toolbarButton-pageDown.svg); + --close-button-icon:url(images/pages_closeButton.svg); + --undo-label-icon:url(images/altText_done.svg); + --pages-selected-icon:url(images/pages_selected.svg); + --spinner-icon:url(images/altText_spinner.svg); + + --sidebar-bg-color:light-dark(rgb(255 255 255 / 0.92), rgb(66 65 77 / 0.92)); + --sidebar-backdrop-filter:blur(7px); + --sidebar-width:230px; + --sidebar-min-width:min-content; + --sidebar-max-width:50vw; + --sidebar-block-padding:8px; + + --text-color:light-dark(#15141a, #fbfbfe); + --button-fg:var(--text-color); + --button-no-bg:transparent; + --button-bg:light-dark(rgb(21 20 26 / 0.07), rgb(251 251 254 / 0.07)); + --button-border-color:transparent; + --button-hover-bg:light-dark(rgb(21 20 26 / 0.14), rgb(251 251 254 / 0.14)); + --button-hover-fg:var(--text-color); + --button-hover-border-color:var(--button-border-color); + --button-active-bg:light-dark(rgb(21 20 26 / 0.21), rgb(251 251 254 / 0.21)); + --button-active-fg:var(--text-color); + --button-active-border-color:var(--button-border-color); + --button-focus-no-bg:color-mix(in srgb, var(--text-color), transparent 93%); + --button-focus-outline-color:light-dark(#0062fa, #00cadb); + --button-focus-border-color:light-dark(white, black); + --status-border-color:transparent; + --status-actions-bg:light-dark( + rgb(21 20 26 / 0.03), + rgb(251 251 254 / 0.03) + ); + --status-undo-bg:light-dark(rgb(0 98 250 / 0.08), rgb(0 202 219 / 0.08)); + --status-waiting-bg:var(--status-undo-bg); + --indicator-color:light-dark(#0062fa, #00cadb); + --status-warning-bg:light-dark(#ffe8ea, #6e001f); + --indicator-warning-color:light-dark(#b20037, #ffa0aa); + --header-shadow:0 0.25px 0.75px -0.75px light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 2px 6px -6px light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4)); + --header-bg:light-dark(rgb(255 255 255 / 0.92), #42414e); + --image-outline:none; + --image-border-width:6px; + --image-border-color:light-dark(#cfcfd8, #3a3944); + --image-hover-border-color:#bfbfc9; + --image-current-border-color:var(--button-focus-outline-color); + --image-current-focused-outline-color:var(--image-hover-border-color); + --image-page-number-bg:light-dark(#f0f0f4, #42414d); + --image-page-number-fg:var(--text-color); + --image-page-number-border-color:transparent; + --image-hover-page-number-bg:var(--image-page-number-bg); + --image-hover-page-number-fg:var(--image-page-number-fg); + --image-current-page-number-bg:var(--image-current-border-color); + --image-current-page-number-fg:light-dark(#fff, #15141a); + --image-current-hover-page-number-bg:var(--image-current-page-number-bg); + --image-current-hover-page-number-fg:var(--image-current-page-number-fg); + --image-shadow:0 0.375px 1.5px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 0 0 1px var(--image-border-color), 0 3px 12px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4)); + --image-hover-shadow:0 0.375px 1.5px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 0 0 1px light-dark(rgb(21 20 26 / 0.1), rgb(251 251 254 / 0.1)), 0 0 0 var(--image-border-width) var(--image-hover-border-color), 0 3px 12px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4)); + --image-current-shadow:0 0.375px 1.5px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 0 0 var(--image-border-width) var(--image-current-border-color), 0 3px 12px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4)); + --image-dragging-placeholder-bg:light-dark( + rgb(0 98 250 / 0.08), + rgb(0 202 219 / 0.08) + ); + --image-dragging-placeholder-border:var(--image-outline); + --multiple-dragging-bg:white; + --image-multiple-dragging-shadow:0 0 0 var(--image-border-width) var(--image-current-border-color), var(--image-border-width) var(--image-border-width) 0 calc(var(--image-border-width) / 2) var(--multiple-dragging-bg), var(--image-border-width) var(--image-border-width) 0 calc(3 * var(--image-border-width) / 2) var(--image-current-border-color); + --image-dragging-shadow:0 0 0 var(--image-border-width) var(--image-current-border-color); + --multiple-dragging-indicator-bg:var(--indicator-color); + --multiple-dragging-text-color:light-dark(#fbfbfe, #15141a); + + @media screen and (forced-colors: active){ + --text-color:CanvasText; + --button-fg:ButtonText; + --button-bg:ButtonFace; + --button-no-bg:ButtonFace; + --button-border-color:ButtonText; + --button-hover-bg:SelectedItemText; + --button-hover-fg:SelectedItem; + --button-hover-border-color:SelectedItem; + --button-active-bg:SelectedItemText; + --button-active-fg:SelectedItem; + --button-active-border-color:ButtonText; + --button-focus-no-bg:ButtonFace; + --button-focus-outline-color:CanvasText; + --button-focus-border-color:none; + --status-border-color:CanvasText; + --status-undo-bg:none; + --indicator-color:CanvasText; + --status-warning-bg:none; + --indicator-warning-color:CanvasText; + --header-shadow:none; + --image-shadow:none; + --image-outline:1px solid ButtonText; + --image-focus-outline-color:CanvasText; + --image-hover-border-color:SelectedItem; + --image-hover-page-number-bg:SelectedItemText; + --image-hover-page-number-fg:SelectedItem; + --image-current-page-number-bg:ButtonText; + --image-current-page-number-fg:ButtonFace; + --image-current-border-color:ButtonText; + --image-current-focused-outline-color:var(--image-hover-border-color); + --image-current-hover-page-number-bg:SelectedItem; + --image-current-hover-page-number-fg:SelectedItemText; + --image-page-number-bg:ButtonFace; + --image-page-number-fg:ButtonText; + --image-page-number-border-color:var(--image-page-number-fg); + --multiple-dragging-bg:Canvas; + --multiple-dragging-indicator-bg:ButtonBorder; + --multiple-dragging-text-color:Canvas; + --image-dragging-placeholder-bg:Canvas; + --image-dragging-placeholder-border:1px GrayText solid; + } + + display:flex; + padding-bottom:16px; + flex-direction:column; + align-items:flex-start; + inset-block-start:calc(100% + var(--sidebar-block-padding)); + height:calc( + var(--viewer-container-height) - 2 * var(--sidebar-block-padding) + ); + position:absolute; + + inset-inline-start:calc( + -1 * var(--viewsManager-width, --sidebar-width) - 1px + ); + transition-property:inset-inline-start; + transition-duration:var(--sidebar-transition-duration); + transition-timing-function:var(--sidebar-transition-timing-function); + + .sidebarResizer{ + inset-inline-start:calc(100% + 4px); + } + + .viewsManagerButton{ + width:auto; + color:var(--button-fg); + border-radius:8px; + border:1px solid var(--button-border-color); + background:var(--button-bg); + + &:hover{ + background-color:var(--button-hover-bg) !important; + color:var(--button-hover-fg) !important; + border-color:var(--button-hover-border-color) !important; + + &::before{ + background-color:var(--button-hover-fg) !important; + } + } + &:active{ + background:var(--button-active-bg) !important; + color:var(--button-active-fg) !important; + border-color:var(--button-active-border-color) !important; + + &::before{ + background-color:var(--button-active-fg) !important; + } + } + &:focus-visible{ + outline:2px solid var(--button-focus-outline-color); + outline-offset:2px; + border-color:var(--button-focus-border-color); + } + + &.viewsCloseButton{ + width:26px; + height:26px; + padding:4px; + border-radius:8px; + background:none; + + &::before{ + -webkit-mask-image:var(--close-button-icon); + mask-image:var(--close-button-icon); + } + } + } + + #viewsManagerHeader{ + display:flex; + flex-direction:column; + align-items:flex-start; + align-self:stretch; + width:100%; + box-shadow:var(--header-shadow); + flex:0 0 auto; + background-color:var(--header-bg); + + .viewsManagerLabel{ + flex:1 1 auto; + color:var(--text-color); + text-align:center; + height:-moz-fit-content; + height:fit-content; + width:-moz-fit-content; + width:fit-content; + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + + font:menu; + font-size:15px; + font-style:normal; + font-weight:400; + line-height:normal; + } + + #viewsManagerTitle{ + display:flex; + flex-direction:row; align-items:center; align-self:stretch; + justify-content:space-between; + width:auto; + padding:12px 16px 12px 8px; + + &:not(:has(#viewsManagerHeaderLabel ~ button:not([hidden])))::after{ + + content:""; + flex:0 0 auto; + width:32px; + height:32px; + pointer-events:none; + } + + #viewsManagerSelector{ + width:48px; + height:32px; + display:block; + + > button{ + background:var(--button-no-bg); + width:100%; + height:100%; + + &:focus-visible{ + background-color:var(--button-focus-no-bg); + } + + &::before{ + -webkit-mask-repeat:no-repeat; + mask-repeat:no-repeat; + -webkit-mask-image:var(--views-manager-button-icon); + mask-image:var(--views-manager-button-icon); + background-color:var(--button-fg); + } + + &::after{ + content:""; + display:inline-block; + width:12px; + height:12px; + margin-left:8px; + -webkit-mask-repeat:no-repeat; + mask-repeat:no-repeat; + -webkit-mask-position:center; + mask-position:center; + -webkit-mask-image:var(--views-manager-button-arrow-icon); + mask-image:var(--views-manager-button-arrow-icon); + background-color:var(--button-fg); + } + + &:hover{ + &::before, + &::after{ + background-color:var(--button-hover-fg) !important; + } + } + + &:active{ + &::before, + &::after{ + background-color:var(--button-active-fg) !important; + } + } + } + + > .popupMenu{ + min-width:182px; + z-index:1; + + > button{ + &#thumbnailsViewMenu::before{ + -webkit-mask-image:var(--menuitem-thumbnailsView-icon); + mask-image:var(--menuitem-thumbnailsView-icon); + } + &#outlinesViewMenu::before{ + -webkit-mask-image:var(--menuitem-outlinesView-icon); + mask-image:var(--menuitem-outlinesView-icon); + } + &#attachmentsViewMenu::before{ + -webkit-mask-image:var(--menuitem-attachmentsView-icon); + mask-image:var(--menuitem-attachmentsView-icon); + } + &#layersViewMenu::before{ + -webkit-mask-image:var(--menuitem-layersView-icon); + mask-image:var(--menuitem-layersView-icon); + } + } + } + } + + #viewsManagerAddFileButton{ + background:var(--button-no-bg); + width:32px; + height:32px; + + &:focus-visible{ + background-color:var(--button-focus-no-bg); + } + + &::before{ + -webkit-mask-repeat:no-repeat; + mask-repeat:no-repeat; + -webkit-mask-image:var(--views-manager-add-file-button-icon); + mask-image:var(--views-manager-add-file-button-icon); + background-color:var(--button-fg); + } + + > input{ + display:none; + } + } + + #viewsManagerCurrentOutlineButton{ + background:var(--button-no-bg); + width:32px; + height:32px; + + &:focus-visible{ + background-color:var(--button-focus-no-bg); + } + + &::before{ + -webkit-mask-repeat:no-repeat; + mask-repeat:no-repeat; + -webkit-mask-image:var(--current-outline-button-icon); + mask-image:var(--current-outline-button-icon); + background-color:var(--button-fg); + } + } } + #viewsManagerStatus{ + display:grid; + width:100%; + border:1px solid var(--status-border-color); + + > div{ + min-height:64px; + width:100%; + padding-inline:16px; + grid-area:1 / 1; + box-sizing:border-box; + + &.hidden{ + visibility:hidden; + display:unset !important; + } + } + + .viewsManagerStatusLabel{ + display:flex; + align-items:center; + gap:8px; + + font:menu; + font-size:13px; + } + + #viewsManagerStatusAction{ + display:flex; + justify-content:space-between; + align-items:center; + align-self:stretch; + background-color:var(--status-actions-bg); + + #viewsManagerStatusActionLabelContainer > button{ + position:relative; + width:var(--icon-size); + height:var(--icon-size); + border:none; + padding:0; + flex:0 0 auto; + + &::before{ + content:""; + position:absolute; + inset:0; + -webkit-mask-repeat:no-repeat; + mask-repeat:no-repeat; + -webkit-mask-position:center; + mask-position:center; + background-color:var(--indicator-color); + -webkit-mask-image:var(--pages-selected-icon); + mask-image:var(--pages-selected-icon); + } + + @media screen and (forced-colors: active){ + border-radius:2px; + background-color:var(--button-bg); + + &::before{ + background-color:var(--button-fg); + } + &:hover{ + background-color:var(--button-hover-bg); + + &::before{ + background-color:var(--button-hover-fg); + } + } + &:active{ + background-color:var(--button-active-bg); + + &::before{ + background-color:var(--button-active-fg); + } + } + } + + &#viewsManagerStatusActionDeselectButton:focus-visible{ + outline:2px solid var(--button-focus-outline-color); + border:1px solid var(--button-focus-border-color); + border-radius:2px; + outline-offset:1px; + } + } + + #actionSelector{ + height:32px; + min-width:115px; + width:auto; + display:block; + + #viewsManagerStatusActionButton{ + display:flex; + align-items:center; + justify-content:space-between; + gap:8px; + width:100%; + height:100%; + padding:4px 16px; + + &::after{ + content:""; + display:inline-block; + width:var(--icon-size); + height:var(--icon-size); + -webkit-mask-repeat:no-repeat; + mask-repeat:no-repeat; + -webkit-mask-position:center; + mask-position:center; + -webkit-mask-image:var(--manage-button-icon); + mask-image:var(--manage-button-icon); + background-color:var(--button-fg); + } + + &:hover::after{ + background-color:var(--button-hover-fg) !important; + } + + &:active::after{ + background-color:var(--button-active-fg) !important; + } + } + + > .popupMenu{ + width:100%; + min-width:-moz-fit-content; + min-width:fit-content; + z-index:1; + } + } + } + + #viewsManagerStatusUndo{ + display:flex; + justify-content:space-between; + align-items:center; + align-self:stretch; + background-color:var(--status-undo-bg); + + > span::before{ + content:""; + display:inline-block; + width:var(--icon-size); + height:var(--icon-size); + -webkit-mask-repeat:no-repeat; + mask-repeat:no-repeat; + -webkit-mask-position:center; + mask-position:center; + -webkit-mask-image:var(--undo-label-icon); + mask-image:var(--undo-label-icon); + background-color:var(--indicator-color); + } + + > div{ + display:flex; + align-items:center; + gap:8px; + width:auto; + + #viewsManagerStatusUndoButton{ + width:auto; + min-height:24px; + padding:4px 8px; + } + } + } + + #viewsManagerStatusWarning{ + display:flex; + align-items:center; + justify-content:space-between; + background-color:var(--status-warning-bg); + + > span{ + align-items:flex-start; + + &::before{ + content:""; + display:inline-block; + width:var(--icon-size); + height:var(--icon-size); + -webkit-mask-repeat:no-repeat; + mask-repeat:no-repeat; + -webkit-mask-position:center; + mask-position:center; + background-color:var(--indicator-warning-color); + -webkit-mask-image:var(--undo-label-icon); + mask-image:var(--undo-label-icon); + flex:0 0 auto; + } + } + } + + #viewsManagerStatusWaiting{ + display:flex; + align-items:center; + justify-content:space-between; + background-color:var(--status-waiting-bg); + + > span::before{ + content:""; + display:inline-block; + width:var(--icon-size); + height:var(--icon-size); + -webkit-mask-repeat:no-repeat; + mask-repeat:no-repeat; + -webkit-mask-position:center; + mask-position:center; + background-color:var(--indicator-color); + -webkit-mask-image:var(--spinner-icon); + mask-image:var(--spinner-icon); + flex:0 0 auto; + } + } + } + } + + #viewsManagerContent{ + width:100%; + flex:1 1 0%; + overflow:auto; + + &:has(#thumbnailsView.isDragging){ + overflow-x:hidden; + } + + #thumbnailsView{ + --thumbnail-width:126px; + --gap-between-input-and-thumbnail:16px; + + display:flex; + flex-flow:row wrap; + align-items:center; + justify-content:space-evenly; + padding:20px 32px; + gap:44px; + width:100%; + box-sizing:border-box; + position:relative; + + &.isDragging{ + cursor:grabbing; + + > .thumbnail{ + > .thumbnailImageContainer:hover{ + cursor:grabbing; + + &:not([aria-current="page"]){ + box-shadow:var(--image-shadow); + } + } + + > input{ + pointer-events:none; + } + } + } + + &.isDragging > .dragMarker, + &.isDraggingFile > .dragMarker{ + position:absolute; + top:0; + left:0; + border:2px solid var(--indicator-color); + contain:strict; + } + + &.pasteMode{ + gap:var(--gap-between-input-and-thumbnail); + + > .thumbnail{ + flex-direction:column; + + > input{ + display:none; + } + + > .thumbnailPasteButton{ + display:flex; + justify-content:center; + align-items:center; + border-radius:16px; + min-height:24px; + padding:4px 16px; + + font:menu; + font-size:13px; + font-style:normal; + font-weight:400; + line-height:normal; + } + } + } + + &:not(.pasteMode) > .thumbnail > .thumbnailPasteButton{ + display:none; + } + + > .thumbnail{ + --input-dim:16px; + + &:not(&:has(input)){ + --input-dim:0px; + --gap-between-input-and-thumbnail:0px; + } + + display:inline-flex; + justify-content:flex-end; + align-items:center; + flex-direction:row-reverse; + gap:var(--gap-between-input-and-thumbnail); + width:calc( + var(--thumbnail-width) + 2 * + (var(--input-dim) + var(--gap-between-input-and-thumbnail)) + ); + height:auto; + position:relative; + scroll-margin-top:20px; + + .thumbnailPasteButton{ + padding:8px 0; + text-align:center; + } + + &:not(.isDragging) > .thumbnailImageContainer::after{ + content:attr(page-number); + border-radius:8px; + border:1px solid var(--image-page-number-border-color); + background-color:var(--image-page-number-bg); + color:var(--image-page-number-fg); + position:absolute; + bottom:5px; + inset-inline-end:50%; + min-width:32px; + height:16px; + text-align:center; + box-sizing:content-box; + translate:calc(var(--dir-factor) * 50%); + + font:menu; + font-size:12px; + font-style:normal; + font-weight:400; + line-height:normal; + + pointer-events:none; + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + } + + &:has([aria-current="page"]):not(.isDragging) + > .thumbnailImageContainer::after{ + background-color:var(--image-current-page-number-bg); + color:var(--image-current-page-number-fg); + outline:1px solid var(--image-current-border-color); + } + + &.isDragging > input{ + visibility:hidden; + } + + > input{ + margin:0; + width:var(--input-dim); + height:var(--input-dim); + accent-color:var(--indicator-color); + } + + > .thumbnailImageContainer{ + --thumbnail-dragging-scale:1.4; + + width:var(--thumbnail-width); + border:none; + border-radius:8px; + box-shadow:var(--image-shadow); + box-sizing:content-box; + outline:var(--image-outline); + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + position:relative; + + img{ + width:100%; + height:100%; + border:none; + border-radius:8px; + outline:none; + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + pointer-events:none; + } + + &.missingThumbnailImage{ + content-visibility:hidden; + } + + &:hover{ + cursor:pointer; + box-shadow:var(--image-hover-shadow); + + &::after{ + background-color:var(--image-hover-page-number-bg); + color:var(--image-hover-page-number-fg); + } + + @media screen and (forced-colors: active){ + box-shadow:none; + outline:var(--image-border-width) var(--image-hover-border-color) solid; + } + } + + &:focus-visible{ + &:not([aria-current="page"]){ + box-shadow:var(--image-hover-shadow); + outline:none; + + @media screen and (forced-colors: active){ + box-shadow:none; + outline:var(--image-border-width) var(--image-focus-outline-color) solid; + } + } + + &[aria-current="page"]{ + outline:var(--image-border-width) solid var(--image-current-focused-outline-color); + outline-offset:var(--image-border-width); + + @media screen and (forced-colors: active){ + box-shadow:none; + outline:var(--image-border-width) var(--image-current-border-color) solid; + outline-offset:0; + + > img{ + outline:var(--image-border-width) var(--image-focus-outline-color) solid; + outline-offset:var(--image-border-width); + } + } + } + + @media screen and (forced-colors: active){ + box-shadow:none; + outline:var(--image-border-width) var(--image-current-border-color) solid; + + &:hover > img{ + outline:var(--image-border-width) var(--image-hover-border-color) solid; + outline-offset:var(--image-border-width); + } + } + } + + &[aria-current="page"]{ + box-shadow:var(--image-current-shadow); + + &:hover::after{ + background-color:var(--image-current-hover-page-number-bg); + color:var(--image-current-hover-page-number-fg); + } + + @media screen and (forced-colors: active){ + box-shadow:none; + outline:var(--image-border-width) var(--image-current-border-color) solid; + + &:hover > img{ + outline:var(--image-border-width) var(--image-hover-border-color) solid; + outline-offset:var(--image-border-width); + } + } + } + + &.placeholder{ + background-color:var(--image-dragging-placeholder-bg); + box-shadow:none !important; + outline:var(--image-dragging-placeholder-border); + } + + &.draggingThumbnail{ + position:absolute; + left:0; + top:0; + z-index:1; + transform-origin:0 0 0; + scale:calc(1 / var(--thumbnail-dragging-scale)); + pointer-events:none; + box-shadow:var(--image-dragging-shadow); + + &.multiple{ + box-shadow:var(--image-multiple-dragging-shadow); + + @media screen and (forced-colors: active){ + forced-color-adjust:none; + box-shadow:var(--image-multiple-dragging-shadow); + } + + > .thumbnailImageContainer{ + position:absolute; + top:0; + left:0; + + width:var(--thumbnail-width); + border:none; + border-radius:8px; + box-sizing:content-box; + outline:none; + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + } + + &::after{ + content:attr(data-multiple-count); + border-radius:calc(8px * var(--thumbnail-dragging-scale)); + background-color:var(--multiple-dragging-indicator-bg); + color:var(--multiple-dragging-text-color); + position:absolute; + inset-block-end:calc(4px * var(--thumbnail-dragging-scale)); + inset-inline-start:calc(4px * var(--thumbnail-dragging-scale)); + min-width:calc(32px * var(--thumbnail-dragging-scale)); + height:calc(16px * var(--thumbnail-dragging-scale)); + text-align:center; + font:menu; + font-size:calc(13px * var(--thumbnail-dragging-scale)); + font-style:normal; + font-weight:400; + line-height:normal; + contain:strict; + } + } + } + } + } + } + + #attachmentsView{ + --attachment-color:light-dark(rgb(0 0 0 / 0.8), rgb(255 255 255 / 0.8)); + --attachment-bg-color:light-dark( + rgb(0 0 0 / 0.15), + rgb(255 255 255 / 0.15) + ); + --attachment-hover-color:light-dark( + rgb(0 0 0 / 0.9), + rgb(255 255 255 / 0.9) + ); + + > ul{ + list-style-type:none; + padding:0; + + > li > a{ + text-decoration:none; + display:inline-block; + min-width:calc(100% - 4px); + height:auto; + margin-bottom:1px; + padding:2px 0 5px; + padding-inline-start:4px; + border-radius:2px; + color:var(--attachment-color); + font-size:13px; + line-height:15px; + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + white-space:normal; + cursor:pointer; + + &:hover{ + background-color:var(--attachment-bg-color); + background-clip:padding-box; + border-radius:2px; + color:var(--attachment-hover-color); + } + } + } + } + } +} + +.sidebar{ + --sidebar-bg-color:light-dark(#fff, #23222b); + --sidebar-border-color:light-dark( + rgb(21 20 26 / 0.1), + rgb(251 251 254 / 0.1) + ); + --sidebar-box-shadow:0 0.25px 0.75px light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 2px 6px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4)); + --sidebar-backdrop-filter:none; + --sidebar-border-radius:8px; + --sidebar-padding:5px; + --sidebar-min-width:180px; + --sidebar-max-width:632px; + --sidebar-width:239px; + --resizer-width:4px; + --resizer-shift:calc(0px - var(--resizer-width) - 2px); + --resizer-hover-bg-color:light-dark(#0062fa, #00cadb); + + @media screen and (forced-colors: active){ + --sidebar-bg-color:Canvas; + --sidebar-border-color:CanvasText; + --sidebar-box-shadow:none; + --resizer-hover-bg-color:CanvasText; + } + + border-radius:var(--sidebar-border-radius); + box-shadow:var(--sidebar-box-shadow); + border:1px solid var(--sidebar-border-color); + background-color:var(--sidebar-bg-color); + inset-block-start:calc(100% + var(--doorhanger-height) - 2px); + padding-block:var(--sidebar-padding); + width:var(--sidebar-width); + min-width:var(--sidebar-min-width); + max-width:var(--sidebar-max-width); + backdrop-filter:var(--sidebar-backdrop-filter); + box-sizing:border-box; + position:relative; + + .sidebarResizer{ + width:var(--resizer-width); + background-color:transparent; + forced-color-adjust:none; + cursor:ew-resize; + position:absolute; + inset-block:0; + inset-inline-start:var(--resizer-shift); + transition:background-color 0.5s ease-in-out, border-color 0.5s ease-in-out; + box-sizing:border-box; + border:1px solid transparent; + border-block-width:0; + background-clip:content-box; + + &:hover{ + background-color:var(--resizer-hover-bg-color); + border-color:white; + } + &:focus-visible{ + background-color:var(--resizer-hover-bg-color); + outline:none; + } + } + + &.resizing{ + cursor:ew-resize; + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + + :not(.sidebarResizer){ + pointer-events:none; + } + + .sidebarResizer{ + background-color:var(--resizer-hover-bg-color); + } + } +} + :root{ + color-scheme:light dark; + --viewer-container-height:0; --pdfViewer-padding-bottom:0; --page-margin:1px auto -8px; --page-border:9px solid transparent; --spreadHorizontalWrapped-margin-LR:-3.5px; --loading-icon-delay:400ms; -} + --focus-ring-color:light-dark(#0060df, #0df); + --focus-ring-outline:2px solid var(--focus-ring-color); + --new-badge-bg:light-dark(#070, #37b847); + --new-badge-color:light-dark(#fff, #15141a); + --new-badge-border-color:light-dark(#fbfbfe / 40%, #15141a / 40%); -@media screen and (forced-colors: active){ - :root{ + @media screen and (forced-colors: active){ --pdfViewer-padding-bottom:9px; --page-margin:8px auto -1px; --page-border:1px solid CanvasText; --spreadHorizontalWrapped-margin-LR:3.5px; + --focus-ring-color:CanvasText; + --new-badge-bg:AccentColor; + --new-badge-color:ButtonFace; + --new-badge-border-color:CanvasText; } } +.newBadge{ + background-color:var(--new-badge-bg); + color:var(--new-badge-color); + border-radius:4px; + border:1px solid var(--new-badge-border-color); + padding-inline:4px; + margin-inline:4px; + font:menu; + font-size:12px; + font-style:normal; + font-weight:400; + line-height:normal; + flex:0 0 fit-content; + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; +} + [data-main-rotation="90"]{ transform:rotate(90deg) translateY(-100%); } @@ -2592,39 +6182,64 @@ transform:rotate(270deg) translateX(-100%); } -#hiddenCopyElement, -.hiddenCanvasElement{ - position:absolute; - top:0; - left:0; - width:0; - height:0; - display:none; -} - .pdfViewer{ --scale-factor:1; + --page-bg-color:unset; padding-bottom:var(--pdfViewer-padding-bottom); --hcm-highlight-filter:none; --hcm-highlight-selected-filter:none; -} - -@media screen and (forced-colors: active){ -.pdfViewer{ + @media screen and (forced-colors: active){ --hcm-highlight-filter:invert(100%); -} } -.pdfViewer .canvasWrapper{ - overflow:hidden; - width:100%; - height:100%; + &.copyAll{ + cursor:wait; + } + + .canvasWrapper{ + overflow:hidden; + width:100%; + height:100%; + + canvas{ + position:absolute; + top:0; + left:0; + margin:0; + display:block; + width:100%; + height:100%; + contain:content; + + .structTree{ + contain:strict; + } + + &.detailView{ + image-rendering:pixelated; + } + } + .selection{ + position:absolute; + top:0; + left:0; + width:100%; + height:100%; + pointer-events:none; + background:rgb(0 90 255 / 0.22); + } + } } .pdfViewer .page{ + --user-unit:1; + --total-scale-factor:calc(var(--scale-factor) * var(--user-unit)); + --scale-round-x:1px; + --scale-round-y:1px; + direction:ltr; width:816px; height:1056px; @@ -2633,7 +6248,7 @@ overflow:visible; border:var(--page-border); background-clip:content-box; - background-color:rgb(255 255 255); + background-color:var(--page-bg-color, rgb(255 255 255)); } .pdfViewer .dummyPage{ @@ -2685,24 +6300,6 @@ margin-inline:5px; } -.pdfViewer .page canvas{ - margin:0; - display:block; -} - -.pdfViewer .page canvas .structTree{ - contain:strict; -} - -.pdfViewer .page canvas[hidden]{ - display:none; -} - -.pdfViewer .page canvas[zooming]{ - width:100%; - height:100%; -} - .pdfViewer .page.loadingIcon::after{ position:absolute; top:0; @@ -2742,71 +6339,72 @@ :root{ --dir-factor:1; - --inline-start:left; - --inline-end:right; --sidebar-width:200px; --sidebar-transition-duration:200ms; --sidebar-transition-timing-function:ease; + --toolbar-height:32px; + --toolbar-horizontal-padding:1px; + --toolbar-vertical-padding:2px; + --icon-size:16px; + --toolbar-icon-opacity:0.7; --doorhanger-icon-opacity:0.9; - --editor-toolbar-base-offset:105px; + --doorhanger-height:8px; - --main-color:rgb(12 12 13); - --body-bg-color:rgb(212 212 215); - --progressBar-color:rgb(10 132 255); - --progressBar-bg-color:rgb(221 221 222); - --progressBar-blend-color:rgb(116 177 239); - --scrollbar-color:auto; - --scrollbar-bg-color:auto; - --toolbar-icon-bg-color:rgb(0 0 0); - --toolbar-icon-hover-bg-color:rgb(0 0 0); - - --sidebar-narrow-bg-color:rgb(212 212 215 / 0.9); - --sidebar-toolbar-bg-color:rgb(245 246 247); - --toolbar-bg-color:rgb(249 249 250); - --toolbar-border-color:rgb(184 184 184); + --main-color:light-dark(rgb(12 12 13), rgb(249 249 250)); + --body-bg-color:light-dark(rgb(212 212 215), rgb(42 42 46)); + --progressBar-color:light-dark(rgb(10 132 255), rgb(0 96 223)); + --progressBar-bg-color:light-dark(rgb(221 221 222), rgb(40 40 43)); + --progressBar-blend-color:light-dark(rgb(116 177 239), rgb(20 68 133)); + --scrollbar-color:light-dark(auto, rgb(121 121 123)); + --scrollbar-bg-color:light-dark(auto, rgb(35 35 39)); + --toolbar-icon-bg-color:light-dark(rgb(0 0 0), rgb(255 255 255)); + --toolbar-icon-hover-bg-color:light-dark(rgb(0 0 0), rgb(255 255 255)); + + --sidebar-narrow-bg-color:light-dark( + rgb(212 212 215 / 0.9), + rgb(42 42 46 / 0.9) + ); + --sidebar-toolbar-bg-color:light-dark(rgb(245 246 247), rgb(50 50 52)); + --toolbar-bg-color:light-dark(rgb(249 249 250), rgb(56 56 61)); + --toolbar-border-color:light-dark(rgb(184 184 184), rgb(12 12 13)); --toolbar-box-shadow:0 1px 0 var(--toolbar-border-color); --toolbar-border-bottom:none; --toolbarSidebar-box-shadow:inset calc(-1px * var(--dir-factor)) 0 0 rgb(0 0 0 / 0.25), 0 1px 0 rgb(0 0 0 / 0.15), 0 0 1px rgb(0 0 0 / 0.1); --toolbarSidebar-border-bottom:none; - --button-hover-color:rgb(221 222 223); - --toggled-btn-color:rgb(0 0 0); + --button-hover-color:color-mix(in srgb, currentColor 17%, transparent); + --toggled-btn-color:light-dark(rgb(0 0 0), rgb(255 255 255)); --toggled-btn-bg-color:rgb(0 0 0 / 0.3); --toggled-hover-active-btn-color:rgb(0 0 0 / 0.4); --toggled-hover-btn-outline:none; - --dropdown-btn-bg-color:rgb(215 215 219); + --dropdown-btn-bg-color:light-dark(rgb(215 215 219), rgb(74 74 79)); --dropdown-btn-border:none; --separator-color:rgb(0 0 0 / 0.3); - --field-color:rgb(6 6 6); - --field-bg-color:rgb(255 255 255); - --field-border-color:rgb(187 187 188); - --treeitem-color:rgb(0 0 0 / 0.8); - --treeitem-bg-color:rgb(0 0 0 / 0.15); - --treeitem-hover-color:rgb(0 0 0 / 0.9); - --treeitem-selected-color:rgb(0 0 0 / 0.9); - --treeitem-selected-bg-color:rgb(0 0 0 / 0.25); - --thumbnail-hover-color:rgb(0 0 0 / 0.1); - --thumbnail-selected-color:rgb(0 0 0 / 0.2); - --doorhanger-bg-color:rgb(255 255 255); - --doorhanger-border-color:rgb(12 12 13 / 0.2); - --doorhanger-hover-color:rgb(12 12 13); - --doorhanger-hover-bg-color:rgb(237 237 237); - --doorhanger-separator-color:rgb(222 222 222); + --field-color:light-dark(rgb(6 6 6), rgb(250 250 250)); + --field-bg-color:light-dark(rgb(255 255 255), rgb(64 64 68)); + --field-border-color:light-dark(rgb(187 187 188), rgb(115 115 115)); + --doorhanger-bg-color:light-dark(rgb(255 255 255), #42414d); + --doorhanger-border-color:light-dark(rgb(12 12 13 / 0.2), rgb(39 39 43)); + --doorhanger-hover-color:light-dark(rgb(12 12 13), rgb(249 249 250)); + --doorhanger-separator-color:light-dark(rgb(222 222 222), rgb(92 92 97)); --dialog-button-border:none; - --dialog-button-bg-color:rgb(12 12 13 / 0.1); - --dialog-button-hover-bg-color:rgb(12 12 13 / 0.3); + --dialog-button-bg-color:light-dark(rgb(12 12 13 / 0.1), rgb(92 92 97)); + --dialog-button-hover-bg-color:light-dark( + rgb(12 12 13 / 0.3), + rgb(115 115 115) + ); --loading-icon:url(images/loading.svg); - --treeitem-expanded-icon:url(images/treeitem-expanded.svg); - --treeitem-collapsed-icon:url(images/treeitem-collapsed.svg); + --toolbarButton-editorComment-icon:url(images/comment-editButton.svg); --toolbarButton-editorFreeText-icon:url(images/toolbarButton-editorFreeText.svg); --toolbarButton-editorHighlight-icon:url(images/toolbarButton-editorHighlight.svg); --toolbarButton-editorInk-icon:url(images/toolbarButton-editorInk.svg); --toolbarButton-editorStamp-icon:url(images/toolbarButton-editorStamp.svg); + --toolbarButton-editorSignature-icon:url(images/toolbarButton-editorSignature.svg); --toolbarButton-menuArrow-icon:url(images/toolbarButton-menuArrow.svg); - --toolbarButton-sidebarToggle-icon:url(images/toolbarButton-sidebarToggle.svg); + --toolbarButton-viewsManagerToggle-icon:url(images/toolbarButton-viewsManagerToggle.svg); --toolbarButton-secondaryToolbarToggle-icon:url(images/toolbarButton-secondaryToolbarToggle.svg); --toolbarButton-pageUp-icon:url(images/toolbarButton-pageUp.svg); --toolbarButton-pageDown-icon:url(images/toolbarButton-pageDown.svg); @@ -2838,102 +6436,21 @@ --secondaryToolbarButton-spreadNone-icon:url(images/secondaryToolbarButton-spreadNone.svg); --secondaryToolbarButton-spreadOdd-icon:url(images/secondaryToolbarButton-spreadOdd.svg); --secondaryToolbarButton-spreadEven-icon:url(images/secondaryToolbarButton-spreadEven.svg); + --secondaryToolbarButton-imageAltTextSettings-icon:var( + --toolbarButton-editorStamp-icon + ); --secondaryToolbarButton-documentProperties-icon:url(images/secondaryToolbarButton-documentProperties.svg); --editorParams-stampAddImage-icon:url(images/toolbarButton-zoomIn.svg); + --comment-edit-button-icon:url(images/comment-editButton.svg); } -[dir="rtl"]:root{ +:root:dir(rtl){ --dir-factor:-1; - --inline-start:right; - --inline-end:left; } -@media (prefers-color-scheme: dark){ - :root:where(:not(.is-light)){ - --main-color:rgb(249 249 250); - --body-bg-color:rgb(42 42 46); - --progressBar-color:rgb(0 96 223); - --progressBar-bg-color:rgb(40 40 43); - --progressBar-blend-color:rgb(20 68 133); - --scrollbar-color:rgb(121 121 123); - --scrollbar-bg-color:rgb(35 35 39); - --toolbar-icon-bg-color:rgb(255 255 255); - --toolbar-icon-hover-bg-color:rgb(255 255 255); - - --sidebar-narrow-bg-color:rgb(42 42 46 / 0.9); - --sidebar-toolbar-bg-color:rgb(50 50 52); - --toolbar-bg-color:rgb(56 56 61); - --toolbar-border-color:rgb(12 12 13); - --button-hover-color:rgb(102 102 103); - --toggled-btn-color:rgb(255 255 255); - --toggled-btn-bg-color:rgb(0 0 0 / 0.3); - --toggled-hover-active-btn-color:rgb(0 0 0 / 0.4); - --dropdown-btn-bg-color:rgb(74 74 79); - --separator-color:rgb(0 0 0 / 0.3); - --field-color:rgb(250 250 250); - --field-bg-color:rgb(64 64 68); - --field-border-color:rgb(115 115 115); - --treeitem-color:rgb(255 255 255 / 0.8); - --treeitem-bg-color:rgb(255 255 255 / 0.15); - --treeitem-hover-color:rgb(255 255 255 / 0.9); - --treeitem-selected-color:rgb(255 255 255 / 0.9); - --treeitem-selected-bg-color:rgb(255 255 255 / 0.25); - --thumbnail-hover-color:rgb(255 255 255 / 0.1); - --thumbnail-selected-color:rgb(255 255 255 / 0.2); - --doorhanger-bg-color:rgb(74 74 79); - --doorhanger-border-color:rgb(39 39 43); - --doorhanger-hover-color:rgb(249 249 250); - --doorhanger-hover-bg-color:rgb(93 94 98); - --doorhanger-separator-color:rgb(92 92 97); - --dialog-button-bg-color:rgb(92 92 97); - --dialog-button-hover-bg-color:rgb(115 115 115); - } -} - -:root:where(.is-dark){ - --main-color:rgb(249 249 250); - --body-bg-color:rgb(42 42 46); - --progressBar-color:rgb(0 96 223); - --progressBar-bg-color:rgb(40 40 43); - --progressBar-blend-color:rgb(20 68 133); - --scrollbar-color:rgb(121 121 123); - --scrollbar-bg-color:rgb(35 35 39); - --toolbar-icon-bg-color:rgb(255 255 255); - --toolbar-icon-hover-bg-color:rgb(255 255 255); - - --sidebar-narrow-bg-color:rgb(42 42 46 / 0.9); - --sidebar-toolbar-bg-color:rgb(50 50 52); - --toolbar-bg-color:rgb(56 56 61); - --toolbar-border-color:rgb(12 12 13); - --button-hover-color:rgb(102 102 103); - --toggled-btn-color:rgb(255 255 255); - --toggled-btn-bg-color:rgb(0 0 0 / 0.3); - --toggled-hover-active-btn-color:rgb(0 0 0 / 0.4); - --dropdown-btn-bg-color:rgb(74 74 79); - --separator-color:rgb(0 0 0 / 0.3); - --field-color:rgb(250 250 250); - --field-bg-color:rgb(64 64 68); - --field-border-color:rgb(115 115 115); - --treeitem-color:rgb(255 255 255 / 0.8); - --treeitem-bg-color:rgb(255 255 255 / 0.15); - --treeitem-hover-color:rgb(255 255 255 / 0.9); - --treeitem-selected-color:rgb(255 255 255 / 0.9); - --treeitem-selected-bg-color:rgb(255 255 255 / 0.25); - --thumbnail-hover-color:rgb(255 255 255 / 0.1); - --thumbnail-selected-color:rgb(255 255 255 / 0.2); - --doorhanger-bg-color:rgb(74 74 79); - --doorhanger-border-color:rgb(39 39 43); - --doorhanger-hover-color:rgb(249 249 250); - --doorhanger-hover-bg-color:rgb(93 94 98); - --doorhanger-separator-color:rgb(92 92 97); - --dialog-button-bg-color:rgb(92 92 97); - --dialog-button-hover-bg-color:rgb(115 115 115); - } - @media screen and (forced-colors: active){ :root{ --button-hover-color:Highlight; - --doorhanger-hover-bg-color:Highlight; --toolbar-icon-opacity:1; --toolbar-icon-bg-color:ButtonText; --toolbar-icon-hover-bg-color:ButtonFace; @@ -2966,9 +6483,23 @@ } } -*{ - padding:0; - margin:0; +@keyframes progressIndeterminate{ + 0%{ + transform:translateX(calc(-142px * var(--dir-factor))); + } + + 100%{ + transform:translateX(0); + } +} + +html{ + &[data-toolbar-density="compact"]{ + --toolbar-height:30px; + } + &[data-toolbar-density="touch"]{ + --toolbar-height:44px; + } } html, @@ -2978,8 +6509,31 @@ } body{ + margin:0; background-color:var(--body-bg-color); scrollbar-color:var(--scrollbar-color) var(--scrollbar-bg-color); + + &.wait::before{ + content:""; + position:fixed; + width:100%; + height:100%; + z-index:100000; + cursor:wait; + } +} +.visuallyHidden{ + position:absolute; + top:0; + left:0; + border:0; + margin:0; + padding:0; + width:0; + height:0; + overflow:hidden; + white-space:nowrap; + font-size:0; } .hidden, @@ -2987,17 +6541,6 @@ display:none !important; } -#viewerContainer.pdfPresentationMode:-webkit-full-screen{ - top:0; - background-color:rgb(0 0 0); - width:100%; - height:100%; - overflow:hidden; - cursor:none; - -webkit-user-select:none; - user-select:none; -} - #viewerContainer.pdfPresentationMode:fullscreen{ top:0; background-color:rgb(0 0 0); @@ -3010,18 +6553,11 @@ user-select:none; } -.pdfPresentationMode:-webkit-full-screen section:not([data-internal-link]){ - pointer-events:none; -} - -.pdfPresentationMode:fullscreen section:not([data-internal-link]){ +.pdfPresentationMode:fullscreen + section:not([data-internal-link], .mediaAnnotation){ pointer-events:none; } -.pdfPresentationMode:-webkit-full-screen .textLayer span{ - cursor:none; -} - .pdfPresentationMode:fullscreen .textLayer span{ cursor:none; } @@ -3035,38 +6571,20 @@ width:100%; height:100%; position:relative; -} - -#sidebarContainer{ - position:absolute; - inset-block:32px 0; - inset-inline-start:calc(-1 * var(--sidebar-width)); - width:var(--sidebar-width); - visibility:hidden; - z-index:100; - font:message-box; - border-top:1px solid rgb(51 51 51); - border-inline-end:var(--doorhanger-border-color-whcm); - transition-property:inset-inline-start; - transition-duration:var(--sidebar-transition-duration); - transition-timing-function:var(--sidebar-transition-timing-function); -} - -#outerContainer:is(.sidebarMoving, .sidebarOpen) #sidebarContainer{ - visibility:visible; -} -#outerContainer.sidebarOpen #sidebarContainer{ - inset-inline-start:0; + margin:0; } #mainContainer{ position:absolute; inset:0; min-width:350px; + margin:0; + display:flex; + flex-direction:column; } #sidebarContent{ - inset-block:32px 0; + inset-block:var(--toolbar-height) 0; inset-inline-start:0; overflow:auto; position:absolute; @@ -3077,301 +6595,64 @@ #viewerContainer{ overflow:auto; position:absolute; - inset:32px 0 0; + inset:var(--toolbar-height) 0 0; outline:none; + z-index:0; } + #viewerContainer:not(.pdfPresentationMode){ transition-duration:var(--sidebar-transition-duration); transition-timing-function:var(--sidebar-transition-timing-function); } -#outerContainer.sidebarOpen #viewerContainer:not(.pdfPresentationMode){ - inset-inline-start:var(--sidebar-width); - transition-property:inset-inline-start; -} - -.toolbar{ - position:relative; - inset-inline:0; - z-index:9999; - cursor:default; - font:message-box; -} - -:is(.toolbar, .editorParamsToolbar, .findbar, #sidebarContainer) - :is(input, button, select), -.secondaryToolbar :is(input, button, a, select){ - outline:none; +#sidebarContainer :is(input, button, select){ font:message-box; } -#toolbarContainer{ - width:100%; +.toolbar{ + z-index:2; } #toolbarSidebar{ width:100%; - height:32px; + height:var(--toolbar-height); background-color:var(--sidebar-toolbar-bg-color); box-shadow:var(--toolbarSidebar-box-shadow); border-bottom:var(--toolbarSidebar-border-bottom); -} - -#sidebarResizer{ - position:absolute; - inset-block:0; - inset-inline-end:-6px; - width:6px; - z-index:200; - cursor:ew-resize; -} - -#toolbarContainer, -.findbar, -.secondaryToolbar, -.editorParamsToolbar{ - position:relative; - height:32px; - background-color:var(--toolbar-bg-color); - box-shadow:var(--toolbar-box-shadow); - border-bottom:var(--toolbar-border-bottom); -} - -#toolbarViewer{ - height:32px; -} - -#loadingBar{ - --progressBar-percent:0%; - --progressBar-end-offset:0; - - position:absolute; - inset-inline:0 var(--progressBar-end-offset); - height:4px; - background-color:var(--progressBar-bg-color); - border-bottom:1px solid var(--toolbar-border-color); - transition-property:inset-inline-start; - transition-duration:var(--sidebar-transition-duration); - transition-timing-function:var(--sidebar-transition-timing-function); -} - -#outerContainer.sidebarOpen #loadingBar{ - inset-inline-start:var(--sidebar-width); -} - -#loadingBar .progress{ - position:absolute; - top:0; - inset-inline-start:0; - width:100%; - transform:scaleX(var(--progressBar-percent)); - transform-origin:calc(50% - 50% * var(--dir-factor)) 0; - height:100%; - background-color:var(--progressBar-color); - overflow:hidden; - transition:transform 200ms; -} - -@keyframes progressIndeterminate{ - 0%{ - transform:translateX(calc(-142px * var(--dir-factor))); - } - 100%{ - transform:translateX(0); - } -} - -#loadingBar.indeterminate .progress{ - transform:none; - background-color:var(--progressBar-bg-color); - transition:none; -} - -#loadingBar.indeterminate .progress .glimmer{ - position:absolute; - top:0; - inset-inline-start:0; - height:100%; - width:calc(100% + 150px); - background:repeating-linear-gradient( - 135deg, - var(--progressBar-blend-color) 0, - var(--progressBar-bg-color) 5px, - var(--progressBar-bg-color) 45px, - var(--progressBar-color) 55px, - var(--progressBar-color) 95px, - var(--progressBar-blend-color) 100px - ); - animation:progressIndeterminate 1s linear infinite; -} - -#outerContainer.sidebarResizing - :is(#sidebarContainer, #viewerContainer, #loadingBar){ - transition-duration:0s; -} - -.findbar, -.secondaryToolbar, -.editorParamsToolbar{ - top:32px; - position:absolute; - z-index:30000; - height:auto; - padding:0 4px; - margin:4px 2px; - font:message-box; - font-size:12px; - line-height:14px; - text-align:left; - cursor:default; -} - -.findbar{ - inset-inline-start:64px; - min-width:300px; - background-color:var(--toolbar-bg-color); -} -.findbar > div{ - height:32px; -} -.findbar > div#findbarInputContainer{ - margin-inline-end:4px; -} -.findbar.wrapContainers > div, -.findbar.wrapContainers > div#findbarMessageContainer > *{ - clear:both; -} -.findbar.wrapContainers > div#findbarMessageContainer{ - height:auto; -} - -.findbar input[type="checkbox"]{ - pointer-events:none; -} - -.findbar label{ - -webkit-user-select:none; - -moz-user-select:none; - user-select:none; -} - -.findbar label:hover, -.findbar input:focus-visible + label{ - color:var(--toggled-btn-color); - background-color:var(--button-hover-color); -} + padding:var(--toolbar-vertical-padding) var(--toolbar-horizontal-padding); + justify-content:space-between; -.findbar .toolbarField[type="checkbox"]:checked + .toolbarLabel{ - background-color:var(--toggled-btn-bg-color) !important; - color:var(--toggled-btn-color); -} + #toolbarSidebarLeft{ + width:auto; + height:100%; -#findInput{ - width:200px; -} + #viewThumbnail::before{ + -webkit-mask-image:var(--toolbarButton-viewThumbnail-icon); + mask-image:var(--toolbarButton-viewThumbnail-icon); + } -#findInput::-moz-placeholder{ - font-style:normal; - } + #viewOutline::before{ + -webkit-mask-image:var(--toolbarButton-viewOutline-icon); + mask-image:var(--toolbarButton-viewOutline-icon); + transform:scaleX(var(--dir-factor)); + } -#findInput::placeholder{ - font-style:normal; - } + #viewAttachments::before{ + -webkit-mask-image:var(--toolbarButton-viewAttachments-icon); + mask-image:var(--toolbarButton-viewAttachments-icon); + } -.loadingInput:has(> #findInput[data-status="pending"])::after{ - display:block; - visibility:visible; + #viewLayers::before{ + -webkit-mask-image:var(--toolbarButton-viewLayers-icon); + mask-image:var(--toolbarButton-viewLayers-icon); + } } -#findInput[data-status="notFound"]{ - background-color:rgb(255 102 102); + #toolbarSidebarRight{ + width:auto; + height:100%; + padding-inline-end:2px; } - -.secondaryToolbar, -.editorParamsToolbar{ - padding:6px 0 10px; - inset-inline-end:4px; - height:auto; - background-color:var(--doorhanger-bg-color); -} - -.editorParamsToolbarContainer{ - width:220px; - margin-bottom:-4px; -} - -.editorParamsToolbarContainer > .editorParamsSetter{ - min-height:26px; - display:flex; - align-items:center; - justify-content:space-between; - padding-inline:10px; -} - -.editorParamsToolbarContainer .editorParamsLabel{ - padding-inline-end:10px; - flex:none; - font:menu; - font-size:13px; - font-style:normal; - font-weight:400; - line-height:150%; - color:var(--main-color); -} - -.editorParamsToolbarContainer .editorParamsColor{ - width:32px; - height:32px; - flex:none; -} - -.editorParamsToolbarContainer .editorParamsSlider{ - background-color:transparent; - width:90px; - flex:0 1 0; -} - -.editorParamsToolbarContainer .editorParamsSlider::-moz-range-progress{ - background-color:black; -} - -.editorParamsToolbarContainer .editorParamsSlider::-webkit-slider-runnable-track, -.editorParamsToolbarContainer .editorParamsSlider::-moz-range-track{ - background-color:black; -} - -.editorParamsToolbarContainer .editorParamsSlider::-webkit-slider-thumb, -.editorParamsToolbarContainer .editorParamsSlider::-moz-range-thumb{ - background-color:white; -} - -#secondaryToolbarButtonContainer{ - max-width:220px; - min-height:26px; - max-height:calc(var(--viewer-container-height) - 40px); - overflow-y:auto; - margin-bottom:-4px; -} - -#editorStampParamsToolbar{ - inset-inline-end:calc(var(--editor-toolbar-base-offset) + 0px); -} - -#editorInkParamsToolbar{ - inset-inline-end:calc(var(--editor-toolbar-base-offset) + 28px); -} - -#editorFreeTextParamsToolbar{ - inset-inline-end:calc(var(--editor-toolbar-base-offset) + 56px); -} - -#editorHighlightParamsToolbar{ - inset-inline-end:calc(var(--editor-toolbar-base-offset) + 84px); -} - -#editorStampAddImage::before{ - -webkit-mask-image:var(--editorParams-stampAddImage-icon); - mask-image:var(--editorParams-stampAddImage-icon); } .doorHanger, @@ -3379,102 +6660,58 @@ border-radius:2px; box-shadow:0 1px 5px var(--doorhanger-border-color), 0 0 0 1px var(--doorhanger-border-color); border:var(--doorhanger-border-color-whcm); -} -:is(.doorHanger, .doorHangerRight)::after, -:is(.doorHanger, .doorHangerRight)::before{ - bottom:100%; - border:8px solid rgb(0 0 0 / 0); - content:" "; - height:0; - width:0; - position:absolute; - pointer-events:none; - opacity:var(--doorhanger-triangle-opacity-whcm); -} -.doorHanger::after{ - inset-inline-start:10px; - margin-inline-start:-8px; - border-bottom-color:var(--toolbar-bg-color); -} -.doorHangerRight::after{ - inset-inline-end:10px; - margin-inline-end:-8px; - border-bottom-color:var(--doorhanger-bg-color); -} -:is(.doorHanger, .doorHangerRight)::before{ - border-bottom-color:var(--doorhanger-border-color); - border-width:9px; -} -.doorHanger::before{ - inset-inline-start:10px; - margin-inline-start:-9px; -} -.doorHangerRight::before{ - inset-inline-end:10px; - margin-inline-end:-9px; -} - -#findResultsCount{ - background-color:rgb(217 217 217); - color:rgb(82 82 82); - text-align:center; - padding:4px 5px; - margin:5px; -} + background-color:var(--doorhanger-bg-color); + inset-block-start:calc(100% + var(--doorhanger-height) - 2px); -#findMsg[data-status="notFound"]{ - font-weight:bold; -} + &::after, + &::before{ + bottom:100%; + border-style:solid; + border-color:transparent; + content:""; + height:0; + width:0; + position:absolute; + pointer-events:none; + opacity:var(--doorhanger-triangle-opacity-whcm); + } -:is(#findResultsCount, #findMsg):empty{ - display:none; -} + &::before{ + border-width:calc(var(--doorhanger-height) + 2px); + border-bottom-color:var(--doorhanger-border-color); + } -#toolbarViewerMiddle{ - position:absolute; - left:50%; - transform:translateX(-50%); + &::after{ + border-width:var(--doorhanger-height); + } } -#toolbarViewerLeft, -#toolbarSidebarLeft{ - float:var(--inline-start); -} -#toolbarViewerRight, -#toolbarSidebarRight{ - float:var(--inline-end); -} +.doorHangerRight{ + inset-inline-end:calc(50% - var(--doorhanger-height) - 1px); -#toolbarViewerLeft > *, -#toolbarViewerMiddle > *, -#toolbarViewerRight > *, -#toolbarSidebarLeft *, -#toolbarSidebarRight *, -.findbar *{ - position:relative; - float:var(--inline-start); -} + &::before{ + inset-inline-end:-1px; + } -#toolbarViewerLeft{ - padding-inline-start:1px; -} -#toolbarViewerRight{ - padding-inline-end:1px; -} -#toolbarSidebarRight{ - padding-inline-end:2px; + &::after{ + border-bottom-color:var(--doorhanger-bg-color); + inset-inline-end:1px; + } } -.splitToolbarButton{ - margin:2px; - display:inline-block; -} -.splitToolbarButton > .toolbarButton{ - float:var(--inline-start); +.doorHanger{ + inset-inline-start:calc(50% - var(--doorhanger-height) - 1px); + + &::before{ + inset-inline-start:-1px; + } + + &::after{ + border-bottom-color:var(--toolbar-bg-color); + inset-inline-start:1px; + } } -.toolbarButton, -.secondaryToolbarButton, .dialogButton{ border:none; background:none; @@ -3491,40 +6728,14 @@ color:var(--dialog-button-hover-color); } -.toolbarButton > span{ - display:inline-block; - width:0; - height:0; - overflow:hidden; -} - -:is(.toolbarButton, .secondaryToolbarButton, .dialogButton)[disabled]{ - opacity:0.5; -} - -.splitToolbarButton > .toolbarButton:is(:hover, :focus-visible), -.dropdownToolbarButton:hover{ - background-color:var(--button-hover-color); -} -.splitToolbarButton > .toolbarButton{ - position:relative; - margin:0; -} -#toolbarSidebar .splitToolbarButton > .toolbarButton{ - margin-inline-end:2px; -} - .splitToolbarButtonSeparator{ - float:var(--inline-start); - margin:4px 0; - width:1px; - height:20px; - background-color:var(--separator-color); + float:inline-start; + width:0; + height:62%; + border-left:1px solid var(--separator-color); + border-right:none; } -.toolbarButton, -.dropdownToolbarButton, -.secondaryToolbarButton, .dialogButton{ min-width:16px; margin:2px 1px; @@ -3541,137 +6752,18 @@ box-sizing:border-box; } -.toolbarButton:is(:hover, :focus-visible){ - background-color:var(--button-hover-color); -} -.secondaryToolbarButton:is(:hover, :focus-visible){ - background-color:var(--doorhanger-hover-bg-color); - color:var(--doorhanger-hover-color); -} - -:is(.toolbarButton, .secondaryToolbarButton).toggled, -.splitToolbarButton.toggled > .toolbarButton.toggled{ - background-color:var(--toggled-btn-bg-color); - color:var(--toggled-btn-color); -} - -:is(.toolbarButton, .secondaryToolbarButton).toggled:hover, -.splitToolbarButton.toggled > .toolbarButton.toggled:hover{ - outline:var(--toggled-hover-btn-outline) !important; -} - -:is(.toolbarButton, .secondaryToolbarButton).toggled::before{ - background-color:var(--toggled-btn-color); -} - -:is(.toolbarButton, .secondaryToolbarButton).toggled:hover:active, -.splitToolbarButton.toggled > .toolbarButton.toggled:hover:active{ - background-color:var(--toggled-hover-active-btn-color); -} - -.dropdownToolbarButton{ - display:flex; - width:-moz-fit-content; - width:fit-content; - min-width:140px; - padding:0; - background-color:var(--dropdown-btn-bg-color); - border:var(--dropdown-btn-border); -} -.dropdownToolbarButton::after{ - top:6px; - inset-inline-end:6px; - pointer-events:none; - -webkit-mask-image:var(--toolbarButton-menuArrow-icon); - mask-image:var(--toolbarButton-menuArrow-icon); -} - -.dropdownToolbarButton > select{ - -webkit-appearance:none; - -moz-appearance:none; - appearance:none; - width:inherit; - min-width:inherit; - height:28px; - font-size:12px; - color:var(--main-color); - margin:0; - padding-block:1px 2px; - padding-inline:6px 38px; - border:none; - background-color:var(--dropdown-btn-bg-color); -} -.dropdownToolbarButton > select:is(:hover, :focus-visible){ - background-color:var(--button-hover-color); - color:var(--toggled-btn-color); -} -.dropdownToolbarButton > select > option{ - background:var(--doorhanger-bg-color); - color:var(--main-color); -} - -.toolbarButtonSpacer{ - width:30px; - display:inline-block; - height:1px; -} - -:is(.toolbarButton, .secondaryToolbarButton, .treeItemToggler)::before, -.dropdownToolbarButton::after{ - position:absolute; - display:inline-block; - width:16px; - height:16px; - - content:""; - background-color:var(--toolbar-icon-bg-color); - -webkit-mask-size:cover; - mask-size:cover; -} - -.dropdownToolbarButton:is(:hover, :focus-visible, :active)::after{ - background-color:var(--toolbar-icon-hover-bg-color); -} - -.toolbarButton::before{ - opacity:var(--toolbar-icon-opacity); - top:6px; - left:6px; -} - -.toolbarButton:is(:hover, :focus-visible)::before, -.secondaryToolbarButton:is(:hover, :focus-visible)::before{ - background-color:var(--toolbar-icon-hover-bg-color); -} - -.secondaryToolbarButton::before{ - opacity:var(--doorhanger-icon-opacity); - top:5px; - inset-inline-start:12px; -} - -#sidebarToggle::before{ - -webkit-mask-image:var(--toolbarButton-sidebarToggle-icon); - mask-image:var(--toolbarButton-sidebarToggle-icon); +#viewsManagerToggleButton::before{ + -webkit-mask-image:var(--toolbarButton-viewsManagerToggle-icon); + mask-image:var(--toolbarButton-viewsManagerToggle-icon); transform:scaleX(var(--dir-factor)); } -#secondaryToolbarToggle::before{ +#secondaryToolbarToggleButton::before{ -webkit-mask-image:var(--toolbarButton-secondaryToolbarToggle-icon); mask-image:var(--toolbarButton-secondaryToolbarToggle-icon); transform:scaleX(var(--dir-factor)); } -#findPrevious::before{ - -webkit-mask-image:var(--findbarButton-previous-icon); - mask-image:var(--findbarButton-previous-icon); -} - -#findNext::before{ - -webkit-mask-image:var(--findbarButton-next-icon); - mask-image:var(--findbarButton-next-icon); -} - #previous::before{ -webkit-mask-image:var(--toolbarButton-pageUp-icon); mask-image:var(--toolbarButton-pageUp-icon); @@ -3682,98 +6774,64 @@ mask-image:var(--toolbarButton-pageDown-icon); } -#zoomOut::before{ +#zoomOutButton::before{ -webkit-mask-image:var(--toolbarButton-zoomOut-icon); mask-image:var(--toolbarButton-zoomOut-icon); } -#zoomIn::before{ +#zoomInButton::before{ -webkit-mask-image:var(--toolbarButton-zoomIn-icon); mask-image:var(--toolbarButton-zoomIn-icon); } -#presentationMode::before{ - -webkit-mask-image:var(--toolbarButton-presentationMode-icon); - mask-image:var(--toolbarButton-presentationMode-icon); +#editorCommentButton::before{ + -webkit-mask-image:var(--toolbarButton-editorComment-icon); + mask-image:var(--toolbarButton-editorComment-icon); + transform:scaleX(var(--dir-factor)); } -#editorFreeText::before{ +#editorFreeTextButton::before{ -webkit-mask-image:var(--toolbarButton-editorFreeText-icon); mask-image:var(--toolbarButton-editorFreeText-icon); } -#editorHighlight::before{ +#editorHighlightButton::before{ -webkit-mask-image:var(--toolbarButton-editorHighlight-icon); mask-image:var(--toolbarButton-editorHighlight-icon); } -#editorInk::before{ +#editorInkButton::before{ -webkit-mask-image:var(--toolbarButton-editorInk-icon); mask-image:var(--toolbarButton-editorInk-icon); } -#editorStamp::before{ +#editorStampButton::before{ -webkit-mask-image:var(--toolbarButton-editorStamp-icon); mask-image:var(--toolbarButton-editorStamp-icon); } -:is(#print, #secondaryPrint)::before{ - -webkit-mask-image:var(--toolbarButton-print-icon); - mask-image:var(--toolbarButton-print-icon); +#editorSignatureButton::before{ + -webkit-mask-image:var(--toolbarButton-editorSignature-icon); + mask-image:var(--toolbarButton-editorSignature-icon); } -#secondaryOpenFile::before{ - -webkit-mask-image:var(--toolbarButton-openFile-icon); - mask-image:var(--toolbarButton-openFile-icon); +#printButton::before{ + -webkit-mask-image:var(--toolbarButton-print-icon); + mask-image:var(--toolbarButton-print-icon); } -:is(#download, #secondaryDownload)::before{ +#downloadButton::before{ -webkit-mask-image:var(--toolbarButton-download-icon); mask-image:var(--toolbarButton-download-icon); } -a.secondaryToolbarButton{ - padding-top:5px; - text-decoration:none; -} -a:is(.toolbarButton, .secondaryToolbarButton)[href="#"]{ - opacity:0.5; - pointer-events:none; -} - -#viewBookmark::before{ - -webkit-mask-image:var(--toolbarButton-bookmark-icon); - mask-image:var(--toolbarButton-bookmark-icon); -} - -#viewThumbnail::before{ - -webkit-mask-image:var(--toolbarButton-viewThumbnail-icon); - mask-image:var(--toolbarButton-viewThumbnail-icon); -} - -#viewOutline::before{ - -webkit-mask-image:var(--toolbarButton-viewOutline-icon); - mask-image:var(--toolbarButton-viewOutline-icon); - transform:scaleX(var(--dir-factor)); -} - -#viewAttachments::before{ - -webkit-mask-image:var(--toolbarButton-viewAttachments-icon); - mask-image:var(--toolbarButton-viewAttachments-icon); -} - -#viewLayers::before{ - -webkit-mask-image:var(--toolbarButton-viewLayers-icon); - mask-image:var(--toolbarButton-viewLayers-icon); -} - #currentOutlineItem::before{ -webkit-mask-image:var(--toolbarButton-currentOutlineItem-icon); mask-image:var(--toolbarButton-currentOutlineItem-icon); transform:scaleX(var(--dir-factor)); } -#viewFind::before{ +#viewFindButton::before{ -webkit-mask-image:var(--toolbarButton-search-icon); mask-image:var(--toolbarButton-search-icon); } @@ -3790,108 +6848,46 @@ border-radius:50%; } -.secondaryToolbarButton{ - position:relative; - margin:0; - padding:0 0 1px; - padding-inline-start:36px; - height:auto; - min-height:26px; - width:auto; - min-width:100%; - text-align:start; - white-space:normal; - border-radius:0; +.verticalToolbarSeparator{ + display:block; + margin-inline:2px; + width:0; + height:80%; + border-left:1px solid var(--separator-color); + border-right:none; box-sizing:border-box; - display:inline-block; -} -.secondaryToolbarButton > span{ - padding-inline-end:4px; -} - -#firstPage::before{ - -webkit-mask-image:var(--secondaryToolbarButton-firstPage-icon); - mask-image:var(--secondaryToolbarButton-firstPage-icon); -} - -#lastPage::before{ - -webkit-mask-image:var(--secondaryToolbarButton-lastPage-icon); - mask-image:var(--secondaryToolbarButton-lastPage-icon); -} - -#pageRotateCcw::before{ - -webkit-mask-image:var(--secondaryToolbarButton-rotateCcw-icon); - mask-image:var(--secondaryToolbarButton-rotateCcw-icon); -} - -#pageRotateCw::before{ - -webkit-mask-image:var(--secondaryToolbarButton-rotateCw-icon); - mask-image:var(--secondaryToolbarButton-rotateCw-icon); -} - -#cursorSelectTool::before{ - -webkit-mask-image:var(--secondaryToolbarButton-selectTool-icon); - mask-image:var(--secondaryToolbarButton-selectTool-icon); -} - -#cursorHandTool::before{ - -webkit-mask-image:var(--secondaryToolbarButton-handTool-icon); - mask-image:var(--secondaryToolbarButton-handTool-icon); -} - -#scrollPage::before{ - -webkit-mask-image:var(--secondaryToolbarButton-scrollPage-icon); - mask-image:var(--secondaryToolbarButton-scrollPage-icon); -} - -#scrollVertical::before{ - -webkit-mask-image:var(--secondaryToolbarButton-scrollVertical-icon); - mask-image:var(--secondaryToolbarButton-scrollVertical-icon); -} - -#scrollHorizontal::before{ - -webkit-mask-image:var(--secondaryToolbarButton-scrollHorizontal-icon); - mask-image:var(--secondaryToolbarButton-scrollHorizontal-icon); } -#scrollWrapped::before{ - -webkit-mask-image:var(--secondaryToolbarButton-scrollWrapped-icon); - mask-image:var(--secondaryToolbarButton-scrollWrapped-icon); -} - -#spreadNone::before{ - -webkit-mask-image:var(--secondaryToolbarButton-spreadNone-icon); - mask-image:var(--secondaryToolbarButton-spreadNone-icon); +.horizontalToolbarSeparator{ + display:block; + margin:6px 0; + border-top:1px solid var(--doorhanger-separator-color); + border-bottom:none; + height:0; + width:100%; } -#spreadOdd::before{ - -webkit-mask-image:var(--secondaryToolbarButton-spreadOdd-icon); - mask-image:var(--secondaryToolbarButton-spreadOdd-icon); -} +.toggleButton{ + display:inline; -#spreadEven::before{ - -webkit-mask-image:var(--secondaryToolbarButton-spreadEven-icon); - mask-image:var(--secondaryToolbarButton-spreadEven-icon); -} + &:has(> input:checked){ + color:var(--toggled-btn-color); + background-color:var(--toggled-btn-bg-color); + } -#documentProperties::before{ - -webkit-mask-image:var(--secondaryToolbarButton-documentProperties-icon); - mask-image:var(--secondaryToolbarButton-documentProperties-icon); -} + &:is(:hover, :has(> input:focus-visible)){ + color:var(--toggled-btn-color); + background-color:var(--button-hover-color); + } -.verticalToolbarSeparator{ - display:block; - margin:5px 2px; - width:1px; - height:22px; - background-color:var(--separator-color); -} -.horizontalToolbarSeparator{ - display:block; - margin:6px 0; - height:1px; - width:100%; - background-color:var(--doorhanger-separator-color); + & > input{ + position:absolute; + top:50%; + left:50%; + opacity:0; + width:0; + height:0; + } } .toolbarField{ @@ -3906,14 +6902,10 @@ font-size:12px; line-height:16px; outline:none; -} -.toolbarField[type="checkbox"]{ - opacity:0; - position:absolute !important; - left:0; - margin:10px 0 3px; - margin-inline-start:7px; + &:focus{ + border-color:#0a84ff; + } } #pageNumber{ @@ -3922,27 +6914,29 @@ width:40px; background-size:0 0; transition-property:none; -} -#pageNumber::-webkit-inner-spin-button{ + &::-webkit-inner-spin-button{ -webkit-appearance:none; } -.loadingInput:has(> #pageNumber.loading)::after{ - display:block; + .loadingInput:has(> &.loading)::after{ + display:inline; visibility:visible; transition-property:visibility; transition-delay:var(--loading-icon-delay); } +} + +.loadingInput{ + position:relative; -.loadingInput::after{ + &::after{ position:absolute; visibility:hidden; display:none; - top:calc(50% - 8px); - width:16px; - height:16px; + width:var(--icon-size); + height:var(--icon-size); content:""; background-color:var(--toolbar-icon-bg-color); @@ -3952,181 +6946,21 @@ mask-image:var(--loading-icon); } -.loadingInput.start::after{ + &.start::after{ inset-inline-start:4px; } -.loadingInput.end::after{ + &.end::after{ inset-inline-end:4px; } - -.toolbarField:focus{ - border-color:#0a84ff; -} - -.toolbarLabel{ - min-width:16px; - padding:7px; - margin:2px; - border-radius:2px; - color:var(--main-color); - font-size:12px; - line-height:14px; - text-align:left; - -webkit-user-select:none; - -moz-user-select:none; - user-select:none; - cursor:default; -} - -#numPages.toolbarLabel{ - padding-inline-start:3px; } - -#thumbnailView, -#outlineView, -#attachmentsView, -#layersView{ - position:absolute; - width:calc(100% - 8px); - inset-block:0; - padding:4px 4px 0; - overflow:auto; - -webkit-user-select:none; - -moz-user-select:none; - user-select:none; -} -#thumbnailView{ - width:calc(100% - 60px); - padding:10px 30px 0; -} - -#thumbnailView > a:is(:active, :focus){ - outline:0; -} - -.thumbnail{ - --thumbnail-width:0; - --thumbnail-height:0; - - float:var(--inline-start); - width:var(--thumbnail-width); - height:var(--thumbnail-height); - margin:0 10px 5px; - padding:1px; - border:7px solid transparent; - border-radius:2px; -} - -#thumbnailView > a:last-of-type > .thumbnail{ - margin-bottom:10px; -} - -a:focus > .thumbnail, -.thumbnail:hover{ - border-color:var(--thumbnail-hover-color); -} -.thumbnail.selected{ - border-color:var(--thumbnail-selected-color) !important; -} - -.thumbnailImage{ - width:var(--thumbnail-width); - height:var(--thumbnail-height); - opacity:0.9; -} -a:focus > .thumbnail > .thumbnailImage, -.thumbnail:hover > .thumbnailImage{ - opacity:0.95; -} -.thumbnail.selected > .thumbnailImage{ - opacity:1 !important; -} - -.thumbnail:not([data-loaded]) > .thumbnailImage{ - width:calc(var(--thumbnail-width) - 2px); - height:calc(var(--thumbnail-height) - 2px); - border:1px dashed rgb(132 132 132); -} - -.treeWithDeepNesting > .treeItem, -.treeItem > .treeItems{ - margin-inline-start:20px; -} - -.treeItem > a{ - text-decoration:none; - display:inline-block; - min-width:calc(100% - 4px); - height:auto; - margin-bottom:1px; - padding:2px 0 5px; - padding-inline-start:4px; - border-radius:2px; - color:var(--treeitem-color); - font-size:13px; - line-height:15px; - -webkit-user-select:none; - -moz-user-select:none; - user-select:none; - white-space:normal; - cursor:pointer; -} - -#layersView .treeItem > a *{ - cursor:pointer; -} -#layersView .treeItem > a > label{ - padding-inline-start:4px; -} -#layersView .treeItem > a > label > input{ - float:var(--inline-start); - margin-top:1px; -} - -.treeItemToggler{ - position:relative; - float:var(--inline-start); - height:0; - width:0; - color:rgb(255 255 255 / 0.5); -} -.treeItemToggler::before{ - inset-inline-end:4px; - -webkit-mask-image:var(--treeitem-expanded-icon); - mask-image:var(--treeitem-expanded-icon); -} -.treeItemToggler.treeItemsHidden::before{ - -webkit-mask-image:var(--treeitem-collapsed-icon); - mask-image:var(--treeitem-collapsed-icon); - transform:scaleX(var(--dir-factor)); -} -.treeItemToggler.treeItemsHidden ~ .treeItems{ - display:none; -} - -.treeItem.selected > a{ - background-color:var(--treeitem-selected-bg-color); - color:var(--treeitem-selected-color); -} - -.treeItemToggler:hover, -.treeItemToggler:hover + a, -.treeItemToggler:hover ~ .treeItems, -.treeItem > a:hover{ - background-color:var(--treeitem-bg-color); - background-clip:padding-box; - border-radius:2px; - color:var(--treeitem-hover-color); -} - #outlineOptionsContainer{ display:none; -} -#sidebarContainer:has(#outlineView:not(.hidden)) #outlineOptionsContainer{ - display:inherit; + #sidebarContainer:has(#outlineView:not(.hidden)) &{ + display:inline flex; } +} .dialogButton{ width:auto; @@ -4150,6 +6984,7 @@ border-radius:4px; box-shadow:0 1px 4px rgb(0 0 0 / 0.3); } + dialog::backdrop{ background-color:rgb(0 0 0 / 0.2); } @@ -4169,9 +7004,10 @@ dialog .separator{ display:block; margin:4px 0; - height:1px; + height:0; width:100%; - background-color:var(--separator-color); + border-top:1px solid var(--separator-color); + border-bottom:none; } dialog .buttonRow{ @@ -4186,6 +7022,7 @@ #passwordDialog{ text-align:center; } + #passwordDialog .toolbarField{ width:200px; } @@ -4193,33 +7030,44 @@ #documentPropertiesDialog{ text-align:left; } + #documentPropertiesDialog .row > *{ min-width:100px; text-align:start; } + #documentPropertiesDialog .row > span{ width:125px; word-wrap:break-word; } + #documentPropertiesDialog .row > p{ max-width:225px; word-wrap:break-word; } + #documentPropertiesDialog .buttonRow{ margin-top:10px; } +#printServiceDialog{ + min-width:200px; +} + .grab-to-pan-grab{ cursor:grab !important; } + .grab-to-pan-grab *:not(input):not(textarea):not(button):not(select):not(:link){ cursor:inherit !important; } + .grab-to-pan-grab:active, .grab-to-pan-grabbing{ cursor:grabbing !important; } + .grab-to-pan-grabbing{ position:fixed; background:rgb(0 0 0 / 0); @@ -4229,6 +7077,447 @@ z-index:50000; } +.toolbarButton{ + height:100%; + aspect-ratio:1; + display:flex; + align-items:center; + justify-content:center; + background:none; + border:none; + color:var(--main-color); + outline:none; + border-radius:2px; + box-sizing:border-box; + font:message-box; + flex:none; + position:relative; + padding:0; + + > span{ + display:inline-block; + width:0; + height:0; + overflow:hidden; + } + + &::before{ + opacity:var(--toolbar-icon-opacity); + display:inline-block; + width:var(--icon-size); + height:var(--icon-size); + content:""; + background-color:var(--toolbar-icon-bg-color); + -webkit-mask-size:cover; + mask-size:cover; + -webkit-mask-position:center; + mask-position:center; + } + + &.toggled{ + background-color:var(--toggled-btn-bg-color); + color:var(--toggled-btn-color); + + &::before{ + background-color:var(--toggled-btn-color); + } + + &:hover{ + outline:var(--toggled-hover-btn-outline) !important; + + &:active{ + background-color:var(--toggled-hover-active-btn-color); + } + } + } + + &:is(:hover, :focus-visible){ + background-color:var(--button-hover-color); + + &::before{ + background-color:var(--toolbar-icon-hover-bg-color); + } + } + + &:is([disabled="disabled"], [disabled]){ + opacity:0.5; + pointer-events:none; + } + + &.labeled{ + width:100%; + min-height:var(--menuitem-height); + justify-content:flex-start; + gap:8px; + padding-inline-start:12px; + aspect-ratio:unset; + text-align:start; + white-space:normal; + cursor:default; + + &:is(a){ + text-decoration:none; + + &[href="#"]{ + opacity:0.5; + pointer-events:none; + } + } + + &::before{ + opacity:var(--doorhanger-icon-opacity); + } + + &:is(:hover, :focus-visible){ + color:var(--doorhanger-hover-color); + } + + > span{ + display:inline-block; + width:-moz-max-content; + width:max-content; + height:auto; + } + } +} + +.toolbarButtonWithContainer{ + height:100%; + aspect-ratio:1; + display:inline-block; + position:relative; + flex:none; + + > .toolbarButton{ + width:100%; + height:100%; + } + + .menu{ + padding-block:5px; + } + + .menuContainer{ + height:auto; + max-height:calc( + var(--viewer-container-height) - var(--toolbar-height) - + var(--doorhanger-height) + ); + display:flex; + flex-direction:column; + box-sizing:border-box; + overflow-y:auto; + } + + .editorParamsToolbar{ + --editor-toolbar-min-width:220px; + + height:auto; + min-width:var(--editor-toolbar-min-width); + width:-moz-max-content; + width:max-content; + position:absolute; + z-index:30000; + cursor:default; + + :is(#editorStampAddImage, #editorSignatureAddSignature)::before{ + -webkit-mask-image:var(--editorParams-stampAddImage-icon); + mask-image:var(--editorParams-stampAddImage-icon); + } + + .editorParamsLabel{ + flex:none; + font:menu; + font-size:13px; + font-style:normal; + font-weight:400; + line-height:150%; + width:-moz-fit-content; + width:fit-content; + inset-inline-start:0; + color:var(--main-color); + } + + button:is(:hover, :focus-visible) .editorParamsLabel{ + color:var(--doorhanger-hover-color); + } + + .editorParamsToolbarContainer{ + width:100%; + height:auto; + display:flex; + flex-direction:column; + box-sizing:border-box; + padding-inline:10px; + padding-block:10px; + + > .editorParamsSetter{ + min-height:26px; + display:flex; + align-items:center; + justify-content:space-between; + } + + .editorParamsColor{ + width:32px; + height:32px; + flex:none; + padding:0; + } + + .editorParamsSlider{ + background-color:transparent; + width:90px; + flex:0 1 0; + font:message-box; + + &::-moz-range-progress{ + background-color:black; + } + + &::-webkit-slider-runnable-track, + &::-moz-range-track{ + background-color:black; + } + + &::-webkit-slider-thumb, + &::-moz-range-thumb{ + background-color:white; + } + } + } + } +} + +#secondaryToolbar{ + height:auto; + width:220px; + position:absolute; + z-index:30000; + cursor:default; + min-height:26px; + max-height:calc(var(--viewer-container-height) - 40px); + + #secondaryToolbarButtonContainer{ + #secondaryOpenFile::before{ + -webkit-mask-image:var(--toolbarButton-openFile-icon); + mask-image:var(--toolbarButton-openFile-icon); + } + + #secondaryPrint::before{ + -webkit-mask-image:var(--toolbarButton-print-icon); + mask-image:var(--toolbarButton-print-icon); + } + + #secondaryDownload::before{ + -webkit-mask-image:var(--toolbarButton-download-icon); + mask-image:var(--toolbarButton-download-icon); + } + + #presentationMode::before{ + -webkit-mask-image:var(--toolbarButton-presentationMode-icon); + mask-image:var(--toolbarButton-presentationMode-icon); + } + + #viewBookmark::before{ + -webkit-mask-image:var(--toolbarButton-bookmark-icon); + mask-image:var(--toolbarButton-bookmark-icon); + } + + #firstPage::before{ + -webkit-mask-image:var(--secondaryToolbarButton-firstPage-icon); + mask-image:var(--secondaryToolbarButton-firstPage-icon); + } + + #lastPage::before{ + -webkit-mask-image:var(--secondaryToolbarButton-lastPage-icon); + mask-image:var(--secondaryToolbarButton-lastPage-icon); + } + + #pageRotateCcw::before{ + -webkit-mask-image:var(--secondaryToolbarButton-rotateCcw-icon); + mask-image:var(--secondaryToolbarButton-rotateCcw-icon); + } + + #pageRotateCw::before{ + -webkit-mask-image:var(--secondaryToolbarButton-rotateCw-icon); + mask-image:var(--secondaryToolbarButton-rotateCw-icon); + } + + #cursorSelectTool::before{ + -webkit-mask-image:var(--secondaryToolbarButton-selectTool-icon); + mask-image:var(--secondaryToolbarButton-selectTool-icon); + } + + #cursorHandTool::before{ + -webkit-mask-image:var(--secondaryToolbarButton-handTool-icon); + mask-image:var(--secondaryToolbarButton-handTool-icon); + } + + #scrollPage::before{ + -webkit-mask-image:var(--secondaryToolbarButton-scrollPage-icon); + mask-image:var(--secondaryToolbarButton-scrollPage-icon); + } + + #scrollVertical::before{ + -webkit-mask-image:var(--secondaryToolbarButton-scrollVertical-icon); + mask-image:var(--secondaryToolbarButton-scrollVertical-icon); + } + + #scrollHorizontal::before{ + -webkit-mask-image:var(--secondaryToolbarButton-scrollHorizontal-icon); + mask-image:var(--secondaryToolbarButton-scrollHorizontal-icon); + } + + #scrollWrapped::before{ + -webkit-mask-image:var(--secondaryToolbarButton-scrollWrapped-icon); + mask-image:var(--secondaryToolbarButton-scrollWrapped-icon); + } + + #spreadNone::before{ + -webkit-mask-image:var(--secondaryToolbarButton-spreadNone-icon); + mask-image:var(--secondaryToolbarButton-spreadNone-icon); + } + + #spreadOdd::before{ + -webkit-mask-image:var(--secondaryToolbarButton-spreadOdd-icon); + mask-image:var(--secondaryToolbarButton-spreadOdd-icon); + } + + #spreadEven::before{ + -webkit-mask-image:var(--secondaryToolbarButton-spreadEven-icon); + mask-image:var(--secondaryToolbarButton-spreadEven-icon); + } + + #imageAltTextSettings::before{ + -webkit-mask-image:var(--secondaryToolbarButton-imageAltTextSettings-icon); + mask-image:var(--secondaryToolbarButton-imageAltTextSettings-icon); + } + + #documentProperties::before{ + -webkit-mask-image:var(--secondaryToolbarButton-documentProperties-icon); + mask-image:var(--secondaryToolbarButton-documentProperties-icon); + } + } +} + +#findbar{ + --input-horizontal-padding:4px; + --findbar-padding:2px; + + width:-moz-max-content; + + width:max-content; + max-width:90vw; + min-height:var(--toolbar-height); + height:auto; + position:absolute; + z-index:30000; + cursor:default; + padding:0; + min-width:300px; + background-color:var(--toolbar-bg-color); + box-sizing:border-box; + flex-wrap:wrap; + justify-content:flex-start; + + > *{ + height:var(--toolbar-height); + padding:var(--findbar-padding); + } + + #findInputContainer{ + margin-inline-start:2px; + + #findPreviousButton::before{ + -webkit-mask-image:var(--findbarButton-previous-icon); + mask-image:var(--findbarButton-previous-icon); + } + + #findNextButton::before{ + -webkit-mask-image:var(--findbarButton-next-icon); + mask-image:var(--findbarButton-next-icon); + } + + #findInput{ + width:200px; + padding:5px var(--input-horizontal-padding); + &::-moz-placeholder{ + font-style:normal; + } + &::placeholder{ + font-style:normal; + } + + .loadingInput:has(> &[data-status="pending"])::after{ + display:inline; + visibility:visible; + inset-inline-end:calc(var(--input-horizontal-padding) + 1px); + } + + &[data-status="notFound"]{ + background-color:rgb(255 102 102); + } + } + } + + #findbarMessageContainer{ + display:none; + gap:4px; + + &:has(> :is(#findResultsCount, #findMsg):not(:empty)){ + display:inline flex; + } + + #findResultsCount{ + background-color:rgb(217 217 217); + color:rgb(82 82 82); + padding-block:4px; + + &:empty{ + display:none; + } + } + + #findMsg{ + &[data-status="notFound"]{ + font-weight:bold; + } + + &:empty{ + display:none; + } + } + } + + &.wrapContainers{ + flex-direction:column; + align-items:flex-start; + height:-moz-max-content; + height:max-content; + + .toolbarLabel{ + margin:0 4px; + } + + #findbarMessageContainer{ + flex-wrap:wrap; + flex-flow:column nowrap; + align-items:flex-start; + height:-moz-max-content; + height:max-content; + + #findResultsCount{ + height:calc(var(--toolbar-height) - 2 * var(--findbar-padding)); + } + + #findMsg{ + min-height:var(--toolbar-height); + } + } + } +} + @page{ margin:0; } @@ -4241,12 +7530,15 @@ body{ background:rgb(0 0 0 / 0) none; } + body[data-pdfjsprinting] #outerContainer{ display:none; } + body[data-pdfjsprinting] #printContainer{ display:block; } + #printContainer{ height:100%; } @@ -4284,16 +7576,218 @@ } .visibleMediumView{ - display:none; + display:none !important; } -@media all and (max-width: 900px){ - #toolbarViewerMiddle{ - display:table; - margin:auto; - left:auto; - position:inherit; - transform:none; +.toolbarLabel{ + width:-moz-max-content; + width:max-content; + min-width:16px; + height:100%; + padding-inline:4px; + margin:2px; + border-radius:2px; + color:var(--main-color); + font-size:12px; + line-height:14px; + text-align:left; + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + cursor:default; + box-sizing:border-box; + + display:inline flex; + flex-direction:column; + align-items:center; + justify-content:center; + + > label{ + width:100%; + } +} + +.toolbarHorizontalGroup{ + height:100%; + display:inline flex; + flex-direction:row; + align-items:center; + justify-content:space-between; + gap:1px; + box-sizing:border-box; +} + +.dropdownToolbarButton{ + display:inline flex; + flex-direction:row; + align-items:center; + justify-content:center; + position:relative; + + width:-moz-fit-content; + + width:fit-content; + min-width:140px; + padding:0; + background-color:var(--dropdown-btn-bg-color); + border:var(--dropdown-btn-border); + border-radius:2px; + color:var(--main-color); + font-size:12px; + line-height:14px; + -webkit-user-select:none; + -moz-user-select:none; + user-select:none; + cursor:default; + box-sizing:border-box; + outline:none; + + &:hover{ + background-color:var(--button-hover-color); + } + + > select{ + -webkit-appearance:none; + -moz-appearance:none; + appearance:none; + width:inherit; + min-width:inherit; + height:28px; + font:message-box; + font-size:12px; + color:var(--main-color); + margin:0; + padding-block:1px 2px; + padding-inline:6px 38px; + border:none; + outline:none; + background-color:var(--dropdown-btn-bg-color); + + > option{ + background:var(--doorhanger-bg-color); + color:var(--main-color); + } + + &:is(:hover, :focus-visible){ + background-color:var(--button-hover-color); + color:var(--toggled-btn-color); + } + } + + &::after{ + position:absolute; + display:inline; + width:var(--icon-size); + height:var(--icon-size); + + content:""; + background-color:var(--toolbar-icon-bg-color); + -webkit-mask-size:cover; + mask-size:cover; + + inset-inline-end:4px; + pointer-events:none; + -webkit-mask-image:var(--toolbarButton-menuArrow-icon); + mask-image:var(--toolbarButton-menuArrow-icon); + } + + &:is(:hover, :focus-visible, :active)::after{ + background-color:var(--toolbar-icon-hover-bg-color); + } +} + +#toolbarContainer{ + --menuitem-height:calc(var(--toolbar-height) - 6px); + + width:100%; + height:var(--toolbar-height); + padding:var(--toolbar-vertical-padding) var(--toolbar-horizontal-padding); + position:relative; + box-sizing:border-box; + font:message-box; + background-color:var(--toolbar-bg-color); + box-shadow:var(--toolbar-box-shadow); + border-bottom:var(--toolbar-border-bottom); + + #toolbarViewer{ + width:100%; + height:100%; + justify-content:space-between; + + > *{ + flex:none; + } + + input{ + font:message-box; + } + + .toolbarButtonSpacer{ + width:30px; + display:block; + height:1px; + } + + #toolbarViewerLeft{ + margin-inline-start:8px; + + #numPages.toolbarLabel{ + padding-inline-start:3px; + flex:none; + } + } + } + + #loadingBar{ + --progressBar-percent:0%; + --progressBar-end-offset:0; + + position:absolute; + top:var(--toolbar-height); + inset-inline:0 var(--progressBar-end-offset); + height:4px; + background-color:var(--progressBar-bg-color); + border-bottom:1px solid var(--toolbar-border-color); + transition-property:inset-inline-start; + transition-duration:var(--sidebar-transition-duration); + transition-timing-function:var(--sidebar-transition-timing-function); + + .progress{ + position:absolute; + top:0; + inset-inline-start:0; + width:100%; + transform:scaleX(var(--progressBar-percent)); + transform-origin:calc(50% - 50% * var(--dir-factor)) 0; + height:100%; + background-color:var(--progressBar-color); + overflow:hidden; + transition:transform 200ms; + } + + &.indeterminate .progress{ + transform:none; + background-color:var(--progressBar-bg-color); + transition:none; + + .glimmer{ + position:absolute; + top:0; + inset-inline-start:0; + height:100%; + width:calc(100% + 150px); + background:repeating-linear-gradient( + 135deg, + var(--progressBar-blend-color) 0, + var(--progressBar-bg-color) 5px, + var(--progressBar-bg-color) 45px, + var(--progressBar-color) 55px, + var(--progressBar-color) 95px, + var(--progressBar-blend-color) 100px + ); + animation:progressIndeterminate 1s linear infinite; + } + } } } @@ -4301,34 +7795,29 @@ #sidebarContainer{ background-color:var(--sidebar-narrow-bg-color); } - #outerContainer.sidebarOpen #viewerContainer{ + #outerContainer.viewsManagerOpen #viewerContainer{ inset-inline-start:0 !important; } } @media all and (max-width: 750px){ - :root{ - --editor-toolbar-base-offset:40px; - } #outerContainer .hiddenMediumView{ - display:none; + display:none !important; } - #outerContainer .visibleMediumView{ - display:inherit; + #outerContainer .visibleMediumView:not(.hidden, [hidden]){ + display:inline-block !important; } } @media all and (max-width: 690px){ .hiddenSmallView, .hiddenSmallView *{ - display:none; + display:none !important; } - .toolbarButtonSpacer{ + + #toolbarContainer #toolbarViewer .toolbarButtonSpacer{ width:0; } - .findbar{ - inset-inline-start:34px; - } } @media all and (max-width: 560px){ diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/viewer.html webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/viewer.html --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/viewer.html 2026-01-20 14:08:39.398689700 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/viewer.html 2026-07-09 07:12:41.860801500 +0000 @@ -1,4 +1,4 @@ - + - - - + + + PDF.js viewer + + - + - + - +
- -
-
-
-
- - - - -
-
- -
-
-
- - -
-
-
-
-
-
- - - -
-
-
+
- - - - - - - - - - - -
-
-
- + + +
- -
- + + +
+
+
-
- - - - +
+ + + + +
-
-
- - - -
+ + + +
+
+
+ + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
- +
+ - + +
- -
-
-
- -
- + +
- - -
-
-
+
@@ -366,143 +779,435 @@
-
+
+
- +
- +
- - + +
- File name: +

-

- File size: +

-

- Title: +

-

- Author: +

-

- Subject: +

-

- Keywords: +

-

- Creation Date: +

-

- Modification Date: +

-

- Creator: +

-

- PDF Producer: +

-

- PDF Version: +

-

- Page Count: +

-

- Page Size: +

-

- Fast Web View: +

-

- +
- -
+ +
- Choose an option - - Alt text (alternative text) helps when people can’t see the image or when it doesn’t load. - + +
- - + +
- - Aim for 1-2 sentences that describe the subject, setting, or actions. - +
- +
- - + +
- - This is used for ornamental images, like borders or watermarks. - +
- - + + +
+
+
+ +
+
+ +
+
+
+
+
+
+ +
+ +
+
+ + +
+
+
+
+ + +
+ +
+
+
+
+
+
+ + +
+ +
+
+
+ + + +
+
+
+ + +
+
+ +
+
+ +
+
+
+ + +
+
+ + +
+
+
+
+
+
+ +
+
+ + +
+
+ +
+
+
+
+
- + + + +
+
+ +
+
+ + + +
+
+
+ +
+
+ + +
+
+ + +
+
+
+
+ +
+ + + +
+
+
+
+
+ + + + + +
+ +
+
+ + + + +
+
+ +
+ + +
+
+
+
+ + +
+
+ +
+
+
+ + + + + +
+ +
+
+ + +
+
+
+ + +
+
+ +
+ +
+ + +
+
+
+ +
- Preparing document for printing… +
0%
- +
-
+
+ -
+ + + +
diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/viewer.mjs webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/viewer.mjs --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/viewer.mjs 2026-01-20 14:08:39.401689500 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/viewer.mjs 2026-07-09 07:12:41.864801400 +0000 @@ -2,7 +2,7 @@ * @licstart The following is the entire license notice for the * JavaScript code in this page * - * Copyright 2023 Mozilla Foundation + * Copyright 2024 Mozilla Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,21 +20,1561 @@ * JavaScript code in this page */ -/******/ var __webpack_modules__ = ({ +/** + * pdfjsVersion = 6.1.200 + * pdfjsBuild = 6353acefe + */ -/***/ 588: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { +;// ./web/ui_utils.js +const DEFAULT_SCALE_VALUE = "auto"; +const DEFAULT_SCALE = 1.0; +const DEFAULT_SCALE_DELTA = 1.1; +const MIN_SCALE = 0.1; +const MAX_SCALE = 25.0; +const UNKNOWN_SCALE = 0; +const MAX_AUTO_SCALE = 1.25; +const SCROLLBAR_PADDING = 40; +const VERTICAL_PADDING = 5; +const PresentationModeState = { + UNKNOWN: 0, + NORMAL: 1, + CHANGING: 2, + FULLSCREEN: 3 +}; +const SidebarView = { + UNKNOWN: -1, + NONE: 0, + THUMBS: 1, + OUTLINE: 2, + ATTACHMENTS: 3, + LAYERS: 4 +}; +const TextLayerMode = { + DISABLE: 0, + ENABLE: 1, + ENABLE_PERMISSIONS: 2 +}; +const ScrollMode = { + UNKNOWN: -1, + VERTICAL: 0, + HORIZONTAL: 1, + WRAPPED: 2, + PAGE: 3 +}; +const SpreadMode = { + UNKNOWN: -1, + NONE: 0, + ODD: 1, + EVEN: 2 +}; +const CursorTool = { + SELECT: 0, + HAND: 1, + ZOOM: 2 +}; +const AutoPrintRegExp = /\bprint\s*\(/; +function scrollIntoView(element, spot) { + let parent = element.offsetParent; + if (!parent) { + console.error("offsetParent is not set -- cannot scroll"); + return; + } + let offsetY = element.offsetTop + element.clientTop; + let offsetX = element.offsetLeft + element.clientLeft; + while (parent.clientHeight === parent.scrollHeight && parent.clientWidth === parent.scrollWidth) { + offsetY += parent.offsetTop; + offsetX += parent.offsetLeft; + parent = parent.offsetParent; + if (!parent) { + return; + } + } + if (spot) { + if (spot.top !== undefined) { + offsetY += spot.top; + } + if (spot.left !== undefined) { + offsetX += spot.left; + parent.scrollLeft = offsetX; + } + } + parent.scrollTop = offsetY; +} +function watchScroll(viewAreaElement, callback, abortSignal = undefined) { + const debounceScroll = function (evt) { + if (rAF) { + return; + } + rAF = window.requestAnimationFrame(function viewAreaElementScrolled() { + rAF = null; + const currentX = viewAreaElement.scrollLeft; + const lastX = state.lastX; + if (currentX !== lastX) { + state.right = currentX > lastX; + } + state.lastX = currentX; + const currentY = viewAreaElement.scrollTop; + const lastY = state.lastY; + if (currentY !== lastY) { + state.down = currentY > lastY; + } + state.lastY = currentY; + callback(state); + }); + }; + const state = { + right: true, + down: true, + lastX: viewAreaElement.scrollLeft, + lastY: viewAreaElement.scrollTop, + _eventHandler: debounceScroll + }; + let rAF = null; + viewAreaElement.addEventListener("scroll", debounceScroll, { + useCapture: true, + signal: abortSignal + }); + abortSignal?.addEventListener("abort", () => window.cancelAnimationFrame(rAF), { + once: true + }); + return state; +} +function parseQueryString(query) { + const params = new Map(); + for (const [key, value] of new URLSearchParams(query)) { + params.set(key.toLowerCase(), value); + } + return params; +} +const InvisibleCharsRegExp = /[\x00-\x1F]/g; +function removeNullCharacters(str, replaceInvisible = false) { + if (!InvisibleCharsRegExp.test(str)) { + return str; + } + if (replaceInvisible) { + return str.replaceAll(InvisibleCharsRegExp, m => m === "\x00" ? "" : " "); + } + return str.replaceAll("\x00", ""); +} +function binarySearchFirstItem(items, condition, start = 0) { + let minIndex = start; + let maxIndex = items.length - 1; + if (maxIndex < 0 || !condition(items[maxIndex])) { + return items.length; + } + if (condition(items[minIndex])) { + return minIndex; + } + while (minIndex < maxIndex) { + const currentIndex = minIndex + maxIndex >> 1; + const currentItem = items[currentIndex]; + if (condition(currentItem)) { + maxIndex = currentIndex; + } else { + minIndex = currentIndex + 1; + } + } + return minIndex; +} +function approximateFraction(x) { + if (Math.floor(x) === x) { + return [x, 1]; + } + const xinv = 1 / x; + const limit = 8; + if (xinv > limit) { + return [1, limit]; + } else if (Math.floor(xinv) === xinv) { + return [1, xinv]; + } + const x_ = x > 1 ? xinv : x; + let a = 0, + b = 1, + c = 1, + d = 1; + while (true) { + const p = a + c, + q = b + d; + if (q > limit) { + break; + } + if (x_ <= p / q) { + c = p; + d = q; + } else { + a = p; + b = q; + } + } + if (x_ - a / b < c / d - x_) { + return x_ === x ? [a, b] : [b, a]; + } + return x_ === x ? [c, d] : [d, c]; +} +function floorToDivide(x, div) { + return x - x % div; +} +function getPageSizeInches({ + view, + userUnit, + rotate +}) { + const [x1, y1, x2, y2] = view; + const changeOrientation = rotate % 180 !== 0; + const width = (x2 - x1) / 72 * userUnit; + const height = (y2 - y1) / 72 * userUnit; + return { + width: changeOrientation ? height : width, + height: changeOrientation ? width : height + }; +} +function backtrackBeforeAllVisibleElements(index, views, top) { + if (index < 2) { + return index; + } + let elt = views[index].div; + let pageTop = elt.offsetTop + elt.clientTop; + if (pageTop >= top) { + elt = views[index - 1].div; + pageTop = elt.offsetTop + elt.clientTop; + } + for (let i = index - 2; i >= 0; --i) { + elt = views[i].div; + if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) { + break; + } + index = i; + } + return index; +} +function getVisibleElements({ + scrollEl, + views, + sortByVisibility = false, + horizontal = false, + rtl = false +}) { + const top = scrollEl.scrollTop, + bottom = top + scrollEl.clientHeight; + const left = scrollEl.scrollLeft, + right = left + scrollEl.clientWidth; + function isElementBottomAfterViewTop(view) { + const element = view.div; + const elementBottom = element.offsetTop + element.clientTop + element.clientHeight; + return elementBottom > top; + } + function isElementNextAfterViewHorizontally(view) { + const element = view.div; + const elementLeft = element.offsetLeft + element.clientLeft; + const elementRight = elementLeft + element.clientWidth; + return rtl ? elementLeft < right : elementRight > left; + } + const visible = [], + ids = new Set(), + numViews = views.length; + let firstVisibleElementInd = binarySearchFirstItem(views, horizontal ? isElementNextAfterViewHorizontally : isElementBottomAfterViewTop); + if (firstVisibleElementInd > 0 && firstVisibleElementInd < numViews && !horizontal) { + firstVisibleElementInd = backtrackBeforeAllVisibleElements(firstVisibleElementInd, views, top); + } + let lastEdge = horizontal ? right : -1; + for (let i = firstVisibleElementInd; i < numViews; i++) { + const view = views[i], + element = view.div; + const currentWidth = element.offsetLeft + element.clientLeft; + const currentHeight = element.offsetTop + element.clientTop; + const viewWidth = element.clientWidth, + viewHeight = element.clientHeight; + const viewRight = currentWidth + viewWidth; + const viewBottom = currentHeight + viewHeight; + if (lastEdge === -1) { + if (viewBottom >= bottom) { + lastEdge = viewBottom; + } + } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) { + break; + } + if (viewBottom <= top || currentHeight >= bottom || viewRight <= left || currentWidth >= right) { + continue; + } + const minY = Math.max(0, top - currentHeight); + const minX = Math.max(0, left - currentWidth); + const hiddenHeight = minY + Math.max(0, viewBottom - bottom); + const hiddenWidth = minX + Math.max(0, viewRight - right); + const fractionHeight = (viewHeight - hiddenHeight) / viewHeight, + fractionWidth = (viewWidth - hiddenWidth) / viewWidth; + const percent = fractionHeight * fractionWidth * 100 | 0; + visible.push({ + id: view.id, + x: currentWidth, + y: currentHeight, + visibleArea: percent === 100 ? null : { + minX, + minY, + maxX: Math.min(viewRight, right) - currentWidth, + maxY: Math.min(viewBottom, bottom) - currentHeight + }, + view, + percent, + widthPercent: fractionWidth * 100 | 0 + }); + ids.add(view.id); + } + const first = visible[0], + last = visible.at(-1); + if (sortByVisibility) { + visible.sort(function (a, b) { + const pc = a.percent - b.percent; + if (Math.abs(pc) > 0.001) { + return -pc; + } + return a.id - b.id; + }); + } + return { + first, + last, + views: visible, + ids + }; +} +function normalizeWheelEventDirection(evt) { + let delta = Math.hypot(evt.deltaX, evt.deltaY); + const angle = Math.atan2(evt.deltaY, evt.deltaX); + if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) { + delta = -delta; + } + return delta; +} +function normalizeWheelEventDelta(evt) { + const deltaMode = evt.deltaMode; + let delta = normalizeWheelEventDirection(evt); + const MOUSE_PIXELS_PER_LINE = 30; + const MOUSE_LINES_PER_PAGE = 30; + if (deltaMode === WheelEvent.DOM_DELTA_PIXEL) { + delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE; + } else if (deltaMode === WheelEvent.DOM_DELTA_LINE) { + delta /= MOUSE_LINES_PER_PAGE; + } + return delta; +} +function isValidRotation(angle) { + return Number.isInteger(angle) && angle % 90 === 0; +} +function isValidScrollMode(mode) { + return Number.isInteger(mode) && Object.values(ScrollMode).includes(mode) && mode !== ScrollMode.UNKNOWN; +} +function isValidSpreadMode(mode) { + return Number.isInteger(mode) && Object.values(SpreadMode).includes(mode) && mode !== SpreadMode.UNKNOWN; +} +function isPortraitOrientation(size) { + return size.width <= size.height; +} +const animationStarted = new Promise(function (resolve) { + window.requestAnimationFrame(resolve); +}); +const docStyle = document.documentElement.style; +class ProgressBar { + #classList = null; + #disableAutoFetchTimeout = null; + #percent = 0; + #style = null; + #visible = true; + constructor(bar) { + this.#classList = bar.classList; + this.#style = bar.style; + } + get percent() { + return this.#percent; + } + set percent(val) { + this.#percent = val; + if (isNaN(val)) { + this.#classList.add("indeterminate"); + return; + } + this.#classList.remove("indeterminate"); + this.#style.setProperty("--progressBar-percent", `${this.#percent}%`); + } + setWidth(viewer) { + if (!viewer) { + return; + } + const container = viewer.parentNode; + const scrollbarWidth = container.offsetWidth - viewer.offsetWidth; + if (scrollbarWidth > 0) { + this.#style.setProperty("--progressBar-end-offset", `${scrollbarWidth}px`); + } + } + setDisableAutoFetch(delay = 5000) { + if (this.#percent === 100 || isNaN(this.#percent)) { + return; + } + if (this.#disableAutoFetchTimeout) { + clearTimeout(this.#disableAutoFetchTimeout); + } + this.show(); + this.#disableAutoFetchTimeout = setTimeout(() => { + this.#disableAutoFetchTimeout = null; + this.hide(); + }, delay); + } + hide() { + if (!this.#visible) { + return; + } + this.#visible = false; + this.#classList.add("hidden"); + } + show() { + if (this.#visible) { + return; + } + this.#visible = true; + this.#classList.remove("hidden"); + } +} +function getActiveOrFocusedElement() { + let curRoot = document; + let curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus"); + while (curActiveOrFocused?.shadowRoot) { + curRoot = curActiveOrFocused.shadowRoot; + curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus"); + } + return curActiveOrFocused; +} +function apiPageLayoutToViewerModes(layout) { + let scrollMode = ScrollMode.VERTICAL, + spreadMode = SpreadMode.NONE; + switch (layout) { + case "SinglePage": + scrollMode = ScrollMode.PAGE; + break; + case "OneColumn": + break; + case "TwoPageLeft": + scrollMode = ScrollMode.PAGE; + case "TwoColumnLeft": + spreadMode = SpreadMode.ODD; + break; + case "TwoPageRight": + scrollMode = ScrollMode.PAGE; + case "TwoColumnRight": + spreadMode = SpreadMode.EVEN; + break; + } + return { + scrollMode, + spreadMode + }; +} +function apiPageModeToSidebarView(mode) { + switch (mode) { + case "UseNone": + return SidebarView.NONE; + case "UseThumbs": + return SidebarView.THUMBS; + case "UseOutlines": + return SidebarView.OUTLINE; + case "UseAttachments": + return SidebarView.ATTACHMENTS; + case "UseOC": + return SidebarView.LAYERS; + } + return SidebarView.NONE; +} +function toggleCheckedBtn(button, toggle, view = null) { + button.classList.toggle("toggled", toggle); + button.setAttribute("aria-checked", toggle); + view?.classList.toggle("hidden", !toggle); +} +function toggleSelectedBtn(button, toggle, view = null) { + button.classList.toggle("selected", toggle); + button.setAttribute("aria-selected", toggle); + view?.classList.toggle("hidden", !toggle); +} +function toggleExpandedBtn(button, toggle, view = null) { + button.classList.toggle("toggled", toggle); + button.setAttribute("aria-expanded", toggle); + view?.classList.toggle("hidden", !toggle); +} +const calcRound = function () { + const e = document.createElement("div"); + e.style.width = "round(down, calc(1.6666666666666665 * 792px), 1px)"; + return e.style.width === "calc(1320px)" ? Math.fround : x => x; +}(); +;// ./web/app_options.js +{ + var compatParams = new Map(); + const { + maxTouchPoints, + platform, + userAgent + } = navigator; + const isAndroid = /Android/.test(userAgent); + const isIOS = /\b(?:iPad|iPhone|iPod)(?=;)/.test(userAgent) || platform === "MacIntel" && maxTouchPoints > 1; + if (isIOS || isAndroid) { + compatParams.set("maxCanvasPixels", 5242880); + } + if (isAndroid) { + compatParams.set("useSystemFonts", false); + } +} +const OptionKind = { + BROWSER: 0x01, + VIEWER: 0x02, + API: 0x04, + WORKER: 0x08, + EVENT_DISPATCH: 0x10, + PREFERENCE: 0x80 +}; +const Type = { + BOOLEAN: 0x01, + NUMBER: 0x02, + OBJECT: 0x04, + STRING: 0x08, + UNDEFINED: 0x10 +}; +const defaultOptions = { + allowedGlobalEvents: { + value: null, + kind: OptionKind.BROWSER + }, + canvasMaxAreaInBytes: { + value: -1, + kind: OptionKind.BROWSER + OptionKind.API + }, + isInAutomation: { + value: false, + kind: OptionKind.BROWSER + }, + localeProperties: { + value: { + lang: navigator.language || "en-US" + }, + kind: OptionKind.BROWSER + }, + maxCanvasDim: { + value: 32767, + kind: OptionKind.BROWSER + OptionKind.VIEWER + }, + nimbusDataStr: { + value: "", + kind: OptionKind.BROWSER + }, + supportsCaretBrowsingMode: { + value: false, + kind: OptionKind.BROWSER + }, + supportsDocumentFonts: { + value: true, + kind: OptionKind.BROWSER + }, + supportsDownloading: { + value: true, + kind: OptionKind.BROWSER + }, + supportsIntegratedFind: { + value: false, + kind: OptionKind.BROWSER + }, + supportsMouseWheelZoomCtrlKey: { + value: true, + kind: OptionKind.BROWSER + }, + supportsMouseWheelZoomMetaKey: { + value: true, + kind: OptionKind.BROWSER + }, + supportsPinchToZoom: { + value: true, + kind: OptionKind.BROWSER + }, + supportsPrinting: { + value: true, + kind: OptionKind.BROWSER + }, + toolbarDensity: { + value: 0, + kind: OptionKind.BROWSER + OptionKind.EVENT_DISPATCH + }, + altTextLearnMoreUrl: { + value: "", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + annotationEditorMode: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + annotationMode: { + value: 2, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + capCanvasAreaFactor: { + value: 200, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + commentLearnMoreUrl: { + value: "", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + cursorToolOnLoad: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + debuggerSrc: { + value: "./debugger.mjs", + kind: OptionKind.VIEWER + }, + defaultZoomDelay: { + value: 400, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + defaultZoomValue: { + value: "", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + disableHistory: { + value: false, + kind: OptionKind.VIEWER + }, + disablePageLabels: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableAltText: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableAltTextModelDownload: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH + }, + enableAutoLinking: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableComment: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableDetailCanvas: { + value: true, + kind: OptionKind.VIEWER + }, + enableGuessAltText: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH + }, + enableHighlightFloatingButton: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableMerge: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableNewAltTextWhenAddingImage: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableNewBadge: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableOptimizedPartialRendering: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enablePermissions: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enablePrintAutoRotate: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableScripting: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableSignatureEditor: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableSplitMerge: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableUpdatedAddImage: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + externalLinkRel: { + value: "noopener noreferrer nofollow", + kind: OptionKind.VIEWER + }, + externalLinkTarget: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + highlightEditorColors: { + value: "yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F," + "yellow_HCM=#FFFFCC,green_HCM=#53FFBC,blue_HCM=#80EBFF,pink_HCM=#F6B8FF,red_HCM=#C50043", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + historyUpdateUrl: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + ignoreDestinationZoom: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + imageResourcesPath: { + value: "./images/", + kind: OptionKind.VIEWER + }, + enableSelectionRendering: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + imagesRightClickMinSize: { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + maxCanvasPixels: { + value: 2 ** 25, + kind: OptionKind.VIEWER + }, + minDurationToUpdateCanvas: { + value: 500, + kind: OptionKind.VIEWER + }, + forcePageColors: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + pageColorsBackground: { + value: "Canvas", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + pageColorsForeground: { + value: "CanvasText", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + pdfBugEnabled: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + postMessageAfterPrintCallback: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + printResolution: { + value: 150, + kind: OptionKind.VIEWER + }, + sidebarViewOnLoad: { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + scrollModeOnLoad: { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + spreadModeOnLoad: { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + textLayerMode: { + value: 1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + viewerCssTheme: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + viewOnLoad: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + cMapPacked: { + value: true, + kind: OptionKind.API + }, + cMapUrl: { + value: "../web/cmaps/", + kind: OptionKind.API + }, + disableAutoFetch: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + disableFontFace: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + disableRange: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + disableStream: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + docBaseUrl: { + value: "", + kind: OptionKind.API + }, + enableHWA: { + value: true, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + enableWebGPU: { + value: true, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + enableXfa: { + value: true, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + fontExtraProperties: { + value: false, + kind: OptionKind.API + }, + iccUrl: { + value: "../web/iccs/", + kind: OptionKind.API + }, + isOffscreenCanvasSupported: { + value: true, + kind: OptionKind.API + }, + maxImageSize: { + value: -1, + kind: OptionKind.API + }, + pdfBug: { + value: false, + kind: OptionKind.API + }, + standardFontDataUrl: { + value: "../web/standard_fonts/", + kind: OptionKind.API + }, + useSystemFonts: { + value: undefined, + kind: OptionKind.API, + type: Type.BOOLEAN + Type.UNDEFINED + }, + verbosity: { + value: 1, + kind: OptionKind.API + }, + wasmUrl: { + value: "../web/wasm/", + kind: OptionKind.API + }, + workerPort: { + value: null, + kind: OptionKind.WORKER + }, + workerSrc: { + value: "../build/pdf.worker.mjs", + kind: OptionKind.WORKER + } +}; +{ + defaultOptions.defaultUrl = { + value: "compressed.tracemonkey-pldi-09.pdf", + kind: OptionKind.VIEWER + }; + defaultOptions.sandboxBundleSrc = { + value: "../build/pdf.sandbox.mjs", + kind: OptionKind.VIEWER + }; + defaultOptions.enableFakeMLManager = { + value: true, + kind: OptionKind.VIEWER + }; +} +{ + defaultOptions.disablePreferences = { + value: false, + kind: OptionKind.VIEWER + }; +} +class AppOptions { + static eventBus; + static #opts = new Map(); + static { + for (const name in defaultOptions) { + this.#opts.set(name, defaultOptions[name].value); + } + for (const [name, value] of compatParams) { + this.#opts.set(name, value); + } + this._hasInvokedSet = false; + this._checkDisablePreferences = () => { + if (this.get("disablePreferences")) { + return true; + } + if (this._hasInvokedSet) { + console.warn("The Preferences may override manually set AppOptions; " + 'please use the "disablePreferences"-option to prevent that.'); + } + return false; + }; + } + static get(name) { + return this.#opts.get(name); + } + static getAll(kind = null, defaultOnly = false) { + const options = Object.create(null); + for (const name in defaultOptions) { + const defaultOpt = defaultOptions[name]; + if (kind && !(kind & defaultOpt.kind)) { + continue; + } + options[name] = !defaultOnly ? this.#opts.get(name) : defaultOpt.value; + } + return options; + } + static set(name, value) { + this.setAll({ + [name]: value + }); + } + static setAll(options, prefs = false) { + this._hasInvokedSet ||= true; + let events; + for (const name in options) { + const defaultOpt = defaultOptions[name], + userOpt = options[name]; + if (!defaultOpt || !(typeof userOpt === typeof defaultOpt.value || Type[(typeof userOpt).toUpperCase()] & defaultOpt.type)) { + continue; + } + const { + kind + } = defaultOpt; + if (prefs && !(kind & OptionKind.BROWSER || kind & OptionKind.PREFERENCE)) { + continue; + } + if (this.eventBus && kind & OptionKind.EVENT_DISPATCH) { + (events ||= new Map()).set(name, userOpt); + } + this.#opts.set(name, userOpt); + } + if (events) { + for (const [name, value] of events) { + this.eventBus.dispatch(name.toLowerCase(), { + source: this, + value + }); + } + } + } +} + +;// ./web/pdfjs.js +const { + AbortException, + AnnotationEditorLayer, + AnnotationEditorParamsType, + AnnotationEditorType, + AnnotationEditorUIManager, + AnnotationLayer, + AnnotationMode, + AnnotationType, + applyOpacity, + build, + ColorPicker, + createValidAbsoluteUrl, + CSSConstants, + DOMSVGFactory, + DrawLayer, + FeatureTest, + fetchData, + findContrastColor, + getDocument, + getFilenameFromUrl, + getPdfFilenameFromUrl, + getRGB, + getRGBA, + getUuid, + GlobalWorkerOptions, + ImageKind, + InvalidPDFException, + isDataScheme, + isPdfFile, + isValidExplicitDest, + makeArr, + makeMap, + makeObj, + MathClamp, + noContextMenu, + normalizeUnicode, + OPS, + OutputScale, + PasswordException, + PasswordResponses, + PDFDataRangeTransport, + PDFDateString, + PDFWorker, + PermissionFlag, + PixelsPerInch, + RenderingCancelledException, + renderRichText, + ResponseException, + setLayerDimensions, + shadow, + SignatureExtractor, + stopEvent, + SupportedImageMimeTypes, + TextLayer, + TextLayerImages, + TouchManager, + updateUrlHash, + Util, + VerbosityLevel, + version, + XfaLayer +} = globalThis.pdfjsLib; -// EXPORTS -__webpack_require__.d(__webpack_exports__, { - FluentBundle: () => (/* reexport */ FluentBundle), - FluentResource: () => (/* reexport */ FluentResource) +;// ./web/internal_evt.js +const INTERNAL_EVT = "d3d019bf-c73b-49f4-94f3-e62eb099fd62"; +const internalOpt = Object.freeze({ + internal: INTERNAL_EVT }); -// UNUSED EXPORTS: FluentDateTime, FluentNone, FluentNumber, FluentType +;// ./web/pdf_link_service.js + -;// CONCATENATED MODULE: ./node_modules/@fluent/bundle/esm/types.js + +const DEFAULT_LINK_REL = "noopener noreferrer nofollow"; +const LinkTarget = { + NONE: 0, + SELF: 1, + BLANK: 2, + PARENT: 3, + TOP: 4 +}; +class PDFLinkService { + externalLinkEnabled = true; + constructor({ + eventBus, + externalLinkTarget = null, + externalLinkRel = null, + ignoreDestinationZoom = false + } = {}) { + this.eventBus = eventBus; + this.externalLinkTarget = externalLinkTarget; + this.externalLinkRel = externalLinkRel; + this._ignoreDestinationZoom = ignoreDestinationZoom; + this.baseUrl = null; + this.pdfDocument = null; + this.pdfViewer = null; + this.pdfHistory = null; + } + setDocument(pdfDocument, baseUrl = null) { + this.baseUrl = baseUrl; + this.pdfDocument = pdfDocument; + } + setViewer(pdfViewer) { + this.pdfViewer = pdfViewer; + } + setHistory(pdfHistory) { + this.pdfHistory = pdfHistory; + } + get pagesCount() { + return this.pdfDocument?.pagesMapper.pagesNumber || 0; + } + get page() { + return this.pdfDocument ? this.pdfViewer.currentPageNumber : 1; + } + set page(value) { + if (this.pdfDocument) { + this.pdfViewer.currentPageNumber = value; + } + } + get rotation() { + return this.pdfDocument ? this.pdfViewer.pagesRotation : 0; + } + set rotation(value) { + if (this.pdfDocument) { + this.pdfViewer.pagesRotation = value; + } + } + get isInPresentationMode() { + return this.pdfDocument ? this.pdfViewer.isInPresentationMode : false; + } + async goToDestination(dest) { + if (!this.pdfDocument) { + return; + } + let namedDest, explicitDest, pageNumber; + if (typeof dest === "string") { + namedDest = dest; + explicitDest = await this.pdfDocument.getDestination(dest); + } else { + namedDest = null; + explicitDest = await dest; + } + if (!Array.isArray(explicitDest)) { + console.error(`goToDestination: "${explicitDest}" is not a valid destination array, for dest="${dest}".`); + return; + } + const [destRef] = explicitDest; + if (destRef && typeof destRef === "object") { + pageNumber = this.pdfDocument.cachedPageNumber(destRef); + if (!pageNumber) { + try { + pageNumber = (await this.pdfDocument.getPageIndex(destRef)) + 1; + } catch { + console.error(`goToDestination: "${destRef}" is not a valid page reference, for dest="${dest}".`); + return; + } + } + } else if (Number.isInteger(destRef)) { + pageNumber = destRef + 1; + } + if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) { + console.error(`goToDestination: "${pageNumber}" is not a valid page number, for dest="${dest}".`); + return; + } + if (this.pdfHistory) { + this.pdfHistory.pushCurrentPosition(); + this.pdfHistory.push({ + namedDest, + explicitDest, + pageNumber + }); + } + this.pdfViewer.scrollPageIntoView({ + pageNumber, + destArray: explicitDest, + ignoreDestinationZoom: this._ignoreDestinationZoom + }); + const ac = new AbortController(); + this.eventBus.on("textlayerrendered", evt => { + if (evt.pageNumber === pageNumber) { + evt.source.textLayer.div.focus(); + ac.abort(); + } + }, { + signal: ac.signal, + ...internalOpt + }); + } + goToPage(val) { + if (!this.pdfDocument) { + return; + } + const pageNumber = typeof val === "string" && this.pdfViewer.pageLabelToPageNumber(val) || val | 0; + if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) { + console.error(`PDFLinkService.goToPage: "${val}" is not a valid page.`); + return; + } + if (this.pdfHistory) { + this.pdfHistory.pushCurrentPosition(); + this.pdfHistory.pushPage(pageNumber); + } + this.pdfViewer.scrollPageIntoView({ + pageNumber + }); + } + goToXY(pageNumber, x, y, options = {}) { + this.pdfViewer.scrollPageIntoView({ + pageNumber, + destArray: [null, { + name: "XYZ" + }, x, y], + ignoreDestinationZoom: true, + ...options + }); + } + async getAttachmentContent(id) { + try { + return await this.pdfDocument?.getAttachmentContent(id); + } catch (error) { + if (!(error instanceof PasswordException)) { + console.warn(`Unable to load attachment content: ${error}`); + } + } + return null; + } + addLinkAttributes(link, url, newWindow = false) { + if (!url || typeof url !== "string") { + throw new Error('A valid "url" parameter must provided.'); + } + const target = newWindow ? LinkTarget.BLANK : this.externalLinkTarget, + rel = this.externalLinkRel; + let displayUrl = url; + const parsedUrl = URL.parse(url); + if (parsedUrl?.username || parsedUrl?.password) { + parsedUrl.username = parsedUrl.password = ""; + displayUrl = parsedUrl.href; + } + if (this.externalLinkEnabled) { + link.href = url; + link.title = displayUrl; + } else { + link.href = ""; + link.title = `Disabled: ${displayUrl}`; + link.onclick = () => false; + } + let targetStr = ""; + switch (target) { + case LinkTarget.NONE: + break; + case LinkTarget.SELF: + targetStr = "_self"; + break; + case LinkTarget.BLANK: + targetStr = "_blank"; + break; + case LinkTarget.PARENT: + targetStr = "_parent"; + break; + case LinkTarget.TOP: + targetStr = "_top"; + break; + } + link.target = targetStr; + link.rel = typeof rel === "string" ? rel : DEFAULT_LINK_REL; + } + getDestinationHash(dest) { + if (typeof dest === "string") { + if (dest.length > 0) { + return this.getAnchorUrl("#" + escape(dest)); + } + } else if (Array.isArray(dest)) { + const str = JSON.stringify(dest); + if (str.length > 0) { + return this.getAnchorUrl("#" + escape(str)); + } + } + return this.getAnchorUrl(""); + } + getAnchorUrl(anchor) { + return this.baseUrl ? this.baseUrl + anchor : anchor; + } + setHash(hash) { + if (!this.pdfDocument) { + return; + } + let pageNumber, dest; + if (hash.includes("=")) { + const params = parseQueryString(hash); + if (params.has("search")) { + const query = params.get("search").replaceAll('"', ""), + phrase = params.get("phrase") === "true"; + this.eventBus.dispatch("findfromurlhash", { + source: this, + query: phrase ? query : query.match(/\S+/g) + }); + } + if (params.has("page")) { + pageNumber = params.get("page") | 0 || 1; + } + if (params.has("zoom")) { + const zoomArgs = params.get("zoom").split(","); + const zoomArg = zoomArgs[0]; + const zoomArgNumber = parseFloat(zoomArg); + if (!zoomArg.includes("Fit")) { + dest = [null, { + name: "XYZ" + }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, zoomArgNumber ? zoomArgNumber / 100 : zoomArg]; + } else if (zoomArg === "Fit" || zoomArg === "FitB") { + dest = [null, { + name: zoomArg + }]; + } else if (zoomArg === "FitH" || zoomArg === "FitBH" || zoomArg === "FitV" || zoomArg === "FitBV") { + dest = [null, { + name: zoomArg + }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null]; + } else if (zoomArg === "FitR") { + if (zoomArgs.length !== 5) { + console.error('PDFLinkService.setHash: Not enough parameters for "FitR".'); + } else { + dest = [null, { + name: zoomArg + }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0]; + } + } else { + console.error(`PDFLinkService.setHash: "${zoomArg}" is not a valid zoom value.`); + } + } + if (dest) { + this.pdfViewer.scrollPageIntoView({ + pageNumber: pageNumber || this.page, + destArray: dest, + allowNegativeOffset: true + }); + } else if (pageNumber) { + this.page = pageNumber; + } + if (params.has("pagemode")) { + this.eventBus.dispatch("pagemode", { + source: this, + mode: params.get("pagemode") + }); + } + if (params.has("nameddest")) { + this.goToDestination(params.get("nameddest")); + } + return; + } + dest = unescape(hash); + try { + dest = JSON.parse(dest); + if (!Array.isArray(dest)) { + dest = dest.toString(); + } + } catch {} + if (typeof dest === "string" || isValidExplicitDest(dest)) { + this.goToDestination(dest); + return; + } + console.error(`PDFLinkService.setHash: "${unescape(hash)}" is not a valid destination.`); + } + executeNamedAction(action) { + if (!this.pdfDocument) { + return; + } + switch (action) { + case "GoBack": + this.pdfHistory?.back(); + break; + case "GoForward": + this.pdfHistory?.forward(); + break; + case "NextPage": + this.pdfViewer.nextPage(); + break; + case "PrevPage": + this.pdfViewer.previousPage(); + break; + case "LastPage": + this.page = this.pagesCount; + break; + case "FirstPage": + this.page = 1; + break; + default: + break; + } + this.eventBus.dispatch("namedaction", { + source: this, + action + }); + } + async executeSetOCGState(action) { + if (!this.pdfDocument) { + return; + } + const pdfDocument = this.pdfDocument, + optionalContentConfig = await this.pdfViewer.optionalContentConfigPromise; + if (pdfDocument !== this.pdfDocument) { + return; + } + optionalContentConfig.setOCGState(action); + this.pdfViewer.optionalContentConfigPromise = Promise.resolve(optionalContentConfig); + } +} +class SimpleLinkService extends PDFLinkService { + setDocument(pdfDocument, baseUrl = null) {} +} + +;// ./web/event_utils.js + +const WaitOnType = { + EVENT: "event", + TIMEOUT: "timeout" +}; +async function waitOnEventOrTimeout({ + target, + name, + delay = 0 +}) { + if (typeof target !== "object" || !(name && typeof name === "string") || !(Number.isInteger(delay) && delay >= 0)) { + throw new Error("waitOnEventOrTimeout - invalid parameters."); + } + const { + promise, + resolve + } = Promise.withResolvers(); + const ac = new AbortController(); + function handler(type) { + ac.abort(); + clearTimeout(timeout); + resolve(type); + } + const evtMethod = target instanceof EventBus ? "on" : "addEventListener"; + const evtOpts = target instanceof EventBus ? { + signal: ac.signal, + ...internalOpt + } : { + signal: ac.signal + }; + target[evtMethod](name, handler.bind(null, WaitOnType.EVENT), evtOpts); + const timeout = setTimeout(handler.bind(null, WaitOnType.TIMEOUT), delay); + return promise; +} +class EventBus { + #listeners = Object.create(null); + constructor() { + Object.seal(this); + } + on(eventName, listener, options = null) { + let rmAbort = null; + if (options?.signal instanceof AbortSignal) { + const { + signal + } = options; + if (signal.aborted) { + console.error("Cannot use an `aborted` signal."); + return; + } + const onAbort = () => this.off(eventName, listener); + rmAbort = () => signal.removeEventListener("abort", onAbort); + signal.addEventListener("abort", onAbort); + } + const eventListeners = this.#listeners[eventName] ??= []; + eventListeners.push({ + listener, + internal: options?.internal === INTERNAL_EVT, + once: options?.once === true, + rmAbort + }); + } + off(eventName, listener, options = null) { + const eventListeners = this.#listeners[eventName]; + if (!eventListeners) { + return; + } + for (let i = 0, ii = eventListeners.length; i < ii; i++) { + const evt = eventListeners[i]; + if (evt.listener === listener) { + evt.rmAbort?.(); + eventListeners.splice(i, 1); + return; + } + } + } + dispatch(eventName, data) { + const eventListeners = this.#listeners[eventName]; + if (!eventListeners?.length) { + return; + } + let extListeners; + for (const { + listener, + internal, + once + } of eventListeners.slice(0)) { + if (once) { + this.off(eventName, listener); + } + if (!internal) { + (extListeners ??= []).push(listener); + continue; + } + listener(data); + } + if (extListeners) { + for (const listener of extListeners) { + listener(data); + } + } + } +} +class FirefoxEventBus extends EventBus { + #externalServices; + #globalEventNames; + #isInAutomation; + constructor(globalEventNames, externalServices, isInAutomation) { + super(); + this.#globalEventNames = globalEventNames; + this.#externalServices = externalServices; + this.#isInAutomation = isInAutomation; + } + dispatch(eventName, data) { + throw new Error("Not implemented: FirefoxEventBus.dispatch"); + } +} + +;// ./web/external_services.js +class BaseExternalServices { + updateFindControlState(data) {} + updateFindMatchesCount(data) {} + initPassiveLoading() {} + reportTelemetry(data) {} + reportText(data) {} + async createL10n() { + throw new Error("Not implemented: createL10n"); + } + createScripting() { + throw new Error("Not implemented: createScripting"); + } + createSignatureStorage() { + throw new Error("Not implemented: createSignatureStorage"); + } + updateEditorStates(data) { + throw new Error("Not implemented: updateEditorStates"); + } + dispatchGlobalEvent(_event) {} +} + +;// ./web/preferences.js + +class BasePreferences { + #defaults = Object.freeze(AppOptions.getAll(OptionKind.PREFERENCE, true)); + #initializedPromise = null; + constructor() { + this.#initializedPromise = this._readFromStorage(this.#defaults).then(({ + browserPrefs, + prefs + }) => { + if (AppOptions._checkDisablePreferences()) { + return; + } + AppOptions.setAll({ + ...browserPrefs, + ...prefs + }, true); + }); + } + async _writeToStorage(prefObj) { + throw new Error("Not implemented: _writeToStorage"); + } + async _readFromStorage(prefObj) { + throw new Error("Not implemented: _readFromStorage"); + } + async reset() { + await this.#initializedPromise; + AppOptions.setAll(this.#defaults, true); + await this._writeToStorage(this.#defaults); + } + async set(name, value) { + await this.#initializedPromise; + AppOptions.setAll({ + [name]: value + }, true); + await this._writeToStorage(AppOptions.getAll(OptionKind.PREFERENCE)); + } + async get(name) { + await this.#initializedPromise; + return AppOptions.get(name); + } + get defaults() { + return this.#defaults; + } + get initializedPromise() { + return this.#initializedPromise; + } +} + +;// ./node_modules/@fluent/bundle/esm/types.js class FluentType { constructor(value) { this.value = value; @@ -57,31 +1597,80 @@ this.opts = opts; } toString(scope) { - try { - const nf = scope.memoizeIntlObject(Intl.NumberFormat, this.opts); - return nf.format(this.value); - } catch (err) { - scope.reportError(err); - return this.value.toString(10); + if (scope) { + try { + const nf = scope.memoizeIntlObject(Intl.NumberFormat, this.opts); + return nf.format(this.value); + } catch (err) { + scope.reportError(err); + } } + return this.value.toString(10); } } class FluentDateTime extends FluentType { + static supportsValue(value) { + if (typeof value === "number") return true; + if (value instanceof Date) return true; + if (value instanceof FluentType) return FluentDateTime.supportsValue(value.valueOf()); + if ("Temporal" in globalThis) { + const _Temporal = globalThis.Temporal; + if (value instanceof _Temporal.Instant || value instanceof _Temporal.PlainDateTime || value instanceof _Temporal.PlainDate || value instanceof _Temporal.PlainMonthDay || value instanceof _Temporal.PlainTime || value instanceof _Temporal.PlainYearMonth) { + return true; + } + } + return false; + } constructor(value, opts = {}) { + if (value instanceof FluentDateTime) { + opts = { + ...value.opts, + ...opts + }; + value = value.value; + } else if (value instanceof FluentType) { + value = value.valueOf(); + } + if (typeof value === "object" && "calendarId" in value && opts.calendar === undefined) { + opts = { + ...opts, + calendar: value.calendarId + }; + } super(value); this.opts = opts; } + [Symbol.toPrimitive](hint) { + return hint === "string" ? this.toString() : this.toNumber(); + } + toNumber() { + const value = this.value; + if (typeof value === "number") return value; + if (value instanceof Date) return value.getTime(); + if ("epochMilliseconds" in value) { + return value.epochMilliseconds; + } + if ("toZonedDateTime" in value) { + return value.toZonedDateTime("UTC").epochMilliseconds; + } + throw new TypeError("Unwrapping a non-number value as a number"); + } toString(scope) { - try { - const dtf = scope.memoizeIntlObject(Intl.DateTimeFormat, this.opts); - return dtf.format(this.value); - } catch (err) { - scope.reportError(err); + if (scope) { + try { + const dtf = scope.memoizeIntlObject(Intl.DateTimeFormat, this.opts); + return dtf.format(this.value); + } catch (err) { + scope.reportError(err); + } + } + if (typeof this.value === "number" || this.value instanceof Date) { return new Date(this.value).toISOString(); } + return this.value.toString(); } } -;// CONCATENATED MODULE: ./node_modules/@fluent/bundle/esm/resolver.js +;// ./node_modules/@fluent/bundle/esm/resolver.js const MAX_PLACEABLES = 100; const FSI = "\u2068"; @@ -170,8 +1759,8 @@ case "number": return new FluentNumber(arg); case "object": - if (arg instanceof Date) { - return new FluentDateTime(arg.getTime()); + if (FluentDateTime.supportsValue(arg)) { + return new FluentDateTime(arg); } default: scope.reportError(new TypeError(`Variable type not supported: $${name}, ${typeof arg}`)); @@ -301,7 +1890,7 @@ } return resolveComplexPattern(scope, value); } -;// CONCATENATED MODULE: ./node_modules/@fluent/bundle/esm/scope.js +;// ./node_modules/@fluent/bundle/esm/scope.js class Scope { constructor(bundle, errors, args) { this.dirty = new WeakSet(); @@ -330,7 +1919,7 @@ return cache[id]; } } -;// CONCATENATED MODULE: ./node_modules/@fluent/bundle/esm/builtins.js +;// ./node_modules/@fluent/bundle/esm/builtins.js function values(opts, allowed) { const unwrapped = Object.create(null); @@ -354,7 +1943,7 @@ }); } if (arg instanceof FluentDateTime) { - return new FluentNumber(arg.valueOf(), { + return new FluentNumber(arg.toNumber(), { ...values(opts, NUMBER_ALLOWED) }); } @@ -366,20 +1955,12 @@ if (arg instanceof FluentNone) { return new FluentNone(`DATETIME(${arg.valueOf()})`); } - if (arg instanceof FluentDateTime) { - return new FluentDateTime(arg.valueOf(), { - ...arg.opts, - ...values(opts, DATETIME_ALLOWED) - }); - } - if (arg instanceof FluentNumber) { - return new FluentDateTime(arg.valueOf(), { - ...values(opts, DATETIME_ALLOWED) - }); + if (arg instanceof FluentDateTime || arg instanceof FluentNumber) { + return new FluentDateTime(arg, values(opts, DATETIME_ALLOWED)); } throw new TypeError("Invalid argument to DATETIME"); } -;// CONCATENATED MODULE: ./node_modules/@fluent/bundle/esm/memoizer.js +;// ./node_modules/@fluent/bundle/esm/memoizer.js const cache = new Map(); function getMemoizerForLocale(locales) { const stringLocale = Array.isArray(locales) ? locales.join(" ") : locales; @@ -390,7 +1971,7 @@ } return memoizer; } -;// CONCATENATED MODULE: ./node_modules/@fluent/bundle/esm/bundle.js +;// ./node_modules/@fluent/bundle/esm/bundle.js @@ -459,7 +2040,7 @@ } } } -;// CONCATENATED MODULE: ./node_modules/@fluent/bundle/esm/resource.js +;// ./node_modules/@fluent/bundle/esm/resource.js const RE_MESSAGE_START = /^(-?[a-zA-Z][\w-]*) *= */gm; const RE_ATTRIBUTE_START = /\.([a-zA-Z][\w-]*) *= */y; const RE_VARIANT_START = /\*?\[/y; @@ -838,32 +2419,18 @@ this.length = length; } } -;// CONCATENATED MODULE: ./node_modules/@fluent/bundle/esm/index.js - - - +;// ./node_modules/@fluent/bundle/esm/index.js -/***/ }), - -/***/ 5273: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - - -// EXPORTS -__webpack_require__.d(__webpack_exports__, { - DOMLocalization: () => (/* reexport */ DOMLocalization) -}); -// UNUSED EXPORTS: Localization -;// CONCATENATED MODULE: ./node_modules/@fluent/dom/esm/overlay.js +;// ./node_modules/@fluent/dom/esm/overlay.js const reOverlay = /<|&#?\w+;/; const TEXT_LEVEL_ELEMENTS = { "http://www.w3.org/1999/xhtml": ["em", "strong", "small", "s", "cite", "q", "dfn", "abbr", "data", "time", "code", "var", "samp", "kbd", "sub", "sup", "i", "b", "u", "mark", "bdi", "bdo", "span", "br", "wbr"] }; const LOCALIZABLE_ATTRIBUTES = { "http://www.w3.org/1999/xhtml": { - global: ["title", "aria-label", "aria-valuetext"], + global: ["title", "aria-description", "aria-label", "aria-valuetext"], a: ["download"], area: ["download", "alt"], input: ["alt", "placeholder"], @@ -1007,7 +2574,7 @@ overlayAttributes(fromElement, toElement); return toElement; } -;// CONCATENATED MODULE: ./node_modules/cached-iterable/src/cached_iterable.mjs +;// ./node_modules/cached-iterable/src/cached_iterable.mjs class CachedIterable extends Array { static from(iterable) { if (iterable instanceof this) { @@ -1016,7 +2583,7 @@ return new this(iterable); } } -;// CONCATENATED MODULE: ./node_modules/cached-iterable/src/cached_sync_iterable.mjs +;// ./node_modules/cached-iterable/src/cached_sync_iterable.mjs class CachedSyncIterable extends CachedIterable { constructor(iterable) { @@ -1051,7 +2618,7 @@ return this[this.length - 1]; } } -;// CONCATENATED MODULE: ./node_modules/cached-iterable/src/cached_async_iterable.mjs +;// ./node_modules/cached-iterable/src/cached_async_iterable.mjs class CachedAsyncIterable extends CachedIterable { constructor(iterable) { @@ -1088,10 +2655,10 @@ return this[this.length - 1]; } } -;// CONCATENATED MODULE: ./node_modules/cached-iterable/src/index.mjs +;// ./node_modules/cached-iterable/src/index.mjs -;// CONCATENATED MODULE: ./node_modules/@fluent/dom/esm/localization.js +;// ./node_modules/@fluent/dom/esm/localization.js class Localization { constructor(resourceIds = [], generateBundles) { @@ -1206,7 +2773,7 @@ }); return missingIds; } -;// CONCATENATED MODULE: ./node_modules/@fluent/dom/esm/dom_localization.js +;// ./node_modules/@fluent/dom/esm/dom_localization.js const L10NID_ATTR_NAME = "data-l10n-id"; @@ -1272,6 +2839,9 @@ this.pauseObserving(); if (this.roots.size === 0) { this.mutationObserver = null; + if (this.windowElement && this.pendingrAF) { + this.windowElement.cancelAnimationFrame(this.pendingrAF); + } this.windowElement = null; this.pendingrAF = null; this.pendingElements.clear(); @@ -1366,27 +2936,923 @@ }; } } -;// CONCATENATED MODULE: ./node_modules/@fluent/dom/esm/index.js +;// ./node_modules/@fluent/dom/esm/index.js + + +;// ./web/l10n.js +class L10n { + #dir; + #elements; + #lang; + #l10n; + constructor({ + lang, + isRTL + }, l10n = null) { + this.#lang = L10n.#fixupLangCode(lang); + this.#l10n = l10n; + this.#dir = isRTL ?? L10n.#isRTL(this.#lang) ? "rtl" : "ltr"; + } + _setL10n(l10n) { + this.#l10n = l10n; + } + getLanguage() { + return this.#lang; + } + getDirection() { + return this.#dir; + } + async get(ids, args = null, fallback) { + if (Array.isArray(ids)) { + ids = ids.map(id => ({ + id + })); + const messages = await this.#l10n.formatMessages(ids); + return messages.map(message => message.value); + } + const messages = await this.#l10n.formatMessages([{ + id: ids, + args + }]); + return messages[0]?.value || fallback; + } + async translate(element) { + (this.#elements ||= new Set()).add(element); + try { + this.#l10n.connectRoot(element); + await this.#l10n.translateRoots(); + } catch {} + } + async translateOnce(element) { + try { + await this.#l10n.translateElements([element]); + } catch (ex) { + console.error("translateOnce:", ex); + } + } + async destroy() { + if (this.#elements) { + for (const element of this.#elements) { + this.#l10n.disconnectRoot(element); + } + this.#elements.clear(); + this.#elements = null; + } + this.#l10n.pauseObserving(); + } + pause() { + this.#l10n.pauseObserving(); + } + resume() { + this.#l10n.resumeObserving(); + } + static #fixupLangCode(langCode) { + langCode = langCode?.toLowerCase() || "en-us"; + const PARTIAL_LANG_CODES = { + en: "en-us", + es: "es-es", + fy: "fy-nl", + ga: "ga-ie", + gu: "gu-in", + hi: "hi-in", + hy: "hy-am", + nb: "nb-no", + ne: "ne-np", + nn: "nn-no", + pa: "pa-in", + pt: "pt-pt", + sv: "sv-se", + zh: "zh-cn" + }; + return PARTIAL_LANG_CODES[langCode] || langCode; + } + static #isRTL(lang) { + const shortCode = lang.split("-", 1)[0]; + return ["ar", "he", "fa", "ps", "ur"].includes(shortCode); + } +} +const GenericL10n = null; + +;// ./web/genericl10n.js + + + + +function PLATFORM() { + const { + isAndroid, + isLinux, + isMac, + isWindows + } = FeatureTest.platform; + if (isLinux) { + return "linux"; + } + if (isWindows) { + return "windows"; + } + if (isMac) { + return "macos"; + } + if (isAndroid) { + return "android"; + } + return "other"; +} +function createBundle(lang, text) { + const resource = new FluentResource(text); + const bundle = new FluentBundle(lang, { + functions: { + PLATFORM + } + }); + const errors = bundle.addResource(resource); + if (errors.length) { + console.error("L10n errors", errors); + } + return bundle; +} +class genericl10n_GenericL10n extends L10n { + constructor(lang) { + super({ + lang + }); + const generateBundles = !lang ? genericl10n_GenericL10n.#generateBundlesFallback.bind(genericl10n_GenericL10n, this.getLanguage()) : genericl10n_GenericL10n.#generateBundles.bind(genericl10n_GenericL10n, "en-us", this.getLanguage()); + this._setL10n(new DOMLocalization([], generateBundles)); + } + static async *#generateBundles(defaultLang, baseLang) { + const { + baseURL, + paths + } = await this.#getPaths(); + const langs = [baseLang]; + if (defaultLang !== baseLang) { + const shortLang = baseLang.split("-", 1)[0]; + if (shortLang !== baseLang) { + langs.push(shortLang); + } + langs.push(defaultLang); + } + const bundles = langs.map(lang => [lang, this.#createBundle(lang, baseURL, paths)]); + for (const [lang, bundlePromise] of bundles) { + const bundle = await bundlePromise; + if (bundle) { + yield bundle; + } else if (lang === "en-us") { + yield this.#createBundleFallback(lang); + } + } + } + static async #createBundle(lang, baseURL, paths) { + const path = paths[lang]; + if (!path) { + return null; + } + const url = new URL(path, baseURL); + const text = await fetchData(url, "text"); + return createBundle(lang, text); + } + static async #getPaths() { + try { + const { + href + } = document.querySelector(`link[type="application/l10n"]`); + const paths = await fetchData(href, "json"); + return { + baseURL: href.substring(0, href.lastIndexOf("/") + 1) || "./", + paths + }; + } catch {} + return { + baseURL: "./", + paths: Object.create(null) + }; + } + static async *#generateBundlesFallback(lang) { + yield this.#createBundleFallback(lang); + } + static async #createBundleFallback(lang) { + const text = "pdfjs-previous-button =\n .title = Previous Page\npdfjs-previous-button-label = Previous\npdfjs-next-button =\n .title = Next Page\npdfjs-next-button-label = Next\npdfjs-page-input =\n .title = Page\npdfjs-of-pages = of { $pagesCount }\npdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount })\npdfjs-zoom-out-button =\n .title = Zoom Out\npdfjs-zoom-out-button-label = Zoom Out\npdfjs-zoom-in-button =\n .title = Zoom In\npdfjs-zoom-in-button-label = Zoom In\npdfjs-zoom-select =\n .title = Zoom\npdfjs-presentation-mode-button =\n .title = Switch to Presentation Mode\npdfjs-presentation-mode-button-label = Presentation Mode\npdfjs-open-file-button =\n .title = Open File\npdfjs-open-file-button-label = Open\npdfjs-print-button =\n .title = Print\npdfjs-print-button-label = Print\npdfjs-save-button =\n .title = Save\npdfjs-save-button-label = Save\npdfjs-download-button =\n .title = Download\npdfjs-download-button-label = Download\npdfjs-bookmark-button =\n .title = Current Page (View URL from Current Page)\npdfjs-bookmark-button-label = Current Page\npdfjs-tools-button =\n .title = Tools\npdfjs-tools-button-label = Tools\npdfjs-first-page-button =\n .title = Go to First Page\npdfjs-first-page-button-label = Go to First Page\npdfjs-last-page-button =\n .title = Go to Last Page\npdfjs-last-page-button-label = Go to Last Page\npdfjs-page-rotate-cw-button =\n .title = Rotate Clockwise\npdfjs-page-rotate-cw-button-label = Rotate Clockwise\npdfjs-page-rotate-ccw-button =\n .title = Rotate Counterclockwise\npdfjs-page-rotate-ccw-button-label = Rotate Counterclockwise\npdfjs-cursor-text-select-tool-button =\n .title = Enable Text Selection Tool\npdfjs-cursor-text-select-tool-button-label = Text Selection Tool\npdfjs-cursor-hand-tool-button =\n .title = Enable Hand Tool\npdfjs-cursor-hand-tool-button-label = Hand Tool\npdfjs-scroll-page-button =\n .title = Use Page Scrolling\npdfjs-scroll-page-button-label = Page Scrolling\npdfjs-scroll-vertical-button =\n .title = Use Vertical Scrolling\npdfjs-scroll-vertical-button-label = Vertical Scrolling\npdfjs-scroll-horizontal-button =\n .title = Use Horizontal Scrolling\npdfjs-scroll-horizontal-button-label = Horizontal Scrolling\npdfjs-scroll-wrapped-button =\n .title = Use Wrapped Scrolling\npdfjs-scroll-wrapped-button-label = Wrapped Scrolling\npdfjs-spread-none-button =\n .title = Do not join page spreads\npdfjs-spread-none-button-label = No Spreads\npdfjs-spread-odd-button =\n .title = Join page spreads starting with odd-numbered pages\npdfjs-spread-odd-button-label = Odd Spreads\npdfjs-spread-even-button =\n .title = Join page spreads starting with even-numbered pages\npdfjs-spread-even-button-label = Even Spreads\npdfjs-document-properties-button =\n .title = Document Properties\u2026\npdfjs-document-properties-button-label = Document Properties\u2026\npdfjs-document-properties-file-name = File name:\npdfjs-document-properties-file-size = File size:\npdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)\npdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)\npdfjs-document-properties-title = Title:\npdfjs-document-properties-author = Author:\npdfjs-document-properties-subject = Subject:\npdfjs-document-properties-keywords = Keywords:\npdfjs-document-properties-creation-date = Creation Date:\npdfjs-document-properties-modification-date = Modification Date:\npdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: \"short\", timeStyle: \"medium\") }\npdfjs-document-properties-creator = Creator:\npdfjs-document-properties-producer = PDF Producer:\npdfjs-document-properties-version = PDF Version:\npdfjs-document-properties-page-count = Page Count:\npdfjs-document-properties-page-size = Page Size:\npdfjs-document-properties-page-size-unit-inches = in\npdfjs-document-properties-page-size-unit-millimeters = mm\npdfjs-document-properties-page-size-orientation-portrait = portrait\npdfjs-document-properties-page-size-orientation-landscape = landscape\npdfjs-document-properties-page-size-name-a-three = A3\npdfjs-document-properties-page-size-name-a-four = A4\npdfjs-document-properties-page-size-name-letter = Letter\npdfjs-document-properties-page-size-name-legal = Legal\npdfjs-document-properties-page-size-dimension-string = { $width } \xD7 { $height } { $unit } ({ $orientation })\npdfjs-document-properties-page-size-dimension-name-string = { $width } \xD7 { $height } { $unit } ({ $name }, { $orientation })\npdfjs-document-properties-linearized = Fast Web View:\npdfjs-document-properties-linearized-yes = Yes\npdfjs-document-properties-linearized-no = No\npdfjs-document-properties-close-button = Close\npdfjs-print-progress-message = Preparing document for printing\u2026\npdfjs-print-progress-percent = { $progress }%\npdfjs-print-progress-close-button = Cancel\npdfjs-printing-not-supported = Warning: Printing is not fully supported by this browser.\npdfjs-printing-not-ready = Warning: The PDF is not fully loaded for printing.\npdfjs-current-outline-item-button =\n .title = Find Current Outline Item\npdfjs-current-outline-item-button-label = Current Outline Item\npdfjs-findbar-button =\n .title = Find in Document\npdfjs-findbar-button-label = Find\npdfjs-additional-layers = Additional Layers\npdfjs-thumb-page-title1 =\n .title = Page { $page } of { $total }\npdfjs-thumb-page-canvas =\n .aria-label = Thumbnail of Page { $page }\npdfjs-thumb-page-checkbox1 =\n .title = Select page { $page }\npdfjs-find-input =\n .title = Find\n .placeholder = Find in document\u2026\npdfjs-find-previous-button =\n .title = Find the previous occurrence of the phrase\npdfjs-find-previous-button-label = Previous\npdfjs-find-next-button =\n .title = Find the next occurrence of the phrase\npdfjs-find-next-button-label = Next\npdfjs-find-highlight-checkbox = Highlight All\npdfjs-find-match-case-checkbox-label = Match Case\npdfjs-find-match-diacritics-checkbox-label = Match Diacritics\npdfjs-find-entire-word-checkbox-label = Whole Words\npdfjs-find-reached-top = Reached top of document, continued from bottom\npdfjs-find-reached-bottom = Reached end of document, continued from top\npdfjs-find-match-count =\n { $total ->\n [one] { $current } of { $total } match\n *[other] { $current } of { $total } matches\n }\npdfjs-find-match-count-limit =\n { $limit ->\n [one] More than { $limit } match\n *[other] More than { $limit } matches\n }\npdfjs-find-not-found = Phrase not found\npdfjs-page-scale-width = Page Width\npdfjs-page-scale-fit = Page Fit\npdfjs-page-scale-auto = Automatic Zoom\npdfjs-page-scale-actual = Actual Size\npdfjs-page-scale-percent = { $scale }%\npdfjs-page-landmark =\n .aria-label = Page { $page }\npdfjs-loading-error = An error occurred while loading the PDF.\npdfjs-invalid-file-error = Invalid or corrupted PDF file.\npdfjs-missing-file-error = Missing PDF file.\npdfjs-unexpected-response-error = Unexpected server response.\npdfjs-rendering-error = An error occurred while rendering the page.\npdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: \"short\", timeStyle: \"medium\") }\npdfjs-text-annotation-type =\n .alt = [{ $type } Annotation]\npdfjs-password-label = Enter the password to open this PDF file.\npdfjs-password-invalid = Invalid password. Please try again.\npdfjs-password-ok-button = OK\npdfjs-password-cancel-button = Cancel\npdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts.\npdfjs-editor-free-text-button =\n .title = Text\npdfjs-editor-color-picker-free-text-input =\n .title = Change text color\npdfjs-editor-free-text-button-label = Text\npdfjs-editor-ink-button =\n .title = Draw\npdfjs-editor-color-picker-ink-input =\n .title = Change drawing color\npdfjs-editor-ink-button-label = Draw\npdfjs-editor-stamp-button =\n .title = Add or edit images\npdfjs-editor-stamp-button-label = Add or edit images\npdfjs-editor-highlight-button =\n .title = Highlight\npdfjs-editor-highlight-button-label = Highlight\npdfjs-highlight-floating-button1 =\n .title = Highlight\n .aria-label = Highlight\npdfjs-highlight-floating-button-label = Highlight\npdfjs-comment-floating-button =\n .title = Comment\n .aria-label = Comment\npdfjs-comment-floating-button-label = Comment\npdfjs-editor-comment-button =\n .title = Comment\n .aria-label = Comment\npdfjs-editor-comment-button-label = Comment\npdfjs-editor-signature-button =\n .title = Add signature\npdfjs-editor-signature-button-label = Add signature\npdfjs-editor-highlight-editor =\n .aria-label = Highlight editor\npdfjs-editor-ink-editor =\n .aria-label = Drawing editor\npdfjs-editor-signature-editor1 =\n .aria-description = Signature editor: { $description }\npdfjs-editor-stamp-editor =\n .aria-label = Image editor\npdfjs-editor-remove-ink-button =\n .title = Remove drawing\npdfjs-editor-remove-freetext-button =\n .title = Remove text\npdfjs-editor-remove-stamp-button =\n .title = Remove image\npdfjs-editor-remove-highlight-button =\n .title = Remove highlight\npdfjs-editor-remove-signature-button =\n .title = Remove signature\npdfjs-editor-free-text-color-input = Color\npdfjs-editor-free-text-size-input = Size\npdfjs-editor-ink-color-input = Color\npdfjs-editor-ink-thickness-input = Thickness\npdfjs-editor-ink-opacity-input = Opacity\npdfjs-editor-stamp-add-image-button =\n .title = Add image\npdfjs-editor-stamp-add-image-button-label = Add image\npdfjs-editor-free-highlight-thickness-input = Thickness\npdfjs-editor-free-highlight-thickness-title =\n .title = Change thickness when highlighting items other than text\npdfjs-editor-add-signature-container =\n .aria-label = Signature controls and saved signatures\npdfjs-editor-signature-add-signature-button =\n .title = Add new signature\npdfjs-editor-signature-add-signature-button-label = Add new signature\npdfjs-editor-add-saved-signature-button =\n .title = Saved signature: { $description }\npdfjs-free-text2 =\n .aria-label = Text Editor\n .default-content = Start typing\u2026\npdfjs-editor-comments-sidebar-title =\n { $count ->\n [one] Comment\n *[other] Comments\n }\npdfjs-editor-comments-sidebar-close-button =\n .title = Close the sidebar\n .aria-label = Close the sidebar\npdfjs-editor-comments-sidebar-close-button-label = Close the sidebar\npdfjs-editor-comments-sidebar-no-comments1 = See something noteworthy? Highlight it and leave a comment.\npdfjs-editor-comments-sidebar-no-comments-link = Learn more\npdfjs-editor-alt-text-button =\n .aria-label = Alt text\npdfjs-editor-alt-text-button-label = Alt text\npdfjs-editor-alt-text-edit-button =\n .aria-label = Edit alt text\npdfjs-editor-alt-text-dialog-label = Choose an option\npdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people can\u2019t see the image or when it doesn\u2019t load.\npdfjs-editor-alt-text-add-description-label = Add a description\npdfjs-editor-alt-text-add-description-description = Aim for 1-2 sentences that describe the subject, setting, or actions.\npdfjs-editor-alt-text-mark-decorative-label = Mark as decorative\npdfjs-editor-alt-text-mark-decorative-description = This is used for ornamental images, like borders or watermarks.\npdfjs-editor-alt-text-cancel-button = Cancel\npdfjs-editor-alt-text-save-button = Save\npdfjs-editor-alt-text-decorative-tooltip = Marked as decorative\npdfjs-editor-alt-text-textarea =\n .placeholder = For example, \u201CA young man sits down at a table to eat a meal\u201D\npdfjs-editor-resizer-top-left =\n .aria-label = Top left corner \u2014 resize\npdfjs-editor-resizer-top-middle =\n .aria-label = Top middle \u2014 resize\npdfjs-editor-resizer-top-right =\n .aria-label = Top right corner \u2014 resize\npdfjs-editor-resizer-middle-right =\n .aria-label = Middle right \u2014 resize\npdfjs-editor-resizer-bottom-right =\n .aria-label = Bottom right corner \u2014 resize\npdfjs-editor-resizer-bottom-middle =\n .aria-label = Bottom middle \u2014 resize\npdfjs-editor-resizer-bottom-left =\n .aria-label = Bottom left corner \u2014 resize\npdfjs-editor-resizer-middle-left =\n .aria-label = Middle left \u2014 resize\npdfjs-editor-highlight-colorpicker-label = Highlight color\npdfjs-editor-colorpicker-button =\n .title = Change color\npdfjs-editor-colorpicker-dropdown =\n .aria-label = Color choices\npdfjs-editor-colorpicker-yellow =\n .title = Yellow\npdfjs-editor-colorpicker-green =\n .title = Green\npdfjs-editor-colorpicker-blue =\n .title = Blue\npdfjs-editor-colorpicker-pink =\n .title = Pink\npdfjs-editor-colorpicker-red =\n .title = Red\npdfjs-editor-highlight-show-all-button-label = Show all\npdfjs-editor-highlight-show-all-button =\n .title = Show all\npdfjs-editor-new-alt-text-dialog-edit-label = Edit alt text (image description)\npdfjs-editor-new-alt-text-dialog-add-label = Add alt text (image description)\npdfjs-editor-new-alt-text-textarea =\n .placeholder = Write your description here\u2026\npdfjs-editor-new-alt-text-description = Short description for people who can\u2019t see the image or when the image doesn\u2019t load.\npdfjs-editor-new-alt-text-disclaimer1 = This alt text was created automatically and may be inaccurate.\npdfjs-editor-new-alt-text-disclaimer-learn-more-url = Learn more\npdfjs-editor-new-alt-text-create-automatically-button-label = Create alt text automatically\npdfjs-editor-new-alt-text-not-now-button = Not now\npdfjs-editor-new-alt-text-error-title = Couldn\u2019t create alt text automatically\npdfjs-editor-new-alt-text-error-description = Please write your own alt text or try again later.\npdfjs-editor-new-alt-text-error-close-button = Close\npdfjs-editor-new-alt-text-ai-model-downloading-progress = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB)\n .aria-valuetext = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB)\npdfjs-editor-new-alt-text-added-button =\n .aria-label = Alt text added\npdfjs-editor-new-alt-text-added-button-label = Alt text added\npdfjs-editor-new-alt-text-missing-button =\n .aria-label = Missing alt text\npdfjs-editor-new-alt-text-missing-button-label = Missing alt text\npdfjs-editor-new-alt-text-to-review-button =\n .aria-label = Review alt text\npdfjs-editor-new-alt-text-to-review-button-label = Review alt text\npdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Created automatically: { $generatedAltText }\npdfjs-image-alt-text-settings-button =\n .title = Image alt text settings\npdfjs-image-alt-text-settings-button-label = Image alt text settings\npdfjs-editor-alt-text-settings-dialog-label = Image alt text settings\npdfjs-editor-alt-text-settings-automatic-title = Automatic alt text\npdfjs-editor-alt-text-settings-create-model-button-label = Create alt text automatically\npdfjs-editor-alt-text-settings-create-model-description = Suggests descriptions to help people who can\u2019t see the image or when the image doesn\u2019t load.\npdfjs-editor-alt-text-settings-editor-title = Alt text editor\npdfjs-editor-alt-text-settings-show-dialog-button-label = Show alt text editor right away when adding an image\npdfjs-editor-alt-text-settings-show-dialog-description = Helps you make sure all your images have alt text.\npdfjs-editor-alt-text-settings-close-button = Close\npdfjs-editor-highlight-added-alert = Highlight added\npdfjs-editor-freetext-added-alert = Text added\npdfjs-editor-ink-added-alert = Drawing added\npdfjs-editor-stamp-added-alert = Image added\npdfjs-editor-signature-added-alert = Signature added\npdfjs-editor-undo-bar-message-highlight = Highlight removed\npdfjs-editor-undo-bar-message-freetext = Text removed\npdfjs-editor-undo-bar-message-ink = Drawing removed\npdfjs-editor-undo-bar-message-stamp = Image removed\npdfjs-editor-undo-bar-message-signature = Signature removed\npdfjs-editor-undo-bar-message-comment = Comment removed\npdfjs-editor-undo-bar-message-multiple =\n { $count ->\n [one] { $count } annotation removed\n *[other] { $count } annotations removed\n }\npdfjs-editor-undo-bar-undo-button =\n .title = Undo\npdfjs-editor-undo-bar-undo-button-label = Undo\npdfjs-editor-undo-bar-close-button =\n .title = Close\npdfjs-editor-undo-bar-close-button-label = Close\npdfjs-editor-add-signature-dialog-label = This modal allows the user to create a signature to add to a PDF document. The user can edit the name (which also serves as the alt text), and optionally save the signature for repeated use.\npdfjs-editor-add-signature-dialog-title = Add a signature\npdfjs-editor-add-signature-type-button = Type\n .title = Type\npdfjs-editor-add-signature-draw-button = Draw\n .title = Draw\npdfjs-editor-add-signature-image-button = Image\n .title = Image\npdfjs-editor-add-signature-type-input =\n .aria-label = Type your signature\n .placeholder = Type your signature\npdfjs-editor-add-signature-draw-placeholder = Draw your signature\npdfjs-editor-add-signature-draw-thickness-range-label = Thickness\npdfjs-editor-add-signature-draw-thickness-range =\n .title = Drawing thickness: { $thickness }\npdfjs-editor-add-signature-image-placeholder = Drag a file here to upload\npdfjs-editor-add-signature-image-browse-link =\n { PLATFORM() ->\n [macos] Or choose image files\n *[other] Or browse image files\n }\npdfjs-editor-add-signature-description-label = Description (alt text)\npdfjs-editor-add-signature-description-input =\n .title = Description (alt text)\npdfjs-editor-add-signature-description-default-when-drawing = Signature\npdfjs-editor-add-signature-clear-button-label = Clear signature\npdfjs-editor-add-signature-clear-button =\n .title = Clear signature\npdfjs-editor-add-signature-save-checkbox = Save signature\npdfjs-editor-add-signature-save-warning-message = You\u2019ve reached the limit of 5 saved signatures. Remove one to save more.\npdfjs-editor-add-signature-image-upload-error-title = Couldn\u2019t upload image\npdfjs-editor-add-signature-image-upload-error-description = Check your network connection or try another image.\npdfjs-editor-add-signature-image-no-data-error-title = Can\u2019t convert this image into a signature\npdfjs-editor-add-signature-image-no-data-error-description = Please try uploading a different image.\npdfjs-editor-add-signature-error-close-button = Close\npdfjs-editor-add-signature-cancel-button = Cancel\npdfjs-editor-add-signature-add-button = Add\npdfjs-editor-delete-signature-button1 =\n .title = Remove saved signature\npdfjs-editor-delete-signature-button-label1 = Remove saved signature\npdfjs-editor-add-signature-edit-button-label = Edit description\npdfjs-editor-edit-signature-dialog-title = Edit description\npdfjs-editor-edit-signature-update-button = Update\npdfjs-show-comment-button =\n .title = Show comment\npdfjs-editor-edit-comment-popup-button-label = Edit comment\npdfjs-editor-edit-comment-popup-button =\n .title = Edit comment\npdfjs-editor-delete-comment-popup-button-label = Remove comment\npdfjs-editor-delete-comment-popup-button =\n .title = Remove comment\npdfjs-editor-edit-comment-dialog-title-when-editing = Edit comment\npdfjs-editor-edit-comment-dialog-save-button-when-editing = Update\npdfjs-editor-edit-comment-dialog-title-when-adding = Add comment\npdfjs-editor-edit-comment-dialog-save-button-when-adding = Add\npdfjs-editor-edit-comment-dialog-text-input =\n .placeholder = Start typing\u2026\npdfjs-editor-edit-comment-dialog-cancel-button = Cancel\npdfjs-editor-add-comment-button =\n .title = Add comment\npdfjs-toggle-views-manager-button1 =\n .title = Manage pages\npdfjs-toggle-views-manager-notification-button =\n .title = Toggle Sidebar (document contains thumbnails/outline/attachments/layers)\npdfjs-toggle-views-manager-button1-label = Manage pages\npdfjs-views-manager-sidebar =\n .aria-label = Sidebar\npdfjs-views-manager-sidebar-resizer =\n .aria-label = Sidebar resizer\npdfjs-views-manager-view-selector-button =\n .title = Views\npdfjs-views-manager-view-selector-button-label = Views\npdfjs-views-manager-pages-title = Pages\npdfjs-views-manager-outlines-title1 = Document outline\n .title = Document outline (double-click to expand/collapse all items)\npdfjs-views-manager-attachments-title = Attachments\npdfjs-views-manager-layers-title1 = Layers\n .title = Layers (double-click to reset all layers to the default state)\npdfjs-views-manager-pages-option-label = Pages\npdfjs-views-manager-outlines-option-label = Document outline\npdfjs-views-manager-attachments-option-label = Attachments\npdfjs-views-manager-layers-option-label = Layers\npdfjs-views-manager-add-file-button =\n .title = Add file\npdfjs-views-manager-add-file-button-label = Add file\npdfjs-views-manager-pages-status-action-label =\n { $count ->\n [one] { $count } selected\n *[other] { $count } selected\n }\npdfjs-views-manager-pages-status-none-action-label = Select pages\npdfjs-views-manager-pages-status-action-button-label = Manage\npdfjs-views-manager-pages-status-copy-button-label = Copy\npdfjs-views-manager-pages-status-cut-button-label = Cut\npdfjs-views-manager-pages-status-delete-button-label = Delete\npdfjs-views-manager-pages-status-export-selected-button-label = Export selected\u2026\npdfjs-views-manager-status-undo-cut-label =\n { $count ->\n [one] 1 page cut\n *[other] { $count } pages cut\n }\npdfjs-views-manager-pages-status-undo-copy-label =\n { $count ->\n [one] 1 page copied\n *[other] { $count } pages copied\n }\npdfjs-views-manager-pages-status-undo-delete-label =\n { $count ->\n [one] 1 page deleted\n *[other] { $count } pages deleted\n }\npdfjs-views-manager-pages-status-waiting-ready-label = Getting your file ready\u2026\npdfjs-views-manager-pages-status-waiting-uploading-label = Uploading file\u2026\npdfjs-views-manager-status-warning-cut-label = Couldn\u2019t cut. Refresh page and try again.\npdfjs-views-manager-status-warning-copy-label = Couldn\u2019t copy. Refresh page and try again.\npdfjs-views-manager-status-warning-delete-label = Couldn\u2019t delete. Refresh page and try again.\npdfjs-views-manager-status-warning-save-label = Couldn\u2019t save. Refresh page and try again.\npdfjs-views-manager-status-undo-button-label = Undo\npdfjs-views-manager-status-done-button-label = Done\npdfjs-views-manager-status-close-button =\n .title = Close\npdfjs-views-manager-status-close-button-label = Close\npdfjs-views-manager-paste-button-label = Paste\npdfjs-views-manager-paste-button-before =\n .title = Paste before the first page\npdfjs-views-manager-paste-button-after =\n .title = Paste after page { $page }\npdfjs-new-badge-content = NEW\npdfjs-views-manager-waiting-for-file = Uploading file\u2026"; + return createBundle(lang, text); + } +} + +;// ./web/generic_scripting.js +/* unused harmony import specifier */ var generic_scripting_getPdfFilenameFromUrl; + +async function docProperties(pdfDocument) { + const url = "", + baseUrl = ""; + const { + info, + metadata, + contentDispositionFilename, + contentLength + } = await pdfDocument.getMetadata(); + return { + ...info, + baseURL: baseUrl, + filesize: contentLength || (await pdfDocument.getDownloadInfo()).length, + filename: contentDispositionFilename || generic_scripting_getPdfFilenameFromUrl(url), + metadata: metadata?.getRaw(), + authors: metadata?.get("dc:creator"), + numPages: pdfDocument.numPages, + URL: url + }; +} +class GenericScripting { + constructor(sandboxBundleSrc, wasmUrl) { + this._ready = new Promise((resolve, reject) => { + const sandbox = import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + sandboxBundleSrc); + sandbox.then(pdfjsSandbox => { + resolve(pdfjsSandbox.QuickJSSandbox(new URL(wasmUrl, location.href).href)); + }).catch(reject); + }); + } + async createSandbox(data) { + const sandbox = await this._ready; + sandbox.create(data); + } + async dispatchEventInSandbox(event) { + const sandbox = await this._ready; + setTimeout(() => sandbox.dispatchEvent(event), 0); + } + async destroySandbox() { + const sandbox = await this._ready; + sandbox.nukeSandbox(); + } +} + +;// ./web/generic_signature_storage.js + +const KEY_STORAGE = "pdfjs.signature"; +class SignatureStorage { + #eventBus; + #signatures = null; + #signal = null; + constructor(eventBus, signal) { + this.#eventBus = eventBus; + this.#signal = signal; + } + #save() { + localStorage.setItem(KEY_STORAGE, JSON.stringify(Object.fromEntries(this.#signatures))); + } + async getAll() { + if (this.#signal) { + window.addEventListener("storage", ({ + key + }) => { + if (key === KEY_STORAGE) { + this.#signatures = null; + this.#eventBus?.dispatch("storedsignatureschanged", { + source: this + }); + } + }, { + signal: this.#signal + }); + this.#signal = null; + } + if (!this.#signatures) { + this.#signatures = new Map(); + const data = localStorage.getItem(KEY_STORAGE); + if (data) { + for (const [key, value] of Object.entries(JSON.parse(data))) { + this.#signatures.set(key, value); + } + } + } + return this.#signatures; + } + async isFull() { + return (await this.size()) === 5; + } + async size() { + return (await this.getAll()).size; + } + async create(data) { + if (await this.isFull()) { + return null; + } + const uuid = getUuid(); + this.#signatures.set(uuid, data); + this.#save(); + return uuid; + } + async delete(uuid) { + const signatures = await this.getAll(); + if (!signatures.has(uuid)) { + return false; + } + signatures.delete(uuid); + this.#save(); + return true; + } +} + +;// ./web/genericcom.js + + + + + + +function initCom(app) {} +class Preferences extends BasePreferences { + async _writeToStorage(prefObj) { + localStorage.setItem("pdfjs.preferences", JSON.stringify(prefObj)); + } + async _readFromStorage(prefObj) { + return { + prefs: JSON.parse(localStorage.getItem("pdfjs.preferences")) + }; + } +} +class ExternalServices extends BaseExternalServices { + constructor() { + super(); + } + async createL10n() { + return new genericl10n_GenericL10n(AppOptions.get("localeProperties")?.lang); + } + createScripting() { + return new GenericScripting(AppOptions.get("sandboxBundleSrc"), AppOptions.get("wasmUrl")); + } + createSignatureStorage(eventBus, signal) { + return new SignatureStorage(eventBus, signal); + } +} +class MLManager { + async isEnabledFor(_name) { + return false; + } + async deleteModel(_service) { + return null; + } + isReady(_name) { + return false; + } + guess(_data) {} + toggleService(_name, _enabled) {} +} +;// ./web/new_alt_text_manager.js -/***/ }), +class NewAltTextManager { + #boundCancel = this.#cancel.bind(this); + #createAutomaticallyButton; + #currentEditor = null; + #cancelButton; + #descriptionContainer; + #dialog; + #disclaimer; + #downloadModel; + #downloadModelDescription; + #eventBus; + #firstTime = false; + #guessedAltText; + #hasAI = null; + #isEditing = null; + #imagePreview; + #imageData; + #isAILoading = false; + #wasAILoading = false; + #learnMore; + #notNowButton; + #overlayManager; + #textarea; + #title; + #uiManager; + #previousAltText = null; + constructor({ + descriptionContainer, + dialog, + imagePreview, + cancelButton, + disclaimer, + notNowButton, + saveButton, + textarea, + learnMore, + errorCloseButton, + createAutomaticallyButton, + downloadModel, + downloadModelDescription, + title + }, overlayManager, eventBus) { + this.#cancelButton = cancelButton; + this.#createAutomaticallyButton = createAutomaticallyButton; + this.#descriptionContainer = descriptionContainer; + this.#dialog = dialog; + this.#disclaimer = disclaimer; + this.#notNowButton = notNowButton; + this.#imagePreview = imagePreview; + this.#textarea = textarea; + this.#learnMore = learnMore; + this.#title = title; + this.#downloadModel = downloadModel; + this.#downloadModelDescription = downloadModelDescription; + this.#overlayManager = overlayManager; + this.#eventBus = eventBus; + dialog.addEventListener("close", this.#close.bind(this)); + dialog.addEventListener("contextmenu", event => { + if (event.target !== this.#textarea) { + event.preventDefault(); + } + }); + cancelButton.addEventListener("click", this.#boundCancel); + notNowButton.addEventListener("click", this.#boundCancel); + saveButton.addEventListener("click", this.#save.bind(this)); + errorCloseButton.addEventListener("click", () => { + this.#toggleError(false); + }); + createAutomaticallyButton.addEventListener("click", async () => { + const checked = createAutomaticallyButton.getAttribute("aria-pressed") !== "true"; + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.ai_generation_check", + data: { + status: checked + } + }); + if (this.#uiManager) { + const isAltTextEnabled = await this.#uiManager.mlManager.isEnabledFor("altText"); + this.#createAutomaticallyButton.disabled = true; + if (checked && !isAltTextEnabled) { + this.#textarea.value = ""; + this.#setProgress(); + this.#uiManager.setPreference("enableGuessAltText", true); + await this.#uiManager.mlManager.downloadModel("altText"); + this.#setPref("enableAltTextModelDownload", true); + } else if (!checked && isAltTextEnabled) { + this.#uiManager.setPreference("enableGuessAltText", false); + await this.#uiManager.mlManager.deleteModel("altText"); + this.#setPref("enableAltTextModelDownload", false); + } + this.#createAutomaticallyButton.disabled = false; + await this.#uiManager.mlManager.toggleService("altText", checked); + } + this.#toggleGuessAltText(checked, false); + }); + textarea.addEventListener("focus", () => { + this.#wasAILoading = this.#isAILoading; + this.#toggleLoading(false); + this.#toggleTitleAndDisclaimer(); + }); + textarea.addEventListener("blur", () => { + if (!textarea.value) { + this.#toggleLoading(this.#wasAILoading); + } + this.#toggleTitleAndDisclaimer(); + }); + textarea.addEventListener("input", () => { + this.#toggleTitleAndDisclaimer(); + }); + textarea.addEventListener("keydown", e => { + if ((e.ctrlKey || e.metaKey) && e.key === "Enter" && !saveButton.disabled) { + this.#save(); + } + }); + eventBus.on("enableguessalttext", ({ + value + }) => { + this.#toggleGuessAltText(value, false); + }, internalOpt); + this.#overlayManager.register(dialog); + this.#learnMore.addEventListener("click", () => { + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.info", + data: { + topic: "alt_text" + } + }); + }); + } + #setPref(name, value) { + this.#eventBus.dispatch("setpreference", { + source: this, + name, + value + }); + } + #toggleLoading(value) { + if (!this.#uiManager || this.#isAILoading === value) { + return; + } + this.#isAILoading = value; + this.#descriptionContainer.classList.toggle("loading", value); + } + #toggleError(value) { + if (!this.#uiManager) { + return; + } + this.#dialog.classList.toggle("error", value); + } + async #toggleGuessAltText(value, isInitial) { + if (!this.#uiManager) { + return; + } + this.#dialog.classList.toggle("aiDisabled", !value); + this.#createAutomaticallyButton.setAttribute("aria-pressed", value); + if (value) { + const { + altTextLearnMoreUrl + } = this.#uiManager.mlManager; + if (altTextLearnMoreUrl) { + this.#learnMore.href = altTextLearnMoreUrl; + } + this.#mlGuessAltText(isInitial); + } else { + this.#toggleLoading(false); + this.#isAILoading = false; + this.#toggleTitleAndDisclaimer(); + } + } + #toggleNotNow() { + this.#notNowButton.classList.toggle("hidden", !this.#firstTime); + this.#cancelButton.classList.toggle("hidden", this.#firstTime); + } + #toggleAI(value) { + if (!this.#uiManager || this.#hasAI === value) { + return; + } + this.#hasAI = value; + this.#dialog.classList.toggle("noAi", !value); + this.#toggleTitleAndDisclaimer(); + } + #toggleTitleAndDisclaimer() { + const visible = this.#isAILoading || this.#guessedAltText && this.#guessedAltText === this.#textarea.value; + this.#disclaimer.hidden = !visible; + const isEditing = this.#isAILoading || !!this.#textarea.value; + if (this.#isEditing === isEditing) { + return; + } + this.#isEditing = isEditing; + this.#title.setAttribute("data-l10n-id", isEditing ? "pdfjs-editor-new-alt-text-dialog-edit-label" : "pdfjs-editor-new-alt-text-dialog-add-label"); + } + async #mlGuessAltText(isInitial) { + if (this.#isAILoading) { + return; + } + if (this.#textarea.value) { + return; + } + if (isInitial && this.#previousAltText !== null) { + return; + } + this.#guessedAltText = this.#currentEditor.guessedAltText; + if (this.#previousAltText === null && this.#guessedAltText) { + this.#addAltText(this.#guessedAltText); + return; + } + this.#toggleLoading(true); + this.#toggleTitleAndDisclaimer(); + let hasError = false; + try { + const altText = await this.#currentEditor.mlGuessAltText(this.#imageData, false); + if (altText) { + this.#guessedAltText = altText; + this.#wasAILoading = this.#isAILoading; + if (this.#isAILoading) { + this.#addAltText(altText); + } + } + } catch (e) { + console.error(e); + hasError = true; + } + this.#toggleLoading(false); + this.#toggleTitleAndDisclaimer(); + if (hasError && this.#uiManager) { + this.#toggleError(true); + } + } + #addAltText(altText) { + if (!this.#uiManager || this.#textarea.value) { + return; + } + this.#textarea.value = altText; + this.#toggleTitleAndDisclaimer(); + } + #setProgress() { + this.#downloadModel.classList.toggle("hidden", false); + const callback = async ({ + detail: { + finished, + total, + totalLoaded + } + }) => { + const ONE_MEGA_BYTES = 1e6; + totalLoaded = Math.min(0.99 * total, totalLoaded); + const totalSize = this.#downloadModelDescription.ariaValueMax = Math.round(total / ONE_MEGA_BYTES); + const downloadedSize = this.#downloadModelDescription.ariaValueNow = Math.round(totalLoaded / ONE_MEGA_BYTES); + this.#downloadModelDescription.setAttribute("data-l10n-args", JSON.stringify({ + totalSize, + downloadedSize + })); + if (!finished) { + return; + } + this.#eventBus.off("loadaiengineprogress", callback); + this.#downloadModel.classList.toggle("hidden", true); + this.#toggleAI(true); + if (!this.#uiManager) { + return; + } + const { + mlManager + } = this.#uiManager; + mlManager.toggleService("altText", true); + this.#toggleGuessAltText(await mlManager.isEnabledFor("altText"), true); + }; + this.#eventBus.on("loadaiengineprogress", callback, internalOpt); + } + async editAltText(uiManager, editor, firstTime) { + if (this.#currentEditor || !editor) { + return; + } + if (firstTime && editor.hasAltTextData()) { + editor.altTextFinish(); + return; + } + this.#firstTime = firstTime; + const { + mlManager + } = uiManager; + const hasAI = !!mlManager; + this.#toggleTitleAndDisclaimer(); + if (mlManager && !mlManager.isReady("altText")) { + if (mlManager.hasProgress) { + this.#setProgress(); + } else { + this.#createAutomaticallyButton.setAttribute("aria-pressed", false); + } + } else { + this.#downloadModel.classList.toggle("hidden", true); + } + const isAltTextEnabledPromise = mlManager?.isEnabledFor("altText"); + this.#currentEditor = editor; + this.#uiManager = uiManager; + this.#uiManager.removeEditListeners(); + ({ + altText: this.#previousAltText + } = editor.altTextData); + this.#textarea.value = this.#previousAltText ?? ""; + const AI_MAX_IMAGE_DIMENSION = 224; + const MAX_PREVIEW_DIMENSION = 180; + let canvas, width, height; + if (mlManager) { + ({ + canvas, + width, + height, + imageData: this.#imageData + } = editor.copyCanvas(AI_MAX_IMAGE_DIMENSION, MAX_PREVIEW_DIMENSION, true)); + if (hasAI) { + this.#toggleGuessAltText(await isAltTextEnabledPromise, true); + } + } else { + ({ + canvas, + width, + height + } = editor.copyCanvas(AI_MAX_IMAGE_DIMENSION, MAX_PREVIEW_DIMENSION, false)); + } + canvas.setAttribute("role", "presentation"); + const { + style + } = canvas; + style.width = `${width}px`; + style.height = `${height}px`; + this.#imagePreview.append(canvas); + this.#toggleNotNow(); + this.#toggleAI(hasAI); + this.#toggleError(false); + try { + await this.#overlayManager.open(this.#dialog); + } catch (ex) { + this.#close(); + throw ex; + } + } + #cancel() { + this.#currentEditor.altTextData = { + cancel: true + }; + const altText = this.#textarea.value.trim(); + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.dismiss", + data: { + alt_text_type: altText ? "present" : "empty", + flow: this.#firstTime ? "image_add" : "alt_text_edit" + } + }); + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.image_added", + data: { + alt_text_modal: true, + alt_text_type: "skipped" + } + }); + this.#finish(); + } + #finish() { + this.#overlayManager.closeIfActive(this.#dialog); + } + #close() { + const canvas = this.#imagePreview.firstElementChild; + canvas.remove(); + canvas.width = canvas.height = 0; + this.#imageData = null; + this.#toggleLoading(false); + this.#uiManager?.addEditListeners(); + this.#currentEditor.altTextFinish(); + this.#uiManager?.setSelected(this.#currentEditor); + this.#currentEditor = null; + this.#uiManager = null; + } + #extractWords(text) { + return new Set(text.toLowerCase().split(/[^\p{L}\p{N}]+/gu).filter(x => !!x)); + } + #save() { + const altText = this.#textarea.value.trim(); + this.#currentEditor.altTextData = { + altText, + decorative: false + }; + this.#currentEditor.altTextData.guessedAltText = this.#guessedAltText; + if (this.#guessedAltText && this.#guessedAltText !== altText) { + const guessedWords = this.#extractWords(this.#guessedAltText); + const words = this.#extractWords(altText); + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.user_edit", + data: { + total_words: guessedWords.size, + words_removed: guessedWords.difference(words).size, + words_added: words.difference(guessedWords).size + } + }); + } + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.image_added", + data: { + alt_text_modal: true, + alt_text_type: altText ? "present" : "empty" + } + }); + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.save", + data: { + alt_text_type: altText ? "present" : "empty", + flow: this.#firstTime ? "image_add" : "alt_text_edit" + } + }); + this.#finish(); + } + destroy() { + this.#uiManager = null; + this.#finish(); + } +} +class ImageAltTextSettings { + #createModelButton; + #dialog; + #eventBus; + #mlManager; + #overlayManager; + #showAltTextDialogButton; + constructor({ + dialog, + createModelButton, + learnMore, + closeButton, + showAltTextDialogButton + }, overlayManager, eventBus, mlManager) { + this.#dialog = dialog; + this.#createModelButton = createModelButton; + this.#showAltTextDialogButton = showAltTextDialogButton; + this.#overlayManager = overlayManager; + this.#eventBus = eventBus; + this.#mlManager = mlManager; + const { + altTextLearnMoreUrl + } = mlManager; + if (altTextLearnMoreUrl) { + learnMore.href = altTextLearnMoreUrl; + } + dialog.addEventListener("contextmenu", noContextMenu); + createModelButton.addEventListener("click", async e => { + const checked = this.#togglePref("enableGuessAltText", e); + await (checked ? this.#download(true) : this.#delete(true)); + await mlManager.toggleService("altText", checked); + this.#reportTelemetry({ + type: "stamp", + action: "pdfjs.image.alt_text.settings_ai_generation_check", + data: { + status: checked + } + }); + }); + showAltTextDialogButton.addEventListener("click", e => { + const checked = this.#togglePref("enableNewAltTextWhenAddingImage", e); + this.#reportTelemetry({ + type: "stamp", + action: "pdfjs.image.alt_text.settings_edit_alt_text_check", + data: { + status: checked + } + }); + }); + closeButton.addEventListener("click", this.#finish.bind(this)); + learnMore.addEventListener("click", () => { + this.#reportTelemetry({ + type: "stamp", + action: "pdfjs.image.alt_text.info", + data: { + topic: "ai_generation" + } + }); + }); + eventBus.on("enablealttextmodeldownload", ({ + value + }) => { + if (value) { + this.#download(false); + } else { + this.#delete(false); + } + }, internalOpt); + this.#overlayManager.register(dialog); + } + #reportTelemetry(data) { + this.#eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data + } + }); + } + async #download(isFromUI = false) { + if (isFromUI) { + await this.#mlManager.downloadModel("altText"); + this.#setPref("enableGuessAltText", true); + this.#mlManager.toggleService("altText", true); + this.#setPref("enableAltTextModelDownload", true); + } + } + async #delete(isFromUI = false) { + if (isFromUI) { + await this.#mlManager.deleteModel("altText"); + this.#setPref("enableGuessAltText", false); + this.#setPref("enableAltTextModelDownload", false); + } + this.#createModelButton.setAttribute("aria-pressed", false); + } + async open({ + enableGuessAltText, + enableNewAltTextWhenAddingImage + }) { + const { + enableAltTextModelDownload + } = this.#mlManager; + this.#createModelButton.setAttribute("aria-pressed", enableAltTextModelDownload && enableGuessAltText); + this.#showAltTextDialogButton.setAttribute("aria-pressed", enableNewAltTextWhenAddingImage); + await this.#overlayManager.open(this.#dialog); + this.#reportTelemetry({ + type: "stamp", + action: "pdfjs.image.alt_text.settings_displayed" + }); + } + #togglePref(name, { + target + }) { + const checked = target.getAttribute("aria-pressed") !== "true"; + this.#setPref(name, checked); + target.setAttribute("aria-pressed", checked); + return checked; + } + #setPref(name, value) { + this.#eventBus.dispatch("setpreference", { + source: this, + name, + value + }); + } + #finish() { + this.#overlayManager.closeIfActive(this.#dialog); + } +} -/***/ 259: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { +;// ./web/alt_text_manager.js -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ AltTextManager: () => (/* binding */ AltTextManager) -/* harmony export */ }); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2603); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__]); -pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; class AltTextManager { - #boundUpdateUIState = this.#updateUIState.bind(this); - #boundSetPosition = this.#setPosition.bind(this); - #boundOnClick = this.#onClick.bind(this); + #clickAC = null; #currentEditor = null; #cancelButton; #dialog; @@ -1399,6 +3865,7 @@ #textarea; #uiManager; #previousAltText = null; + #resizeAC = null; #svgElement = null; #rectElement = null; #container; @@ -1420,6 +3887,7 @@ this.#overlayManager = overlayManager; this.#eventBus = eventBus; this.#container = container; + const onUpdateUIState = this.#updateUIState.bind(this); dialog.addEventListener("close", this.#close.bind(this)); dialog.addEventListener("contextmenu", event => { if (event.target !== this.#textarea) { @@ -1428,18 +3896,20 @@ }); cancelButton.addEventListener("click", this.#finish.bind(this)); saveButton.addEventListener("click", this.#save.bind(this)); - optionDescription.addEventListener("change", this.#boundUpdateUIState); - optionDecorative.addEventListener("change", this.#boundUpdateUIState); + optionDescription.addEventListener("change", onUpdateUIState); + optionDecorative.addEventListener("change", onUpdateUIState); + textarea.addEventListener("keydown", e => { + if ((e.ctrlKey || e.metaKey) && e.key === "Enter" && !saveButton.disabled) { + this.#save(); + } + }); this.#overlayManager.register(dialog); } - get _elements() { - return (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "_elements", [this.#optionDescription, this.#optionDecorative, this.#textarea, this.#saveButton, this.#cancelButton]); - } #createSVGElement() { if (this.#svgElement) { return; } - const svgFactory = new pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.DOMSVGFactory(); + const svgFactory = new DOMSVGFactory(); const svg = this.#svgElement = svgFactory.createElement("svg"); svg.setAttribute("width", "0"); svg.setAttribute("height", "0"); @@ -1467,8 +3937,13 @@ } this.#createSVGElement(); this.#hasUsedPointer = false; - for (const element of this._elements) { - element.addEventListener("click", this.#boundOnClick); + this.#clickAC = new AbortController(); + const clickOpts = { + signal: this.#clickAC.signal + }, + onClick = this.#onClick.bind(this); + for (const element of [this.#optionDescription, this.#optionDecorative, this.#textarea, this.#saveButton, this.#cancelButton]) { + element.addEventListener("click", onClick, clickOpts); } const { altText, @@ -1486,7 +3961,11 @@ this.#currentEditor = editor; this.#uiManager = uiManager; this.#uiManager.removeEditListeners(); - this.#eventBus._on("resize", this.#boundSetPosition); + this.#resizeAC = new AbortController(); + this.#eventBus.on("resize", this.#setPosition.bind(this), { + signal: this.#resizeAC.signal, + ...internalOpt + }); try { await this.#overlayManager.open(this.#dialog); this.#setPosition(); @@ -1572,9 +4051,7 @@ } } #finish() { - if (this.#overlayManager.active === this.#dialog) { - this.#overlayManager.close(this.#dialog); - } + this.#overlayManager.closeIfActive(this.#dialog); } #close() { this.#currentEditor._reportTelemetry(this.#telemetryData || { @@ -1584,7 +4061,8 @@ this.#telemetryData = null; this.#removeOnClickListeners(); this.#uiManager?.addEditListeners(); - this.#eventBus._off("resize", this.#boundSetPosition); + this.#resizeAC?.abort(); + this.#resizeAC = null; this.#currentEditor.altTextFinish(); this.#currentEditor = null; this.#uiManager = null; @@ -1616,9 +4094,8 @@ this.#removeOnClickListeners(); } #removeOnClickListeners() { - for (const element of this._elements) { - element.removeEventListener("click", this.#boundOnClick); - } + this.#clickAC?.abort(); + this.#clickAC = null; } destroy() { this.#uiManager = null; @@ -1628,122 +4105,8 @@ } } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), +;// ./web/annotation_editor_params.js -/***/ 283: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ AnnotationEditorLayerBuilder: () => (/* binding */ AnnotationEditorLayerBuilder) -/* harmony export */ }); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2603); -/* harmony import */ var web_null_l10n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(410); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__, web_null_l10n__WEBPACK_IMPORTED_MODULE_1__]); -([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__, web_null_l10n__WEBPACK_IMPORTED_MODULE_1__] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__); - - -class AnnotationEditorLayerBuilder { - #annotationLayer = null; - #drawLayer = null; - #onAppend = null; - #textLayer = null; - #uiManager; - constructor(options) { - this.pdfPage = options.pdfPage; - this.accessibilityManager = options.accessibilityManager; - this.l10n = options.l10n; - this.l10n ||= new web_null_l10n__WEBPACK_IMPORTED_MODULE_1__.GenericL10n(); - this.annotationEditorLayer = null; - this.div = null; - this._cancelled = false; - this.#uiManager = options.uiManager; - this.#annotationLayer = options.annotationLayer || null; - this.#textLayer = options.textLayer || null; - this.#drawLayer = options.drawLayer || null; - this.#onAppend = options.onAppend || null; - } - async render(viewport, intent = "display") { - if (intent !== "display") { - return; - } - if (this._cancelled) { - return; - } - const clonedViewport = viewport.clone({ - dontFlip: true - }); - if (this.div) { - this.annotationEditorLayer.update({ - viewport: clonedViewport - }); - this.show(); - return; - } - const div = this.div = document.createElement("div"); - div.className = "annotationEditorLayer"; - div.hidden = true; - div.dir = this.#uiManager.direction; - this.#onAppend?.(div); - this.annotationEditorLayer = new pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorLayer({ - uiManager: this.#uiManager, - div, - accessibilityManager: this.accessibilityManager, - pageIndex: this.pdfPage.pageNumber - 1, - l10n: this.l10n, - viewport: clonedViewport, - annotationLayer: this.#annotationLayer, - textLayer: this.#textLayer, - drawLayer: this.#drawLayer - }); - const parameters = { - viewport: clonedViewport, - div, - annotations: null, - intent - }; - this.annotationEditorLayer.render(parameters); - this.show(); - } - cancel() { - this._cancelled = true; - if (!this.div) { - return; - } - this.annotationEditorLayer.destroy(); - } - hide() { - if (!this.div) { - return; - } - this.div.hidden = true; - } - show() { - if (!this.div || this.annotationEditorLayer.isInvisible) { - return; - } - this.div.hidden = false; - } -} - -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), - -/***/ 226: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ AnnotationEditorParams: () => (/* binding */ AnnotationEditorParams) -/* harmony export */ }); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2603); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__]); -pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; class AnnotationEditorParams { constructor(options, eventBus) { @@ -1758,12 +4121,16 @@ editorInkOpacity, editorStampAddImage, editorFreeHighlightThickness, - editorHighlightShowAll + editorHighlightShowAll, + editorSignatureAddSignature }) { + const { + eventBus + } = this; const dispatchEvent = (typeStr, value) => { - this.eventBus.dispatch("switchannotationeditorparams", { + eventBus.dispatch("switchannotationeditorparams", { source: this, - type: pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType[typeStr], + type: AnnotationEditorParamsType[typeStr], value }); }; @@ -1773,16 +4140,63 @@ editorFreeTextColor.addEventListener("input", function () { dispatchEvent("FREETEXT_COLOR", this.value); }); - editorInkColor.addEventListener("input", function () { - dispatchEvent("INK_COLOR", this.value); - }); + let updateInkColor, updateInkOpacity; + if (FeatureTest.isAlphaColorInputSupported) { + editorInkColor.setAttribute("alpha", ""); + editorInkOpacity.closest(".editorParamsSetter").remove(); + let currentInkColor = "#000000"; + let currentInkOpacity = 1; + editorInkColor.addEventListener("input", function () { + const rgba = getRGBA(this.value); + if (!rgba) { + return; + } + const [r, g, b, opacity] = rgba; + const hex = Util.makeHexColor(r, g, b); + currentInkColor = hex; + currentInkOpacity = opacity; + dispatchEvent("INK_COLOR_AND_OPACITY", { + color: hex, + opacity + }); + }); + updateInkColor = value => { + currentInkColor = value; + const alphaHex = Util.hexNums[Math.round(currentInkOpacity * 255)]; + editorInkColor.value = currentInkColor + alphaHex; + }; + updateInkOpacity = value => { + currentInkOpacity = value; + const alphaHex = Util.hexNums[Math.round(currentInkOpacity * 255)]; + editorInkColor.value = currentInkColor + alphaHex; + }; + } else { + editorInkColor.addEventListener("input", function () { + dispatchEvent("INK_COLOR", this.value); + }); + editorInkOpacity.addEventListener("input", function () { + dispatchEvent("INK_OPACITY", this.valueAsNumber); + }); + updateInkColor = value => { + editorInkColor.value = value; + }; + updateInkOpacity = value => { + editorInkOpacity.value = value; + }; + } editorInkThickness.addEventListener("input", function () { dispatchEvent("INK_THICKNESS", this.valueAsNumber); }); - editorInkOpacity.addEventListener("input", function () { - dispatchEvent("INK_OPACITY", this.valueAsNumber); - }); editorStampAddImage.addEventListener("click", () => { + eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data: { + action: "pdfjs.image.add_image_click" + } + } + }); dispatchEvent("CREATE"); }); editorFreeHighlightThickness.addEventListener("input", function () { @@ -1793,2998 +4207,73 @@ this.setAttribute("aria-pressed", !checked); dispatchEvent("HIGHLIGHT_SHOW_ALL", !checked); }); - this.eventBus._on("annotationeditorparamschanged", evt => { + editorSignatureAddSignature.addEventListener("click", () => { + dispatchEvent("CREATE"); + }); + eventBus.on("annotationeditorparamschanged", evt => { for (const [type, value] of evt.details) { switch (type) { - case pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType.FREETEXT_SIZE: + case AnnotationEditorParamsType.FREETEXT_SIZE: editorFreeTextFontSize.value = value; break; - case pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType.FREETEXT_COLOR: + case AnnotationEditorParamsType.FREETEXT_COLOR: editorFreeTextColor.value = value; break; - case pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType.INK_COLOR: - editorInkColor.value = value; + case AnnotationEditorParamsType.INK_COLOR: + updateInkColor(value); break; - case pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType.INK_THICKNESS: + case AnnotationEditorParamsType.INK_THICKNESS: editorInkThickness.value = value; break; - case pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType.INK_OPACITY: - editorInkOpacity.value = value; + case AnnotationEditorParamsType.INK_OPACITY: + updateInkOpacity(value); + break; + case AnnotationEditorParamsType.HIGHLIGHT_COLOR: + eventBus.dispatch("mainhighlightcolorpickerupdatecolor", { + source: this, + value + }); break; - case pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: + case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: editorFreeHighlightThickness.value = value; break; - case pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType.HIGHLIGHT_FREE: + case AnnotationEditorParamsType.HIGHLIGHT_FREE: editorFreeHighlightThickness.disabled = !value; break; - case pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL: + case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL: editorHighlightShowAll.setAttribute("aria-pressed", value); break; } } - }); - } -} - -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), - -/***/ 2707: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ AnnotationLayerBuilder: () => (/* binding */ AnnotationLayerBuilder) -/* harmony export */ }); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2603); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7256); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__]); -pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; - - -class AnnotationLayerBuilder { - #onAppend = null; - #onPresentationModeChanged = null; - constructor({ - pdfPage, - linkService, - downloadManager, - annotationStorage = null, - imageResourcesPath = "", - renderForms = true, - enableScripting = false, - hasJSActionsPromise = null, - fieldObjectsPromise = null, - annotationCanvasMap = null, - accessibilityManager = null, - onAppend = null - }) { - this.pdfPage = pdfPage; - this.linkService = linkService; - this.downloadManager = downloadManager; - this.imageResourcesPath = imageResourcesPath; - this.renderForms = renderForms; - this.annotationStorage = annotationStorage; - this.enableScripting = enableScripting; - this._hasJSActionsPromise = hasJSActionsPromise || Promise.resolve(false); - this._fieldObjectsPromise = fieldObjectsPromise || Promise.resolve(null); - this._annotationCanvasMap = annotationCanvasMap; - this._accessibilityManager = accessibilityManager; - this.#onAppend = onAppend; - this.annotationLayer = null; - this.div = null; - this._cancelled = false; - this._eventBus = linkService.eventBus; - } - async render(viewport, intent = "display") { - if (this.div) { - if (this._cancelled || !this.annotationLayer) { - return; - } - this.annotationLayer.update({ - viewport: viewport.clone({ - dontFlip: true - }) - }); - return; - } - const [annotations, hasJSActions, fieldObjects] = await Promise.all([this.pdfPage.getAnnotations({ - intent - }), this._hasJSActionsPromise, this._fieldObjectsPromise]); - if (this._cancelled) { - return; - } - const div = this.div = document.createElement("div"); - div.className = "annotationLayer"; - this.#onAppend?.(div); - if (annotations.length === 0) { - this.hide(); - return; - } - this.annotationLayer = new pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationLayer({ - div, - accessibilityManager: this._accessibilityManager, - annotationCanvasMap: this._annotationCanvasMap, - page: this.pdfPage, - viewport: viewport.clone({ - dontFlip: true - }) - }); - await this.annotationLayer.render({ - annotations, - imageResourcesPath: this.imageResourcesPath, - renderForms: this.renderForms, - linkService: this.linkService, - downloadManager: this.downloadManager, - annotationStorage: this.annotationStorage, - enableScripting: this.enableScripting, - hasJSActions, - fieldObjects - }); - if (this.linkService.isInPresentationMode) { - this.#updatePresentationModeState(_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.PresentationModeState.FULLSCREEN); - } - if (!this.#onPresentationModeChanged) { - this.#onPresentationModeChanged = evt => { - this.#updatePresentationModeState(evt.state); - }; - this._eventBus?._on("presentationmodechanged", this.#onPresentationModeChanged); - } - } - cancel() { - this._cancelled = true; - if (this.#onPresentationModeChanged) { - this._eventBus?._off("presentationmodechanged", this.#onPresentationModeChanged); - this.#onPresentationModeChanged = null; - } - } - hide() { - if (!this.div) { - return; - } - this.div.hidden = true; - } - #updatePresentationModeState(state) { - if (!this.div) { - return; - } - let disableFormElements = false; - switch (state) { - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.PresentationModeState.FULLSCREEN: - disableFormElements = true; - break; - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.PresentationModeState.NORMAL: - break; - default: - return; - } - for (const section of this.div.childNodes) { - if (section.hasAttribute("data-internal-link")) { - continue; - } - section.inert = disableFormElements; - } + }, internalOpt); } } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), - -/***/ 1621: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFViewerApplication: () => (/* binding */ PDFViewerApplication) -/* harmony export */ }); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7256); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2603); -/* harmony import */ var _app_options_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9840); -/* harmony import */ var _event_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(5656); -/* harmony import */ var web_external_services__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(6750); -/* harmony import */ var _pdf_link_service_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(787); -/* harmony import */ var web_alt_text_manager__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(259); -/* harmony import */ var web_annotation_editor_params__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(226); -/* harmony import */ var _caret_browsing_js__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(3973); -/* harmony import */ var web_download_manager__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(1544); -/* harmony import */ var _overlay_manager_js__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(6174); -/* harmony import */ var _password_prompt_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(2690); -/* harmony import */ var web_pdf_attachment_viewer__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(9251); -/* harmony import */ var web_pdf_cursor_tools__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(5993); -/* harmony import */ var web_pdf_document_properties__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(164); -/* harmony import */ var web_pdf_find_bar__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(2226); -/* harmony import */ var _pdf_find_controller_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(9814); -/* harmony import */ var _pdf_history_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(8543); -/* harmony import */ var web_pdf_layer_viewer__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(4275); -/* harmony import */ var web_pdf_outline_viewer__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(5514); -/* harmony import */ var web_pdf_presentation_mode__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(8917); -/* harmony import */ var web_print_service__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(1144); -/* harmony import */ var _pdf_rendering_queue_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(6615); -/* harmony import */ var _pdf_scripting_manager_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(5942); -/* harmony import */ var web_pdf_sidebar__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(2275); -/* harmony import */ var web_pdf_thumbnail_viewer__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(8280); -/* harmony import */ var _pdf_viewer_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(6285); -/* harmony import */ var web_secondary_toolbar__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(1900); -/* harmony import */ var web_toolbar__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(6297); -/* harmony import */ var _view_history_js__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(9226); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__, web_external_services__WEBPACK_IMPORTED_MODULE_4__, web_alt_text_manager__WEBPACK_IMPORTED_MODULE_6__, web_annotation_editor_params__WEBPACK_IMPORTED_MODULE_7__, web_download_manager__WEBPACK_IMPORTED_MODULE_8__, _password_prompt_js__WEBPACK_IMPORTED_MODULE_9__, web_pdf_attachment_viewer__WEBPACK_IMPORTED_MODULE_10__, web_pdf_cursor_tools__WEBPACK_IMPORTED_MODULE_11__, web_pdf_document_properties__WEBPACK_IMPORTED_MODULE_12__, web_pdf_presentation_mode__WEBPACK_IMPORTED_MODULE_18__, web_print_service__WEBPACK_IMPORTED_MODULE_19__, _pdf_rendering_queue_js__WEBPACK_IMPORTED_MODULE_20__, _pdf_scripting_manager_js__WEBPACK_IMPORTED_MODULE_21__, web_pdf_thumbnail_viewer__WEBPACK_IMPORTED_MODULE_23__, _pdf_viewer_js__WEBPACK_IMPORTED_MODULE_24__, web_secondary_toolbar__WEBPACK_IMPORTED_MODULE_25__, web_toolbar__WEBPACK_IMPORTED_MODULE_26__]); -([pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__, web_external_services__WEBPACK_IMPORTED_MODULE_4__, web_alt_text_manager__WEBPACK_IMPORTED_MODULE_6__, web_annotation_editor_params__WEBPACK_IMPORTED_MODULE_7__, web_download_manager__WEBPACK_IMPORTED_MODULE_8__, _password_prompt_js__WEBPACK_IMPORTED_MODULE_9__, web_pdf_attachment_viewer__WEBPACK_IMPORTED_MODULE_10__, web_pdf_cursor_tools__WEBPACK_IMPORTED_MODULE_11__, web_pdf_document_properties__WEBPACK_IMPORTED_MODULE_12__, web_pdf_presentation_mode__WEBPACK_IMPORTED_MODULE_18__, web_print_service__WEBPACK_IMPORTED_MODULE_19__, _pdf_rendering_queue_js__WEBPACK_IMPORTED_MODULE_20__, _pdf_scripting_manager_js__WEBPACK_IMPORTED_MODULE_21__, web_pdf_thumbnail_viewer__WEBPACK_IMPORTED_MODULE_23__, _pdf_viewer_js__WEBPACK_IMPORTED_MODULE_24__, web_secondary_toolbar__WEBPACK_IMPORTED_MODULE_25__, web_toolbar__WEBPACK_IMPORTED_MODULE_26__] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const FORCE_PAGES_LOADED_TIMEOUT = 10000; -const WHEEL_ZOOM_DISABLED_TIMEOUT = 1000; -const ViewOnLoad = { - UNKNOWN: -1, - PREVIOUS: 0, - INITIAL: 1 -}; -const PDFViewerApplication = { - initialBookmark: document.location.hash.substring(1), - _initializedCapability: { - ...Promise.withResolvers(), - settled: false - }, - appConfig: null, - pdfDocument: null, - pdfLoadingTask: null, - printService: null, - pdfViewer: null, - pdfThumbnailViewer: null, - pdfRenderingQueue: null, - pdfPresentationMode: null, - pdfDocumentProperties: null, - pdfLinkService: null, - pdfHistory: null, - pdfSidebar: null, - pdfOutlineViewer: null, - pdfAttachmentViewer: null, - pdfLayerViewer: null, - pdfCursorTools: null, - pdfScriptingManager: null, - store: null, - downloadManager: null, - overlayManager: null, - preferences: null, - toolbar: null, - secondaryToolbar: null, - eventBus: null, - l10n: null, - annotationEditorParams: null, - isInitialViewSet: false, - downloadComplete: false, - isViewerEmbedded: window.parent !== window, - url: "", - baseUrl: "", - _downloadUrl: "", - _boundEvents: Object.create(null), - documentInfo: null, - metadata: null, - _contentDispositionFilename: null, - _contentLength: null, - _saveInProgress: false, - _wheelUnusedTicks: 0, - _wheelUnusedFactor: 1, - _touchUnusedTicks: 0, - _touchUnusedFactor: 1, - _PDFBug: null, - _hasAnnotationEditors: false, - _title: document.title, - _printAnnotationStoragePromise: null, - _touchInfo: null, - _isCtrlKeyDown: false, - _nimbusDataPromise: null, - _caretBrowsing: null, - _isScrolling: false, - _lastScrollTop: 0, - _lastScrollLeft: 0, - async initialize(appConfig) { - let l10nPromise; - this.appConfig = appConfig; - try { - await this.preferences.initializedPromise; - } catch (ex) { - console.error(`initialize: "${ex.message}".`); - } - if (_app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("pdfBugEnabled")) { - await this._parseHashParams(); - } - let mode; - switch (_app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("viewerCssTheme")) { - case 1: - mode = "is-light"; - break; - case 2: - mode = "is-dark"; - break; - } - if (mode) { - document.documentElement.classList.add(mode); - } - l10nPromise = this.externalServices.createL10n(); - this.l10n = await l10nPromise; - document.getElementsByTagName("html")[0].dir = this.l10n.getDirection(); - this.l10n.translate(appConfig.appContainer || document.documentElement); - if (this.isViewerEmbedded && _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("externalLinkTarget") === _pdf_link_service_js__WEBPACK_IMPORTED_MODULE_5__.LinkTarget.NONE) { - _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.set("externalLinkTarget", _pdf_link_service_js__WEBPACK_IMPORTED_MODULE_5__.LinkTarget.TOP); - } - await this._initializeViewerComponents(); - this.bindEvents(); - this.bindWindowEvents(); - this._initializedCapability.settled = true; - this._initializedCapability.resolve(); - }, - async _parseHashParams() { - const hash = document.location.hash.substring(1); - if (!hash) { - return; - } - const { - mainContainer, - viewerContainer - } = this.appConfig, - params = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseQueryString)(hash); - if (params.get("disableworker") === "true") { - try { - await loadFakeWorker(); - } catch (ex) { - console.error(`_parseHashParams: "${ex.message}".`); - } - } - if (params.has("disablerange")) { - _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.set("disableRange", params.get("disablerange") === "true"); - } - if (params.has("disablestream")) { - _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.set("disableStream", params.get("disablestream") === "true"); - } - if (params.has("disableautofetch")) { - _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.set("disableAutoFetch", params.get("disableautofetch") === "true"); - } - if (params.has("disablefontface")) { - _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.set("disableFontFace", params.get("disablefontface") === "true"); - } - if (params.has("disablehistory")) { - _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.set("disableHistory", params.get("disablehistory") === "true"); - } - if (params.has("verbosity")) { - _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.set("verbosity", params.get("verbosity") | 0); - } - if (params.has("textlayer")) { - switch (params.get("textlayer")) { - case "off": - _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.set("textLayerMode", _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.TextLayerMode.DISABLE); - break; - case "visible": - case "shadow": - case "hover": - viewerContainer.classList.add(`textLayer-${params.get("textlayer")}`); - try { - await loadPDFBug(this); - this._PDFBug.loadCSS(); - } catch (ex) { - console.error(`_parseHashParams: "${ex.message}".`); - } - break; - } - } - if (params.has("pdfbug")) { - _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.set("pdfBug", true); - _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.set("fontExtraProperties", true); - const enabled = params.get("pdfbug").split(","); - try { - await loadPDFBug(this); - this._PDFBug.init(mainContainer, enabled); - } catch (ex) { - console.error(`_parseHashParams: "${ex.message}".`); - } - } - if (params.has("locale")) { - _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.set("locale", params.get("locale")); - } - }, - async _initializeViewerComponents() { - const { - appConfig, - externalServices, - l10n - } = this; - const eventBus = _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("isInAutomation") ? new _event_utils_js__WEBPACK_IMPORTED_MODULE_3__.AutomationEventBus() : new _event_utils_js__WEBPACK_IMPORTED_MODULE_3__.EventBus(); - this.eventBus = eventBus; - this.overlayManager = new _overlay_manager_js__WEBPACK_IMPORTED_MODULE_27__.OverlayManager(); - const pdfRenderingQueue = new _pdf_rendering_queue_js__WEBPACK_IMPORTED_MODULE_20__.PDFRenderingQueue(); - pdfRenderingQueue.onIdle = this._cleanup.bind(this); - this.pdfRenderingQueue = pdfRenderingQueue; - const pdfLinkService = new _pdf_link_service_js__WEBPACK_IMPORTED_MODULE_5__.PDFLinkService({ - eventBus, - externalLinkTarget: _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("externalLinkTarget"), - externalLinkRel: _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("externalLinkRel"), - ignoreDestinationZoom: _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("ignoreDestinationZoom") - }); - this.pdfLinkService = pdfLinkService; - const downloadManager = this.downloadManager = new web_download_manager__WEBPACK_IMPORTED_MODULE_8__.DownloadManager(); - const findController = new _pdf_find_controller_js__WEBPACK_IMPORTED_MODULE_14__.PDFFindController({ - linkService: pdfLinkService, - eventBus, - updateMatchesCountOnProgress: true - }); - this.findController = findController; - const pdfScriptingManager = new _pdf_scripting_manager_js__WEBPACK_IMPORTED_MODULE_21__.PDFScriptingManager({ - eventBus, - externalServices, - docProperties: this._scriptingDocProperties.bind(this) - }); - this.pdfScriptingManager = pdfScriptingManager; - const container = appConfig.mainContainer, - viewer = appConfig.viewerContainer; - const annotationEditorMode = _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("annotationEditorMode"); - const isOffscreenCanvasSupported = _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("isOffscreenCanvasSupported") && pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.FeatureTest.isOffscreenCanvasSupported; - const pageColors = _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("forcePageColors") || window.matchMedia("(forced-colors: active)").matches ? { - background: _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("pageColorsBackground"), - foreground: _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("pageColorsForeground") - } : null; - const altTextManager = appConfig.altTextDialog ? new web_alt_text_manager__WEBPACK_IMPORTED_MODULE_6__.AltTextManager(appConfig.altTextDialog, container, this.overlayManager, eventBus) : null; - const pdfViewer = new _pdf_viewer_js__WEBPACK_IMPORTED_MODULE_24__.PDFViewer({ - container, - viewer, - eventBus, - renderingQueue: pdfRenderingQueue, - linkService: pdfLinkService, - downloadManager, - altTextManager, - findController, - scriptingManager: _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("enableScripting") && pdfScriptingManager, - l10n, - textLayerMode: _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("textLayerMode"), - annotationMode: _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("annotationMode"), - annotationEditorMode, - annotationEditorHighlightColors: _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("highlightEditorColors"), - enableHighlightFloatingButton: _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("enableHighlightFloatingButton"), - imageResourcesPath: _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("imageResourcesPath"), - enablePrintAutoRotate: _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("enablePrintAutoRotate"), - maxCanvasPixels: _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("maxCanvasPixels"), - enablePermissions: _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("enablePermissions"), - pageColors, - mlManager: this.mlManager - }); - this.pdfViewer = pdfViewer; - pdfRenderingQueue.setViewer(pdfViewer); - pdfLinkService.setViewer(pdfViewer); - pdfScriptingManager.setViewer(pdfViewer); - if (appConfig.sidebar?.thumbnailView) { - this.pdfThumbnailViewer = new web_pdf_thumbnail_viewer__WEBPACK_IMPORTED_MODULE_23__.PDFThumbnailViewer({ - container: appConfig.sidebar.thumbnailView, - eventBus, - renderingQueue: pdfRenderingQueue, - linkService: pdfLinkService, - pageColors - }); - pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer); - } - if (!this.isViewerEmbedded && !_app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("disableHistory")) { - this.pdfHistory = new _pdf_history_js__WEBPACK_IMPORTED_MODULE_15__.PDFHistory({ - linkService: pdfLinkService, - eventBus - }); - pdfLinkService.setHistory(this.pdfHistory); - } - if (!this.supportsIntegratedFind && appConfig.findBar) { - this.findBar = new web_pdf_find_bar__WEBPACK_IMPORTED_MODULE_13__.PDFFindBar(appConfig.findBar, eventBus); - } - if (appConfig.annotationEditorParams) { - if (annotationEditorMode !== pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.AnnotationEditorType.DISABLE) { - if (_app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("enableStampEditor") && isOffscreenCanvasSupported) { - appConfig.toolbar?.editorStampButton?.classList.remove("hidden"); - } - const editorHighlightButton = appConfig.toolbar?.editorHighlightButton; - if (editorHighlightButton && _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("enableHighlightEditor")) { - editorHighlightButton.hidden = false; - } - this.annotationEditorParams = new web_annotation_editor_params__WEBPACK_IMPORTED_MODULE_7__.AnnotationEditorParams(appConfig.annotationEditorParams, eventBus); - } else { - for (const id of ["editorModeButtons", "editorModeSeparator"]) { - document.getElementById(id)?.classList.add("hidden"); - } - } - } - if (appConfig.documentProperties) { - this.pdfDocumentProperties = new web_pdf_document_properties__WEBPACK_IMPORTED_MODULE_12__.PDFDocumentProperties(appConfig.documentProperties, this.overlayManager, eventBus, l10n, () => this._docFilename); - } - if (appConfig.secondaryToolbar?.cursorHandToolButton) { - this.pdfCursorTools = new web_pdf_cursor_tools__WEBPACK_IMPORTED_MODULE_11__.PDFCursorTools({ - container, - eventBus, - cursorToolOnLoad: _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("cursorToolOnLoad") - }); - } - if (appConfig.toolbar) { - this.toolbar = new web_toolbar__WEBPACK_IMPORTED_MODULE_26__.Toolbar(appConfig.toolbar, eventBus); - } - if (appConfig.secondaryToolbar) { - this.secondaryToolbar = new web_secondary_toolbar__WEBPACK_IMPORTED_MODULE_25__.SecondaryToolbar(appConfig.secondaryToolbar, eventBus); - } - if (this.supportsFullscreen && appConfig.secondaryToolbar?.presentationModeButton) { - this.pdfPresentationMode = new web_pdf_presentation_mode__WEBPACK_IMPORTED_MODULE_18__.PDFPresentationMode({ - container, - pdfViewer, - eventBus - }); - } - if (appConfig.passwordOverlay) { - this.passwordPrompt = new _password_prompt_js__WEBPACK_IMPORTED_MODULE_9__.PasswordPrompt(appConfig.passwordOverlay, this.overlayManager, this.isViewerEmbedded); - } - if (appConfig.sidebar?.outlineView) { - this.pdfOutlineViewer = new web_pdf_outline_viewer__WEBPACK_IMPORTED_MODULE_17__.PDFOutlineViewer({ - container: appConfig.sidebar.outlineView, - eventBus, - l10n, - linkService: pdfLinkService, - downloadManager - }); - } - if (appConfig.sidebar?.attachmentsView) { - this.pdfAttachmentViewer = new web_pdf_attachment_viewer__WEBPACK_IMPORTED_MODULE_10__.PDFAttachmentViewer({ - container: appConfig.sidebar.attachmentsView, - eventBus, - l10n, - downloadManager - }); - } - if (appConfig.sidebar?.layersView) { - this.pdfLayerViewer = new web_pdf_layer_viewer__WEBPACK_IMPORTED_MODULE_16__.PDFLayerViewer({ - container: appConfig.sidebar.layersView, - eventBus, - l10n - }); - } - if (appConfig.sidebar) { - this.pdfSidebar = new web_pdf_sidebar__WEBPACK_IMPORTED_MODULE_22__.PDFSidebar({ - elements: appConfig.sidebar, - eventBus, - l10n - }); - this.pdfSidebar.onToggled = this.forceRendering.bind(this); - this.pdfSidebar.onUpdateThumbnails = () => { - for (const pageView of pdfViewer.getCachedPageViews()) { - if (pageView.renderingState === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.RenderingStates.FINISHED) { - this.pdfThumbnailViewer.getThumbnail(pageView.id - 1)?.setImage(pageView); - } - } - this.pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber); - }; - } - }, - async run(config) { - this.preferences = new web_external_services__WEBPACK_IMPORTED_MODULE_4__.Preferences(); - await this.initialize(config); - const { - appConfig, - eventBus - } = this; - let file; - const queryString = document.location.search.substring(1); - const params = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseQueryString)(queryString); - file = params.get("file") ?? _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("defaultUrl"); - validateFileURL(file); - const fileInput = this._openFileInput = document.createElement("input"); - fileInput.id = "fileInput"; - fileInput.hidden = true; - fileInput.type = "file"; - fileInput.value = null; - document.body.append(fileInput); - fileInput.addEventListener("change", function (evt) { - const { - files - } = evt.target; - if (!files || files.length === 0) { - return; - } - eventBus.dispatch("fileinputchange", { - source: this, - fileInput: evt.target - }); - }); - appConfig.mainContainer.addEventListener("dragover", function (evt) { - evt.preventDefault(); - evt.dataTransfer.dropEffect = evt.dataTransfer.effectAllowed === "copy" ? "copy" : "move"; - }); - appConfig.mainContainer.addEventListener("drop", function (evt) { - evt.preventDefault(); - const { - files - } = evt.dataTransfer; - if (!files || files.length === 0) { - return; - } - eventBus.dispatch("fileinputchange", { - source: this, - fileInput: evt.dataTransfer - }); - }); - if (!_app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("supportsDocumentFonts")) { - _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.set("disableFontFace", true); - this.l10n.get("pdfjs-web-fonts-disabled").then(msg => { - console.warn(msg); - }); - } - if (!this.supportsPrinting) { - appConfig.toolbar?.print?.classList.add("hidden"); - appConfig.secondaryToolbar?.printButton.classList.add("hidden"); - } - if (!this.supportsFullscreen) { - appConfig.secondaryToolbar?.presentationModeButton.classList.add("hidden"); - } - if (this.supportsIntegratedFind) { - appConfig.toolbar?.viewFind?.classList.add("hidden"); - } - if (file) { - this.open({ - url: file - }); - } else { - this._hideViewBookmark(); - } - }, - get externalServices() { - return (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.shadow)(this, "externalServices", new web_external_services__WEBPACK_IMPORTED_MODULE_4__.ExternalServices()); - }, - get mlManager() { - return (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.shadow)(this, "mlManager", _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("enableML") === true ? new web_external_services__WEBPACK_IMPORTED_MODULE_4__.MLManager() : null); - }, - get initialized() { - return this._initializedCapability.settled; - }, - get initializedPromise() { - return this._initializedCapability.promise; - }, - zoomIn(steps, scaleFactor) { - if (this.pdfViewer.isInPresentationMode) { - return; - } - this.pdfViewer.increaseScale({ - drawingDelay: _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("defaultZoomDelay"), - steps, - scaleFactor - }); - }, - zoomOut(steps, scaleFactor) { - if (this.pdfViewer.isInPresentationMode) { - return; - } - this.pdfViewer.decreaseScale({ - drawingDelay: _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("defaultZoomDelay"), - steps, - scaleFactor - }); - }, - zoomReset() { - if (this.pdfViewer.isInPresentationMode) { - return; - } - this.pdfViewer.currentScaleValue = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_SCALE_VALUE; - }, - get pagesCount() { - return this.pdfDocument ? this.pdfDocument.numPages : 0; - }, - get page() { - return this.pdfViewer.currentPageNumber; - }, - set page(val) { - this.pdfViewer.currentPageNumber = val; - }, - get supportsPrinting() { - return web_print_service__WEBPACK_IMPORTED_MODULE_19__.PDFPrintServiceFactory.supportsPrinting; - }, - get supportsFullscreen() { - return (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.shadow)(this, "supportsFullscreen", document.fullscreenEnabled); - }, - get supportsPinchToZoom() { - return (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.shadow)(this, "supportsPinchToZoom", _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("supportsPinchToZoom")); - }, - get supportsIntegratedFind() { - return (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.shadow)(this, "supportsIntegratedFind", _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("supportsIntegratedFind")); - }, - get loadingBar() { - const barElement = document.getElementById("loadingBar"); - const bar = barElement ? new _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.ProgressBar(barElement) : null; - return (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.shadow)(this, "loadingBar", bar); - }, - get supportsMouseWheelZoomCtrlKey() { - return (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.shadow)(this, "supportsMouseWheelZoomCtrlKey", _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("supportsMouseWheelZoomCtrlKey")); - }, - get supportsMouseWheelZoomMetaKey() { - return (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.shadow)(this, "supportsMouseWheelZoomMetaKey", _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("supportsMouseWheelZoomMetaKey")); - }, - get supportsCaretBrowsingMode() { - return _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("supportsCaretBrowsingMode"); - }, - moveCaret(isUp, select) { - this._caretBrowsing ||= new _caret_browsing_js__WEBPACK_IMPORTED_MODULE_28__.CaretBrowsingMode(this.appConfig.mainContainer, this.appConfig.viewerContainer, this.appConfig.toolbar?.container); - this._caretBrowsing.moveCaret(isUp, select); - }, - setTitleUsingUrl(url = "", downloadUrl = null) { - this.url = url; - this.baseUrl = url.split("#", 1)[0]; - if (downloadUrl) { - this._downloadUrl = downloadUrl === url ? this.baseUrl : downloadUrl.split("#", 1)[0]; - } - if ((0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.isDataScheme)(url)) { - this._hideViewBookmark(); - } - let title = (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.getPdfFilenameFromUrl)(url, ""); - if (!title) { - try { - title = decodeURIComponent((0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.getFilenameFromUrl)(url)) || url; - } catch { - title = url; - } - } - this.setTitle(title); - }, - setTitle(title = this._title) { - this._title = title; - if (this.isViewerEmbedded) { - return; - } - const editorIndicator = this._hasAnnotationEditors && !this.pdfRenderingQueue.printing; - document.title = `${editorIndicator ? "* " : ""}${title}`; - }, - get _docFilename() { - return this._contentDispositionFilename || (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.getPdfFilenameFromUrl)(this.url); - }, - _hideViewBookmark() { - const { - secondaryToolbar - } = this.appConfig; - secondaryToolbar?.viewBookmarkButton.classList.add("hidden"); - if (secondaryToolbar?.presentationModeButton.classList.contains("hidden")) { - document.getElementById("viewBookmarkSeparator")?.classList.add("hidden"); - } - }, - async close() { - this._unblockDocumentLoadEvent(); - this._hideViewBookmark(); - if (!this.pdfLoadingTask) { - return; - } - if (this.pdfDocument?.annotationStorage.size > 0 && this._annotationStorageModified) { - try { - await this.save(); - } catch {} - } - const promises = []; - promises.push(this.pdfLoadingTask.destroy()); - this.pdfLoadingTask = null; - if (this.pdfDocument) { - this.pdfDocument = null; - this.pdfThumbnailViewer?.setDocument(null); - this.pdfViewer.setDocument(null); - this.pdfLinkService.setDocument(null); - this.pdfDocumentProperties?.setDocument(null); - } - this.pdfLinkService.externalLinkEnabled = true; - this.store = null; - this.isInitialViewSet = false; - this.downloadComplete = false; - this.url = ""; - this.baseUrl = ""; - this._downloadUrl = ""; - this.documentInfo = null; - this.metadata = null; - this._contentDispositionFilename = null; - this._contentLength = null; - this._saveInProgress = false; - this._hasAnnotationEditors = false; - promises.push(this.pdfScriptingManager.destroyPromise, this.passwordPrompt.close()); - this.setTitle(); - this.pdfSidebar?.reset(); - this.pdfOutlineViewer?.reset(); - this.pdfAttachmentViewer?.reset(); - this.pdfLayerViewer?.reset(); - this.pdfHistory?.reset(); - this.findBar?.reset(); - this.toolbar?.reset(); - this.secondaryToolbar?.reset(); - this._PDFBug?.cleanup(); - await Promise.all(promises); - }, - async open(args) { - if (this.pdfLoadingTask) { - await this.close(); - } - const workerParams = _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.getAll(_app_options_js__WEBPACK_IMPORTED_MODULE_2__.OptionKind.WORKER); - Object.assign(pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.GlobalWorkerOptions, workerParams); - if (args.url) { - this.setTitleUsingUrl(args.originalUrl || args.url, args.url); - } - const apiParams = _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.getAll(_app_options_js__WEBPACK_IMPORTED_MODULE_2__.OptionKind.API); - const loadingTask = (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.getDocument)({ - ...apiParams, - ...args - }); - this.pdfLoadingTask = loadingTask; - loadingTask.onPassword = (updateCallback, reason) => { - if (this.isViewerEmbedded) { - this._unblockDocumentLoadEvent(); - } - this.pdfLinkService.externalLinkEnabled = false; - this.passwordPrompt.setUpdateCallback(updateCallback, reason); - this.passwordPrompt.open(); - }; - loadingTask.onProgress = ({ - loaded, - total - }) => { - this.progress(loaded / total); - }; - return loadingTask.promise.then(pdfDocument => { - this.load(pdfDocument); - }, reason => { - if (loadingTask !== this.pdfLoadingTask) { - return undefined; - } - let key = "pdfjs-loading-error"; - if (reason instanceof pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.InvalidPDFException) { - key = "pdfjs-invalid-file-error"; - } else if (reason instanceof pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.MissingPDFException) { - key = "pdfjs-missing-file-error"; - } else if (reason instanceof pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.UnexpectedResponseException) { - key = "pdfjs-unexpected-response-error"; - } - return this._documentError(key, { - message: reason.message - }).then(() => { - throw reason; - }); - }); - }, - _ensureDownloadComplete() { - if (this.pdfDocument && this.downloadComplete) { - return; - } - throw new Error("PDF document not downloaded."); - }, - async download(options = {}) { - const url = this._downloadUrl, - filename = this._docFilename; - try { - this._ensureDownloadComplete(); - const data = await this.pdfDocument.getData(); - const blob = new Blob([data], { - type: "application/pdf" - }); - await this.downloadManager.download(blob, url, filename, options); - } catch { - await this.downloadManager.downloadUrl(url, filename, options); - } - }, - async save(options = {}) { - if (this._saveInProgress) { - return; - } - this._saveInProgress = true; - await this.pdfScriptingManager.dispatchWillSave(); - const url = this._downloadUrl, - filename = this._docFilename; - try { - this._ensureDownloadComplete(); - const data = await this.pdfDocument.saveDocument(); - const blob = new Blob([data], { - type: "application/pdf" - }); - await this.downloadManager.download(blob, url, filename, options); - } catch (reason) { - console.error(`Error when saving the document: ${reason.message}`); - await this.download(options); - } finally { - await this.pdfScriptingManager.dispatchDidSave(); - this._saveInProgress = false; - } - if (this._hasAnnotationEditors) { - this.externalServices.reportTelemetry({ - type: "editing", - data: { - type: "save", - stats: this.pdfDocument?.annotationStorage.editorStats - } - }); - } - }, - downloadOrSave(options = {}) { - if (this.pdfDocument?.annotationStorage.size > 0) { - this.save(options); - } else { - this.download(options); - } - }, - async _documentError(key, moreInfo = null) { - this._unblockDocumentLoadEvent(); - const message = await this._otherError(key || "pdfjs-loading-error", moreInfo); - this.eventBus.dispatch("documenterror", { - source: this, - message, - reason: moreInfo?.message ?? null - }); - }, - async _otherError(key, moreInfo = null) { - const message = await this.l10n.get(key); - const moreInfoText = [`PDF.js v${pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.version || "?"} (build: ${pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.build || "?"})`]; - if (moreInfo) { - moreInfoText.push(`Message: ${moreInfo.message}`); - if (moreInfo.stack) { - moreInfoText.push(`Stack: ${moreInfo.stack}`); - } else { - if (moreInfo.filename) { - moreInfoText.push(`File: ${moreInfo.filename}`); - } - if (moreInfo.lineNumber) { - moreInfoText.push(`Line: ${moreInfo.lineNumber}`); - } - } - } - console.error(`${message}\n\n${moreInfoText.join("\n")}`); - return message; - }, - progress(level) { - if (!this.loadingBar || this.downloadComplete) { - return; - } - const percent = Math.round(level * 100); - if (percent <= this.loadingBar.percent) { - return; - } - this.loadingBar.percent = percent; - if (this.pdfDocument?.loadingParams.disableAutoFetch ?? _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("disableAutoFetch")) { - this.loadingBar.setDisableAutoFetch(); - } - }, - load(pdfDocument) { - this.pdfDocument = pdfDocument; - pdfDocument.getDownloadInfo().then(({ - length - }) => { - this._contentLength = length; - this.downloadComplete = true; - this.loadingBar?.hide(); - firstPagePromise.then(() => { - this.eventBus.dispatch("documentloaded", { - source: this - }); - }); - }); - const pageLayoutPromise = pdfDocument.getPageLayout().catch(() => {}); - const pageModePromise = pdfDocument.getPageMode().catch(() => {}); - const openActionPromise = pdfDocument.getOpenAction().catch(() => {}); - this.toolbar?.setPagesCount(pdfDocument.numPages, false); - this.secondaryToolbar?.setPagesCount(pdfDocument.numPages); - this.pdfLinkService.setDocument(pdfDocument); - this.pdfDocumentProperties?.setDocument(pdfDocument); - const pdfViewer = this.pdfViewer; - pdfViewer.setDocument(pdfDocument); - const { - firstPagePromise, - onePageRendered, - pagesPromise - } = pdfViewer; - this.pdfThumbnailViewer?.setDocument(pdfDocument); - const storedPromise = (this.store = new _view_history_js__WEBPACK_IMPORTED_MODULE_29__.ViewHistory(pdfDocument.fingerprints[0])).getMultiple({ - page: null, - zoom: _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_SCALE_VALUE, - scrollLeft: "0", - scrollTop: "0", - rotation: null, - sidebarView: _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.UNKNOWN, - scrollMode: _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.ScrollMode.UNKNOWN, - spreadMode: _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SpreadMode.UNKNOWN - }).catch(() => {}); - firstPagePromise.then(pdfPage => { - this.loadingBar?.setWidth(this.appConfig.viewerContainer); - this._initializeAnnotationStorageCallbacks(pdfDocument); - Promise.all([_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.animationStarted, storedPromise, pageLayoutPromise, pageModePromise, openActionPromise]).then(async ([timeStamp, stored, pageLayout, pageMode, openAction]) => { - const viewOnLoad = _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("viewOnLoad"); - this._initializePdfHistory({ - fingerprint: pdfDocument.fingerprints[0], - viewOnLoad, - initialDest: openAction?.dest - }); - const initialBookmark = this.initialBookmark; - const zoom = _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("defaultZoomValue"); - let hash = zoom ? `zoom=${zoom}` : null; - let rotation = null; - let sidebarView = _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("sidebarViewOnLoad"); - let scrollMode = _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("scrollModeOnLoad"); - let spreadMode = _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("spreadModeOnLoad"); - if (stored?.page && viewOnLoad !== ViewOnLoad.INITIAL) { - hash = `page=${stored.page}&zoom=${zoom || stored.zoom},` + `${stored.scrollLeft},${stored.scrollTop}`; - rotation = parseInt(stored.rotation, 10); - if (sidebarView === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.UNKNOWN) { - sidebarView = stored.sidebarView | 0; - } - if (scrollMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.ScrollMode.UNKNOWN) { - scrollMode = stored.scrollMode | 0; - } - if (spreadMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SpreadMode.UNKNOWN) { - spreadMode = stored.spreadMode | 0; - } - } - if (pageMode && sidebarView === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.UNKNOWN) { - sidebarView = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.apiPageModeToSidebarView)(pageMode); - } - if (pageLayout && scrollMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.ScrollMode.UNKNOWN && spreadMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SpreadMode.UNKNOWN) { - const modes = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.apiPageLayoutToViewerModes)(pageLayout); - spreadMode = modes.spreadMode; - } - this.setInitialView(hash, { - rotation, - sidebarView, - scrollMode, - spreadMode - }); - this.eventBus.dispatch("documentinit", { - source: this - }); - if (!this.isViewerEmbedded) { - pdfViewer.focus(); - } - await Promise.race([pagesPromise, new Promise(resolve => { - setTimeout(resolve, FORCE_PAGES_LOADED_TIMEOUT); - })]); - if (!initialBookmark && !hash) { - return; - } - if (pdfViewer.hasEqualPageSizes) { - return; - } - this.initialBookmark = initialBookmark; - pdfViewer.currentScaleValue = pdfViewer.currentScaleValue; - this.setInitialView(hash); - }).catch(() => { - this.setInitialView(); - }).then(function () { - pdfViewer.update(); - }); - }); - pagesPromise.then(() => { - this._unblockDocumentLoadEvent(); - this._initializeAutoPrint(pdfDocument, openActionPromise); - }, reason => { - this._documentError("pdfjs-loading-error", { - message: reason.message - }); - }); - onePageRendered.then(data => { - this.externalServices.reportTelemetry({ - type: "pageInfo", - timestamp: data.timestamp - }); - if (this.pdfOutlineViewer) { - pdfDocument.getOutline().then(outline => { - if (pdfDocument !== this.pdfDocument) { - return; - } - this.pdfOutlineViewer.render({ - outline, - pdfDocument - }); - }); - } - if (this.pdfAttachmentViewer) { - pdfDocument.getAttachments().then(attachments => { - if (pdfDocument !== this.pdfDocument) { - return; - } - this.pdfAttachmentViewer.render({ - attachments - }); - }); - } - if (this.pdfLayerViewer) { - pdfViewer.optionalContentConfigPromise.then(optionalContentConfig => { - if (pdfDocument !== this.pdfDocument) { - return; - } - this.pdfLayerViewer.render({ - optionalContentConfig, - pdfDocument - }); - }); - } - }); - this._initializePageLabels(pdfDocument); - this._initializeMetadata(pdfDocument); - }, - async _scriptingDocProperties(pdfDocument) { - if (!this.documentInfo) { - await new Promise(resolve => { - this.eventBus._on("metadataloaded", resolve, { - once: true - }); - }); - if (pdfDocument !== this.pdfDocument) { - return null; - } - } - if (!this._contentLength) { - await new Promise(resolve => { - this.eventBus._on("documentloaded", resolve, { - once: true - }); - }); - if (pdfDocument !== this.pdfDocument) { - return null; - } - } - return { - ...this.documentInfo, - baseURL: this.baseUrl, - filesize: this._contentLength, - filename: this._docFilename, - metadata: this.metadata?.getRaw(), - authors: this.metadata?.get("dc:creator"), - numPages: this.pagesCount, - URL: this.url - }; - }, - async _initializeAutoPrint(pdfDocument, openActionPromise) { - const [openAction, jsActions] = await Promise.all([openActionPromise, this.pdfViewer.enableScripting ? null : pdfDocument.getJSActions()]); - if (pdfDocument !== this.pdfDocument) { +;// ./web/caret_browsing.js +const PRECISION = 1e-1; +class CaretBrowsingMode { + #mainContainer; + #toolBarHeight = 0; + #viewerContainer; + constructor(abortSignal, mainContainer, viewerContainer, toolbarContainer) { + this.#mainContainer = mainContainer; + this.#viewerContainer = viewerContainer; + if (!toolbarContainer) { return; } - let triggerAutoPrint = openAction?.action === "Print"; - if (jsActions) { - console.warn("Warning: JavaScript support is not enabled"); - for (const name in jsActions) { - if (triggerAutoPrint) { + this.#toolBarHeight = toolbarContainer.getBoundingClientRect().height; + const toolbarObserver = new ResizeObserver(entries => { + for (const entry of entries) { + if (entry.target === toolbarContainer) { + this.#toolBarHeight = Math.floor(entry.borderBoxSize[0].blockSize); break; } - switch (name) { - case "WillClose": - case "WillSave": - case "DidSave": - case "WillPrint": - case "DidPrint": - continue; - } - triggerAutoPrint = jsActions[name].some(js => _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.AutoPrintRegExp.test(js)); - } - } - if (triggerAutoPrint) { - this.triggerPrinting(); - } - }, - async _initializeMetadata(pdfDocument) { - const { - info, - metadata, - contentDispositionFilename, - contentLength - } = await pdfDocument.getMetadata(); - if (pdfDocument !== this.pdfDocument) { - return; - } - this.documentInfo = info; - this.metadata = metadata; - this._contentDispositionFilename ??= contentDispositionFilename; - this._contentLength ??= contentLength; - console.log(`PDF ${pdfDocument.fingerprints[0]} [${info.PDFFormatVersion} ` + `${(info.Producer || "-").trim()} / ${(info.Creator || "-").trim()}] ` + `(PDF.js: ${pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.version || "?"} [${pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.build || "?"}])`); - let pdfTitle = info.Title; - const metadataTitle = metadata?.get("dc:title"); - if (metadataTitle) { - if (metadataTitle !== "Untitled" && !/[\uFFF0-\uFFFF]/g.test(metadataTitle)) { - pdfTitle = metadataTitle; - } - } - if (pdfTitle) { - this.setTitle(`${pdfTitle} - ${this._contentDispositionFilename || this._title}`); - } else if (this._contentDispositionFilename) { - this.setTitle(this._contentDispositionFilename); - } - if (info.IsXFAPresent && !info.IsAcroFormPresent && !pdfDocument.isPureXfa) { - if (pdfDocument.loadingParams.enableXfa) { - console.warn("Warning: XFA Foreground documents are not supported"); - } else { - console.warn("Warning: XFA support is not enabled"); - } - } else if ((info.IsAcroFormPresent || info.IsXFAPresent) && !this.pdfViewer.renderForms) { - console.warn("Warning: Interactive form support is not enabled"); - } - if (info.IsSignaturesPresent) { - console.warn("Warning: Digital signatures validation is not supported"); - } - this.eventBus.dispatch("metadataloaded", { - source: this - }); - }, - async _initializePageLabels(pdfDocument) { - const labels = await pdfDocument.getPageLabels(); - if (pdfDocument !== this.pdfDocument) { - return; - } - if (!labels || _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("disablePageLabels")) { - return; - } - const numLabels = labels.length; - let standardLabels = 0, - emptyLabels = 0; - for (let i = 0; i < numLabels; i++) { - const label = labels[i]; - if (label === (i + 1).toString()) { - standardLabels++; - } else if (label === "") { - emptyLabels++; - } else { - break; - } - } - if (standardLabels >= numLabels || emptyLabels >= numLabels) { - return; - } - const { - pdfViewer, - pdfThumbnailViewer, - toolbar - } = this; - pdfViewer.setPageLabels(labels); - pdfThumbnailViewer?.setPageLabels(labels); - toolbar?.setPagesCount(numLabels, true); - toolbar?.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel); - }, - _initializePdfHistory({ - fingerprint, - viewOnLoad, - initialDest = null - }) { - if (!this.pdfHistory) { - return; - } - this.pdfHistory.initialize({ - fingerprint, - resetHistory: viewOnLoad === ViewOnLoad.INITIAL, - updateUrl: _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("historyUpdateUrl") - }); - if (this.pdfHistory.initialBookmark) { - this.initialBookmark = this.pdfHistory.initialBookmark; - this.initialRotation = this.pdfHistory.initialRotation; - } - if (initialDest && !this.initialBookmark && viewOnLoad === ViewOnLoad.UNKNOWN) { - this.initialBookmark = JSON.stringify(initialDest); - this.pdfHistory.push({ - explicitDest: initialDest, - pageNumber: null - }); - } - }, - _initializeAnnotationStorageCallbacks(pdfDocument) { - if (pdfDocument !== this.pdfDocument) { - return; - } - const { - annotationStorage - } = pdfDocument; - annotationStorage.onSetModified = () => { - window.addEventListener("beforeunload", beforeUnload); - this._annotationStorageModified = true; - }; - annotationStorage.onResetModified = () => { - window.removeEventListener("beforeunload", beforeUnload); - delete this._annotationStorageModified; - }; - annotationStorage.onAnnotationEditor = typeStr => { - this._hasAnnotationEditors = !!typeStr; - this.setTitle(); - }; - }, - setInitialView(storedHash, { - rotation, - sidebarView, - scrollMode, - spreadMode - } = {}) { - const setRotation = angle => { - if ((0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.isValidRotation)(angle)) { - this.pdfViewer.pagesRotation = angle; - } - }; - const setViewerModes = (scroll, spread) => { - if ((0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.isValidScrollMode)(scroll)) { - this.pdfViewer.scrollMode = scroll; - } - if ((0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.isValidSpreadMode)(spread)) { - this.pdfViewer.spreadMode = spread; - } - }; - this.isInitialViewSet = true; - this.pdfSidebar?.setInitialView(sidebarView); - setViewerModes(scrollMode, spreadMode); - if (this.initialBookmark) { - setRotation(this.initialRotation); - delete this.initialRotation; - this.pdfLinkService.setHash(this.initialBookmark); - this.initialBookmark = null; - } else if (storedHash) { - setRotation(rotation); - this.pdfLinkService.setHash(storedHash); - } - this.toolbar?.setPageNumber(this.pdfViewer.currentPageNumber, this.pdfViewer.currentPageLabel); - this.secondaryToolbar?.setPageNumber(this.pdfViewer.currentPageNumber); - if (!this.pdfViewer.currentScaleValue) { - this.pdfViewer.currentScaleValue = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_SCALE_VALUE; - } - }, - _cleanup() { - if (!this.pdfDocument) { - return; - } - this.pdfViewer.cleanup(); - this.pdfThumbnailViewer?.cleanup(); - this.pdfDocument.cleanup(_app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("fontExtraProperties")); - }, - forceRendering() { - this.pdfRenderingQueue.printing = !!this.printService; - this.pdfRenderingQueue.isThumbnailViewEnabled = this.pdfSidebar?.visibleView === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.THUMBS; - this.pdfRenderingQueue.renderHighestPriority(); - }, - beforePrint() { - this._printAnnotationStoragePromise = this.pdfScriptingManager.dispatchWillPrint().catch(() => {}).then(() => this.pdfDocument?.annotationStorage.print); - if (this.printService) { - return; - } - if (!this.supportsPrinting) { - this._otherError("pdfjs-printing-not-supported"); - return; - } - if (!this.pdfViewer.pageViewsReady) { - this.l10n.get("pdfjs-printing-not-ready").then(msg => { - window.alert(msg); - }); - return; - } - this.printService = web_print_service__WEBPACK_IMPORTED_MODULE_19__.PDFPrintServiceFactory.createPrintService({ - pdfDocument: this.pdfDocument, - pagesOverview: this.pdfViewer.getPagesOverview(), - printContainer: this.appConfig.printContainer, - printResolution: _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("printResolution"), - printAnnotationStoragePromise: this._printAnnotationStoragePromise - }); - this.forceRendering(); - this.setTitle(); - this.printService.layout(); - if (this._hasAnnotationEditors) { - this.externalServices.reportTelemetry({ - type: "editing", - data: { - type: "print", - stats: this.pdfDocument?.annotationStorage.editorStats - } - }); - } - }, - afterPrint() { - if (this._printAnnotationStoragePromise) { - this._printAnnotationStoragePromise.then(() => { - this.pdfScriptingManager.dispatchDidPrint(); - }); - this._printAnnotationStoragePromise = null; - } - if (this.printService) { - this.printService.destroy(); - this.printService = null; - this.pdfDocument?.annotationStorage.resetModified(); - } - this.forceRendering(); - this.setTitle(); - }, - rotatePages(delta) { - this.pdfViewer.pagesRotation += delta; - }, - requestPresentationMode() { - this.pdfPresentationMode?.request(); - }, - triggerPrinting() { - if (!this.supportsPrinting) { - return; - } - window.print(); - }, - bindEvents() { - const { - eventBus, - _boundEvents - } = this; - _boundEvents.beforePrint = this.beforePrint.bind(this); - _boundEvents.afterPrint = this.afterPrint.bind(this); - eventBus._on("resize", webViewerResize); - eventBus._on("hashchange", webViewerHashchange); - eventBus._on("beforeprint", _boundEvents.beforePrint); - eventBus._on("afterprint", _boundEvents.afterPrint); - eventBus._on("pagerender", webViewerPageRender); - eventBus._on("pagerendered", webViewerPageRendered); - eventBus._on("updateviewarea", webViewerUpdateViewarea); - eventBus._on("pagechanging", webViewerPageChanging); - eventBus._on("scalechanging", webViewerScaleChanging); - eventBus._on("rotationchanging", webViewerRotationChanging); - eventBus._on("sidebarviewchanged", webViewerSidebarViewChanged); - eventBus._on("pagemode", webViewerPageMode); - eventBus._on("namedaction", webViewerNamedAction); - eventBus._on("presentationmodechanged", webViewerPresentationModeChanged); - eventBus._on("presentationmode", webViewerPresentationMode); - eventBus._on("switchannotationeditormode", webViewerSwitchAnnotationEditorMode); - eventBus._on("switchannotationeditorparams", webViewerSwitchAnnotationEditorParams); - eventBus._on("print", webViewerPrint); - eventBus._on("download", webViewerDownload); - eventBus._on("firstpage", webViewerFirstPage); - eventBus._on("lastpage", webViewerLastPage); - eventBus._on("nextpage", webViewerNextPage); - eventBus._on("previouspage", webViewerPreviousPage); - eventBus._on("zoomin", webViewerZoomIn); - eventBus._on("zoomout", webViewerZoomOut); - eventBus._on("zoomreset", webViewerZoomReset); - eventBus._on("pagenumberchanged", webViewerPageNumberChanged); - eventBus._on("scalechanged", webViewerScaleChanged); - eventBus._on("rotatecw", webViewerRotateCw); - eventBus._on("rotateccw", webViewerRotateCcw); - eventBus._on("optionalcontentconfig", webViewerOptionalContentConfig); - eventBus._on("switchscrollmode", webViewerSwitchScrollMode); - eventBus._on("scrollmodechanged", webViewerScrollModeChanged); - eventBus._on("switchspreadmode", webViewerSwitchSpreadMode); - eventBus._on("spreadmodechanged", webViewerSpreadModeChanged); - eventBus._on("documentproperties", webViewerDocumentProperties); - eventBus._on("findfromurlhash", webViewerFindFromUrlHash); - eventBus._on("updatefindmatchescount", webViewerUpdateFindMatchesCount); - eventBus._on("updatefindcontrolstate", webViewerUpdateFindControlState); - if (_app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("pdfBug")) { - _boundEvents.reportPageStatsPDFBug = reportPageStatsPDFBug; - eventBus._on("pagerendered", _boundEvents.reportPageStatsPDFBug); - eventBus._on("pagechanging", _boundEvents.reportPageStatsPDFBug); - } - eventBus._on("fileinputchange", webViewerFileInputChange); - eventBus._on("openfile", webViewerOpenFile); - }, - bindWindowEvents() { - const { - eventBus, - _boundEvents, - appConfig: { - mainContainer - } - } = this; - function addWindowResolutionChange(evt = null) { - if (evt) { - webViewerResolutionChange(evt); - } - const mediaQueryList = window.matchMedia(`(resolution: ${window.devicePixelRatio || 1}dppx)`); - mediaQueryList.addEventListener("change", addWindowResolutionChange, { - once: true - }); - _boundEvents.removeWindowResolutionChange ||= function () { - mediaQueryList.removeEventListener("change", addWindowResolutionChange); - _boundEvents.removeWindowResolutionChange = null; - }; - } - addWindowResolutionChange(); - _boundEvents.windowResize = () => { - eventBus.dispatch("resize", { - source: window - }); - }; - _boundEvents.windowHashChange = () => { - eventBus.dispatch("hashchange", { - source: window, - hash: document.location.hash.substring(1) - }); - }; - _boundEvents.windowBeforePrint = () => { - eventBus.dispatch("beforeprint", { - source: window - }); - }; - _boundEvents.windowAfterPrint = () => { - eventBus.dispatch("afterprint", { - source: window - }); - }; - _boundEvents.windowUpdateFromSandbox = event => { - eventBus.dispatch("updatefromsandbox", { - source: window, - detail: event.detail - }); - }; - window.addEventListener("visibilitychange", webViewerVisibilityChange); - window.addEventListener("wheel", webViewerWheel, { - passive: false - }); - window.addEventListener("touchstart", webViewerTouchStart, { - passive: false - }); - window.addEventListener("touchmove", webViewerTouchMove, { - passive: false - }); - window.addEventListener("touchend", webViewerTouchEnd, { - passive: false - }); - window.addEventListener("click", webViewerClick); - window.addEventListener("keydown", webViewerKeyDown); - window.addEventListener("keyup", webViewerKeyUp); - window.addEventListener("resize", _boundEvents.windowResize); - window.addEventListener("hashchange", _boundEvents.windowHashChange); - window.addEventListener("beforeprint", _boundEvents.windowBeforePrint); - window.addEventListener("afterprint", _boundEvents.windowAfterPrint); - window.addEventListener("updatefromsandbox", _boundEvents.windowUpdateFromSandbox); - if (!("onscrollend" in document.documentElement)) { - return; - } - ({ - scrollTop: this._lastScrollTop, - scrollLeft: this._lastScrollLeft - } = mainContainer); - const scrollend = _boundEvents.mainContainerScrollend = () => { - ({ - scrollTop: this._lastScrollTop, - scrollLeft: this._lastScrollLeft - } = mainContainer); - this._isScrolling = false; - mainContainer.addEventListener("scroll", scroll, { - passive: true - }); - mainContainer.removeEventListener("scrollend", scrollend); - mainContainer.removeEventListener("blur", scrollend); - }; - const scroll = _boundEvents.mainContainerScroll = () => { - if (this._isCtrlKeyDown || this._lastScrollTop === mainContainer.scrollTop && this._lastScrollLeft === mainContainer.scrollLeft) { - return; - } - mainContainer.removeEventListener("scroll", scroll, { - passive: true - }); - this._isScrolling = true; - mainContainer.addEventListener("scrollend", scrollend); - mainContainer.addEventListener("blur", scrollend); - }; - mainContainer.addEventListener("scroll", scroll, { - passive: true - }); - }, - unbindEvents() { - const { - eventBus, - _boundEvents - } = this; - eventBus._off("resize", webViewerResize); - eventBus._off("hashchange", webViewerHashchange); - eventBus._off("beforeprint", _boundEvents.beforePrint); - eventBus._off("afterprint", _boundEvents.afterPrint); - eventBus._off("pagerender", webViewerPageRender); - eventBus._off("pagerendered", webViewerPageRendered); - eventBus._off("updateviewarea", webViewerUpdateViewarea); - eventBus._off("pagechanging", webViewerPageChanging); - eventBus._off("scalechanging", webViewerScaleChanging); - eventBus._off("rotationchanging", webViewerRotationChanging); - eventBus._off("sidebarviewchanged", webViewerSidebarViewChanged); - eventBus._off("pagemode", webViewerPageMode); - eventBus._off("namedaction", webViewerNamedAction); - eventBus._off("presentationmodechanged", webViewerPresentationModeChanged); - eventBus._off("presentationmode", webViewerPresentationMode); - eventBus._off("print", webViewerPrint); - eventBus._off("download", webViewerDownload); - eventBus._off("firstpage", webViewerFirstPage); - eventBus._off("lastpage", webViewerLastPage); - eventBus._off("nextpage", webViewerNextPage); - eventBus._off("previouspage", webViewerPreviousPage); - eventBus._off("zoomin", webViewerZoomIn); - eventBus._off("zoomout", webViewerZoomOut); - eventBus._off("zoomreset", webViewerZoomReset); - eventBus._off("pagenumberchanged", webViewerPageNumberChanged); - eventBus._off("scalechanged", webViewerScaleChanged); - eventBus._off("rotatecw", webViewerRotateCw); - eventBus._off("rotateccw", webViewerRotateCcw); - eventBus._off("optionalcontentconfig", webViewerOptionalContentConfig); - eventBus._off("switchscrollmode", webViewerSwitchScrollMode); - eventBus._off("scrollmodechanged", webViewerScrollModeChanged); - eventBus._off("switchspreadmode", webViewerSwitchSpreadMode); - eventBus._off("spreadmodechanged", webViewerSpreadModeChanged); - eventBus._off("documentproperties", webViewerDocumentProperties); - eventBus._off("findfromurlhash", webViewerFindFromUrlHash); - eventBus._off("updatefindmatchescount", webViewerUpdateFindMatchesCount); - eventBus._off("updatefindcontrolstate", webViewerUpdateFindControlState); - if (_boundEvents.reportPageStatsPDFBug) { - eventBus._off("pagerendered", _boundEvents.reportPageStatsPDFBug); - eventBus._off("pagechanging", _boundEvents.reportPageStatsPDFBug); - _boundEvents.reportPageStatsPDFBug = null; - } - eventBus._off("fileinputchange", webViewerFileInputChange); - eventBus._off("openfile", webViewerOpenFile); - _boundEvents.beforePrint = null; - _boundEvents.afterPrint = null; - }, - unbindWindowEvents() { - const { - _boundEvents, - appConfig: { - mainContainer - } - } = this; - window.removeEventListener("visibilitychange", webViewerVisibilityChange); - window.removeEventListener("wheel", webViewerWheel, { - passive: false - }); - window.removeEventListener("touchstart", webViewerTouchStart, { - passive: false - }); - window.removeEventListener("touchmove", webViewerTouchMove, { - passive: false - }); - window.removeEventListener("touchend", webViewerTouchEnd, { - passive: false - }); - window.removeEventListener("click", webViewerClick); - window.removeEventListener("keydown", webViewerKeyDown); - window.removeEventListener("keyup", webViewerKeyUp); - window.removeEventListener("resize", _boundEvents.windowResize); - window.removeEventListener("hashchange", _boundEvents.windowHashChange); - window.removeEventListener("beforeprint", _boundEvents.windowBeforePrint); - window.removeEventListener("afterprint", _boundEvents.windowAfterPrint); - window.removeEventListener("updatefromsandbox", _boundEvents.windowUpdateFromSandbox); - mainContainer.removeEventListener("scroll", _boundEvents.mainContainerScroll); - mainContainer.removeEventListener("scrollend", _boundEvents.mainContainerScrollend); - mainContainer.removeEventListener("blur", _boundEvents.mainContainerScrollend); - _boundEvents.removeWindowResolutionChange?.(); - _boundEvents.windowResize = null; - _boundEvents.windowHashChange = null; - _boundEvents.windowBeforePrint = null; - _boundEvents.windowAfterPrint = null; - _boundEvents.windowUpdateFromSandbox = null; - _boundEvents.mainContainerScroll = null; - _boundEvents.mainContainerScrollend = null; - }, - _accumulateTicks(ticks, prop) { - if (this[prop] > 0 && ticks < 0 || this[prop] < 0 && ticks > 0) { - this[prop] = 0; - } - this[prop] += ticks; - const wholeTicks = Math.trunc(this[prop]); - this[prop] -= wholeTicks; - return wholeTicks; - }, - _accumulateFactor(previousScale, factor, prop) { - if (factor === 1) { - return 1; - } - if (this[prop] > 1 && factor < 1 || this[prop] < 1 && factor > 1) { - this[prop] = 1; - } - const newFactor = Math.floor(previousScale * factor * this[prop] * 100) / (100 * previousScale); - this[prop] = factor / newFactor; - return newFactor; - }, - _centerAtPos(previousScale, x, y) { - const { - pdfViewer - } = this; - const scaleDiff = pdfViewer.currentScale / previousScale - 1; - if (scaleDiff !== 0) { - const [top, left] = pdfViewer.containerTopLeft; - pdfViewer.container.scrollLeft += (x - left) * scaleDiff; - pdfViewer.container.scrollTop += (y - top) * scaleDiff; - } - }, - _unblockDocumentLoadEvent() { - document.blockUnblockOnload?.(false); - this._unblockDocumentLoadEvent = () => {}; - }, - get scriptingReady() { - return this.pdfScriptingManager.ready; - } -}; -(0,web_external_services__WEBPACK_IMPORTED_MODULE_4__.initCom)(PDFViewerApplication); -{ - web_print_service__WEBPACK_IMPORTED_MODULE_19__.PDFPrintServiceFactory.initGlobals(PDFViewerApplication); -} -{ - const HOSTED_VIEWER_ORIGINS = ["null", "http://mozilla.github.io", "https://mozilla.github.io"]; - var validateFileURL = function (file) { - if (!file) { - return; - } - try { - const viewerOrigin = new URL(window.location.href).origin || "null"; - if (HOSTED_VIEWER_ORIGINS.includes(viewerOrigin)) { - return; - } - const fileOrigin = new URL(file, window.location.href).origin; - if (fileOrigin !== viewerOrigin) { - throw new Error("file origin does not match viewer's"); - } - } catch (ex) { - PDFViewerApplication._documentError("pdfjs-loading-error", { - message: ex.message - }); - throw ex; - } - }; -} -async function loadFakeWorker() { - pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.GlobalWorkerOptions.workerSrc ||= _app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("workerSrc"); - await import( /*webpackIgnore: true*/pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.PDFWorker.workerSrc); -} -async function loadPDFBug(self) { - const { - PDFBug - } = await import( /*webpackIgnore: true*/_app_options_js__WEBPACK_IMPORTED_MODULE_2__.AppOptions.get("debuggerSrc")); - self._PDFBug = PDFBug; -} -function reportPageStatsPDFBug({ - pageNumber -}) { - if (!globalThis.Stats?.enabled) { - return; - } - const pageView = PDFViewerApplication.pdfViewer.getPageView(pageNumber - 1); - globalThis.Stats.add(pageNumber, pageView?.pdfPage?.stats); -} -function webViewerPageRender({ - pageNumber -}) { - if (pageNumber === PDFViewerApplication.page) { - PDFViewerApplication.toolbar?.updateLoadingIndicatorState(true); - } -} -function webViewerPageRendered({ - pageNumber, - error -}) { - if (pageNumber === PDFViewerApplication.page) { - PDFViewerApplication.toolbar?.updateLoadingIndicatorState(false); - } - if (PDFViewerApplication.pdfSidebar?.visibleView === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.THUMBS) { - const pageView = PDFViewerApplication.pdfViewer.getPageView(pageNumber - 1); - const thumbnailView = PDFViewerApplication.pdfThumbnailViewer?.getThumbnail(pageNumber - 1); - if (pageView) { - thumbnailView?.setImage(pageView); - } - } - if (error) { - PDFViewerApplication._otherError("pdfjs-rendering-error", error); - } -} -function webViewerPageMode({ - mode -}) { - let view; - switch (mode) { - case "thumbs": - view = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.THUMBS; - break; - case "bookmarks": - case "outline": - view = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.OUTLINE; - break; - case "attachments": - view = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.ATTACHMENTS; - break; - case "layers": - view = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.LAYERS; - break; - case "none": - view = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.NONE; - break; - default: - console.error('Invalid "pagemode" hash parameter: ' + mode); - return; - } - PDFViewerApplication.pdfSidebar?.switchView(view, true); -} -function webViewerNamedAction(evt) { - switch (evt.action) { - case "GoToPage": - PDFViewerApplication.appConfig.toolbar?.pageNumber.select(); - break; - case "Find": - if (!PDFViewerApplication.supportsIntegratedFind) { - PDFViewerApplication.findBar?.toggle(); } - break; - case "Print": - PDFViewerApplication.triggerPrinting(); - break; - case "SaveAs": - PDFViewerApplication.downloadOrSave(); - break; - } -} -function webViewerPresentationModeChanged(evt) { - PDFViewerApplication.pdfViewer.presentationModeState = evt.state; -} -function webViewerSidebarViewChanged({ - view -}) { - PDFViewerApplication.pdfRenderingQueue.isThumbnailViewEnabled = view === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.THUMBS; - if (PDFViewerApplication.isInitialViewSet) { - PDFViewerApplication.store?.set("sidebarView", view).catch(() => {}); - } -} -function webViewerUpdateViewarea({ - location -}) { - if (PDFViewerApplication.isInitialViewSet) { - PDFViewerApplication.store?.setMultiple({ - page: location.pageNumber, - zoom: location.scale, - scrollLeft: location.left, - scrollTop: location.top, - rotation: location.rotation - }).catch(() => {}); - } - if (PDFViewerApplication.appConfig.secondaryToolbar) { - const href = PDFViewerApplication.pdfLinkService.getAnchorUrl(location.pdfOpenParams); - PDFViewerApplication.appConfig.secondaryToolbar.viewBookmarkButton.href = href; - } -} -function webViewerScrollModeChanged(evt) { - if (PDFViewerApplication.isInitialViewSet && !PDFViewerApplication.pdfViewer.isInPresentationMode) { - PDFViewerApplication.store?.set("scrollMode", evt.mode).catch(() => {}); - } -} -function webViewerSpreadModeChanged(evt) { - if (PDFViewerApplication.isInitialViewSet && !PDFViewerApplication.pdfViewer.isInPresentationMode) { - PDFViewerApplication.store?.set("spreadMode", evt.mode).catch(() => {}); - } -} -function webViewerResize() { - const { - pdfDocument, - pdfViewer, - pdfRenderingQueue - } = PDFViewerApplication; - if (pdfRenderingQueue.printing && window.matchMedia("print").matches) { - return; - } - if (!pdfDocument) { - return; - } - const currentScaleValue = pdfViewer.currentScaleValue; - if (currentScaleValue === "auto" || currentScaleValue === "page-fit" || currentScaleValue === "page-width") { - pdfViewer.currentScaleValue = currentScaleValue; - } - pdfViewer.update(); -} -function webViewerHashchange(evt) { - const hash = evt.hash; - if (!hash) { - return; - } - if (!PDFViewerApplication.isInitialViewSet) { - PDFViewerApplication.initialBookmark = hash; - } else if (!PDFViewerApplication.pdfHistory?.popStateInProgress) { - PDFViewerApplication.pdfLinkService.setHash(hash); - } -} -{ - var webViewerFileInputChange = function (evt) { - if (PDFViewerApplication.pdfViewer?.isInPresentationMode) { - return; - } - const file = evt.fileInput.files[0]; - PDFViewerApplication.open({ - url: URL.createObjectURL(file), - originalUrl: file.name }); - }; - var webViewerOpenFile = function (evt) { - PDFViewerApplication._openFileInput?.click(); - }; -} -function webViewerPresentationMode() { - PDFViewerApplication.requestPresentationMode(); -} -function webViewerSwitchAnnotationEditorMode(evt) { - PDFViewerApplication.pdfViewer.annotationEditorMode = evt; -} -function webViewerSwitchAnnotationEditorParams(evt) { - PDFViewerApplication.pdfViewer.annotationEditorParams = evt; -} -function webViewerPrint() { - PDFViewerApplication.triggerPrinting(); -} -function webViewerDownload() { - PDFViewerApplication.downloadOrSave(); -} -function webViewerFirstPage() { - PDFViewerApplication.page = 1; -} -function webViewerLastPage() { - PDFViewerApplication.page = PDFViewerApplication.pagesCount; -} -function webViewerNextPage() { - PDFViewerApplication.pdfViewer.nextPage(); -} -function webViewerPreviousPage() { - PDFViewerApplication.pdfViewer.previousPage(); -} -function webViewerZoomIn() { - PDFViewerApplication.zoomIn(); -} -function webViewerZoomOut() { - PDFViewerApplication.zoomOut(); -} -function webViewerZoomReset() { - PDFViewerApplication.zoomReset(); -} -function webViewerPageNumberChanged(evt) { - const pdfViewer = PDFViewerApplication.pdfViewer; - if (evt.value !== "") { - PDFViewerApplication.pdfLinkService.goToPage(evt.value); - } - if (evt.value !== pdfViewer.currentPageNumber.toString() && evt.value !== pdfViewer.currentPageLabel) { - PDFViewerApplication.toolbar?.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel); - } -} -function webViewerScaleChanged(evt) { - PDFViewerApplication.pdfViewer.currentScaleValue = evt.value; -} -function webViewerRotateCw() { - PDFViewerApplication.rotatePages(90); -} -function webViewerRotateCcw() { - PDFViewerApplication.rotatePages(-90); -} -function webViewerOptionalContentConfig(evt) { - PDFViewerApplication.pdfViewer.optionalContentConfigPromise = evt.promise; -} -function webViewerSwitchScrollMode(evt) { - PDFViewerApplication.pdfViewer.scrollMode = evt.mode; -} -function webViewerSwitchSpreadMode(evt) { - PDFViewerApplication.pdfViewer.spreadMode = evt.mode; -} -function webViewerDocumentProperties() { - PDFViewerApplication.pdfDocumentProperties?.open(); -} -function webViewerFindFromUrlHash(evt) { - PDFViewerApplication.eventBus.dispatch("find", { - source: evt.source, - type: "", - query: evt.query, - caseSensitive: false, - entireWord: false, - highlightAll: true, - findPrevious: false, - matchDiacritics: true - }); -} -function webViewerUpdateFindMatchesCount({ - matchesCount -}) { - if (PDFViewerApplication.supportsIntegratedFind) { - PDFViewerApplication.externalServices.updateFindMatchesCount(matchesCount); - } else { - PDFViewerApplication.findBar?.updateResultsCount(matchesCount); - } -} -function webViewerUpdateFindControlState({ - state, - previous, - matchesCount, - rawQuery -}) { - if (PDFViewerApplication.supportsIntegratedFind) { - PDFViewerApplication.externalServices.updateFindControlState({ - result: state, - findPrevious: previous, - matchesCount, - rawQuery + toolbarObserver.observe(toolbarContainer); + abortSignal.addEventListener("abort", () => toolbarObserver.disconnect(), { + once: true }); - } else { - PDFViewerApplication.findBar?.updateUIState(state, previous, matchesCount); - } -} -function webViewerScaleChanging(evt) { - PDFViewerApplication.toolbar?.setPageScale(evt.presetValue, evt.scale); - PDFViewerApplication.pdfViewer.update(); -} -function webViewerRotationChanging(evt) { - if (PDFViewerApplication.pdfThumbnailViewer) { - PDFViewerApplication.pdfThumbnailViewer.pagesRotation = evt.pagesRotation; - } - PDFViewerApplication.forceRendering(); - PDFViewerApplication.pdfViewer.currentPageNumber = evt.pageNumber; -} -function webViewerPageChanging({ - pageNumber, - pageLabel -}) { - PDFViewerApplication.toolbar?.setPageNumber(pageNumber, pageLabel); - PDFViewerApplication.secondaryToolbar?.setPageNumber(pageNumber); - if (PDFViewerApplication.pdfSidebar?.visibleView === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.THUMBS) { - PDFViewerApplication.pdfThumbnailViewer?.scrollThumbnailIntoView(pageNumber); - } - const currentPage = PDFViewerApplication.pdfViewer.getPageView(pageNumber - 1); - PDFViewerApplication.toolbar?.updateLoadingIndicatorState(currentPage?.renderingState === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.RenderingStates.RUNNING); -} -function webViewerResolutionChange(evt) { - PDFViewerApplication.pdfViewer.refresh(); -} -function webViewerVisibilityChange(evt) { - if (document.visibilityState === "visible") { - setZoomDisabledTimeout(); - } -} -let zoomDisabledTimeout = null; -function setZoomDisabledTimeout() { - if (zoomDisabledTimeout) { - clearTimeout(zoomDisabledTimeout); - } - zoomDisabledTimeout = setTimeout(function () { - zoomDisabledTimeout = null; - }, WHEEL_ZOOM_DISABLED_TIMEOUT); -} -function webViewerWheel(evt) { - const { - pdfViewer, - supportsMouseWheelZoomCtrlKey, - supportsMouseWheelZoomMetaKey, - supportsPinchToZoom - } = PDFViewerApplication; - if (pdfViewer.isInPresentationMode) { - return; - } - const deltaMode = evt.deltaMode; - let scaleFactor = Math.exp(-evt.deltaY / 100); - const isBuiltInMac = false; - const isPinchToZoom = evt.ctrlKey && !PDFViewerApplication._isCtrlKeyDown && deltaMode === WheelEvent.DOM_DELTA_PIXEL && evt.deltaX === 0 && (Math.abs(scaleFactor - 1) < 0.05 || isBuiltInMac) && evt.deltaZ === 0; - if (isPinchToZoom || evt.ctrlKey && supportsMouseWheelZoomCtrlKey || evt.metaKey && supportsMouseWheelZoomMetaKey) { - evt.preventDefault(); - if (PDFViewerApplication._isScrolling || zoomDisabledTimeout || document.visibilityState === "hidden" || PDFViewerApplication.overlayManager.active) { - return; - } - const previousScale = pdfViewer.currentScale; - if (isPinchToZoom && supportsPinchToZoom) { - scaleFactor = PDFViewerApplication._accumulateFactor(previousScale, scaleFactor, "_wheelUnusedFactor"); - if (scaleFactor < 1) { - PDFViewerApplication.zoomOut(null, scaleFactor); - } else if (scaleFactor > 1) { - PDFViewerApplication.zoomIn(null, scaleFactor); - } else { - return; - } - } else { - const delta = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.normalizeWheelEventDirection)(evt); - let ticks = 0; - if (deltaMode === WheelEvent.DOM_DELTA_LINE || deltaMode === WheelEvent.DOM_DELTA_PAGE) { - if (Math.abs(delta) >= 1) { - ticks = Math.sign(delta); - } else { - ticks = PDFViewerApplication._accumulateTicks(delta, "_wheelUnusedTicks"); - } - } else { - const PIXELS_PER_LINE_SCALE = 30; - ticks = PDFViewerApplication._accumulateTicks(delta / PIXELS_PER_LINE_SCALE, "_wheelUnusedTicks"); - } - if (ticks < 0) { - PDFViewerApplication.zoomOut(-ticks); - } else if (ticks > 0) { - PDFViewerApplication.zoomIn(ticks); - } else { - return; - } - } - PDFViewerApplication._centerAtPos(previousScale, evt.clientX, evt.clientY); - } -} -function webViewerTouchStart(evt) { - if (PDFViewerApplication.pdfViewer.isInPresentationMode || evt.touches.length < 2) { - return; - } - evt.preventDefault(); - if (evt.touches.length !== 2 || PDFViewerApplication.overlayManager.active) { - PDFViewerApplication._touchInfo = null; - return; - } - let [touch0, touch1] = evt.touches; - if (touch0.identifier > touch1.identifier) { - [touch0, touch1] = [touch1, touch0]; - } - PDFViewerApplication._touchInfo = { - touch0X: touch0.pageX, - touch0Y: touch0.pageY, - touch1X: touch1.pageX, - touch1Y: touch1.pageY - }; -} -function webViewerTouchMove(evt) { - if (!PDFViewerApplication._touchInfo || evt.touches.length !== 2) { - return; - } - const { - pdfViewer, - _touchInfo, - supportsPinchToZoom - } = PDFViewerApplication; - let [touch0, touch1] = evt.touches; - if (touch0.identifier > touch1.identifier) { - [touch0, touch1] = [touch1, touch0]; - } - const { - pageX: page0X, - pageY: page0Y - } = touch0; - const { - pageX: page1X, - pageY: page1Y - } = touch1; - const { - touch0X: pTouch0X, - touch0Y: pTouch0Y, - touch1X: pTouch1X, - touch1Y: pTouch1Y - } = _touchInfo; - if (Math.abs(pTouch0X - page0X) <= 1 && Math.abs(pTouch0Y - page0Y) <= 1 && Math.abs(pTouch1X - page1X) <= 1 && Math.abs(pTouch1Y - page1Y) <= 1) { - return; - } - _touchInfo.touch0X = page0X; - _touchInfo.touch0Y = page0Y; - _touchInfo.touch1X = page1X; - _touchInfo.touch1Y = page1Y; - if (pTouch0X === page0X && pTouch0Y === page0Y) { - const v1X = pTouch1X - page0X; - const v1Y = pTouch1Y - page0Y; - const v2X = page1X - page0X; - const v2Y = page1Y - page0Y; - const det = v1X * v2Y - v1Y * v2X; - if (Math.abs(det) > 0.02 * Math.hypot(v1X, v1Y) * Math.hypot(v2X, v2Y)) { - return; - } - } else if (pTouch1X === page1X && pTouch1Y === page1Y) { - const v1X = pTouch0X - page1X; - const v1Y = pTouch0Y - page1Y; - const v2X = page0X - page1X; - const v2Y = page0Y - page1Y; - const det = v1X * v2Y - v1Y * v2X; - if (Math.abs(det) > 0.02 * Math.hypot(v1X, v1Y) * Math.hypot(v2X, v2Y)) { - return; - } - } else { - const diff0X = page0X - pTouch0X; - const diff1X = page1X - pTouch1X; - const diff0Y = page0Y - pTouch0Y; - const diff1Y = page1Y - pTouch1Y; - const dotProduct = diff0X * diff1X + diff0Y * diff1Y; - if (dotProduct >= 0) { - return; - } - } - evt.preventDefault(); - const distance = Math.hypot(page0X - page1X, page0Y - page1Y) || 1; - const pDistance = Math.hypot(pTouch0X - pTouch1X, pTouch0Y - pTouch1Y) || 1; - const previousScale = pdfViewer.currentScale; - if (supportsPinchToZoom) { - const newScaleFactor = PDFViewerApplication._accumulateFactor(previousScale, distance / pDistance, "_touchUnusedFactor"); - if (newScaleFactor < 1) { - PDFViewerApplication.zoomOut(null, newScaleFactor); - } else if (newScaleFactor > 1) { - PDFViewerApplication.zoomIn(null, newScaleFactor); - } else { - return; - } - } else { - const PIXELS_PER_LINE_SCALE = 30; - const ticks = PDFViewerApplication._accumulateTicks((distance - pDistance) / PIXELS_PER_LINE_SCALE, "_touchUnusedTicks"); - if (ticks < 0) { - PDFViewerApplication.zoomOut(-ticks); - } else if (ticks > 0) { - PDFViewerApplication.zoomIn(ticks); - } else { - return; - } - } - PDFViewerApplication._centerAtPos(previousScale, (page0X + page1X) / 2, (page0Y + page1Y) / 2); -} -function webViewerTouchEnd(evt) { - if (!PDFViewerApplication._touchInfo) { - return; - } - evt.preventDefault(); - PDFViewerApplication._touchInfo = null; - PDFViewerApplication._touchUnusedTicks = 0; - PDFViewerApplication._touchUnusedFactor = 1; -} -function webViewerClick(evt) { - if (!PDFViewerApplication.secondaryToolbar?.isOpen) { - return; - } - const appConfig = PDFViewerApplication.appConfig; - if (PDFViewerApplication.pdfViewer.containsElement(evt.target) || appConfig.toolbar?.container.contains(evt.target) && evt.target !== appConfig.secondaryToolbar?.toggleButton) { - PDFViewerApplication.secondaryToolbar.close(); - } -} -function webViewerKeyUp(evt) { - if (evt.key === "Control") { - PDFViewerApplication._isCtrlKeyDown = false; - } -} -function webViewerKeyDown(evt) { - PDFViewerApplication._isCtrlKeyDown = evt.key === "Control"; - if (PDFViewerApplication.overlayManager.active) { - return; - } - const { - eventBus, - pdfViewer - } = PDFViewerApplication; - const isViewerInPresentationMode = pdfViewer.isInPresentationMode; - let handled = false, - ensureViewerFocused = false; - const cmd = (evt.ctrlKey ? 1 : 0) | (evt.altKey ? 2 : 0) | (evt.shiftKey ? 4 : 0) | (evt.metaKey ? 8 : 0); - if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) { - switch (evt.keyCode) { - case 70: - if (!PDFViewerApplication.supportsIntegratedFind && !evt.shiftKey) { - PDFViewerApplication.findBar?.open(); - handled = true; - } - break; - case 71: - if (!PDFViewerApplication.supportsIntegratedFind) { - const { - state - } = PDFViewerApplication.findController; - if (state) { - const newState = { - source: window, - type: "again", - findPrevious: cmd === 5 || cmd === 12 - }; - eventBus.dispatch("find", { - ...state, - ...newState - }); - } - handled = true; - } - break; - case 61: - case 107: - case 187: - case 171: - PDFViewerApplication.zoomIn(); - handled = true; - break; - case 173: - case 109: - case 189: - PDFViewerApplication.zoomOut(); - handled = true; - break; - case 48: - case 96: - if (!isViewerInPresentationMode) { - setTimeout(function () { - PDFViewerApplication.zoomReset(); - }); - handled = false; - } - break; - case 38: - if (isViewerInPresentationMode || PDFViewerApplication.page > 1) { - PDFViewerApplication.page = 1; - handled = true; - ensureViewerFocused = true; - } - break; - case 40: - if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) { - PDFViewerApplication.page = PDFViewerApplication.pagesCount; - handled = true; - ensureViewerFocused = true; - } - break; - } - } - if (cmd === 1 || cmd === 8) { - switch (evt.keyCode) { - case 83: - eventBus.dispatch("download", { - source: window - }); - handled = true; - break; - case 79: - { - eventBus.dispatch("openfile", { - source: window - }); - handled = true; - } - break; - } - } - if (cmd === 3 || cmd === 10) { - switch (evt.keyCode) { - case 80: - PDFViewerApplication.requestPresentationMode(); - handled = true; - PDFViewerApplication.externalServices.reportTelemetry({ - type: "buttons", - data: { - id: "presentationModeKeyboard" - } - }); - break; - case 71: - if (PDFViewerApplication.appConfig.toolbar) { - PDFViewerApplication.appConfig.toolbar.pageNumber.select(); - handled = true; - } - break; - } - } - if (handled) { - if (ensureViewerFocused && !isViewerInPresentationMode) { - pdfViewer.focus(); - } - evt.preventDefault(); - return; - } - const curElement = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.getActiveOrFocusedElement)(); - const curElementTagName = curElement?.tagName.toUpperCase(); - if (curElementTagName === "INPUT" || curElementTagName === "TEXTAREA" || curElementTagName === "SELECT" || curElementTagName === "BUTTON" && (evt.keyCode === 13 || evt.keyCode === 32) || curElement?.isContentEditable) { - if (evt.keyCode !== 27) { - return; - } - } - if (cmd === 0) { - let turnPage = 0, - turnOnlyIfPageFit = false; - switch (evt.keyCode) { - case 38: - if (PDFViewerApplication.supportsCaretBrowsingMode) { - PDFViewerApplication.moveCaret(true, false); - handled = true; - break; - } - case 33: - if (pdfViewer.isVerticalScrollbarEnabled) { - turnOnlyIfPageFit = true; - } - turnPage = -1; - break; - case 8: - if (!isViewerInPresentationMode) { - turnOnlyIfPageFit = true; - } - turnPage = -1; - break; - case 37: - if (PDFViewerApplication.supportsCaretBrowsingMode) { - return; - } - if (pdfViewer.isHorizontalScrollbarEnabled) { - turnOnlyIfPageFit = true; - } - case 75: - case 80: - turnPage = -1; - break; - case 27: - if (PDFViewerApplication.secondaryToolbar?.isOpen) { - PDFViewerApplication.secondaryToolbar.close(); - handled = true; - } - if (!PDFViewerApplication.supportsIntegratedFind && PDFViewerApplication.findBar?.opened) { - PDFViewerApplication.findBar.close(); - handled = true; - } - break; - case 40: - if (PDFViewerApplication.supportsCaretBrowsingMode) { - PDFViewerApplication.moveCaret(false, false); - handled = true; - break; - } - case 34: - if (pdfViewer.isVerticalScrollbarEnabled) { - turnOnlyIfPageFit = true; - } - turnPage = 1; - break; - case 13: - case 32: - if (!isViewerInPresentationMode) { - turnOnlyIfPageFit = true; - } - turnPage = 1; - break; - case 39: - if (PDFViewerApplication.supportsCaretBrowsingMode) { - return; - } - if (pdfViewer.isHorizontalScrollbarEnabled) { - turnOnlyIfPageFit = true; - } - case 74: - case 78: - turnPage = 1; - break; - case 36: - if (isViewerInPresentationMode || PDFViewerApplication.page > 1) { - PDFViewerApplication.page = 1; - handled = true; - ensureViewerFocused = true; - } - break; - case 35: - if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) { - PDFViewerApplication.page = PDFViewerApplication.pagesCount; - handled = true; - ensureViewerFocused = true; - } - break; - case 83: - PDFViewerApplication.pdfCursorTools?.switchTool(_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.CursorTool.SELECT); - break; - case 72: - PDFViewerApplication.pdfCursorTools?.switchTool(_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.CursorTool.HAND); - break; - case 82: - PDFViewerApplication.rotatePages(90); - break; - case 115: - PDFViewerApplication.pdfSidebar?.toggle(); - break; - } - if (turnPage !== 0 && (!turnOnlyIfPageFit || pdfViewer.currentScaleValue === "page-fit")) { - if (turnPage > 0) { - pdfViewer.nextPage(); - } else { - pdfViewer.previousPage(); - } - handled = true; - } - } - if (cmd === 4) { - switch (evt.keyCode) { - case 13: - case 32: - if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== "page-fit") { - break; - } - pdfViewer.previousPage(); - handled = true; - break; - case 38: - PDFViewerApplication.moveCaret(true, true); - handled = true; - break; - case 40: - PDFViewerApplication.moveCaret(false, true); - handled = true; - break; - case 82: - PDFViewerApplication.rotatePages(-90); - break; - } - } - if (!handled && !isViewerInPresentationMode) { - if (evt.keyCode >= 33 && evt.keyCode <= 40 || evt.keyCode === 32 && curElementTagName !== "BUTTON") { - ensureViewerFocused = true; - } - } - if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) { - pdfViewer.focus(); - } - if (handled) { - evt.preventDefault(); - } -} -function beforeUnload(evt) { - evt.preventDefault(); - evt.returnValue = ""; - return false; -} -function webViewerAnnotationEditorStatesChanged(data) { - PDFViewerApplication.externalServices.updateEditorStates(data); -} -function webViewerReportTelemetry({ - details -}) { - PDFViewerApplication.externalServices.reportTelemetry(details); -} - -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), - -/***/ 9840: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ AppOptions: () => (/* binding */ AppOptions), -/* harmony export */ OptionKind: () => (/* binding */ OptionKind) -/* harmony export */ }); -{ - var compatibilityParams = Object.create(null); - const userAgent = navigator.userAgent || ""; - const platform = navigator.platform || ""; - const maxTouchPoints = navigator.maxTouchPoints || 1; - const isAndroid = /Android/.test(userAgent); - const isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent) || platform === "MacIntel" && maxTouchPoints > 1; - (function checkCanvasSizeLimitation() { - if (isIOS || isAndroid) { - compatibilityParams.maxCanvasPixels = 5242880; - } - })(); -} -const OptionKind = { - BROWSER: 0x01, - VIEWER: 0x02, - API: 0x04, - WORKER: 0x08, - PREFERENCE: 0x80 -}; -const defaultOptions = { - canvasMaxAreaInBytes: { - value: -1, - kind: OptionKind.BROWSER + OptionKind.API - }, - isInAutomation: { - value: false, - kind: OptionKind.BROWSER - }, - supportsCaretBrowsingMode: { - value: false, - kind: OptionKind.BROWSER - }, - supportsDocumentFonts: { - value: true, - kind: OptionKind.BROWSER - }, - supportsIntegratedFind: { - value: false, - kind: OptionKind.BROWSER - }, - supportsMouseWheelZoomCtrlKey: { - value: true, - kind: OptionKind.BROWSER - }, - supportsMouseWheelZoomMetaKey: { - value: true, - kind: OptionKind.BROWSER - }, - supportsPinchToZoom: { - value: true, - kind: OptionKind.BROWSER - }, - annotationEditorMode: { - value: 0, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - annotationMode: { - value: 2, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - cursorToolOnLoad: { - value: 0, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - debuggerSrc: { - value: "./debugger.mjs", - kind: OptionKind.VIEWER - }, - defaultZoomDelay: { - value: 400, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - defaultZoomValue: { - value: "", - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - disableHistory: { - value: false, - kind: OptionKind.VIEWER - }, - disablePageLabels: { - value: false, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - enableHighlightEditor: { - value: false, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - enableHighlightFloatingButton: { - value: false, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - enableML: { - value: false, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - enablePermissions: { - value: false, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - enablePrintAutoRotate: { - value: true, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - enableScripting: { - value: true, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - enableStampEditor: { - value: true, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - externalLinkRel: { - value: "noopener noreferrer nofollow", - kind: OptionKind.VIEWER - }, - externalLinkTarget: { - value: 0, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - highlightEditorColors: { - value: "yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F", - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - historyUpdateUrl: { - value: false, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - ignoreDestinationZoom: { - value: false, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - imageResourcesPath: { - value: "./images/", - kind: OptionKind.VIEWER - }, - maxCanvasPixels: { - value: 2 ** 25, - kind: OptionKind.VIEWER - }, - forcePageColors: { - value: false, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - pageColorsBackground: { - value: "Canvas", - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - pageColorsForeground: { - value: "CanvasText", - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - pdfBugEnabled: { - value: false, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - printResolution: { - value: 150, - kind: OptionKind.VIEWER - }, - sidebarViewOnLoad: { - value: -1, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - scrollModeOnLoad: { - value: -1, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - spreadModeOnLoad: { - value: -1, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - textLayerMode: { - value: 1, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - viewOnLoad: { - value: 0, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }, - cMapPacked: { - value: true, - kind: OptionKind.API - }, - cMapUrl: { - value: "../web/cmaps/", - kind: OptionKind.API - }, - disableAutoFetch: { - value: false, - kind: OptionKind.API + OptionKind.PREFERENCE - }, - disableFontFace: { - value: false, - kind: OptionKind.API + OptionKind.PREFERENCE - }, - disableRange: { - value: false, - kind: OptionKind.API + OptionKind.PREFERENCE - }, - disableStream: { - value: false, - kind: OptionKind.API + OptionKind.PREFERENCE - }, - docBaseUrl: { - value: "", - kind: OptionKind.API - }, - enableXfa: { - value: true, - kind: OptionKind.API + OptionKind.PREFERENCE - }, - fontExtraProperties: { - value: false, - kind: OptionKind.API - }, - isEvalSupported: { - value: true, - kind: OptionKind.API - }, - isOffscreenCanvasSupported: { - value: true, - kind: OptionKind.API - }, - maxImageSize: { - value: -1, - kind: OptionKind.API - }, - pdfBug: { - value: false, - kind: OptionKind.API - }, - standardFontDataUrl: { - value: "../web/standard_fonts/", - kind: OptionKind.API - }, - verbosity: { - value: 1, - kind: OptionKind.API - }, - workerPort: { - value: null, - kind: OptionKind.WORKER - }, - workerSrc: { - value: "../build/pdf.worker.mjs", - kind: OptionKind.WORKER - } -}; -{ - defaultOptions.defaultUrl = { - value: "compressed.tracemonkey-pldi-09.pdf", - kind: OptionKind.VIEWER - }; - defaultOptions.sandboxBundleSrc = { - value: "../build/pdf.sandbox.mjs", - kind: OptionKind.VIEWER - }; - defaultOptions.viewerCssTheme = { - value: 0, - kind: OptionKind.VIEWER + OptionKind.PREFERENCE - }; -} -{ - defaultOptions.disablePreferences = { - value: false, - kind: OptionKind.VIEWER - }; - defaultOptions.locale = { - value: navigator.language || "en-US", - kind: OptionKind.VIEWER - }; -} -const userOptions = Object.create(null); -{ - for (const name in compatibilityParams) { - userOptions[name] = compatibilityParams[name]; - } -} -class AppOptions { - constructor() { - throw new Error("Cannot initialize AppOptions."); - } - static get(name) { - return userOptions[name] ?? defaultOptions[name]?.value ?? undefined; - } - static getAll(kind = null, defaultOnly = false) { - const options = Object.create(null); - for (const name in defaultOptions) { - const defaultOption = defaultOptions[name]; - if (kind && !(kind & defaultOption.kind)) { - continue; - } - options[name] = defaultOnly ? defaultOption.value : userOptions[name] ?? defaultOption.value; - } - return options; - } - static set(name, value) { - userOptions[name] = value; - } - static setAll(options, init = false) { - if (init) { - if (this.get("disablePreferences")) { - return; - } - for (const name in userOptions) { - if (compatibilityParams[name] !== undefined) { - continue; - } - console.warn("setAll: The Preferences may override manually set AppOptions; " + 'please use the "disablePreferences"-option in order to prevent that.'); - break; - } - } - for (const name in options) { - userOptions[name] = options[name]; - } - } - static remove(name) { - delete userOptions[name]; - const val = compatibilityParams[name]; - if (val !== undefined) { - userOptions[name] = val; - } - } -} - - -/***/ }), - -/***/ 2961: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ BaseTreeViewer: () => (/* binding */ BaseTreeViewer) -/* harmony export */ }); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7256); - -const TREEITEM_OFFSET_TOP = -100; -const TREEITEM_SELECTED_CLASS = "selected"; -class BaseTreeViewer { - constructor(options) { - if (this.constructor === BaseTreeViewer) { - throw new Error("Cannot initialize BaseTreeViewer."); - } - this.container = options.container; - this.eventBus = options.eventBus; - this._l10n = options.l10n; - this.reset(); - } - reset() { - this._pdfDocument = null; - this._lastToggleIsShow = true; - this._currentTreeItem = null; - this.container.textContent = ""; - this.container.classList.remove("treeWithDeepNesting"); - } - _dispatchEvent(count) { - throw new Error("Not implemented: _dispatchEvent"); - } - _bindLink(element, params) { - throw new Error("Not implemented: _bindLink"); - } - _normalizeTextContent(str) { - return (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.removeNullCharacters)(str, true) || "\u2013"; - } - _addToggleButton(div, hidden = false) { - const toggler = document.createElement("div"); - toggler.className = "treeItemToggler"; - if (hidden) { - toggler.classList.add("treeItemsHidden"); - } - toggler.onclick = evt => { - evt.stopPropagation(); - toggler.classList.toggle("treeItemsHidden"); - if (evt.shiftKey) { - const shouldShowAll = !toggler.classList.contains("treeItemsHidden"); - this._toggleTreeItem(div, shouldShowAll); - } - }; - div.prepend(toggler); - } - _toggleTreeItem(root, show = false) { - this._l10n.pause(); - this._lastToggleIsShow = show; - for (const toggler of root.querySelectorAll(".treeItemToggler")) { - toggler.classList.toggle("treeItemsHidden", !show); - } - this._l10n.resume(); - } - _toggleAllTreeItems() { - this._toggleTreeItem(this.container, !this._lastToggleIsShow); - } - _finishRendering(fragment, count, hasAnyNesting = false) { - if (hasAnyNesting) { - this.container.classList.add("treeWithDeepNesting"); - this._lastToggleIsShow = !fragment.querySelector(".treeItemsHidden"); - } - this._l10n.pause(); - this.container.append(fragment); - this._l10n.resume(); - this._dispatchEvent(count); - } - render(params) { - throw new Error("Not implemented: render"); - } - _updateCurrentTreeItem(treeItem = null) { - if (this._currentTreeItem) { - this._currentTreeItem.classList.remove(TREEITEM_SELECTED_CLASS); - this._currentTreeItem = null; - } - if (treeItem) { - treeItem.classList.add(TREEITEM_SELECTED_CLASS); - this._currentTreeItem = treeItem; - } - } - _scrollToCurrentTreeItem(treeItem) { - if (!treeItem) { - return; - } - this._l10n.pause(); - let currentNode = treeItem.parentNode; - while (currentNode && currentNode !== this.container) { - if (currentNode.classList.contains("treeItem")) { - const toggler = currentNode.firstElementChild; - toggler?.classList.remove("treeItemsHidden"); - } - currentNode = currentNode.parentNode; - } - this._l10n.resume(); - this._updateCurrentTreeItem(treeItem); - this.container.scrollTo(treeItem.offsetLeft, treeItem.offsetTop + TREEITEM_OFFSET_TOP); - } -} - - -/***/ }), - -/***/ 3973: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ CaretBrowsingMode: () => (/* binding */ CaretBrowsingMode) -/* harmony export */ }); -const PRECISION = 1e-1; -class CaretBrowsingMode { - #mainContainer; - #toolBarHeight; - #viewerContainer; - constructor(mainContainer, viewerContainer, toolbarContainer) { - this.#mainContainer = mainContainer; - this.#viewerContainer = viewerContainer; - this.#toolBarHeight = toolbarContainer?.getBoundingClientRect().height ?? 0; } #isOnSameLine(rect1, rect2) { const top1 = rect1.y; @@ -4896,7 +4385,7 @@ #getNodeOnNextPage(textLayer, isUp) { while (true) { const page = textLayer.closest(".page"); - const pageNumber = parseInt(page.getAttribute("data-page-number")); + const pageNumber = parseInt(page.getAttribute("data-page-number"), 10); const nextPage = isUp ? pageNumber - 1 : pageNumber + 1; textLayer = this.#viewerContainer.querySelector(`.page[data-page-number="${nextPage}"] .textLayer`); if (!textLayer) { @@ -4976,685 +4465,1299 @@ } } +;// ./web/sidebar.js -/***/ }), - -/***/ 1544: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ DownloadManager: () => (/* binding */ DownloadManager) -/* harmony export */ }); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2603); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__]); -pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; - -function download(blobUrl, filename) { - const a = document.createElement("a"); - if (!a.click) { - throw new Error('DownloadManager: "a.click()" is not supported.'); - } - a.href = blobUrl; - a.target = "_parent"; - if ("download" in a) { - a.download = filename; - } - (document.body || document.documentElement).append(a); - a.click(); - a.remove(); -} -class DownloadManager { - #openBlobUrls = new WeakMap(); - downloadUrl(url, filename, _options) { - if (!(0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.createValidAbsoluteUrl)(url, "http://example.com")) { - console.error(`downloadUrl - not a valid URL: ${url}`); - return; - } - download(url + "#pdfjs.action=download", filename); - } - downloadData(data, filename, contentType) { - const blobUrl = URL.createObjectURL(new Blob([data], { - type: contentType - })); - download(blobUrl, filename); - } - openOrDownloadData(data, filename, dest = null) { - const isPdfData = (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.isPdfFile)(filename); - const contentType = isPdfData ? "application/pdf" : ""; - if (isPdfData) { - let blobUrl = this.#openBlobUrls.get(data); - if (!blobUrl) { - blobUrl = URL.createObjectURL(new Blob([data], { - type: contentType - })); - this.#openBlobUrls.set(data, blobUrl); - } - let viewerUrl; - viewerUrl = "?file=" + encodeURIComponent(blobUrl + "#" + filename); - if (dest) { - viewerUrl += `#${escape(dest)}`; +const RESIZE_TIMEOUT = 400; +class Sidebar { + #initialWidth = 0; + #width = 0; + #coefficient; + #resizeTimeout = null; + #resizer; + #isResizerOnTheLeft; + #isKeyboardResizing = false; + #resizeObserver; + #prevX = 0; + constructor({ + sidebar, + resizer, + toggleButton + }, ltr, isResizerOnTheLeft, globalAbortSignal) { + this._sidebar = sidebar; + this.#coefficient = ltr === isResizerOnTheLeft ? -1 : 1; + this.#resizer = resizer; + this.#isResizerOnTheLeft = isResizerOnTheLeft; + const style = window.getComputedStyle(sidebar); + this.#initialWidth = this.#width = parseFloat(style.getPropertyValue("--sidebar-width")); + resizer.ariaValueMin = parseFloat(style.getPropertyValue("--sidebar-min-width")) || 0; + resizer.ariaValueMax = parseFloat(style.getPropertyValue("--sidebar-max-width")) || Infinity; + resizer.ariaValueNow = this.#width; + this.#makeSidebarResizable(); + toggleButton.addEventListener("click", this.toggle.bind(this)); + this._isOpen = false; + sidebar.hidden = true; + globalAbortSignal?.addEventListener("abort", this.destroy.bind(this), { + once: true + }); + this.#resizeObserver = new ResizeObserver(([{ + borderBoxSize: [{ + inlineSize + }] + }]) => { + if (!isNaN(this.#prevX)) { + this.#prevX += this.#coefficient * (inlineSize - this.#width); + } + this.#setWidth(inlineSize); + }); + this.#resizeObserver.observe(sidebar); + } + #makeSidebarResizable() { + const sidebarStyle = this._sidebar.style; + let pointerMoveAC; + const cancelResize = () => { + this.#resizeTimeout = null; + this._sidebar.classList.remove("resizing"); + pointerMoveAC?.abort(); + pointerMoveAC = null; + this.#isKeyboardResizing = false; + this.onStopResizing(); + this.#prevX = NaN; + }; + this.#resizer.addEventListener("pointerdown", e => { + if (pointerMoveAC) { + cancelResize(); + return; } - try { - window.open(viewerUrl); - return true; - } catch (ex) { - console.error(`openOrDownloadData: ${ex}`); - URL.revokeObjectURL(blobUrl); - this.#openBlobUrls.delete(data); + this.onStartResizing(); + const { + clientX + } = e; + stopEvent(e); + this.#prevX = clientX; + pointerMoveAC = new AbortController(); + const { + signal + } = pointerMoveAC; + const sidebar = this._sidebar; + sidebar.classList.add("resizing"); + const parentStyle = sidebar.parentElement.style; + parentStyle.minWidth = 0; + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + window.addEventListener("pointermove", ev => { + if (!pointerMoveAC || Math.abs(ev.clientX - this.#prevX) < 1) { + return; + } + stopEvent(ev); + sidebarStyle.width = `${Math.round(this.#width + this.#coefficient * (ev.clientX - this.#prevX))}px`; + }, { + signal, + capture: true + }); + window.addEventListener("blur", cancelResize, { + signal + }); + window.addEventListener("pointerup", ev => { + if (pointerMoveAC) { + cancelResize(); + stopEvent(ev); + } + }, { + signal + }); + }); + this.#resizer.addEventListener("keydown", e => { + const { + key + } = e; + const isArrowLeft = key === "ArrowLeft"; + if (isArrowLeft || key === "ArrowRight") { + if (!this.#isKeyboardResizing) { + this._sidebar.classList.add("resizing"); + this.#isKeyboardResizing = true; + this.onStartResizing(); + } + const base = e.ctrlKey || e.metaKey ? 10 : 1; + const dx = base * (isArrowLeft ? -1 : 1); + clearTimeout(this.#resizeTimeout); + this.#resizeTimeout = setTimeout(cancelResize, RESIZE_TIMEOUT); + sidebarStyle.width = `${Math.round(this.#width + this.#coefficient * dx)}px`; + stopEvent(e); } + }); + } + #setWidth(newWidth) { + this.#width = newWidth; + this.#resizer.ariaValueNow = Math.round(newWidth); + if (this.#isResizerOnTheLeft) { + this._sidebar.parentElement.style.insetInlineStart = `${(this.#initialWidth - newWidth).toFixed(3)}px`; } - this.downloadData(data, filename, contentType); - return false; + this.onResizing(newWidth); + } + get width() { + return this.#width; } - download(blob, url, filename, _options) { - const blobUrl = URL.createObjectURL(blob); - download(blobUrl, filename); + set width(newWidth) { + this._sidebar.style.width = `${newWidth}px`; + } + onStartResizing() {} + onStopResizing() {} + onResizing(_newWidth) {} + toggle(visibility = !this._isOpen) { + this._sidebar.hidden = !(this._isOpen = visibility); + } + destroy() { + this.#resizeObserver?.disconnect(); + this.#resizeObserver = null; } } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), +;// ./web/comment_manager.js -/***/ 3088: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ DrawLayerBuilder: () => (/* binding */ DrawLayerBuilder) -/* harmony export */ }); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2603); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__]); -pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; -class DrawLayerBuilder { - #drawLayer = null; - constructor(options) { - this.pageIndex = options.pageIndex; - } - async render(intent = "display") { - if (intent !== "display" || this.#drawLayer || this._cancelled) { - return; - } - this.#drawLayer = new pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.DrawLayer({ - pageIndex: this.pageIndex +class CommentManager { + #dialog; + #popup; + #sidebar; + static #hasForcedColors = null; + constructor(commentDialog, sidebar, eventBus, linkService, overlayManager, ltr, hasForcedColors, globalAbortSignal) { + const dateFormat = new Intl.DateTimeFormat(undefined, { + dateStyle: "long" }); + this.dialogElement = commentDialog.dialog; + this.#dialog = new CommentDialog(commentDialog, overlayManager, eventBus, ltr); + this.#popup = new CommentPopup(eventBus, dateFormat, ltr, this.dialogElement); + this.#sidebar = new CommentSidebar(sidebar, eventBus, linkService, this.#popup, dateFormat, ltr, globalAbortSignal); + this.#popup.sidebar = this.#sidebar; + CommentManager.#hasForcedColors = hasForcedColors; } - cancel() { - this._cancelled = true; - if (!this.#drawLayer) { - return; - } - this.#drawLayer.destroy(); - this.#drawLayer = null; + setSidebarUiManager(uiManager) { + this.#sidebar.setUIManager(uiManager); } - setParent(parent) { - this.#drawLayer?.setParent(parent); + showSidebar(annotations) { + this.#sidebar.show(annotations); } - getDrawLayer() { - return this.#drawLayer; + hideSidebar() { + this.#sidebar.hide(); } -} - -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), - -/***/ 5656: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ AutomationEventBus: () => (/* binding */ AutomationEventBus), -/* harmony export */ EventBus: () => (/* binding */ EventBus), -/* harmony export */ waitOnEventOrTimeout: () => (/* binding */ waitOnEventOrTimeout) -/* harmony export */ }); -/* unused harmony export WaitOnType */ -const WaitOnType = { - EVENT: "event", - TIMEOUT: "timeout" -}; -async function waitOnEventOrTimeout({ - target, - name, - delay = 0 -}) { - if (typeof target !== "object" || !(name && typeof name === "string") || !(Number.isInteger(delay) && delay >= 0)) { - throw new Error("waitOnEventOrTimeout - invalid parameters."); + removeComments(ids) { + this.#sidebar.removeComments(ids); } - const { - promise, - resolve - } = Promise.withResolvers(); - function handler(type) { - if (target instanceof EventBus) { - target._off(name, eventHandler); - } else { - target.removeEventListener(name, eventHandler); - } - if (timeout) { - clearTimeout(timeout); + selectComment(id) { + this.#sidebar.selectComment(null, id); + } + addComment(annotation) { + this.#sidebar.addComment(annotation); + } + updateComment(annotation) { + this.#sidebar.updateComment(annotation); + } + toggleCommentPopup(editor, isSelected, visibility, isEditable) { + if (isSelected) { + this.selectComment(editor.uid); } - resolve(type); + this.#popup.toggle(editor, isSelected, visibility, isEditable); } - const eventHandler = handler.bind(null, WaitOnType.EVENT); - if (target instanceof EventBus) { - target._on(name, eventHandler); - } else { - target.addEventListener(name, eventHandler); + destroyPopup() { + this.#popup.destroy(); + } + updatePopupColor(editor) { + this.#popup.updateColor(editor); + } + showDialog(uiManager, editor, posX, posY, options) { + return this.#dialog.open(uiManager, editor, posX, posY, options); + } + makeCommentColor(color, opacity) { + return CommentManager._makeCommentColor(color, opacity); + } + static _makeCommentColor(color, opacity) { + return this.#hasForcedColors ? null : findContrastColor(applyOpacity(color, opacity ?? 1), CSSConstants.commentForegroundColor); + } + destroy() { + this.#dialog.destroy(); + this.#sidebar.hide(); + this.#popup.destroy(); } - const timeoutHandler = handler.bind(null, WaitOnType.TIMEOUT); - const timeout = setTimeout(timeoutHandler, delay); - return promise; } -class EventBus { - #listeners = Object.create(null); - on(eventName, listener, options = null) { - this._on(eventName, listener, { - external: true, - once: options?.once +class CommentSidebar extends Sidebar { + #annotations = null; + #eventBus; + #boundCommentClick = this.#commentClick.bind(this); + #boundCommentKeydown = this.#commentKeydown.bind(this); + #closeButton; + #commentsList; + #commentCount; + #dateFormat; + #sidebarTitle; + #learnMoreUrl; + #linkService; + #popup; + #elementsToAnnotations = null; + #idsToElements = null; + #uiManager = null; + constructor({ + learnMoreUrl, + sidebar, + sidebarResizer, + commentsList, + commentCount, + sidebarTitle, + closeButton, + commentToolbarButton + }, eventBus, linkService, popup, dateFormat, ltr, globalAbortSignal) { + super({ + sidebar, + resizer: sidebarResizer, + toggleButton: commentToolbarButton + }, ltr, true, globalAbortSignal); + this.#sidebarTitle = sidebarTitle; + this.#commentsList = commentsList; + this.#commentCount = commentCount; + this.#learnMoreUrl = learnMoreUrl; + this.#linkService = linkService; + this.#closeButton = closeButton; + this.#popup = popup; + this.#dateFormat = dateFormat; + this.#eventBus = eventBus; + closeButton.addEventListener("click", () => { + eventBus.dispatch("switchannotationeditormode", { + source: this, + mode: AnnotationEditorType.NONE + }); }); + const keyDownCallback = e => { + if (e.key === "ArrowDown" || e.key === "Home" || e.key === "F6") { + this.#commentsList.firstElementChild.focus(); + stopEvent(e); + } else if (e.key === "ArrowUp" || e.key === "End") { + this.#commentsList.lastElementChild.focus(); + stopEvent(e); + } + }; + commentToolbarButton.addEventListener("keydown", keyDownCallback); + sidebar.addEventListener("keydown", keyDownCallback); } - off(eventName, listener, options = null) { - this._off(eventName, listener, { - external: true, - once: options?.once - }); + setUIManager(uiManager) { + this.#uiManager = uiManager; } - dispatch(eventName, data) { - const eventListeners = this.#listeners[eventName]; - if (!eventListeners || eventListeners.length === 0) { - return; - } - let externalListeners; - for (const { - listener, - external, - once - } of eventListeners.slice(0)) { - if (once) { - this._off(eventName, listener); - } - if (external) { - (externalListeners ||= []).push(listener); - continue; + show(annotations) { + this.#elementsToAnnotations = new WeakMap(); + this.#idsToElements = new Map(); + this.#annotations = annotations; + annotations.sort(this.#sortComments.bind(this)); + if (annotations.length !== 0) { + const fragment = document.createDocumentFragment(); + for (const annotation of annotations) { + fragment.append(this.#createCommentElement(annotation)); } - listener(data); + this.#setCommentsCount(fragment); + this.#commentsList.append(fragment); + } else { + this.#setCommentsCount(); } - if (externalListeners) { - for (const listener of externalListeners) { - listener(data); + this._sidebar.hidden = false; + this.#eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "commentSidebar", + data: { + numberOfAnnotations: annotations.length + } } - externalListeners = null; - } - } - _on(eventName, listener, options = null) { - const eventListeners = this.#listeners[eventName] ||= []; - eventListeners.push({ - listener, - external: options?.external === true, - once: options?.once === true }); } - _off(eventName, listener, options = null) { - const eventListeners = this.#listeners[eventName]; - if (!eventListeners) { + hide() { + this._sidebar.hidden = true; + this.#commentsList.replaceChildren(); + this.#elementsToAnnotations = null; + this.#idsToElements = null; + this.#annotations = null; + } + removeComments(ids) { + if (ids.length === 0 || !this.#idsToElements) { return; } - for (let i = 0, ii = eventListeners.length; i < ii; i++) { - if (eventListeners[i].listener === listener) { - eventListeners.splice(i, 1); - return; - } + if (new Set(this.#idsToElements.keys()).difference(new Set(ids)).size === 0) { + this.#removeAll(); + return; + } + for (const id of ids) { + this.#removeComment(id); } } -} -class AutomationEventBus extends EventBus { - dispatch(eventName, data) { - throw new Error("Not implemented: AutomationEventBus.dispatch"); + focusComment(id) { + const element = this.#idsToElements.get(id); + if (!element) { + return; + } + this._sidebar.scrollTop = element.offsetTop - this._sidebar.offsetTop; + for (const el of this.#commentsList.children) { + el.classList.toggle("selected", el === element); + } } -} - - -/***/ }), - -/***/ 4290: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ BaseExternalServices: () => (/* binding */ BaseExternalServices) -/* harmony export */ }); -class BaseExternalServices { - constructor() { - if (this.constructor === BaseExternalServices) { - throw new Error("Cannot initialize BaseExternalServices."); + updateComment(annotation) { + if (!this.#idsToElements) { + return; + } + const { + id, + creationDate, + modificationDate, + richText, + contentsObj, + popupRef + } = annotation; + if (!popupRef || !richText && !contentsObj?.str) { + this.#removeComment(id); + } + const element = this.#idsToElements.get(id); + if (!element) { + return; + } + const prevAnnotation = this.#elementsToAnnotations.get(element); + let index = binarySearchFirstItem(this.#annotations, a => this.#sortComments(a, prevAnnotation) >= 0); + if (index >= this.#annotations.length) { + return; + } + this.#setDate(element.firstElementChild, modificationDate || creationDate); + this.#setText(element.lastElementChild, richText, contentsObj); + this.#annotations.splice(index, 1); + index = binarySearchFirstItem(this.#annotations, a => this.#sortComments(a, annotation) >= 0); + this.#annotations.splice(index, 0, annotation); + if (index >= this.#commentsList.children.length) { + this.#commentsList.append(element); + } else { + this.#commentsList.insertBefore(element, this.#commentsList.children[index]); } } - updateFindControlState(data) {} - updateFindMatchesCount(data) {} - initPassiveLoading() {} - reportTelemetry(data) {} - async createL10n() { - throw new Error("Not implemented: createL10n"); + #removeComment(id) { + const element = this.#idsToElements?.get(id); + if (!element) { + return; + } + const annotation = this.#elementsToAnnotations.get(element); + const index = binarySearchFirstItem(this.#annotations, a => this.#sortComments(a, annotation) >= 0); + if (index >= this.#annotations.length) { + return; + } + this.#annotations.splice(index, 1); + element.remove(); + this.#idsToElements.delete(id); + this.#setCommentsCount(); } - createScripting() { - throw new Error("Not implemented: createScripting"); + #removeAll() { + this.#commentsList.replaceChildren(); + this.#elementsToAnnotations = new WeakMap(); + this.#idsToElements.clear(); + this.#annotations.length = 0; + this.#setCommentsCount(); } - updateEditorStates(data) { - throw new Error("Not implemented: updateEditorStates"); + selectComment(element, id = null) { + if (!this.#idsToElements) { + return; + } + const hasNoElement = !element; + element ||= this.#idsToElements.get(id); + for (const el of this.#commentsList.children) { + el.classList.toggle("selected", el === element); + } + if (hasNoElement) { + element?.scrollIntoView({ + behavior: "instant", + block: "center" + }); + } } - async getNimbusExperimentData() {} -} - - -/***/ }), - -/***/ 289: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ GenericScripting: () => (/* binding */ GenericScripting) -/* harmony export */ }); -/* unused harmony export docProperties */ -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2603); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__]); -pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; - -async function docProperties(pdfDocument) { - const url = "", - baseUrl = url.split("#", 1)[0]; - let { - info, - metadata, - contentDispositionFilename, - contentLength - } = await pdfDocument.getMetadata(); - if (!contentLength) { + addComment(annotation) { + if (this.#idsToElements?.has(annotation.id)) { + return; + } const { - length - } = await pdfDocument.getDownloadInfo(); - contentLength = length; + popupRef, + contentsObj + } = annotation; + if (!popupRef || !contentsObj?.str) { + return; + } + const commentItem = this.#createCommentElement(annotation); + if (this.#annotations.length === 0) { + this.#commentsList.replaceChildren(commentItem); + this.#annotations.push(annotation); + this.#setCommentsCount(); + return; + } + const index = binarySearchFirstItem(this.#annotations, a => this.#sortComments(a, annotation) >= 0); + this.#annotations.splice(index, 0, annotation); + if (index >= this.#commentsList.children.length) { + this.#commentsList.append(commentItem); + } else { + this.#commentsList.insertBefore(commentItem, this.#commentsList.children[index]); + } + this.#setCommentsCount(); } - return { - ...info, - baseURL: baseUrl, - filesize: contentLength, - filename: contentDispositionFilename || getPdfFilenameFromUrl(url), - metadata: metadata?.getRaw(), - authors: metadata?.get("dc:creator"), - numPages: pdfDocument.numPages, - URL: url - }; -} -class GenericScripting { - constructor(sandboxBundleSrc) { - this._ready = new Promise((resolve, reject) => { - const sandbox = import( /*webpackIgnore: true*/sandboxBundleSrc); - sandbox.then(pdfjsSandbox => { - resolve(pdfjsSandbox.QuickJSSandbox()); - }).catch(reject); - }); + #setCommentsCount(container = this.#commentsList) { + const count = this.#idsToElements.size; + this.#sidebarTitle.setAttribute("data-l10n-args", JSON.stringify({ + count + })); + this.#commentCount.textContent = count; + if (count === 0) { + container.append(this.#createZeroCommentElement()); + } + } + #createZeroCommentElement() { + const commentItem = document.createElement("li"); + commentItem.classList.add("sidebarComment", "noComments"); + const textDiv = document.createElement("div"); + textDiv.className = "sidebarCommentText"; + textDiv.setAttribute("data-l10n-id", "pdfjs-editor-comments-sidebar-no-comments1"); + commentItem.append(textDiv); + if (this.#learnMoreUrl) { + const a = document.createElement("a"); + a.setAttribute("data-l10n-id", "pdfjs-editor-comments-sidebar-no-comments-link"); + a.href = this.#learnMoreUrl; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + commentItem.append(a); + } + return commentItem; + } + #setDate(element, date) { + date = PDFDateString.toDateObject(date); + element.dateTime = date.toISOString(); + element.textContent = this.#dateFormat.format(date); + } + #setText(element, richText, contentsObj) { + element.replaceChildren(); + const html = richText?.str && (!contentsObj?.str || richText.str === contentsObj.str) ? richText.html : contentsObj?.str; + renderRichText({ + html, + dir: contentsObj?.dir || "auto", + className: "richText" + }, element); } - async createSandbox(data) { - const sandbox = await this._ready; - sandbox.create(data); + #createCommentElement(annotation) { + const { + id, + creationDate, + modificationDate, + richText, + contentsObj, + color, + opacity + } = annotation; + const commentItem = document.createElement("li"); + commentItem.role = "button"; + commentItem.className = "sidebarComment"; + commentItem.tabIndex = -1; + commentItem.style.backgroundColor = color && CommentManager._makeCommentColor(color, opacity) || ""; + const dateDiv = document.createElement("time"); + this.#setDate(dateDiv, modificationDate || creationDate); + const textDiv = document.createElement("div"); + textDiv.className = "sidebarCommentText"; + this.#setText(textDiv, richText, contentsObj); + commentItem.append(dateDiv, textDiv); + commentItem.addEventListener("click", this.#boundCommentClick); + commentItem.addEventListener("keydown", this.#boundCommentKeydown); + this.#elementsToAnnotations.set(commentItem, annotation); + this.#idsToElements.set(id, commentItem); + return commentItem; } - async dispatchEventInSandbox(event) { - const sandbox = await this._ready; - setTimeout(() => sandbox.dispatchEvent(event), 0); + async #commentClick({ + currentTarget + }) { + if (currentTarget.classList.contains("selected")) { + currentTarget.classList.remove("selected"); + this.#popup._hide(); + return; + } + const annotation = this.#elementsToAnnotations.get(currentTarget); + if (!annotation) { + return; + } + this.#popup._hide(); + const { + id, + pageIndex, + rect + } = annotation; + const pageNumber = pageIndex + 1; + const pageVisiblePromise = this.#uiManager?.waitForEditorsRendered(pageNumber); + this.#linkService?.goToXY(pageNumber, rect[0], rect[3], { + center: "both" + }); + this.selectComment(currentTarget); + await pageVisiblePromise; + this.#uiManager?.selectComment(pageIndex, id); } - async destroySandbox() { - const sandbox = await this._ready; - sandbox.nukeSandbox(); + #commentKeydown(e) { + const { + key, + currentTarget + } = e; + switch (key) { + case "ArrowDown": + (currentTarget.nextElementSibling || this.#commentsList.firstElementChild).focus(); + stopEvent(e); + break; + case "ArrowUp": + (currentTarget.previousElementSibling || this.#commentsList.lastElementChild).focus(); + stopEvent(e); + break; + case "Home": + this.#commentsList.firstElementChild.focus(); + stopEvent(e); + break; + case "End": + this.#commentsList.lastElementChild.focus(); + stopEvent(e); + break; + case "Enter": + case " ": + this.#commentClick(e); + stopEvent(e); + break; + case "ShiftTab": + this.#closeButton.focus(); + stopEvent(e); + break; + } } -} - -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), - -/***/ 6750: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ ExternalServices: () => (/* binding */ ExternalServices), -/* harmony export */ MLManager: () => (/* binding */ MLManager), -/* harmony export */ Preferences: () => (/* binding */ Preferences), -/* harmony export */ initCom: () => (/* binding */ initCom) -/* harmony export */ }); -/* harmony import */ var _app_options_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9840); -/* harmony import */ var _external_services_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(4290); -/* harmony import */ var _preferences_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8224); -/* harmony import */ var _genericl10n_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(410); -/* harmony import */ var _generic_scripting_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(289); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_genericl10n_js__WEBPACK_IMPORTED_MODULE_2__, _generic_scripting_js__WEBPACK_IMPORTED_MODULE_3__]); -([_genericl10n_js__WEBPACK_IMPORTED_MODULE_2__, _generic_scripting_js__WEBPACK_IMPORTED_MODULE_3__] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__); - - - - - -function initCom(app) {} -class Preferences extends _preferences_js__WEBPACK_IMPORTED_MODULE_1__.BasePreferences { - async _writeToStorage(prefObj) { - localStorage.setItem("pdfjs.preferences", JSON.stringify(prefObj)); + #sortComments(a, b) { + const dateA = PDFDateString.toDateObject(a.modificationDate || a.creationDate); + const dateB = PDFDateString.toDateObject(b.modificationDate || b.creationDate); + if (dateA !== dateB) { + if (dateA !== null && dateB !== null) { + return dateB - dateA; + } + return dateA !== null ? -1 : 1; + } + if (a.pageIndex !== b.pageIndex) { + return a.pageIndex - b.pageIndex; + } + if (a.rect[3] !== b.rect[3]) { + return b.rect[3] - a.rect[3]; + } + if (a.rect[0] !== b.rect[0]) { + return a.rect[0] - b.rect[0]; + } + if (a.rect[1] !== b.rect[1]) { + return b.rect[1] - a.rect[1]; + } + if (a.rect[2] !== b.rect[2]) { + return a.rect[2] - b.rect[2]; + } + return a.id.localeCompare(b.id); } - async _readFromStorage(prefObj) { - return { - prefs: JSON.parse(localStorage.getItem("pdfjs.preferences")) +} +class CommentDialog { + #dialog; + #editor; + #overlayManager; + #previousText = ""; + #commentText = ""; + #textInput; + #title; + #saveButton; + #uiManager; + #prevDragX = 0; + #prevDragY = 0; + #dialogX = 0; + #dialogY = 0; + #isLTR; + #eventBus; + constructor({ + dialog, + toolbar, + title, + textInput, + cancelButton, + saveButton + }, overlayManager, eventBus, ltr) { + this.#dialog = dialog; + this.#textInput = textInput; + this.#overlayManager = overlayManager; + this.#eventBus = eventBus; + this.#saveButton = saveButton; + this.#title = title; + this.#isLTR = ltr; + const finishBound = this.#finish.bind(this); + dialog.addEventListener("close", finishBound); + dialog.addEventListener("contextmenu", e => { + if (e.target !== this.#textInput) { + e.preventDefault(); + } + }); + cancelButton.addEventListener("click", finishBound); + saveButton.addEventListener("click", this.#save.bind(this)); + textInput.addEventListener("input", () => { + saveButton.disabled = textInput.value === this.#previousText; + }); + textInput.addEventListener("keydown", e => { + if ((e.ctrlKey || e.metaKey) && e.key === "Enter" && !saveButton.disabled) { + this.#save(); + } + }); + let pointerMoveAC; + const cancelDrag = () => { + dialog.classList.remove("dragging"); + pointerMoveAC?.abort(); + pointerMoveAC = null; }; + toolbar.addEventListener("pointerdown", e => { + if (pointerMoveAC) { + cancelDrag(); + return; + } + const { + clientX, + clientY + } = e; + stopEvent(e); + this.#prevDragX = clientX; + this.#prevDragY = clientY; + pointerMoveAC = new AbortController(); + const { + signal + } = pointerMoveAC; + const { + innerHeight, + innerWidth + } = window; + dialog.classList.add("dragging"); + window.addEventListener("pointermove", ev => { + if (!pointerMoveAC) { + return; + } + const { + clientX: x, + clientY: y + } = ev; + this.#setPosition(this.#dialogX + (x - this.#prevDragX) / innerWidth, this.#dialogY + (y - this.#prevDragY) / innerHeight); + this.#prevDragX = x; + this.#prevDragY = y; + stopEvent(ev); + }, { + signal + }); + window.addEventListener("blur", cancelDrag, { + signal + }); + window.addEventListener("pointerup", ev => { + if (pointerMoveAC) { + cancelDrag(); + stopEvent(ev); + } + }, { + signal + }); + }); + overlayManager.register(dialog); } -} -class ExternalServices extends _external_services_js__WEBPACK_IMPORTED_MODULE_4__.BaseExternalServices { - async createL10n() { - return new _genericl10n_js__WEBPACK_IMPORTED_MODULE_2__.GenericL10n(_app_options_js__WEBPACK_IMPORTED_MODULE_0__.AppOptions.get("locale")); + async open(uiManager, editor, posX, posY, options) { + if (editor) { + this.#uiManager = uiManager; + this.#editor = editor; + } + const { + contentsObj: { + str + }, + color, + opacity + } = editor.getData(); + const { + style: dialogStyle + } = this.#dialog; + if (color) { + dialogStyle.backgroundColor = CommentManager._makeCommentColor(color, opacity); + dialogStyle.borderColor = Util.makeHexColor(...color); + } else { + dialogStyle.backgroundColor = dialogStyle.borderColor = ""; + } + this.#commentText = str || ""; + const textInput = this.#textInput; + textInput.value = this.#previousText = this.#commentText; + if (str) { + this.#title.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-dialog-title-when-editing"); + this.#saveButton.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-dialog-save-button-when-editing"); + } else { + this.#title.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-dialog-title-when-adding"); + this.#saveButton.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-dialog-save-button-when-adding"); + } + if (options?.height) { + textInput.style.height = `${options.height}px`; + } + this.#uiManager?.removeEditListeners(); + this.#saveButton.disabled = true; + const parentDimensions = options?.parentDimensions; + const { + innerHeight, + innerWidth + } = window; + if (editor.hasDefaultPopupPosition()) { + const { + dialogWidth, + dialogHeight + } = this._dialogDimensions; + if (parentDimensions) { + if (this.#isLTR && posX + dialogWidth > Math.min(parentDimensions.x + parentDimensions.width, innerWidth)) { + const buttonWidth = this.#editor.commentButtonWidth; + posX -= dialogWidth - buttonWidth * parentDimensions.width; + } else if (!this.#isLTR) { + const buttonWidth = this.#editor.commentButtonWidth * parentDimensions.width; + if (posX - dialogWidth < Math.max(0, parentDimensions.x)) { + posX = Math.max(0, posX); + } else { + posX -= dialogWidth - buttonWidth; + } + } + } + const height = Math.max(dialogHeight, options?.height || 0); + if (posY + height > innerHeight) { + posY = innerHeight - height; + } + if (posY < 0) { + posY = 0; + } + } + posX = MathClamp(posX / innerWidth, 0, 1); + posY = MathClamp(posY / innerHeight, 0, 1); + this.#setPosition(posX, posY); + await this.#overlayManager.open(this.#dialog); + textInput.focus(); } - createScripting() { - return new _generic_scripting_js__WEBPACK_IMPORTED_MODULE_3__.GenericScripting(_app_options_js__WEBPACK_IMPORTED_MODULE_0__.AppOptions.get("sandboxBundleSrc")); + async #save() { + this.#editor.comment = this.#textInput.value; + this.#finish(); } -} -class MLManager { - async guess() { - return null; + get _dialogDimensions() { + const dialog = this.#dialog; + const { + style + } = dialog; + style.opacity = "0"; + style.display = "block"; + const { + width, + height + } = dialog.getBoundingClientRect(); + style.opacity = style.display = ""; + return shadow(this, "_dialogDimensions", { + dialogWidth: width, + dialogHeight: height + }); } -} - -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), - -/***/ 410: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ GenericL10n: () => (/* binding */ GenericL10n) -/* harmony export */ }); -/* harmony import */ var fluent_bundle__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(588); -/* harmony import */ var fluent_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5273); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2603); -/* harmony import */ var _l10n_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4693); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_2__]); -pdfjs_lib__WEBPACK_IMPORTED_MODULE_2__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; - - - - -function createBundle(lang, text) { - const resource = new fluent_bundle__WEBPACK_IMPORTED_MODULE_0__.FluentResource(text); - const bundle = new fluent_bundle__WEBPACK_IMPORTED_MODULE_0__.FluentBundle(lang); - const errors = bundle.addResource(resource); - if (errors.length) { - console.error("L10n errors", errors); + #setPosition(x, y) { + this.#dialogX = x; + this.#dialogY = y; + const { + style + } = this.#dialog; + style.left = `${100 * x}%`; + style.top = `${100 * y}%`; } - return bundle; -} -class GenericL10n extends _l10n_js__WEBPACK_IMPORTED_MODULE_3__.L10n { - constructor(lang) { - super({ - lang + #finish() { + if (!this.#editor) { + return; + } + const edited = this.#textInput.value !== this.#commentText; + this.#eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "comment", + data: { + edited + } + } }); - const generateBundles = !lang ? GenericL10n.#generateBundlesFallback.bind(GenericL10n, this.getLanguage()) : GenericL10n.#generateBundles.bind(GenericL10n, "en-us", this.getLanguage()); - this._setL10n(new fluent_dom__WEBPACK_IMPORTED_MODULE_1__.DOMLocalization([], generateBundles)); + this.#editor?.focusCommentButton(); + this.#editor = null; + this.#textInput.value = this.#previousText = this.#commentText = ""; + this.#overlayManager.closeIfActive(this.#dialog); + this.#textInput.style.height = ""; + this.#uiManager?.addEditListeners(); + this.#uiManager = null; } - static async *#generateBundles(defaultLang, baseLang) { + destroy() { + this.#uiManager = null; + this.#editor = null; + this.#finish(); + } +} +class CommentPopup { + #buttonsContainer = null; + #eventBus; + #commentDialog; + #dateFormat; + #editor = null; + #isLTR; + #container = null; + #text = null; + #time = null; + #prevDragX = 0; + #prevDragY = 0; + #posX = 0; + #posY = 0; + #previousFocusedElement = null; + #selected = false; + #visible = false; + constructor(eventBus, dateFormat, ltr, commentDialog) { + this.#eventBus = eventBus; + this.#dateFormat = dateFormat; + this.#isLTR = ltr; + this.#commentDialog = commentDialog; + this.sidebar = null; + } + get _popupWidth() { + const container = this.#createPopup(); const { - baseURL, - paths - } = await this.#getPaths(); - const langs = [baseLang]; - if (defaultLang !== baseLang) { - const shortLang = baseLang.split("-", 1)[0]; - if (shortLang !== baseLang) { - langs.push(shortLang); + style + } = container; + style.opacity = "0"; + style.display = "block"; + document.body.append(container); + const width = container.getBoundingClientRect().width; + container.remove(); + style.opacity = style.display = ""; + return shadow(this, "_popupWidth", width); + } + #createPopup() { + if (this.#container) { + return this.#container; + } + const container = this.#container = document.createElement("div"); + container.className = "commentPopup"; + container.id = "commentPopup"; + container.tabIndex = -1; + container.role = "dialog"; + container.ariaModal = "false"; + container.addEventListener("contextmenu", noContextMenu); + container.addEventListener("keydown", e => { + if (e.key === "Escape") { + this.toggle(this.#editor, true, false); + this.#previousFocusedElement?.focus(); + stopEvent(e); + } + }); + container.addEventListener("click", () => { + container.focus(); + }); + const top = document.createElement("div"); + top.className = "commentPopupTop"; + const time = this.#time = document.createElement("time"); + time.className = "commentPopupTime"; + const buttons = this.#buttonsContainer = document.createElement("div"); + buttons.className = "commentPopupButtons"; + const edit = document.createElement("button"); + edit.classList.add("commentPopupEdit", "toolbarButton"); + edit.tabIndex = 0; + edit.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-popup-button"); + edit.ariaHasPopup = "dialog"; + edit.ariaControlsElements = [this.#commentDialog]; + const editLabel = document.createElement("span"); + editLabel.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-popup-button-label"); + edit.append(editLabel); + edit.addEventListener("click", () => { + const editor = this.#editor; + const height = parseFloat(getComputedStyle(this.#text).height); + this.toggle(editor, true, false); + editor.editComment({ + height + }); + }); + edit.addEventListener("contextmenu", noContextMenu); + const del = document.createElement("button"); + del.classList.add("commentPopupDelete", "toolbarButton"); + del.tabIndex = 0; + del.setAttribute("data-l10n-id", "pdfjs-editor-delete-comment-popup-button"); + const delLabel = document.createElement("span"); + delLabel.setAttribute("data-l10n-id", "pdfjs-editor-delete-comment-popup-button-label"); + del.append(delLabel); + del.addEventListener("click", () => { + this.#eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "comment", + data: { + deleted: true + } + } + }); + const editor = this.#editor; + const savedData = editor.comment; + this.destroy(); + if (savedData?.text) { + editor._uiManager.deleteComment(editor, savedData); + } else { + editor.comment = null; } - langs.push(defaultLang); - } - for (const lang of langs) { - const bundle = await this.#createBundle(lang, baseURL, paths); - if (bundle) { - yield bundle; + editor.focus(); + }); + del.addEventListener("contextmenu", noContextMenu); + buttons.append(edit, del); + top.append(time, buttons); + const separator = document.createElement("hr"); + const text = this.#text = document.createElement("div"); + text.className = "commentPopupText"; + container.append(top, separator, text); + let pointerMoveAC; + const cancelDrag = () => { + container.classList.remove("dragging"); + pointerMoveAC?.abort(); + pointerMoveAC = null; + }; + top.addEventListener("pointerdown", e => { + if (pointerMoveAC) { + cancelDrag(); + return; } - if (lang === "en-us") { - yield this.#createBundleFallback(lang); + const { + target, + clientX, + clientY + } = e; + if (buttons.contains(target)) { + return; } - } + stopEvent(e); + const { + width: parentWidth, + height: parentHeight + } = this.#editor.parentBoundingClientRect; + this.#prevDragX = clientX; + this.#prevDragY = clientY; + pointerMoveAC = new AbortController(); + const { + signal + } = pointerMoveAC; + container.classList.add("dragging"); + window.addEventListener("pointermove", ev => { + if (!pointerMoveAC) { + return; + } + const { + clientX: x, + clientY: y + } = ev; + this.#setPosition(this.#posX + (x - this.#prevDragX) / parentWidth, this.#posY + (y - this.#prevDragY) / parentHeight, false); + this.#prevDragX = x; + this.#prevDragY = y; + stopEvent(ev); + }, { + signal + }); + window.addEventListener("blur", cancelDrag, { + signal + }); + window.addEventListener("pointerup", ev => { + if (pointerMoveAC) { + cancelDrag(); + stopEvent(ev); + } + }, { + signal + }); + }); + return container; } - static async #createBundle(lang, baseURL, paths) { - const path = paths[lang]; - if (!path) { - return null; + updateColor(editor) { + if (this.#editor !== editor || !this.#visible) { + return; } - const url = new URL(path, baseURL); - const text = await (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_2__.fetchData)(url, "text"); - return createBundle(lang, text); + const { + color, + opacity + } = editor.getData(); + this.#container.style.backgroundColor = color && CommentManager._makeCommentColor(color, opacity) || ""; + } + _hide(editor) { + const container = this.#createPopup(); + container.classList.toggle("hidden", true); + container.classList.toggle("selected", false); + (editor || this.#editor)?.setCommentButtonStates({ + selected: false, + hasPopup: false + }); + this.#editor = null; + this.#selected = false; + this.#visible = false; + this.#text.replaceChildren(); + this.sidebar.selectComment(null); } - static async #getPaths() { - try { - const { - href - } = document.querySelector(`link[type="application/l10n"]`); - const paths = await (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_2__.fetchData)(href, "json"); - return { - baseURL: href.replace(/[^/]*$/, "") || "./", - paths - }; - } catch {} - return { - baseURL: "./", - paths: Object.create(null) - }; + toggle(editor, isSelected, visibility = undefined, isEditable = true) { + if (!editor) { + this.destroy(); + return; + } + if (isSelected) { + visibility ??= this.#editor === editor ? !this.#selected || !this.#visible : true; + } else { + if (this.#selected) { + return; + } + visibility ??= !this.#visible; + } + if (!visibility) { + this._hide(editor); + return; + } + this.#visible = true; + if (this.#editor !== editor) { + this.#editor?.setCommentButtonStates({ + selected: false, + hasPopup: false + }); + } + const container = this.#createPopup(); + this.#buttonsContainer.classList.toggle("hidden", !isEditable); + container.classList.toggle("hidden", false); + container.classList.toggle("selected", isSelected); + this.#selected = isSelected; + this.#editor = editor; + editor.setCommentButtonStates({ + selected: isSelected, + hasPopup: true + }); + const { + contentsObj, + richText, + creationDate, + modificationDate, + color, + opacity + } = editor.getData(); + container.style.backgroundColor = color && CommentManager._makeCommentColor(color, opacity) || ""; + this.#text.replaceChildren(); + const html = richText?.str && (!contentsObj?.str || richText.str === contentsObj.str) ? richText.html : contentsObj?.str; + if (html) { + renderRichText({ + html, + dir: contentsObj?.dir || "auto", + className: "richText" + }, this.#text); + } + this.#time.textContent = this.#dateFormat.format(PDFDateString.toDateObject(modificationDate || creationDate)); + this.#setPosition(...editor.commentPopupPosition, editor.hasDefaultPopupPosition()); + editor.elementBeforePopup.after(container); + container.addEventListener("focus", ({ + relatedTarget + }) => { + this.#previousFocusedElement = relatedTarget; + }, { + once: true + }); + if (isSelected) { + setTimeout(() => container.focus(), 0); + } } - static async *#generateBundlesFallback(lang) { - yield this.#createBundleFallback(lang); + #setPosition(x, y, correctPosition) { + if (!correctPosition) { + this.#editor.commentPopupPosition = [x, y]; + } else { + const parentRect = this.#editor.parentBoundingClientRect; + const widthRatio = this._popupWidth / parentRect.width; + if (this.#isLTR && x + widthRatio > 1 || !this.#isLTR && x - widthRatio >= 0) { + const buttonWidth = this.#editor.commentButtonWidth; + x -= widthRatio - buttonWidth; + } + const margin = 0.01; + if (this.#isLTR) { + x = Math.max(x, -parentRect.x / parentRect.width + margin); + } else { + x = Math.min(x, (window.innerWidth - parentRect.x) / parentRect.width - widthRatio - margin); + } + } + this.#posX = x; + this.#posY = y; + const { + style + } = this.#container; + style.left = `${100 * x}%`; + style.top = `${100 * y}%`; } - static async #createBundleFallback(lang) { - const text = "pdfjs-previous-button =\n .title = Previous Page\npdfjs-previous-button-label = Previous\npdfjs-next-button =\n .title = Next Page\npdfjs-next-button-label = Next\npdfjs-page-input =\n .title = Page\npdfjs-of-pages = of { $pagesCount }\npdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount })\npdfjs-zoom-out-button =\n .title = Zoom Out\npdfjs-zoom-out-button-label = Zoom Out\npdfjs-zoom-in-button =\n .title = Zoom In\npdfjs-zoom-in-button-label = Zoom In\npdfjs-zoom-select =\n .title = Zoom\npdfjs-presentation-mode-button =\n .title = Switch to Presentation Mode\npdfjs-presentation-mode-button-label = Presentation Mode\npdfjs-open-file-button =\n .title = Open File\npdfjs-open-file-button-label = Open\npdfjs-print-button =\n .title = Print\npdfjs-print-button-label = Print\npdfjs-save-button =\n .title = Save\npdfjs-save-button-label = Save\npdfjs-download-button =\n .title = Download\npdfjs-download-button-label = Download\npdfjs-bookmark-button =\n .title = Current Page (View URL from Current Page)\npdfjs-bookmark-button-label = Current Page\npdfjs-tools-button =\n .title = Tools\npdfjs-tools-button-label = Tools\npdfjs-first-page-button =\n .title = Go to First Page\npdfjs-first-page-button-label = Go to First Page\npdfjs-last-page-button =\n .title = Go to Last Page\npdfjs-last-page-button-label = Go to Last Page\npdfjs-page-rotate-cw-button =\n .title = Rotate Clockwise\npdfjs-page-rotate-cw-button-label = Rotate Clockwise\npdfjs-page-rotate-ccw-button =\n .title = Rotate Counterclockwise\npdfjs-page-rotate-ccw-button-label = Rotate Counterclockwise\npdfjs-cursor-text-select-tool-button =\n .title = Enable Text Selection Tool\npdfjs-cursor-text-select-tool-button-label = Text Selection Tool\npdfjs-cursor-hand-tool-button =\n .title = Enable Hand Tool\npdfjs-cursor-hand-tool-button-label = Hand Tool\npdfjs-scroll-page-button =\n .title = Use Page Scrolling\npdfjs-scroll-page-button-label = Page Scrolling\npdfjs-scroll-vertical-button =\n .title = Use Vertical Scrolling\npdfjs-scroll-vertical-button-label = Vertical Scrolling\npdfjs-scroll-horizontal-button =\n .title = Use Horizontal Scrolling\npdfjs-scroll-horizontal-button-label = Horizontal Scrolling\npdfjs-scroll-wrapped-button =\n .title = Use Wrapped Scrolling\npdfjs-scroll-wrapped-button-label = Wrapped Scrolling\npdfjs-spread-none-button =\n .title = Do not join page spreads\npdfjs-spread-none-button-label = No Spreads\npdfjs-spread-odd-button =\n .title = Join page spreads starting with odd-numbered pages\npdfjs-spread-odd-button-label = Odd Spreads\npdfjs-spread-even-button =\n .title = Join page spreads starting with even-numbered pages\npdfjs-spread-even-button-label = Even Spreads\npdfjs-document-properties-button =\n .title = Document Properties\u2026\npdfjs-document-properties-button-label = Document Properties\u2026\npdfjs-document-properties-file-name = File name:\npdfjs-document-properties-file-size = File size:\npdfjs-document-properties-kb = { $size_kb } KB ({ $size_b } bytes)\npdfjs-document-properties-mb = { $size_mb } MB ({ $size_b } bytes)\npdfjs-document-properties-title = Title:\npdfjs-document-properties-author = Author:\npdfjs-document-properties-subject = Subject:\npdfjs-document-properties-keywords = Keywords:\npdfjs-document-properties-creation-date = Creation Date:\npdfjs-document-properties-modification-date = Modification Date:\npdfjs-document-properties-date-string = { $date }, { $time }\npdfjs-document-properties-creator = Creator:\npdfjs-document-properties-producer = PDF Producer:\npdfjs-document-properties-version = PDF Version:\npdfjs-document-properties-page-count = Page Count:\npdfjs-document-properties-page-size = Page Size:\npdfjs-document-properties-page-size-unit-inches = in\npdfjs-document-properties-page-size-unit-millimeters = mm\npdfjs-document-properties-page-size-orientation-portrait = portrait\npdfjs-document-properties-page-size-orientation-landscape = landscape\npdfjs-document-properties-page-size-name-a-three = A3\npdfjs-document-properties-page-size-name-a-four = A4\npdfjs-document-properties-page-size-name-letter = Letter\npdfjs-document-properties-page-size-name-legal = Legal\npdfjs-document-properties-page-size-dimension-string = { $width } \xD7 { $height } { $unit } ({ $orientation })\npdfjs-document-properties-page-size-dimension-name-string = { $width } \xD7 { $height } { $unit } ({ $name }, { $orientation })\npdfjs-document-properties-linearized = Fast Web View:\npdfjs-document-properties-linearized-yes = Yes\npdfjs-document-properties-linearized-no = No\npdfjs-document-properties-close-button = Close\npdfjs-print-progress-message = Preparing document for printing\u2026\npdfjs-print-progress-percent = { $progress }%\npdfjs-print-progress-close-button = Cancel\npdfjs-printing-not-supported = Warning: Printing is not fully supported by this browser.\npdfjs-printing-not-ready = Warning: The PDF is not fully loaded for printing.\npdfjs-toggle-sidebar-button =\n .title = Toggle Sidebar\npdfjs-toggle-sidebar-notification-button =\n .title = Toggle Sidebar (document contains outline/attachments/layers)\npdfjs-toggle-sidebar-button-label = Toggle Sidebar\npdfjs-document-outline-button =\n .title = Show Document Outline (double-click to expand/collapse all items)\npdfjs-document-outline-button-label = Document Outline\npdfjs-attachments-button =\n .title = Show Attachments\npdfjs-attachments-button-label = Attachments\npdfjs-layers-button =\n .title = Show Layers (double-click to reset all layers to the default state)\npdfjs-layers-button-label = Layers\npdfjs-thumbs-button =\n .title = Show Thumbnails\npdfjs-thumbs-button-label = Thumbnails\npdfjs-current-outline-item-button =\n .title = Find Current Outline Item\npdfjs-current-outline-item-button-label = Current Outline Item\npdfjs-findbar-button =\n .title = Find in Document\npdfjs-findbar-button-label = Find\npdfjs-additional-layers = Additional Layers\npdfjs-thumb-page-title =\n .title = Page { $page }\npdfjs-thumb-page-canvas =\n .aria-label = Thumbnail of Page { $page }\npdfjs-find-input =\n .title = Find\n .placeholder = Find in document\u2026\npdfjs-find-previous-button =\n .title = Find the previous occurrence of the phrase\npdfjs-find-previous-button-label = Previous\npdfjs-find-next-button =\n .title = Find the next occurrence of the phrase\npdfjs-find-next-button-label = Next\npdfjs-find-highlight-checkbox = Highlight All\npdfjs-find-match-case-checkbox-label = Match Case\npdfjs-find-match-diacritics-checkbox-label = Match Diacritics\npdfjs-find-entire-word-checkbox-label = Whole Words\npdfjs-find-reached-top = Reached top of document, continued from bottom\npdfjs-find-reached-bottom = Reached end of document, continued from top\npdfjs-find-match-count =\n { $total ->\n [one] { $current } of { $total } match\n *[other] { $current } of { $total } matches\n }\npdfjs-find-match-count-limit =\n { $limit ->\n [one] More than { $limit } match\n *[other] More than { $limit } matches\n }\npdfjs-find-not-found = Phrase not found\npdfjs-page-scale-width = Page Width\npdfjs-page-scale-fit = Page Fit\npdfjs-page-scale-auto = Automatic Zoom\npdfjs-page-scale-actual = Actual Size\npdfjs-page-scale-percent = { $scale }%\npdfjs-page-landmark =\n .aria-label = Page { $page }\npdfjs-loading-error = An error occurred while loading the PDF.\npdfjs-invalid-file-error = Invalid or corrupted PDF file.\npdfjs-missing-file-error = Missing PDF file.\npdfjs-unexpected-response-error = Unexpected server response.\npdfjs-rendering-error = An error occurred while rendering the page.\npdfjs-annotation-date-string = { $date }, { $time }\npdfjs-text-annotation-type =\n .alt = [{ $type } Annotation]\npdfjs-password-label = Enter the password to open this PDF file.\npdfjs-password-invalid = Invalid password. Please try again.\npdfjs-password-ok-button = OK\npdfjs-password-cancel-button = Cancel\npdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts.\npdfjs-editor-free-text-button =\n .title = Text\npdfjs-editor-free-text-button-label = Text\npdfjs-editor-ink-button =\n .title = Draw\npdfjs-editor-ink-button-label = Draw\npdfjs-editor-stamp-button =\n .title = Add or edit images\npdfjs-editor-stamp-button-label = Add or edit images\npdfjs-editor-highlight-button =\n .title = Highlight\npdfjs-editor-highlight-button-label = Highlight\npdfjs-highlight-floating-button1 =\n .title = Highlight\n .aria-label = Highlight\npdfjs-highlight-floating-button-label = Highlight\npdfjs-editor-remove-ink-button =\n .title = Remove drawing\npdfjs-editor-remove-freetext-button =\n .title = Remove text\npdfjs-editor-remove-stamp-button =\n .title = Remove image\npdfjs-editor-remove-highlight-button =\n .title = Remove highlight\npdfjs-editor-free-text-color-input = Color\npdfjs-editor-free-text-size-input = Size\npdfjs-editor-ink-color-input = Color\npdfjs-editor-ink-thickness-input = Thickness\npdfjs-editor-ink-opacity-input = Opacity\npdfjs-editor-stamp-add-image-button =\n .title = Add image\npdfjs-editor-stamp-add-image-button-label = Add image\npdfjs-editor-free-highlight-thickness-input = Thickness\npdfjs-editor-free-highlight-thickness-title =\n .title = Change thickness when highlighting items other than text\npdfjs-free-text =\n .aria-label = Text Editor\npdfjs-free-text-default-content = Start typing\u2026\npdfjs-ink =\n .aria-label = Draw Editor\npdfjs-ink-canvas =\n .aria-label = User-created image\npdfjs-editor-alt-text-button-label = Alt text\npdfjs-editor-alt-text-edit-button-label = Edit alt text\npdfjs-editor-alt-text-dialog-label = Choose an option\npdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people can\u2019t see the image or when it doesn\u2019t load.\npdfjs-editor-alt-text-add-description-label = Add a description\npdfjs-editor-alt-text-add-description-description = Aim for 1-2 sentences that describe the subject, setting, or actions.\npdfjs-editor-alt-text-mark-decorative-label = Mark as decorative\npdfjs-editor-alt-text-mark-decorative-description = This is used for ornamental images, like borders or watermarks.\npdfjs-editor-alt-text-cancel-button = Cancel\npdfjs-editor-alt-text-save-button = Save\npdfjs-editor-alt-text-decorative-tooltip = Marked as decorative\npdfjs-editor-alt-text-textarea =\n .placeholder = For example, \u201CA young man sits down at a table to eat a meal\u201D\npdfjs-editor-resizer-label-top-left = Top left corner \u2014 resize\npdfjs-editor-resizer-label-top-middle = Top middle \u2014 resize\npdfjs-editor-resizer-label-top-right = Top right corner \u2014 resize\npdfjs-editor-resizer-label-middle-right = Middle right \u2014 resize\npdfjs-editor-resizer-label-bottom-right = Bottom right corner \u2014 resize\npdfjs-editor-resizer-label-bottom-middle = Bottom middle \u2014 resize\npdfjs-editor-resizer-label-bottom-left = Bottom left corner \u2014 resize\npdfjs-editor-resizer-label-middle-left = Middle left \u2014 resize\npdfjs-editor-highlight-colorpicker-label = Highlight color\npdfjs-editor-colorpicker-button =\n .title = Change color\npdfjs-editor-colorpicker-dropdown =\n .aria-label = Color choices\npdfjs-editor-colorpicker-yellow =\n .title = Yellow\npdfjs-editor-colorpicker-green =\n .title = Green\npdfjs-editor-colorpicker-blue =\n .title = Blue\npdfjs-editor-colorpicker-pink =\n .title = Pink\npdfjs-editor-colorpicker-red =\n .title = Red\npdfjs-editor-highlight-show-all-button-label = Show all\npdfjs-editor-highlight-show-all-button =\n .title = Show all"; - return createBundle(lang, text); + destroy() { + this._hide(); + this.#container?.remove(); + this.#container = this.#text = this.#time = null; + this.#prevDragX = this.#prevDragY = Infinity; + this.#posX = this.#posY = 0; + this.#previousFocusedElement = null; } } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), +;// ./web/base_download_manager.js -/***/ 2640: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ GrabToPan: () => (/* binding */ GrabToPan) -/* harmony export */ }); -const CSS_CLASS_GRAB = "grab-to-pan-grab"; -class GrabToPan { - constructor({ - element - }) { - this.element = element; - this.document = element.ownerDocument; - this.activate = this.activate.bind(this); - this.deactivate = this.deactivate.bind(this); - this.toggle = this.toggle.bind(this); - this._onMouseDown = this.#onMouseDown.bind(this); - this._onMouseMove = this.#onMouseMove.bind(this); - this._endPan = this.#endPan.bind(this); - const overlay = this.overlay = document.createElement("div"); - overlay.className = "grab-to-pan-grabbing"; +class BaseDownloadManager { + #openBlobUrls = new WeakMap(); + _triggerDownload(blobUrl, originalUrl, filename, isAttachment = false) { + throw new Error("Not implemented: _triggerDownload"); } - activate() { - if (!this.active) { - this.active = true; - this.element.addEventListener("mousedown", this._onMouseDown, true); - this.element.classList.add(CSS_CLASS_GRAB); - } + _getOpenDataUrl(blobUrl, filename, dest = null) { + throw new Error("Not implemented: _getOpenDataUrl"); } - deactivate() { - if (this.active) { - this.active = false; - this.element.removeEventListener("mousedown", this._onMouseDown, true); - this._endPan(); - this.element.classList.remove(CSS_CLASS_GRAB); - } + downloadData(data, filename, contentType) { + const blobUrl = URL.createObjectURL(new Blob([data], { + type: contentType + })); + this._triggerDownload(blobUrl, blobUrl, filename, true); } - toggle() { - if (this.active) { - this.deactivate(); - } else { - this.activate(); + openOrDownloadData(data, filename, dest = null) { + const isPdfData = isPdfFile(filename); + const contentType = isPdfData ? "application/pdf" : ""; + if (isPdfData) { + const blobUrl = this.#openBlobUrls.getOrInsertComputed(data, () => URL.createObjectURL(new Blob([data], { + type: contentType + }))); + try { + const viewerUrl = this._getOpenDataUrl(blobUrl, filename, dest); + window.open(viewerUrl); + return true; + } catch (ex) { + console.error("openOrDownloadData:", ex); + URL.revokeObjectURL(blobUrl); + this.#openBlobUrls.delete(data); + } } + this.downloadData(data, filename, contentType); + return false; } - ignoreTarget(node) { - return node.matches("a[href], a[href] *, input, textarea, button, button *, select, option"); + download(data, url, filename) { + const blobUrl = data ? URL.createObjectURL(new Blob([data], { + type: "application/pdf" + })) : null; + this._triggerDownload(blobUrl, url, filename); } - #onMouseDown(event) { - if (event.button !== 0 || this.ignoreTarget(event.target)) { - return; - } - if (event.originalTarget) { - try { - event.originalTarget.tagName; - } catch { - return; +} + +;// ./web/download_manager.js + + +class DownloadManager extends BaseDownloadManager { + _triggerDownload(blobUrl, originalUrl, filename, isAttachment = false) { + if (!blobUrl && !isAttachment) { + if (!createValidAbsoluteUrl(originalUrl, "http://example.com")) { + throw new Error(`_triggerDownload - not a valid URL: ${originalUrl}`); } + blobUrl = originalUrl + "#pdfjs.action=download"; } - this.scrollLeftStart = this.element.scrollLeft; - this.scrollTopStart = this.element.scrollTop; - this.clientXStart = event.clientX; - this.clientYStart = event.clientY; - this.document.addEventListener("mousemove", this._onMouseMove, true); - this.document.addEventListener("mouseup", this._endPan, true); - this.element.addEventListener("scroll", this._endPan, true); - event.preventDefault(); - event.stopPropagation(); - const focusedElement = document.activeElement; - if (focusedElement && !focusedElement.contains(event.target)) { - focusedElement.blur(); + const a = document.createElement("a"); + a.href = blobUrl; + a.target = "_parent"; + if ("download" in a) { + a.download = filename; } + (document.body || document.documentElement).append(a); + a.click(); + a.remove(); } - #onMouseMove(event) { - this.element.removeEventListener("scroll", this._endPan, true); - if (!(event.buttons & 1)) { - this._endPan(); - return; + _getOpenDataUrl(blobUrl, filename, dest = null) { + let url = "?file=" + encodeURIComponent(blobUrl + "#" + filename); + if (dest) { + url += `#${escape(dest)}`; } - const xDiff = event.clientX - this.clientXStart; - const yDiff = event.clientY - this.clientYStart; - this.element.scrollTo({ - top: this.scrollTopStart - yDiff, - left: this.scrollLeftStart - xDiff, - behavior: "instant" - }); - if (!this.overlay.parentNode) { - document.body.append(this.overlay); - } - } - #endPan() { - this.element.removeEventListener("scroll", this._endPan, true); - this.document.removeEventListener("mousemove", this._onMouseMove, true); - this.document.removeEventListener("mouseup", this._endPan, true); - this.overlay.remove(); + return url; } } +;// ./web/editor_undo_bar.js -/***/ }), -/***/ 4693: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ L10n: () => (/* binding */ L10n) -/* harmony export */ }); -/* unused harmony export GenericL10n */ -class L10n { - #dir; - #lang; - #l10n; +class EditorUndoBar { + #closeButton = null; + #container; + #eventBus = null; + #focusTimeout = null; + #initController = null; + isOpen = false; + #message; + #showController = null; + #undoButton; + static #l10nMessages = Object.freeze({ + highlight: "pdfjs-editor-undo-bar-message-highlight", + freetext: "pdfjs-editor-undo-bar-message-freetext", + stamp: "pdfjs-editor-undo-bar-message-stamp", + ink: "pdfjs-editor-undo-bar-message-ink", + signature: "pdfjs-editor-undo-bar-message-signature", + comment: "pdfjs-editor-undo-bar-message-comment", + _multiple: "pdfjs-editor-undo-bar-message-multiple" + }); constructor({ - lang, - isRTL - }, l10n = null) { - this.#lang = L10n.#fixupLangCode(lang); - this.#l10n = l10n; - this.#dir = isRTL ?? L10n.#isRTL(this.#lang) ? "rtl" : "ltr"; - } - _setL10n(l10n) { - this.#l10n = l10n; - } - getLanguage() { - return this.#lang; - } - getDirection() { - return this.#dir; + container, + message, + undoButton, + closeButton + }, eventBus) { + this.#container = container; + this.#message = message; + this.#undoButton = undoButton; + this.#closeButton = closeButton; + this.#eventBus = eventBus; } - async get(ids, args = null, fallback) { - if (Array.isArray(ids)) { - ids = ids.map(id => ({ - id + destroy() { + this.#initController?.abort(); + this.#initController = null; + this.hide(); + } + show(undoAction, messageData) { + if (!this.#initController) { + this.#initController = new AbortController(); + const domOpts = { + signal: this.#initController.signal + }; + const evtOpts = { + signal: this.#initController.signal, + ...internalOpt + }; + const boundHide = this.hide.bind(this); + this.#container.addEventListener("contextmenu", noContextMenu, domOpts); + this.#closeButton.addEventListener("click", boundHide, domOpts); + this.#eventBus.on("beforeprint", boundHide, evtOpts); + this.#eventBus.on("download", boundHide, evtOpts); + } + this.hide(); + if (typeof messageData === "string") { + this.#message.setAttribute("data-l10n-id", EditorUndoBar.#l10nMessages[messageData]); + } else { + this.#message.setAttribute("data-l10n-id", EditorUndoBar.#l10nMessages._multiple); + this.#message.setAttribute("data-l10n-args", JSON.stringify({ + count: messageData })); - const messages = await this.#l10n.formatMessages(ids); - return messages.map(message => message.value); } - const messages = await this.#l10n.formatMessages([{ - id: ids, - args - }]); - return messages?.[0].value || fallback; - } - async translate(element) { - try { - this.#l10n.connectRoot(element); - await this.#l10n.translateRoots(); - } catch {} - } - pause() { - this.#l10n.pauseObserving(); - } - resume() { - this.#l10n.resumeObserving(); - } - static #fixupLangCode(langCode) { - langCode = langCode?.toLowerCase() || "en-us"; - const PARTIAL_LANG_CODES = { - en: "en-us", - es: "es-es", - fy: "fy-nl", - ga: "ga-ie", - gu: "gu-in", - hi: "hi-in", - hy: "hy-am", - nb: "nb-no", - ne: "ne-np", - nn: "nn-no", - pa: "pa-in", - pt: "pt-pt", - sv: "sv-se", - zh: "zh-cn" - }; - return PARTIAL_LANG_CODES[langCode] || langCode; + this.isOpen = true; + this.#container.hidden = false; + this.#showController = new AbortController(); + this.#undoButton.addEventListener("click", () => { + undoAction(); + this.hide(); + }, { + signal: this.#showController.signal + }); + this.#focusTimeout = setTimeout(() => { + if (!this.#container.contains(document.activeElement)) { + this.#container.focus(); + } + this.#focusTimeout = null; + }, 100); } - static #isRTL(lang) { - const shortCode = lang.split("-", 1)[0]; - return ["ar", "he", "fa", "ps", "ur"].includes(shortCode); + hide() { + if (!this.isOpen) { + return; + } + this.isOpen = false; + this.#container.hidden = true; + this.#showController?.abort(); + this.#showController = null; + if (this.#focusTimeout) { + clearTimeout(this.#focusTimeout); + this.#focusTimeout = null; + } } } -const GenericL10n = null; - - -/***/ }), -/***/ 6174: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ OverlayManager: () => (/* binding */ OverlayManager) -/* harmony export */ }); +;// ./web/overlay_manager.js class OverlayManager { #overlays = new WeakMap(); #active = null; @@ -5670,8 +5773,12 @@ this.#overlays.set(dialog, { canForceClose }); - dialog.addEventListener("cancel", evt => { - this.#active = null; + dialog.addEventListener("cancel", ({ + target + }) => { + if (this.#active === target) { + this.#active = null; + } }); } async open(dialog) { @@ -5700,21 +5807,14 @@ dialog.close(); this.#active = null; } + async closeIfActive(dialog) { + if (this.#active === dialog) { + await this.close(dialog); + } + } } - -/***/ }), - -/***/ 2690: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PasswordPrompt: () => (/* binding */ PasswordPrompt) -/* harmony export */ }); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2603); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__]); -pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; +;// ./web/password_prompt.js class PasswordPrompt { #activeCapability = null; @@ -5733,6 +5833,7 @@ this.input.addEventListener("keydown", e => { if (e.keyCode === 13) { this.#verify(); + e.preventDefault(); } }); this.overlayManager.register(this.dialog, true); @@ -5747,16 +5848,14 @@ this.#activeCapability.resolve(); throw ex; } - const passwordIncorrect = this.#reason === pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.PasswordResponses.INCORRECT_PASSWORD; + const passwordIncorrect = this.#reason === PasswordResponses.INCORRECT_PASSWORD; if (!this._isViewerEmbedded || passwordIncorrect) { this.input.focus(); } - this.label.setAttribute("data-l10n-id", `pdfjs-password-${passwordIncorrect ? "invalid" : "label"}`); + this.label.setAttribute("data-l10n-id", passwordIncorrect ? "pdfjs-password-invalid" : "pdfjs-password-label"); } async close() { - if (this.overlayManager.active === this.dialog) { - this.overlayManager.close(this.dialog); - } + this.overlayManager.closeIfActive(this.dialog); } #verify() { const password = this.input.value; @@ -5786,31 +5885,123 @@ } } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); +;// ./web/base_tree_viewer.js -/***/ }), -/***/ 9251: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { +const TREEITEM_SELECTED_CLASS = "selected"; +class BaseTreeViewer { + constructor(options) { + this.container = options.container; + this.eventBus = options.eventBus; + this._l10n = options.l10n; + this.reset(); + } + reset() { + this._pdfDocument = null; + this._lastToggleIsShow = true; + this._currentTreeItem = null; + this.container.replaceChildren(); + this.container.classList.remove("withNesting"); + } + _dispatchEvent(count) { + throw new Error("Not implemented: _dispatchEvent"); + } + _bindLink(element, params) { + throw new Error("Not implemented: _bindLink"); + } + _normalizeTextContent(str) { + return removeNullCharacters(str, true) || "\u2013"; + } + _addToggleButton(div, hidden = false) { + const toggler = document.createElement("div"); + toggler.className = "treeItemToggler"; + if (hidden) { + toggler.classList.add("treeItemsHidden"); + } + div.prepend(toggler); + } + _toggleTreeItem(root, show = false) { + this._l10n.pause(); + this._lastToggleIsShow = show; + for (const toggler of root.querySelectorAll(".treeItemToggler")) { + toggler.classList.toggle("treeItemsHidden", !show); + } + this._l10n.resume(); + } + _toggleAllTreeItems() { + this._toggleTreeItem(this.container, !this._lastToggleIsShow); + } + _finishRendering(fragment, count, hasAnyNesting = false) { + if (hasAnyNesting) { + this.container.classList.add("withNesting"); + this._lastToggleIsShow = !fragment.querySelector(".treeItemsHidden"); + this.container.addEventListener("click", e => { + const { + target + } = e; + if (!target.classList.contains("treeItemToggler")) { + return; + } + stopEvent(e); + target.classList.toggle("treeItemsHidden"); + if (e.shiftKey) { + const shouldShowAll = !target.classList.contains("treeItemsHidden"); + this._toggleTreeItem(target.parentNode, shouldShowAll); + } + }); + } + this._l10n.pause(); + this.container.append(fragment); + this._l10n.resume(); + this._dispatchEvent(count); + } + render(params) { + throw new Error("Not implemented: render"); + } + _updateCurrentTreeItem(treeItem = null) { + if (this._currentTreeItem) { + this._currentTreeItem.classList.remove(TREEITEM_SELECTED_CLASS); + this._currentTreeItem = null; + } + if (treeItem) { + treeItem.classList.add(TREEITEM_SELECTED_CLASS); + this._currentTreeItem = treeItem; + } + } + _scrollToCurrentTreeItem(treeItem) { + if (!treeItem) { + return; + } + this._l10n.pause(); + let currentNode = treeItem.parentNode; + while (currentNode && currentNode !== this.container) { + if (currentNode.classList.contains("treeItem")) { + const toggler = currentNode.firstElementChild; + toggler?.classList.remove("treeItemsHidden"); + } + currentNode = currentNode.parentNode; + } + this._l10n.resume(); + this._updateCurrentTreeItem(treeItem); + treeItem.scrollIntoView({ + behavior: "instant", + block: "center", + inline: "center", + container: "nearest" + }); + } +} -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFAttachmentViewer: () => (/* binding */ PDFAttachmentViewer) -/* harmony export */ }); -/* harmony import */ var _base_tree_viewer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2961); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2603); -/* harmony import */ var _event_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5656); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__]); -pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; +;// ./web/pdf_attachment_viewer.js -class PDFAttachmentViewer extends _base_tree_viewer_js__WEBPACK_IMPORTED_MODULE_0__.BaseTreeViewer { +class PDFAttachmentViewer extends BaseTreeViewer { constructor(options) { super(options); this.downloadManager = options.downloadManager; - this.eventBus._on("fileattachmentannotation", this.#appendAttachment.bind(this)); + this.linkService = options.linkService; + this.eventBus.on("fileattachmentannotation", this.#appendAttachment.bind(this), internalOpt); } reset(keepRenderedCapability = false) { super.reset(); @@ -5824,7 +6015,7 @@ this._renderedCapability.resolve(); if (attachmentsCount === 0 && !this._pendingDispatchEvent) { this._pendingDispatchEvent = true; - await (0,_event_utils_js__WEBPACK_IMPORTED_MODULE_2__.waitOnEventOrTimeout)({ + await waitOnEventOrTimeout({ target: this.eventBus, name: "annotationlayerrendered", delay: 1000 @@ -5840,11 +6031,22 @@ }); } _bindLink(element, { - content, + attachmentId, + content: fallbackContent, + description, filename }) { + if (description) { + element.title = description; + } + const openAttachment = async () => { + const content = attachmentId ? await this.linkService.getAttachmentContent(attachmentId) : fallbackContent; + if (content) { + this.downloadManager?.openOrDownloadData(content, filename); + } + }; element.onclick = () => { - this.downloadManager.openOrDownloadData(content, filename); + openAttachment(); return false; }; } @@ -5861,44 +6063,34 @@ return; } const fragment = document.createDocumentFragment(); + const ul = document.createElement("ul"); + fragment.append(ul); let attachmentsCount = 0; - for (const name in attachments) { - const item = attachments[name]; - const content = item.content, - filename = (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.getFilenameFromUrl)(item.filename, true); - const div = document.createElement("div"); - div.className = "treeItem"; + for (const [name, item] of attachments) { + const li = document.createElement("li"); + ul.append(li); const element = document.createElement("a"); + li.append(element); this._bindLink(element, { - content, - filename + ...item, + attachmentId: item.attachmentId ?? name }); - element.textContent = this._normalizeTextContent(filename); - div.append(element); - fragment.append(div); + element.textContent = this._normalizeTextContent(item.filename); attachmentsCount++; } this._finishRendering(fragment, attachmentsCount); } - #appendAttachment({ - filename, - content - }) { + #appendAttachment(item) { const renderedPromise = this._renderedCapability.promise; renderedPromise.then(() => { if (renderedPromise !== this._renderedCapability.promise) { return; } - const attachments = this._attachments || Object.create(null); - for (const name in attachments) { - if (filename === name) { - return; - } + const attachments = new Map(this._attachments); + if (attachments.has(item.filename)) { + return; } - attachments[filename] = { - filename, - content - }; + attachments.set(item.filename, item); this.render({ attachments, keepRenderedCapability: true @@ -5907,33 +6099,115 @@ } } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); +;// ./web/grab_to_pan.js -/***/ }), +const CSS_CLASS_GRAB = "grab-to-pan-grab"; +class GrabToPan { + #activateAC = null; + #mouseDownAC = null; + #scrollAC = null; + constructor({ + element + }) { + this.element = element; + this.document = element.ownerDocument; + const overlay = this.overlay = document.createElement("div"); + overlay.className = "grab-to-pan-grabbing"; + } + activate() { + if (!this.#activateAC) { + this.#activateAC = new AbortController(); + this.element.addEventListener("mousedown", this.#onMouseDown.bind(this), { + capture: true, + signal: this.#activateAC.signal + }); + this.element.classList.add(CSS_CLASS_GRAB); + } + } + deactivate() { + if (this.#activateAC) { + this.#activateAC.abort(); + this.#activateAC = null; + this.#endPan(); + this.element.classList.remove(CSS_CLASS_GRAB); + } + } + ignoreTarget(node) { + return node.matches("a[href], a[href] *, input, textarea, button, button *, select, option"); + } + #onMouseDown(event) { + if (event.button !== 0 || this.ignoreTarget(event.target)) { + return; + } + if (event.originalTarget) { + try { + event.originalTarget.tagName; + } catch { + return; + } + } + this.scrollLeftStart = this.element.scrollLeft; + this.scrollTopStart = this.element.scrollTop; + this.clientXStart = event.clientX; + this.clientYStart = event.clientY; + this.#mouseDownAC = new AbortController(); + const boundEndPan = this.#endPan.bind(this), + mouseOpts = { + capture: true, + signal: this.#mouseDownAC.signal + }; + this.document.addEventListener("mousemove", this.#onMouseMove.bind(this), mouseOpts); + this.document.addEventListener("mouseup", boundEndPan, mouseOpts); + this.#scrollAC = new AbortController(); + this.element.addEventListener("scroll", boundEndPan, { + capture: true, + signal: this.#scrollAC.signal + }); + stopEvent(event); + const focusedElement = document.activeElement; + if (focusedElement && !focusedElement.contains(event.target)) { + focusedElement.blur(); + } + } + #onMouseMove(event) { + this.#scrollAC?.abort(); + this.#scrollAC = null; + if (!(event.buttons & 1)) { + this.#endPan(); + return; + } + const xDiff = event.clientX - this.clientXStart; + const yDiff = event.clientY - this.clientYStart; + this.element.scrollTo({ + top: this.scrollTopStart - yDiff, + left: this.scrollLeftStart - xDiff, + behavior: "instant" + }); + if (!this.overlay.parentNode) { + document.body.append(this.overlay); + } + } + #endPan() { + this.#mouseDownAC?.abort(); + this.#mouseDownAC = null; + this.#scrollAC?.abort(); + this.#scrollAC = null; + this.overlay.remove(); + } +} -/***/ 5993: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { +;// ./web/pdf_cursor_tools.js -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFCursorTools: () => (/* binding */ PDFCursorTools) -/* harmony export */ }); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2603); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7256); -/* harmony import */ var _grab_to_pan_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2640); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__]); -pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; class PDFCursorTools { - #active = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.CursorTool.SELECT; + #active = CursorTool.SELECT; #prevActive = null; constructor({ container, eventBus, - cursorToolOnLoad = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.CursorTool.SELECT + cursorToolOnLoad = CursorTool.SELECT }) { this.container = container; this.eventBus = eventBus; @@ -5949,28 +6223,38 @@ if (this.#prevActive !== null) { return; } + this.#switchTool(tool); + } + #switchTool(tool, disabled = false) { if (tool === this.#active) { + if (this.#prevActive !== null) { + this.eventBus.dispatch("cursortoolchanged", { + source: this, + tool, + disabled + }); + } return; } const disableActiveTool = () => { switch (this.#active) { - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.CursorTool.SELECT: + case CursorTool.SELECT: break; - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.CursorTool.HAND: + case CursorTool.HAND: this._handTool.deactivate(); break; - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.CursorTool.ZOOM: + case CursorTool.ZOOM: } }; switch (tool) { - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.CursorTool.SELECT: + case CursorTool.SELECT: disableActiveTool(); break; - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.CursorTool.HAND: + case CursorTool.HAND: disableActiveTool(); this._handTool.activate(); break; - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.CursorTool.ZOOM: + case CursorTool.ZOOM: default: console.error(`switchTool: "${tool}" is an unsupported value.`); return; @@ -5978,89 +6262,75 @@ this.#active = tool; this.eventBus.dispatch("cursortoolchanged", { source: this, - tool + tool, + disabled }); } #addEventListeners() { - this.eventBus._on("switchcursortool", evt => { - this.switchTool(evt.tool); - }); - let annotationEditorMode = pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.NONE, - presentationModeState = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.PresentationModeState.NORMAL; + const { + eventBus + } = this; + eventBus.on("switchcursortool", evt => { + if (!evt.reset) { + this.switchTool(evt.tool); + } else if (this.#prevActive !== null) { + annotationEditorMode = AnnotationEditorType.NONE; + presentationModeState = PresentationModeState.NORMAL; + enableActive(); + } + }, internalOpt); + let annotationEditorMode = AnnotationEditorType.NONE, + presentationModeState = PresentationModeState.NORMAL; const disableActive = () => { - const prevActive = this.#active; - this.switchTool(_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.CursorTool.SELECT); - this.#prevActive ??= prevActive; + this.#prevActive ??= this.#active; + this.#switchTool(CursorTool.SELECT, true); }; const enableActive = () => { - const prevActive = this.#prevActive; - if (prevActive !== null && annotationEditorMode === pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.NONE && presentationModeState === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.PresentationModeState.NORMAL) { + if (this.#prevActive !== null && annotationEditorMode === AnnotationEditorType.NONE && presentationModeState === PresentationModeState.NORMAL) { + this.#switchTool(this.#prevActive); this.#prevActive = null; - this.switchTool(prevActive); } }; - this.eventBus._on("secondarytoolbarreset", evt => { - if (this.#prevActive !== null) { - annotationEditorMode = pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.NONE; - presentationModeState = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.PresentationModeState.NORMAL; - enableActive(); - } - }); - this.eventBus._on("annotationeditormodechanged", ({ + eventBus.on("annotationeditormodechanged", ({ mode }) => { annotationEditorMode = mode; - if (mode === pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.NONE) { + if (mode === AnnotationEditorType.NONE) { enableActive(); } else { disableActive(); } - }); - this.eventBus._on("presentationmodechanged", ({ + }, internalOpt); + eventBus.on("presentationmodechanged", ({ state }) => { presentationModeState = state; - if (state === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.PresentationModeState.NORMAL) { + if (state === PresentationModeState.NORMAL) { enableActive(); - } else if (state === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.PresentationModeState.FULLSCREEN) { + } else if (state === PresentationModeState.FULLSCREEN) { disableActive(); } - }); + }, internalOpt); } get _handTool() { - return (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "_handTool", new _grab_to_pan_js__WEBPACK_IMPORTED_MODULE_2__.GrabToPan({ + return shadow(this, "_handTool", new GrabToPan({ element: this.container })); } } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), - -/***/ 164: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { +;// ./web/pdf_document_properties.js -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFDocumentProperties: () => (/* binding */ PDFDocumentProperties) -/* harmony export */ }); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7256); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2603); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__]); -pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; -const DEFAULT_FIELD_CONTENT = "-"; const NON_METRIC_LOCALES = ["en-us", "en-lr", "my"]; const US_PAGE_NAMES = { - "8.5x11": "letter", - "8.5x14": "legal" + "8.5x11": "pdfjs-document-properties-page-size-name-letter", + "8.5x14": "pdfjs-document-properties-page-size-name-legal" }; const METRIC_PAGE_NAMES = { - "297x420": "a-three", - "210x297": "a-four" + "297x420": "pdfjs-document-properties-page-size-name-a-three", + "210x297": "pdfjs-document-properties-page-size-name-a-four" }; function getPageName(size, isPortrait, pageNames) { const width = isPortrait ? size.width : size.height; @@ -6073,22 +6343,22 @@ dialog, fields, closeButton - }, overlayManager, eventBus, l10n, fileNameLookup) { + }, overlayManager, eventBus, l10n, fileNameLookup, titleLookup) { this.dialog = dialog; this.fields = fields; this.overlayManager = overlayManager; this.l10n = l10n; this._fileNameLookup = fileNameLookup; + this._titleLookup = titleLookup; this.#reset(); closeButton.addEventListener("click", this.close.bind(this)); this.overlayManager.register(this.dialog); - eventBus._on("pagechanging", evt => { + eventBus.on("pagechanging", evt => { this._currentPageNumber = evt.pageNumber; - }); - eventBus._on("rotationchanging", evt => { + }, internalOpt); + eventBus.on("rotationchanging", evt => { this._pagesRotation = evt.pagesRotation; - }); - this._isNonMetricLocale = NON_METRIC_LOCALES.includes(l10n.getLanguage()); + }, internalOpt); } async open() { await Promise.all([this.overlayManager.open(this.dialog), this._dataAvailableCapability.promise]); @@ -6098,24 +6368,26 @@ this.#updateUI(); return; } - const { + const [{ info, + metadata, contentLength - } = await this.pdfDocument.getMetadata(); - const [fileName, fileSize, creationDate, modificationDate, pageSize, isLinearized] = await Promise.all([this._fileNameLookup(), this.#parseFileSize(contentLength), this.#parseDate(info.CreationDate), this.#parseDate(info.ModDate), this.pdfDocument.getPage(currentPageNumber).then(pdfPage => { - return this.#parsePageSize((0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.getPageSizeInches)(pdfPage), pagesRotation); - }), this.#parseLinearization(info.IsLinearized)]); + }, pdfPage] = await Promise.all([this.pdfDocument.getMetadata(), this.pdfDocument.getPage(currentPageNumber).catch(reason => { + console.error(`PDFDocumentProperties - unable to get page ${currentPageNumber}.`, reason); + return null; + })]); + const [fileName, fileSize, title, creationDate, modificationDate, pageSize, isLinearized] = await Promise.all([this._fileNameLookup(), this.#parseFileSize(contentLength), this._titleLookup(), this.#parseDate(metadata?.get("xmp:createdate"), info.CreationDate), this.#parseDate(metadata?.get("xmp:modifydate"), info.ModDate), this.#parsePageSize(pdfPage, pagesRotation), this.#parseLinearization(info.IsLinearized)]); this.#fieldData = Object.freeze({ fileName, fileSize, - title: info.Title, - author: info.Author, - subject: info.Subject, - keywords: info.Keywords, + title, + author: metadata?.get("dc:creator")?.join("\n") || info.Author, + subject: metadata?.get("dc:subject")?.join("\n") || info.Subject, + keywords: metadata?.get("pdf:keywords") || info.Keywords, creationDate, modificationDate, - creator: info.Creator, - producer: info.Producer, + creator: metadata?.get("xmp:creatortool") || info.Creator, + producer: metadata?.get("pdf:producer") || info.Producer, version: info.PDFFormatVersion, pageCount: this.pdfDocument.numPages, pageSize, @@ -6141,7 +6413,7 @@ setDocument(pdfDocument) { if (this.pdfDocument) { this.#reset(); - this.#updateUI(true); + this.#updateUI(); } if (!pdfDocument) { return; @@ -6156,44 +6428,37 @@ this._currentPageNumber = 1; this._pagesRotation = 0; } - #updateUI(reset = false) { - if (reset || !this.#fieldData) { - for (const id in this.fields) { - this.fields[id].textContent = DEFAULT_FIELD_CONTENT; - } - return; - } - if (this.overlayManager.active !== this.dialog) { + #updateUI() { + if (this.#fieldData && this.overlayManager.active !== this.dialog) { return; } for (const id in this.fields) { - const content = this.#fieldData[id]; - this.fields[id].textContent = content || content === 0 ? content : DEFAULT_FIELD_CONTENT; + const content = this.#fieldData?.[id]; + this.fields[id].textContent = content || content === 0 ? content : "-"; } } - async #parseFileSize(fileSize = 0) { - const kb = fileSize / 1024, + async #parseFileSize(b = 0) { + const kb = b / 1024, mb = kb / 1024; - if (!kb) { - return undefined; - } - return this.l10n.get(`pdfjs-document-properties-${mb >= 1 ? "mb" : "kb"}`, { - size_mb: mb >= 1 && (+mb.toPrecision(3)).toLocaleString(), - size_kb: mb < 1 && (+kb.toPrecision(3)).toLocaleString(), - size_b: fileSize.toLocaleString() - }); + return kb ? this.l10n.get(mb >= 1 ? "pdfjs-document-properties-size-mb" : "pdfjs-document-properties-size-kb", { + mb, + kb, + b + }) : undefined; } - async #parsePageSize(pageSizeInches, pagesRotation) { - if (!pageSizeInches) { + async #parsePageSize(pdfPage, pagesRotation) { + if (!pdfPage) { return undefined; } + let pageSizeInches = getPageSizeInches(pdfPage); if (pagesRotation % 180 !== 0) { pageSizeInches = { width: pageSizeInches.height, height: pageSizeInches.width }; } - const isPortrait = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.isPortraitOrientation)(pageSizeInches); + const isPortrait = isPortraitOrientation(pageSizeInches), + nonMetric = NON_METRIC_LOCALES.includes(this.l10n.getLanguage()); let sizeInches = { width: Math.round(pageSizeInches.width * 100) / 100, height: Math.round(pageSizeInches.height * 100) / 100 @@ -6202,8 +6467,8 @@ width: Math.round(pageSizeInches.width * 25.4 * 10) / 10, height: Math.round(pageSizeInches.height * 25.4 * 10) / 10 }; - let rawName = getPageName(sizeInches, isPortrait, US_PAGE_NAMES) || getPageName(sizeMillimeters, isPortrait, METRIC_PAGE_NAMES); - if (!rawName && !(Number.isInteger(sizeMillimeters.width) && Number.isInteger(sizeMillimeters.height))) { + let nameId = getPageName(sizeInches, isPortrait, US_PAGE_NAMES) || getPageName(sizeMillimeters, isPortrait, METRIC_PAGE_NAMES); + if (!nameId && !(Number.isInteger(sizeMillimeters.width) && Number.isInteger(sizeMillimeters.height))) { const exactMillimeters = { width: pageSizeInches.width * 25.4, height: pageSizeInches.height * 25.4 @@ -6213,8 +6478,8 @@ height: Math.round(sizeMillimeters.height) }; if (Math.abs(exactMillimeters.width - intMillimeters.width) < 0.1 && Math.abs(exactMillimeters.height - intMillimeters.height) < 0.1) { - rawName = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES); - if (rawName) { + nameId = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES); + if (nameId) { sizeInches = { width: Math.round(intMillimeters.width / 25.4 * 100) / 100, height: Math.round(intMillimeters.height / 25.4 * 100) / 100 @@ -6226,223 +6491,28 @@ const [{ width, height - }, unit, name, orientation] = await Promise.all([this._isNonMetricLocale ? sizeInches : sizeMillimeters, this.l10n.get(`pdfjs-document-properties-page-size-unit-${this._isNonMetricLocale ? "inches" : "millimeters"}`), rawName && this.l10n.get(`pdfjs-document-properties-page-size-name-${rawName}`), this.l10n.get(`pdfjs-document-properties-page-size-orientation-${isPortrait ? "portrait" : "landscape"}`)]); - return this.l10n.get(`pdfjs-document-properties-page-size-dimension-${name ? "name-" : ""}string`, { - width: width.toLocaleString(), - height: height.toLocaleString(), + }, unit, name, orientation] = await Promise.all([nonMetric ? sizeInches : sizeMillimeters, this.l10n.get(nonMetric ? "pdfjs-document-properties-page-size-unit-inches" : "pdfjs-document-properties-page-size-unit-millimeters"), nameId && this.l10n.get(nameId), this.l10n.get(isPortrait ? "pdfjs-document-properties-page-size-orientation-portrait" : "pdfjs-document-properties-page-size-orientation-landscape")]); + return this.l10n.get(name ? "pdfjs-document-properties-page-size-dimension-name-string" : "pdfjs-document-properties-page-size-dimension-string", { + width, + height, unit, name, orientation }); } - async #parseDate(inputDate) { - const dateObject = pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.PDFDateString.toDateObject(inputDate); - if (!dateObject) { - return undefined; - } - return this.l10n.get("pdfjs-document-properties-date-string", { - date: dateObject.toLocaleDateString(), - time: dateObject.toLocaleTimeString() - }); + async #parseDate(metadataDate, infoDate) { + const dateObj = Date.parse(metadataDate) || PDFDateString.toDateObject(infoDate); + return dateObj ? this.l10n.get("pdfjs-document-properties-date-time-string", { + dateObj: dateObj.valueOf() + }) : undefined; } #parseLinearization(isLinearized) { - return this.l10n.get(`pdfjs-document-properties-linearized-${isLinearized ? "yes" : "no"}`); + return this.l10n.get(isLinearized ? "pdfjs-document-properties-linearized-yes" : "pdfjs-document-properties-linearized-no"); } } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), - -/***/ 2226: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { +;// ./web/pdf_find_utils.js -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFFindBar: () => (/* binding */ PDFFindBar) -/* harmony export */ }); -/* harmony import */ var _pdf_find_controller_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9814); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7256); - - -const MATCHES_COUNT_LIMIT = 1000; -class PDFFindBar { - #resizeObserver = new ResizeObserver(this.#resizeObserverCallback.bind(this)); - constructor(options, eventBus) { - this.opened = false; - this.bar = options.bar; - this.toggleButton = options.toggleButton; - this.findField = options.findField; - this.highlightAll = options.highlightAllCheckbox; - this.caseSensitive = options.caseSensitiveCheckbox; - this.matchDiacritics = options.matchDiacriticsCheckbox; - this.entireWord = options.entireWordCheckbox; - this.findMsg = options.findMsg; - this.findResultsCount = options.findResultsCount; - this.findPreviousButton = options.findPreviousButton; - this.findNextButton = options.findNextButton; - this.eventBus = eventBus; - this.toggleButton.addEventListener("click", () => { - this.toggle(); - }); - this.findField.addEventListener("input", () => { - this.dispatchEvent(""); - }); - this.bar.addEventListener("keydown", e => { - switch (e.keyCode) { - case 13: - if (e.target === this.findField) { - this.dispatchEvent("again", e.shiftKey); - } - break; - case 27: - this.close(); - break; - } - }); - this.findPreviousButton.addEventListener("click", () => { - this.dispatchEvent("again", true); - }); - this.findNextButton.addEventListener("click", () => { - this.dispatchEvent("again", false); - }); - this.highlightAll.addEventListener("click", () => { - this.dispatchEvent("highlightallchange"); - }); - this.caseSensitive.addEventListener("click", () => { - this.dispatchEvent("casesensitivitychange"); - }); - this.entireWord.addEventListener("click", () => { - this.dispatchEvent("entirewordchange"); - }); - this.matchDiacritics.addEventListener("click", () => { - this.dispatchEvent("diacriticmatchingchange"); - }); - } - reset() { - this.updateUIState(); - } - dispatchEvent(type, findPrev = false) { - this.eventBus.dispatch("find", { - source: this, - type, - query: this.findField.value, - caseSensitive: this.caseSensitive.checked, - entireWord: this.entireWord.checked, - highlightAll: this.highlightAll.checked, - findPrevious: findPrev, - matchDiacritics: this.matchDiacritics.checked - }); - } - updateUIState(state, previous, matchesCount) { - const { - findField, - findMsg - } = this; - let findMsgId = "", - status = ""; - switch (state) { - case _pdf_find_controller_js__WEBPACK_IMPORTED_MODULE_0__.FindState.FOUND: - break; - case _pdf_find_controller_js__WEBPACK_IMPORTED_MODULE_0__.FindState.PENDING: - status = "pending"; - break; - case _pdf_find_controller_js__WEBPACK_IMPORTED_MODULE_0__.FindState.NOT_FOUND: - findMsgId = "pdfjs-find-not-found"; - status = "notFound"; - break; - case _pdf_find_controller_js__WEBPACK_IMPORTED_MODULE_0__.FindState.WRAPPED: - findMsgId = `pdfjs-find-reached-${previous ? "top" : "bottom"}`; - break; - } - findField.setAttribute("data-status", status); - findField.setAttribute("aria-invalid", state === _pdf_find_controller_js__WEBPACK_IMPORTED_MODULE_0__.FindState.NOT_FOUND); - findMsg.setAttribute("data-status", status); - if (findMsgId) { - findMsg.setAttribute("data-l10n-id", findMsgId); - } else { - findMsg.removeAttribute("data-l10n-id"); - findMsg.textContent = ""; - } - this.updateResultsCount(matchesCount); - } - updateResultsCount({ - current = 0, - total = 0 - } = {}) { - const { - findResultsCount - } = this; - if (total > 0) { - const limit = MATCHES_COUNT_LIMIT; - findResultsCount.setAttribute("data-l10n-id", `pdfjs-find-match-count${total > limit ? "-limit" : ""}`); - findResultsCount.setAttribute("data-l10n-args", JSON.stringify({ - limit, - current, - total - })); - } else { - findResultsCount.removeAttribute("data-l10n-id"); - findResultsCount.textContent = ""; - } - } - open() { - if (!this.opened) { - this.#resizeObserver.observe(this.bar.parentNode); - this.#resizeObserver.observe(this.bar); - this.opened = true; - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.toggleExpandedBtn)(this.toggleButton, true, this.bar); - } - this.findField.select(); - this.findField.focus(); - } - close() { - if (!this.opened) { - return; - } - this.#resizeObserver.disconnect(); - this.opened = false; - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.toggleExpandedBtn)(this.toggleButton, false, this.bar); - this.eventBus.dispatch("findbarclose", { - source: this - }); - } - toggle() { - if (this.opened) { - this.close(); - } else { - this.open(); - } - } - #resizeObserverCallback(entries) { - const { - bar - } = this; - bar.classList.remove("wrapContainers"); - const findbarHeight = bar.clientHeight; - const inputContainerHeight = bar.firstElementChild.clientHeight; - if (findbarHeight > inputContainerHeight) { - bar.classList.add("wrapContainers"); - } - } -} - - -/***/ }), - -/***/ 9814: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - - -// EXPORTS -__webpack_require__.d(__webpack_exports__, { - FindState: () => (/* binding */ FindState), - PDFFindController: () => (/* binding */ PDFFindController) -}); - -// EXTERNAL MODULE: ./web/ui_utils.js -var ui_utils = __webpack_require__(7256); -;// CONCATENATED MODULE: ./web/pdf_find_utils.js const CharacterType = { SPACE: 0, ALPHA_LETTER: 1, @@ -6512,11 +6582,50 @@ } let NormalizeWithNFKC; function getNormalizeWithNFKC() { - NormalizeWithNFKC ||= ` ¨ª¯²-µ¸-º¼-¾IJ-ijĿ-ŀʼnſDŽ-njDZ-dzʰ-ʸ˘-˝ˠ-ˤʹͺ;΄-΅·ϐ-ϖϰ-ϲϴ-ϵϹևٵ-ٸक़-य़ড়-ঢ়য়ਲ਼ਸ਼ਖ਼-ਜ਼ਫ਼ଡ଼-ଢ଼ำຳໜ-ໝ༌གྷཌྷདྷབྷཛྷཀྵჼᴬ-ᴮᴰ-ᴺᴼ-ᵍᵏ-ᵪᵸᶛ-ᶿẚ-ẛάέήίόύώΆ᾽-῁ΈΉ῍-῏ΐΊ῝-῟ΰΎ῭-`ΌΏ´-῾ - ‑‗․-… ″-‴‶-‷‼‾⁇-⁉⁗ ⁰-ⁱ⁴-₎ₐ-ₜ₨℀-℃℅-ℇ℉-ℓℕ-№ℙ-ℝ℠-™ℤΩℨK-ℭℯ-ℱℳ-ℹ℻-⅀ⅅ-ⅉ⅐-ⅿ↉∬-∭∯-∰〈-〉①-⓪⨌⩴-⩶⫝̸ⱼ-ⱽⵯ⺟⻳⼀-⿕ 〶〸-〺゛-゜ゟヿㄱ-ㆎ㆒-㆟㈀-㈞㈠-㉇㉐-㉾㊀-㏿ꚜ-ꚝꝰꟲ-ꟴꟸ-ꟹꭜ-ꭟꭩ豈-嗀塚晴凞-羽蘒諸逸-都飯-舘並-龎ff-stﬓ-ﬗיִײַ-זּטּ-לּמּנּ-סּףּ-פּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-﷼︐-︙︰-﹄﹇-﹒﹔-﹦﹨-﹫ﹰ-ﹲﹴﹶ-ﻼ!-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ¢-₩`; + if (!NormalizeWithNFKC) { + const ranges = []; + const range = []; + const diacriticsRegex = /^\p{M}$/u; + for (let i = 0; i < 65536; i++) { + if (i >= 0xd800 && i <= 0xdfff) { + continue; + } + const c = String.fromCharCode(i); + if (c.normalize("NFKC") !== c && !diacriticsRegex.test(c)) { + if (range.length !== 2) { + range[0] = range[1] = i; + continue; + } + if (range[1] + 1 !== i) { + if (range[0] === range[1]) { + ranges.push(String.fromCharCode(range[0])); + } else { + ranges.push(`${String.fromCharCode(range[0])}-${String.fromCharCode(range[1])}`); + } + range[0] = range[1] = i; + } else { + range[1] = i; + } + } + } + const rangesStr = ranges.join(""); + if (!NormalizeWithNFKC) { + NormalizeWithNFKC = rangesStr; + } else if (rangesStr !== NormalizeWithNFKC) { + for (let i = 1; i < rangesStr.length; i++) { + if (rangesStr[i] !== NormalizeWithNFKC[i]) { + console.log(`Difference at index ${i}: ` + `U+${rangesStr.charCodeAt(i).toString(16).toUpperCase().padStart(4, "0")}` + `!== U+${NormalizeWithNFKC.charCodeAt(i).toString(16).toUpperCase().padStart(4, "0")}`); + break; + } + } + throw new Error("getNormalizeWithNFKC - update the `NormalizeWithNFKC` string."); + } + } return NormalizeWithNFKC; } -;// CONCATENATED MODULE: ./web/pdf_find_controller.js +;// ./web/pdf_find_controller.js + const FindState = { @@ -6525,9 +6634,6 @@ WRAPPED: 2, PENDING: 3 }; -const FIND_TIMEOUT = 250; -const MATCH_SCROLL_OFFSET_TOP = -50; -const MATCH_SCROLL_OFFSET_LEFT = -400; const CHARACTERS_TO_NORMALIZE = { "\u2010": "-", "\u2018": "'", @@ -6545,16 +6651,16 @@ const DIACRITICS_EXCEPTION = new Set([0x3099, 0x309a, 0x094d, 0x09cd, 0x0a4d, 0x0acd, 0x0b4d, 0x0bcd, 0x0c4d, 0x0ccd, 0x0d3b, 0x0d3c, 0x0d4d, 0x0dca, 0x0e3a, 0x0eba, 0x0f84, 0x1039, 0x103a, 0x1714, 0x1734, 0x17d2, 0x1a60, 0x1b44, 0x1baa, 0x1bab, 0x1bf2, 0x1bf3, 0x2d7f, 0xa806, 0xa82c, 0xa8c4, 0xa953, 0xa9c0, 0xaaf6, 0xabed, 0x0c56, 0x0f71, 0x0f72, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f80, 0x0f74]); let DIACRITICS_EXCEPTION_STR; const DIACRITICS_REG_EXP = /\p{M}+/gu; -const SPECIAL_CHARS_REG_EXP = /([.*+?^${}()|[\]\\])|(\p{P})|(\s+)|(\p{M})|(\p{L})/gu; -const NOT_DIACRITIC_FROM_END_REG_EXP = /([^\p{M}])\p{M}*$/u; -const NOT_DIACRITIC_FROM_START_REG_EXP = /^\p{M}*([^\p{M}])/u; +const SPECIAL_CHARS_REG_EXP = /([+^$|])|(\p{P}+)|(\s+)|(\p{M})|(\p{L})/gu; +const NOT_DIACRITIC_FROM_END_REG_EXP = /(\P{M})\p{M}*$/u; +const NOT_DIACRITIC_FROM_START_REG_EXP = /^\p{M}*(\P{M})/u; const SYLLABLES_REG_EXP = /[\uAC00-\uD7AF\uFA6C\uFACF-\uFAD1\uFAD5-\uFAD7]+/g; const SYLLABLES_LENGTHS = new Map(); const FIRST_CHAR_SYLLABLES_REG_EXP = "[\\u1100-\\u1112\\ud7a4-\\ud7af\\ud84a\\ud84c\\ud850\\ud854\\ud857\\ud85f]"; const NFKC_CHARS_TO_NORMALIZE = new Map(); let noSyllablesRegExp = null; let withSyllablesRegExp = null; -function normalize(text) { +function normalize(text, options = {}) { const syllablePositions = []; let m; while ((m = SYLLABLES_REG_EXP.exec(text)) !== null) { @@ -6570,21 +6676,25 @@ syllablePositions.push([len, index++]); } } + const hasSyllables = syllablePositions.length > 0; + const ignoreDashEOL = options.ignoreDashEOL ?? false; let normalizationRegex; - if (syllablePositions.length === 0 && noSyllablesRegExp) { + if (!hasSyllables && noSyllablesRegExp) { normalizationRegex = noSyllablesRegExp; - } else if (syllablePositions.length > 0 && withSyllablesRegExp) { + } else if (hasSyllables && withSyllablesRegExp) { normalizationRegex = withSyllablesRegExp; } else { const replace = Object.keys(CHARACTERS_TO_NORMALIZE).join(""); const toNormalizeWithNFKC = getNormalizeWithNFKC(); const CJK = "(?:\\p{Ideographic}|[\u3040-\u30FF])"; const HKDiacritics = "(?:\u3099|\u309A)"; - const regexp = `([${replace}])|([${toNormalizeWithNFKC}])|(${HKDiacritics}\\n)|(\\p{M}+(?:-\\n)?)|(\\S-\\n)|(${CJK}\\n)|(\\n)`; - if (syllablePositions.length === 0) { - normalizationRegex = noSyllablesRegExp = new RegExp(regexp + "|(\\u0000)", "gum"); + const BrokenWord = `\\p{Ll}-\\n(?=\\p{Ll})|\\p{Lu}-\\n(?=\\p{L})`; + const regexps = [`[${replace}]`, `[${toNormalizeWithNFKC}]`, `${HKDiacritics}\\n`, "\\p{M}+(?:-\\n)?", `${BrokenWord}`, "\\S-\\n", `${CJK}\\n`, "\\n", hasSyllables ? FIRST_CHAR_SYLLABLES_REG_EXP : "\\u0000"]; + normalizationRegex = new RegExp(regexps.map(r => `(${r})`).join("|"), "gmu"); + if (hasSyllables) { + withSyllablesRegExp = normalizationRegex; } else { - normalizationRegex = withSyllablesRegExp = new RegExp(regexp + `|(${FIRST_CHAR_SYLLABLES_REG_EXP})`, "gum"); + noSyllablesRegExp = normalizationRegex; } } const rawDiacriticsPositions = []; @@ -6592,20 +6702,20 @@ rawDiacriticsPositions.push([m[0].length, m.index]); } let normalized = text.normalize("NFD"); - const positions = [[0, 0]]; + const positions = [0, 0]; let rawDiacriticsIndex = 0; let syllableIndex = 0; let shift = 0; let shiftOrigin = 0; let eol = 0; let hasDiacritics = false; - normalized = normalized.replace(normalizationRegex, (match, p1, p2, p3, p4, p5, p6, p7, p8, i) => { + normalized = normalized.replace(normalizationRegex, (match, p1, p2, p3, p4, p5, p6, p7, p8, p9, i) => { i -= shiftOrigin; if (p1) { const replacement = CHARACTERS_TO_NORMALIZE[p1]; const jj = replacement.length; for (let j = 1; j < jj; j++) { - positions.push([i - shift + j, shift - j]); + positions.push(i - shift + j, shift - j); } shift -= jj - 1; return replacement; @@ -6618,7 +6728,7 @@ } const jj = replacement.length; for (let j = 1; j < jj; j++) { - positions.push([i - shift + j, shift - j]); + positions.push(i - shift + j, shift - j); } shift -= jj - 1; return replacement; @@ -6628,11 +6738,11 @@ if (i + eol === rawDiacriticsPositions[rawDiacriticsIndex]?.[1]) { ++rawDiacriticsIndex; } else { - positions.push([i - 1 - shift + 1, shift - 1]); + positions.push(i - 1 - shift + 1, shift - 1); shift -= 1; shiftOrigin += 1; } - positions.push([i - shift + 1, shift]); + positions.push(i - shift + 1, shift); shiftOrigin += 1; eol += 1; return p3.charAt(0); @@ -6647,13 +6757,13 @@ ++rawDiacriticsIndex; } for (let j = 1; j <= jj; j++) { - positions.push([i - 1 - shift + j, shift - j]); + positions.push(i - 1 - shift + j, shift - j); } shift -= jj; shiftOrigin += jj; if (hasTrailingDashEOL) { i += len - 1; - positions.push([i - shift + 1, 1 + shift]); + positions.push(i - shift + 1, 1 + shift); shift += 1; shiftOrigin += 1; eol += 1; @@ -6662,22 +6772,32 @@ return p4; } if (p5) { + if (ignoreDashEOL) { + shiftOrigin += 1; + eol += 1; + return p5.slice(0, -1); + } const len = p5.length - 2; - positions.push([i - shift + len, 1 + shift]); + positions.push(i - shift + len, 1 + shift); shift += 1; shiftOrigin += 1; eol += 1; return p5.slice(0, -2); } if (p6) { - const len = p6.length - 1; - positions.push([i - shift + len, shift]); shiftOrigin += 1; eol += 1; return p6.slice(0, -1); } if (p7) { - positions.push([i - shift + 1, shift - 1]); + const len = p7.length - 1; + positions.push(i - shift + len, shift); + shiftOrigin += 1; + eol += 1; + return p7.slice(0, -1); + } + if (p8) { + positions.push(i - shift + 1, shift - 1); shift -= 1; shiftOrigin += 1; eol += 1; @@ -6687,51 +6807,64 @@ const newCharLen = syllablePositions[syllableIndex][0] - 1; ++syllableIndex; for (let j = 1; j <= newCharLen; j++) { - positions.push([i - (shift - j), shift - j]); + positions.push(i - (shift - j), shift - j); } shift -= newCharLen; shiftOrigin += newCharLen; } - return p8; + return p9; }); - positions.push([normalized.length, shift]); - return [normalized, positions, hasDiacritics]; + positions.push(normalized.length, shift); + const starts = new Uint32Array(positions.length >> 1); + const shifts = new Int32Array(positions.length >> 1); + for (let i = 0, ii = positions.length; i < ii; i += 2) { + starts[i >> 1] = positions[i]; + shifts[i >> 1] = positions[i + 1]; + } + return [normalized, [starts, shifts], hasDiacritics]; } function getOriginalIndex(diffs, pos, len) { if (!diffs) { return [pos, len]; } + const [starts, shifts] = diffs; const start = pos; const end = pos + len - 1; - let i = (0,ui_utils.binarySearchFirstItem)(diffs, x => x[0] >= start); - if (diffs[i][0] > start) { + let i = binarySearchFirstItem(starts, x => x >= start); + if (starts[i] > start) { --i; } - let j = (0,ui_utils.binarySearchFirstItem)(diffs, x => x[0] >= end, i); - if (diffs[j][0] > end) { + let j = binarySearchFirstItem(starts, x => x >= end, i); + if (starts[j] > end) { --j; } - const oldStart = start + diffs[i][1]; - const oldEnd = end + diffs[j][1]; + const oldStart = start + shifts[i]; + const oldEnd = end + shifts[j]; const oldLen = oldEnd + 1 - oldStart; return [oldStart, oldLen]; } class PDFFindController { #state = null; #updateMatchesCountOnProgress = true; + #delay = 0; #visitedPagesCount = 0; + #copiedPageData = null; + #savedPageData = null; constructor({ linkService, eventBus, + delay = 250, updateMatchesCountOnProgress = true }) { this._linkService = linkService; this._eventBus = eventBus; this.#updateMatchesCountOnProgress = updateMatchesCountOnProgress; + this.#delay = delay; this.onIsPageVisible = null; this.#reset(); - eventBus._on("find", this.#onFind.bind(this)); - eventBus._on("findbarclose", this.#onFindBarClose.bind(this)); + eventBus.on("find", this.#onFind.bind(this), internalOpt); + eventBus.on("findbarclose", this.#onFindBarClose.bind(this), internalOpt); + eventBus.on("pagesedited", this.#onPagesEdited.bind(this), internalOpt); } get highlightMatches() { return this._highlightMatches; @@ -6788,7 +6921,7 @@ this._findTimeout = setTimeout(() => { this.#nextMatch(); this._findTimeout = null; - }, FIND_TIMEOUT); + }, this.#delay); } else if (this._dirtyMatch) { this.#nextMatch(); } else if (type === "again") { @@ -6810,7 +6943,6 @@ } scrollMatchIntoView({ element = null, - selectedLeft = 0, pageIndex = -1, matchIndex = -1 }) { @@ -6822,11 +6954,10 @@ return; } this._scrollMatches = false; - const spot = { - top: MATCH_SCROLL_OFFSET_TOP, - left: selectedLeft + MATCH_SCROLL_OFFSET_LEFT - }; - (0,ui_utils.scrollIntoView)(element, spot, true); + element.scrollIntoView({ + block: "start", + inline: "center" + }); } #reset() { this._highlightMatches = false; @@ -6856,6 +6987,7 @@ this._dirtyMatch = false; clearTimeout(this._findTimeout); this._findTimeout = null; + this.#copiedPageData = null; this._firstPageCapability = Promise.withResolvers(); } get #query() { @@ -6915,36 +7047,29 @@ } return true; } - #calculateRegExpMatch(query, entireWord, pageIndex, pageContent) { - const matches = this._pageMatches[pageIndex] = []; - const matchesLength = this._pageMatchesLength[pageIndex] = []; - if (!query) { - return; - } - const diffs = this._pageDiffs[pageIndex]; - let match; - while ((match = query.exec(pageContent)) !== null) { - if (entireWord && !this.#isEntireWord(pageContent, match.index, match[0].length)) { - continue; - } - const [matchPos, matchLen] = getOriginalIndex(diffs, match.index, match[0].length); - if (matchLen) { - matches.push(matchPos); - matchesLength.push(matchLen); - } - } - } #convertToRegExpString(query, hasDiacritics) { const { matchDiacritics } = this.#state; let isUnicode = false; + const addExtraWhitespaces = (original, fixed) => { + if (original === query) { + return fixed; + } + if (query.startsWith(original)) { + return `${fixed}[ ]*`; + } + if (query.endsWith(original)) { + return `[ ]*${fixed}`; + } + return `[ ]*${fixed}[ ]*`; + }; query = query.replaceAll(SPECIAL_CHARS_REG_EXP, (match, p1, p2, p3, p4, p5) => { if (p1) { - return `[ ]*\\${p1}[ ]*`; + return addExtraWhitespaces(p1, RegExp.escape(p1)); } if (p2) { - return `[ ]*${p2}[ ]*`; + return addExtraWhitespaces(p2, RegExp.escape(p2)); } if (p3) { return "[ ]+"; @@ -6975,29 +7100,28 @@ return [isUnicode, query]; } #calculateMatch(pageIndex) { - let query = this.#query; + if (!this.#state) { + return; + } + const query = this.#query; if (query.length === 0) { return; } - const { - caseSensitive, - entireWord - } = this.#state; const pageContent = this._pageContents[pageIndex]; - const hasDiacritics = this._hasDiacritics[pageIndex]; - let isUnicode = false; - if (typeof query === "string") { - [isUnicode, query] = this.#convertToRegExpString(query, hasDiacritics); - } else { - query = query.sort().reverse().map(q => { - const [isUnicodePart, queryPart] = this.#convertToRegExpString(q, hasDiacritics); - isUnicode ||= isUnicodePart; - return `(${queryPart})`; - }).join("|"); - } - const flags = `g${isUnicode ? "u" : ""}${caseSensitive ? "" : "i"}`; - query = query ? new RegExp(query, flags) : null; - this.#calculateRegExpMatch(query, entireWord, pageIndex, pageContent); + const matcherResult = this.match(query, pageContent, pageIndex); + const matches = this._pageMatches[pageIndex] = []; + const matchesLength = this._pageMatchesLength[pageIndex] = []; + const diffs = this._pageDiffs[pageIndex]; + matcherResult?.forEach(({ + index, + length + }) => { + const [matchPos, matchLen] = getOriginalIndex(diffs, index, length); + if (matchLen) { + matches.push(matchPos); + matchesLength.push(matchLen); + } + }); if (this.#state.highlightAll) { this.#updatePage(pageIndex); } @@ -7005,7 +7129,7 @@ this._resumePageIdx = null; this.#nextPageMatch(); } - const pageMatchesCount = this._pageMatches[pageIndex].length; + const pageMatchesCount = matches.length; this._matchesCountTotal += pageMatchesCount; if (this.#updateMatchesCountOnProgress) { if (pageMatchesCount > 0) { @@ -7015,6 +7139,40 @@ this.#updateUIResultsCount(); } } + match(query, pageContent, pageIndex) { + const hasDiacritics = this._hasDiacritics[pageIndex]; + let isUnicode = false; + if (typeof query === "string") { + [isUnicode, query] = this.#convertToRegExpString(query, hasDiacritics); + } else { + query = query.sort().reverse().map(q => { + const [isUnicodePart, queryPart] = this.#convertToRegExpString(q, hasDiacritics); + isUnicode ||= isUnicodePart; + return `(${queryPart})`; + }).join("|"); + } + if (!query) { + return undefined; + } + const { + caseSensitive, + entireWord + } = this.#state; + const flags = `g${isUnicode ? "u" : ""}${caseSensitive ? "" : "i"}`; + query = new RegExp(query, flags); + const matches = []; + let match; + while ((match = query.exec(pageContent)) !== null) { + if (entireWord && !this.#isEntireWord(pageContent, match.index, match[0].length)) { + continue; + } + matches.push({ + index: match.index, + length: match[0].length + }); + } + return matches; + } #extractText() { if (this._extractTextPromises.length > 0) { return; @@ -7023,14 +7181,25 @@ const textOptions = { disableNormalization: true }; + const pdfDoc = this._pdfDocument; for (let i = 0, ii = this._linkService.pagesCount; i < ii; i++) { const { promise, resolve } = Promise.withResolvers(); this._extractTextPromises[i] = promise; - deferred = deferred.then(() => { - return this._pdfDocument.getPage(i + 1).then(pdfPage => pdfPage.getTextContent(textOptions)).then(textContent => { + deferred = deferred.then(async () => { + if (pdfDoc !== this._pdfDocument) { + resolve(); + return; + } + try { + const pdfPage = await pdfDoc.getPage(i + 1); + const textContent = await pdfPage.getTextContent(textOptions); + if (pdfDoc !== this._pdfDocument) { + resolve(); + return; + } const strBuf = []; for (const textItem of textContent.items) { strBuf.push(textItem.str); @@ -7039,14 +7208,15 @@ } } [this._pageContents[i], this._pageDiffs[i], this._hasDiacritics[i]] = normalize(strBuf.join("")); - resolve(); - }, reason => { - console.error(`Unable to get text content for page ${i + 1}`, reason); - this._pageContents[i] = ""; - this._pageDiffs[i] = null; - this._hasDiacritics[i] = false; - resolve(); - }); + } catch (ex) { + if (pdfDoc !== this._pdfDocument) { + resolve(); + return; + } + console.error(`Unable to get text content for page ${i + 1}`, ex); + [this._pageContents[i], this._pageDiffs[i], this._hasDiacritics[i]] = ["", null, false]; + } + resolve(); }); } } @@ -7177,6 +7347,89 @@ this.#updatePage(this._selected.pageIdx); } } + #onPagesEdited({ + pagesMapper, + type, + pageNumbers + }) { + if (this._extractTextPromises.length === 0) { + return; + } + if (type === "copy") { + const promises = new Map(); + const contents = new Map(); + const diffs = new Map(); + const diacritics = new Map(); + for (const pageNum of pageNumbers) { + promises.set(pageNum, this._extractTextPromises[pageNum - 1]); + contents.set(pageNum, this._pageContents[pageNum - 1]); + diffs.set(pageNum, this._pageDiffs[pageNum - 1]); + diacritics.set(pageNum, this._hasDiacritics[pageNum - 1]); + } + this.#copiedPageData = { + promises, + contents, + diffs, + diacritics + }; + return; + } + if (type === "cancelCopy") { + this.#copiedPageData = null; + return; + } + if (type === "delete") { + this.#savedPageData = { + promises: this._extractTextPromises, + contents: this._pageContents, + diffs: this._pageDiffs, + diacritics: this._hasDiacritics + }; + } + if (type === "cancelDelete") { + this._extractTextPromises = this.#savedPageData.promises; + this._pageContents = this.#savedPageData.contents; + this._pageDiffs = this.#savedPageData.diffs; + this._hasDiacritics = this.#savedPageData.diacritics; + return; + } + if (type === "cleanSavedData") { + this.#savedPageData = null; + return; + } + if (this._findTimeout) { + clearTimeout(this._findTimeout); + this._findTimeout = null; + } + this._resumePageIdx = null; + this._dirtyMatch = true; + const prevPromises = this._extractTextPromises; + const prevContents = this._pageContents; + const prevDiffs = this._pageDiffs; + const prevDiacritics = this._hasDiacritics; + const extractTextPromises = this._extractTextPromises = []; + const pageContents = this._pageContents = []; + const pageDiffs = this._pageDiffs = []; + const hasDiacritics = this._hasDiacritics = []; + for (let i = 1, ii = pagesMapper.pagesNumber; i <= ii; i++) { + const prevPageNumber = pagesMapper.getPrevPageNumber(i); + if (prevPageNumber < 0) { + const src = -prevPageNumber; + extractTextPromises.push(this.#copiedPageData?.promises.get(src) || Promise.resolve()); + pageContents.push(this.#copiedPageData?.contents.get(src) ?? ""); + pageDiffs.push(this.#copiedPageData?.diffs.get(src) ?? null); + hasDiacritics.push(this.#copiedPageData?.diacritics.get(src) ?? false); + continue; + } + extractTextPromises.push(prevPromises[prevPageNumber - 1] || Promise.resolve()); + pageContents.push(prevContents[prevPageNumber - 1] ?? ""); + pageDiffs.push(prevDiffs[prevPageNumber - 1] ?? null); + hasDiacritics.push(prevDiacritics[prevPageNumber - 1] ?? false); + } + if (this.#state) { + this.#nextMatch(); + } + } #onFindBarClose(evt) { const pdfDocument = this._pdfDocument; this._firstPageCapability.promise.then(() => { @@ -7231,24 +7484,184 @@ source: this, state, previous, + entireWord: this.#state?.entireWord ?? null, matchesCount: this.#requestMatchesCount(), rawQuery: this.#state?.query ?? null }); } } +;// ./web/pdf_find_bar.js + + +const MATCHES_COUNT_LIMIT = 1000; +class PDFFindBar { + #mainContainer; + #resizeObserver = new ResizeObserver(this.#resizeObserverCallback.bind(this)); + opened = false; + constructor(options, mainContainer, eventBus) { + this.bar = options.bar; + this.toggleButton = options.toggleButton; + this.findField = options.findField; + this.highlightAll = options.highlightAllCheckbox; + this.caseSensitive = options.caseSensitiveCheckbox; + this.matchDiacritics = options.matchDiacriticsCheckbox; + this.entireWord = options.entireWordCheckbox; + this.findMsg = options.findMsg; + this.findResultsCount = options.findResultsCount; + this.findPreviousButton = options.findPreviousButton; + this.findNextButton = options.findNextButton; + this.eventBus = eventBus; + this.#mainContainer = mainContainer; + const checkedInputs = new Map([[this.highlightAll, "highlightallchange"], [this.caseSensitive, "casesensitivitychange"], [this.entireWord, "entirewordchange"], [this.matchDiacritics, "diacriticmatchingchange"]]); + this.toggleButton.addEventListener("click", () => { + this.toggle(); + }); + this.findField.addEventListener("input", () => { + this.dispatchEvent(""); + }); + this.bar.addEventListener("keydown", ({ + keyCode, + shiftKey, + target + }) => { + switch (keyCode) { + case 13: + if (target === this.findField) { + this.dispatchEvent("again", shiftKey); + } else if (checkedInputs.has(target)) { + target.checked = !target.checked; + this.dispatchEvent(checkedInputs.get(target)); + } + break; + case 27: + this.close(); + break; + } + }); + this.findPreviousButton.addEventListener("click", () => { + this.dispatchEvent("again", true); + }); + this.findNextButton.addEventListener("click", () => { + this.dispatchEvent("again", false); + }); + for (const [elem, evtName] of checkedInputs) { + elem.addEventListener("click", () => { + this.dispatchEvent(evtName); + }); + } + } + reset() { + this.updateUIState(); + } + dispatchEvent(type, findPrev = false) { + this.eventBus.dispatch("find", { + source: this, + type, + query: this.findField.value, + caseSensitive: this.caseSensitive.checked, + entireWord: this.entireWord.checked, + highlightAll: this.highlightAll.checked, + findPrevious: findPrev, + matchDiacritics: this.matchDiacritics.checked + }); + } + updateUIState(state, previous, matchesCount) { + const { + findField, + findMsg + } = this; + let findMsgId = "", + status = ""; + switch (state) { + case FindState.FOUND: + break; + case FindState.PENDING: + status = "pending"; + break; + case FindState.NOT_FOUND: + findMsgId = "pdfjs-find-not-found"; + status = "notFound"; + break; + case FindState.WRAPPED: + findMsgId = previous ? "pdfjs-find-reached-top" : "pdfjs-find-reached-bottom"; + break; + } + findField.setAttribute("data-status", status); + findField.setAttribute("aria-invalid", state === FindState.NOT_FOUND); + findMsg.setAttribute("data-status", status); + if (findMsgId) { + findMsg.setAttribute("data-l10n-id", findMsgId); + } else { + findMsg.removeAttribute("data-l10n-id"); + findMsg.textContent = ""; + } + this.updateResultsCount(matchesCount); + } + updateResultsCount({ + current = 0, + total = 0 + } = {}) { + const { + findResultsCount + } = this; + if (total > 0) { + const limit = MATCHES_COUNT_LIMIT; + findResultsCount.setAttribute("data-l10n-id", total > limit ? "pdfjs-find-match-count-limit" : "pdfjs-find-match-count"); + findResultsCount.setAttribute("data-l10n-args", JSON.stringify({ + limit, + current, + total + })); + } else { + findResultsCount.removeAttribute("data-l10n-id"); + findResultsCount.textContent = ""; + } + } + open() { + if (!this.opened) { + this.#resizeObserver.observe(this.#mainContainer); + this.#resizeObserver.observe(this.bar); + this.opened = true; + toggleExpandedBtn(this.toggleButton, true, this.bar); + } + this.findField.select(); + this.findField.focus(); + } + close() { + if (!this.opened) { + return; + } + this.#resizeObserver.disconnect(); + this.opened = false; + toggleExpandedBtn(this.toggleButton, false, this.bar); + this.eventBus.dispatch("findbarclose", { + source: this + }); + } + toggle() { + if (this.opened) { + this.close(); + } else { + this.open(); + } + } + #resizeObserverCallback() { + const { + bar + } = this; + bar.classList.remove("wrapContainers"); + const findbarHeight = bar.clientHeight; + const inputContainerHeight = bar.firstElementChild.clientHeight; + if (findbarHeight > inputContainerHeight) { + bar.classList.add("wrapContainers"); + } + } +} -/***/ }), +;// ./web/pdf_history.js -/***/ 8543: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFHistory: () => (/* binding */ PDFHistory) -/* harmony export */ }); -/* unused harmony exports isDestArraysEqual, isDestHashesEqual */ -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7256); -/* harmony import */ var _event_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5656); const HASH_CHANGE_TIMEOUT = 1000; @@ -7258,6 +7671,7 @@ return document.location.hash; } class PDFHistory { + #eventAC = null; constructor({ linkService, eventBus @@ -7267,15 +7681,15 @@ this._initialized = false; this._fingerprint = ""; this.reset(); - this._boundEvents = null; - this.eventBus._on("pagesinit", () => { + this.eventBus.on("pagesinit", () => { this._isPagesLoaded = false; - this.eventBus._on("pagesloaded", evt => { + this.eventBus.on("pagesloaded", evt => { this._isPagesLoaded = !!evt.pagesCount; }, { - once: true + once: true, + ...internalOpt }); - }); + }, internalOpt); } initialize({ fingerprint, @@ -7293,7 +7707,7 @@ this._fingerprint = fingerprint; this._updateUrl = updateUrl === true; this._initialized = true; - this._bindEvents(); + this.#bindEvents(); const state = window.history.state; this._popStateInProgress = false; this._blockHashChange = 0; @@ -7302,17 +7716,17 @@ this._uid = this._maxUid = 0; this._destination = null; this._position = null; - if (!this._isValidState(state, true) || resetHistory) { + if (!this.#isValidState(state, true) || resetHistory) { const { hash, page, rotation - } = this._parseCurrentHash(true); + } = this.#parseCurrentHash(true); if (!hash || reInitialized || resetHistory) { - this._pushOrReplaceState(null, true); + this.#pushOrReplaceState(null, true); return; } - this._pushOrReplaceState({ + this.#pushOrReplaceState({ hash, page, rotation @@ -7320,7 +7734,7 @@ return; } const destination = state.destination; - this._updateInternalState(destination, state.uid, true); + this.#updateInternalState(destination, state.uid, true); if (destination.rotation !== undefined) { this._initialRotation = destination.rotation; } @@ -7335,9 +7749,9 @@ } reset() { if (this._initialized) { - this._pageHide(); + this.#pageHide(); this._initialized = false; - this._unbindEvents(); + this.#unbindEvents(); } if (this._updateViewareaTimeout) { clearTimeout(this._updateViewareaTimeout); @@ -7360,7 +7774,7 @@ } else if (!Array.isArray(explicitDest)) { console.error("PDFHistory.push: " + `"${explicitDest}" is not a valid explicitDest parameter.`); return; - } else if (!this._isValidPage(pageNumber)) { + } else if (!this.#isValidPage(pageNumber)) { if (pageNumber !== null || this._destination) { console.error("PDFHistory.push: " + `"${pageNumber}" is not a valid pageNumber parameter.`); return; @@ -7380,7 +7794,7 @@ if (this._popStateInProgress && !forceReplace) { return; } - this._pushOrReplaceState({ + this.#pushOrReplaceState({ dest: explicitDest, hash, page: pageNumber, @@ -7397,7 +7811,7 @@ if (!this._initialized) { return; } - if (!this._isValidPage(pageNumber)) { + if (!this.#isValidPage(pageNumber)) { console.error(`PDFHistory.pushPage: "${pageNumber}" is not a valid page number.`); return; } @@ -7407,7 +7821,7 @@ if (this._popStateInProgress) { return; } - this._pushOrReplaceState({ + this.#pushOrReplaceState({ dest: null, hash: `page=${pageNumber}`, page: pageNumber, @@ -7424,14 +7838,14 @@ if (!this._initialized || this._popStateInProgress) { return; } - this._tryPushCurrentPosition(); + this.#tryPushCurrentPosition(); } back() { if (!this._initialized || this._popStateInProgress) { return; } const state = window.history.state; - if (this._isValidState(state) && state.uid > 0) { + if (this.#isValidState(state) && state.uid > 0) { window.history.back(); } } @@ -7440,7 +7854,7 @@ return; } const state = window.history.state; - if (this._isValidState(state) && state.uid < this._maxUid) { + if (this.#isValidState(state) && state.uid < this._maxUid) { window.history.forward(); } } @@ -7453,19 +7867,22 @@ get initialRotation() { return this._initialized ? this._initialRotation : null; } - _pushOrReplaceState(destination, forceReplace = false) { + #pushOrReplaceState(destination, forceReplace = false) { const shouldReplace = forceReplace || !this._destination; const newState = { fingerprint: this._fingerprint, uid: shouldReplace ? this._uid : this._uid + 1, destination }; - this._updateInternalState(destination, newState.uid); + this.#updateInternalState(destination, newState.uid); let newUrl; if (this._updateUrl && destination?.hash) { - const baseUrl = document.location.href.split("#", 1)[0]; - if (!baseUrl.startsWith("file://")) { - newUrl = `${baseUrl}#${destination.hash}`; + const { + href, + protocol + } = document.location; + if (protocol !== "file:") { + newUrl = updateUrlHash(href, destination.hash); } } if (shouldReplace) { @@ -7474,7 +7891,7 @@ window.history.pushState(newState, "", newUrl); } } - _tryPushCurrentPosition(temporary = false) { + #tryPushCurrentPosition(temporary = false) { if (!this._position) { return; } @@ -7484,11 +7901,11 @@ position.temporary = true; } if (!this._destination) { - this._pushOrReplaceState(position); + this.#pushOrReplaceState(position); return; } if (this._destination.temporary) { - this._pushOrReplaceState(position, true); + this.#pushOrReplaceState(position, true); return; } if (this._destination.hash === position.hash) { @@ -7504,12 +7921,12 @@ } forceReplace = true; } - this._pushOrReplaceState(position, forceReplace); + this.#pushOrReplaceState(position, forceReplace); } - _isValidPage(val) { + #isValidPage(val) { return Number.isInteger(val) && val > 0 && val <= this.linkService.pagesCount; } - _isValidState(state, checkReload = false) { + #isValidState(state, checkReload = false) { if (!state) { return false; } @@ -7534,7 +7951,7 @@ } return true; } - _updateInternalState(destination, uid, removeTemporary = false) { + #updateInternalState(destination, uid, removeTemporary = false) { if (this._updateViewareaTimeout) { clearTimeout(this._updateViewareaTimeout); this._updateViewareaTimeout = null; @@ -7547,12 +7964,12 @@ this._maxUid = Math.max(this._maxUid, uid); this._numPositionUpdates = 0; } - _parseCurrentHash(checkNameddest = false) { + #parseCurrentHash(checkNameddest = false) { const hash = unescape(getCurrentHash()).substring(1); - const params = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseQueryString)(hash); + const params = parseQueryString(hash); const nameddest = params.get("nameddest") || ""; let page = params.get("page") | 0; - if (!this._isValidPage(page) || checkNameddest && nameddest.length > 0) { + if (!this.#isValidPage(page) || checkNameddest && nameddest.length > 0) { page = null; } return { @@ -7561,7 +7978,7 @@ rotation: this.linkService.rotation }; } - _updateViewarea({ + #updateViewarea({ location }) { if (this._updateViewareaTimeout) { @@ -7583,13 +8000,13 @@ if (UPDATE_VIEWAREA_TIMEOUT > 0) { this._updateViewareaTimeout = setTimeout(() => { if (!this._popStateInProgress) { - this._tryPushCurrentPosition(true); + this.#tryPushCurrentPosition(true); } this._updateViewareaTimeout = null; }, UPDATE_VIEWAREA_TIMEOUT); } } - _popState({ + #popState({ state }) { const newHash = getCurrentHash(), @@ -7601,21 +8018,21 @@ hash, page, rotation - } = this._parseCurrentHash(); - this._pushOrReplaceState({ + } = this.#parseCurrentHash(); + this.#pushOrReplaceState({ hash, page, rotation }, true); return; } - if (!this._isValidState(state)) { + if (!this.#isValidState(state)) { return; } this._popStateInProgress = true; if (hashChanged) { this._blockHashChange++; - (0,_event_utils_js__WEBPACK_IMPORTED_MODULE_1__.waitOnEventOrTimeout)({ + waitOnEventOrTimeout({ target: window, name: "hashchange", delay: HASH_CHANGE_TIMEOUT @@ -7624,8 +8041,8 @@ }); } const destination = state.destination; - this._updateInternalState(destination, state.uid, true); - if ((0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.isValidRotation)(destination.rotation)) { + this.#updateInternalState(destination, state.uid, true); + if (isValidRotation(destination.rotation)) { this.linkService.rotation = destination.rotation; } if (destination.dest) { @@ -7639,32 +8056,33 @@ this._popStateInProgress = false; }); } - _pageHide() { + #pageHide() { if (!this._destination || this._destination.temporary) { - this._tryPushCurrentPosition(); + this.#tryPushCurrentPosition(); } } - _bindEvents() { - if (this._boundEvents) { - return; - } - this._boundEvents = { - updateViewarea: this._updateViewarea.bind(this), - popState: this._popState.bind(this), - pageHide: this._pageHide.bind(this) - }; - this.eventBus._on("updateviewarea", this._boundEvents.updateViewarea); - window.addEventListener("popstate", this._boundEvents.popState); - window.addEventListener("pagehide", this._boundEvents.pageHide); - } - _unbindEvents() { - if (!this._boundEvents) { + #bindEvents() { + if (this.#eventAC) { return; } - this.eventBus._off("updateviewarea", this._boundEvents.updateViewarea); - window.removeEventListener("popstate", this._boundEvents.popState); - window.removeEventListener("pagehide", this._boundEvents.pageHide); - this._boundEvents = null; + this.#eventAC = new AbortController(); + const { + signal + } = this.#eventAC; + this.eventBus.on("updateviewarea", this.#updateViewarea.bind(this), { + signal, + ...internalOpt + }); + window.addEventListener("popstate", this.#popState.bind(this), { + signal + }); + window.addEventListener("pagehide", this.#pageHide.bind(this), { + signal + }); + } + #unbindEvents() { + this.#eventAC?.abort(); + this.#eventAC = null; } } function isDestHashesEqual(destHash, pushHash) { @@ -7674,7 +8092,7 @@ if (destHash === pushHash) { return true; } - const nameddest = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseQueryString)(destHash).get("nameddest"); + const nameddest = parseQueryString(destHash).get("nameddest"); if (nameddest === pushHash) { return true; } @@ -7715,32 +8133,28 @@ return true; } +;// ./web/pdf_layer_viewer.js -/***/ }), - -/***/ 4275: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFLayerViewer: () => (/* binding */ PDFLayerViewer) -/* harmony export */ }); -/* harmony import */ var _base_tree_viewer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2961); - -class PDFLayerViewer extends _base_tree_viewer_js__WEBPACK_IMPORTED_MODULE_0__.BaseTreeViewer { +class PDFLayerViewer extends BaseTreeViewer { constructor(options) { super(options); - this.eventBus._on("optionalcontentconfigchanged", evt => { + const { + eventBus + } = this; + eventBus.on("optionalcontentconfigchanged", evt => { this.#updateLayers(evt.promise); - }); - this.eventBus._on("resetlayers", () => { + }, internalOpt); + eventBus.on("resetlayers", () => { this.#updateLayers(); - }); - this.eventBus._on("togglelayerstree", this._toggleAllTreeItems.bind(this)); + }, internalOpt); + eventBus.on("togglelayerstree", this._toggleAllTreeItems.bind(this), internalOpt); } reset() { super.reset(); this._optionalContentConfig = null; - this._optionalContentHash = null; + this._optionalContentVisibility?.clear(); + this._optionalContentVisibility = null; } _dispatchEvent(layersCount) { this.eventBus.dispatch("layersloaded", { @@ -7753,8 +8167,12 @@ input }) { const setVisibility = () => { - this._optionalContentConfig.setVisibility(groupId, input.checked); - this._optionalContentHash = this._optionalContentConfig.getHash(); + const visible = input.checked; + this._optionalContentConfig.setVisibility(groupId, visible); + const cached = this._optionalContentVisibility.get(groupId); + if (cached) { + cached.visible = visible; + } this.eventBus.dispatch("optionalcontentconfig", { source: this, promise: Promise.resolve(this._optionalContentConfig) @@ -7772,15 +8190,16 @@ return false; }; } - async _setNestedName(element, { + _setNestedName(element, { name = null }) { if (typeof name === "string") { element.textContent = this._normalizeTextContent(name); return; } - element.textContent = await this._l10n.get("pdfjs-additional-layers"); + element.setAttribute("data-l10n-id", "pdfjs-additional-layers"); element.style.fontStyle = "italic"; + this._l10n.translateOnce(element); } _addToggleButton(div, { name = null @@ -7807,7 +8226,7 @@ this._dispatchEvent(0); return; } - this._optionalContentHash = optionalContentConfig.getHash(); + this._optionalContentVisibility = new Map(); const fragment = document.createDocumentFragment(), queue = [{ parent: fragment, @@ -7835,16 +8254,19 @@ }); } else { const group = optionalContentConfig.getGroup(groupId); + const label = document.createElement("label"); const input = document.createElement("input"); + label.append(input, document.createTextNode(this._normalizeTextContent(group.name))); this._bindLink(element, { groupId, input }); input.type = "checkbox"; input.checked = group.visible; - const label = document.createElement("label"); - label.textContent = this._normalizeTextContent(group.name); - label.append(input); + this._optionalContentVisibility.set(groupId, { + input, + visible: input.checked + }); element.append(label); layersCount++; } @@ -7865,473 +8287,49 @@ return; } if (promise) { - if (optionalContentConfig.getHash() === this._optionalContentHash) { - return; - } - } else { - this.eventBus.dispatch("optionalcontentconfig", { - source: this, - promise: Promise.resolve(optionalContentConfig) - }); - } - this.render({ - optionalContentConfig, - pdfDocument: this._pdfDocument - }); - } -} - - -/***/ }), - -/***/ 787: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ LinkTarget: () => (/* binding */ LinkTarget), -/* harmony export */ PDFLinkService: () => (/* binding */ PDFLinkService), -/* harmony export */ SimpleLinkService: () => (/* binding */ SimpleLinkService) -/* harmony export */ }); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7256); - -const DEFAULT_LINK_REL = "noopener noreferrer nofollow"; -const LinkTarget = { - NONE: 0, - SELF: 1, - BLANK: 2, - PARENT: 3, - TOP: 4 -}; -function addLinkAttributes(link, { - url, - target, - rel, - enabled = true -} = {}) { - if (!url || typeof url !== "string") { - throw new Error('A valid "url" parameter must provided.'); - } - if (enabled) { - link.href = link.title = url; - } else { - link.href = ""; - link.title = `Disabled: ${url}`; - link.onclick = () => false; - } - let targetStr = ""; - switch (target) { - case LinkTarget.NONE: - break; - case LinkTarget.SELF: - targetStr = "_self"; - break; - case LinkTarget.BLANK: - targetStr = "_blank"; - break; - case LinkTarget.PARENT: - targetStr = "_parent"; - break; - case LinkTarget.TOP: - targetStr = "_top"; - break; - } - link.target = targetStr; - link.rel = typeof rel === "string" ? rel : DEFAULT_LINK_REL; -} -class PDFLinkService { - #pagesRefCache = new Map(); - constructor({ - eventBus, - externalLinkTarget = null, - externalLinkRel = null, - ignoreDestinationZoom = false - } = {}) { - this.eventBus = eventBus; - this.externalLinkTarget = externalLinkTarget; - this.externalLinkRel = externalLinkRel; - this.externalLinkEnabled = true; - this._ignoreDestinationZoom = ignoreDestinationZoom; - this.baseUrl = null; - this.pdfDocument = null; - this.pdfViewer = null; - this.pdfHistory = null; - } - setDocument(pdfDocument, baseUrl = null) { - this.baseUrl = baseUrl; - this.pdfDocument = pdfDocument; - this.#pagesRefCache.clear(); - } - setViewer(pdfViewer) { - this.pdfViewer = pdfViewer; - } - setHistory(pdfHistory) { - this.pdfHistory = pdfHistory; - } - get pagesCount() { - return this.pdfDocument ? this.pdfDocument.numPages : 0; - } - get page() { - return this.pdfViewer.currentPageNumber; - } - set page(value) { - this.pdfViewer.currentPageNumber = value; - } - get rotation() { - return this.pdfViewer.pagesRotation; - } - set rotation(value) { - this.pdfViewer.pagesRotation = value; - } - get isInPresentationMode() { - return this.pdfViewer.isInPresentationMode; - } - #goToDestinationHelper(rawDest, namedDest = null, explicitDest) { - const destRef = explicitDest[0]; - let pageNumber; - if (typeof destRef === "object" && destRef !== null) { - pageNumber = this._cachedPageNumber(destRef); - if (!pageNumber) { - this.pdfDocument.getPageIndex(destRef).then(pageIndex => { - this.cachePageRef(pageIndex + 1, destRef); - this.#goToDestinationHelper(rawDest, namedDest, explicitDest); - }).catch(() => { - console.error(`PDFLinkService.#goToDestinationHelper: "${destRef}" is not ` + `a valid page reference, for dest="${rawDest}".`); - }); - return; - } - } else if (Number.isInteger(destRef)) { - pageNumber = destRef + 1; - } else { - console.error(`PDFLinkService.#goToDestinationHelper: "${destRef}" is not ` + `a valid destination reference, for dest="${rawDest}".`); - return; - } - if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) { - console.error(`PDFLinkService.#goToDestinationHelper: "${pageNumber}" is not ` + `a valid page number, for dest="${rawDest}".`); - return; - } - if (this.pdfHistory) { - this.pdfHistory.pushCurrentPosition(); - this.pdfHistory.push({ - namedDest, - explicitDest, - pageNumber - }); - } - this.pdfViewer.scrollPageIntoView({ - pageNumber, - destArray: explicitDest, - ignoreDestinationZoom: this._ignoreDestinationZoom - }); - } - async goToDestination(dest) { - if (!this.pdfDocument) { - return; - } - let namedDest, explicitDest; - if (typeof dest === "string") { - namedDest = dest; - explicitDest = await this.pdfDocument.getDestination(dest); - } else { - namedDest = null; - explicitDest = await dest; - } - if (!Array.isArray(explicitDest)) { - console.error(`PDFLinkService.goToDestination: "${explicitDest}" is not ` + `a valid destination array, for dest="${dest}".`); - return; - } - this.#goToDestinationHelper(dest, namedDest, explicitDest); - } - goToPage(val) { - if (!this.pdfDocument) { - return; - } - const pageNumber = typeof val === "string" && this.pdfViewer.pageLabelToPageNumber(val) || val | 0; - if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) { - console.error(`PDFLinkService.goToPage: "${val}" is not a valid page.`); - return; - } - if (this.pdfHistory) { - this.pdfHistory.pushCurrentPosition(); - this.pdfHistory.pushPage(pageNumber); - } - this.pdfViewer.scrollPageIntoView({ - pageNumber - }); - } - addLinkAttributes(link, url, newWindow = false) { - addLinkAttributes(link, { - url, - target: newWindow ? LinkTarget.BLANK : this.externalLinkTarget, - rel: this.externalLinkRel, - enabled: this.externalLinkEnabled - }); - } - getDestinationHash(dest) { - if (typeof dest === "string") { - if (dest.length > 0) { - return this.getAnchorUrl("#" + escape(dest)); - } - } else if (Array.isArray(dest)) { - const str = JSON.stringify(dest); - if (str.length > 0) { - return this.getAnchorUrl("#" + escape(str)); - } - } - return this.getAnchorUrl(""); - } - getAnchorUrl(anchor) { - return this.baseUrl ? this.baseUrl + anchor : anchor; - } - setHash(hash) { - if (!this.pdfDocument) { - return; - } - let pageNumber, dest; - if (hash.includes("=")) { - const params = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.parseQueryString)(hash); - if (params.has("search")) { - const query = params.get("search").replaceAll('"', ""), - phrase = params.get("phrase") === "true"; - this.eventBus.dispatch("findfromurlhash", { - source: this, - query: phrase ? query : query.match(/\S+/g) - }); - } - if (params.has("page")) { - pageNumber = params.get("page") | 0 || 1; - } - if (params.has("zoom")) { - const zoomArgs = params.get("zoom").split(","); - const zoomArg = zoomArgs[0]; - const zoomArgNumber = parseFloat(zoomArg); - if (!zoomArg.includes("Fit")) { - dest = [null, { - name: "XYZ" - }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, zoomArgNumber ? zoomArgNumber / 100 : zoomArg]; - } else if (zoomArg === "Fit" || zoomArg === "FitB") { - dest = [null, { - name: zoomArg - }]; - } else if (zoomArg === "FitH" || zoomArg === "FitBH" || zoomArg === "FitV" || zoomArg === "FitBV") { - dest = [null, { - name: zoomArg - }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null]; - } else if (zoomArg === "FitR") { - if (zoomArgs.length !== 5) { - console.error('PDFLinkService.setHash: Not enough parameters for "FitR".'); - } else { - dest = [null, { - name: zoomArg - }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0]; - } - } else { - console.error(`PDFLinkService.setHash: "${zoomArg}" is not a valid zoom value.`); + for (const [groupId, cached] of this._optionalContentVisibility) { + const group = optionalContentConfig.getGroup(groupId); + if (group && cached.visible !== group.visible) { + cached.input.checked = cached.visible = !cached.visible; } } - if (dest) { - this.pdfViewer.scrollPageIntoView({ - pageNumber: pageNumber || this.page, - destArray: dest, - allowNegativeOffset: true - }); - } else if (pageNumber) { - this.page = pageNumber; - } - if (params.has("pagemode")) { - this.eventBus.dispatch("pagemode", { - source: this, - mode: params.get("pagemode") - }); - } - if (params.has("nameddest")) { - this.goToDestination(params.get("nameddest")); - } return; } - dest = unescape(hash); - try { - dest = JSON.parse(dest); - if (!Array.isArray(dest)) { - dest = dest.toString(); - } - } catch {} - if (typeof dest === "string" || PDFLinkService.#isValidExplicitDestination(dest)) { - this.goToDestination(dest); - return; - } - console.error(`PDFLinkService.setHash: "${unescape(hash)}" is not a valid destination.`); - } - executeNamedAction(action) { - switch (action) { - case "GoBack": - this.pdfHistory?.back(); - break; - case "GoForward": - this.pdfHistory?.forward(); - break; - case "NextPage": - this.pdfViewer.nextPage(); - break; - case "PrevPage": - this.pdfViewer.previousPage(); - break; - case "LastPage": - this.page = this.pagesCount; - break; - case "FirstPage": - this.page = 1; - break; - default: - break; - } - this.eventBus.dispatch("namedaction", { + this.eventBus.dispatch("optionalcontentconfig", { source: this, - action + promise: Promise.resolve(optionalContentConfig) }); - } - async executeSetOCGState(action) { - const pdfDocument = this.pdfDocument; - const optionalContentConfig = await this.pdfViewer.optionalContentConfigPromise; - if (pdfDocument !== this.pdfDocument) { - return; - } - optionalContentConfig.setOCGState(action); - this.pdfViewer.optionalContentConfigPromise = Promise.resolve(optionalContentConfig); - } - cachePageRef(pageNum, pageRef) { - if (!pageRef) { - return; - } - const refStr = pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}`; - this.#pagesRefCache.set(refStr, pageNum); - } - _cachedPageNumber(pageRef) { - if (!pageRef) { - return null; - } - const refStr = pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}`; - return this.#pagesRefCache.get(refStr) || null; - } - static #isValidExplicitDestination(dest) { - if (!Array.isArray(dest)) { - return false; - } - const destLength = dest.length; - if (destLength < 2) { - return false; - } - const page = dest[0]; - if (!(typeof page === "object" && Number.isInteger(page.num) && Number.isInteger(page.gen)) && !(Number.isInteger(page) && page >= 0)) { - return false; - } - const zoom = dest[1]; - if (!(typeof zoom === "object" && typeof zoom.name === "string")) { - return false; - } - let allowNull = true; - switch (zoom.name) { - case "XYZ": - if (destLength !== 5) { - return false; - } - break; - case "Fit": - case "FitB": - return destLength === 2; - case "FitH": - case "FitBH": - case "FitV": - case "FitBV": - if (destLength !== 3) { - return false; - } - break; - case "FitR": - if (destLength !== 6) { - return false; - } - allowNull = false; - break; - default: - return false; - } - for (let i = 2; i < destLength; i++) { - const param = dest[i]; - if (!(typeof param === "number" || allowNull && param === null)) { - return false; - } - } - return true; - } -} -class SimpleLinkService { - constructor() { - this.externalLinkEnabled = true; - } - get pagesCount() { - return 0; - } - get page() { - return 0; - } - set page(value) {} - get rotation() { - return 0; - } - set rotation(value) {} - get isInPresentationMode() { - return false; - } - async goToDestination(dest) {} - goToPage(val) {} - addLinkAttributes(link, url, newWindow = false) { - addLinkAttributes(link, { - url, - enabled: this.externalLinkEnabled + this.render({ + optionalContentConfig, + pdfDocument: this._pdfDocument }); } - getDestinationHash(dest) { - return "#"; - } - getAnchorUrl(hash) { - return "#"; - } - setHash(hash) {} - executeNamedAction(action) {} - executeSetOCGState(action) {} - cachePageRef(pageNum, pageRef) {} } +;// ./web/pdf_outline_viewer.js -/***/ }), - -/***/ 5514: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFOutlineViewer: () => (/* binding */ PDFOutlineViewer) -/* harmony export */ }); -/* harmony import */ var _base_tree_viewer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2961); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7256); - -class PDFOutlineViewer extends _base_tree_viewer_js__WEBPACK_IMPORTED_MODULE_0__.BaseTreeViewer { +class PDFOutlineViewer extends BaseTreeViewer { constructor(options) { super(options); this.linkService = options.linkService; this.downloadManager = options.downloadManager; - this.eventBus._on("toggleoutlinetree", this._toggleAllTreeItems.bind(this)); - this.eventBus._on("currentoutlineitem", this._currentOutlineItem.bind(this)); - this.eventBus._on("pagechanging", evt => { + const { + eventBus + } = this; + eventBus.on("toggleoutlinetree", this._toggleAllTreeItems.bind(this), internalOpt); + eventBus.on("currentoutlineitem", this._currentOutlineItem.bind(this), internalOpt); + eventBus.on("pagechanging", evt => { this._currentPageNumber = evt.pageNumber; - }); - this.eventBus._on("pagesloaded", evt => { + }, internalOpt); + eventBus.on("pagesloaded", evt => { this._isPagesLoaded = !!evt.pagesCount; this._currentOutlineItemCapability?.resolve(this._isPagesLoaded); - }); - this.eventBus._on("sidebarviewchanged", evt => { + }, internalOpt); + eventBus.on("sidebarviewchanged", evt => { this._sidebarView = evt.view; - }); + }, internalOpt); } reset() { super.reset(); @@ -8359,6 +8357,7 @@ url, newWindow, action, + attachmentId, attachment, dest, setOCGState @@ -8378,10 +8377,16 @@ }; return; } - if (attachment) { + if (attachmentId && attachment) { element.href = linkService.getAnchorUrl(""); + const openAttachment = async () => { + const content = await linkService.getAttachmentContent(attachmentId); + if (content) { + this.downloadManager?.openOrDownloadData(content, attachment.filename); + } + }; element.onclick = () => { - this.downloadManager.openOrDownloadData(attachment.content, attachment.filename); + openAttachment(); return false; }; return; @@ -8505,7 +8510,7 @@ return; } this._updateCurrentTreeItem(null); - if (this._sidebarView !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.SidebarView.OUTLINE) { + if (this._sidebarView !== SidebarView.OUTLINE) { return; } for (let i = this._currentPageNumber; i > 0; i--) { @@ -8550,17 +8555,8 @@ } if (Array.isArray(explicitDest)) { const [destRef] = explicitDest; - if (typeof destRef === "object" && destRef !== null) { - pageNumber = this.linkService._cachedPageNumber(destRef); - if (!pageNumber) { - try { - pageNumber = (await pdfDocument.getPageIndex(destRef)) + 1; - if (pdfDocument !== this._pdfDocument) { - return null; - } - this.linkService.cachePageRef(pageNumber, destRef); - } catch {} - } + if (destRef && typeof destRef === "object") { + pageNumber = pdfDocument.cachedPageNumber(destRef); } else if (Number.isInteger(destRef)) { pageNumber = destRef + 1; } @@ -8583,848 +8579,7 @@ } } - -/***/ }), - -/***/ 9966: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFPageView: () => (/* binding */ PDFPageView) -/* harmony export */ }); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2603); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7256); -/* harmony import */ var _annotation_editor_layer_builder_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(283); -/* harmony import */ var _annotation_layer_builder_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(2707); -/* harmony import */ var _app_options_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(9840); -/* harmony import */ var _draw_layer_builder_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3088); -/* harmony import */ var web_null_l10n__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(410); -/* harmony import */ var _pdf_link_service_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(787); -/* harmony import */ var _struct_tree_layer_builder_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(6698); -/* harmony import */ var _text_accessibility_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(5860); -/* harmony import */ var _text_highlighter_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(2027); -/* harmony import */ var _text_layer_builder_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(7765); -/* harmony import */ var _xfa_layer_builder_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(2973); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__, _annotation_editor_layer_builder_js__WEBPACK_IMPORTED_MODULE_2__, _annotation_layer_builder_js__WEBPACK_IMPORTED_MODULE_3__, _draw_layer_builder_js__WEBPACK_IMPORTED_MODULE_5__, web_null_l10n__WEBPACK_IMPORTED_MODULE_6__, _text_layer_builder_js__WEBPACK_IMPORTED_MODULE_10__, _xfa_layer_builder_js__WEBPACK_IMPORTED_MODULE_11__]); -([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__, _annotation_editor_layer_builder_js__WEBPACK_IMPORTED_MODULE_2__, _annotation_layer_builder_js__WEBPACK_IMPORTED_MODULE_3__, _draw_layer_builder_js__WEBPACK_IMPORTED_MODULE_5__, web_null_l10n__WEBPACK_IMPORTED_MODULE_6__, _text_layer_builder_js__WEBPACK_IMPORTED_MODULE_10__, _xfa_layer_builder_js__WEBPACK_IMPORTED_MODULE_11__] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__); - - - - - - - - - - - - - -const DEFAULT_LAYER_PROPERTIES = null; -const LAYERS_ORDER = new Map([["canvasWrapper", 0], ["textLayer", 1], ["annotationLayer", 2], ["annotationEditorLayer", 3], ["xfaLayer", 3]]); -class PDFPageView { - #annotationMode = pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationMode.ENABLE_FORMS; - #hasRestrictedScaling = false; - #layerProperties = null; - #loadingId = null; - #previousRotation = null; - #renderError = null; - #renderingState = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.INITIAL; - #textLayerMode = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.TextLayerMode.ENABLE; - #useThumbnailCanvas = { - directDrawing: true, - initialOptionalContent: true, - regularAnnotations: true - }; - #viewportMap = new WeakMap(); - #layers = [null, null, null, null]; - constructor(options) { - const container = options.container; - const defaultViewport = options.defaultViewport; - this.id = options.id; - this.renderingId = "page" + this.id; - this.#layerProperties = options.layerProperties || DEFAULT_LAYER_PROPERTIES; - this.pdfPage = null; - this.pageLabel = null; - this.rotation = 0; - this.scale = options.scale || _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_SCALE; - this.viewport = defaultViewport; - this.pdfPageRotate = defaultViewport.rotation; - this._optionalContentConfigPromise = options.optionalContentConfigPromise || null; - this.#textLayerMode = options.textLayerMode ?? _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.TextLayerMode.ENABLE; - this.#annotationMode = options.annotationMode ?? pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationMode.ENABLE_FORMS; - this.imageResourcesPath = options.imageResourcesPath || ""; - this.maxCanvasPixels = options.maxCanvasPixels ?? _app_options_js__WEBPACK_IMPORTED_MODULE_4__.AppOptions.get("maxCanvasPixels"); - this.pageColors = options.pageColors || null; - this.eventBus = options.eventBus; - this.renderingQueue = options.renderingQueue; - this.l10n = options.l10n; - this.l10n ||= new web_null_l10n__WEBPACK_IMPORTED_MODULE_6__.GenericL10n(); - this.renderTask = null; - this.resume = null; - this._isStandalone = !this.renderingQueue?.hasViewer(); - this._container = container; - this._annotationCanvasMap = null; - this.annotationLayer = null; - this.annotationEditorLayer = null; - this.textLayer = null; - this.zoomLayer = null; - this.xfaLayer = null; - this.structTreeLayer = null; - this.drawLayer = null; - const div = document.createElement("div"); - div.className = "page"; - div.setAttribute("data-page-number", this.id); - div.setAttribute("role", "region"); - div.setAttribute("data-l10n-id", "pdfjs-page-landmark"); - div.setAttribute("data-l10n-args", JSON.stringify({ - page: this.id - })); - this.div = div; - this.#setDimensions(); - container?.append(div); - if (this._isStandalone) { - container?.style.setProperty("--scale-factor", this.scale * pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.PixelsPerInch.PDF_TO_CSS_UNITS); - const { - optionalContentConfigPromise - } = options; - if (optionalContentConfigPromise) { - optionalContentConfigPromise.then(optionalContentConfig => { - if (optionalContentConfigPromise !== this._optionalContentConfigPromise) { - return; - } - this.#useThumbnailCanvas.initialOptionalContent = optionalContentConfig.hasInitialVisibility; - }); - } - if (!options.l10n) { - this.l10n.translate(this.div); - } - } - } - #addLayer(div, name) { - const pos = LAYERS_ORDER.get(name); - const oldDiv = this.#layers[pos]; - this.#layers[pos] = div; - if (oldDiv) { - oldDiv.replaceWith(div); - return; - } - for (let i = pos - 1; i >= 0; i--) { - const layer = this.#layers[i]; - if (layer) { - layer.after(div); - return; - } - } - this.div.prepend(div); - } - get renderingState() { - return this.#renderingState; - } - set renderingState(state) { - if (state === this.#renderingState) { - return; - } - this.#renderingState = state; - if (this.#loadingId) { - clearTimeout(this.#loadingId); - this.#loadingId = null; - } - switch (state) { - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.PAUSED: - this.div.classList.remove("loading"); - break; - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.RUNNING: - this.div.classList.add("loadingIcon"); - this.#loadingId = setTimeout(() => { - this.div.classList.add("loading"); - this.#loadingId = null; - }, 0); - break; - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.INITIAL: - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.FINISHED: - this.div.classList.remove("loadingIcon", "loading"); - break; - } - } - #setDimensions() { - const { - viewport - } = this; - if (this.pdfPage) { - if (this.#previousRotation === viewport.rotation) { - return; - } - this.#previousRotation = viewport.rotation; - } - (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.setLayerDimensions)(this.div, viewport, true, false); - } - setPdfPage(pdfPage) { - if (this._isStandalone && (this.pageColors?.foreground === "CanvasText" || this.pageColors?.background === "Canvas")) { - this._container?.style.setProperty("--hcm-highlight-filter", pdfPage.filterFactory.addHighlightHCMFilter("highlight", "CanvasText", "Canvas", "HighlightText", "Highlight")); - this._container?.style.setProperty("--hcm-highlight-selected-filter", pdfPage.filterFactory.addHighlightHCMFilter("highlight_selected", "CanvasText", "Canvas", "HighlightText", "Highlight")); - } - this.pdfPage = pdfPage; - this.pdfPageRotate = pdfPage.rotate; - const totalRotation = (this.rotation + this.pdfPageRotate) % 360; - this.viewport = pdfPage.getViewport({ - scale: this.scale * pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.PixelsPerInch.PDF_TO_CSS_UNITS, - rotation: totalRotation - }); - this.#setDimensions(); - this.reset(); - } - destroy() { - this.reset(); - this.pdfPage?.cleanup(); - } - get _textHighlighter() { - return (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "_textHighlighter", new _text_highlighter_js__WEBPACK_IMPORTED_MODULE_12__.TextHighlighter({ - pageIndex: this.id - 1, - eventBus: this.eventBus, - findController: this.#layerProperties.findController - })); - } - async #renderAnnotationLayer() { - let error = null; - try { - await this.annotationLayer.render(this.viewport, "display"); - } catch (ex) { - console.error(`#renderAnnotationLayer: "${ex}".`); - error = ex; - } finally { - this.eventBus.dispatch("annotationlayerrendered", { - source: this, - pageNumber: this.id, - error - }); - } - } - async #renderAnnotationEditorLayer() { - let error = null; - try { - await this.annotationEditorLayer.render(this.viewport, "display"); - } catch (ex) { - console.error(`#renderAnnotationEditorLayer: "${ex}".`); - error = ex; - } finally { - this.eventBus.dispatch("annotationeditorlayerrendered", { - source: this, - pageNumber: this.id, - error - }); - } - } - async #renderDrawLayer() { - try { - await this.drawLayer.render("display"); - } catch (ex) { - console.error(`#renderDrawLayer: "${ex}".`); - } - } - async #renderXfaLayer() { - let error = null; - try { - const result = await this.xfaLayer.render(this.viewport, "display"); - if (result?.textDivs && this._textHighlighter) { - this.#buildXfaTextContentItems(result.textDivs); - } - } catch (ex) { - console.error(`#renderXfaLayer: "${ex}".`); - error = ex; - } finally { - if (this.xfaLayer?.div) { - this.l10n.pause(); - this.#addLayer(this.xfaLayer.div, "xfaLayer"); - this.l10n.resume(); - } - this.eventBus.dispatch("xfalayerrendered", { - source: this, - pageNumber: this.id, - error - }); - } - } - async #renderTextLayer() { - const { - pdfPage, - textLayer, - viewport - } = this; - if (!textLayer) { - return; - } - let error = null; - try { - if (!textLayer.renderingDone) { - const readableStream = pdfPage.streamTextContent({ - includeMarkedContent: true, - disableNormalization: true - }); - textLayer.setTextContentSource(readableStream); - } - await textLayer.render(viewport); - } catch (ex) { - if (ex instanceof pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AbortException) { - return; - } - console.error(`#renderTextLayer: "${ex}".`); - error = ex; - } - this.eventBus.dispatch("textlayerrendered", { - source: this, - pageNumber: this.id, - numTextDivs: textLayer.numTextDivs, - error - }); - this.#renderStructTreeLayer(); - } - async #renderStructTreeLayer() { - if (!this.textLayer) { - return; - } - this.structTreeLayer ||= new _struct_tree_layer_builder_js__WEBPACK_IMPORTED_MODULE_8__.StructTreeLayerBuilder(); - const tree = await (!this.structTreeLayer.renderingDone ? this.pdfPage.getStructTree() : null); - const treeDom = this.structTreeLayer?.render(tree); - if (treeDom) { - this.l10n.pause(); - this.canvas?.append(treeDom); - this.l10n.resume(); - } - this.structTreeLayer?.show(); - } - async #buildXfaTextContentItems(textDivs) { - const text = await this.pdfPage.getTextContent(); - const items = []; - for (const item of text.items) { - items.push(item.str); - } - this._textHighlighter.setTextMapping(textDivs, items); - this._textHighlighter.enable(); - } - _resetZoomLayer(removeFromDOM = false) { - if (!this.zoomLayer) { - return; - } - const zoomLayerCanvas = this.zoomLayer.firstChild; - this.#viewportMap.delete(zoomLayerCanvas); - zoomLayerCanvas.width = 0; - zoomLayerCanvas.height = 0; - if (removeFromDOM) { - this.zoomLayer.remove(); - } - this.zoomLayer = null; - } - reset({ - keepZoomLayer = false, - keepAnnotationLayer = false, - keepAnnotationEditorLayer = false, - keepXfaLayer = false, - keepTextLayer = false - } = {}) { - this.cancelRendering({ - keepAnnotationLayer, - keepAnnotationEditorLayer, - keepXfaLayer, - keepTextLayer - }); - this.renderingState = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.INITIAL; - const div = this.div; - const childNodes = div.childNodes, - zoomLayerNode = keepZoomLayer && this.zoomLayer || null, - annotationLayerNode = keepAnnotationLayer && this.annotationLayer?.div || null, - annotationEditorLayerNode = keepAnnotationEditorLayer && this.annotationEditorLayer?.div || null, - xfaLayerNode = keepXfaLayer && this.xfaLayer?.div || null, - textLayerNode = keepTextLayer && this.textLayer?.div || null; - for (let i = childNodes.length - 1; i >= 0; i--) { - const node = childNodes[i]; - switch (node) { - case zoomLayerNode: - case annotationLayerNode: - case annotationEditorLayerNode: - case xfaLayerNode: - case textLayerNode: - continue; - } - node.remove(); - const layerIndex = this.#layers.indexOf(node); - if (layerIndex >= 0) { - this.#layers[layerIndex] = null; - } - } - div.removeAttribute("data-loaded"); - if (annotationLayerNode) { - this.annotationLayer.hide(); - } - if (annotationEditorLayerNode) { - this.annotationEditorLayer.hide(); - } - if (xfaLayerNode) { - this.xfaLayer.hide(); - } - if (textLayerNode) { - this.textLayer.hide(); - } - this.structTreeLayer?.hide(); - if (!zoomLayerNode) { - if (this.canvas) { - this.#viewportMap.delete(this.canvas); - this.canvas.width = 0; - this.canvas.height = 0; - delete this.canvas; - } - this._resetZoomLayer(); - } - } - update({ - scale = 0, - rotation = null, - optionalContentConfigPromise = null, - drawingDelay = -1 - }) { - this.scale = scale || this.scale; - if (typeof rotation === "number") { - this.rotation = rotation; - } - if (optionalContentConfigPromise instanceof Promise) { - this._optionalContentConfigPromise = optionalContentConfigPromise; - optionalContentConfigPromise.then(optionalContentConfig => { - if (optionalContentConfigPromise !== this._optionalContentConfigPromise) { - return; - } - this.#useThumbnailCanvas.initialOptionalContent = optionalContentConfig.hasInitialVisibility; - }); - } - this.#useThumbnailCanvas.directDrawing = true; - const totalRotation = (this.rotation + this.pdfPageRotate) % 360; - this.viewport = this.viewport.clone({ - scale: this.scale * pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.PixelsPerInch.PDF_TO_CSS_UNITS, - rotation: totalRotation - }); - this.#setDimensions(); - if (this._isStandalone) { - this._container?.style.setProperty("--scale-factor", this.viewport.scale); - } - if (this.canvas) { - let onlyCssZoom = false; - if (this.#hasRestrictedScaling) { - if (this.maxCanvasPixels === 0) { - onlyCssZoom = true; - } else if (this.maxCanvasPixels > 0) { - const { - width, - height - } = this.viewport; - const { - sx, - sy - } = this.outputScale; - onlyCssZoom = (Math.floor(width) * sx | 0) * (Math.floor(height) * sy | 0) > this.maxCanvasPixels; - } - } - const postponeDrawing = !onlyCssZoom && drawingDelay >= 0 && drawingDelay < 1000; - if (postponeDrawing || onlyCssZoom) { - if (postponeDrawing && this.renderingState !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.FINISHED) { - this.cancelRendering({ - keepZoomLayer: true, - keepAnnotationLayer: true, - keepAnnotationEditorLayer: true, - keepXfaLayer: true, - keepTextLayer: true, - cancelExtraDelay: drawingDelay - }); - this.renderingState = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.FINISHED; - this.#useThumbnailCanvas.directDrawing = false; - } - this.cssTransform({ - target: this.canvas, - redrawAnnotationLayer: true, - redrawAnnotationEditorLayer: true, - redrawXfaLayer: true, - redrawTextLayer: !postponeDrawing, - hideTextLayer: postponeDrawing - }); - if (postponeDrawing) { - return; - } - this.eventBus.dispatch("pagerendered", { - source: this, - pageNumber: this.id, - cssTransform: true, - timestamp: performance.now(), - error: this.#renderError - }); - return; - } - if (!this.zoomLayer && !this.canvas.hidden) { - this.zoomLayer = this.canvas.parentNode; - this.zoomLayer.style.position = "absolute"; - } - } - if (this.zoomLayer) { - this.cssTransform({ - target: this.zoomLayer.firstChild - }); - } - this.reset({ - keepZoomLayer: true, - keepAnnotationLayer: true, - keepAnnotationEditorLayer: true, - keepXfaLayer: true, - keepTextLayer: true - }); - } - cancelRendering({ - keepAnnotationLayer = false, - keepAnnotationEditorLayer = false, - keepXfaLayer = false, - keepTextLayer = false, - cancelExtraDelay = 0 - } = {}) { - if (this.renderTask) { - this.renderTask.cancel(cancelExtraDelay); - this.renderTask = null; - } - this.resume = null; - if (this.textLayer && (!keepTextLayer || !this.textLayer.div)) { - this.textLayer.cancel(); - this.textLayer = null; - } - if (this.structTreeLayer && !this.textLayer) { - this.structTreeLayer = null; - } - if (this.annotationLayer && (!keepAnnotationLayer || !this.annotationLayer.div)) { - this.annotationLayer.cancel(); - this.annotationLayer = null; - this._annotationCanvasMap = null; - } - if (this.annotationEditorLayer && (!keepAnnotationEditorLayer || !this.annotationEditorLayer.div)) { - if (this.drawLayer) { - this.drawLayer.cancel(); - this.drawLayer = null; - } - this.annotationEditorLayer.cancel(); - this.annotationEditorLayer = null; - } - if (this.xfaLayer && (!keepXfaLayer || !this.xfaLayer.div)) { - this.xfaLayer.cancel(); - this.xfaLayer = null; - this._textHighlighter?.disable(); - } - } - cssTransform({ - target, - redrawAnnotationLayer = false, - redrawAnnotationEditorLayer = false, - redrawXfaLayer = false, - redrawTextLayer = false, - hideTextLayer = false - }) { - if (!target.hasAttribute("zooming")) { - target.setAttribute("zooming", true); - const { - style - } = target; - style.width = style.height = ""; - } - const originalViewport = this.#viewportMap.get(target); - if (this.viewport !== originalViewport) { - const relativeRotation = this.viewport.rotation - originalViewport.rotation; - const absRotation = Math.abs(relativeRotation); - let scaleX = 1, - scaleY = 1; - if (absRotation === 90 || absRotation === 270) { - const { - width, - height - } = this.viewport; - scaleX = height / width; - scaleY = width / height; - } - target.style.transform = `rotate(${relativeRotation}deg) scale(${scaleX}, ${scaleY})`; - } - if (redrawAnnotationLayer && this.annotationLayer) { - this.#renderAnnotationLayer(); - } - if (redrawAnnotationEditorLayer && this.annotationEditorLayer) { - if (this.drawLayer) { - this.#renderDrawLayer(); - } - this.#renderAnnotationEditorLayer(); - } - if (redrawXfaLayer && this.xfaLayer) { - this.#renderXfaLayer(); - } - if (this.textLayer) { - if (hideTextLayer) { - this.textLayer.hide(); - this.structTreeLayer?.hide(); - } else if (redrawTextLayer) { - this.#renderTextLayer(); - } - } - } - get width() { - return this.viewport.width; - } - get height() { - return this.viewport.height; - } - getPagePoint(x, y) { - return this.viewport.convertToPdfPoint(x, y); - } - async #finishRenderTask(renderTask, error = null) { - if (renderTask === this.renderTask) { - this.renderTask = null; - } - if (error instanceof pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.RenderingCancelledException) { - this.#renderError = null; - return; - } - this.#renderError = error; - this.renderingState = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.FINISHED; - this._resetZoomLayer(true); - this.#useThumbnailCanvas.regularAnnotations = !renderTask.separateAnnots; - this.eventBus.dispatch("pagerendered", { - source: this, - pageNumber: this.id, - cssTransform: false, - timestamp: performance.now(), - error: this.#renderError - }); - if (error) { - throw error; - } - } - async draw() { - if (this.renderingState !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.INITIAL) { - console.error("Must be in new state before drawing"); - this.reset(); - } - const { - div, - l10n, - pageColors, - pdfPage, - viewport - } = this; - if (!pdfPage) { - this.renderingState = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.FINISHED; - throw new Error("pdfPage is not loaded"); - } - this.renderingState = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.RUNNING; - const canvasWrapper = document.createElement("div"); - canvasWrapper.classList.add("canvasWrapper"); - canvasWrapper.setAttribute("aria-hidden", true); - this.#addLayer(canvasWrapper, "canvasWrapper"); - if (!this.textLayer && this.#textLayerMode !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.TextLayerMode.DISABLE && !pdfPage.isPureXfa) { - this._accessibilityManager ||= new _text_accessibility_js__WEBPACK_IMPORTED_MODULE_9__.TextAccessibilityManager(); - this.textLayer = new _text_layer_builder_js__WEBPACK_IMPORTED_MODULE_10__.TextLayerBuilder({ - highlighter: this._textHighlighter, - accessibilityManager: this._accessibilityManager, - enablePermissions: this.#textLayerMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.TextLayerMode.ENABLE_PERMISSIONS, - onAppend: textLayerDiv => { - this.l10n.pause(); - this.#addLayer(textLayerDiv, "textLayer"); - this.l10n.resume(); - } - }); - } - if (!this.annotationLayer && this.#annotationMode !== pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationMode.DISABLE) { - const { - annotationStorage, - downloadManager, - enableScripting, - fieldObjectsPromise, - hasJSActionsPromise, - linkService - } = this.#layerProperties; - this._annotationCanvasMap ||= new Map(); - this.annotationLayer = new _annotation_layer_builder_js__WEBPACK_IMPORTED_MODULE_3__.AnnotationLayerBuilder({ - pdfPage, - annotationStorage, - imageResourcesPath: this.imageResourcesPath, - renderForms: this.#annotationMode === pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationMode.ENABLE_FORMS, - linkService, - downloadManager, - enableScripting, - hasJSActionsPromise, - fieldObjectsPromise, - annotationCanvasMap: this._annotationCanvasMap, - accessibilityManager: this._accessibilityManager, - onAppend: annotationLayerDiv => { - this.#addLayer(annotationLayerDiv, "annotationLayer"); - } - }); - } - const renderContinueCallback = cont => { - showCanvas?.(false); - if (this.renderingQueue && !this.renderingQueue.isHighestPriority(this)) { - this.renderingState = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.PAUSED; - this.resume = () => { - this.renderingState = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.RUNNING; - cont(); - }; - return; - } - cont(); - }; - const { - width, - height - } = viewport; - const canvas = document.createElement("canvas"); - canvas.setAttribute("role", "presentation"); - canvas.hidden = true; - const hasHCM = !!(pageColors?.background && pageColors?.foreground); - let showCanvas = isLastShow => { - if (!hasHCM || isLastShow) { - canvas.hidden = false; - showCanvas = null; - } - }; - canvasWrapper.append(canvas); - this.canvas = canvas; - const ctx = canvas.getContext("2d", { - alpha: false - }); - const outputScale = this.outputScale = new _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.OutputScale(); - if (this.maxCanvasPixels === 0) { - const invScale = 1 / this.scale; - outputScale.sx *= invScale; - outputScale.sy *= invScale; - this.#hasRestrictedScaling = true; - } else if (this.maxCanvasPixels > 0) { - const pixelsInViewport = width * height; - const maxScale = Math.sqrt(this.maxCanvasPixels / pixelsInViewport); - if (outputScale.sx > maxScale || outputScale.sy > maxScale) { - outputScale.sx = maxScale; - outputScale.sy = maxScale; - this.#hasRestrictedScaling = true; - } else { - this.#hasRestrictedScaling = false; - } - } - const sfx = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.approximateFraction)(outputScale.sx); - const sfy = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.approximateFraction)(outputScale.sy); - canvas.width = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.roundToDivide)(width * outputScale.sx, sfx[0]); - canvas.height = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.roundToDivide)(height * outputScale.sy, sfy[0]); - const { - style - } = canvas; - style.width = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.roundToDivide)(width, sfx[1]) + "px"; - style.height = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.roundToDivide)(height, sfy[1]) + "px"; - this.#viewportMap.set(canvas, viewport); - const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null; - const renderContext = { - canvasContext: ctx, - transform, - viewport, - annotationMode: this.#annotationMode, - optionalContentConfigPromise: this._optionalContentConfigPromise, - annotationCanvasMap: this._annotationCanvasMap, - pageColors - }; - const renderTask = this.renderTask = this.pdfPage.render(renderContext); - renderTask.onContinue = renderContinueCallback; - const resultPromise = renderTask.promise.then(async () => { - showCanvas?.(true); - await this.#finishRenderTask(renderTask); - this.#renderTextLayer(); - if (this.annotationLayer) { - await this.#renderAnnotationLayer(); - } - const { - annotationEditorUIManager - } = this.#layerProperties; - if (!annotationEditorUIManager) { - return; - } - this.drawLayer ||= new _draw_layer_builder_js__WEBPACK_IMPORTED_MODULE_5__.DrawLayerBuilder({ - pageIndex: this.id - }); - await this.#renderDrawLayer(); - this.drawLayer.setParent(canvasWrapper); - if (!this.annotationEditorLayer) { - this.annotationEditorLayer = new _annotation_editor_layer_builder_js__WEBPACK_IMPORTED_MODULE_2__.AnnotationEditorLayerBuilder({ - uiManager: annotationEditorUIManager, - pdfPage, - l10n, - accessibilityManager: this._accessibilityManager, - annotationLayer: this.annotationLayer?.annotationLayer, - textLayer: this.textLayer, - drawLayer: this.drawLayer.getDrawLayer(), - onAppend: annotationEditorLayerDiv => { - this.#addLayer(annotationEditorLayerDiv, "annotationEditorLayer"); - } - }); - } - this.#renderAnnotationEditorLayer(); - }, error => { - if (!(error instanceof pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.RenderingCancelledException)) { - showCanvas?.(true); - } - return this.#finishRenderTask(renderTask, error); - }); - if (pdfPage.isPureXfa) { - if (!this.xfaLayer) { - const { - annotationStorage, - linkService - } = this.#layerProperties; - this.xfaLayer = new _xfa_layer_builder_js__WEBPACK_IMPORTED_MODULE_11__.XfaLayerBuilder({ - pdfPage, - annotationStorage, - linkService - }); - } - this.#renderXfaLayer(); - } - div.setAttribute("data-loaded", true); - this.eventBus.dispatch("pagerender", { - source: this, - pageNumber: this.id - }); - return resultPromise; - } - setPageLabel(label) { - this.pageLabel = typeof label === "string" ? label : null; - this.div.setAttribute("data-l10n-args", JSON.stringify({ - page: this.pageLabel ?? this.id - })); - if (this.pageLabel !== null) { - this.div.setAttribute("data-page-label", this.pageLabel); - } else { - this.div.removeAttribute("data-page-label"); - } - } - get thumbnailCanvas() { - const { - directDrawing, - initialOptionalContent, - regularAnnotations - } = this.#useThumbnailCanvas; - return directDrawing && initialOptionalContent && regularAnnotations ? this.canvas : null; - } -} - -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), - -/***/ 8917: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFPresentationMode: () => (/* binding */ PDFPresentationMode) -/* harmony export */ }); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7256); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2603); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__]); -pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; +;// ./web/pdf_presentation_mode.js const DELAY_BEFORE_HIDING_CONTROLS = 3000; @@ -9435,8 +8590,10 @@ const SWIPE_MIN_DISTANCE_THRESHOLD = 50; const SWIPE_ANGLE_THRESHOLD = Math.PI / 6; class PDFPresentationMode { - #state = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.PresentationModeState.UNKNOWN; + #state = PresentationModeState.UNKNOWN; #args = null; + #fullscreenChangeAC = null; + #windowAC = null; constructor({ container, pdfViewer, @@ -9459,7 +8616,7 @@ return false; } this.#addFullscreenChangeListeners(); - this.#notifyStateChange(_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.PresentationModeState.CHANGING); + this.#notifyStateChange(PresentationModeState.CHANGING); const promise = container.requestFullscreen(); this.#args = { pageNumber: pdfViewer.currentPageNumber, @@ -9468,11 +8625,11 @@ spreadMode: null, annotationEditorMode: null }; - if (pdfViewer.spreadMode !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SpreadMode.NONE && !(pdfViewer.pageViewsReady && pdfViewer.hasEqualPageSizes)) { + if (pdfViewer.spreadMode !== SpreadMode.NONE && !(pdfViewer.pageViewsReady && pdfViewer.hasEqualPageSizes)) { console.warn("Ignoring Spread modes when entering PresentationMode, " + "since the document may contain varying page sizes."); this.#args.spreadMode = pdfViewer.spreadMode; } - if (pdfViewer.annotationEditorMode !== pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.AnnotationEditorType.DISABLE) { + if (pdfViewer.annotationEditorMode !== AnnotationEditorType.DISABLE) { this.#args.annotationEditorMode = pdfViewer.annotationEditorMode; } try { @@ -9481,19 +8638,22 @@ return true; } catch { this.#removeFullscreenChangeListeners(); - this.#notifyStateChange(_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.PresentationModeState.NORMAL); + this.#notifyStateChange(PresentationModeState.NORMAL); } return false; } get active() { - return this.#state === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.PresentationModeState.CHANGING || this.#state === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.PresentationModeState.FULLSCREEN; + return this.#state === PresentationModeState.CHANGING || this.#state === PresentationModeState.FULLSCREEN; } #mouseWheel(evt) { if (!this.active) { return; } + if (evt.target.closest?.(".mediaAnnotation")) { + return; + } evt.preventDefault(); - const delta = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.normalizeWheelEventDelta)(evt); + const delta = normalizeWheelEventDelta(evt); const currentTime = Date.now(); const storedTime = this.mouseScrollTimeStamp; if (currentTime > storedTime && currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) { @@ -9520,18 +8680,18 @@ }); } #enter() { - this.#notifyStateChange(_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.PresentationModeState.FULLSCREEN); + this.#notifyStateChange(PresentationModeState.FULLSCREEN); this.container.classList.add(ACTIVE_SELECTOR); setTimeout(() => { - this.pdfViewer.scrollMode = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.ScrollMode.PAGE; + this.pdfViewer.scrollMode = ScrollMode.PAGE; if (this.#args.spreadMode !== null) { - this.pdfViewer.spreadMode = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SpreadMode.NONE; + this.pdfViewer.spreadMode = SpreadMode.NONE; } this.pdfViewer.currentPageNumber = this.#args.pageNumber; this.pdfViewer.currentScaleValue = "page-fit"; if (this.#args.annotationEditorMode !== null) { this.pdfViewer.annotationEditorMode = { - mode: pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.AnnotationEditorType.NONE + mode: AnnotationEditorType.NONE }; } }, 0); @@ -9545,7 +8705,7 @@ this.container.classList.remove(ACTIVE_SELECTOR); setTimeout(() => { this.#removeFullscreenChangeListeners(); - this.#notifyStateChange(_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.PresentationModeState.NORMAL); + this.#notifyStateChange(PresentationModeState.NORMAL); this.pdfViewer.scrollMode = this.#args.scrollMode; if (this.#args.spreadMode !== null) { this.pdfViewer.spreadMode = this.#args.spreadMode; @@ -9576,6 +8736,9 @@ if (evt.target.href && evt.target.parentNode?.hasAttribute("data-internal-link")) { return; } + if (evt.target.closest?.(".mediaAnnotation")) { + return; + } evt.preventDefault(); if (evt.shiftKey) { this.pdfViewer.previousPage(); @@ -9613,6 +8776,10 @@ if (!this.active) { return; } + if (evt.target.closest?.(".mediaAnnotation")) { + this.touchSwipeState = null; + return; + } if (evt.touches.length > 1) { this.touchSwipeState = null; return; @@ -9656,74 +8823,159 @@ } } #addWindowListeners() { - this.showControlsBind = this.#showControls.bind(this); - this.mouseDownBind = this.#mouseDown.bind(this); - this.mouseWheelBind = this.#mouseWheel.bind(this); - this.resetMouseScrollStateBind = this.#resetMouseScrollState.bind(this); - this.contextMenuBind = this.#contextMenu.bind(this); - this.touchSwipeBind = this.#touchSwipe.bind(this); - window.addEventListener("mousemove", this.showControlsBind); - window.addEventListener("mousedown", this.mouseDownBind); - window.addEventListener("wheel", this.mouseWheelBind, { - passive: false - }); - window.addEventListener("keydown", this.resetMouseScrollStateBind); - window.addEventListener("contextmenu", this.contextMenuBind); - window.addEventListener("touchstart", this.touchSwipeBind); - window.addEventListener("touchmove", this.touchSwipeBind); - window.addEventListener("touchend", this.touchSwipeBind); + if (this.#windowAC) { + return; + } + this.#windowAC = new AbortController(); + const { + signal + } = this.#windowAC; + const touchSwipeBind = this.#touchSwipe.bind(this); + window.addEventListener("mousemove", this.#showControls.bind(this), { + signal + }); + window.addEventListener("mousedown", this.#mouseDown.bind(this), { + signal + }); + window.addEventListener("wheel", this.#mouseWheel.bind(this), { + passive: false, + signal + }); + window.addEventListener("keydown", this.#resetMouseScrollState.bind(this), { + signal + }); + window.addEventListener("contextmenu", this.#contextMenu.bind(this), { + signal + }); + window.addEventListener("touchstart", touchSwipeBind, { + signal + }); + window.addEventListener("touchmove", touchSwipeBind, { + signal + }); + window.addEventListener("touchend", touchSwipeBind, { + signal + }); } #removeWindowListeners() { - window.removeEventListener("mousemove", this.showControlsBind); - window.removeEventListener("mousedown", this.mouseDownBind); - window.removeEventListener("wheel", this.mouseWheelBind, { - passive: false - }); - window.removeEventListener("keydown", this.resetMouseScrollStateBind); - window.removeEventListener("contextmenu", this.contextMenuBind); - window.removeEventListener("touchstart", this.touchSwipeBind); - window.removeEventListener("touchmove", this.touchSwipeBind); - window.removeEventListener("touchend", this.touchSwipeBind); - delete this.showControlsBind; - delete this.mouseDownBind; - delete this.mouseWheelBind; - delete this.resetMouseScrollStateBind; - delete this.contextMenuBind; - delete this.touchSwipeBind; - } - #fullscreenChange() { - if (document.fullscreenElement) { - this.#enter(); - } else { - this.#exit(); - } + this.#windowAC?.abort(); + this.#windowAC = null; } #addFullscreenChangeListeners() { - this.fullscreenChangeBind = this.#fullscreenChange.bind(this); - window.addEventListener("fullscreenchange", this.fullscreenChangeBind); + if (this.#fullscreenChangeAC) { + return; + } + this.#fullscreenChangeAC = new AbortController(); + window.addEventListener("fullscreenchange", () => { + if (document.fullscreenElement) { + this.#enter(); + } else { + this.#exit(); + } + }, { + signal: this.#fullscreenChangeAC.signal + }); } #removeFullscreenChangeListeners() { - window.removeEventListener("fullscreenchange", this.fullscreenChangeBind); - delete this.fullscreenChangeBind; + this.#fullscreenChangeAC?.abort(); + this.#fullscreenChangeAC = null; } } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); +;// ./web/xfa_layer_builder.js -/***/ }), +class XfaLayerBuilder { + #cancelled = false; + div = null; + constructor({ + pdfPage, + annotationStorage = null, + linkService, + xfaHtml = null + }) { + this.pdfPage = pdfPage; + this.annotationStorage = annotationStorage; + this.linkService = linkService; + this.xfaHtml = xfaHtml; + } + async render({ + viewport, + intent = "display" + }) { + let xfaHtml; + if (intent === "print") { + xfaHtml = this.xfaHtml; + } else { + xfaHtml = await this.pdfPage.getXfa(); + if (this.#cancelled || !xfaHtml) { + return { + textDivs: [] + }; + } + } + const hasDiv = !!this.div; + const params = { + viewport: viewport.clone({ + dontFlip: true + }), + div: this.div ??= document.createElement("div"), + xfaHtml, + annotationStorage: this.annotationStorage, + linkService: this.linkService, + intent + }; + return hasDiv ? XfaLayer.update(params) : XfaLayer.render(params); + } + cancel() { + this.#cancelled = true; + } + hide() { + if (!this.div) { + return; + } + this.div.hidden = true; + } +} -/***/ 1144: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { +;// ./web/print_utils.js -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFPrintServiceFactory: () => (/* binding */ PDFPrintServiceFactory) -/* harmony export */ }); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2603); -/* harmony import */ var _print_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(659); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__, _print_utils_js__WEBPACK_IMPORTED_MODULE_1__]); -([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__, _print_utils_js__WEBPACK_IMPORTED_MODULE_1__] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__); + + +class BasePrintServiceFactory { + static initGlobals(app) {} + static get supportsPrinting() { + throw new Error("Not implemented: supportsPrinting"); + } + static createPrintService(params) { + throw new Error("Not implemented: createPrintService"); + } +} +function getXfaHtmlForPrinting(printContainer, pdfDocument) { + const xfaHtml = pdfDocument.allXfaHtml; + const linkService = new SimpleLinkService(); + const scale = Math.round(PixelsPerInch.PDF_TO_CSS_UNITS * 100) / 100; + for (const xfaPage of xfaHtml.children) { + const page = document.createElement("div"); + page.className = "xfaPrintedPage"; + printContainer.append(page); + const builder = new XfaLayerBuilder({ + pdfPage: null, + annotationStorage: pdfDocument.annotationStorage, + linkService, + xfaHtml: xfaPage + }); + const viewport = XfaLayer.getPageViewport(xfaPage, { + scale + }); + builder.render({ + viewport, + intent: "print" + }); + page.append(builder.div); + } +} + +;// ./web/pdf_print_service.js let activeService = null; @@ -9734,7 +8986,7 @@ }; function renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size, printResolution, optionalContentConfigPromise, printAnnotationStoragePromise) { const scratchCanvas = activeService.scratchCanvas; - const PRINT_UNITS = printResolution / pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.PixelsPerInch.PDF; + const PRINT_UNITS = printResolution / PixelsPerInch.PDF; scratchCanvas.width = Math.floor(size.width * PRINT_UNITS); scratchCanvas.height = Math.floor(size.height * PRINT_UNITS); const ctx = scratchCanvas.getContext("2d"); @@ -9744,20 +8996,20 @@ ctx.restore(); return Promise.all([pdfDocument.getPage(pageNumber), printAnnotationStoragePromise]).then(function ([pdfPage, printAnnotationStorage]) { const renderContext = { - canvasContext: ctx, + canvas: scratchCanvas, transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0], viewport: pdfPage.getViewport({ scale: 1, rotation: size.rotation }), intent: "print", - annotationMode: pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationMode.ENABLE_STORAGE, + annotationMode: AnnotationMode.ENABLE_STORAGE, optionalContentConfigPromise, printAnnotationStorage }; const renderTask = pdfPage.render(renderContext); return renderTask.promise.catch(reason => { - if (!(reason instanceof pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.RenderingCancelledException)) { + if (!(reason instanceof RenderingCancelledException)) { console.error(reason); } throw reason; @@ -9795,9 +9047,9 @@ if (!hasEqualPageSizes) { console.warn("Not all pages have the same size. The printed result may be incorrect!"); } - this.pageStyleSheet = document.createElement("style"); - this.pageStyleSheet.textContent = `@page { size: ${width}pt ${height}pt;}`; - body.append(this.pageStyleSheet); + this.pageStyleSheet = new CSSStyleSheet(); + this.pageStyleSheet.replaceSync(`@page { size: ${width}pt ${height}pt;}`); + document.adoptedStyleSheets.push(this.pageStyleSheet); } destroy() { if (activeService !== this) { @@ -9807,21 +9059,25 @@ const body = document.querySelector("body"); body.removeAttribute("data-pdfjsprinting"); if (this.pageStyleSheet) { - this.pageStyleSheet.remove(); + document.adoptedStyleSheets = document.adoptedStyleSheets.filter(styleSheet => styleSheet !== this.pageStyleSheet); this.pageStyleSheet = null; } + if (this._blobURLs) { + for (const url of this._blobURLs) { + URL.revokeObjectURL(url); + } + this._blobURLs = null; + } this.scratchCanvas.width = this.scratchCanvas.height = 0; this.scratchCanvas = null; activeService = null; ensureOverlay().then(function () { - if (overlayManager.active === dialog) { - overlayManager.close(dialog); - } + overlayManager.closeIfActive(dialog); }); } renderPages() { if (this.pdfDocument.isPureXfa) { - (0,_print_utils_js__WEBPACK_IMPORTED_MODULE_1__.getXfaHtmlForPrinting)(this.printContainer, this.pdfDocument); + getXfaHtmlForPrinting(this.printContainer, this.pdfDocument); return Promise.resolve(); } const pageCount = this.pagesOverview.length; @@ -9843,22 +9099,24 @@ useRenderedPage() { this.throwIfInactive(); const img = document.createElement("img"); - const scratchCanvas = this.scratchCanvas; - if ("toBlob" in scratchCanvas) { - scratchCanvas.toBlob(function (blob) { - img.src = URL.createObjectURL(blob); - }); - } else { - img.src = scratchCanvas.toDataURL(); - } + this.scratchCanvas.toBlob(blob => { + const blobURL = URL.createObjectURL(blob); + img.src = blobURL; + (this._blobURLs ??= []).push(blobURL); + }); const wrapper = document.createElement("div"); wrapper.className = "printedPage"; wrapper.append(img); this.printContainer.append(wrapper); - return new Promise(function (resolve, reject) { - img.onload = resolve; - img.onerror = reject; - }); + const { + promise, + resolve, + reject + } = Promise.withResolvers(); + img.onload = resolve; + img.onerror = reject; + promise.catch(() => {}); + return promise; } performPrint() { this.throwIfInactive(); @@ -9899,20 +9157,16 @@ if (!activeService) { console.error("Expected print service to be initialized."); ensureOverlay().then(function () { - if (overlayManager.active === dialog) { - overlayManager.close(dialog); + overlayManager.closeIfActive(dialog); + }); + } else { + const activeServiceOnEntry = activeService; + activeService.renderPages().then(() => activeServiceOnEntry.performPrint()).catch(() => {}).then(() => { + if (activeServiceOnEntry.active) { + abort(); } }); - return; } - const activeServiceOnEntry = activeService; - activeService.renderPages().then(function () { - return activeServiceOnEntry.performPrint(); - }).catch(function () {}).then(function () { - if (activeServiceOnEntry.active) { - abort(); - } - }); } }; function dispatchEvent(eventType) { @@ -9969,12 +9223,12 @@ } return overlayPromise; } -class PDFPrintServiceFactory { +class PDFPrintServiceFactory extends BasePrintServiceFactory { static initGlobals(app) { viewerApp = app; } static get supportsPrinting() { - return (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "supportsPrinting", true); + return shadow(this, "supportsPrinting", true); } static createPrintService(params) { if (activeService) { @@ -9984,66 +9238,73 @@ } } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), - -/***/ 6615: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { +;// ./web/renderable_view.js +const RenderingStates = { + INITIAL: 0, + RUNNING: 1, + PAUSED: 2, + FINISHED: 3 +}; +class RenderableView { + renderingId = ""; + renderTask = null; + resume = null; + get renderingState() { + throw new Error("Abstract getter `renderingState` accessed"); + } + set renderingState(state) { + throw new Error("Abstract setter `renderingState` accessed"); + } + async draw() { + throw new Error("Not implemented: draw"); + } +} -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFRenderingQueue: () => (/* binding */ PDFRenderingQueue) -/* harmony export */ }); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2603); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7256); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__]); -pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; +;// ./web/pdf_rendering_queue.js const CLEANUP_TIMEOUT = 30000; class PDFRenderingQueue { + #highestPriorityPage = null; + #idleTimeout = null; + #pdfThumbnailViewer = null; + #pdfViewer = null; + isThumbnailViewEnabled = false; + onIdle = null; + printing = false; constructor() { - this.pdfViewer = null; - this.pdfThumbnailViewer = null; - this.onIdle = null; - this.highestPriorityPage = null; - this.idleTimeout = null; - this.printing = false; - this.isThumbnailViewEnabled = false; Object.defineProperty(this, "hasViewer", { - value: () => !!this.pdfViewer + value: () => !!this.#pdfViewer }); } setViewer(pdfViewer) { - this.pdfViewer = pdfViewer; + this.#pdfViewer = pdfViewer; } setThumbnailViewer(pdfThumbnailViewer) { - this.pdfThumbnailViewer = pdfThumbnailViewer; + this.#pdfThumbnailViewer = pdfThumbnailViewer; } isHighestPriority(view) { - return this.highestPriorityPage === view.renderingId; + return this.#highestPriorityPage === view.renderingId; } renderHighestPriority(currentlyVisiblePages) { - if (this.idleTimeout) { - clearTimeout(this.idleTimeout); - this.idleTimeout = null; + if (this.#idleTimeout) { + clearTimeout(this.#idleTimeout); + this.#idleTimeout = null; } - if (this.pdfViewer.forceRendering(currentlyVisiblePages)) { + if (this.#pdfViewer.forceRendering(currentlyVisiblePages)) { return; } - if (this.isThumbnailViewEnabled && this.pdfThumbnailViewer?.forceRendering()) { + if (this.isThumbnailViewEnabled && this.#pdfThumbnailViewer?.forceRendering()) { return; } if (this.printing) { return; } if (this.onIdle) { - this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT); + this.#idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT); } } - getHighestPriority(visible, views, scrolledDown, preRenderExtra = false) { + getHighestPriority(visible, views, scrolledDown, preRenderExtra = false, ignoreDetailViews = false) { const visibleViews = visible.views, numVisible = visibleViews.length; if (numVisible === 0) { @@ -10055,6 +9316,16 @@ return view; } } + if (!ignoreDetailViews) { + for (let i = 0; i < numVisible; i++) { + const { + detailView + } = visibleViews[i].view; + if (detailView && !this.isViewFinished(detailView)) { + return detailView; + } + } + } const firstId = visible.first.id, lastId = visible.last.id; if (lastId - firstId + 1 > numVisible) { @@ -10085,28 +9356,28 @@ return null; } isViewFinished(view) { - return view.renderingState === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.FINISHED; + return view.renderingState === RenderingStates.FINISHED; } renderView(view) { switch (view.renderingState) { - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.FINISHED: + case RenderingStates.FINISHED: return false; - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.PAUSED: - this.highestPriorityPage = view.renderingId; + case RenderingStates.PAUSED: + this.#highestPriorityPage = view.renderingId; view.resume(); break; - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.RUNNING: - this.highestPriorityPage = view.renderingId; + case RenderingStates.RUNNING: + this.#highestPriorityPage = view.renderingId; break; - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.INITIAL: - this.highestPriorityPage = view.renderingId; + case RenderingStates.INITIAL: + this.#highestPriorityPage = view.renderingId; view.draw().finally(() => { this.renderHighestPriority(); }).catch(reason => { - if (reason instanceof pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.RenderingCancelledException) { + if (reason instanceof RenderingCancelledException) { return; } - console.error(`renderView: "${reason}"`); + console.error("renderView:", reason); }); break; } @@ -10114,28 +9385,16 @@ } } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), +;// ./web/pdf_scripting_manager.js -/***/ 5942: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFScriptingManager: () => (/* binding */ PDFScriptingManager) -/* harmony export */ }); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7256); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2603); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__]); -pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; class PDFScriptingManager { #closeCapability = null; #destroyCapability = null; #docProperties = null; + #eventAC = null; #eventBus = null; #externalServices = null; #pdfDocument = null; @@ -10174,19 +9433,25 @@ try { this.#scripting = this.#initScripting(); } catch (error) { - console.error(`setDocument: "${error.message}".`); + console.error("setDocument:", error); await this.#destroyScripting(); return; } - this._internalEvents.set("updatefromsandbox", event => { + const eventBus = this.#eventBus; + this.#eventAC = new AbortController(); + const evtOpts = { + signal: this.#eventAC.signal, + ...internalOpt + }; + eventBus.on("updatefromsandbox", event => { if (event?.source === window) { this.#updateFromSandbox(event.detail); } - }); - this._internalEvents.set("dispatcheventinsandbox", event => { + }, evtOpts); + eventBus.on("dispatcheventinsandbox", event => { this.#scripting?.dispatchEventInSandbox(event.detail); - }); - this._internalEvents.set("pagechanging", ({ + }, evtOpts); + eventBus.on("pagechanging", ({ pageNumber, previous }) => { @@ -10195,8 +9460,8 @@ } this.#dispatchPageClose(previous); this.#dispatchPageOpen(pageNumber); - }); - this._internalEvents.set("pagerendered", ({ + }, evtOpts); + eventBus.on("pagerendered", ({ pageNumber }) => { if (!this._pageOpenPending.has(pageNumber)) { @@ -10206,18 +9471,15 @@ return; } this.#dispatchPageOpen(pageNumber); - }); - this._internalEvents.set("pagesdestroy", async () => { + }, evtOpts); + eventBus.on("pagesdestroy", async () => { await this.#dispatchPageClose(this.#pdfViewer.currentPageNumber); await this.#scripting?.dispatchEventInSandbox({ id: "doc", name: "WillClose" }); this.#closeCapability?.resolve(); - }); - for (const [name, listener] of this._internalEvents) { - this.#eventBus._on(name, listener); - } + }, evtOpts); try { const docProperties = await this.#docProperties(pdfDocument); if (pdfDocument !== this.#pdfDocument) { @@ -10235,11 +9497,11 @@ actions: docActions } }); - this.#eventBus.dispatch("sandboxcreated", { + eventBus.dispatch("sandboxcreated", { source: this }); } catch (error) { - console.error(`setDocument: "${error.message}".`); + console.error("setDocument:", error); await this.#destroyScripting(); return; } @@ -10296,14 +9558,11 @@ get ready() { return this.#ready; } - get _internalEvents() { - return (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.shadow)(this, "_internalEvents", new Map()); - } get _pageOpenPending() { - return (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.shadow)(this, "_pageOpenPending", new Set()); + return shadow(this, "_pageOpenPending", new Set()); } get _visitedPages() { - return (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.shadow)(this, "_visitedPages", new Map()); + return shadow(this, "_visitedPages", new Map()); } async #updateFromSandbox(detail) { const pdfViewer = this.#pdfViewer; @@ -10324,7 +9583,7 @@ break; case "layout": if (!isInPresentationMode) { - const modes = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.apiPageLayoutToViewerModes)(value); + const modes = apiPageLayoutToViewerModes(value); pdfViewer.spreadMode = modes.spreadMode; } break; @@ -10406,7 +9665,7 @@ return; } const pageView = this.#pdfViewer.getPageView(pageNumber - 1); - if (pageView?.renderingState !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.RenderingStates.FINISHED) { + if (pageView?.renderingState !== RenderingStates.FINISHED) { this._pageOpenPending.add(pageNumber); return; } @@ -10474,10 +9733,8 @@ } catch {} this.#willPrintCapability?.reject(new Error("Scripting destroyed.")); this.#willPrintCapability = null; - for (const [name, listener] of this._internalEvents) { - this.#eventBus._off(name, listener); - } - this._internalEvents.clear(); + this.#eventAC?.abort(); + this.#eventAC = null; this._pageOpenPending.clear(); this._visitedPages.clear(); this.#scripting = null; @@ -10486,876 +9743,4789 @@ } } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); +;// ./web/pdf_text_extractor.js +/* unused harmony import specifier */ var pdf_text_extractor_internalOpt; -/***/ }), +class PdfTextExtractor { + #externalServices; + #textPromise; + #capability = Promise.withResolvers(); + constructor(externalServices, pdfViewer, eventBus) { + this.#externalServices = externalServices; + eventBus.on("pagesinit", () => { + this.#capability.resolve(pdfViewer); + }, pdf_text_extractor_internalOpt); + eventBus.on("pagesdestroy", () => { + this.#capability.reject(new Error("pagesdestroy")); + this.#textPromise = null; + this.#capability = Promise.withResolvers(); + }, pdf_text_extractor_internalOpt); + window.addEventListener("requestTextContent", ({ + detail + }) => { + this.extractTextContent(detail.requestId); + }); + } + async extractTextContent(requestId) { + if (!this.#textPromise) { + const textPromise = this.#textPromise = this.#capability.promise.then(pdfViewer => pdfViewer.getAllText()); + textPromise.then(() => { + setTimeout(() => { + if (this.#textPromise === textPromise) { + this.#textPromise = null; + } + }, 5000); + }); + } + this.#externalServices.reportText({ + text: await this.#textPromise, + requestId + }); + } +} -/***/ 2275: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { +;// ./web/menu.js -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFSidebar: () => (/* binding */ PDFSidebar) -/* harmony export */ }); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7256); - -const SIDEBAR_WIDTH_VAR = "--sidebar-width"; -const SIDEBAR_MIN_WIDTH = 200; -const SIDEBAR_RESIZING_CLASS = "sidebarResizing"; -const UI_NOTIFICATION_CLASS = "pdfSidebarNotification"; -class PDFSidebar { - #isRTL = false; - #mouseMoveBound = this.#mouseMove.bind(this); - #mouseUpBound = this.#mouseUp.bind(this); - #outerContainerWidth = null; - #width = null; +class Menu { + #triggeringButton; + #menu; + #menuItems; + #openMenuAC = null; + #menuAC = new AbortController(); + #lastIndex = -1; + #onFocusOutBound = this.#onFocusOut.bind(this); + constructor(menuContainer, triggeringButton, menuItems) { + this.#menu = menuContainer; + this.#triggeringButton = triggeringButton; + if (Array.isArray(menuItems)) { + this.#menuItems = menuItems; + } else { + this.#menuItems = []; + for (const button of this.#menu.querySelectorAll("button")) { + this.#menuItems.push(button); + } + } + this.#setUpMenu(); + } + #closeMenu() { + if (!this.#openMenuAC) { + return; + } + const menu = this.#menu; + this.#triggeringButton.ariaExpanded = "false"; + this.#openMenuAC.abort(); + this.#openMenuAC = null; + if (menu.contains(document.activeElement)) { + setTimeout(() => { + if (!menu.contains(document.activeElement)) { + this.#triggeringButton.focus(); + } + }, 0); + } + this.#lastIndex = -1; + } + #openMenu() { + if (this.#openMenuAC) { + return; + } + const menu = this.#menu; + this.#triggeringButton.ariaExpanded = "true"; + this.#openMenuAC = new AbortController(); + const signal = AbortSignal.any([this.#menuAC.signal, this.#openMenuAC.signal]); + window.addEventListener("pointerdown", ({ + target + }) => { + if (!this.#triggeringButton.contains(target) && !menu.contains(target)) { + this.#closeMenu(); + } + }, { + signal + }); + const closeMenu = this.#closeMenu.bind(this); + window.addEventListener("blur", closeMenu, { + signal + }); + menu.addEventListener("focusout", this.#onFocusOutBound, { + signal + }); + } + #onFocusOut({ + relatedTarget + }) { + if (!this.#triggeringButton.contains(relatedTarget) && !this.#menu.contains(relatedTarget)) { + this.#closeMenu(); + } + } + #setUpMenu() { + this.#triggeringButton.addEventListener("click", e => { + if (this.#openMenuAC) { + this.#closeMenu(); + return; + } + this.#openMenu(); + }); + this.#triggeringButton.addEventListener("focusout", this.#onFocusOutBound); + const { + signal + } = this.#menuAC; + this.#menu.addEventListener("keydown", e => { + switch (e.key) { + case "Escape": + this.#closeMenu(); + stopEvent(e); + break; + case "ArrowDown": + this.#goToNextItem(e.target, true); + stopEvent(e); + break; + case "ArrowUp": + this.#goToNextItem(e.target, false); + stopEvent(e); + break; + case "Home": + this.#menuItems.find(item => !item.disabled && !item.classList.contains("hidden"))?.focus(); + stopEvent(e); + break; + case "End": + this.#menuItems.findLast(item => !item.disabled && !item.classList.contains("hidden"))?.focus(); + stopEvent(e); + break; + default: + const { + key + } = e; + if (!/^\p{L}$/u.test(key)) { + break; + } + const char = key.toLocaleLowerCase(); + this.#goToNextItem(e.target, true, item => item.textContent.trim().toLowerCase().startsWith(char)); + stopEvent(e); + break; + } + }, { + signal, + capture: true + }); + this.#menu.addEventListener("contextmenu", noContextMenu, { + signal + }); + this.#menu.addEventListener("click", this.#closeMenu.bind(this), { + signal, + capture: true + }); + this.#triggeringButton.addEventListener("keydown", e => { + switch (e.key) { + case " ": + case "Enter": + case "ArrowDown": + case "Home": + stopEvent(e); + if (!this.#openMenuAC) { + this.#openMenu(); + } + this.#menuItems.find(item => !item.disabled && !item.classList.contains("hidden"))?.focus(); + break; + case "ArrowUp": + case "End": + stopEvent(e); + if (!this.#openMenuAC) { + this.#openMenu(); + } + this.#menuItems.findLast(item => !item.disabled && !item.classList.contains("hidden"))?.focus(); + break; + case "Escape": + this.#closeMenu(); + stopEvent(e); + break; + } + }, { + signal + }); + } + #goToNextItem(element, forward, check = () => true) { + const index = this.#lastIndex === -1 ? this.#menuItems.indexOf(element) : this.#lastIndex; + const len = this.#menuItems.length; + const increment = forward ? 1 : len - 1; + for (let i = (index + increment) % len; i !== index; i = (i + increment) % len) { + const menuItem = this.#menuItems[i]; + if (!menuItem.disabled && !menuItem.classList.contains("hidden") && check(menuItem)) { + menuItem.focus(); + this.#lastIndex = i; + break; + } + } + } + destroy() { + this.#closeMenu(); + this.#menuAC?.abort(); + this.#menuAC = null; + } +} + +;// ./web/pdf_thumbnail_view.js + + + +const DRAW_UPSCALE_FACTOR = 2; +const MAX_NUM_SCALING_STEPS = 3; +const THUMBNAIL_WIDTH = 126; +function getTempCanvas(width, height) { + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d", { + alpha: false + }); + ctx.save(); + ctx.fillStyle = "rgb(255, 255, 255)"; + ctx.fillRect(0, 0, width, height); + ctx.restore(); + return [canvas, ctx]; +} +class PDFThumbnailView extends RenderableView { + #renderingState = RenderingStates.INITIAL; constructor({ - elements, + container, eventBus, - l10n + id, + defaultViewport, + optionalContentConfigPromise, + linkService, + renderingQueue, + maxCanvasPixels, + maxCanvasDim, + pageColors, + enableSplitMerge = false }) { - this.isOpen = false; - this.active = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.THUMBS; - this.isInitialViewSet = false; - this.isInitialEventDispatched = false; - this.onToggled = null; - this.onUpdateThumbnails = null; - this.outerContainer = elements.outerContainer; - this.sidebarContainer = elements.sidebarContainer; - this.toggleButton = elements.toggleButton; - this.resizer = elements.resizer; - this.thumbnailButton = elements.thumbnailButton; - this.outlineButton = elements.outlineButton; - this.attachmentsButton = elements.attachmentsButton; - this.layersButton = elements.layersButton; - this.thumbnailView = elements.thumbnailView; - this.outlineView = elements.outlineView; - this.attachmentsView = elements.attachmentsView; - this.layersView = elements.layersView; - this._currentOutlineItemButton = elements.currentOutlineItemButton; + super(); + this.id = id; + this.renderingId = `thumbnail${id}`; + this.pageLabel = null; + this.pdfPage = null; + this.rotation = 0; + this.viewport = defaultViewport; + this.pdfPageRotate = defaultViewport.rotation; + this._optionalContentConfigPromise = optionalContentConfigPromise || null; + this.maxCanvasPixels = maxCanvasPixels ?? AppOptions.get("maxCanvasPixels"); + this.maxCanvasDim = maxCanvasDim || AppOptions.get("maxCanvasDim"); + this.pageColors = pageColors || null; this.eventBus = eventBus; - this.#isRTL = l10n.getDirection() === "rtl"; - this.#addEventListeners(); + this.linkService = linkService; + this.renderingQueue = renderingQueue; + this.placeholder = null; + const thumbnailContainer = this.div = document.createElement("div"); + thumbnailContainer.className = "thumbnail"; + thumbnailContainer.setAttribute("page-number", id); + const imageContainer = this.imageContainer = document.createElement("div"); + thumbnailContainer.append(imageContainer); + imageContainer.classList.add("thumbnailImageContainer", "missingThumbnailImage"); + imageContainer.role = "button"; + imageContainer.tabIndex = -1; + imageContainer.draggable = false; + imageContainer.setAttribute("page-number", id); + imageContainer.setAttribute("data-l10n-id", "pdfjs-thumb-page-title1"); + imageContainer.setAttribute("data-l10n-args", this.#getPageL10nArgs(true)); + const image = this.image = document.createElement("img"); + imageContainer.append(image); + if (enableSplitMerge) { + const checkbox = this.checkbox = document.createElement("input"); + checkbox.type = "checkbox"; + checkbox.tabIndex = -1; + checkbox.setAttribute("data-l10n-id", "pdfjs-thumb-page-checkbox1"); + checkbox.setAttribute("data-l10n-args", this.#getPageL10nArgs()); + thumbnailContainer.append(checkbox); + this.pasteButton = null; + } + this.#updateDims(); + container.append(thumbnailContainer); + } + clone(container, id) { + const thumbnailView = new PDFThumbnailView({ + container, + id, + eventBus: this.eventBus, + defaultViewport: this.viewport, + optionalContentConfigPromise: this._optionalContentConfigPromise, + linkService: this.linkService, + renderingQueue: this.renderingQueue, + maxCanvasPixels: this.maxCanvasPixels, + maxCanvasDim: this.maxCanvasDim, + pageColors: this.pageColors, + enableSplitMerge: !!this.checkbox + }); + const { + imageContainer + } = this; + if (!imageContainer.classList.contains("missingThumbnailImage")) { + thumbnailView.image.replaceWith(this.image.cloneNode(true)); + thumbnailView.imageContainer.classList.remove("missingThumbnailImage"); + } + return thumbnailView; + } + addPasteButton(pasteCallback) { + if (this.pasteButton) { + return; + } + const pasteButton = this.pasteButton = document.createElement("button"); + pasteButton.classList.add("thumbnailPasteButton", "viewsManagerButton"); + pasteButton.tabIndex = 0; + pasteButton.setAttribute("data-l10n-id", "pdfjs-views-manager-paste-button-after"); + pasteButton.setAttribute("data-l10n-args", JSON.stringify({ + page: this.pageLabel ?? this.id + })); + const span = document.createElement("span"); + span.setAttribute("data-l10n-id", "pdfjs-views-manager-paste-button-label"); + pasteButton.append(span); + pasteButton.addEventListener("click", () => { + pasteCallback(this.id); + }); + if (this.id === 1) { + const prevPasteButton = this.prevPasteButton = pasteButton.cloneNode(true); + prevPasteButton.setAttribute("data-l10n-id", "pdfjs-views-manager-paste-button-before"); + prevPasteButton.addEventListener("click", () => { + pasteCallback(0); + }); + this.imageContainer.before(prevPasteButton); + } + this.imageContainer.after(pasteButton); + } + removePasteButton() { + this.pasteButton?.remove(); + this.pasteButton = null; + this.prevPasteButton?.remove(); + this.prevPasteButton = null; + } + toggleSelected(isSelected) { + if (this.checkbox) { + this.checkbox.checked = isSelected; + } + } + updateId(newId) { + this.id = newId; + this.renderingId = `thumbnail${newId}`; + this.div.setAttribute("page-number", newId); + this.imageContainer.setAttribute("page-number", newId); + this.setPageLabel(this.pageLabel); + } + #updateDims() { + const { + width, + height + } = this.viewport; + const ratio = width / height; + const canvasWidth = this.canvasWidth = THUMBNAIL_WIDTH; + const canvasHeight = this.canvasHeight = canvasWidth / ratio | 0; + this.scale = canvasWidth / width; + this.imageContainer.style.height = `${canvasHeight}px`; + } + get renderingState() { + return this.#renderingState; + } + set renderingState(state) { + this.#renderingState = state; + } + setPdfPage(pdfPage) { + this.pdfPage = pdfPage; + this.pdfPageRotate = pdfPage.rotate; + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = pdfPage.getViewport({ + scale: 1, + rotation: totalRotation + }); + this.reset(); } reset() { - this.isInitialViewSet = false; - this.isInitialEventDispatched = false; - this.#hideUINotification(true); - this.switchView(_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.THUMBS); - this.outlineButton.disabled = false; - this.attachmentsButton.disabled = false; - this.layersButton.disabled = false; - this._currentOutlineItemButton.disabled = true; + this.cancelRendering(); + this.renderingState = RenderingStates.INITIAL; + this.#updateDims(); + const { + image, + imageContainer + } = this; + const url = image.src; + if (url) { + URL.revokeObjectURL(url); + image.src = ""; + imageContainer.removeAttribute("data-l10n-id"); + imageContainer.removeAttribute("data-l10n-args"); + imageContainer.classList.add("missingThumbnailImage"); + } } - get visibleView() { - return this.isOpen ? this.active : _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.NONE; + destroy() { + this.reset(); + this.toggleCurrent(false); + this.div.remove(); } - setInitialView(view = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.NONE) { - if (this.isInitialViewSet) { + update({ + rotation = null + }) { + if (typeof rotation === "number") { + this.rotation = rotation; + } + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = this.viewport.clone({ + scale: 1, + rotation: totalRotation + }); + this.reset(); + } + toggleCurrent(isCurrent) { + const { + imageContainer + } = this; + if (isCurrent) { + imageContainer.ariaCurrent = "page"; + imageContainer.tabIndex = 0; + if (this.checkbox) { + this.checkbox.tabIndex = 0; + } + } else { + imageContainer.ariaCurrent = false; + imageContainer.tabIndex = -1; + if (this.checkbox) { + this.checkbox.tabIndex = -1; + } + } + } + cancelRendering() { + if (this.renderTask) { + this.renderTask.cancel(); + this.renderTask = null; + } + this.resume = null; + } + #getPageDrawContext(upscaleFactor = 1) { + const outputScale = new OutputScale(); + const width = upscaleFactor * this.canvasWidth, + height = upscaleFactor * this.canvasHeight; + outputScale.limitCanvas(width, height, this.maxCanvasPixels, this.maxCanvasDim); + const canvas = document.createElement("canvas"); + canvas.width = width * outputScale.sx | 0; + canvas.height = height * outputScale.sy | 0; + const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null; + return { + canvas, + transform + }; + } + async #convertCanvasToImage(canvas) { + if (this.renderingState !== RenderingStates.FINISHED) { + throw new Error("#convertCanvasToImage: Rendering has not finished."); + } + const reducedCanvas = this.#reduceImage(canvas); + const { + imageContainer, + image + } = this; + const { + promise, + resolve + } = Promise.withResolvers(); + reducedCanvas.toBlob(resolve); + const blob = await promise; + image.src = URL.createObjectURL(blob); + image.setAttribute("data-l10n-id", "pdfjs-thumb-page-canvas"); + image.setAttribute("data-l10n-args", this.#getPageL10nArgs()); + imageContainer.classList.remove("missingThumbnailImage"); + } + async draw() { + if (this.renderingState !== RenderingStates.INITIAL) { + console.error("Must be in new state before drawing"); return; } - this.isInitialViewSet = true; - if (view === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.NONE || view === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.UNKNOWN) { - this.#dispatchEvent(); + const { + pageColors, + pdfPage + } = this; + if (!pdfPage) { + this.renderingState = RenderingStates.FINISHED; + throw new Error("pdfPage is not loaded"); + } + this.renderingState = RenderingStates.RUNNING; + const { + canvas, + transform + } = this.#getPageDrawContext(DRAW_UPSCALE_FACTOR); + const drawViewport = this.viewport.clone({ + scale: DRAW_UPSCALE_FACTOR * this.scale + }); + const renderContinueCallback = cont => { + if (!this.renderingQueue.isHighestPriority(this)) { + this.renderingState = RenderingStates.PAUSED; + this.resume = () => { + this.renderingState = RenderingStates.RUNNING; + cont(); + }; + return; + } + cont(); + }; + const renderContext = { + canvas, + transform, + viewport: drawViewport, + optionalContentConfigPromise: this._optionalContentConfigPromise, + pageColors + }; + const renderTask = this.renderTask = pdfPage.render(renderContext); + renderTask.onContinue = renderContinueCallback; + let error = null; + try { + await renderTask.promise; + } catch (e) { + if (e instanceof RenderingCancelledException) { + return; + } + error = e; + } finally { + if (renderTask === this.renderTask) { + this.renderTask = null; + } + } + this.renderingState = RenderingStates.FINISHED; + await this.#convertCanvasToImage(canvas); + this.eventBus.dispatch("thumbnailrendered", { + source: this, + pageNumber: this.id, + pdfPage + }); + if (error) { + throw error; + } + } + setImage(pageView) { + if (this.renderingState !== RenderingStates.INITIAL) { return; } - this.switchView(view, true); - if (!this.isInitialEventDispatched) { - this.#dispatchEvent(); + const { + thumbnailCanvas: canvas, + pdfPage, + scale + } = pageView; + if (!canvas) { + return; + } + if (!this.pdfPage) { + this.setPdfPage(pdfPage); + } + if (scale < this.scale) { + return; } + this.renderingState = RenderingStates.FINISHED; + this.#convertCanvasToImage(canvas); } - switchView(view, forceOpen = false) { - const isViewChanged = view !== this.active; - let forceRendering = false; - switch (view) { - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.NONE: - if (this.isOpen) { - this.close(); + #getReducedImageDims(canvas) { + const width = canvas.width << MAX_NUM_SCALING_STEPS, + height = canvas.height << MAX_NUM_SCALING_STEPS; + const outputScale = new OutputScale(); + outputScale.sx = outputScale.sy = 1; + outputScale.limitCanvas(width, height, this.maxCanvasPixels, this.maxCanvasDim); + return [width * outputScale.sx | 0, height * outputScale.sy | 0]; + } + #reduceImage(img) { + const { + canvas + } = this.#getPageDrawContext(1); + const ctx = canvas.getContext("2d", { + alpha: false, + willReadFrequently: false + }); + if (img.width <= 2 * canvas.width) { + ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height); + return canvas; + } + let [reducedWidth, reducedHeight] = this.#getReducedImageDims(canvas); + const [reducedImage, reducedImageCtx] = getTempCanvas(reducedWidth, reducedHeight); + while (reducedWidth > img.width || reducedHeight > img.height) { + reducedWidth >>= 1; + reducedHeight >>= 1; + } + reducedImageCtx.drawImage(img, 0, 0, img.width, img.height, 0, 0, reducedWidth, reducedHeight); + while (reducedWidth > 2 * canvas.width) { + reducedImageCtx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, reducedWidth >> 1, reducedHeight >> 1); + reducedWidth >>= 1; + reducedHeight >>= 1; + } + ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, canvas.width, canvas.height); + return canvas; + } + #getPageL10nArgs(hasTotal = false) { + return JSON.stringify({ + page: this.pageLabel ?? this.id, + total: hasTotal ? this.linkService.pagesCount : undefined + }); + } + setPageLabel(label) { + this.pageLabel = typeof label === "string" ? label : null; + this.imageContainer.setAttribute("data-l10n-args", this.#getPageL10nArgs(true)); + this.image.setAttribute("data-l10n-args", this.#getPageL10nArgs()); + this.checkbox?.setAttribute("data-l10n-args", this.#getPageL10nArgs()); + } +} + +;// ./web/pdf_thumbnail_viewer.js + + + + + + +const SCROLL_OPTIONS = { + behavior: "instant", + block: "nearest", + inline: "nearest", + container: "nearest" +}; +const DRAG_THRESHOLD_IN_PIXELS = 5; +const PIXELS_TO_SCROLL_WHEN_DRAGGING = 20; +const SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT = 15; +class PDFThumbnailViewer { + static #draggingScaleFactor = 0; + #enableMerge = false; + #enableSplitMerge = false; + #dragAC = null; + #abortSignal = undefined; + #externalDragActive = false; + #draggedContainer = null; + #thumbnailsPositions = null; + #lastDraggedOverIndex = NaN; + #selectedPages = null; + #draggedImageX = 0; + #draggedImageY = 0; + #draggedImageWidth = 0; + #draggedImageHeight = 0; + #draggedImageOffsetX = 0; + #draggedImageOffsetY = 0; + #dragMarker = null; + #pageNumberToRemove = NaN; + #currentScrollBottom = 0; + #currentScrollTop = 0; + #pagesMapper = null; + #manageExportButton = null; + #manageDeleteButton = null; + #manageCopyButton = null; + #manageCutButton = null; + #copiedThumbnails = null; + #savedThumbnails = null; + #deletedPageNumbers = null; + #copiedPageNumbers = null; + #boundPastePages = this.#pastePages.bind(this); + #isCut = false; + #isOneColumnView = false; + #scrollableContainerWidth = 0; + #scrollableContainerHeight = 0; + #statusLabel = null; + #statusBar = null; + #deselectButton = null; + #undoBar = null; + #undoLabel = null; + #undoButton = null; + #undoCloseButton = null; + #waitingBar = null; + #isInPasteMode = false; + #hasUndoBarVisible = false; + #newBadge = null; + constructor({ + container, + eventBus, + linkService, + renderingQueue, + maxCanvasPixels, + maxCanvasDim, + pageColors, + abortSignal, + enableMerge, + enableSplitMerge, + enableNewBadge, + statusBar, + undoBar, + waitingBar, + manageMenu, + addFileComponent + }) { + this.scrollableContainer = container.parentElement; + this.container = container; + this.eventBus = eventBus; + this.linkService = linkService; + this.renderingQueue = renderingQueue; + this.maxCanvasPixels = maxCanvasPixels; + this.maxCanvasDim = maxCanvasDim; + this.pageColors = pageColors || null; + this.#abortSignal = abortSignal; + this.#enableMerge = enableMerge || false; + this.#enableSplitMerge = enableSplitMerge || false; + this.#statusLabel = statusBar?.viewsManagerStatusActionLabel || null; + this.#deselectButton = statusBar?.viewsManagerStatusActionDeselectButton || null; + this.#statusBar = statusBar?.viewsManagerStatusAction || null; + this.#undoBar = undoBar?.viewsManagerStatusUndo || null; + this.#undoLabel = undoBar?.viewsManagerStatusUndoLabel || null; + this.#undoButton = undoBar?.viewsManagerStatusUndoButton || null; + this.#undoCloseButton = undoBar?.viewsManagerStatusUndoCloseButton || null; + this.#waitingBar = waitingBar || null; + if (this.#enableSplitMerge && manageMenu) { + const { + button: menuButton, + menu, + copy, + cut, + delete: del, + exportSelected + } = manageMenu; + if (enableNewBadge) { + const newSpan = document.createElement("span"); + newSpan.setAttribute("data-l10n-id", "pdfjs-new-badge-content"); + newSpan.classList.add("newBadge"); + menuButton.parentElement.before(newSpan); + this.#newBadge = newSpan; + } + eventBus.on("pagesloaded", () => { + menuButton.disabled = false; + }, { + once: true, + ...internalOpt + }); + this._manageMenu = new Menu(menu, menuButton, [copy, cut, del, exportSelected]); + this.#manageExportButton = exportSelected; + exportSelected.addEventListener("click", this.#saveExtractedPages.bind(this)); + this.#manageDeleteButton = del; + del.addEventListener("click", this.#deletePages.bind(this, "delete")); + this.#manageCopyButton = copy; + copy.addEventListener("click", this.#copyPages.bind(this)); + this.#manageCutButton = cut; + cut.addEventListener("click", this.#cutPages.bind(this)); + this.#toggleMenuEntries(false); + menuButton.disabled = true; + eventBus.on("editingaction", ({ + name + }) => { + switch (name) { + case "copyPage": + this.#copyPages(); + break; + case "cutPage": + this.#cutPages(); + break; + case "deletePage": + this.#deletePages("delete"); + break; + case "savePage": + this.#saveExtractedPages(); + break; } - return; - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.THUMBS: - if (this.isOpen && isViewChanged) { - forceRendering = true; + }, internalOpt); + this.container.addEventListener("contextmenu", e => { + eventBus.dispatch("editingstateschanged", { + source: this, + details: { + thumbnailId: parseInt(e.target.closest(".thumbnailImageContainer")?.parentElement.getAttribute("page-number"), 10) ?? -1, + hasSelectedPages: !!this.#selectedPages?.size, + canDeletePages: this.#canDelete() + } + }); + }, { + signal: abortSignal, + passive: true + }); + this.#undoButton?.addEventListener("click", this.#undo.bind(this)); + this.#undoCloseButton?.addEventListener("click", this.#dismissUndo.bind(this, true)); + this.#deselectButton?.addEventListener("click", () => { + this.#clearSelection(); + this.#toggleMenuEntries(false); + this.#updateStatus("select"); + }); + this.#deselectButton.classList.toggle("hidden", true); + if (this.#enableMerge && addFileComponent) { + const { + picker, + button + } = addFileComponent; + picker.addEventListener("change", () => { + const files = Array.from(picker.files ?? []); + if (files.length) { + this.#mergeFiles(files, this._currentPageNumber - 1); + } + }); + button.addEventListener("click", () => { + picker.click(); + }); + this.#waitingBar.closeButton?.addEventListener("click", () => { + this.#toggleBar("status"); + picker.value = ""; + }); + } + } else { + manageMenu.button.hidden = true; + } + this.scroll = watchScroll(this.scrollableContainer, this.#scrollUpdated.bind(this), abortSignal); + this.#resetView(); + this.#addEventListeners(); + } + #scrollUpdated() { + this.renderingQueue.renderHighestPriority(); + } + async #mergeFiles(files, insertAfter) { + this.#toggleBar("waiting", "pdfjs-views-manager-waiting-for-file"); + const entries = []; + for (const file of files) { + const isImage = file.type?.startsWith("image/"); + if (!isImage && file.type !== "application/pdf") { + const magic = await file.slice(0, 5).text(); + if (magic !== "%PDF-") { + continue; + } + } + if (isImage) { + let bitmap; + try { + bitmap = await PDFThumbnailViewer.#fileToImageBitmap(file); + } catch { + continue; } + entries.push({ + image: bitmap, + insertAfter + }); + } else { + entries.push({ + document: await file.bytes(), + insertAfter + }); + } + } + if (entries.length === 0) { + this.#toggleBar("status"); + return; + } + const pagesCount = this.#pagesMapper.pagesNumber; + const data = this.hasStructuralChanges() ? this.getStructuralChanges() : [{ + document: null + }]; + data.push(...entries); + this.eventBus.on("pagesloaded", () => { + this.#selectedPages = null; + this.#updateMenuEntries(); + this.#toggleBar("status"); + const newPagesCount = this.#pagesMapper.pagesNumber; + const insertedPagesCount = newPagesCount - pagesCount; + for (let i = insertAfter + 1, ii = insertAfter + 1 + insertedPagesCount; i < ii; i++) { + this._thumbnails[i].checkbox.checked = true; + this.#selectPage(i + 1, true); + } + if (insertedPagesCount) { + this.#updateCurrentPage(insertAfter + 2, true); + } + }, { + once: true, + ...internalOpt + }); + this.#reportTelemetry({ + action: "merge" + }); + this.eventBus.dispatch("saveandload", { + source: this, + data + }); + } + getThumbnail(index) { + return this._thumbnails[index]; + } + #getVisibleThumbs() { + return getVisibleElements({ + scrollEl: this.scrollableContainer, + views: this._thumbnails + }); + } + #resetCurrentThumbnail(newPageNumber) { + if (!this.pdfDocument) { + return; + } + const thumbnailView = this._thumbnails[this._currentPageNumber - 1]; + thumbnailView?.toggleCurrent(false); + this._currentPageNumber = newPageNumber; + } + scrollThumbnailIntoView(pageNumber) { + if (!this.pdfDocument) { + return; + } + const thumbnailView = this._thumbnails[pageNumber - 1]; + if (!thumbnailView) { + console.error('scrollThumbnailIntoView: Invalid "pageNumber" parameter.'); + return; + } + if (pageNumber !== this._currentPageNumber) { + this.#resetCurrentThumbnail(pageNumber); + thumbnailView.toggleCurrent(true); + } + const { + first, + last, + views + } = this.#getVisibleThumbs(); + if (views.length > 0) { + let shouldScroll = false; + if (pageNumber <= first.id || pageNumber >= last.id) { + shouldScroll = true; + } else { + for (const { + id, + percent + } of views) { + if (id !== pageNumber) { + continue; + } + shouldScroll = percent < 100; + break; + } + } + if (shouldScroll) { + thumbnailView.div.scrollIntoView(SCROLL_OPTIONS); + } + } + this._currentPageNumber = pageNumber; + } + get pagesRotation() { + return this._pagesRotation; + } + set pagesRotation(rotation) { + if (!isValidRotation(rotation)) { + throw new Error("Invalid thumbnails rotation angle."); + } + if (!this.pdfDocument) { + return; + } + if (this._pagesRotation === rotation) { + return; + } + this._pagesRotation = rotation; + const updateArgs = { + rotation + }; + for (const thumbnail of this._thumbnails) { + thumbnail.update(updateArgs); + } + } + cleanup() { + for (const thumbnail of this._thumbnails) { + if (thumbnail.renderingState !== RenderingStates.FINISHED) { + thumbnail.reset(); + } + } + } + #resetView() { + this._thumbnails = []; + this._currentPageNumber = 1; + this._pageLabels = null; + this._pagesRotation = 0; + this.container.textContent = ""; + } + setDocument(pdfDocument) { + if (this.pdfDocument) { + this.#cancelRendering(); + this.#resetView(); + } + this.pdfDocument = pdfDocument; + if (!pdfDocument) { + return; + } + this.#pagesMapper = pdfDocument.pagesMapper; + const firstPagePromise = pdfDocument.getPage(1); + const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({ + intent: "display" + }); + firstPagePromise.then(firstPdfPage => { + const pagesCount = pdfDocument.numPages; + const viewport = firstPdfPage.getViewport({ + scale: 1 + }); + const fragment = document.createDocumentFragment(); + for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) { + const thumbnail = new PDFThumbnailView({ + container: fragment, + eventBus: this.eventBus, + id: pageNum, + defaultViewport: viewport.clone(), + optionalContentConfigPromise, + linkService: this.linkService, + renderingQueue: this.renderingQueue, + maxCanvasPixels: this.maxCanvasPixels, + maxCanvasDim: this.maxCanvasDim, + pageColors: this.pageColors, + enableSplitMerge: this.#enableSplitMerge + }); + this._thumbnails.push(thumbnail); + } + this._thumbnails[0]?.setPdfPage(firstPdfPage); + const thumbnailView = this._thumbnails[this._currentPageNumber - 1]; + thumbnailView.toggleCurrent(true); + this.container.append(fragment); + this.eventBus.dispatch("thumbnailsloaded", { + source: this + }); + }).catch(reason => { + console.error("Unable to initialize thumbnail viewer", reason); + }); + } + #cancelRendering() { + for (const thumbnail of this._thumbnails) { + thumbnail.cancelRendering(); + } + } + setPageLabels(labels) { + if (!this.pdfDocument) { + return; + } + if (!labels) { + this._pageLabels = null; + } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) { + this._pageLabels = null; + console.error("PDFThumbnailViewer_setPageLabels: Invalid page labels."); + } else { + this._pageLabels = labels; + } + for (let i = 0, ii = this._thumbnails.length; i < ii; i++) { + this._thumbnails[i].setPageLabel(this._pageLabels?.[i] ?? null); + } + } + async #ensurePdfPageLoaded(thumbView) { + if (thumbView.pdfPage) { + return thumbView.pdfPage; + } + try { + const pdfPage = await this.pdfDocument.getPage(thumbView.id); + if (!thumbView.pdfPage) { + thumbView.setPdfPage(pdfPage); + } + return pdfPage; + } catch (reason) { + console.error("Unable to get page for thumb view", reason); + return null; + } + } + #getScrollAhead(visible) { + if (visible.first?.id === 1) { + return true; + } else if (visible.last?.id === this._thumbnails.length) { + return false; + } + return this.scroll.down; + } + forceRendering() { + const visibleThumbs = this.#getVisibleThumbs(); + const scrollAhead = this.#getScrollAhead(visibleThumbs); + const thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, this._thumbnails, scrollAhead, false, true); + if (thumbView) { + this.#ensurePdfPageLoaded(thumbView).then(() => { + this.renderingQueue.renderView(thumbView); + }); + return true; + } + return false; + } + hasStructuralChanges() { + return this.#pagesMapper?.hasBeenAltered() || false; + } + getStructuralChanges() { + return this.#pagesMapper?.getPageMappingForSaving() || null; + } + static #getScaleFactor(image) { + return PDFThumbnailViewer.#draggingScaleFactor ||= parseFloat(getComputedStyle(image).getPropertyValue("--thumbnail-dragging-scale")); + } + static #fitImageDimensions(width, height, { + minSide = 0, + maxSide + }) { + const longest = Math.max(width, height); + let scale = 1; + if (minSide > 0 && longest < minSide) { + scale = minSide / longest; + } else if (longest > maxSide) { + scale = maxSide / longest; + } + return scale === 1 ? { + width, + height + } : { + width: Math.max(1, Math.round(width * scale)), + height: Math.max(1, Math.round(height * scale)) + }; + } + static async #fileToImageBitmap(file) { + const MIN_RASTER_SIDE = 1024; + const MAX_RASTER_SIDE = 4096; + if (file.type !== "image/svg+xml") { + const bitmap = await createImageBitmap(file); + const { + width, + height + } = PDFThumbnailViewer.#fitImageDimensions(bitmap.width, bitmap.height, { + maxSide: MAX_RASTER_SIDE + }); + if (width === bitmap.width && height === bitmap.height) { + return bitmap; + } + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d"); + ctx.drawImage(bitmap, 0, 0, width, height); + bitmap.close(); + return canvas.transferToImageBitmap(); + } + const url = URL.createObjectURL(file); + try { + const image = new Image(); + image.src = url; + await image.decode(); + const { + width, + height + } = PDFThumbnailViewer.#fitImageDimensions(image.naturalWidth || MIN_RASTER_SIDE, image.naturalHeight || MIN_RASTER_SIDE, { + minSide: MIN_RASTER_SIDE, + maxSide: MAX_RASTER_SIDE + }); + const canvas = new OffscreenCanvas(width, height); + const ctx = canvas.getContext("2d"); + ctx.drawImage(image, 0, 0, width, height); + return canvas.transferToImageBitmap(); + } finally { + URL.revokeObjectURL(url); + } + } + #updateThumbnails(currentPageNumber) { + this.#resetCurrentThumbnail(0); + let newCurrentPageNumber = 0; + const pagesMapper = this.#pagesMapper; + const prevThumbnails = this.#savedThumbnails = this._thumbnails; + const newThumbnails = this._thumbnails = []; + const fragment = document.createDocumentFragment(); + const isCut = this.#isCut; + for (let i = 1, ii = pagesMapper.pagesNumber; i <= ii; i++) { + const prevPageNumber = pagesMapper.getPrevPageNumber(i); + if (prevPageNumber < 0) { + let thumbnail = this.#copiedThumbnails.get(-prevPageNumber); + thumbnail.checkbox.checked = false; + if (isCut) { + thumbnail.updateId(i); + fragment.append(thumbnail.div); + } else { + thumbnail = thumbnail.clone(fragment, i); + } + newThumbnails.push(thumbnail); + continue; + } + if (prevPageNumber === currentPageNumber) { + newCurrentPageNumber = i; + } + const newThumbnail = prevThumbnails[prevPageNumber - 1]; + newThumbnails.push(newThumbnail); + newThumbnail.updateId(i); + newThumbnail.checkbox.checked = false; + fragment.append(newThumbnail.div); + } + this.container.replaceChildren(fragment); + return newCurrentPageNumber; + } + #onStartDragging(draggedThumbnail) { + this.#currentScrollTop = this.scrollableContainer.scrollTop; + this.#currentScrollBottom = this.#currentScrollTop + this.scrollableContainer.clientHeight; + this.#dragAC = new AbortController(); + this.container.classList.add("isDragging"); + this.#newBadge?.classList.add("hidden"); + const startPageNumber = parseInt(draggedThumbnail.getAttribute("page-number"), 10); + this.#lastDraggedOverIndex = startPageNumber - 1; + if (!this.#selectedPages?.has(startPageNumber)) { + this.#pageNumberToRemove = startPageNumber; + this.#selectPage(startPageNumber, true); + } + for (const selected of this.#selectedPages) { + const thumbnail = this._thumbnails[selected - 1]; + const placeholder = thumbnail.placeholder = document.createElement("div"); + placeholder.classList.add("thumbnailImageContainer", "placeholder"); + const { + div, + imageContainer + } = thumbnail; + div.classList.add("isDragging"); + placeholder.style.height = getComputedStyle(imageContainer).height; + imageContainer.after(placeholder); + if (selected !== startPageNumber) { + imageContainer.classList.add("hidden"); + continue; + } + if (this.#selectedPages.size === 1) { + imageContainer.classList.add("draggingThumbnail"); + this.#draggedContainer = imageContainer; + continue; + } + const draggedContainer = this.#draggedContainer = document.createElement("div"); + draggedContainer.classList.add("draggingThumbnail", "thumbnailImageContainer", "multiple"); + draggedContainer.style.height = getComputedStyle(imageContainer).height; + imageContainer.replaceWith(draggedContainer); + imageContainer.classList.remove("thumbnailImageContainer"); + draggedContainer.append(imageContainer); + draggedContainer.setAttribute("data-multiple-count", this.#selectedPages.size); + } + } + #onStopDragging(isDropping = false) { + const draggedContainer = this.#draggedContainer; + this.#draggedContainer = null; + const lastDraggedOverIndex = this.#lastDraggedOverIndex; + this.#lastDraggedOverIndex = NaN; + this.#dragMarker?.remove(); + this.#dragMarker = null; + this.#dragAC.abort(); + this.#dragAC = null; + this.#newBadge?.classList.remove("hidden"); + this.container.classList.remove("isDragging"); + for (const selected of this.#selectedPages) { + const thumbnail = this._thumbnails[selected - 1]; + const { + div, + placeholder, + imageContainer + } = thumbnail; + placeholder.remove(); + imageContainer.classList.remove("draggingThumbnail", "hidden"); + div.classList.remove("isDragging"); + } + if (draggedContainer.classList.contains("multiple")) { + const originalImageContainer = draggedContainer.firstElementChild; + draggedContainer.replaceWith(originalImageContainer); + originalImageContainer.classList.add("thumbnailImageContainer"); + } else { + draggedContainer.style.translate = ""; + } + const selectedPages = this.#selectedPages; + if (!isNaN(lastDraggedOverIndex) && isDropping && !(selectedPages.size === 1 && (selectedPages.has(lastDraggedOverIndex + 1) || selectedPages.has(lastDraggedOverIndex + 2)))) { + this._thumbnails[this._currentPageNumber - 1]?.toggleCurrent(false); + this._currentPageNumber = -1; + const newIndex = lastDraggedOverIndex + 1; + const pagesToMove = Array.from(selectedPages).sort((a, b) => a - b); + const pagesMapper = this.#pagesMapper; + const currentPageNumber = isNaN(this.#pageNumberToRemove) ? pagesToMove[0] : this.#pageNumberToRemove; + pagesMapper.movePages(selectedPages, pagesToMove, newIndex); + this.#updateCurrentPage(this.#updateThumbnails(currentPageNumber)); + this.#thumbnailsPositions = null; + selectedPages.clear(); + this.#pageNumberToRemove = NaN; + this.#toggleMenuEntries(false); + this.#updateStatus("select"); + this.#reportTelemetry({ + action: "move" + }); + this.eventBus.dispatch("pagesedited", { + source: this, + pagesMapper, + type: "move" + }); + } + if (!isNaN(this.#pageNumberToRemove)) { + this.#selectPage(this.#pageNumberToRemove, false); + this.#pageNumberToRemove = NaN; + } + } + #clearSelection() { + for (const pageNumber of this.#selectedPages) { + this._thumbnails[pageNumber - 1].toggleSelected(false); + } + this.#selectedPages.clear(); + } + #updateCurrentPage(currentPageNumber, forceFocus = false) { + setTimeout(() => { + this.forceRendering(); + const newPageNumber = currentPageNumber || 1; + this.linkService.goToPage(newPageNumber); + const thumbnailView = this._thumbnails[newPageNumber - 1]; + if (forceFocus || !this.container.contains(document.activeElement)) { + thumbnailView.imageContainer.focus(); + } + }, 0); + } + #undo() { + this.#clearSelection(); + this.#toggleMenuEntries(false); + this.#updateStatus("select"); + if (this.#copiedThumbnails) { + this.#copiedThumbnails = null; + this.#pagesMapper.cancelCopy(); + this.#togglePasteMode(false); + this.eventBus.dispatch("pagesedited", { + source: this, + pagesMapper: this.#pagesMapper, + type: "cancelCopy" + }); + } + this.#isCut = false; + if (this.#savedThumbnails) { + const currentThumb = this._thumbnails[this._currentPageNumber - 1]; + currentThumb?.toggleCurrent(false); + const fragment = document.createDocumentFragment(); + for (let i = 1, ii = this.#savedThumbnails.length; i <= ii; i++) { + const thumbnail = this.#savedThumbnails[i - 1]; + thumbnail.updateId(i); + thumbnail.checkbox.checked = false; + fragment.append(thumbnail.div); + } + this.container.replaceChildren(fragment); + this._thumbnails = this.#savedThumbnails; + this.#savedThumbnails = null; + const newIdx = currentThumb ? this._thumbnails.indexOf(currentThumb) : -1; + this._currentPageNumber = newIdx + 1; + currentThumb?.toggleCurrent(newIdx !== -1); + this.#pagesMapper.cancelDelete(); + this.eventBus.dispatch("pagesedited", { + source: this, + pagesMapper: this.#pagesMapper, + type: "cancelDelete" + }); + } + } + #dismissUndo(mustUpdateStatus) { + this.#copiedThumbnails = null; + if (this.#deletedPageNumbers) { + if (this.#savedThumbnails) { + for (const pageNumber of this.#deletedPageNumbers) { + this.#savedThumbnails[pageNumber - 1].destroy(); + } + this.#savedThumbnails = null; + } + this.#deletedPageNumbers = null; + } + this.#isCut = false; + if (mustUpdateStatus) { + this.#updateStatus("select"); + } + this.#togglePasteMode(false); + this.#pagesMapper.cleanSavedData(); + this.eventBus.dispatch("pagesedited", { + source: this, + pagesMapper: this.#pagesMapper, + type: "cleanSavedData" + }); + } + #canDelete() { + const size = this.#selectedPages?.size || 0; + return size > 0 && size < this._thumbnails.length; + } + #toggleBar(type, message, args) { + this.#statusBar.classList.toggle("hidden", type !== "status"); + this.#waitingBar.container.classList.toggle("hidden", type !== "waiting"); + this.#undoBar.classList.toggle("hidden", type !== "undo"); + this.#hasUndoBarVisible = type === "undo"; + switch (type) { + case "waiting": + this.#waitingBar.label.setAttribute("data-l10n-id", message); break; - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.OUTLINE: - if (this.outlineButton.disabled) { - return; + case "undo": + this.#undoLabel.setAttribute("data-l10n-id", message); + if (args) { + this.#undoLabel.setAttribute("data-l10n-args", JSON.stringify(args)); } break; - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.ATTACHMENTS: - if (this.attachmentsButton.disabled) { - return; + case "status": + if (args) { + this.#statusLabel.setAttribute("data-l10n-args", JSON.stringify(args)); + } else { + this.#statusLabel.removeAttribute("data-l10n-args"); } + this.#newBadge?.classList.toggle("hidden", !!args); + this.#deselectButton.classList.toggle("hidden", !args); break; - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.LAYERS: - if (this.layersButton.disabled) { + } + } + #togglePasteMode(enable) { + this.#isInPasteMode = enable; + if (enable) { + this.container.classList.add("pasteMode"); + for (const thumbnail of this._thumbnails) { + thumbnail.addPasteButton(this.#boundPastePages); + } + } else { + this.container.classList.remove("pasteMode"); + for (const thumbnail of this._thumbnails) { + thumbnail.removePasteButton(); + } + } + } + #reportTelemetry(data) { + this.eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "pageOrganization", + data + } + }); + } + #saveExtractedPages() { + this.#reportTelemetry({ + action: "exportSelected" + }); + this.eventBus.dispatch("saveextractedpages", { + source: this, + data: this.#pagesMapper.extractPages(this.#selectedPages) + }); + this.#clearSelection(); + this.#toggleMenuEntries(false); + this.#updateStatus("select"); + } + #copyPages(clearSelection = true) { + if (!this.#isCut) { + this.#savedThumbnails = null; + this.#reportTelemetry({ + action: "copy" + }); + } + this.#updateStatus(this.#isCut ? "cut" : "copy"); + const pageNumbersToCopy = this.#copiedPageNumbers = Uint32Array.from(this.#selectedPages).sort((a, b) => a - b); + const pagesMapper = this.#pagesMapper; + pagesMapper.copyPages(pageNumbersToCopy); + this.#copiedThumbnails = new Map(); + for (const pageNumber of pageNumbersToCopy) { + this.#copiedThumbnails.set(pageNumber, this._thumbnails[pageNumber - 1]); + } + this.eventBus.dispatch("pagesedited", { + source: this, + pagesMapper, + pageNumbers: pageNumbersToCopy, + type: "copy" + }); + if (clearSelection) { + this.#clearSelection(); + } + this.#togglePasteMode(true); + this.#toggleMenuEntries(false); + } + #cutPages() { + if (!this.#canDelete()) { + return; + } + this.#reportTelemetry({ + action: "cut" + }); + this.#isCut = true; + this.#copyPages(false); + this.#deletePages("cut"); + } + #pastePages(index) { + this.#reportTelemetry({ + action: "paste" + }); + const pagesMapper = this.#pagesMapper; + const currentPageNumber = this.#copiedPageNumbers.includes(this._currentPageNumber) ? 0 : this._currentPageNumber; + pagesMapper.pastePages(index); + this.#updateThumbnails(currentPageNumber); + this.#updateCurrentPage(index + 1, true); + this.#thumbnailsPositions = null; + this.eventBus.dispatch("pagesedited", { + source: this, + pagesMapper, + hasBeenCut: this.#isCut, + type: "paste" + }); + this.#copiedThumbnails = null; + this.#isCut = false; + this.#togglePasteMode(false); + this.#toggleMenuEntries(false); + this.#updateStatus("select"); + } + #deletePages(type = "delete") { + if (!this.#canDelete()) { + return; + } + const selectedPages = this.#selectedPages; + if (type === "delete") { + this.#reportTelemetry({ + action: "delete" + }); + this.#updateStatus("delete"); + } + const pagesMapper = this.#pagesMapper; + const currentPageNumber = selectedPages.has(this._currentPageNumber) ? 0 : this._currentPageNumber; + const pagesToDelete = this.#deletedPageNumbers = Uint32Array.from(selectedPages).sort((a, b) => a - b); + pagesMapper.deletePages(pagesToDelete); + this.#updateCurrentPage(this.#updateThumbnails(currentPageNumber)); + this.#thumbnailsPositions = null; + selectedPages.clear(); + this.#updateMenuEntries(); + this.eventBus.dispatch("pagesedited", { + source: this, + pagesMapper, + pageNumbers: pagesToDelete, + type + }); + } + #updateMenuEntries() { + const size = this.#selectedPages?.size || 0; + this.#manageExportButton.disabled = this.#manageCopyButton.disabled = !size; + this.#manageDeleteButton.disabled = this.#manageCutButton.disabled = !this.#canDelete(); + } + #toggleMenuEntries(enable) { + this.#manageExportButton.disabled = this.#manageDeleteButton.disabled = this.#manageCopyButton.disabled = this.#manageCutButton.disabled = !enable; + } + #updateStatus(type) { + if (!this.#statusBar || !this.#undoBar) { + return; + } + const count = this.#selectedPages?.size || 0; + if (type === "select") { + this.#statusLabel.setAttribute("data-l10n-id", count ? "pdfjs-views-manager-pages-status-action-label" : "pdfjs-views-manager-pages-status-none-action-label"); + this.#toggleBar("status", "", count ? { + count + } : null); + return; + } + let l10nId; + switch (type) { + case "copy": + l10nId = "pdfjs-views-manager-pages-status-undo-copy-label"; + break; + case "cut": + l10nId = "pdfjs-views-manager-status-undo-cut-label"; + break; + case "delete": + l10nId = "pdfjs-views-manager-pages-status-undo-delete-label"; + break; + } + this.#toggleBar("undo", l10nId, { + count + }); + if (type === "copy") { + this.#undoButton.firstElementChild.setAttribute("data-l10n-id", "pdfjs-views-manager-status-done-button-label"); + this.#undoCloseButton.classList.toggle("hidden", true); + } else { + this.#undoButton.firstElementChild.setAttribute("data-l10n-id", "pdfjs-views-manager-status-undo-button-label"); + this.#undoCloseButton.classList.toggle("hidden", false); + } + } + #moveDraggedContainer(dx, dy) { + if (this.#isOneColumnView) { + dx = 0; + } + if (this.#draggedImageX + dx < 0 || this.#draggedImageX + this.#draggedImageWidth + dx > this.#scrollableContainerWidth) { + dx = 0; + } + if (this.#draggedImageY + dy < 0 || this.#draggedImageY + this.#draggedImageHeight + dy > this.#scrollableContainerHeight) { + dy = 0; + } + this.#draggedImageX += dx; + this.#draggedImageY += dy; + this.#draggedImageOffsetX += dx; + this.#draggedImageOffsetY += dy; + this.#draggedContainer.style.translate = `${this.#draggedImageOffsetX}px ${this.#draggedImageOffsetY}px`; + if (this.#draggedImageY + this.#draggedImageHeight > this.#currentScrollBottom) { + this.scrollableContainer.scrollTop = Math.min(this.scrollableContainer.scrollTop + PIXELS_TO_SCROLL_WHEN_DRAGGING, this.#scrollableContainerHeight); + } else if (this.#draggedImageY < this.#currentScrollTop) { + this.scrollableContainer.scrollTop = Math.max(this.scrollableContainer.scrollTop - PIXELS_TO_SCROLL_WHEN_DRAGGING, 0); + } + const positionData = this.#findClosestThumbnail(this.#draggedImageX + this.#draggedImageWidth / 2, this.#draggedImageY + this.#draggedImageHeight / 2); + this.#positionDragMarker(positionData); + } + #positionDragMarker(positionData) { + if (!positionData) { + return; + } + let dragMarker = this.#dragMarker; + if (!dragMarker) { + dragMarker = this.#dragMarker = document.createElement("div"); + dragMarker.className = "dragMarker"; + this.container.firstChild.before(dragMarker); + } + const [index, space] = positionData; + const dragMarkerStyle = dragMarker.style; + const { + bbox, + x: xPos + } = this.#thumbnailsPositions; + let x, y, width, height; + if (index < 0) { + if (xPos.length === 1) { + y = bbox[1] - SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT; + x = bbox[0]; + width = bbox[2]; + } else { + y = bbox[1]; + x = bbox[0] - SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT; + height = bbox[3]; + } + } else if (xPos.length === 1) { + y = bbox[index * 4 + 1] + bbox[index * 4 + 3] + space; + x = bbox[index * 4]; + width = bbox[index * 4 + 2]; + } else { + y = bbox[index * 4 + 1]; + x = bbox[index * 4] + bbox[index * 4 + 2] + space; + height = bbox[index * 4 + 3]; + } + dragMarkerStyle.translate = `${x}px ${y}px`; + dragMarkerStyle.width = width ? `${width}px` : ""; + dragMarkerStyle.height = height ? `${height}px` : ""; + } + #computeThumbnailsPosition() { + const positionsX = []; + const positionsY = []; + const positionsLastX = []; + const bbox = new Float32Array(this._thumbnails.length * 4); + let prevX = -Infinity; + let prevY = -Infinity; + let reminder = -1; + let firstRightX; + let lastRightX; + let firstBottomY; + for (let i = 0, ii = this._thumbnails.length; i < ii; i++) { + const { + div + } = this._thumbnails[i]; + const { + offsetTop: y, + offsetLeft: x, + offsetWidth: w, + offsetHeight: h + } = div; + if (w === 0) { + return; + } + bbox[i * 4] = x; + bbox[i * 4 + 1] = y; + bbox[i * 4 + 2] = w; + bbox[i * 4 + 3] = h; + if (x > prevX) { + prevX = x + w / 2; + firstRightX ??= prevX + w; + positionsX.push(prevX); + } + if (y > prevY) { + if (reminder === -1 && positionsX.length > 1) { + reminder = ii % positionsX.length; + } + prevY = y + h / 2; + firstBottomY ??= prevY + h; + positionsY.push(prevY); + } + if (reminder > 0 && i >= ii - reminder) { + const cx = x + w / 2; + positionsLastX.push(cx); + lastRightX ??= cx + w; + } + } + let space; + if (positionsX.length > 1) { + space = (positionsX[1] - firstRightX) / 2; + } else if (positionsY.length > 1) { + space = (positionsY[1] - firstBottomY) / 2; + } else { + space = SPACE_FOR_DRAG_MARKER_WHEN_NO_NEXT_ELEMENT; + } + this.#thumbnailsPositions = { + x: positionsX, + y: positionsY, + lastX: positionsLastX, + space, + lastSpace: positionsLastX.length ? (positionsLastX.at(-1) - lastRightX) / 2 : space, + bbox + }; + this.#isOneColumnView = positionsX.length === 1; + ({ + clientWidth: this.#scrollableContainerWidth, + scrollHeight: this.#scrollableContainerHeight + } = this.scrollableContainer); + } + #addEventListeners() { + this.eventBus.on("resize", ({ + source + }) => { + if (source.thumbnailsView === this.container) { + this.#computeThumbnailsPosition(); + } + }, internalOpt); + this.container.addEventListener("keydown", e => { + const { + target + } = e; + const isCheckbox = target instanceof HTMLInputElement && target.type === "checkbox"; + switch (e.key) { + case "ArrowLeft": + this.#goToNextItem(target, false, true, isCheckbox); + stopEvent(e); + break; + case "ArrowRight": + this.#goToNextItem(target, true, true, isCheckbox); + stopEvent(e); + break; + case "ArrowDown": + this.#goToNextItem(target, true, false, isCheckbox); + stopEvent(e); + break; + case "ArrowUp": + this.#goToNextItem(target, false, false, isCheckbox); + stopEvent(e); + break; + case "Home": + this.#focusThumbnailElement(this._thumbnails[0], isCheckbox); + stopEvent(e); + break; + case "End": + this.#focusThumbnailElement(this._thumbnails.at(-1), isCheckbox); + stopEvent(e); + break; + case "Enter": + case " ": + if (!isCheckbox) { + this.#goToPage(e); + } + break; + case "c": + if (this.#enableSplitMerge && (e.ctrlKey || e.metaKey) && this.#selectedPages?.size) { + this.#copyPages(); + stopEvent(e); + } + break; + case "x": + if (this.#enableSplitMerge && (e.ctrlKey || e.metaKey) && this.#selectedPages?.size) { + this.#cutPages(); + stopEvent(e); + } + break; + case "Delete": + case "Backspace": + if (this.#enableSplitMerge && !this.#isInPasteMode && this.#selectedPages?.size) { + this.#deletePages(); + stopEvent(e); + } + break; + } + }); + this.container.addEventListener("click", e => { + const { + target + } = e; + if (target instanceof HTMLInputElement) { + const pageNumber = parseInt(target.parentElement.getAttribute("page-number"), 10); + this.#selectPage(pageNumber, target.checked); + return; + } + this.#goToPage(e); + }); + this.#addDragListeners(); + this.#addExternalFileDropListeners(); + } + #selectPage(pageNumber, checked) { + if (this.#hasUndoBarVisible) { + this.#dismissUndo(false); + } + const set = this.#selectedPages ??= new Set(); + if (checked) { + set.add(pageNumber); + } else { + set.delete(pageNumber); + } + this.#updateMenuEntries(); + this.#updateStatus("select"); + } + #addDragListeners() { + if (!this.#enableSplitMerge) { + return; + } + this.container.addEventListener("pointerdown", e => { + const { + target: draggedImage, + clientX: clickX, + clientY: clickY, + pointerId: dragPointerId + } = e; + if (e.button !== 0 || this.#isInPasteMode || this._thumbnails.length === 1 || !isNaN(this.#lastDraggedOverIndex) || !draggedImage.classList.contains("thumbnailImageContainer")) { + return; + } + const thumbnail = draggedImage.parentElement; + const pointerDownAC = new AbortController(); + const { + signal: pointerDownSignal + } = pointerDownAC; + let prevDragX = clickX; + let prevDragY = clickY; + let prevScrollTop = this.scrollableContainer.scrollTop; + const scaleFactor = PDFThumbnailViewer.#getScaleFactor(draggedImage); + this.#draggedImageOffsetY = ((scaleFactor - 1) * e.layerY + draggedImage.offsetTop) / scaleFactor; + if (this.#isOneColumnView) { + this.#draggedImageOffsetX = draggedImage.offsetLeft + (scaleFactor - 1) * 0.5 * draggedImage.offsetWidth / scaleFactor; + } else { + this.#draggedImageOffsetX = ((scaleFactor - 1) * e.layerX + draggedImage.offsetLeft) / scaleFactor; + } + this.#draggedImageX = thumbnail.offsetLeft + this.#draggedImageOffsetX; + this.#draggedImageY = thumbnail.offsetTop + this.#draggedImageOffsetY; + this.#draggedImageWidth = draggedImage.offsetWidth / scaleFactor; + this.#draggedImageHeight = draggedImage.offsetHeight / scaleFactor; + this.container.addEventListener("pointermove", ev => { + const { + clientX: x, + clientY: y, + pointerId + } = ev; + if (isNaN(this.#lastDraggedOverIndex)) { + if (pointerId !== dragPointerId || Math.abs(x - clickX) <= DRAG_THRESHOLD_IN_PIXELS && Math.abs(y - clickY) <= DRAG_THRESHOLD_IN_PIXELS) { + return; + } + this.#onStartDragging(thumbnail); + const stopDragging = (_e, isDropping = false) => { + this.#onStopDragging(isDropping); + pointerDownAC.abort(); + }; + const { + signal + } = this.#dragAC; + window.addEventListener("touchmove", stopEvent, { + passive: false, + signal + }); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + this.scrollableContainer.addEventListener("scrollend", () => { + const { + scrollableContainer: { + clientHeight, + scrollTop + } + } = this; + this.#currentScrollTop = scrollTop; + this.#currentScrollBottom = scrollTop + clientHeight; + const dy = scrollTop - prevScrollTop; + prevScrollTop = scrollTop; + this.#moveDraggedContainer(0, dy); + }, { + passive: true, + signal + }); + window.addEventListener("pointerup", upEv => { + if (upEv.pointerId !== dragPointerId) { + return; + } + window.addEventListener("click", stopEvent, { + capture: true, + once: true, + signal + }); + stopEvent(upEv); + stopDragging(upEv, true); + }, { + signal + }); + window.addEventListener("blur", stopDragging, { + signal + }); + window.addEventListener("pointercancel", stopDragging, { + signal + }); + window.addEventListener("wheel", stopEvent, { + passive: false, + signal + }); + window.addEventListener("keydown", kEv => { + if (kEv.key === "Escape" && !isNaN(this.#lastDraggedOverIndex)) { + stopDragging(kEv); + } + }, { + signal + }); + } + const dx = x - prevDragX; + const dy = y - prevDragY; + prevDragX = x; + prevDragY = y; + this.#moveDraggedContainer(dx, dy); + }, { + passive: true, + signal: pointerDownSignal + }); + window.addEventListener("pointerup", ({ + pointerId + }) => { + if (pointerId !== dragPointerId) { return; } + pointerDownAC.abort(); + }, { + signal: pointerDownSignal + }); + window.addEventListener("dragstart", stopEvent, { + capture: true, + signal: pointerDownSignal + }); + }); + } + #addExternalFileDropListeners() { + if (!this.#enableMerge) { + return; + } + const container = this.container; + const signal = this.#abortSignal; + const hasMergeableItem = dataTransfer => { + if (!dataTransfer) { + return false; + } + for (const item of dataTransfer.items) { + if (item.kind === "file" && (item.type === "application/pdf" || item.type.startsWith("image/"))) { + return true; + } + } + return false; + }; + const pointerInContainer = ({ + clientX, + clientY + }) => { + const { + left, + right, + top, + bottom + } = container.getBoundingClientRect(); + return clientX >= left && clientX < right && clientY >= top && clientY < bottom; + }; + container.addEventListener("dragenter", e => { + if (this.#externalDragActive || !isNaN(this.#lastDraggedOverIndex) || !this._thumbnails.length || !hasMergeableItem(e.dataTransfer)) { + return; + } + e.preventDefault(); + e.stopPropagation(); + e.dataTransfer.dropEffect = "copy"; + this.#externalDragActive = true; + this.container.classList.add("isDraggingFile"); + this.#thumbnailsPositions = null; + this.#computeThumbnailsPosition(); + this.#lastDraggedOverIndex = NaN; + }, { + signal + }); + container.addEventListener("dragover", e => { + if (!this.#externalDragActive) { + return; + } + e.preventDefault(); + e.stopPropagation(); + e.dataTransfer.dropEffect = "copy"; + if (!this.#thumbnailsPositions) { + return; + } + const rect = container.getBoundingClientRect(); + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + const positionData = this.#findClosestThumbnail(x, y); + this.#positionDragMarker(positionData); + }, { + signal + }); + container.addEventListener("dragleave", e => { + if (!this.#externalDragActive) { + return; + } + if (e.relatedTarget && container.contains(e.relatedTarget) || pointerInContainer(e)) { + return; + } + this.#endExternalFileDrag(); + }, { + signal + }); + container.addEventListener("drop", e => { + if (!this.#externalDragActive) { + return; + } + e.preventDefault(); + e.stopPropagation(); + const files = Array.from(e.dataTransfer.files ?? []); + if (isNaN(this.#lastDraggedOverIndex) && this.#thumbnailsPositions) { + const rect = container.getBoundingClientRect(); + this.#findClosestThumbnail(e.clientX - rect.left, e.clientY - rect.top); + } + const insertAfter = isNaN(this.#lastDraggedOverIndex) ? -1 : this.#lastDraggedOverIndex; + this.#endExternalFileDrag(); + if (files.length) { + this.#mergeFiles(files, insertAfter); + } + }, { + signal + }); + } + #endExternalFileDrag() { + this.#externalDragActive = false; + this.container.classList.remove("isDraggingFile"); + this.#dragMarker?.remove(); + this.#dragMarker = null; + this.#lastDraggedOverIndex = NaN; + } + #goToPage(e) { + const container = e.target.closest(".thumbnailImageContainer"); + if (container) { + const pageNumber = parseInt(container.getAttribute("page-number"), 10); + this.linkService.goToPage(pageNumber); + stopEvent(e); + } + } + #focusThumbnailElement(thumbnail, focusCheckbox) { + if (focusCheckbox && thumbnail.checkbox) { + thumbnail.checkbox.focus(); + } else { + thumbnail.imageContainer.focus(); + } + } + #goToNextItem(element, forward, horizontal, navigateCheckboxes = false) { + let currentPageNumber = parseInt(element.parentElement.getAttribute("page-number"), 10); + if (isNaN(currentPageNumber)) { + currentPageNumber = this._currentPageNumber; + } + const increment = forward ? 1 : -1; + let nextThumbnail; + if (horizontal) { + const nextPageNumber = MathClamp(currentPageNumber + increment, 1, this._thumbnails.length + 1); + nextThumbnail = this._thumbnails[nextPageNumber - 1]; + } else { + const currentThumbnail = this._thumbnails[currentPageNumber - 1]; + const { + x: currentX, + y: currentY + } = currentThumbnail.div.getBoundingClientRect(); + let firstWithDifferentY; + for (let i = currentPageNumber - 1 + increment; i >= 0 && i < this._thumbnails.length; i += increment) { + const thumbnail = this._thumbnails[i]; + const { + x, + y + } = thumbnail.div.getBoundingClientRect(); + if (!firstWithDifferentY && y !== currentY) { + firstWithDifferentY = thumbnail; + } + if (x === currentX) { + nextThumbnail = thumbnail; + break; + } + } + if (!nextThumbnail) { + nextThumbnail = firstWithDifferentY; + } + } + if (nextThumbnail) { + this.#focusThumbnailElement(nextThumbnail, navigateCheckboxes); + } + } + #findClosestThumbnail(x, y) { + if (!this.#thumbnailsPositions) { + this.#computeThumbnailsPosition(); + } + const { + x: positionsX, + y: positionsY, + lastX: positionsLastX, + space: spaceBetweenThumbnails, + lastSpace: lastSpaceBetweenThumbnails + } = this.#thumbnailsPositions; + const lastDraggedOverIndex = this.#lastDraggedOverIndex; + let xPos = lastDraggedOverIndex % positionsX.length; + let yPos = Math.floor(lastDraggedOverIndex / positionsX.length); + let xArray = yPos === positionsY.length - 1 ? positionsLastX : positionsX; + if (positionsY[yPos] <= y && y < (positionsY[yPos + 1] ?? Infinity) && xArray[xPos] <= x && x < (xArray[xPos + 1] ?? Infinity)) { + return null; + } + let index; + yPos = binarySearchFirstItem(positionsY, cy => y < cy); + if (this.#isOneColumnView) { + index = yPos - 1; + } else { + if (yPos === positionsY.length) { + yPos = positionsY.length - 1; + } else { + const dist1 = Math.abs(positionsY[yPos - 1] - y); + const dist2 = Math.abs(positionsY[yPos] - y); + yPos = dist1 < dist2 ? yPos - 1 : yPos; + } + xArray = yPos === positionsY.length - 1 && positionsLastX.length > 0 ? positionsLastX : positionsX; + xPos = binarySearchFirstItem(xArray, cx => x < cx) - 1; + if (yPos < 0) { + if (xPos <= 0) { + xPos = -1; + } + yPos = 0; + } + index = MathClamp(yPos * positionsX.length + xPos, -1, this._thumbnails.length - 1); + } + if (index === lastDraggedOverIndex) { + return null; + } + this.#lastDraggedOverIndex = index; + const space = yPos === positionsY.length - 1 && positionsLastX.length > 0 && xPos >= 0 ? lastSpaceBetweenThumbnails : spaceBetweenThumbnails; + return [index, space]; + } +} + +;// ./web/annotation_editor_layer_builder.js + + +class AnnotationEditorLayerBuilder { + #annotationLayer = null; + #drawLayer = null; + #onAppend = null; + #structTreeLayer = null; + #textLayer = null; + #uiManager; + constructor(options) { + this.pageIndex = options.pageIndex; + this.accessibilityManager = options.accessibilityManager; + this.l10n = options.l10n; + this.l10n ||= new genericl10n_GenericL10n(); + this.annotationEditorLayer = null; + this.div = null; + this._cancelled = false; + this.#uiManager = options.uiManager; + this.#annotationLayer = options.annotationLayer || null; + this.#textLayer = options.textLayer || null; + this.#drawLayer = options.drawLayer || null; + this.#onAppend = options.onAppend || null; + this.#structTreeLayer = options.structTreeLayer || null; + } + updatePageIndex(newPageIndex) { + this.pageIndex = newPageIndex; + this.annotationEditorLayer?.updatePageIndex(newPageIndex); + } + async render({ + viewport, + intent = "display" + }) { + if (intent !== "display") { + return; + } + if (this._cancelled) { + return; + } + const clonedViewport = viewport.clone({ + dontFlip: true + }); + if (this.div) { + this.annotationEditorLayer.update({ + viewport: clonedViewport + }); + this.show(); + return; + } + const div = this.div = document.createElement("div"); + div.className = "annotationEditorLayer"; + div.hidden = true; + div.dir = this.#uiManager.direction; + this.#onAppend?.(div); + this.annotationEditorLayer = new AnnotationEditorLayer({ + uiManager: this.#uiManager, + div, + structTreeLayer: this.#structTreeLayer, + accessibilityManager: this.accessibilityManager, + pageIndex: this.pageIndex, + l10n: this.l10n, + viewport: clonedViewport, + annotationLayer: this.#annotationLayer, + textLayer: this.#textLayer, + drawLayer: this.#drawLayer + }); + const parameters = { + viewport: clonedViewport, + div, + annotations: null, + intent + }; + await this.annotationEditorLayer.render(parameters); + this.show(); + } + cancel() { + this._cancelled = true; + if (!this.div) { + return; + } + this.annotationEditorLayer.destroy(); + } + hide() { + if (!this.div) { + return; + } + this.annotationEditorLayer.pause(true); + this.div.hidden = true; + } + show() { + if (!this.div || this.annotationEditorLayer.isInvisible) { + return; + } + this.div.hidden = false; + this.annotationEditorLayer.pause(false); + } +} + +;// ./web/annotation_layer_builder.js + + + +class AnnotationLayerBuilder { + #annotations = null; + #commentManager = null; + #onAppend = null; + #eventAC = null; + #linksInjected = false; + constructor({ + pdfPage, + linkService, + downloadManager, + annotationStorage = null, + imageResourcesPath = "", + renderForms = true, + enableComment = false, + commentManager = null, + enableScripting = false, + hasJSActionsPromise = null, + fieldObjectsPromise = null, + annotationCanvasMap = null, + accessibilityManager = null, + annotationEditorUIManager = null, + onAppend = null + }) { + this.pdfPage = pdfPage; + this.linkService = linkService; + this.downloadManager = downloadManager; + this.imageResourcesPath = imageResourcesPath; + this.renderForms = renderForms; + this.annotationStorage = annotationStorage; + this.enableComment = enableComment; + this.#commentManager = commentManager; + this.enableScripting = enableScripting; + this._hasJSActionsPromise = hasJSActionsPromise || Promise.resolve(false); + this._fieldObjectsPromise = fieldObjectsPromise || Promise.resolve(null); + this._annotationCanvasMap = annotationCanvasMap; + this._accessibilityManager = accessibilityManager; + this._annotationEditorUIManager = annotationEditorUIManager; + this.#onAppend = onAppend; + this.annotationLayer = null; + this.div = null; + this._cancelled = false; + this._eventBus = linkService.eventBus; + } + async render({ + viewport, + intent = "display", + structTreeLayer = null, + optionalContentConfigPromise = null + }) { + if (this.div) { + const optionalContentConfig = await optionalContentConfigPromise; + if (this._cancelled || !this.annotationLayer) { + return; + } + this.annotationLayer.update({ + viewport: viewport.clone({ + dontFlip: true + }), + optionalContentConfig + }); + return; + } + const [annotations, hasJSActions, fieldObjects, optionalContentConfig] = await Promise.all([this.pdfPage.getAnnotations({ + intent + }), this._hasJSActionsPromise, this._fieldObjectsPromise, optionalContentConfigPromise]); + if (this._cancelled) { + return; + } + const div = this.div = document.createElement("div"); + div.className = "annotationLayer"; + this.#onAppend?.(div); + this.#initAnnotationLayer(viewport, structTreeLayer); + if (annotations.length === 0) { + this.#annotations = annotations; + setLayerDimensions(this.div, viewport); + return; + } + await this.annotationLayer.render({ + annotations, + imageResourcesPath: this.imageResourcesPath, + renderForms: this.renderForms, + downloadManager: this.downloadManager, + enableComment: this.enableComment, + enableScripting: this.enableScripting, + hasJSActions, + fieldObjects, + optionalContentConfig + }); + this.#annotations = annotations; + if (this.linkService.isInPresentationMode) { + this.#updatePresentationModeState(PresentationModeState.FULLSCREEN); + } + if (!this.#eventAC) { + this.#eventAC = new AbortController(); + this._eventBus?.on("presentationmodechanged", evt => { + this.#updatePresentationModeState(evt.state); + }, { + signal: this.#eventAC.signal, + ...internalOpt + }); + } + } + #initAnnotationLayer(viewport, structTreeLayer) { + this.annotationLayer = new AnnotationLayer({ + div: this.div, + accessibilityManager: this._accessibilityManager, + annotationCanvasMap: this._annotationCanvasMap, + annotationEditorUIManager: this._annotationEditorUIManager, + annotationStorage: this.annotationStorage, + page: this.pdfPage, + viewport: viewport.clone({ + dontFlip: true + }), + structTreeLayer, + commentManager: this.#commentManager, + linkService: this.linkService + }); + } + cancel() { + this._cancelled = true; + this.#eventAC?.abort(); + this.#eventAC = null; + this.annotationLayer?.destroy(); + } + refreshCanvases() { + this.annotationLayer?.refreshCanvases(); + } + hide() { + if (!this.div) { + return; + } + this.div.hidden = true; + } + hasEditableAnnotations() { + return !!this.annotationLayer?.hasEditableAnnotations(); + } + async injectLinkAnnotations(inferredLinks) { + if (this.#annotations === null) { + throw new Error("`render` method must be called before `injectLinkAnnotations`."); + } + if (this._cancelled || this.#linksInjected) { + return; + } + this.#linksInjected = true; + const newLinks = this.#annotations.length ? this.#checkInferredLinks(inferredLinks) : inferredLinks; + if (!newLinks.length) { + return; + } + await this.annotationLayer.addLinkAnnotations(newLinks); + } + #updatePresentationModeState(state) { + if (!this.div) { + return; + } + let disableFormElements = false; + switch (state) { + case PresentationModeState.FULLSCREEN: + disableFormElements = true; + break; + case PresentationModeState.NORMAL: break; default: - console.error(`PDFSidebar.switchView: "${view}" is not a valid view.`); return; } - this.active = view; - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.toggleCheckedBtn)(this.thumbnailButton, view === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.THUMBS, this.thumbnailView); - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.toggleCheckedBtn)(this.outlineButton, view === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.OUTLINE, this.outlineView); - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.toggleCheckedBtn)(this.attachmentsButton, view === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.ATTACHMENTS, this.attachmentsView); - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.toggleCheckedBtn)(this.layersButton, view === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.LAYERS, this.layersView); - if (forceOpen && !this.isOpen) { - this.open(); + for (const section of this.div.childNodes) { + if (section.hasAttribute("data-internal-link") || section.classList.contains("mediaAnnotation")) { + continue; + } + section.inert = disableFormElements; + } + } + #checkInferredLinks(inferredLinks) { + function annotationRects(annot) { + if (!annot.quadPoints) { + return [annot.rect]; + } + const rects = []; + for (let i = 2, ii = annot.quadPoints.length; i < ii; i += 8) { + const trX = annot.quadPoints[i]; + const trY = annot.quadPoints[i + 1]; + const blX = annot.quadPoints[i + 2]; + const blY = annot.quadPoints[i + 3]; + rects.push([blX, blY, trX, trY]); + } + return rects; + } + function intersectAnnotations(annot1, annot2) { + const intersections = []; + const annot1Rects = annotationRects(annot1); + const annot2Rects = annotationRects(annot2); + for (const rect1 of annot1Rects) { + for (const rect2 of annot2Rects) { + const intersection = Util.intersect(rect1, rect2); + if (intersection) { + intersections.push(intersection); + } + } + } + return intersections; + } + function areaRects(rects) { + let totalArea = 0; + for (const rect of rects) { + totalArea += Math.abs((rect[2] - rect[0]) * (rect[3] - rect[1])); + } + return totalArea; + } + return inferredLinks.filter(link => { + let linkAreaRects; + for (const annotation of this.#annotations) { + if (annotation.annotationType !== AnnotationType.LINK) { + continue; + } + const intersections = intersectAnnotations(annotation, link); + if (intersections.length === 0) { + continue; + } + linkAreaRects ??= areaRects(annotationRects(link)); + if (areaRects(intersections) / linkAreaRects > 0.5) { + return false; + } + } + return true; + }); + } +} + +;// ./web/autolinker.js + + +function DOMRectToPDF({ + width, + height, + left, + top +}, pdfPageView) { + if (width === 0 || height === 0) { + return null; + } + const pageBox = pdfPageView.textLayer.div.getBoundingClientRect(); + const bottomLeft = pdfPageView.getPagePoint(left - pageBox.left, top - pageBox.top); + const topRight = pdfPageView.getPagePoint(left - pageBox.left + width, top - pageBox.top + height); + return Util.normalizeRect([bottomLeft[0], bottomLeft[1], topRight[0], topRight[1]]); +} +function calculateLinkPosition(range, pdfPageView) { + const rangeRects = range.getClientRects(); + if (rangeRects.length === 1) { + return { + rect: DOMRectToPDF(rangeRects[0], pdfPageView) + }; + } + const rect = [Infinity, Infinity, -Infinity, -Infinity]; + const quadPoints = []; + let i = 0; + for (const domRect of rangeRects) { + const normalized = DOMRectToPDF(domRect, pdfPageView); + if (normalized === null) { + continue; + } + quadPoints[i] = quadPoints[i + 4] = normalized[0]; + quadPoints[i + 1] = quadPoints[i + 3] = normalized[3]; + quadPoints[i + 2] = quadPoints[i + 6] = normalized[2]; + quadPoints[i + 5] = quadPoints[i + 7] = normalized[1]; + Util.rectBoundingBox(...normalized, rect); + i += 8; + } + return { + quadPoints, + rect + }; +} +function textPosition(container, offset) { + let currentContainer = container; + do { + if (currentContainer.nodeType === Node.TEXT_NODE) { + const currentLength = currentContainer.textContent.length; + if (offset <= currentLength) { + return [currentContainer, offset]; + } + offset -= currentLength; + } else if (currentContainer.firstChild) { + currentContainer = currentContainer.firstChild; + continue; + } + while (!currentContainer.nextSibling && currentContainer !== container) { + currentContainer = currentContainer.parentNode; + } + if (currentContainer !== container) { + currentContainer = currentContainer.nextSibling; + } + } while (currentContainer !== container); + throw new Error("Offset is bigger than container's contents length."); +} +function createLinkAnnotation({ + url, + index, + length +}, pdfPageView, id) { + const highlighter = pdfPageView._textHighlighter; + const [{ + begin, + end + }] = highlighter._convertMatches([index], [length]); + const range = new Range(); + range.setStart(...textPosition(highlighter.textDivs[begin.divIdx], begin.offset)); + range.setEnd(...textPosition(highlighter.textDivs[end.divIdx], end.offset)); + return { + id: `inferred_link_${id}`, + unsafeUrl: url, + url, + annotationType: AnnotationType.LINK, + rotation: 0, + ...calculateLinkPosition(range, pdfPageView), + borderStyle: null + }; +} +class Autolinker { + static #index = 0; + static #regex; + static #numericTLDRegex; + static findLinks(text) { + this.#regex ??= /\b(?:https?:\/\/|mailto:|www\.)(?:[\S--[\p{P}<>]]|\/|[\S--[\[\]]]+[\S--[\p{P}<>]])+|(?=\p{L})[\S--[@\p{Ps}\p{Pe}<>]]+@([\S--[[\p{P}--\-]<>]]+(?:\.[\S--[[\p{P}--\-]<>]]+)+)/gv; + const [normalizedText, diffs] = normalize(text, { + ignoreDashEOL: true + }); + const matches = normalizedText.matchAll(this.#regex); + const links = []; + for (const match of matches) { + const [url, emailDomain] = match; + let raw; + if (url.startsWith("www.") || url.startsWith("http://") || url.startsWith("https://")) { + raw = url; + } else if (emailDomain) { + const hostname = URL.parse(`http://${emailDomain}`)?.hostname; + if (!hostname) { + continue; + } + this.#numericTLDRegex ??= /\.\d+$/; + if (this.#numericTLDRegex.test(hostname)) { + continue; + } + } + raw ??= url.startsWith("mailto:") ? url : `mailto:${url}`; + const absoluteURL = createValidAbsoluteUrl(raw, null, { + addDefaultProtocol: true + }); + if (absoluteURL) { + const [index, length] = getOriginalIndex(diffs, match.index, url.length); + links.push({ + url: absoluteURL.href, + index, + length + }); + } + } + return links; + } + static processLinks(pdfPageView) { + return this.findLinks(pdfPageView._textHighlighter.textContentItemsStr.join("\n")).map(link => createLinkAnnotation(link, pdfPageView, this.#index++)); + } +} + +;// ./web/base_pdf_page_view.js + + +class BasePDFPageView extends RenderableView { + #loadingId = null; + #renderError = null; + #renderingState = RenderingStates.INITIAL; + #showCanvas = null; + #startTime = 0; + #tempCanvas = null; + canvas = null; + div = null; + enableOptimizedPartialRendering = false; + enableSelectionRendering = true; + imagesRightClickMinSize = -1; + eventBus = null; + id = null; + imageCoordinates = null; + pageColors = null; + recordedBBoxes = null; + renderingQueue = null; + constructor(options) { + super(); + this.eventBus = options.eventBus; + this.id = options.id; + this.pageColors = options.pageColors || null; + this.renderingQueue = options.renderingQueue; + this.enableOptimizedPartialRendering = options.enableOptimizedPartialRendering ?? false; + this.enableSelectionRendering = options.enableSelectionRendering !== false && FeatureTest.isBackdropFilterSupported; + this.imagesRightClickMinSize = options.imagesRightClickMinSize ?? -1; + this.minDurationToUpdateCanvas = options.minDurationToUpdateCanvas ?? 500; + } + get renderingState() { + return this.#renderingState; + } + set renderingState(state) { + if (state === this.#renderingState) { return; } - if (forceRendering) { - this.onUpdateThumbnails(); - this.onToggled(); + this.#renderingState = state; + if (this.#loadingId) { + clearTimeout(this.#loadingId); + this.#loadingId = null; } - if (isViewChanged) { - this.#dispatchEvent(); + switch (state) { + case RenderingStates.PAUSED: + this.div.classList.remove("loading"); + this.#startTime = 0; + this.#showCanvas?.(false); + break; + case RenderingStates.RUNNING: + this.div.classList.add("loadingIcon"); + this.#loadingId = setTimeout(() => { + this.div.classList.add("loading"); + this.#loadingId = null; + }, 0); + this.#startTime = Date.now(); + break; + case RenderingStates.INITIAL: + case RenderingStates.FINISHED: + this.div.classList.remove("loadingIcon", "loading"); + this.#startTime = 0; + break; } } - open() { - if (this.isOpen) { + _createCanvas(onShow, hideUntilComplete = false) { + const { + pageColors + } = this; + const hasHCM = !!(pageColors?.background && pageColors?.foreground); + const prevCanvas = this.canvas; + const updateOnFirstShow = !prevCanvas && !hasHCM && !hideUntilComplete; + let canvas = this.canvas = document.createElement("canvas"); + this.#showCanvas = isLastShow => { + if (updateOnFirstShow) { + let tempCanvas = this.#tempCanvas; + if (!isLastShow && this.minDurationToUpdateCanvas > 0) { + if (Date.now() - this.#startTime < this.minDurationToUpdateCanvas) { + return; + } + if (!tempCanvas) { + tempCanvas = this.#tempCanvas = canvas; + canvas = this.canvas = canvas.cloneNode(false); + onShow(canvas); + } + } + if (tempCanvas) { + const ctx = canvas.getContext("2d", { + alpha: false + }); + ctx.drawImage(tempCanvas, 0, 0); + if (isLastShow) { + this.#resetTempCanvas(); + } else { + this.#startTime = Date.now(); + } + return; + } + onShow(canvas); + this.#showCanvas = null; + return; + } + if (!isLastShow) { + return; + } + if (prevCanvas) { + prevCanvas.replaceWith(canvas); + prevCanvas.width = prevCanvas.height = 0; + } else { + onShow(canvas); + } + }; + return { + canvas, + prevCanvas + }; + } + #renderContinueCallback = cont => { + this.#showCanvas?.(false); + if (this.renderingQueue && !this.renderingQueue.isHighestPriority(this)) { + this.renderingState = RenderingStates.PAUSED; + this.resume = () => { + this.renderingState = RenderingStates.RUNNING; + cont(); + }; return; } - this.isOpen = true; - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.toggleExpandedBtn)(this.toggleButton, true); - this.outerContainer.classList.add("sidebarMoving", "sidebarOpen"); - if (this.active === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.THUMBS) { - this.onUpdateThumbnails(); + cont(); + }; + _resetCanvas() { + const { + canvas + } = this; + if (!canvas) { + return; + } + canvas.remove(); + canvas.width = canvas.height = 0; + this.canvas = null; + this.#resetTempCanvas(); + } + #resetTempCanvas() { + if (this.#tempCanvas) { + this.#tempCanvas.width = this.#tempCanvas.height = 0; + this.#tempCanvas = null; + } + } + async _drawCanvas(options, onCancel, onFinish) { + const renderTask = this.renderTask = this.pdfPage.render(options); + renderTask.onContinue = this.#renderContinueCallback; + renderTask.onError = error => { + if (error instanceof RenderingCancelledException) { + onCancel(); + this.#renderError = null; + } + }; + let error = null; + try { + await renderTask.promise; + this.#showCanvas?.(true); + } catch (e) { + if (e instanceof RenderingCancelledException) { + return; + } + error = e; + this.#showCanvas?.(true); + } finally { + this.#renderError = error; + if (renderTask === this.renderTask) { + this.renderTask = null; + if (this.enableOptimizedPartialRendering) { + this.recordedBBoxes ??= renderTask.recordedBBoxes; + } + if (this.imagesRightClickMinSize !== -1) { + this.imageCoordinates ??= this.pdfPage.imageCoordinates; + } + } + } + this.renderingState = RenderingStates.FINISHED; + onFinish(renderTask); + if (error) { + throw error; } - this.onToggled(); - this.#dispatchEvent(); - this.#hideUINotification(); } - close(evt = null) { - if (!this.isOpen) { + cancelRendering({ + cancelExtraDelay = 0 + } = {}) { + if (this.renderTask) { + this.renderTask.cancel(cancelExtraDelay); + this.renderTask = null; + } + this.resume = null; + } + dispatchPageRender() { + this.eventBus.dispatch("pagerender", { + source: this, + pageNumber: this.id + }); + } + dispatchPageRendered(cssTransform, isDetailView) { + this.eventBus.dispatch("pagerendered", { + source: this, + pageNumber: this.id, + cssTransform, + isDetailView, + timestamp: performance.now(), + error: this.#renderError + }); + } +} + +;// ./web/draw_layer_builder.js + +class DrawLayerBuilder { + #drawLayer = null; + constructor(options) { + this.pageIndex = options.pageIndex; + this.textLayer = options.textLayer || null; + this.filterFactory = options.filterFactory || null; + this.pageColors = options.pageColors || null; + } + async render({ + intent = "display" + }) { + if (intent !== "display" || this.#drawLayer || this._cancelled) { return; } - this.isOpen = false; - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.toggleExpandedBtn)(this.toggleButton, false); - this.outerContainer.classList.add("sidebarMoving"); - this.outerContainer.classList.remove("sidebarOpen"); - this.onToggled(); - this.#dispatchEvent(); - if (evt?.detail > 0) { - this.toggleButton.blur(); + this.#drawLayer = new DrawLayer({ + pageIndex: this.pageIndex, + textLayer: this.textLayer, + filterFactory: this.filterFactory, + pageColors: this.pageColors + }); + } + cancel() { + this._cancelled = true; + this.#drawLayer?.destroy(); + this.#drawLayer = null; + } + setParent(parent) { + this.#drawLayer?.setParent(parent); + } + getDrawLayer() { + return this.#drawLayer; + } +} + +;// ./web/pdf_page_detail_view.js + + + +class PDFPageDetailView extends BasePDFPageView { + #detailArea = null; + renderingCancelled = false; + constructor({ + pageView + }) { + super(pageView); + this.pageView = pageView; + this.renderingId = "detail" + this.id; + this.div = pageView.div; + } + setPdfPage(pdfPage) { + this.pageView.setPdfPage(pdfPage); + } + get pdfPage() { + return this.pageView.pdfPage; + } + get renderingState() { + return super.renderingState; + } + set renderingState(state) { + this.renderingCancelled = false; + super.renderingState = state; + } + reset({ + keepCanvas = false + } = {}) { + const renderingCancelled = this.renderingCancelled || this.renderingState === RenderingStates.RUNNING || this.renderingState === RenderingStates.PAUSED; + this.cancelRendering(); + this.renderingState = RenderingStates.INITIAL; + this.renderingCancelled = renderingCancelled; + if (!keepCanvas) { + this._resetCanvas(); } } - toggle(evt = null) { - if (this.isOpen) { - this.close(evt); + #shouldRenderDifferentArea(visibleArea) { + if (!this.#detailArea) { + return true; + } + const minDetailX = this.#detailArea.minX; + const minDetailY = this.#detailArea.minY; + const maxDetailX = this.#detailArea.width + minDetailX; + const maxDetailY = this.#detailArea.height + minDetailY; + if (visibleArea.minX < minDetailX || visibleArea.minY < minDetailY || visibleArea.maxX > maxDetailX || visibleArea.maxY > maxDetailY) { + return true; + } + const { + width: maxWidth, + height: maxHeight, + scale + } = this.pageView.viewport; + if (this.#detailArea.scale !== scale) { + return true; + } + const paddingLeftSize = visibleArea.minX - minDetailX; + const paddingRightSize = maxDetailX - visibleArea.maxX; + const paddingTopSize = visibleArea.minY - minDetailY; + const paddingBottomSize = maxDetailY - visibleArea.maxY; + const MOVEMENT_THRESHOLD = 0.5; + const ratio = (1 + MOVEMENT_THRESHOLD) / MOVEMENT_THRESHOLD; + if (minDetailX > 0 && paddingRightSize / paddingLeftSize > ratio || maxDetailX < maxWidth && paddingLeftSize / paddingRightSize > ratio || minDetailY > 0 && paddingBottomSize / paddingTopSize > ratio || maxDetailY < maxHeight && paddingTopSize / paddingBottomSize > ratio) { + return true; + } + return false; + } + update({ + visibleArea = null, + underlyingViewUpdated = false + } = {}) { + if (underlyingViewUpdated) { + this.cancelRendering(); + this.renderingState = RenderingStates.INITIAL; + return; + } + if (!this.#shouldRenderDifferentArea(visibleArea)) { + return; + } + const { + viewport, + maxCanvasPixels, + capCanvasAreaFactor + } = this.pageView; + const visibleWidth = visibleArea.maxX - visibleArea.minX; + const visibleHeight = visibleArea.maxY - visibleArea.minY; + const visiblePixels = visibleWidth * visibleHeight * OutputScale.pixelRatio ** 2; + const maxDetailToVisibleLinearRatio = Math.sqrt(OutputScale.capPixels(maxCanvasPixels, capCanvasAreaFactor) / visiblePixels); + const maxOverflowScale = (maxDetailToVisibleLinearRatio - 1) / 2; + let overflowScale = Math.min(1, maxOverflowScale); + if (overflowScale < 0) { + overflowScale = 0; + } + const overflowWidth = visibleWidth * overflowScale; + const overflowHeight = visibleHeight * overflowScale; + const minX = Math.max(0, visibleArea.minX - overflowWidth); + const maxX = Math.min(viewport.width, visibleArea.maxX + overflowWidth); + const minY = Math.max(0, visibleArea.minY - overflowHeight); + const maxY = Math.min(viewport.height, visibleArea.maxY + overflowHeight); + const width = maxX - minX; + const height = maxY - minY; + this.#detailArea = { + minX, + minY, + width, + height, + scale: viewport.scale + }; + this.reset({ + keepCanvas: true + }); + } + _getRenderingContext(canvas, transform) { + const baseContext = this.pageView._getRenderingContext(canvas, transform, false); + const recordedBBoxes = this.pdfPage.recordedBBoxes; + if (!recordedBBoxes || !this.enableOptimizedPartialRendering) { + return baseContext; + } + const { + viewport: { + width: vWidth, + height: vHeight + } + } = this.pageView; + const { + width: aWidth, + height: aHeight, + minX: aMinX, + minY: aMinY + } = this.#detailArea; + const detailMinX = aMinX / vWidth; + const detailMinY = aMinY / vHeight; + const detailMaxX = (aMinX + aWidth) / vWidth; + const detailMaxY = (aMinY + aHeight) / vHeight; + return { + ...baseContext, + operationsFilter(index) { + if (recordedBBoxes.isEmpty(index)) { + return false; + } + return recordedBBoxes.minX(index) <= detailMaxX && recordedBBoxes.maxX(index) >= detailMinX && recordedBBoxes.minY(index) <= detailMaxY && recordedBBoxes.maxY(index) >= detailMinY; + } + }; + } + async draw() { + if (this.pageView.detailView !== this) { + return undefined; + } + const hideUntilComplete = this.pageView.renderingState === RenderingStates.FINISHED || this.renderingState === RenderingStates.FINISHED; + if (this.renderingState !== RenderingStates.INITIAL) { + console.error("Must be in new state before drawing"); + this.reset(); + } + const { + div, + pdfPage, + viewport + } = this.pageView; + if (!pdfPage) { + this.renderingState = RenderingStates.FINISHED; + throw new Error("pdfPage is not loaded"); + } + this.renderingState = RenderingStates.RUNNING; + const canvasWrapper = this.pageView._ensureCanvasWrapper(); + const { + canvas, + prevCanvas + } = this._createCanvas(newCanvas => { + if (canvasWrapper.firstElementChild?.tagName === "CANVAS") { + canvasWrapper.firstElementChild.after(newCanvas); + } else { + canvasWrapper.prepend(newCanvas); + } + }, hideUntilComplete); + canvas.ariaHidden = true; + if (this.enableOptimizedPartialRendering) { + canvas.className = "detailView"; + } + const { + width, + height + } = viewport; + const area = this.#detailArea; + const { + pixelRatio + } = OutputScale; + const transform = [pixelRatio, 0, 0, pixelRatio, -area.minX * pixelRatio, -area.minY * pixelRatio]; + canvas.width = area.width * pixelRatio; + canvas.height = area.height * pixelRatio; + const { + style + } = canvas; + style.width = `${area.width * 100 / width}%`; + style.height = `${area.height * 100 / height}%`; + style.top = `${area.minY * 100 / height}%`; + style.left = `${area.minX * 100 / width}%`; + const renderingPromise = this._drawCanvas(this._getRenderingContext(canvas, transform), () => { + this.canvas?.remove(); + this.canvas = prevCanvas; + }, () => { + this.pageView._refreshAnnotationLayer(); + this.dispatchPageRendered(false, true); + }); + div.setAttribute("data-loaded", true); + this.dispatchPageRender(); + return renderingPromise; + } +} + +;// ./web/struct_tree_layer_builder.js + + +const PDF_ROLE_TO_HTML_ROLE = { + Document: null, + DocumentFragment: null, + Part: "group", + Sect: "group", + Div: "group", + Aside: "note", + NonStruct: "none", + P: null, + H: "heading", + Title: null, + FENote: "note", + Sub: "group", + Lbl: null, + Span: null, + Em: null, + Strong: null, + Link: "link", + Annot: "note", + Form: "form", + Ruby: null, + RB: null, + RT: null, + RP: null, + Warichu: null, + WT: null, + WP: null, + L: "list", + LI: "listitem", + LBody: null, + Table: "table", + TR: "row", + TH: "columnheader", + TD: "cell", + THead: "rowgroup", + TBody: "rowgroup", + TFoot: null, + Caption: null, + Figure: "figure", + Formula: null, + Artifact: null +}; +const MathMLElements = new Set(["math", "merror", "mfrac", "mi", "mmultiscripts", "mn", "mo", "mover", "mpadded", "mprescripts", "mroot", "mrow", "ms", "mspace", "msqrt", "mstyle", "msub", "msubsup", "msup", "mtable", "mtd", "mtext", "mtr", "munder", "munderover", "semantics"]); +const MathMLNamespace = "http://www.w3.org/1998/Math/MathML"; +class MathMLSanitizer { + static get sanitizer() { + return shadow(this, "sanitizer", FeatureTest.isSanitizerSupported ? new Sanitizer({ + elements: [...MathMLElements].map(name => ({ + name, + namespace: MathMLNamespace + })), + replaceWithChildrenElements: [{ + name: "maction", + namespace: MathMLNamespace + }], + attributes: ["dir", "displaystyle", "mathbackground", "mathcolor", "mathsize", "scriptlevel", "encoding", "display", "linethickness", "intent", "arg", "form", "fence", "separator", "lspace", "rspace", "stretchy", "symmetric", "maxsize", "minsize", "largeop", "movablelimits", "width", "height", "depth", "voffset", "accent", "accentunder", "columnspan", "rowspan"], + comments: false + }) : null); + } +} +const HEADING_PATTERN = /^H(\d+)$/; +class StructTreeLayerBuilder { + #promise; + #treeDom = null; + #treePromise; + #elementAttributes = new Map(); + #rawDims; + #elementsToAddToTextLayer = null; + #elementsToHideInTextLayer = null; + #elementsToStealFromTextLayer = null; + constructor(pdfPage, rawDims) { + this.#promise = pdfPage.getStructTree(); + this.#rawDims = rawDims; + } + async render() { + if (this.#treePromise) { + return this.#treePromise; + } + const { + promise, + resolve, + reject + } = Promise.withResolvers(); + this.#treePromise = promise; + try { + this.#treeDom = this.#walk(await this.#promise); + } catch (ex) { + reject(ex); + } + this.#promise = null; + this.#treeDom?.classList.add("structTree"); + resolve(this.#treeDom); + return promise; + } + async getAriaAttributes(annotationId) { + try { + await this.render(); + return this.#elementAttributes.get(annotationId); + } catch {} + return null; + } + hide() { + if (this.#treeDom && !this.#treeDom.hidden) { + this.#treeDom.hidden = true; + } + } + show() { + if (this.#treeDom?.hidden) { + this.#treeDom.hidden = false; + } + } + #setAttributes(structElement, htmlElement) { + const { + alt, + id, + lang + } = structElement; + if (alt !== undefined) { + let added = false; + const label = removeNullCharacters(alt); + for (const child of structElement.children) { + if (child.type === "annotation") { + this.#elementAttributes.getOrInsertComputed(child.id, makeMap).set("aria-label", label); + added = true; + } + } + if (!added) { + htmlElement.setAttribute("aria-label", label); + } + } + if (id !== undefined) { + htmlElement.setAttribute("aria-owns", id); + } + if (lang !== undefined) { + htmlElement.setAttribute("lang", removeNullCharacters(lang, true)); + } + } + #addImageInTextLayer(node, element) { + const { + alt, + bbox, + children + } = node; + const child = children?.[0]; + if (!this.#rawDims || !alt || !bbox || child?.type !== "content") { + return false; + } + const { + id + } = child; + if (!id) { + return false; + } + element.setAttribute("aria-owns", id); + const img = document.createElement("span"); + (this.#elementsToAddToTextLayer ||= new Map()).set(id, img); + img.setAttribute("role", "img"); + img.setAttribute("aria-label", removeNullCharacters(alt)); + const { + pageHeight, + pageX, + pageY + } = this.#rawDims; + const calc = "calc(var(--total-scale-factor) *"; + const { + style + } = img; + style.width = `${calc}${bbox[2] - bbox[0]}px)`; + style.height = `${calc}${bbox[3] - bbox[1]}px)`; + style.left = `${calc}${bbox[0] - pageX}px)`; + style.top = `${calc}${pageHeight - bbox[3] + pageY}px)`; + return true; + } + updateTextLayer() { + if (this.#elementsToAddToTextLayer) { + for (const [id, img] of this.#elementsToAddToTextLayer) { + document.getElementById(id)?.append(img); + } + this.#elementsToAddToTextLayer.clear(); + this.#elementsToAddToTextLayer = null; + } + if (this.#elementsToHideInTextLayer) { + for (const id of this.#elementsToHideInTextLayer) { + const elem = document.getElementById(id); + if (elem) { + elem.ariaHidden = true; + } + } + this.#elementsToHideInTextLayer.length = 0; + this.#elementsToHideInTextLayer = null; + } + if (this.#elementsToStealFromTextLayer) { + for (let i = 0, ii = this.#elementsToStealFromTextLayer.length; i < ii; i += 2) { + const element = this.#elementsToStealFromTextLayer[i]; + const ids = this.#elementsToStealFromTextLayer[i + 1]; + let textContent = ""; + for (const id of ids) { + const elem = document.getElementById(id); + if (elem) { + textContent += elem.textContent.trim() || ""; + elem.ariaHidden = "true"; + } + } + if (textContent) { + element.textContent = textContent; + } + } + this.#elementsToStealFromTextLayer.length = 0; + this.#elementsToStealFromTextLayer = null; + } + } + #collectIds(node, ids) { + if (!node) { + return; + } + if ("id" in node) { + ids.push(node.id); + } + for (const kid of node.children || []) { + this.#collectIds(kid, ids); + } + } + #walk(node, parentNodes = []) { + if (!node) { + return null; + } + let element; + let visitChildren = true; + if ("role" in node) { + const { + role + } = node; + if (MathMLElements.has(role)) { + element = document.createElementNS(MathMLNamespace, role); + const ids = []; + (this.#elementsToStealFromTextLayer ||= []).push(element, ids); + for (const { + type, + id + } of node.children || []) { + if (type === "content" && id) { + ids.push(id); + } + } + } else { + element = document.createElement("span"); + } + const match = role.match(HEADING_PATTERN); + if (match) { + element.setAttribute("role", "heading"); + element.setAttribute("aria-level", match[1]); + } else if (PDF_ROLE_TO_HTML_ROLE[role]) { + element.setAttribute("role", role === "TH" && parentNodes.at(-1)?.role === "TR" && parentNodes.at(-2)?.role === "TBody" ? "rowheader" : PDF_ROLE_TO_HTML_ROLE[role]); + } + if (role === "Figure" && this.#addImageInTextLayer(node, element)) { + return element; + } + if (role === "Formula") { + if (node.mathML && MathMLSanitizer.sanitizer) { + visitChildren = false; + element.setHTML(node.mathML, { + sanitizer: MathMLSanitizer.sanitizer + }); + this.#collectIds(node, this.#elementsToHideInTextLayer ||= []); + delete node.alt; + } + if (!node.mathML && node.children.length === 1 && node.children[0].role !== "math") { + element = document.createElementNS(MathMLNamespace, "math"); + delete node.alt; + } + } + } + element ||= document.createElement("span"); + this.#setAttributes(node, element); + if (node.children) { + if (node.children.length === 1 && "id" in node.children[0]) { + this.#setAttributes(node.children[0], element); + } else if (visitChildren) { + parentNodes.push(node); + for (const kid of node.children) { + element.append(this.#walk(kid, parentNodes)); + } + parentNodes.pop(); + } + } + return element; + } +} + +;// ./web/text_accessibility.js + +class TextAccessibilityManager { + #enabled = false; + #textChildren = null; + #textNodes = new Map(); + #waitingElements = new Map(); + setTextMapping(textDivs) { + this.#textChildren = textDivs; + } + static #compareElementPositions(e1, e2) { + const rect1 = e1.getBoundingClientRect(); + const rect2 = e2.getBoundingClientRect(); + if (rect1.width === 0 && rect1.height === 0) { + return +1; + } + if (rect2.width === 0 && rect2.height === 0) { + return -1; + } + const top1 = rect1.y; + const bot1 = rect1.y + rect1.height; + const mid1 = rect1.y + rect1.height / 2; + const top2 = rect2.y; + const bot2 = rect2.y + rect2.height; + const mid2 = rect2.y + rect2.height / 2; + if (mid1 <= top2 && mid2 >= bot1) { + return -1; + } + if (mid2 <= top1 && mid1 >= bot2) { + return +1; + } + const centerX1 = rect1.x + rect1.width / 2; + const centerX2 = rect2.x + rect2.width / 2; + return centerX1 - centerX2; + } + enable() { + if (this.#enabled) { + throw new Error("TextAccessibilityManager is already enabled."); + } + if (!this.#textChildren) { + throw new Error("Text divs and strings have not been set."); + } + this.#enabled = true; + this.#textChildren = this.#textChildren.slice(); + this.#textChildren.sort(TextAccessibilityManager.#compareElementPositions); + if (this.#textNodes.size > 0) { + const textChildren = this.#textChildren; + for (const [id, nodeIndex] of this.#textNodes) { + const element = document.getElementById(id); + if (!element) { + this.#textNodes.delete(id); + continue; + } + this.#addIdToAriaOwns(id, textChildren[nodeIndex]); + } + } + for (const [element, isRemovable] of this.#waitingElements) { + this.addPointerInTextLayer(element, isRemovable); + } + this.#waitingElements.clear(); + } + disable() { + if (!this.#enabled) { + return; + } + this.#waitingElements.clear(); + this.#textChildren = null; + this.#enabled = false; + } + removePointerInTextLayer(element) { + if (!this.#enabled) { + this.#waitingElements.delete(element); + return; + } + const children = this.#textChildren; + if (!children?.length) { + return; + } + const { + id + } = element; + const nodeIndex = this.#textNodes.get(id); + if (nodeIndex === undefined) { + return; + } + const node = children[nodeIndex]; + this.#textNodes.delete(id); + let owns = node.getAttribute("aria-owns"); + if (owns?.includes(id)) { + owns = owns.split(" ").filter(x => x !== id).join(" "); + if (owns) { + node.setAttribute("aria-owns", owns); + } else { + node.removeAttribute("aria-owns"); + node.setAttribute("role", "presentation"); + } + } + } + #addIdToAriaOwns(id, node) { + const owns = node.getAttribute("aria-owns"); + if (!owns?.includes(id)) { + node.setAttribute("aria-owns", owns ? `${owns} ${id}` : id); + } + node.removeAttribute("role"); + } + addPointerInTextLayer(element, isRemovable) { + const { + id + } = element; + if (!id) { + return null; + } + if (!this.#enabled) { + this.#waitingElements.set(element, isRemovable); + return null; + } + if (isRemovable) { + this.removePointerInTextLayer(element); + } + const children = this.#textChildren; + if (!children?.length) { + return null; + } + const index = binarySearchFirstItem(children, node => TextAccessibilityManager.#compareElementPositions(element, node) < 0); + const nodeIndex = Math.max(0, index - 1); + const child = children[nodeIndex]; + this.#addIdToAriaOwns(id, child); + this.#textNodes.set(id, nodeIndex); + const parent = child.parentNode; + return parent?.classList.contains("markedContent") ? parent.id : null; + } + moveElementInDOM(container, element, contentElement, isRemovable) { + const id = this.addPointerInTextLayer(contentElement, isRemovable); + if (!container.hasChildNodes()) { + container.append(element); + return id; + } + const children = Array.from(container.childNodes).filter(node => node !== element); + if (children.length === 0) { + return id; + } + const index = binarySearchFirstItem(children, node => TextAccessibilityManager.#compareElementPositions(element, node) < 0); + if (index === 0) { + children[0].before(element); } else { - this.open(); + children[index - 1].after(element); } + return id; } - #dispatchEvent() { - if (this.isInitialViewSet) { - this.isInitialEventDispatched ||= true; +} + +;// ./web/text_highlighter.js + +class TextHighlighter { + #eventAC = null; + constructor({ + findController, + eventBus, + pageIndex + }) { + this.findController = findController; + this.matches = []; + this.eventBus = eventBus; + this.pageIdx = pageIndex; + this.textDivs = null; + this.textContentItemsStr = null; + this.enabled = false; + } + setTextMapping(divs, texts) { + this.textDivs = divs; + this.textContentItemsStr = texts; + } + enable() { + if (!this.textDivs || !this.textContentItemsStr) { + throw new Error("Text divs and strings have not been set."); } - this.eventBus.dispatch("sidebarviewchanged", { - source: this, - view: this.visibleView + if (this.enabled) { + throw new Error("TextHighlighter is already enabled."); + } + this.enabled = true; + if (!this.#eventAC) { + this.#eventAC = new AbortController(); + this.eventBus.on("updatetextlayermatches", evt => { + if (evt.pageIndex === this.pageIdx || evt.pageIndex === -1) { + this._updateMatches(); + } + }, { + signal: this.#eventAC.signal, + ...internalOpt + }); + } + this._updateMatches(); + } + disable() { + if (!this.enabled) { + return; + } + this.enabled = false; + this.#eventAC?.abort(); + this.#eventAC = null; + this._updateMatches(true); + } + _convertMatches(matches, matchesLength) { + if (!matches) { + return []; + } + const { + textContentItemsStr + } = this; + let i = 0, + iIndex = 0; + const end = textContentItemsStr.length - 1; + const result = []; + for (let m = 0, mm = matches.length; m < mm; m++) { + let matchIdx = matches[m]; + while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) { + iIndex += textContentItemsStr[i].length; + i++; + } + if (i === textContentItemsStr.length) { + console.error("Could not find a matching mapping"); + } + const match = { + begin: { + divIdx: i, + offset: matchIdx - iIndex + } + }; + matchIdx += matchesLength[m]; + while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) { + iIndex += textContentItemsStr[i].length; + i++; + } + match.end = { + divIdx: i, + offset: matchIdx - iIndex + }; + result.push(match); + } + return result; + } + _renderMatches(matches) { + if (matches.length === 0) { + return; + } + const { + findController, + pageIdx + } = this; + const { + textContentItemsStr, + textDivs + } = this; + const isSelectedPage = pageIdx === findController.selected.pageIdx; + const selectedMatchIdx = findController.selected.matchIdx; + const highlightAll = findController.state.highlightAll; + let prevEnd = null; + const infinity = { + divIdx: -1, + offset: undefined + }; + function beginText(begin, className) { + const divIdx = begin.divIdx; + textDivs[divIdx].textContent = ""; + return appendTextToDiv(divIdx, 0, begin.offset, className); + } + function appendTextToDiv(divIdx, fromOffset, toOffset, className) { + let div = textDivs[divIdx]; + if (div.nodeType === Node.TEXT_NODE) { + const span = document.createElement("span"); + div.before(span); + span.append(div); + textDivs[divIdx] = span; + div = span; + } + const content = textContentItemsStr[divIdx].substring(fromOffset, toOffset); + const node = document.createTextNode(content); + if (className) { + const span = document.createElement("span"); + span.className = `${className} appended`; + span.append(node); + div.append(span); + if (className.includes("selected")) { + return span; + } + return null; + } + div.append(node); + return 0; + } + let i0 = selectedMatchIdx, + i1 = i0 + 1; + if (highlightAll) { + i0 = 0; + i1 = matches.length; + } else if (!isSelectedPage) { + return; + } + let lastDivIdx = -1; + let lastOffset = -1; + for (let i = i0; i < i1; i++) { + const match = matches[i]; + const begin = match.begin; + if (begin.divIdx === lastDivIdx && begin.offset === lastOffset) { + continue; + } + lastDivIdx = begin.divIdx; + lastOffset = begin.offset; + const end = match.end; + const isSelected = isSelectedPage && i === selectedMatchIdx; + const highlightSuffix = isSelected ? " selected" : ""; + let selectedSpan = null; + if (!prevEnd || begin.divIdx !== prevEnd.divIdx) { + if (prevEnd !== null) { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); + } + beginText(begin); + } else { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset); + } + if (begin.divIdx === end.divIdx) { + selectedSpan = appendTextToDiv(begin.divIdx, begin.offset, end.offset, "highlight" + highlightSuffix); + } else { + selectedSpan = appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, "highlight begin" + highlightSuffix); + for (let n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) { + textDivs[n0].className = "highlight middle" + highlightSuffix; + } + beginText(end, "highlight end" + highlightSuffix); + } + prevEnd = end; + if (isSelected) { + findController.scrollMatchIntoView({ + element: selectedSpan, + pageIndex: pageIdx, + matchIndex: selectedMatchIdx + }); + } + } + if (prevEnd) { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); + } + } + _updateMatches(reset = false) { + if (!this.enabled && !reset) { + return; + } + const { + findController, + matches, + pageIdx + } = this; + const { + textContentItemsStr, + textDivs + } = this; + let clearedUntilDivIdx = -1; + for (const match of matches) { + const begin = Math.max(clearedUntilDivIdx, match.begin.divIdx); + for (let n = begin, end = match.end.divIdx; n <= end; n++) { + const div = textDivs[n]; + div.textContent = textContentItemsStr[n]; + div.className = ""; + } + clearedUntilDivIdx = match.end.divIdx + 1; + } + if (!findController?.highlightMatches || reset) { + return; + } + const pageMatches = findController.pageMatches[pageIdx] || null; + const pageMatchesLength = findController.pageMatchesLength[pageIdx] || null; + this.matches = this._convertMatches(pageMatches, pageMatchesLength); + this._renderMatches(this.matches); + } +} + +;// ./web/text_layer_builder.js + + +class TextLayerBuilder { + #abortSignal = null; + #enablePermissions = false; + #onAppend = null; + #renderingDone = false; + #textLayer = null; + static #textLayers = new Map(); + static #selectionChangeAC = null; + constructor({ + pdfPage, + highlighter = null, + accessibilityManager = null, + enablePermissions = false, + onAppend = null, + abortSignal = null + }) { + this.pdfPage = pdfPage; + this.highlighter = highlighter; + this.accessibilityManager = accessibilityManager; + this.#enablePermissions = enablePermissions === true; + this.#onAppend = onAppend; + this.#abortSignal = abortSignal; + this.div = document.createElement("div"); + this.div.tabIndex = 0; + this.div.className = "textLayer"; + } + async render({ + viewport, + images, + textContentParams = null + }) { + if (this.#renderingDone && this.#textLayer) { + this.#textLayer.update({ + viewport, + onBefore: this.hide.bind(this) + }); + this.show(); + return; + } + this.cancel(); + this.#textLayer = new TextLayer({ + textContentSource: this.pdfPage.streamTextContent(textContentParams || { + includeMarkedContent: true, + disableNormalization: true + }), + images, + container: this.div, + viewport }); + const { + textDivs, + textContentItemsStr + } = this.#textLayer; + this.highlighter?.setTextMapping(textDivs, textContentItemsStr); + this.accessibilityManager?.setTextMapping(textDivs); + await this.#textLayer.render(); + this.#renderingDone = true; + const endOfContent = document.createElement("div"); + endOfContent.className = "endOfContent"; + this.div.append(endOfContent); + this.#bindMouse(endOfContent); + this.#onAppend?.(this.div); + this.highlighter?.enable(); + this.accessibilityManager?.enable(); } - #showUINotification() { - this.toggleButton.setAttribute("data-l10n-id", "pdfjs-toggle-sidebar-notification-button"); - if (!this.isOpen) { - this.toggleButton.classList.add(UI_NOTIFICATION_CLASS); + hide() { + if (!this.div.hidden && this.#renderingDone) { + this.highlighter?.disable(); + this.div.hidden = true; } } - #hideUINotification(reset = false) { - if (this.isOpen || reset) { - this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS); - } - if (reset) { - this.toggleButton.setAttribute("data-l10n-id", "pdfjs-toggle-sidebar-button"); + show() { + if (this.div.hidden && this.#renderingDone) { + this.div.hidden = false; + this.highlighter?.enable(); } } - #addEventListeners() { - this.sidebarContainer.addEventListener("transitionend", evt => { - if (evt.target === this.sidebarContainer) { - this.outerContainer.classList.remove("sidebarMoving"); - this.eventBus.dispatch("resize", { - source: this - }); - } - }); - this.toggleButton.addEventListener("click", evt => { - this.toggle(evt); - }); - this.thumbnailButton.addEventListener("click", () => { - this.switchView(_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.THUMBS); - }); - this.outlineButton.addEventListener("click", () => { - this.switchView(_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.OUTLINE); - }); - this.outlineButton.addEventListener("dblclick", () => { - this.eventBus.dispatch("toggleoutlinetree", { - source: this - }); - }); - this.attachmentsButton.addEventListener("click", () => { - this.switchView(_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.ATTACHMENTS); - }); - this.layersButton.addEventListener("click", () => { - this.switchView(_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.LAYERS); - }); - this.layersButton.addEventListener("dblclick", () => { - this.eventBus.dispatch("resetlayers", { - source: this - }); - }); - this._currentOutlineItemButton.addEventListener("click", () => { - this.eventBus.dispatch("currentoutlineitem", { - source: this - }); - }); - const onTreeLoaded = (count, button, view) => { - button.disabled = !count; - if (count) { - this.#showUINotification(); - } else if (this.active === view) { - this.switchView(_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.THUMBS); + cancel() { + this.#textLayer?.cancel(); + this.#textLayer = null; + this.#renderingDone = false; + this.div.replaceChildren(); + this.highlighter?.disable(); + this.accessibilityManager?.disable(); + TextLayerBuilder.#removeGlobalSelectionListener(this.div); + } + #bindMouse(end) { + const { + div + } = this; + const abortSignal = this.#abortSignal; + const opts = abortSignal ? { + signal: abortSignal + } : null; + div.addEventListener("mousedown", () => { + div.classList.add("selecting"); + }, opts); + div.addEventListener("copy", event => { + if (!this.#enablePermissions) { + const selection = document.getSelection(); + event.clipboardData.setData("text/plain", removeNullCharacters(normalizeUnicode(selection.toString()))); } + stopEvent(event); + }, opts); + TextLayerBuilder.#textLayers.set(div, end); + TextLayerBuilder.#enableGlobalSelectionListener(abortSignal); + } + static #removeGlobalSelectionListener(textLayerDiv) { + this.#textLayers.delete(textLayerDiv); + if (this.#textLayers.size === 0) { + this.#selectionChangeAC?.abort(); + this.#selectionChangeAC = null; + } + } + static #enableGlobalSelectionListener(globalAbortSignal) { + if (this.#selectionChangeAC) { + return; + } + this.#selectionChangeAC = new AbortController(); + const signal = globalAbortSignal ? AbortSignal.any([this.#selectionChangeAC.signal, globalAbortSignal]) : this.#selectionChangeAC.signal; + const reset = (end, textLayer) => { + textLayer.append(end); + end.style.width = ""; + end.style.height = ""; + textLayer.classList.remove("selecting"); }; - this.eventBus._on("outlineloaded", evt => { - onTreeLoaded(evt.outlineCount, this.outlineButton, _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.OUTLINE); - evt.currentOutlineItemPromise.then(enabled => { - if (!this.isInitialViewSet) { - return; - } - this._currentOutlineItemButton.disabled = !enabled; - }); + let isPointerDown = false; + document.addEventListener("pointerdown", () => { + isPointerDown = true; + }, { + signal }); - this.eventBus._on("attachmentsloaded", evt => { - onTreeLoaded(evt.attachmentsCount, this.attachmentsButton, _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.ATTACHMENTS); + document.addEventListener("pointerup", () => { + isPointerDown = false; + this.#textLayers.forEach(reset); + }, { + signal }); - this.eventBus._on("layersloaded", evt => { - onTreeLoaded(evt.layersCount, this.layersButton, _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.LAYERS); + window.addEventListener("blur", () => { + isPointerDown = false; + this.#textLayers.forEach(reset); + }, { + signal }); - this.eventBus._on("presentationmodechanged", evt => { - if (evt.state === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.PresentationModeState.NORMAL && this.visibleView === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SidebarView.THUMBS) { - this.onUpdateThumbnails(); + document.addEventListener("keyup", () => { + if (!isPointerDown) { + this.#textLayers.forEach(reset); } + }, { + signal }); - this.resizer.addEventListener("mousedown", evt => { - if (evt.button !== 0) { + var isFirefox, prevRange; + document.addEventListener("selectionchange", () => { + const selection = document.getSelection(); + if (selection.rangeCount === 0) { + this.#textLayers.forEach(reset); return; } - this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS); - window.addEventListener("mousemove", this.#mouseMoveBound); - window.addEventListener("mouseup", this.#mouseUpBound); - }); - this.eventBus._on("resize", evt => { - if (evt.source !== window) { - return; + const activeTextLayers = new Set(); + for (let i = 0; i < selection.rangeCount; i++) { + const range = selection.getRangeAt(i); + for (const textLayerDiv of this.#textLayers.keys()) { + if (!activeTextLayers.has(textLayerDiv) && range.intersectsNode(textLayerDiv)) { + activeTextLayers.add(textLayerDiv); + } + } } - this.#outerContainerWidth = null; - if (!this.#width) { - return; + for (const [textLayerDiv, endDiv] of this.#textLayers) { + if (activeTextLayers.has(textLayerDiv)) { + textLayerDiv.classList.add("selecting"); + } else { + reset(endDiv, textLayerDiv); + } } - if (!this.isOpen) { - this.#updateWidth(this.#width); + isFirefox ??= getComputedStyle(this.#textLayers.values().next().value).getPropertyValue("-moz-user-select") === "none"; + if (isFirefox) { return; } - this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS); - const updated = this.#updateWidth(this.#width); - Promise.resolve().then(() => { - this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS); - if (updated) { - this.eventBus.dispatch("resize", { - source: this - }); - } - }); - }); - } - get outerContainerWidth() { - return this.#outerContainerWidth ||= this.outerContainer.clientWidth; - } - #updateWidth(width = 0) { - const maxWidth = Math.floor(this.outerContainerWidth / 2); - if (width > maxWidth) { - width = maxWidth; - } - if (width < SIDEBAR_MIN_WIDTH) { - width = SIDEBAR_MIN_WIDTH; - } - if (width === this.#width) { - return false; - } - this.#width = width; - _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.docStyle.setProperty(SIDEBAR_WIDTH_VAR, `${width}px`); - return true; - } - #mouseMove(evt) { - let width = evt.clientX; - if (this.#isRTL) { - width = this.outerContainerWidth - width; - } - this.#updateWidth(width); - } - #mouseUp(evt) { - this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS); - this.eventBus.dispatch("resize", { - source: this + const range = selection.getRangeAt(0); + const modifyStart = prevRange && (range.compareBoundaryPoints(Range.END_TO_END, prevRange) === 0 || range.compareBoundaryPoints(Range.START_TO_END, prevRange) === 0); + let anchor = modifyStart ? range.startContainer : range.endContainer; + if (anchor.nodeType === Node.TEXT_NODE) { + anchor = anchor.parentNode; + } + if (anchor.classList?.contains("highlight")) { + anchor = anchor.parentNode; + } + if (!modifyStart && range.endOffset === 0) { + do { + while (!anchor.previousSibling) { + anchor = anchor.parentNode; + } + anchor = anchor.previousSibling; + } while (!anchor.childNodes.length); + } + const parentTextLayer = anchor.parentElement?.closest(".textLayer"); + const endDiv = this.#textLayers.get(parentTextLayer); + if (endDiv) { + endDiv.style.width = parentTextLayer.style.width; + endDiv.style.height = parentTextLayer.style.height; + endDiv.style.userSelect = "text"; + anchor.parentElement.insertBefore(endDiv, modifyStart ? anchor : anchor.nextSibling); + } + prevRange = range.cloneRange(); + }, { + signal }); - window.removeEventListener("mousemove", this.#mouseMoveBound); - window.removeEventListener("mouseup", this.#mouseUpBound); } } +;// ./web/pdf_page_view.js -/***/ }), -/***/ 1123: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFThumbnailView: () => (/* binding */ PDFThumbnailView), -/* harmony export */ TempImageFactory: () => (/* binding */ TempImageFactory) -/* harmony export */ }); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7256); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2603); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__]); -pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; -const DRAW_UPSCALE_FACTOR = 2; -const MAX_NUM_SCALING_STEPS = 3; -const THUMBNAIL_WIDTH = 98; -class TempImageFactory { - static #tempCanvas = null; - static getCanvas(width, height) { - const tempCanvas = this.#tempCanvas ||= document.createElement("canvas"); - tempCanvas.width = width; - tempCanvas.height = height; - const ctx = tempCanvas.getContext("2d", { - alpha: false - }); - ctx.save(); - ctx.fillStyle = "rgb(255, 255, 255)"; - ctx.fillRect(0, 0, width, height); - ctx.restore(); - return [tempCanvas, tempCanvas.getContext("2d")]; - } - static destroyCanvas() { - const tempCanvas = this.#tempCanvas; - if (tempCanvas) { - tempCanvas.width = 0; - tempCanvas.height = 0; - } - this.#tempCanvas = null; - } -} -class PDFThumbnailView { - constructor({ - container, - eventBus, - id, - defaultViewport, - optionalContentConfigPromise, - linkService, - renderingQueue, - pageColors - }) { - this.id = id; - this.renderingId = "thumbnail" + id; - this.pageLabel = null; + + + + + + + + + + + + +const DEFAULT_LAYER_PROPERTIES = null; +const LAYERS_ORDER = new Map([["canvasWrapper", 0], ["textLayer", 1], ["annotationLayer", 2], ["annotationEditorLayer", 3], ["xfaLayer", 3]]); +class PDFPageView extends BasePDFPageView { + #abortSignal = null; + #annotationMode = AnnotationMode.ENABLE_FORMS; + #canvasWrapper = null; + #commentManager = null; + #enableAutoLinking = true; + #hasRestrictedScaling = false; + #isEditing = false; + #layerProperties = null; + #needsRestrictedScaling = false; + #originalViewport = null; + #previousRotation = null; + #scaleRoundX = 1; + #scaleRoundY = 1; + #textLayerMode = TextLayerMode.ENABLE; + #userUnit = 1; + #useThumbnailCanvas = { + directDrawing: true, + initialOptionalContent: true, + regularAnnotations: true + }; + #layers = [null, null, null, null]; + constructor(options) { + super(options); + const { + container, + defaultViewport + } = options; + this.renderingId = "page" + this.id; + this.#layerProperties = options.layerProperties || DEFAULT_LAYER_PROPERTIES; + this.#abortSignal = options.abortSignal || null; this.pdfPage = null; + this.pageLabel = null; this.rotation = 0; + this.scale = options.scale || DEFAULT_SCALE; this.viewport = defaultViewport; this.pdfPageRotate = defaultViewport.rotation; - this._optionalContentConfigPromise = optionalContentConfigPromise || null; - this.pageColors = pageColors || null; - this.eventBus = eventBus; - this.linkService = linkService; - this.renderingQueue = renderingQueue; - this.renderTask = null; - this.renderingState = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.RenderingStates.INITIAL; - this.resume = null; - const anchor = document.createElement("a"); - anchor.href = linkService.getAnchorUrl("#page=" + id); - anchor.setAttribute("data-l10n-id", "pdfjs-thumb-page-title"); - anchor.setAttribute("data-l10n-args", this.#pageL10nArgs); - anchor.onclick = function () { - linkService.goToPage(id); - return false; - }; - this.anchor = anchor; + this._optionalContentConfigPromise = options.optionalContentConfigPromise || null; + this.#textLayerMode = options.textLayerMode ?? TextLayerMode.ENABLE; + this.#annotationMode = options.annotationMode ?? AnnotationMode.ENABLE_FORMS; + this.imageResourcesPath = options.imageResourcesPath || ""; + this.enableDetailCanvas = options.enableDetailCanvas ?? true; + this.maxCanvasPixels = options.maxCanvasPixels ?? AppOptions.get("maxCanvasPixels"); + this.maxCanvasDim = options.maxCanvasDim || AppOptions.get("maxCanvasDim"); + this.capCanvasAreaFactor = options.capCanvasAreaFactor ?? AppOptions.get("capCanvasAreaFactor"); + this.#enableAutoLinking = options.enableAutoLinking !== false; + this.#commentManager = options.commentManager || null; + this.l10n = options.l10n; + this.l10n ||= new genericl10n_GenericL10n(); + this._isStandalone = !this.renderingQueue?.hasViewer(); + this._container = container; + this._annotationCanvasMap = null; + this.annotationLayer = null; + this.annotationEditorLayer = null; + this.textLayer = null; + this.xfaLayer = null; + this.structTreeLayer = null; + this.drawLayer = null; + this.detailView = null; const div = document.createElement("div"); - div.className = "thumbnail"; + div.className = "page"; div.setAttribute("data-page-number", this.id); + div.setAttribute("role", "region"); + div.setAttribute("data-l10n-id", "pdfjs-page-landmark"); + div.setAttribute("data-l10n-args", JSON.stringify({ + page: this.id + })); this.div = div; - this.#updateDims(); - const img = document.createElement("div"); - img.className = "thumbnailImage"; - this._placeholderImg = img; - div.append(img); - anchor.append(div); - container.append(anchor); + this.#setDimensions(); + container?.append(div); + if (this._isStandalone) { + container?.style.setProperty("--scale-factor", this.scale * PixelsPerInch.PDF_TO_CSS_UNITS); + if (this.pageColors?.background) { + container?.style.setProperty("--page-bg-color", this.pageColors.background); + } + const { + optionalContentConfigPromise + } = options; + if (optionalContentConfigPromise) { + optionalContentConfigPromise.then(optionalContentConfig => { + if (optionalContentConfigPromise !== this._optionalContentConfigPromise) { + return; + } + this.#useThumbnailCanvas.initialOptionalContent = optionalContentConfig.hasInitialVisibility; + }); + } + if (!options.l10n) { + this.l10n.translate(this.div); + } + } } - #updateDims() { - const { - width, - height - } = this.viewport; - const ratio = width / height; - this.canvasWidth = THUMBNAIL_WIDTH; - this.canvasHeight = this.canvasWidth / ratio | 0; - this.scale = this.canvasWidth / width; + clone(id) { + const clone = new PDFPageView({ + container: null, + eventBus: this.eventBus, + pagesColors: this.pageColors, + renderingQueue: this.renderingQueue, + enableOptimizedPartialRendering: this.enableOptimizedPartialRendering, + minDurationToUpdateCanvas: this.minDurationToUpdateCanvas, + defaultViewport: this.viewport, + id, + layerProperties: this.#layerProperties, + abortSignal: this.#abortSignal, + scale: this.scale, + optionalContentConfigPromise: this._optionalContentConfigPromise, + textLayerMode: this.#textLayerMode, + annotationMode: this.#annotationMode, + imageResourcesPath: this.imageResourcesPath, + enableDetailCanvas: this.enableDetailCanvas, + maxCanvasPixels: this.maxCanvasPixels, + maxCanvasDim: this.maxCanvasDim, + capCanvasAreaFactor: this.capCanvasAreaFactor, + enableAutoLinking: this.#enableAutoLinking, + commentManager: this.#commentManager, + l10n: this.l10n + }); + clone.setPdfPage(this.pdfPage.clone(id - 1)); + return clone; + } + #addLayer(div, name) { + const pos = LAYERS_ORDER.get(name); + const oldDiv = this.#layers[pos]; + this.#layers[pos] = div; + if (oldDiv) { + oldDiv.replaceWith(div); + return; + } + for (let i = pos - 1; i >= 0; i--) { + const layer = this.#layers[i]; + if (layer) { + layer.after(div); + return; + } + } + this.div.prepend(div); + } + #setDimensions() { const { - style - } = this.div; - style.setProperty("--thumbnail-width", `${this.canvasWidth}px`); - style.setProperty("--thumbnail-height", `${this.canvasHeight}px`); + div, + viewport + } = this; + if (viewport.userUnit !== this.#userUnit) { + if (viewport.userUnit !== 1) { + div.style.setProperty("--user-unit", viewport.userUnit); + } else { + div.style.removeProperty("--user-unit"); + } + this.#userUnit = viewport.userUnit; + } + if (this.pdfPage) { + if (this.#previousRotation === viewport.rotation) { + return; + } + this.#previousRotation = viewport.rotation; + } + setLayerDimensions(div, viewport, true, false); + } + updatePageNumber(newPageNumber) { + const oldPageNumber = this.id; + if (oldPageNumber !== newPageNumber) { + this.id = newPageNumber; + this.renderingId = `page${newPageNumber}`; + if (this.pdfPage) { + this.pdfPage.pageNumber = newPageNumber; + } + this.setPageLabel(this.pageLabel); + const { + div + } = this; + div.setAttribute("data-page-number", newPageNumber); + div.setAttribute("data-l10n-args", JSON.stringify({ + page: newPageNumber + })); + this._textHighlighter.pageIdx = newPageNumber - 1; + } + this.#layerProperties.annotationEditorUIManager?.updatePageIndex(oldPageNumber - 1, newPageNumber - 1); } setPdfPage(pdfPage) { + if (this._isStandalone && (this.pageColors?.foreground === "CanvasText" || this.pageColors?.background === "Canvas")) { + this._container?.style.setProperty("--hcm-highlight-filter", pdfPage.filterFactory.addHighlightHCMFilter("highlight", "CanvasText", "Canvas", "HighlightText", "Highlight")); + this._container?.style.setProperty("--hcm-highlight-selected-filter", pdfPage.filterFactory.addHighlightHCMFilter("highlight_selected", "CanvasText", "Canvas", "HighlightText", "Highlight")); + } this.pdfPage = pdfPage; this.pdfPageRotate = pdfPage.rotate; const totalRotation = (this.rotation + this.pdfPageRotate) % 360; this.viewport = pdfPage.getViewport({ - scale: 1, + scale: this.scale * PixelsPerInch.PDF_TO_CSS_UNITS, rotation: totalRotation }); + this.#setDimensions(); this.reset(); } - reset() { - this.cancelRendering(); - this.renderingState = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.RenderingStates.INITIAL; - this.div.removeAttribute("data-loaded"); - this.image?.replaceWith(this._placeholderImg); - this.#updateDims(); - if (this.image) { - this.image.removeAttribute("src"); - delete this.image; - } + destroy() { + this.reset(); + this.pdfPage?.cleanup(); } - update({ - rotation = null - }) { - if (typeof rotation === "number") { - this.rotation = rotation; + deleteMe(isCut) { + if (isCut) { + this.div.remove(); + return; } - const totalRotation = (this.rotation + this.pdfPageRotate) % 360; - this.viewport = this.viewport.clone({ - scale: 1, - rotation: totalRotation + this.destroy(); + this.#layerProperties.annotationEditorUIManager?.deletePage(this.id); + } + hasEditableAnnotations() { + return !!this.annotationLayer?.hasEditableAnnotations(); + } + get _textHighlighter() { + return shadow(this, "_textHighlighter", new TextHighlighter({ + pageIndex: this.id - 1, + eventBus: this.eventBus, + findController: this.#layerProperties.findController + })); + } + #dispatchLayerRendered(name, error) { + this.eventBus.dispatch(name, { + source: this, + pageNumber: this.id, + error }); - this.reset(); } - cancelRendering() { - if (this.renderTask) { - this.renderTask.cancel(); - this.renderTask = null; + async #renderAnnotationLayer(textLayerPromise = null) { + const { + annotationLayer, + textLayer + } = this; + let error = null; + try { + await this.annotationLayer.render({ + viewport: this.viewport, + intent: "display", + structTreeLayer: this.structTreeLayer, + optionalContentConfigPromise: this._optionalContentConfigPromise + }); + } catch (ex) { + console.error("#renderAnnotationLayer:", ex); + error = ex; + } finally { + this.#dispatchLayerRendered("annotationlayerrendered", error); + } + if (this.#enableAutoLinking && textLayerPromise) { + this.#injectLinkAnnotations(textLayerPromise, annotationLayer, textLayer); } - this.resume = null; } - #getPageDrawContext(upscaleFactor = 1) { - const canvas = document.createElement("canvas"); - const ctx = canvas.getContext("2d", { - alpha: false - }); - const outputScale = new _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.OutputScale(); - canvas.width = upscaleFactor * this.canvasWidth * outputScale.sx | 0; - canvas.height = upscaleFactor * this.canvasHeight * outputScale.sy | 0; - const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null; - return { - ctx, - canvas, - transform - }; + _refreshAnnotationLayer() { + if (this._annotationCanvasMap?.size) { + this.annotationLayer?.refreshCanvases(); + } } - #convertCanvasToImage(canvas) { - if (this.renderingState !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.RenderingStates.FINISHED) { - throw new Error("#convertCanvasToImage: Rendering has not finished."); + async #renderAnnotationEditorLayer() { + let error = null; + try { + await this.annotationEditorLayer.render({ + viewport: this.viewport, + intent: "display" + }); + } catch (ex) { + console.error("#renderAnnotationEditorLayer:", ex); + error = ex; + } finally { + this.#dispatchLayerRendered("annotationeditorlayerrendered", error); } - const reducedCanvas = this.#reduceImage(canvas); - const image = document.createElement("img"); - image.className = "thumbnailImage"; - image.setAttribute("data-l10n-id", "pdfjs-thumb-page-canvas"); - image.setAttribute("data-l10n-args", this.#pageL10nArgs); - image.src = reducedCanvas.toDataURL(); - this.image = image; - this.div.setAttribute("data-loaded", true); - this._placeholderImg.replaceWith(image); - reducedCanvas.width = 0; - reducedCanvas.height = 0; } - async #finishRenderTask(renderTask, canvas, error = null) { - if (renderTask === this.renderTask) { - this.renderTask = null; + async #renderDrawLayer() { + try { + await this.drawLayer.render({ + intent: "display" + }); + } catch (ex) { + console.error("#renderDrawLayer:", ex); } - if (error instanceof pdfjs_lib__WEBPACK_IMPORTED_MODULE_1__.RenderingCancelledException) { - return; + } + async #renderXfaLayer() { + let error = null; + try { + const result = await this.xfaLayer.render({ + viewport: this.viewport, + intent: "display" + }); + if (result?.textDivs && this._textHighlighter) { + this.#buildXfaTextContentItems(result.textDivs); + } + } catch (ex) { + console.error("#renderXfaLayer:", ex); + error = ex; + } finally { + if (this.xfaLayer?.div) { + this.l10n.pause(); + this.#addLayer(this.xfaLayer.div, "xfaLayer"); + this.l10n.resume(); + } + this.#dispatchLayerRendered("xfalayerrendered", error); } - this.renderingState = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.RenderingStates.FINISHED; - this.#convertCanvasToImage(canvas); - if (error) { - throw error; + } + async #renderTextLayer() { + let error = null; + try { + await this.textLayer.render({ + viewport: this.viewport, + images: this.imageCoordinates ? new TextLayerImages(this.imagesRightClickMinSize, this.imageCoordinates, this.viewport, () => this.canvas) : null + }); + } catch (ex) { + if (ex instanceof AbortException) { + return; + } + console.error("#renderTextLayer:", ex); + error = ex; } + this.#dispatchLayerRendered("textlayerrendered", error); + this.#renderStructTreeLayer(); } - async draw() { - if (this.renderingState !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.RenderingStates.INITIAL) { - console.error("Must be in new state before drawing"); - return undefined; + async #renderStructTreeLayer() { + const treeDom = await this.structTreeLayer?.render(); + if (treeDom) { + this.l10n.pause(); + this.structTreeLayer?.updateTextLayer(); + if (this.canvas && treeDom.parentNode !== this.canvas) { + this.canvas.append(treeDom); + } + this.l10n.resume(); } - const { - pdfPage - } = this; - if (!pdfPage) { - this.renderingState = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.RenderingStates.FINISHED; - throw new Error("pdfPage is not loaded"); + this.structTreeLayer?.show(); + } + async #buildXfaTextContentItems(textDivs) { + const text = await this.pdfPage.getTextContent(); + const items = []; + for (const item of text.items) { + items.push(item.str); } - this.renderingState = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.RenderingStates.RUNNING; - const { - ctx, - canvas, - transform - } = this.#getPageDrawContext(DRAW_UPSCALE_FACTOR); - const drawViewport = this.viewport.clone({ - scale: DRAW_UPSCALE_FACTOR * this.scale - }); - const renderContinueCallback = cont => { - if (!this.renderingQueue.isHighestPriority(this)) { - this.renderingState = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.RenderingStates.PAUSED; - this.resume = () => { - this.renderingState = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.RenderingStates.RUNNING; - cont(); - }; + this._textHighlighter.setTextMapping(textDivs, items); + this._textHighlighter.enable(); + } + async #injectLinkAnnotations(textLayerPromise, annotationLayer, textLayer) { + let error = null; + try { + await textLayerPromise; + if (annotationLayer !== this.annotationLayer || textLayer !== this.textLayer) { return; } - cont(); - }; - const renderContext = { - canvasContext: ctx, - transform, - viewport: drawViewport, - optionalContentConfigPromise: this._optionalContentConfigPromise, - pageColors: this.pageColors - }; - const renderTask = this.renderTask = pdfPage.render(renderContext); - renderTask.onContinue = renderContinueCallback; - const resultPromise = renderTask.promise.then(() => this.#finishRenderTask(renderTask, canvas), error => this.#finishRenderTask(renderTask, canvas, error)); - resultPromise.finally(() => { - canvas.width = 0; - canvas.height = 0; - this.eventBus.dispatch("thumbnailrendered", { - source: this, - pageNumber: this.id, - pdfPage: this.pdfPage - }); - }); - return resultPromise; + await annotationLayer.injectLinkAnnotations(Autolinker.processLinks(this)); + } catch (ex) { + console.error("#injectLinkAnnotations:", ex); + error = ex; + } + this.#dispatchLayerRendered("linkannotationsadded", error); } - setImage(pageView) { - if (this.renderingState !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.RenderingStates.INITIAL) { - return; + _resetCanvas() { + super._resetCanvas(); + this.#originalViewport = null; + } + reset({ + keepAnnotationLayer = false, + keepAnnotationEditorLayer = false, + keepXfaLayer = false, + keepTextLayer = false, + keepCanvasWrapper = false, + preserveDetailViewState = false + } = {}) { + const keepPdfBugGroups = this.pdfPage?._pdfBug ?? false; + this.cancelRendering({ + keepAnnotationLayer, + keepAnnotationEditorLayer, + keepXfaLayer, + keepTextLayer + }); + this.renderingState = RenderingStates.INITIAL; + const div = this.div; + const childNodes = div.childNodes, + annotationLayerNode = keepAnnotationLayer && this.annotationLayer?.div || null, + annotationEditorLayerNode = keepAnnotationEditorLayer && this.annotationEditorLayer?.div || null, + xfaLayerNode = keepXfaLayer && this.xfaLayer?.div || null, + textLayerNode = keepTextLayer && this.textLayer?.div || null, + canvasWrapperNode = keepCanvasWrapper && this.#canvasWrapper || null; + for (let i = childNodes.length - 1; i >= 0; i--) { + const node = childNodes[i]; + switch (node) { + case annotationLayerNode: + case annotationEditorLayerNode: + case xfaLayerNode: + case textLayerNode: + case canvasWrapperNode: + continue; + } + if (keepPdfBugGroups && node.classList.contains("pdfBugGroupsLayer")) { + continue; + } + node.remove(); + const layerIndex = this.#layers.indexOf(node); + if (layerIndex >= 0) { + this.#layers[layerIndex] = null; + } } - const { - thumbnailCanvas: canvas, - pdfPage, - scale - } = pageView; - if (!canvas) { - return; + div.removeAttribute("data-loaded"); + if (annotationLayerNode) { + this.annotationLayer.hide(); } - if (!this.pdfPage) { - this.setPdfPage(pdfPage); + if (annotationEditorLayerNode) { + this.annotationEditorLayer.hide(); } - if (scale < this.scale) { - return; + if (xfaLayerNode) { + this.xfaLayer.hide(); } - this.renderingState = _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.RenderingStates.FINISHED; - this.#convertCanvasToImage(canvas); - } - #reduceImage(img) { - const { - ctx, - canvas - } = this.#getPageDrawContext(); - if (img.width <= 2 * canvas.width) { - ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height); - return canvas; + if (textLayerNode) { + this.textLayer.hide(); } - let reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS; - let reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS; - const [reducedImage, reducedImageCtx] = TempImageFactory.getCanvas(reducedWidth, reducedHeight); - while (reducedWidth > img.width || reducedHeight > img.height) { - reducedWidth >>= 1; - reducedHeight >>= 1; + this.structTreeLayer?.hide(); + if (!keepCanvasWrapper && this.#canvasWrapper) { + this.#canvasWrapper = null; + this._resetCanvas(); } - reducedImageCtx.drawImage(img, 0, 0, img.width, img.height, 0, 0, reducedWidth, reducedHeight); - while (reducedWidth > 2 * canvas.width) { - reducedImageCtx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, reducedWidth >> 1, reducedHeight >> 1); - reducedWidth >>= 1; - reducedHeight >>= 1; + if (!preserveDetailViewState) { + this.detailView?.reset({ + keepCanvas: keepCanvasWrapper + }); + if (!keepCanvasWrapper) { + this.detailView = null; + } } - ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, canvas.width, canvas.height); - return canvas; } - get #pageL10nArgs() { - return JSON.stringify({ - page: this.pageLabel ?? this.id + toggleEditingMode(isEditing) { + this.#isEditing = isEditing; + if (!this.hasEditableAnnotations()) { + return; + } + this.reset({ + keepAnnotationLayer: true, + keepAnnotationEditorLayer: true, + keepXfaLayer: true, + keepTextLayer: true, + keepCanvasWrapper: true }); } - setPageLabel(label) { - this.pageLabel = typeof label === "string" ? label : null; - this.anchor.setAttribute("data-l10n-args", this.#pageL10nArgs); - if (this.renderingState !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.RenderingStates.FINISHED) { - return; + updateVisibleArea(visibleArea) { + if (this.enableDetailCanvas) { + if (this.#needsRestrictedScaling && this.maxCanvasPixels > 0 && visibleArea) { + this.detailView ??= new PDFPageDetailView({ + pageView: this, + enableOptimizedPartialRendering: this.enableOptimizedPartialRendering, + imagesRightClickMinSize: -1 + }); + this.detailView.update({ + visibleArea + }); + } else if (this.detailView) { + this.detailView.reset(); + this.detailView = null; + } } - this.image?.setAttribute("data-l10n-args", this.#pageL10nArgs); } -} - -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), - -/***/ 8280: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFThumbnailViewer: () => (/* binding */ PDFThumbnailViewer) -/* harmony export */ }); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7256); -/* harmony import */ var _pdf_thumbnail_view_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1123); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_pdf_thumbnail_view_js__WEBPACK_IMPORTED_MODULE_1__]); -_pdf_thumbnail_view_js__WEBPACK_IMPORTED_MODULE_1__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; - - -const THUMBNAIL_SCROLL_MARGIN = -19; -const THUMBNAIL_SELECTED_CLASS = "selected"; -class PDFThumbnailViewer { - constructor({ - container, - eventBus, - linkService, - renderingQueue, - pageColors + update({ + scale = 0, + rotation = null, + optionalContentConfigPromise = null, + drawingDelay = -1 }) { - this.container = container; - this.eventBus = eventBus; - this.linkService = linkService; - this.renderingQueue = renderingQueue; - this.pageColors = pageColors || null; - this.scroll = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.watchScroll)(this.container, this.#scrollUpdated.bind(this)); - this.#resetView(); - } - #scrollUpdated() { - this.renderingQueue.renderHighestPriority(); - } - getThumbnail(index) { - return this._thumbnails[index]; - } - #getVisibleThumbs() { - return (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.getVisibleElements)({ - scrollEl: this.container, - views: this._thumbnails - }); - } - scrollThumbnailIntoView(pageNumber) { - if (!this.pdfDocument) { - return; + this.scale = scale || this.scale; + if (typeof rotation === "number") { + this.rotation = rotation; } - const thumbnailView = this._thumbnails[pageNumber - 1]; - if (!thumbnailView) { - console.error('scrollThumbnailIntoView: Invalid "pageNumber" parameter.'); - return; + if (optionalContentConfigPromise instanceof Promise) { + this._optionalContentConfigPromise = optionalContentConfigPromise; + optionalContentConfigPromise.then(optionalContentConfig => { + if (optionalContentConfigPromise !== this._optionalContentConfigPromise) { + return; + } + this.#useThumbnailCanvas.initialOptionalContent = optionalContentConfig.hasInitialVisibility; + }); } - if (pageNumber !== this._currentPageNumber) { - const prevThumbnailView = this._thumbnails[this._currentPageNumber - 1]; - prevThumbnailView.div.classList.remove(THUMBNAIL_SELECTED_CLASS); - thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS); + this.#useThumbnailCanvas.directDrawing = true; + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = this.viewport.clone({ + scale: this.scale * PixelsPerInch.PDF_TO_CSS_UNITS, + rotation: totalRotation + }); + this.#setDimensions(); + if (this._isStandalone) { + this._container?.style.setProperty("--scale-factor", this.viewport.scale); } - const { - first, - last, - views - } = this.#getVisibleThumbs(); - if (views.length > 0) { - let shouldScroll = false; - if (pageNumber <= first.id || pageNumber >= last.id) { - shouldScroll = true; - } else { - for (const { - id, - percent - } of views) { - if (id !== pageNumber) { - continue; - } - shouldScroll = percent < 100; - break; + this.#computeScale(); + if (this.canvas) { + const onlyCssZoom = this.#hasRestrictedScaling && this.#needsRestrictedScaling; + const postponeDrawing = drawingDelay >= 0 && drawingDelay < 1000; + if (postponeDrawing || onlyCssZoom) { + if (postponeDrawing && !onlyCssZoom && this.renderingState !== RenderingStates.FINISHED) { + this.cancelRendering({ + keepAnnotationLayer: true, + keepAnnotationEditorLayer: true, + keepXfaLayer: true, + keepTextLayer: true, + cancelExtraDelay: drawingDelay + }); + this.renderingState = RenderingStates.FINISHED; + this.#useThumbnailCanvas.directDrawing = false; } - } - if (shouldScroll) { - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.scrollIntoView)(thumbnailView.div, { - top: THUMBNAIL_SCROLL_MARGIN + this.cssTransform({ + redrawAnnotationLayer: true, + redrawAnnotationEditorLayer: true, + redrawXfaLayer: true, + redrawTextLayer: !postponeDrawing, + hideTextLayer: postponeDrawing }); + if (!postponeDrawing) { + this.detailView?.update({ + underlyingViewUpdated: true + }); + this.dispatchPageRendered(true, false); + } + return; } } - this._currentPageNumber = pageNumber; + this.cssTransform({}); + this.reset({ + keepAnnotationLayer: true, + keepAnnotationEditorLayer: true, + keepXfaLayer: true, + keepTextLayer: true, + keepCanvasWrapper: true, + preserveDetailViewState: true + }); + this.detailView?.update({ + underlyingViewUpdated: true + }); } - get pagesRotation() { - return this._pagesRotation; + #computeScale() { + const { + width, + height + } = this.viewport; + const outputScale = this.outputScale = new OutputScale(); + if (this.maxCanvasPixels === 0) { + const invScale = 1 / this.scale; + outputScale.sx *= invScale; + outputScale.sy *= invScale; + this.#needsRestrictedScaling = true; + } else { + this.#needsRestrictedScaling = outputScale.limitCanvas(width, height, this.maxCanvasPixels, this.maxCanvasDim, this.capCanvasAreaFactor); + if (this.#needsRestrictedScaling && this.enableDetailCanvas) { + const factor = this.enableOptimizedPartialRendering ? 4 : 2; + outputScale.sx /= factor; + outputScale.sy /= factor; + } + } } - set pagesRotation(rotation) { - if (!(0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.isValidRotation)(rotation)) { - throw new Error("Invalid thumbnails rotation angle."); + cancelRendering({ + keepAnnotationLayer = false, + keepAnnotationEditorLayer = false, + keepXfaLayer = false, + keepTextLayer = false, + cancelExtraDelay = 0 + } = {}) { + super.cancelRendering({ + cancelExtraDelay + }); + if (this.textLayer && (!keepTextLayer || !this.textLayer.div)) { + this.textLayer.cancel(); + this.textLayer = null; } - if (!this.pdfDocument) { - return; + if (this.annotationLayer && (!keepAnnotationLayer || !this.annotationLayer.div)) { + this.annotationLayer.cancel(); + this.annotationLayer = null; + this._annotationCanvasMap = null; } - if (this._pagesRotation === rotation) { - return; + if (this.structTreeLayer && !this.textLayer) { + this.structTreeLayer = null; } - this._pagesRotation = rotation; - const updateArgs = { - rotation - }; - for (const thumbnail of this._thumbnails) { - thumbnail.update(updateArgs); + if (this.annotationEditorLayer && (!keepAnnotationEditorLayer || !this.annotationEditorLayer.div)) { + if (this.drawLayer) { + this.drawLayer.cancel(); + this.drawLayer = null; + } + this.annotationEditorLayer.cancel(); + this.annotationEditorLayer = null; + } + if (this.xfaLayer && (!keepXfaLayer || !this.xfaLayer.div)) { + this.xfaLayer.cancel(); + this.xfaLayer = null; + this._textHighlighter?.disable(); } } - cleanup() { - for (const thumbnail of this._thumbnails) { - if (thumbnail.renderingState !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.RenderingStates.FINISHED) { - thumbnail.reset(); + cssTransform({ + redrawAnnotationLayer = false, + redrawAnnotationEditorLayer = false, + redrawXfaLayer = false, + redrawTextLayer = false, + hideTextLayer = false + }) { + const { + canvas + } = this; + if (!canvas) { + return; + } + const originalViewport = this.#originalViewport; + if (this.viewport !== originalViewport) { + const relativeRotation = (360 + this.viewport.rotation - originalViewport.rotation) % 360; + if (relativeRotation === 90 || relativeRotation === 270) { + const { + width, + height + } = this.viewport; + const scaleX = height / width; + const scaleY = width / height; + canvas.style.transform = `rotate(${relativeRotation}deg) scale(${scaleX},${scaleY})`; + } else { + canvas.style.transform = relativeRotation === 0 ? "" : `rotate(${relativeRotation}deg)`; } } - _pdf_thumbnail_view_js__WEBPACK_IMPORTED_MODULE_1__.TempImageFactory.destroyCanvas(); - } - #resetView() { - this._thumbnails = []; - this._currentPageNumber = 1; - this._pageLabels = null; - this._pagesRotation = 0; - this.container.textContent = ""; - } - setDocument(pdfDocument) { - if (this.pdfDocument) { - this.#cancelRendering(); - this.#resetView(); + if (redrawAnnotationLayer && this.annotationLayer) { + this.#renderAnnotationLayer(); } - this.pdfDocument = pdfDocument; - if (!pdfDocument) { - return; + if (redrawAnnotationEditorLayer && this.annotationEditorLayer) { + if (this.drawLayer) { + this.#renderDrawLayer(); + } + this.#renderAnnotationEditorLayer(); } - const firstPagePromise = pdfDocument.getPage(1); - const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({ - intent: "display" - }); - firstPagePromise.then(firstPdfPage => { - const pagesCount = pdfDocument.numPages; - const viewport = firstPdfPage.getViewport({ - scale: 1 - }); - for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) { - const thumbnail = new _pdf_thumbnail_view_js__WEBPACK_IMPORTED_MODULE_1__.PDFThumbnailView({ - container: this.container, - eventBus: this.eventBus, - id: pageNum, - defaultViewport: viewport.clone(), - optionalContentConfigPromise, - linkService: this.linkService, - renderingQueue: this.renderingQueue, - pageColors: this.pageColors - }); - this._thumbnails.push(thumbnail); + if (redrawXfaLayer && this.xfaLayer) { + this.#renderXfaLayer(); + } + if (this.textLayer) { + if (hideTextLayer) { + this.textLayer.hide(); + this.structTreeLayer?.hide(); + } else if (redrawTextLayer) { + this.#renderTextLayer(); } - this._thumbnails[0]?.setPdfPage(firstPdfPage); - const thumbnailView = this._thumbnails[this._currentPageNumber - 1]; - thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS); - }).catch(reason => { - console.error("Unable to initialize thumbnail viewer", reason); - }); + } } - #cancelRendering() { - for (const thumbnail of this._thumbnails) { - thumbnail.cancelRendering(); + get width() { + return this.viewport.width; + } + get height() { + return this.viewport.height; + } + getPagePoint(x, y) { + return this.viewport.convertToPdfPoint(x, y); + } + _ensureCanvasWrapper() { + let canvasWrapper = this.#canvasWrapper; + if (!canvasWrapper) { + canvasWrapper = this.#canvasWrapper = document.createElement("div"); + canvasWrapper.classList.add("canvasWrapper"); + this.#addLayer(canvasWrapper, "canvasWrapper"); } + return canvasWrapper; } - setPageLabels(labels) { - if (!this.pdfDocument) { - return; + _getRenderingContext(canvas, transform, recordOperations, recordImages) { + return { + canvas, + transform, + viewport: this.viewport, + annotationMode: this.#annotationMode, + optionalContentConfigPromise: this._optionalContentConfigPromise, + annotationCanvasMap: this._annotationCanvasMap, + pageColors: this.pageColors, + isEditing: this.#isEditing, + recordOperations, + recordImages + }; + } + async draw() { + if (this.renderingState !== RenderingStates.INITIAL) { + console.error("Must be in new state before drawing"); + this.reset(); } - if (!labels) { - this._pageLabels = null; - } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) { - this._pageLabels = null; - console.error("PDFThumbnailViewer_setPageLabels: Invalid page labels."); - } else { - this._pageLabels = labels; + const { + div, + l10n, + pdfPage, + viewport + } = this; + if (!pdfPage) { + this.renderingState = RenderingStates.FINISHED; + throw new Error("pdfPage is not loaded"); } - for (let i = 0, ii = this._thumbnails.length; i < ii; i++) { - this._thumbnails[i].setPageLabel(this._pageLabels?.[i] ?? null); + this.renderingState = RenderingStates.RUNNING; + const canvasWrapper = this._ensureCanvasWrapper(); + if (!this.textLayer && this.#textLayerMode !== TextLayerMode.DISABLE && !pdfPage.isPureXfa) { + this._accessibilityManager ||= new TextAccessibilityManager(); + this.textLayer = new TextLayerBuilder({ + pdfPage, + highlighter: this._textHighlighter, + accessibilityManager: this._accessibilityManager, + enablePermissions: this.#textLayerMode === TextLayerMode.ENABLE_PERMISSIONS, + onAppend: textLayerDiv => { + this.l10n.pause(); + this.#addLayer(textLayerDiv, "textLayer"); + this.l10n.resume(); + }, + abortSignal: this.#abortSignal + }); + if (this.enableSelectionRendering) { + this.textLayer.div.classList.add("selectionRendering"); + } } - } - async #ensurePdfPageLoaded(thumbView) { - if (thumbView.pdfPage) { - return thumbView.pdfPage; + if (!this.annotationLayer && this.#annotationMode !== AnnotationMode.DISABLE) { + const { + annotationStorage, + annotationEditorUIManager, + downloadManager, + enableComment, + enableScripting, + fieldObjectsPromise, + hasJSActionsPromise, + linkService + } = this.#layerProperties; + this._annotationCanvasMap ||= new Map(); + this.annotationLayer = new AnnotationLayerBuilder({ + pdfPage, + annotationStorage, + imageResourcesPath: this.imageResourcesPath, + renderForms: this.#annotationMode === AnnotationMode.ENABLE_FORMS, + linkService, + downloadManager, + enableComment, + enableScripting, + hasJSActionsPromise, + fieldObjectsPromise, + annotationCanvasMap: this._annotationCanvasMap, + accessibilityManager: this._accessibilityManager, + annotationEditorUIManager, + commentManager: this.#commentManager, + onAppend: annotationLayerDiv => { + this.#addLayer(annotationLayerDiv, "annotationLayer"); + } + }); } - try { - const pdfPage = await this.pdfDocument.getPage(thumbView.id); - if (!thumbView.pdfPage) { - thumbView.setPdfPage(pdfPage); + const { + width, + height + } = viewport; + this.#originalViewport = viewport; + const { + canvas, + prevCanvas + } = this._createCanvas(newCanvas => { + canvasWrapper.prepend(newCanvas); + }); + canvas.setAttribute("role", "presentation"); + if (!this.outputScale) { + this.#computeScale(); + } + const { + outputScale + } = this; + this.#hasRestrictedScaling = this.#needsRestrictedScaling; + const sfx = approximateFraction(outputScale.sx); + const sfy = approximateFraction(outputScale.sy); + const canvasWidth = canvas.width = floorToDivide(calcRound(width * outputScale.sx), sfx[0]); + const canvasHeight = canvas.height = floorToDivide(calcRound(height * outputScale.sy), sfy[0]); + const pageWidth = floorToDivide(calcRound(width), sfx[1]); + const pageHeight = floorToDivide(calcRound(height), sfy[1]); + outputScale.sx = canvasWidth / pageWidth; + outputScale.sy = canvasHeight / pageHeight; + if (this.#scaleRoundX !== sfx[1]) { + div.style.setProperty("--scale-round-x", `${sfx[1]}px`); + this.#scaleRoundX = sfx[1]; + } + if (this.#scaleRoundY !== sfy[1]) { + div.style.setProperty("--scale-round-y", `${sfy[1]}px`); + this.#scaleRoundY = sfy[1]; + } + const recordBBoxes = this.enableOptimizedPartialRendering && this.#hasRestrictedScaling && !this.recordedBBoxes; + const recordImages = this.imagesRightClickMinSize !== -1 && !this.imageCoordinates; + const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null; + const resultPromise = this._drawCanvas(this._getRenderingContext(canvas, transform, recordBBoxes, recordImages), () => { + prevCanvas?.remove(); + this._resetCanvas(); + }, renderTask => { + this.#useThumbnailCanvas.regularAnnotations = !renderTask.separateAnnots; + this.dispatchPageRendered(false, false); + }).then(async () => { + if (this.renderingState !== RenderingStates.FINISHED) { + return; } - return pdfPage; - } catch (reason) { - console.error("Unable to get page for thumb view", reason); - return null; + this.structTreeLayer ||= new StructTreeLayerBuilder(pdfPage, viewport.rawDims); + const textLayerPromise = this.textLayer ? this.#renderTextLayer() : null; + if (this.annotationLayer) { + await this.#renderAnnotationLayer(textLayerPromise); + } + this.drawLayer ||= new DrawLayerBuilder({ + pageIndex: this.id, + textLayer: this.enableSelectionRendering ? this.textLayer?.div : null, + filterFactory: this.pdfPage?.filterFactory, + pageColors: this.pageColors + }); + await this.#renderDrawLayer(); + this.drawLayer.setParent(canvasWrapper); + const { + annotationEditorUIManager + } = this.#layerProperties; + if (!annotationEditorUIManager) { + return; + } + if (this.annotationLayer || this.#annotationMode === AnnotationMode.DISABLE) { + this.annotationEditorLayer ||= new AnnotationEditorLayerBuilder({ + uiManager: annotationEditorUIManager, + pageIndex: this.id - 1, + l10n, + structTreeLayer: this.structTreeLayer, + accessibilityManager: this._accessibilityManager, + annotationLayer: this.annotationLayer?.annotationLayer, + textLayer: this.textLayer, + drawLayer: this.drawLayer.getDrawLayer(), + onAppend: annotationEditorLayerDiv => { + this.#addLayer(annotationEditorLayerDiv, "annotationEditorLayer"); + } + }); + this.#renderAnnotationEditorLayer(); + } + }); + if (pdfPage.isPureXfa) { + if (!this.xfaLayer) { + const { + annotationStorage, + linkService + } = this.#layerProperties; + this.xfaLayer = new XfaLayerBuilder({ + pdfPage, + annotationStorage, + linkService + }); + } + this.#renderXfaLayer(); } + div.setAttribute("data-loaded", true); + this.dispatchPageRender(); + return resultPromise; } - #getScrollAhead(visible) { - if (visible.first?.id === 1) { - return true; - } else if (visible.last?.id === this._thumbnails.length) { - return false; + setPageLabel(label) { + this.pageLabel = typeof label === "string" ? label : null; + this.div.setAttribute("data-l10n-args", JSON.stringify({ + page: this.pageLabel ?? this.id + })); + if (this.pageLabel !== null) { + this.div.setAttribute("data-page-label", this.pageLabel); + } else { + this.div.removeAttribute("data-page-label"); } - return this.scroll.down; } - forceRendering() { - const visibleThumbs = this.#getVisibleThumbs(); - const scrollAhead = this.#getScrollAhead(visibleThumbs); - const thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, this._thumbnails, scrollAhead); - if (thumbView) { - this.#ensurePdfPageLoaded(thumbView).then(() => { - this.renderingQueue.renderView(thumbView); - }); - return true; - } - return false; + get thumbnailCanvas() { + const { + directDrawing, + initialOptionalContent, + regularAnnotations + } = this.#useThumbnailCanvas; + return directDrawing && initialOptionalContent && regularAnnotations ? this.canvas : null; } } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); +;// ./web/pdf_viewer.js -/***/ }), -/***/ 6285: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFViewer: () => (/* binding */ PDFViewer), -/* harmony export */ PagesCountLimit: () => (/* binding */ PagesCountLimit) -/* harmony export */ }); -/* unused harmony export PDFPageViewBuffer */ -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2603); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7256); -/* harmony import */ var web_null_l10n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(410); -/* harmony import */ var _pdf_page_view_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(9966); -/* harmony import */ var _pdf_rendering_queue_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(6615); -/* harmony import */ var _pdf_link_service_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(787); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__, web_null_l10n__WEBPACK_IMPORTED_MODULE_2__, _pdf_page_view_js__WEBPACK_IMPORTED_MODULE_3__, _pdf_rendering_queue_js__WEBPACK_IMPORTED_MODULE_4__]); -([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__, web_null_l10n__WEBPACK_IMPORTED_MODULE_2__, _pdf_page_view_js__WEBPACK_IMPORTED_MODULE_3__, _pdf_rendering_queue_js__WEBPACK_IMPORTED_MODULE_4__] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__); @@ -11364,12 +14534,12 @@ const DEFAULT_CACHE_SIZE = 10; const PagesCountLimit = { - FORCE_SCROLL_MODE_PAGE: 15000, - FORCE_LAZY_PAGE_INIT: 7500, + FORCE_SCROLL_MODE_PAGE: 10000, + FORCE_LAZY_PAGE_INIT: 5000, PAUSE_EAGER_PAGE_INIT: 250 }; function isValidAnnotationEditorMode(mode) { - return Object.values(pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType).includes(mode) && mode !== pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.DISABLE; + return Object.values(AnnotationEditorType).includes(mode) && mode !== AnnotationEditorType.DISABLE; } class PDFPageViewBuffer { #buf = new Set(); @@ -11423,30 +14593,46 @@ #buffer = null; #altTextManager = null; #annotationEditorHighlightColors = null; - #annotationEditorMode = pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.NONE; + #annotationEditorMode = AnnotationEditorType.NONE; #annotationEditorUIManager = null; - #annotationMode = pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationMode.ENABLE_FORMS; + #annotationMode = AnnotationMode.ENABLE_FORMS; + #commentManager = null; #containerTopLeft = null; - #copyCallbackBound = null; + #editorUndoBar = null; #enableHighlightFloatingButton = false; #enablePermissions = false; + #enableUpdatedAddImage = false; + #enableNewAltTextWhenAddingImage = false; + #enableAutoLinking = true; + #abortSignal = null; + #eventAC = null; + #minDurationToUpdateCanvas = 0; #mlManager = null; - #getAllTextInProgress = false; + #printingAllowed = true; + #scrollTimeoutId = null; + #switchAnnotationEditorModeAC = null; + #switchAnnotationEditorModeTimeoutId = null; + #copyAllInProgress = false; #hiddenCopyElement = null; - #interruptCopyCondition = false; #previousContainerHeight = 0; #resizeObserver = new ResizeObserver(this.#resizeObserverCallback.bind(this)); #scrollModePageState = null; - #onVisibilityChange = null; #scaleTimeoutId = null; - #textLayerMode = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.TextLayerMode.ENABLE; + #signatureManager = null; + #supportsPinchToZoom = true; + #textLayerMode = TextLayerMode.ENABLE; + #viewerAlert = null; + #copiedPageViews = null; + #savedPageViews = null; + #deletedPageNumbers = null; constructor(options) { - const viewerVersion = "4.1.392"; - if (pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.version !== viewerVersion) { - throw new Error(`The API version "${pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.version}" does not match the Viewer version "${viewerVersion}".`); + const viewerVersion = "6.1.200"; + if (version !== viewerVersion) { + throw new Error(`The API version "${version}" does not match the Viewer version "${viewerVersion}".`); } this.container = options.container; this.viewer = options.viewer || options.container.firstElementChild; + this.#viewerAlert = options.viewerAlert || null; if (this.container?.tagName !== "DIV" || this.viewer?.tagName !== "DIV") { throw new Error("Invalid `container` and/or `viewer` option."); } @@ -11455,44 +14641,67 @@ } this.#resizeObserver.observe(this.container); this.eventBus = options.eventBus; - this.linkService = options.linkService || new _pdf_link_service_js__WEBPACK_IMPORTED_MODULE_5__.SimpleLinkService(); + this.linkService = options.linkService || new SimpleLinkService(); this.downloadManager = options.downloadManager || null; this.findController = options.findController || null; this.#altTextManager = options.altTextManager || null; + this.#commentManager = options.commentManager || null; + this.#signatureManager = options.signatureManager || null; + this.#editorUndoBar = options.editorUndoBar || null; if (this.findController) { this.findController.onIsPageVisible = pageNumber => this._getVisiblePages().ids.has(pageNumber); } this._scriptingManager = options.scriptingManager || null; - this.#textLayerMode = options.textLayerMode ?? _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.TextLayerMode.ENABLE; - this.#annotationMode = options.annotationMode ?? pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationMode.ENABLE_FORMS; - this.#annotationEditorMode = options.annotationEditorMode ?? pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.NONE; + this.#textLayerMode = options.textLayerMode ?? TextLayerMode.ENABLE; + this.#annotationMode = options.annotationMode ?? AnnotationMode.ENABLE_FORMS; + this.#annotationEditorMode = options.annotationEditorMode ?? AnnotationEditorType.NONE; this.#annotationEditorHighlightColors = options.annotationEditorHighlightColors || null; this.#enableHighlightFloatingButton = options.enableHighlightFloatingButton === true; + this.#enableUpdatedAddImage = options.enableUpdatedAddImage === true; + this.#enableNewAltTextWhenAddingImage = options.enableNewAltTextWhenAddingImage === true; this.imageResourcesPath = options.imageResourcesPath || ""; this.enablePrintAutoRotate = options.enablePrintAutoRotate || false; this.removePageBorders = options.removePageBorders || false; this.maxCanvasPixels = options.maxCanvasPixels; + this.maxCanvasDim = options.maxCanvasDim; + this.capCanvasAreaFactor = options.capCanvasAreaFactor; + this.enableDetailCanvas = options.enableDetailCanvas ?? true; + this.enableOptimizedPartialRendering = options.enableOptimizedPartialRendering ?? false; + this.enableSelectionRendering = options.enableSelectionRendering !== false; + this.imagesRightClickMinSize = options.imagesRightClickMinSize ?? -1; this.l10n = options.l10n; - this.l10n ||= new web_null_l10n__WEBPACK_IMPORTED_MODULE_2__.GenericL10n(); + this.l10n ||= new genericl10n_GenericL10n(); this.#enablePermissions = options.enablePermissions || false; this.pageColors = options.pageColors || null; this.#mlManager = options.mlManager || null; + this.#supportsPinchToZoom = options.supportsPinchToZoom !== false; + this.#enableAutoLinking = options.enableAutoLinking !== false; + this.#minDurationToUpdateCanvas = options.minDurationToUpdateCanvas ?? 500; this.defaultRenderingQueue = !options.renderingQueue; if (this.defaultRenderingQueue) { - this.renderingQueue = new _pdf_rendering_queue_js__WEBPACK_IMPORTED_MODULE_4__.PDFRenderingQueue(); + this.renderingQueue = new PDFRenderingQueue(); this.renderingQueue.setViewer(this); } else { this.renderingQueue = options.renderingQueue; } - this.scroll = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.watchScroll)(this.container, this._scrollUpdate.bind(this)); - this.presentationModeState = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.PresentationModeState.UNKNOWN; - this._onBeforeDraw = this._onAfterDraw = null; + const { + abortSignal + } = options; + this.#abortSignal = abortSignal || null; + abortSignal?.addEventListener("abort", () => { + this.#resizeObserver.disconnect(); + this.#resizeObserver = null; + }, { + once: true + }); + this.scroll = watchScroll(this.container, this._scrollUpdate.bind(this), abortSignal); + this.presentationModeState = PresentationModeState.UNKNOWN; this._resetView(); if (this.removePageBorders) { this.viewer.classList.add("removePageBorders"); } this.#updateContainerHeightCss(); - this.eventBus._on("thumbnailrendered", ({ + this.eventBus.on("thumbnailrendered", ({ pageNumber, pdfPage }) => { @@ -11500,11 +14709,14 @@ if (!this.#buffer.has(pageView)) { pdfPage?.cleanup(); } - }); + }, internalOpt); if (!options.l10n) { this.l10n.translate(this.container); } } + get printingAllowed() { + return this.#printingAllowed; + } get pagesCount() { return this._pages.length; } @@ -11517,8 +14729,21 @@ get pageViewsReady() { return this._pages.every(pageView => pageView?.pdfPage); } + clearSelection() { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + return; + } + for (let i = 0, ii = selection.rangeCount; i < ii; i++) { + if (selection.getRangeAt(i).intersectsNode(this.viewer)) { + selection.removeAllRanges?.(); + selection.empty?.(); + return; + } + } + } get renderForms() { - return this.#annotationMode === pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationMode.ENABLE_FORMS; + return this.#annotationMode === AnnotationMode.ENABLE_FORMS; } get enableScripting() { return !!this._scriptingManager; @@ -11533,6 +14758,9 @@ if (!this.pdfDocument) { return; } + if (this._currentPageNumber !== val) { + this.clearSelection(); + } if (!this._setCurrentPageNumber(val, true)) { console.error(`currentPageNumber: "${val}" is not a valid page.`); } @@ -11574,12 +14802,15 @@ page = i + 1; } } + if (this._currentPageNumber !== page) { + this.clearSelection(); + } if (!this._setCurrentPageNumber(page, true)) { console.error(`currentPageLabel: "${val}" is not a valid page.`); } } get currentScale() { - return this._currentScale !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.UNKNOWN_SCALE ? this._currentScale : _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_SCALE; + return this._currentScale !== UNKNOWN_SCALE ? this._currentScale : DEFAULT_SCALE; } set currentScale(val) { if (isNaN(val)) { @@ -11607,7 +14838,7 @@ return this._pagesRotation; } set pagesRotation(rotation) { - if (!(0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.isValidRotation)(rotation)) { + if (!isValidRotation(rotation)) { throw new Error("Invalid pages rotation angle."); } if (!this.pdfDocument) { @@ -11620,6 +14851,7 @@ if (this._pagesRotation === rotation) { return; } + this.clearSelection(); this._pagesRotation = rotation; const pageNumber = this._currentPageNumber; this.refresh(true, { @@ -11650,7 +14882,7 @@ } get _layerProperties() { const self = this; - return (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.shadow)(this, "_layerProperties", { + return shadow(this, "_layerProperties", { get annotationEditorUIManager() { return self.#annotationEditorUIManager; }, @@ -11660,6 +14892,9 @@ get downloadManager() { return self.downloadManager; }, + get enableComment() { + return !!self.#commentManager; + }, get enableScripting() { return !!self._scriptingManager; }, @@ -11677,6 +14912,13 @@ } }); } + #setPrintingAllowed(isAllowed) { + this.#printingAllowed = isAllowed; + this.eventBus.dispatch("printingallowed", { + source: this, + isAllowed + }); + } #initializePermissions(permissions) { const params = { annotationEditorMode: this.#annotationEditorMode, @@ -11684,41 +14926,42 @@ textLayerMode: this.#textLayerMode }; if (!permissions) { + this.#setPrintingAllowed(true); return params; } - if (!permissions.includes(pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.PermissionFlag.COPY) && this.#textLayerMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.TextLayerMode.ENABLE) { - params.textLayerMode = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.TextLayerMode.ENABLE_PERMISSIONS; + this.#setPrintingAllowed(permissions.includes(PermissionFlag.PRINT_HIGH_QUALITY) || permissions.includes(PermissionFlag.PRINT)); + if (!permissions.includes(PermissionFlag.COPY) && this.#textLayerMode === TextLayerMode.ENABLE) { + params.textLayerMode = TextLayerMode.ENABLE_PERMISSIONS; } - if (!permissions.includes(pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.PermissionFlag.MODIFY_CONTENTS)) { - params.annotationEditorMode = pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.DISABLE; + if (!permissions.includes(PermissionFlag.MODIFY_CONTENTS)) { + params.annotationEditorMode = AnnotationEditorType.DISABLE; } - if (!permissions.includes(pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.PermissionFlag.MODIFY_ANNOTATIONS) && !permissions.includes(pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.PermissionFlag.FILL_INTERACTIVE_FORMS) && this.#annotationMode === pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationMode.ENABLE_FORMS) { - params.annotationMode = pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationMode.ENABLE; + if (!permissions.includes(PermissionFlag.MODIFY_ANNOTATIONS) && !permissions.includes(PermissionFlag.FILL_INTERACTIVE_FORMS) && this.#annotationMode === AnnotationMode.ENABLE_FORMS) { + params.annotationMode = AnnotationMode.ENABLE; } return params; } - async #onePageRenderedOrForceFetch() { + async #onePageRenderedOrForceFetch(signal) { if (document.visibilityState === "hidden" || !this.container.offsetParent || this._getVisiblePages().views.length === 0) { return; } - const visibilityChangePromise = new Promise(resolve => { - this.#onVisibilityChange = () => { - if (document.visibilityState !== "hidden") { - return; - } - resolve(); - }; - document.addEventListener("visibilitychange", this.#onVisibilityChange); + const hiddenCapability = Promise.withResolvers(), + ac = new AbortController(); + document.addEventListener("visibilitychange", () => { + if (document.visibilityState === "hidden") { + hiddenCapability.resolve(); + } + }, { + signal: AbortSignal.any([signal, ac.signal]) }); - await Promise.race([this._onePageRenderedCapability.promise, visibilityChangePromise]); - document.removeEventListener("visibilitychange", this.#onVisibilityChange); - this.#onVisibilityChange = null; + await Promise.race([this._onePageRenderedCapability.promise, hiddenCapability.promise]); + ac.abort(); } - async getAllText() { + async getAllText(interruptSignal = null) { const texts = []; const buffer = []; for (let pageNum = 1, pagesCount = this.pdfDocument.numPages; pageNum <= pagesCount; ++pageNum) { - if (this.#interruptCopyCondition) { + if (interruptSignal?.aborted) { return null; } buffer.length = 0; @@ -11734,7 +14977,7 @@ buffer.push("\n"); } } - texts.push((0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.removeNullCharacters)(buffer.join(""))); + texts.push(removeNullCharacters(buffer.join(""))); } return texts.join("\n"); } @@ -11745,30 +14988,36 @@ anchorNode } = selection; if (anchorNode && focusNode && selection.containsNode(this.#hiddenCopyElement)) { - if (this.#getAllTextInProgress || textLayerMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.TextLayerMode.ENABLE_PERMISSIONS) { - event.preventDefault(); - event.stopPropagation(); + if (this.#copyAllInProgress || textLayerMode === TextLayerMode.ENABLE_PERMISSIONS) { + stopEvent(event); return; } - this.#getAllTextInProgress = true; - const savedCursor = this.container.style.cursor; - this.container.style.cursor = "wait"; - const interruptCopy = ev => this.#interruptCopyCondition = ev.key === "Escape"; - window.addEventListener("keydown", interruptCopy); - this.getAllText().then(async text => { + this.#copyAllInProgress = true; + const { + classList + } = this.viewer; + classList.add("copyAll"); + const keydownAC = new AbortController(), + interruptAC = new AbortController(); + window.addEventListener("keydown", ev => { + if (ev.key === "Escape") { + interruptAC.abort(); + } + }, { + signal: keydownAC.signal + }); + this.getAllText(interruptAC.signal).then(async text => { if (text !== null) { await navigator.clipboard.writeText(text); } }).catch(reason => { console.warn(`Something goes wrong when extracting the text: ${reason.message}`); }).finally(() => { - this.#getAllTextInProgress = false; - this.#interruptCopyCondition = false; - window.removeEventListener("keydown", interruptCopy); - this.container.style.cursor = savedCursor; + this.#copyAllInProgress = false; + keydownAC.abort(); + classList.remove("copyAll"); }); - event.preventDefault(); - event.stopPropagation(); + stopEvent(event); } } setDocument(pdfDocument) { @@ -11780,10 +15029,10 @@ this._resetView(); this.findController?.setDocument(null); this._scriptingManager?.setDocument(null); - if (this.#annotationEditorUIManager) { - this.#annotationEditorUIManager.destroy(); - this.#annotationEditorUIManager = null; - } + this.#annotationEditorUIManager?.destroy(); + this.#annotationEditorUIManager = null; + this.#annotationEditorMode = AnnotationEditorType.NONE; + this.#printingAllowed = true; } this.pdfDocument = pdfDocument; if (!pdfDocument) { @@ -11795,39 +15044,51 @@ intent: "display" }); const permissionsPromise = this.#enablePermissions ? pdfDocument.getPermissions() : Promise.resolve(); + const { + eventBus, + pageColors, + viewer + } = this; + this.#eventAC = new AbortController(); + const { + signal + } = this.#eventAC; + const evtOpts = { + signal, + ...internalOpt + }; if (pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE) { console.warn("Forcing PAGE-scrolling for performance reasons, given the length of the document."); - const mode = this._scrollMode = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.PAGE; - this.eventBus.dispatch("scrollmodechanged", { + const mode = this._scrollMode = ScrollMode.PAGE; + eventBus.dispatch("scrollmodechanged", { source: this, mode }); } this._pagesCapability.promise.then(() => { - this.eventBus.dispatch("pagesloaded", { + eventBus.dispatch("pagesloaded", { source: this, pagesCount }); }, () => {}); - this._onBeforeDraw = evt => { + const onBeforeDraw = evt => { const pageView = this._pages[evt.pageNumber - 1]; if (!pageView) { return; } this.#buffer.push(pageView); }; - this.eventBus._on("pagerender", this._onBeforeDraw); - this._onAfterDraw = evt => { - if (evt.cssTransform) { + eventBus.on("pagerender", onBeforeDraw, evtOpts); + const onAfterDraw = evt => { + if (evt.cssTransform || evt.isDetailView) { return; } this._onePageRenderedCapability.resolve({ timestamp: evt.timestamp }); - this.eventBus._off("pagerendered", this._onAfterDraw); - this._onAfterDraw = null; + eventBus.off("pagerendered", onAfterDraw); }; - this.eventBus._on("pagerendered", this._onAfterDraw); + eventBus.on("pagerendered", onAfterDraw, evtOpts); Promise.all([firstPagePromise, permissionsPromise]).then(([firstPdfPage, permissions]) => { if (pdfDocument !== this.pdfDocument) { return; @@ -11839,42 +15100,47 @@ annotationMode, textLayerMode } = this.#initializePermissions(permissions); - if (textLayerMode !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.TextLayerMode.DISABLE) { + if (textLayerMode !== TextLayerMode.DISABLE) { const element = this.#hiddenCopyElement = document.createElement("div"); element.id = "hiddenCopyElement"; - this.viewer.before(element); + element.style.cssText = "position:absolute;top:0;left:0;width:0;height:0;display:none"; + viewer.before(element); } - if (annotationEditorMode !== pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.DISABLE) { + if (annotationEditorMode !== AnnotationEditorType.DISABLE) { const mode = annotationEditorMode; if (pdfDocument.isPureXfa) { console.warn("Warning: XFA-editing is not implemented."); } else if (isValidAnnotationEditorMode(mode)) { - this.#annotationEditorUIManager = new pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorUIManager(this.container, this.viewer, this.#altTextManager, this.eventBus, pdfDocument, this.pageColors, this.#annotationEditorHighlightColors, this.#enableHighlightFloatingButton, this.#mlManager); - this.eventBus.dispatch("annotationeditoruimanager", { + this.#annotationEditorUIManager = new AnnotationEditorUIManager(this.container, viewer, this.#viewerAlert, this.#altTextManager, this.#commentManager, this.#signatureManager, eventBus, pdfDocument, pageColors, this.#annotationEditorHighlightColors, this.#enableHighlightFloatingButton, this.#enableUpdatedAddImage, this.#enableNewAltTextWhenAddingImage, this.#mlManager, this.#editorUndoBar, this.#supportsPinchToZoom); + eventBus.dispatch("annotationeditoruimanager", { source: this, uiManager: this.#annotationEditorUIManager }); - if (mode !== pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.NONE) { + if (mode !== AnnotationEditorType.NONE) { + this.#preloadEditingData(mode); this.#annotationEditorUIManager.updateMode(mode); } } else { console.error(`Invalid AnnotationEditor mode: ${mode}`); } } - const viewerElement = this._scrollMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.PAGE ? null : this.viewer; + const viewerElement = this._scrollMode === ScrollMode.PAGE ? null : viewer; const scale = this.currentScale; const viewport = firstPdfPage.getViewport({ - scale: scale * pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.PixelsPerInch.PDF_TO_CSS_UNITS + scale: scale * PixelsPerInch.PDF_TO_CSS_UNITS }); - this.viewer.style.setProperty("--scale-factor", viewport.scale); - if (this.pageColors?.foreground === "CanvasText" || this.pageColors?.background === "Canvas") { - this.viewer.style.setProperty("--hcm-highlight-filter", pdfDocument.filterFactory.addHighlightHCMFilter("highlight", "CanvasText", "Canvas", "HighlightText", "Highlight")); - this.viewer.style.setProperty("--hcm-highlight-selected-filter", pdfDocument.filterFactory.addHighlightHCMFilter("highlight_selected", "CanvasText", "Canvas", "HighlightText", "ButtonText")); + viewer.style.setProperty("--scale-factor", viewport.scale); + if (pageColors?.background) { + viewer.style.setProperty("--page-bg-color", pageColors.background); + } + if (pageColors?.foreground === "CanvasText" || pageColors?.background === "Canvas") { + viewer.style.setProperty("--hcm-highlight-filter", pdfDocument.filterFactory.addHighlightHCMFilter("highlight", "CanvasText", "Canvas", "HighlightText", "Highlight")); + viewer.style.setProperty("--hcm-highlight-selected-filter", pdfDocument.filterFactory.addHighlightHCMFilter("highlight_selected", "CanvasText", "Canvas", "HighlightText", "ButtonText")); } for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) { - const pageView = new _pdf_page_view_js__WEBPACK_IMPORTED_MODULE_3__.PDFPageView({ + const pageView = new PDFPageView({ container: viewerElement, - eventBus: this.eventBus, + eventBus, id: pageNum, scale, defaultViewport: viewport.clone(), @@ -11884,35 +15150,51 @@ annotationMode, imageResourcesPath: this.imageResourcesPath, maxCanvasPixels: this.maxCanvasPixels, - pageColors: this.pageColors, + maxCanvasDim: this.maxCanvasDim, + capCanvasAreaFactor: this.capCanvasAreaFactor, + enableDetailCanvas: this.enableDetailCanvas, + enableOptimizedPartialRendering: this.enableOptimizedPartialRendering, + enableSelectionRendering: this.enableSelectionRendering, + imagesRightClickMinSize: this.imagesRightClickMinSize, + pageColors, l10n: this.l10n, - layerProperties: this._layerProperties + layerProperties: this._layerProperties, + enableAutoLinking: this.#enableAutoLinking, + minDurationToUpdateCanvas: this.#minDurationToUpdateCanvas, + commentManager: this.#commentManager, + abortSignal: this.#abortSignal }); this._pages.push(pageView); } - const firstPageView = this._pages[0]; - if (firstPageView) { - firstPageView.setPdfPage(firstPdfPage); - this.linkService.cachePageRef(1, firstPdfPage.ref); - } - if (this._scrollMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.PAGE) { + this._pages[0]?.setPdfPage(firstPdfPage); + if (this._scrollMode === ScrollMode.PAGE) { this.#ensurePageViewVisible(); - } else if (this._spreadMode !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.SpreadMode.NONE) { + } else if (this._spreadMode !== SpreadMode.NONE) { this._updateSpreadMode(); } - this.#onePageRenderedOrForceFetch().then(async () => { - this.findController?.setDocument(pdfDocument); - this._scriptingManager?.setDocument(pdfDocument); - if (this.#hiddenCopyElement) { - this.#copyCallbackBound = this.#copyCallback.bind(this, textLayerMode); - document.addEventListener("copy", this.#copyCallbackBound); - } + eventBus.on("annotationeditorlayerrendered", evt => { if (this.#annotationEditorUIManager) { - this.eventBus.dispatch("annotationeditormodechanged", { + eventBus.dispatch("annotationeditormodechanged", { source: this, mode: this.#annotationEditorMode }); } + }, { + once: true, + signal, + ...internalOpt + }); + this.#onePageRenderedOrForceFetch(signal).then(async () => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.findController?.setDocument(pdfDocument); + this._scriptingManager?.setDocument(pdfDocument); + if (this.#hiddenCopyElement) { + document.addEventListener("copy", this.#copyCallback.bind(this, textLayerMode), { + signal + }); + } if (pdfDocument.loadingParams.disableAutoFetch || pagesCount > PagesCountLimit.FORCE_LAZY_PAGE_INIT) { this._pagesCapability.resolve(); return; @@ -11928,7 +15210,6 @@ if (!pageView.pdfPage) { pageView.setPdfPage(pdfPage); } - this.linkService.cachePageRef(pageNum, pdfPage.ref); if (--getPagesLeft === 0) { this._pagesCapability.resolve(); } @@ -11943,7 +15224,7 @@ } } }); - this.eventBus.dispatch("pagesinit", { + eventBus.dispatch("pagesinit", { source: this }); pdfDocument.getMetadata().then(({ @@ -11953,7 +15234,7 @@ return; } if (info.Language) { - this.viewer.lang = info.Language; + viewer.lang = info.Language; } }); if (this.defaultRenderingQueue) { @@ -11964,6 +15245,100 @@ this._pagesCapability.reject(reason); }); } + onPagesEdited({ + pagesMapper, + type, + hasBeenCut, + pageNumbers + }) { + if (type === "copy") { + this.#copiedPageViews = new Map(); + for (const pageNum of pageNumbers) { + this.#copiedPageViews.set(pageNum, this._pages[pageNum - 1]); + } + return; + } + if (type === "cancelCopy") { + this.#copiedPageViews = null; + return; + } + const isCut = type === "cut"; + if (isCut || type === "delete") { + this.#savedPageViews = this._pages; + this.#deletedPageNumbers = pageNumbers; + } + if (type === "cancelDelete") { + this.#deletedPageNumbers = null; + if (!this.#savedPageViews) { + return; + } + const viewerElement = this._scrollMode === ScrollMode.PAGE ? null : this.viewer; + if (viewerElement) { + this.#annotationEditorUIManager?.startUpdatePages(); + const fragment = document.createDocumentFragment(); + for (let i = 0, ii = this.#savedPageViews.length; i < ii; i++) { + const page = this.#savedPageViews[i]; + page.updatePageNumber(i + 1); + fragment.append(page.div); + } + viewerElement.replaceChildren(fragment); + this.#annotationEditorUIManager?.endUpdatePages(); + } + this._pages = this.#savedPageViews; + this.#savedPageViews = null; + return; + } + if (type === "cleanSavedData") { + if (this.#deletedPageNumbers) { + if (this.#savedPageViews) { + for (const pageNum of this.#deletedPageNumbers) { + this.#savedPageViews[pageNum - 1].deleteMe(); + } + this.#savedPageViews = null; + } + this.#deletedPageNumbers = null; + } + return; + } + this._currentPageNumber = 0; + const prevPages = this._pages; + const newPages = this._pages = []; + this.#annotationEditorUIManager?.startUpdatePages(); + for (let i = 1, ii = pagesMapper.pagesNumber; i <= ii; i++) { + const prevPageNumber = pagesMapper.getPrevPageNumber(i); + if (prevPageNumber < 0) { + let page = this.#copiedPageViews.get(-prevPageNumber); + if (hasBeenCut) { + page.updatePageNumber(i); + } else { + this.#annotationEditorUIManager?.clonePage(-prevPageNumber - 1, i - 1); + page = page.clone(i); + } + newPages.push(page); + continue; + } + const page = prevPages[prevPageNumber - 1]; + newPages.push(page); + page.updatePageNumber(i); + } + this.#annotationEditorUIManager?.endUpdatePages(); + if (type === "paste") { + this.#copiedPageViews = null; + } + const viewerElement = this._scrollMode === ScrollMode.PAGE ? null : this.viewer; + if (viewerElement) { + const fragment = document.createDocumentFragment(); + for (const { + div + } of newPages) { + fragment.append(div); + } + viewerElement.replaceChildren(fragment); + } + setTimeout(() => { + this.forceRendering(); + }); + } setPageLabels(labels) { if (!this.pdfDocument) { return; @@ -11983,7 +15358,7 @@ _resetView() { this._pages = []; this._currentPageNumber = 1; - this._currentScale = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.UNKNOWN_SCALE; + this._currentScale = UNKNOWN_SCALE; this._currentScaleValue = null; this._pageLabels = null; this.#buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE); @@ -11993,38 +15368,26 @@ this._firstPageCapability = Promise.withResolvers(); this._onePageRenderedCapability = Promise.withResolvers(); this._pagesCapability = Promise.withResolvers(); - this._scrollMode = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.VERTICAL; - this._previousScrollMode = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.UNKNOWN; - this._spreadMode = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.SpreadMode.NONE; + this._scrollMode = ScrollMode.VERTICAL; + this._previousScrollMode = ScrollMode.UNKNOWN; + this._spreadMode = SpreadMode.NONE; this.#scrollModePageState = { previousPageNumber: 1, scrollDown: true, pages: [] }; - if (this._onBeforeDraw) { - this.eventBus._off("pagerender", this._onBeforeDraw); - this._onBeforeDraw = null; - } - if (this._onAfterDraw) { - this.eventBus._off("pagerendered", this._onAfterDraw); - this._onAfterDraw = null; - } - if (this.#onVisibilityChange) { - document.removeEventListener("visibilitychange", this.#onVisibilityChange); - this.#onVisibilityChange = null; - } + this.#eventAC?.abort(); + this.#eventAC = null; this.viewer.textContent = ""; this._updateScrollMode(); this.viewer.removeAttribute("lang"); - if (this.#hiddenCopyElement) { - document.removeEventListener("copy", this.#copyCallbackBound); - this.#copyCallbackBound = null; - this.#hiddenCopyElement.remove(); - this.#hiddenCopyElement = null; - } + this.#hiddenCopyElement?.remove(); + this.#hiddenCopyElement = null; + this.#cleanupTimeouts(); + this.#cleanupSwitchAnnotationEditorMode(); } #ensurePageViewVisible() { - if (this._scrollMode !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.PAGE) { + if (this._scrollMode !== ScrollMode.PAGE) { throw new Error("#ensurePageViewVisible: Invalid scrollMode value."); } const pageNumber = this._currentPageNumber, @@ -12032,7 +15395,7 @@ viewer = this.viewer; viewer.textContent = ""; state.pages.length = 0; - if (this._spreadMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.SpreadMode.NONE && !this.isInPresentationMode) { + if (this._spreadMode === SpreadMode.NONE && !this.isInPresentationMode) { const pageView = this._pages[pageNumber - 1]; viewer.append(pageView.div); state.pages.push(pageView); @@ -12072,6 +15435,13 @@ if (this.pagesCount === 0) { return; } + if (this.#scrollTimeoutId) { + clearTimeout(this.#scrollTimeoutId); + } + this.#scrollTimeoutId = setTimeout(() => { + this.#scrollTimeoutId = null; + this.update(); + }, 100); this.update(); } #scrollIntoView(pageView, pageSpot = null) { @@ -12082,7 +15452,7 @@ if (this._currentPageNumber !== id) { this._setCurrentPageNumber(id); } - if (this._scrollMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.PAGE) { + if (this._scrollMode === ScrollMode.PAGE) { this.#ensurePageViewVisible(); this.update(); } @@ -12093,14 +15463,14 @@ scrollLeft, clientWidth } = this.container; - if (this._scrollMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.HORIZONTAL || left < scrollLeft || right > scrollLeft + clientWidth) { + if (this._scrollMode === ScrollMode.HORIZONTAL || left < scrollLeft || right > scrollLeft + clientWidth) { pageSpot = { left: 0, top: 0 }; } } - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.scrollIntoView)(div, pageSpot); + scrollIntoView(div, pageSpot); if (!this._currentScaleValue && this._location) { this._location = null; } @@ -12111,8 +15481,10 @@ #setScaleUpdatePages(newScale, newValue, { noScroll = false, preset = false, - drawingDelay = -1 + drawingDelay = -1, + origin = null }) { + this.clearSelection(); this._currentScaleValue = newValue.toString(); if (this.#isSameScale(newScale)) { if (preset) { @@ -12124,7 +15496,7 @@ } return; } - this.viewer.style.setProperty("--scale-factor", newScale * pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.PixelsPerInch.PDF_TO_CSS_UNITS); + this.viewer.style.setProperty("--scale-factor", newScale * PixelsPerInch.PDF_TO_CSS_UNITS); const postponeDrawing = drawingDelay >= 0 && drawingDelay < 1000; this.refresh(true, { scale: newScale, @@ -12136,6 +15508,7 @@ this.refresh(); }, drawingDelay); } + const previousScale = this._currentScale; this._currentScale = newScale; if (!noScroll) { let page = this._currentPageNumber, @@ -12151,6 +15524,12 @@ destArray: dest, allowNegativeOffset: true }); + if (Array.isArray(origin)) { + const scaleDiff = newScale / previousScale - 1; + const [top, left] = this.containerTopLeft; + this.container.scrollLeft += (origin[0] - left) * scaleDiff; + this.container.scrollTop += (origin[1] - top) * scaleDiff; + } } this.eventBus.dispatch("scalechanging", { source: this, @@ -12162,7 +15541,7 @@ } } get #pageWidthScaleFactor() { - if (this._spreadMode !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.SpreadMode.NONE && this._scrollMode !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.HORIZONTAL) { + if (this._spreadMode !== SpreadMode.NONE && this._scrollMode !== ScrollMode.HORIZONTAL) { return 2; } return 1; @@ -12177,16 +15556,16 @@ if (!currentPage) { return; } - let hPadding = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.SCROLLBAR_PADDING, - vPadding = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.VERTICAL_PADDING; + let hPadding = SCROLLBAR_PADDING, + vPadding = VERTICAL_PADDING; if (this.isInPresentationMode) { hPadding = vPadding = 4; - if (this._spreadMode !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.SpreadMode.NONE) { + if (this._spreadMode !== SpreadMode.NONE) { hPadding *= 2; } } else if (this.removePageBorders) { hPadding = vPadding = 0; - } else if (this._scrollMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.HORIZONTAL) { + } else if (this._scrollMode === ScrollMode.HORIZONTAL) { [hPadding, vPadding] = [vPadding, hPadding]; } const pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale / this.#pageWidthScaleFactor; @@ -12205,8 +15584,8 @@ scale = Math.min(pageWidthScale, pageHeightScale); break; case "auto": - const horizontalScale = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPortraitOrientation)(currentPage) ? pageWidthScale : Math.min(pageHeightScale, pageWidthScale); - scale = Math.min(_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.MAX_AUTO_SCALE, horizontalScale); + const horizontalScale = isPortraitOrientation(currentPage) ? pageWidthScale : Math.min(pageHeightScale, pageWidthScale); + scale = Math.min(MAX_AUTO_SCALE, horizontalScale); break; default: console.error(`#setScale: "${value}" is an unknown zoom value.`); @@ -12239,7 +15618,8 @@ pageNumber, destArray = null, allowNegativeOffset = false, - ignoreDestinationZoom = false + ignoreDestinationZoom = false, + center = null }) { if (!this.pdfDocument) { return; @@ -12260,8 +15640,8 @@ widthScale, heightScale; const changeOrientation = pageView.rotation % 180 !== 0; - const pageWidth = (changeOrientation ? pageView.height : pageView.width) / pageView.scale / pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.PixelsPerInch.PDF_TO_CSS_UNITS; - const pageHeight = (changeOrientation ? pageView.width : pageView.height) / pageView.scale / pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.PixelsPerInch.PDF_TO_CSS_UNITS; + const pageWidth = (changeOrientation ? pageView.height : pageView.width) / pageView.scale / PixelsPerInch.PDF_TO_CSS_UNITS; + const pageHeight = (changeOrientation ? pageView.width : pageView.height) / pageView.scale / PixelsPerInch.PDF_TO_CSS_UNITS; let scale = 0; switch (destArray[1].name) { case "XYZ": @@ -12298,13 +15678,13 @@ y = destArray[3]; width = destArray[4] - x; height = destArray[5] - y; - let hPadding = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.SCROLLBAR_PADDING, - vPadding = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.VERTICAL_PADDING; + let hPadding = SCROLLBAR_PADDING, + vPadding = VERTICAL_PADDING; if (this.removePageBorders) { hPadding = vPadding = 0; } - widthScale = (this.container.clientWidth - hPadding) / width / pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.PixelsPerInch.PDF_TO_CSS_UNITS; - heightScale = (this.container.clientHeight - vPadding) / height / pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.PixelsPerInch.PDF_TO_CSS_UNITS; + widthScale = (this.container.clientWidth - hPadding) / width / PixelsPerInch.PDF_TO_CSS_UNITS; + heightScale = (this.container.clientHeight - vPadding) / height / PixelsPerInch.PDF_TO_CSS_UNITS; scale = Math.min(Math.abs(widthScale), Math.abs(heightScale)); break; default: @@ -12314,8 +15694,8 @@ if (!ignoreDestinationZoom) { if (scale && scale !== this._currentScale) { this.currentScaleValue = scale; - } else if (this._currentScale === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.UNKNOWN_SCALE) { - this.currentScaleValue = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_SCALE_VALUE; + } else if (this._currentScale === UNKNOWN_SCALE) { + this.currentScaleValue = DEFAULT_SCALE_VALUE; } } if (scale === "page-fit" && !destArray[4]) { @@ -12325,7 +15705,14 @@ const boundingRect = [pageView.viewport.convertToViewportPoint(x, y), pageView.viewport.convertToViewportPoint(x + width, y + height)]; let left = Math.min(boundingRect[0][0], boundingRect[1][0]); let top = Math.min(boundingRect[0][1], boundingRect[1][1]); - if (!allowNegativeOffset) { + if (center) { + if (center === "both" || center === "vertical") { + top -= (this.container.clientHeight - Math.abs(boundingRect[1][1] - boundingRect[0][1])) / 2; + } + if (center === "both" || center === "horizontal") { + left -= (this.container.clientWidth - Math.abs(boundingRect[1][0] - boundingRect[0][0])) / 2; + } + } else if (!allowNegativeOffset) { left = Math.max(left, 0); top = Math.max(top, 0); } @@ -12366,26 +15753,65 @@ } const newCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * numVisiblePages + 1); this.#buffer.resize(newCacheSize, visible.ids); + for (const { + view, + visibleArea + } of visiblePages) { + view.updateVisibleArea(visibleArea); + } + for (const view of this.#buffer) { + if (!visible.ids.has(view.id)) { + view.updateVisibleArea(null); + } + } this.renderingQueue.renderHighestPriority(visible); - const isSimpleLayout = this._spreadMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.SpreadMode.NONE && (this._scrollMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.PAGE || this._scrollMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.VERTICAL); - const currentId = this._currentPageNumber; + const isSimpleLayout = this._spreadMode === SpreadMode.NONE && (this._scrollMode === ScrollMode.PAGE || this._scrollMode === ScrollMode.VERTICAL); + const currentPageNumber = this._currentPageNumber; let stillFullyVisible = false; for (const page of visiblePages) { if (page.percent < 100) { break; } - if (page.id === currentId && isSimpleLayout) { + if (page.id === currentPageNumber && isSimpleLayout) { stillFullyVisible = true; break; } } - this._setCurrentPageNumber(stillFullyVisible ? currentId : visiblePages[0].id); + this._setCurrentPageNumber(stillFullyVisible ? this._currentPageNumber : visiblePages[0].id); this._updateLocation(visible.first); this.eventBus.dispatch("updateviewarea", { source: this, location: this._location }); } + #switchToEditAnnotationMode() { + const visible = this._getVisiblePages(); + const pagesToRefresh = []; + const { + ids, + views + } = visible; + for (const page of views) { + const { + view + } = page; + if (!view.hasEditableAnnotations()) { + ids.delete(view.id); + continue; + } + pagesToRefresh.push(page); + } + if (pagesToRefresh.length === 0) { + return null; + } + this.renderingQueue.renderHighestPriority({ + first: pagesToRefresh[0], + last: pagesToRefresh.at(-1), + views: pagesToRefresh, + ids + }); + return ids; + } containsElement(element) { return this.container.contains(element); } @@ -12396,10 +15822,10 @@ return getComputedStyle(this.container).direction === "rtl"; } get isInPresentationMode() { - return this.presentationModeState === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.PresentationModeState.FULLSCREEN; + return this.presentationModeState === PresentationModeState.FULLSCREEN; } get isChangingPresentationMode() { - return this.presentationModeState === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.PresentationModeState.CHANGING; + return this.presentationModeState === PresentationModeState.CHANGING; } get isHorizontalScrollbarEnabled() { return this.isInPresentationMode ? false : this.container.scrollWidth > this.container.clientWidth; @@ -12408,10 +15834,10 @@ return this.isInPresentationMode ? false : this.container.scrollHeight > this.container.clientHeight; } _getVisiblePages() { - const views = this._scrollMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.PAGE ? this.#scrollModePageState.pages : this._pages, - horizontal = this._scrollMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.HORIZONTAL, + const views = this._scrollMode === ScrollMode.PAGE ? this.#scrollModePageState.pages : this._pages, + horizontal = this._scrollMode === ScrollMode.HORIZONTAL, rtl = horizontal && this._isContainerRtl; - return (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.getVisibleElements)({ + return getVisibleElements({ scrollEl: this.container, views, sortByVisibility: true, @@ -12421,7 +15847,7 @@ } cleanup() { for (const pageView of this._pages) { - if (pageView.renderingState !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.RenderingStates.FINISHED) { + if (pageView.renderingState !== RenderingStates.FINISHED) { pageView.reset(); } } @@ -12440,9 +15866,6 @@ if (!pageView.pdfPage) { pageView.setPdfPage(pdfPage); } - if (!this.linkService._cachedPageNumber?.(pdfPage.ref)) { - this.linkService.cachePageRef(pageView.id, pdfPage.ref); - } return pdfPage; } catch (reason) { console.error("Unable to get page for page view", reason); @@ -12456,9 +15879,9 @@ return false; } switch (this._scrollMode) { - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.PAGE: + case ScrollMode.PAGE: return this.#scrollModePageState.scrollDown; - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.HORIZONTAL: + case ScrollMode.HORIZONTAL: return this.scroll.right; } return this.scroll.down; @@ -12466,8 +15889,9 @@ forceRendering(currentlyVisiblePages) { const visiblePages = currentlyVisiblePages || this._getVisiblePages(); const scrollAhead = this.#getScrollAhead(visiblePages); - const preRenderExtra = this._spreadMode !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.SpreadMode.NONE && this._scrollMode !== _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.HORIZONTAL; - const pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, scrollAhead, preRenderExtra); + const preRenderExtra = this._spreadMode !== SpreadMode.NONE && this._scrollMode !== ScrollMode.HORIZONTAL; + const ignoreDetailViews = this.#scaleTimeoutId !== null || this.#scrollTimeoutId !== null && visiblePages.views.some(page => page.detailView?.renderingCancelled); + const pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, scrollAhead, preRenderExtra, ignoreDetailViews); if (pageView) { this.#ensurePdfPageLoaded(pageView).then(() => { this.renderingQueue.renderView(pageView); @@ -12492,7 +15916,7 @@ const viewport = pageView.pdfPage.getViewport({ scale: 1 }); - const orientation = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.isPortraitOrientation)(viewport); + const orientation = isPortraitOrientation(viewport); if (initialOrientation === undefined) { initialOrientation = orientation; } else if (this.enablePrintAutoRotate && orientation !== initialOrientation) { @@ -12547,13 +15971,14 @@ if (this._scrollMode === mode) { return; } - if (!(0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.isValidScrollMode)(mode)) { + if (!isValidScrollMode(mode)) { throw new Error(`Invalid scroll mode: ${mode}`); } if (this.pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE) { return; } this._previousScrollMode = this._scrollMode; + this.clearSelection(); this._scrollMode = mode; this.eventBus.dispatch("scrollmodechanged", { source: this, @@ -12564,14 +15989,14 @@ _updateScrollMode(pageNumber = null) { const scrollMode = this._scrollMode, viewer = this.viewer; - viewer.classList.toggle("scrollHorizontal", scrollMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.HORIZONTAL); - viewer.classList.toggle("scrollWrapped", scrollMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.WRAPPED); + viewer.classList.toggle("scrollHorizontal", scrollMode === ScrollMode.HORIZONTAL); + viewer.classList.toggle("scrollWrapped", scrollMode === ScrollMode.WRAPPED); if (!this.pdfDocument || !pageNumber) { return; } - if (scrollMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.PAGE) { + if (scrollMode === ScrollMode.PAGE) { this.#ensurePageViewVisible(); - } else if (this._previousScrollMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.PAGE) { + } else if (this._previousScrollMode === ScrollMode.PAGE) { this._updateSpreadMode(); } if (this._currentScaleValue && isNaN(this._currentScaleValue)) { @@ -12589,9 +16014,10 @@ if (this._spreadMode === mode) { return; } - if (!(0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.isValidSpreadMode)(mode)) { + if (!isValidSpreadMode(mode)) { throw new Error(`Invalid spread mode: ${mode}`); } + this.clearSelection(); this._spreadMode = mode; this.eventBus.dispatch("spreadmodechanged", { source: this, @@ -12605,11 +16031,11 @@ } const viewer = this.viewer, pages = this._pages; - if (this._scrollMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.PAGE) { + if (this._scrollMode === ScrollMode.PAGE) { this.#ensurePageViewVisible(); } else { viewer.textContent = ""; - if (this._spreadMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.SpreadMode.NONE) { + if (this._spreadMode === SpreadMode.NONE) { for (const pageView of this._pages) { viewer.append(pageView.div); } @@ -12640,9 +16066,9 @@ this._setCurrentPageNumber(pageNumber, true); this.update(); } - _getPageAdvance(currentPageNumber, previous = false) { + #getPageAdvance(currentPageNumber, previous = false) { switch (this._scrollMode) { - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.WRAPPED: + case ScrollMode.WRAPPED: { const { views @@ -12657,11 +16083,7 @@ if (percent === 0 || widthPercent < 100) { continue; } - let yArray = pageLayout.get(y); - if (!yArray) { - pageLayout.set(y, yArray ||= []); - } - yArray.push(id); + pageLayout.getOrInsertComputed(y, makeArr).push(id); } for (const yArray of pageLayout.values()) { const currentIndex = yArray.indexOf(currentPageNumber); @@ -12704,14 +16126,14 @@ } break; } - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.HORIZONTAL: + case ScrollMode.HORIZONTAL: { break; } - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.PAGE: - case _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.ScrollMode.VERTICAL: + case ScrollMode.PAGE: + case ScrollMode.VERTICAL: { - if (this._spreadMode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.SpreadMode.NONE) { + if (this._spreadMode === SpreadMode.NONE) { break; } const parity = this._spreadMode - 1; @@ -12748,7 +16170,7 @@ if (currentPageNumber >= pagesCount) { return false; } - const advance = this._getPageAdvance(currentPageNumber, false) || 1; + const advance = this.#getPageAdvance(currentPageNumber, false) || 1; this.currentPageNumber = Math.min(currentPageNumber + advance, pagesCount); return true; } @@ -12757,58 +16179,56 @@ if (currentPageNumber <= 1) { return false; } - const advance = this._getPageAdvance(currentPageNumber, true) || 1; + const advance = this.#getPageAdvance(currentPageNumber, true) || 1; this.currentPageNumber = Math.max(currentPageNumber - advance, 1); return true; } - increaseScale({ + updateScale({ drawingDelay, - scaleFactor, - steps - } = {}) { + scaleFactor = null, + steps = null, + origin + }) { + if (steps === null && scaleFactor === null) { + throw new Error("Invalid updateScale options: either `steps` or `scaleFactor` must be provided."); + } if (!this.pdfDocument) { return; } let newScale = this._currentScale; - if (scaleFactor > 1) { + if (scaleFactor > 0 && scaleFactor !== 1) { newScale = Math.round(newScale * scaleFactor * 100) / 100; - } else { - steps ??= 1; + } else if (steps) { + const delta = steps > 0 ? DEFAULT_SCALE_DELTA : 1 / DEFAULT_SCALE_DELTA; + const round = steps > 0 ? Math.ceil : Math.floor; + steps = Math.abs(steps); do { - newScale = Math.ceil((newScale * _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_SCALE_DELTA).toFixed(2) * 10) / 10; - } while (--steps > 0 && newScale < _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.MAX_SCALE); + newScale = round((newScale * delta).toFixed(2) * 10) / 10; + } while (--steps > 0); } - this.#setScale(Math.min(_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.MAX_SCALE, newScale), { + newScale = MathClamp(newScale, MIN_SCALE, MAX_SCALE); + this.#setScale(newScale, { noScroll: false, - drawingDelay + drawingDelay, + origin }); } - decreaseScale({ - drawingDelay, - scaleFactor, - steps - } = {}) { - if (!this.pdfDocument) { - return; - } - let newScale = this._currentScale; - if (scaleFactor > 0 && scaleFactor < 1) { - newScale = Math.round(newScale * scaleFactor * 100) / 100; - } else { - steps ??= 1; - do { - newScale = Math.floor((newScale / _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_SCALE_DELTA).toFixed(2) * 10) / 10; - } while (--steps > 0 && newScale > _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.MIN_SCALE); - } - this.#setScale(Math.max(_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.MIN_SCALE, newScale), { - noScroll: false, - drawingDelay + increaseScale(options = {}) { + this.updateScale({ + ...options, + steps: options.steps ?? 1 + }); + } + decreaseScale(options = {}) { + this.updateScale({ + ...options, + steps: -(options.steps ?? 1) }); } #updateContainerHeightCss(height = this.container.clientHeight) { if (height !== this.#previousContainerHeight) { this.#previousContainerHeight = height; - _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.docStyle.setProperty("--viewer-container-height", `${height}px`); + docStyle.setProperty("--viewer-container-height", `${height}px`); } } #resizeObserverCallback(entries) { @@ -12823,13 +16243,43 @@ get containerTopLeft() { return this.#containerTopLeft ||= [this.container.offsetTop, this.container.offsetLeft]; } + #cleanupTimeouts() { + if (this.#scaleTimeoutId !== null) { + clearTimeout(this.#scaleTimeoutId); + this.#scaleTimeoutId = null; + } + if (this.#scrollTimeoutId !== null) { + clearTimeout(this.#scrollTimeoutId); + this.#scrollTimeoutId = null; + } + } + #cleanupSwitchAnnotationEditorMode() { + this.#switchAnnotationEditorModeAC?.abort(); + this.#switchAnnotationEditorModeAC = null; + if (this.#switchAnnotationEditorModeTimeoutId !== null) { + clearTimeout(this.#switchAnnotationEditorModeTimeoutId); + this.#switchAnnotationEditorModeTimeoutId = null; + } + } + #preloadEditingData(mode) { + switch (mode) { + case AnnotationEditorType.STAMP: + this.#mlManager?.loadModel("altText"); + break; + case AnnotationEditorType.SIGNATURE: + this.#signatureManager?.loadSignatures(); + break; + } + } get annotationEditorMode() { - return this.#annotationEditorUIManager ? this.#annotationEditorMode : pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.DISABLE; + return this.#annotationEditorUIManager ? this.#annotationEditorMode : AnnotationEditorType.DISABLE; } set annotationEditorMode({ mode, editId = null, - isFromKeyboard = false + isFromKeyboard = false, + mustEnterInEditMode = false, + editComment = false }) { if (!this.#annotationEditorUIManager) { throw new Error(`The AnnotationEditor is not enabled.`); @@ -12843,21 +16293,52 @@ if (!this.pdfDocument) { return; } - this.#annotationEditorMode = mode; - this.eventBus.dispatch("annotationeditormodechanged", { - source: this, - mode - }); - this.#annotationEditorUIManager.updateMode(mode, editId, isFromKeyboard); - } - set annotationEditorParams({ - type, - value - }) { - if (!this.#annotationEditorUIManager) { - throw new Error(`The AnnotationEditor is not enabled.`); + this.#preloadEditingData(mode); + const { + eventBus, + pdfDocument + } = this; + const updater = async () => { + this.#cleanupSwitchAnnotationEditorMode(); + this.#annotationEditorMode = mode; + await this.#annotationEditorUIManager.updateMode(mode, editId, true, isFromKeyboard, mustEnterInEditMode, editComment); + if (mode !== this.#annotationEditorMode || pdfDocument !== this.pdfDocument) { + return; + } + eventBus.dispatch("annotationeditormodechanged", { + source: this, + mode + }); + }; + if (mode === AnnotationEditorType.NONE || this.#annotationEditorMode === AnnotationEditorType.NONE) { + const isEditing = mode !== AnnotationEditorType.NONE; + if (!isEditing) { + this.pdfDocument.annotationStorage.resetModifiedIds(); + } + this.cleanup(); + for (const pageView of this._pages) { + pageView.toggleEditingMode(isEditing); + } + const idsToRefresh = this.#switchToEditAnnotationMode(); + if (isEditing && idsToRefresh) { + this.#cleanupSwitchAnnotationEditorMode(); + this.#switchAnnotationEditorModeAC = new AbortController(); + const signal = AbortSignal.any([this.#eventAC.signal, this.#switchAnnotationEditorModeAC.signal]); + eventBus.on("pagerendered", ({ + pageNumber + }) => { + idsToRefresh.delete(pageNumber); + if (idsToRefresh.size === 0) { + this.#switchAnnotationEditorModeTimeoutId = setTimeout(updater, 0); + } + }, { + signal, + ...internalOpt + }); + return; + } } - this.#annotationEditorUIManager.updateParams(type, value); + updater(); } refresh(noUpdate = false, updateArgs = Object.create(null)) { if (!this.pdfDocument) { @@ -12866,317 +16347,15 @@ for (const pageView of this._pages) { pageView.update(updateArgs); } - if (this.#scaleTimeoutId !== null) { - clearTimeout(this.#scaleTimeoutId); - this.#scaleTimeoutId = null; - } + this.#cleanupTimeouts(); if (!noUpdate) { this.update(); } } } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), - -/***/ 2603: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ AbortException: () => (/* binding */ AbortException), -/* harmony export */ AnnotationEditorLayer: () => (/* binding */ AnnotationEditorLayer), -/* harmony export */ AnnotationEditorParamsType: () => (/* binding */ AnnotationEditorParamsType), -/* harmony export */ AnnotationEditorType: () => (/* binding */ AnnotationEditorType), -/* harmony export */ AnnotationEditorUIManager: () => (/* binding */ AnnotationEditorUIManager), -/* harmony export */ AnnotationLayer: () => (/* binding */ AnnotationLayer), -/* harmony export */ AnnotationMode: () => (/* binding */ AnnotationMode), -/* harmony export */ ColorPicker: () => (/* binding */ ColorPicker), -/* harmony export */ DOMSVGFactory: () => (/* binding */ DOMSVGFactory), -/* harmony export */ DrawLayer: () => (/* binding */ DrawLayer), -/* harmony export */ FeatureTest: () => (/* binding */ FeatureTest), -/* harmony export */ GlobalWorkerOptions: () => (/* binding */ GlobalWorkerOptions), -/* harmony export */ InvalidPDFException: () => (/* binding */ InvalidPDFException), -/* harmony export */ MissingPDFException: () => (/* binding */ MissingPDFException), -/* harmony export */ PDFDateString: () => (/* binding */ PDFDateString), -/* harmony export */ PDFWorker: () => (/* binding */ PDFWorker), -/* harmony export */ PasswordResponses: () => (/* binding */ PasswordResponses), -/* harmony export */ PermissionFlag: () => (/* binding */ PermissionFlag), -/* harmony export */ PixelsPerInch: () => (/* binding */ PixelsPerInch), -/* harmony export */ RenderingCancelledException: () => (/* binding */ RenderingCancelledException), -/* harmony export */ UnexpectedResponseException: () => (/* binding */ UnexpectedResponseException), -/* harmony export */ XfaLayer: () => (/* binding */ XfaLayer), -/* harmony export */ build: () => (/* binding */ build), -/* harmony export */ createValidAbsoluteUrl: () => (/* binding */ createValidAbsoluteUrl), -/* harmony export */ fetchData: () => (/* binding */ fetchData), -/* harmony export */ getDocument: () => (/* binding */ getDocument), -/* harmony export */ getFilenameFromUrl: () => (/* binding */ getFilenameFromUrl), -/* harmony export */ getPdfFilenameFromUrl: () => (/* binding */ getPdfFilenameFromUrl), -/* harmony export */ getXfaPageViewport: () => (/* binding */ getXfaPageViewport), -/* harmony export */ isDataScheme: () => (/* binding */ isDataScheme), -/* harmony export */ isPdfFile: () => (/* binding */ isPdfFile), -/* harmony export */ noContextMenu: () => (/* binding */ noContextMenu), -/* harmony export */ normalizeUnicode: () => (/* binding */ normalizeUnicode), -/* harmony export */ renderTextLayer: () => (/* binding */ renderTextLayer), -/* harmony export */ setLayerDimensions: () => (/* binding */ setLayerDimensions), -/* harmony export */ shadow: () => (/* binding */ shadow), -/* harmony export */ updateTextLayer: () => (/* binding */ updateTextLayer), -/* harmony export */ version: () => (/* binding */ version) -/* harmony export */ }); -/* unused harmony exports CMapCompressionType, ImageKind, OPS, Outliner, PDFDataRangeTransport, Util, VerbosityLevel */ -if (!globalThis.pdfjsLib) { - await globalThis.pdfjsLibPromise; -} -const { - AbortException, - AnnotationEditorLayer, - AnnotationEditorParamsType, - AnnotationEditorType, - AnnotationEditorUIManager, - AnnotationLayer, - AnnotationMode, - build, - CMapCompressionType, - ColorPicker, - createValidAbsoluteUrl, - DOMSVGFactory, - DrawLayer, - FeatureTest, - fetchData, - getDocument, - getFilenameFromUrl, - getPdfFilenameFromUrl, - getXfaPageViewport, - GlobalWorkerOptions, - ImageKind, - InvalidPDFException, - isDataScheme, - isPdfFile, - MissingPDFException, - noContextMenu, - normalizeUnicode, - OPS, - Outliner, - PasswordResponses, - PDFDataRangeTransport, - PDFDateString, - PDFWorker, - PermissionFlag, - PixelsPerInch, - RenderingCancelledException, - renderTextLayer, - setLayerDimensions, - shadow, - UnexpectedResponseException, - updateTextLayer, - Util, - VerbosityLevel, - version, - XfaLayer -} = globalThis.pdfjsLib; - -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }, 1); - -/***/ }), - -/***/ 8224: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ BasePreferences: () => (/* binding */ BasePreferences) -/* harmony export */ }); -/* harmony import */ var _app_options_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9840); - -class BasePreferences { - #browserDefaults = Object.freeze({ - canvasMaxAreaInBytes: -1, - isInAutomation: false, - supportsCaretBrowsingMode: false, - supportsDocumentFonts: true, - supportsIntegratedFind: false, - supportsMouseWheelZoomCtrlKey: true, - supportsMouseWheelZoomMetaKey: true, - supportsPinchToZoom: true - }); - #defaults = Object.freeze({ - annotationEditorMode: 0, - annotationMode: 2, - cursorToolOnLoad: 0, - defaultZoomDelay: 400, - defaultZoomValue: "", - disablePageLabels: false, - enableHighlightEditor: false, - enableHighlightFloatingButton: false, - enableML: false, - enablePermissions: false, - enablePrintAutoRotate: true, - enableScripting: true, - enableStampEditor: true, - externalLinkTarget: 0, - highlightEditorColors: "yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F", - historyUpdateUrl: false, - ignoreDestinationZoom: false, - forcePageColors: false, - pageColorsBackground: "Canvas", - pageColorsForeground: "CanvasText", - pdfBugEnabled: false, - sidebarViewOnLoad: -1, - scrollModeOnLoad: -1, - spreadModeOnLoad: -1, - textLayerMode: 1, - viewOnLoad: 0, - disableAutoFetch: false, - disableFontFace: false, - disableRange: false, - disableStream: false, - enableXfa: true, - viewerCssTheme: 0 - }); - #prefs = Object.create(null); - #initializedPromise = null; - constructor() { - if (this.constructor === BasePreferences) { - throw new Error("Cannot initialize BasePreferences."); - } - this.#initializedPromise = this._readFromStorage(this.#defaults).then(({ - browserPrefs, - prefs - }) => { - const options = Object.create(null); - for (const [name, val] of Object.entries(this.#browserDefaults)) { - const prefVal = browserPrefs?.[name]; - options[name] = typeof prefVal === typeof val ? prefVal : val; - } - for (const [name, val] of Object.entries(this.#defaults)) { - const prefVal = prefs?.[name]; - options[name] = this.#prefs[name] = typeof prefVal === typeof val ? prefVal : val; - } - _app_options_js__WEBPACK_IMPORTED_MODULE_0__.AppOptions.setAll(options, true); - }); - } - async _writeToStorage(prefObj) { - throw new Error("Not implemented: _writeToStorage"); - } - async _readFromStorage(prefObj) { - throw new Error("Not implemented: _readFromStorage"); - } - #updatePref({ - name, - value - }) { - throw new Error("Not implemented: #updatePref"); - } - async reset() { - await this.#initializedPromise; - const oldPrefs = structuredClone(this.#prefs); - this.#prefs = Object.create(null); - try { - await this._writeToStorage(this.#defaults); - } catch (reason) { - this.#prefs = oldPrefs; - throw reason; - } - } - async set(name, value) { - await this.#initializedPromise; - const defaultValue = this.#defaults[name], - oldPrefs = structuredClone(this.#prefs); - if (defaultValue === undefined) { - throw new Error(`Set preference: "${name}" is undefined.`); - } else if (value === undefined) { - throw new Error("Set preference: no value is specified."); - } - const valueType = typeof value, - defaultType = typeof defaultValue; - if (valueType !== defaultType) { - if (valueType === "number" && defaultType === "string") { - value = value.toString(); - } else { - throw new Error(`Set preference: "${value}" is a ${valueType}, expected a ${defaultType}.`); - } - } else if (valueType === "number" && !Number.isInteger(value)) { - throw new Error(`Set preference: "${value}" must be an integer.`); - } - this.#prefs[name] = value; - try { - await this._writeToStorage(this.#prefs); - } catch (reason) { - this.#prefs = oldPrefs; - throw reason; - } - } - async get(name) { - await this.#initializedPromise; - const defaultValue = this.#defaults[name]; - if (defaultValue === undefined) { - throw new Error(`Get preference: "${name}" is undefined.`); - } - return this.#prefs[name] ?? defaultValue; - } - get initializedPromise() { - return this.#initializedPromise; - } -} - - -/***/ }), - -/***/ 659: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ getXfaHtmlForPrinting: () => (/* binding */ getXfaHtmlForPrinting) -/* harmony export */ }); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2603); -/* harmony import */ var _pdf_link_service_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(787); -/* harmony import */ var _xfa_layer_builder_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2973); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__, _xfa_layer_builder_js__WEBPACK_IMPORTED_MODULE_2__]); -([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__, _xfa_layer_builder_js__WEBPACK_IMPORTED_MODULE_2__] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__); - - - -function getXfaHtmlForPrinting(printContainer, pdfDocument) { - const xfaHtml = pdfDocument.allXfaHtml; - const linkService = new _pdf_link_service_js__WEBPACK_IMPORTED_MODULE_1__.SimpleLinkService(); - const scale = Math.round(pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.PixelsPerInch.PDF_TO_CSS_UNITS * 100) / 100; - for (const xfaPage of xfaHtml.children) { - const page = document.createElement("div"); - page.className = "xfaPrintedPage"; - printContainer.append(page); - const builder = new _xfa_layer_builder_js__WEBPACK_IMPORTED_MODULE_2__.XfaLayerBuilder({ - pdfPage: null, - annotationStorage: pdfDocument.annotationStorage, - linkService, - xfaHtml: xfaPage - }); - const viewport = (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.getXfaPageViewport)(xfaPage, { - scale - }); - builder.render(viewport, "print"); - page.append(builder.div); - } -} - -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), - -/***/ 1900: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { +;// ./web/secondary_toolbar.js -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ SecondaryToolbar: () => (/* binding */ SecondaryToolbar) -/* harmony export */ }); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7256); -/* harmony import */ var _pdf_viewer_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6285); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_pdf_viewer_js__WEBPACK_IMPORTED_MODULE_1__]); -_pdf_viewer_js__WEBPACK_IMPORTED_MODULE_1__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; class SecondaryToolbar { @@ -13219,66 +16398,70 @@ element: options.cursorSelectToolButton, eventName: "switchcursortool", eventDetails: { - tool: _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.CursorTool.SELECT + tool: CursorTool.SELECT }, close: true }, { element: options.cursorHandToolButton, eventName: "switchcursortool", eventDetails: { - tool: _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.CursorTool.HAND + tool: CursorTool.HAND }, close: true }, { element: options.scrollPageButton, eventName: "switchscrollmode", eventDetails: { - mode: _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.ScrollMode.PAGE + mode: ScrollMode.PAGE }, close: true }, { element: options.scrollVerticalButton, eventName: "switchscrollmode", eventDetails: { - mode: _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.ScrollMode.VERTICAL + mode: ScrollMode.VERTICAL }, close: true }, { element: options.scrollHorizontalButton, eventName: "switchscrollmode", eventDetails: { - mode: _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.ScrollMode.HORIZONTAL + mode: ScrollMode.HORIZONTAL }, close: true }, { element: options.scrollWrappedButton, eventName: "switchscrollmode", eventDetails: { - mode: _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.ScrollMode.WRAPPED + mode: ScrollMode.WRAPPED }, close: true }, { element: options.spreadNoneButton, eventName: "switchspreadmode", eventDetails: { - mode: _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SpreadMode.NONE + mode: SpreadMode.NONE }, close: true }, { element: options.spreadOddButton, eventName: "switchspreadmode", eventDetails: { - mode: _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SpreadMode.ODD + mode: SpreadMode.ODD }, close: true }, { element: options.spreadEvenButton, eventName: "switchspreadmode", eventDetails: { - mode: _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SpreadMode.EVEN + mode: SpreadMode.EVEN }, close: true }, { + element: options.imageAltTextSettingsButton, + eventName: "imagealttextsettings", + close: true + }, { element: options.documentPropertiesButton, eventName: "documentproperties", close: true @@ -13308,11 +16491,15 @@ this.pageNumber = 0; this.pagesCount = 0; this.#updateUIState(); + this.eventBus.dispatch("switchcursortool", { + source: this, + reset: true + }); this.#scrollModeChanged({ - mode: _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.ScrollMode.VERTICAL + mode: ScrollMode.VERTICAL }); this.#spreadModeChanged({ - mode: _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SpreadMode.NONE + mode: SpreadMode.NONE }); } #updateUIState() { @@ -13362,19 +16549,22 @@ }); }); } - eventBus._on("cursortoolchanged", this.#cursorToolChanged.bind(this)); - eventBus._on("scrollmodechanged", this.#scrollModeChanged.bind(this)); - eventBus._on("spreadmodechanged", this.#spreadModeChanged.bind(this)); + eventBus.on("cursortoolchanged", this.#cursorToolChanged.bind(this), internalOpt); + eventBus.on("scrollmodechanged", this.#scrollModeChanged.bind(this), internalOpt); + eventBus.on("spreadmodechanged", this.#spreadModeChanged.bind(this), internalOpt); } #cursorToolChanged({ - tool + tool, + disabled }) { const { cursorSelectToolButton, cursorHandToolButton } = this.#opts; - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.toggleCheckedBtn)(cursorSelectToolButton, tool === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.CursorTool.SELECT); - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.toggleCheckedBtn)(cursorHandToolButton, tool === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.CursorTool.HAND); + toggleCheckedBtn(cursorSelectToolButton, tool === CursorTool.SELECT); + toggleCheckedBtn(cursorHandToolButton, tool === CursorTool.HAND); + cursorSelectToolButton.disabled = disabled; + cursorHandToolButton.disabled = disabled; } #scrollModeChanged({ mode @@ -13388,16 +16578,16 @@ spreadOddButton, spreadEvenButton } = this.#opts; - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.toggleCheckedBtn)(scrollPageButton, mode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.ScrollMode.PAGE); - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.toggleCheckedBtn)(scrollVerticalButton, mode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.ScrollMode.VERTICAL); - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.toggleCheckedBtn)(scrollHorizontalButton, mode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.ScrollMode.HORIZONTAL); - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.toggleCheckedBtn)(scrollWrappedButton, mode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.ScrollMode.WRAPPED); - const forceScrollModePage = this.pagesCount > _pdf_viewer_js__WEBPACK_IMPORTED_MODULE_1__.PagesCountLimit.FORCE_SCROLL_MODE_PAGE; + toggleCheckedBtn(scrollPageButton, mode === ScrollMode.PAGE); + toggleCheckedBtn(scrollVerticalButton, mode === ScrollMode.VERTICAL); + toggleCheckedBtn(scrollHorizontalButton, mode === ScrollMode.HORIZONTAL); + toggleCheckedBtn(scrollWrappedButton, mode === ScrollMode.WRAPPED); + const forceScrollModePage = this.pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE; scrollPageButton.disabled = forceScrollModePage; scrollVerticalButton.disabled = forceScrollModePage; scrollHorizontalButton.disabled = forceScrollModePage; scrollWrappedButton.disabled = forceScrollModePage; - const isHorizontal = mode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.ScrollMode.HORIZONTAL; + const isHorizontal = mode === ScrollMode.HORIZONTAL; spreadNoneButton.disabled = isHorizontal; spreadOddButton.disabled = isHorizontal; spreadEvenButton.disabled = isHorizontal; @@ -13410,9 +16600,9 @@ spreadOddButton, spreadEvenButton } = this.#opts; - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.toggleCheckedBtn)(spreadNoneButton, mode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SpreadMode.NONE); - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.toggleCheckedBtn)(spreadOddButton, mode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SpreadMode.ODD); - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.toggleCheckedBtn)(spreadEvenButton, mode === _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SpreadMode.EVEN); + toggleCheckedBtn(spreadNoneButton, mode === SpreadMode.NONE); + toggleCheckedBtn(spreadOddButton, mode === SpreadMode.ODD); + toggleCheckedBtn(spreadEvenButton, mode === SpreadMode.EVEN); } open() { if (this.opened) { @@ -13423,7 +16613,7 @@ toggleButton, toolbar } = this.#opts; - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.toggleExpandedBtn)(toggleButton, true, toolbar); + toggleExpandedBtn(toggleButton, true, toolbar); } close() { if (!this.opened) { @@ -13434,7 +16624,7 @@ toggleButton, toolbar } = this.#opts; - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.toggleExpandedBtn)(toggleButton, false, toolbar); + toggleExpandedBtn(toggleButton, false, toolbar); } toggle() { if (this.opened) { @@ -13445,703 +16635,907 @@ } } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); +;// ./web/signature_manager.js -/***/ }), -/***/ 6698: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ StructTreeLayerBuilder: () => (/* binding */ StructTreeLayerBuilder) -/* harmony export */ }); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7256); - -const PDF_ROLE_TO_HTML_ROLE = { - Document: null, - DocumentFragment: null, - Part: "group", - Sect: "group", - Div: "group", - Aside: "note", - NonStruct: "none", - P: null, - H: "heading", - Title: null, - FENote: "note", - Sub: "group", - Lbl: null, - Span: null, - Em: null, - Strong: null, - Link: "link", - Annot: "note", - Form: "form", - Ruby: null, - RB: null, - RT: null, - RP: null, - Warichu: null, - WT: null, - WP: null, - L: "list", - LI: "listitem", - LBody: null, - Table: "table", - TR: "row", - TH: "columnheader", - TD: "cell", - THead: "columnheader", - TBody: null, - TFoot: null, - Caption: null, - Figure: "figure", - Formula: null, - Artifact: null -}; -const HEADING_PATTERN = /^H(\d+)$/; -class StructTreeLayerBuilder { - #treeDom = undefined; - get renderingDone() { - return this.#treeDom !== undefined; - } - render(structTree) { - if (this.#treeDom !== undefined) { - return this.#treeDom; - } - const treeDom = this.#walk(structTree); - treeDom?.classList.add("structTree"); - return this.#treeDom = treeDom; - } - hide() { - if (this.#treeDom && !this.#treeDom.hidden) { - this.#treeDom.hidden = true; - } - } - show() { - if (this.#treeDom?.hidden) { - this.#treeDom.hidden = false; - } - } - #setAttributes(structElement, htmlElement) { - const { - alt, - id, - lang - } = structElement; - if (alt !== undefined) { - htmlElement.setAttribute("aria-label", (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.removeNullCharacters)(alt)); - } - if (id !== undefined) { - htmlElement.setAttribute("aria-owns", id); - } - if (lang !== undefined) { - htmlElement.setAttribute("lang", (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.removeNullCharacters)(lang, true)); - } - } - #walk(node) { - if (!node) { - return null; - } - const element = document.createElement("span"); - if ("role" in node) { +const DEFAULT_HEIGHT_IN_PAGE = 40; +class SignatureManager { + #addButton; + #tabsToAltText = null; + #clearButton; + #clearDescription; + #currentEditor; + #description; + #dialog; + #drawCurves = null; + #drawPlaceholder; + #drawPath = null; + #drawPathString = ""; + #drawPoints = null; + #drawSVG; + #drawThickness; + #errorBar; + #errorDescription; + #errorTitle; + #extractedSignatureData = null; + #imagePath = null; + #imagePicker; + #imagePickerLink; + #imagePlaceholder; + #imageSVG; + #saveCheckbox; + #saveContainer; + #tabButtons; + #addSignatureToolbarButton; + #loadSignaturesPromise = null; + #typeInput; + #currentTab = null; + #currentTabAC = null; + #hasDescriptionChanged = false; + #eventBus; + #isStorageFull = false; + #l10n; + #overlayManager; + #editDescriptionDialog; + #signatureStorage; + #uiManager = null; + static #l10nDescription = null; + constructor({ + dialog, + panels, + typeButton, + typeInput, + drawButton, + drawPlaceholder, + drawSVG, + drawThickness, + imageButton, + imageSVG, + imagePlaceholder, + imagePicker, + imagePickerLink, + description, + clearButton, + cancelButton, + addButton, + errorCloseButton, + errorBar, + errorTitle, + errorDescription, + saveCheckbox, + saveContainer + }, editSignatureElements, addSignatureToolbarButton, overlayManager, l10n, signatureStorage, eventBus) { + this.#addButton = addButton; + this.#clearButton = clearButton; + this.#clearDescription = description.lastElementChild; + this.#description = description.firstElementChild; + this.#dialog = dialog; + this.#drawSVG = drawSVG; + this.#drawPlaceholder = drawPlaceholder; + this.#drawThickness = drawThickness; + this.#errorBar = errorBar; + this.#errorTitle = errorTitle; + this.#errorDescription = errorDescription; + this.#imageSVG = imageSVG; + this.#imagePlaceholder = imagePlaceholder; + this.#imagePicker = imagePicker; + this.#imagePickerLink = imagePickerLink; + this.#overlayManager = overlayManager; + this.#saveCheckbox = saveCheckbox; + this.#saveContainer = saveContainer; + this.#addSignatureToolbarButton = addSignatureToolbarButton; + this.#typeInput = typeInput; + this.#l10n = l10n; + this.#signatureStorage = signatureStorage; + this.#eventBus = eventBus; + this.#editDescriptionDialog = new EditDescriptionDialog(editSignatureElements, overlayManager); + SignatureManager.#l10nDescription ||= Object.freeze({ + signature: "pdfjs-editor-add-signature-description-default-when-drawing", + errorUploadTitle: "pdfjs-editor-add-signature-image-upload-error-title", + errorUploadDescription: "pdfjs-editor-add-signature-image-upload-error-description", + errorNoDataTitle: "pdfjs-editor-add-signature-image-no-data-error-title", + errorNoDataDescription: "pdfjs-editor-add-signature-image-no-data-error-description" + }); + dialog.addEventListener("close", this.#close.bind(this)); + dialog.addEventListener("contextmenu", e => { const { - role - } = node; - const match = role.match(HEADING_PATTERN); - if (match) { - element.setAttribute("role", "heading"); - element.setAttribute("aria-level", match[1]); - } else if (PDF_ROLE_TO_HTML_ROLE[role]) { - element.setAttribute("role", PDF_ROLE_TO_HTML_ROLE[role]); + target + } = e; + if (target !== this.#typeInput && target !== this.#description) { + e.preventDefault(); } - } - this.#setAttributes(node, element); - if (node.children) { - if (node.children.length === 1 && "id" in node.children[0]) { - this.#setAttributes(node.children[0], element); - } else { - for (const kid of node.children) { - element.append(this.#walk(kid)); + }); + dialog.addEventListener("drop", e => { + stopEvent(e); + }); + cancelButton.addEventListener("click", this.#cancel.bind(this)); + addButton.addEventListener("click", this.#add.bind(this)); + clearButton.addEventListener("click", () => { + this.#reportTelemetry({ + type: "signature", + action: "pdfjs.signature.clear", + data: { + type: this.#currentTab } - } - } - return element; - } -} - - -/***/ }), - -/***/ 5860: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ TextAccessibilityManager: () => (/* binding */ TextAccessibilityManager) -/* harmony export */ }); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7256); - -class TextAccessibilityManager { - #enabled = false; - #textChildren = null; - #textNodes = new Map(); - #waitingElements = new Map(); - setTextMapping(textDivs) { - this.#textChildren = textDivs; - } - static #compareElementPositions(e1, e2) { - const rect1 = e1.getBoundingClientRect(); - const rect2 = e2.getBoundingClientRect(); - if (rect1.width === 0 && rect1.height === 0) { - return +1; - } - if (rect2.width === 0 && rect2.height === 0) { - return -1; - } - const top1 = rect1.y; - const bot1 = rect1.y + rect1.height; - const mid1 = rect1.y + rect1.height / 2; - const top2 = rect2.y; - const bot2 = rect2.y + rect2.height; - const mid2 = rect2.y + rect2.height / 2; - if (mid1 <= top2 && mid2 >= bot1) { - return -1; - } - if (mid2 <= top1 && mid1 >= bot2) { - return +1; - } - const centerX1 = rect1.x + rect1.width / 2; - const centerX2 = rect2.x + rect2.width / 2; - return centerX1 - centerX2; - } - enable() { - if (this.#enabled) { - throw new Error("TextAccessibilityManager is already enabled."); - } - if (!this.#textChildren) { - throw new Error("Text divs and strings have not been set."); - } - this.#enabled = true; - this.#textChildren = this.#textChildren.slice(); - this.#textChildren.sort(TextAccessibilityManager.#compareElementPositions); - if (this.#textNodes.size > 0) { - const textChildren = this.#textChildren; - for (const [id, nodeIndex] of this.#textNodes) { - const element = document.getElementById(id); - if (!element) { - this.#textNodes.delete(id); - continue; + }); + this.#initTab(null); + }, { + passive: true + }); + this.#description.addEventListener("input", () => { + this.#clearDescription.disabled = this.#description.value === ""; + }, { + passive: true + }); + this.#clearDescription.addEventListener("click", () => { + this.#description.value = ""; + this.#clearDescription.disabled = true; + }, { + passive: true + }); + errorCloseButton.addEventListener("click", () => { + errorBar.hidden = true; + }, { + passive: true + }); + this.#initTabButtons(typeButton, drawButton, imageButton, panels); + imagePicker.accept = SupportedImageMimeTypes.join(","); + eventBus.on("storedsignatureschanged", this.#signaturesChanged.bind(this), internalOpt); + overlayManager.register(dialog); + } + #initTabButtons(typeButton, drawButton, imageButton, panels) { + const buttons = this.#tabButtons = new Map([["type", typeButton], ["draw", drawButton], ["image", imageButton]]); + const tabCallback = e => { + for (const [name, button] of buttons) { + if (button === e.target) { + button.setAttribute("aria-selected", true); + button.setAttribute("tabindex", 0); + panels.setAttribute("data-selected", name); + this.#initTab(name); + } else { + button.setAttribute("aria-selected", false); + button.setAttribute("tabindex", -1); } - this.#addIdToAriaOwns(id, textChildren[nodeIndex]); } + }; + const buttonsArray = Array.from(buttons.values()); + for (let i = 0, ii = buttonsArray.length; i < ii; i++) { + const button = buttonsArray[i]; + button.addEventListener("click", tabCallback, { + passive: true + }); + button.addEventListener("keydown", ({ + key + }) => { + if (key !== "ArrowLeft" && key !== "ArrowRight") { + return; + } + buttonsArray[i + (key === "ArrowLeft" ? -1 : 1)]?.focus(); + }, { + passive: true + }); } - for (const [element, isRemovable] of this.#waitingElements) { - this.addPointerInTextLayer(element, isRemovable); - } - this.#waitingElements.clear(); - } - disable() { - if (!this.#enabled) { - return; - } - this.#waitingElements.clear(); - this.#textChildren = null; - this.#enabled = false; } - removePointerInTextLayer(element) { - if (!this.#enabled) { - this.#waitingElements.delete(element); - return; - } - const children = this.#textChildren; - if (!children || children.length === 0) { - return; - } - const { - id - } = element; - const nodeIndex = this.#textNodes.get(id); - if (nodeIndex === undefined) { - return; - } - const node = children[nodeIndex]; - this.#textNodes.delete(id); - let owns = node.getAttribute("aria-owns"); - if (owns?.includes(id)) { - owns = owns.split(" ").filter(x => x !== id).join(" "); - if (owns) { - node.setAttribute("aria-owns", owns); - } else { - node.removeAttribute("aria-owns"); - node.setAttribute("role", "presentation"); - } + #resetCommon() { + this.#hasDescriptionChanged = false; + this.#description.value = ""; + if (this.#currentTab) { + this.#tabsToAltText.get(this.#currentTab).value = ""; } } - #addIdToAriaOwns(id, node) { - const owns = node.getAttribute("aria-owns"); - if (!owns?.includes(id)) { - node.setAttribute("aria-owns", owns ? `${owns} ${id}` : id); + #resetTab(name) { + switch (name) { + case "type": + this.#typeInput.value = ""; + break; + case "draw": + this.#drawCurves = null; + this.#drawPoints = null; + this.#drawPathString = ""; + this.#drawPath?.remove(); + this.#drawPath = null; + this.#drawPlaceholder.hidden = false; + this.#drawThickness.value = 1; + break; + case "image": + this.#imagePlaceholder.hidden = false; + this.#imagePath?.remove(); + this.#imagePath = null; + break; } - node.removeAttribute("role"); } - addPointerInTextLayer(element, isRemovable) { - const { - id - } = element; - if (!id) { - return null; - } - if (!this.#enabled) { - this.#waitingElements.set(element, isRemovable); - return null; - } - if (isRemovable) { - this.removePointerInTextLayer(element); - } - const children = this.#textChildren; - if (!children || children.length === 0) { - return null; + #initTab(name) { + if (name && this.#currentTab === name) { + return; } - const index = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.binarySearchFirstItem)(children, node => TextAccessibilityManager.#compareElementPositions(element, node) < 0); - const nodeIndex = Math.max(0, index - 1); - const child = children[nodeIndex]; - this.#addIdToAriaOwns(id, child); - this.#textNodes.set(id, nodeIndex); - const parent = child.parentNode; - return parent?.classList.contains("markedContent") ? parent.id : null; - } - moveElementInDOM(container, element, contentElement, isRemovable) { - const id = this.addPointerInTextLayer(contentElement, isRemovable); - if (!container.hasChildNodes()) { - container.append(element); - return id; + if (this.#currentTab) { + this.#tabsToAltText.get(this.#currentTab).value = this.#description.value; } - const children = Array.from(container.childNodes).filter(node => node !== element); - if (children.length === 0) { - return id; + if (name) { + this.#currentTab = name; } - const elementToCompare = contentElement || element; - const index = (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.binarySearchFirstItem)(children, node => TextAccessibilityManager.#compareElementPositions(elementToCompare, node) < 0); - if (index === 0) { - children[0].before(element); + this.#errorBar.hidden = true; + const reset = !name; + if (reset) { + this.#resetCommon(); } else { - children[index - 1].after(element); - } - return id; - } -} - - -/***/ }), - -/***/ 2027: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ TextHighlighter: () => (/* binding */ TextHighlighter) -/* harmony export */ }); -class TextHighlighter { - constructor({ - findController, - eventBus, - pageIndex - }) { - this.findController = findController; - this.matches = []; - this.eventBus = eventBus; - this.pageIdx = pageIndex; - this._onUpdateTextLayerMatches = null; - this.textDivs = null; - this.textContentItemsStr = null; - this.enabled = false; - } - setTextMapping(divs, texts) { - this.textDivs = divs; - this.textContentItemsStr = texts; - } - enable() { - if (!this.textDivs || !this.textContentItemsStr) { - throw new Error("Text divs and strings have not been set."); - } - if (this.enabled) { - throw new Error("TextHighlighter is already enabled."); + this.#description.value = this.#tabsToAltText.get(this.#currentTab).value; } - this.enabled = true; - if (!this._onUpdateTextLayerMatches) { - this._onUpdateTextLayerMatches = evt => { - if (evt.pageIndex === this.pageIdx || evt.pageIndex === -1) { - this._updateMatches(); - } - }; - this.eventBus._on("updatetextlayermatches", this._onUpdateTextLayerMatches); + this.#clearDescription.disabled = this.#description.value === ""; + this.#currentTabAC?.abort(); + this.#currentTabAC = new AbortController(); + switch (this.#currentTab) { + case "type": + this.#initTypeTab(reset); + break; + case "draw": + this.#initDrawTab(reset); + break; + case "image": + this.#initImageTab(reset); + break; } - this._updateMatches(); } - disable() { - if (!this.enabled) { - return; + #disableButtons(value) { + if (!value || !this.#isStorageFull) { + this.#saveCheckbox.disabled = !value; } - this.enabled = false; - if (this._onUpdateTextLayerMatches) { - this.eventBus._off("updatetextlayermatches", this._onUpdateTextLayerMatches); - this._onUpdateTextLayerMatches = null; + this.#clearButton.disabled = this.#addButton.disabled = this.#description.disabled = !value; + } + #initTypeTab(reset) { + if (reset) { + this.#resetTab("type"); } - this._updateMatches(true); + this.#disableButtons(this.#typeInput.value); + const { + signal + } = this.#currentTabAC; + const options = { + passive: true, + signal + }; + this.#typeInput.addEventListener("input", () => { + const { + value + } = this.#typeInput; + if (!this.#hasDescriptionChanged) { + this.#tabsToAltText.get("type").default = this.#description.value = value; + this.#clearDescription.disabled = value === ""; + } + this.#disableButtons(value); + }, options); + this.#description.addEventListener("input", () => { + this.#hasDescriptionChanged = this.#typeInput.value !== this.#description.value; + }, options); } - _convertMatches(matches, matchesLength) { - if (!matches) { - return []; + #initDrawTab(reset) { + if (reset) { + this.#resetTab("draw"); } + this.#disableButtons(this.#drawPath); const { - textContentItemsStr - } = this; - let i = 0, - iIndex = 0; - const end = textContentItemsStr.length - 1; - const result = []; - for (let m = 0, mm = matches.length; m < mm; m++) { - let matchIdx = matches[m]; - while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) { - iIndex += textContentItemsStr[i].length; - i++; - } - if (i === textContentItemsStr.length) { - console.error("Could not find a matching mapping"); + signal + } = this.#currentTabAC; + const options = { + signal + }; + let currentPointerId = NaN; + const drawCallback = e => { + const { + pointerId + } = e; + if (!isNaN(currentPointerId) && currentPointerId !== pointerId) { + return; } - const match = { - begin: { - divIdx: i, - offset: matchIdx - iIndex + currentPointerId = pointerId; + e.preventDefault(); + this.#drawSVG.setPointerCapture(pointerId); + const { + width: drawWidth, + height: drawHeight + } = this.#drawSVG.getBoundingClientRect(); + let { + offsetX, + offsetY + } = e; + offsetX = Math.round(offsetX); + offsetY = Math.round(offsetY); + if (e.target === this.#drawPlaceholder) { + this.#drawPlaceholder.hidden = true; + } + if (!this.#drawCurves) { + this.#drawCurves = { + width: drawWidth, + height: drawHeight, + thickness: parseInt(this.#drawThickness.value, 10), + curves: [] + }; + this.#disableButtons(true); + const svgFactory = new DOMSVGFactory(); + const path = this.#drawPath = svgFactory.createElement("path"); + path.setAttribute("stroke-width", this.#drawThickness.value); + this.#drawSVG.append(path); + this.#drawSVG.addEventListener("pointerdown", drawCallback, options); + this.#drawPlaceholder.removeEventListener("pointerdown", drawCallback); + if (this.#description.value === "") { + this.#l10n.get(SignatureManager.#l10nDescription.signature).then(description => { + this.#tabsToAltText.get("draw").default = description; + this.#description.value ||= description; + this.#clearDescription.disabled = this.#description.value === ""; + }); } - }; - matchIdx += matchesLength[m]; - while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) { - iIndex += textContentItemsStr[i].length; - i++; } - match.end = { - divIdx: i, - offset: matchIdx - iIndex + this.#drawPoints = [offsetX, offsetY]; + this.#drawCurves.curves.push({ + points: this.#drawPoints + }); + this.#drawPathString += `M ${offsetX} ${offsetY}`; + this.#drawPath.setAttribute("d", this.#drawPathString); + const finishDrawAC = new AbortController(); + const listenerDrawOptions = { + signal: AbortSignal.any([signal, finishDrawAC.signal]) }; - result.push(match); + this.#drawSVG.addEventListener("contextmenu", noContextMenu, listenerDrawOptions); + this.#drawSVG.addEventListener("pointermove", evt => { + evt.preventDefault(); + let { + offsetX: x, + offsetY: y + } = evt; + x = Math.round(x); + y = Math.round(y); + const drawPoints = this.#drawPoints; + if (x < 0 || y < 0 || x > drawWidth || y > drawHeight || x === drawPoints.at(-2) && y === drawPoints.at(-1)) { + return; + } + if (drawPoints.length >= 4) { + const [x1, y1, x2, y2] = drawPoints.slice(-4); + this.#drawPathString += `C${(x1 + 5 * x2) / 6} ${(y1 + 5 * y2) / 6} ${(5 * x2 + x) / 6} ${(5 * y2 + y) / 6} ${(x2 + x) / 2} ${(y2 + y) / 2}`; + } else { + this.#drawPathString += `L${x} ${y}`; + } + drawPoints.push(x, y); + this.#drawPath.setAttribute("d", this.#drawPathString); + }, listenerDrawOptions); + this.#drawSVG.addEventListener("pointerup", evt => { + const { + pointerId: pId + } = evt; + if (!isNaN(currentPointerId) && currentPointerId !== pId) { + return; + } + currentPointerId = NaN; + evt.preventDefault(); + this.#drawSVG.releasePointerCapture(pId); + finishDrawAC.abort(); + if (this.#drawPoints.length === 2) { + this.#drawPathString += `L${this.#drawPoints[0]} ${this.#drawPoints[1]}`; + this.#drawPath.setAttribute("d", this.#drawPathString); + } + }, listenerDrawOptions); + }; + if (this.#drawCurves) { + this.#drawSVG.addEventListener("pointerdown", drawCallback, options); + } else { + this.#drawPlaceholder.addEventListener("pointerdown", drawCallback, options); } - return result; + this.#drawThickness.addEventListener("input", () => { + const { + value: thickness + } = this.#drawThickness; + this.#drawThickness.setAttribute("data-l10n-args", JSON.stringify({ + thickness + })); + if (!this.#drawCurves) { + return; + } + this.#drawPath.setAttribute("stroke-width", thickness); + this.#drawCurves.thickness = thickness; + }, options); + } + #showError(type) { + this.#errorTitle.setAttribute("data-l10n-id", SignatureManager.#l10nDescription[`error${type}Title`]); + this.#errorDescription.setAttribute("data-l10n-id", SignatureManager.#l10nDescription[`error${type}Description`]); + this.#errorBar.hidden = false; } - _renderMatches(matches) { - if (matches.length === 0) { - return; + #initImageTab(reset) { + if (reset) { + this.#resetTab("image"); } + this.#disableButtons(this.#imagePath); const { - findController, - pageIdx - } = this; - const { - textContentItemsStr, - textDivs - } = this; - const isSelectedPage = pageIdx === findController.selected.pageIdx; - const selectedMatchIdx = findController.selected.matchIdx; - const highlightAll = findController.state.highlightAll; - let prevEnd = null; - const infinity = { - divIdx: -1, - offset: undefined + signal + } = this.#currentTabAC; + const options = { + signal }; - function beginText(begin, className) { - const divIdx = begin.divIdx; - textDivs[divIdx].textContent = ""; - return appendTextToDiv(divIdx, 0, begin.offset, className); - } - function appendTextToDiv(divIdx, fromOffset, toOffset, className) { - let div = textDivs[divIdx]; - if (div.nodeType === Node.TEXT_NODE) { - const span = document.createElement("span"); - div.before(span); - span.append(div); - textDivs[divIdx] = span; - div = span; - } - const content = textContentItemsStr[divIdx].substring(fromOffset, toOffset); - const node = document.createTextNode(content); - if (className) { - const span = document.createElement("span"); - span.className = `${className} appended`; - span.append(node); - div.append(span); - return className.includes("selected") ? span.offsetLeft : 0; - } - div.append(node); - return 0; - } - let i0 = selectedMatchIdx, - i1 = i0 + 1; - if (highlightAll) { - i0 = 0; - i1 = matches.length; - } else if (!isSelectedPage) { - return; - } - let lastDivIdx = -1; - let lastOffset = -1; - for (let i = i0; i < i1; i++) { - const match = matches[i]; - const begin = match.begin; - if (begin.divIdx === lastDivIdx && begin.offset === lastOffset) { - continue; + const passiveOptions = { + passive: true, + signal + }; + this.#imagePickerLink.addEventListener("keydown", e => { + const { + key + } = e; + if (key === "Enter" || key === " ") { + stopEvent(e); + this.#imagePicker.click(); + } + }, options); + this.#imagePicker.addEventListener("click", () => { + this.#dialog.classList.toggle("waiting", true); + }, passiveOptions); + this.#imagePicker.addEventListener("change", async () => { + const file = this.#imagePicker.files?.[0]; + if (!file || !SupportedImageMimeTypes.includes(file.type)) { + this.#showError("Upload"); + this.#dialog.classList.toggle("waiting", false); + return; } - lastDivIdx = begin.divIdx; - lastOffset = begin.offset; - const end = match.end; - const isSelected = isSelectedPage && i === selectedMatchIdx; - const highlightSuffix = isSelected ? " selected" : ""; - let selectedLeft = 0; - if (!prevEnd || begin.divIdx !== prevEnd.divIdx) { - if (prevEnd !== null) { - appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); + await this.#extractSignature(file); + }, passiveOptions); + this.#imagePicker.addEventListener("cancel", () => { + this.#dialog.classList.toggle("waiting", false); + }, passiveOptions); + this.#imagePlaceholder.addEventListener("dragover", e => { + const { + dataTransfer + } = e; + for (const { + type + } of dataTransfer.items) { + if (!SupportedImageMimeTypes.includes(type)) { + continue; } - beginText(begin); - } else { - appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset); + dataTransfer.dropEffect = dataTransfer.effectAllowed === "copy" ? "copy" : "move"; + stopEvent(e); + return; } - if (begin.divIdx === end.divIdx) { - selectedLeft = appendTextToDiv(begin.divIdx, begin.offset, end.offset, "highlight" + highlightSuffix); - } else { - selectedLeft = appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, "highlight begin" + highlightSuffix); - for (let n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) { - textDivs[n0].className = "highlight middle" + highlightSuffix; + dataTransfer.dropEffect = "none"; + }, options); + this.#imagePlaceholder.addEventListener("drop", e => { + const { + dataTransfer: { + files } - beginText(end, "highlight end" + highlightSuffix); + } = e; + if (!files?.length) { + return; } - prevEnd = end; - if (isSelected) { - findController.scrollMatchIntoView({ - element: textDivs[begin.divIdx], - selectedLeft, - pageIndex: pageIdx, - matchIndex: selectedMatchIdx - }); + for (const file of files) { + if (SupportedImageMimeTypes.includes(file.type)) { + this.#extractSignature(file); + break; + } } - } - if (prevEnd) { - appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); - } + stopEvent(e); + this.#dialog.classList.toggle("waiting", true); + }, options); } - _updateMatches(reset = false) { - if (!this.enabled && !reset) { + async #extractSignature(file) { + let data; + try { + data = await this.#uiManager.imageManager.getFromFile(file); + } catch (e) { + console.error("SignatureManager.#extractSignature.", e); + } + if (!data) { + this.#showError("Upload"); + this.#dialog.classList.toggle("waiting", false); return; } - const { - findController, - matches, - pageIdx - } = this; - const { - textContentItemsStr, - textDivs - } = this; - let clearedUntilDivIdx = -1; - for (const match of matches) { - const begin = Math.max(clearedUntilDivIdx, match.begin.divIdx); - for (let n = begin, end = match.end.divIdx; n <= end; n++) { - const div = textDivs[n]; - div.textContent = textContentItemsStr[n]; - div.className = ""; - } - clearedUntilDivIdx = match.end.divIdx + 1; - } - if (!findController?.highlightMatches || reset) { + const lineData = this.#extractedSignatureData = this.#currentEditor.getFromImage(data.bitmap); + if (!lineData) { + this.#showError("NoData"); + this.#dialog.classList.toggle("waiting", false); return; } - const pageMatches = findController.pageMatches[pageIdx] || null; - const pageMatchesLength = findController.pageMatchesLength[pageIdx] || null; - this.matches = this._convertMatches(pageMatches, pageMatchesLength); - this._renderMatches(this.matches); + const { + outline + } = lineData; + this.#imagePlaceholder.hidden = true; + this.#disableButtons(true); + const svgFactory = new DOMSVGFactory(); + const path = this.#imagePath = svgFactory.createElement("path"); + this.#imageSVG.setAttribute("viewBox", outline.viewBox); + this.#imageSVG.setAttribute("preserveAspectRatio", "xMidYMid meet"); + this.#imageSVG.append(path); + path.setAttribute("d", outline.toSVGPath()); + this.#tabsToAltText.get("image").default = file.name; + if (this.#description.value === "") { + this.#description.value = file.name || ""; + this.#clearDescription.disabled = this.#description.value === ""; + } + this.#dialog.classList.toggle("waiting", false); } -} - - -/***/ }), - -/***/ 7765: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ TextLayerBuilder: () => (/* binding */ TextLayerBuilder) -/* harmony export */ }); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2603); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7256); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__]); -pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; - - -class TextLayerBuilder { - #enablePermissions = false; - #onAppend = null; - #rotation = 0; - #scale = 0; - #textContentSource = null; - constructor({ - highlighter = null, - accessibilityManager = null, - enablePermissions = false, - onAppend = null - }) { - this.textContentItemsStr = []; - this.renderingDone = false; - this.textDivs = []; - this.textDivProperties = new WeakMap(); - this.textLayerRenderTask = null; - this.highlighter = highlighter; - this.accessibilityManager = accessibilityManager; - this.#enablePermissions = enablePermissions === true; - this.#onAppend = onAppend; - this.div = document.createElement("div"); - this.div.tabIndex = 0; - this.div.className = "textLayer"; + #getOutlineForType() { + return this.#currentEditor.getFromText(this.#typeInput.value, window.getComputedStyle(this.#typeInput)); } - #finishRendering() { - this.renderingDone = true; - const endOfContent = document.createElement("div"); - endOfContent.className = "endOfContent"; - this.div.append(endOfContent); - this.#bindMouse(); + #getOutlineForDraw() { + const { + width, + height + } = this.#drawSVG.getBoundingClientRect(); + return this.#currentEditor.getDrawnSignature(this.#drawCurves, width, height); } - get numTextDivs() { - return this.textDivs.length; + #reportTelemetry(data) { + this.#eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data + } + }); } - async render(viewport) { - if (!this.#textContentSource) { - throw new Error('No "textContentSource" parameter specified.'); + #addToolbarButton(signatureData, uuid, description) { + const { + curves, + areContours, + thickness, + width, + height + } = signatureData; + const maxDim = Math.max(width, height); + const outlineData = SignatureExtractor.processDrawnLines({ + lines: { + curves, + thickness, + width, + height + }, + pageWidth: maxDim, + pageHeight: maxDim, + rotation: 0, + innerMargin: 0, + mustSmooth: false, + areContours + }); + if (!outlineData) { + return; } - const scale = viewport.scale * (globalThis.devicePixelRatio || 1); const { - rotation - } = viewport; - if (this.renderingDone) { - const mustRotate = rotation !== this.#rotation; - const mustRescale = scale !== this.#scale; - if (mustRotate || mustRescale) { - this.hide(); - (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.updateTextLayer)({ - container: this.div, - viewport, - textDivs: this.textDivs, - textDivProperties: this.textDivProperties, - mustRescale, - mustRotate + outline + } = outlineData; + const svgFactory = new DOMSVGFactory(); + const div = document.createElement("div"); + const button = document.createElement("button"); + button.addEventListener("click", () => { + this.#eventBus.dispatch("switchannotationeditorparams", { + source: this, + type: AnnotationEditorParamsType.CREATE, + value: { + signatureData: { + lines: { + curves, + thickness, + width, + height + }, + mustSmooth: false, + areContours, + description, + uuid, + heightInPage: DEFAULT_HEIGHT_IN_PAGE + } + } + }); + }); + div.append(button); + div.classList.add("toolbarAddSignatureButtonContainer"); + const svg = svgFactory.create(1, 1, true); + button.append(svg); + const span = document.createElement("span"); + span.ariaHidden = true; + button.append(span); + button.classList.add("toolbarAddSignatureButton"); + button.type = "button"; + span.textContent = description; + button.setAttribute("data-l10n-id", "pdfjs-editor-add-saved-signature-button"); + button.setAttribute("data-l10n-args", JSON.stringify({ + description + })); + button.tabIndex = 0; + const path = svgFactory.createElement("path"); + svg.append(path); + svg.setAttribute("viewBox", outline.viewBox); + svg.setAttribute("preserveAspectRatio", "xMidYMid meet"); + if (areContours) { + path.classList.add("contours"); + } + path.setAttribute("d", outline.toSVGPath()); + const deleteButton = document.createElement("button"); + div.append(deleteButton); + deleteButton.classList.add("toolbarButton", "deleteButton"); + deleteButton.setAttribute("data-l10n-id", "pdfjs-editor-delete-signature-button1"); + deleteButton.type = "button"; + deleteButton.tabIndex = 0; + deleteButton.addEventListener("click", async () => { + if (await this.#signatureStorage.delete(uuid)) { + div.remove(); + this.#reportTelemetry({ + type: "signature", + action: "pdfjs.signature.delete_saved", + data: { + savedCount: await this.#signatureStorage.size() + } }); - this.#scale = scale; - this.#rotation = rotation; } - this.show(); - return; + }); + const deleteSpan = document.createElement("span"); + deleteButton.append(deleteSpan); + deleteSpan.setAttribute("data-l10n-id", "pdfjs-editor-delete-signature-button-label1"); + this.#addSignatureToolbarButton.before(div); + } + async #signaturesChanged() { + const parent = this.#addSignatureToolbarButton.parentElement; + while (parent.firstElementChild !== this.#addSignatureToolbarButton) { + parent.firstElementChild.remove(); + } + this.#loadSignaturesPromise = null; + await this.loadSignatures(true); + } + getSignature(params) { + return this.open(params); + } + async loadSignatures(reload = false) { + if (!this.#addSignatureToolbarButton || !reload && this.#addSignatureToolbarButton.previousElementSibling || !this.#signatureStorage) { + return; + } + if (!this.#loadSignaturesPromise) { + this.#loadSignaturesPromise = this.#signatureStorage.getAll().then(async signatures => [signatures, await Promise.all(Array.from(signatures.values(), ({ + signatureData + }) => SignatureExtractor.decompressSignature(signatureData)))]); + if (!reload) { + return; + } } - this.cancel(); - this.highlighter?.setTextMapping(this.textDivs, this.textContentItemsStr); - this.accessibilityManager?.setTextMapping(this.textDivs); - this.textLayerRenderTask = (0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.renderTextLayer)({ - textContentSource: this.#textContentSource, - container: this.div, - viewport, - textDivs: this.textDivs, - textDivProperties: this.textDivProperties, - textContentItemsStr: this.textContentItemsStr - }); - await this.textLayerRenderTask.promise; - this.#finishRendering(); - this.#scale = scale; - this.#rotation = rotation; - this.#onAppend?.(this.div); - this.highlighter?.enable(); - this.accessibilityManager?.enable(); - } - hide() { - if (!this.div.hidden && this.renderingDone) { - this.highlighter?.disable(); - this.div.hidden = true; + const [signatures, signaturesData] = await this.#loadSignaturesPromise; + this.#loadSignaturesPromise = null; + let i = 0; + for (const [uuid, { + description + }] of signatures) { + const data = signaturesData[i++]; + if (!data) { + continue; + } + data.curves = data.outlines.map(points => ({ + points + })); + delete data.outlines; + this.#addToolbarButton(data, uuid, description); } } - show() { - if (this.div.hidden && this.renderingDone) { - this.div.hidden = false; - this.highlighter?.enable(); - } + async renderEditButton(editor) { + const button = document.createElement("button"); + button.classList.add("altText", "editDescription"); + button.tabIndex = 0; + if (editor.description) { + button.title = editor.description; + } + const span = document.createElement("span"); + button.append(span); + span.setAttribute("data-l10n-id", "pdfjs-editor-add-signature-edit-button-label"); + button.addEventListener("click", () => { + this.#editDescriptionDialog.open(editor); + }, { + passive: true + }); + return button; } - cancel() { - if (this.textLayerRenderTask) { - this.textLayerRenderTask.cancel(); - this.textLayerRenderTask = null; - } - this.highlighter?.disable(); - this.accessibilityManager?.disable(); - this.textContentItemsStr.length = 0; - this.textDivs.length = 0; - this.textDivProperties = new WeakMap(); + async open({ + uiManager, + editor + }) { + this.#tabsToAltText ||= new Map(this.#tabButtons.keys().map(name => [name, { + value: "", + default: "" + }])); + this.#uiManager = uiManager; + this.#currentEditor = editor; + this.#uiManager.removeEditListeners(); + const isStorageFull = this.#isStorageFull = await this.#signatureStorage.isFull(); + this.#saveContainer.classList.toggle("fullStorage", isStorageFull); + this.#saveCheckbox.checked = !isStorageFull; + await this.#overlayManager.open(this.#dialog); + const tabType = this.#tabButtons.get("type"); + tabType.focus(); + tabType.click(); } - setTextContentSource(source) { - this.cancel(); - this.#textContentSource = source; + #cancel() { + this.#finish(); } - #bindMouse() { - const { - div - } = this; - div.addEventListener("mousedown", evt => { - const end = div.querySelector(".endOfContent"); - if (!end) { - return; + #finish() { + this.#overlayManager.closeIfActive(this.#dialog); + } + #close() { + if (this.#currentEditor._drawId === null) { + this.#currentEditor.remove(); + } + this.#uiManager?.addEditListeners(); + this.#currentTabAC?.abort(); + this.#currentTabAC = null; + this.#uiManager = null; + this.#currentEditor = null; + this.#resetCommon(); + for (const [name] of this.#tabButtons) { + this.#resetTab(name); + } + this.#disableButtons(false); + this.#currentTab = null; + this.#tabsToAltText = null; + } + async #add() { + let data; + const type = this.#currentTab; + switch (type) { + case "type": + data = this.#getOutlineForType(); + break; + case "draw": + data = this.#getOutlineForDraw(); + break; + case "image": + data = this.#extractedSignatureData; + break; + } + let uuid = null; + const description = this.#description.value; + if (this.#saveCheckbox.checked) { + const { + newCurves, + areContours, + thickness, + width, + height + } = data; + const signatureData = await SignatureExtractor.compressSignature({ + outlines: newCurves, + areContours, + thickness, + width, + height + }); + uuid = await this.#signatureStorage.create({ + description, + signatureData + }); + if (uuid) { + this.#addToolbarButton({ + curves: newCurves.map(points => ({ + points + })), + areContours, + thickness, + width, + height + }, uuid, description); + } else { + console.warn("SignatureManager.add: cannot save the signature."); + } + } + const altText = this.#tabsToAltText.get(type); + this.#reportTelemetry({ + type: "signature", + action: "pdfjs.signature.created", + data: { + type, + saved: !!uuid, + savedCount: await this.#signatureStorage.size(), + descriptionChanged: description !== altText.default } - let adjustTop = evt.target !== div; - adjustTop &&= getComputedStyle(end).getPropertyValue("-moz-user-select") !== "none"; - if (adjustTop) { - const divBounds = div.getBoundingClientRect(); - const r = Math.max(0, (evt.pageY - divBounds.top) / divBounds.height); - end.style.top = (r * 100).toFixed(2) + "%"; + }); + this.#currentEditor.addSignature(data, DEFAULT_HEIGHT_IN_PAGE, this.#description.value, uuid); + this.#finish(); + } + destroy() { + this.#uiManager = null; + this.#finish(); + } +} +class EditDescriptionDialog { + #currentEditor; + #previousDescription; + #description; + #dialog; + #overlayManager; + #signatureSVG; + #uiManager; + constructor({ + dialog, + description, + cancelButton, + updateButton, + editSignatureView + }, overlayManager) { + const descriptionInput = this.#description = description.firstElementChild; + this.#signatureSVG = editSignatureView; + this.#dialog = dialog; + this.#overlayManager = overlayManager; + dialog.addEventListener("close", this.#close.bind(this)); + dialog.addEventListener("contextmenu", e => { + if (e.target !== this.#description) { + e.preventDefault(); } - end.classList.add("active"); }); - div.addEventListener("mouseup", () => { - const end = div.querySelector(".endOfContent"); - if (!end) { - return; + cancelButton.addEventListener("click", this.#cancel.bind(this)); + updateButton.addEventListener("click", this.#update.bind(this)); + const clearDescription = description.lastElementChild; + clearDescription.addEventListener("click", () => { + descriptionInput.value = ""; + clearDescription.disabled = true; + updateButton.disabled = this.#previousDescription === ""; + }); + descriptionInput.addEventListener("input", () => { + const { + value + } = descriptionInput; + clearDescription.disabled = value === ""; + updateButton.disabled = value === this.#previousDescription; + editSignatureView.setAttribute("aria-label", value); + }, { + passive: true + }); + overlayManager.register(dialog); + } + async open(editor) { + this.#uiManager = editor._uiManager; + this.#currentEditor = editor; + this.#previousDescription = this.#description.value = editor.description; + this.#description.dispatchEvent(new Event("input")); + this.#uiManager.removeEditListeners(); + const { + areContours, + outline + } = editor.getSignaturePreview(); + const svgFactory = new DOMSVGFactory(); + const path = svgFactory.createElement("path"); + this.#signatureSVG.append(path); + this.#signatureSVG.setAttribute("viewBox", outline.viewBox); + path.setAttribute("d", outline.toSVGPath()); + if (areContours) { + path.classList.add("contours"); + } + await this.#overlayManager.open(this.#dialog); + } + async #update() { + this.#currentEditor._reportTelemetry({ + action: "pdfjs.signature.edit_description", + data: { + hasBeenChanged: true } - end.style.top = ""; - end.classList.remove("active"); }); - div.addEventListener("copy", event => { - if (!this.#enablePermissions) { - const selection = document.getSelection(); - event.clipboardData.setData("text/plain", (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.removeNullCharacters)((0,pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.normalizeUnicode)(selection.toString()))); + this.#currentEditor.description = this.#description.value; + this.#finish(); + } + #cancel() { + this.#currentEditor._reportTelemetry({ + action: "pdfjs.signature.edit_description", + data: { + hasBeenChanged: false } - event.preventDefault(); - event.stopPropagation(); }); + this.#finish(); + } + #finish() { + this.#overlayManager.closeIfActive(this.#dialog); + } + #close() { + this.#uiManager?.addEditListeners(); + this.#uiManager = null; + this.#currentEditor = null; + this.#signatureSVG.firstElementChild.remove(); } } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), +;// ./web/toolbar.js -/***/ 6297: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ Toolbar: () => (/* binding */ Toolbar) -/* harmony export */ }); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2603); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7256); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__]); -pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; class Toolbar { + #colorPicker = null; #opts; - constructor(options, eventBus) { + constructor(options, eventBus, toolbarDensity = 0) { this.#opts = options; this.eventBus = eventBus; const buttons = [{ @@ -14163,6 +17557,17 @@ element: options.download, eventName: "download" }, { + element: options.editorCommentButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorCommentButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.POPUP; + } + } + }, { element: options.editorFreeTextButton, eventName: "switchannotationeditormode", eventDetails: { @@ -14170,7 +17575,7 @@ const { classList } = options.editorFreeTextButton; - return classList.contains("toggled") ? pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.NONE : pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.FREETEXT; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.FREETEXT; } } }, { @@ -14181,7 +17586,7 @@ const { classList } = options.editorHighlightButton; - return classList.contains("toggled") ? pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.NONE : pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.HIGHLIGHT; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.HIGHLIGHT; } } }, { @@ -14192,7 +17597,7 @@ const { classList } = options.editorInkButton; - return classList.contains("toggled") ? pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.NONE : pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.INK; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.INK; } } }, { @@ -14203,37 +17608,46 @@ const { classList } = options.editorStampButton; - return classList.contains("toggled") ? pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.NONE : pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.STAMP; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.STAMP; + } + }, + telemetry: { + type: "editing", + data: { + action: "pdfjs.image.icon_click" + } + } + }, { + element: options.editorSignatureButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorSignatureButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.SIGNATURE; } } }]; this.#bindListeners(buttons); - if (options.editorHighlightColorPicker) { - eventBus._on("annotationeditoruimanager", ({ - uiManager - }) => { - this.#setAnnotationEditorUIManager(uiManager, options.editorHighlightColorPicker); - }, { - once: true - }); - } - eventBus._on("showannotationeditorui", ({ - mode - }) => { - switch (mode) { - case pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.HIGHLIGHT: - options.editorHighlightButton.click(); - break; - } + this.#updateToolbarDensity({ + value: toolbarDensity }); this.reset(); } - #setAnnotationEditorUIManager(uiManager, parentContainer) { - const colorPicker = new pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.ColorPicker({ - uiManager - }); - uiManager.setMainHighlightColorPicker(colorPicker); - parentContainer.append(colorPicker.renderMainDropdown()); + #updateToolbarDensity({ + value + }) { + let name = "normal"; + switch (value) { + case 1: + name = "compact"; + break; + case 2: + name = "touch"; + break; + } + document.documentElement.setAttribute("data-toolbar-density", name); } setPageNumber(pageNumber, pageLabel) { this.pageNumber = pageNumber; @@ -14251,16 +17665,17 @@ this.#updateUIState(false); } reset() { + this.#colorPicker = null; this.pageNumber = 0; this.pageLabel = null; this.hasPageLabels = false; this.pagesCount = 0; - this.pageScaleValue = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_SCALE_VALUE; - this.pageScale = _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_SCALE; + this.pageScaleValue = DEFAULT_SCALE_VALUE; + this.pageScale = DEFAULT_SCALE; this.#updateUIState(true); this.updateLoadingIndicatorState(); this.#editorModeChanged({ - mode: pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.DISABLE + mode: AnnotationEditorType.DISABLE }); } #bindListeners(buttons) { @@ -14268,6 +17683,8 @@ eventBus } = this; const { + editorHighlightColorPicker, + editorHighlightButton, pageNumber, scaleSelect } = this.#opts; @@ -14275,7 +17692,8 @@ for (const { element, eventName, - eventDetails + eventDetails, + telemetry } of buttons) { element.addEventListener("click", evt => { if (eventName !== null) { @@ -14285,6 +17703,12 @@ isFromKeyboard: evt.detail === 0 }); } + if (telemetry) { + eventBus.dispatch("reporttelemetry", { + source: this, + details: telemetry + }); + } }); } pageNumber.addEventListener("click", function () { @@ -14296,6 +17720,14 @@ value: this.value }); }); + eventBus.on("pagesedited", ({ + pagesMapper + }) => { + const pagesCount = pagesMapper.pagesNumber; + if (pagesCount !== this.pagesCount) { + this.setPagesCount(pagesCount, this.hasPageLabels); + } + }, internalOpt); scaleSelect.addEventListener("change", function () { if (this.value === "custom") { return; @@ -14312,13 +17744,41 @@ this.blur(); } }); - scaleSelect.oncontextmenu = pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.noContextMenu; - eventBus._on("annotationeditormodechanged", this.#editorModeChanged.bind(this)); + scaleSelect.oncontextmenu = noContextMenu; + eventBus.on("annotationeditormodechanged", this.#editorModeChanged.bind(this), internalOpt); + eventBus.on("showannotationeditorui", ({ + mode + }) => { + switch (mode) { + case AnnotationEditorType.HIGHLIGHT: + editorHighlightButton.click(); + break; + } + }, internalOpt); + eventBus.on("toolbardensity", this.#updateToolbarDensity.bind(this), internalOpt); + if (editorHighlightColorPicker) { + eventBus.on("annotationeditoruimanager", ({ + uiManager + }) => { + const cp = this.#colorPicker = new ColorPicker({ + uiManager + }); + uiManager.setMainHighlightColorPicker(cp); + editorHighlightColorPicker.append(cp.renderMainDropdown()); + }, internalOpt); + eventBus.on("mainhighlightcolorpickerupdatecolor", ({ + value + }) => { + this.#colorPicker?.updateColor(value); + }, internalOpt); + } } #editorModeChanged({ mode }) { const { + editorCommentButton, + editorCommentParamsToolbar, editorFreeTextButton, editorFreeTextParamsToolbar, editorHighlightButton, @@ -14326,17 +17786,17 @@ editorInkButton, editorInkParamsToolbar, editorStampButton, - editorStampParamsToolbar + editorStampParamsToolbar, + editorSignatureButton, + editorSignatureParamsToolbar } = this.#opts; - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.toggleCheckedBtn)(editorFreeTextButton, mode === pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.FREETEXT, editorFreeTextParamsToolbar); - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.toggleCheckedBtn)(editorHighlightButton, mode === pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.HIGHLIGHT, editorHighlightParamsToolbar); - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.toggleCheckedBtn)(editorInkButton, mode === pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.INK, editorInkParamsToolbar); - (0,_ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.toggleCheckedBtn)(editorStampButton, mode === pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.STAMP, editorStampParamsToolbar); - const isDisable = mode === pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.AnnotationEditorType.DISABLE; - editorFreeTextButton.disabled = isDisable; - editorHighlightButton.disabled = isDisable; - editorInkButton.disabled = isDisable; - editorStampButton.disabled = isDisable; + toggleExpandedBtn(editorCommentButton, mode === AnnotationEditorType.POPUP, editorCommentParamsToolbar); + toggleExpandedBtn(editorFreeTextButton, mode === AnnotationEditorType.FREETEXT, editorFreeTextParamsToolbar); + toggleExpandedBtn(editorHighlightButton, mode === AnnotationEditorType.HIGHLIGHT, editorHighlightParamsToolbar); + toggleExpandedBtn(editorInkButton, mode === AnnotationEditorType.INK, editorInkParamsToolbar); + toggleExpandedBtn(editorStampButton, mode === AnnotationEditorType.STAMP, editorStampParamsToolbar); + toggleExpandedBtn(editorSignatureButton, mode === AnnotationEditorType.SIGNATURE, editorSignatureParamsToolbar); + editorCommentButton.disabled = editorFreeTextButton.disabled = editorHighlightButton.disabled = editorInkButton.disabled = editorStampButton.disabled = editorSignatureButton.disabled = mode === AnnotationEditorType.DISABLE; } #updateUIState(resetNumPages = false) { const { @@ -14370,8 +17830,8 @@ } opts.previous.disabled = pageNumber <= 1; opts.next.disabled = pageNumber >= pagesCount; - opts.zoomOut.disabled = pageScale <= _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.MIN_SCALE; - opts.zoomIn.disabled = pageScale >= _ui_utils_js__WEBPACK_IMPORTED_MODULE_1__.MAX_SCALE; + opts.zoomOut.disabled = pageScale <= MIN_SCALE; + opts.zoomIn.disabled = pageScale >= MAX_SCALE; let predefinedValueFound = false; for (const option of opts.scaleSelect.options) { if (option.value !== pageScaleValue) { @@ -14396,673 +17856,2663 @@ } } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); +;// ./web/view_history.js +const DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20; +class ViewHistory { + constructor(fingerprint, cacheSize = DEFAULT_VIEW_HISTORY_CACHE_SIZE) { + this.fingerprint = fingerprint; + this.cacheSize = cacheSize; + this._initializedPromise = this._readFromStorage().then(databaseStr => { + const database = JSON.parse(databaseStr || "{}"); + let index = -1; + if (!Array.isArray(database.files)) { + database.files = []; + } else { + while (database.files.length >= this.cacheSize) { + database.files.shift(); + } + for (let i = 0, ii = database.files.length; i < ii; i++) { + const branch = database.files[i]; + if (branch.fingerprint === this.fingerprint) { + index = i; + break; + } + } + } + if (index === -1) { + index = database.files.push({ + fingerprint: this.fingerprint + }) - 1; + } + this.file = database.files[index]; + this.database = database; + }); + } + async _writeToStorage() { + const databaseStr = JSON.stringify(this.database); + localStorage.setItem("pdfjs.history", databaseStr); + } + async _readFromStorage() { + return localStorage.getItem("pdfjs.history"); + } + async set(name, val) { + await this._initializedPromise; + this.file[name] = val; + return this._writeToStorage(); + } + async setMultiple(properties) { + await this._initializedPromise; + for (const name in properties) { + this.file[name] = properties[name]; + } + return this._writeToStorage(); + } + async get(name, defaultValue) { + await this._initializedPromise; + const val = this.file[name]; + return val !== undefined ? val : defaultValue; + } + async getMultiple(properties) { + await this._initializedPromise; + const values = Object.create(null); + for (const name in properties) { + const val = this.file[name]; + values[name] = val !== undefined ? val : properties[name]; + } + return values; + } +} + +;// ./web/views_manager.js -/***/ }), -/***/ 7256: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ AutoPrintRegExp: () => (/* binding */ AutoPrintRegExp), -/* harmony export */ CursorTool: () => (/* binding */ CursorTool), -/* harmony export */ DEFAULT_SCALE: () => (/* binding */ DEFAULT_SCALE), -/* harmony export */ DEFAULT_SCALE_DELTA: () => (/* binding */ DEFAULT_SCALE_DELTA), -/* harmony export */ DEFAULT_SCALE_VALUE: () => (/* binding */ DEFAULT_SCALE_VALUE), -/* harmony export */ MAX_AUTO_SCALE: () => (/* binding */ MAX_AUTO_SCALE), -/* harmony export */ MAX_SCALE: () => (/* binding */ MAX_SCALE), -/* harmony export */ MIN_SCALE: () => (/* binding */ MIN_SCALE), -/* harmony export */ OutputScale: () => (/* binding */ OutputScale), -/* harmony export */ PresentationModeState: () => (/* binding */ PresentationModeState), -/* harmony export */ ProgressBar: () => (/* binding */ ProgressBar), -/* harmony export */ RenderingStates: () => (/* binding */ RenderingStates), -/* harmony export */ SCROLLBAR_PADDING: () => (/* binding */ SCROLLBAR_PADDING), -/* harmony export */ ScrollMode: () => (/* binding */ ScrollMode), -/* harmony export */ SidebarView: () => (/* binding */ SidebarView), -/* harmony export */ SpreadMode: () => (/* binding */ SpreadMode), -/* harmony export */ TextLayerMode: () => (/* binding */ TextLayerMode), -/* harmony export */ UNKNOWN_SCALE: () => (/* binding */ UNKNOWN_SCALE), -/* harmony export */ VERTICAL_PADDING: () => (/* binding */ VERTICAL_PADDING), -/* harmony export */ animationStarted: () => (/* binding */ animationStarted), -/* harmony export */ apiPageLayoutToViewerModes: () => (/* binding */ apiPageLayoutToViewerModes), -/* harmony export */ apiPageModeToSidebarView: () => (/* binding */ apiPageModeToSidebarView), -/* harmony export */ approximateFraction: () => (/* binding */ approximateFraction), -/* harmony export */ binarySearchFirstItem: () => (/* binding */ binarySearchFirstItem), -/* harmony export */ docStyle: () => (/* binding */ docStyle), -/* harmony export */ getActiveOrFocusedElement: () => (/* binding */ getActiveOrFocusedElement), -/* harmony export */ getPageSizeInches: () => (/* binding */ getPageSizeInches), -/* harmony export */ getVisibleElements: () => (/* binding */ getVisibleElements), -/* harmony export */ isPortraitOrientation: () => (/* binding */ isPortraitOrientation), -/* harmony export */ isValidRotation: () => (/* binding */ isValidRotation), -/* harmony export */ isValidScrollMode: () => (/* binding */ isValidScrollMode), -/* harmony export */ isValidSpreadMode: () => (/* binding */ isValidSpreadMode), -/* harmony export */ normalizeWheelEventDelta: () => (/* binding */ normalizeWheelEventDelta), -/* harmony export */ normalizeWheelEventDirection: () => (/* binding */ normalizeWheelEventDirection), -/* harmony export */ parseQueryString: () => (/* binding */ parseQueryString), -/* harmony export */ removeNullCharacters: () => (/* binding */ removeNullCharacters), -/* harmony export */ roundToDivide: () => (/* binding */ roundToDivide), -/* harmony export */ scrollIntoView: () => (/* binding */ scrollIntoView), -/* harmony export */ toggleCheckedBtn: () => (/* binding */ toggleCheckedBtn), -/* harmony export */ toggleExpandedBtn: () => (/* binding */ toggleExpandedBtn), -/* harmony export */ watchScroll: () => (/* binding */ watchScroll) -/* harmony export */ }); -/* unused harmony export backtrackBeforeAllVisibleElements */ -const DEFAULT_SCALE_VALUE = "auto"; -const DEFAULT_SCALE = 1.0; -const DEFAULT_SCALE_DELTA = 1.1; -const MIN_SCALE = 0.1; -const MAX_SCALE = 10.0; -const UNKNOWN_SCALE = 0; -const MAX_AUTO_SCALE = 1.25; -const SCROLLBAR_PADDING = 40; -const VERTICAL_PADDING = 5; -const RenderingStates = { - INITIAL: 0, - RUNNING: 1, - PAUSED: 2, - FINISHED: 3 -}; -const PresentationModeState = { - UNKNOWN: 0, - NORMAL: 1, - CHANGING: 2, - FULLSCREEN: 3 -}; -const SidebarView = { - UNKNOWN: -1, - NONE: 0, - THUMBS: 1, - OUTLINE: 2, - ATTACHMENTS: 3, - LAYERS: 4 -}; -const TextLayerMode = { - DISABLE: 0, - ENABLE: 1, - ENABLE_PERMISSIONS: 2 -}; -const ScrollMode = { - UNKNOWN: -1, - VERTICAL: 0, - HORIZONTAL: 1, - WRAPPED: 2, - PAGE: 3 -}; -const SpreadMode = { - UNKNOWN: -1, - NONE: 0, - ODD: 1, - EVEN: 2 -}; -const CursorTool = { - SELECT: 0, - HAND: 1, - ZOOM: 2 -}; -const AutoPrintRegExp = /\bprint\s*\(/; -class OutputScale { - constructor() { - const pixelRatio = window.devicePixelRatio || 1; - this.sx = pixelRatio; - this.sy = pixelRatio; + +const SIDEBAR_WIDTH_VAR = "--viewsManager-width"; +const SIDEBAR_RESIZING_CLASS = "viewsManagerResizing"; +const UI_NOTIFICATION_CLASS = "pdfSidebarNotification"; +class ViewsManager extends Sidebar { + static #l10nDescription = null; + #hasAnimations = !window.matchMedia("(prefers-reduced-motion: reduce)").matches; + constructor({ + elements: { + outerContainer, + sidebarContainer, + toggleButton, + resizer, + thumbnailButton, + outlineButton, + attachmentsButton, + layersButton, + thumbnailsView, + outlinesView, + attachmentsView, + layersView, + viewsManagerAddFile: { + button: viewsManagerAddFileButton + }, + viewsManagerCurrentOutlineButton, + viewsManagerSelectorButton, + viewsManagerSelectorOptions, + viewsManagerHeaderLabel, + viewsManagerStatus + }, + eventBus, + l10n, + enableMerge = false, + enableSplitMerge = false, + globalAbortSignal + }) { + super({ + sidebar: sidebarContainer, + resizer, + toggleButton + }, l10n.getDirection() === "ltr", false, globalAbortSignal); + this.isOpen = false; + this.active = SidebarView.THUMBS; + this.isInitialViewSet = false; + this.isInitialEventDispatched = false; + this.onToggled = null; + this.onUpdateThumbnails = null; + this.outerContainer = outerContainer; + this.sidebarContainer = sidebarContainer; + this.toggleButton = toggleButton; + this.resizer = resizer; + this.thumbnailButton = thumbnailButton; + this.outlineButton = outlineButton; + this.attachmentsButton = attachmentsButton; + this.layersButton = layersButton; + this.thumbnailsView = thumbnailsView; + this.outlinesView = outlinesView; + this.attachmentsView = attachmentsView; + this.layersView = layersView; + this.viewsManagerAddFileButton = viewsManagerAddFileButton; + this.viewsManagerCurrentOutlineButton = viewsManagerCurrentOutlineButton; + this.viewsManagerHeaderLabel = viewsManagerHeaderLabel; + this.viewsManagerStatus = viewsManagerStatus; + this.eventBus = eventBus; + if (!enableSplitMerge) { + viewsManagerStatus.hidden = true; + } + this._enableSplitMerge = enableSplitMerge; + this._enableMerge = enableMerge; + if (!enableMerge) { + viewsManagerAddFileButton.hidden = true; + } + this.menu = new Menu(viewsManagerSelectorOptions, viewsManagerSelectorButton, [thumbnailButton, outlineButton, attachmentsButton, layersButton]); + ViewsManager.#l10nDescription ||= Object.freeze({ + pagesTitle: "pdfjs-views-manager-pages-title", + outlinesTitle: "pdfjs-views-manager-outlines-title1", + attachmentsTitle: "pdfjs-views-manager-attachments-title", + layersTitle: "pdfjs-views-manager-layers-title1", + notificationButton: "pdfjs-toggle-views-manager-notification-button", + toggleButton: "pdfjs-toggle-views-manager-button1" + }); + this.#addEventListeners(); } - get scaled() { - return this.sx !== 1 || this.sy !== 1; + reset() { + this.isInitialViewSet = false; + this.isInitialEventDispatched = false; + this.#hideUINotification(true); + this.switchView(SidebarView.THUMBS); + this.outlineButton.disabled = this.attachmentsButton.disabled = this.layersButton.disabled = false; + this.viewsManagerCurrentOutlineButton.disabled = true; } -} -function scrollIntoView(element, spot, scrollMatches = false) { - let parent = element.offsetParent; - if (!parent) { - console.error("offsetParent is not set -- cannot scroll"); - return; + get visibleView() { + return this.isOpen ? this.active : SidebarView.NONE; } - let offsetY = element.offsetTop + element.clientTop; - let offsetX = element.offsetLeft + element.clientLeft; - while (parent.clientHeight === parent.scrollHeight && parent.clientWidth === parent.scrollWidth || scrollMatches && (parent.classList.contains("markedContent") || getComputedStyle(parent).overflow === "hidden")) { - offsetY += parent.offsetTop; - offsetX += parent.offsetLeft; - parent = parent.offsetParent; - if (!parent) { + setInitialView(view = SidebarView.NONE) { + if (this.isInitialViewSet) { + return; + } + this.isInitialViewSet = true; + if (view === SidebarView.NONE || view === SidebarView.UNKNOWN) { + this.#dispatchEvent(); return; } + this.switchView(view, true); + if (!this.isInitialEventDispatched) { + this.#dispatchEvent(); + } } - if (spot) { - if (spot.top !== undefined) { - offsetY += spot.top; + switchView(view, forceOpen = false) { + const isViewChanged = view !== this.active; + let forceRendering = false; + let titleL10nId = null; + switch (view) { + case SidebarView.NONE: + if (this.isOpen) { + this.close(); + } + return; + case SidebarView.THUMBS: + titleL10nId = "pagesTitle"; + if (this.isOpen && isViewChanged) { + forceRendering = true; + } + break; + case SidebarView.OUTLINE: + titleL10nId = "outlinesTitle"; + if (this.outlineButton.disabled) { + return; + } + break; + case SidebarView.ATTACHMENTS: + titleL10nId = "attachmentsTitle"; + if (this.attachmentsButton.disabled) { + return; + } + break; + case SidebarView.LAYERS: + titleL10nId = "layersTitle"; + if (this.layersButton.disabled) { + return; + } + break; + default: + console.error(`PDFSidebar.switchView: "${view}" is not a valid view.`); + return; } - if (spot.left !== undefined) { - offsetX += spot.left; - parent.scrollLeft = offsetX; + this.viewsManagerStatus.hidden = !this._enableSplitMerge || view !== SidebarView.THUMBS; + this.viewsManagerAddFileButton.hidden = !this._enableMerge || view !== SidebarView.THUMBS; + this.viewsManagerCurrentOutlineButton.hidden = view !== SidebarView.OUTLINE; + this.viewsManagerHeaderLabel.setAttribute("data-l10n-id", ViewsManager.#l10nDescription[titleL10nId] || ""); + this.active = view; + toggleSelectedBtn(this.thumbnailButton, view === SidebarView.THUMBS, this.thumbnailsView); + toggleSelectedBtn(this.outlineButton, view === SidebarView.OUTLINE, this.outlinesView); + toggleSelectedBtn(this.attachmentsButton, view === SidebarView.ATTACHMENTS, this.attachmentsView); + toggleSelectedBtn(this.layersButton, view === SidebarView.LAYERS, this.layersView); + if (forceOpen && !this.isOpen) { + this.open(); + return; + } + if (forceRendering) { + this.onUpdateThumbnails(); + this.onToggled(); + } + if (isViewChanged) { + this.#dispatchEvent(); } } - parent.scrollTop = offsetY; -} -function watchScroll(viewAreaElement, callback) { - const debounceScroll = function (evt) { - if (rAF) { + open() { + if (this.isOpen) { return; } - rAF = window.requestAnimationFrame(function viewAreaElementScrolled() { - rAF = null; - const currentX = viewAreaElement.scrollLeft; - const lastX = state.lastX; - if (currentX !== lastX) { - state.right = currentX > lastX; + this.isOpen = true; + this.onResizing(this.width); + this._sidebar.hidden = false; + toggleExpandedBtn(this.toggleButton, true); + this.switchView(this.active); + if (this.#hasAnimations) { + queueMicrotask(() => { + this.outerContainer.classList.add("viewsManagerMoving", "viewsManagerOpen"); + }); + } else { + this.outerContainer.classList.add("viewsManagerOpen"); + this.eventBus.dispatch("resize", { + source: this + }); + } + if (this.active === SidebarView.THUMBS) { + this.onUpdateThumbnails(); + } + this.onToggled(); + this.#dispatchEvent(); + this.#hideUINotification(); + } + close(evt = null) { + if (!this.isOpen) { + return; + } + this.isOpen = false; + this._sidebar.hidden = true; + toggleExpandedBtn(this.toggleButton, false); + this.outerContainer.classList.add("viewsManagerMoving"); + this.outerContainer.classList.remove("viewsManagerOpen"); + this.onToggled(); + this.#dispatchEvent(); + if (evt?.detail > 0) { + this.toggleButton.blur(); + } + } + toggle(evt = null) { + super.toggle(); + if (this.isOpen) { + this.close(evt); + } else { + this.open(); + } + } + #dispatchEvent() { + if (this.isInitialViewSet) { + this.isInitialEventDispatched ||= true; + } + this.eventBus.dispatch("sidebarviewchanged", { + source: this, + view: this.visibleView + }); + } + #showUINotification() { + this.toggleButton.setAttribute("data-l10n-id", ViewsManager.#l10nDescription.notificationButton); + if (!this.isOpen) { + this.toggleButton.classList.add(UI_NOTIFICATION_CLASS); + } + } + #hideUINotification(reset = false) { + if (this.isOpen || reset) { + this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS); + } + if (reset) { + this.toggleButton.setAttribute("data-l10n-id", ViewsManager.#l10nDescription.toggleButton); + } + } + #addEventListeners() { + const { + eventBus, + outerContainer + } = this; + if (this.#hasAnimations) { + this.sidebarContainer.addEventListener("transitionend", evt => { + if (evt.target === this.sidebarContainer) { + outerContainer.classList.remove("viewsManagerMoving"); + eventBus.dispatch("resize", { + source: this + }); + } + }); + } + this.viewsManagerHeaderLabel.addEventListener("dblclick", e => { + if (this.active === SidebarView.OUTLINE) { + eventBus.dispatch("toggleoutlinetree", { + source: this + }); + return; } - state.lastX = currentX; - const currentY = viewAreaElement.scrollTop; - const lastY = state.lastY; - if (currentY !== lastY) { - state.down = currentY > lastY; + if (this.active === SidebarView.LAYERS) { + eventBus.dispatch("resetlayers", { + source: this + }); } - state.lastY = currentY; - callback(state); }); - }; - const state = { - right: true, - down: true, - lastX: viewAreaElement.scrollLeft, - lastY: viewAreaElement.scrollTop, - _eventHandler: debounceScroll - }; - let rAF = null; - viewAreaElement.addEventListener("scroll", debounceScroll, true); - return state; -} -function parseQueryString(query) { - const params = new Map(); - for (const [key, value] of new URLSearchParams(query)) { - params.set(key.toLowerCase(), value); - } - return params; -} -const InvisibleCharsRegExp = /[\x00-\x1F]/g; -function removeNullCharacters(str, replaceInvisible = false) { - if (!InvisibleCharsRegExp.test(str)) { - return str; + this.thumbnailButton.addEventListener("click", () => { + this.switchView(SidebarView.THUMBS); + }); + this.outlineButton.addEventListener("click", () => { + this.switchView(SidebarView.OUTLINE); + }); + this.attachmentsButton.addEventListener("click", () => { + this.switchView(SidebarView.ATTACHMENTS); + }); + this.layersButton.addEventListener("click", () => { + this.switchView(SidebarView.LAYERS); + }); + this.viewsManagerCurrentOutlineButton.addEventListener("click", () => { + eventBus.dispatch("currentoutlineitem", { + source: this + }); + }); + const onTreeLoaded = (count, button, view) => { + button.disabled = !count; + if (count) { + this.#showUINotification(); + } else if (this.active === view) { + this.switchView(SidebarView.THUMBS); + } + }; + eventBus.on("outlineloaded", evt => { + onTreeLoaded(evt.outlineCount, this.outlineButton, SidebarView.OUTLINE); + evt.currentOutlineItemPromise.then(enabled => { + if (!this.isInitialViewSet) { + return; + } + this.viewsManagerCurrentOutlineButton.disabled = !enabled; + }); + }, internalOpt); + eventBus.on("attachmentsloaded", evt => { + onTreeLoaded(evt.attachmentsCount, this.attachmentsButton, SidebarView.ATTACHMENTS); + }, internalOpt); + eventBus.on("layersloaded", evt => { + onTreeLoaded(evt.layersCount, this.layersButton, SidebarView.LAYERS); + }, internalOpt); + eventBus.on("presentationmodechanged", evt => { + if (evt.state === PresentationModeState.NORMAL && this.visibleView === SidebarView.THUMBS) { + this.onUpdateThumbnails(); + } + }, internalOpt); } - if (replaceInvisible) { - return str.replaceAll(InvisibleCharsRegExp, m => m === "\x00" ? "" : " "); + onStartResizing() { + this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS); } - return str.replaceAll("\x00", ""); -} -function binarySearchFirstItem(items, condition, start = 0) { - let minIndex = start; - let maxIndex = items.length - 1; - if (maxIndex < 0 || !condition(items[maxIndex])) { - return items.length; + onStopResizing() { + this.eventBus.dispatch("resize", { + source: this + }); + this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS); } - if (condition(items[minIndex])) { - return minIndex; + onResizing(newWidth) { + docStyle.setProperty(SIDEBAR_WIDTH_VAR, `${newWidth}px`); } - while (minIndex < maxIndex) { - const currentIndex = minIndex + maxIndex >> 1; - const currentItem = items[currentIndex]; - if (condition(currentItem)) { - maxIndex = currentIndex; +} + +;// ./web/app.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +const FORCE_PAGES_LOADED_TIMEOUT = 10000; +const ViewOnLoad = { + UNKNOWN: -1, + PREVIOUS: 0, + INITIAL: 1 +}; +const PDFViewerApplication = { + initialBookmark: document.location.hash.substring(1), + _initializedCapability: { + ...Promise.withResolvers(), + settled: false + }, + appConfig: null, + pdfDocument: null, + pdfLoadingTask: null, + printService: null, + pdfViewer: null, + pdfThumbnailViewer: null, + pdfRenderingQueue: null, + pdfPresentationMode: null, + pdfDocumentProperties: null, + pdfLinkService: null, + pdfTextExtractor: null, + pdfHistory: null, + viewsManager: null, + pdfOutlineViewer: null, + pdfAttachmentViewer: null, + pdfLayerViewer: null, + pdfCursorTools: null, + pdfScriptingManager: null, + store: null, + downloadManager: null, + overlayManager: null, + preferences: new Preferences(), + toolbar: null, + secondaryToolbar: null, + eventBus: null, + l10n: null, + annotationEditorParams: null, + imageAltTextSettings: null, + isInitialViewSet: false, + isViewerEmbedded: window.parent !== window, + url: "", + baseUrl: "", + mlManager: null, + _downloadUrl: "", + _eventBusAC: null, + _windowAC: null, + _globalAbortController: new AbortController(), + documentInfo: null, + metadata: null, + _contentDispositionFilename: null, + _contentLength: null, + _saveInProgress: false, + _wheelUnusedTicks: 0, + _wheelUnusedFactor: 1, + _touchManager: null, + _touchUnusedTicks: 0, + _touchUnusedFactor: 1, + _PDFBug: null, + _hasAnnotationEditors: false, + _title: document.title, + _printAnnotationStoragePromise: null, + _isCtrlKeyDown: false, + _caretBrowsing: null, + _isScrolling: false, + editorUndoBar: null, + _printPermissionPromise: null, + async initialize(appConfig) { + this.appConfig = appConfig; + try { + await this.preferences.initializedPromise; + } catch (ex) { + console.error("initialize:", ex); + } + if (AppOptions.get("pdfBugEnabled")) { + await this._parseHashParams(); + } + let mode; + switch (AppOptions.get("viewerCssTheme")) { + case 1: + mode = "light"; + break; + case 2: + mode = "dark"; + break; + } + if (mode) { + docStyle.setProperty("color-scheme", mode); + } + this.l10n = await this.externalServices.createL10n(); + document.getElementsByTagName("html")[0].dir = this.l10n.getDirection(); + this.l10n.translate(appConfig.appContainer || document.documentElement); + if (this.isViewerEmbedded && AppOptions.get("externalLinkTarget") === LinkTarget.NONE) { + AppOptions.set("externalLinkTarget", LinkTarget.TOP); + } + await this._initializeViewerComponents(); + this.bindEvents(); + this.bindWindowEvents(); + this._initializedCapability.settled = true; + this._initializedCapability.resolve(); + }, + async _parseHashParams() { + const hash = document.location.hash.substring(1); + if (!hash) { + return; + } + const { + mainContainer, + viewerContainer + } = this.appConfig, + params = parseQueryString(hash); + const loadPDFBug = async () => { + if (this._PDFBug) { + return; + } + const { + PDFBug + } = await import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + AppOptions.get("debuggerSrc")); + this._PDFBug = PDFBug; + }; + if (params.get("disableworker") === "true") { + try { + GlobalWorkerOptions.workerSrc ||= AppOptions.get("workerSrc"); + await import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + PDFWorker.workerSrc); + AppOptions.set("workerPort", null); + } catch (ex) { + console.error("_parseHashParams:", ex); + } + } + if (params.has("textlayer")) { + switch (params.get("textlayer")) { + case "off": + AppOptions.set("textLayerMode", TextLayerMode.DISABLE); + break; + case "visible": + case "shadow": + case "hover": + viewerContainer.classList.add(`textLayer-${params.get("textlayer")}`); + try { + await loadPDFBug(); + this._PDFBug.loadCSS(); + } catch (ex) { + console.error("_parseHashParams:", ex); + } + break; + } + } + if (params.has("pdfbug")) { + const enabled = params.get("pdfbug").split(","); + try { + await loadPDFBug(); + this._PDFBug.init(mainContainer, enabled); + } catch (ex) { + console.error("_parseHashParams:", ex); + } + const debugOpts = { + pdfBug: true, + fontExtraProperties: true + }; + if (globalThis.StepperManager?.enabled) { + debugOpts.minDurationToUpdateCanvas = 0; + } + AppOptions.setAll(debugOpts); + } + if (params.has("locale")) { + AppOptions.set("localeProperties", { + lang: params.get("locale") + }); + } + const opts = { + disableAutoFetch: x => x === "true", + disableFontFace: x => x === "true", + disableHistory: x => x === "true", + disableRange: x => x === "true", + disableStream: x => x === "true", + verbosity: x => x | 0 + }; + for (const name in opts) { + const check = opts[name], + key = name.toLowerCase(); + if (params.has(key)) { + AppOptions.set(name, check(params.get(key))); + } + } + }, + async _initializeViewerComponents() { + const { + appConfig, + externalServices, + l10n, + mlManager + } = this; + const abortSignal = this._globalAbortController.signal; + const eventBus = new EventBus(); + this.eventBus = AppOptions.eventBus = eventBus; + mlManager?.setEventBus(eventBus, abortSignal); + const overlayManager = this.overlayManager = new OverlayManager(); + const renderingQueue = this.pdfRenderingQueue = new PDFRenderingQueue(); + renderingQueue.onIdle = this._cleanup.bind(this); + const linkService = this.pdfLinkService = new PDFLinkService({ + eventBus, + externalLinkTarget: AppOptions.get("externalLinkTarget"), + externalLinkRel: AppOptions.get("externalLinkRel"), + ignoreDestinationZoom: AppOptions.get("ignoreDestinationZoom") + }); + const supportsDownloading = AppOptions.get("supportsDownloading"); + const downloadManager = this.downloadManager = supportsDownloading ? new DownloadManager() : null; + if (appConfig.secondaryToolbar?.downloadButton) { + appConfig.secondaryToolbar.downloadButton.hidden = !supportsDownloading; + } + if (appConfig.toolbar?.download) { + appConfig.toolbar.download.hidden = !supportsDownloading; + } + const findController = this.findController = new PDFFindController({ + linkService, + eventBus, + updateMatchesCountOnProgress: true + }); + const pdfScriptingManager = this.pdfScriptingManager = new PDFScriptingManager({ + eventBus, + externalServices, + docProperties: this._scriptingDocProperties.bind(this) + }); + const container = appConfig.mainContainer, + viewer = appConfig.viewerContainer; + const annotationEditorMode = AppOptions.get("annotationEditorMode"); + const hasForcedColors = AppOptions.get("forcePageColors") || window.matchMedia("(forced-colors: active)").matches; + const pageColors = hasForcedColors ? { + background: AppOptions.get("pageColorsBackground"), + foreground: AppOptions.get("pageColorsForeground") + } : null; + const enableMerge = AppOptions.get("enableMerge"); + const enableSplitMerge = AppOptions.get("enableSplitMerge"); + let altTextManager; + if (AppOptions.get("enableUpdatedAddImage")) { + altTextManager = appConfig.newAltTextDialog ? new NewAltTextManager(appConfig.newAltTextDialog, overlayManager, eventBus) : null; } else { - minIndex = currentIndex + 1; + altTextManager = appConfig.altTextDialog ? new AltTextManager(appConfig.altTextDialog, container, overlayManager, eventBus) : null; + } + if (appConfig.editorUndoBar) { + this.editorUndoBar = new EditorUndoBar(appConfig.editorUndoBar, eventBus); + } + const signatureManager = AppOptions.get("enableSignatureEditor") && appConfig.addSignatureDialog ? new SignatureManager(appConfig.addSignatureDialog, appConfig.editSignatureDialog, appConfig.annotationEditorParams?.editorSignatureAddSignature || null, overlayManager, l10n, externalServices.createSignatureStorage(eventBus, abortSignal), eventBus) : null; + const commentManager = AppOptions.get("enableComment") && appConfig.editCommentDialog ? new CommentManager(appConfig.editCommentDialog, { + learnMoreUrl: AppOptions.get("commentLearnMoreUrl"), + sidebar: appConfig.annotationEditorParams?.editorCommentsSidebar || null, + sidebarResizer: appConfig.annotationEditorParams?.editorCommentsSidebarResizer || null, + commentsList: appConfig.annotationEditorParams?.editorCommentsSidebarList || null, + commentCount: appConfig.annotationEditorParams?.editorCommentsSidebarCount || null, + sidebarTitle: appConfig.annotationEditorParams?.editorCommentsSidebarTitle || null, + closeButton: appConfig.annotationEditorParams?.editorCommentsSidebarCloseButton || null, + commentToolbarButton: appConfig.toolbar?.editorCommentButton || null + }, eventBus, linkService, overlayManager, l10n.getDirection() === "ltr", hasForcedColors, abortSignal) : null; + const maxCanvasPixels = AppOptions.get("maxCanvasPixels"), + maxCanvasDim = AppOptions.get("maxCanvasDim"), + capCanvasAreaFactor = AppOptions.get("capCanvasAreaFactor"); + const pdfViewer = this.pdfViewer = new PDFViewer({ + container, + viewer, + viewerAlert: appConfig.viewerAlert, + eventBus, + renderingQueue, + linkService, + downloadManager, + altTextManager, + commentManager, + signatureManager, + editorUndoBar: this.editorUndoBar, + findController, + scriptingManager: AppOptions.get("enableScripting") && pdfScriptingManager, + l10n, + textLayerMode: AppOptions.get("textLayerMode"), + annotationMode: AppOptions.get("annotationMode"), + annotationEditorMode, + annotationEditorHighlightColors: AppOptions.get("highlightEditorColors"), + enableHighlightFloatingButton: AppOptions.get("enableHighlightFloatingButton"), + enableUpdatedAddImage: AppOptions.get("enableUpdatedAddImage"), + enableNewAltTextWhenAddingImage: AppOptions.get("enableNewAltTextWhenAddingImage"), + imageResourcesPath: AppOptions.get("imageResourcesPath"), + enablePrintAutoRotate: AppOptions.get("enablePrintAutoRotate"), + maxCanvasPixels, + maxCanvasDim, + capCanvasAreaFactor, + enableDetailCanvas: AppOptions.get("enableDetailCanvas"), + enablePermissions: AppOptions.get("enablePermissions"), + enableOptimizedPartialRendering: AppOptions.get("enableOptimizedPartialRendering"), + enableSelectionRendering: AppOptions.get("enableSelectionRendering"), + imagesRightClickMinSize: AppOptions.get("imagesRightClickMinSize"), + pageColors, + mlManager, + abortSignal, + supportsPinchToZoom: this.supportsPinchToZoom, + enableAutoLinking: AppOptions.get("enableAutoLinking"), + minDurationToUpdateCanvas: AppOptions.get("minDurationToUpdateCanvas") + }); + renderingQueue.setViewer(pdfViewer); + linkService.setViewer(pdfViewer); + pdfScriptingManager.setViewer(pdfViewer); + if (appConfig.viewsManager?.thumbnailsView) { + const { + viewsManager + } = appConfig; + this.pdfThumbnailViewer = new PDFThumbnailViewer({ + container: viewsManager.thumbnailsView, + eventBus, + renderingQueue, + linkService, + maxCanvasPixels, + maxCanvasDim, + pageColors, + abortSignal, + enableSplitMerge, + enableMerge, + enableNewBadge: AppOptions.get("enableNewBadge"), + statusBar: viewsManager.viewsManagerStatusBar, + undoBar: viewsManager.viewsManagerUndoBar, + manageMenu: viewsManager.manageMenu, + waitingBar: viewsManager.viewsManagerWaitingBar, + addFileComponent: viewsManager.viewsManagerAddFile + }); + renderingQueue.setThumbnailViewer(this.pdfThumbnailViewer); + } + if (!this.isViewerEmbedded && !AppOptions.get("disableHistory")) { + this.pdfHistory = new PDFHistory({ + linkService, + eventBus + }); + linkService.setHistory(this.pdfHistory); + } + if (!this.supportsIntegratedFind && appConfig.findBar) { + this.findBar = new PDFFindBar(appConfig.findBar, appConfig.principalContainer, eventBus); + } + if (appConfig.annotationEditorParams) { + if (annotationEditorMode !== AnnotationEditorType.DISABLE) { + const editorSignatureButton = appConfig.toolbar?.editorSignatureButton; + if (editorSignatureButton && AppOptions.get("enableSignatureEditor")) { + editorSignatureButton.parentElement.hidden = false; + } + const editorCommentButton = appConfig.toolbar?.editorCommentButton; + if (editorCommentButton && AppOptions.get("enableComment")) { + editorCommentButton.parentElement.hidden = false; + } + this.annotationEditorParams = new AnnotationEditorParams(appConfig.annotationEditorParams, eventBus); + } else { + for (const id of ["editorModeButtons", "editorModeSeparator"]) { + document.getElementById(id)?.classList.add("hidden"); + } + } + } + if (mlManager && appConfig.secondaryToolbar?.imageAltTextSettingsButton) { + this.imageAltTextSettings = new ImageAltTextSettings(appConfig.altTextSettingsDialog, overlayManager, eventBus, mlManager); + } + if (appConfig.documentProperties) { + this.pdfDocumentProperties = new PDFDocumentProperties(appConfig.documentProperties, overlayManager, eventBus, l10n, () => this._docFilename, () => this._docTitle); + } + if (appConfig.secondaryToolbar?.cursorHandToolButton) { + this.pdfCursorTools = new PDFCursorTools({ + container, + eventBus, + cursorToolOnLoad: AppOptions.get("cursorToolOnLoad") + }); + } + if (appConfig.toolbar) { + this.toolbar = new Toolbar(appConfig.toolbar, eventBus, AppOptions.get("toolbarDensity")); + } + if (appConfig.secondaryToolbar) { + if (AppOptions.get("enableAltText")) { + appConfig.secondaryToolbar.imageAltTextSettingsButton?.classList.remove("hidden"); + appConfig.secondaryToolbar.imageAltTextSettingsSeparator?.classList.remove("hidden"); + } + this.secondaryToolbar = new SecondaryToolbar(appConfig.secondaryToolbar, eventBus); + } + if (this.supportsFullscreen && appConfig.secondaryToolbar?.presentationModeButton) { + this.pdfPresentationMode = new PDFPresentationMode({ + container, + pdfViewer, + eventBus + }); + } + if (appConfig.passwordOverlay) { + this.passwordPrompt = new PasswordPrompt(appConfig.passwordOverlay, overlayManager, this.isViewerEmbedded); + } + if (appConfig.viewsManager?.outlinesView) { + this.pdfOutlineViewer = new PDFOutlineViewer({ + container: appConfig.viewsManager.outlinesView, + eventBus, + l10n, + linkService, + downloadManager + }); + } + if (appConfig.viewsManager?.attachmentsView) { + this.pdfAttachmentViewer = new PDFAttachmentViewer({ + container: appConfig.viewsManager.attachmentsView, + eventBus, + l10n, + downloadManager, + linkService + }); + } + if (appConfig.viewsManager?.layersView) { + this.pdfLayerViewer = new PDFLayerViewer({ + container: appConfig.viewsManager.layersView, + eventBus, + l10n + }); + } + if (appConfig.viewsManager) { + this.viewsManager = new ViewsManager({ + elements: appConfig.viewsManager, + eventBus, + l10n, + enableMerge, + enableSplitMerge, + globalAbortSignal: abortSignal + }); + this.viewsManager.onToggled = this.forceRendering.bind(this); + this.viewsManager.onUpdateThumbnails = () => { + for (const pageView of pdfViewer.getCachedPageViews()) { + if (pageView.renderingState === RenderingStates.FINISHED) { + this.pdfThumbnailViewer.getThumbnail(pageView.id - 1)?.setImage(pageView); + } + } + this.pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber); + }; + } + }, + async run(config) { + await this.initialize(config); + const { + appConfig, + eventBus + } = this; + let file; + const queryString = document.location.search.substring(1); + const params = parseQueryString(queryString); + file = params.get("file") ?? AppOptions.get("defaultUrl"); + try { + file = new URL(file).href; + } catch { + file = encodeURIComponent(file).replaceAll("%2F", "/"); + } + validateFileURL(file); + const fileInput = this._openFileInput = document.createElement("input"); + fileInput.id = "fileInput"; + fileInput.hidden = true; + fileInput.type = "file"; + fileInput.value = null; + document.body.append(fileInput); + fileInput.addEventListener("change", function (evt) { + const { + files + } = evt.target; + if (!files?.length) { + return; + } + eventBus.dispatch("fileinputchange", { + source: this, + fileInput: evt.target + }); + }); + appConfig.mainContainer.addEventListener("dragover", function (evt) { + for (const item of evt.dataTransfer.items) { + if (item.type === "application/pdf") { + evt.dataTransfer.dropEffect = evt.dataTransfer.effectAllowed === "copy" ? "copy" : "move"; + stopEvent(evt); + return; + } + } + }); + appConfig.mainContainer.addEventListener("drop", function (evt) { + if (evt.dataTransfer.files?.[0].type !== "application/pdf") { + return; + } + stopEvent(evt); + eventBus.dispatch("fileinputchange", { + source: this, + fileInput: evt.dataTransfer + }); + }); + if (!AppOptions.get("supportsDocumentFonts")) { + AppOptions.set("disableFontFace", true); + this.l10n.get("pdfjs-web-fonts-disabled").then(msg => { + console.warn(msg); + }); + } + const togglePrintingButtons = visible => { + appConfig.toolbar?.print?.classList.toggle("hidden", !visible); + appConfig.secondaryToolbar?.printButton.classList.toggle("hidden", !visible); + }; + if (!this.supportsPrinting) { + togglePrintingButtons(false); + } else { + eventBus.on("printingallowed", ({ + isAllowed + }) => togglePrintingButtons(isAllowed), internalOpt); + } + if (!this.supportsFullscreen) { + appConfig.secondaryToolbar?.presentationModeButton.classList.add("hidden"); + } + if (this.supportsIntegratedFind) { + appConfig.findBar?.toggleButton?.classList.add("hidden"); + } + if (file) { + this.open({ + url: file + }); + } else { + this._hideViewBookmark(); + } + }, + get externalServices() { + return shadow(this, "externalServices", new ExternalServices()); + }, + get initialized() { + return this._initializedCapability.settled; + }, + get initializedPromise() { + return this._initializedCapability.promise; + }, + updateZoom(steps, scaleFactor, origin) { + if (this.pdfViewer.isInPresentationMode) { + return; + } + this.pdfViewer.updateScale({ + drawingDelay: AppOptions.get("defaultZoomDelay"), + steps, + scaleFactor, + origin + }); + }, + zoomIn() { + this.updateZoom(1); + }, + zoomOut() { + this.updateZoom(-1); + }, + zoomReset() { + if (this.pdfViewer.isInPresentationMode) { + return; + } + this.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE; + }, + touchPinchCallback(origin, prevDistance, distance) { + if (this.supportsPinchToZoom) { + const newScaleFactor = this._accumulateFactor(this.pdfViewer.currentScale, distance / prevDistance, "_touchUnusedFactor"); + this.updateZoom(null, newScaleFactor, origin); + } else { + const PIXELS_PER_LINE_SCALE = 30; + const ticks = this._accumulateTicks((distance - prevDistance) / PIXELS_PER_LINE_SCALE, "_touchUnusedTicks"); + this.updateZoom(ticks, null, origin); + } + }, + touchPinchEndCallback() { + this._touchUnusedTicks = 0; + this._touchUnusedFactor = 1; + }, + get pagesCount() { + return this.pdfDocument ? this.pdfDocument.numPages : 0; + }, + get page() { + return this.pdfViewer.currentPageNumber; + }, + set page(val) { + this.pdfViewer.currentPageNumber = val; + }, + get supportsPrinting() { + return shadow(this, "supportsPrinting", AppOptions.get("supportsPrinting") && PDFPrintServiceFactory.supportsPrinting); + }, + get supportsFullscreen() { + return shadow(this, "supportsFullscreen", document.fullscreenEnabled); + }, + get supportsPinchToZoom() { + return shadow(this, "supportsPinchToZoom", AppOptions.get("supportsPinchToZoom")); + }, + get supportsIntegratedFind() { + return shadow(this, "supportsIntegratedFind", AppOptions.get("supportsIntegratedFind")); + }, + get loadingBar() { + const barElement = document.getElementById("loadingBar"); + const bar = barElement ? new ProgressBar(barElement) : null; + return shadow(this, "loadingBar", bar); + }, + get supportsMouseWheelZoomCtrlKey() { + return shadow(this, "supportsMouseWheelZoomCtrlKey", AppOptions.get("supportsMouseWheelZoomCtrlKey")); + }, + get supportsMouseWheelZoomMetaKey() { + return shadow(this, "supportsMouseWheelZoomMetaKey", AppOptions.get("supportsMouseWheelZoomMetaKey")); + }, + get supportsCaretBrowsingMode() { + return AppOptions.get("supportsCaretBrowsingMode"); + }, + moveCaret(isUp, select) { + this._caretBrowsing ||= new CaretBrowsingMode(this._globalAbortController.signal, this.appConfig.mainContainer, this.appConfig.viewerContainer, this.appConfig.toolbar?.container); + this._caretBrowsing.moveCaret(isUp, select); + }, + setTitleUsingUrl(url = "", downloadUrl = null) { + this.url = url; + this.baseUrl = updateUrlHash(url, "", true); + if (downloadUrl) { + this._downloadUrl = downloadUrl === url ? this.baseUrl : updateUrlHash(downloadUrl, "", true); + } + if (isDataScheme(url)) { + this._hideViewBookmark(); + } + let title = getPdfFilenameFromUrl(url, ""); + if (!title) { + try { + title = decodeURIComponent(getFilenameFromUrl(url)); + } catch {} + } + this.setTitle(title || url); + }, + setTitle(title = this._title) { + this._title = title; + if (this.isViewerEmbedded) { + return; + } + const hasChangesIndicator = this._hasChanges() && !this.pdfRenderingQueue.printing; + document.title = `${hasChangesIndicator ? "* " : ""}${title}`; + }, + get _docFilename() { + return this._contentDispositionFilename || getPdfFilenameFromUrl(this.url); + }, + get _docTitle() { + const { + documentInfo, + metadata + } = this; + const title = metadata?.get("dc:title"); + if (title) { + if (title !== "Untitled" && !/[\uFFF0-\uFFFF]/.test(title)) { + return title; + } + } + return documentInfo.Title; + }, + _hideViewBookmark() { + const { + secondaryToolbar + } = this.appConfig; + secondaryToolbar?.viewBookmarkButton.classList.add("hidden"); + if (secondaryToolbar?.presentationModeButton.classList.contains("hidden")) { + document.getElementById("viewBookmarkSeparator")?.classList.add("hidden"); + } + }, + async close() { + this._unblockDocumentLoadEvent(); + this._hideViewBookmark(); + if (!this.pdfLoadingTask) { + return; + } + if (this._hasChanges() && this._annotationStorageModified) { + try { + await this.downloadOrSave(); + } catch {} + } + const promises = []; + promises.push(this.pdfLoadingTask.destroy()); + this.pdfLoadingTask = null; + if (this.pdfDocument) { + this.pdfDocument = null; + this.pdfThumbnailViewer?.setDocument(null); + this.pdfViewer.setDocument(null); + this.pdfLinkService.setDocument(null); + this.pdfDocumentProperties?.setDocument(null); + } + this.pdfLinkService.externalLinkEnabled = true; + this.store = null; + this.isInitialViewSet = false; + this.url = ""; + this.baseUrl = ""; + this._downloadUrl = ""; + this.documentInfo = null; + this.metadata = null; + this._contentDispositionFilename = null; + this._contentLength = null; + this._saveInProgress = false; + this._hasAnnotationEditors = false; + promises.push(this.pdfScriptingManager.destroyPromise, this.passwordPrompt.close()); + this.setTitle(); + this.viewsManager?.reset(); + this.pdfOutlineViewer?.reset(); + this.pdfAttachmentViewer?.reset(); + this.pdfLayerViewer?.reset(); + this.pdfHistory?.reset(); + this.findBar?.reset(); + this.toolbar?.reset(); + this.secondaryToolbar?.reset(); + this._PDFBug?.cleanup(); + await Promise.all(promises); + }, + async open(args) { + if (this.pdfLoadingTask) { + await this.close(); + } + const workerParams = AppOptions.getAll(OptionKind.WORKER); + Object.assign(GlobalWorkerOptions, workerParams); + if (args.data && isPdfFile(args.filename)) { + this._contentDispositionFilename = args.filename; + } else if (args.url) { + this.setTitleUsingUrl(args.originalUrl || args.url, args.url); + } + const apiParams = AppOptions.getAll(OptionKind.API); + const loadingTask = getDocument({ + ...apiParams, + ...args + }); + this.pdfLoadingTask = loadingTask; + loadingTask.onPassword = (updateCallback, reason) => { + if (this.isViewerEmbedded) { + this._unblockDocumentLoadEvent(); + } + this.pdfLinkService.externalLinkEnabled = false; + this.passwordPrompt.setUpdateCallback(updateCallback, reason); + this.passwordPrompt.open(); + }; + loadingTask.onProgress = evt => this.progress(evt.percent); + return loadingTask.promise.then(pdfDocument => { + this.load(pdfDocument); + }, reason => { + if (loadingTask !== this.pdfLoadingTask) { + return undefined; + } + if (this.loadingBar) { + this.loadingBar.percent ||= 0; + } + let key = "pdfjs-loading-error"; + if (reason instanceof InvalidPDFException) { + key = "pdfjs-invalid-file-error"; + } else if (reason instanceof ResponseException) { + key = reason.missing ? "pdfjs-missing-file-error" : "pdfjs-unexpected-response-error"; + } + return this._documentError(key, { + message: reason.message + }).then(() => { + throw reason; + }); + }); + }, + async download() { + if (!this.downloadManager) { + return; + } + let data; + try { + data = await (this.pdfDocument ? this.pdfDocument.getData() : this.pdfLoadingTask.getData()); + } catch {} + this.downloadManager.download(data, this._downloadUrl, this._docFilename); + }, + async save() { + if (!this.downloadManager) { + return; + } + if (this._saveInProgress) { + return; + } + this._saveInProgress = true; + await this.pdfScriptingManager.dispatchWillSave(); + try { + const data = await this.pdfDocument.saveDocument(); + this.downloadManager.download(data, this._downloadUrl, this._docFilename); + } catch (reason) { + console.error(`Error when saving the document:`, reason); + await this.download(); + } finally { + await this.pdfScriptingManager.dispatchDidSave(); + this._saveInProgress = false; + } + const editorStats = this.pdfDocument?.annotationStorage.editorStats; + if (editorStats) { + this.externalServices.reportTelemetry({ + type: "editing", + data: { + type: "save", + stats: editorStats + } + }); + } + }, + async downloadOrSave() { + if (!this.downloadManager) { + return; + } + const { + classList + } = this.appConfig.appContainer; + classList.add("wait"); + if (this.pdfThumbnailViewer?.hasStructuralChanges()) { + this.externalServices.reportTelemetry({ + type: "pageOrganization", + data: { + action: "save" + } + }); + await this.onSavePages({ + data: this.pdfThumbnailViewer.getStructuralChanges() + }); + } else { + await (this.pdfDocument?.annotationStorage.size > 0 ? this.save() : this.download()); + } + delete this._mergedDocumentNeedsSaving; + this.setTitle(); + classList.remove("wait"); + }, + async _documentError(key, moreInfo = null) { + this._unblockDocumentLoadEvent(); + const message = await this._otherError(key || "pdfjs-loading-error", moreInfo); + this.eventBus.dispatch("documenterror", { + source: this, + message, + reason: moreInfo?.message ?? null + }); + }, + async _otherError(key, moreInfo = null) { + const message = await this.l10n.get(key); + const moreInfoText = [`PDF.js v${version || "?"} (build: ${build || "?"})`]; + if (moreInfo) { + moreInfoText.push(`Message: ${moreInfo.message}`); + if (moreInfo.stack) { + moreInfoText.push(`Stack: ${moreInfo.stack}`); + } else { + if (moreInfo.filename) { + moreInfoText.push(`File: ${moreInfo.filename}`); + } + if (moreInfo.lineNumber) { + moreInfoText.push(`Line: ${moreInfo.lineNumber}`); + } + } + } + console.error(`${message}\n\n${moreInfoText.join("\n")}`); + return message; + }, + progress(percent) { + if (!this.loadingBar || percent <= this.loadingBar.percent) { + return; + } + this.loadingBar.percent = percent; + if (this.pdfDocument?.loadingParams.disableAutoFetch ?? AppOptions.get("disableAutoFetch")) { + this.loadingBar.setDisableAutoFetch(); + } + }, + load(pdfDocument) { + this.pdfDocument = pdfDocument; + this._printPermissionPromise = new Promise(resolve => { + this.eventBus.on("printingallowed", ({ + isAllowed + }) => { + resolve(isAllowed); + }, { + once: true, + ...internalOpt + }); + }); + pdfDocument.getDownloadInfo().then(({ + length + }) => { + this._contentLength = length; + this.loadingBar?.hide(); + firstPagePromise.then(() => { + this.eventBus.dispatch("documentloaded", { + source: this + }); + }); + }); + const pageLayoutPromise = pdfDocument.getPageLayout().catch(() => {}); + const pageModePromise = pdfDocument.getPageMode().catch(() => {}); + const openActionPromise = pdfDocument.getOpenAction().catch(() => {}); + this.toolbar?.setPagesCount(pdfDocument.numPages, false); + this.secondaryToolbar?.setPagesCount(pdfDocument.numPages); + this.pdfLinkService.setDocument(pdfDocument); + this.pdfDocumentProperties?.setDocument(pdfDocument); + const pdfViewer = this.pdfViewer; + pdfViewer.setDocument(pdfDocument); + const { + firstPagePromise, + onePageRendered, + pagesPromise + } = pdfViewer; + this.pdfThumbnailViewer?.setDocument(pdfDocument); + const storedPromise = (this.store = new ViewHistory(pdfDocument.fingerprints[0])).getMultiple({ + page: null, + zoom: DEFAULT_SCALE_VALUE, + scrollLeft: "0", + scrollTop: "0", + rotation: null, + sidebarView: SidebarView.UNKNOWN, + scrollMode: ScrollMode.UNKNOWN, + spreadMode: SpreadMode.UNKNOWN + }).catch(() => {}); + firstPagePromise.then(pdfPage => { + this.loadingBar?.setWidth(this.appConfig.viewerContainer); + this._initializeAnnotationStorageCallbacks(pdfDocument); + Promise.all([animationStarted, storedPromise, pageLayoutPromise, pageModePromise, openActionPromise]).then(async ([timeStamp, stored, pageLayout, pageMode, openAction]) => { + const viewOnLoad = AppOptions.get("viewOnLoad"); + this._initializePdfHistory({ + fingerprint: pdfDocument.fingerprints[0], + viewOnLoad, + initialDest: openAction?.dest + }); + const initialBookmark = this.initialBookmark; + const zoom = AppOptions.get("defaultZoomValue"); + let hash = zoom ? `zoom=${zoom}` : null; + let rotation = null; + let sidebarView = AppOptions.get("sidebarViewOnLoad"); + let scrollMode = AppOptions.get("scrollModeOnLoad"); + let spreadMode = AppOptions.get("spreadModeOnLoad"); + if (stored?.page && viewOnLoad !== ViewOnLoad.INITIAL) { + hash = `page=${stored.page}&zoom=${zoom || stored.zoom},` + `${stored.scrollLeft},${stored.scrollTop}`; + rotation = parseInt(stored.rotation, 10); + if (sidebarView === SidebarView.UNKNOWN) { + sidebarView = stored.sidebarView | 0; + } + if (scrollMode === ScrollMode.UNKNOWN) { + scrollMode = stored.scrollMode | 0; + } + if (spreadMode === SpreadMode.UNKNOWN) { + spreadMode = stored.spreadMode | 0; + } + } + if (pageMode && sidebarView === SidebarView.UNKNOWN) { + sidebarView = apiPageModeToSidebarView(pageMode); + } + if (pageLayout && scrollMode === ScrollMode.UNKNOWN && spreadMode === SpreadMode.UNKNOWN) { + const modes = apiPageLayoutToViewerModes(pageLayout); + spreadMode = modes.spreadMode; + } + this.setInitialView(hash, { + rotation, + sidebarView, + scrollMode, + spreadMode + }); + this.eventBus.dispatch("documentinit", { + source: this + }); + await Promise.race([pagesPromise, new Promise(resolve => { + setTimeout(resolve, FORCE_PAGES_LOADED_TIMEOUT); + })]); + if (!initialBookmark && !hash) { + return; + } + if (pdfViewer.hasEqualPageSizes) { + return; + } + this.initialBookmark = initialBookmark; + pdfViewer.currentScaleValue = pdfViewer.currentScaleValue; + this.setInitialView(hash); + }).catch(() => { + this.setInitialView(); + }).then(function () { + pdfViewer.update(); + }); + }); + pagesPromise.then(() => { + this._unblockDocumentLoadEvent(); + this._initializeAutoPrint(pdfDocument, openActionPromise); + }, reason => { + this._documentError("pdfjs-loading-error", { + message: reason.message + }); + }); + onePageRendered.then(data => { + this.externalServices.reportTelemetry({ + type: "pageInfo", + timestamp: data.timestamp + }); + if (this.pdfOutlineViewer) { + pdfDocument.getOutline().then(outline => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.pdfOutlineViewer.render({ + outline, + pdfDocument + }); + }); + } + if (this.pdfAttachmentViewer) { + pdfDocument.getAttachments().then(attachments => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.pdfAttachmentViewer.render({ + attachments + }); + }); + } + if (this.pdfLayerViewer) { + pdfViewer.optionalContentConfigPromise.then(optionalContentConfig => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.pdfLayerViewer.render({ + optionalContentConfig, + pdfDocument + }); + }); + } + }); + this._initializePageLabels(pdfDocument); + this._initializeMetadata(pdfDocument); + }, + async _scriptingDocProperties(pdfDocument) { + if (!this.documentInfo) { + await new Promise(resolve => { + this.eventBus.on("metadataloaded", resolve, { + once: true, + ...internalOpt + }); + }); + if (pdfDocument !== this.pdfDocument) { + return null; + } + } + if (!this._contentLength) { + await new Promise(resolve => { + this.eventBus.on("documentloaded", resolve, { + once: true, + ...internalOpt + }); + }); + if (pdfDocument !== this.pdfDocument) { + return null; + } + } + return { + ...this.documentInfo, + baseURL: this.baseUrl, + filesize: this._contentLength, + filename: this._docFilename, + metadata: this.metadata?.getRaw(), + authors: this.metadata?.get("dc:creator"), + numPages: this.pagesCount, + URL: this.url + }; + }, + async _initializeAutoPrint(pdfDocument, openActionPromise) { + const [openAction, jsActions] = await Promise.all([openActionPromise, this.pdfViewer.enableScripting ? null : pdfDocument.getJSActions()]); + if (pdfDocument !== this.pdfDocument) { + return; + } + let triggerAutoPrint = openAction?.action === "Print"; + if (jsActions) { + console.warn("Warning: JavaScript support is not enabled"); + for (const name in jsActions) { + if (triggerAutoPrint) { + break; + } + switch (name) { + case "WillClose": + case "WillSave": + case "DidSave": + case "WillPrint": + case "DidPrint": + continue; + } + triggerAutoPrint = jsActions[name].some(js => AutoPrintRegExp.test(js)); + } + } + if (triggerAutoPrint) { + this.triggerPrinting(); + } + }, + async _initializeMetadata(pdfDocument) { + const { + info, + metadata, + contentDispositionFilename, + contentLength, + hasStructTree + } = await pdfDocument.getMetadata(); + if (pdfDocument !== this.pdfDocument) { + return; + } + this.externalServices.reportTelemetry({ + type: "taggedPDF", + data: hasStructTree + }); + this.documentInfo = info; + this.metadata = metadata; + this._contentDispositionFilename ??= contentDispositionFilename; + this._contentLength ??= contentLength; + console.log(`PDF ${pdfDocument.fingerprints[0]} [${info.PDFFormatVersion} ` + `${(metadata?.get("pdf:producer") || info.Producer || "-").trim()} / ` + `${(metadata?.get("xmp:creatortool") || info.Creator || "-").trim()}` + `] (PDF.js: ${version || "?"} [${build || "?"}])`); + const pdfTitle = this._docTitle; + if (pdfTitle) { + this.setTitle(`${pdfTitle} - ${this._contentDispositionFilename || this._title}`); + } else if (this._contentDispositionFilename) { + this.setTitle(this._contentDispositionFilename); + } + if (info.IsXFAPresent && !info.IsAcroFormPresent && !pdfDocument.isPureXfa) { + if (pdfDocument.loadingParams.enableXfa) { + console.warn("Warning: XFA Foreground documents are not supported"); + } else { + console.warn("Warning: XFA support is not enabled"); + } + } else if ((info.IsAcroFormPresent || info.IsXFAPresent) && !this.pdfViewer.renderForms) { + console.warn("Warning: Interactive form support is not enabled"); + } + if (info.IsSignaturesPresent) { + console.warn("Warning: Digital signatures validation is not supported"); + } + this.eventBus.dispatch("metadataloaded", { + source: this + }); + }, + async _initializePageLabels(pdfDocument) { + const labels = await pdfDocument.getPageLabels(); + if (pdfDocument !== this.pdfDocument) { + return; + } + if (!labels || AppOptions.get("disablePageLabels")) { + return; + } + const numLabels = labels.length; + let standardLabels = 0, + emptyLabels = 0; + for (let i = 0; i < numLabels; i++) { + const label = labels[i]; + if (label === (i + 1).toString()) { + standardLabels++; + } else if (label === "") { + emptyLabels++; + } else { + break; + } + } + if (standardLabels >= numLabels || emptyLabels >= numLabels) { + return; + } + const { + pdfViewer, + pdfThumbnailViewer, + toolbar + } = this; + pdfViewer.setPageLabels(labels); + pdfThumbnailViewer?.setPageLabels(labels); + toolbar?.setPagesCount(numLabels, true); + toolbar?.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel); + }, + _initializePdfHistory({ + fingerprint, + viewOnLoad, + initialDest = null + }) { + if (!this.pdfHistory) { + return; + } + this.pdfHistory.initialize({ + fingerprint, + resetHistory: viewOnLoad === ViewOnLoad.INITIAL || !!this._mergedDocumentNeedsSaving, + updateUrl: AppOptions.get("historyUpdateUrl") + }); + if (this.pdfHistory.initialBookmark) { + this.initialBookmark = this.pdfHistory.initialBookmark; + this.initialRotation = this.pdfHistory.initialRotation; + } + if (initialDest && !this.initialBookmark && viewOnLoad === ViewOnLoad.UNKNOWN) { + this.initialBookmark = JSON.stringify(initialDest); + this.pdfHistory.push({ + explicitDest: initialDest, + pageNumber: null + }); + } + }, + _hasChanges() { + return this.pdfDocument?.annotationStorage.size > 0 || this.pdfThumbnailViewer?.hasStructuralChanges() || this._mergedDocumentNeedsSaving === true; + }, + _initializeAnnotationStorageCallbacks(pdfDocument) { + if (pdfDocument !== this.pdfDocument) { + return; + } + const { + annotationStorage + } = pdfDocument; + annotationStorage.onSetModified = () => { + this._annotationStorageModified = true; + }; + annotationStorage.onResetModified = () => { + delete this._annotationStorageModified; + }; + annotationStorage.onAnnotationEditor = typeStr => { + this._hasAnnotationEditors = !!typeStr; + this.setTitle(); + }; + }, + setInitialView(storedHash, { + rotation, + sidebarView, + scrollMode, + spreadMode + } = {}) { + const setRotation = angle => { + if (isValidRotation(angle)) { + this.pdfViewer.pagesRotation = angle; + } + }; + const setViewerModes = (scroll, spread) => { + if (isValidScrollMode(scroll)) { + this.pdfViewer.scrollMode = scroll; + } + if (isValidSpreadMode(spread)) { + this.pdfViewer.spreadMode = spread; + } + }; + this.isInitialViewSet = true; + this.viewsManager?.setInitialView(sidebarView); + setViewerModes(scrollMode, spreadMode); + if (this.initialBookmark) { + setRotation(this.initialRotation); + delete this.initialRotation; + this.pdfLinkService.setHash(this.initialBookmark); + this.initialBookmark = null; + } else if (storedHash) { + setRotation(rotation); + this.pdfLinkService.setHash(storedHash); + } + this.toolbar?.setPageNumber(this.pdfViewer.currentPageNumber, this.pdfViewer.currentPageLabel); + this.secondaryToolbar?.setPageNumber(this.pdfViewer.currentPageNumber); + if (!this.pdfViewer.currentScaleValue) { + this.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE; + } + }, + _cleanup() { + if (!this.pdfDocument) { + return; + } + this.pdfViewer.cleanup(); + this.pdfThumbnailViewer?.cleanup(); + this.pdfDocument.cleanup(AppOptions.get("fontExtraProperties")); + }, + forceRendering() { + this.pdfRenderingQueue.printing = !!this.printService; + this.pdfRenderingQueue.isThumbnailViewEnabled = this.viewsManager?.visibleView === SidebarView.THUMBS; + this.pdfRenderingQueue.renderHighestPriority(); + }, + beforePrint() { + this._printAnnotationStoragePromise = this.pdfScriptingManager.dispatchWillPrint().catch(() => {}).then(() => this.pdfDocument?.annotationStorage.print); + if (this.printService) { + return; + } + if (!this.supportsPrinting || !this.pdfViewer.printingAllowed) { + this._otherError("pdfjs-printing-not-supported"); + return; + } + if (!this.pdfViewer.pageViewsReady) { + this.l10n.get("pdfjs-printing-not-ready").then(msg => { + window.alert(msg); + }); + return; + } + this.printService = PDFPrintServiceFactory.createPrintService({ + pdfDocument: this.pdfDocument, + pagesOverview: this.pdfViewer.getPagesOverview(), + printContainer: this.appConfig.printContainer, + printResolution: AppOptions.get("printResolution"), + printAnnotationStoragePromise: this._printAnnotationStoragePromise + }); + this.forceRendering(); + this.setTitle(); + this.printService.layout(); + if (this._hasAnnotationEditors) { + this.externalServices.reportTelemetry({ + type: "editing", + data: { + type: "print", + stats: this.pdfDocument?.annotationStorage.editorStats + } + }); + } + }, + afterPrint() { + if (this._printAnnotationStoragePromise) { + this._printAnnotationStoragePromise.then(() => { + this.pdfScriptingManager.dispatchDidPrint(); + }); + this._printAnnotationStoragePromise = null; + } + if (this.printService) { + this.printService.destroy(); + this.printService = null; + this.pdfDocument?.annotationStorage.resetModified(); + } + this.forceRendering(); + this.setTitle(); + }, + rotatePages(delta) { + this.pdfViewer.pagesRotation += delta; + }, + requestPresentationMode() { + this.pdfPresentationMode?.request(); + }, + async triggerPrinting() { + if (this.supportsPrinting && (await this._printPermissionPromise)) { + window.print(); + } + }, + bindEvents() { + if (this._eventBusAC) { + return; + } + const ac = this._eventBusAC = new AbortController(); + const opts = { + signal: ac.signal, + ...internalOpt + }; + const { + eventBus, + externalServices, + pdfDocumentProperties, + pdfViewer, + preferences + } = this; + eventBus.on("resize", onResize.bind(this), opts); + eventBus.on("hashchange", onHashchange.bind(this), opts); + eventBus.on("beforeprint", this.beforePrint.bind(this), opts); + eventBus.on("afterprint", this.afterPrint.bind(this), opts); + eventBus.on("pagerender", onPageRender.bind(this), opts); + eventBus.on("pagerendered", onPageRendered.bind(this), opts); + eventBus.on("updateviewarea", onUpdateViewarea.bind(this), opts); + eventBus.on("pagechanging", onPageChanging.bind(this), opts); + eventBus.on("scalechanging", onScaleChanging.bind(this), opts); + eventBus.on("rotationchanging", onRotationChanging.bind(this), opts); + eventBus.on("sidebarviewchanged", onSidebarViewChanged.bind(this), opts); + eventBus.on("pagemode", onPageMode.bind(this), opts); + eventBus.on("namedaction", onNamedAction.bind(this), opts); + eventBus.on("presentationmodechanged", evt => pdfViewer.presentationModeState = evt.state, opts); + eventBus.on("presentationmode", this.requestPresentationMode.bind(this), opts); + eventBus.on("switchannotationeditormode", evt => pdfViewer.annotationEditorMode = evt, opts); + eventBus.on("print", this.triggerPrinting.bind(this), opts); + eventBus.on("download", this.downloadOrSave.bind(this), opts); + eventBus.on("firstpage", () => this.page = 1, opts); + eventBus.on("lastpage", () => this.page = this.pagesCount, opts); + eventBus.on("nextpage", () => pdfViewer.nextPage(), opts); + eventBus.on("previouspage", () => pdfViewer.previousPage(), opts); + eventBus.on("zoomin", this.zoomIn.bind(this), opts); + eventBus.on("zoomout", this.zoomOut.bind(this), opts); + eventBus.on("zoomreset", this.zoomReset.bind(this), opts); + eventBus.on("pagenumberchanged", onPageNumberChanged.bind(this), opts); + eventBus.on("scalechanged", evt => pdfViewer.currentScaleValue = evt.value, opts); + eventBus.on("rotatecw", this.rotatePages.bind(this, 90), opts); + eventBus.on("rotateccw", this.rotatePages.bind(this, -90), opts); + eventBus.on("optionalcontentconfig", evt => pdfViewer.optionalContentConfigPromise = evt.promise, opts); + eventBus.on("switchscrollmode", evt => pdfViewer.scrollMode = evt.mode, opts); + eventBus.on("scrollmodechanged", onViewerModesChanged.bind(this, "scrollMode"), opts); + eventBus.on("switchspreadmode", evt => pdfViewer.spreadMode = evt.mode, opts); + eventBus.on("spreadmodechanged", onViewerModesChanged.bind(this, "spreadMode"), opts); + eventBus.on("imagealttextsettings", onImageAltTextSettings.bind(this), opts); + eventBus.on("documentproperties", () => pdfDocumentProperties?.open(), opts); + eventBus.on("findfromurlhash", onFindFromUrlHash.bind(this), opts); + eventBus.on("updatefindmatchescount", onUpdateFindMatchesCount.bind(this), opts); + eventBus.on("updatefindcontrolstate", onUpdateFindControlState.bind(this), opts); + eventBus.on("fileinputchange", onFileInputChange.bind(this), opts); + eventBus.on("openfile", onOpenFile.bind(this), opts); + eventBus.on("pagesedited", this.onPagesEdited.bind(this), opts); + eventBus.on("saveextractedpages", this.onSavePages.bind(this), opts); + eventBus.on("saveandload", this.onSaveAndLoad.bind(this), opts); + }, + bindWindowEvents() { + if (this._windowAC) { + return; + } + this._windowAC = new AbortController(); + const { + eventBus, + appConfig: { + mainContainer + }, + pdfViewer, + _windowAC: { + signal + } + } = this; + this._touchManager = new TouchManager({ + container: window, + isPinchingDisabled: () => pdfViewer.isInPresentationMode, + isPinchingStopped: () => this.overlayManager?.active, + onPinching: this.touchPinchCallback.bind(this), + onPinchEnd: this.touchPinchEndCallback.bind(this), + signal + }); + function addWindowResolutionChange(evt = null) { + if (evt) { + pdfViewer.refresh(); + } + const mediaQueryList = window.matchMedia(`(resolution: ${OutputScale.pixelRatio}dppx)`); + mediaQueryList.addEventListener("change", addWindowResolutionChange, { + once: true, + signal + }); + } + addWindowResolutionChange(); + window.addEventListener("wheel", onWheel.bind(this), { + passive: false, + signal + }); + window.addEventListener("click", onClick.bind(this), { + signal + }); + window.addEventListener("keydown", onKeyDown.bind(this), { + signal + }); + window.addEventListener("keyup", onKeyUp.bind(this), { + signal + }); + window.addEventListener("resize", () => eventBus.dispatch("resize", { + source: window + }), { + signal + }); + window.addEventListener("hashchange", () => { + eventBus.dispatch("hashchange", { + source: window, + hash: document.location.hash.substring(1) + }); + }, { + signal + }); + window.addEventListener("beforeprint", () => eventBus.dispatch("beforeprint", { + source: window + }), { + signal + }); + window.addEventListener("afterprint", () => eventBus.dispatch("afterprint", { + source: window + }), { + signal + }); + window.addEventListener("updatefromsandbox", evt => { + eventBus.dispatch("updatefromsandbox", { + source: window, + detail: evt.detail + }); + }, { + signal + }); + window.addEventListener("beforeunload", onBeforeUnload.bind(this), { + signal + }); + if (!("onscrollend" in document.documentElement)) { + return; + } + ({ + scrollTop: this._lastScrollTop, + scrollLeft: this._lastScrollLeft + } = mainContainer); + let scrollendTimeoutID, scrollAbortController; + const scrollend = () => { + ({ + scrollTop: this._lastScrollTop, + scrollLeft: this._lastScrollLeft + } = mainContainer); + clearTimeout(scrollendTimeoutID); + if (this._isScrolling) { + scrollAbortController.abort(); + scrollAbortController = null; + this._isScrolling = false; + } + }; + const scroll = () => { + if (this._isCtrlKeyDown) { + return; + } + if (this._lastScrollTop === mainContainer.scrollTop && this._lastScrollLeft === mainContainer.scrollLeft) { + return; + } + if (!this._isScrolling) { + scrollAbortController = new AbortController(); + const abortSignal = AbortSignal.any([scrollAbortController.signal, signal]); + mainContainer.addEventListener("scrollend", scrollend, { + signal: abortSignal + }); + mainContainer.addEventListener("blur", scrollend, { + signal: abortSignal + }); + this._isScrolling = true; + } + clearTimeout(scrollendTimeoutID); + scrollendTimeoutID = setTimeout(scrollend, 100); + }; + mainContainer.addEventListener("scroll", scroll, { + passive: true, + signal + }); + }, + unbindEvents() { + this._eventBusAC?.abort(); + this._eventBusAC = null; + }, + unbindWindowEvents() { + this._windowAC?.abort(); + this._windowAC = null; + this._touchManager = null; + }, + async testingClose() { + this.unbindEvents(); + this.unbindWindowEvents(); + this._globalAbortController?.abort(); + this._globalAbortController = null; + this.findBar?.close(); + await Promise.all([this.l10n?.destroy(), this.close()]); + }, + onPagesEdited(data) { + this.pdfViewer.onPagesEdited(data); + }, + async onSavePages({ + data: extractParams + }) { + if (!this.downloadManager) { + return; + } + if (!this.pdfDocument) { + return; + } + const modifiedPdfBytes = await this.pdfDocument.extractPages(extractParams); + if (!modifiedPdfBytes) { + console.error("Something wrong happened when saving the edited PDF.\nPlease file a bug."); + return; + } + this.downloadManager.download(modifiedPdfBytes, this._downloadUrl, this._docFilename); + }, + async onSaveAndLoad({ + data: extractParams + }) { + if (!this.pdfDocument) { + return; + } + const modifiedPdfBytes = await this.pdfDocument.extractPages(extractParams); + if (!modifiedPdfBytes) { + console.error("Something wrong happened when saving the edited PDF.\nPlease file a bug."); + return; + } + this._mergedDocumentNeedsSaving = true; + this.open({ + data: modifiedPdfBytes, + filename: this._docFilename + }); + }, + _accumulateTicks(ticks, prop) { + if (this[prop] > 0 && ticks < 0 || this[prop] < 0 && ticks > 0) { + this[prop] = 0; + } + this[prop] += ticks; + const wholeTicks = Math.trunc(this[prop]); + this[prop] -= wholeTicks; + return wholeTicks; + }, + _accumulateFactor(previousScale, factor, prop) { + if (factor === 1) { + return 1; + } + if (this[prop] > 1 && factor < 1 || this[prop] < 1 && factor > 1) { + this[prop] = 1; } + const newFactor = Math.floor(previousScale * factor * this[prop] * 100) / (100 * previousScale); + this[prop] = factor / newFactor; + return newFactor; + }, + _unblockDocumentLoadEvent() { + document.blockUnblockOnload?.(false); + this._unblockDocumentLoadEvent = () => {}; + }, + get scriptingReady() { + return this.pdfScriptingManager.ready; } - return minIndex; +}; +initCom(PDFViewerApplication); +PDFPrintServiceFactory.initGlobals(PDFViewerApplication); +{ + const HOSTED_VIEWER_ORIGINS = new Set(["null", "http://mozilla.github.io", "https://mozilla.github.io"]); + var validateFileURL = function (file) { + if (!file) { + return; + } + const viewerOrigin = URL.parse(window.location)?.origin || "null"; + if (HOSTED_VIEWER_ORIGINS.has(viewerOrigin)) { + return; + } + const fileOrigin = URL.parse(file, window.location)?.origin; + if (fileOrigin === viewerOrigin) { + return; + } + const ex = new Error("file origin does not match viewer's"); + PDFViewerApplication._documentError("pdfjs-loading-error", { + message: ex.message + }); + throw ex; + }; + var onFileInputChange = function (evt) { + if (this.pdfViewer?.isInPresentationMode) { + return; + } + const file = evt.fileInput.files[0]; + this.open({ + url: URL.createObjectURL(file), + originalUrl: encodeURIComponent(file.name) + }); + }; + var onOpenFile = function (evt) { + this._openFileInput?.click(); + }; } -function approximateFraction(x) { - if (Math.floor(x) === x) { - return [x, 1]; +function onPageRender({ + pageNumber +}) { + if (pageNumber === this.page) { + this.toolbar?.updateLoadingIndicatorState(true); } - const xinv = 1 / x; - const limit = 8; - if (xinv > limit) { - return [1, limit]; - } else if (Math.floor(xinv) === xinv) { - return [1, xinv]; +} +function onPageRendered({ + pageNumber, + isDetailView, + error +}) { + if (pageNumber === this.page) { + this.toolbar?.updateLoadingIndicatorState(false); } - const x_ = x > 1 ? xinv : x; - let a = 0, - b = 1, - c = 1, - d = 1; - while (true) { - const p = a + c, - q = b + d; - if (q > limit) { - break; - } - if (x_ <= p / q) { - c = p; - d = q; - } else { - a = p; - b = q; + if (!isDetailView && this.viewsManager?.visibleView === SidebarView.THUMBS) { + const pageView = this.pdfViewer.getPageView(pageNumber - 1); + const thumbnailView = this.pdfThumbnailViewer?.getThumbnail(pageNumber - 1); + if (pageView) { + thumbnailView?.setImage(pageView); } } - let result; - if (x_ - a / b < c / d - x_) { - result = x_ === x ? [a, b] : [b, a]; - } else { - result = x_ === x ? [c, d] : [d, c]; + if (error) { + this._otherError("pdfjs-rendering-error", error); } - return result; -} -function roundToDivide(x, div) { - const r = x % div; - return r === 0 ? x : Math.round(x - r + div); } -function getPageSizeInches({ - view, - userUnit, - rotate +function onPageMode({ + mode }) { - const [x1, y1, x2, y2] = view; - const changeOrientation = rotate % 180 !== 0; - const width = (x2 - x1) / 72 * userUnit; - const height = (y2 - y1) / 72 * userUnit; - return { - width: changeOrientation ? height : width, - height: changeOrientation ? width : height - }; -} -function backtrackBeforeAllVisibleElements(index, views, top) { - if (index < 2) { - return index; - } - let elt = views[index].div; - let pageTop = elt.offsetTop + elt.clientTop; - if (pageTop >= top) { - elt = views[index - 1].div; - pageTop = elt.offsetTop + elt.clientTop; + let view; + switch (mode) { + case "thumbs": + view = SidebarView.THUMBS; + break; + case "bookmarks": + case "outline": + view = SidebarView.OUTLINE; + break; + case "attachments": + view = SidebarView.ATTACHMENTS; + break; + case "layers": + view = SidebarView.LAYERS; + break; + case "none": + view = SidebarView.NONE; + break; + default: + console.error('Invalid "pagemode" hash parameter: ' + mode); + return; } - for (let i = index - 2; i >= 0; --i) { - elt = views[i].div; - if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) { + this.viewsManager?.switchView(view, true); +} +function onNamedAction(evt) { + switch (evt.action) { + case "GoToPage": + this.appConfig.toolbar?.pageNumber.select(); + break; + case "Find": + if (!this.supportsIntegratedFind) { + this.findBar?.toggle(); + } + break; + case "Print": + this.triggerPrinting(); + break; + case "SaveAs": + this.downloadOrSave(); break; - } - index = i; } - return index; } -function getVisibleElements({ - scrollEl, - views, - sortByVisibility = false, - horizontal = false, - rtl = false +function onSidebarViewChanged({ + view }) { - const top = scrollEl.scrollTop, - bottom = top + scrollEl.clientHeight; - const left = scrollEl.scrollLeft, - right = left + scrollEl.clientWidth; - function isElementBottomAfterViewTop(view) { - const element = view.div; - const elementBottom = element.offsetTop + element.clientTop + element.clientHeight; - return elementBottom > top; + this.pdfRenderingQueue.isThumbnailViewEnabled = view === SidebarView.THUMBS; + if (this.isInitialViewSet) { + this.store?.set("sidebarView", view).catch(() => {}); } - function isElementNextAfterViewHorizontally(view) { - const element = view.div; - const elementLeft = element.offsetLeft + element.clientLeft; - const elementRight = elementLeft + element.clientWidth; - return rtl ? elementLeft < right : elementRight > left; +} +function onUpdateViewarea({ + location +}) { + if (this.isInitialViewSet) { + this.store?.setMultiple({ + page: location.pageNumber, + zoom: location.scale, + scrollLeft: location.left, + scrollTop: location.top, + rotation: location.rotation + }).catch(() => {}); } - const visible = [], - ids = new Set(), - numViews = views.length; - let firstVisibleElementInd = binarySearchFirstItem(views, horizontal ? isElementNextAfterViewHorizontally : isElementBottomAfterViewTop); - if (firstVisibleElementInd > 0 && firstVisibleElementInd < numViews && !horizontal) { - firstVisibleElementInd = backtrackBeforeAllVisibleElements(firstVisibleElementInd, views, top); + if (this.appConfig.secondaryToolbar) { + this.appConfig.secondaryToolbar.viewBookmarkButton.href = this.pdfLinkService.getAnchorUrl(location.pdfOpenParams); } - let lastEdge = horizontal ? right : -1; - for (let i = firstVisibleElementInd; i < numViews; i++) { - const view = views[i], - element = view.div; - const currentWidth = element.offsetLeft + element.clientLeft; - const currentHeight = element.offsetTop + element.clientTop; - const viewWidth = element.clientWidth, - viewHeight = element.clientHeight; - const viewRight = currentWidth + viewWidth; - const viewBottom = currentHeight + viewHeight; - if (lastEdge === -1) { - if (viewBottom >= bottom) { - lastEdge = viewBottom; - } - } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) { - break; - } - if (viewBottom <= top || currentHeight >= bottom || viewRight <= left || currentWidth >= right) { - continue; - } - const hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, viewBottom - bottom); - const hiddenWidth = Math.max(0, left - currentWidth) + Math.max(0, viewRight - right); - const fractionHeight = (viewHeight - hiddenHeight) / viewHeight, - fractionWidth = (viewWidth - hiddenWidth) / viewWidth; - const percent = fractionHeight * fractionWidth * 100 | 0; - visible.push({ - id: view.id, - x: currentWidth, - y: currentHeight, - view, - percent, - widthPercent: fractionWidth * 100 | 0 - }); - ids.add(view.id); +} +function onViewerModesChanged(name, evt) { + if (this.isInitialViewSet && !this.pdfViewer.isInPresentationMode) { + this.store?.set(name, evt.mode).catch(() => {}); } - const first = visible[0], - last = visible.at(-1); - if (sortByVisibility) { - visible.sort(function (a, b) { - const pc = a.percent - b.percent; - if (Math.abs(pc) > 0.001) { - return -pc; - } - return a.id - b.id; - }); +} +function onResize() { + const { + pdfDocument, + pdfViewer, + pdfRenderingQueue + } = this; + if (pdfRenderingQueue.printing && window.matchMedia("print").matches) { + return; } - return { - first, - last, - views: visible, - ids - }; + if (!pdfDocument) { + return; + } + const currentScaleValue = pdfViewer.currentScaleValue; + if (currentScaleValue === "auto" || currentScaleValue === "page-fit" || currentScaleValue === "page-width") { + pdfViewer.currentScaleValue = currentScaleValue; + } + pdfViewer.update(); } -function normalizeWheelEventDirection(evt) { - let delta = Math.hypot(evt.deltaX, evt.deltaY); - const angle = Math.atan2(evt.deltaY, evt.deltaX); - if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) { - delta = -delta; +function onHashchange(evt) { + const hash = evt.hash; + if (!hash) { + return; + } + if (!this.isInitialViewSet) { + this.initialBookmark = hash; + } else if (!this.pdfHistory?.popStateInProgress) { + this.pdfLinkService.setHash(hash); } - return delta; } -function normalizeWheelEventDelta(evt) { - const deltaMode = evt.deltaMode; - let delta = normalizeWheelEventDirection(evt); - const MOUSE_PIXELS_PER_LINE = 30; - const MOUSE_LINES_PER_PAGE = 30; - if (deltaMode === WheelEvent.DOM_DELTA_PIXEL) { - delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE; - } else if (deltaMode === WheelEvent.DOM_DELTA_LINE) { - delta /= MOUSE_LINES_PER_PAGE; +function onPageNumberChanged(evt) { + const { + pdfViewer + } = this; + if (evt.value !== "") { + this.pdfLinkService.goToPage(evt.value); + } + if (evt.value !== pdfViewer.currentPageNumber.toString() && evt.value !== pdfViewer.currentPageLabel) { + this.toolbar?.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel); } - return delta; } -function isValidRotation(angle) { - return Number.isInteger(angle) && angle % 90 === 0; +function onImageAltTextSettings() { + this.imageAltTextSettings?.open({ + enableGuessAltText: AppOptions.get("enableGuessAltText"), + enableNewAltTextWhenAddingImage: AppOptions.get("enableNewAltTextWhenAddingImage") + }); } -function isValidScrollMode(mode) { - return Number.isInteger(mode) && Object.values(ScrollMode).includes(mode) && mode !== ScrollMode.UNKNOWN; +function onFindFromUrlHash(evt) { + this.eventBus.dispatch("find", { + source: evt.source, + type: "", + query: evt.query, + caseSensitive: false, + entireWord: false, + highlightAll: true, + findPrevious: false, + matchDiacritics: true + }); } -function isValidSpreadMode(mode) { - return Number.isInteger(mode) && Object.values(SpreadMode).includes(mode) && mode !== SpreadMode.UNKNOWN; +function onUpdateFindMatchesCount({ + matchesCount +}) { + if (this.supportsIntegratedFind) { + this.externalServices.updateFindMatchesCount(matchesCount); + } else { + this.findBar?.updateResultsCount(matchesCount); + } } -function isPortraitOrientation(size) { - return size.width <= size.height; +function onUpdateFindControlState({ + state, + previous, + entireWord, + matchesCount, + rawQuery +}) { + if (this.supportsIntegratedFind) { + this.externalServices.updateFindControlState({ + result: state, + findPrevious: previous, + entireWord, + matchesCount, + rawQuery + }); + } else { + this.findBar?.updateUIState(state, previous, matchesCount); + } } -const animationStarted = new Promise(function (resolve) { - window.requestAnimationFrame(resolve); -}); -const docStyle = document.documentElement.style; -function clamp(v, min, max) { - return Math.min(Math.max(v, min), max); +function onScaleChanging(evt) { + this.toolbar?.setPageScale(evt.presetValue, evt.scale); + this.pdfViewer.update(); } -class ProgressBar { - #classList = null; - #disableAutoFetchTimeout = null; - #percent = 0; - #style = null; - #visible = true; - constructor(bar) { - this.#classList = bar.classList; - this.#style = bar.style; - } - get percent() { - return this.#percent; +function onRotationChanging(evt) { + if (this.pdfThumbnailViewer) { + this.pdfThumbnailViewer.pagesRotation = evt.pagesRotation; } - set percent(val) { - this.#percent = clamp(val, 0, 100); - if (isNaN(val)) { - this.#classList.add("indeterminate"); - return; - } - this.#classList.remove("indeterminate"); - this.#style.setProperty("--progressBar-percent", `${this.#percent}%`); + this.forceRendering(); + this.pdfViewer.currentPageNumber = evt.pageNumber; +} +function onPageChanging({ + pageNumber, + pageLabel +}) { + this.toolbar?.setPageNumber(pageNumber, pageLabel); + this.secondaryToolbar?.setPageNumber(pageNumber); + if (this.viewsManager?.visibleView === SidebarView.THUMBS) { + this.pdfThumbnailViewer?.scrollThumbnailIntoView(pageNumber); } - setWidth(viewer) { - if (!viewer) { - return; - } - const container = viewer.parentNode; - const scrollbarWidth = container.offsetWidth - viewer.offsetWidth; - if (scrollbarWidth > 0) { - this.#style.setProperty("--progressBar-end-offset", `${scrollbarWidth}px`); - } + const currentPage = this.pdfViewer.getPageView(pageNumber - 1); + this.toolbar?.updateLoadingIndicatorState(currentPage?.renderingState === RenderingStates.RUNNING); +} +function onWheel(evt) { + const { + pdfViewer, + supportsMouseWheelZoomCtrlKey, + supportsMouseWheelZoomMetaKey, + supportsPinchToZoom + } = this; + if (pdfViewer.isInPresentationMode) { + return; } - setDisableAutoFetch(delay = 5000) { - if (isNaN(this.#percent)) { + const deltaMode = evt.deltaMode; + let scaleFactor = Math.exp(-evt.deltaY / 100); + const isBuiltInMac = false; + const isPinchToZoom = evt.ctrlKey && !this._isCtrlKeyDown && deltaMode === WheelEvent.DOM_DELTA_PIXEL && evt.deltaX === 0 && (Math.abs(scaleFactor - 1) < 0.05 || isBuiltInMac) && evt.deltaZ === 0; + const origin = [evt.clientX, evt.clientY]; + if (isPinchToZoom || evt.ctrlKey && supportsMouseWheelZoomCtrlKey || evt.metaKey && supportsMouseWheelZoomMetaKey) { + evt.preventDefault(); + if (this._isScrolling || document.visibilityState === "hidden" || this.overlayManager.active) { return; } - if (this.#disableAutoFetchTimeout) { - clearTimeout(this.#disableAutoFetchTimeout); + if (isPinchToZoom && supportsPinchToZoom) { + scaleFactor = this._accumulateFactor(pdfViewer.currentScale, scaleFactor, "_wheelUnusedFactor"); + this.updateZoom(null, scaleFactor, origin); + } else { + const delta = normalizeWheelEventDirection(evt); + let ticks = 0; + if (deltaMode === WheelEvent.DOM_DELTA_LINE || deltaMode === WheelEvent.DOM_DELTA_PAGE) { + ticks = Math.abs(delta) >= 1 ? Math.sign(delta) : this._accumulateTicks(delta, "_wheelUnusedTicks"); + } else { + const PIXELS_PER_LINE_SCALE = 30; + ticks = this._accumulateTicks(delta / PIXELS_PER_LINE_SCALE, "_wheelUnusedTicks"); + } + this.updateZoom(ticks, null, origin); } - this.show(); - this.#disableAutoFetchTimeout = setTimeout(() => { - this.#disableAutoFetchTimeout = null; - this.hide(); - }, delay); } - hide() { - if (!this.#visible) { - return; - } - this.#visible = false; - this.#classList.add("hidden"); +} +function closeSecondaryToolbar({ + target +}) { + if (!this.secondaryToolbar?.isOpen) { + return; } - show() { - if (this.#visible) { - return; - } - this.#visible = true; - this.#classList.remove("hidden"); + const { + toolbar, + secondaryToolbar + } = this.appConfig; + if (this.pdfViewer.containsElement(target) || toolbar?.container.contains(target) && !secondaryToolbar?.toolbar.contains(target) && !secondaryToolbar?.toggleButton.contains(target)) { + this.secondaryToolbar.close(); } } -function getActiveOrFocusedElement() { - let curRoot = document; - let curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus"); - while (curActiveOrFocused?.shadowRoot) { - curRoot = curActiveOrFocused.shadowRoot; - curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus"); +function closeEditorUndoBar(evt) { + if (!this.editorUndoBar?.isOpen) { + return; } - return curActiveOrFocused; -} -function apiPageLayoutToViewerModes(layout) { - let scrollMode = ScrollMode.VERTICAL, - spreadMode = SpreadMode.NONE; - switch (layout) { - case "SinglePage": - scrollMode = ScrollMode.PAGE; - break; - case "OneColumn": - break; - case "TwoPageLeft": - scrollMode = ScrollMode.PAGE; - case "TwoColumnLeft": - spreadMode = SpreadMode.ODD; - break; - case "TwoPageRight": - scrollMode = ScrollMode.PAGE; - case "TwoColumnRight": - spreadMode = SpreadMode.EVEN; - break; + if (this.appConfig.secondaryToolbar?.toolbar.contains(evt.target)) { + this.editorUndoBar.hide(); } - return { - scrollMode, - spreadMode - }; } -function apiPageModeToSidebarView(mode) { - switch (mode) { - case "UseNone": - return SidebarView.NONE; - case "UseThumbs": - return SidebarView.THUMBS; - case "UseOutlines": - return SidebarView.OUTLINE; - case "UseAttachments": - return SidebarView.ATTACHMENTS; - case "UseOC": - return SidebarView.LAYERS; +function onBeforeUnload(evt) { + if (this._hasChanges()) { + evt.preventDefault(); + evt.returnValue = ""; + return false; } - return SidebarView.NONE; + return true; } -function toggleCheckedBtn(button, toggle, view = null) { - button.classList.toggle("toggled", toggle); - button.setAttribute("aria-checked", toggle); - view?.classList.toggle("hidden", !toggle); +function onClick(evt) { + closeSecondaryToolbar.call(this, evt); + closeEditorUndoBar.call(this, evt); } -function toggleExpandedBtn(button, toggle, view = null) { - button.classList.toggle("toggled", toggle); - button.setAttribute("aria-expanded", toggle); - view?.classList.toggle("hidden", !toggle); +function onKeyUp(evt) { + if (evt.key === "Control") { + this._isCtrlKeyDown = false; + } } - - -/***/ }), - -/***/ 9226: -/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { - -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ ViewHistory: () => (/* binding */ ViewHistory) -/* harmony export */ }); -const DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20; -class ViewHistory { - constructor(fingerprint, cacheSize = DEFAULT_VIEW_HISTORY_CACHE_SIZE) { - this.fingerprint = fingerprint; - this.cacheSize = cacheSize; - this._initializedPromise = this._readFromStorage().then(databaseStr => { - const database = JSON.parse(databaseStr || "{}"); - let index = -1; - if (!Array.isArray(database.files)) { - database.files = []; - } else { - while (database.files.length >= this.cacheSize) { - database.files.shift(); +function onKeyDown(evt) { + this._isCtrlKeyDown = evt.key === "Control"; + if (this.editorUndoBar?.isOpen && evt.keyCode !== 9 && evt.keyCode !== 16 && !((evt.keyCode === 13 || evt.keyCode === 32) && getActiveOrFocusedElement() === this.appConfig.editorUndoBar.undoButton)) { + this.editorUndoBar.hide(); + } + if (this.overlayManager.active) { + return; + } + const { + eventBus, + pdfViewer + } = this; + const isViewerInPresentationMode = pdfViewer.isInPresentationMode; + let handled = false, + ensureViewerFocused = false; + const cmd = (evt.ctrlKey ? 1 : 0) | (evt.altKey ? 2 : 0) | (evt.shiftKey ? 4 : 0) | (evt.metaKey ? 8 : 0); + if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) { + switch (evt.keyCode) { + case 70: + if (!this.supportsIntegratedFind && !evt.shiftKey) { + this.findBar?.open(); + handled = true; } - for (let i = 0, ii = database.files.length; i < ii; i++) { - const branch = database.files[i]; - if (branch.fingerprint === this.fingerprint) { - index = i; - break; + break; + case 71: + if (!this.supportsIntegratedFind) { + const { + state + } = this.findController; + if (state) { + const newState = { + source: window, + type: "again", + findPrevious: cmd === 5 || cmd === 12 + }; + eventBus.dispatch("find", { + ...state, + ...newState + }); } + handled = true; } - } - if (index === -1) { - index = database.files.push({ - fingerprint: this.fingerprint - }) - 1; - } - this.file = database.files[index]; - this.database = database; - }); + break; + case 61: + case 107: + case 187: + case 171: + this.zoomIn(); + handled = true; + break; + case 173: + case 109: + case 189: + this.zoomOut(); + handled = true; + break; + case 48: + case 96: + if (!isViewerInPresentationMode) { + setTimeout(() => { + this.zoomReset(); + }); + handled = false; + } + break; + case 38: + if (isViewerInPresentationMode || this.page > 1) { + this.page = 1; + handled = true; + ensureViewerFocused = true; + } + break; + case 40: + if (isViewerInPresentationMode || this.page < this.pagesCount) { + this.page = this.pagesCount; + handled = true; + ensureViewerFocused = true; + } + break; + } } - async _writeToStorage() { - const databaseStr = JSON.stringify(this.database); - localStorage.setItem("pdfjs.history", databaseStr); + if (cmd === 1 || cmd === 8) { + switch (evt.keyCode) { + case 83: + eventBus.dispatch("download", { + source: window + }); + handled = true; + break; + case 79: + { + eventBus.dispatch("openfile", { + source: window + }); + handled = true; + } + break; + } } - async _readFromStorage() { - return localStorage.getItem("pdfjs.history"); + if (cmd === 3 || cmd === 10) { + switch (evt.keyCode) { + case 80: + this.requestPresentationMode(); + handled = true; + this.externalServices.reportTelemetry({ + type: "buttons", + data: { + id: "presentationModeKeyboard" + } + }); + break; + case 71: + if (this.appConfig.toolbar) { + this.appConfig.toolbar.pageNumber.select(); + handled = true; + } + break; + } } - async set(name, val) { - await this._initializedPromise; - this.file[name] = val; - return this._writeToStorage(); + if (handled) { + if (ensureViewerFocused && !isViewerInPresentationMode) { + pdfViewer.focus(); + } + evt.preventDefault(); + return; } - async setMultiple(properties) { - await this._initializedPromise; - for (const name in properties) { - this.file[name] = properties[name]; + const curElement = getActiveOrFocusedElement(); + const curElementTagName = curElement?.tagName.toUpperCase(); + if (curElementTagName === "INPUT" || curElementTagName === "TEXTAREA" || curElementTagName === "SELECT" || curElementTagName === "BUTTON" && evt.keyCode === 32 || curElement?.isContentEditable) { + if (evt.keyCode !== 27) { + return; } - return this._writeToStorage(); } - async get(name, defaultValue) { - await this._initializedPromise; - const val = this.file[name]; - return val !== undefined ? val : defaultValue; + if (cmd === 0) { + let turnPage = 0, + turnOnlyIfPageFit = false; + switch (evt.keyCode) { + case 38: + if (this.supportsCaretBrowsingMode) { + this.moveCaret(true, false); + handled = true; + break; + } + case 33: + if (pdfViewer.isVerticalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + turnPage = -1; + break; + case 8: + if (!isViewerInPresentationMode) { + turnOnlyIfPageFit = true; + } + turnPage = -1; + break; + case 37: + if (this.supportsCaretBrowsingMode) { + return; + } + if (pdfViewer.isHorizontalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + case 75: + case 80: + turnPage = -1; + break; + case 27: + if (this.secondaryToolbar?.isOpen) { + this.secondaryToolbar.close(); + handled = true; + } + if (!this.supportsIntegratedFind && this.findBar?.opened) { + this.findBar.close(); + handled = true; + } + break; + case 40: + if (this.supportsCaretBrowsingMode) { + this.moveCaret(false, false); + handled = true; + break; + } + case 34: + if (pdfViewer.isVerticalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + turnPage = 1; + break; + case 32: + if (!isViewerInPresentationMode) { + turnOnlyIfPageFit = true; + } + turnPage = 1; + break; + case 39: + if (this.supportsCaretBrowsingMode) { + return; + } + if (pdfViewer.isHorizontalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + case 74: + case 78: + turnPage = 1; + break; + case 36: + if (isViewerInPresentationMode || this.page > 1) { + this.page = 1; + handled = true; + ensureViewerFocused = true; + } + break; + case 35: + if (isViewerInPresentationMode || this.page < this.pagesCount) { + this.page = this.pagesCount; + handled = true; + ensureViewerFocused = true; + } + break; + case 83: + this.pdfCursorTools?.switchTool(CursorTool.SELECT); + break; + case 72: + this.pdfCursorTools?.switchTool(CursorTool.HAND); + break; + case 82: + this.rotatePages(90); + break; + case 115: + this.viewsManager?.toggle(); + break; + } + if (turnPage !== 0 && (!turnOnlyIfPageFit || pdfViewer.currentScaleValue === "page-fit")) { + if (turnPage > 0) { + pdfViewer.nextPage(); + } else { + pdfViewer.previousPage(); + } + handled = true; + } } - async getMultiple(properties) { - await this._initializedPromise; - const values = Object.create(null); - for (const name in properties) { - const val = this.file[name]; - values[name] = val !== undefined ? val : properties[name]; + if (cmd === 4) { + switch (evt.keyCode) { + case 32: + if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== "page-fit") { + break; + } + pdfViewer.previousPage(); + handled = true; + break; + case 38: + this.moveCaret(true, true); + handled = true; + break; + case 40: + this.moveCaret(false, true); + handled = true; + break; + case 82: + this.rotatePages(-90); + break; } - return values; + } + if (!handled && !isViewerInPresentationMode) { + if (evt.keyCode >= 33 && evt.keyCode <= 40 || evt.keyCode === 32 && curElementTagName !== "BUTTON") { + ensureViewerFocused = true; + } + } + if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) { + pdfViewer.focus(); + } + if (handled) { + evt.preventDefault(); } } +;// ./web/viewer.js -/***/ }), - -/***/ 2030: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ PDFViewerApplication: () => (/* reexport safe */ _app_js__WEBPACK_IMPORTED_MODULE_3__.PDFViewerApplication), -/* harmony export */ PDFViewerApplicationConstants: () => (/* binding */ AppConstants), -/* harmony export */ PDFViewerApplicationOptions: () => (/* reexport safe */ _app_options_js__WEBPACK_IMPORTED_MODULE_1__.AppOptions) -/* harmony export */ }); -/* harmony import */ var _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7256); -/* harmony import */ var _app_options_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9840); -/* harmony import */ var _pdf_link_service_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(787); -/* harmony import */ var _app_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(1621); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_app_js__WEBPACK_IMPORTED_MODULE_3__]); -_app_js__WEBPACK_IMPORTED_MODULE_3__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; - -const pdfjsVersion = "4.1.392"; -const pdfjsBuild = "fcb76a78d"; const AppConstants = { - LinkTarget: _pdf_link_service_js__WEBPACK_IMPORTED_MODULE_2__.LinkTarget, - RenderingStates: _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.RenderingStates, - ScrollMode: _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.ScrollMode, - SpreadMode: _ui_utils_js__WEBPACK_IMPORTED_MODULE_0__.SpreadMode + LinkTarget: LinkTarget, + RenderingStates: RenderingStates, + ScrollMode: ScrollMode, + SpreadMode: SpreadMode }; -window.PDFViewerApplication = _app_js__WEBPACK_IMPORTED_MODULE_3__.PDFViewerApplication; +window.PDFViewerApplication = PDFViewerApplication; window.PDFViewerApplicationConstants = AppConstants; -window.PDFViewerApplicationOptions = _app_options_js__WEBPACK_IMPORTED_MODULE_1__.AppOptions; +window.PDFViewerApplicationOptions = AppOptions; function getViewerConfiguration() { return { appContainer: document.body, + principalContainer: document.getElementById("mainContainer"), mainContainer: document.getElementById("viewerContainer"), viewerContainer: document.getElementById("viewer"), + viewerAlert: document.getElementById("viewer-alert"), toolbar: { - container: document.getElementById("toolbarViewer"), + container: document.getElementById("toolbarContainer"), numPages: document.getElementById("numPages"), pageNumber: document.getElementById("pageNumber"), scaleSelect: document.getElementById("scaleSelect"), customScaleOption: document.getElementById("customScaleOption"), previous: document.getElementById("previous"), next: document.getElementById("next"), - zoomIn: document.getElementById("zoomIn"), - zoomOut: document.getElementById("zoomOut"), - viewFind: document.getElementById("viewFind"), - print: document.getElementById("print"), - editorFreeTextButton: document.getElementById("editorFreeText"), + zoomIn: document.getElementById("zoomInButton"), + zoomOut: document.getElementById("zoomOutButton"), + print: document.getElementById("printButton"), + editorCommentButton: document.getElementById("editorCommentButton"), + editorCommentParamsToolbar: document.getElementById("editorCommentParamsToolbar"), + editorFreeTextButton: document.getElementById("editorFreeTextButton"), editorFreeTextParamsToolbar: document.getElementById("editorFreeTextParamsToolbar"), - editorHighlightButton: document.getElementById("editorHighlight"), + editorHighlightButton: document.getElementById("editorHighlightButton"), editorHighlightParamsToolbar: document.getElementById("editorHighlightParamsToolbar"), editorHighlightColorPicker: document.getElementById("editorHighlightColorPicker"), - editorInkButton: document.getElementById("editorInk"), + editorInkButton: document.getElementById("editorInkButton"), editorInkParamsToolbar: document.getElementById("editorInkParamsToolbar"), - editorStampButton: document.getElementById("editorStamp"), + editorStampButton: document.getElementById("editorStampButton"), editorStampParamsToolbar: document.getElementById("editorStampParamsToolbar"), - download: document.getElementById("download") + editorSignatureButton: document.getElementById("editorSignatureButton"), + editorSignatureParamsToolbar: document.getElementById("editorSignatureParamsToolbar"), + download: document.getElementById("downloadButton") }, secondaryToolbar: { toolbar: document.getElementById("secondaryToolbar"), - toggleButton: document.getElementById("secondaryToolbarToggle"), + toggleButton: document.getElementById("secondaryToolbarToggleButton"), presentationModeButton: document.getElementById("presentationMode"), openFileButton: document.getElementById("secondaryOpenFile"), printButton: document.getElementById("secondaryPrint"), @@ -15081,26 +20531,60 @@ spreadNoneButton: document.getElementById("spreadNone"), spreadOddButton: document.getElementById("spreadOdd"), spreadEvenButton: document.getElementById("spreadEven"), + imageAltTextSettingsButton: document.getElementById("imageAltTextSettings"), + imageAltTextSettingsSeparator: document.getElementById("imageAltTextSettingsSeparator"), documentPropertiesButton: document.getElementById("documentProperties") }, - sidebar: { + viewsManager: { outerContainer: document.getElementById("outerContainer"), - sidebarContainer: document.getElementById("sidebarContainer"), - toggleButton: document.getElementById("sidebarToggle"), - resizer: document.getElementById("sidebarResizer"), - thumbnailButton: document.getElementById("viewThumbnail"), - outlineButton: document.getElementById("viewOutline"), - attachmentsButton: document.getElementById("viewAttachments"), - layersButton: document.getElementById("viewLayers"), - thumbnailView: document.getElementById("thumbnailView"), - outlineView: document.getElementById("outlineView"), + toggleButton: document.getElementById("viewsManagerToggleButton"), + sidebarContainer: document.getElementById("viewsManager"), + resizer: document.getElementById("viewsManagerResizer"), + thumbnailButton: document.getElementById("thumbnailsViewMenu"), + outlineButton: document.getElementById("outlinesViewMenu"), + attachmentsButton: document.getElementById("attachmentsViewMenu"), + layersButton: document.getElementById("layersViewMenu"), + viewsManagerSelectorButton: document.getElementById("viewsManagerSelectorButton"), + viewsManagerSelectorOptions: document.getElementById("viewsManagerSelectorOptions"), + thumbnailsView: document.getElementById("thumbnailsView"), + outlinesView: document.getElementById("outlinesView"), attachmentsView: document.getElementById("attachmentsView"), layersView: document.getElementById("layersView"), - currentOutlineItemButton: document.getElementById("currentOutlineItem") + viewsManagerAddFile: { + button: document.getElementById("viewsManagerAddFileButton"), + picker: document.getElementById("viewsManagerAddFilePicker") + }, + viewsManagerCurrentOutlineButton: document.getElementById("viewsManagerCurrentOutlineButton"), + viewsManagerHeaderLabel: document.getElementById("viewsManagerHeaderLabel"), + viewsManagerStatus: document.getElementById("viewsManagerStatus"), + viewsManagerStatusBar: { + viewsManagerStatusAction: document.getElementById("viewsManagerStatusAction"), + viewsManagerStatusActionDeselectButton: document.getElementById("viewsManagerStatusActionDeselectButton"), + viewsManagerStatusActionLabel: document.getElementById("viewsManagerStatusActionLabel") + }, + viewsManagerUndoBar: { + viewsManagerStatusUndo: document.getElementById("viewsManagerStatusUndo"), + viewsManagerStatusUndoLabel: document.getElementById("viewsManagerStatusUndoLabel"), + viewsManagerStatusUndoButton: document.getElementById("viewsManagerStatusUndoButton"), + viewsManagerStatusUndoCloseButton: document.getElementById("viewsManagerStatusUndoCloseButton") + }, + viewsManagerWaitingBar: { + container: document.getElementById("viewsManagerStatusWaiting"), + closeButton: document.getElementById("viewsManagerStatusWaitingCloseButton"), + label: document.getElementById("viewsManagerStatusWaitingLabel") + }, + manageMenu: { + button: document.getElementById("viewsManagerStatusActionButton"), + menu: document.getElementById("viewsManagerStatusActionOptions"), + copy: document.getElementById("viewsManagerStatusActionCopy"), + cut: document.getElementById("viewsManagerStatusActionCut"), + delete: document.getElementById("viewsManagerStatusActionDelete"), + exportSelected: document.getElementById("viewsManagerStatusActionExport") + } }, findBar: { bar: document.getElementById("findbar"), - toggleButton: document.getElementById("viewFind"), + toggleButton: document.getElementById("viewFindButton"), findField: document.getElementById("findInput"), highlightAllCheckbox: document.getElementById("findHighlightAll"), caseSensitiveCheckbox: document.getElementById("findMatchCase"), @@ -15108,8 +20592,8 @@ entireWordCheckbox: document.getElementById("findEntireWord"), findMsg: document.getElementById("findMsg"), findResultsCount: document.getElementById("findResultsCount"), - findPreviousButton: document.getElementById("findPrevious"), - findNextButton: document.getElementById("findNext") + findPreviousButton: document.getElementById("findPreviousButton"), + findNextButton: document.getElementById("findNextButton") }, passwordOverlay: { dialog: document.getElementById("passwordDialog"), @@ -15146,17 +20630,96 @@ cancelButton: document.getElementById("altTextCancel"), saveButton: document.getElementById("altTextSave") }, + newAltTextDialog: { + dialog: document.getElementById("newAltTextDialog"), + title: document.getElementById("newAltTextTitle"), + descriptionContainer: document.getElementById("newAltTextDescriptionContainer"), + textarea: document.getElementById("newAltTextDescriptionTextarea"), + disclaimer: document.getElementById("newAltTextDisclaimer"), + learnMore: document.getElementById("newAltTextLearnMore"), + imagePreview: document.getElementById("newAltTextImagePreview"), + createAutomatically: document.getElementById("newAltTextCreateAutomatically"), + createAutomaticallyButton: document.getElementById("newAltTextCreateAutomaticallyButton"), + downloadModel: document.getElementById("newAltTextDownloadModel"), + downloadModelDescription: document.getElementById("newAltTextDownloadModelDescription"), + error: document.getElementById("newAltTextError"), + errorCloseButton: document.getElementById("newAltTextCloseButton"), + cancelButton: document.getElementById("newAltTextCancel"), + notNowButton: document.getElementById("newAltTextNotNow"), + saveButton: document.getElementById("newAltTextSave") + }, + altTextSettingsDialog: { + dialog: document.getElementById("altTextSettingsDialog"), + createModelButton: document.getElementById("createModelButton"), + learnMore: document.getElementById("altTextSettingsLearnMore"), + showAltTextDialogButton: document.getElementById("showAltTextDialogButton"), + altTextSettingsCloseButton: document.getElementById("altTextSettingsCloseButton"), + closeButton: document.getElementById("altTextSettingsCloseButton") + }, + addSignatureDialog: { + dialog: document.getElementById("addSignatureDialog"), + panels: document.getElementById("addSignatureActionContainer"), + typeButton: document.getElementById("addSignatureTypeButton"), + typeInput: document.getElementById("addSignatureTypeInput"), + drawButton: document.getElementById("addSignatureDrawButton"), + drawSVG: document.getElementById("addSignatureDraw"), + drawPlaceholder: document.getElementById("addSignatureDrawPlaceholder"), + drawThickness: document.getElementById("addSignatureDrawThickness"), + imageButton: document.getElementById("addSignatureImageButton"), + imageSVG: document.getElementById("addSignatureImage"), + imagePlaceholder: document.getElementById("addSignatureImagePlaceholder"), + imagePicker: document.getElementById("addSignatureFilePicker"), + imagePickerLink: document.getElementById("addSignatureImageBrowse"), + description: document.getElementById("addSignatureDescription"), + clearButton: document.getElementById("clearSignatureButton"), + saveContainer: document.getElementById("addSignatureSaveContainer"), + saveCheckbox: document.getElementById("addSignatureSaveCheckbox"), + errorBar: document.getElementById("addSignatureError"), + errorTitle: document.getElementById("addSignatureErrorTitle"), + errorDescription: document.getElementById("addSignatureErrorDescription"), + errorCloseButton: document.getElementById("addSignatureErrorCloseButton"), + cancelButton: document.getElementById("addSignatureCancelButton"), + addButton: document.getElementById("addSignatureAddButton") + }, + editSignatureDialog: { + dialog: document.getElementById("editSignatureDescriptionDialog"), + description: document.getElementById("editSignatureDescription"), + editSignatureView: document.getElementById("editSignatureView"), + cancelButton: document.getElementById("editSignatureCancelButton"), + updateButton: document.getElementById("editSignatureUpdateButton") + }, annotationEditorParams: { + editorCommentsSidebar: document.getElementById("editorCommentsSidebar"), + editorCommentsSidebarCount: document.getElementById("editorCommentsSidebarCount"), + editorCommentsSidebarTitle: document.getElementById("editorCommentsSidebarTitle"), + editorCommentsSidebarCloseButton: document.getElementById("editorCommentsSidebarCloseButton"), + editorCommentsSidebarList: document.getElementById("editorCommentsSidebarList"), + editorCommentsSidebarResizer: document.getElementById("editorCommentsSidebarResizer"), editorFreeTextFontSize: document.getElementById("editorFreeTextFontSize"), editorFreeTextColor: document.getElementById("editorFreeTextColor"), editorInkColor: document.getElementById("editorInkColor"), editorInkThickness: document.getElementById("editorInkThickness"), editorInkOpacity: document.getElementById("editorInkOpacity"), editorStampAddImage: document.getElementById("editorStampAddImage"), + editorSignatureAddSignature: document.getElementById("editorSignatureAddSignature"), editorFreeHighlightThickness: document.getElementById("editorFreeHighlightThickness"), editorHighlightShowAll: document.getElementById("editorHighlightShowAll") }, - printContainer: document.getElementById("printContainer") + printContainer: document.getElementById("printContainer"), + editorUndoBar: { + container: document.getElementById("editorUndoBar"), + message: document.getElementById("editorUndoBarMessage"), + undoButton: document.getElementById("editorUndoBarUndoButton"), + closeButton: document.getElementById("editorUndoBarCloseButton") + }, + editCommentDialog: { + dialog: document.getElementById("commentManagerDialog"), + toolbar: document.getElementById("commentManagerToolbar"), + title: document.getElementById("commentManagerTitle"), + textInput: document.getElementById("commentManagerTextInput"), + cancelButton: document.getElementById("commentManagerCancelButton"), + saveButton: document.getElementById("commentManagerSaveButton") + } }; } function webViewerLoad() { @@ -15171,10 +20734,10 @@ try { parent.document.dispatchEvent(event); } catch (ex) { - console.error(`webviewerloaded: ${ex}`); + console.error("webviewerloaded:", ex); document.dispatchEvent(event); } - _app_js__WEBPACK_IMPORTED_MODULE_3__.PDFViewerApplication.run(config); + PDFViewerApplication.run(config); } document.blockUnblockOnload?.(true); if (document.readyState === "interactive" || document.readyState === "complete") { @@ -15183,215 +20746,6 @@ document.addEventListener("DOMContentLoaded", webViewerLoad, true); } -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }), - -/***/ 2973: -/***/ ((__webpack_module__, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.a(__webpack_module__, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ XfaLayerBuilder: () => (/* binding */ XfaLayerBuilder) -/* harmony export */ }); -/* harmony import */ var pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2603); -var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__]); -pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; - -class XfaLayerBuilder { - constructor({ - pdfPage, - annotationStorage = null, - linkService, - xfaHtml = null - }) { - this.pdfPage = pdfPage; - this.annotationStorage = annotationStorage; - this.linkService = linkService; - this.xfaHtml = xfaHtml; - this.div = null; - this._cancelled = false; - } - async render(viewport, intent = "display") { - if (intent === "print") { - const parameters = { - viewport: viewport.clone({ - dontFlip: true - }), - div: this.div, - xfaHtml: this.xfaHtml, - annotationStorage: this.annotationStorage, - linkService: this.linkService, - intent - }; - this.div = document.createElement("div"); - parameters.div = this.div; - return pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.XfaLayer.render(parameters); - } - const xfaHtml = await this.pdfPage.getXfa(); - if (this._cancelled || !xfaHtml) { - return { - textDivs: [] - }; - } - const parameters = { - viewport: viewport.clone({ - dontFlip: true - }), - div: this.div, - xfaHtml, - annotationStorage: this.annotationStorage, - linkService: this.linkService, - intent - }; - if (this.div) { - return pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.XfaLayer.update(parameters); - } - this.div = document.createElement("div"); - parameters.div = this.div; - return pdfjs_lib__WEBPACK_IMPORTED_MODULE_0__.XfaLayer.render(parameters); - } - cancel() { - this._cancelled = true; - } - hide() { - if (!this.div) { - return; - } - this.div.hidden = true; - } -} - -__webpack_async_result__(); -} catch(e) { __webpack_async_result__(e); } }); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/async module */ -/******/ (() => { -/******/ var webpackQueues = typeof Symbol === "function" ? Symbol("webpack queues") : "__webpack_queues__"; -/******/ var webpackExports = typeof Symbol === "function" ? Symbol("webpack exports") : "__webpack_exports__"; -/******/ var webpackError = typeof Symbol === "function" ? Symbol("webpack error") : "__webpack_error__"; -/******/ var resolveQueue = (queue) => { -/******/ if(queue && queue.d < 1) { -/******/ queue.d = 1; -/******/ queue.forEach((fn) => (fn.r--)); -/******/ queue.forEach((fn) => (fn.r-- ? fn.r++ : fn())); -/******/ } -/******/ } -/******/ var wrapDeps = (deps) => (deps.map((dep) => { -/******/ if(dep !== null && typeof dep === "object") { -/******/ if(dep[webpackQueues]) return dep; -/******/ if(dep.then) { -/******/ var queue = []; -/******/ queue.d = 0; -/******/ dep.then((r) => { -/******/ obj[webpackExports] = r; -/******/ resolveQueue(queue); -/******/ }, (e) => { -/******/ obj[webpackError] = e; -/******/ resolveQueue(queue); -/******/ }); -/******/ var obj = {}; -/******/ obj[webpackQueues] = (fn) => (fn(queue)); -/******/ return obj; -/******/ } -/******/ } -/******/ var ret = {}; -/******/ ret[webpackQueues] = x => {}; -/******/ ret[webpackExports] = dep; -/******/ return ret; -/******/ })); -/******/ __webpack_require__.a = (module, body, hasAwait) => { -/******/ var queue; -/******/ hasAwait && ((queue = []).d = -1); -/******/ var depQueues = new Set(); -/******/ var exports = module.exports; -/******/ var currentDeps; -/******/ var outerResolve; -/******/ var reject; -/******/ var promise = new Promise((resolve, rej) => { -/******/ reject = rej; -/******/ outerResolve = resolve; -/******/ }); -/******/ promise[webpackExports] = exports; -/******/ promise[webpackQueues] = (fn) => (queue && fn(queue), depQueues.forEach(fn), promise["catch"](x => {})); -/******/ module.exports = promise; -/******/ body((deps) => { -/******/ currentDeps = wrapDeps(deps); -/******/ var fn; -/******/ var getResult = () => (currentDeps.map((d) => { -/******/ if(d[webpackError]) throw d[webpackError]; -/******/ return d[webpackExports]; -/******/ })) -/******/ var promise = new Promise((resolve) => { -/******/ fn = () => (resolve(getResult)); -/******/ fn.r = 0; -/******/ var fnQueue = (q) => (q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn)))); -/******/ currentDeps.map((dep) => (dep[webpackQueues](fnQueue))); -/******/ }); -/******/ return fn.r ? promise : getResult(); -/******/ }, (err) => ((err ? reject(promise[webpackError] = err) : outerResolve(exports)), resolveQueue(queue))); -/******/ queue && queue.d < 0 && (queue.d = 0); -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module used 'module' so it can't be inlined -/******/ var __webpack_exports__ = __webpack_require__(2030); -/******/ __webpack_exports__ = await __webpack_exports__; -/******/ var __webpack_exports__PDFViewerApplication = __webpack_exports__.PDFViewerApplication; -/******/ var __webpack_exports__PDFViewerApplicationConstants = __webpack_exports__.PDFViewerApplicationConstants; -/******/ var __webpack_exports__PDFViewerApplicationOptions = __webpack_exports__.PDFViewerApplicationOptions; -/******/ export { __webpack_exports__PDFViewerApplication as PDFViewerApplication, __webpack_exports__PDFViewerApplicationConstants as PDFViewerApplicationConstants, __webpack_exports__PDFViewerApplicationOptions as PDFViewerApplicationOptions }; -/******/ +export { PDFViewerApplication, AppConstants as PDFViewerApplicationConstants, AppOptions as PDFViewerApplicationOptions }; //# sourceMappingURL=viewer.mjs.map \ No newline at end of file diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/wasm/LICENSE_JBIG2 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/LICENSE_JBIG2 --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/wasm/LICENSE_JBIG2 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/LICENSE_JBIG2 2026-07-09 07:12:41.864801400 +0000 @@ -0,0 +1,196 @@ +// Copyright 2014 The PDFium Authors +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + 1. Definitions. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + END OF TERMS AND CONDITIONS + APPENDIX: How to apply the Apache License to your work. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + Copyright [yyyy] [name of copyright owner] + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + https://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/wasm/LICENSE_OPENJPEG webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/LICENSE_OPENJPEG --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/wasm/LICENSE_OPENJPEG 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/LICENSE_OPENJPEG 2026-07-09 07:12:41.869084800 +0000 @@ -0,0 +1,39 @@ +/* + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third + * party and contributor rights, including patent rights, and no such rights + * are granted under this license. + * + * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2014, Professor Benoit Macq + * Copyright (c) 2003-2014, Antonin Descampe + * Copyright (c) 2003-2009, Francois-Olivier Devaux + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France + * Copyright (c) 2012, CS Systemes d'Information, France + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/wasm/LICENSE_PDFJS_JBIG2 webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/LICENSE_PDFJS_JBIG2 --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/wasm/LICENSE_PDFJS_JBIG2 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/LICENSE_PDFJS_JBIG2 2026-07-09 07:12:41.869084800 +0000 @@ -0,0 +1,13 @@ +Copyright 2026 Mozilla Foundation + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/wasm/LICENSE_PDFJS_OPENJPEG webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/LICENSE_PDFJS_OPENJPEG --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/wasm/LICENSE_PDFJS_OPENJPEG 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/LICENSE_PDFJS_OPENJPEG 2026-07-09 07:12:41.869084800 +0000 @@ -0,0 +1,22 @@ +Copyright (c) 2024, Mozilla Foundation + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/wasm/LICENSE_PDFJS_QCMS webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/LICENSE_PDFJS_QCMS --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/wasm/LICENSE_PDFJS_QCMS 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/LICENSE_PDFJS_QCMS 2026-07-09 07:12:41.869084800 +0000 @@ -0,0 +1,22 @@ +Copyright (c) 2025, Mozilla Foundation + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/wasm/LICENSE_QCMS webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/LICENSE_QCMS --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/wasm/LICENSE_QCMS 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/LICENSE_QCMS 2026-07-09 07:12:41.869084800 +0000 @@ -0,0 +1,21 @@ +qcms +Copyright (C) 2009-2024 Mozilla Corporation +Copyright (C) 1998-2007 Marti Maria + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/wasm/jbig2_nowasm_fallback.js webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/jbig2_nowasm_fallback.js --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/wasm/jbig2_nowasm_fallback.js 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/jbig2_nowasm_fallback.js 2026-07-09 07:12:41.869084800 +0000 @@ -0,0 +1,15 @@ +/* THIS FILE IS GENERATED - DO NOT EDIT */ +async function JBig2(moduleArg={}){var moduleRtn;var Module=moduleArg;var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";var readAsync;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var WebAssembly={Memory:function(opts){this.buffer=new ArrayBuffer(opts["initial"]*65536)},Module:function(binary){},Instance:function(module,info){this.exports=( +// EMSCRIPTEN_START_ASM +function instantiate(ha){var a;var b=new Uint8Array(123);for(var c=25;c>=0;--c){b[48+c]=52+c;b[65+c]=c;b[97+c]=26+c}b[43]=62;b[47]=63;function i(j,k,l){var d,e,c=0,f=k,g=l.length,h=k+(g*3>>2)-(l[g-2]=="=")-(l[g-1]=="=");for(;c>4;if(f>2;if(f>>0;s=s>>>0;if(q+s>a.length)throw"trap: invalid memory.fill";a.fill(u,q,q+s)}function ga(n){var v=new ArrayBuffer(16777216);var w=new Int8Array(v);var x=new Int16Array(v);var y=new Int32Array(v);var z=new Uint8Array(v);var A=new Uint16Array(v);var B=new Uint32Array(v);var C=new Float32Array(v);var D=new Float64Array(v);var E=Math.imul;var F=Math.fround;var G=Math.abs;var H=Math.clz32;var I=Math.min;var J=Math.max;var K=Math.floor;var L=Math.ceil;var M=Math.trunc;var N=Math.sqrt;var O=n.a;var P=O.a;var Q=O.b;var R=O.c;var S=O.d;var T=O.e;var U=O.f;var V=O.g;var W=O.h;var X=O.i;var Y=72736;var Z=0; +// EMSCRIPTEN_START_FUNCS +function yc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0,s=0,u=0,v=0,C=0,D=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0;J=Y-16|0;Y=J;a:{b:{c:{d:{c=y[a+4>>2];b=y[c+8>>2];i=y[c+4>>2];e:{if(b>>>0>i>>>0){break e}if((b|0)==(i|0)){aa=2;break c}R=a+80|0;while(1){if(b>>>0>i>>>0){break e}if(i-b>>>0<11){break c}f:{g:{h:{m=y[R>>2];i:{if(!m){b=na(72);w[b+4|0]=0;y[b>>2]=0;t(b+8|0,0,64);y[J+4>>2]=0;ib(R,b);ac(J+4|0);j:{c=y[a+80>>2];k:{if(ra(y[a+4>>2],c)){break k}if(va(y[a+4>>2],c+4|0)){break k}b=y[a+4>>2];d=y[b+8>>2];g=y[b>>2];l:{m:{if(B[b+4>>2]<=d>>>0){w[J+15|0]=0;break m}d=z[d+g|0];w[J+15|0]=d;if(d>>>0<224){break m}if(ra(b,c+8|0)){break k}b=y[c+8>>2]&536870911;y[c+8>>2]=b;if(b>>>0>64){break k}g=y[a+4>>2];i=y[g+8>>2];d=i+(b+8>>>3|0)|0;if(d>>>0>>0){break l}h=g;g=y[g+4>>2];y[h+8>>2]=d>>>0>>0?d:g;break l}if(va(b,J+15|0)){break k}b=z[J+15|0]>>>5|0;y[c+8>>2]=b}g=z[c+4|0];n:{if(!b){break n}d=y[c>>2];xc(c+12|0,b);b=0;d=(d>>>0>65536?4:d>>>0>256?2:1)-1|0;while(1){if(y[c+8>>2]<=(b|0)){break n}o:{p:{switch(d-1|0){default:if(va(y[a+4>>2],J+15|0)){break k}m=z[J+15|0];y[y[c+12>>2]+(b<<2)>>2]=m;break o;case 0:if(Wa(y[a+4>>2],J+12|0)){break k}m=A[J+12>>1];y[y[c+12>>2]+(b<<2)>>2]=m;break o;case 1:break e;case 2:break p}}if(ra(y[a+4>>2],J+8|0)){break k}m=y[J+8>>2];y[y[c+12>>2]+(b<<2)>>2]=m}b=b+1|0;if(B[c>>2]>m>>>0){continue}break}break k}b=y[a+4>>2];q:{if(!(g&64)){if(va(b,J+15|0)){break k}y[c+24>>2]=z[J+15|0];break q}if(ra(b,c+24|0)){break k}}if(!ra(y[a+4>>2],c+28|0)){break j}}ib(R,0);break i}b=y[a+4>>2];d=y[b+20>>2];y[c+40>>2]=y[b+16>>2];y[c+44>>2]=d;b=y[b+8>>2];y[c+48>>2]=1;y[c+36>>2]=b;y[a+84>>2]=b;m=y[a+80>>2]}r:{while(1){h=0;c=0;f=Y-368|0;Y=f;b=2;s:{t:{u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{H:{I:{J:{K:{L:{M:{N:{O:{P:{Q:{R:{S:{T:{U:{d=z[m+4|0]&63;switch(d-16|0){case 0:break T;case 1:case 2:case 3:case 5:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 21:case 25:case 28:case 29:case 30:case 31:break B;case 4:case 6:case 7:break S;case 20:case 22:case 23:break R;case 24:case 26:case 27:break Q;case 32:break P;case 33:break O;case 34:break N;case 35:break u;case 36:break M;case 37:break L;default:break U}}V:{switch(d|0){case 0:b=0;s=0;F=0;N=0;e=Y-272|0;Y=e;l=1;if(!Wa(y[a+4>>2],e+118|0)){j=na(56);y[j+40>>2]=0;y[j+32>>2]=0;y[j+36>>2]=0;y[j+24>>2]=0;y[j+28>>2]=0;y[j+16>>2]=0;y[j+20>>2]=0;h=A[e+118>>1];c=h&1;w[j|0]=c;d=h>>>10&3;w[j+3|0]=d;g=h&12288;w[j+2|0]=(g|0)!=0;i=(h&254)>>>1&1;w[j+1|0]=i;Q=j+16|0;W:{X:{Y:{if(!c){c=d?2:8;d=j+44|0;while(1){if((b|0)!=(c|0)){g=b+d|0;b=b+1|0;if(!va(y[a+4>>2],g)){continue}break W}break}if(z[j+1|0]!=1){break X}if(!z[j+2|0]){break Y}break X}if(g|!i){break X}}c=j+52|0;b=0;while(1){if((b|0)==4){break X}d=b+c|0;b=b+1|0;if(!va(y[a+4>>2],d)){continue}break}break W}if(ra(y[a+4>>2],j+12|0)){break W}if(ra(y[a+4>>2],j+8|0)|B[j+12>>2]>65535|B[j+8>>2]>65535){break W}b=y[m+8>>2];i=(b|0)>0?b:0;b=0;while(1){if((b|0)==(i|0)){c=1;k=0;b=0;while(1)if((b|0)==(i|0)){Z:{_:{$:{aa:{ba:{ca:{da:{ea:{fa:{if(!(c&1)){break fa}y[j+4>>2]=k;U=Ub(e+104|0,k);n=y[U>>2];ga:{if((n|0)==y[U+4>>2]){break ga}b=y[m+8>>2];q=(b|0)>0?b:0;c=1;k=0;while(1){if((q|0)==(F|0)){break ga}ha:{b=Ma(a,y[y[m+12>>2]+(F<<2)>>2]);if(z[b+4|0]&63){break ha}b=y[b+56>>2];g=y[b+24>>2];d=y[b+28>>2]-g>>2;b=0;while(1){if((b|0)==(d|0)){g=0;i=0;if(c&1){b=d+k|0;g=b>>>0>=d>>>0;i=g?b:0}k=i;c=g;break ha}i=b+k|0;if(!(i>>>0>=b>>>0&c)){break fa}y[n+(i<<2)>>2]=y[g+(b<<2)>>2];b=b+1|0;continue}}F=F+1|0;continue}}bb(Q,U);ia:{if(z[j|0]!=1){break ia}b=h>>>2&3;if((b|0)==2){break Z}d=h>>>4&3;if((d|0)==2){break Z}ja:{ka:{switch(b|0){case 0:c=sa(a,4);b=0;break ja;case 1:c=sa(a,5);b=0;break ja;default:break ka}}b=Ga(a,m,0);if(!b){break Z}c=y[b+68>>2];b=1}y[j+28>>2]=c;la:{ma:{switch(d|0){case 0:c=sa(a,2);break la;case 1:c=sa(a,3);break la;default:break ma}}c=Ga(a,m,b);if(!c){break Z}b=b+1|0;c=y[c+68>>2]}y[j+32>>2]=c;na:{if(!(h&64)){c=sa(a,1);break na}c=Ga(a,m,b);if(!c){break Z}b=b+1|0;c=y[c+68>>2]}y[j+36>>2]=c;if(z[j+1|0]!=1){break ia}oa:{if(!(h&128)){b=sa(a,1);break oa}b=Ga(a,m,b);if(!b){break Z}b=y[b+68>>2]}y[j+40>>2]=b}W=z[j+1|0];V=z[j|0];b=z[j+3|0];c=z[j+2|0];y[e+100>>2]=0;y[e+92>>2]=0;y[e+96>>2]=0;y[e+88>>2]=0;y[e+80>>2]=0;y[e+84>>2]=0;c=c?1024:8192;b=b?(b|0)==1?8192:1024:65536;pa:{if(!(!(h&256)|!s)){if(!(V&1)){d=Sb(e+92|0,y[s+56>>2]);if((b|0)!=y[e+96>>2]-y[d>>2]>>3){break _}}if(!(W&1)){break pa}b=Sb(e+80|0,y[s+56>>2]+12|0);if((c|0)==y[e+84>>2]-y[b>>2]>>3){break pa}break _}if(!(V&1)){kb(e+92|0,b)}if(!(W&1)){break pa}kb(e+80|0,c)}b=y[m+44>>2];d=b;c=y[m+40>>2];y[e+64>>2]=c;y[e+68>>2]=b;g=y[m+36>>2];y[e+72>>2]=g;y[m+52>>2]=2;qa:{if(!(b|c)|z[a+48|0]!=1){break qa}i=y[a+108>>2];b=i;while(1){b=y[b+4>>2];if((i|0)==(b|0)){break qa}if((c|0)!=y[b+8>>2]|(d|0)!=y[b+12>>2]|(g|0)!=y[b+16>>2]){continue}break}c=Ad(y[b+24>>2]);y[e+120>>2]=0;Rb(m+56|0,c);Za(e+120|0);zd(y[a+108>>2],e- -64|0,b+24|0);c=y[a+108>>2];d=y[b>>2];g=y[b+4>>2];y[d+4>>2]=g;y[g>>2]=d;y[c+8>>2]=y[c+8>>2]-1;oc(b);break aa}if(!(V&1)){u=Ra(y[a+4>>2]);y[e+60>>2]=u;I=y[e+92>>2];d=y[e+96>>2];C=y[e+80>>2];g=y[e+84>>2];ba=Fa();y[e+268>>2]=ba;ca=Fa();y[e+252>>2]=ca;da=Fa();y[e+248>>2]=da;ea=Fa();y[e+244>>2]=ea;i=y[j+8>>2]+y[j+4>>2]|0;b=0;while(1){c=b;b=b+1|0;if(i>>>0>1<>>0){continue}break}_=I+3240|0;S=g-C>>3;P=Cd(e+120|0,c&255);O=gb(e+256|0,y[j+8>>2]);G=d-I>>3;X=G>>>0>405;i=0;F=0;while(1){ra:{sa:{ta:{b=y[j+8>>2];if(b>>>0>i>>>0){y[e+240>>2]=0;Aa(ba,u,e+236|0);F=y[e+236>>2]+F|0;if(F>>>0>65535){break ta}K=0;while(1){ua:{l=Aa(ca,u,e+232|0);if(!l|B[j+8>>2]<=i>>>0){break ua}l=1;K=y[e+232>>2]+K|0;if(K>>>0>65535){break ua}if(!(!F|!K)){va:{wa:{xa:{ya:{za:{if(!z[j+1|0]){r=qb();y[e+228>>2]=r;y[r+8>>2]=F;y[r+4>>2]=K;w[r|0]=0;b=z[j+3|0];w[r+1|0]=0;w[r+2|0]=0;w[r+3|0]=b;w[r+16|0]=z[j+44|0];w[r+17|0]=z[j+45|0];w[r+18|0]=z[j+46|0];w[r+19|0]=z[j+47|0];w[r+20|0]=z[j+48|0];w[r+21|0]=z[j+49|0];w[r+22|0]=z[j+50|0];w[r+23|0]=z[j+51|0];Aa:{switch(b|0){case 0:if(xd(r)){D=nc(r,u,I,G,0);break wa}D=mc(r,u,I,G,0);break wa;case 1:if(wd(r)){D=nc(r,u,I,G,1);break wa}D=mc(r,u,I,G,1);break wa;case 2:if(Qb(r)){D=nc(r,u,I,G,2);break wa}D=mc(r,u,I,G,2);break wa;default:break Aa}}if(!Qb(r)){break za}D=xa(K,F);y[e+160>>2]=D;if(!qa(D)){break ya}b=y[r+4>>2];if(!b){break fa}b=b-1|0;L=b>>>3|0;T=(b&7)+1|0;g=0;k=0;n=0;c=0;while(1){Ba:{Ca:{if(B[r+8>>2]>n>>>0){ja(e+192|0,D,n);h=y[e+196>>2];q=y[e+192>>2];if(z[r+1|0]!=1){b=c;break Ca}if(z[u|0]){break ya}if(!X){break fa}b=0;d=ka(u,_);if((d|0)==(c|0)){break Ca}y[e+184>>2]=h;y[e+180>>2]=q;y[e+172>>2]=k;y[e+168>>2]=g;b=y[e+184>>2];y[e+8>>2]=y[e+180>>2];y[e+12>>2]=b;b=y[e+172>>2];y[e>>2]=y[e+168>>2];y[e+4>>2]=b;Pa(e+8|0,e);c=c^d;break Ba}y[e+160>>2]=0;break xa}c=0;H=0;Da:{if(!n){Ea:{while(1){k=7;v=0;if((H|0)==(L|0)){break Ea}Fa:{while(1){if((k|0)>=0){if(z[u|0]){break Fa}if(c>>>0>=G>>>0){break fa}d=ka(u,(c<<3)+I|0);c=d|c<<1&1006;v=d<>>0>>0){break ya}}k=0;v=0;while(1){if((k|0)==(T|0)){break Da}if(z[u|0]){break ya}if(c>>>0>=G>>>0){break fa}d=ka(u,(c<<3)+I|0);c=d|c<<1&1006;v=d<<7-k|v;k=k+1|0;continue}}if(!k){break fa}$=k-1|0;H=z[g|0];k=H>>>1&112;d=0;while(1){Ga:{if((d|0)!=(L|0)){if((d|0)==($|0)){break fa}s=d+1|0;H=z[s+g|0]|H<<8;c=7;v=0;while(1){if((c|0)<0){break Ga}if(z[u|0]){break ya}if(k>>>0>=G>>>0){break fa}M=ka(u,(k<<3)+I|0);k=M|(H>>>c+1&16|k<<1&1006);v=M<>>0>=G>>>0){break fa}g=ka(u,(k<<3)+I|0);k=g|(d>>>8-c&16|k<<1&1006);v=g<<7-c|v;c=c+1|0;continue}break}break Da}if((d|0)==(h|0)){break fa}w[d+q|0]=v;d=s;continue}}if(h>>>0<=L>>>0){break fa}w[q+L|0]=v;c=b}n=n+1|0;g=q;k=h;continue}}Aa(da,u,e+180|0);d=y[e+180>>2];if(d>>>0>=2){g=wa(6);y[e+168>>2]=g;h=wa(8);y[e+160>>2]=h;k=wa(11);y[e+228>>2]=k;l=wa(15);y[e+224>>2]=l;n=wa(15);y[e+220>>2]=n;q=wa(15);y[e+216>>2]=q;s=wa(15);y[e+212>>2]=s;r=wa(1);y[e+208>>2]=r;c=Yb();y[e+204>>2]=c;b=z[j|0];y[c+20>>2]=1;y[c+16>>2]=d;y[c+12>>2]=F;y[c+8>>2]=K;w[c+1|0]=1;w[c|0]=b;b=y[j+4>>2]+i|0;y[c+24>>2]=b;d=Ub(e+192|0,b);b=y[j+4>>2];v=y[j+16>>2];if(b>>>0>y[j+20>>2]-v>>2>>>0){break fa}M=b;b=y[d>>2];vd(v,M,b,y[e+196>>2]-b>>2);v=b+(y[j+4>>2]<<2)|0;D=y[O>>2];b=0;while(1)if((b|0)==(i|0)){bb(c+40|0,d);x[c+4>>1]=0;y[c+52>>2]=0;y[c+56>>2]=1;w[c+3|0]=0;y[c+88>>2]=r;y[c+84>>2]=s;y[c+80>>2]=q;y[c+76>>2]=n;y[c+72>>2]=l;y[c+68>>2]=k;y[c+64>>2]=h;y[c+60>>2]=g;w[c+2|0]=z[j+2|0];w[c+92|0]=z[j+52|0];w[c+93|0]=z[j+53|0];w[c+94|0]=z[j+54|0];w[c+95|0]=z[j+55|0];b=Bd(c,u,C,S,P);y[e+176>>2]=0;oa(e+240|0,b);la(e+176|0);b=y[e+240>>2];ya(d);pc(e+204|0);pa(e+208|0);pa(e+212|0);pa(e+216|0);pa(e+220|0);pa(e+224|0);pa(e+228|0);pa(e+160|0);pa(e+168|0);if(!b){break ta}break va}else{H=b<<2;y[H+v>>2]=y[D+H>>2];b=b+1|0;continue}}b=0;if((d|0)!=1){break va}c=y[j+4>>2];Ac(y[P+36>>2],u,e+192|0);b=y[e+192>>2];if(b>>>0>=c+i>>>0){break ta}c=y[j+4>>2];if(c>>>0>b>>>0){b=y[Q>>2]+(b<<2)|0}else{b=b-c|0;c=y[O>>2];if(b>>>0>=y[O+4>>2]-c>>2>>>0){break fa}b=c+(b<<2)|0}c=y[b>>2];if(!c){break ta}Aa(y[P+28>>2],u,e+168|0);Aa(y[P+32>>2],u,e+160|0);b=db();y[e+228>>2]=b;y[b+8>>2]=F;y[b+4>>2]=K;d=z[j+2|0];y[b+20>>2]=c;w[b|0]=d;y[b+12>>2]=y[e+168>>2];c=y[e+160>>2];w[b+1|0]=0;y[b+16>>2]=c;w[b+24|0]=z[j+52|0];w[b+25|0]=z[j+53|0];w[b+26|0]=z[j+54|0];w[b+27|0]=z[j+55|0];b=cb(b,u,C,S);y[e+224>>2]=0;oa(e+240|0,b);la(e+224|0);b=y[e+240>>2];Ua(e+228|0);if(!b){break ta}break va}D=xa(K,F);y[e+160>>2]=D;Ha:{Ia:{if(!qa(D)){break Ia}n=0;Qa(D,0);h=0;c=0;b=0;while(1){Ja:{Ka:{if(B[r+8>>2]>b>>>0){ja(e+192|0,D,b);g=y[e+196>>2];q=y[e+192>>2];if(z[r+1|0]!=1){d=c;break Ka}if(z[u|0]){break Ia}if(!X){break fa}d=0;k=ka(u,_);if((k|0)==(c|0)){break Ka}y[e+184>>2]=g;y[e+180>>2]=q;y[e+172>>2]=h;y[e+168>>2]=n;d=y[e+184>>2];y[e+24>>2]=y[e+180>>2];y[e+28>>2]=d;d=y[e+172>>2];y[e+16>>2]=y[e+168>>2];y[e+20>>2]=d;c=c^k;D=y[e+160>>2];Pa(e+24|0,e+16|0);break Ja}y[e+160>>2]=0;break Ha}H=0;L=0;if(z[r+2|0]==1){ja(e+192|0,y[r+12>>2],b);L=y[e+192>>2];H=y[e+196>>2]}D=y[e+160>>2];ja(e+192|0,D,w[r+17|0]+b|0);T=y[e+196>>2];$=y[e+192>>2];s=z[n|0]>>>6|0;k=y[D+8>>2];c=!h|(k|0)<2?0:s&1;v=!h|(k|0)<=0?c:s&2|c;s=0;c=0;while(1){if(B[r+4>>2]<=c>>>0){c=d;break Ja}La:{Ma:{if(z[r+2|0]==1){if(ia(y[y[r+12>>2]+8>>2],c,L,H)){break Ma}}k=ia(k,w[r+16|0]+c|0,$,T);if(z[u|0]){break Ia}k=v<<5|k<<4|s;if(k>>>0>=G>>>0){break fa}M=ka(u,(k<<3)+I|0);k=y[D+8>>2];if(!M){break Ma}La(k,c,q,g,1);k=y[D+8>>2];M=1;break La}M=0}v=ia(k,c+2|0,n,h)|v<<1&30;c=c+1|0;s=s<<1&14|M;continue}}b=b+1|0;n=q;h=g;continue}}D=0}la(e+160|0);break wa}D=0}la(e+160|0)}y[e+192>>2]=0;oa(e+240|0,D);la(e+192|0);b=y[e+240>>2];ua(e+228|0);if(!b){break ua}}c=y[O>>2];y[e+240>>2]=0;oa((i<<2)+c|0,b)}i=i+1|0;continue}break}b=l^1;break sa}y[e+200>>2]=0;y[e+192>>2]=0;y[e+196>>2]=0;ud(e+192|0,b+y[j+4>>2]|0);g=y[e+192>>2];i=0;b=0;k=0;Na:{while(1){if(y[j+8>>2]+y[j+4>>2]>>>0>b>>>0){Aa(ea,u,e+160|0);d=y[e+160>>2];c=d+b|0;if(!(c>>>0<=y[j+8>>2]+y[j+4>>2]>>>0&c>>>0>=d>>>0)){break Na}Pb(e+180|0,g,0,b);sd(e+168|0,y[e+180>>2],y[e+184>>2],d,i);k=(i&1?d:0)+k|0;i=(i^-1)&1;b=c;continue}break}if(B[j+12>>2]>>0){break Na}N=lc();d=y[O>>2];b=0;l=0;while(1){c=y[j+4>>2];if(c+y[j+8>>2]>>>0<=b>>>0){break Na}if(!(!(y[g+(b>>>3&536870908)>>2]>>>b&1)|B[j+12>>2]<=l>>>0)){Oa:{if(b>>>0>>0){c=y[y[Q>>2]+(b<<2)>>2];if(!c){i=0;break Oa}i=kc(c);break Oa}c=d+(b-c<<2)|0;i=y[c>>2];y[c>>2]=0}rd(N,i);l=l+1|0}b=b+1|0;continue}}Ob(e+192|0);break ra}b=0}la(e+240|0);if(b){continue}}break}$a(O);qc(P);Ea(e+244|0);Ea(e+248|0);Ea(e+252|0);Ea(e+268|0);y[e+120>>2]=0;Rb(m+56|0,N);Za(e+120|0);if(y[m+56>>2]){ta(y[a+4>>2]);b=y[a+4>>2];c=y[b+8>>2];if(c>>>0<=4294967293){g=b;c=c+2|0;b=y[b+4>>2];y[g+8>>2]=b>>>0>c>>>0?c:b}ua(e+60|0);break ba}ua(e+60|0);break $}g=y[e+80>>2];b=y[e+84>>2];n=y[a+4>>2];q=qd(n);y[e+268>>2]=q;C=gb(e+120|0,y[j+8>>2]);y[e+264>>2]=0;y[e+256>>2]=0;y[e+260>>2]=0;if(!z[j+1|0]){xc(e+256|0,y[j+8>>2])}u=b-g>>3;y[e+252>>2]=0;s=0;d=0;Pa:while(1){if(B[j+8>>2]<=d>>>0){break da}if(za(q,y[j+28>>2],e+160|0)){break ea}s=y[e+160>>2]+s|0;if(s>>>0>65535){break ea}F=0;c=0;i=d;while(1){b=za(q,y[j+32>>2],e+248|0);y[e+244>>2]=b;Qa:{Ra:{Sa:{Ta:{Ua:{switch(b|0){case 0:if(B[j+8>>2]<=i>>>0){break ea}c=y[e+248>>2]+c|0;if(c>>>0>65535){break ea}if(!c|!s){break Qa}if(z[j+1|0]!=1){break Ra}if(za(q,y[j+40>>2],e+240|0)){break ea}oa(e+252|0,0);h=y[e+240>>2];if(h>>>0<2){break Ta}v=wa(6);y[e+236>>2]=v;D=wa(8);y[e+232>>2]=D;H=wa(11);y[e+228>>2]=H;I=wa(15);y[e+224>>2]=I;G=wa(15);y[e+220>>2]=G;K=wa(15);y[e+216>>2]=K;O=wa(15);y[e+212>>2]=O;b=1;P=wa(1);y[e+208>>2]=P;l=Yb();y[e+204>>2]=l;k=z[j|0];y[l+20>>2]=1;y[l+16>>2]=h;y[l+12>>2]=s;y[l+8>>2]=c;w[l+1|0]=1;w[l|0]=k;h=y[j+4>>2]+i|0;y[l+24>>2]=h;r=Ed(e+192|0,h);k=y[j+8>>2]+y[j+4>>2]|0;while(1){h=b;b=b+1|0;if(k>>>0>1<>>0){continue}break};h=h&255;k=y[r>>2];L=y[l+24>>2];b=0;while(1)if((b|0)==(L|0)){bb(l+28|0,r);h=Ub(e+180|0,y[l+24>>2]);b=y[j+4>>2];k=y[j+16>>2];if(b>>>0>y[j+20>>2]-k>>2>>>0){break fa}M=b;b=y[h>>2];vd(k,M,b,y[e+184>>2]-b>>2);L=b+(y[j+4>>2]<<2)|0;k=y[C>>2];b=0;while(1)if((b|0)==(i|0)){bb(l+40|0,h);x[l+4>>1]=0;y[l+52>>2]=0;y[l+56>>2]=1;w[l+3|0]=0;y[l+88>>2]=P;y[l+84>>2]=O;y[l+80>>2]=K;y[l+76>>2]=G;y[l+72>>2]=I;y[l+68>>2]=H;y[l+64>>2]=D;y[l+60>>2]=v;w[l+2|0]=z[j+2|0];w[l+92|0]=z[j+52|0];w[l+93|0]=z[j+53|0];w[l+94|0]=z[j+54|0];w[l+95|0]=z[j+55|0];b=Dd(l,n,g,u);y[e+176>>2]=0;oa(e+252|0,b);la(e+176|0);b=y[e+252>>2];ya(h);ya(r);pc(e+204|0);pa(e+208|0);pa(e+212|0);pa(e+216|0);pa(e+220|0);pa(e+224|0);pa(e+228|0);pa(e+232|0);pa(e+236|0);if(b){break Sa}break ea}else{N=b<<2;y[N+L>>2]=y[k+N>>2];b=b+1|0;continue}}else{N=k+(b<<3)|0;y[N+4>>2]=b;y[N>>2]=h;b=b+1|0;continue};case 1:break Ua;default:break ea}}Va:{if(!z[j+1|0]){if(za(q,y[j+36>>2],e+192|0)){break ea}ta(n);y[e+180>>2]=0;Wa:{if(!y[e+192>>2]){if((F|0)>65535){break Va}b=F+7>>>3|0;c=se(b,0,s);if(Z){break Va}h=y[n+4>>2];k=y[n+8>>2];if(h>>>0>>0){break fa}if(c>>>0>h-k>>>0){break Va}c=0;h=xa(F,s);y[e+248>>2]=0;oa(e+180|0,h);la(e+248|0);v=y[e+180>>2];while(1){if((c|0)==(s|0)){break Wa}ja(e+168|0,v,c);l=y[n+8>>2];h=y[n+4>>2];if(l>>>0>h>>>0|b>>>0>h-l>>>0|b>>>0>B[e+172>>2]){break fa}if(b){if(b){p(y[e+168>>2],y[n>>2]+l|0,b)}l=y[n+8>>2]}h=b+l|0;if(h>>>0>=l>>>0){k=y[n+4>>2];y[n+8>>2]=h>>>0>>0?h:k}c=c+1|0;continue}}b=qb();y[e+248>>2]=b;y[b+8>>2]=s;y[b+4>>2]=F;w[b|0]=1;hb(b,e+180|0,n);ta(n);ua(e+248|0);v=y[e+180>>2]}Xa:{if(!v){break Xa}c=d>>>0>i>>>0?d:i;h=y[C>>2];b=0;k=y[e+256>>2];while(1){if((c|0)==(d|0)){break Xa}l=d<<2;r=l+k|0;F=sb(v,b,0,y[r>>2],s);y[e+248>>2]=0;oa(h+l|0,F);d=d+1|0;la(e+248|0);b=y[r>>2]+b|0;continue}}la(e+180|0)}d=i;continue Pa}la(e+180|0);break ea}if((h|0)!=1){k=y[C>>2];b=y[e+252>>2];break Sa}r=y[j+8>>2]+y[j+4>>2]|0;b=1;l=1;while(1){k=b;b=b+1|0;h=l;l=h+1|0;if(r>>>0>1<>>0){continue}break}y[e+192>>2]=h;h=k&255;l=0;b=0;while(1){if((b|0)!=(h|0)){if(wb(n,e+192|0)){break ea}b=b+1|0;l=y[e+192>>2]|l<<1;continue}break}b=y[j+4>>2];if(b+i>>>0<=l>>>0){break ea}k=y[C>>2];if(b>>>0>l>>>0){b=y[Q>>2]+(l<<2)|0}else{b=l-b|0;if(b>>>0>=y[C+4>>2]-k>>2>>>0){break fa}b=(b<<2)+k|0}h=y[b>>2];if(!h){break ea}b=wa(15);y[e+180>>2]=b;l=wa(1);y[e+236>>2]=l;Ya:{if(za(q,b,e+232|0)){break Ya}if(za(q,b,e+228|0)){break Ya}if(za(q,l,e+244|0)){break Ya}ta(n);r=y[n+8>>2];y[e+192>>2]=r;b=db();y[e+224>>2]=b;y[b+8>>2]=s;y[b+4>>2]=c;l=z[j+2|0];y[b+20>>2]=h;w[b|0]=l;y[b+12>>2]=y[e+232>>2];h=y[e+228>>2];l=0;w[b+1|0]=0;y[b+16>>2]=h;w[b+24|0]=z[j+52|0];w[b+25|0]=z[j+53|0];w[b+26|0]=z[j+54|0];w[b+27|0]=z[j+55|0];h=Ra(n);y[e+220>>2]=h;b=cb(b,h,g,u);y[e+216>>2]=0;oa(e+252|0,b);la(e+216|0);b=y[e+252>>2];if(b){ta(n);l=y[n+8>>2];if(l>>>0<=4294967293){h=l+2|0;l=y[n+4>>2];l=h>>>0>>0?h:l;y[n+8>>2]=l}l=y[e+244>>2]==(l-r|0)}ua(e+220|0);Ua(e+224|0);pa(e+236|0);pa(e+180|0);if(l){break Sa}break ea}pa(e+236|0);pa(e+180|0);break ea}y[e+252>>2]=0;oa((i<<2)+k|0,b);if(z[j+1|0]){break Qa}}y[y[e+256>>2]+(i<<2)>>2]=c}F=c+F|0;i=i+1|0;continue}}}o()}b=0;break ca}i=wa(1);y[e+248>>2]=i;y[e+200>>2]=0;y[e+192>>2]=0;y[e+196>>2]=0;ud(e+192|0,y[j+8>>2]+y[j+4>>2]|0);g=y[e+192>>2];l=0;b=0;k=0;Za:{while(1){if(y[j+8>>2]+y[j+4>>2]>>>0>b>>>0){_a:{$a:{if(za(q,i,e+244|0)){break $a}d=y[e+244>>2];c=d+b|0;if(c>>>0>>0){break $a}if(c>>>0<=y[j+8>>2]+y[j+4>>2]>>>0){break _a}}b=0;break Za}Pb(e+180|0,g,0,b);sd(e+160|0,y[e+180>>2],y[e+184>>2],d,l);k=(l&1?d:0)+k|0;l=(l^-1)&1;b=c;continue}break}b=0;if(B[j+12>>2]>>0){break Za}b=lc();d=y[C>>2];l=0;i=0;while(1){c=y[j+4>>2];if(c+y[j+8>>2]>>>0<=l>>>0){break Za}if(!(!(y[g+(l>>>3&536870908)>>2]>>>l&1)|B[j+12>>2]<=i>>>0)){ab:{if(c>>>0>l>>>0){c=y[y[Q>>2]+(l<<2)>>2];if(!c){c=0;break ab}c=kc(c);break ab}h=d+(l-c<<2)|0;c=y[h>>2];y[h>>2]=0}rd(b,c);i=i+1|0}l=l+1|0;continue}}Ob(e+192|0);pa(e+248|0)}la(e+252|0);Ja(e+256|0);$a(C);Ua(e+268|0);y[e+120>>2]=0;Rb(m+56|0,b);Za(e+120|0);if(!y[m+56>>2]){break $}ta(y[a+4>>2])}if(z[a+48|0]!=1){break aa}fa=e,ga=Ad(y[m+56>>2]),y[fa+120>>2]=ga;b=y[a+108>>2];l=y[b+8>>2];while(1){if(l>>>0>=2){c=y[b>>2];d=y[c>>2];g=y[c+4>>2];y[d+4>>2]=g;y[g>>2]=d;y[b+8>>2]=y[b+8>>2]-1;oc(c);l=l-1|0;b=y[a+108>>2];continue}break}c=b;b=e+120|0;zd(c,e- -64|0,b);Za(b)}l=0;if(!(z[e+119|0]&2)){break _}if(!(V&1)){b=y[m+56>>2];y[e+48>>2]=y[e+92>>2];c=y[e+96>>2];d=y[e+100>>2];y[e+96>>2]=0;y[e+100>>2]=0;y[e+52>>2]=c;y[e+56>>2]=d;y[e+92>>2]=0;c=b;b=e+48|0;pd(c,b);Ja(b)}if(!(W&1)){break _}b=y[m+56>>2];y[e+36>>2]=y[e+80>>2];c=y[e+84>>2];d=y[e+88>>2];y[e+84>>2]=0;y[e+88>>2]=0;y[e+40>>2]=c;y[e+44>>2]=d;y[e+80>>2]=0;c=b+12|0;b=e+36|0;pd(c,b);Ja(b);break _}l=1}Ja(e+80|0);Ja(e+92|0)}ya(U);break W}else{d=Ma(a,y[y[m+12>>2]+(b<<2)>>2]);if(!(z[d+4|0]&63)){g=0;if(c&1){c=y[d+56>>2];c=y[c+28>>2]-y[c+24>>2]>>2;g=c+k|0;n=g;g=c>>>0<=g>>>0;k=g?n:0}else{k=0}s=d;c=g}b=b+1|0;continue}}c=b<<2;b=b+1|0;if(Ma(a,y[c+y[m+12>>2]>>2])){continue}break}}ya(Q);ma(j)}Y=e+272|0;b=l;break u;case 1:case 2:case 3:case 5:break B;case 4:case 6:case 7:break V;default:break K}}b=1;if(z[a+49|0]!=1){break u}if(tb(a,f+332|0)){break u}d=f+14|0;if(Wa(y[a+4>>2],d)){break u}c=y[f+332>>2];if(c-1>>>0>65534){break u}q=y[f+336>>2];if(q-1>>>0>65534){break u}h=Yb();y[f+308>>2]=h;y[h+12>>2]=q;y[h+8>>2]=c;c=A[f+14>>1];g=c&1;w[h|0]=g;w[h+2|0]=c>>>15;y[h+56>>2]=c>>>4&3;y[h+52>>2]=c>>>7&3;w[h+3|0]=c>>>6&1;w[h+4|0]=c>>>9&1;y[h+20>>2]=1<<(c>>>2&3);i=(c&254)>>>1&1;w[h+1|0]=i;k=c>>>10&31;w[h+5|0]=(k>>>0>15?-32:0)|k;bb:{if(g){if(Wa(y[a+4>>2],d)){break v}if(z[h+1|0]!=1){break w}if(!z[h+2|0]){break bb}break w}if(!i|c<<16>>16<0){break w}}c=h+92|0;d=0;while(1){if((d|0)==4){break w}g=c+d|0;d=d+1|0;if(!va(y[a+4>>2],g)){continue}break}break v}g=na(12);y[g+8>>2]=0;y[g>>2]=0;y[g+4>>2]=0;if(va(y[a+4>>2],f+352|0)){break y}b=1;if(va(y[a+4>>2],g+1|0)){break x}if(va(y[a+4>>2],g+2|0)){break x}if(ra(y[a+4>>2],g+4|0)){break x}i=y[g+4>>2];if(i>>>0>65535){break x}b=z[f+352|0];d=b&1;w[g|0]=d;b=b>>>1&3;w[g+8|0]=b;y[m+52>>2]=3;if(d){d=y[a+4>>2];b=wc(g);y[f+24>>2]=b;if(b){y[f+332>>2]=0;hb(b,f+332|0,d);cb:{d=y[f+332>>2];if(!d){break cb}c=vc(i+1|0);b=0;while(1){if(b>>>0>i>>>0){break cb}h=z[g+1|0];h=sb(d,E(h,b),0,h,z[g+2|0]);k=y[c+4>>2];y[f+312>>2]=0;oa((b<<2)+k|0,h);b=b+1|0;la(f+312|0);continue}}la(f+332|0)}ua(f+24|0);y[f+332>>2]=0;Xb(m+60|0,c);Zb(f+332|0);if(!y[m+60>>2]){break y}ta(y[a+4>>2]);b=0;break x}k=b?(b|0)==1?8192:1024:65536;l=ab(k,8);y[f+336>>2]=k;y[f+332>>2]=l;n=Ra(y[a+4>>2]);y[f+16>>2]=n;d=wc(g);y[f+312>>2]=d;if(!d){break z}w[d+1|0]=0;w[d+2|0]=0;w[d+3|0]=b;h=z[g+1|0];w[d+17|0]=0;w[d+16|0]=0-h;if(!b){w[d+22|0]=254;w[d+23|0]=254;w[d+18|0]=253;w[d+19|0]=255;w[d+20|0]=2;w[d+21|0]=254}y[f+356>>2]=0;y[f+40>>2]=0;y[f+32>>2]=l;y[f+36>>2]=k;y[f+28>>2]=n;y[f+24>>2]=f+356;b=Wb(d,f+24|0);y[f+40>>2]=0;while(1){if((b|0)==3){b=Vb(d,f+24|0);continue}break}y[d+44>>2]=0;y[d+48>>2]=0;y[d+36>>2]=0;y[d+40>>2]=0;y[d+28>>2]=0;y[d+32>>2]=0;if(!y[f+356>>2]){break A}c=vc(i+1|0);b=0;while(1){if(b>>>0>i>>>0){break A}d=sb(y[f+356>>2],E(b,h),0,h,z[g+2|0]);k=y[c+4>>2];y[f>>2]=0;oa((b<<2)+k|0,d);b=b+1|0;la(f);continue}}b=1;if(z[a+49|0]!=1){break u}q=na(56);y[q+16>>2]=0;db:{if(tb(a,f+312|0)){break db}if(va(y[a+4>>2],f+14|0)){break db}if(ra(y[a+4>>2],q+32|0)){break db}if(ra(y[a+4>>2],q+36|0)){break db}if(ra(y[a+4>>2],q+40|0)){break db}if(ra(y[a+4>>2],q+44|0)){break db}if(Wa(y[a+4>>2],q+48|0)){break db}if(Wa(y[a+4>>2],q+50|0)){break db}C=y[q+32>>2];if(C-1>>>0>65534){break db}e=y[q+36>>2];if(e-1>>>0>65534){break db}v=y[f+312>>2];if(v-1>>>0>65534){break db}k=y[f+316>>2];if(k-1>>>0>65534){break db}y[q+4>>2]=k;y[q>>2]=v;d=z[f+14|0];F=d&1;w[q+8|0]=F;w[q+20|0]=d>>>7;i=d>>>3|0;K=i&1;w[q+28|0]=K;s=d>>>1&3;w[q+9|0]=s;g=d>>>4|0;y[q+24>>2]=(g&7)==4?4:g&3;if(y[m+8>>2]!=1){break db}g=Ma(a,y[y[m+12>>2]>>2]);if(!g|(z[g+4|0]&63)!=16){break db}g=y[g+60>>2];if(!g){break db}j=y[g>>2];if(!j){break db}y[q+12>>2]=j;y[q+16>>2]=g+4;b=y[y[g+4>>2]>>2];g=y[b+8>>2];w[q+52|0]=g;r=y[b+12>>2];w[q+53|0]=r;y[m+52>>2]=1;eb:{fb:{gb:{if(d&1){d=y[a+4>>2];b=1;while(1){c=b;b=b+1|0;if(j>>>0>1<>>0){continue}break}x[f+80>>1]=0;y[f+36>>2]=0;y[f+48>>2]=0;y[f+52>>2]=0;y[f+56>>2]=0;y[f+60>>2]=0;y[f+64>>2]=0;y[f+68>>2]=0;y[f+72>>2]=0;y[f+84>>2]=0;y[f+88>>2]=0;y[f+92>>2]=0;y[f+96>>2]=0;y[f+100>>2]=0;y[f+32>>2]=e;y[f+28>>2]=C;w[f+24|0]=F;b=c&255;g=gb(f+332|0,b);i=y[g>>2];c=(i+(b<<2)|0)-4|0;hb(f+24|0,c,d);h=0;hb:{if(!y[c>>2]){break hb}ta(d);c=y[d+8>>2];if(c>>>0<=4294967292){c=c+3|0;h=y[d+4>>2];y[d+8>>2]=c>>>0>>0?c:h}b=b-2|0;while(1){if((b|0)>=0){c=i+(b<<2)|0;hb(f+24|0,c,d);h=0;if(!y[c>>2]){break hb}ta(d);h=y[d+8>>2];if(h>>>0<=4294967292){h=h+3|0;l=y[d+4>>2];y[d+8>>2]=h>>>0>>0?h:l}fb(y[c>>2],0,0,0,0,y[c+4>>2],2);b=b-1|0;continue}break}h=uc(q,g)}b=h;$a(g);y[f+356>>2]=0;oa(m- -64|0,b);la(f+356|0);if(!y[m+64>>2]){break eb}ta(y[a+4>>2]);break gb}b=s?(s|0)==1?8192:1024:65536;d=ab(b,8);y[f+4>>2]=b;y[f>>2]=d;Q=Ra(y[a+4>>2]);y[f+308>>2]=Q;n=0;y[f+16>>2]=0;l=b;ib:{if(!(i&1)){break ib}b=xa(C,e);y[f+24>>2]=0;oa(f+16|0,b);b=r&255;O=1-b|0;D=0-(b>>>0>1)|0;b=g&255;P=1-b|0;H=0-(b>>>0>1)|0;la(f+24|0);n=y[f+16>>2];jb:while(1){if(!c&(e|0)==(h|0)){break ib}ja(f+24|0,n,h);b=y[q+44>>2];L=A[q+48>>1];g=se(h,c,L);r=b+g|0;b=Z+(b>>31)|0;V=g>>>0>r>>>0?b+1|0:b;b=y[q+40>>2];N=A[q+50>>1];g=se(h,c,N);I=b+g|0;b=Z+(b>>31)|0;U=g>>>0>I>>>0?b+1|0:b;g=0;i=0;W=y[f+28>>2];_=y[f+24>>2];while(1)if(!i&(g|0)==(C|0)){h=h+1|0;c=h?c:c+1|0;continue jb}else{S=y[n+8>>2];b=se(g,i,N);u=r-b|0;G=V-(Z+(b>>>0>r>>>0)|0)|0;b=G>>8;X=(G&255)<<24|u>>>8;T=se(g,i,L);u=T+I|0;G=Z+U|0;M=S;G=u>>>0>>0?G+1|0:G;S=(G&255)<<24|u>>>8;u=G>>8;La(M,g,_,W,k>>>0<=X>>>0&(b|0)>=0|(b|0)>0|(P>>>0>S>>>0&(H|0)>=(u|0)|(u|0)<(H|0)|((b|0)<=(D|0)&O>>>0>X>>>0|(b|0)<(D|0))|(v>>>0<=S>>>0&(u|0)>=0|(u|0)>0)));g=g+1|0;i=g?i:i+1|0;continue}}}g=d;b=1;while(1){c=b;b=b+1|0;if(j>>>0>1<>>0){continue}break}y[f+48>>2]=0;y[f+52>>2]=0;x[f+80>>1]=0;y[f+56>>2]=0;y[f+60>>2]=0;y[f+64>>2]=0;y[f+68>>2]=0;y[f+72>>2]=0;y[f+84>>2]=0;y[f+88>>2]=0;y[f+92>>2]=0;y[f+96>>2]=0;y[f+100>>2]=0;y[f+32>>2]=e;y[f+28>>2]=C;w[f+24|0]=F;y[f+36>>2]=n;w[f+26|0]=K;w[f+25|0]=0;w[f+27|0]=s;kb:{if(s>>>0>=2){x[f+40>>1]=65282;break kb}x[f+40>>1]=65283;if(s){break kb}x[f+46>>1]=65278;x[f+42>>1]=65533;x[f+44>>1]=65026}b=c&255;c=gb(f+356|0,b);h=y[c>>2];n=b-1|0;d=n;lb:{mb:{while(1){if((d|0)<0){break mb}y[f+352>>2]=0;y[f+348>>2]=0;y[f+340>>2]=g;y[f+344>>2]=l;y[f+336>>2]=Q;y[f+332>>2]=f+352;b=Wb(f+24|0,f+332|0);y[f+348>>2]=0;while(1){if((b|0)==3){b=Vb(f+24|0,f+332|0);continue}break}y[f+68>>2]=0;y[f+72>>2]=0;y[f+60>>2]=0;y[f+64>>2]=0;y[f+52>>2]=0;y[f+56>>2]=0;b=y[f+352>>2];nb:{if(!b){break nb}y[f+352>>2]=0;i=h+(d<<2)|0;oa(i,b);if((d|0)>=(n|0)){break nb}fb(y[i>>2],0,0,0,0,y[i+4>>2],2)}d=d-1|0;la(f+352|0);if(b){continue}break}b=0;break lb}b=uc(q,c)}$a(c);la(f+16|0);y[f+24>>2]=0;oa(m- -64|0,b);la(f+24|0);if(!y[m+64>>2]){break fb}ta(y[a+4>>2]);b=y[a+4>>2];c=y[b+8>>2];if(c>>>0<=4294967293){g=b;c=c+2|0;b=y[b+4>>2];y[g+8>>2]=b>>>0>c>>>0?c:b}ua(f+308|0);Ha(f)}if((z[m+4|0]&63)==20){b=0;break db}ob:{if(z[a+50|0]){break ob}b=y[y[a+24>>2]-4>>2];if(z[b+17|0]!=1){break ob}c=k+y[f+324>>2]|0;d=y[a+32>>2];if((c|0)<=y[d+12>>2]){break ob}eb(d,c,z[b+16|0])}b=y[f+320>>2];g=b;h=b>>31;b=y[f+324>>2];c=b;d=b>>31;b=z[f+328|0];fb(y[a+32>>2],g,h,c,d,y[m+64>>2],(b&7)==4?4:b&3);b=0;oa(m- -64|0,0);break db}ua(f+308|0);Ha(f)}b=1}ma(q);break u}b=1;if(z[a+49|0]!=1){break u}g=a+76|0;d=y[a+76>>2];if(!d){c=qb();y[f+24>>2]=c;pb:{qb:{if(tb(a,a+88|0)){break qb}if(va(y[a+4>>2],f+332|0)){break qb}d=y[a+92>>2];if((d|0)<0){break qb}i=y[a+88>>2];if((i|0)<0){break qb}y[c+8>>2]=d;y[c+4>>2]=i;d=z[f+332|0];i=d&1;w[c|0]=i;h=d>>>1&3;w[c+3|0]=h;w[c+1|0]=d>>>3&1;if(i){break pb}i=c+16|0;d=0;if(!h){while(1){if((d|0)==8){break pb}h=d+i|0;d=d+1|0;if(!va(y[a+4>>2],h)){continue}break qb}}while(1){if((d|0)==2){break pb}h=d+i|0;d=d+1|0;if(!va(y[a+4>>2],h)){continue}break}}ua(f+24|0);break u}w[c+2|0]=0;y[f+24>>2]=0;Va(g,c);ua(f+24|0);d=y[g>>2]}y[m+52>>2]=1;rb:{if(z[d|0]==1){hb(d,m- -64|0,y[a+4>>2]);if(!y[m+64>>2]){Va(g,0);break D}ta(y[a+4>>2]);break rb}if(y[a+60>>2]==y[a+64>>2]){b=z[d+3|0];kb(a+60|0,b?(b|0)==1?8192:1024:65536)}c=a+72|0;h=f;b=y[a+72>>2];if(b){d=b}else{d=Ra(y[a+4>>2]);y[f+24>>2]=0;Va(c,d);ua(f+24|0);d=y[a+72>>2]}y[h+28>>2]=d;d=m- -64|0;y[f+24>>2]=d;h=y[a+64>>2];i=y[a+60>>2];y[f+40>>2]=0;y[f+32>>2]=i;y[f+36>>2]=h-i>>3;i=y[a+76>>2];sb:{if(!b){b=Wb(i,f+24|0);break sb}b=Vb(i,f+24|0)}y[a+56>>2]=b;if((b|0)==3){if((z[m+4|0]&63)==36){break B}tb:{if(z[a+50|0]){break tb}b=y[y[a+24>>2]-4>>2];if(z[b+17|0]!=1){break tb}c=y[a+92>>2]+y[a+100>>2]|0;g=y[a+32>>2];if((c|0)<=y[g+12>>2]){break tb}eb(g,c,z[b+16|0])}b=y[a+76>>2];c=y[b+64>>2]+y[a+96>>2]|0;g=c;i=c>>31;c=y[b+68>>2]+y[a+100>>2]|0;h=b- -64|0;b=z[a+104|0];tc(y[a+32>>2],g,i,c,c>>31,y[d>>2],h,(b&7)==4?4:b&3);break B}b=y[a+76>>2];y[b+44>>2]=0;y[b+48>>2]=0;y[b+36>>2]=0;y[b+40>>2]=0;y[b+28>>2]=0;y[b+32>>2]=0;Va(c,0);y[a+64>>2]=y[a+60>>2];if(!y[d>>2]){y[a+56>>2]=-1;Va(g,0);break D}ta(y[a+4>>2]);b=y[a+4>>2];c=y[b+8>>2];if(c>>>0>4294967293){break rb}d=b;c=c+2|0;b=y[b+4>>2];y[d+8>>2]=b>>>0>c>>>0?c:b}if((z[m+4|0]&63)!=36){ub:{if(z[a+50|0]){break ub}b=y[y[a+24>>2]-4>>2];if(z[b+17|0]!=1){break ub}c=y[a+92>>2]+y[a+100>>2]|0;d=y[a+32>>2];if((c|0)<=y[d+12>>2]){break ub}eb(d,c,z[b+16|0])}b=y[a+76>>2];c=y[b+64>>2]+y[a+96>>2]|0;d=c;i=c>>31;c=y[b+68>>2]+y[a+100>>2]|0;h=b- -64|0;b=z[a+104|0];tc(y[a+32>>2],d,i,c,c>>31,y[m+64>>2],h,(b&7)==4?4:b&3);oa(m- -64|0,0)}b=0;Va(g,0);break u}b=1;if(z[a+49|0]!=1){break u}if(tb(a,f+24|0)){break u}if(va(y[a+4>>2],f+352|0)){break u}i=y[f+24>>2];if(i-1>>>0>65534){break u}g=y[f+28>>2];if(g-1>>>0>65534){break u}d=0;y[f+312>>2]=0;c=db();y[f+356>>2]=c;y[c+8>>2]=g;y[c+4>>2]=i;b=z[f+352|0];h=b&1;w[c|0]=h;w[c+1|0]=b>>>1&1;vb:{wb:{if(h){break wb}h=c+24|0;while(1){if((d|0)==4){break wb}b=1;k=d+h|0;d=d+1|0;if(!va(y[a+4>>2],k)){continue}break}break vb}h=y[m+8>>2];xb:{if((h|0)>0){d=0;b=1;while(1){if((d|0)==(h|0)){break vb}i=Ma(a,y[y[m+12>>2]>>2]);if(!i){break vb}k=(z[i+4|0]&63)-4|0;k=(k<<6|(k&252)>>>2)&255;if(!(1<>>0<=9:0)){d=d+1|0;continue}break}b=i- -64|0;break xb}d=sb(y[a+32>>2],y[f+32>>2],y[f+36>>2],i,g);y[f+332>>2]=0;b=f+312|0;oa(b,d);la(f+332|0)}b=y[b>>2];y[c+12>>2]=0;y[c+16>>2]=0;y[c+20>>2]=b;d=z[c|0];i=d?1024:8192;b=ab(i,8);y[f+336>>2]=i;y[f+332>>2]=b;i=Ra(y[a+4>>2]);y[f>>2]=i;y[m+52>>2]=1;c=cb(c,i,b,d?1024:8192);y[f+16>>2]=0;b=m- -64|0;oa(b,c);la(f+16|0);c=1;yb:{if(!y[m+64>>2]){break yb}ta(y[a+4>>2]);c=y[a+4>>2];d=y[c+8>>2];if(d>>>0<=4294967293){h=c;d=d+2|0;c=y[c+4>>2];y[h+8>>2]=c>>>0>d>>>0?d:c}c=0;if((z[m+4|0]&63)==40){break yb}zb:{if(z[a+50|0]){break zb}c=y[y[a+24>>2]-4>>2];if(z[c+17|0]!=1){break zb}d=g+y[f+36>>2]|0;g=y[a+32>>2];if((d|0)<=y[g+12>>2]){break zb}eb(g,d,z[c+16|0])}c=y[f+32>>2];d=c;i=c>>31;c=y[f+36>>2];g=c;h=c>>31;c=z[f+40|0];fb(y[a+32>>2],d,i,g,h,y[b>>2],(c&7)==4?4:c&3);oa(b,0);c=0}b=c;ua(f);Ha(f+332|0)}Ua(f+356|0);la(f+312|0);break u}c=na(20);y[c+16>>2]=0;y[c+8>>2]=0;y[c+12>>2]=0;y[c>>2]=0;y[c+4>>2]=0;y[f+24>>2]=c;if(ra(y[a+4>>2],c)){break E}if(ra(y[a+4>>2],c+4|0)){break E}if(ra(y[a+4>>2],c+8|0)){break E}if(ra(y[a+4>>2],c+12|0)){break E}if(va(y[a+4>>2],f+356|0)){break E}if(Wa(y[a+4>>2],f+312|0)){break E}w[c+16|0]=z[f+356|0]>>>2&1;g=A[f+312>>1];b=g&32767;x[c+18>>1]=b;w[c+17|0]=g>>>15;d=y[c+4>>2];if((d|0)!=-1){break J}if(g<<16>>16>=0){w[c+17|0]=1}if(z[a+50|0]){break F}d=b;break G}w[a+49|0]=0;break u}c=y[a+4>>2];d=y[c+8>>2];b=d+y[m+28>>2]|0;if(b>>>0>>0){break B}g=c;c=y[c+4>>2];y[g+8>>2]=b>>>0>>0?b:c;break B}c=y[a+4>>2];d=y[c+8>>2];b=d+y[m+28>>2]|0;if(b>>>0>>0){break B}g=c;c=y[c+4>>2];y[g+8>>2]=b>>>0>>0?b:c;break B}y[m+52>>2]=4;k=m+68|0;vb(k,0);g=y[a+4>>2];d=na(44);w[d+1|0]=0;t(d+4|0,0,40);if((va(g,f+356|0)|0)==-1){break I}b=1;i=z[f+356|0];w[d+1|0]=i&1;Ab:{Bb:{if((ra(g,f+332|0)|0)==-1){break Bb}if((ra(g,f+312|0)|0)==-1){break Bb}c=y[f+332>>2];h=y[f+312>>2];if((c|0)>(h|0)){break Bb}l=(i>>>4&7)+1|0;i=(i>>>1&7)+1|0;pb(d,0);y[f+28>>2]=c;w[f+24|0]=1;b=c;while(1){if((Ia(g,i,y[d+8>>2]+(y[d+4>>2]<<3)|0)|0)==-1){break Ab}if((Ia(g,l,y[d+20>>2]+(y[d+4>>2]<<2)|0)|0)==-1){break Ab}n=y[d+20>>2];q=y[d+4>>2]<<2;if(B[n+q>>2]>63){break Ab}y[q+y[d+32>>2]>>2]=b;b=y[n+(y[d+4>>2]<<2)>>2];if((b|0)>31){break Ab}if(z[Na(f+24|0,1<>2];if((h|0)>(b|0)){continue}break}if((Ia(g,i,y[d+8>>2]+(y[d+4>>2]<<3)|0)|0)==-1){break Ab}y[y[d+20>>2]+(y[d+4>>2]<<2)>>2]=32;if((c|0)==-2147483648){break Ab}y[y[d+32>>2]+(y[d+4>>2]<<2)>>2]=c-1;pb(d,1);if((Ia(g,i,y[d+8>>2]+(y[d+4>>2]<<3)|0)|0)==-1){break Ab}y[y[d+20>>2]+(y[d+4>>2]<<2)>>2]=32;y[y[d+32>>2]+(y[d+4>>2]<<2)>>2]=h;pb(d,1);b=y[d+4>>2];if(z[d+1|0]==1){if((Ia(g,i,y[d+8>>2]+(b<<3)|0)|0)==-1){break Ab}b=y[d+4>>2]+1|0;y[d+4>>2]=b}c=y[d+8>>2];if(y[d+12>>2]-c>>3>>>0>>0){break t}c=ob(c,b);w[d|0]=c;y[f+24>>2]=d;b=1;if(!c){break H}b=0;y[f+24>>2]=0;vb(k,d);ta(y[a+4>>2]);break H}w[d|0]=0;y[f+24>>2]=d;break H}break I}if((d|0)!=62){break B}c=y[a+4>>2];d=y[c+8>>2];b=d+y[m+28>>2]|0;if(b>>>0>>0){break B}g=c;c=y[c+4>>2];y[g+8>>2]=b>>>0>>0?b:c;break B}if(!z[a+50|0]){break G}break F}w[d|0]=0;y[f+24>>2]=d;b=1}pa(f+24|0);break u}b=xa(y[c>>2],d);y[f+332>>2]=0;oa(a+32|0,b);la(f+332|0)}if(qa(y[a+32>>2])){break C}y[a+56>>2]=-1}$b(f+24|0)}b=1;break u}Qa(y[a+32>>2],z[c+16|0]);Cb:{Db:{b=y[a+24>>2];h=y[a+28>>2];Eb:{if(b>>>0>>0){y[f+24>>2]=0;y[b>>2]=c;b=b+4|0;break Eb}d=y[a+20>>2];g=b-d|0;k=g>>2;i=k+1|0;if(i>>>0>=1073741824){break Db}b=0;h=h-d|0;l=h>>1;i=h>>>0>=2147483644?1073741823:i>>>0>>0?l:i;if(i){if(i>>>0>=1073741824){break Cb}b=na(i<<2)}y[f+24>>2]=0;h=b+g|0;y[h>>2]=c;c=h-(k<<2)|0;if(g){p(c,d,g)}y[a+28>>2]=(i<<2)+b;b=h+4|0;y[a+24>>2]=b;y[a+20>>2]=c;if(!d){break Eb}ma(d)}w[a+49|0]=1;y[a+24>>2]=b;$b(f+24|0);break B}Ba();o()}jb();o()}b=0;break u}la(f+356|0)}ua(f+312|0);y[f+24>>2]=0;Xb(m+60|0,c);Zb(f+24|0);if(y[m+60>>2]){ta(y[a+4>>2]);b=y[a+4>>2];c=y[b+8>>2];if(c>>>0<=4294967293){d=b;c=c+2|0;b=y[b+4>>2];y[d+8>>2]=b>>>0>c>>>0?c:b}ua(f+16|0);Ha(f+332|0);b=0;break x}ua(f+16|0);Ha(f+332|0)}b=1}ma(g);break u}if(ra(y[a+4>>2],h+16|0)){break v}c=y[a+4>>2];g=y[c>>2];c=y[c+4>>2];if((c|0)<0){break t}d=c>>>27&15;c=((c&134217727)<<5|g>>>27)&-32;if(!d&c>>>0>=2147483648|d){break t}if(!d&B[h+16>>2]>c>>>0){break v}n=0;b=y[m+8>>2];c=(b|0)>0?b:0;d=0;while(1){if((c|0)==(d|0)){i=1;b=0;while(1)if((b|0)==(c|0)){if(!(i&1)){break t}y[h+24>>2]=n;l=Ub(f+356|0,n);k=y[l>>2];Fb:{if((k|0)==y[l+4>>2]){break Fb}b=y[m+8>>2];s=(b|0)>0?b:0;i=1;n=0;c=0;while(1){if((c|0)==(s|0)){break Fb}Gb:{b=Ma(a,y[y[m+12>>2]+(c<<2)>>2]);if(z[b+4|0]&63){break Gb}b=y[b+56>>2];g=y[b+24>>2];d=y[b+28>>2]-g>>2;b=0;while(1){if((b|0)==(d|0)){g=0;if(i&1){b=d+n|0;d=b>>>0>=d>>>0;g=d;n=d?b:0}else{n=0}i=g;break Gb}C=b+n|0;if(!(C>>>0>=b>>>0&i)){break t}y[k+(C<<2)>>2]=y[g+(b<<2)>>2];b=b+1|0;continue}}c=c+1|0;continue}}bb(h+40|0,l);Hb:{Ib:{Jb:{Kb:{if(!z[h|0]){c=y[h+24>>2];b=0;while(1){d=b;b=b+1|0;if(c>>>0>1<>>0){continue}break}break Kb}n=y[h+24>>2];b=0;while(1){if((b|0)!=35){c=b<<3;b=b+1|0;if(!Ia(y[a+4>>2],4,c+(f+24|0)|0)){continue}break Jb}break}if(!ob(f+24|0,35)){break Jb}i=Ed(f+312|0,n);k=y[i>>2];c=0;Lb:while(1){Mb:{Nb:{Ob:{if((c|0)<(n|0)){d=0;y[f+20>>2]=0;w[f+16|0]=1;Pb:while(1){if(wb(y[a+4>>2],f+352|0)){break Nb}g=Tb(f+16|0);if(z[g|0]!=1){break Nb}b=0;C=y[f+20>>2]|y[f+352>>2];s=(C|0)>=0;y[g>>2]=s;j=g;g=s?C:0;y[j+4>>2]=g;if(!s){break t}d=d+1|0;while(1){if((b|0)==35){continue Pb}s=(f+24|0)+(b<<3)|0;if(!(y[s>>2]==(d|0)&(g|0)==y[s+4>>2])){b=b+1|0;continue}break}break}if(b>>>0<=31){y[k+(c<<3)>>2]=b;break Mb}g=y[a+4>>2];Qb:{switch(b-33|0){default:if(Ia(g,2,f+352|0)){break Nb}d=3;break Ob;case 1:if(Ia(g,7,f+352|0)){break Nb}d=11;break Ob;case 0:break Qb}}d=3;if(!Ia(g,3,f+352|0)){break Ob}break Nb}b=y[i+4>>2];if(!ob(k,b-k>>3)){break Nb}y[f+4>>2]=b;y[f>>2]=k;y[f+8>>2]=y[i+8>>2];d=0;y[i+8>>2]=0;y[i>>2]=0;y[i+4>>2]=0;ya(i);if((b|0)==(k|0)){break Ib}ta(y[a+4>>2]);bb(h+28|0,f);ya(f);b=1;if(z[h|0]!=1){break Kb}c=A[f+14>>1];g=c>>>12&3;if((g|0)==2){break Hb}k=c>>>10&3;if((k|0)==2){break Hb}n=c>>>8&3;if((n|0)==2){break Hb}i=c&3;if((i|0)==2){break Hb}s=c>>>6&3;if((s|0)==2){break Hb}Rb:{Sb:{switch(i|0){case 0:i=0;j=sa(a,6);break Rb;case 1:i=0;j=sa(a,7);break Rb;default:break Sb}}C=Ga(a,m,0);if(!C){break Hb}i=1;j=y[C+68>>2]}y[h+60>>2]=j;Tb:{Ub:{switch((c>>>2&3)-1|0){default:j=sa(a,8);break Tb;case 0:j=sa(a,9);break Tb;case 1:j=sa(a,10);break Tb;case 2:break Ub}}C=Ga(a,m,i);if(!C){break Hb}i=i+1|0;j=y[C+68>>2]}y[h+64>>2]=j;Vb:{Wb:{switch((c>>>4&3)-1|0){default:j=sa(a,11);break Vb;case 0:j=sa(a,12);break Vb;case 1:j=sa(a,13);break Vb;case 2:break Wb}}C=Ga(a,m,i);if(!C){break Hb}i=i+1|0;j=y[C+68>>2]}y[h+68>>2]=j;Xb:{Yb:{switch(s|0){case 0:j=sa(a,14);break Xb;case 1:j=sa(a,15);break Xb;default:break Yb}}s=Ga(a,m,i);if(!s){break Hb}i=i+1|0;j=y[s+68>>2]}y[h+72>>2]=j;Zb:{_b:{switch(n|0){case 0:n=sa(a,14);break Zb;case 1:n=sa(a,15);break Zb;default:break _b}}n=Ga(a,m,i);if(!n){break Hb}i=i+1|0;n=y[n+68>>2]}y[h+76>>2]=n;$b:{ac:{switch(k|0){case 0:n=sa(a,14);break $b;case 1:n=sa(a,15);break $b;default:break ac}}k=Ga(a,m,i);if(!k){break Hb}i=i+1|0;n=y[k+68>>2]}y[h+80>>2]=n;bc:{cc:{switch(g|0){case 0:g=sa(a,14);break bc;case 1:g=sa(a,15);break bc;default:break cc}}g=Ga(a,m,i);if(!g){break Hb}i=i+1|0;g=y[g+68>>2]}y[h+84>>2]=g;if(!(c&16384)){fa=h,ga=sa(a,1),y[fa+88>>2]=ga;break Kb}c=Ga(a,m,i);if(!c){break Hb}y[h+88>>2]=y[c+68>>2];break Kb}s=y[f+352>>2]+d|0;if((s|0)<=0){break Mb}g=c+s|0;if((g|0)>(n|0)){break Nb}d=0;b=(b|0)==32&(c|0)>0;c=k+(c<<3)|0;C=c-8|0;while(1)if((d|0)==(s|0)){c=g;continue Lb}else{y[c+(d<<3)>>2]=b?y[C>>2]:0;d=d+1|0;continue}}y[f+8>>2]=0;y[f>>2]=0;y[f+4>>2]=0;ya(i);break Ib}c=c+1|0;continue}}i=0;y[f+312>>2]=0;y[f+316>>2]=0;if(z[h+1|0]==1){b=z[h+2|0];c=b?1024:8192;g=ab(c,8);y[f+24>>2]=0;rc(f+312|0,g);y[f+316>>2]=c;y[f+28>>2]=0;Ha(f+24|0);i=b?1024:8192}y[m+52>>2]=1;dc:{ec:{fc:{gc:{if(z[h|0]==1){b=Dd(h,y[a+4>>2],y[f+312>>2],i);y[f+24>>2]=0;oa(m- -64|0,b);la(f+24|0);if(!y[m+64>>2]){break ec}ta(y[a+4>>2]);break gc}c=Ra(y[a+4>>2]);y[f>>2]=c;b=Cd(f+24|0,d&255);c=Bd(h,c,y[f+312>>2],i,b);y[f+16>>2]=0;oa(m- -64|0,c);la(f+16|0);if(!y[m+64>>2]){break fc}ta(y[a+4>>2]);c=y[a+4>>2];d=y[c+8>>2];if(d>>>0<=4294967293){g=c;d=d+2|0;c=y[c+4>>2];y[g+8>>2]=c>>>0>d>>>0?d:c}qc(b);ua(f)}b=0;if((z[m+4|0]&63)==4){break dc}hc:{if(z[a+50|0]){break hc}b=y[y[a+24>>2]-4>>2];if(z[b+17|0]!=1){break hc}c=q+y[f+344>>2]|0;d=y[a+32>>2];if((c|0)<=y[d+12>>2]){break hc}eb(d,c,z[b+16|0])}b=y[f+340>>2];g=b;h=b>>31;b=y[f+344>>2];c=b;d=b>>31;b=z[f+348|0];fb(y[a+32>>2],g,h,c,d,y[m+64>>2],(b&7)==4?4:b&3);oa(m- -64|0,0);b=0;break dc}qc(b);ua(f)}b=1}Ha(f+312|0);break Hb}y[f+8>>2]=0;y[f>>2]=0;y[f+4>>2]=0}ya(f);b=1}ya(l);break v}else{d=Ma(a,y[y[m+12>>2]+(b<<2)>>2]);if(!(z[d+4|0]&63)){g=0;if(i&1){d=y[d+56>>2];d=y[d+28>>2]-y[d+24>>2]>>2;g=d+n|0;i=g;g=d>>>0<=g>>>0;n=g?i:0}else{n=0}i=g}b=b+1|0;continue}}b=1;g=d<<2;d=d+1|0;if(Ma(a,y[g+y[m+12>>2]>>2])){continue}break}}pc(f+308|0)}Y=f+368|0;break s}o()}if(y[a+56>>2]!=3){break r}b=y[a+4>>2];c=y[b+8>>2];b=y[b+4>>2];if(c>>>0>b>>>0){break e}if((b|0)!=(c|0)){continue}break}y[a+52>>2]=2;break c}ic:{switch(b|0){default:ib(R,0);break i;case 0:break ic;case 2:break d}}g=y[R>>2];b=y[g+28>>2];if((b|0)==-1){break g}c=y[a+84>>2];b=b+c|0;if(b>>>0>=c>>>0){break h}}aa=1;break c}y[a+84>>2]=b;d=y[a+4>>2];c=y[d+4>>2];y[d+8>>2]=b>>>0>>0?b:c;break f}d=y[a+4>>2];b=y[d+8>>2];if(b>>>0>4294967291){break f}b=b+4|0;c=y[d+4>>2];y[d+8>>2]=b>>>0>>0?b:c}b=y[a+12>>2];i=y[a+16>>2];jc:{if(b>>>0>>0){y[R>>2]=0;y[b>>2]=g;b=b+4|0;break jc}c=y[a+8>>2];b=b-c|0;k=b>>2;d=k+1|0;if(d>>>0>=1073741824){break b}i=i-c|0;h=i>>1;d=i>>>0>=2147483644?1073741823:d>>>0>>0?h:d;if(d){if(d>>>0>=1073741824){break a}i=na(d<<2)}else{i=0}y[a+80>>2]=0;h=b+i|0;y[h>>2]=g;g=h-(k<<2)|0;if(b){p(g,c,b)}y[a+16>>2]=i+(d<<2);b=h+4|0;y[a+12>>2]=b;y[a+8>>2]=g;if(c){ma(c)}d=y[a+4>>2]}y[a+12>>2]=b;b=y[d+8>>2];i=y[d+4>>2];if(b>>>0<=i>>>0){continue}break}}o()}ib(R,0)}Y=J+16|0;return aa}Ba();o()}jb();o()}function cb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;e=Y-96|0;Y=e;f=y[a+8>>2];g=y[a+4>>2];a:{if(!(f-1>>>0<65535&g-1>>>0<=65534)){n=xa(g,f);break a}b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{if(!z[a|0]){l:{if(z[a+24|0]!=255|z[a+25|0]!=255|(z[a+26|0]!=255|z[a+27|0]!=255)){break l}if(y[a+12>>2]){break l}k=y[a+20>>2];if((g|0)!=y[k+8>>2]){break l}if(!qa(k)){break b}p=y[a+4>>2];f=y[a+8>>2];n=xa(p,f);y[e+44>>2]=n;if(!qa(n)){break d}q=d;A=c;c=y[a+20>>2];G=y[c+8>>2];x=y[c+12>>2];c=y[a+16>>2];if(!((1-x|0)<=(c|0)&(c|0)<(x|0))){y[a+16>>2]=0}K=(f|0)>0?f:0;L=x+1|0;E=x-1|0;H=A+128|0;while(1){if((l|0)!=(K|0)){if(z[a+1|0]==1){if(z[b|0]){break d}if((d|0)==16|d>>>0<16){break k}C=ka(b,H)^C}ja(e+32|0,n,l);i=0;m:{if(!l){u=0;s=0;k=0;break m}ja(e+72|0,n,l-1|0);s=y[e+76>>2];if(!s){break k}u=y[e+72>>2];k=z[u|0]<<4}c=y[a+16>>2];y[e+88>>2]=0;y[e+92>>2]=0;y[e+80>>2]=0;y[e+84>>2]=0;y[e+72>>2]=0;y[e+76>>2]=0;y[e+16>>2]=0;y[e+8>>2]=0;y[e+12>>2]=0;g=l-c|0;if(!((g|0)<=0|(g|0)>(x|0))){ja(e+48|0,y[a+20>>2],g-1|0);c=y[e+52>>2];y[e+76>>2]=c;f=y[e+48>>2];y[e+72>>2]=f;if(!c){break k}c=z[f|0];y[e+8>>2]=c;i=c&192}j=0;c=0;n:{if((g|0)<0){break n}c=0;if((g|0)>=(x|0)){break n}ja(e+48|0,y[a+20>>2],g);c=y[e+52>>2];y[e+84>>2]=c;f=y[e+48>>2];y[e+80>>2]=f;if(!c){break k}c=z[f|0];y[e+12>>2]=c;c=c>>>3&24}if(!((g|0)<-1|(g|0)>=(E|0))){ja(e+48|0,y[a+20>>2],g+1|0);g=y[e+52>>2];y[e+92>>2]=g;f=y[e+48>>2];y[e+88>>2]=f;if(!g){break k}g=z[f|0];y[e+16>>2]=g;j=g>>>6|0}o:{if(!C){h=c|(k&3072|i)|j;r=0;v=y[e+32>>2];I=y[e+36>>2];m=0;p:while(1){if((m|0)>=(p|0)){break o}q:{if(!l){break q}k=k<<8;if((p|0)<=(m+8|0)){break q}c=(m>>>3|0)+1|0;if(c>>>0>=s>>>0){break k}k=z[c+u|0]<<4|k}r:{if((L+y[a+16>>2]|0)<(l|0)){y[e+16>>2]=0;y[e+8>>2]=0;y[e+12>>2]=0;g=0;i=0;c=0;break r}c=(m>>>3|0)+1|0;i=e+8|0;f=0;g=(G|0)<=(m+8|0);while(1){if((f|0)!=24){j=(e+72|0)+f|0;t=y[j+4>>2];s:{if(!t){break s}D=y[i>>2]<<8;y[i>>2]=D;if(g){break s}if(c>>>0>=t>>>0){break k}y[i>>2]=D|z[c+y[j>>2]|0]}i=i+4|0;f=f+8|0;continue}break}g=y[e+12>>2];i=y[e+8>>2];c=y[e+16>>2]}f=0;j=r+p|0;j=(j|0)>0?j:0;D=(j|0)>=8?8:j;j=0;while(1){if((f|0)==(D|0)){c=m>>>3|0;if(c>>>0>=I>>>0){break k}w[c+v|0]=j;r=r-8|0;m=m+8|0;continue p}if(h>>>0>=q>>>0){break k}F=ka(b,A+(h<<3)|0);t=7-f|0;j=F<>>13-f&1|(g>>>10-f&8|(i>>>t&64|(k>>>t&1024|h<<1&6582|F<<9)));f=f+1|0;continue}}}Jb(e+48|0,a,l);i=c|(k&3072|i)|j;c=0;v=y[e+32>>2];I=y[e+36>>2];D=y[e+60>>2];F=y[e+56>>2];r=0;while(1){if((c|0)>=(p|0)){break o}t:{if(!l){g=c+8|0;break t}k=k<<8;g=c+8|0;if((p|0)<=(g|0)){break t}f=(c>>>3|0)+1|0;if(f>>>0>=s>>>0){break k}k=z[f+u|0]<<4|k}j=c>>>3|0;m=j+1|0;f=0;h=e+8|0;while(1){u:{if((f|0)==24){f=0;m=r+p|0;m=(m|0)>0?m:0;J=(m|0)>=8?8:m;N=y[e+16>>2];M=y[e+12>>2];O=y[e+8>>2];m=0;while(1){if((f|0)==(J|0)){break u}t=y[y[a+20>>2]+8>>2];P=c+f|0;h=ia(t,P,F,D);v:{if(z[a+1|0]==1){if(Ib(t,P,h,e+48|0)){break v}}if(z[b|0]){break d}if(i>>>0>=q>>>0){break k}h=ka(b,A+(i<<3)|0)}t=7-f|0;i=N>>>13-f&1|(M>>>10-f&8|(k>>>t&1024|i<<1&6582|h<<9|O>>>t&64));f=f+1|0;m=h<>2];w:{if(!J){break w}N=y[h>>2]<<8;y[h>>2]=N;if((g|0)>=(G|0)){break w}if(m>>>0>=J>>>0){break k}y[h>>2]=N|z[m+y[t>>2]|0]}h=h+4|0;f=f+8|0;continue}break}if(j>>>0>=I>>>0){break k}w[j+v|0]=m;r=r-8|0;c=g;continue}}l=l+1|0;continue}break}y[e+44>>2]=0;break c}n=xa(g,f);y[e+44>>2]=n;if(!qa(n)){break f}Qa(n,0);A=c;u=c+128|0;c=0;while(1){if(B[a+8>>2]>c>>>0){if(z[a+1|0]==1){if(z[b|0]){break f}if((d|0)==16|d>>>0<16){break k}m=ka(b,u)^m}ja(e+32|0,n,c);f=e+72|0;ja(f,n,c-1|0);g=y[e+76>>2];q=y[e+72>>2];dd(f,a,c);f=0;k=y[n+8>>2];f=!g|(k|0)<2?f:z[q|0]>>>6&1;if(!(!g|(k|0)<=0)){f=z[q|0]>>>6&2|f}y[e+8>>2]=f;y[e+12>>2]=0;r=y[a+20>>2];f=y[r+8>>2];k=y[a+12>>2];i=1-k|0;l=y[e+72>>2];j=y[e+76>>2];h=0-k|0;Q=e,R=ia(f,i,l,j)|ia(f,h,l,j)<<1,y[Q+16>>2]=R;l=y[e+80>>2];j=y[e+84>>2];s=ia(f,i,l,j);p=s|ia(f,h,l,j)<<1;s=k^-1;Q=e,R=p|ia(f,s,l,j)<<2,y[Q+20>>2]=R;j=i;k=y[e+88>>2];i=y[e+92>>2];l=ia(f,j,k,i);Q=e,R=l|ia(f,h,k,i)<<1|ia(f,s,k,i)<<2,y[Q+24>>2]=R;f=e+48|0;ja(f,r,w[a+27|0]+(c-y[a+16>>2]|0)|0);k=y[e+52>>2];h=y[e+48>>2];ja(f,n,w[a+25|0]+c|0);f=y[e+52>>2];i=y[e+48>>2];x:{if(!m){l=q;q=g;j=i;i=f;g=k;r=h;f=0;k=y[e+32>>2];s=y[e+36>>2];while(1){if(B[a+4>>2]<=f>>>0){break x}p=e+8|0;h=cd(a,y[n+8>>2],p,f,r,g,j,i);if(z[b|0]){break f}if(d>>>0<=h>>>0){break k}bd(a,n,p,f,ka(b,A+(h<<3)|0),e+72|0,l,q,k,s);f=f+1|0;continue}}Jb(e+48|0,a,c);l=q;q=g;j=i;i=f;g=k;r=h;f=0;k=y[e+32>>2];s=y[e+36>>2];p=y[e+60>>2];C=y[e+56>>2];while(1){if(B[a+4>>2]<=f>>>0){break x}x=y[y[a+20>>2]+8>>2];h=ia(x,f,C,p);y:{if(z[a+1|0]==1){if(Ib(x,f,h,e+48|0)){break y}}h=cd(a,y[n+8>>2],e+8|0,f,r,g,j,i);if(z[b|0]==1){break f}if(d>>>0<=h>>>0){break k}h=ka(b,A+(h<<3)|0)}bd(a,n,e+8|0,f,h,e+72|0,l,q,k,s);f=f+1|0;continue}}c=c+1|0;continue}break}y[e+44>>2]=0;break e}z:{if(y[a+12>>2]){break z}k=y[a+20>>2];if((g|0)!=y[k+8>>2]){break z}if(!qa(k)){break b}q=y[a+4>>2];f=y[a+8>>2];n=xa(q,f);y[e+44>>2]=n;if(!qa(n)){break h}A=d;m=c;c=y[a+20>>2];x=y[c+8>>2];p=y[c+12>>2];c=y[a+16>>2];if(!((1-p|0)<=(c|0)&(c|0)<(p|0))){y[a+16>>2]=0}t=(f|0)>0?f:0;K=p-1|0;L=m- -64|0;while(1){A:{B:{if((l|0)!=(t|0)){if(z[a+1|0]==1){if(z[b|0]){break h}if((d|0)==8|d>>>0<8){break k}G=ka(b,L)^G}ja(e+32|0,n,l);i=0;C:{if(!l){C=0;s=0;k=0;break C}ja(e+72|0,n,l-1|0);s=y[e+76>>2];if(!s){break k}C=y[e+72>>2];k=z[C|0]<<1}c=y[a+16>>2];y[e+88>>2]=0;y[e+92>>2]=0;y[e+80>>2]=0;y[e+84>>2]=0;y[e+72>>2]=0;y[e+76>>2]=0;y[e+16>>2]=0;y[e+8>>2]=0;y[e+12>>2]=0;g=l-c|0;if(!((g|0)<=0|(g|0)>(p|0))){ja(e+48|0,y[a+20>>2],g-1|0);c=y[e+52>>2];y[e+76>>2]=c;f=y[e+48>>2];y[e+72>>2]=f;if(!c){break k}c=z[f|0];y[e+8>>2]=c;i=c>>>2&32}j=0;c=0;D:{if((g|0)<0){break D}c=0;if((g|0)>=(p|0)){break D}ja(e+48|0,y[a+20>>2],g);c=y[e+52>>2];y[e+84>>2]=c;f=y[e+48>>2];y[e+80>>2]=f;if(!c){break k}c=z[f|0];y[e+12>>2]=c;c=c>>>4&12}if(!((g|0)<-1|(g|0)>=(K|0))){ja(e+48|0,y[a+20>>2],g+1|0);g=y[e+52>>2];y[e+92>>2]=g;f=y[e+48>>2];y[e+88>>2]=f;if(!g){break k}g=z[f|0];y[e+16>>2]=g;j=g>>>6|0}if(G){break B}h=c|(k&384|i)|j;f=0;u=y[e+32>>2];E=y[e+36>>2];r=0;E:while(1){if((f|0)>=(q|0)){break A}F:{if(!l){c=f+8|0;break F}k=k<<8;c=f+8|0;if((q|0)<=(c|0)){break F}g=(f>>>3|0)+1|0;if(g>>>0>=s>>>0){break k}k=z[g+C|0]<<1|k}g=f>>>3|0;j=g+1|0;i=e+8|0;f=0;while(1){if((f|0)==24){f=0;i=r+q|0;i=(i|0)>0?i:0;j=(i|0)>=8?8:i;H=y[e+16>>2];v=y[e+12>>2];I=y[e+8>>2];i=0;while(1){if((f|0)==(j|0)){if(g>>>0>=E>>>0){break k}w[g+u|0]=i;r=r-8|0;f=c;continue E}if(h>>>0>=A>>>0){break k}D=ka(b,m+(h<<3)|0);F=7-f|0;i=D<>>13-f&1|(v>>>11-f&4|(I>>>9-f&32|(k>>>F&128|h<<1&794|D<<6)));f=f+1|0;continue}}H=(e+72|0)+f|0;v=y[H+4>>2];G:{if(!v){break G}I=y[i>>2]<<8;y[i>>2]=I;if((c|0)>=(x|0)){break G}if(j>>>0>=v>>>0){break k}y[i>>2]=I|z[j+y[H>>2]|0]}i=i+4|0;f=f+8|0;continue}}}y[e+44>>2]=0;break g}Jb(e+48|0,a,l);i=c|(k&384|i)|j;c=0;E=y[e+32>>2];H=y[e+36>>2];v=y[e+60>>2];I=y[e+56>>2];u=0;while(1){if((c|0)>=(q|0)){break A}H:{if(!l){g=c+8|0;break H}k=k<<8;g=c+8|0;if((q|0)<=(g|0)){break H}f=(c>>>3|0)+1|0;if(f>>>0>=s>>>0){break k}k=z[f+C|0]<<1|k}r=c>>>3|0;j=r+1|0;f=0;h=e+8|0;while(1){I:{if((f|0)==24){f=0;h=q+u|0;h=(h|0)>0?h:0;D=(h|0)>=8?8:h;F=y[e+16>>2];J=y[e+12>>2];N=y[e+8>>2];j=0;while(1){if((f|0)==(D|0)){break I}M=y[y[a+20>>2]+8>>2];O=c+f|0;h=ia(M,O,I,v);J:{if(z[a+1|0]==1){if(Ib(M,O,h,e+48|0)){break J}}if(z[b|0]){break h}if(i>>>0>=A>>>0){break k}h=ka(b,m+(i<<3)|0)}M=7-f|0;i=F>>>13-f&1|(J>>>11-f&4|(N>>>9-f&32|(k>>>M&128|i<<1&794|h<<6)));f=f+1|0;j=h<>2];K:{if(!F){break K}J=y[h>>2]<<8;y[h>>2]=J;if((g|0)>=(x|0)){break K}if(j>>>0>=F>>>0){break k}y[h>>2]=J|z[j+y[D>>2]|0]}h=h+4|0;f=f+8|0;continue}break}if(r>>>0>=H>>>0){break k}w[r+E|0]=j;u=u-8|0;c=g;continue}}l=l+1|0;continue}}n=xa(g,f);y[e+32>>2]=n;if(!qa(n)){break j}Qa(n,0);g=c;t=c- -64|0;while(1){if(B[a+8>>2]>u>>>0){if(z[a+1|0]==1){if(z[b|0]){break j}if((d|0)==8|d>>>0<8){break k}r=ka(b,t)^r}ja(e+8|0,n,u);c=e+72|0;ja(c,n,u-1|0);k=y[e+76>>2];A=y[e+72>>2];dd(c,a,u);h=0;c=y[n+8>>2];h=!k|(c|0)<2?h:z[A|0]>>>6&1;h=!k|(c|0)<=0?h:z[A|0]>>>6&2|h;c=y[y[a+20>>2]+8>>2];m=y[a+12>>2];f=0-m|0;p=y[e+72>>2];C=y[e+76>>2];ia(c,f,p,C);l=ia(c,f,p,C);j=1-m|0;q=y[e+80>>2];s=y[e+84>>2];i=ia(c,j,q,s)|ia(c,f,q,s)<<1|ia(c,m^-1,q,s)<<2;x=y[e+88>>2];G=y[e+92>>2];j=ia(c,j,x,G)|ia(c,f,x,G)<<1;L:{if(!r){m=0;K=y[e+12>>2];L=y[e+8>>2];f=0;while(1){if(B[a+4>>2]<=f>>>0){break L}if(z[b|0]){break j}c=i<<2|l<<5|m<<6|h<<7|j;if(c>>>0>=d>>>0){break k}m=ka(b,g+(c<<3)|0);La(y[n+8>>2],f,L,K,m);l=y[a+12>>2];h=ia(y[n+8>>2],f+2|0,A,k)|h<<1&6;c=y[y[a+20>>2]+8>>2];E=f-l|0;l=ia(c,E+1|0,p,C);E=E+2|0;i=ia(c,E,q,s)|i<<1&6;j=ia(c,E,x,G)|j<<1&2;f=f+1|0;continue}}Jb(e+48|0,a,u);c=0;K=y[e+12>>2];L=y[e+8>>2];E=y[e+60>>2];H=y[e+56>>2];f=0;while(1){if(B[a+4>>2]<=f>>>0){break L}v=y[y[a+20>>2]+8>>2];m=ia(v,f,H,E);M:{if(z[a+1|0]==1){if(Ib(v,f,m,e+48|0)){break M}}if(z[b|0]==1){break j}c=i<<2|l<<5|c<<6|h<<7|j;if(c>>>0>=d>>>0){break k}m=ka(b,g+(c<<3)|0)}La(y[n+8>>2],f,L,K,m);l=y[a+12>>2];h=ia(y[n+8>>2],f+2|0,A,k)|h<<1&6;c=y[y[a+20>>2]+8>>2];v=f-l|0;l=ia(c,v+1|0,p,C);v=v+2|0;i=ia(c,v,q,s)|i<<1&6;j=ia(c,v,x,G)|j<<1&2;f=f+1|0;c=m;continue}}u=u+1|0;continue}break}y[e+32>>2]=0;break i}o()}n=0}la(e+32|0);break a}n=0}la(e+44|0);break a}n=0}la(e+44|0);break a}n=0}la(e+44|0);break a}}Y=e+96|0;return n}function Zc(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;i=Y-32|0;Y=i;j=d-(c>>>0<1048577)|0;l=f-(e>>>0<1048577)|0;a:{if((j|0)==-1&c-1048577>>>0<4292870143|(j|0)!=-1|((l|0)==-1&e-1048577>>>0<4292870143|(l|0)!=-1)){break a}p=y[h>>2];q=y[h+8>>2];j=y[h+4>>2];m=y[h+12>>2];y[i+28>>2]=y[b+8>>2];w[i+24|0]=1;l=Yc(i+24|0,c);v=z[l|0];k=y[i+28>>2];h=y[b+12>>2];y[l>>2]=1;y[l+4>>2]=h;l=Yc(l,e);h=m-j|0;m=y[i+28>>2];x=z[l|0]?(h|0)<(m|0)?h:m:h;l=0-e&f>>31;if((x|0)<=(l|0)){break a}h=q-p|0;m=v?(h|0)<(k|0)?h:k:h;h=0-c&d>>31;if((m|0)<=(h|0)){break a}b:{c:{p=h+p|0;if((p|0)<0){break c}c=!!c&(d|0)>=0|(d|0)>0?c:0;n=c+(m-h|0)|0;D=-1<<0-n;E=-1>>>c|0;v=j+l|0;k=h&31;j=x-l|0;q=c&31;d=!!e&(f|0)>=0|(f|0)>0?e:0;l=c>>>5|0;p=p>>>5|0;if((c^n-1)>>>0<=31){c=D&E;if((h^m-1)>>>0>=32){h=0;j=(j|0)>0?j:0;k=k-q|0;q=32-k|0;m=p<<2;while(1){if((h|0)==(j|0)){break a}f=i+8|0;Ca(f,a,h+v|0);e=y[i+12>>2];n=y[i+8>>2];Ca(f,b,d+h|0);if(!e){break b}f=y[i+12>>2];if(!f){break b}if(e>>>0

>>0){break c}y[i+20>>2]=e-p;y[i+16>>2]=m+n;e=_a(i+16|0);if(!y[i+20>>2]|f>>>0>>0|(f|0)==(l|0)){break c}f=y[i+8>>2]+(l<<2)|0;n=(te(e,24)&16711935|te(e&16711935,8))<>2]>>2];n=n|(te(e&16711935,8)|te(e,24)&16711935)>>>q;e=y[f>>2];e=Oa(g,n,te(e&16711935,8)|te(e,24)&16711935,c);I=f,J=te(e&16711935,8)|te(e,24)&16711935,y[I>>2]=J;h=h+1|0;continue}}h=0;f=(j|0)>0?j:0;if(k>>>0>q>>>0){k=k-q|0;q=p<<2;while(1){if((f|0)==(h|0)){break a}j=i+16|0;Ca(j,a,h+v|0);e=y[i+20>>2];m=y[i+16>>2];Ca(j,b,d+h|0);if(!e){break b}j=y[i+20>>2];if(!j){break b}if((e|0)==(p|0)|e>>>0

>>0|((j|0)==(l|0)|j>>>0>>0)){break c}e=y[i+16>>2]+(l<<2)|0;n=e;j=y[m+q>>2];j=(te(j&16711935,8)|te(j,24)&16711935)<>2];e=Oa(g,j,te(e&16711935,8)|te(e,24)&16711935,c);I=n,J=te(e&16711935,8)|te(e,24)&16711935,y[I>>2]=J;h=h+1|0;continue}}k=q-k|0;q=p<<2;while(1){if((f|0)==(h|0)){break a}j=i+16|0;Ca(j,a,h+v|0);e=y[i+20>>2];m=y[i+16>>2];Ca(j,b,d+h|0);if(!e){break b}j=y[i+20>>2];if(!j){break b}if((e|0)==(p|0)|e>>>0

>>0|((j|0)==(l|0)|j>>>0>>0)){break c}e=y[i+16>>2]+(l<<2)|0;n=e;j=y[m+q>>2];j=(te(j&16711935,8)|te(j,24)&16711935)>>>k|0;e=y[e>>2];e=Oa(g,j,te(e&16711935,8)|te(e,24)&16711935,c);I=n,J=te(e&16711935,8)|te(e,24)&16711935,y[I>>2]=J;h=h+1|0;continue}}x=n&31;A=(y[a+16>>2]>>>2)-(h>>>5)|0;if(k>>>0<=q>>>0){if((k|0)==(q|0)){k=0;e=((n|0)/32|0)-(c+31>>>5|0)|0;if((e|0)<0){break c}A=(j|0)>0?j:0;t=p<<2;d:while(1){if((k|0)==(A|0)){break a}f=i+8|0;Ca(f,a,k+v|0);c=y[i+12>>2];j=y[i+8>>2];Ca(f,b,d+k|0);if(!c){break b}h=y[i+12>>2];if(!h){break b}if(c>>>0

>>0){break c}y[i+20>>2]=c-p;y[i+16>>2]=j+t;if(h>>>0>>0){break c}j=h-l|0;y[i+12>>2]=j;y[i+8>>2]=y[i+8>>2]+(l<<2);if(q){c=_a(i+16|0);f=gc(f);h=te(c,24)&16711935|te(c&16711935,8);c=y[f>>2];c=Oa(g,h,te(c&16711935,8)|te(c,24)&16711935,E);I=f,J=te(c&16711935,8)|te(c,24)&16711935,y[I>>2]=J;j=y[i+12>>2]}if(e>>>0>j>>>0){break c}c=y[i+16>>2];if(B[i+20>>2]>>0){break c}h=y[i+8>>2];u=e<<2;m=h+u|0;n=y[i+20>>2];f=c;while(1)if((h|0)==(m|0)){if(x){if((e|0)==(n|0)|e>>>0>n>>>0|(e|0)==(j|0)){break c}c=y[f+u>>2];f=te(c&16711935,8)|te(c,24)&16711935;c=y[m>>2];c=Oa(g,f,te(c&16711935,8)|te(c,24)&16711935,D);I=m,J=te(c&16711935,8)|te(c,24)&16711935,y[I>>2]=J}k=k+1|0;continue d}else{r=y[c>>2];s=te(r&16711935,8)|te(r,24)&16711935;r=y[h>>2];r=Eb(g,s,te(r&16711935,8)|te(r,24)&16711935);I=h,J=te(r&16711935,8)|te(r,24)&16711935,y[I>>2]=J;c=c+4|0;h=h+4|0;continue}}}m=0;e=((n|0)/32|0)-(c+31>>>5|0)|0;if((e|0)<0){break c}n=q-k|0;u=32-n|0;F=(j|0)>0?j:0;G=p<<2;e:while(1){if((m|0)==(F|0)){break a}f=i+8|0;Ca(f,a,m+v|0);c=y[i+12>>2];h=y[i+8>>2];Ca(f,b,d+m|0);if(!c){break b}f=y[i+12>>2];if(!f){break b}if(c>>>0

>>0){break c}c=c-p|0;y[i+20>>2]=c;y[i+16>>2]=h+G;if(x){if(c>>>0>>0){break c}y[i+20>>2]=A}if(f>>>0>>0){break c}k=f-l|0;y[i+12>>2]=k;y[i+8>>2]=y[i+8>>2]+(l<<2);c=_a(i+16|0);j=te(c&16711935,8)|te(c,24)&16711935;if(q){c=gc(i+8|0);f=y[c>>2];f=Oa(g,j>>>n|0,te(f&16711935,8)|te(f,24)&16711935,E);h=te(f&16711935,8);I=c,J=te(f,24)&16711935|h,y[I>>2]=J;k=y[i+12>>2]}if(e>>>0>k>>>0){break c}c=y[i+16>>2];if(B[i+20>>2]>>0){break c}h=y[i+8>>2];C=e<<2;t=h+C|0;r=y[i+20>>2];f=c;while(1)if((h|0)==(t|0)){if(x){if(e>>>0>r>>>0){break c}h=j<>2];h=(te(c&16711935,8)|te(c,24)&16711935)>>>n|h}if((e|0)==(k|0)){break c}c=y[t>>2];c=Oa(g,h,te(c&16711935,8)|te(c,24)&16711935,D);I=t,J=te(c&16711935,8)|te(c,24)&16711935,y[I>>2]=J}m=m+1|0;continue e}else{H=j<>2];j=te(j&16711935,8)|te(j,24)&16711935;s=y[h>>2];s=Eb(g,H|j>>>n,te(s&16711935,8)|te(s,24)&16711935);I=h,J=te(s&16711935,8)|te(s,24)&16711935,y[I>>2]=J;c=c+4|0;h=h+4|0;continue}}}m=0;e=((n|0)/32|0)-(c+31>>>5|0)|0;if((e|0)<0){break c}n=k-q|0;t=32-n|0;F=(j|0)>0?j:0;G=p<<2;f:while(1){if((m|0)==(F|0)){break a}f=i+8|0;Ca(f,a,m+v|0);c=y[i+12>>2];h=y[i+8>>2];Ca(f,b,d+m|0);if(!c){break b}f=y[i+12>>2];if(!f){break b}if(c>>>0

>>0){break c}c=c-p|0;y[i+20>>2]=c;y[i+16>>2]=h+G;if(x){if(c>>>0>>0){break c}y[i+20>>2]=A}if(f>>>0>>0){break c}k=f-l|0;y[i+12>>2]=k;y[i+8>>2]=y[i+8>>2]+(l<<2);c=i+16|0;f=_a(c);j=te(f&16711935,8)|te(f,24)&16711935;if(q){c=_a(c);f=gc(i+8|0);h=j<>2];c=Oa(g,h|j>>>t,te(c&16711935,8)|te(c,24)&16711935,E);I=f,J=te(c&16711935,8)|te(c,24)&16711935,y[I>>2]=J;k=y[i+12>>2]}if(e>>>0>k>>>0){break c}c=y[i+16>>2];if(B[i+20>>2]>>0){break c}h=y[i+8>>2];C=e<<2;u=h+C|0;r=y[i+20>>2];f=c;while(1)if((h|0)==(u|0)){if(x){if(e>>>0>r>>>0){break c}h=j<>2];h=(te(c&16711935,8)|te(c,24)&16711935)>>>t|h}if((e|0)==(k|0)){break c}c=y[u>>2];c=Oa(g,h,te(c&16711935,8)|te(c,24)&16711935,D);I=u,J=te(c&16711935,8)|te(c,24)&16711935,y[I>>2]=J}m=m+1|0;continue f}else{H=j<>2];j=te(j&16711935,8)|te(j,24)&16711935;s=y[h>>2];s=Eb(g,H|j>>>t,te(s&16711935,8)|te(s,24)&16711935);I=h,J=te(s&16711935,8)|te(s,24)&16711935,y[I>>2]=J;c=c+4|0;h=h+4|0;continue}}}o()}}Y=i+32|0}function Dd(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0;f=Y-128|0;Y=f;n=xa(y[a+8>>2],y[a+12>>2]);y[f+124>>2]=n;if(qa(n)){Qa(n,z[a+4|0]);k=qd(b);y[f+116>>2]=k;e=0;a:{if(za(k,y[a+68>>2],f+120|0)){break a}y[f+108>>2]=y[f+120>>2];w[f+104|0]=1;q=Db(f+104|0,y[a+20>>2]);e=q;g=y[f+108>>2];h=0-g|0;y[e>>2]=z[e|0]&(g|0)!=-2147483648;y[e+4>>2]=h;y[f+100>>2]=0;w[f+96|0]=1;b:{c:{d:{e:while(1){if(B[a+16>>2]>r>>>0){if(za(k,y[a+68>>2],f+92|0)){break b}y[f+84>>2]=y[f+92>>2];e=1;w[f+80|0]=1;g=Db(f+80|0,y[a+20>>2]);s=Vc(q,y[g>>2],y[g+4>>2]);y[f+76>>2]=0;w[f+72|0]=1;while(1){f:{if(e&1){if(za(k,y[a+60>>2],f+8|0)){break b}h=Na(f+96|0,y[f+8>>2]);e=y[h+4>>2];y[f+72>>2]=y[h>>2];y[f+76>>2]=e;break f}g:{switch(za(k,y[a+64>>2],f+8|0)|0){case 0:break g;case 1:continue e;default:break b}}Na(Na(f+72|0,y[f+8>>2]),w[a+5|0])}e=1;j=0;g=y[a+20>>2];if((g|0)!=1){while(1){h=e;e=e+1|0;if(g>>>0>1<>>0){continue}break}if(Ia(b,h,f+8|0)){break b}j=z[f+8|0]}e=y[s+4>>2];if(!(y[s>>2]&1)){break b}h=e+j|0;e=h&(e^-1);if((e|0)<0){break b}t=(e|0)>=0?h:0;j=0;y[f+68>>2]=0;w[f+64|0]=1;h:while(1){if(wb(b,f+8|0)){break b}e=Tb(f- -64|0);if(z[e|0]!=1){break b}h=y[f+68>>2]|y[f+8>>2];g=(h|0)>=0;y[e>>2]=g;h=g?h:0;y[e+4>>2]=h;if(!g){break d}j=j+1|0;l=y[a+28>>2];i=y[a+24>>2];e=0;while(1){if((e|0)==(i|0)){continue h}g=l+(e<<3)|0;if(!(y[g>>2]==(j|0)&(h|0)==y[g+4>>2])){e=e+1|0;continue}break}break}i:{j:{k:{if(!z[a+1|0]){w[f+60|0]=0;y[f+56>>2]=0;break k}h=y[b>>2];g=y[b+8>>2];if(g>>>0>=B[b+4>>2]){break b}g=z[g+h|0];h=y[b+12>>2];_b(b);w[f+60|0]=0;y[f+56>>2]=0;if(g>>>7-h&1){break j}}Uc(f+56|0,y[y[a+40>>2]+(e<<2)>>2]);break i}if(za(k,y[a+72>>2],f+52|0)){break c}if(za(k,y[a+76>>2],f+48|0)){break c}if(za(k,y[a+80>>2],f+44|0)){break c}if(za(k,y[a+84>>2],f+40|0)){break c}if(za(k,y[a+88>>2],f+36|0)){break c}ta(b);j=y[y[a+40>>2]+(e<<2)>>2];if(!j){break c}l=y[f+52>>2];h=l>>31;e=y[j+8>>2]+l|0;if(e>>>0>>0?h+1|0:h){break c}i=y[f+48>>2];g=i>>31;h=i+y[j+12>>2]|0;if(h>>>0>>0?g+1|0:g){break c}g=y[b+8>>2];Cb(f+8|0,l,2,y[f+44>>2]);Cb(f+28|0,i,2,y[f+40>>2]);if(!(w[f+32|0]&1)|z[f+12|0]!=1){break c}i=db();y[f+24>>2]=i;y[i+8>>2]=h;y[i+4>>2]=e;e=z[a+2|0];y[i+20>>2]=j;w[i|0]=e;y[i+12>>2]=y[f+8>>2];e=y[f+28>>2];j=0;w[i+1|0]=0;y[i+16>>2]=e;w[i+24|0]=z[a+92|0];w[i+25|0]=z[a+93|0];w[i+26|0]=z[a+94|0];w[i+27|0]=z[a+95|0];e=Ra(b);y[f+20>>2]=e;if(fc(Tc(f+56|0,cb(i,e,c,d)))){ta(b);e=y[b+8>>2];if(e>>>0<=4294967293){h=e+2|0;e=y[b+4>>2];e=e>>>0>h>>>0?h:e;y[b+8>>2]=e}j=y[f+36>>2]==(e-g|0)}ua(f+20|0);Ua(f+24|0);if(!j){break c}}e=f+56|0;if(fc(e)){i=y[Xa(e)+8>>2];e=Xa(e);p=y[a+56>>2];j=y[e+12>>2];l:{m:{l=z[a+3|0];if(!l){e=z[f+72|0];if((p&-2)!=2){break m}if(!(e&1)){break c}g=y[f+76>>2];h=g>>31;e=i-1|0;m=e;e=e+g|0;g=m>>>0>e>>>0?h+1|0:h;g=e>>>0<2147483648&(g|0)<=0|(g|0)<0;y[f+72>>2]=0|g;y[f+76>>2]=g?e:0;if(!g){break c}break l}e=z[f+72|0];n:{switch(p|0){default:if(!(e&1)){break c}break l;case 0:case 2:break n}}if(!(e&1)){break c}g=y[f+76>>2];h=g>>31;e=j-1|0;m=e;e=e+g|0;h=m>>>0>e>>>0?h+1|0:h;g=e>>>0<2147483648&(h|0)<=0|(h|0)<0;y[f+72>>2]=0|g;y[f+76>>2]=g?e:0;if(g){break l}break c}if(!(e&1)){break c}}g=y[f+76>>2];Rc(f+8|0,l,p,g,t,i,j);m=Xa(f+56|0);e=y[f+8>>2];h=e;i=e>>31;e=y[f+12>>2];Hb(m,n,h,i,e,e>>31,y[a+52>>2]);e=y[f+16>>2];if(e){h=g>>31;m=e;e=e+g|0;g=m>>>0>e>>>0?h+1|0:h;h=e;g=e>>>0<2147483648&(g|0)<=0|(g|0)<0;e=0;y[f+72>>2]=e|g;y[f+76>>2]=g?h:0}r=r+1|0}mb(f+56|0);e=0;continue}}break}y[f+124>>2]=0;e=n;break a}o()}mb(f+56|0)}e=0}Ua(f+116|0)}la(f+124|0);Y=f+128|0;return e}function Bd(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0;f=Y-112|0;Y=f;k=xa(y[a+8>>2],y[a+12>>2]);y[f+108>>2]=k;g=0;a:{if(!qa(k)){break a}o=y[e>>2];g=0;if(!Aa(o,b,f+104|0)){break a}t=y[e+36>>2];u=y[e+32>>2];v=y[e+28>>2];x=y[e+24>>2];A=y[e+20>>2];C=y[e+16>>2];D=y[e+12>>2];E=y[e+8>>2];F=y[e+4>>2];Qa(k,z[a+4|0]);y[f+100>>2]=y[f+104>>2];w[f+96|0]=1;p=Db(f+96|0,y[a+20>>2]);e=p;h=y[f+100>>2];g=0-h|0;y[e>>2]=z[e|0]&(h|0)!=-2147483648;y[e+4>>2]=g;y[f+92>>2]=0;w[f+88|0]=1;e=y[a+16>>2];b:{c:while(1){if(e>>>0>m>>>0){y[f+84>>2]=0;w[f+80|0]=1;if(!Aa(o,b,f+76|0)){break b}y[f+68>>2]=y[f+76>>2];e=1;w[f+64|0]=1;g=Db(f- -64|0,y[a+20>>2]);q=Vc(p,y[g>>2],y[g+4>>2]);while(1){d:{if(e&1){Aa(F,b,f+4|0);e=Na(f+88|0,y[f+4>>2]);g=y[e+4>>2];y[f+80>>2]=y[e>>2];y[f+84>>2]=g;break d}if(!Aa(E,b,f+4|0)){e=y[a+16>>2];continue c}Na(Na(f+80|0,y[f+4>>2]),w[a+5|0])}e=y[a+16>>2];if(m>>>0>=e>>>0){continue c}y[f+60>>2]=0;if(y[a+20>>2]!=1){Aa(D,b,f+60|0)}e=y[q+4>>2];if(!(y[q>>2]&1)){break b}g=y[f+60>>2];n=e+g|0;if(((e^n)&(g^n))<0){break b}Ac(t,b,f+56|0);e=y[f+56>>2];if(e>>>0>=B[a+24>>2]){break b}e:{f:{g:{h:{i:{if(!z[a+1|0]){y[f+52>>2]=0;w[f+48|0]=0;y[f+44>>2]=0;break i}Aa(C,b,f+52|0);g=y[f+52>>2];w[f+48|0]=0;y[f+44>>2]=0;if(g){break h}}Uc(f+44|0,y[y[a+40>>2]+(e<<2)>>2]);break g}Aa(A,b,f+40|0);Aa(x,b,f+36|0);Aa(v,b,f+32|0);Aa(u,b,f+28|0);h=y[y[a+40>>2]+(e<<2)>>2];if(!h){break f}i=y[f+40>>2];g=i>>31;e=y[h+8>>2]+i|0;if(e>>>0>>0?g+1|0:g){break f}j=y[f+36>>2];g=j>>31;l=j+y[h+12>>2]|0;g=l>>>0>>0?g+1|0:g;if((g|0)==1|g>>>0>1){break f}Cb(f+4|0,i,1,y[f+32>>2]);Cb(f+20|0,j,1,y[f+28>>2]);if(!(w[f+24|0]&1)|z[f+8|0]!=1){break f}g=db();y[f+16>>2]=g;y[g+8>>2]=l;y[g+4>>2]=e;e=z[a+2|0];y[g+20>>2]=h;w[g|0]=e;y[g+12>>2]=y[f+4>>2];e=y[f+20>>2];w[g+1|0]=0;y[g+16>>2]=e;w[g+24|0]=z[a+92|0];w[g+25|0]=z[a+93|0];w[g+26|0]=z[a+94|0];w[g+27|0]=z[a+95|0];Tc(f+44|0,cb(g,b,c,d));Ua(f+16|0)}i=0;e=f+44|0;if(!fc(e)){break e}l=y[Xa(e)+8>>2];e=Xa(e);j=y[a+56>>2];r=y[e+12>>2];j:{k:{l:{s=z[a+3|0];if(!s){e=z[f+80|0];if((j&-2)!=2){break l}if(!(e&1)){break j}g=y[f+84>>2];e=g>>31;h=l-1|0;g=g+h|0;h=h>>>0>g>>>0?e+1|0:e;e=g;g=e>>>0<2147483648&(h|0)<=0|(h|0)<0;y[f+80>>2]=0|g;y[f+84>>2]=g?e:0;if(g){break k}break e}e=z[f+80|0];m:{switch(j|0){default:if(e&1){break k}break e;case 0:case 2:break m}}if(!(e&1)){break j}e=y[f+84>>2];g=e>>31;h=r-1|0;e=e+h|0;g=h>>>0>e>>>0?g+1|0:g;g=e>>>0<2147483648&(g|0)<=0|(g|0)<0;y[f+80>>2]=0|g;y[f+84>>2]=g?e:0;if(g){break k}break e}if(!(e&1)){break e}}g=y[f+84>>2];Rc(f+4|0,s,j,g,n,l,r);i=Xa(f+44|0);e=y[f+4>>2];h=e;j=e>>31;e=y[f+8>>2];Hb(i,k,h,j,e,e>>31,y[a+52>>2]);h=y[f+12>>2];if(h){e=g>>31;g=g+h|0;h=g>>>0>>0?e+1|0:e;e=g;g=e>>>0<2147483648&(h|0)<=0|(h|0)<0;h=0;y[f+80>>2]=g|h;y[f+84>>2]=g?e:0}i=1;m=m+1|0;break e}y[f+80>>2]=0;y[f+84>>2]=0;break e}i=0}mb(f+44|0);e=0;if(i){continue}break}break b}break}y[f+108>>2]=0;g=k;break a}g=0}la(f+108|0);Y=f+112|0;return g}function eb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0;j=Y-32|0;Y=j;a:{b:{c:{if(!qa(a)){break c}k=y[a+12>>2];if((k|0)>=(b|0)){break c}g=y[a+16>>2];if((268435452/(g|0)|0)<(b|0)){break c}if((k|0)<0){break b}d=g>>31;q=se(g,d,k);k=Z;if((k|0)==1|k>>>0>1){break b}g=se(g,d,b);d=Z;if((d|0)==1|d>>>0>1){break b}d:{if(z[a+4|0]==1){k=y[a>>2];y[a>>2]=0;y[j+20>>2]=0;_c(a,j+20|0);y[j+28>>2]=0;if(!d&g>>>0>2147479550|d){break a}e:{if(!k){g=Ya(g);break e}if(!g){ma(k);g=0;break e}f:{if(g>>>0>4294967239){break f}m=g>>>0<=8?8:g+3&-4;d=m+8|0;g=k;r=g-4|0;i=r;f=y[i>>2];e=f+i|0;h=y[e>>2];g:{h:{i:{if((h|0)!=y[(e+h|0)-4>>2]){h=f+h|0;if(h>>>0>=d+16>>>0){f=y[e+4>>2];e=y[e+8>>2];y[f+8>>2]=e;y[e+4>>2]=f;f=d+i|0;e=h-d|0;y[f>>2]=e;y[(f+(e&-4)|0)-4>>2]=e|1;e=y[f>>2]-8|0;j:{if(e>>>0<=127){n=(e>>>3|0)-1|0;break j}h=H(e);n=((e>>>29-h^4)-(h<<2)|0)+110|0;if(e>>>0<=4095){break j}e=((e>>>30-h^2)-(h<<1)|0)+71|0;n=e>>>0>=63?63:e}e=n;h=e<<4;y[f+4>>2]=h+6080;h=h+6088|0;y[f+8>>2]=y[h>>2];y[h>>2]=f;y[y[f+8>>2]+4>>2]=f;h=y[1779];f=e&31;if((e&63)>>>0>=32){f=1<>>32-f}y[1778]=e|y[1778];y[1779]=f|h;y[i>>2]=d;y[(i+(d&-4)|0)-4>>2]=d;e=1;break g}if(d>>>0>h>>>0){break i}d=y[e+4>>2];f=y[e+8>>2];y[d+8>>2]=f;y[f+4>>2]=d;y[i>>2]=h;y[(i+(h&-4)|0)-4>>2]=h;e=1;break g}if(f>>>0>=d+16>>>0){y[i>>2]=d;y[(i+(d&-4)|0)-4>>2]=d;i=d+i|0;d=f-d|0;y[i>>2]=d;y[(i+(d&-4)|0)-4>>2]=d|1;d=y[i>>2]-8|0;k:{if(d>>>0<=127){e=(d>>>3|0)-1|0;break k}f=H(d);e=((d>>>29-f^4)-(f<<2)|0)+110|0;if(d>>>0<=4095){break k}d=((d>>>30-f^2)-(f<<1)|0)+71|0;e=d>>>0>=63?63:d}f=e;d=f<<4;y[i+4>>2]=d+6080;d=d+6088|0;y[i+8>>2]=y[d>>2];y[d>>2]=i;y[y[i+8>>2]+4>>2]=i;i=y[1779];d=f&31;if((f&63)>>>0>=32){f=1<>>32-d}y[1778]=e|y[1778];y[1779]=f|i;e=1;break g}e=1;if(d>>>0<=f>>>0){break h}}e=0}}if(e){break e}g=Ya(m);if(!g){break f}l=y[r>>2]-8|0;l=l>>>0>m>>>0?m:l;if(l){p(g,k,l)}ma(k);l=g}g=l}if(!g){break a}nb(a,g);Ha(j+28|0);break d}Da(j+20|0,a);k=y[j+20>>2];l=y[j+24>>2];nb(a,ab(g,1));Da(j+12|0,a);if(l>>>0>B[j+16>>2]){break b}if(!l){break d}p(y[j+12>>2],k,l)}y[a+12>>2]=b;Da(j+20|0,a);a=y[j+24>>2];if(q>>>0>a>>>0){break b}c=0-c|0;b=q+y[j+20>>2]|0;a=a-q|0;while(1){if((a|0)<=0){break c}w[b|0]=c;a=a-1|0;b=b+1|0;continue}}Y=j+32|0;return}o()}rb();o()}function nc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;f=Y-48|0;Y=f;v=xa(y[a+4>>2],y[a+8>>2]);y[f+44>>2]=v;a:{b:{if(!qa(v)){break b}c:{m=y[a+4>>2];if(!m){break c}n=y[a+8>>2];L=e?n:n&2147483647;e=e<<1;B=e+2448|0;G=e+2466|0;C=e+2442|0;H=e+2436|0;I=e+2430|0;M=e+2460|0;N=e+2454|0;O=e+2424|0;e=m-1|0;p=e>>>3|0;J=(e&7)+1|0;n=0;m=0;e=0;while(1){d:{e:{if((x|0)!=(L|0)){ja(f+36|0,v,x);r=y[f+40>>2];s=y[f+36>>2];if(z[a+1|0]!=1){t=e;break e}if(z[b|0]){break b}h=A[O>>1];if(h>>>0>=d>>>0){break c}t=0;h=ka(b,(h<<3)+c|0);if((h|0)==(e|0)){break e}y[f+32>>2]=r;y[f+28>>2]=s;y[f+24>>2]=m;y[f+20>>2]=n;t=y[f+32>>2];y[f+8>>2]=y[f+28>>2];y[f+12>>2]=t;t=y[f+24>>2];y[f>>2]=y[f+20>>2];y[f+4>>2]=t;Pa(f+8|0,f);e=e^h;break d}y[f+44>>2]=0;break a}f:{g:{h:{if(x>>>0<=1){i=0;k=0;l=(x|0)!=1;if(!l){if(!m){break c}k=z[n|0]}q=A[I>>1];g=A[H>>1]&k>>>q;while(1){if((i|0)!=(p|0)){if(!l){e=i+1|0;if(e>>>0>=m>>>0){break c}k=z[e+n|0]|k<<8}j=0;e=7;while(1){if((e|0)>=0){if(z[b|0]){break b}if(d>>>0<=g>>>0){break c}u=A[B>>1]&k>>>e+q|(A[C>>1]&g)<<1;h=ka(b,(g<<3)+c|0);g=u|h;j=h<>>0<=g>>>0){break c}u=A[B>>1]&h>>>l-e|(A[C>>1]&g)<<1;i=ka(b,(g<<3)+c|0);g=u|i;j=i<<7-e|j;e=e+1|0;continue}}if(!g|!m|(m-1>>>0

>>0|p>>>0>r>>>0)|g-1>>>0

>>0){break c}k=z[n|0];F=A[I>>1];K=A[N>>1];D=z[i|0]<>1]&k>>>F|D&A[M>>1];u=p+s|0;h=n;l=s;while(1){i:{E=D<<8;if((l|0)==(u|0)){break i}h=h+1|0;k=z[h|0]|k<<8;i=i+1|0;D=E|z[i|0]<=0){if(z[b|0]){break b}if(d>>>0<=g>>>0){break c}E=A[B>>1]&k>>>e+F|(A[G>>1]&D>>>e|(A[C>>1]&g)<<1);q=ka(b,(g<<3)+c|0);g=E|q;j=q<>>0<=g>>>0){break c}h=ka(b,(g<<3)+c|0);i=7-j|0;e=h<>1]&l>>>q-j|(A[G>>1]&E>>>i|(A[C>>1]&g)<<1));j=j+1|0;continue}}if(p>>>0>=r>>>0){break c}w[p+s|0]=j;break f}if(p>>>0>=r>>>0){break c}w[u|0]=e}e=t}x=x+1|0;i=n;g=m;n=s;m=r;continue}}o()}v=0}la(f+44|0);Y=f+48|0;return v}function ic(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a:{b:{c:{d:{if(!z[a+1|0]){g=y[a+60>>2];break d}f=y[b+4>>2];if(z[f|0]){break a}h=y[c>>2];if(h>>>0>=B[b+12>>2]){break c}g=y[a+60>>2]^ka(f,y[b+8>>2]+(h<<3)|0);y[a+60>>2]=g}if(g){ed(a,y[y[b>>2]>>2]);break b}f=y[a+24>>2];if(f>>>0<=1){if((f|0)==1){if(!y[a+40>>2]){break c}j=z[y[a+36>>2]]}i=y[c+12>>2]&j>>>y[c+8>>2];h=(f|0)!=1;while(1){if((d|0)!=(k|0)){if(!h){f=k+1|0;if(f>>>0>=B[a+40>>2]){break c}j=z[f+y[a+36>>2]|0]|j<<8}g=7;l=0;while(1){if((g|0)>=0){f=y[b+4>>2];if(z[f|0]){break a}if(B[b+12>>2]<=i>>>0){break c}f=ka(f,y[b+8>>2]+(i<<3)|0);i=f|(y[c+16>>2]&j>>>y[c+8>>2]+g|(y[c+4>>2]&i)<<1);l=f<>2]<=k>>>0){break c}w[y[a+44>>2]+k|0]=l;k=k+1|0;continue}break}f=j<<8;g=0;l=0;while(1){if((e|0)!=(g|0)){h=y[b+4>>2];if(z[h|0]){break a}if(B[b+12>>2]<=i>>>0){break c}h=ka(h,y[b+8>>2]+(i<<3)|0);j=7-g|0;l=h<>2]&f>>>j+y[c+8>>2]|(y[c+4>>2]&i)<<1);g=g+1|0;continue}break}if(B[a+48>>2]<=d>>>0){break c}w[y[a+44>>2]+d|0]=l;break b}if(!y[a+32>>2]|!y[a+40>>2]){break c}j=z[y[a+36>>2]];k=z[y[a+28>>2]]<>2];i=y[c+12>>2]&j>>>y[c+8>>2]|k&y[c+24>>2];f=0;while(1){e:{if((d|0)!=(f|0)){h=f+1|0;if(h>>>0>=B[a+32>>2]|h>>>0>=B[a+40>>2]){break c}k=z[h+y[a+28>>2]|0]<>2]|k<<8;j=z[h+y[a+36>>2]|0]|j<<8;g=7;l=0;while(1){if((g|0)<0){break e}m=y[b+4>>2];if(z[m|0]){break a}if(B[b+12>>2]<=i>>>0){break c}m=ka(m,y[b+8>>2]+(i<<3)|0);i=m|(y[c+16>>2]&j>>>y[c+8>>2]+g|(y[c+28>>2]&k>>>g|(y[c+4>>2]&i)<<1));l=m<>2];if(z[h|0]){break a}if(B[b+12>>2]<=i>>>0){break c}k=ka(h,y[b+8>>2]+(i<<3)|0);h=7-g|0;f=k<>2]&l>>>h+y[c+8>>2]|(y[c+28>>2]&j>>>h|(y[c+4>>2]&i)<<1));g=g+1|0;continue}break}if(B[a+48>>2]<=d>>>0){break c}w[y[a+44>>2]+d|0]=f;break b}if(B[a+48>>2]<=f>>>0){break c}w[y[a+44>>2]+f|0]=l;f=h;continue}}o()}return 1}return 0}function pe(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;c=Y-48|0;Y=c;m=y[b+4>>2];t=y[b+12>>2];u=y[b+8>>2];g=y[y[b>>2]>>2];ja(c+40|0,g,y[a+24>>2]-1|0);ja(c+32|0,g,y[a+24>>2]-2|0);A=u+317736|0;n=y[c+36>>2];p=y[c+32>>2];d=y[a+24>>2];C=t>>>0>39717;q=4;a:{while(1){b:{c:{if(B[a+8>>2]>d>>>0){j=y[c+44>>2];k=y[c+40>>2];ja(c+32|0,g,d);h=y[c+36>>2];r=y[c+32>>2];y[c+40>>2]=r;y[c+44>>2]=h;d:{e:{f:{if(!z[a+1|0]){d=y[a+60>>2];break f}if(z[m|0]){break b}if(!C){break e}d=y[a+60>>2]^ka(m,A);y[a+60>>2]=d}if(d){y[c+20>>2]=j;y[c+16>>2]=k;y[c+24>>2]=r;y[c+28>>2]=h;y[c+8>>2]=r;y[c+12>>2]=h;h=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=h;Pa(c+8|0,c);break d}i=0;v=0;x=0;if(z[a+2|0]==1){ja(c+32|0,y[a+12>>2],y[a+24>>2]);x=y[c+36>>2];v=y[c+32>>2]}d=c+32|0;ja(d,g,y[a+24>>2]+w[a+17|0]|0);D=y[c+36>>2];E=y[c+32>>2];ja(d,g,y[a+24>>2]+w[a+19|0]|0);F=y[c+36>>2];G=y[c+32>>2];ja(d,g,y[a+24>>2]+w[a+21|0]|0);H=y[c+36>>2];I=y[c+32>>2];ja(d,g,y[a+24>>2]+w[a+23|0]|0);J=y[c+36>>2];K=y[c+32>>2];e=y[g+8>>2];i=!n|(e|0)<2?i:z[p|0]>>>6&1;i=!n|(e|0)<=0?i:z[p|0]>>>6&2|i;f=0;f=!j|(e|0)<3?f:z[k|0]>>>5&1;f=!j|(e|0)<2?f:z[k|0]>>>5&2|f;f=!j|(e|0)<=0?f:z[k|0]>>>5&4|f;s=0;d=0;while(1){if(B[a+4>>2]<=d>>>0){break d}g:{h:{if(z[a+2|0]==1){if(ia(y[y[a+12>>2]+8>>2],d,v,x)){break h}}l=ia(e,w[a+16|0]+d|0,E,D);L=ia(e,w[a+18|0]+d|0,G,F);M=ia(e,w[a+20|0]+d|0,I,H);e=ia(e,w[a+22|0]+d|0,K,J);if(z[m|0]){break b}e=f<<5|i<<12|l<<4|L<<10|M<<11|e<<15|s;if(e>>>0>=t>>>0){break e}l=ka(m,(e<<3)+u|0);e=y[g+8>>2];if(!l){break h}La(e,d,r,h,1);e=y[g+8>>2];l=1;break g}l=0}i=ia(e,d+2|0,p,n)|i<<1&6;f=ia(e,d+3|0,k,j)|f<<1&30;d=d+1|0;s=s<<1&14|l;continue}}o()}h=y[b+16>>2];if(!h){break c}if(!(_[y[y[h>>2]+8>>2]](h)|0)){break c}y[a+24>>2]=y[a+24>>2]+1;q=3}y[a+52>>2]=q;break a}d=y[a+24>>2]+1|0;y[a+24>>2]=d;p=k;n=j;continue}break}q=-1}Y=c+48|0;return q|0} +function mc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;f=Y-48|0;Y=f;i=xa(y[a+4>>2],y[a+8>>2]);y[f+44>>2]=i;a:{b:{if(!qa(i)){break b}Qa(i,0);K=e|2;L=5-e|0;M=4-e|0;k=e>>>1|0;N=k^3;j=e<<1;O=j+2490|0;P=j+2484|0;Q=j+2478|0;R=j+2472|0;S=k^1;T=2-k|0;x=e&1;U=x+1|0;V=j+2424|0;j=0;k=0;while(1){c:{d:{e:{if(B[a+8>>2]>m>>>0){ja(f+36|0,i,m);t=y[f+40>>2];u=y[f+36>>2];if(z[a+1|0]!=1){n=g;break e}if(z[b|0]){break b}h=A[V>>1];if(h>>>0>=d>>>0){break d}n=0;h=ka(b,(h<<3)+c|0);if((h|0)==(g|0)){break e}y[f+32>>2]=t;y[f+28>>2]=u;y[f+24>>2]=k;y[f+20>>2]=j;n=y[f+32>>2];y[f+8>>2]=y[f+28>>2];y[f+12>>2]=n;n=y[f+24>>2];y[f>>2]=y[f+20>>2];y[f+4>>2]=n;g=g^h;i=y[f+44>>2];Pa(f+8|0,f);break c}y[f+44>>2]=0;break a}C=0;D=0;E=0;if(z[a+2|0]==1){ja(f+36|0,y[a+12>>2],m);E=y[f+40>>2];D=y[f+36>>2]}g=f+36|0;i=y[f+44>>2];ja(g,i,w[a+17|0]+m|0);W=y[f+40>>2];X=y[f+36>>2];F=0;G=0;H=0;I=0;J=0;if(!e){ja(g,i,w[a+19|0]+m|0);C=y[f+40>>2];F=y[f+36>>2];ja(g,i,w[a+21|0]+m|0);G=y[f+40>>2];H=y[f+36>>2];ja(g,i,w[a+23|0]+m|0);J=y[f+36>>2];I=y[f+40>>2]}h=y[i+8>>2];p=ia(h,U,r,s)|ia(h,x,r,s)<<1;p=!s|(e|0)!=1|(h|0)<=0?p:z[r|0]>>>5&4|p;q=ia(h,T,j,k)|ia(h,S,j,k)<<1;q=!k|e>>>0>1|(h|0)<=0?q:z[j|0]>>>5&4|q;v=0;g=0;while(1){if(B[a+4>>2]<=g>>>0){g=n;break c}f:{g:{if(z[a+2|0]==1){if(ia(y[y[a+12>>2]+8>>2],g,D,E)){break g}}if(z[b|0]){break b}l=q<>1]|v;if(!e){l=ia(h,w[a+18|0]+g|0,F,C)<<10|ia(h,w[a+20|0]+g|0,H,G)<<11|ia(h,w[a+22|0]+g|0,J,I)<<15|l}if(d>>>0<=l>>>0){break d}l=ka(b,(l<<3)+c|0);h=y[i+8>>2];if(!l){break g}La(h,g,u,t,1);h=y[i+8>>2];l=1;break f}l=0}p=(ia(h,g+K|0,r,s)|p<<1)&A[Q>>1];q=(ia(h,g+N|0,j,k)|q<<1)&A[P>>1];g=g+1|0;v=A[O>>1]&(l|v<<1);continue}}o()}m=m+1|0;r=j;s=k;j=u;k=t;continue}}i=0}la(f+44|0);Y=f+48|0;return i}function ke(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0;k=Y-16|0;Y=k;h=y[b+4>>2];l=y[b+12>>2];m=y[b+8>>2];n=y[y[b>>2]>>2];if(!y[a+48>>2]){Da(k+8|0,n);d=y[k+12>>2];y[a+44>>2]=y[k+8>>2];y[a+48>>2]=d}a:{b:{c:{d=y[a+4>>2];if(!d){break c}r=m+3240|0;d=d-1|0;i=d>>>3|0;p=(d&7)+1|0;c=y[a+24>>2];s=l>>>0>405;while(1){d:{if(B[a+8>>2]<=c>>>0){c=4}else{e:{if(!z[a+1|0]){c=y[a+60>>2];break e}if(z[h|0]){break b}if(!s){break c}c=y[a+60>>2]^ka(h,r);y[a+60>>2]=c}f:{if(c){ed(a,n);break f}c=0;g=0;g:{if(!y[a+24>>2]){h:{while(1){e=7;f=0;if((g|0)==(i|0)){break h}i:{while(1){if((e|0)>=0){if(z[h|0]){break i}if(c>>>0>=l>>>0){break c}d=ka(h,(c<<3)+m|0);c=d|c<<1&1006;f=d<>2]<=g>>>0){break c}w[y[a+44>>2]+g|0]=f;g=g+1|0;continue}break}if(g>>>0>>0){break b}}e=0;f=0;while(1){if((e|0)==(p|0)){break g}if(z[h|0]){break b}if(c>>>0>=l>>>0){break c}d=ka(h,(c<<3)+m|0);c=d|c<<1&1006;f=d<<7-e|f;e=e+1|0;continue}}if(!y[a+40>>2]){break c}g=z[y[a+36>>2]];e=g>>>1&112;d=0;while(1){j:{if((d|0)!=(i|0)){j=d+1|0;if(j>>>0>=B[a+40>>2]){break c}g=z[j+y[a+36>>2]|0]|g<<8;c=7;f=0;while(1){if((c|0)<0){break j}if(z[h|0]){break b}if(e>>>0>=l>>>0){break c}q=ka(h,(e<<3)+m|0);e=q|(g>>>c+1&16|e<<1&1006);f=q<>>0>=l>>>0){break c}j=ka(h,(e<<3)+m|0);e=j|(d>>>8-c&16|e<<1&1006);f=j<<7-c|f;c=c+1|0;continue}break}if(B[a+48>>2]<=i>>>0){break c}w[y[a+44>>2]+i|0]=f;break f}if(B[a+48>>2]<=d>>>0){break c}w[y[a+44>>2]+d|0]=f;d=j;continue}}if(B[a+48>>2]<=i>>>0){break c}w[y[a+44>>2]+i|0]=f}Kb(a,n);d=y[b+16>>2];if(!d){break d}if(!(_[y[y[d>>2]+8>>2]](d)|0)){break d}y[a+24>>2]=y[a+24>>2]+1;c=3}y[a+52>>2]=c;break a}c=y[a+24>>2]+1|0;y[a+24>>2]=c;continue}}o()}c=-1}Y=k+16|0;return c|0}function $d(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0;g=Y-80|0;Y=g;w[g+72|0]=0;y[g+68>>2]=0;i=c+31>>>3&536870908;k=E(i,d);h=yd(k,1);y[g>>2]=0;j=g+68|0;nb(j,h);Ha(g);a:{b:{if(!qa(j)){break b}j=Nb(j);h=g+56|0;y[g+60>>2]=h;y[g+56>>2]=h;y[g+64>>2]=0;y[g+48>>2]=0;y[g+52>>2]=0;l=a;y[g+32>>2]=a;y[g+36>>2]=b;y[g>>2]=c;h=e;y[g+24>>2]=h;y[g+28>>2]=f;y[g+16>>2]=0;y[g+20>>2]=0;y[g+40>>2]=j;y[g+44>>2]=k;y[g+8>>2]=0;y[g+12>>2]=0;y[g+4>>2]=d;y[g+48>>2]=i;a=se(d,0,i);if(Z|a>>>0>k>>>0){break a}e=j;while(1){if((a|0)>0){w[e|0]=0;a=a-1|0;e=e+1|0;continue}break}a=b;b=g+56|0;a=zc(na(116),l,a,b,0);if(f){b=zc(na(116),h,f,b,1);y[g+76>>2]=0;zb(a,b);Ab(g+76|0)}e=c+7>>>3|0;y[g+76>>2]=0;f=g+52|0;zb(f,a);Ab(g+76|0);c:{d:{b=y[g+52>>2];a=y[b>>2];if(!a){break d}if(!yc(a)){break d}y[b+56>>2]=-1;a=0;break c}y[b+52>>2]=0;a=na(20);y[a+16>>2]=0;y[a+8>>2]=0;y[a+12>>2]=0;w[a+4|0]=0;y[a>>2]=0;e:{if((c|d)<0|i>>>0>268435452){break e}h=i<<3;if((h|0)<(c|0)|(!(!i|(d|0)<=0|k)|(2147483616/(h>>>0)|0)<(d|0))){break e}y[a+16>>2]=i;y[a+12>>2]=d;y[a+8>>2]=c;y[g+76>>2]=j;_c(a,g+76|0)}y[g+76>>2]=0;oa(b+32|0,a);la(g+76|0);w[b+50|0]=1;a=id(b)}f:{while(1){g:{a=a&1;h:{b=y[y[g+52>>2]+56>>2];if((b|0)!=4){break h}zb(g+52|0,0);b=-1;if(!a){break h}i:{b=E(y[g+48>>2],y[g+4>>2]);if(b>>>0>B[g+44>>2]){break i}a=y[g+40>>2];if(a&3){break i}c=(b&-4)+a|0;b=4;while(1){if((a|0)==(c|0)){break h}y[a>>2]=y[a>>2]^-1;a=a+4|0;continue}}o()}j:{switch(b-3|0){case 0:break j;case 1:break g;default:break f}}a=id(y[g+52>>2]);continue}break}X(Nb(g+68|0)|0,e|0,i|0,d|0)}Ab(f);if(!y[g+64>>2]){break b}a=y[g+60>>2];b=y[a>>2];c=y[y[g+56>>2]+4>>2];y[b+4>>2]=c;y[c>>2]=b;y[g+64>>2]=0;while(1){if((g+56|0)==(a|0)){break b}b=y[a+4>>2];oc(a);a=b;continue}}ub(g+68|0);Y=g+80|0;return}o()}function Ya(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:{b:{while(1){if(a>>>0>4294967239){break b}b=y[1779];c=b;f=y[1778];a=a>>>0<=8?8:a+3&-4;c:{if(a>>>0<=127){d=(a>>>3|0)-1|0;break c}e=H(a);d=((a>>>29-e^4)-(e<<2)|0)+110|0;if(a>>>0<=4095){break c}e=((a>>>30-e^2)-(e<<1)|0)+71|0;d=e>>>0>=63?63:e}g=d;d=g&31;if((g&63)>>>0>=32){e=0;b=b>>>d|0}else{e=b>>>d|0;b=((1<>>d}if(b|e){while(1){d=e;d:{if(d|b){c=d-1|0;e=c+1|0;f=c;c=b-1|0;f=(c|0)!=-1?e:f;e=H(d^f);e=(e|0)==32?H(b^c)+32|0:e;c=63-e|0;Z=0-(e>>>0>63)|0;break d}Z=0;c=64}f=c;c=f&31;if((f&63)>>>0>=32){e=0;h=d>>>c|0}else{e=d>>>c|0;h=((1<>>c}g=f+g|0;b=g<<4;d=y[b+6088>>2];c=b+6080|0;e:{if((d|0)!=(c|0)){b=dc(d,a);if(b){break a}b=y[d+4>>2];f=y[d+8>>2];y[b+8>>2]=f;y[f+4>>2]=b;y[d+8>>2]=c;y[d+4>>2]=y[c+4>>2];y[c+4>>2]=d;y[y[d+4>>2]+8>>2]=d;g=g+1|0;b=(e&1)<<31|h>>>1;e=e>>>1|0;break e}j=y[1779];f=g&63;b=f;d=b&31;if(b>>>0>=32){b=0;c=-1>>>d|0}else{b=-1>>>d|0;c=b|(1<>>0>=32){b=c<>>32-d|b<>>0>=32){b=-1<>>32-b}k=c&-2;c=f&31;if(f>>>0>=32){f=0;c=b>>>c|0}else{f=b>>>c|0;c=((1<>>c}b=c|i;Z=d|f;y[1778]=y[1778]&b;y[1779]=Z&j;b=h^1}if(b|e){continue}break}f=y[1778];c=y[1779]}e=H(c);d=63-((e|0)==32?H(f)+32|0:e)|0;f:{if(!(c|f)){g=0;break f}b=d<<4;g=y[b+6088>>2];if(!c&f>>>0<1073741824){break f}e=98;c=b+6080|0;if((c|0)==(g|0)){break f}while(1){b=dc(g,a);if(b){break a}g=y[g+8>>2];if((c|0)==(g|0)){break f}b=e;e=b-1|0;if(b){continue}break}}if(Fd(a+48|0)){continue}break}if(!g){break b}e=(d<<4)+6080|0;if((e|0)==(g|0)){break b}while(1){b=dc(g,a);if(b){break a}g=y[g+8>>2];if((e|0)!=(g|0)){continue}break}}b=0}return b}function Ld(a,b){a=a|0;b=+b;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;c=a<<3;o=c+7136|0;i=D[c+7168>>3];if(i!=0){l=D[o>>3];m=J(l,b);b=m-l;if(b<0x10000000000000000&b>=0){d=~~b>>>0;if(G(b)>=1){c=~~(b>0?I(K(b*2.3283064365386963e-10),4294967295):L((b-+(~~b>>>0>>>0))*2.3283064365386963e-10))>>>0}else{c=0}}else{c=0}if(i<0x10000000000000000&i>=0){h=~~i>>>0;if(G(i)>=1){e=~~(i>0?I(K(i*2.3283064365386963e-10),4294967295):L((i-+(~~i>>>0>>>0))*2.3283064365386963e-10))>>>0}else{e=0}}else{e=0}a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{if(c){if(!h){break k}if(!e){break j}f=H(e)-H(c)|0;if(f>>>0<=31){break i}break c}if((e|0)==1|e>>>0>1){break c}Z=0;c=(d>>>0)/(h>>>0)|0;break a}if(!d){break h}if(!e|e-1&e){break g}c=c>>>ue(e)|0;Z=0;break a}if(!(h-1&h)){break f}k=(H(h)+33|0)-H(c)|0;j=0-k|0;break d}k=f+1|0;j=63-f|0;break d}Z=0;c=(c>>>0)/(e>>>0)|0;break a}f=H(e)-H(c)|0;if(f>>>0<31){break e}break c}if((h|0)==1){break b}h=ue(h);e=h&31;if((h&63)>>>0>=32){c=c>>>e|0}else{f=c>>>e|0;c=((1<>>e}Z=f;break a}k=f+1|0;j=63-f|0}f=k&63;g=f&31;if(f>>>0>=32){f=0;n=c>>>g|0}else{f=c>>>g|0;n=((1<>>g}j=j&63;g=j&31;if(j>>>0>=32){c=d<>>32-g|c<>>31;f=n<<1|c>>>31;g=s-(p+(f>>>0>j>>>0)|0)>>31;q=g&h;n=f-q|0;f=p-((e&g)+(f>>>0>>0)|0)|0;c=c<<1|d>>>31;d=r|d<<1;r=g&1;k=k-1|0;if(k){continue}break}}Z=c<<1|d>>>31;c=r|d<<1;break a}d=0;c=0}Z=c;c=d}d=Z;c=c+1|0;d=c?d:d+1|0;l=(+(c>>>0)+ +(d>>>0)*4294967296)*i+l;m=l-m}D[o>>3]=l;Q(a|0,+m)|0;a=(a|0)==2?27:(a|0)==1?26:14;c=a-1|0;l:{if(y[1780]>>>c&1){y[1782]=y[1782]|1<>2];if(c){_[c|0](a)}}}function ne(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0,F=0;c=Y-48|0;Y=c;n=y[b+4>>2];t=y[b+12>>2];u=y[b+8>>2];i=y[y[b>>2]>>2];ja(c+40|0,i,y[a+24>>2]-1|0);ja(c+32|0,i,y[a+24>>2]-2|0);C=u+15528|0;l=y[c+36>>2];m=y[c+32>>2];e=y[a+24>>2];D=t>>>0>1941;p=4;a:{while(1){b:{c:{if(B[a+8>>2]>e>>>0){j=y[c+44>>2];k=y[c+40>>2];ja(c+32|0,i,e);h=y[c+36>>2];q=y[c+32>>2];y[c+40>>2]=q;y[c+44>>2]=h;d:{e:{f:{if(!z[a+1|0]){e=y[a+60>>2];break f}if(z[n|0]){break b}if(!D){break e}e=y[a+60>>2]^ka(n,C);y[a+60>>2]=e}if(e){y[c+20>>2]=j;y[c+16>>2]=k;y[c+24>>2]=q;y[c+28>>2]=h;y[c+8>>2]=q;y[c+12>>2]=h;h=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=h;Pa(c+8|0,c);break d}f=0;v=0;x=0;if(z[a+2|0]==1){ja(c+32|0,y[a+12>>2],y[a+24>>2]);x=y[c+32>>2];v=y[c+36>>2]}ja(c+32|0,i,y[a+24>>2]+w[a+17|0]|0);E=y[c+36>>2];F=y[c+32>>2];d=y[i+8>>2];f=!l|(d|0)<3?f:z[m|0]>>>5&1;f=!l|(d|0)<2?f:z[m|0]>>>5&2|f;f=!l|(d|0)<=0?f:z[m|0]>>>5&4|f;g=0;g=!j|(d|0)<3?g:z[k|0]>>>5&1;g=!j|(d|0)<2?g:z[k|0]>>>5&2|g;g=!j|(d|0)<=0?g:z[k|0]>>>5&4|g;s=0;e=0;while(1){if(B[a+4>>2]<=e>>>0){break d}g:{h:{if(z[a+2|0]==1){if(ia(y[y[a+12>>2]+8>>2],e,x,v)){break h}}d=ia(d,w[a+16|0]+e|0,F,E);if(z[n|0]){break b}d=g<<4|f<<9|d<<3|s;if(d>>>0>=t>>>0){break e}r=ka(n,(d<<3)+u|0);d=y[i+8>>2];if(!r){break h}La(d,e,q,h,1);d=y[i+8>>2];r=1;break g}r=0}A=e+3|0;f=ia(d,A,m,l)|f<<1&14;g=ia(d,A,k,j)|g<<1&30;e=e+1|0;s=s<<1&6|r;continue}}o()}h=y[b+16>>2];if(!h){break c}if(!(_[y[y[h>>2]+8>>2]](h)|0)){break c}y[a+24>>2]=y[a+24>>2]+1;p=3}y[a+52>>2]=p;break a}e=y[a+24>>2]+1|0;y[a+24>>2]=e;m=k;l=j;continue}break}p=-1}Y=c+48|0;return p|0}function le(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,C=0,D=0,E=0;c=Y-48|0;Y=c;l=y[b+4>>2];s=y[b+12>>2];t=y[b+8>>2];i=y[y[b>>2]>>2];ja(c+40|0,i,y[a+24>>2]-1|0);ja(c+32|0,i,y[a+24>>2]-2|0);A=t+1832|0;m=y[c+36>>2];n=y[c+32>>2];d=y[a+24>>2];C=s>>>0>229;a:{while(1){b:{c:{if(B[a+8>>2]<=d>>>0){d=4}else{j=y[c+44>>2];k=y[c+40>>2];ja(c+32|0,i,d);f=y[c+36>>2];p=y[c+32>>2];y[c+40>>2]=p;y[c+44>>2]=f;d:{e:{f:{if(!z[a+1|0]){d=y[a+60>>2];break f}if(z[l|0]){break b}if(!C){break e}d=y[a+60>>2]^ka(l,A);y[a+60>>2]=d}if(d){y[c+20>>2]=j;y[c+16>>2]=k;y[c+24>>2]=p;y[c+28>>2]=f;y[c+8>>2]=p;y[c+12>>2]=f;f=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=f;Pa(c+8|0,c);break d}g=0;u=0;v=0;if(z[a+2|0]==1){ja(c+32|0,y[a+12>>2],y[a+24>>2]);v=y[c+32>>2];u=y[c+36>>2]}ja(c+32|0,i,y[a+24>>2]+w[a+17|0]|0);D=y[c+36>>2];E=y[c+32>>2];e=y[i+8>>2];g=!m|(e|0)<2?g:z[n|0]>>>6&1;g=!m|(e|0)<=0?g:z[n|0]>>>6&2|g;h=0;h=!j|(e|0)<2?h:z[k|0]>>>6&1;h=!j|(e|0)<=0?h:z[k|0]>>>6&2|h;r=0;d=0;while(1){if(B[a+4>>2]<=d>>>0){break d}g:{h:{if(z[a+2|0]==1){if(ia(y[y[a+12>>2]+8>>2],d,v,u)){break h}}e=ia(e,w[a+16|0]+d|0,E,D);if(z[l|0]){break b}e=h<<3|g<<7|e<<2|r;if(e>>>0>=s>>>0){break e}q=ka(l,(e<<3)+t|0);e=y[i+8>>2];if(!q){break h}La(e,d,p,f,1);e=y[i+8>>2];q=1;break g}q=0}x=d+2|0;g=ia(e,x,n,m)|g<<1&6;h=ia(e,x,k,j)|h<<1&14;d=d+1|0;r=r<<1&2|q;continue}}o()}f=y[b+16>>2];if(!f){break c}if(!(_[y[y[f>>2]+8>>2]](f)|0)){break c}y[a+24>>2]=y[a+24>>2]+1;d=3}y[a+52>>2]=d;break a}d=y[a+24>>2]+1|0;y[a+24>>2]=d;n=k;m=j;continue}break}d=-1}Y=c+48|0;return d|0}function ec(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,A=0,C=0,D=0,E=0;k=((b&536870911)<<3|a>>>29)&-8;m=e;n=g;p=d;q=f;r=1;e=-1;a:{b:{c:while(1){j=r&1;u=j?326:325;v=j?1392:1056;w=j?325:326;x=j?1056:1392;d:while(1){A=e+1|0;t=e>>>3|0;C=t+q|0;D=1<<((e^-1)&7);d=y[c>>2];E=(e|0)<0;while(1){if(d>>>0>=k>>>0){break b}if(E){f=1}else{if(n>>>0<=t>>>0){break a}f=(z[C|0]&D)!=0}d=h;g=d;l=f^1;i=cc(q,n,d,A,l);s=d;e:{if((i|0)>=(d|0)){break e}f:{if((f|0)==(j|0)){l=f;break f}i=cc(q,n,h,i+1|0,f)}s=h;if((d|0)<=(i|0)){break e}g=i;s=cc(q,n,d,i+1|0,l)}d=s;g:{f=0;h:{if(Ka(a,b,c)){break h}if(B[c>>2]>=k>>>0){break b}i=Ka(a,b,c);if(B[c>>2]>=k>>>0){break b}l=Ka(a,b,c);f=l?1:-1;if(i){break h}if(l){d=0;while(1){f=bc(x,w,a,b,c);d=f+d|0;if((f|0)>63){continue}break}d=(e>>>31|0)+d|0;if((d|0)<0){break b}f=d+e|0;if(!j){lb(p,m,h,e,f)}d=0;while(1){e=bc(v,u,a,b,c);d=e+d|0;if((e|0)>63){continue}break}if((d|0)<0){break b}e=d+f|0;if(j){lb(p,m,h,f,e)}if((e|0)<(h|0)){continue d}break b}if(B[c>>2]>=k>>>0){break b}if(Ka(a,b,c)){if(!j){lb(p,m,h,e,d)}e=d;if((d|0)<(h|0)){continue d}break b}if(B[c>>2]>=k>>>0){break b}d=Ka(a,b,c);if(B[c>>2]>=k>>>0){break b}i=Ka(a,b,c);f=i?2:-2;if(d){break h}d=y[c>>2];if(!i){break g}if(d>>>0>=k>>>0){break b}f=Ka(a,b,c)?3:-3}d=f+g|0;if(!j){lb(p,m,h,e,d)}if((d|0)<=(e|0)|(d|0)>=(h|0)){break b}r=r^1;e=d;continue c}if(d>>>0>=k>>>0){break b}f=Ka(a,b,c);d=y[c>>2];if(f){d=d+3|0;y[c>>2]=d;continue}break}break}break}y[c>>2]=d+5}return}o()}function uc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0;f=Y-32|0;Y=f;m=xa(y[a>>2],y[a+4>>2]);y[f+28>>2]=m;a:{if(!qa(m)){break a}Qa(m,z[a+20|0]);b:{while(1){if(!k&l>>>0>=B[a+36>>2]|k){y[f+28>>2]=0;d=m;break a}d=y[b>>2];g=y[b+4>>2];e=0;y[f+24>>2]=0;y[f+16>>2]=0;y[f+20>>2]=0;c=g-d|0;h=c>>2;c:{d:{if((d|0)==(g|0)){j=0;break d}if(h>>>0>=536870912){break c}j=na(c<<1);y[f+16>>2]=j;e=(h<<3)+j|0;y[f+24>>2]=e;c=j;while(1){if((c|0)!=(e|0)){y[c>>2]=0;y[c+4>>2]=0;c=c+8|0;continue}break}y[f+20>>2]=e}if(h>>>0>e-j>>3>>>0){break b}c=j;while(1){if((d|0)==(g|0)){e:{c=y[a+44>>2];d=se(l,k,A[a+48>>1]);e=c+d|0;q=e;c=Z+(c>>31)|0;r=d>>>0>e>>>0?c+1|0:c;c=y[a+40>>2];d=se(l,k,A[a+50>>1]);e=c+d|0;s=e;c=Z+(c>>31)|0;t=d>>>0>e>>>0?c+1|0:c;g=0;e=0;f:while(1){if(!e&B[a+32>>2]<=g>>>0|e){break e}i=y[b>>2];p=y[b+4>>2]-i>>2;c=0;d=0;while(1){h=c&255;if(h>>>0>=p>>>0){c=y[a+12>>2]-1|0;h=y[y[y[a+16>>2]>>2]+((c>>>0>>0?c:d)<<2)>>2];d=se(g,e,A[a+48>>1]);c=d+s|0;i=Z+t|0;d=c>>>0>>0?i+1|0:i;i=se(g,e,A[a+50>>1]);p=q-i|0;u=(d&255)<<24|c>>>8;n=d>>8;c=r-(Z+(i>>>0>q>>>0)|0)|0;d=c>>8;Hb(h,m,u,n,(c&255)<<24|p>>>8,d,y[a+24>>2]);g=g+1|0;e=g?e:e+1|0;continue f}else{n=(h<<3)+j|0;d=d|ia(y[y[i+(h<<2)>>2]+8>>2],g,y[n>>2],y[n+4>>2])<>2],l);e=y[f+12>>2];y[c>>2]=y[f+8>>2];y[c+4>>2]=e;c=c+8|0;d=d+4|0;continue}break}l=l+1|0;k=l?k:k+1|0;ya(f+16|0);continue}break}Ba()}o()}la(f+28|0);Y=f+32|0;return d}function sb(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0;f=Y-16|0;Y=f;a:{j=xa(d,e);if(!qa(j)){break a}if(!qa(a)|(b|0)<0|(c|0)<0|y[a+8>>2]<=(b|0)){break a}g=y[a+12>>2];if((g|0)<=(c|0)){break a}b:{if(!(b&7)){d=y[a+16>>2];b=b>>>3|0;if(d>>>0<=b>>>0){break b}d=d-b|0;e=y[j+16>>2];d=d>>>0>>0?d:e;if(!d){break b}e=0;h=g-c|0;i=y[j+12>>2];h=(h|0)<(i|0)?h:i;h=(h|0)>0?h:0;while(1){if((e|0)==(h|0)){break a}ja(f+8|0,a,c+e|0);i=y[f+12>>2];if(i>>>0>>0|d>>>0>i-b>>>0){break b}i=y[f+8>>2];ja(f,j,e);if(d>>>0>B[f+4>>2]){break b}if(d){p(y[f>>2],b+i|0,d)}e=e+1|0;continue}}h=b>>>5|0;e=y[a+16>>2]>>>2|0;if(h>>>0>=e>>>0){break b}d=y[j+16>>2]>>>2|0;if(!d){break b}e=e-h|0;i=d>>>0>e>>>0?e:d;q=b&31;d=g-c|0;e=y[j+12>>2];d=(d|0)<(e|0)?d:e;r=(d|0)>0?d:0;s=b^-1;c:while(1){if((l|0)==(r|0)){break a}d=f+8|0;ja(d,a,c+l|0);e=y[f+8>>2];if(e&3){break b}g=y[f+12>>2]>>>2|0;if(g>>>0>>0){break b}y[f+12>>2]=g-h;y[f+8>>2]=e+(h<<2);Ca(f,j,l);if(B[f+4>>2]>>0){break b}e=y[f>>2];g=_a(d);d=y[f+8>>2];n=y[f+12>>2];k=i>>>0>n>>>0?n:i;if(k>>>0>B[f+12>>2]){break b}k=(k<<2)+e|0;g=te(g,24)&16711935|te(g&16711935,8);while(1)if((e|0)==(k|0)){if(i>>>0>n>>>0){d=g<>2]=u}l=l+1|0;continue c}else{m=g<>2];g=te(g&16711935,8)|te(g,24)&16711935;m=m|g>>>1>>>s;t=e,u=te(m&16711935,8)|te(m,24)&16711935,y[t>>2]=u;d=d+4|0;e=e+4|0;continue}}}o()}Y=f+16|0;return j}function je(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0;c=Y-48|0;Y=c;i=y[b+4>>2];q=y[b+12>>2];r=y[b+8>>2];h=y[y[b>>2]>>2];ja(c+40|0,h,y[a+24>>2]-1|0);u=r+3240|0;d=y[a+24>>2];v=q>>>0>405;j=4;a:{while(1){b:{c:{if(B[a+8>>2]>d>>>0){k=y[c+44>>2];l=y[c+40>>2];ja(c+32|0,h,d);f=y[c+36>>2];m=y[c+32>>2];y[c+40>>2]=m;y[c+44>>2]=f;d:{e:{f:{if(!z[a+1|0]){d=y[a+60>>2];break f}if(z[i|0]){break b}if(!v){break e}d=y[a+60>>2]^ka(i,u);y[a+60>>2]=d}if(d){y[c+20>>2]=k;y[c+16>>2]=l;y[c+24>>2]=m;y[c+28>>2]=f;y[c+8>>2]=m;y[c+12>>2]=f;f=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=f;Pa(c+8|0,c);break d}g=0;s=0;t=0;if(z[a+2|0]==1){ja(c+32|0,y[a+12>>2],y[a+24>>2]);t=y[c+36>>2];s=y[c+32>>2]}ja(c+32|0,h,y[a+24>>2]+w[a+17|0]|0);x=y[c+36>>2];A=y[c+32>>2];e=y[h+8>>2];g=!k|(e|0)<2?g:z[l|0]>>>6&1;g=!k|(e|0)<=0?g:z[l|0]>>>6&2|g;p=0;d=0;while(1){if(B[a+4>>2]<=d>>>0){break d}g:{h:{if(z[a+2|0]==1){if(ia(y[y[a+12>>2]+8>>2],d,s,t)){break h}}e=ia(e,w[a+16|0]+d|0,A,x);if(z[i|0]){break b}e=g<<5|e<<4|p;if(e>>>0>=q>>>0){break e}n=ka(i,(e<<3)+r|0);e=y[h+8>>2];if(!n){break h}La(e,d,m,f,1);e=y[h+8>>2];n=1;break g}n=0}g=ia(e,d+2|0,l,k)|g<<1&30;d=d+1|0;p=p<<1&14|n;continue}}o()}f=y[b+16>>2];if(!f){break c}if(!(_[y[y[f>>2]+8>>2]](f)|0)){break c}y[a+24>>2]=y[a+24>>2]+1;j=3}y[a+52>>2]=j;break a}d=y[a+24>>2]+1|0;y[a+24>>2]=d;continue}break}j=-1}Y=c+48|0;return j|0}function Hd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;c=y[b+56>>2];d=y[b+60>>2];f=b+48|0;Hc(c,d,f);h=((d&536870911)<<3|c>>>29)&-8;if(h>>>0<=B[b+48>>2]){y[a>>2]=0;y[a+4>>2]=0;return}Ic(y[b+64>>2],y[b+68>>2]);i=b- -64|0;c=y[b+44>>2];a:{if((c|0)<0){e=y[b+64>>2];c=y[b+68>>2]-e|0;d=0;l=c;g=y[b+76>>2];c=y[b+80>>2]-g|0;ec(y[b+56>>2],y[b+60>>2],f,e|d,l,d|g,c,y[b+4>>2]);Gc(b+76|0,i);break a}if(!c){d=y[b+64>>2];c=y[b+68>>2]-d|0;Fc(y[b+56>>2],y[b+60>>2],f,d,c,y[b+4>>2]);break a}e=Ka(y[b+56>>2],y[b+60>>2],f);g=y[b+64>>2];c=y[b+68>>2]-g|0;d=y[b+56>>2];j=y[b+60>>2];b:{if(e){Fc(d,j,f,g,c,y[b+4>>2]);break b}l=d;d=0;e=c;k=y[b+76>>2];c=y[b+80>>2]-k|0;ec(l,j,f,d|g,e,d|k,c,y[b+4>>2])}Gc(b+76|0,i)}if(z[b+53|0]==1){Hc(y[b+56>>2],y[b+60>>2],f)}c:{d:{e:{if(z[b+52|0]!=1){break e}d=y[f>>2];if(h>>>0<=d>>>0){break e}e=d+7&-8;i=y[b+56>>2];g=y[b+60>>2];while(1){c=d>>>3|0;h=c+i|0;j=1<<((d^-1)&7);k=c>>>0>>0;c=1;f:{while(1){if(!c|d>>>0>=e>>>0){break f}if(!k){break d}if(z[h|0]&j){c=0;w[b+52|0]=0;continue}break}d=d+1|0;continue}break}if(!c){break e}y[f>>2]=e}c=y[b+64>>2];if(!z[b+54|0]){d=y[b+68>>2]-c|0;break c}if(c&3){break d}d=y[b+68>>2]-c|0;e=c+(d&-4)|0;b=c;while(1){if((b|0)==(e|0)){break c}y[b>>2]=y[b>>2]^-1;b=b+4|0;continue}}o()}y[a+4>>2]=d;y[a>>2]=c}function hd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;d=Y-32|0;Y=d;i=y[a+24>>2];y[d+16>>2]=0;a:{b:{switch(z[a+3|0]){case 0:c=xd(a)?3:4;break a;case 1:c=wd(a)?5:6;break a;case 2:c=Qb(a)?7:8;break a;default:break b}}c=Qb(a)?9:10}e=Y-48|0;Y=e;y[e+24>>2]=0;if(c){y[e+16>>2]=0;y[e+12>>2]=c;y[e+8>>2]=2600;g=e+8|0;y[e+24>>2]=g}h=e+8|0;c:{if((h|0)==(d|0)){break c}c=y[d+16>>2];if((g|0)==(h|0)){if((d|0)==(c|0)){f=e+32|0;_[y[y[g>>2]+12>>2]](g,f);c=y[e+24>>2];_[y[y[c>>2]+16>>2]](c);y[e+24>>2]=0;c=y[d+16>>2];_[y[y[c>>2]+12>>2]](c,h);c=y[d+16>>2];_[y[y[c>>2]+16>>2]](c);y[d+16>>2]=0;y[e+24>>2]=h;_[y[y[e+32>>2]+12>>2]](f,d);_[y[y[e+32>>2]+16>>2]](f);y[d+16>>2]=d;break c}_[y[y[g>>2]+12>>2]](g,d);c=y[e+24>>2];_[y[y[c>>2]+16>>2]](c);y[e+24>>2]=y[d+16>>2];y[d+16>>2]=d;break c}if((d|0)==(c|0)){f=e+8|0;_[y[y[c>>2]+12>>2]](c,f);c=y[d+16>>2];_[y[y[c>>2]+16>>2]](c);y[d+16>>2]=y[e+24>>2];y[e+24>>2]=f;break c}y[e+24>>2]=c;y[d+16>>2]=g}gd(e+8|0);Y=e+48|0;c=y[y[b>>2]>>2];f=y[d+16>>2];y[d+28>>2]=b;if(f){f=_[y[y[f>>2]+24>>2]](f,a,d+28|0)|0;y[a+64>>2]=0;y[a+52>>2]=f;b=y[c+8>>2];y[a+68>>2]=i;y[a+72>>2]=b;y[a+76>>2]=y[a+24>>2];if((f|0)==4){y[a+24>>2]=0}gd(d);Y=d+32|0;return f}a=Fb(4);y[a>>2]=5228;P(a|0,5240,11);o()}function hb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,q=0,r=0,s=0,t=0,u=0;d=Y-32|0;Y=d;h=xa(y[a+4>>2],y[a+8>>2]);y[d+8>>2]=h;Da(d,h);a:{l=y[d+4>>2];if(!l){oa(b,0);y[a+52>>2]=-1;break a}b:{f=y[h+16>>2];if((f|0)<0|!f){break b}j=y[c+12>>2]+(y[c+8>>2]<<3)|0;i=y[a+8>>2];n=y[a+4>>2];q=y[c>>2];r=y[c+4>>2];k=y[d>>2];y[d+20>>2]=0;y[d+12>>2]=0;y[d+16>>2]=0;g=d+12|0;y[d+24>>2]=g;jc(g,f);e=y[d+16>>2];g=f+e|0;while(1){if((e|0)!=(g|0)){w[e|0]=255;e=e+1|0;continue}break}w[d+28|0]=1;y[d+16>>2]=g;fd(d+24|0);m=y[d+12>>2];g=y[d+16>>2];y[d+24>>2]=j;j=0;s=(i|0)>0?i:0;e=0;g=g-m|0;t=e|m;while(1){if((j|0)!=(s|0)){i=k;e=f;if(l>>>0>>0){break b}while(1){if((e|0)>0){w[i|0]=255;e=e-1|0;i=i+1|0;continue}break}ec(q,r,d+24|0,k|u,f,t,g,n);if(f>>>0>g>>>0){break b}if(f){p(m,k,f)}j=j+1|0;l=l-f|0;k=f+k|0;continue}break}f=y[d+24>>2];g=d+12|0;ya(g);y[c+12>>2]=f&7;y[c+8>>2]=f>>>3;Da(g,h);e=y[d+12>>2];c=e+y[d+16>>2]|0;while(1)if((c|0)==(e|0)){y[a+64>>2]=0;y[a+52>>2]=4;c=y[h+8>>2];y[a+68>>2]=0;y[a+72>>2]=c;y[a+76>>2]=y[h+12>>2];y[d+8>>2]=0;oa(b,h);break a}else{w[e|0]=z[e|0]^-1;e=e+1|0;continue}}o()}la(d+8|0);Y=d+32|0}function ae(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0;k=Y-16|0;Y=k;l=i?i:c;a:{if((l|0)<=0){break a}j=j?j:d;if((j|0)<=0|(j|l)>>>0>65535){break a}i=na(88);y[i+40>>2]=0;y[i+32>>2]=-1;y[i+36>>2]=0;y[i+20>>2]=1;y[i+24>>2]=1;y[i+16>>2]=j;y[i+12>>2]=l;y[i+8>>2]=j;y[i+4>>2]=l;y[i+56>>2]=a;y[i+60>>2]=b;w[i+54|0]=(h|0)!=0;w[i+53|0]=(f|0)!=0;w[i+52|0]=(g|0)!=0;y[i+48>>2]=0;y[i+44>>2]=e;y[i>>2]=2e3;a=l+31>>>3&16380;y[i+28>>2]=a;od(i- -64|0,a);od(i+76|0,y[i+28>>2]);e=c+7>>>3|0;W(E(e,d)|0);a=0;while(1){b:{if((a|0)==(d|0)){break b}c:{j=y[i+32>>2];b=a+1|0;if((j|0)==(b|0)){j=y[i+40>>2];c=y[i+36>>2];break c}d:{if(!((j|0)>=0&(a|0)>=(j|0))){j=0;if(!(_[y[y[i>>2]+12>>2]](i)|0)){break b}c=0;break d}c=1}while(1){if(!c){y[i+32>>2]=j;c=1;continue}e:{if((a|0)>(j|0)){_[y[y[i>>2]+16>>2]](k+8|0,i);j=y[i+32>>2]+1|0;break e}_[y[y[i>>2]+16>>2]](k+8|0,i);j=y[k+12>>2];c=y[k+8>>2];y[i+36>>2]=c;y[i+40>>2]=j;y[i+32>>2]=y[i+32>>2]+1;break c}c=0;continue}}if(!j){break b}V(c|0,e|0,E(a,e)|0);a=b;continue}break}_[y[y[i>>2]+4>>2]](i)}Y=k+16|0}function Fd(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0;b=y[1508];c=a+7&-8;a=c+7|0;d=a>>>0<7?1:d;e=a&-8;a=e+b|0;a:{b:{if(!(a>>>0>>0?d+1|0:d)){if(a>>>0<=$()<<16>>>0){break b}if(R(a|0)|0){break b}}y[1516]=48;b=-1;break a}y[1508]=a}d=b;if((d|0)!=-1){a=d+c|0;y[a-4>>2]=16;f=a-16|0;y[f>>2]=16;b=y[1776];if(b){e=y[b+8>>2]}else{e=0}c:{d:{if((e|0)==(d|0)){e=y[d-4>>2]&-2;g=d-e|0;h=y[g-4>>2];y[b+8>>2]=a;b=h&-2;a=g-b|0;if(y[(a+y[a>>2]|0)-4>>2]&1){f=y[a+4>>2];g=y[a+8>>2];y[f+8>>2]=g;y[g+4>>2]=f;b=(b+(c+e|0)|0)-16|0;y[a>>2]=b;break c}a=d-16|0;break d}y[d>>2]=16;y[d+8>>2]=a;y[d+4>>2]=b;y[d+12>>2]=16;y[1776]=d;a=d+16|0}b=f-a|0;y[a>>2]=b}y[((b&-4)+a|0)-4>>2]=b|1;c=y[a>>2]-8|0;e:{if(c>>>0<=127){b=(c>>>3|0)-1|0;break e}e=H(c);b=((c>>>29-e^4)-(e<<2)|0)+110|0;if(c>>>0<=4095){break e}b=((c>>>30-e^2)-(e<<1)|0)+71|0;b=b>>>0>=63?63:b}c=b<<4;y[a+4>>2]=c+6080;c=c+6088|0;y[a+8>>2]=y[c>>2];y[c>>2]=a;y[y[a+8>>2]+4>>2]=a;c=y[1779];a=b&31;if((b&63)>>>0>=32){b=1<>>32-a}y[1778]=e|y[1778];y[1779]=b|c}return(d|0)!=-1}function Bb(a,b){var c=0,d=0,e=0;c=Y+-64|0;Y=c;d=y[a>>2];e=y[d-8>>2];d=y[d-4>>2];a:{if(y[d+4>>2]==y[b+4>>2]){a=e?0:a;break a}e=a+e|0;if((e|0)<=(a|0)){y[c+16>>2]=0;y[c+20>>2]=0;y[c+12>>2]=b;y[c+8>>2]=a;y[c+4>>2]=d;y[c+24>>2]=0;y[c+28>>2]=0;y[c+32>>2]=0;y[c+36>>2]=0;y[c+40>>2]=0;y[c+44>>2]=0;y[c+48>>2]=0;y[c+60>>2]=0;y[c+52>>2]=1;y[c+56>>2]=16777216;_[y[y[d>>2]+20>>2]](d,c+4|0,e,e,1,0);if(y[c+28>>2]){break a}}y[c+16>>2]=0;y[c+20>>2]=0;y[c+12>>2]=5336;y[c+8>>2]=a;y[c+4>>2]=b;y[c+24>>2]=0;y[c+28>>2]=0;y[c+32>>2]=0;y[c+36>>2]=0;y[c+40>>2]=0;y[c+44>>2]=0;y[c+48>>2]=0;y[c+52>>2]=0;a=0;w[c+55|0]=0;w[c+56|0]=0;w[c+57|0]=0;w[c+58|0]=0;y[c+60>>2]=0;w[c+59|0]=1;_[y[y[d>>2]+24>>2]](d,c+4|0,e,1,0);b:{switch(y[c+40>>2]){case 0:a=y[c+44>>2]==1?y[c+32>>2]==1?y[c+36>>2]==1?y[c+24>>2]:0:0:0;break a;case 1:break b;default:break a}}if(y[c+28>>2]!=1){if(y[c+44>>2]|y[c+32>>2]!=1|y[c+36>>2]!=1){break a}}a=y[c+20>>2]}Y=c- -64|0;return a}function ud(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;d=Y-32|0;Y=d;a:{b:{c:{d:{e:{c=y[a+4>>2];if(c>>>0>>0){g=b-c|0;f=y[a+8>>2];e=f<<5;if(!(g>>>0>e>>>0|c>>>0>e-g>>>0)){y[a+4>>2]=b;e=c&31;b=y[a>>2]+(c>>>3&536870908)|0;break b}y[d+16>>2]=0;y[d+8>>2]=0;y[d+12>>2]=0;if((b|0)<0){break e}c=2147483647;if(e>>>0<=1073741822){e=f<<6;b=b+31&-32;c=b>>>0>>0?e:b;if((c|0)<0){break e}}e=(c-1>>>5|0)+1|0;b=na(e<<2);y[d+24>>2]=0;y[d+28>>2]=0;y[d+8>>2]=b;y[d+20>>2]=0;y[d+16>>2]=e;y[d+24>>2]=0;Ob(d+20|0);e=y[a+4>>2];y[d+12>>2]=e+g;if((e|0)<=0){break d}f=y[a>>2];h=e>>>5|0;c=h<<2;if(!(!h|!c)){p(b,f,c)}b=(h<<2)+b|0;e=e&31;if(!e){break d}f=y[c+f>>2];c=y[b>>2];y[b>>2]=(f^c)&-1>>>32-e^c;break c}y[a+4>>2]=b;break a}Ba();o()}e=0}c=y[a>>2];y[a>>2]=y[d+8>>2];y[d+8>>2]=c;c=y[a+4>>2];y[a+4>>2]=y[d+12>>2];y[d+12>>2]=c;c=y[a+8>>2];y[a+8>>2]=y[d+16>>2];y[d+16>>2]=c;Ob(d+8|0)}Xc(b,e,g);Pb(d+20|0,b,e,g)}Y=d+32|0}function cc(a,b,c,d,e){var f=0,g=0,h=0,i=0;a:{b:{if((c|0)<=(d|0)){break b}h=e-1|0;c:{f=(d|0)/8|0;g=f<<3;if((g|0)!=(d|0)){if(b>>>0<=f>>>0){break a}f=(z[a+f|0]^h)&255>>>d-g;if(f){break c}f=(d+7|0)/8|0}g=(c+7|0)/8|0;d:{if((c|0)<57){break d}i=g-8|0;if((i|0)<=(f|0)){break d}d=e?1718:1726;while(1){if((f|0)>=(i|0)){break d}if(b>>>0>>0|b-f>>>0<=7){break a}e=a+f|0;if((z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24))!=(z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24))|(z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24))!=(z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24))){break d}f=f+8|0;continue}}b=b>>>0>>0?f:b;d=(f|0)>(g|0)?f:g;e=h&255;while(1){if((d|0)==(f|0)){break b}if((b|0)==(f|0)){break a}g=z[a+f|0];if((g|0)!=(e|0)){a=z[((g^h)&255)+1734|0]+(f<<3)|0;return(a|0)>(c|0)?c:a}else{f=f+1|0;continue}}}c=g+z[f+1734|0]|0}return c}o()}function dc(a,b){var c=0,d=0,e=0,f=0,g=0;e=a+4|0;d=e+7&-8;c=y[a>>2];if(d+b>>>0<=(c+a|0)-4>>>0){f=y[a+4>>2];g=y[a+8>>2];y[f+8>>2]=g;y[g+4>>2]=f;if((d|0)!=(e|0)){d=d-e|0;f=a-(y[a-4>>2]&-2)|0;e=d+y[f>>2]|0;y[f>>2]=e;y[(f+(e&-4)|0)-4>>2]=e;a=a+d|0;c=c-d|0;y[a>>2]=c}a:{if(b+24>>>0<=c>>>0){e=a+b|0;c=(c-b|0)-8|0;y[e+8>>2]=c;g=e+8|0;y[(g+(c&-4)|0)-4>>2]=c|1;d=y[e+8>>2]-8|0;b:{if(d>>>0<=127){c=(d>>>3|0)-1|0;break b}f=H(d);c=((d>>>29-f^4)-(f<<2)|0)+110|0;if(d>>>0<=4095){break b}c=((d>>>30-f^2)-(f<<1)|0)+71|0;c=c>>>0>=63?63:c}d=c<<4;y[e+12>>2]=d+6080;d=d+6088|0;y[e+16>>2]=y[d>>2];y[d>>2]=g;y[y[e+16>>2]+4>>2]=g;d=y[1778];f=y[1779];e=c&31;if((c&63)>>>0>=32){c=1<>>32-e}y[1778]=g|d;y[1779]=c|f;c=b+8|0;y[a>>2]=c;b=(c&-4)+a|0;break a}b=a+c|0}y[b-4>>2]=c;a=a+4|0}else{a=0}return a}function ma(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;if(a){b=a-4|0;f=y[b>>2];c=f;d=b;e=y[a-8>>2];a=e&-2;if((a|0)!=(e|0)){d=b-a|0;c=y[d+4>>2];e=y[d+8>>2];y[c+8>>2]=e;y[e+4>>2]=c;c=a+f|0}a=b+f|0;b=y[a>>2];if((b|0)!=y[(a+b|0)-4>>2]){f=y[a+4>>2];a=y[a+8>>2];y[f+8>>2]=a;y[a+4>>2]=f;c=b+c|0}y[d>>2]=c;y[((c&-4)+d|0)-4>>2]=c|1;b=y[d>>2]-8|0;a:{if(b>>>0<=127){a=(b>>>3|0)-1|0;break a}c=H(b);a=((b>>>29-c^4)-(c<<2)|0)+110|0;if(b>>>0<=4095){break a}a=((b>>>30-c^2)-(c<<1)|0)+71|0;a=a>>>0>=63?63:a}b=a<<4;y[d+4>>2]=b+6080;b=b+6088|0;y[d+8>>2]=y[b>>2];y[b>>2]=d;y[y[d+8>>2]+4>>2]=d;b=y[1778];c=y[1779];d=a&31;if((a&63)>>>0>=32){a=1<>>32-d}y[1778]=e|b;y[1779]=a|c}}function ob(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=Y-32|0;Y=d;g=(b<<3)+a|0;b=a;while(1){if((b|0)==(g|0)){a:{b=f+1|0;i=md(d+20|0,b);j=md(d+8|0,b);h=y[i>>2];b=a;while(1)if((b|0)==(g|0)){y[h>>2]=0;k=((f|0)>0?f:0)+1|0;l=y[j>>2];c=1;while(1){if((c|0)==(k|0)){c=k;break a}b=c<<2;e=b-4|0;y[d+4>>2]=y[e+l>>2];w[d|0]=1;if(z[Tb(Na(d,y[e+h>>2]))|0]!=1){break a}e=y[d+4>>2];y[b+l>>2]=e;b=a;while(1){if((b|0)!=(g|0)){if(y[b>>2]==(c|0)){y[b+4>>2]=e;e=e+1|0}b=b+8|0;continue}break}c=c+1|0;continue}}else{c=(y[b>>2]<<2)+h|0;y[c>>2]=y[c>>2]+1;b=b+8|0;continue}}}else{c=y[b>>2];f=(c|0)>(f|0)?c:f;b=b+8|0;continue}break}ya(j);ya(i);Y=d+32|0;return(c|0)>(f|0)}function za(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=Y-16|0;Y=e;y[e+12>>2]=0;w[e+8|0]=1;h=-1;a:{b:while(1){if((wb(y[a>>2],e+4|0)|0)==-1){break a}d=Tb(e+8|0);if(z[d|0]!=1){break a}g=y[e+12>>2]|y[e+4>>2];f=(g|0)>=0;y[d>>2]=f;g=f?g:0;y[d+4>>2]=g;if(f){i=i+1|0;f=y[b+4>>2];d=0;while(1){if((d|0)==(f|0)){continue b}j=y[b+8>>2]+(d<<3)|0;if(y[j>>2]!=(i|0)|y[j+4>>2]!=(g|0)){d=d+1|0;continue}else{if((f-1|0)==(d|0)){h=1;if(w[b+1|0]&1){break a}}h=-1;f=y[a>>2];a=d<<2;if((Ia(f,y[a+y[b+20>>2]>>2],e+4|0)|0)==-1){break a}h=0;f=y[a+y[b+32>>2]>>2];a=y[e+4>>2];y[c>>2]=f+((y[b+4>>2]+(z[b+1|0]?-3:-2)|0)==(d|0)?0-a|0:a);break a}}}break}o()}Y=e+16|0;return h}function lb(a,b,c,d,e){var f=0,g=0,h=0;a:{d=(d|0)>0?d:0;f=(e|0)>=0?(c|0)<(e|0)?c:e:0;if((d|0)>=(f|0)){break a}b:{h=d>>>3|0;if(h>>>0>=b>>>0){break b}e=d&7;c=a+h|0;g=f-1|0;f=g>>>3|0;if((f|0)==(h|0)){a=g&7;while(1){if(a>>>0>>0){break a}w[c|0]=z[c|0]+(-1<<7-e);e=e+1|0;continue}}d=z[c|0];while(1)if((e|0)==8){w[c|0]=d;if(b>>>0<=f>>>0){break b}d=(g&7)+1|0;g=a+f|0;c=z[g|0];e=0;while(1)if((d|0)==(e|0)){w[g|0]=c;c=h+1|0;if(c>>>0>=f>>>0){break a}e=f+(h^-1)|0;if(e>>>0>b-c>>>0){break b}c=a+c|0;while(1){if((e|0)<=0){break a}w[c|0]=0;e=e-1|0;c=c+1|0;continue}}else{c=(-1<<7-e)+c|0;e=e+1|0;continue}}else{d=(-1<<7-e)+d|0;e=e+1|0;continue}}o()}}function ka(a,b){var c=0,d=0,e=0,f=0;c=y[b+4>>2];if(c>>>0<47){c=E(c,6);e=A[c+2080>>1];d=y[a+8>>2]-e|0;y[a+8>>2]=d;c=c+2080|0;f=y[a+4>>2];a:{if(d>>>0>f>>>16>>>0){if(d&32768){return z[b|0]}if(d>>>0>>0){d=z[b|0]^1;e=z[c+3|0];if(z[c+4|0]==1){w[b|0]=d&1}y[b+4>>2]=e;b=d&1;break a}y[b+4>>2]=z[c+2|0];b=z[b|0];break a}y[a+4>>2]=f-(d<<16);b:{if(d>>>0>>0){y[b+4>>2]=z[c+2|0];b=z[b|0];break b}d=z[b|0]^1;f=z[c+3|0];if(z[c+4|0]==1){w[b|0]=d&1}y[b+4>>2]=f;b=d&1}y[a+8>>2]=e}c=y[a+12>>2];while(1){if(!c){Dc(a);c=y[a+12>>2]}c=c-1|0;y[a+12>>2]=c;d=y[a+8>>2];y[a+8>>2]=d<<1;y[a+4>>2]=y[a+4>>2]<<1;if(!(d&16384)){continue}break}return b}o()}function xc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;a:{b:{c=y[a+4>>2];e=y[a>>2];g=c-e|0;h=g>>2;c:{if(h>>>0>>0){f=b-h|0;d=y[a+8>>2];if(f>>>0<=d-c>>2>>>0){b=(f<<2)+c|0;while(1){if((b|0)!=(c|0)){y[c>>2]=0;c=c+4|0;continue}break}y[a+4>>2]=b;return}if(b>>>0>=1073741824){break b}c=d-e|0;d=c>>1;d=c>>>0>=2147483644?1073741823:b>>>0>>0?d:b;if(d>>>0>=1073741824){break a}i=na(d<<2);b=i+g|0;f=b+(f<<2)|0;c=b;while(1){if((c|0)!=(f|0)){y[c>>2]=0;c=c+4|0;continue}break}b=b-(h<<2)|0;if(g){p(b,e,g)}y[a+8>>2]=(d<<2)+i;y[a+4>>2]=f;y[a>>2]=b;if(!e){break c}ma(e);return}if(b>>>0>=h>>>0){break c}y[a+4>>2]=(b<<2)+e}return}Ba();o()}jb();o()}function Td(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;a:{if(Sa(a,y[b+8>>2],e)){if(y[b+28>>2]==1|y[b+4>>2]!=(c|0)){break a}y[b+28>>2]=d;return}if(Sa(a,y[b>>2],e)){if(!(y[b+16>>2]!=(c|0)&y[b+20>>2]!=(c|0))){if((d|0)!=1){break a}y[b+32>>2]=1;return}y[b+32>>2]=d;b:{if(y[b+44>>2]==4){break b}x[b+52>>1]=0;a=y[a+8>>2];_[y[y[a>>2]+20>>2]](a,b,c,c,1,e);if(z[b+53|0]==1){y[b+44>>2]=3;if(!z[b+52|0]){break b}break a}y[b+44>>2]=4}y[b+20>>2]=c;y[b+40>>2]=y[b+40>>2]+1;if(y[b+36>>2]!=1|y[b+24>>2]!=2){break a}w[b+54|0]=1;return}a=y[a+8>>2];_[y[y[a>>2]+24>>2]](a,b,c,d,e)}}function kb(a,b){var c=0,d=0,e=0,f=0,g=0;a:{c=y[a+4>>2];d=y[a>>2];e=c-d>>3;if(e>>>0>>0){g=b-e|0;f=y[a+8>>2];if(g>>>0<=f-c>>3>>>0){b=(g<<3)+c|0;while(1){if((b|0)!=(c|0)){y[c+4>>2]=0;w[c|0]=0;c=c+8|0;continue}break}y[a+4>>2]=b;return}d=Bc(d,f,b);b=y[a+4>>2]-y[a>>2]|0;e=0;if(d){e=yb(d)}b=b+e|0;g=b+(g<<3)|0;c=b;while(1){if((c|0)!=(g|0)){y[c+4>>2]=0;w[c|0]=0;c=c+8|0;continue}break}f=b;b=y[a>>2];c=y[a+4>>2]-b|0;f=f-c|0;if(c){p(f,b,c)}y[a+4>>2]=g;y[a>>2]=f;y[a+8>>2]=(d<<3)+e;if(!b){break a}ma(b);return}if(b>>>0>=e>>>0){break a}y[a+4>>2]=d+(b<<3)}}function ad(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;a:{e=y[a+4>>2];c=y[a>>2];f=e-c|0;d=f>>3;b:{if(d>>>0>>0){d=b-d|0;g=y[a+8>>2];if(d>>>0<=g-e>>3>>>0){ld(a,d);return}if(b>>>0>=536870912){break a}h=d<<3;e=f;c=g-c|0;d=c>>2;f=c>>>0>=2147483640?536870911:b>>>0>>0?d:b;g=yb(f);c=e+g|0;d=h+c|0;b=c;while(1){if((b|0)!=(d|0)){y[b>>2]=0;y[b+4>>2]=0;b=b+8|0;continue}break}e=c;b=y[a>>2];c=y[a+4>>2]-b|0;e=e-c|0;if(c){p(e,b,c)}y[a+4>>2]=d;y[a>>2]=e;y[a+8>>2]=g+(f<<3);if(!b){break b}ma(b);return}if(b>>>0>=d>>>0){break b}y[a+4>>2]=c+(b<<3)}return}Ba();o()}function Gb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;a:{e=y[a+4>>2];c=y[a>>2];f=e-c|0;d=f>>2;b:{if(d>>>0>>0){d=b-d|0;g=y[a+8>>2];if(d>>>0<=g-e>>2>>>0){kd(a,d);return}if(b>>>0>=1073741824){break a}h=d<<2;e=f;c=g-c|0;d=c>>1;f=c>>>0>=2147483644?1073741823:b>>>0>>0?d:b;g=Lb(f);c=e+g|0;d=h+c|0;b=c;while(1){if((b|0)!=(d|0)){y[b>>2]=0;b=b+4|0;continue}break}e=c;b=y[a>>2];c=y[a+4>>2]-b|0;e=e-c|0;if(c){p(e,b,c)}y[a+4>>2]=d;y[a>>2]=e;y[a+8>>2]=g+(f<<2);if(!b){break b}ma(b);return}if(b>>>0>=d>>>0){break b}y[a+4>>2]=c+(b<<2)}return}Ba();o()}function Rc(a,b,c,d,e,f,g){y[a+8>>2]=0;a:{b:{if(!(b&255)){c:{switch(c|0){case 1:y[a+4>>2]=e;y[a>>2]=d;y[a+8>>2]=f-1;return;case 3:y[a+4>>2]=e;break a;case 0:y[a>>2]=d;y[a+8>>2]=f-1;y[a+4>>2]=(e-g|0)+1;return;case 2:break c;default:break b}}y[a+4>>2]=(e-g|0)+1;break a}d:{switch(c|0){case 1:y[a+4>>2]=d;y[a>>2]=e;y[a+8>>2]=g-1;return;case 3:y[a+4>>2]=d;y[a+8>>2]=g-1;y[a>>2]=(e-f|0)+1;return;case 0:y[a>>2]=e;y[a+4>>2]=(d-g|0)+1;return;case 2:break d;default:break b}}y[a+4>>2]=(d-g|0)+1;y[a>>2]=(e-f|0)+1}return}y[a>>2]=(d-f|0)+1}function bc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0;k=((d&536870911)<<3|c>>>29)&-8;a:{b:while(1){c:{if(b>>>0<=f>>>0){break c}g=-1;i=z[a+f|0];if((i|0)==255){break a}h=y[e>>2];if(h>>>0>=k>>>0){break a}g=h>>>3|0;if(g>>>0>=d>>>0){break c}g=z[c+g|0];y[e>>2]=h+1;j=g>>>((h^-1)&7)&1|j<<1;f=f+1|0;h=f+E(i,3)|0;while(1){if((f|0)>=(h|0)){continue b}if(b>>>0<=f>>>0){break c}if(z[a+f|0]==(j|0)){c=f+1|0;if(c>>>0>=b>>>0){break c}d=b;b=f+2|0;if(d>>>0<=b>>>0){break c}g=z[a+c|0]|z[a+b|0]<<8;break a}else{f=f+3|0;continue}}}break}o()}return g}function Ia(a,b,c){var d=0,e=0,f=0,g=0;e=-1;g=y[a>>2];a:{f=y[a+8>>2];d=y[a+4>>2];if(f>>>0>=d>>>0){break a}b:{if((d|0)==536870912|d>>>0>536870912){break b}f=y[a+12>>2]+(f<<3)|0;if(f>>>0>(((d&536870911)<<3|g>>>29)&-8)>>>0){break a}y[c>>2]=0;g=y[a>>2];d=y[a+4>>2];if((d|0)==536870912|d>>>0>536870912){break b}d=((d&536870911)<<3|g>>>29)&-8;e=d>>>0>>0?d-f|0:b;while(1){if(!e){e=0;break a}b=y[a+8>>2];if(b>>>0>=B[a+4>>2]){break b}y[c>>2]=z[b+y[a>>2]|0]>>>7-y[a+12>>2]&1|y[c>>2]<<1;_b(a);e=e-1|0;continue}}o()}return e}function Aa(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=Y-16|0;Y=f;i=ka(b,y[a>>2]+8|0);d=i|2;while(1){a:{if((e|0)==5){e=5;break a}g=ka(b,y[a>>2]+(d<<3)|0);d=g|d<<1;if(!g){break a}e=e+1|0;continue}break}g=0;e=e<<3;h=y[e+2364>>2];h=(h|0)>0?h:0;k=e+2364|0;e=0;while(1){if((e|0)!=(h|0)){j=ka(b,y[a>>2]+(d<<3)|0);d=j|d<<1;d=(d|0)>255?d&255|256:d;g=g<<1|j;e=e+1|0;continue}break}w[f+8|0]=1;y[f+12>>2]=y[k+4>>2];d=0;e=0;if(z[Na(f+8|0,g)|0]){a=y[f+12>>2];b=a>>31;d=i?b-(a^b)|0:a;e=!i|(d|0)!=0}y[c>>2]=d;Y=f+16|0;return e}function Sb(a,b){var c=0,d=0,e=0,f=0,g=0;a:{if((a|0)!=(b|0)){f=y[b+4>>2];d=y[b>>2];b=f-d|0;c=y[a>>2];if(b>>>0<=y[a+8>>2]-c>>>0){e=y[a+4>>2];g=e-c|0;if(b>>>0>g>>>0){if((c|0)!=(e|0)){if(g){p(c,d,g)}e=y[a+4>>2]}b=d+g|0;d=f-b|0;if(!(!d|(b|0)==(f|0))){p(e,b,d)}y[a+4>>2]=d+e;return a}if(!(!b|(d|0)==(f|0))){p(c,d,b)}y[a+4>>2]=b+c;return a}jd(a);e=Bc(y[a>>2],y[a+8>>2],b>>3);if(e>>>0>=536870912){break a}c=yb(e);y[a+4>>2]=c;y[a>>2]=c;y[a+8>>2]=c+(e<<3);if(!(!b|(d|0)==(f|0))){p(c,d,b)}y[a+4>>2]=b+c}return a}Ba();o()}function me(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;d=Y-16|0;Y=d;f=y[y[b>>2]>>2];if(!y[a+48>>2]){Da(d+8|0,f);c=y[d+12>>2];y[a+44>>2]=y[d+8>>2];y[a+48>>2]=c}c=y[a+4>>2];if(c){c=c-1|0;g=c>>>3|0;h=(c&7)+1|0;c=y[a+24>>2];while(1){a:{b:{if(B[a+8>>2]<=c>>>0){c=4}else{if(!ic(a,b,2560,g,h)){c=-1;break b}Kb(a,f);e=y[b+16>>2];c=y[a+24>>2];if(!e|(c>>>0)%50){break a}e=_[y[y[e>>2]+8>>2]](e)|0;c=y[a+24>>2];if(!e){break a}y[a+24>>2]=c+1;c=3}y[a+52>>2]=c}Y=d+16|0;return c|0}c=c+1|0;y[a+24>>2]=c;continue}}o()}function qe(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;d=Y-16|0;Y=d;e=y[y[b>>2]>>2];if(!y[a+48>>2]){Da(d+8|0,e);c=y[d+12>>2];y[a+44>>2]=y[d+8>>2];y[a+48>>2]=c}c=y[a+4>>2];if(c){f=y[a+8>>2]&2147483647;c=c-1|0;g=c>>>3|0;h=(c&7)+1|0;c=y[a+24>>2];while(1){a:{b:{if(c>>>0>=f>>>0){c=4}else{if(!ic(a,b,2496,g,h)){c=-1;break b}Kb(a,e);c=y[b+16>>2];if(!c){break a}if(!(_[y[y[c>>2]+8>>2]](c)|0)){break a}y[a+24>>2]=y[a+24>>2]+1;c=3}y[a+52>>2]=c}Y=d+16|0;return c|0}c=y[a+24>>2]+1|0;y[a+24>>2]=c;continue}}o()}function zc(a,b,c,d,e){var f=0,g=0;y[a>>2]=0;f=na(24);y[f+8>>2]=0;y[f+12>>2]=0;g=b;b=(c|0)==268435456|c>>>0<268435456;y[f>>2]=b?g:0;y[f+4>>2]=b?c:0;y[f+16>>2]=0;y[f+20>>2]=0;y[a+8>>2]=0;y[a+12>>2]=0;y[a+4>>2]=f;y[a+16>>2]=0;y[a+20>>2]=0;y[a+24>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;c=na(64);y[a+36>>2]=c;b=c- -64|0;y[a+44>>2]=b;f=0;while(1){if((f|0)!=64){y[c+f>>2]=0;f=f+4|0;continue}break}y[a+52>>2]=10;w[a+49|0]=0;w[a+50|0]=0;w[a+48|0]=e;y[a+40>>2]=b;t(a+56|0,0,49);w[a+112|0]=0;y[a+108>>2]=d;return a}function Wc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;a:{c=y[a+4>>2];d=y[a+8>>2];b:{if(c>>>0>>0){e=y[b>>2];y[b>>2]=0;y[c>>2]=e;b=c+4|0;break b}f=y[a>>2];e=c-f|0;h=e>>2;c=h+1|0;if(c>>>0>=1073741824){break a}d=d-f|0;g=d>>1;g=d>>>0>=2147483644?1073741823:c>>>0>>0?g:c;c:{if(!g){c=e;d=0;break c}d=Lb(g);f=y[a>>2];c=y[a+4>>2]-f|0;h=c>>2}i=y[b>>2];y[b>>2]=0;b=d+e|0;y[b>>2]=i;e=b-(h<<2)|0;if(c){p(e,f,c)}y[a+8>>2]=(g<<2)+d;b=b+4|0;y[a+4>>2]=b;y[a>>2]=e;if(!f){break b}ma(f)}y[a+4>>2]=b;return}Ba();o()}function zb(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){ac(c+80|0);ua(c+76|0);ua(c+72|0);Ja(c+60|0);b=y[c+36>>2];if(b){a=y[c+40>>2];while(1){if((a|0)!=(b|0)){a=pa(a-4|0);continue}break}y[c+40>>2]=b;ma(y[c+36>>2])}la(c+32|0);b=y[c+20>>2];if(b){a=y[c+24>>2];while(1){if((a|0)!=(b|0)){a=$b(a-4|0);continue}break}y[c+24>>2]=b;ma(y[c+20>>2])}b=y[c+8>>2];if(b){a=y[c+12>>2];while(1){if((a|0)!=(b|0)){a=ac(a-4|0);continue}break}y[c+12>>2]=b;ma(y[c+8>>2])}a=y[c+4>>2];y[c+4>>2]=0;if(a){ma(a)}ma(Ab(c))}}function oe(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;d=Y-16|0;Y=d;e=y[y[b>>2]>>2];if(!y[a+48>>2]){Da(d+8|0,e);c=y[d+12>>2];y[a+44>>2]=y[d+8>>2];y[a+48>>2]=c}c=y[a+4>>2];if(c){c=c-1|0;f=c>>>3|0;g=(c&7)+1|0;c=y[a+24>>2];while(1){a:{b:{if(B[a+8>>2]<=c>>>0){c=4}else{if(!ic(a,b,2528,f,g)){c=-1;break b}Kb(a,e);c=y[b+16>>2];if(!c){break a}if(!(_[y[y[c>>2]+8>>2]](c)|0)){break a}y[a+24>>2]=y[a+24>>2]+1;c=3}y[a+52>>2]=c}Y=d+16|0;return c|0}c=y[a+24>>2]+1|0;y[a+24>>2]=c;continue}}o()}function Qd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;if(y[b+4>>2]==5604){b=y[a+12>>2];a:{if(b){a=5592;if(Bb(b,5480)){break a}}a=5600}y[c>>2]=a;return 1}e=y[a+8>>2];b:{c:{if(!(e&24)){d=Bb(b,5432);if(!d){break c}c=1;if(!Sa(a,b,(y[d+8>>2]&24)!=0)){break c}break b}c=1;if(Sa(a,b,1)){break b}}c=0;b=Bb(b,5532);if(!b){break b}d=y[b+8>>2];if(d&(e^-1)&7|(d^-1)&e&96|y[y[a+12>>2]+4>>2]!=y[y[b+12>>2]+4>>2]){break b}c=y[y[a+16>>2]+4>>2]==y[y[b+16>>2]+4>>2]}return c|0}function Wb(a,b){var c=0,d=0,e=0,f=0,g=0;e=Y-16|0;Y=e;a:{b:{f=y[a+4>>2];if(f-1>>>0<=65534){g=y[a+8>>2];if(g-1>>>0<65535){break b}}y[a+52>>2]=4;a=4;break a}y[a+52>>2]=2;c=y[b>>2];d=y[c>>2];if(!d){d=xa(f,g);y[e+12>>2]=0;oa(c,d);la(e+12|0);d=y[c>>2]}if(!qa(d)){oa(c,0);y[a+52>>2]=-1;a=-1;break a}Qa(y[c>>2],0);y[a+60>>2]=0;x[a+56>>1]=1;y[a+24>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;y[a+36>>2]=0;y[a+40>>2]=0;y[a+44>>2]=0;y[a+48>>2]=0;a=hd(a,b)}Y=e+16|0;return a}function Ba(){var a=0,b=0,c=0,d=0;c=Fb(8);y[c>>2]=5828;a=4883;b=0;a:{if(!z[4883]){break a}b:{c:{while(1){a=a+1|0;if(!(a&3)){break c}if(z[a|0]){continue}break}break b}while(1){b=a;a=a+4|0;d=y[b>>2];if(((16843008-d|d)&-2139062144)==-2139062144){continue}break}while(1){a=b;b=a+1|0;if(z[a|0]){continue}break}}b=a-4883|0}a=na(b+13|0);y[a+8>>2]=0;y[a+4>>2]=b;y[a>>2]=b;a=a+12|0;b=b+1|0;if(b){p(a,4883,b)}y[c>>2]=5876;y[c+4>>2]=a;P(c|0,5888,1);o()}function Gc(a,b){var c=0,d=0,e=0,f=0,g=0;a:{if((a|0)!=(b|0)){f=y[b+4>>2];e=y[b>>2];d=f-e|0;c=y[a+8>>2];b=y[a>>2];if(d>>>0<=c-b>>>0){g=y[a+4>>2];c=g-b|0;if(c>>>0>>0){if(!(!c|(b|0)==(g|0))){p(b,e,c)}Ec(a,c+e|0,f);return}if(!(!d|(e|0)==(f|0))){p(b,e,d)}y[a+4>>2]=b+d;return}if(b){y[a+4>>2]=b;ma(b);y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;c=0}if((d|0)<0){break a}b=c<<1;jc(a,c>>>0>=1073741823?2147483647:b>>>0>d>>>0?b:d);Ec(a,e,f)}return}Ba();o()}function Dc(a){var b=0,c=0,d=0,e=0,f=0;e=255;b=y[a+16>>2];a:{if(z[a+1|0]==255){f=8;d=y[b+8>>2];c=d+1|0;if(c>>>0>=B[b+4>>2]){break a}c=z[c+y[b>>2]|0];if(c>>>0>143){break a}Cc(b);w[a+1|0]=c;y[a+4>>2]=(y[a+4>>2]-(c<<9)|0)+65024;b=y[a+16>>2];d=y[b+8>>2];f=7;break a}Cc(b);f=8;b=y[a+16>>2];d=y[b+8>>2];c=y[b>>2];e=B[b+4>>2]>d>>>0?z[c+d|0]:e;w[a+1|0]=e;y[a+4>>2]=(y[a+4>>2]-(e<<8)|0)+65280}y[a+12>>2]=f;if(B[b+4>>2]<=d>>>0){w[a|0]=1}}function Ib(a,b,c,d){var e=0,f=0,g=0,h=0,i=0;f=b-1|0;g=y[d>>2];e=y[d+4>>2];a:{if((ia(a,f,g,e)|0)!=(c|0)){break a}if((ia(a,b,g,e)|0)!=(c|0)){break a}h=b+1|0;if((ia(a,h,g,e)|0)!=(c|0)){break a}g=y[d+8>>2];e=y[d+12>>2];if((ia(a,f,g,e)|0)!=(c|0)){break a}if((ia(a,h,g,e)|0)!=(c|0)){break a}e=f;f=y[d+16>>2];d=y[d+20>>2];if((ia(a,e,f,d)|0)!=(c|0)){break a}if((ia(a,b,f,d)|0)!=(c|0)){break a}i=(ia(a,h,f,d)|0)==(c|0)}return i}function ja(a,b,c){var d=0,e=0;d=Y-16|0;Y=d;a:{b:{c:{if(!(!(!qa(b)|(c|0)<0)&y[b+12>>2]>(c|0))){w[d+8|0]=0;break c}e=y[b+16>>2];if((e|0)<0){break b}c=se(e,0,c);if(Z){break b}y[d+8>>2]=c;e=1}w[d+12|0]=e;break a}o()}d:{e:{if(!z[d+12|0]){y[a>>2]=0;y[a+4>>2]=0;break e}Da(d,b);e=y[d+4>>2];c=y[d+8>>2];if(e>>>0>>0){break d}b=y[b+16>>2];if(b>>>0>e-c>>>0){break d}e=y[d>>2];y[a+4>>2]=b;y[a>>2]=c+e}Y=d+16|0;return}o()}function nd(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=a+8|0;t(d,0,36);b=E(b,12);c=y[b+3072>>2];y[a+4>>2]=c;w[a+1|0]=z[b+3064|0];ad(d,c);Gb(a+20|0,c);Gb(a+32|0,c);b=y[b+3068>>2];d=b+(c<<3)|0;g=y[a+32>>2];h=y[a+20>>2];c=y[a+8>>2];while(1){if((b|0)!=(d|0)){y[c+(e<<3)>>2]=z[b|0];f=e<<2;y[f+h>>2]=z[b+1|0];y[g+f>>2]=y[b+4>>2];b=b+8|0;e=e+1|0;continue}break}i=a,j=ob(c,y[a+12>>2]-c>>3),w[i|0]=j;return a}function bd(a,b,c,d,e,f,g,h,i,j){var k=0,l=0;La(y[b+8>>2],d,i,j,e);i=y[a+12>>2];j=y[c>>2];b=ia(y[b+8>>2],d+2|0,g,h);y[c+4>>2]=e;y[c>>2]=b|j<<1&2;e=y[c+8>>2];a=y[a+20>>2];b=(d-i|0)+2|0;k=c,l=ia(y[a+8>>2],b,y[f>>2],y[f+4>>2])|e<<1&2,y[k+8>>2]=l;d=y[c+12>>2];k=c,l=ia(y[a+8>>2],b,y[f+8>>2],y[f+12>>2])|d<<1&6,y[k+12>>2]=l;d=y[c+16>>2];k=c,l=ia(y[a+8>>2],b,y[f+16>>2],y[f+20>>2])|d<<1&6,y[k+16>>2]=l}function Fc(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;l=((b&536870911)<<3|a>>>29)&-8;h=1;while(1){a:{if(B[c>>2]>=l>>>0){break a}i=h&1;n=i?325:326;g=i?1056:1392;j=0;while(1){k=bc(g,n,a,b,c);if((k|0)<0){while(1){if(B[c>>2]>=l>>>0){break a}if(!Ka(a,b,c)){continue}break}break a}j=j+k|0;if(k>>>0>63){continue}break}g=j+m|0;if(!i){lb(d,e,f,m,g)}h=h^1;m=g;if((f|0)>(g|0)){continue}}break}}function Pd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;a:{if(Sa(a,y[b+8>>2],e)){if(y[b+28>>2]==1|y[b+4>>2]!=(c|0)){break a}y[b+28>>2]=d;return}if(!Sa(a,y[b>>2],e)){break a}if(!(y[b+16>>2]!=(c|0)&y[b+20>>2]!=(c|0))){if((d|0)!=1){break a}y[b+32>>2]=1;return}y[b+20>>2]=c;y[b+32>>2]=d;y[b+40>>2]=y[b+40>>2]+1;if(!(y[b+36>>2]!=1|y[b+24>>2]!=2)){w[b+54|0]=1}y[b+44>>2]=4}}function Vd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=Y+-64|0;Y=d;a:{e=1;b:{if(y[a+4>>2]==y[b+4>>2]){break b}b=Bb(b,5384);e=0;if(!b){break b}e=y[c>>2];if(!e){break a}t(d+8|0,0,56);w[d+59|0]=1;y[d+16>>2]=-1;y[d+12>>2]=a;y[d+4>>2]=b;y[d+52>>2]=1;_[y[y[b>>2]+28>>2]](b,d+4|0,e,1);a=y[d+28>>2];if((a|0)==1){y[c>>2]=y[d+20>>2]}e=(a|0)==1}Y=d- -64|0;return e|0}Qc();o()}function Pc(a,b,c,d){w[a+53|0]=1;a:{if(y[a+4>>2]!=(c|0)){break a}w[a+52|0]=1;c=y[a+16>>2];b:{if(!c){y[a+36>>2]=1;y[a+24>>2]=d;y[a+16>>2]=b;if((d|0)!=1){break a}if(y[a+48>>2]==1){break b}break a}if((b|0)==(c|0)){c=y[a+24>>2];if((c|0)==2){y[a+24>>2]=d;c=d}if(y[a+48>>2]!=1){break a}if((c|0)==1){break b}break a}y[a+36>>2]=y[a+36>>2]+1}w[a+54|0]=1}}function Cd(a,b){var c=0,d=0,e=0;d=a,e=Fa(),y[d>>2]=e;d=a,e=Fa(),y[d+4>>2]=e;d=a,e=Fa(),y[d+8>>2]=e;d=a,e=Fa(),y[d+12>>2]=e;d=a,e=Fa(),y[d+16>>2]=e;d=a,e=Fa(),y[d+20>>2]=e;d=a,e=Fa(),y[d+24>>2]=e;d=a,e=Fa(),y[d+28>>2]=e;d=a,e=Fa(),y[d+32>>2]=e;c=na(16);w[c+12|0]=b;y[c+8>>2]=0;y[c>>2]=0;y[c+4>>2]=0;kb(c,1<>2]=c;return a}function kc(a){var b=0,c=0,d=0,e=0;b=Y-16|0;Y=b;c=na(20);w[c+4|0]=0;y[c>>2]=0;y[c+8>>2]=y[a+8>>2];d=y[a+12>>2];y[c+12>>2]=d;e=y[a+16>>2];y[c+16>>2]=e;Da(b+8|0,a);a:{b:{if(!y[b+12>>2]){break b}nb(c,td(e,d));Da(b,c);a=y[b+8>>2];e=0;d=y[b+12>>2];if(d>>>0>B[b+4>>2]){break a}if(!d|!(d|e)){break b}p(y[b>>2],a,d)}Y=b+16|0;return c}o()}function sd(a,b,c,d,e){var f=0,g=0,h=0,i=0;a:{if(!d){break a}if(e&1){f=b;g=d;if(c){e=32-c|0;f=d>>>0>>0?d:e;y[b>>2]=y[b>>2]|-1<>>e-f;g=d-f|0;f=b+4|0}i=g>>>5|0;e=i;h=f;while(1){if(e){y[h>>2]=-1;e=e-1|0;h=h+4|0;continue}break}e=g&31;if(!e){break a}f=(i<<2)+f|0;y[f>>2]=y[f>>2]|-1>>>32-e;break a}Xc(b,c,d)}Pb(a,b,c,d)}function ed(a,b){var c=0,d=0,e=0;c=Y-32|0;Y=c;a:{d=y[a+40>>2];if(d){e=y[a+48>>2];y[c+24>>2]=y[a+44>>2];y[c+28>>2]=e;b=y[b+16>>2];if(b>>>0>d>>>0){break a}a=y[a+36>>2];y[c+20>>2]=b;y[c+16>>2]=a;a=y[c+28>>2];y[c+8>>2]=y[c+24>>2];y[c+12>>2]=a;a=y[c+20>>2];y[c>>2]=y[c+16>>2];y[c+4>>2]=a;Pa(c+8|0,c)}Y=c+32|0;return}o()}function ra(a,b){var c=0,d=0,e=0,f=0,g=0;a:{d=y[a+8>>2];f=d+3|0;c=y[a+4>>2];if(f>>>0>>0){if(c>>>0<=d>>>0){break a}g=d+1|0;if(g>>>0>=c>>>0){break a}e=c;c=d+2|0;if(e>>>0<=c>>>0){break a}e=b;b=y[a>>2];y[e>>2]=z[b+g|0]<<16|z[b+d|0]<<24|z[b+c|0]<<8|z[b+f|0];y[a+8>>2]=y[a+8>>2]+4;a=0}else{a=-1}return a}o()}function dd(a,b,c){var d=0;d=Y-32|0;Y=d;ja(d+24|0,y[b+20>>2],(y[b+16>>2]^-1)+c|0);y[a>>2]=y[d+24>>2];y[a+4>>2]=y[d+28>>2];ja(d+16|0,y[b+20>>2],c-y[b+16>>2]|0);y[a+8>>2]=y[d+16>>2];y[a+12>>2]=y[d+20>>2];ja(d+8|0,y[b+20>>2],(c-y[b+16>>2]|0)+1|0);y[a+16>>2]=y[d+8>>2];y[a+20>>2]=y[d+12>>2];Y=d+32|0}function xa(a,b){var c=0,d=0;c=na(20);y[c+16>>2]=0;y[c+8>>2]=0;y[c+12>>2]=0;w[c+4|0]=0;y[c>>2]=0;a:{if(a-2147483617>>>0<2147483680|(b|0)<=0){break a}d=a+31&2147483616;if(2147483616/(d>>>0)>>>0>>0){break a}y[c+12>>2]=b;y[c+8>>2]=a;a=d>>>3|0;y[c+16>>2]=a;nb(c,td(a,b))}return c}function Sa(a,b,c){var d=0;if(!c){return y[a+4>>2]==y[b+4>>2]}if((a|0)==(b|0)){return 1}c=y[a+4>>2];a=z[c|0];b=y[b+4>>2];d=z[b|0];a:{if(!a|(d|0)!=(a|0)){break a}while(1){d=z[b+1|0];a=z[c+1|0];if(!a){break a}b=b+1|0;c=c+1|0;if((a|0)==(d|0)){continue}break}}return(a|0)==(d|0)}function Pa(a,b){var c=0,d=0,e=0;a:{c=y[a+4>>2];b:{if(!c){break b}if(!y[b+4>>2]){a=y[a>>2];while(1){if((c|0)<=0){break b}w[a|0]=0;c=c-1|0;a=a+1|0;continue}}e=y[b>>2];d=y[b+4>>2];c=y[a>>2];b=0;if(1&B[a+4>>2]>>0){break a}if(!(b|d)|!d){break b}p(c,e,d)}return}o()}function Ad(a){var b=0,c=0,d=0,e=0,f=0,g=0;d=Y-16|0;Y=d;e=lc();f=e+24|0;g=y[a+28>>2];c=y[a+24>>2];while(1){if((c|0)!=(g|0)){b=y[c>>2];if(b){b=kc(b)}else{b=0}y[d+12>>2]=b;b=d+12|0;Wc(f,b);c=c+4|0;la(b);continue}break}c=Sb(e,a);Sb(c+12|0,a+12|0);Y=d+16|0;return c}function Jb(a,b,c){var d=0;d=Y-32|0;Y=d;ja(d+24|0,y[b+20>>2],c-1|0);y[a>>2]=y[d+24>>2];y[a+4>>2]=y[d+28>>2];ja(d+16|0,y[b+20>>2],c);y[a+8>>2]=y[d+16>>2];y[a+12>>2]=y[d+20>>2];ja(d+8|0,y[b+20>>2],c+1|0);y[a+16>>2]=y[d+8>>2];y[a+20>>2]=y[d+12>>2];Y=d+32|0}function Oc(a,b,c){var d=0;d=y[a+36>>2];if(!d){y[a+24>>2]=c;y[a+16>>2]=b;y[a+36>>2]=1;y[a+20>>2]=y[a+56>>2];return}a:{if(!(y[a+20>>2]!=y[a+56>>2]|y[a+16>>2]!=(b|0))){if(y[a+24>>2]!=2){break a}y[a+24>>2]=c;return}w[a+54|0]=1;y[a+24>>2]=2;y[a+36>>2]=d+1}}function Ra(a){var b=0,c=0,d=0,e=0;b=na(20);y[b+16>>2]=a;w[b|0]=0;c=255;d=y[a>>2];e=y[a+4>>2];a=y[a+8>>2];if(e>>>0>a>>>0){c=z[a+d|0]}w[b+1|0]=c;y[b+4>>2]=((c^-1)&255)<<16;Dc(b);y[b+8>>2]=32768;y[b+4>>2]=y[b+4>>2]<<7;y[b+12>>2]=y[b+12>>2]-7;return b}function Xc(a,b,c){var d=0,e=0;if(b){d=32-b|0;e=c>>>0>>0?c:d;y[a>>2]=y[a>>2]&(-1<>>d-e^-1);c=c-e|0;a=a+4|0}e=c>>>5|0;b=e;d=a;while(1){if(b){y[d>>2]=0;b=b-1|0;d=d+4|0;continue}break}b=c&31;if(b){a=(e<<2)+a|0;y[a>>2]=y[a>>2]&(-1>>>32-b^-1)}}function tb(a,b){var c=0;c=1;a:{if(ra(y[a+4>>2],b)){break a}if(ra(y[a+4>>2],b+4|0)){break a}if(ra(y[a+4>>2],b+8|0)){break a}if(ra(y[a+4>>2],b+12|0)){break a}if(va(y[a+4>>2],b+16|0)|(y[b>>2]>4096|y[b+4>>2]>4096)&z[a+112|0]==1){break a}c=0}return c}function zd(a,b,c){var d=0,e=0;d=na(32);e=y[b+12>>2];y[d+16>>2]=y[b+8>>2];y[d+20>>2]=e;e=y[b+4>>2];y[d+8>>2]=y[b>>2];y[d+12>>2]=e;b=y[c>>2];y[c>>2]=0;y[d>>2]=a;y[d+24>>2]=b;b=y[a+4>>2];y[d+4>>2]=b;y[b>>2]=d;y[a+4>>2]=d;y[a+8>>2]=y[a+8>>2]+1}function Ga(a,b,c){var d=0,e=0,f=0,g=0;d=y[b+8>>2];g=(d|0)>0?d:0;d=0;while(1){a:{if((d|0)==(g|0)){e=0;break a}e=Ma(a,y[y[b+12>>2]+(d<<2)>>2]);if(!(!e|(z[e+4|0]&63)!=53)){if((c|0)==(f|0)){break a}f=f+1|0}d=d+1|0;continue}break}return e}function Ub(a,b){var c=0;y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;a:{if(b){if(b>>>0>=1073741824){break a}c=b<<2;b=na(c);y[a>>2]=b;c=b+c|0;y[a+8>>2]=c;while(1){if((b|0)!=(c|0)){y[b>>2]=0;b=b+4|0;continue}break}y[a+4>>2]=c}return a}Ba();o()}function gb(a,b){var c=0;y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;a:{if(b){if(b>>>0>=1073741824){break a}c=Lb(b);y[a>>2]=c;b=(b<<2)+c|0;y[a+8>>2]=b;while(1){if((b|0)!=(c|0)){y[c>>2]=0;c=c+4|0;continue}break}y[a+4>>2]=b}return a}Ba();o()}function od(a,b){var c=0,d=0;c=Y-16|0;Y=c;y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;y[c+8>>2]=a;if(b){jc(a,b);d=b;b=y[a+4>>2];d=d+b|0;while(1){if((b|0)!=(d|0)){w[b|0]=0;b=b+1|0;continue}break}y[a+4>>2]=d}w[c+12|0]=1;fd(c+8|0);Y=c+16|0}function Kc(a,b){var c=0,d=0,e=0;c=Y-16|0;Y=c;d=z[a+4|0];if((d|0)==255){a=Fb(4);y[a>>2]=5288;P(a|0,5300,2);o()}y[c+4>>2]=c+3;e=y[b+4>>2];y[c+8>>2]=y[b>>2];y[c+12>>2]=e;a=_[y[(c+8|0)+(d<<2)>>2]](c+4|0,a)|0;Y=c+16|0;return a}function qb(){var a=0;a=na(80);x[a+56>>1]=0;y[a+12>>2]=0;y[a+24>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;y[a+36>>2]=0;y[a+40>>2]=0;y[a+44>>2]=0;y[a+48>>2]=0;y[a+60>>2]=0;y[a+64>>2]=0;y[a+68>>2]=0;y[a+72>>2]=0;y[a+76>>2]=0;return a}function Yb(){var a=0;a=na(96);y[a+44>>2]=0;y[a+48>>2]=0;y[a+36>>2]=0;y[a+40>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;y[a+60>>2]=0;y[a+64>>2]=0;y[a+68>>2]=0;y[a+72>>2]=0;y[a+76>>2]=0;y[a+80>>2]=0;y[a+84>>2]=0;y[a+88>>2]=0;return a}function La(a,b,c,d,e){a:{if(!(!d|(b|0)<0|(a|0)<=(b|0))){a=b>>>3|0;b=1<<((b^-1)&7);if(e){if(a>>>0>=d>>>0){break a}a=a+c|0;w[a|0]=b|z[a|0];return}if(a>>>0>=d>>>0){break a}a=a+c|0;w[a|0]=z[a|0]&(b^-1)}return}o()}function id(a){var b=0,c=0,d=0;y[a+56>>2]=2;c=1;b=4;d=y[a+52>>2];a:{b:{if((d|0)==5){break b}if((d|0)>=3){y[a+52>>2]=5;break b}b=yc(a);c=!b;if(y[a+56>>2]==3){break a}y[a+52>>2]=5;b=b?-1:4}y[a+56>>2]=b}return c}function se(a,b,c){var d=0,e=0,f=0,g=0,h=0;e=c>>>16|0;d=a>>>16|0;h=E(e,d);f=c&65535;a=a&65535;g=E(f,a);d=(g>>>16|0)+E(d,f)|0;a=(d&65535)+E(a,e)|0;Z=h+E(b,c)+(d>>>16)+(a>>>16)|0;return g&65535|a<<16}function Ma(a,b){var c=0,d=0;c=y[a>>2];a:{if(c){c=Ma(c,b);if(c){break a}}d=y[a+12>>2];a=y[a+8>>2];while(1){if((a|0)==(d|0)){return 0}c=y[a>>2];a=a+4|0;if(y[c>>2]!=(b|0)){continue}break}}return c}function xd(a){var b=0;a:{if(z[a+16|0]!=3|z[a+17|0]!=255|(z[a+18|0]!=253|z[a+19|0]!=255)){break a}if(z[a+20|0]!=2|z[a+21|0]!=254|(z[a+22|0]!=254|z[a+23|0]!=254)){break a}b=z[a+2|0]^1}return b&1}function Wa(a,b){var c=0,d=0,e=0;a:{c=y[a+8>>2];e=c+1|0;d=y[a+4>>2];if(e>>>0>>0){if(c>>>0>=d>>>0){break a}d=b;b=y[a>>2];x[d>>1]=z[b+c|0]<<8|z[b+e|0];y[a+8>>2]=c+2;a=0}else{a=-1}return a}o()}function Kb(a,b){var c=0;c=y[a+40>>2];y[a+28>>2]=y[a+36>>2];y[a+32>>2]=c;c=y[a+48>>2];b=y[b+16>>2];if(c>>>0>>0){o()}y[a+40>>2]=c;y[a+48>>2]=c-b;c=y[a+44>>2];y[a+36>>2]=c;y[a+44>>2]=b+c}function cd(a,b,c,d,e,f,g,h){return y[c+16>>2]|y[c+12>>2]<<3|y[c+8>>2]<<6|ia(y[y[a+20>>2]+8>>2],w[a+26|0]+(d-y[a+12>>2]|0)|0,e,f)<<8|y[c+4>>2]<<9|y[c>>2]<<10|ia(b,w[a+24|0]+d|0,g,h)<<12}function sa(a,b){var c=0,d=0,e=0;d=Y-16|0;Y=d;e=b<<2;c=y[e+y[a+36>>2]>>2];if(!c){b=nd(na(44),b);c=y[a+36>>2];y[d+12>>2]=0;vb(c+e|0,b);pa(d+12|0);c=y[y[a+36>>2]+e>>2]}Y=d+16|0;return c}function bb(a,b){var c=0;c=y[a>>2];if(c){y[a+4>>2]=c;ma(c);y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0}y[a>>2]=y[b>>2];y[a+4>>2]=y[b+4>>2];y[a+8>>2]=y[b+8>>2];y[b+8>>2]=0;y[b>>2]=0;y[b+4>>2]=0}function Hc(a,b,c){var d=0,e=0;e=((b&536870911)<<3|a>>>29)&-8;d=y[c>>2];a:{while(1){if(B[c>>2]>=e>>>0){break a}if(!Ka(a,b,c)){continue}break}if(y[c>>2]-d>>>0>11){break a}y[c>>2]=d}}function Ed(a,b){var c=0;y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;a:{if(b){if(b>>>0>=536870912){break a}c=yb(b);y[a+4>>2]=c;y[a>>2]=c;y[a+8>>2]=(b<<3)+c;ld(a,b)}return a}Ba();o()}function Jc(a,b){var c=0,d=0,e=0;c=Y-16|0;Y=c;d=z[a+4|0];if((d|0)!=255){e=y[b+4>>2];y[c+8>>2]=y[b>>2];y[c+12>>2]=e;_[y[(c+8|0)+(d<<2)>>2]](c+7|0,a)}w[a+4|0]=255;Y=c+16|0}function Tc(a,b){var c=0;c=Y-16|0;Y=c;y[c+8>>2]=0;a:{if(z[a+4|0]==1){oa(a,b);break a}mb(a);w[a+4|0]=1;y[a>>2]=b}y[c+12>>2]=0;la(c+12|0);la(c+8|0);Y=c+16|0;return a}function Db(a,b){var c=0;if(z[a|0]==1){c=y[a+4>>2];b=se(c,c>>31,b);c=Z;c=!(b- -2147483648>>>0<2147483648?c+1|0:c);b=c?b:0}else{b=0}y[a>>2]=c;y[a+4>>2]=b;return a}function Ac(a,b,c){var d=0,e=0,f=0;d=1;while(1){e=z[a+12|0];if(e>>>0<=(f&255)>>>0){y[c>>2]=(-1<>2]+(d<<3)|0)|d<<1;f=f+1|0;continue}break}}function Hb(a,b,c,d,e,f,g){var h=0,i=0;h=Y-16|0;Y=h;if(qa(a)){i=y[a+12>>2];y[h+8>>2]=y[a+8>>2];y[h+12>>2]=i;y[h>>2]=0;y[h+4>>2]=0;Zc(a,b,c,d,e,f,g,h)}Y=h+16|0}function Cb(a,b,c,d){var e=0;e=Y-16|0;Y=e;y[e+12>>2]=d;d=1;w[e+8|0]=1;a:{if(!z[Na(e+8|0,b>>c)|0]){d=0;w[a|0]=0;break a}y[a>>2]=y[e+12>>2]}w[a+4|0]=d;Y=e+16|0}function qc(a){var b=0;b=y[a+36>>2];y[a+36>>2]=0;if(b){ma(Ja(b))}Ea(a+32|0);Ea(a+28|0);Ea(a+24|0);Ea(a+20|0);Ea(a+16|0);Ea(a+12|0);Ea(a+8|0);Ea(a+4|0);Ea(a)}function Qa(a,b){var c=0,d=0;c=Y-16|0;Y=c;Da(c+8|0,a);d=0-b|0;a=y[c+12>>2];b=y[c+8>>2];while(1){if((a|0)>0){w[b|0]=d;a=a-1|0;b=b+1|0;continue}break}Y=c+16|0}function md(a,b){var c=0;y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;if(b>>>0>=1073741824){Ba();o()}c=Lb(b);y[a+4>>2]=c;y[a>>2]=c;y[a+8>>2]=(b<<2)+c;kd(a,b);return a}function pb(a,b){var c=0;c=y[a+4>>2];if(b){c=c+1|0;y[a+4>>2]=c}b=y[a+12>>2]-y[a+8>>2]>>3;if(b>>>0<=c>>>0){b=b+16|0;ad(a+8|0,b);Gb(a+20|0,b);Gb(a+32|0,b)}}function jc(a,b){var c=0;a:{if((b|0)>=0){if(b>>>0>2147479550){break a}c=Ya(b);if(!c){break a}y[a+4>>2]=c;y[a>>2]=c;y[a+8>>2]=b+c;return}Ba();o()}rb();o()}function _c(a,b){var c=0;a:{if(!z[a+4|0]){c=y[b>>2];if((c|0)==y[a>>2]){break a}y[b>>2]=0;y[a>>2]=c;return}ub(a);c=y[b>>2];y[b>>2]=0;w[a+4|0]=0;y[a>>2]=c}}function Ud(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(Sa(a,y[b+8>>2],f)){Pc(b,c,d,e);return}a=y[a+8>>2];_[y[y[a>>2]+20>>2]](a,b,c,d,e,f)}function Eb(a,b,c){a:{switch(a|0){case 1:return b&c;case 2:return b^c;case 3:return b^c^-1;default:o();case 0:b=b|c;break;case 4:break a}}return b}function wc(a){var b=0,c=0,d=0;c=E(z[a+1|0],y[a+4>>2]+1|0);if(c>>>0<=65535){d=z[a+2|0];b=qb();a=z[a|0];y[b+8>>2]=d;y[b+4>>2]=c;w[b|0]=a}return b}function Tb(a){var b=0,c=0,d=0;a:{if(z[a|0]!=1){break a}b=y[a+4>>2];if((b|0)<0){break a}c=b>>>0<1073741824;d=b<<1}y[a>>2]=c;y[a+4>>2]=d;return a}function Vc(a,b,c){var d=0;if(!(b&1)|z[a|0]!=1){b=0;c=0}else{b=y[a+4>>2];d=b;b=b+c|0;c=((d^b)&(b^c))>=0;b=c?b:0}y[a>>2]=c;y[a+4>>2]=b;return a}function ld(a,b){var c=0;c=y[a+4>>2];b=c+(b<<3)|0;while(1){if((b|0)==(c|0)){y[a+4>>2]=b}else{y[c>>2]=0;y[c+4>>2]=0;c=c+8|0;continue}break}}function fe(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=y[a+4>>2];a=y[a+8>>2];b=(a>>1)+b|0;c=y[c>>2];if(a&1){d=y[d+y[b>>2]>>2]}return _[d|0](b,c)|0}function Da(a,b){var c=0,d=0;d=Nb(b);a:{c=y[b+16>>2];if((c|0)>=0){b=y[b+12>>2];b=se(b,b>>31,c);if(!Z){break a}}o()}y[a+4>>2]=b;y[a>>2]=d}function Sd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(y[a+4>>2]==y[y[b+8>>2]+4>>2]){Oc(b,c,d);return}a=y[a+8>>2];_[y[y[a>>2]+28>>2]](a,b,c,d)}function vd(a,b,c,d){if(b>>>0<=d>>>0){b=(b<<2)+a|0;while(1){if((a|0)!=(b|0)){y[c>>2]=y[a>>2];c=c+4|0;a=a+4|0;continue}break}return}o()}function ia(a,b,c,d){a:{if(!d|(b|0)<0|(a|0)<=(b|0)){a=0}else{a=b>>>3|0;if(a>>>0>=d>>>0){break a}a=z[a+c|0]>>>((b^-1)&7)&1}return a}o()}function wb(a,b){var c=0,d=0;d=y[a>>2];c=y[a+8>>2];if(c>>>0>2]){y[b>>2]=z[d+c|0]>>>7-y[a+12>>2]&1;_b(a);a=0}else{a=-1}return a}function Yc(a,b){var c=0,d=0;if(z[a|0]==1){c=y[a+4>>2];d=c-b|0;c=((c^d)&(b^c))>=0;b=c?d:0}else{b=0;c=0}y[a>>2]=c;y[a+4>>2]=b;return a}function Na(a,b){var c=0,d=0;if(z[a|0]==1){c=y[a+4>>2];d=c+b|0;c=((d^c)&(b^d))>=0;b=c?d:0}else{b=0;c=0}y[a>>2]=c;y[a+4>>2]=b;return a}function nb(a,b){var c=0;c=Y-16|0;Y=c;a:{if(z[a+4|0]==1){rc(a,b);break a}ub(a);w[a+4|0]=1;y[a>>2]=b}y[c+12>>2]=0;Ha(c+12|0);Y=c+16|0}function $a(a){var b=0,c=0;b=y[a>>2];if(b){c=y[a+4>>2];while(1){if((c|0)!=(b|0)){c=la(c-4|0);continue}break}y[a+4>>2]=b;ma(y[a>>2])}}function va(a,b){var c=0,d=0;d=y[a>>2];c=y[a+8>>2];if(c>>>0>2]){w[b|0]=z[d+c|0];y[a+8>>2]=y[a+8>>2]+1;a=0}else{a=-1}return a}function re(){var a=0,b=0,c=0;while(1){b=a<<4;c=b+6080|0;y[b+6084>>2]=c;y[b+6088>>2]=c;a=a+1|0;if((a|0)!=64){continue}break}Fd(48)}function Sc(a){a=a|0;var b=0,c=0,d=0;y[a>>2]=5828;b=y[a+4>>2];c=b-4|0;d=y[c>>2]-1|0;y[c>>2]=d;if((d|0)<0){ma(b-12|0)}return a|0}function kd(a,b){var c=0;c=y[a+4>>2];b=c+(b<<2)|0;while(1){if((b|0)==(c|0)){y[a+4>>2]=b}else{y[c>>2]=0;c=c+4|0;continue}break}}function Ca(a,b,c){var d=0;d=Y-16|0;Y=d;ja(d+8|0,b,c);b=y[d+8>>2];if(b&3){o()}c=y[d+12>>2];y[a>>2]=b;y[a+4>>2]=c>>>2;Y=d+16|0}function Ec(a,b,c){var d=0;d=y[a+4>>2];while(1){if((b|0)!=(c|0)){w[d|0]=z[b|0];d=d+1|0;b=b+1|0;continue}break}y[a+4>>2]=d}function Pb(a,b,c,d){a:{if((d|0)>=0){d=c+d|0;c=d>>>5|0;break a}d=c+d|0;c=(d-31|0)/32|0}y[a+4>>2]=d&31;y[a>>2]=(c<<2)+b}function Ka(a,b,c){var d=0;d=c;c=y[c>>2];y[d>>2]=c+1;d=b;b=c>>>3|0;if(d>>>0<=b>>>0){o()}return z[a+b|0]>>>((c^-1)&7)&1}function ta(a){var b=0,c=0;if(y[a+12>>2]){b=y[a+8>>2]+1|0;if(b){c=y[a+4>>2];y[a+8>>2]=b>>>0>>0?b:c}y[a+12>>2]=0}}function yd(a,b){var c=0;c=se(b,0,a);if(Z|c>>>0>2147479550){a=0}else{b=E(a,b);a=Ya(b);if(b?a:0){t(a,0,b)}}return a}function ib(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){pa(c+68|0);la(c- -64|0);Zb(c+60|0);Za(c+56|0);Ja(c+12|0);ma(c)}}function Bc(a,b,c){if(c>>>0>=536870912){Ba();o()}a=b-a|0;b=a>>2;return a>>>0>=2147483640?536870911:b>>>0>c>>>0?b:c}function pd(a,b){jd(a);y[a>>2]=y[b>>2];y[a+4>>2]=y[b+4>>2];y[a+8>>2]=y[b+8>>2];y[b+8>>2]=0;y[b>>2]=0;y[b+4>>2]=0}function gd(a){var b=0;a:{b=a;a=y[a+16>>2];if((b|0)==(a|0)){b=16}else{if(!a){break a}b=20}_[y[b+y[a>>2]>>2]](a)}}function Vb(a,b){var c=0;c=y[a+52>>2];if((c|0)==3){if(A[a+56>>1]!=1){y[a+52>>2]=-1;return-1}c=hd(a,b)}return c}function ie(a){a=a|0;var b=0,c=0;b=na(12);y[b>>2]=2600;c=y[a+8>>2];y[b+4>>2]=y[a+4>>2];y[b+8>>2]=c;return b|0}function _b(a){var b=0;b=y[a+12>>2];a:{if((b|0)==7){y[a+8>>2]=y[a+8>>2]+1;b=0;break a}b=b+1|0}y[a+12>>2]=b}function _a(a){var b=0,c=0;b=y[a+4>>2];if(!b){o()}c=y[a>>2];y[a>>2]=c+4;y[a+4>>2]=b-1;return y[c>>2]}function Uc(a,b){a:{b:{if(!z[a+4|0]){if(y[a>>2]!=(b|0)){break b}break a}mb(a);w[a+4|0]=0}y[a>>2]=b}}function Od(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(Sa(a,y[b+8>>2],f)){Pc(b,c,d,e)}}function gc(a){var b=0,c=0;b=y[a+4>>2];if(!b){o()}c=y[a>>2];y[a>>2]=c+4;y[a+4>>2]=b-1;return c}function he(a,b){a=a|0;b=b|0;var c=0;y[b>>2]=2600;c=y[a+8>>2];y[b+4>>2]=y[a+4>>2];y[b+8>>2]=c}function rd(a,b){var c=0;c=Y-16|0;Y=c;y[c+12>>2]=b;b=a+24|0;a=c+12|0;Wc(b,a);la(a);Y=c+16|0}function jd(a){var b=0;b=y[a>>2];if(b){y[a+4>>2]=b;ma(b);y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0}}function Cc(a){var b=0,c=0;b=y[a+8>>2]+1|0;if(b){c=a;a=y[a+4>>2];y[c+8>>2]=a>>>0>b>>>0?b:a}}function tc(a,b,c,d,e,f,g,h){a:{if(!qa(a)){break a}if(!qa(f)){break a}Zc(f,a,b,c,d,e,h,g)}}function vb(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){ya(c+32|0);ya(c+20|0);ya(c+8|0);ma(c)}}function te(a,b){var c=0,d=0;c=b&31;d=(-1<>>c|0;c=a;a=0-b&31;return d|(c&-1>>>a)<>2]==y[y[b+8>>2]+4>>2]){Oc(b,c,d)}}function Jd(a){a=a|0;var b=0;b=y[a+60>>2];a=y[a+48>>2]+7>>>3|0;return(a>>>0>b>>>0?b:a)|0}function Ic(a,b){b=b-a|0;while(1){if((b|0)>0){w[a|0]=255;b=b-1|0;a=a+1|0;continue}break}}function Rb(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){$a(c+24|0);Ja(c+12|0);ma(Ja(c))}}function Fa(){var a=0;a=na(12);y[a+8>>2]=0;y[a>>2]=0;y[a+4>>2]=0;kb(a,512);return a}function Nc(a){a=a|0;y[a+36>>2]=0;y[a+40>>2]=0;ya(a+76|0);ya(a- -64|0);return a|0}function td(a,b){if(4294967295/(b>>>0)>>>0<=a>>>0){rb();o()}return ab(E(a,b),1)}function Lc(a,b){var c=0;return(z[a+16|0]!=(b|0)|z[a+17|0]!=255?c:z[a+2|0]^1)&1}function pc(a){var b=0;b=y[a>>2];y[a>>2]=0;if(b){ya(b+40|0);ya(b+28|0);ma(b)}}function Id(a){a=a|0;Ic(y[a+76>>2],y[a+80>>2]);y[a+48>>2]=0;return 1}function Xb(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){$a(c+4|0);ma(c)}}function Ja(a){var b=0;b=y[a>>2];if(b){y[a+4>>2]=b;ma(b)}return a}function oa(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){ub(c);ma(c)}}function $b(a){var b=0;b=y[a>>2];y[a>>2]=0;if(b){ma(b)}return a}function vc(a){var b=0;b=na(16);y[b>>2]=a;gb(b+4|0,a);return b}function ee(a,b){a=a|0;b=b|0;return(y[b+4>>2]==2888?a+4|0:0)|0}function Lb(a){if(a>>>0>=1073741824){jb();o()}return na(a<<2)}function yb(a){if(a>>>0>=536870912){jb();o()}return na(a<<3)}function jb(){var a=0;a=Fb(4);y[a>>2]=5724;P(a|0,5780,2);o()}function Ea(a){var b=0;b=y[a>>2];y[a>>2]=0;if(b){ma(Ja(b))}}function na(a){a=Ya(a>>>0<=1?1:a);if(!a){Qc();o()}return a}function ya(a){var b=0;b=y[a>>2];if(b){y[a+4>>2]=b;ma(b)}}function Va(a,b){var c=0;c=y[a>>2];y[a>>2]=b;if(c){ma(c)}}function fb(a,b,c,d,e,f,g){if(qa(a)){Hb(f,a,b,c,d,e,g)}}function Ua(a){var b=0;b=y[a>>2];y[a>>2]=0;if(b){ma(b)}}function ue(a){if(a){return 31-H(a-1^a)|0}return 32} +function db(){var a=0;a=na(28);y[a+20>>2]=0;return a}function ab(a,b){a=yd(a,b);if(!a){rb();o()}return a}function rc(a,b){var c=0;c=y[a>>2];y[a>>2]=b;ma(c)}function qd(a){var b=0;b=na(4);y[b>>2]=a;return b}function lc(){var a=0;a=na(36);t(a,0,36);return a}function rb(){y[(Y-16|0)+12>>2]=6036;sc();o()}function Wd(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function Oa(a,b,c,d){return(Eb(a,b,c)^c)&d^c}function Mb(a,b){a=a|0;b=b|0;return y[b>>2]}function ge(a){a=a|0;_[y[y[a>>2]+4>>2]](a)}function fd(a){if(!z[a+4|0]){ya(y[a>>2])}}function Zd(a){a=a|0;T();S(a+128|0);o()}function Ob(a){a=y[a>>2];if(a){ma(a)}}function Md(a){a=a|0;return y[a+4>>2]}function Gd(a){a=a|0;return Ya(a)|0}function Fb(a){return Ya(a|80)+80|0}function wa(a){return nd(na(44),a)}function ce(a,b){a=a|0;b=b|0;Ha(b)}function be(a,b){a=a|0;b=b|0;la(b)}function qa(a){return(Nb(a)|0)!=0}function fc(a){return(Xa(a)|0)!=0}function de(a){a=a|0;return 2868}function Yd(a){a=a|0;return 4890}function Xd(a){a=a|0;return 4864}function Xa(a){return Kc(a,4944)}function Nd(a){a=a|0;return 4913}function Nb(a){return Kc(a,2416)}function xb(a){a=a|0;return a|0}function pa(a){vb(a,0);return a}function oc(a){Za(a+24|0);ma(a)}function la(a){oa(a,0);return a}function ac(a){ib(a,0);return a}function Ab(a){zb(a,0);return a}function Mc(a){a=a|0;ma(Sc(a))}function Kd(a){a=a|0;ma(Nc(a))}function wd(a){return Lc(a,3)}function _d(a){a=a|0;sc();o()}function Qb(a){return Lc(a,2)}function $c(a,b){a=a|0;b=b|0}function Ta(a){a=a|0;ma(a)}function ub(a){Jc(a,4856)}function mb(a){Jc(a,4936)}function ua(a){Va(a,0)}function Zb(a){Xb(a,0)}function Za(a){Rb(a,0)}function Qc(){sc();o()}function Ha(a){rc(a,0)}function sc(){U();o()}function hc(a){a=a|0} +// EMSCRIPTEN_END_FUNCS +a=z;m(n);var _=[null,Sc,xb,qe,pe,oe,ne,me,le,ke,je,xb,Nc,Kd,Jd,Id,Hd,Mb,Mb,xb,Ta,ie,he,hc,ge,fe,ee,de,$c,ce,$c,be,Mb,Mb,Zd,_d,Ta,Yd,Ta,Xd,xb,Ta,hc,hc,Wd,Ta,Qd,Ta,Nd,Mc,Md,Mc,Ta,Vd,Od,Pd,Rd,Ta,Ud,Td,Sd];function $(){return v.byteLength>>16}function ea(fa){fa=fa|0;var aa=$()|0;var ba=aa+fa|0;if(aa{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst,mod))})})}wasmBinaryFile??=findWasmBinary();var result=instantiateSync(wasmBinaryFile,info);return receiveInstance(result[0])}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var HEAP16;var HEAP32;var HEAP8;var HEAPF32;var HEAPF64;var HEAPU16;var HEAPU32;var HEAPU8;var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>2]=type}get_type(){return HEAPU32[this.ptr+4>>2]}set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>2]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12]=caught}get_caught(){return HEAP8[this.ptr+12]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13]=rethrown}get_rethrown(){return HEAP8[this.ptr+13]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}}var uncaughtExceptionCount=0;var ___cxa_throw=(ptr,type,destructor)=>{var info=new ExceptionInfo(ptr);info.init(type,destructor);uncaughtExceptionCount++;abort()};var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{return func()}catch(e){handleException(e)}finally{maybeExit()}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};function _createImageData(size){Module.imageData=new Uint8Array(size)}var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};function _setImageData(array_ptr,pitch8,pitch32,height){if(pitch32===pitch8){Module.imageData=new Uint8ClampedArray(HEAPU8.subarray(array_ptr,array_ptr+pitch32*height));return}const destSize=pitch8*height;const imageData=Module.imageData=new Uint8ClampedArray(destSize);for(let srcStart=array_ptr,destStart=0;destStart{HEAP8.set(array,buffer)};{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}Module["writeArrayToMemory"]=writeArrayToMemory;var _malloc,_free,_jbig2_decode,_ccitt_decode,__emscripten_timeout,memory,__indirect_function_table,wasmMemory;function assignWasmExports(wasmExports){_malloc=Module["_malloc"]=wasmExports["l"];_free=Module["_free"]=wasmExports["m"];_jbig2_decode=Module["_jbig2_decode"]=wasmExports["n"];_ccitt_decode=Module["_ccitt_decode"]=wasmExports["o"];__emscripten_timeout=wasmExports["p"];memory=wasmMemory=wasmExports["j"];__indirect_function_table=wasmExports["__indirect_function_table"]}var wasmImports={a:___cxa_throw,f:__abort_js,e:__emscripten_runtime_keepalive_clear,b:__setitimer_js,h:_createImageData,c:_emscripten_resize_heap,d:_proc_exit,i:_setImageData,g:_setLineData};function run(){preRun();function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve?.(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}var wasmExports;wasmExports=createWasm();run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})} +;return moduleRtn}export default JBig2; diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/wasm/openjpeg_nowasm_fallback.js webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/openjpeg_nowasm_fallback.js --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/wasm/openjpeg_nowasm_fallback.js 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/openjpeg_nowasm_fallback.js 2026-07-09 07:12:41.869084800 +0000 @@ -0,0 +1,17 @@ +/* THIS FILE IS GENERATED - DO NOT EDIT */ +async function OpenJPEG(moduleArg={}){var moduleRtn;var Module=moduleArg;var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=import.meta.url;var scriptDirectory="";var readAsync;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{readAsync=async url=>{var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var WebAssembly={Memory:function(opts){this.buffer=new ArrayBuffer(opts["initial"]*65536)},Module:function(binary){},Instance:function(module,info){this.exports=( +// EMSCRIPTEN_START_ASM +function instantiate(Aa){var a;var b=new Uint8Array(123);for(var c=25;c>=0;--c){b[48+c]=52+c;b[65+c]=c;b[97+c]=26+c}b[43]=62;b[47]=63;function i(j,k,l){var d,e,c=0,f=k,g=l.length,h=k+(g*3>>2)-(l[g-2]=="=")-(l[g-1]=="=");for(;c>4;if(f>2;if(f>>0;A=A>>>0;if(z+A>a.length)throw"trap: invalid memory.fill";a.fill(v,z,z+A)}function B(z,C,A){a.copyWithin(z,C,C+A)}function D(){throw new Error("abort")}function za(n){var E=new ArrayBuffer(16777216);var F=new Int8Array(E);var G=new Int16Array(E);var H=new Int32Array(E);var I=new Uint8Array(E);var J=new Uint16Array(E);var K=new Uint32Array(E);var L=new Float32Array(E);var M=new Float64Array(E);var N=Math.imul;var O=Math.fround;var P=Math.abs;var Q=Math.clz32;var R=Math.min;var S=Math.max;var T=Math.floor;var U=Math.ceil;var V=Math.trunc;var W=Math.sqrt;var X=n.a;var Y=X.a;var Z=X.b;var _=X.c;var $=X.d;var aa=X.e;var ba=X.f;var ca=X.g;var da=X.h;var ea=X.i;var fa=X.j;var ga=X.k;var ha=X.l;var ia=X.m;var ja=X.n;var ka=X.o;var la=X.p;var ma=X.q;var na=94240;var oa=0;var pa=0;var qa=0; +// EMSCRIPTEN_START_FUNCS +function Zc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,M=0,P=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=O(0),ha=0,ia=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,qa=0,sa=0,ta=0,ua=0,va=0,wa=0;Y=na-96|0;na=Y;C=H[a+8>>2];a:{b:{c:{if(!H[a>>2]){g=N(H[C+16>>2]-H[C+8>>2]|0,H[C+20>>2]-H[C+12>>2]|0)<<2;c=Ia(g);H[C+60>>2]=c;if(!c){Ba(H[a+32>>2],1,8023,0);d=a+28|0;break b}if(!g){break c}y(c,0,g);break c}c=H[C+60>>2];if(!c){break c}Ca(c);H[C+60>>2]=0}if(!H[H[a+28>>2]>>2]){break a}oa=H[a+16>>2];c=H[oa+28>>2]+N(H[oa+24>>2],152)|0;va=H[c-152>>2];wa=H[c-144>>2];pa=H[a+20>>2];qa=H[a+12>>2];ua=H[a+4>>2];d=a+28|0;d:{q=H[b+4>>2];f=0;e:{if((q|0)<=0){break e}k=H[b>>2];c=0;f:{while(1){g=k+N(c,12)|0;if(!H[g>>2]){break f}c=c+1|0;if((q|0)!=(c|0)){continue}break}f=0;break e}f=H[g+4>>2]}if(f){break d}f=Ea(1,156);if(!f){Ba(H[a+32>>2],1,6313,0);break b}H[f+140>>2]=0;c=0;k=H[b+4>>2];g:{if((k|0)==2147483647){break g}g=H[b>>2];if((k|0)>0){while(1){q=g+N(c,12)|0;if(!H[q>>2]){k=H[q+8>>2];if(k){ra[k|0](H[q+4>>2]);g=H[b>>2]}b=g+N(c,12)|0;H[b+8>>2]=15;H[b+4>>2]=f;c=1;break g}c=c+1|0;if((k|0)!=(c|0)){continue}break}}g=Ha(g,N(k,12)+12|0);c=0;if(!g){break g}H[b>>2]=g;c=H[b+4>>2];g=g+N(c,12)|0;H[g+8>>2]=15;H[g+4>>2]=f;H[g>>2]=0;H[b+4>>2]=c+1;c=1}if(c){break d}Ba(H[a+32>>2],1,8338,0);b=H[f+116>>2];if(b){Ca(b);H[f+116>>2]=0}b=H[f+120>>2];if(b){Ca(b);H[f+120>>2]=0}Ca(H[f+148>>2]);Ca(f);break b}H[f+144>>2]=H[a+24>>2];E=H[a+40>>2];_=H[a+36>>2];S=H[a+32>>2];j=H[pa+808>>2];b=H[qa+16>>2];h:{V=H[pa+16>>2];i:{if(V&64){k=na-304|0;na=k;j:{if(j){if(_){Ba(S,1,3219,0);break j}Ba(S,1,3219,0);break j}i=H[f+116>>2];c=H[C+20>>2]-H[C+12>>2]|0;b=H[C+16>>2]-H[C+8>>2]|0;g=N(c,b);k:{l:{if(g>>>0>K[f+132>>2]){Ca(i);j=g<<2;i=Ia(j);H[f+116>>2]=i;if(!i){i=0;break j}H[f+132>>2]=g;break l}if(!i){break k}j=g<<2}if(!j){break k}y(i,0,j)}i=H[f+120>>2];m:{if(K[f+136>>2]>2639){break m}Ca(i);i=Ia(10560);H[f+120>>2]=i;if(i){break m}i=0;break j}H[f+136>>2]=2640;y(i,0,10560);H[f+128>>2]=c;H[f+124>>2]=b;n=H[C+24>>2];if(!n){i=1;break j}q=H[C+28>>2];i=1;n:{o:{p:{q:{j=H[C+52>>2];r:{if(j){g=j&3;c=H[C+4>>2];i=0;s:{if(j>>>0>=4){b=j&-4;while(1){o=c+(i<<3)|0;h=H[o+28>>2]+(H[o+20>>2]+(H[o+12>>2]+(H[o+4>>2]+h|0)|0)|0)|0;i=i+4|0;z=z+4|0;if((b|0)!=(z|0)){continue}break}if(!g){break s}}while(1){h=H[(c+(i<<3)|0)+4>>2]+h|0;i=i+1|0;l=l+1|0;if((g|0)!=(l|0)){continue}break}}if(!H[f+144>>2]&(j|0)==1){break o}if(K[f+152>>2]>=h>>>0){break r}z=Ha(H[f+148>>2],h);if(z){break q}i=0;break j}if(!H[f+144>>2]){break j}}z=H[f+148>>2];if(z){break p}i=0;break j}H[f+152>>2]=h;H[f+148>>2]=z}if(!H[C+52>>2]){h=0;break n}j=H[C+4>>2];h=0;i=0;while(1){g=i<<3;c=g+j|0;b=H[c+4>>2];if(b){B(h+z|0,H[c>>2],b)}j=H[C+4>>2];h=H[(g+j|0)+4>>2]+h|0;i=i+1|0;if(i>>>0>2]){continue}break}break n}z=H[H[C+4>>2]>>2]}i=0;j=0;c=H[C+40>>2];g=0;t:{if(!c){break t}b=H[C>>2];j=H[b+8>>2];g=0;if((c|0)==1){break t}g=H[b+32>>2]}c=n-q|0;j=g+j|0;u:{if(!j){l=0;break u}i=1;b=H[C>>2];p=H[b>>2];l=0;if((j|0)==1){i=0;break u}l=H[b+24>>2]}P=c+1|0;ha=H[f+116>>2];s=H[f+120>>2];X=H[C+12>>2];x=H[C+20>>2];ca=H[C+8>>2];D=H[C+16>>2];v:{w:{x:{y:{z:{A:{B:{C:{if(!(!i|l)){if(!_){break C}Ba(S,2,10806,0);j=1;break B}if(j>>>0<4){break B}if(_){H[k+112>>2]=j;Ba(S,1,9590,k+112|0);break v}H[k+96>>2]=j;Ba(S,1,9590,k+96|0);i=0;break j}Ba(S,2,10806,0);i=H[C+24>>2];if(i>>>0>30){break A}e=1;if(i>>>0>=P>>>0){break y}break w}i=H[C+24>>2];if(i>>>0<=30){break z}if(!_){break A}H[k+32>>2]=H[C+24>>2];Ba(S,1,12302,k+32|0);break v}H[k>>2]=i;Ba(S,1,12302,k);i=0;break j}if(i>>>0

>>0){break x}if(j>>>0<2){e=j;break y}if((i|0)!=(P|0)){e=j;break y}e=1;if(I[26384]){break y}if(!_){F[26384]=1;H[k+64>>2]=j;Ba(S,2,10299,k- -64|0);break y}if(!I[26384]){F[26384]=1;H[k+80>>2]=j;Ba(S,2,10299,k+80|0)}}if(!(!(p>>>0<2|h>>>0

>>0)&l+p>>>0<=h>>>0)){if(_){i=0;Ba(S,1,9532,0);break j}i=0;Ba(S,1,9532,0);break j}U=p+z|0;b=I[U-1|0];i=b<<4|I[U-2|0]&15;if(!(!(i>>>0<2|(b|0)==255)&(i|0)<=(p|0))){if(_){i=0;Ba(S,1,15305,0);break j}i=0;Ba(S,1,15305,0);break j}sa=H[C+28>>2];H[k+272>>2]=0;H[k+280>>2]=0;H[k+264>>2]=0;H[k+268>>2]=0;H[k+296>>2]=0;H[k+300>>2]=0;H[k+284>>2]=0;H[k+288>>2]=0;b=i-1|0;H[k+276>>2]=b;o=(p+z|0)-i|0;H[k+256>>2]=o;q=I[o|0];c=8;H[k+272>>2]=8;j=o+1|0;H[k+256>>2]=j;g=i-2|0;H[k+276>>2]=g;n=(b|0)==1?q|15:q;b=0;q=b;H[k+264>>2]=n;H[k+268>>2]=b;H[k+280>>2]=!b&(n|0)==255;u=o&3;D:{E:{if((u|0)==3){break E}v=0;if(!((n|0)!=255|(b|0)!=0|I[j|0]<=143)){break D}b=255;b=i>>>0>=3?I[j|0]:b;h=i-3|0;H[k+276>>2]=h;o=!q&(n|0)==255;c=o?15:16;H[k+272>>2]=c;R=j+(i>>>0>2)|0;H[k+256>>2]=R;b=(g|0)==1?b|15:b;g=0;H[k+280>>2]=!g&(b|0)==255;g=b;j=n;b=o?7:8;o=b&31;if((b&63)>>>0>=32){m=j<>>32-o|q<>2]=n;H[k+268>>2]=b;if((u|0)==2){break E}o=255;v=0;if(!((g|0)!=255|(r|0)!=0|I[R|0]<=143)){break D}o=i>>>0>=4?I[R|0]:o;j=i-4|0;H[k+276>>2]=j;R=R+(i>>>0>3)|0;H[k+256>>2]=R;b=(h|0)==1?o|15:o;o=0;m=o;H[k+280>>2]=!m&(b|0)==255;o=!r&(g|0)==255;c=(o?7:8)+c|0;H[k+272>>2]=c;g=b;h=n;b=o?7:8;r=b&31;if((b&63)>>>0>=32){o=h<>>32-r|q<>2]=n;H[k+268>>2]=b;if((u|0)==1){break E}v=0;if(!((g|0)!=255|(m|0)!=0|I[R|0]<=143)){break D}b=255;b=i>>>0>=5?I[R|0]:b;H[k+276>>2]=i-5;H[k+256>>2]=R+(i>>>0>4);o=0;b=(j|0)==1?b|15:b;H[k+280>>2]=1&(b|0)==255;g=!m&(g|0)==255;c=(g?7:8)+c|0;H[k+272>>2]=c;j=n;g=g?7:8;h=g&31;if((g&63)>>>0>=32){E=j<>>32-h|q<>2]=n;H[k+268>>2]=b}b=n;c=64-c|0;g=c&31;if((c&63)>>>0>=32){w=b<>>32-g|q<>2]=b;H[k+268>>2]=w;v=1}if(!v){if(_){i=0;Ba(S,1,11470,0);break j}i=0;Ba(S,1,11470,0);break j}A=D-ca|0;o=0;m=i;r=i-2|0;H[k+244>>2]=r;c=p+z|0;b=c-3|0;H[k+224>>2]=b;g=I[c-2|0];c=g>>>0>143;H[k+248>>2]=c;q=0;n=g>>>4|0;H[k+232>>2]=n;H[k+236>>2]=0;h=(n&7)==7?3:4;H[k+240>>2]=h;g=(b&3)+1|0;R=g>>>0>>0?g:r;F:{G:{if(r){while(1){i=c;u=b;b=b-1|0;H[k+224>>2]=b;g=I[u|0];c=g>>>0>143;H[k+248>>2]=c;j=h&31;if((h&63)>>>0>=32){E=g<>>32-j;j=g<>2]=n;q=q|E;H[k+236>>2]=q;h=(i&1?(g&127)==127?7:8:8)+h|0;H[k+240>>2]=h;o=o+1|0;if((R|0)!=(o|0)){continue}break}j=r-R|0;H[k+244>>2]=j;if(h>>>0>32){break F}if((j|0)>=4){o=H[u-4>>2];H[k+224>>2]=u-5;H[k+244>>2]=j-4;break G}if((j|0)<=0){o=0;break G}H:{if((R|0)==(m-3|0)){i=24;o=0;break H}E=j&1;r=j&2147483646;i=24;o=0;g=0;while(1){u=b-1|0;H[k+224>>2]=u;R=I[b|0];b=b-2|0;H[k+224>>2]=b;H[k+244>>2]=j-1;u=I[u|0];j=j-2|0;H[k+244>>2]=j;o=R<>2]=b-1;b=I[b|0];H[k+244>>2]=j-1;o=b<>2]=r-R}u=o&255;H[k+248>>2]=u>>>0>143;g=c?(o&2130706432)==2130706432?7:8:8;c=g+(o>>>0<=2415919103?8:(o&8323072)==8323072?7:8)|0;i=o>>>16&255;b=c+(i>>>0<=143?8:(o&32512)==32512?7:8)|0;j=o>>>8&255;H[k+240>>2]=b+((j>>>0<=143?8:(o&127)==127?7:8)+h|0);b=i<>>24|j<>>0>=32){o=b<>>32-c;b=b<>2]=b|n;H[k+236>>2]=o|q}Zb(k+192|0,z,p-m|0,255);b=0;I:{if(e>>>0<2){break I}Zb(k+160|0,U,l,0);b=0;if((e|0)==2){break I}n=0;q=0;o=0;H[k+152>>2]=1;H[k+144>>2]=0;H[k+136>>2]=0;H[k+140>>2]=0;c=l;i=c-1|0;H[k+148>>2]=i;b=(p+z|0)+c|0;g=b-1|0;H[k+128>>2]=g;R=g&3;J:{if((c|0)<=0){b=g;break J}b=b-2|0;H[k+128>>2]=b;n=I[g|0]}H[k+136>>2]=n;H[k+140>>2]=0;p=n>>>0>143;H[k+152>>2]=p;l=(n&127)==127?7:8;H[k+144>>2]=l;K:{if(!R){break K}u=c-2|0;H[k+148>>2]=u;L:{if((c|0)<2){g=b;break L}g=b-1|0;H[k+128>>2]=g;o=I[b|0]}p=o>>>0>143;H[k+152>>2]=p;b=l&31;if((l&63)>>>0>=32){m=o<>>32-b;b=o<>2]=q;H[k+140>>2]=m;l=(n>>>0<=143?8:(o&127)==127?7:8)+l|0;H[k+144>>2]=l;if((R|0)==1){b=g;n=q;q=m;c=i;i=u;break K}h=c-3|0;H[k+148>>2]=h;M:{if((c|0)<3){j=g;break M}j=g-1|0;H[k+128>>2]=j;aa=I[g|0]}p=aa>>>0>143;H[k+152>>2]=p;b=l&31;if((l&63)>>>0>=32){E=aa<>>32-b;b=aa<>2]=n;H[k+140>>2]=b;l=(o>>>0<=143?8:(aa&127)==127?7:8)+l|0;H[k+144>>2]=l;if((R|0)==2){b=j;c=u;i=h;break K}i=c-4|0;H[k+148>>2]=i;o=0;N:{if((c|0)<4){b=j;break N}b=j-1|0;H[k+128>>2]=b;o=I[j|0]}p=o>>>0>143;H[k+152>>2]=p;c=l&31;if((l&63)>>>0>=32){w=o<>>32-c;c=o<>2]=n;H[k+140>>2]=c;l=(aa>>>0<=143?8:(o&127)==127?7:8)+l|0;H[k+144>>2]=l;c=h}if(l>>>0<=32){O:{if((c|0)>=5){g=H[b-3>>2];H[k+148>>2]=c-5;H[k+128>>2]=b-4;break O}g=0;if((c|0)<2){break O}c=24;while(1){j=b-1|0;H[k+128>>2]=j;b=I[b|0];o=i-1|0;H[k+148>>2]=o;g=b<>>0>1;b=j;c=c-8|0;i=o;if(h){continue}break}}h=g&255;H[k+152>>2]=h>>>0>143;i=p?(g&2130706432)==2130706432?7:8:8;c=i+(g>>>0<=2415919103?8:(g&8323072)==8323072?7:8)|0;o=g>>>16&255;b=c+(o>>>0<=143?8:(g&32512)==32512?7:8)|0;j=g>>>8&255;H[k+144>>2]=b+((j>>>0<=143?8:(g&127)==127?7:8)+l|0);b=o<>>24|j<>>0>=32){m=b<>>32-c;b=b<>2]=b|n;H[k+140>>2]=m|q}b=1}aa=b;$=x-X|0;ta=P+1|0;F[s+2112|0]=0;u=s+2112|0;g=Ya(k+256|0);if((A|0)>0){P=sa-1|0;l=s;j=u;b=0;c=ha;z=0;while(1){R=z;h=J[(b<<8|(lb(k+224|0)&127)<<1)+16656>>1];P:{if(b){break P}b=g-2|0;h=(b|0)==-1?h:0;if((g|0)>1){g=b;break P}g=Ya(k+256|0)}q=H[k+236>>2];n=H[k+232>>2];i=H[k+240>>2];x=h>>>4|0;p=H[l>>2]|(x&3|h>>>2&48)<>2]=p;E=h&16;b=h>>>5&7|E>>>4;o=i;i=h&7;z=o-i|0;n=((1<>>i;q=q>>>i|0;o=n;i=0;if((A|0)>(R|2)){i=J[(b<<8|(n&127)<<1)+16656>>1];Q:{if(b){break Q}b=g-2|0;i=(b|0)==-1?i:0;if((g|0)>1){g=b;break Q}g=Ya(k+256|0)}b=i&7;z=z-b|0;n=((1<>>b;q=q>>>b|0;o=n;b=i>>>4&1|i>>>5&7}H[l>>2]=p|(i<<2&768|i&48)<>>2&2|h>>>3&1;R:{if((p|0)!=3){break R}m=g-2|0;p=(m|0)==-1?4:3;if((g|0)>1){g=m;break R}g=Ya(k+256|0)}S:{if(!p){H[k+120>>2]=1;H[k+124>>2]=1;o=0;break S}if(p>>>0<=2){m=I[(o&7)+20804|0];w=m>>>2&7;r=m&3;m=(((-1<>>r)+(m>>>5|0)|0)+1|0;o=(p|0)==1;H[k+124>>2]=o?1:m;H[k+120>>2]=o?m:1;o=r+w|0;break S}v=o;o=I[(o&7)+20804|0];U=o&3;m=v>>>U|0;if((p|0)==3){X=(o>>>5|0)+1|0;if((U|0)==3){H[k+124>>2]=m&1|2;o=o>>>2&7;H[k+120>>2]=X+((-1<>>1);o=o+4|0;break S}r=I[(m&7)+20804|0];p=r&3;m=m>>>p|0;w=o>>>2&7;H[k+120>>2]=X+(m&(-1<>>2&7;H[k+124>>2]=(((-1<>>w)+(r>>>5|0)|0)+1;o=o+(p+(w+U|0)|0)|0;break S}r=I[(m&7)+20804|0];p=r&3;m=m>>>p|0;w=o>>>2&7;H[k+120>>2]=((m&(-1<>>5|0)|0)+3;o=r>>>2&7;H[k+124>>2]=(((-1<>>w)+(r>>>5|0)|0)+3;o=o+(w+(p+U|0)|0)|0}T:{X=H[k+120>>2];if(X>>>0<=ta>>>0){w=H[k+124>>2];if(w>>>0<=ta>>>0){break T}}if(_){i=0;Ba(S,1,15756,0);break j}i=0;Ba(S,1,15756,0);break j}H[k+240>>2]=z-o;m=o&31;if((o&63)>>>0>=32){o=0;q=q>>>m|0}else{o=q>>>m|0;q=((1<>>m}H[k+232>>2]=q;H[k+236>>2]=o;o=i&240|x&15;z=R+4|0;q=(z|0)<=(A|0)?255:255>>>(z-A<<1)|0;x=($|0)>1?q:q&85;if(o&(x^-1)){if(_){i=0;Ba(S,1,12194,0);break j}i=0;Ba(S,1,12194,0);break j}U:{V:{if(E){n=Ma(k+192|0);p=X+(h<<19>>31)|0;H[k+208>>2]=H[k+208>>2]-p;m=H[k+204>>2];q=H[k+200>>2];r=p&31;if((p&63)>>>0>=32){o=0;q=m>>>r|0}else{o=m>>>r|0;q=((1<>>r}H[k+200>>2]=q;H[k+204>>2]=o;T=(n&(-1<>>8&1)<>2]=T}W:{if(h&32){n=Ma(k+192|0);p=X+(h<<18>>31)|0;H[k+208>>2]=H[k+208>>2]-p;m=H[k+204>>2];q=H[k+200>>2];r=p&31;if((p&63)>>>0>=32){o=0;q=m>>>r|0}else{o=m>>>r|0;q=((1<>>r}H[k+200>>2]=q;H[k+204>>2]=o;q=n&(-1<>>9&1)<>2]=q+2<>>0>q>>>0?n:q)|128;break W}if(!(x&2)){break W}H[(A<<2)+c>>2]=0}p=c+4|0;X:{Y:{if(h&64){n=Ma(k+192|0);r=X+(h<<17>>31)|0;H[k+208>>2]=H[k+208>>2]-r;m=H[k+204>>2];q=H[k+200>>2];E=r&31;if((r&63)>>>0>=32){o=0;q=m>>>E|0}else{o=m>>>E|0;q=((1<>>E}H[k+200>>2]=q;H[k+204>>2]=o;q=(n&(-1<>>10&1)<>2]=q}F[j+1|0]=0;Z:{if(h&128){n=Ma(k+192|0);r=X-(h>>>15|0)|0;H[k+208>>2]=H[k+208>>2]-r;m=H[k+204>>2];q=H[k+200>>2];E=r&31;if((r&63)>>>0>=32){o=0;q=m>>>E|0}else{o=m>>>E|0;q=((1<>>E}H[k+200>>2]=q;H[k+204>>2]=o;q=n&(-1<>>11&1)<>2]=q+2<>2]=0}m=c+8|0;_:{$:{if(i&16){n=Ma(k+192|0);p=w+(i<<19>>31)|0;H[k+208>>2]=H[k+208>>2]-p;h=H[k+204>>2];q=H[k+200>>2];r=p&31;if((p&63)>>>0>=32){o=0;q=h>>>r|0}else{o=h>>>r|0;q=((1<>>r}H[k+200>>2]=q;H[k+204>>2]=o;p=(n&(-1<>>8&1)<>2]=p}aa:{if(i&32){n=Ma(k+192|0);p=w+(i<<18>>31)|0;H[k+208>>2]=H[k+208>>2]-p;h=H[k+204>>2];q=H[k+200>>2];r=p&31;if((p&63)>>>0>=32){o=0;q=h>>>r|0}else{o=h>>>r|0;q=((1<>>r}H[k+200>>2]=q;H[k+204>>2]=o;q=n&(-1<>>9&1)<>2]=q+2<>>0>q>>>0?n:q)|128;break aa}if(!(x&32)){break aa}H[m+(A<<2)>>2]=0}m=c+12|0;ba:{ca:{if(i&64){n=Ma(k+192|0);p=w+(i<<17>>31)|0;H[k+208>>2]=H[k+208>>2]-p;h=H[k+204>>2];q=H[k+200>>2];r=p&31;if((p&63)>>>0>=32){o=0;q=h>>>r|0}else{o=h>>>r|0;q=((1<>>r}H[k+200>>2]=q;H[k+204>>2]=o;p=(n&(-1<>>10&1)<>2]=p}j=j+2|0;F[j|0]=0;da:{if(i&128){n=Ma(k+192|0);p=w-(i>>>15|0)|0;H[k+208>>2]=H[k+208>>2]-p;h=H[k+204>>2];q=H[k+200>>2];r=p&31;if((p&63)>>>0>=32){o=0;q=h>>>r|0}else{o=h>>>r|0;q=((1<>>r}H[k+200>>2]=q;H[k+204>>2]=o;i=n&(-1<>>11&1)<>2]=i+2<>>0<128){break da}H[m+(A<<2)>>2]=0}Z=Z^16;l=(R&4)+l|0;c=c+16|0;if((z|0)<(A|0)){continue}break}}ia=V&8;ja=s+1584|0;ka=s+1056|0;fa=s+528|0;if(($|0)>=3){la=N(A,12);ma=A<<3;da=sa-1|0;b=sa-2|0;t=3<>>1&2147483644)+4|0;r=2;while(1){R=r;T=I[u|0];F[u|0]=0;Z=Z&-17^2;ea:{if((A|0)<=0){r=r+2|0;break ea}b=R&4?fa:s;r=R+2|0;j=ha+(N(A,R)<<2)|0;p=0;c=u;E=0;while(1){V=p;P=T&255;i=I[c+1|0]>>>5&4|(P>>>7|E);h=J[(i<<8|(lb(k+224|0)&127)<<1)+18704>>1];fa:{if(i){break fa}i=g-2|0;h=(i|0)==-1?h:0;if((g|0)>1){g=i;break fa}g=Ya(k+256|0)}q=H[k+236>>2];n=H[k+232>>2];i=H[k+240>>2];l=H[b>>2]|(h>>>4&3|h>>>2&48)<>2]=l;U=h&64;X=h&128;E=U>>>5|X>>>6;o=i;i=h&7;x=o-i|0;n=((1<>>i;q=q>>>i|0;p=n;i=0;if((A|0)>(V|2)){o=I[c+2|0]>>>5&4|I[c+1|0]>>>7|E;i=J[(o<<8|(n&127)<<1)+18704>>1];ga:{if(o){break ga}o=g-2|0;i=(o|0)==-1?i:0;if((g|0)>1){g=o;break ga}g=Ya(k+256|0)}o=i&7;x=x-o|0;E=(i>>>5|i>>>6)&2;n=((1<>>o;p=n;q=q>>>o|0}H[b>>2]=l|(i<<2&768|i&48)<>>2&2|h>>>3&1;switch(z|0){case 0:break ha;case 3:break ia;default:break ja}}o=I[(p&7)+20804|0];w=o>>>2&7;v=p;p=o&3;l=(((-1<>>p)+(o>>>5|0)|0)+1|0;m=(z|0)==1;o=m?1:l;l=m?l:1;z=p+w|0;break ha}v=I[(p&7)+20804|0];m=v&3;o=p>>>m|0;w=I[(o&7)+20804|0];l=w&3;p=v>>>2&7;M=p+(l+m|0)|0;m=w>>>2&7;z=M+m|0;o=o>>>l|0;l=((o&(-1<>>5|0)|0)+1|0;o=(((-1<>>p)+(w>>>5|0)|0)+1|0}H[k+240>>2]=x-z;m=z&31;if((z&63)>>>0>=32){w=0;q=q>>>m|0}else{w=q>>>m|0;q=((1<>>m}H[k+232>>2]=q;H[k+236>>2]=w;p=h&240;if(p-1&p){n=P&127;q=I[c+1|0]&127;n=n>>>0>q>>>0?n:q;q=n-2|0;l=(n>>>0>=q>>>0?q:0)+l|0}m=i&240;if(m-1&m){n=I[c+1|0]&127;q=I[c+2|0]&127;q=n>>>0>q>>>0?n:q;o=(q>>>0>2?q-2|0:0)+o|0}if(!(l>>>0<=ta>>>0&o>>>0<=ta>>>0)){if(_){i=0;Ba(S,1,15856,0);break j}i=0;Ba(S,1,15856,0);break j}T=I[c+2|0];F[c+1|0]=0;F[c+2|0]=0;n=m|p>>>4;p=V+4|0;q=(p|0)<=(A|0)?255:255>>>(p-A<<1)|0;P=(r|0)>($|0)?q&85:q;if(n&(P^-1)){if(_){i=0;Ba(S,1,12194,0);break j}i=0;Ba(S,1,12194,0);break j}ka:{la:{if(h&16){n=Ma(k+192|0);x=(h<<19>>31)+l|0;H[k+208>>2]=H[k+208>>2]-x;m=H[k+204>>2];q=H[k+200>>2];z=x&31;if((x&63)>>>0>=32){w=0;q=m>>>z|0}else{w=m>>>z|0;q=((1<>>z}H[k+200>>2]=q;H[k+204>>2]=w;x=(n&(-1<>>8&1)<>2]=x}ma:{if(h&32){n=Ma(k+192|0);x=(h<<18>>31)+l|0;H[k+208>>2]=H[k+208>>2]-x;m=H[k+204>>2];q=H[k+200>>2];z=x&31;if((x&63)>>>0>=32){w=0;q=m>>>z|0}else{w=m>>>z|0;q=((1<>>z}H[k+200>>2]=q;H[k+204>>2]=w;q=n&(-1<>>9&1)<>2]=q+2<>>0>q>>>0?n:q)|128;break ma}if(!(P&2)){break ma}H[(A<<2)+j>>2]=0}x=j+4|0;na:{oa:{if(U){n=Ma(k+192|0);z=(h<<17>>31)+l|0;H[k+208>>2]=H[k+208>>2]-z;m=H[k+204>>2];q=H[k+200>>2];U=z&31;if((z&63)>>>0>=32){w=0;q=m>>>U|0}else{w=m>>>U|0;q=((1<>>U}H[k+200>>2]=q;H[k+204>>2]=w;m=(n&(-1<>>10&1)<>2]=m}pa:{if(X){n=Ma(k+192|0);l=l-(h>>>15|0)|0;H[k+208>>2]=H[k+208>>2]-l;m=H[k+204>>2];q=H[k+200>>2];z=l&31;if((l&63)>>>0>=32){w=0;q=m>>>z|0}else{w=m>>>z|0;q=((1<>>z}H[k+200>>2]=q;H[k+204>>2]=w;q=n&(-1<>>11&1)<>2]=q+2<>2]=0}m=j+8|0;qa:{ra:{if(i&16){n=Ma(k+192|0);l=(i<<19>>31)+o|0;H[k+208>>2]=H[k+208>>2]-l;h=H[k+204>>2];q=H[k+200>>2];x=l&31;if((l&63)>>>0>=32){w=0;q=h>>>x|0}else{w=h>>>x|0;q=((1<>>x}H[k+200>>2]=q;H[k+204>>2]=w;l=(n&(-1<>>8&1)<>2]=l}sa:{if(i&32){n=Ma(k+192|0);l=(i<<18>>31)+o|0;H[k+208>>2]=H[k+208>>2]-l;h=H[k+204>>2];q=H[k+200>>2];x=l&31;if((l&63)>>>0>=32){w=0;q=h>>>x|0}else{w=h>>>x|0;q=((1<>>x}H[k+200>>2]=q;H[k+204>>2]=w;q=n&(-1<>>9&1)<>2]=q+2<>>0>q>>>0?n:q)|128;break sa}if(!(P&32)){break sa}H[m+(A<<2)>>2]=0}m=j+12|0;ta:{ua:{if(i&64){n=Ma(k+192|0);l=(i<<17>>31)+o|0;H[k+208>>2]=H[k+208>>2]-l;h=H[k+204>>2];q=H[k+200>>2];x=l&31;if((l&63)>>>0>=32){w=0;q=h>>>x|0}else{w=h>>>x|0;q=((1<>>x}H[k+200>>2]=q;H[k+204>>2]=w;l=(n&(-1<>>10&1)<>2]=l}c=c+2|0;va:{if(i&128){n=Ma(k+192|0);h=o-(i>>>15|0)|0;H[k+208>>2]=H[k+208>>2]-h;o=H[k+204>>2];q=H[k+200>>2];l=h&31;if((h&63)>>>0>=32){w=0;o=o>>>l|0}else{w=o>>>l|0;o=((1<>>l}H[k+200>>2]=o;H[k+204>>2]=w;i=n&(-1<>>11&1)<>2]=i+2<>>0<128){break va}H[m+(A<<2)>>2]=0}Z=Z^16;b=(V&4)+b|0;j=j+16|0;if((p|0)<(A|0)){continue}break}}wa:{if(!(R&2)|e>>>0<2){break wa}m=r&4;xa:{ya:{za:{Aa:{Ba:{if(aa){x=m?s:fa;z=0;if((A|0)<=0){break Ba}q=ha+(N(A,R-2|0)<<2)|0;while(1){i=lb(k+128|0);h=0;j=H[x>>2];if(j){h=q+(z<<2)|0;o=0;c=15;while(1){Ca:{if(!(c&j)){break Ca}n=c&286331153;if(n&j){H[h>>2]=W|H[h>>2]^((i^-1)&1)<>>1|0}if(j&n<<1){b=(A<<2)+h|0;H[b>>2]=W|H[b>>2]^((i^-1)&1)<>>1|0}if(j&n<<2){b=h+ma|0;H[b>>2]=W|H[b>>2]^((i^-1)&1)<>>1|0}if(!(j&n<<3)){break Ca}b=h+la|0;H[b>>2]=W|H[b>>2]^((i^-1)&1)<>>1|0}h=h+4|0;c=c<<4;o=o+1|0;if((o|0)!=8){continue}break}h=xe(j)}x=x+4|0;H[k+144>>2]=H[k+144>>2]-h;c=H[k+140>>2];b=H[k+136>>2];i=h&31;if((h&63)>>>0>=32){w=0;b=c>>>i|0}else{w=c>>>i|0;b=((1<>>i}H[k+136>>2]=b;H[k+140>>2]=w;z=z+8|0;if((A|0)>(z|0)){continue}break}}l=0;i=0;ba=m?ka:ja;h=ba;x=m?s:fa;c=x;if((A|0)>0){break za}b=!m;break Aa}ba=m?ka:ja;b=!m}if(R>>>0<=5){break wa}q=b?s:fa;if((A|0)<=0){break xa}c=b?ka:ja;break ya}while(1){b=i>>>28|0;i=H[c>>2];b=i|(b|i<<4|i>>>4);H[h>>2]=b;b=b|H[c+4>>2]<<28;H[h>>2]=(b>>>1&2004318071|b<<1&-286331154|b)&(i^-1);h=h+4|0;c=c+4|0;l=l+8|0;if((A|0)>(l|0)){continue}break}if(R>>>0<6){break wa}q=m?fa:s;c=m?ja:ka}b=0;o=0;h=x;m=c;i=c;c=q;while(1){j=h+4|0;n=H[i>>2];h=H[h>>2];if(!ia){n=n|(h|(h<<4|b>>>28|h>>>4|H[j>>2]<<28))<<3&-2004318072}H[i>>2]=n&(H[c>>2]^-1);c=c+4|0;i=i+4|0;b=h;h=j;o=o+8|0;if((A|0)>(o|0)){continue}break}if((A|0)<=0){break xa}U=ha+(N(A,R-6|0)<<2)|0;T=0;b=q;while(1){j=0;c=H[m>>2];if(c){X=A-T|0;R=(T<<2)+U|0;i=0;E=0;while(1){n=i;i=Ma(k+160|0);o=E+4|0;P=(A|0)>(o+T|0)?o:X;Da:{if((P|0)<=(E|0)){h=0;break Da}M=H[b>>2]^-1;w=E<<2;z=R+w|0;h=0;o=E;p=15<>>1|0}V=v<<1;if(V&c){if(i&1){j=j|V;c=M&116<<(o<<2)|c}h=h+1|0;i=i>>>1|0}V=v<<2;if(V&c){if(i&1){j=j|V;c=M&232<<(o<<2)|c}h=h+1|0;i=i>>>1|0}V=v<<3;if(!(V&c)){break Ea}if(i&1){j=j|V;c=M&192<<(o<<2)|c}h=h+1|0;i=i>>>1|0}l=l<<4;o=o+1|0;if((P|0)>(o|0)){continue}break}if(!(j>>>w&65535)){break Da}while(1){Fa:{if(!(j&p)){break Fa}l=p&286331153;if(l&j){H[z>>2]=t|(H[z>>2]|i<<31);h=h+1|0;i=i>>>1|0}if(l<<1&j){o=(A<<2)+z|0;H[o>>2]=t|(H[o>>2]|i<<31);h=h+1|0;i=i>>>1|0}if(l<<2&j){o=z+ma|0;H[o>>2]=t|(H[o>>2]|i<<31);h=h+1|0;i=i>>>1|0}if(!(l<<3&j)){break Fa}o=z+la|0;H[o>>2]=t|(H[o>>2]|i<<31);h=h+1|0;i=i>>>1|0}p=p<<4;z=z+4|0;E=E+1|0;if((P|0)>(E|0)){continue}break}}H[k+176>>2]=H[k+176>>2]-h;o=H[k+172>>2];i=H[k+168>>2];l=h&31;if((h&63)>>>0>=32){w=0;i=o>>>l|0}else{w=o>>>l|0;i=((1<>>l}H[k+168>>2]=i;H[k+172>>2]=w;i=1;E=4;if(!(n&1)){continue}break}H[m+4>>2]=H[m+4>>2]|(j>>>27&14|j>>>29|j>>>28)&(H[b+4>>2]^-1)}n=H[b>>2]|j;o=n>>>3&286331153;i=o>>>4|o<<4|o;if(T){c=ba-4|0;H[c>>2]=H[c>>2]|(H[x-4>>2]^-1)&o<<28}H[ba>>2]=H[ba>>2]|i&(H[x>>2]^-1);H[ba+4>>2]=H[ba+4>>2]|(H[x+4>>2]^-1)&n>>>31;m=m+4|0;b=b+4|0;ba=ba+4|0;x=x+4|0;T=T+8|0;if((A|0)>(T|0)){continue}break}}if(!ea){break wa}y(q,0,ea)}if((r|0)<($|0)){continue}break}}Ga:{if(e>>>0<2){break Ga}e=($&3)-1|0;Ha:{if(aa&e>>>0<2){if((A|0)<=0){break Ha}p=1<>2];if(u){h=j+(E<<2)|0;c=15;o=0;while(1){Ia:{if(!(c&u)){break Ia}m=c&286331153;if(m&u){H[h>>2]=p|H[h>>2]^((i^-1)&1)<>>1|0}if(u&m<<1){b=(A<<2)+h|0;H[b>>2]=p|H[b>>2]^((i^-1)&1)<>>1|0}if(u&m<<2){b=h+g|0;H[b>>2]=p|H[b>>2]^((i^-1)&1)<>>1|0}if(!(u&m<<3)){break Ia}b=h+n|0;H[b>>2]=p|H[b>>2]^((i^-1)&1)<>>1|0}h=h+4|0;c=c<<4;o=o+1|0;if((o|0)!=8){continue}break}h=xe(u)}q=q+4|0;H[k+144>>2]=H[k+144>>2]-h;c=H[k+140>>2];b=H[k+136>>2];i=h&31;if((h&63)>>>0>=32){w=0;b=c>>>i|0}else{w=c>>>i|0;b=((1<>>i}H[k+136>>2]=b;H[k+140>>2]=w;E=E+8|0;if((A|0)>(E|0)){continue}break}}if((A|0)<=0|e>>>0>1){break Ha}b=$&4;h=b?fa:s;c=b?ja:ka;l=0;i=0;while(1){b=i>>>28|0;i=H[h>>2];b=i|(b|i<<4|i>>>4);H[c>>2]=b;b=b|H[h+4>>2]<<28;H[c>>2]=(b>>>1&2004318071|b<<1&-286331154|b)&(i^-1);c=c+4|0;h=h+4|0;l=l+8|0;if((A|0)>(l|0)){continue}break}}b=($|0)>6?($-($+1&3)|0)-3|0:0;if(($|0)<=(b|0)){break Ga}r=N(A,12);R=A<<3;ea=3<>>0>=3){Z=-1;if((g|0)<5){break La}if(X){break Ja}g=b&4;h=g?fa:s;i=g?ja:ka;c=0;if(!ia){c=g?s:fa;l=0;j=0;while(1){g=j>>>28|0;Z=-1;j=H[c>>2];H[i>>2]=(H[i>>2]|(j|(g|j<<4|j>>>4|H[c+4>>2]<<28))<<3&-2004318072)&(H[h>>2]^-1);h=h+4|0;i=i+4|0;c=c+4|0;l=l+8|0;if((A|0)>(l|0)){continue}break}break Ka}while(1){Z=-1;H[i>>2]=H[i>>2]&(H[h>>2]^-1);h=h+4|0;i=i+4|0;c=c+8|0;if((A|0)>(c|0)){continue}break}break Ka}Z=H[(c<<2)+20812>>2]}if(X){break Ja}}c=b&4;q=c?fa:s;g=c?ja:ka;x=c?s:fa;T=c?ka:ja;V=ha+(N(b,A)<<2)|0;p=0;while(1){j=0;c=H[g>>2]&Z;if(c){aa=A-p|0;u=V+(p<<2)|0;i=0;e=0;while(1){n=i;i=Ma(k+160|0);o=e+4|0;w=(A|0)>(o+p|0)?o:aa;Ma:{if((w|0)<=(e|0)){h=0;break Ma}E=e<<2;z=E+u|0;v=(H[q>>2]^-1)&Z;h=0;o=e;P=15<>>1|0}m=U<<1;if(m&c){if(i&1){j=j|m;c=v&116<<(o<<2)|c}h=h+1|0;i=i>>>1|0}m=U<<2;if(m&c){if(i&1){j=j|m;c=v&232<<(o<<2)|c}h=h+1|0;i=i>>>1|0}m=U<<3;if(!(m&c)){break Na}if(i&1){j=j|m;c=v&192<<(o<<2)|c}h=h+1|0;i=i>>>1|0}l=l<<4;o=o+1|0;if((w|0)>(o|0)){continue}break}if(!(j>>>E&65535)){break Ma}while(1){Oa:{if(!(j&P)){break Oa}m=P&286331153;if(m&j){H[z>>2]=ea|(H[z>>2]|i<<31);h=h+1|0;i=i>>>1|0}if(m<<1&j){o=(A<<2)+z|0;H[o>>2]=ea|(H[o>>2]|i<<31);h=h+1|0;i=i>>>1|0}if(m<<2&j){o=z+R|0;H[o>>2]=ea|(H[o>>2]|i<<31);h=h+1|0;i=i>>>1|0}if(!(m<<3&j)){break Oa}o=r+z|0;H[o>>2]=ea|(H[o>>2]|i<<31);h=h+1|0;i=i>>>1|0}P=P<<4;z=z+4|0;e=e+1|0;if((w|0)>(e|0)){continue}break}}H[k+176>>2]=H[k+176>>2]-h;o=H[k+172>>2];i=H[k+168>>2];e=h&31;if((h&63)>>>0>=32){w=0;i=o>>>e|0}else{w=o>>>e|0;i=((1<>>e}H[k+168>>2]=i;H[k+172>>2]=w;i=1;e=4;if(!(n&1)){continue}break}H[g+4>>2]=H[g+4>>2]|(j>>>27&14|j>>>29|j>>>28)&(H[q+4>>2]^-1)}n=H[q>>2]|j;o=n>>>3&286331153;i=o>>>4|o<<4|o;if(p){c=T-4|0;H[c>>2]=H[c>>2]|(H[x-4>>2]^-1)&o<<28}H[T>>2]=H[T>>2]|i&(H[x>>2]^-1);H[T+4>>2]=H[T+4>>2]|(H[x+4>>2]^-1)&n>>>31;g=g+4|0;q=q+4|0;T=T+4|0;x=x+4|0;p=p+8|0;if((A|0)>(p|0)){continue}break}}b=b+4|0;if(($|0)>(b|0)){continue}break}}i=1;if(($|0)<=0|(A|0)<=0){break j}n=A&2147483644;o=A&3;q=ca-D>>>0>4294967292;b=0;while(1){i=ha+(N(b,A)<<2)|0;h=0;Pa:{if(!q){while(1){g=H[i>>2];c=g&2147483647;H[i>>2]=(g|0)<0?0-c|0:c;g=H[i+4>>2];c=g&2147483647;H[i+4>>2]=(g|0)<0?0-c|0:c;g=H[i+8>>2];c=g&2147483647;H[i+8>>2]=(g|0)<0?0-c|0:c;g=H[i+12>>2];c=g&2147483647;H[i+12>>2]=(g|0)<0?0-c|0:c;i=i+16|0;h=h+4|0;if((n|0)!=(h|0)){continue}break}if(!o){break Pa}}h=0;while(1){g=H[i>>2];c=g&2147483647;H[i>>2]=(g|0)<0?0-c|0:c;i=i+4|0;h=h+1|0;if((o|0)!=(h|0)){continue}break}}i=1;b=b+1|0;if(($|0)!=(b|0)){continue}break}break j}if(!_){break w}H[k+52>>2]=H[C+24>>2];H[k+48>>2]=P;Ba(S,1,9686,k+48|0);break v}H[k+20>>2]=i;H[k+16>>2]=P;Ba(S,1,9686,k+16|0);i=0;break j}i=0}na=k+304|0;if(i){break i}break b}H[f+108>>2]=(b<<9)+22336;c=0;b=H[f+116>>2];Qa:{Ra:{m=H[C+16>>2]-H[C+8>>2]|0;e=H[C+20>>2]-H[C+12>>2]|0;g=N(m,e);Sa:{Ta:{Ua:{if(g>>>0>K[f+132>>2]){Ca(b);b=Ia(g<<2);H[f+116>>2]=b;if(!b){break Sa}H[f+132>>2]=g;break Ua}if(!b){break Ta}}g=g<<2;if(!g){break Ta}y(b,0,g)}b=H[f+120>>2];l=m+2|0;o=e+3>>>2|0;g=N(l,o+2|0);if(g>>>0<=K[f+136>>2]){z=g<<2;break Ra}Ca(b);z=g<<2;b=Ia(z);H[f+120>>2]=b;if(b){break Ra}}b=0;break Qa}H[f+136>>2]=g;if(z){y(b,0,z)}Va:{if(!l){break Va}k=l&7;n=H[f+120>>2];b=n;q=m+1|0;Wa:{if(q>>>0>=7){g=l&-8;while(1){H[b+24>>2]=1226833920;H[b+28>>2]=1226833920;H[b+16>>2]=1226833920;H[b+20>>2]=1226833920;H[b+8>>2]=1226833920;H[b+12>>2]=1226833920;H[b>>2]=1226833920;H[b+4>>2]=1226833920;b=b+32|0;c=c+8|0;if((g|0)!=(c|0)){continue}break}if(!k){break Wa}}c=0;while(1){H[b>>2]=1226833920;b=b+4|0;c=c+1|0;if((k|0)!=(c|0)){continue}break}}k=l&7;b=n+(N(l,o+1|0)<<2)|0;Xa:{if(q>>>0>=7){g=l&-8;c=0;while(1){H[b+24>>2]=1226833920;H[b+28>>2]=1226833920;H[b+16>>2]=1226833920;H[b+20>>2]=1226833920;H[b+8>>2]=1226833920;H[b+12>>2]=1226833920;H[b>>2]=1226833920;H[b+4>>2]=1226833920;b=b+32|0;c=c+8|0;if((g|0)!=(c|0)){continue}break}if(!k){break Xa}}c=0;while(1){H[b>>2]=1226833920;b=b+4|0;c=c+1|0;if((k|0)!=(c|0)){continue}break}}b=e&3;if(!b){break Va}k=(b|0)==1?1224736768:(b|0)==2?1207959552:1073741824;g=l&7;b=n+(N(l,o)<<2)|0;if(q>>>0>=7){c=l&-8;z=0;while(1){H[b+28>>2]=k;H[b+24>>2]=k;H[b+20>>2]=k;H[b+16>>2]=k;H[b+12>>2]=k;H[b+8>>2]=k;H[b+4>>2]=k;H[b>>2]=k;b=b+32|0;z=z+8|0;if((c|0)!=(z|0)){continue}break}if(!g){break Va}}z=0;while(1){H[b>>2]=k;b=b+4|0;z=z+1|0;if((g|0)!=(z|0)){continue}break}}H[f+128>>2]=e;H[f+124>>2]=m;b=1}if(!b){break b}z=j+H[C+28>>2]|0;if((z|0)>=31){if(!_){break h}H[Y+16>>2]=z;Ba(S,2,8716,Y+16|0);break b}Yb(f);Xa(f,18,46);Xa(f,17,3);Xa(f,0,4);if(H[C+64>>2]){break i}c=H[C+52>>2];Ya:{if(!(c>>>0<=1&(!H[f+144>>2]|(c|0)!=1))){k=c&3;b=H[C+4>>2];g=0;Za:{if(c-1>>>0>=3){c=c&-4;while(1){q=(t<<3)+b|0;g=H[q+28>>2]+(H[q+20>>2]+(H[q+12>>2]+(H[q+4>>2]+g|0)|0)|0)|0;t=t+4|0;h=h+4|0;if((c|0)!=(h|0)){continue}break}if(!k){break Za}}while(1){g=H[((t<<3)+b|0)+4>>2]+g|0;t=t+1|0;i=i+1|0;if((k|0)!=(i|0)){continue}break}}ia=H[f+148>>2];c=g+2|0;if(c>>>0>K[f+152>>2]){b=Ha(ia,c);if(!b){break b}H[f+148>>2]=b;b=b+g|0;F[b|0]=0;F[b+1|0]=0;H[f+152>>2]=c;ia=H[f+148>>2];if(!H[C+52>>2]){break Ya}b=H[C+4>>2]}g=0;t=0;while(1){k=t<<3;c=k+b|0;b=H[c+4>>2];if(b){B(g+ia|0,H[c>>2],b)}b=H[C+4>>2];g=H[(k+b|0)+4>>2]+g|0;t=t+1|0;if(t>>>0>2]){continue}break}break Ya}if((c|0)!=1){break i}ia=H[H[C+4>>2]>>2]}b=H[C+60>>2];if(b){Z=H[f+116>>2];H[f+116>>2]=b}if(H[C+44>>2]){P=V&8;ca=f+28|0;ha=!(V&2);la=2;while(1){k=U+ia|0;ma=H[C>>2]+N(X,24)|0;c=H[ma>>2];ea=V&(la>>>0<2&(H[C+28>>2]-4|0)>=(z|0));_a:{if(ea){H[f+20>>2]=k;b=c+k|0;H[f+24>>2]=b;G[f+112>>1]=I[b|0]|I[b+1|0]<<8;F[b|0]=255;F[H[f+24>>2]+1|0]=255;H[f+8>>2]=0;H[f>>2]=0;H[f+16>>2]=k;break _a}H[f+20>>2]=k;b=c+k|0;H[f+24>>2]=b;G[f+112>>1]=I[b|0]|I[b+1|0]<<8;F[b|0]=255;F[H[f+24>>2]+1|0]=255;H[f+104>>2]=f+28;H[f+16>>2]=k;H[f+12>>2]=0;b=c?I[k|0]<<16:16711680;H[f>>2]=b;i=1;c=k+1|0;g=I[k+1|0];$a:{if(I[k|0]==255){if(g>>>0>=144){H[f+12>>2]=1;b=b|65280;break $a}H[f+16>>2]=c;i=0;b=b+(g<<9)|0;break $a}H[f+16>>2]=c;b=b|g<<8}H[f+8>>2]=i;H[f+4>>2]=32768;H[f>>2]=b<<7}R=H[ma>>2];ab:{if(!H[ma+8>>2]|(z|0)<=0){break ab}aa=ea|ha;ba=0;while(1){bb:{cb:{db:{eb:{switch(la-1|0){default:if(!ea){break db}b=1<>>1|b;e=H[f+124>>2];d=e<<2;b=(d+H[f+120>>2]|0)+12|0;g=H[f+116>>2];l=0;c=H[f+128>>2];if(c>>>0>=4){if(!e){break bb}o=N(e,12);n=e<<3;j=0-m|0;while(1){c=0;while(1){k=b;b=H[b>>2];fb:{if(!b){break fb}if(!(!(b&495)|b&2097168)){b=H[f>>2];i=H[f+8>>2];gb:{if(i){break gb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];hb:{if(i){i=8}else{if(b>>>0>143){break hb}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break gb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;ib:{if(!(b>>>i&1)){break ib}jb:{if(i){break jb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];kb:{if(i){i=8}else{if(b>>>0>143){break kb}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break jb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;q=b>>>i&1;H[g>>2]=q?j:m;i=H[f+124>>2];b=k-4|0;H[b>>2]=H[b>>2]|32;H[k+4>>2]=H[k+4>>2]|8;H[k>>2]=H[k>>2]|q<<19|16;if(P){break ib}b=k+(-2-i<<2)|0;H[b+4>>2]=H[b+4>>2]|32768;H[b>>2]=H[b>>2]|q<<31|65536;b=b-4|0;H[b>>2]=H[b>>2]|131072}b=H[k>>2]|2097152;H[k>>2]=b}if(!(!(b&3960)|b&16777344)){b=H[f>>2];i=H[f+8>>2];lb:{if(i){break lb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];mb:{if(i){i=8}else{if(b>>>0>143){break mb}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break lb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;if(b>>>i&1){nb:{if(i){break nb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];ob:{if(i){i=8}else{if(b>>>0>143){break ob}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break nb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;i=b>>>i&1;H[d+g>>2]=i?j:m;b=k-4|0;H[b>>2]=H[b>>2]|256;H[k+4>>2]=H[k+4>>2]|64;b=H[k>>2]|i<<22|128}else{b=H[k>>2]}b=b|16777216;H[k>>2]=b}if(!(!(b&31680)|b&134218752)){b=H[f>>2];i=H[f+8>>2];pb:{if(i){break pb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];qb:{if(i){i=8}else{if(b>>>0>143){break qb}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break pb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;if(b>>>i&1){rb:{if(i){break rb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];sb:{if(i){i=8}else{if(b>>>0>143){break sb}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break rb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;i=b>>>i&1;H[g+n>>2]=i?j:m;b=k-4|0;H[b>>2]=H[b>>2]|2048;H[k+4>>2]=H[k+4>>2]|512;b=H[k>>2]|i<<25|1024}else{b=H[k>>2]}b=b|134217728;H[k>>2]=b}if(!(b&253440)|b&1073750016){break fb}b=H[f>>2];i=H[f+8>>2];tb:{if(i){break tb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];ub:{if(i){i=8}else{if(b>>>0>143){break ub}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break tb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;if(b>>>i&1){vb:{if(i){break vb}i=(b|0)!=255;q=H[f+16>>2];b=I[q|0];wb:{if(i){i=8}else{if(b>>>0>143){break wb}i=7}H[f>>2]=b;H[f+16>>2]=q+1;break vb}i=8;b=255}i=i-1|0;H[f+8>>2]=i;q=b>>>i&1;H[g+o>>2]=q?j:m;i=H[f+124>>2];b=k-4|0;H[b>>2]=H[b>>2]|16384;H[k+4>>2]=H[k+4>>2]|4096;H[k>>2]=H[k>>2]|q<<28|8192;b=k+(i<<2)|0;H[b+4>>2]=H[b+4>>2]|4;H[b+12>>2]=H[b+12>>2]|1;H[b+8>>2]=H[b+8>>2]|q<<18|2}H[k>>2]=H[k>>2]|1073741824}g=g+4|0;b=k+4|0;c=c+1|0;if((e|0)!=(c|0)){continue}break}g=g+o|0;b=k+12|0;l=l+4|0;c=H[f+128>>2];if(l>>>0<(c&-4)>>>0){continue}break}}if(!e|c>>>0<=l>>>0){break cb}p=0;n=0-m|0;i=c;while(1){xb:{if((i|0)==(l|0)){i=l;break xb}d=b-4|0;j=H[b>>2];t=0;while(1){o=N(t,3);k=j>>>o|0;if(!(k&2097168|!(k&495))){c=H[f>>2];h=H[f+8>>2];yb:{if(h){break yb}i=(c|0)!=255;k=H[f+16>>2];c=I[k|0];zb:{if(i){h=8}else{if(c>>>0>143){break zb}h=7}H[f>>2]=c;H[f+16>>2]=k+1;break yb}h=8;c=255}h=h-1|0;H[f+8>>2]=h;Ab:{if(!(c>>>h&1)){break Ab}q=(N(e,t)<<2)+g|0;Bb:{if(h){break Bb}i=(c|0)!=255;k=H[f+16>>2];c=I[k|0];Cb:{if(i){h=8}else{if(c>>>0>143){break Cb}h=7}H[f>>2]=c;H[f+16>>2]=k+1;break Bb}h=8;c=255}k=h-1|0;H[f+8>>2]=k;i=c>>>k&1;H[q>>2]=i?n:m;k=H[f+124>>2];H[d>>2]=H[d>>2]|32<>2]=H[b>>2]|(i<<19|16)<>2]=H[b+4>>2]|8<>2]=H[c+4>>2]|32768;H[c>>2]=H[c>>2]|i<<31|65536;c=c-4|0;H[c>>2]=H[c>>2]|131072}if((t|0)!=3){break Ab}c=(k<<2)+b|0;H[c+4>>2]=H[c+4>>2]|4;H[c+12>>2]=H[c+12>>2]|1;H[c+8>>2]=H[c+8>>2]|i<<18|2}j=H[b>>2]|2097152<>2]=j;c=H[f+128>>2]}i=c;t=t+1|0;if(t>>>0>>0){continue}break}}g=g+4|0;b=b+4|0;p=p+1|0;if((e|0)!=(p|0)){continue}break};break cb;case 1:m=0;x=0;Db:{Eb:{Fb:{W=H[f+124>>2];if(!((W|0)!=64|H[f+128>>2]!=64)){b=1<>>1|b;u=0-s|0;q=f+100|0;k=f+96|0;w=f+28|0;g=H[f+120>>2]+268|0;e=H[f+8>>2];b=H[f+4>>2];d=H[f>>2];i=H[f+104>>2];c=H[f+116>>2];if(V&8){break Fb}while(1){r=0;while(1){o=c;j=g;g=H[g>>2];Gb:{Hb:{Ib:{if(!g){i=H[k>>2];g=H[i>>2];b=b-g|0;Jb:{if(d>>>16>>>0>>0){n=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?8:12)>>2];while(1){Kb:{if(e){break Kb}i=H[f+16>>2];b=i+1|0;h=I[i+1|0];if(I[i|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Kb}H[f+16>>2]=b;d=(h<<9)+d|0;e=7;break Kb}H[f+16>>2]=b;e=8;d=(h<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?n:!n;break Jb}d=d-(g<<16)|0;if(!(b&32768)){n=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?12:8)>>2];while(1){Lb:{if(e){break Lb}i=H[f+16>>2];g=i+1|0;h=I[i+1|0];if(I[i|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Lb}H[f+16>>2]=g;d=(h<<9)+d|0;e=7;break Lb}H[f+16>>2]=g;e=8;d=(h<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!n:n;break Jb}c=H[i+4>>2]}if(!c){i=k;break Gb}c=H[q>>2];g=H[c>>2];b=b-g|0;Mb:{if(d>>>16>>>0>>0){h=H[c+4>>2];i=b>>>0>>0;c=H[(i?8:12)+c>>2];H[q>>2]=c;while(1){Nb:{if(e){break Nb}n=H[f+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Nb}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break Nb}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;n=i?h:!h;break Mb}d=d-(g<<16)|0;if(!(b&32768)){h=H[c+4>>2];g=b>>>0>>0;c=H[(g?12:8)+c>>2];H[q>>2]=c;while(1){Ob:{if(e){break Ob}n=H[f+16>>2];i=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Ob}H[f+16>>2]=i;d=(m<<9)+d|0;e=7;break Ob}H[f+16>>2]=i;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=g?!h:h;break Mb}n=H[c+4>>2]}g=H[c>>2];b=b-g|0;Pb:{if(d>>>16>>>0>>0){h=H[c+4>>2];i=c;c=b>>>0>>0;H[q>>2]=H[i+(c?8:12)>>2];while(1){Qb:{if(e){break Qb}i=H[f+16>>2];b=i+1|0;m=I[i+1|0];if(I[i|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Qb}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break Qb}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?h:!h;break Pb}d=d-(g<<16)|0;if(!(b&32768)){h=H[c+4>>2];i=c;c=b>>>0>>0;H[q>>2]=H[i+(c?12:8)>>2];while(1){Rb:{if(e){break Rb}i=H[f+16>>2];g=i+1|0;m=I[i+1|0];if(I[i|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Rb}H[f+16>>2]=g;d=(m<<9)+d|0;e=7;break Rb}H[f+16>>2]=g;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break Pb}c=H[c+4>>2]}g=0;i=q;Sb:{Tb:{Ub:{Vb:{Wb:{switch(c|n<<1){case 0:m=j-4|0;i=H[j+4>>2]>>>17&4|H[m>>2]>>>19&1;c=w+(I[i+24384|0]<<2)|0;n=H[c>>2];g=H[n>>2];b=b-g|0;Xb:{if(d>>>16>>>0>>0){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?8:12)>>2];while(1){Yb:{if(e){break Yb}n=H[f+16>>2];b=n+1|0;l=I[n+1|0];if(I[n|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Yb}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Yb}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;n=c?h:!h;break Xb}d=d-(g<<16)|0;if(!(b&32768)){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?12:8)>>2];while(1){Zb:{if(e){break Zb}n=H[f+16>>2];g=n+1|0;l=I[n+1|0];if(I[n|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Zb}H[f+16>>2]=g;d=(l<<9)+d|0;e=7;break Zb}H[f+16>>2]=g;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!h:h;break Xb}n=H[n+4>>2]}g=I[i+24640|0];H[o>>2]=(n|0)==(g|0)?s:u;H[m>>2]=H[m>>2]|32;H[j+4>>2]=H[j+4>>2]|8;c=j-268|0;H[c>>2]=H[c>>2]|131072;c=j-260|0;H[c>>2]=H[c>>2]|32768;c=j-264|0;i=c;v=H[c>>2];c=g^n;H[i>>2]=v|c<<31|65536;i=c<<19;t=H[f+108>>2];c=w+(I[t+2|0]<<2)|0;n=H[c>>2];g=H[n>>2];b=b-g|0;_b:{if(d>>>16>>>0>>0){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?8:12)>>2];while(1){$b:{if(e){break $b}n=H[f+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break $b}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break $b}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?h:!h;break _b}d=d-(g<<16)|0;if(!(b&32768)){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?12:8)>>2];while(1){ac:{if(e){break ac}n=H[f+16>>2];g=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break ac}H[f+16>>2]=g;d=(m<<9)+d|0;e=7;break ac}H[f+16>>2]=g;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break _b}c=H[n+4>>2]}g=i|16;if(!c){break Vb}break;case 1:break Wb;case 2:break Ub;case 3:break Sb;default:break Hb}}m=j-4|0;n=H[j+4>>2]>>>20&4|(H[m>>2]>>>22&1|(g>>>15&16|(g>>>19&64|g>>>3&170)));i=w+(I[n+24384|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;bc:{if(d>>>16>>>0>>0){h=H[l+4>>2];v=i;i=b>>>0>>0;H[v>>2]=H[l+(i?8:12)>>2];while(1){cc:{if(e){break cc}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break cc}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break cc}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=i?h:!h;break bc}d=d-(c<<16)|0;if(!(b&32768)){h=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){dc:{if(e){break dc}e=H[f+16>>2];i=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break dc}H[f+16>>2]=i;d=(l<<9)+d|0;e=7;break dc}H[f+16>>2]=i;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!h:h;break bc}i=H[l+4>>2]}c=I[n+24640|0];H[o+256>>2]=(i|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|256;H[j+4>>2]=H[j+4>>2]|64;t=H[f+108>>2];g=(c^i)<<22|g|128}i=w+(I[(g>>>6&495)+t|0]<<2)|0;n=H[i>>2];c=H[n>>2];b=b-c|0;ec:{if(d>>>16>>>0>>0){h=H[n+4>>2];v=i;i=b>>>0>>0;H[v>>2]=H[n+(i?8:12)>>2];while(1){fc:{if(e){break fc}n=H[f+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break fc}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break fc}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=i?h:!h;break ec}d=d-(c<<16)|0;if(!(b&32768)){h=H[n+4>>2];c=b>>>0>>0;H[i>>2]=H[n+(c?12:8)>>2];while(1){gc:{if(e){break gc}n=H[f+16>>2];i=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break gc}H[f+16>>2]=i;d=(m<<9)+d|0;e=7;break gc}H[f+16>>2]=i;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break ec}c=H[n+4>>2]}if(!c){break Tb}}m=j-4|0;n=H[j+4>>2]>>>23&4|(H[m>>2]>>>25&1|(g>>>18&16|(g>>>22&64|g>>>6&170)));i=w+(I[n+24384|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;hc:{if(d>>>16>>>0>>0){h=H[l+4>>2];v=i;i=b>>>0>>0;H[v>>2]=H[l+(i?8:12)>>2];while(1){ic:{if(e){break ic}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break ic}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break ic}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=i?h:!h;break hc}d=d-(c<<16)|0;if(!(b&32768)){h=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){jc:{if(e){break jc}e=H[f+16>>2];i=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break jc}H[f+16>>2]=i;d=(l<<9)+d|0;e=7;break jc}H[f+16>>2]=i;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!h:h;break hc}i=H[l+4>>2]}c=I[n+24640|0];H[o+512>>2]=(i|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;g=(c^i)<<25|g|1024;t=H[f+108>>2]}i=w+(I[(g>>>9&495)+t|0]<<2)|0;m=H[i>>2];c=H[m>>2];b=b-c|0;kc:{if(d>>>16>>>0>>0){h=H[m+4>>2];n=b>>>0>>0;H[i>>2]=H[m+(n?8:12)>>2];while(1){lc:{if(e){break lc}e=H[f+16>>2];b=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break lc}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break lc}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?h:!h;break kc}d=d-(c<<16)|0;if(!(b&32768)){h=H[m+4>>2];c=b>>>0>>0;H[i>>2]=H[m+(c?12:8)>>2];while(1){mc:{if(e){break mc}e=H[f+16>>2];n=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break mc}H[f+16>>2]=n;d=(m<<9)+d|0;e=7;break mc}H[f+16>>2]=n;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break kc}c=H[m+4>>2]}if(!c){break Hb}}m=j-4|0;p=H[j+4>>2]>>>26&4|(H[m>>2]>>>28&1|(g>>>21&16|(g>>>25&64|g>>>9&170)));i=w+(I[p+24384|0]<<2)|0;t=H[i>>2];c=H[t>>2];b=b-c|0;break Ib}nc:{if(g&2097168){break nc}i=w+(I[H[f+108>>2]+(g&495)|0]<<2)|0;m=H[i>>2];c=H[m>>2];b=b-c|0;oc:{if(d>>>16>>>0>>0){h=H[m+4>>2];n=b>>>0>>0;H[i>>2]=H[m+(n?8:12)>>2];while(1){pc:{if(e){break pc}e=H[f+16>>2];b=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break pc}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break pc}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?h:!h;break oc}d=d-(c<<16)|0;if(!(b&32768)){h=H[m+4>>2];c=b>>>0>>0;H[i>>2]=H[m+(c?12:8)>>2];while(1){qc:{if(e){break qc}e=H[f+16>>2];n=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break qc}H[f+16>>2]=n;d=(m<<9)+d|0;e=7;break qc}H[f+16>>2]=n;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break oc}c=H[m+4>>2]}if(!c){break nc}l=j-4|0;h=H[j+4>>2]>>>17&4|(H[l>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));i=w+(I[h+24384|0]<<2)|0;p=H[i>>2];c=H[p>>2];b=b-c|0;rc:{if(d>>>16>>>0>>0){m=H[p+4>>2];n=b>>>0>>0;H[i>>2]=H[p+(n?8:12)>>2];while(1){sc:{if(e){break sc}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break sc}H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break sc}H[f+16>>2]=b;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;m=n?m:!m;break rc}d=d-(c<<16)|0;if(!(b&32768)){m=H[p+4>>2];c=b>>>0>>0;H[i>>2]=H[p+(c?12:8)>>2];while(1){tc:{if(e){break tc}e=H[f+16>>2];n=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break tc}H[f+16>>2]=n;d=(p<<9)+d|0;e=7;break tc}H[f+16>>2]=n;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}m=c?!m:m;break rc}m=H[p+4>>2]}n=I[h+24640|0];H[o>>2]=(m|0)==(n|0)?s:u;H[l>>2]=H[l>>2]|32;H[j+4>>2]=H[j+4>>2]|8;c=j-268|0;H[c>>2]=H[c>>2]|131072;c=j-260|0;H[c>>2]=H[c>>2]|32768;c=j-264|0;v=c;M=H[c>>2];c=m^n;H[v>>2]=M|c<<31|65536;g=c<<19|g|16}uc:{if(g&16777344){break uc}h=g>>>3|0;i=w+(I[H[f+108>>2]+(h&495)|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;vc:{if(d>>>16>>>0>>0){m=H[l+4>>2];n=b>>>0>>0;H[i>>2]=H[l+(n?8:12)>>2];while(1){wc:{if(e){break wc}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break wc}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break wc}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break vc}d=d-(c<<16)|0;if(!(b&32768)){m=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){xc:{if(e){break xc}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break xc}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break xc}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break vc}c=H[l+4>>2]}if(!c){break uc}l=j-4|0;h=H[j+4>>2]>>>20&4|(H[l>>2]>>>22&1|(g>>>15&16|(g>>>19&64|h&170)));i=w+(I[h+24384|0]<<2)|0;p=H[i>>2];c=H[p>>2];b=b-c|0;yc:{if(d>>>16>>>0>>0){m=H[p+4>>2];n=b>>>0>>0;H[i>>2]=H[p+(n?8:12)>>2];while(1){zc:{if(e){break zc}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break zc}H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break zc}H[f+16>>2]=b;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break yc}d=d-(c<<16)|0;if(!(b&32768)){m=H[p+4>>2];c=b>>>0>>0;H[i>>2]=H[p+(c?12:8)>>2];while(1){Ac:{if(e){break Ac}e=H[f+16>>2];n=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Ac}H[f+16>>2]=n;d=(p<<9)+d|0;e=7;break Ac}H[f+16>>2]=n;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break yc}n=H[p+4>>2]}c=I[h+24640|0];H[o+256>>2]=(n|0)==(c|0)?s:u;H[l>>2]=H[l>>2]|256;H[j+4>>2]=H[j+4>>2]|64;g=(c^n)<<22|g|128}Bc:{if(g&134218752){break Bc}h=g>>>6|0;i=w+(I[H[f+108>>2]+(h&495)|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;Cc:{if(d>>>16>>>0>>0){m=H[l+4>>2];n=b>>>0>>0;H[i>>2]=H[l+(n?8:12)>>2];while(1){Dc:{if(e){break Dc}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Dc}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Dc}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break Cc}d=d-(c<<16)|0;if(!(b&32768)){m=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){Ec:{if(e){break Ec}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Ec}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break Ec}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break Cc}c=H[l+4>>2]}if(!c){break Bc}l=j-4|0;h=H[j+4>>2]>>>23&4|(H[l>>2]>>>25&1|(g>>>18&16|(g>>>22&64|h&170)));i=w+(I[h+24384|0]<<2)|0;p=H[i>>2];c=H[p>>2];b=b-c|0;Fc:{if(d>>>16>>>0>>0){m=H[p+4>>2];n=b>>>0>>0;H[i>>2]=H[p+(n?8:12)>>2];while(1){Gc:{if(e){break Gc}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Gc}H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Gc}H[f+16>>2]=b;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break Fc}d=d-(c<<16)|0;if(!(b&32768)){m=H[p+4>>2];c=b>>>0>>0;H[i>>2]=H[p+(c?12:8)>>2];while(1){Hc:{if(e){break Hc}e=H[f+16>>2];n=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Hc}H[f+16>>2]=n;d=(p<<9)+d|0;e=7;break Hc}H[f+16>>2]=n;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break Fc}n=H[p+4>>2]}c=I[h+24640|0];H[o+512>>2]=(n|0)==(c|0)?s:u;H[l>>2]=H[l>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;g=(c^n)<<25|g|1024}if(g&1073750016){break Hb}h=g>>>9|0;i=w+(I[H[f+108>>2]+(h&495)|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;Ic:{if(d>>>16>>>0>>0){m=H[l+4>>2];n=b>>>0>>0;H[i>>2]=H[l+(n?8:12)>>2];while(1){Jc:{if(e){break Jc}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Jc}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Jc}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break Ic}d=d-(c<<16)|0;if(!(b&32768)){m=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){Kc:{if(e){break Kc}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Kc}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break Kc}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break Ic}c=H[l+4>>2]}if(!c){break Hb}m=j-4|0;p=H[j+4>>2]>>>26&4|(H[m>>2]>>>28&1|(g>>>21&16|(g>>>25&64|h&170)));i=w+(I[p+24384|0]<<2)|0;t=H[i>>2];c=H[t>>2];b=b-c|0}Lc:{if(d>>>16>>>0>>0){h=H[t+4>>2];n=b>>>0>>0;H[i>>2]=H[(n?8:12)+t>>2];while(1){Mc:{if(e){break Mc}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Mc}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Mc}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?h:!h;break Lc}d=d-(c<<16)|0;if(!(b&32768)){h=H[t+4>>2];c=b>>>0>>0;H[i>>2]=H[(c?12:8)+t>>2];while(1){Nc:{if(e){break Nc}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Nc}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break Nc}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!h:h;break Lc}n=H[t+4>>2]}c=I[p+24640|0];H[o+768>>2]=(n|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|16384;H[j+4>>2]=H[j+4>>2]|4096;H[j+260>>2]=H[j+260>>2]|4;H[j+268>>2]=H[j+268>>2]|1;c=c^n;H[j+264>>2]=H[j+264>>2]|c<<18|2;g=c<<28|g|8192}H[j>>2]=g&-1226833921}g=j+4|0;c=o+4|0;r=r+1|0;if((r|0)!=64){continue}break}g=j+12|0;c=o+772|0;n=x>>>0<60;x=x+4|0;if(n){continue}break}break Eb}b=1<>>1|b;k=H[f+120>>2];c=(k+(W<<2)|0)+12|0;g=H[f+128>>2];e=H[f+8>>2];b=H[f+4>>2];d=H[f>>2];i=H[f+104>>2];o=H[f+116>>2];if(V&8){Oc:{if(g>>>0<4){break Oc}if(W){n=f+100|0;q=f+96|0;r=N(W,12);u=W<<3;v=0-M|0;D=f+28|0;while(1){w=0;while(1){j=c;c=H[c>>2];Pc:{Qc:{Rc:{if(c){Sc:{if(c&2097168){break Sc}i=D+(I[H[f+108>>2]+(c&495)|0]<<2)|0;l=H[i>>2];g=H[l>>2];b=b-g|0;Tc:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[l+4>>2];if(b&32768){break Tc}h=H[l+4>>2];g=b>>>0>>0;H[i>>2]=H[l+(g?12:8)>>2];while(1){Uc:{if(e){break Uc}e=H[f+16>>2];k=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break Uc}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break Uc}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!h:h;break Tc}h=H[l+4>>2];k=b>>>0>>0;H[i>>2]=H[l+(k?8:12)>>2];while(1){Vc:{if(e){break Vc}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Vc}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Vc}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?h:!h}if(!k){break Sc}p=j-4|0;h=H[j+4>>2]>>>17&4|(H[p>>2]>>>19&1|(c>>>14&16|(c>>>16&64|c&170)));i=D+(I[h+24384|0]<<2)|0;s=H[i>>2];g=H[s>>2];b=b-g|0;Wc:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[s+4>>2];if(b&32768){break Wc}l=H[s+4>>2];g=b>>>0>>0;H[i>>2]=H[s+(g?12:8)>>2];while(1){Xc:{if(e){break Xc}e=H[f+16>>2];k=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(s<<8)+d|0;break Xc}if(s>>>0<=143){H[f+16>>2]=k;d=(s<<9)+d|0;e=7;break Xc}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break Wc}l=H[s+4>>2];k=b>>>0>>0;H[i>>2]=H[s+(k?8:12)>>2];while(1){Yc:{if(e){break Yc}e=H[f+16>>2];b=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(s<<8)+d|0;break Yc}if(s>>>0<=143){H[f+16>>2]=b;d=(s<<9)+d|0;e=7;break Yc}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}g=I[h+24640|0];H[o>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|32;H[j+4>>2]=H[j+4>>2]|8;c=(g^k)<<19|c|16}Zc:{if(c&16777344){break Zc}h=c>>>3|0;i=D+(I[H[f+108>>2]+(h&495)|0]<<2)|0;p=H[i>>2];g=H[p>>2];b=b-g|0;_c:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[p+4>>2];if(b&32768){break _c}l=H[p+4>>2];g=b>>>0>>0;H[i>>2]=H[p+(g?12:8)>>2];while(1){$c:{if(e){break $c}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break $c}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break $c}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break _c}l=H[p+4>>2];k=b>>>0>>0;H[i>>2]=H[p+(k?8:12)>>2];while(1){ad:{if(e){break ad}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break ad}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break ad}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}if(!k){break Zc}p=j-4|0;h=H[j+4>>2]>>>20&4|(H[p>>2]>>>22&1|(c>>>15&16|(c>>>19&64|h&170)));i=D+(I[h+24384|0]<<2)|0;s=H[i>>2];g=H[s>>2];b=b-g|0;t=(W<<2)+o|0;bd:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[s+4>>2];if(b&32768){break bd}l=H[s+4>>2];g=b>>>0>>0;H[i>>2]=H[s+(g?12:8)>>2];while(1){cd:{if(e){break cd}e=H[f+16>>2];k=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(s<<8)+d|0;break cd}if(s>>>0<=143){H[f+16>>2]=k;d=(s<<9)+d|0;e=7;break cd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break bd}l=H[s+4>>2];k=b>>>0>>0;H[i>>2]=H[s+(k?8:12)>>2];while(1){dd:{if(e){break dd}e=H[f+16>>2];b=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(s<<8)+d|0;break dd}if(s>>>0<=143){H[f+16>>2]=b;d=(s<<9)+d|0;e=7;break dd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}g=I[h+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|256;H[j+4>>2]=H[j+4>>2]|64;c=(g^k)<<22|c|128}ed:{if(c&134218752){break ed}h=c>>>6|0;i=D+(I[H[f+108>>2]+(h&495)|0]<<2)|0;p=H[i>>2];g=H[p>>2];b=b-g|0;fd:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[p+4>>2];if(b&32768){break fd}l=H[p+4>>2];g=b>>>0>>0;H[i>>2]=H[p+(g?12:8)>>2];while(1){gd:{if(e){break gd}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break gd}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break gd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break fd}l=H[p+4>>2];k=b>>>0>>0;H[i>>2]=H[p+(k?8:12)>>2];while(1){hd:{if(e){break hd}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break hd}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break hd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}if(!k){break ed}p=j-4|0;h=H[j+4>>2]>>>23&4|(H[p>>2]>>>25&1|(c>>>18&16|(c>>>22&64|h&170)));i=D+(I[h+24384|0]<<2)|0;s=H[i>>2];g=H[s>>2];b=b-g|0;t=o+u|0;id:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[s+4>>2];if(b&32768){break id}l=H[s+4>>2];g=b>>>0>>0;H[i>>2]=H[s+(g?12:8)>>2];while(1){jd:{if(e){break jd}e=H[f+16>>2];k=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(s<<8)+d|0;break jd}if(s>>>0<=143){H[f+16>>2]=k;d=(s<<9)+d|0;e=7;break jd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break id}l=H[s+4>>2];k=b>>>0>>0;H[i>>2]=H[s+(k?8:12)>>2];while(1){kd:{if(e){break kd}e=H[f+16>>2];b=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(s<<8)+d|0;break kd}if(s>>>0<=143){H[f+16>>2]=b;d=(s<<9)+d|0;e=7;break kd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}g=I[h+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;c=(g^k)<<25|c|1024}if(c&1073750016){break Qc}h=c>>>9|0;i=D+(I[H[f+108>>2]+(h&495)|0]<<2)|0;p=H[i>>2];g=H[p>>2];b=b-g|0;ld:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[p+4>>2];if(b&32768){break ld}l=H[p+4>>2];g=b>>>0>>0;H[i>>2]=H[p+(g?12:8)>>2];while(1){md:{if(e){break md}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break md}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break md}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break ld}l=H[p+4>>2];k=b>>>0>>0;H[i>>2]=H[p+(k?8:12)>>2];while(1){nd:{if(e){break nd}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break nd}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break nd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}if(!k){break Qc}p=j-4|0;T=H[j+4>>2]>>>26&4|(H[p>>2]>>>28&1|(c>>>21&16|(c>>>25&64|h&170)));i=D+(I[T+24384|0]<<2)|0;t=H[i>>2];g=H[t>>2];b=b-g|0;break Rc}k=H[q>>2];c=H[k>>2];b=b-c|0;od:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;g=H[k+4>>2];if(b&32768){break od}i=H[k+4>>2];c=b>>>0>>0;H[q>>2]=H[k+(c?12:8)>>2];while(1){pd:{if(e){break pd}k=H[f+16>>2];g=k+1|0;h=I[k+1|0];if(I[k|0]!=255){H[f+16>>2]=g;e=8;d=(h<<8)+d|0;break pd}if(h>>>0<=143){H[f+16>>2]=g;d=(h<<9)+d|0;e=7;break pd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=c?!i:i;break od}i=H[k+4>>2];g=b>>>0>>0;H[q>>2]=H[k+(g?8:12)>>2];while(1){qd:{if(e){break qd}k=H[f+16>>2];b=k+1|0;h=I[k+1|0];if(I[k|0]!=255){H[f+16>>2]=b;e=8;d=(h<<8)+d|0;break qd}if(h>>>0<=143){H[f+16>>2]=b;d=(h<<9)+d|0;e=7;break qd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;g=g?i:!i}if(!g){i=q;break Pc}g=H[n>>2];c=H[g>>2];b=b-c|0;rd:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;k=H[g+4>>2];if(b&32768){break rd}h=H[g+4>>2];c=b>>>0>>0;g=H[(c?12:8)+g>>2];H[n>>2]=g;while(1){sd:{if(e){break sd}i=H[f+16>>2];k=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break sd}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break sd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=c?!h:h;break rd}h=H[g+4>>2];k=b>>>0>>0;g=H[(k?8:12)+g>>2];H[n>>2]=g;while(1){td:{if(e){break td}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break td}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break td}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;k=k?h:!h}c=H[g>>2];b=b-c|0;ud:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;i=H[g+4>>2];if(b&32768){break ud}h=H[g+4>>2];c=b>>>0>>0;H[n>>2]=H[(c?12:8)+g>>2];while(1){vd:{if(e){break vd}i=H[f+16>>2];g=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=g;e=8;d=(l<<8)+d|0;break vd}if(l>>>0<=143){H[f+16>>2]=g;d=(l<<9)+d|0;e=7;break vd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!h:h;break ud}h=H[g+4>>2];i=g;g=b>>>0>>0;H[n>>2]=H[i+(g?8:12)>>2];while(1){wd:{if(e){break wd}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break wd}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break wd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=g?h:!h}g=i;c=0;i=n;xd:{yd:{zd:{Ad:{Bd:{switch(g|k<<1){case 0:l=j-4|0;k=H[j+4>>2]>>>17&4|H[l>>2]>>>19&1;g=D+(I[k+24384|0]<<2)|0;i=H[g>>2];c=H[i>>2];b=b-c|0;Cd:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;s=H[i+4>>2];if(b&32768){break Cd}h=H[i+4>>2];c=b>>>0>>0;H[g>>2]=H[i+(c?12:8)>>2];while(1){Dd:{if(e){break Dd}i=H[f+16>>2];g=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=g;e=8;d=(p<<8)+d|0;break Dd}if(p>>>0<=143){H[f+16>>2]=g;d=(p<<9)+d|0;e=7;break Dd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=c?!h:h;break Cd}h=H[i+4>>2];s=g;g=b>>>0>>0;H[s>>2]=H[i+(g?8:12)>>2];while(1){Ed:{if(e){break Ed}i=H[f+16>>2];b=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break Ed}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Ed}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;s=g?h:!h}g=s;c=I[k+24640|0];H[o>>2]=(g|0)==(c|0)?M:v;H[l>>2]=H[l>>2]|32;H[j+4>>2]=H[j+4>>2]|8;k=(c^g)<<19;t=H[f+108>>2];g=D+(I[t+2|0]<<2)|0;i=H[g>>2];c=H[i>>2];b=b-c|0;Fd:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;s=H[i+4>>2];if(b&32768){break Fd}h=H[i+4>>2];c=b>>>0>>0;H[g>>2]=H[i+(c?12:8)>>2];while(1){Gd:{if(e){break Gd}i=H[f+16>>2];g=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=g;e=8;d=(l<<8)+d|0;break Gd}if(l>>>0<=143){H[f+16>>2]=g;d=(l<<9)+d|0;e=7;break Gd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=c?!h:h;break Fd}h=H[i+4>>2];s=g;g=b>>>0>>0;H[s>>2]=H[i+(g?8:12)>>2];while(1){Hd:{if(e){break Hd}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Hd}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Hd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;s=g?h:!h}g=s;c=k|16;if(!g){break Ad}break;case 1:break Bd;case 2:break zd;case 3:break xd;default:break Qc}}l=j-4|0;i=H[j+4>>2]>>>20&4|(H[l>>2]>>>22&1|(c>>>15&16|(c>>>19&64|c>>>3&170)));k=D+(I[i+24384|0]<<2)|0;p=H[k>>2];g=H[p>>2];b=b-g|0;t=(W<<2)+o|0;Id:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;s=H[p+4>>2];if(b&32768){break Id}h=H[p+4>>2];g=b>>>0>>0;H[k>>2]=H[p+(g?12:8)>>2];while(1){Jd:{if(e){break Jd}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break Jd}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break Jd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=g?!h:h;break Id}h=H[p+4>>2];s=k;k=b>>>0>>0;H[s>>2]=H[p+(k?8:12)>>2];while(1){Kd:{if(e){break Kd}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break Kd}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Kd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;s=k?h:!h}k=s;g=I[i+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[l>>2]=H[l>>2]|256;H[j+4>>2]=H[j+4>>2]|64;t=H[f+108>>2];c=(g^k)<<22|c|128}k=D+(I[(c>>>6&495)+t|0]<<2)|0;i=H[k>>2];g=H[i>>2];b=b-g|0;Ld:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;s=H[i+4>>2];if(b&32768){break Ld}h=H[i+4>>2];g=b>>>0>>0;H[k>>2]=H[i+(g?12:8)>>2];while(1){Md:{if(e){break Md}i=H[f+16>>2];k=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break Md}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break Md}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=g?!h:h;break Ld}h=H[i+4>>2];s=k;k=b>>>0>>0;H[s>>2]=H[i+(k?8:12)>>2];while(1){Nd:{if(e){break Nd}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Nd}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Nd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;s=k?h:!h}if(!s){break yd}}l=j-4|0;i=H[j+4>>2]>>>23&4|(H[l>>2]>>>25&1|(c>>>18&16|(c>>>22&64|c>>>6&170)));k=D+(I[i+24384|0]<<2)|0;p=H[k>>2];g=H[p>>2];b=b-g|0;t=o+u|0;Od:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;s=H[p+4>>2];if(b&32768){break Od}h=H[p+4>>2];g=b>>>0>>0;H[k>>2]=H[p+(g?12:8)>>2];while(1){Pd:{if(e){break Pd}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break Pd}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break Pd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=g?!h:h;break Od}h=H[p+4>>2];s=k;k=b>>>0>>0;H[s>>2]=H[p+(k?8:12)>>2];while(1){Qd:{if(e){break Qd}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break Qd}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Qd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;s=k?h:!h}k=s;g=I[i+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[l>>2]=H[l>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;c=(g^k)<<25|c|1024;t=H[f+108>>2]}i=D+(I[(c>>>9&495)+t|0]<<2)|0;l=H[i>>2];g=H[l>>2];b=b-g|0;Rd:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[l+4>>2];if(b&32768){break Rd}h=H[l+4>>2];g=b>>>0>>0;H[i>>2]=H[l+(g?12:8)>>2];while(1){Sd:{if(e){break Sd}e=H[f+16>>2];k=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break Sd}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break Sd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!h:h;break Rd}h=H[l+4>>2];k=b>>>0>>0;H[i>>2]=H[l+(k?8:12)>>2];while(1){Td:{if(e){break Td}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Td}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Td}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?h:!h}if(!k){break Qc}}p=j-4|0;T=H[j+4>>2]>>>26&4|(H[p>>2]>>>28&1|(c>>>21&16|(c>>>25&64|c>>>9&170)));i=D+(I[T+24384|0]<<2)|0;t=H[i>>2];g=H[t>>2];b=b-g|0}s=o+r|0;Ud:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[t+4>>2];if(b&32768){break Ud}h=H[t+4>>2];g=b>>>0>>0;H[i>>2]=H[(g?12:8)+t>>2];while(1){Vd:{if(e){break Vd}e=H[f+16>>2];k=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break Vd}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break Vd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!h:h;break Ud}h=H[t+4>>2];k=b>>>0>>0;H[i>>2]=H[(k?8:12)+t>>2];while(1){Wd:{if(e){break Wd}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Wd}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Wd}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?h:!h}g=I[T+24640|0];H[s>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|16384;H[j+4>>2]=H[j+4>>2]|4096;h=j+(H[f+124>>2]<<2)|0;H[h+4>>2]=H[h+4>>2]|4;H[h+12>>2]=H[h+12>>2]|1;g=g^k;H[h+8>>2]=H[h+8>>2]|g<<18|2;c=g<<28|c|8192}H[j>>2]=c&-1226833921}c=j+4|0;o=o+4|0;w=w+1|0;if((W|0)!=(w|0)){continue}break}c=j+12|0;o=o+r|0;x=x+4|0;g=H[f+128>>2];if(x>>>0<(g&-4)>>>0){continue}break}break Oc}x=g&-4;c=(k+(x<<1)|0)+12|0}H[f+8>>2]=e;H[f+4>>2]=b;H[f>>2]=d;H[f+104>>2]=i;if(!W|g>>>0<=x>>>0){break Db}while(1){e=0;if(H[f+128>>2]!=(x|0)){while(1){Wb(f,c,(N(e,W)<<2)+o|0,M,e,1);e=e+1|0;if(e>>>0>2]-x>>>0){continue}break}}H[c>>2]=H[c>>2]&-1226833921;o=o+4|0;c=c+4|0;m=m+1|0;if((W|0)!=(m|0)){continue}break}break Db}Xd:{if(g>>>0<4){break Xd}if(W){n=f+100|0;q=f+96|0;r=N(W,12);u=W<<3;v=0-M|0;D=f+28|0;while(1){w=0;while(1){j=c;c=H[c>>2];Yd:{Zd:{_d:{if(c){$d:{if(c&2097168){break $d}i=D+(I[H[f+108>>2]+(c&495)|0]<<2)|0;l=H[i>>2];g=H[l>>2];b=b-g|0;ae:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[l+4>>2];if(b&32768){break ae}h=H[l+4>>2];g=b>>>0>>0;H[i>>2]=H[l+(g?12:8)>>2];while(1){be:{if(e){break be}e=H[f+16>>2];k=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break be}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break be}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!h:h;break ae}h=H[l+4>>2];k=b>>>0>>0;H[i>>2]=H[l+(k?8:12)>>2];while(1){ce:{if(e){break ce}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break ce}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break ce}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?h:!h}if(!k){break $d}p=j-4|0;h=H[j+4>>2]>>>17&4|(H[p>>2]>>>19&1|(c>>>14&16|(c>>>16&64|c&170)));i=D+(I[h+24384|0]<<2)|0;s=H[i>>2];g=H[s>>2];b=b-g|0;de:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[s+4>>2];if(b&32768){break de}l=H[s+4>>2];g=b>>>0>>0;H[i>>2]=H[s+(g?12:8)>>2];while(1){ee:{if(e){break ee}e=H[f+16>>2];k=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(s<<8)+d|0;break ee}if(s>>>0<=143){H[f+16>>2]=k;d=(s<<9)+d|0;e=7;break ee}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break de}l=H[s+4>>2];k=b>>>0>>0;H[i>>2]=H[s+(k?8:12)>>2];while(1){fe:{if(e){break fe}e=H[f+16>>2];b=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(s<<8)+d|0;break fe}if(s>>>0<=143){H[f+16>>2]=b;d=(s<<9)+d|0;e=7;break fe}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}g=I[h+24640|0];H[o>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|32;H[j+4>>2]=H[j+4>>2]|8;h=j+(-2-H[f+124>>2]<<2)|0;H[h+4>>2]=H[h+4>>2]|32768;k=g^k;H[h>>2]=H[h>>2]|k<<31|65536;g=h-4|0;H[g>>2]=H[g>>2]|131072;c=k<<19|c|16}ge:{if(c&16777344){break ge}h=c>>>3|0;i=D+(I[H[f+108>>2]+(h&495)|0]<<2)|0;p=H[i>>2];g=H[p>>2];b=b-g|0;he:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[p+4>>2];if(b&32768){break he}l=H[p+4>>2];g=b>>>0>>0;H[i>>2]=H[p+(g?12:8)>>2];while(1){ie:{if(e){break ie}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break ie}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break ie}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break he}l=H[p+4>>2];k=b>>>0>>0;H[i>>2]=H[p+(k?8:12)>>2];while(1){je:{if(e){break je}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break je}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break je}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}if(!k){break ge}p=j-4|0;h=H[j+4>>2]>>>20&4|(H[p>>2]>>>22&1|(c>>>15&16|(c>>>19&64|h&170)));i=D+(I[h+24384|0]<<2)|0;s=H[i>>2];g=H[s>>2];b=b-g|0;t=(W<<2)+o|0;ke:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[s+4>>2];if(b&32768){break ke}l=H[s+4>>2];g=b>>>0>>0;H[i>>2]=H[s+(g?12:8)>>2];while(1){le:{if(e){break le}e=H[f+16>>2];k=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(s<<8)+d|0;break le}if(s>>>0<=143){H[f+16>>2]=k;d=(s<<9)+d|0;e=7;break le}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break ke}l=H[s+4>>2];k=b>>>0>>0;H[i>>2]=H[s+(k?8:12)>>2];while(1){me:{if(e){break me}e=H[f+16>>2];b=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(s<<8)+d|0;break me}if(s>>>0<=143){H[f+16>>2]=b;d=(s<<9)+d|0;e=7;break me}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}g=I[h+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|256;H[j+4>>2]=H[j+4>>2]|64;c=(g^k)<<22|c|128}ne:{if(c&134218752){break ne}h=c>>>6|0;i=D+(I[H[f+108>>2]+(h&495)|0]<<2)|0;p=H[i>>2];g=H[p>>2];b=b-g|0;oe:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[p+4>>2];if(b&32768){break oe}l=H[p+4>>2];g=b>>>0>>0;H[i>>2]=H[p+(g?12:8)>>2];while(1){pe:{if(e){break pe}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break pe}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break pe}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break oe}l=H[p+4>>2];k=b>>>0>>0;H[i>>2]=H[p+(k?8:12)>>2];while(1){qe:{if(e){break qe}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break qe}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break qe}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}if(!k){break ne}p=j-4|0;h=H[j+4>>2]>>>23&4|(H[p>>2]>>>25&1|(c>>>18&16|(c>>>22&64|h&170)));i=D+(I[h+24384|0]<<2)|0;s=H[i>>2];g=H[s>>2];b=b-g|0;t=o+u|0;re:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[s+4>>2];if(b&32768){break re}l=H[s+4>>2];g=b>>>0>>0;H[i>>2]=H[s+(g?12:8)>>2];while(1){se:{if(e){break se}e=H[f+16>>2];k=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(s<<8)+d|0;break se}if(s>>>0<=143){H[f+16>>2]=k;d=(s<<9)+d|0;e=7;break se}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break re}l=H[s+4>>2];k=b>>>0>>0;H[i>>2]=H[s+(k?8:12)>>2];while(1){te:{if(e){break te}e=H[f+16>>2];b=e+1|0;s=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(s<<8)+d|0;break te}if(s>>>0<=143){H[f+16>>2]=b;d=(s<<9)+d|0;e=7;break te}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}g=I[h+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;c=(g^k)<<25|c|1024}if(c&1073750016){break Zd}h=c>>>9|0;i=D+(I[H[f+108>>2]+(h&495)|0]<<2)|0;p=H[i>>2];g=H[p>>2];b=b-g|0;ue:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[p+4>>2];if(b&32768){break ue}l=H[p+4>>2];g=b>>>0>>0;H[i>>2]=H[p+(g?12:8)>>2];while(1){ve:{if(e){break ve}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break ve}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break ve}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!l:l;break ue}l=H[p+4>>2];k=b>>>0>>0;H[i>>2]=H[p+(k?8:12)>>2];while(1){we:{if(e){break we}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break we}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break we}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?l:!l}if(!k){break Zd}p=j-4|0;T=H[j+4>>2]>>>26&4|(H[p>>2]>>>28&1|(c>>>21&16|(c>>>25&64|h&170)));i=D+(I[T+24384|0]<<2)|0;t=H[i>>2];g=H[t>>2];b=b-g|0;break _d}k=H[q>>2];c=H[k>>2];b=b-c|0;xe:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;g=H[k+4>>2];if(b&32768){break xe}i=H[k+4>>2];c=b>>>0>>0;H[q>>2]=H[k+(c?12:8)>>2];while(1){ye:{if(e){break ye}k=H[f+16>>2];g=k+1|0;h=I[k+1|0];if(I[k|0]!=255){H[f+16>>2]=g;e=8;d=(h<<8)+d|0;break ye}if(h>>>0<=143){H[f+16>>2]=g;d=(h<<9)+d|0;e=7;break ye}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=c?!i:i;break xe}i=H[k+4>>2];g=b>>>0>>0;H[q>>2]=H[k+(g?8:12)>>2];while(1){ze:{if(e){break ze}k=H[f+16>>2];b=k+1|0;h=I[k+1|0];if(I[k|0]!=255){H[f+16>>2]=b;e=8;d=(h<<8)+d|0;break ze}if(h>>>0<=143){H[f+16>>2]=b;d=(h<<9)+d|0;e=7;break ze}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;g=g?i:!i}if(!g){i=q;break Yd}g=H[n>>2];c=H[g>>2];b=b-c|0;Ae:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;k=H[g+4>>2];if(b&32768){break Ae}h=H[g+4>>2];c=b>>>0>>0;g=H[(c?12:8)+g>>2];H[n>>2]=g;while(1){Be:{if(e){break Be}i=H[f+16>>2];k=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break Be}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break Be}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=c?!h:h;break Ae}h=H[g+4>>2];k=b>>>0>>0;g=H[(k?8:12)+g>>2];H[n>>2]=g;while(1){Ce:{if(e){break Ce}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Ce}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Ce}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;k=k?h:!h}c=H[g>>2];b=b-c|0;De:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;i=H[g+4>>2];if(b&32768){break De}h=H[g+4>>2];c=b>>>0>>0;H[n>>2]=H[(c?12:8)+g>>2];while(1){Ee:{if(e){break Ee}i=H[f+16>>2];g=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=g;e=8;d=(l<<8)+d|0;break Ee}if(l>>>0<=143){H[f+16>>2]=g;d=(l<<9)+d|0;e=7;break Ee}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!h:h;break De}h=H[g+4>>2];i=g;g=b>>>0>>0;H[n>>2]=H[i+(g?8:12)>>2];while(1){Fe:{if(e){break Fe}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Fe}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Fe}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=g?h:!h}g=i;c=0;i=n;Ge:{He:{Ie:{Je:{Ke:{switch(g|k<<1){case 0:l=j-4|0;k=H[j+4>>2]>>>17&4|H[l>>2]>>>19&1;g=D+(I[k+24384|0]<<2)|0;i=H[g>>2];c=H[i>>2];b=b-c|0;Le:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;s=H[i+4>>2];if(b&32768){break Le}h=H[i+4>>2];c=b>>>0>>0;H[g>>2]=H[i+(c?12:8)>>2];while(1){Me:{if(e){break Me}i=H[f+16>>2];g=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=g;e=8;d=(p<<8)+d|0;break Me}if(p>>>0<=143){H[f+16>>2]=g;d=(p<<9)+d|0;e=7;break Me}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=c?!h:h;break Le}h=H[i+4>>2];s=g;g=b>>>0>>0;H[s>>2]=H[i+(g?8:12)>>2];while(1){Ne:{if(e){break Ne}i=H[f+16>>2];b=i+1|0;p=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break Ne}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Ne}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;s=g?h:!h}g=s;c=I[k+24640|0];H[o>>2]=(g|0)==(c|0)?M:v;H[l>>2]=H[l>>2]|32;H[j+4>>2]=H[j+4>>2]|8;k=j+(-2-H[f+124>>2]<<2)|0;H[k+4>>2]=H[k+4>>2]|32768;g=c^g;H[k>>2]=H[k>>2]|g<<31|65536;c=k-4|0;H[c>>2]=H[c>>2]|131072;k=g<<19;t=H[f+108>>2];g=D+(I[t+2|0]<<2)|0;i=H[g>>2];c=H[i>>2];b=b-c|0;Oe:{if(d>>>16>>>0>=c>>>0){d=d-(c<<16)|0;s=H[i+4>>2];if(b&32768){break Oe}h=H[i+4>>2];c=b>>>0>>0;H[g>>2]=H[i+(c?12:8)>>2];while(1){Pe:{if(e){break Pe}i=H[f+16>>2];g=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=g;e=8;d=(l<<8)+d|0;break Pe}if(l>>>0<=143){H[f+16>>2]=g;d=(l<<9)+d|0;e=7;break Pe}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=c?!h:h;break Oe}h=H[i+4>>2];s=g;g=b>>>0>>0;H[s>>2]=H[i+(g?8:12)>>2];while(1){Qe:{if(e){break Qe}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break Qe}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Qe}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;s=g?h:!h}g=s;c=k|16;if(!g){break Je}break;case 1:break Ke;case 2:break Ie;case 3:break Ge;default:break Zd}}l=j-4|0;i=H[j+4>>2]>>>20&4|(H[l>>2]>>>22&1|(c>>>15&16|(c>>>19&64|c>>>3&170)));k=D+(I[i+24384|0]<<2)|0;p=H[k>>2];g=H[p>>2];b=b-g|0;t=(W<<2)+o|0;Re:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;s=H[p+4>>2];if(b&32768){break Re}h=H[p+4>>2];g=b>>>0>>0;H[k>>2]=H[p+(g?12:8)>>2];while(1){Se:{if(e){break Se}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break Se}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break Se}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=g?!h:h;break Re}h=H[p+4>>2];s=k;k=b>>>0>>0;H[s>>2]=H[p+(k?8:12)>>2];while(1){Te:{if(e){break Te}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break Te}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Te}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;s=k?h:!h}k=s;g=I[i+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[l>>2]=H[l>>2]|256;H[j+4>>2]=H[j+4>>2]|64;t=H[f+108>>2];c=(g^k)<<22|c|128}k=D+(I[(c>>>6&495)+t|0]<<2)|0;i=H[k>>2];g=H[i>>2];b=b-g|0;Ue:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;s=H[i+4>>2];if(b&32768){break Ue}h=H[i+4>>2];g=b>>>0>>0;H[k>>2]=H[i+(g?12:8)>>2];while(1){Ve:{if(e){break Ve}i=H[f+16>>2];k=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break Ve}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break Ve}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=g?!h:h;break Ue}h=H[i+4>>2];s=k;k=b>>>0>>0;H[s>>2]=H[i+(k?8:12)>>2];while(1){We:{if(e){break We}i=H[f+16>>2];b=i+1|0;l=I[i+1|0];if(I[i|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break We}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break We}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;s=k?h:!h}if(!s){break He}}l=j-4|0;i=H[j+4>>2]>>>23&4|(H[l>>2]>>>25&1|(c>>>18&16|(c>>>22&64|c>>>6&170)));k=D+(I[i+24384|0]<<2)|0;p=H[k>>2];g=H[p>>2];b=b-g|0;t=o+u|0;Xe:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;s=H[p+4>>2];if(b&32768){break Xe}h=H[p+4>>2];g=b>>>0>>0;H[k>>2]=H[p+(g?12:8)>>2];while(1){Ye:{if(e){break Ye}e=H[f+16>>2];k=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(p<<8)+d|0;break Ye}if(p>>>0<=143){H[f+16>>2]=k;d=(p<<9)+d|0;e=7;break Ye}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}s=g?!h:h;break Xe}h=H[p+4>>2];s=k;k=b>>>0>>0;H[s>>2]=H[p+(k?8:12)>>2];while(1){Ze:{if(e){break Ze}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(p<<8)+d|0;break Ze}if(p>>>0<=143){H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Ze}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;s=k?h:!h}k=s;g=I[i+24640|0];H[t>>2]=(k|0)==(g|0)?M:v;H[l>>2]=H[l>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;c=(g^k)<<25|c|1024;t=H[f+108>>2]}i=D+(I[(c>>>9&495)+t|0]<<2)|0;l=H[i>>2];g=H[l>>2];b=b-g|0;_e:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[l+4>>2];if(b&32768){break _e}h=H[l+4>>2];g=b>>>0>>0;H[i>>2]=H[l+(g?12:8)>>2];while(1){$e:{if(e){break $e}e=H[f+16>>2];k=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break $e}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break $e}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!h:h;break _e}h=H[l+4>>2];k=b>>>0>>0;H[i>>2]=H[l+(k?8:12)>>2];while(1){af:{if(e){break af}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break af}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break af}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?h:!h}if(!k){break Zd}}p=j-4|0;T=H[j+4>>2]>>>26&4|(H[p>>2]>>>28&1|(c>>>21&16|(c>>>25&64|c>>>9&170)));i=D+(I[T+24384|0]<<2)|0;t=H[i>>2];g=H[t>>2];b=b-g|0}s=o+r|0;bf:{if(d>>>16>>>0>=g>>>0){d=d-(g<<16)|0;k=H[t+4>>2];if(b&32768){break bf}h=H[t+4>>2];g=b>>>0>>0;H[i>>2]=H[(g?12:8)+t>>2];while(1){cf:{if(e){break cf}e=H[f+16>>2];k=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=k;e=8;d=(l<<8)+d|0;break cf}if(l>>>0<=143){H[f+16>>2]=k;d=(l<<9)+d|0;e=7;break cf}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}k=g?!h:h;break bf}h=H[t+4>>2];k=b>>>0>>0;H[i>>2]=H[(k?8:12)+t>>2];while(1){df:{if(e){break df}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=b;e=8;d=(l<<8)+d|0;break df}if(l>>>0<=143){H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break df}H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;k=k?h:!h}g=I[T+24640|0];H[s>>2]=(k|0)==(g|0)?M:v;H[p>>2]=H[p>>2]|16384;H[j+4>>2]=H[j+4>>2]|4096;h=j+(H[f+124>>2]<<2)|0;H[h+4>>2]=H[h+4>>2]|4;H[h+12>>2]=H[h+12>>2]|1;g=g^k;H[h+8>>2]=H[h+8>>2]|g<<18|2;c=g<<28|c|8192}H[j>>2]=c&-1226833921}c=j+4|0;o=o+4|0;w=w+1|0;if((W|0)!=(w|0)){continue}break}c=j+12|0;o=o+r|0;x=x+4|0;g=H[f+128>>2];if(x>>>0<(g&-4)>>>0){continue}break}break Xd}x=g&-4;c=(k+(x<<1)|0)+12|0}H[f+8>>2]=e;H[f+4>>2]=b;H[f>>2]=d;H[f+104>>2]=i;if(!W|g>>>0<=x>>>0){break Db}while(1){e=0;if(H[f+128>>2]!=(x|0)){while(1){Wb(f,c,(N(e,W)<<2)+o|0,M,e,0);e=e+1|0;if(e>>>0>2]-x>>>0){continue}break}}H[c>>2]=H[c>>2]&-1226833921;o=o+4|0;c=c+4|0;m=m+1|0;if((W|0)!=(m|0)){continue}break}break Db}while(1){r=0;while(1){o=c;j=g;g=H[g>>2];ef:{ff:{gf:{if(!g){i=H[k>>2];g=H[i>>2];b=b-g|0;hf:{if(d>>>16>>>0>>0){n=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?8:12)>>2];while(1){jf:{if(e){break jf}i=H[f+16>>2];b=i+1|0;h=I[i+1|0];if(I[i|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break jf}H[f+16>>2]=b;d=(h<<9)+d|0;e=7;break jf}H[f+16>>2]=b;e=8;d=(h<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?n:!n;break hf}d=d-(g<<16)|0;if(!(b&32768)){n=H[i+4>>2];c=b>>>0>>0;H[k>>2]=H[i+(c?12:8)>>2];while(1){kf:{if(e){break kf}i=H[f+16>>2];g=i+1|0;h=I[i+1|0];if(I[i|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break kf}H[f+16>>2]=g;d=(h<<9)+d|0;e=7;break kf}H[f+16>>2]=g;e=8;d=(h<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!n:n;break hf}c=H[i+4>>2]}if(!c){i=k;break ef}c=H[q>>2];g=H[c>>2];b=b-g|0;lf:{if(d>>>16>>>0>>0){h=H[c+4>>2];i=b>>>0>>0;c=H[(i?8:12)+c>>2];H[q>>2]=c;while(1){mf:{if(e){break mf}n=H[f+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break mf}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break mf}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;n=i?h:!h;break lf}d=d-(g<<16)|0;if(!(b&32768)){h=H[c+4>>2];g=b>>>0>>0;c=H[(g?12:8)+c>>2];H[q>>2]=c;while(1){nf:{if(e){break nf}n=H[f+16>>2];i=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break nf}H[f+16>>2]=i;d=(m<<9)+d|0;e=7;break nf}H[f+16>>2]=i;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=g?!h:h;break lf}n=H[c+4>>2]}g=H[c>>2];b=b-g|0;of:{if(d>>>16>>>0>>0){h=H[c+4>>2];i=c;c=b>>>0>>0;H[q>>2]=H[i+(c?8:12)>>2];while(1){pf:{if(e){break pf}i=H[f+16>>2];b=i+1|0;m=I[i+1|0];if(I[i|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break pf}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break pf}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?h:!h;break of}d=d-(g<<16)|0;if(!(b&32768)){h=H[c+4>>2];i=c;c=b>>>0>>0;H[q>>2]=H[i+(c?12:8)>>2];while(1){qf:{if(e){break qf}i=H[f+16>>2];g=i+1|0;m=I[i+1|0];if(I[i|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break qf}H[f+16>>2]=g;d=(m<<9)+d|0;e=7;break qf}H[f+16>>2]=g;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break of}c=H[c+4>>2]}g=0;i=q;rf:{sf:{tf:{uf:{vf:{switch(c|n<<1){case 0:m=j-4|0;i=H[j+4>>2]>>>17&4|H[m>>2]>>>19&1;c=w+(I[i+24384|0]<<2)|0;n=H[c>>2];g=H[n>>2];b=b-g|0;wf:{if(d>>>16>>>0>>0){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?8:12)>>2];while(1){xf:{if(e){break xf}n=H[f+16>>2];b=n+1|0;l=I[n+1|0];if(I[n|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break xf}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break xf}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;g=c?h:!h;break wf}d=d-(g<<16)|0;if(!(b&32768)){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?12:8)>>2];while(1){yf:{if(e){break yf}n=H[f+16>>2];g=n+1|0;l=I[n+1|0];if(I[n|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break yf}H[f+16>>2]=g;d=(l<<9)+d|0;e=7;break yf}H[f+16>>2]=g;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}g=c?!h:h;break wf}g=H[n+4>>2]}c=I[i+24640|0];H[o>>2]=(g|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|32;H[j+4>>2]=H[j+4>>2]|8;i=(c^g)<<19;t=H[f+108>>2];c=w+(I[t+2|0]<<2)|0;n=H[c>>2];g=H[n>>2];b=b-g|0;zf:{if(d>>>16>>>0>>0){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?8:12)>>2];while(1){Af:{if(e){break Af}n=H[f+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Af}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break Af}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;g=g<<1;if(g>>>0<32768){continue}break}b=g;c=c?h:!h;break zf}d=d-(g<<16)|0;if(!(b&32768)){h=H[n+4>>2];v=c;c=b>>>0>>0;H[v>>2]=H[n+(c?12:8)>>2];while(1){Bf:{if(e){break Bf}n=H[f+16>>2];g=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Bf}H[f+16>>2]=g;d=(m<<9)+d|0;e=7;break Bf}H[f+16>>2]=g;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break zf}c=H[n+4>>2]}g=i|16;if(!c){break uf}break;case 1:break vf;case 2:break tf;case 3:break rf;default:break ff}}m=j-4|0;n=H[j+4>>2]>>>20&4|(H[m>>2]>>>22&1|(g>>>15&16|(g>>>19&64|g>>>3&170)));i=w+(I[n+24384|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;Cf:{if(d>>>16>>>0>>0){h=H[l+4>>2];v=i;i=b>>>0>>0;H[v>>2]=H[l+(i?8:12)>>2];while(1){Df:{if(e){break Df}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Df}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Df}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=i?h:!h;break Cf}d=d-(c<<16)|0;if(!(b&32768)){h=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){Ef:{if(e){break Ef}e=H[f+16>>2];i=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Ef}H[f+16>>2]=i;d=(l<<9)+d|0;e=7;break Ef}H[f+16>>2]=i;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!h:h;break Cf}i=H[l+4>>2]}c=I[n+24640|0];H[o+256>>2]=(i|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|256;H[j+4>>2]=H[j+4>>2]|64;t=H[f+108>>2];g=(c^i)<<22|g|128}i=w+(I[(g>>>6&495)+t|0]<<2)|0;n=H[i>>2];c=H[n>>2];b=b-c|0;Ff:{if(d>>>16>>>0>>0){h=H[n+4>>2];v=i;i=b>>>0>>0;H[v>>2]=H[n+(i?8:12)>>2];while(1){Gf:{if(e){break Gf}n=H[f+16>>2];b=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Gf}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break Gf}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=i?h:!h;break Ff}d=d-(c<<16)|0;if(!(b&32768)){h=H[n+4>>2];c=b>>>0>>0;H[i>>2]=H[n+(c?12:8)>>2];while(1){Hf:{if(e){break Hf}n=H[f+16>>2];i=n+1|0;m=I[n+1|0];if(I[n|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Hf}H[f+16>>2]=i;d=(m<<9)+d|0;e=7;break Hf}H[f+16>>2]=i;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break Ff}c=H[n+4>>2]}if(!c){break sf}}m=j-4|0;n=H[j+4>>2]>>>23&4|(H[m>>2]>>>25&1|(g>>>18&16|(g>>>22&64|g>>>6&170)));i=w+(I[n+24384|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;If:{if(d>>>16>>>0>>0){h=H[l+4>>2];v=i;i=b>>>0>>0;H[v>>2]=H[l+(i?8:12)>>2];while(1){Jf:{if(e){break Jf}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Jf}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Jf}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;i=i?h:!h;break If}d=d-(c<<16)|0;if(!(b&32768)){h=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){Kf:{if(e){break Kf}e=H[f+16>>2];i=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Kf}H[f+16>>2]=i;d=(l<<9)+d|0;e=7;break Kf}H[f+16>>2]=i;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}i=c?!h:h;break If}i=H[l+4>>2]}c=I[n+24640|0];H[o+512>>2]=(i|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;g=(c^i)<<25|g|1024;t=H[f+108>>2]}i=w+(I[(g>>>9&495)+t|0]<<2)|0;m=H[i>>2];c=H[m>>2];b=b-c|0;Lf:{if(d>>>16>>>0>>0){h=H[m+4>>2];n=b>>>0>>0;H[i>>2]=H[m+(n?8:12)>>2];while(1){Mf:{if(e){break Mf}e=H[f+16>>2];b=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Mf}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break Mf}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?h:!h;break Lf}d=d-(c<<16)|0;if(!(b&32768)){h=H[m+4>>2];c=b>>>0>>0;H[i>>2]=H[m+(c?12:8)>>2];while(1){Nf:{if(e){break Nf}e=H[f+16>>2];n=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Nf}H[f+16>>2]=n;d=(m<<9)+d|0;e=7;break Nf}H[f+16>>2]=n;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break Lf}c=H[m+4>>2]}if(!c){break ff}}m=j-4|0;p=H[j+4>>2]>>>26&4|(H[m>>2]>>>28&1|(g>>>21&16|(g>>>25&64|g>>>9&170)));i=w+(I[p+24384|0]<<2)|0;t=H[i>>2];c=H[t>>2];b=b-c|0;break gf}Of:{if(g&2097168){break Of}i=w+(I[H[f+108>>2]+(g&495)|0]<<2)|0;m=H[i>>2];c=H[m>>2];b=b-c|0;Pf:{if(d>>>16>>>0>>0){h=H[m+4>>2];n=b>>>0>>0;H[i>>2]=H[m+(n?8:12)>>2];while(1){Qf:{if(e){break Qf}e=H[f+16>>2];b=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Qf}H[f+16>>2]=b;d=(m<<9)+d|0;e=7;break Qf}H[f+16>>2]=b;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?h:!h;break Pf}d=d-(c<<16)|0;if(!(b&32768)){h=H[m+4>>2];c=b>>>0>>0;H[i>>2]=H[m+(c?12:8)>>2];while(1){Rf:{if(e){break Rf}e=H[f+16>>2];n=e+1|0;m=I[e+1|0];if(I[e|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Rf}H[f+16>>2]=n;d=(m<<9)+d|0;e=7;break Rf}H[f+16>>2]=n;e=8;d=(m<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!h:h;break Pf}c=H[m+4>>2]}if(!c){break Of}l=j-4|0;h=H[j+4>>2]>>>17&4|(H[l>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));i=w+(I[h+24384|0]<<2)|0;p=H[i>>2];c=H[p>>2];b=b-c|0;Sf:{if(d>>>16>>>0>>0){m=H[p+4>>2];n=b>>>0>>0;H[i>>2]=H[p+(n?8:12)>>2];while(1){Tf:{if(e){break Tf}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Tf}H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break Tf}H[f+16>>2]=b;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break Sf}d=d-(c<<16)|0;if(!(b&32768)){m=H[p+4>>2];c=b>>>0>>0;H[i>>2]=H[p+(c?12:8)>>2];while(1){Uf:{if(e){break Uf}e=H[f+16>>2];n=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Uf}H[f+16>>2]=n;d=(p<<9)+d|0;e=7;break Uf}H[f+16>>2]=n;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break Sf}n=H[p+4>>2]}c=I[h+24640|0];H[o>>2]=(n|0)==(c|0)?s:u;H[l>>2]=H[l>>2]|32;H[j+4>>2]=H[j+4>>2]|8;g=(c^n)<<19|g|16}Vf:{if(g&16777344){break Vf}h=g>>>3|0;i=w+(I[H[f+108>>2]+(h&495)|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;Wf:{if(d>>>16>>>0>>0){m=H[l+4>>2];n=b>>>0>>0;H[i>>2]=H[l+(n?8:12)>>2];while(1){Xf:{if(e){break Xf}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Xf}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break Xf}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break Wf}d=d-(c<<16)|0;if(!(b&32768)){m=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){Yf:{if(e){break Yf}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break Yf}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break Yf}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break Wf}c=H[l+4>>2]}if(!c){break Vf}l=j-4|0;h=H[j+4>>2]>>>20&4|(H[l>>2]>>>22&1|(g>>>15&16|(g>>>19&64|h&170)));i=w+(I[h+24384|0]<<2)|0;p=H[i>>2];c=H[p>>2];b=b-c|0;Zf:{if(d>>>16>>>0>>0){m=H[p+4>>2];n=b>>>0>>0;H[i>>2]=H[p+(n?8:12)>>2];while(1){_f:{if(e){break _f}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break _f}H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break _f}H[f+16>>2]=b;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break Zf}d=d-(c<<16)|0;if(!(b&32768)){m=H[p+4>>2];c=b>>>0>>0;H[i>>2]=H[p+(c?12:8)>>2];while(1){$f:{if(e){break $f}e=H[f+16>>2];n=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break $f}H[f+16>>2]=n;d=(p<<9)+d|0;e=7;break $f}H[f+16>>2]=n;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break Zf}n=H[p+4>>2]}c=I[h+24640|0];H[o+256>>2]=(n|0)==(c|0)?s:u;H[l>>2]=H[l>>2]|256;H[j+4>>2]=H[j+4>>2]|64;g=(c^n)<<22|g|128}ag:{if(g&134218752){break ag}h=g>>>6|0;i=w+(I[H[f+108>>2]+(h&495)|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;bg:{if(d>>>16>>>0>>0){m=H[l+4>>2];n=b>>>0>>0;H[i>>2]=H[l+(n?8:12)>>2];while(1){cg:{if(e){break cg}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break cg}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break cg}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break bg}d=d-(c<<16)|0;if(!(b&32768)){m=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){dg:{if(e){break dg}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break dg}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break dg}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break bg}c=H[l+4>>2]}if(!c){break ag}l=j-4|0;h=H[j+4>>2]>>>23&4|(H[l>>2]>>>25&1|(g>>>18&16|(g>>>22&64|h&170)));i=w+(I[h+24384|0]<<2)|0;p=H[i>>2];c=H[p>>2];b=b-c|0;eg:{if(d>>>16>>>0>>0){m=H[p+4>>2];n=b>>>0>>0;H[i>>2]=H[p+(n?8:12)>>2];while(1){fg:{if(e){break fg}e=H[f+16>>2];b=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break fg}H[f+16>>2]=b;d=(p<<9)+d|0;e=7;break fg}H[f+16>>2]=b;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?m:!m;break eg}d=d-(c<<16)|0;if(!(b&32768)){m=H[p+4>>2];c=b>>>0>>0;H[i>>2]=H[p+(c?12:8)>>2];while(1){gg:{if(e){break gg}e=H[f+16>>2];n=e+1|0;p=I[e+1|0];if(I[e|0]==255){if(p>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break gg}H[f+16>>2]=n;d=(p<<9)+d|0;e=7;break gg}H[f+16>>2]=n;e=8;d=(p<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!m:m;break eg}n=H[p+4>>2]}c=I[h+24640|0];H[o+512>>2]=(n|0)==(c|0)?s:u;H[l>>2]=H[l>>2]|2048;H[j+4>>2]=H[j+4>>2]|512;g=(c^n)<<25|g|1024}if(g&1073750016){break ff}h=g>>>9|0;i=w+(I[H[f+108>>2]+(h&495)|0]<<2)|0;l=H[i>>2];c=H[l>>2];b=b-c|0;hg:{if(d>>>16>>>0>>0){m=H[l+4>>2];n=b>>>0>>0;H[i>>2]=H[l+(n?8:12)>>2];while(1){ig:{if(e){break ig}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break ig}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break ig}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;c=n?m:!m;break hg}d=d-(c<<16)|0;if(!(b&32768)){m=H[l+4>>2];c=b>>>0>>0;H[i>>2]=H[l+(c?12:8)>>2];while(1){jg:{if(e){break jg}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break jg}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break jg}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}c=c?!m:m;break hg}c=H[l+4>>2]}if(!c){break ff}m=j-4|0;p=H[j+4>>2]>>>26&4|(H[m>>2]>>>28&1|(g>>>21&16|(g>>>25&64|h&170)));i=w+(I[p+24384|0]<<2)|0;t=H[i>>2];c=H[t>>2];b=b-c|0}kg:{if(d>>>16>>>0>>0){h=H[t+4>>2];n=b>>>0>>0;H[i>>2]=H[(n?8:12)+t>>2];while(1){lg:{if(e){break lg}e=H[f+16>>2];b=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break lg}H[f+16>>2]=b;d=(l<<9)+d|0;e=7;break lg}H[f+16>>2]=b;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;c=c<<1;if(c>>>0<32768){continue}break}b=c;n=n?h:!h;break kg}d=d-(c<<16)|0;if(!(b&32768)){h=H[t+4>>2];c=b>>>0>>0;H[i>>2]=H[(c?12:8)+t>>2];while(1){mg:{if(e){break mg}e=H[f+16>>2];n=e+1|0;l=I[e+1|0];if(I[e|0]==255){if(l>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;d=d+65280|0;e=8;break mg}H[f+16>>2]=n;d=(l<<9)+d|0;e=7;break mg}H[f+16>>2]=n;e=8;d=(l<<8)+d|0}e=e-1|0;d=d<<1;b=b<<1;if(b>>>0<32768){continue}break}n=c?!h:h;break kg}n=H[t+4>>2]}c=I[p+24640|0];H[o+768>>2]=(n|0)==(c|0)?s:u;H[m>>2]=H[m>>2]|16384;H[j+4>>2]=H[j+4>>2]|4096;H[j+260>>2]=H[j+260>>2]|4;H[j+268>>2]=H[j+268>>2]|1;c=c^n;H[j+264>>2]=H[j+264>>2]|c<<18|2;g=c<<28|g|8192}H[j>>2]=g&-1226833921}g=j+4|0;c=o+4|0;r=r+1|0;if((r|0)!=64){continue}break}g=j+12|0;c=o+772|0;n=x>>>0<60;x=x+4|0;if(n){continue}break}}H[f+8>>2]=e;H[f+4>>2]=b;H[f>>2]=d;H[f+104>>2]=i}ng:{if(!(V&32)){break ng}H[f+104>>2]=f+100;g=H[f+100>>2];b=H[g>>2];d=H[f+4>>2]-b|0;H[f+4>>2]=d;e=H[f>>2];og:{if(e>>>16>>>0>>0){H[f+4>>2]=b;g=H[(b>>>0>d>>>0?8:12)+g>>2];H[f+100>>2]=g;d=H[f+8>>2];while(1){pg:{if(d){break pg}k=H[f+16>>2];c=k+1|0;i=I[k+1|0];if(I[k|0]==255){if(i>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;d=8;break pg}H[f+16>>2]=c;e=(i<<9)+e|0;d=7;break pg}H[f+16>>2]=c;d=8;e=(i<<8)+e|0}d=d-1|0;H[f+8>>2]=d;e=e<<1;H[f>>2]=e;b=b<<1;H[f+4>>2]=b;if(b>>>0<32768){continue}break}d=b;break og}e=e-(b<<16)|0;H[f>>2]=e;if(d&32768){break og}g=H[(b>>>0>d>>>0?12:8)+g>>2];H[f+100>>2]=g;b=H[f+8>>2];while(1){qg:{if(b){break qg}c=H[f+16>>2];b=c+1|0;k=I[c+1|0];if(I[c|0]==255){if(k>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;b=8;break qg}H[f+16>>2]=b;e=(k<<9)+e|0;b=7;break qg}H[f+16>>2]=b;b=8;e=(k<<8)+e|0}b=b-1|0;H[f+8>>2]=b;e=e<<1;H[f>>2]=e;d=d<<1;H[f+4>>2]=d;if(d>>>0<32768){continue}break}}b=H[g>>2];d=d-b|0;H[f+4>>2]=d;rg:{if(e>>>16>>>0>>0){H[f+4>>2]=b;g=H[(b>>>0>d>>>0?8:12)+g>>2];H[f+100>>2]=g;d=H[f+8>>2];while(1){sg:{if(d){break sg}k=H[f+16>>2];c=k+1|0;i=I[k+1|0];if(I[k|0]==255){if(i>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;d=8;break sg}H[f+16>>2]=c;e=(i<<9)+e|0;d=7;break sg}H[f+16>>2]=c;d=8;e=(i<<8)+e|0}d=d-1|0;H[f+8>>2]=d;e=e<<1;H[f>>2]=e;b=b<<1;H[f+4>>2]=b;if(b>>>0<32768){continue}break}d=b;break rg}e=e-(b<<16)|0;H[f>>2]=e;if(d&32768){break rg}g=H[(b>>>0>d>>>0?12:8)+g>>2];H[f+100>>2]=g;b=H[f+8>>2];while(1){tg:{if(b){break tg}c=H[f+16>>2];b=c+1|0;k=I[c+1|0];if(I[c|0]==255){if(k>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;b=8;break tg}H[f+16>>2]=b;e=(k<<9)+e|0;b=7;break tg}H[f+16>>2]=b;b=8;e=(k<<8)+e|0}b=b-1|0;H[f+8>>2]=b;e=e<<1;H[f>>2]=e;d=d<<1;H[f+4>>2]=d;if(d>>>0<32768){continue}break}}b=H[g>>2];d=d-b|0;H[f+4>>2]=d;ug:{if(e>>>16>>>0>>0){H[f+4>>2]=b;g=H[(b>>>0>d>>>0?8:12)+g>>2];H[f+100>>2]=g;d=H[f+8>>2];while(1){vg:{if(d){break vg}k=H[f+16>>2];c=k+1|0;i=I[k+1|0];if(I[k|0]==255){if(i>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;d=8;break vg}H[f+16>>2]=c;e=(i<<9)+e|0;d=7;break vg}H[f+16>>2]=c;d=8;e=(i<<8)+e|0}d=d-1|0;H[f+8>>2]=d;e=e<<1;H[f>>2]=e;b=b<<1;H[f+4>>2]=b;if(b>>>0<32768){continue}break}d=b;break ug}e=e-(b<<16)|0;H[f>>2]=e;if(d&32768){break ug}g=H[(b>>>0>d>>>0?12:8)+g>>2];H[f+100>>2]=g;b=H[f+8>>2];while(1){wg:{if(b){break wg}c=H[f+16>>2];b=c+1|0;k=I[c+1|0];if(I[c|0]==255){if(k>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;b=8;break wg}H[f+16>>2]=b;e=(k<<9)+e|0;b=7;break wg}H[f+16>>2]=b;b=8;e=(k<<8)+e|0}b=b-1|0;H[f+8>>2]=b;e=e<<1;H[f>>2]=e;d=d<<1;H[f+4>>2]=d;if(d>>>0<32768){continue}break}}b=H[g>>2];d=d-b|0;H[f+4>>2]=d;if(e>>>16>>>0>>0){H[f+4>>2]=b;H[f+100>>2]=H[(b>>>0>d>>>0?8:12)+g>>2];d=H[f+8>>2];while(1){xg:{if(d){break xg}g=H[f+16>>2];c=g+1|0;k=I[g+1|0];if(I[g|0]==255){if(k>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;e=e+65280|0;d=8;break xg}H[f+16>>2]=c;e=(k<<9)+e|0;d=7;break xg}H[f+16>>2]=c;d=8;e=(k<<8)+e|0}d=d-1|0;H[f+8>>2]=d;e=e<<1;H[f>>2]=e;b=b<<1;H[f+4>>2]=b;if(b>>>0<32768){continue}break}break ng}c=e-(b<<16)|0;H[f>>2]=c;if(d&32768){break ng}H[f+100>>2]=H[(b>>>0>d>>>0?12:8)+g>>2];e=H[f+8>>2];while(1){yg:{if(e){break yg}g=H[f+16>>2];b=g+1|0;k=I[g+1|0];if(I[g|0]==255){if(k>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;c=c+65280|0;e=8;break yg}H[f+16>>2]=b;c=(k<<9)+c|0;e=7;break yg}H[f+16>>2]=b;e=8;c=(k<<8)+c|0}e=e-1|0;H[f+8>>2]=e;c=c<<1;H[f>>2]=c;d=d<<1;H[f+4>>2]=d;if(d>>>0<32768){continue}break}}break cb;case 0:break eb}}if(ea){r=1<>>1|0;u=H[f+124>>2];d=u<<2;b=(d+H[f+120>>2]|0)+12|0;g=H[f+116>>2];j=0;c=H[f+128>>2];if(c>>>0>=4){if(!u){break bb}h=N(u,12);n=u<<3;m=0-r|0;while(1){c=0;while(1){k=b;b=H[b>>2];zg:{if(!b){break zg}if((b&2097168)==16){b=H[f>>2];e=H[f+8>>2];Ag:{if(e){break Ag}q=(b|0)!=255;i=H[f+16>>2];b=I[i|0];Bg:{if(q){e=8}else{if(b>>>0>143){break Bg}e=7}H[f>>2]=b;H[f+16>>2]=i+1;break Ag}e=8;b=255}i=e-1|0;H[f+8>>2]=i;i=b>>>i&1;b=H[g>>2];H[g>>2]=((i|0)==(b>>>31|0)?m:r)+b;b=H[k>>2]|1048576;H[k>>2]=b}if((b&16777344)==128){b=H[f>>2];e=H[f+8>>2];Cg:{if(e){break Cg}q=(b|0)!=255;i=H[f+16>>2];b=I[i|0];Dg:{if(q){e=8}else{if(b>>>0>143){break Dg}e=7}H[f>>2]=b;H[f+16>>2]=i+1;break Cg}e=8;b=255}q=e-1|0;H[f+8>>2]=q;i=d+g|0;o=H[i>>2];H[i>>2]=o+((b>>>q&1)==(o>>>31|0)?m:r);b=H[k>>2]|8388608;H[k>>2]=b}if((b&134218752)==1024){b=H[f>>2];e=H[f+8>>2];Eg:{if(e){break Eg}q=(b|0)!=255;i=H[f+16>>2];b=I[i|0];Fg:{if(q){e=8}else{if(b>>>0>143){break Fg}e=7}H[f>>2]=b;H[f+16>>2]=i+1;break Eg}e=8;b=255}q=e-1|0;H[f+8>>2]=q;i=g+n|0;o=H[i>>2];H[i>>2]=o+((b>>>q&1)==(o>>>31|0)?m:r);b=H[k>>2]|67108864;H[k>>2]=b}if((b&1073750016)!=8192){break zg}b=H[f>>2];e=H[f+8>>2];Gg:{if(e){break Gg}q=(b|0)!=255;i=H[f+16>>2];b=I[i|0];Hg:{if(q){e=8}else{if(b>>>0>143){break Hg}e=7}H[f>>2]=b;H[f+16>>2]=i+1;break Gg}e=8;b=255}q=e-1|0;H[f+8>>2]=q;i=h+g|0;o=H[i>>2];H[i>>2]=o+((b>>>q&1)==(o>>>31|0)?m:r);H[k>>2]=H[k>>2]|536870912}g=g+4|0;b=k+4|0;c=c+1|0;if((u|0)!=(c|0)){continue}break}g=h+g|0;b=k+12|0;j=j+4|0;c=H[f+128>>2];if(j>>>0<(c&-4)>>>0){continue}break}}if(!u|c>>>0<=j>>>0){break cb}p=0;q=0-r|0;d=c;while(1){Ig:{if((d|0)==(j|0)){d=j;break Ig}e=H[b>>2];t=0;while(1){d=N(t,3);if((2097168<>2];l=H[f+8>>2];Jg:{if(l){break Jg}i=(c|0)!=255;k=H[f+16>>2];c=I[k|0];Kg:{if(i){l=8}else{if(c>>>0>143){break Kg}l=7}H[f>>2]=c;H[f+16>>2]=k+1;break Jg}l=8;c=255}k=l-1|0;H[f+8>>2]=k;k=c>>>k&1;c=H[n>>2];H[n>>2]=((k|0)==(c>>>31|0)?q:r)+c;e=H[b>>2]|1048576<>2]=e;c=H[f+128>>2]}t=t+1|0;d=c;if(t>>>0>>0){continue}break}}g=g+4|0;b=b+4|0;p=p+1|0;if((u|0)!=(p|0)){continue}break}break cb}k=H[f+120>>2];d=H[f+116>>2];w=H[f+124>>2];c=H[f+128>>2];if(!((w|0)!=64|(c|0)!=64)){c=k+268|0;x=0;p=1<>>1|0;m=0-p|0;t=H[f+8>>2];g=H[f+4>>2];b=H[f>>2];j=H[f+104>>2];while(1){l=0;while(1){q=d;i=c;d=H[c>>2];if(d){k=c;if((d&2097168)==16){j=ca+((d&1048576?16:d&495?15:14)<<2)|0;o=H[j>>2];c=H[o>>2];g=g-c|0;Lg:{if(b>>>16>>>0>>0){e=H[o+4>>2];n=c>>>0>g>>>0;H[j>>2]=H[o+(n?8:12)>>2];while(1){Mg:{if(t){break Mg}o=H[f+16>>2];g=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Mg}H[f+16>>2]=g;b=(h<<9)+b|0;t=7;break Mg}H[f+16>>2]=g;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;n=n?e:!e;break Lg}b=b-(c<<16)|0;if(!(g&32768)){e=H[o+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[o+(c?12:8)>>2];while(1){Ng:{if(t){break Ng}o=H[f+16>>2];n=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Ng}H[f+16>>2]=n;b=(h<<9)+b|0;t=7;break Ng}H[f+16>>2]=n;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}n=c?!e:e;break Lg}n=H[o+4>>2]}c=H[q>>2];H[q>>2]=((n|0)==(c>>>31|0)?m:p)+c;d=d|1048576}if((d&16777344)==128){j=ca+((d&8388608?16:d&3960?15:14)<<2)|0;o=H[j>>2];c=H[o>>2];g=g-c|0;Og:{if(b>>>16>>>0>>0){e=H[o+4>>2];n=c>>>0>g>>>0;H[j>>2]=H[o+(n?8:12)>>2];while(1){Pg:{if(t){break Pg}o=H[f+16>>2];g=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Pg}H[f+16>>2]=g;b=(h<<9)+b|0;t=7;break Pg}H[f+16>>2]=g;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;n=n?e:!e;break Og}b=b-(c<<16)|0;if(!(g&32768)){e=H[o+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[o+(c?12:8)>>2];while(1){Qg:{if(t){break Qg}o=H[f+16>>2];n=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Qg}H[f+16>>2]=n;b=(h<<9)+b|0;t=7;break Qg}H[f+16>>2]=n;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}n=c?!e:e;break Og}n=H[o+4>>2]}c=H[q+256>>2];H[q+256>>2]=((n|0)==(c>>>31|0)?m:p)+c;d=d|8388608}if((d&134218752)==1024){j=ca+((d&67108864?16:d&31680?15:14)<<2)|0;o=H[j>>2];c=H[o>>2];g=g-c|0;Rg:{if(b>>>16>>>0>>0){e=H[o+4>>2];n=c>>>0>g>>>0;H[j>>2]=H[o+(n?8:12)>>2];while(1){Sg:{if(t){break Sg}o=H[f+16>>2];g=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Sg}H[f+16>>2]=g;b=(h<<9)+b|0;t=7;break Sg}H[f+16>>2]=g;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;n=n?e:!e;break Rg}b=b-(c<<16)|0;if(!(g&32768)){e=H[o+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[o+(c?12:8)>>2];while(1){Tg:{if(t){break Tg}o=H[f+16>>2];n=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Tg}H[f+16>>2]=n;b=(h<<9)+b|0;t=7;break Tg}H[f+16>>2]=n;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}n=c?!e:e;break Rg}n=H[o+4>>2]}c=H[q+512>>2];H[q+512>>2]=((n|0)==(c>>>31|0)?m:p)+c;d=d|67108864}if((d&1073750016)==8192){j=ca+((d&536870912?16:d&253440?15:14)<<2)|0;o=H[j>>2];c=H[o>>2];g=g-c|0;Ug:{if(b>>>16>>>0>>0){e=H[o+4>>2];n=c>>>0>g>>>0;H[j>>2]=H[o+(n?8:12)>>2];while(1){Vg:{if(t){break Vg}o=H[f+16>>2];g=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Vg}H[f+16>>2]=g;b=(h<<9)+b|0;t=7;break Vg}H[f+16>>2]=g;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;n=n?e:!e;break Ug}b=b-(c<<16)|0;if(!(g&32768)){e=H[o+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[o+(c?12:8)>>2];while(1){Wg:{if(t){break Wg}o=H[f+16>>2];n=o+1|0;h=I[o+1|0];if(I[o|0]==255){if(h>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8;break Wg}H[f+16>>2]=n;b=(h<<9)+b|0;t=7;break Wg}H[f+16>>2]=n;t=8;b=(h<<8)+b|0}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}n=c?!e:e;break Ug}n=H[o+4>>2]}c=H[q+768>>2];H[q+768>>2]=((n|0)==(c>>>31|0)?m:p)+c;d=d|536870912}H[k>>2]=d}c=i+4|0;d=q+4|0;l=l+1|0;if((l|0)!=64){continue}break}c=i+12|0;d=q+772|0;k=x>>>0<60;x=x+4|0;if(k){continue}break}H[f+8>>2]=t;H[f+4>>2]=g;H[f>>2]=b;H[f+104>>2]=j;break cb}s=1<>>1|0;e=w<<2;h=(e+k|0)+12|0;t=H[f+8>>2];g=H[f+4>>2];b=H[f>>2];j=H[f+104>>2];o=0;Xg:{if(c>>>0<4){break Xg}if(w){p=N(w,12);n=w<<3;r=0-s|0;while(1){l=0;while(1){k=h;i=H[h>>2];if(i){if((i&2097168)==16){j=ca+((i&1048576?16:i&495?15:14)<<2)|0;h=H[j>>2];c=H[h>>2];g=g-c|0;Yg:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[h+4>>2];if(g&32768){break Yg}m=H[h+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[h+(c?12:8)>>2];while(1){Zg:{if(t){break Zg}h=H[f+16>>2];q=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=q;t=8;b=(u<<8)+b|0;break Zg}if(u>>>0<=143){H[f+16>>2]=q;b=(u<<9)+b|0;t=7;break Zg}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}q=c?!m:m;break Yg}m=H[h+4>>2];q=c>>>0>g>>>0;H[j>>2]=H[h+(q?8:12)>>2];while(1){_g:{if(t){break _g}h=H[f+16>>2];g=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=g;t=8;b=(u<<8)+b|0;break _g}if(u>>>0<=143){H[f+16>>2]=g;b=(u<<9)+b|0;t=7;break _g}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;q=q?m:!m}c=H[d>>2];H[d>>2]=((q|0)==(c>>>31|0)?r:s)+c;i=i|1048576}if((i&16777344)==128){j=ca+((i&8388608?16:i&3960?15:14)<<2)|0;h=H[j>>2];c=H[h>>2];g=g-c|0;$g:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[h+4>>2];if(g&32768){break $g}m=H[h+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[h+(c?12:8)>>2];while(1){ah:{if(t){break ah}h=H[f+16>>2];q=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=q;t=8;b=(u<<8)+b|0;break ah}if(u>>>0<=143){H[f+16>>2]=q;b=(u<<9)+b|0;t=7;break ah}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}q=c?!m:m;break $g}m=H[h+4>>2];q=c>>>0>g>>>0;H[j>>2]=H[h+(q?8:12)>>2];while(1){bh:{if(t){break bh}h=H[f+16>>2];g=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=g;t=8;b=(u<<8)+b|0;break bh}if(u>>>0<=143){H[f+16>>2]=g;b=(u<<9)+b|0;t=7;break bh}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;q=q?m:!m}h=q;c=d+e|0;q=H[c>>2];H[c>>2]=q+((h|0)==(q>>>31|0)?r:s);i=i|8388608}if((i&134218752)==1024){j=ca+((i&67108864?16:i&31680?15:14)<<2)|0;h=H[j>>2];c=H[h>>2];g=g-c|0;ch:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[h+4>>2];if(g&32768){break ch}m=H[h+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[h+(c?12:8)>>2];while(1){dh:{if(t){break dh}h=H[f+16>>2];q=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=q;t=8;b=(u<<8)+b|0;break dh}if(u>>>0<=143){H[f+16>>2]=q;b=(u<<9)+b|0;t=7;break dh}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}q=c?!m:m;break ch}m=H[h+4>>2];q=c>>>0>g>>>0;H[j>>2]=H[h+(q?8:12)>>2];while(1){eh:{if(t){break eh}h=H[f+16>>2];g=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=g;t=8;b=(u<<8)+b|0;break eh}if(u>>>0<=143){H[f+16>>2]=g;b=(u<<9)+b|0;t=7;break eh}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;q=q?m:!m}h=q;c=d+n|0;q=H[c>>2];H[c>>2]=q+((h|0)==(q>>>31|0)?r:s);i=i|67108864}if((i&1073750016)==8192){j=ca+((i&536870912?16:i&253440?15:14)<<2)|0;h=H[j>>2];c=H[h>>2];g=g-c|0;fh:{if(b>>>16>>>0>=c>>>0){b=b-(c<<16)|0;q=H[h+4>>2];if(g&32768){break fh}m=H[h+4>>2];c=c>>>0>g>>>0;H[j>>2]=H[h+(c?12:8)>>2];while(1){gh:{if(t){break gh}h=H[f+16>>2];q=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=q;t=8;b=(u<<8)+b|0;break gh}if(u>>>0<=143){H[f+16>>2]=q;b=(u<<9)+b|0;t=7;break gh}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;g=g<<1;if(g>>>0<32768){continue}break}q=c?!m:m;break fh}m=H[h+4>>2];q=c>>>0>g>>>0;H[j>>2]=H[h+(q?8:12)>>2];while(1){hh:{if(t){break hh}h=H[f+16>>2];g=h+1|0;u=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=g;t=8;b=(u<<8)+b|0;break hh}if(u>>>0<=143){H[f+16>>2]=g;b=(u<<9)+b|0;t=7;break hh}H[f+12>>2]=H[f+12>>2]+1;b=b+65280|0;t=8}t=t-1|0;b=b<<1;c=c<<1;if(c>>>0<32768){continue}break}g=c;q=q?m:!m}h=q;c=d+p|0;q=H[c>>2];H[c>>2]=q+((h|0)==(q>>>31|0)?r:s);i=i|536870912}H[k>>2]=i}h=k+4|0;d=d+4|0;l=l+1|0;if((w|0)!=(l|0)){continue}break}h=k+12|0;d=d+p|0;o=o+4|0;c=H[f+128>>2];if(o>>>0<(c&-4)>>>0){continue}break}break Xg}o=c&-4;h=(k+(o<<1)|0)+12|0}H[f+8>>2]=t;H[f+4>>2]=g;H[f>>2]=b;H[f+104>>2]=j;if(!w|c>>>0<=o>>>0){break cb}x=0;k=0-s|0;b=c;while(1){ih:{if((b|0)==(o|0)){b=o;break ih}t=H[h>>2];e=0;while(1){l=N(e,3);if((2097168<>>l|0;i=ca+((b&1048576?16:b&495?15:14)<<2)|0;H[f+104>>2]=i;q=H[i>>2];b=H[q>>2];c=H[f+4>>2]-b|0;H[f+4>>2]=c;g=H[f>>2];jh:{if(g>>>16>>>0>>0){n=H[q+4>>2];H[f+4>>2]=b;c=b>>>0>c>>>0;H[i>>2]=H[q+(c?8:12)>>2];t=H[f+8>>2];while(1){kh:{if(t){break kh}q=H[f+16>>2];i=q+1|0;m=I[q+1|0];if(I[q|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;g=g+65280|0;t=8;break kh}H[f+16>>2]=i;g=(m<<9)+g|0;t=7;break kh}H[f+16>>2]=i;t=8;g=(m<<8)+g|0}t=t-1|0;H[f+8>>2]=t;g=g<<1;H[f>>2]=g;b=b<<1;H[f+4>>2]=b;if(b>>>0<32768){continue}break}c=c?n:!n;break jh}g=g-(b<<16)|0;H[f>>2]=g;if(!(c&32768)){n=H[q+4>>2];b=b>>>0>c>>>0;H[i>>2]=H[q+(b?12:8)>>2];t=H[f+8>>2];while(1){lh:{if(t){break lh}q=H[f+16>>2];i=q+1|0;m=I[q+1|0];if(I[q|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;g=g+65280|0;t=8;break lh}H[f+16>>2]=i;g=(m<<9)+g|0;t=7;break lh}H[f+16>>2]=i;t=8;g=(m<<8)+g|0}t=t-1|0;H[f+8>>2]=t;g=g<<1;H[f>>2]=g;c=c<<1;H[f+4>>2]=c;if(c>>>0<32768){continue}break}c=b?!n:n;break jh}c=H[q+4>>2]}b=H[j>>2];H[j>>2]=((c|0)==(b>>>31|0)?k:s)+b;t=H[h>>2]|1048576<>2]=t;c=H[f+128>>2]}e=e+1|0;b=c;if(e>>>0>>0){continue}break}}h=h+4|0;d=d+4|0;x=x+1|0;if((w|0)!=(x|0)){continue}break}break cb}i=0;x=0;p=0;mh:{nh:{oh:{M=H[f+124>>2];if(!((M|0)!=64|H[f+128>>2]!=64)){b=1<>>1|b;k=0-i|0;s=f+28|0;g=H[f+120>>2]+268|0;h=H[f+8>>2];c=H[f+4>>2];j=H[f>>2];l=H[f+104>>2];b=H[f+116>>2];if(V&8){break oh}while(1){p=0;while(1){q=b;n=g;g=H[g>>2];if(g){ph:{if(g&2097168){break ph}b=g&495;if(!b){break ph}l=s+(I[b+H[f+108>>2]|0]<<2)|0;o=H[l>>2];b=H[o>>2];c=c-b|0;qh:{if(j>>>16>>>0>>0){e=H[o+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[o+(d?8:12)>>2];while(1){rh:{if(h){break rh}o=H[f+16>>2];c=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break rh}H[f+16>>2]=c;j=(m<<9)+j|0;h=7;break rh}H[f+16>>2]=c;h=8;j=(m<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?e:!e;break qh}j=j-(b<<16)|0;if(!(c&32768)){e=H[o+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[o+(b?12:8)>>2];while(1){sh:{if(h){break sh}o=H[f+16>>2];d=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break sh}H[f+16>>2]=d;j=(m<<9)+j|0;h=7;break sh}H[f+16>>2]=d;h=8;j=(m<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!e:e;break qh}b=H[o+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>17&4|(H[u>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];th:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){uh:{if(h){break uh}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break uh}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break uh}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?m:!m;break th}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){vh:{if(h){break vh}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break vh}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break vh}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!m:m;break th}d=H[e+4>>2]}H[q>>2]=(o|0)==(d|0)?i:k;H[u>>2]=H[u>>2]|32;H[n+4>>2]=H[n+4>>2]|8;b=n-268|0;H[b>>2]=H[b>>2]|131072;b=n-260|0;H[b>>2]=H[b>>2]|32768;b=n-264|0;u=b;e=H[b>>2];b=d^o;H[u>>2]=e|b<<31|65536;g=b<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){o=g>>>3|0;l=s+(I[H[f+108>>2]+(o&495)|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;wh:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){xh:{if(h){break xh}e=H[f+16>>2];c=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break xh}H[f+16>>2]=c;j=(u<<9)+j|0;h=7;break xh}H[f+16>>2]=c;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break wh}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){yh:{if(h){break yh}e=H[f+16>>2];d=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break yh}H[f+16>>2]=d;j=(u<<9)+j|0;h=7;break yh}H[f+16>>2]=d;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break wh}b=H[e+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>20&4|(H[u>>2]>>>22&1|(g>>>15&16|(g>>>19&64|o&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];zh:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Ah:{if(h){break Ah}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Ah}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Ah}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break zh}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Bh:{if(h){break Bh}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Bh}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Bh}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break zh}b=H[e+4>>2]}H[q+256>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|256;H[n+4>>2]=H[n+4>>2]|64;g=(b^o)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){o=g>>>6|0;l=s+(I[H[f+108>>2]+(o&495)|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;Ch:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Dh:{if(h){break Dh}e=H[f+16>>2];c=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Dh}H[f+16>>2]=c;j=(u<<9)+j|0;h=7;break Dh}H[f+16>>2]=c;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Ch}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Eh:{if(h){break Eh}e=H[f+16>>2];d=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Eh}H[f+16>>2]=d;j=(u<<9)+j|0;h=7;break Eh}H[f+16>>2]=d;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Ch}b=H[e+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>23&4|(H[u>>2]>>>25&1|(g>>>18&16|(g>>>22&64|o&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];Fh:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Gh:{if(h){break Gh}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Gh}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Gh}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Fh}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Hh:{if(h){break Hh}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Hh}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Hh}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Fh}b=H[e+4>>2]}H[q+512>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;g=(b^o)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){o=g>>>9|0;l=s+(I[H[f+108>>2]+(o&495)|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;Ih:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Jh:{if(h){break Jh}e=H[f+16>>2];c=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Jh}H[f+16>>2]=c;j=(u<<9)+j|0;h=7;break Jh}H[f+16>>2]=c;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Ih}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Kh:{if(h){break Kh}e=H[f+16>>2];d=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Kh}H[f+16>>2]=d;j=(u<<9)+j|0;h=7;break Kh}H[f+16>>2]=d;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Ih}b=H[e+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>26&4|(H[u>>2]>>>28&1|(g>>>21&16|(g>>>25&64|o&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];Lh:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Mh:{if(h){break Mh}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Mh}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Mh}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Lh}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Nh:{if(h){break Nh}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Nh}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Nh}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Lh}b=H[e+4>>2]}H[q+768>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;H[n+260>>2]=H[n+260>>2]|4;H[n+268>>2]=H[n+268>>2]|1;b=b^o;H[n+264>>2]=H[n+264>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[n>>2]=g}g=n+4|0;b=q+4|0;p=p+1|0;if((p|0)!=64){continue}break}g=n+12|0;b=q+772|0;q=x>>>0<60;x=x+4|0;if(q){continue}break}break nh}b=1<>>1|b;q=H[f+120>>2];g=(q+(M<<2)|0)+12|0;b=H[f+128>>2];h=H[f+8>>2];c=H[f+4>>2];j=H[f>>2];l=H[f+104>>2];o=H[f+116>>2];Oh:{if(V&8){Ph:{if(b>>>0<4){break Ph}if(M){w=N(M,12);u=M<<3;q=0-k|0;D=f+28|0;while(1){x=0;while(1){n=g;g=H[g>>2];if(g){Qh:{if(g&2097168){break Qh}b=g&495;if(!b){break Qh}l=D+(I[b+H[f+108>>2]|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;Rh:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[e+4>>2];if(c&32768){break Rh}m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Sh:{if(h){break Sh}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break Sh}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Sh}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break Rh}m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Th:{if(h){break Th}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break Th}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Th}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){r=n-4|0;d=H[n+4>>2]>>>17&4|(H[r>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));l=D+(I[d+24384|0]<<2)|0;s=H[l>>2];b=H[s>>2];c=c-b|0;e=I[d+24640|0];Uh:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;v=H[s+4>>2];if(c&32768){break Uh}m=H[s+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[s+(b?12:8)>>2];while(1){Vh:{if(h){break Vh}h=H[f+16>>2];d=h+1|0;s=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(s<<8)+j|0;break Vh}if(s>>>0<=143){H[f+16>>2]=d;j=(s<<9)+j|0;h=7;break Vh}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}v=b?!m:m;break Uh}m=H[s+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[s+(d?8:12)>>2];while(1){Wh:{if(h){break Wh}h=H[f+16>>2];c=h+1|0;s=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(s<<8)+j|0;break Wh}if(s>>>0<=143){H[f+16>>2]=c;j=(s<<9)+j|0;h=7;break Wh}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;v=d?m:!m}b=v;H[o>>2]=(e|0)==(b|0)?k:q;H[r>>2]=H[r>>2]|32;H[n+4>>2]=H[n+4>>2]|8;g=(b^e)<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){e=g>>>3|0;l=D+(I[H[f+108>>2]+(e&495)|0]<<2)|0;r=H[l>>2];b=H[r>>2];c=c-b|0;Xh:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[r+4>>2];if(c&32768){break Xh}m=H[r+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[r+(b?12:8)>>2];while(1){Yh:{if(h){break Yh}h=H[f+16>>2];d=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break Yh}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Yh}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break Xh}m=H[r+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[r+(d?8:12)>>2];while(1){Zh:{if(h){break Zh}h=H[f+16>>2];c=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break Zh}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Zh}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){s=n-4|0;d=H[n+4>>2]>>>20&4|(H[s>>2]>>>22&1|(g>>>15&16|(g>>>19&64|e&170)));l=D+(I[d+24384|0]<<2)|0;v=H[l>>2];b=H[v>>2];c=c-b|0;m=(M<<2)+o|0;e=I[d+24640|0];_h:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[v+4>>2];if(c&32768){break _h}r=H[v+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[v+(b?12:8)>>2];while(1){$h:{if(h){break $h}h=H[f+16>>2];d=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(v<<8)+j|0;break $h}if(v>>>0<=143){H[f+16>>2]=d;j=(v<<9)+j|0;h=7;break $h}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!r:r;break _h}r=H[v+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[v+(d?8:12)>>2];while(1){ai:{if(h){break ai}h=H[f+16>>2];c=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(v<<8)+j|0;break ai}if(v>>>0<=143){H[f+16>>2]=c;j=(v<<9)+j|0;h=7;break ai}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?r:!r}b=d;H[m>>2]=(e|0)==(b|0)?k:q;H[s>>2]=H[s>>2]|256;H[n+4>>2]=H[n+4>>2]|64;g=(b^e)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){e=g>>>6|0;l=D+(I[H[f+108>>2]+(e&495)|0]<<2)|0;r=H[l>>2];b=H[r>>2];c=c-b|0;bi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[r+4>>2];if(c&32768){break bi}m=H[r+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[r+(b?12:8)>>2];while(1){ci:{if(h){break ci}h=H[f+16>>2];d=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break ci}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break ci}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break bi}m=H[r+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[r+(d?8:12)>>2];while(1){di:{if(h){break di}h=H[f+16>>2];c=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break di}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break di}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){s=n-4|0;d=H[n+4>>2]>>>23&4|(H[s>>2]>>>25&1|(g>>>18&16|(g>>>22&64|e&170)));l=D+(I[d+24384|0]<<2)|0;v=H[l>>2];b=H[v>>2];c=c-b|0;m=o+u|0;e=I[d+24640|0];ei:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[v+4>>2];if(c&32768){break ei}r=H[v+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[v+(b?12:8)>>2];while(1){fi:{if(h){break fi}h=H[f+16>>2];d=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(v<<8)+j|0;break fi}if(v>>>0<=143){H[f+16>>2]=d;j=(v<<9)+j|0;h=7;break fi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!r:r;break ei}r=H[v+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[v+(d?8:12)>>2];while(1){gi:{if(h){break gi}h=H[f+16>>2];c=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(v<<8)+j|0;break gi}if(v>>>0<=143){H[f+16>>2]=c;j=(v<<9)+j|0;h=7;break gi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?r:!r}b=d;H[m>>2]=(e|0)==(b|0)?k:q;H[s>>2]=H[s>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;g=(b^e)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){e=g>>>9|0;l=D+(I[H[f+108>>2]+(e&495)|0]<<2)|0;r=H[l>>2];b=H[r>>2];c=c-b|0;hi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[r+4>>2];if(c&32768){break hi}m=H[r+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[r+(b?12:8)>>2];while(1){ii:{if(h){break ii}h=H[f+16>>2];d=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break ii}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break ii}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break hi}m=H[r+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[r+(d?8:12)>>2];while(1){ji:{if(h){break ji}h=H[f+16>>2];c=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break ji}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break ji}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){s=n-4|0;d=H[n+4>>2]>>>26&4|(H[s>>2]>>>28&1|(g>>>21&16|(g>>>25&64|e&170)));l=D+(I[d+24384|0]<<2)|0;v=H[l>>2];b=H[v>>2];c=c-b|0;m=o+w|0;e=I[d+24640|0];ki:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[v+4>>2];if(c&32768){break ki}r=H[v+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[v+(b?12:8)>>2];while(1){li:{if(h){break li}h=H[f+16>>2];d=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(v<<8)+j|0;break li}if(v>>>0<=143){H[f+16>>2]=d;j=(v<<9)+j|0;h=7;break li}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!r:r;break ki}r=H[v+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[v+(d?8:12)>>2];while(1){mi:{if(h){break mi}h=H[f+16>>2];c=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(v<<8)+j|0;break mi}if(v>>>0<=143){H[f+16>>2]=c;j=(v<<9)+j|0;h=7;break mi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?r:!r}b=d;H[m>>2]=(e|0)==(b|0)?k:q;H[s>>2]=H[s>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;d=n+(H[f+124>>2]<<2)|0;H[d+4>>2]=H[d+4>>2]|4;H[d+12>>2]=H[d+12>>2]|1;b=b^e;H[d+8>>2]=H[d+8>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[n>>2]=g}g=n+4|0;o=o+4|0;x=x+1|0;if((M|0)!=(x|0)){continue}break}g=n+12|0;o=o+w|0;i=i+4|0;b=H[f+128>>2];if(i>>>0<(b&-4)>>>0){continue}break}break Ph}i=b&-4;g=(q+(i<<1)|0)+12|0}H[f+8>>2]=h;H[f+4>>2]=c;H[f>>2]=j;H[f+104>>2]=l;if(!M|b>>>0<=i>>>0){break Oh}while(1){c=(b|0)==(i|0);h=0;b=i;if(!c){while(1){Xb(f,g,(N(h,M)<<2)+o|0,k,h,H[f+124>>2]+2|0,1);h=h+1|0;b=H[f+128>>2];if(h>>>0>>0){continue}break}}g=g+4|0;o=o+4|0;p=p+1|0;if((M|0)!=(p|0)){continue}break}break Oh}ni:{if(b>>>0<4){break ni}if(M){w=N(M,12);u=M<<3;q=0-k|0;D=f+28|0;while(1){x=0;while(1){n=g;g=H[g>>2];if(g){oi:{if(g&2097168){break oi}b=g&495;if(!b){break oi}l=D+(I[b+H[f+108>>2]|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;pi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[e+4>>2];if(c&32768){break pi}m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){qi:{if(h){break qi}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break qi}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break qi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break pi}m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){ri:{if(h){break ri}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break ri}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break ri}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){r=n-4|0;d=H[n+4>>2]>>>17&4|(H[r>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));l=D+(I[d+24384|0]<<2)|0;s=H[l>>2];b=H[s>>2];c=c-b|0;e=I[d+24640|0];si:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[s+4>>2];if(c&32768){break si}m=H[s+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[s+(b?12:8)>>2];while(1){ti:{if(h){break ti}h=H[f+16>>2];d=h+1|0;s=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(s<<8)+j|0;break ti}if(s>>>0<=143){H[f+16>>2]=d;j=(s<<9)+j|0;h=7;break ti}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!m:m;break si}m=H[s+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[s+(d?8:12)>>2];while(1){ui:{if(h){break ui}h=H[f+16>>2];c=h+1|0;s=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(s<<8)+j|0;break ui}if(s>>>0<=143){H[f+16>>2]=c;j=(s<<9)+j|0;h=7;break ui}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?m:!m}H[o>>2]=(e|0)==(d|0)?k:q;H[r>>2]=H[r>>2]|32;H[n+4>>2]=H[n+4>>2]|8;b=n+(-2-H[f+124>>2]<<2)|0;H[b+4>>2]=H[b+4>>2]|32768;d=d^e;H[b>>2]=H[b>>2]|d<<31|65536;b=b-4|0;H[b>>2]=H[b>>2]|131072;g=d<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){e=g>>>3|0;l=D+(I[H[f+108>>2]+(e&495)|0]<<2)|0;r=H[l>>2];b=H[r>>2];c=c-b|0;vi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[r+4>>2];if(c&32768){break vi}m=H[r+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[r+(b?12:8)>>2];while(1){wi:{if(h){break wi}h=H[f+16>>2];d=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break wi}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break wi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break vi}m=H[r+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[r+(d?8:12)>>2];while(1){xi:{if(h){break xi}h=H[f+16>>2];c=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break xi}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break xi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){s=n-4|0;d=H[n+4>>2]>>>20&4|(H[s>>2]>>>22&1|(g>>>15&16|(g>>>19&64|e&170)));l=D+(I[d+24384|0]<<2)|0;v=H[l>>2];b=H[v>>2];c=c-b|0;m=(M<<2)+o|0;e=I[d+24640|0];yi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[v+4>>2];if(c&32768){break yi}r=H[v+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[v+(b?12:8)>>2];while(1){zi:{if(h){break zi}h=H[f+16>>2];d=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(v<<8)+j|0;break zi}if(v>>>0<=143){H[f+16>>2]=d;j=(v<<9)+j|0;h=7;break zi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!r:r;break yi}r=H[v+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[v+(d?8:12)>>2];while(1){Ai:{if(h){break Ai}h=H[f+16>>2];c=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(v<<8)+j|0;break Ai}if(v>>>0<=143){H[f+16>>2]=c;j=(v<<9)+j|0;h=7;break Ai}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?r:!r}b=d;H[m>>2]=(e|0)==(b|0)?k:q;H[s>>2]=H[s>>2]|256;H[n+4>>2]=H[n+4>>2]|64;g=(b^e)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){e=g>>>6|0;l=D+(I[H[f+108>>2]+(e&495)|0]<<2)|0;r=H[l>>2];b=H[r>>2];c=c-b|0;Bi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[r+4>>2];if(c&32768){break Bi}m=H[r+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[r+(b?12:8)>>2];while(1){Ci:{if(h){break Ci}h=H[f+16>>2];d=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break Ci}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Ci}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break Bi}m=H[r+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[r+(d?8:12)>>2];while(1){Di:{if(h){break Di}h=H[f+16>>2];c=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break Di}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Di}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){s=n-4|0;d=H[n+4>>2]>>>23&4|(H[s>>2]>>>25&1|(g>>>18&16|(g>>>22&64|e&170)));l=D+(I[d+24384|0]<<2)|0;v=H[l>>2];b=H[v>>2];c=c-b|0;m=o+u|0;e=I[d+24640|0];Ei:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[v+4>>2];if(c&32768){break Ei}r=H[v+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[v+(b?12:8)>>2];while(1){Fi:{if(h){break Fi}h=H[f+16>>2];d=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(v<<8)+j|0;break Fi}if(v>>>0<=143){H[f+16>>2]=d;j=(v<<9)+j|0;h=7;break Fi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!r:r;break Ei}r=H[v+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[v+(d?8:12)>>2];while(1){Gi:{if(h){break Gi}h=H[f+16>>2];c=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(v<<8)+j|0;break Gi}if(v>>>0<=143){H[f+16>>2]=c;j=(v<<9)+j|0;h=7;break Gi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?r:!r}b=d;H[m>>2]=(e|0)==(b|0)?k:q;H[s>>2]=H[s>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;g=(b^e)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){e=g>>>9|0;l=D+(I[H[f+108>>2]+(e&495)|0]<<2)|0;r=H[l>>2];b=H[r>>2];c=c-b|0;Hi:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;s=H[r+4>>2];if(c&32768){break Hi}m=H[r+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[r+(b?12:8)>>2];while(1){Ii:{if(h){break Ii}h=H[f+16>>2];d=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(r<<8)+j|0;break Ii}if(r>>>0<=143){H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Ii}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}s=b?!m:m;break Hi}m=H[r+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[r+(d?8:12)>>2];while(1){Ji:{if(h){break Ji}h=H[f+16>>2];c=h+1|0;r=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(r<<8)+j|0;break Ji}if(r>>>0<=143){H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Ji}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;s=d?m:!m}if(s){s=n-4|0;d=H[n+4>>2]>>>26&4|(H[s>>2]>>>28&1|(g>>>21&16|(g>>>25&64|e&170)));l=D+(I[d+24384|0]<<2)|0;v=H[l>>2];b=H[v>>2];c=c-b|0;m=o+w|0;e=I[d+24640|0];Ki:{if(j>>>16>>>0>=b>>>0){j=j-(b<<16)|0;d=H[v+4>>2];if(c&32768){break Ki}r=H[v+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[v+(b?12:8)>>2];while(1){Li:{if(h){break Li}h=H[f+16>>2];d=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=d;h=8;j=(v<<8)+j|0;break Li}if(v>>>0<=143){H[f+16>>2]=d;j=(v<<9)+j|0;h=7;break Li}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}d=b?!r:r;break Ki}r=H[v+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[v+(d?8:12)>>2];while(1){Mi:{if(h){break Mi}h=H[f+16>>2];c=h+1|0;v=I[h+1|0];if(I[h|0]!=255){H[f+16>>2]=c;h=8;j=(v<<8)+j|0;break Mi}if(v>>>0<=143){H[f+16>>2]=c;j=(v<<9)+j|0;h=7;break Mi}H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;d=d?r:!r}b=d;H[m>>2]=(e|0)==(b|0)?k:q;H[s>>2]=H[s>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;d=n+(H[f+124>>2]<<2)|0;H[d+4>>2]=H[d+4>>2]|4;H[d+12>>2]=H[d+12>>2]|1;b=b^e;H[d+8>>2]=H[d+8>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[n>>2]=g}g=n+4|0;o=o+4|0;x=x+1|0;if((M|0)!=(x|0)){continue}break}g=n+12|0;o=o+w|0;i=i+4|0;b=H[f+128>>2];if(i>>>0<(b&-4)>>>0){continue}break}break ni}i=b&-4;g=(q+(i<<1)|0)+12|0}H[f+8>>2]=h;H[f+4>>2]=c;H[f>>2]=j;H[f+104>>2]=l;if(!M|b>>>0<=i>>>0){break Oh}while(1){c=(b|0)==(i|0);h=0;b=i;if(!c){while(1){Xb(f,g,(N(h,M)<<2)+o|0,k,h,H[f+124>>2]+2|0,0);h=h+1|0;b=H[f+128>>2];if(h>>>0>>0){continue}break}}g=g+4|0;o=o+4|0;p=p+1|0;if((M|0)!=(p|0)){continue}break}}break mh}while(1){p=0;while(1){q=b;n=g;g=H[g>>2];if(g){Ni:{if(g&2097168){break Ni}b=g&495;if(!b){break Ni}l=s+(I[b+H[f+108>>2]|0]<<2)|0;o=H[l>>2];b=H[o>>2];c=c-b|0;Oi:{if(j>>>16>>>0>>0){e=H[o+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[o+(d?8:12)>>2];while(1){Pi:{if(h){break Pi}o=H[f+16>>2];c=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Pi}H[f+16>>2]=c;j=(m<<9)+j|0;h=7;break Pi}H[f+16>>2]=c;h=8;j=(m<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?e:!e;break Oi}j=j-(b<<16)|0;if(!(c&32768)){e=H[o+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[o+(b?12:8)>>2];while(1){Qi:{if(h){break Qi}o=H[f+16>>2];d=o+1|0;m=I[o+1|0];if(I[o|0]==255){if(m>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Qi}H[f+16>>2]=d;j=(m<<9)+j|0;h=7;break Qi}H[f+16>>2]=d;h=8;j=(m<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!e:e;break Oi}b=H[o+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>17&4|(H[u>>2]>>>19&1|(g>>>14&16|(g>>>16&64|g&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];Ri:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Si:{if(h){break Si}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Si}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Si}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Ri}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Ti:{if(h){break Ti}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Ti}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Ti}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Ri}b=H[e+4>>2]}H[q>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|32;H[n+4>>2]=H[n+4>>2]|8;g=(b^o)<<19|g|16}g=g|2097152}if(!(!(g&3960)|g&16777344)){o=g>>>3|0;l=s+(I[H[f+108>>2]+(o&495)|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;Ui:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Vi:{if(h){break Vi}e=H[f+16>>2];c=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Vi}H[f+16>>2]=c;j=(u<<9)+j|0;h=7;break Vi}H[f+16>>2]=c;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Ui}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Wi:{if(h){break Wi}e=H[f+16>>2];d=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Wi}H[f+16>>2]=d;j=(u<<9)+j|0;h=7;break Wi}H[f+16>>2]=d;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Ui}b=H[e+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>20&4|(H[u>>2]>>>22&1|(g>>>15&16|(g>>>19&64|o&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];Xi:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){Yi:{if(h){break Yi}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Yi}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break Yi}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break Xi}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){Zi:{if(h){break Zi}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break Zi}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break Zi}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break Xi}b=H[e+4>>2]}H[q+256>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|256;H[n+4>>2]=H[n+4>>2]|64;g=(b^o)<<22|g|128}g=g|16777216}if(!(!(g&31680)|g&134218752)){o=g>>>6|0;l=s+(I[H[f+108>>2]+(o&495)|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;_i:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){$i:{if(h){break $i}e=H[f+16>>2];c=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break $i}H[f+16>>2]=c;j=(u<<9)+j|0;h=7;break $i}H[f+16>>2]=c;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break _i}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){aj:{if(h){break aj}e=H[f+16>>2];d=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break aj}H[f+16>>2]=d;j=(u<<9)+j|0;h=7;break aj}H[f+16>>2]=d;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break _i}b=H[e+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>23&4|(H[u>>2]>>>25&1|(g>>>18&16|(g>>>22&64|o&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];bj:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){cj:{if(h){break cj}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break cj}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break cj}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break bj}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){dj:{if(h){break dj}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break dj}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break dj}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break bj}b=H[e+4>>2]}H[q+512>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|2048;H[n+4>>2]=H[n+4>>2]|512;g=(b^o)<<25|g|1024}g=g|134217728}if(!(!(g&253440)|g&1073750016)){o=g>>>9|0;l=s+(I[H[f+108>>2]+(o&495)|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;ej:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){fj:{if(h){break fj}e=H[f+16>>2];c=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break fj}H[f+16>>2]=c;j=(u<<9)+j|0;h=7;break fj}H[f+16>>2]=c;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break ej}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){gj:{if(h){break gj}e=H[f+16>>2];d=e+1|0;u=I[e+1|0];if(I[e|0]==255){if(u>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break gj}H[f+16>>2]=d;j=(u<<9)+j|0;h=7;break gj}H[f+16>>2]=d;h=8;j=(u<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break ej}b=H[e+4>>2]}if(b){u=n-4|0;d=H[n+4>>2]>>>26&4|(H[u>>2]>>>28&1|(g>>>21&16|(g>>>25&64|o&170)));l=s+(I[d+24384|0]<<2)|0;e=H[l>>2];b=H[e>>2];c=c-b|0;o=I[d+24640|0];hj:{if(j>>>16>>>0>>0){m=H[e+4>>2];d=b>>>0>c>>>0;H[l>>2]=H[e+(d?8:12)>>2];while(1){ij:{if(h){break ij}e=H[f+16>>2];c=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break ij}H[f+16>>2]=c;j=(r<<9)+j|0;h=7;break ij}H[f+16>>2]=c;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;b=b<<1;if(b>>>0<32768){continue}break}c=b;b=d?m:!m;break hj}j=j-(b<<16)|0;if(!(c&32768)){m=H[e+4>>2];b=b>>>0>c>>>0;H[l>>2]=H[e+(b?12:8)>>2];while(1){jj:{if(h){break jj}e=H[f+16>>2];d=e+1|0;r=I[e+1|0];if(I[e|0]==255){if(r>>>0>=144){H[f+12>>2]=H[f+12>>2]+1;j=j+65280|0;h=8;break jj}H[f+16>>2]=d;j=(r<<9)+j|0;h=7;break jj}H[f+16>>2]=d;h=8;j=(r<<8)+j|0}h=h-1|0;j=j<<1;c=c<<1;if(c>>>0<32768){continue}break}b=b?!m:m;break hj}b=H[e+4>>2]}H[q+768>>2]=(o|0)==(b|0)?i:k;H[u>>2]=H[u>>2]|16384;H[n+4>>2]=H[n+4>>2]|4096;H[n+260>>2]=H[n+260>>2]|4;H[n+268>>2]=H[n+268>>2]|1;b=b^o;H[n+264>>2]=H[n+264>>2]|b<<18|2;g=b<<28|g|8192}g=g|1073741824}H[n>>2]=g}g=n+4|0;b=q+4|0;p=p+1|0;if((p|0)!=64){continue}break}g=n+12|0;b=q+772|0;q=x>>>0<60;x=x+4|0;if(q){continue}break}}H[f+8>>2]=h;H[f+4>>2]=c;H[f>>2]=j;H[f+104>>2]=l}}if(aa){break bb}Yb(f);Xa(f,18,46);Xa(f,17,3);Xa(f,0,4)}b=la+1|0;c=(b|0)==3;la=c?0:b;z=z-c|0;ba=ba+1|0;if(ba>>>0>=K[ma+8>>2]){break ab}if((z|0)>0){continue}break}}U=R+U|0;c=H[f+24>>2];b=J[f+112>>1];F[c|0]=b;F[c+1|0]=b>>>8;X=X+1|0;if(X>>>0>2]){continue}break}}kj:{if(!E){break kj}lj:{c=H[f+24>>2];g=H[f+16>>2];if(c>>>0>g+2>>>0){if(!_){break lj}g=H[f+16>>2];c=H[f+24>>2];b=H[f+20>>2];H[Y+56>>2]=c-b;H[Y+52>>2]=g-b;H[Y+48>>2]=(c-g|0)-2;Ba(S,2,15235,Y+48|0);break kj}b=H[f+12>>2];if(b>>>0<3){break kj}if(_){H[Y+80>>2]=H[f+12>>2];Ba(S,2,7107,Y+80|0);break kj}H[Y+64>>2]=b;Ba(S,2,7107,Y- -64|0);break kj}b=H[f+20>>2];H[Y+40>>2]=c-b;H[Y+36>>2]=g-b;H[Y+32>>2]=(c-g|0)-2;Ba(S,2,15235,Y+32|0)}if(!H[C+60>>2]){break i}H[f+116>>2]=Z}k=H[qa+4>>2];g=H[C+12>>2];l=H[C+8>>2]-H[qa>>2]|0;c=H[qa+16>>2];if(c&1){b=H[oa+28>>2]+N(ua,152)|0;l=(H[b-144>>2]+l|0)-H[b-152>>2]|0}i=g-k|0;if(c&2){b=H[oa+28>>2]+N(ua,152)|0;i=(H[b-140>>2]+i|0)-H[b-148>>2]|0}d=H[C+60>>2];t=d?d:H[f+116>>2];p=H[f+128>>2];u=H[f+124>>2];n=H[pa+808>>2];mj:{if(!n){break mj}b=!p|!u;if((n|0)<=30){if(b){break mj}e=0;while(1){k=(N(e,u)<<2)+t|0;b=0;while(1){g=k+(b<<2)|0;q=H[g>>2];c=q>>31;c=(c^q)-c|0;if(c>>>n|0){c=c>>>H[pa+808>>2]|0;H[g>>2]=(q|0)<0?0-c|0:c}b=b+1|0;if((u|0)!=(b|0)){continue}break}e=e+1|0;if((p|0)!=(e|0)){continue}break}break mj}if(b){break mj}b=N(p,u)<<2;if(!b){break mj}y(t,0,b)}if(d){b=N(p,u);if(H[pa+20>>2]==1){if(!b){break a}f=0;if((b|0)!=1){c=b&1;b=b&-2;g=0;while(1){k=(f<<2)+t|0;H[k>>2]=H[k>>2]/2;H[k+4>>2]=H[k+4>>2]/2;f=f+2|0;g=g+2|0;if((b|0)!=(g|0)){continue}break}if(!c){break a}}b=(f<<2)+t|0;H[b>>2]=H[b>>2]/2;break a}if(!b){break a}ga=O(L[qa+32>>2]*O(.5));g=b&3;if(b>>>0>=4){c=b&-4;b=0;while(1){L[t>>2]=ga*O(H[t>>2]);L[t+4>>2]=ga*O(H[t+4>>2]);L[t+8>>2]=ga*O(H[t+8>>2]);L[t+12>>2]=ga*O(H[t+12>>2]);t=t+16|0;b=b+4|0;if((c|0)!=(b|0)){continue}break}if(!g){break a}}b=0;while(1){L[t>>2]=ga*O(H[t>>2]);t=t+4|0;b=b+1|0;if((g|0)!=(b|0)){continue}break}break a}m=wa-va|0;if(H[pa+20>>2]==1){if(!p){break a}j=(H[oa+36>>2]+(N(i,m)<<2)|0)+(l<<2)|0;o=u&-4;i=0;while(1){b=0;if(o){d=j+(N(i,m)<<2)|0;n=(N(i,u)<<2)+t|0;while(1){q=b<<2;e=q+n|0;k=H[e+4>>2];g=H[e+8>>2];c=H[e+12>>2];q=d+q|0;H[q>>2]=H[e>>2]/2;H[q+12>>2]=(c|0)/2;H[q+8>>2]=(g|0)/2;H[q+4>>2]=(k|0)/2;b=b+4|0;if(o>>>0>b>>>0){continue}break}}nj:{if(b>>>0>=u>>>0){break nj}c=b+1|0;k=j+(N(i,m)<<2)|0;g=(N(i,u)<<2)+t|0;if(u-b&1){b=b<<2;H[b+k>>2]=H[b+g>>2]/2;b=c}if((c|0)==(u|0)){break nj}while(1){c=b<<2;H[c+k>>2]=H[c+g>>2]/2;c=c+4|0;H[c+k>>2]=H[c+g>>2]/2;b=b+2|0;if((u|0)!=(b|0)){continue}break}}i=i+1|0;if((p|0)!=(i|0)){continue}break}break a}if(!p|!u){break a}ga=O(L[qa+32>>2]*O(.5));i=(H[oa+36>>2]+(N(i,m)<<2)|0)+(l<<2)|0;g=u&-4;k=u&3;h=0;c=u-1>>>0<3;while(1){b=i;f=0;oj:{if(!c){while(1){L[b>>2]=ga*O(H[t>>2]);L[b+4>>2]=ga*O(H[t+4>>2]);L[b+8>>2]=ga*O(H[t+8>>2]);L[b+12>>2]=ga*O(H[t+12>>2]);b=b+16|0;t=t+16|0;f=f+4|0;if((g|0)!=(f|0)){continue}break}if(!k){break oj}}f=0;while(1){L[b>>2]=ga*O(H[t>>2]);b=b+4|0;t=t+4|0;f=f+1|0;if((k|0)!=(f|0)){continue}break}}i=(m<<2)+i|0;h=h+1|0;if((p|0)!=(h|0)){continue}break}break a}H[Y>>2]=z;Ba(S,2,8716,Y)}H[H[d>>2]>>2]=0}Ca(a);na=Y+96|0} +function ib(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,J=0,M=0,Q=0,R=0,S=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=O(0),da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=O(0),Aa=0,Ga=0,Ka=0,La=0,Ma=0,Na=0,Pa=O(0),Ra=0,Ua=0,Wa=0,Xa=0,Ya=0,_a=0,$a=0,ab=0,bb=0,cb=0,fb=0,gb=0,hb=0,ib=0,kb=0,lb=0,mb=0,pb=0,qb=0,rb=0,sb=0,tb=0;Aa=na-16|0;na=Aa;a:{if(!(I[a+8|0]&128)|H[a+228>>2]!=(b|0)){break a}ua=H[a+180>>2]+N(b,5644)|0;E=H[ua+5596>>2];if(!E){jb(ua);break a}g=H[a+100>>2];if(!g){g=H[a+96>>2]}q=H[g>>2];p=H[g+4>>2];k=H[g+8>>2];v=H[g+12>>2];g=H[a+60>>2];h=H[a+64>>2];i=H[ua+5600>>2];ra=na-16|0;na=ra;D=H[a+232>>2];H[D+36>>2]=b;j=H[H[D+28>>2]+76>>2];H[D+64>>2]=1;H[D+60>>2]=v;H[D+56>>2]=k;H[D+52>>2]=p;H[D+48>>2]=q;H[D+32>>2]=j+N(b,5644);Ca(H[D+68>>2]);p=0;H[D+68>>2]=0;b:{if(g){p=Ea(4,H[H[D+24>>2]+16>>2]);if(!p){break b}q=g&3;c:{if(g>>>0>=4){k=g&-4;b=0;while(1){g=h+(X<<2)|0;H[(H[g>>2]<<2)+p>>2]=1;H[(H[g+4>>2]<<2)+p>>2]=1;H[(H[g+8>>2]<<2)+p>>2]=1;H[(H[g+12>>2]<<2)+p>>2]=1;X=X+4|0;b=b+4|0;if((k|0)!=(b|0)){continue}break}if(!q){break c}}while(1){H[(H[h+(X<<2)>>2]<<2)+p>>2]=1;X=X+1|0;s=s+1|0;if((q|0)!=(s|0)){continue}break}}H[D+68>>2]=p}d:{A=H[D+24>>2];m=H[A+16>>2];e:{if(!m){break e}X=0;f:{while(1){g:{if(H[(X<<2)+p>>2]?0:p){break g}h=H[A+24>>2]+N(X,52)|0;b=H[h+4>>2];k=b-1|0;q=H[D+60>>2];v=k+q|0;g=0-!b|0;j=ve(v,q>>>0>v>>>0?g+1|0:g,b,0);h=H[h>>2];l=h-1|0;v=H[D+56>>2];s=l+v|0;q=0-!h|0;r=ve(s,s>>>0>>0?q+1|0:q,h,0);t=k;k=H[D+52>>2];v=t+k|0;k=ve(v,k>>>0>v>>>0?g+1|0:g,b,0);b=H[H[H[D+20>>2]>>2]+20>>2]+N(X,76)|0;g=H[b+20>>2]-H[b+24>>2]|0;if(g>>>0>31){break g}v=H[b+12>>2];s=H[b+8>>2];t=H[b+4>>2];V=l;l=H[D+48>>2];x=V+l|0;h=ve(x,l>>>0>x>>>0?q+1|0:q,h,0);b=h-H[b>>2]|0;h:{if((b>>>0<=h>>>0?b:0)>>>g|0){break h}b=k-t|0;if((b>>>0<=k>>>0?b:0)>>>g|0){break h}b=s-r|0;if((b>>>0<=s>>>0?b:0)>>>g|0){break h}b=v-j|0;if(!((b>>>0<=v>>>0?b:0)>>>g|0)){break g}}H[D+64>>2]=0;break f}X=X+1|0;if((m|0)!=(X|0)){continue}break}if(!H[D+64>>2]){break f}s=0;while(1){b=H[H[H[D+20>>2]>>2]+20>>2]+N(s,76)|0;g=H[b+28>>2]+N(H[b+24>>2],152)|0;h=H[g-148>>2];q=H[g-140>>2];p=H[g-152>>2];g=H[g-144>>2];k=H[D+68>>2];i:{if(H[k+(s<<2)>>2]?0:k){break i}k=q-h|0;g=g-p|0;re(k,0,g);if(!(!qa|(h|0)==(q|0))){X=0;Ba(f,1,2982,0);break b}g=N(g,k);if(g>>>0>=1073741824){X=0;Ba(f,1,2982,0);break b}g=g<<2;H[b+44>>2]=g;j:{k:{l:{h=H[b+36>>2];if(h){if(g>>>0<=K[b+48>>2]){break i}if(H[b+40>>2]){break l}}g=Ia(g);H[b+36>>2]=g;h=g;g=H[b+44>>2];if(!(g?h:1)){break k}H[b+40>>2]=1;H[b+48>>2]=g;break i}Ca(h);g=Ia(H[b+44>>2]);H[b+36>>2]=g;if(g){break j}H[b+48>>2]=0;H[b+40>>2]=0;H[b+44>>2]=0}X=0;Ba(f,1,2982,0);break b}H[b+40>>2]=1;H[b+48>>2]=H[b+44>>2]}s=s+1|0;A=H[D+24>>2];if(s>>>0>2]){continue}break}break e}M=H[A+24>>2];W=H[H[H[D+20>>2]>>2]+20>>2];b=0;while(1){m:{if(H[(b<<2)+p>>2]?0:p){break m}g=W+N(b,76)|0;q=H[g>>2];k=M+N(b,52)|0;h=H[k>>2];l=h-1|0;v=H[D+48>>2];j=l+v|0;s=0-!h|0;v=ve(j,j>>>0>>0?s+1|0:s,h,0);q=q>>>0>v>>>0?q:v;H[g+56>>2]=q;v=H[g+4>>2];k=H[k+4>>2];r=k-1|0;t=H[D+52>>2];x=r+t|0;j=0-!k|0;t=ve(x,t>>>0>x>>>0?j+1|0:j,k,0);v=v>>>0>t>>>0?v:t;H[g+60>>2]=v;t=H[g+8>>2];V=l;l=H[D+56>>2];x=V+l|0;h=ve(x,l>>>0>x>>>0?s+1|0:s,h,0);h=h>>>0>t>>>0?t:h;H[g+64>>2]=h;s=H[g+12>>2];l=H[D+60>>2];r=r+l|0;k=ve(r,l>>>0>r>>>0?j+1|0:j,k,0);k=k>>>0>s>>>0?s:k;H[g+68>>2]=k;if(h>>>0>>0|k>>>0>>0){break d}r=H[g+20>>2];if(!r){break m}t=k-1|0;J=0-!k|0;Z=h-1|0;R=0-!h|0;x=v-1|0;S=0-!v|0;Y=q-1|0;z=0-!q|0;$=H[g+28>>2];k=0;h=0;while(1){v=$+N(k,152)|0;q=r+(k^-1)|0;g=q&31;if((q&63)>>>0>=32){l=1<>>32-g}g=t+s|0;j=l+J|0;w=g>>>0>>0?j+1|0:j;j=q&31;if((q&63)>>>0>=32){g=w>>>j|0}else{g=((1<>>j}H[v+148>>2]=g;g=l+R|0;V=g+1|0;j=g;g=s+Z|0;w=g>>>0>>0?V:j;j=q&31;if((q&63)>>>0>=32){g=w>>>j|0}else{g=((1<>>j}H[v+144>>2]=g;g=l+S|0;V=g+1|0;j=g;g=s+x|0;w=g>>>0>>0?V:j;j=q&31;if((q&63)>>>0>=32){g=w>>>j|0}else{g=((1<>>j}H[v+140>>2]=g;g=l+z|0;j=s+Y|0;s=j>>>0>>0?g+1|0:g;g=q&31;if((q&63)>>>0>=32){g=s>>>g|0}else{g=((1<>>g}H[v+136>>2]=g;k=k+1|0;h=k?h:h+1|0;if(h|(k|0)!=(r|0)){continue}break}}b=b+1|0;if((m|0)!=(b|0)){continue}break}}X=0;H[ra+8>>2]=0;b=H[D+28>>2];Y=Ea(1,8);if(Y){H[Y+4>>2]=b;H[Y>>2]=A}if(!Y){break b}Z=H[H[D+20>>2]>>2];x=na-144|0;na=x;l=H[D+36>>2];b=N(l,5644);h=H[Y+4>>2];R=b+H[h+76>>2]|0;_=H[R+420>>2];k=0;q=0;t=na-32|0;na=t;J=b+H[h+76>>2]|0;$=H[J+420>>2];S=H[Y>>2];m=S;w=H[m+16>>2];v=Fa(N(w,528));n:{if(!v){break n}b=Fa(w<<2);o:{if(!b){b=v;break o}p=H[h+76>>2]+N(l,5644)|0;M=H[p+420>>2];s=M+1|0;g=Ea(s,240);p:{if(g){q:{if(s){r=H[m+16>>2];s=g;while(1){H[s+236>>2]=f;j=Ea(r,16);H[s+200>>2]=j;if(!j){break q}W=H[m+16>>2];H[s+196>>2]=W;r=0;j=0;if(W){while(1){r=H[s+200>>2]+(j<<4)|0;W=H[p+5584>>2]+N(j,1080)|0;z=Ea(H[W+4>>2],16);H[r+12>>2]=z;if(!z){break q}H[r+8>>2]=H[W+4>>2];j=j+1|0;r=H[m+16>>2];if(j>>>0>>0){continue}break}}s=s+240|0;j=(o|0)==(M|0);o=o+1|0;if(!j){continue}break}}break p}p=H[g+4>>2];if(p){Ca(p);H[g+4>>2]=0}s=g;p=0;while(1){j=H[s+200>>2];if(j){r=0;o=H[s+196>>2];if(o){while(1){W=H[j+12>>2];if(W){Ca(W);H[j+12>>2]=0;o=H[s+196>>2]}j=j+16|0;r=r+1|0;if(r>>>0>>0){continue}break}j=H[s+200>>2]}Ca(j);H[s+200>>2]=0}s=s+240|0;j=(p|0)==(M|0);p=p+1|0;if(!j){continue}break}Ca(g)}g=0}if(g){r:{if(!w){break r}j=w&7;p=v;if(w>>>0>=8){r=w&-8;while(1){s=(n<<2)+b|0;H[s+28>>2]=p+3696;H[s+24>>2]=p+3168;H[s+20>>2]=p+2640;H[s+16>>2]=p+2112;H[s+12>>2]=p+1584;H[s+8>>2]=p+1056;H[s+4>>2]=p+528;H[s>>2]=p;n=n+8|0;p=p+4224|0;k=k+8|0;if((r|0)!=(k|0)){continue}break}if(!j){break r}}while(1){H[(n<<2)+b>>2]=p;n=n+1|0;p=p+528|0;u=u+1|0;if((j|0)!=(u|0)){continue}break}}u=b;r=0;s=H[(H[h+76>>2]+N(l,5644)|0)+5584>>2];p=H[m+24>>2];b=H[h+24>>2];k=(l>>>0)/(b>>>0)|0;b=H[h+4>>2]+N(H[h+12>>2],l-N(b,k)|0)|0;n=H[m>>2];H[t+20>>2]=b>>>0>n>>>0?b:n;n=b+H[h+12>>2]|0;b=b>>>0>n>>>0?-1:n;n=H[m+8>>2];H[t+16>>2]=b>>>0>>0?b:n;b=H[h+8>>2]+N(k,H[h+16>>2])|0;k=H[m+4>>2];H[t+12>>2]=b>>>0>k>>>0?b:k;h=b+H[h+16>>2]|0;b=b>>>0>h>>>0?-1:h;h=H[m+12>>2];H[t+8>>2]=b>>>0>>0?b:h;H[t+24>>2]=0;H[t+28>>2]=0;H[t+4>>2]=2147483647;H[t>>2]=2147483647;if(H[m+16>>2]){while(1){h=u?H[u+(r<<2)>>2]:0;b=H[p+4>>2];M=b-1|0;k=H[t+8>>2];j=M+k|0;n=0-!b|0;j=ve(j,k>>>0>j>>>0?n+1|0:n,b,0);k=H[p>>2];W=k-1|0;o=H[t+16>>2];z=W+o|0;l=0-!k|0;o=ve(z,o>>>0>z>>>0?l+1|0:l,k,0);V=M;M=H[t+12>>2];z=V+M|0;n=ve(z,z>>>0>>0?n+1|0:n,b,0);b=H[t+20>>2];M=b+W|0;k=ve(M,b>>>0>M>>>0?l+1|0:l,k,0);b=H[s+4>>2];if(b>>>0>K[t+28>>2]){H[t+28>>2]=b;b=H[s+4>>2]}if(b){da=s+944|0;ka=s+812|0;ba=j-1|0;oa=0-!j|0;aa=o-1|0;la=0-!o|0;ga=n-1|0;ia=0-!n|0;C=k-1|0;ha=0-!k|0;o=0;while(1){k=o<<2;M=H[k+da>>2];W=H[k+ka>>2];n=0;if(h){H[h+4>>2]=M;H[h>>2]=W;n=h+8|0}b=b-1|0;h=W+b|0;s:{if(h>>>0>31){break s}k=H[p>>2];if(k>>>0>-1>>>h>>>0){break s}j=H[t+4>>2];h=k<>2]=h>>>0>j>>>0?j:h}h=b+M|0;t:{if(h>>>0>31){break t}k=H[p+4>>2];if(k>>>0>-1>>>h>>>0){break t}j=H[t>>2];h=k<>2]=h>>>0>j>>>0?j:h}h=0;k=b&31;if((b&63)>>>0>=32){l=1<>>32-k}ea=j;j=ba+ea|0;k=l;l=oa+k|0;A=j>>>0>>0?l+1|0:l;z=b&31;l=M&31;if((M&63)>>>0>=32){l=1<>>32-l}if((b&63)>>>0>=32){A=A>>>z|0}else{A=((1<>>z}j=V+A|0;ma=j-1|0;l=(j>>>0>>0?l+1|0:l)-!j|0;j=M&31;z=k+ia|0;V=ga+ea|0;z=V>>>0>>0?z+1|0:z;if((M&63)>>>0>=32){j=l>>>j|0}else{j=((1<>>j}l=j;j=b&31;if((b&63)>>>0>=32){j=z>>>j|0}else{j=((1<>>j}z=(j|0)!=(A|0)?l-(j>>>M|0)&-1>>>M:0;j=k+la|0;l=j+1|0;V=j;j=aa+ea|0;A=j>>>0>>0?l:V;M=b&31;l=W&31;if((W&63)>>>0>=32){l=1<>>32-l}if((b&63)>>>0>=32){A=A>>>M|0}else{A=((1<>>M}j=V+A|0;ma=j-1|0;l=(j>>>0>>0?l+1|0:l)-!j|0;j=W&31;k=k+ha|0;ea=C+ea|0;M=ea>>>0>>0?k+1|0:k;k=b&31;if((W&63)>>>0>=32){j=l>>>j|0}else{j=((1<>>j}if((b&63)>>>0>=32){k=M>>>k|0}else{k=((1<>>k}k=(k|0)!=(A|0)?j-(k>>>W|0)&-1>>>W:0;if(n){H[n+4>>2]=z;H[n>>2]=k;h=n+8|0}k=N(k,z);if(k>>>0>K[t+24>>2]){H[t+24>>2]=k}o=o+1|0;if(o>>>0>2]){continue}break}}p=p+52|0;s=s+1080|0;r=r+1|0;if(r>>>0>2]){continue}break}}M=$+1|0;r=H[t+28>>2];l=H[t+24>>2];H[g+4>>2]=0;b=H[J+8>>2]+1|0;W=N(l,w);o=N(W,r);re(b,0,o);u:{if(!qa){b=N(b,o);H[g+8>>2]=b;b=Ea(b,2);H[g+4>>2]=b;if(b){break u}}Ca(v);Ca(u);b=H[g+4>>2];if(b){Ca(b);H[g+4>>2]=0}if(!M){b=g;break o}b=0;k=g;while(1){p=H[k+200>>2];if(p){m=0;n=H[k+196>>2];if(n){while(1){h=H[p+12>>2];if(h){Ca(h);H[p+12>>2]=0;n=H[k+196>>2]}p=p+16|0;m=m+1|0;if(n>>>0>m>>>0){continue}break}p=H[k+200>>2]}Ca(p);H[k+200>>2]=0}k=k+240|0;h=(b|0)==($|0);b=b+1|0;if(!h){continue}break}b=g;break o}j=H[m+24>>2];z=H[t+20>>2];H[g+204>>2]=z;ea=H[t+12>>2];H[g+208>>2]=ea;ba=H[t+16>>2];H[g+212>>2]=ba;aa=H[t+8>>2];H[g+216>>2]=aa;H[g+12>>2]=o;H[g+16>>2]=W;H[g+20>>2]=l;q=1;H[g+24>>2]=1;if(w){k=H[g+200>>2];s=0;b=j;while(1){p=H[u+(s<<2)>>2];H[k>>2]=H[b>>2];H[k+4>>2]=H[b+4>>2];h=H[k+8>>2];v:{if(!h){break v}m=H[k+12>>2];if((h|0)!=1){ga=h&1;h=h&-2;n=0;while(1){H[m>>2]=H[p>>2];H[m+4>>2]=H[p+4>>2];H[m+8>>2]=H[p+8>>2];H[m+12>>2]=H[p+12>>2];H[m+16>>2]=H[p+16>>2];H[m+20>>2]=H[p+20>>2];H[m+24>>2]=H[p+24>>2];H[m+28>>2]=H[p+28>>2];m=m+32|0;p=p+32|0;n=n+2|0;if((h|0)!=(n|0)){continue}break}if(!ga){break v}}H[m>>2]=H[p>>2];H[m+4>>2]=H[p+4>>2];H[m+8>>2]=H[p+8>>2];H[m+12>>2]=H[p+12>>2]}b=b+52|0;k=k+16|0;s=s+1|0;if((w|0)!=(s|0)){continue}break}}if(M>>>0>1){h=g;while(1){H[h+456>>2]=aa;H[h+452>>2]=ba;H[h+448>>2]=ea;H[h+444>>2]=z;H[h+264>>2]=1;H[h+260>>2]=l;H[h+256>>2]=W;H[h+252>>2]=o;if(w){k=H[h+440>>2];s=0;b=j;while(1){p=H[u+(s<<2)>>2];H[k>>2]=H[b>>2];H[k+4>>2]=H[b+4>>2];n=H[k+8>>2];w:{if(!n){break w}m=H[k+12>>2];if((n|0)!=1){M=n&1;ga=n&-2;n=0;while(1){H[m>>2]=H[p>>2];H[m+4>>2]=H[p+4>>2];H[m+8>>2]=H[p+8>>2];H[m+12>>2]=H[p+12>>2];H[m+16>>2]=H[p+16>>2];H[m+20>>2]=H[p+20>>2];H[m+24>>2]=H[p+24>>2];H[m+28>>2]=H[p+28>>2];m=m+32|0;p=p+32|0;n=n+2|0;if((ga|0)!=(n|0)){continue}break}if(!M){break w}}H[m>>2]=H[p>>2];H[m+4>>2]=H[p+4>>2];H[m+8>>2]=H[p+8>>2];H[m+12>>2]=H[p+12>>2]}b=b+52|0;k=k+16|0;s=s+1|0;if((w|0)!=(s|0)){continue}break}}b=H[h+8>>2];H[h+244>>2]=H[h+4>>2];H[h+248>>2]=b;b=(q|0)!=($|0);h=h+240|0;q=q+1|0;if(b){continue}break}}Ca(v);Ca(u);b=H[J+420>>2];x:{if(I[J+5640|0]&4){if((b|0)==-1){break x}m=J+424|0;h=H[J+8>>2];n=0;p=g;while(1){q=H[m+36>>2];H[p+44>>2]=1;H[p+84>>2]=q;H[p+48>>2]=H[m>>2];q=H[m+4>>2];H[p+68>>2]=0;H[p+72>>2]=0;H[p+52>>2]=q;H[p+60>>2]=H[m+12>>2];H[p+64>>2]=H[m+16>>2];q=H[m+8>>2];H[p+76>>2]=l;H[p+56>>2]=h>>>0>q>>>0?q:h;m=m+148|0;p=p+240|0;q=(b|0)==(n|0);n=n+1|0;if(!q){continue}break}break x}if((b|0)==-1){break x}h=H[J+8>>2];q=H[J+4>>2];p=g;if(b){k=b+1&-2;u=0;while(1){H[p+68>>2]=0;H[p+72>>2]=0;H[p+52>>2]=0;H[p+44>>2]=1;H[p+48>>2]=0;H[p+84>>2]=q;H[p+60>>2]=r;H[p+324>>2]=q;H[p+76>>2]=l;H[p+56>>2]=h;H[p+308>>2]=0;H[p+312>>2]=0;H[p+292>>2]=0;H[p+284>>2]=1;H[p+288>>2]=0;H[p+300>>2]=r;H[p+296>>2]=h;H[p+316>>2]=l;H[p+64>>2]=H[p+196>>2];H[p+304>>2]=H[p+436>>2];p=p+480|0;u=u+2|0;if((k|0)!=(u|0)){continue}break}if(b&1){break x}}H[p+68>>2]=0;H[p+72>>2]=0;H[p+52>>2]=0;H[p+44>>2]=1;H[p+48>>2]=0;H[p+84>>2]=q;H[p+60>>2]=r;H[p+76>>2]=l;H[p+56>>2]=h;H[p+64>>2]=H[p+196>>2]}q=g;break n}Ca(v)}Ca(b)}na=t+32|0;g=q;y:{z:{if(!g){break z}M=_+1|0;s=E;v=g;A:{B:{while(1){if(H[v+84>>2]==-1){break A}l=Fa(H[S+16>>2]<<2);if(!l){break A}b=H[S+16>>2]<<2;if(b){y(l,1,b)}if(Vb(v)){while(1){k=H[Z+20>>2];C:{D:{if(K[v+40>>2]>=K[R+12>>2]){break D}b=H[v+32>>2];h=N(H[v+28>>2],76)+k|0;if(b>>>0>=K[h+24>>2]){break D}h=H[h+28>>2]+N(b,152)|0;if(!H[h+24>>2]){break D}q=h+28|0;j=0;E:{while(1){p=q+N(j,36)|0;b=H[p+20>>2]+N(H[v+36>>2],40)|0;if(!xb(D,H[v+28>>2],H[v+32>>2],H[p+16>>2],H[b>>2],H[b+4>>2],H[b+8>>2],H[b+12>>2])){j=j+1|0;if(j>>>0>2]){continue}break E}break}H[l+(H[v+28>>2]<<2)>>2]=0;H[x+136>>2]=0;if(!Ub(H[Y+4>>2],H[Z+20>>2],R,v,x+140|0,s,x+136|0,i,f)){break B}j=H[v+32>>2];o=H[v+28>>2];m=H[x+136>>2];if(H[x+140>>2]){H[x+136>>2]=0;W=H[(H[Z+20>>2]+N(o,76)|0)+28>>2]+N(j,152)|0;k=H[W+24>>2];if(k){w=i-m|0;J=i+s|0;o=W+28|0;t=0;r=0;z=m+s|0;u=z;while(1){F:{if(H[o+8>>2]==H[o>>2]|H[o+12>>2]==H[o+4>>2]){break F}b=H[o+20>>2]+N(H[v+36>>2],40)|0;$=N(H[b+20>>2],H[b+16>>2]);if(!$){break F}k=H[b+24>>2];h=0;while(1){p=H[k+36>>2];if(p){G:{if(r|H[k+64>>2]){H[k+52>>2]=0;j=1;b=64;break G}j=H[k>>2];b=H[k+40>>2];H:{if(b){j=N(b,24)+j|0;if(H[j-20>>2]!=H[j-12>>2]){j=j-24|0;break H}b=b+1|0}else{b=1}H[k+40>>2]=b}b=H[j+20>>2];I:{J:{if(b>>>0>(u^-1)>>>0){break J}q=j+20|0;while(1){if(J>>>0>>0){break J}n=H[k+4>>2];r=H[k+52>>2];if((r|0)!=H[k+56>>2]){q=p}else{b=r<<1|1;n=Ha(n,b<<3);if(!n){Ba(f,1,1024,0);break B}H[k+56>>2]=b;H[k+4>>2]=n;r=H[k+52>>2];b=H[q>>2];q=H[k+36>>2]}p=(r<<3)+n|0;H[p+4>>2]=b;H[p>>2]=u;H[k+52>>2]=r+1;H[j>>2]=H[j>>2]+b;n=H[j+16>>2];r=n+H[j+4>>2]|0;H[j+4>>2]=r;p=q-n|0;H[k+36>>2]=p;H[j+8>>2]=r;u=b+u|0;r=0;if((n|0)==(q|0)){break I}H[k+40>>2]=H[k+40>>2]+1;q=j+44|0;b=H[j+44>>2];j=j+24|0;if((u^-1)>>>0>=b>>>0){continue}break}}q=H[v+28>>2];p=H[v+32>>2];n=H[v+36>>2];if(H[H[Y+4>>2]+104>>2]){H[x+120>>2]=q;H[x+116>>2]=p;H[x+112>>2]=t;H[x+108>>2]=n;H[x+104>>2]=h;H[x+100>>2]=w;H[x+96>>2]=b;Ba(f,1,14693,x+96|0);break B}H[x+88>>2]=q;H[x+84>>2]=p;H[x+80>>2]=t;H[x+76>>2]=n;H[x+72>>2]=h;H[x+68>>2]=w;H[x+64>>2]=b;Ba(f,2,14693,x- -64|0);H[k+52>>2]=0;H[k+64>>2]=1;r=1}j=H[k+40>>2];b=44}H[b+k>>2]=j}k=k+68|0;h=h+1|0;if(($|0)!=(h|0)){continue}break}k=H[W+24>>2]}o=o+36|0;t=t+1|0;if(t>>>0>>0){continue}break}j=H[v+32>>2];o=H[v+28>>2];b=r?w:u-z|0}else{b=0}m=b+m|0}h=H[S+24>>2]+N(o,52)|0;b=H[h+36>>2];H[h+36>>2]=b>>>0>>0?j:b;break C}k=H[Z+20>>2]}H[x+136>>2]=0;if(!Ub(H[Y+4>>2],k,R,v,x+140|0,s,x+136|0,i,f)){break B}o=H[v+28>>2];m=H[x+136>>2];if(!H[x+140>>2]){break C}J=H[v+32>>2];b=H[(H[Z+20>>2]+N(o,76)|0)+28>>2]+N(J,152)|0;z=H[b+24>>2];if(!z){break C}w=i-m|0;n=b+28|0;W=H[v+36>>2];j=0;r=0;K:{L:{while(1){M:{if(H[n+8>>2]==H[n>>2]|H[n+12>>2]==H[n+4>>2]){break M}b=H[n+20>>2]+N(W,40)|0;$=N(H[b+20>>2],H[b+16>>2]);if(!$){break M}p=H[b+24>>2];t=0;while(1){b=H[p+36>>2];if(b){k=H[p>>2];h=H[p+40>>2];N:{if(h){k=N(h,24)+k|0;if(H[k-20>>2]!=H[k-12>>2]){k=k-24|0;break N}h=h+1|0}else{h=1}H[p+40>>2]=h}u=H[k+20>>2];j=u+j|0;if(j>>>0>>0|j>>>0>w>>>0){break K}while(1){O:{u=H[k+16>>2];H[k+4>>2]=u+H[k+4>>2];q=b-u|0;if((b|0)==(u|0)){break O}h=h+1|0;H[p+40>>2]=h;u=H[k+44>>2];j=u+j|0;if(j>>>0>>0){break L}k=k+24|0;b=q;if(j>>>0<=w>>>0){continue}break L}break}H[p+36>>2]=q}p=p+68|0;t=t+1|0;if(($|0)!=(t|0)){continue}break}}n=n+36|0;r=r+1|0;if((z|0)!=(r|0)){continue}break}m=j+m|0;break C}H[p+36>>2]=q}if(!H[H[Y+4>>2]+104>>2]){H[x+24>>2]=o;H[x+20>>2]=J;H[x+16>>2]=r;H[x+12>>2]=W;H[x+8>>2]=t;H[x+4>>2]=w;H[x>>2]=u;Ba(f,2,14608,x);o=H[v+28>>2];m=m+w|0;break C}H[x+56>>2]=o;H[x+52>>2]=J;H[x+48>>2]=r;H[x+44>>2]=W;H[x+40>>2]=t;H[x+36>>2]=w;H[x+32>>2]=u;Ba(f,1,14608,x+32|0);break B}P:{if(!H[l+(o<<2)>>2]){break P}b=H[S+24>>2]+N(o,52)|0;if(H[b+36>>2]){break P}H[b+36>>2]=H[(H[Z+20>>2]+N(o,76)|0)+24>>2]-1}i=i-m|0;s=m+s|0;if(Vb(v)){continue}break}}Ca(l);v=v+240|0;Q=Q+1|0;if(Q>>>0<=K[R+420>>2]){continue}break}yb(g,M);H[ra+8>>2]=s-E;b=1;break y}yb(g,M);Ca(l);break z}yb(g,M)}b=0}na=x+144|0;db(Y);if(!b){break b}X=H[H[D+32>>2]+5584>>2];j=H[H[D+20>>2]>>2];C=H[j+20>>2];H[ra+12>>2]=1;s=0;b=H[D+32>>2];l=H[X+16>>2]>>>4&1&H[b+12>>2]==H[b+8>>2];A=H[j+16>>2];Q:{if(!A){break Q}while(1){b=H[D+68>>2];if(!(H[b+(s<<2)>>2]?0:b)){u=ra+12|0;A=0;b=H[C+24>>2];R:{if(!b){break R}m=H[D+44>>2];while(1){q=H[C+28>>2]+N(A,152)|0;p=H[q+24>>2];if(p){o=q+28|0;b=H[q+20>>2];v=H[q+16>>2];r=0;while(1){if(N(b,v)){n=o+N(r,36)|0;k=0;while(1){g=H[n+20>>2]+N(k,40)|0;i=xb(D,H[C+16>>2],A,H[n+16>>2],H[g>>2],H[g+4>>2],H[g+8>>2],H[g+12>>2]);h=H[g+16>>2];p=H[g+20>>2];b=N(h,p);S:{if(i){if(!b){break S}h=0;while(1){i=H[g+24>>2]+N(h,68)|0;T:{if(!xb(D,H[C+16>>2],A,H[n+16>>2],H[i+8>>2],H[i+12>>2],H[i+16>>2],H[i+20>>2])){b=H[i+60>>2];if(!b){break T}Ca(b);H[i+60>>2]=0;break T}if(!H[D+64>>2]){if(H[i+60>>2]|H[i+16>>2]==H[i+8>>2]|H[i+20>>2]==H[i+12>>2]){break T}}b=Ea(1,44);if(!b){H[ra+12>>2]=0;break R}p=H[D+64>>2];H[b+36>>2]=0;H[b+28>>2]=u;H[b+20>>2]=X;H[b+16>>2]=C;H[b+12>>2]=n;H[b+8>>2]=i;H[b+4>>2]=A;H[b>>2]=p;H[b+40>>2]=l;H[b+32>>2]=f;H[b+24>>2]=H[m+4>>2]>1;eb(m,14,b);if(!H[ra+12>>2]){break R}}h=h+1|0;if(h>>>0>2],H[g+16>>2])>>>0){continue}break}break S}if(!b){break S}v=0;while(1){b=H[g+24>>2]+N(v,68)|0;i=H[b+60>>2];if(i){Ca(i);H[b+60>>2]=0;p=H[g+20>>2];h=H[g+16>>2]}v=v+1|0;if(v>>>0>>0){continue}break}}k=k+1|0;b=H[q+20>>2];v=H[q+16>>2];if(k>>>0>>0){continue}break}p=H[q+24>>2]}r=r+1|0;if(r>>>0

>>0){continue}break}b=H[C+24>>2]}A=A+1|0;if(A>>>0>>0){continue}break}}if(!H[ra+12>>2]){break Q}A=H[j+16>>2]}X=X+1080|0;C=C+76|0;s=s+1|0;if(A>>>0>s>>>0){continue}break}}X=0;Sa(H[D+44>>2]);if(!H[ra+12>>2]){break b}U:{if(H[D+64>>2]){break U}s=H[D+24>>2];if(!H[s+16>>2]){break U}C=0;while(1){b=H[H[H[D+20>>2]>>2]+20>>2]+N(C,76)|0;g=H[b+28>>2]+N(H[(H[s+24>>2]+N(C,52)|0)+36>>2],152)|0;i=H[g+136>>2];h=H[g+144>>2];q=H[g+140>>2];g=H[g+148>>2];Ca(H[b+52>>2]);H[b+52>>2]=0;V:{p=H[D+68>>2];if((h|0)==(i|0)|(g|0)==(q|0)|(H[p+(C<<2)>>2]?0:p)){break V}g=g-q|0;i=h-i|0;re(g,0,i);if(qa){Ba(f,1,2982,0);break b}g=N(g,i);if(g>>>0>=1073741824){Ba(f,1,2982,0);break b}i=b;b=Ia(g<<2);H[i+52>>2]=b;if(b){break V}Ba(f,1,2982,0);break b}C=C+1|0;s=H[D+24>>2];if(C>>>0>2]){continue}break}}s=H[D+32>>2];v=H[H[D+20>>2]>>2];if(H[v+16>>2]){C=H[v+20>>2];s=H[s+5584>>2];A=H[H[D+24>>2]+24>>2];p=0;while(1){W:{b=H[D+68>>2];if(H[b+(p<<2)>>2]?0:b){break W}j=H[A+36>>2]+1|0;if(H[s+20>>2]==1){Y=j;b=0;_=na-32|0;na=_;X:{Y:{if(H[D+64>>2]){g=1;if((j|0)==1){break X}k=H[C+28>>2];b=k+N(H[C+24>>2],152)|0;h=H[b-144>>2];q=H[b-152>>2];if((h|0)==(q|0)){break X}n=j-1|0;b=0;m=H[D+44>>2];l=H[m+4>>2];i=k;Z:{if((j|0)!=2){j=n&1;r=n&-2;g=0;while(1){u=H[i+160>>2]-H[i+152>>2]|0;b=b>>>0>u>>>0?b:u;u=H[i+164>>2]-H[i+156>>2]|0;b=b>>>0>u>>>0?b:u;u=H[i+312>>2]-H[i+304>>2]|0;b=b>>>0>u>>>0?b:u;u=H[i+316>>2]-H[i+308>>2]|0;b=b>>>0>u>>>0?b:u;i=i+304|0;g=g+2|0;if((r|0)!=(g|0)){continue}break}if(!j){break Z}}g=H[i+160>>2]-H[i+152>>2]|0;b=b>>>0>g>>>0?b:g;g=H[i+164>>2]-H[i+156>>2]|0;b=b>>>0>g>>>0?b:g}g=0;if(b>>>0>134217727){break X}i=H[k+4>>2];u=H[k+12>>2];t=H[k>>2];E=H[k+8>>2];o=b<<5;j=ob(o);H[_+16>>2]=j;if(!j){break X}r=h-q|0;g=u-i|0;q=E-t|0;H[_>>2]=j;while(1){u=H[C+36>>2];h=g;H[_+8>>2]=g;b=q;H[_+24>>2]=b;g=H[k+156>>2];i=H[k+164>>2];q=H[k+160>>2];t=H[k+152>>2];H[_+28>>2]=(t|0)%2;q=q-t|0;H[_+20>>2]=q-b;x=(l|0)<2;g=i-g|0;_:{if(!(!x&g>>>0>1)){i=0;if(!g){break _}while(1){$b(_+16|0,u+(N(i,r)<<2)|0);i=i+1|0;if((i|0)!=(g|0)){continue}break}break _}t=g>>>0>>0?g:l;Y=t-1|0;E=(g>>>0)/(t>>>0)|0;b=0;while(1){i=Fa(36);if(!i){break Y}w=H[_+28>>2];H[i+8>>2]=H[_+24>>2];H[i+12>>2]=w;w=H[_+20>>2];H[i>>2]=H[_+16>>2];H[i+4>>2]=w;H[i+24>>2]=u;H[i+20>>2]=r;H[i+16>>2]=q;H[i+28>>2]=N(b,E);w=(b|0)==(Y|0);b=b+1|0;H[i+32>>2]=w?g:N(E,b);w=ob(o);H[i>>2]=w;if(!w){g=0;Sa(m);Ca(i);Ca(j);break X}eb(m,10,i);if((b|0)!=(t|0)){continue}break}Sa(m)}H[_+4>>2]=g-h;H[_+12>>2]=H[k+156>>2]%2;$:{if(!(!x&q>>>0>1)){b=8;i=0;if(q>>>0>=8){while(1){nb(_,u+(i<<2)|0,r,8);i=b;b=b+8|0;if(q>>>0>=b>>>0){continue}break}}if(i>>>0>=q>>>0){break $}nb(_,u+(i<<2)|0,r,q-i|0);break $}h=l>>>0>q>>>0?q:l;E=h-1|0;t=(q>>>0)/(h>>>0)|0;b=0;while(1){i=Fa(36);if(!i){break Y}x=H[_+12>>2];H[i+8>>2]=H[_+8>>2];H[i+12>>2]=x;x=H[_+4>>2];H[i>>2]=H[_>>2];H[i+4>>2]=x;H[i+24>>2]=u;H[i+20>>2]=r;H[i+16>>2]=g;H[i+28>>2]=N(b,t);x=(b|0)==(E|0);b=b+1|0;H[i+32>>2]=x?q:N(t,b);x=ob(o);H[i>>2]=x;if(!x){g=0;Sa(m);Ca(i);Ca(j);break X}eb(m,11,i);if((b|0)!=(h|0)){continue}break}Sa(m)}k=k+152|0;n=n-1|0;if(n){continue}break}g=1;Ca(j);break X}g=1;k=H[C+28>>2];ma=k+N(Y,152)|0;gb=ma-152|0;if(H[gb>>2]==H[ma-144>>2]){break X}hb=ma-148|0;if(H[hb>>2]==H[ma-140>>2]){break X}h=H[k+4>>2];q=H[k+12>>2];n=H[k>>2];j=H[k+8>>2];w=H[C+68>>2];M=H[C+64>>2];W=H[C+60>>2];J=H[C+56>>2];oa=_b(C,Y);if(!oa){g=0;break X}aa:{ba:{if((Y|0)!=1){i=k;ca:{if((Y|0)!=2){g=Y-1|0;m=g&1;l=g&-2;g=0;while(1){r=H[i+160>>2]-H[i+152>>2]|0;b=b>>>0>r>>>0?b:r;r=H[i+164>>2]-H[i+156>>2]|0;b=b>>>0>r>>>0?b:r;r=H[i+312>>2]-H[i+304>>2]|0;b=b>>>0>r>>>0?b:r;r=H[i+316>>2]-H[i+308>>2]|0;b=b>>>0>r>>>0?b:r;i=i+304|0;g=g+2|0;if((l|0)!=(g|0)){continue}break}if(!m){break ca}}g=H[i+160>>2]-H[i+152>>2]|0;b=b>>>0>g>>>0?b:g;g=H[i+164>>2]-H[i+156>>2]|0;b=b>>>0>g>>>0?b:g}if(b>>>0>=268435456){break aa}o=ob(b<<4);if(!o){break aa}da:{if(!Y){break da}u=q-h|0;m=j-n|0;ib=o+28|0;$=o+24|0;Ra=o+16|0;ha=o+4|0;sa=1;ea:while(1){b=H[k+156>>2];ja=(b|0)%2|0;g=H[k+152>>2];pa=(g|0)%2|0;Z=H[k+164>>2]-b|0;ka=Z-u|0;R=H[k+160>>2]-g|0;da=R-m|0;i=J;g=i;t=W;q=t;b=M;fa=b;h=w;n=h;j=H[C+20>>2];fa:{if((j|0)==(sa|0)){break fa}r=j-sa|0;q=0;g=0;if(i){b=r&31;if((r&63)>>>0>=32){l=-1<>>32-b}b=i+(g^-1)|0;g=l^-1;i=b>>>0>>0?g+1|0:g;g=r&31;if((r&63)>>>0>=32){g=i>>>g|0}else{g=((1<>>g}}if(W){b=r&31;if((r&63)>>>0>=32){l=-1<>>32-b}b=W+(i^-1)|0;i=l^-1;h=b>>>0>>0?i+1|0:i;i=r&31;if((r&63)>>>0>=32){q=h>>>i|0}else{q=((1<>>i}}h=0;b=0;if(M){b=r&31;if((r&63)>>>0>=32){l=-1<>>32-b}b=M+(i^-1)|0;i=l^-1;n=b>>>0>>0?i+1|0:i;i=r&31;if((r&63)>>>0>=32){b=n>>>i|0}else{b=((1<>>i}}if(w){i=r&31;if((r&63)>>>0>=32){l=-1<>>32-i}i=w+(h^-1)|0;h=l^-1;n=i>>>0>>0?h+1|0:h;h=r&31;if((r&63)>>>0>=32){h=n>>>h|0}else{h=((1<>>h}}fa=0;i=0;E=1<>>0>>0){i=r&31;if((r&63)>>>0>=32){l=-1<>>32-i}n=n^-1;i=n+(J-E|0)|0;j=l^-1;j=i>>>0>>0?j+1|0:j;n=r&31;if((r&63)>>>0>=32){i=j>>>n|0}else{i=((1<>>n}}if(E>>>0>>0){n=r&31;if((r&63)>>>0>=32){l=-1<>>32-n}j=j^-1;n=j+(M-E|0)|0;l=l^-1;l=j>>>0>n>>>0?l+1|0:l;j=r&31;if((r&63)>>>0>=32){fa=l>>>j|0}else{fa=((1<>>j}}n=0;t=0;if(E>>>0>>0){j=r&31;if((r&63)>>>0>=32){l=-1<>>32-j}t=t^-1;j=t+(W-E|0)|0;l=l^-1;t=j>>>0>>0?l+1|0:l;l=r&31;if((r&63)>>>0>=32){t=t>>>l|0}else{t=((1<>>l}}if(w>>>0<=E>>>0){break fa}n=r&31;if((r&63)>>>0>=32){l=-1<>>32-n}j=j^-1;n=j+(w-E|0)|0;l=l^-1;l=j>>>0>n>>>0?l+1|0:l;j=r&31;if((r&63)>>>0>=32){n=l>>>j|0}else{n=((1<>>j}}j=H[k+180>>2];l=fa-j|0;l=l>>>0<=fa>>>0?l:0;r=l+2|0;l=l>>>0>r>>>0?-1:r;la=l>>>0>>0?l:da;l=H[k+216>>2];r=b-l|0;b=b>>>0>=r>>>0?r:0;r=b+2|0;b=b>>>0>r>>>0?-1:r;ia=b>>>0>>0?b:m;b=(pa?la:ia)<<1;r=(pa?ia:la)<<1|1;va=b>>>0>r>>>0?b:r;b=va>>>0>>0;j=i-j|0;i=i>>>0>=j>>>0?j:0;j=i-2|0;r=i>>>0>=j>>>0?j:0;i=g-l|0;g=g>>>0>=i>>>0?i:0;i=g-2|0;i=g>>>0>=i>>>0?i:0;g=(pa?r:i)<<1;l=(pa?i:r)<<1|1;x=g>>>0>>0;E=H[k+184>>2];j=q-E|0;q=j>>>0<=q>>>0?j:0;j=q-2|0;q=j>>>0<=q>>>0?j:0;ea=q;S=H[k+220>>2];j=t-S|0;j=j>>>0<=t>>>0?j:0;t=j-2|0;j=j>>>0>=t>>>0?t:0;ba=j;t=h-E|0;h=h>>>0>=t>>>0?t:0;t=h+2|0;h=h>>>0>t>>>0?-1:t;E=h>>>0>>0?h:u;Q=E;h=n-S|0;h=h>>>0<=n>>>0?h:0;n=h+2|0;h=h>>>0>n>>>0?-1:n;V=h>>>0>>0?h:ka;n=V;if(ja){ea=j;ba=q;Q=n;n=E}wa=b?va:R;l=x?g:l;kb=u+V|0;lb=j+u|0;if(Z){ta=o+(i<<3)|0;b=o+(da<<3)|0;xa=b-4|0;g=(i|0)<(da|0);Ua=g?ta+4|0:xa;ya=m-1|0;Wa=(la|0)<(ya|0)?la:ya;x=0;Xa=(m|0)>1|(da|0)>0;h=pa<<2;Ya=(ha-h|0)+(r<<3)|0;_a=h+ta|0;z=(da|0)>(ia|0)?ia:da;aa=i+1|0;$a=m+la|0;La=m+r|0;ab=o+(l<<2)|0;Ma=!m&(da|0)==1;h=o+(m<<3)|0;ga=h-8|0;Ga=h-4|0;Ka=b-8|0;Na=o+(wa<<2)|0;bb=Na-4|0;cb=(o+((g?i:da)<<3)|0)-4|0;while(1){ga:{if(!(x>>>0>>0&q>>>0<=x>>>0|x>>>0>>0&x>>>0>=lb>>>0)){S=x+1|0;break ga}if(R>>>0>va>>>0){H[bb>>2]=0;H[Na>>2]=0}S=x+1|0;Oa(oa,i,x,ia,S,_a,2,0);Oa(oa,La,x,$a,S,Ya,2,0);ha:{ia:{ja:{if(!pa){if(!Xa){break ha}if((i|0)>=(ia|0)){break ia}ka:{la:{if((i|0)>0){b=H[cb>>2];break la}b=H[ha>>2];g=b;if((i|0)<0){break ka}}g=b;b=H[Ua>>2]}H[ta>>2]=H[ta>>2]-((b+g|0)+2>>2);b=aa;h=b;g=i;if((b|0)>=(z|0)){break ja}while(1){b=g;g=h;h=o+(g<<3)|0;H[h>>2]=H[h>>2]-((H[(o+(b<<3)|0)+4>>2]+H[h+4>>2]|0)+2>>2);h=g+1|0;if((z|0)!=(h|0)){continue}break}b=z;break ja}ma:{if(!Ma){b=i;if((ia|0)<=(b|0)){break ma}while(1){g=o+(b<<3)|0;h=H[g+4>>2];t=Ka;na:{oa:{if((b|0)>=0){fa=H[((b|0)<(da|0)?g:Ka)>>2];b=b+1|0;break oa}fa=H[o>>2];if((b|0)!=-1){b=b+1|0;t=o;break na}b=0}if((b|0)>=(da|0)){break na}t=o+(b<<3)|0}H[g+4>>2]=h-((H[t>>2]+fa|0)+2>>2);if((b|0)<(ia|0)){continue}break}break ma}H[o>>2]=H[o>>2]/2;break ha}b=r;if((la|0)<=(b|0)){break ha}while(1){g=o+(b<<3)|0;h=H[g>>2];pa:{if((b|0)<0){t=H[ha>>2];fa=ha;break pa}t=H[((b|0)<(m|0)?g+4|0:Ga)>>2];fa=ha;if(!b){break pa}fa=(b|0)>(m|0)?Ga:g-4|0}H[g>>2]=h+(H[fa>>2]+t>>1);b=b+1|0;if((la|0)!=(b|0)){continue}break}break ha}if((b|0)>=(ia|0)){break ia}while(1){g=o+(b<<3)|0;t=H[g>>2];qa:{ra:{if((b|0)>0){h=H[(o+(((b|0)<(da|0)?b:da)<<3)|0)-4>>2];break ra}h=H[ha>>2];fa=ha;if((b|0)<0){break qa}}fa=xa;if((b|0)>=(da|0)){break qa}fa=(o+(b<<3)|0)+4|0}H[g>>2]=t-((H[fa>>2]+h|0)+2>>2);b=b+1|0;if((ia|0)!=(b|0)){continue}break}}if((r|0)>=(la|0)){break ha}b=r;if((ya|0)>(b|0)){while(1){g=o+(b<<3)|0;b=b+1|0;H[g+4>>2]=H[g+4>>2]+(H[o+(b<<3)>>2]+H[g>>2]>>1);if((b|0)<(Wa|0)){continue}break}}if((b|0)>=(la|0)){break ha}while(1){g=ga;t=b;sa:{ta:{if((b|0)>=0){h=H[((b|0)<(m|0)?o+(b<<3)|0:g)>>2];b=b+1|0;break ta}h=H[o>>2];if((t|0)!=-1){b=t+1|0;g=o;break sa}b=0}if((m|0)<=(b|0)){break sa}g=o+(b<<3)|0}t=o+(t<<3)|0;H[t+4>>2]=H[t+4>>2]+(H[g>>2]+h>>1);if((b|0)<(la|0)){continue}break}}if(!Za(oa,l,x,wa,S,ab,1,0)){break ba}}x=S;if((Z|0)!=(x|0)){continue}break}}k=k+152|0;b=Q<<1;g=n<<1|1;b=b>>>0>g>>>0?b:g;Ua=b>>>0>>0?b:Z;Q=o+(q<<5)|0;b=o+(ka<<5)|0;va=b-4|0;g=(q|0)<(ka|0);Wa=g?Q+28|0:va;ya=b-8|0;Xa=g?Q+24|0:ya;Ga=b-12|0;Ya=g?Q+20|0:Ga;Ka=b-16|0;_a=(q|0)<0?Ra:g?Q+16|0:Ka;xa=u-1|0;$a=(V|0)<(xa|0)?V:xa;i=o+((g?q:ka)<<5)|0;La=(q|0)<=0;ab=La?Ra:i-16|0;Ma=(ka|0)>0;Na=Ma|(u|0)>1;bb=Q+(ja<<4)|0;cb=(o+(4-(ja<<2)<<2)|0)+(j<<5)|0;n=(E|0)<(ka|0)?E:ka;r=q+1|0;g=ea<<1;h=ba<<1|1;mb=g>>>0>>0?g:h;qb=o+(mb<<4)|0;rb=!u&(ka|0)==1;g=o+(u<<5)|0;S=g-20|0;z=g-24|0;ea=g-28|0;ba=g-32|0;aa=g-4|0;ga=g-8|0;da=g-12|0;la=g-16|0;ia=b-20|0;fa=b-24|0;pa=b-28|0;ta=b-32|0;sb=i-4|0;x=i-8|0;tb=i-12|0;while(1){ua:{va:{wa:{xa:{m=l;if(m>>>0>>0){b=wa-m|0;l=m+(b>>>0>=4?4:b)|0;Oa(oa,m,q,l,E,bb,1,8);Oa(oa,m,lb,l,kb,cb,1,8);if(!ja){if(!Na){break ua}if((q|0)>=(E|0)){break va}H[Q>>2]=H[Q>>2]-((H[ab>>2]+H[_a>>2]|0)+2>>2);ya:{if(!La){b=H[tb>>2];h=x;g=sb;break ya}b=H[o+20>>2];if((q|0)<0){break xa}h=$;g=ib}H[Q+4>>2]=H[Q+4>>2]-((H[Ya>>2]+b|0)+2>>2);H[Q+8>>2]=H[Q+8>>2]-((H[h>>2]+H[Xa>>2]|0)+2>>2);b=H[Wa>>2];g=H[g>>2];break wa}if(rb){H[o>>2]=H[o>>2]/2;H[o+4>>2]=H[o+4>>2]/2;H[o+8>>2]=H[o+8>>2]/2;H[o+12>>2]=H[o+12>>2]/2;break ua}g=q;if((E|0)>(g|0)){while(1){b=o+(g<<5)|0;za:{if((g|0)<0){h=H[o>>2];i=Ma|(g|0)!=-1;H[b+16>>2]=H[b+16>>2]-(((i?h:H[ta>>2])+h|0)+2>>2);h=H[ha>>2];H[b+20>>2]=H[b+20>>2]-(((i?h:H[pa>>2])+h|0)+2>>2);h=H[o+8>>2];H[b+24>>2]=H[b+24>>2]-(((i?h:H[fa>>2])+h|0)+2>>2);h=b;t=H[b+28>>2];b=H[o+12>>2];H[h+28>>2]=t-(((i?b:H[ia>>2])+b|0)+2>>2);g=g+1|0;break za}i=g+1|0;Aa:{if((i|0)<(ka|0)){g=o+(i<<5)|0;H[b+16>>2]=H[b+16>>2]-((H[b>>2]+H[g>>2]|0)+2>>2);H[b+20>>2]=H[b+20>>2]-((H[b+4>>2]+H[g+4>>2]|0)+2>>2);H[b+24>>2]=H[b+24>>2]-((H[b+8>>2]+H[g+8>>2]|0)+2>>2);H[b+28>>2]=H[b+28>>2]-((H[b+12>>2]+H[g+12>>2]|0)+2>>2);break Aa}h=H[b+16>>2];if((g|0)>=(ka|0)){H[b+16>>2]=h-((H[ta>>2]<<1)+2>>2);H[b+20>>2]=H[b+20>>2]-((H[pa>>2]<<1)+2>>2);H[b+24>>2]=H[b+24>>2]-((H[fa>>2]<<1)+2>>2);H[b+28>>2]=H[b+28>>2]-((H[ia>>2]<<1)+2>>2);break Aa}H[b+16>>2]=h-((H[b>>2]+H[ta>>2]|0)+2>>2);H[b+20>>2]=H[b+20>>2]-((H[b+4>>2]+H[pa>>2]|0)+2>>2);H[b+24>>2]=H[b+24>>2]-((H[b+8>>2]+H[fa>>2]|0)+2>>2);H[b+28>>2]=H[b+28>>2]-((H[b+12>>2]+H[ia>>2]|0)+2>>2)}g=i}if((E|0)!=(g|0)){continue}break}}g=j;if((V|0)<=(g|0)){break ua}while(1){b=o+(g<<5)|0;Ba:{if((g|0)<0){H[b>>2]=H[b>>2]+(H[o+16>>2]<<1>>1);H[b+4>>2]=H[b+4>>2]+(H[o+20>>2]<<1>>1);H[b+8>>2]=H[b+8>>2]+(H[o+24>>2]<<1>>1);H[b+12>>2]=H[b+12>>2]+(H[o+28>>2]<<1>>1);break Ba}i=H[b>>2];if(!g){h=(g|0)<(u|0);H[b>>2]=i+(H[o+16>>2]+H[(h?b+16|0:la)>>2]>>1);H[b+4>>2]=H[b+4>>2]+(H[o+20>>2]+H[(h?b+20|0:da)>>2]>>1);H[b+8>>2]=H[b+8>>2]+(H[o+24>>2]+H[(h?b+24|0:ga)>>2]>>1);H[b+12>>2]=H[b+12>>2]+(H[o+28>>2]+H[(h?b+28|0:aa)>>2]>>1);break Ba}if((g|0)<=(u|0)){h=(g|0)<(u|0);H[b>>2]=i+(H[b-16>>2]+H[(h?b+16|0:la)>>2]>>1);H[b+4>>2]=H[b+4>>2]+(H[b-12>>2]+H[(h?b+20|0:da)>>2]>>1);H[b+8>>2]=H[b+8>>2]+(H[b-8>>2]+H[(h?b+24|0:ga)>>2]>>1);H[b+12>>2]=H[b+12>>2]+(H[b-4>>2]+H[(h?b+28|0:aa)>>2]>>1);break Ba}H[b>>2]=i+(H[la>>2]<<1>>1);H[b+4>>2]=H[b+4>>2]+(H[da>>2]<<1>>1);H[b+8>>2]=H[b+8>>2]+(H[ga>>2]<<1>>1);H[b+12>>2]=H[b+12>>2]+(H[aa>>2]<<1>>1)}g=g+1|0;if((V|0)!=(g|0)){continue}break}break ua}m=R;u=Z;sa=sa+1|0;if((Y|0)!=(sa|0)){continue ea}break da}H[Q+4>>2]=H[Q+4>>2]-((b<<1)+2>>2);H[Q+8>>2]=H[Q+8>>2]-((H[$>>2]<<1)+2>>2);b=H[ib>>2];g=b}H[Q+12>>2]=H[Q+12>>2]-((b+g|0)+2>>2);i=q;b=r;g=b;if((b|0)<(n|0)){while(1){g=o+(b<<5)|0;i=o+(i<<5)|0;H[g>>2]=H[g>>2]-((H[i+16>>2]+H[g+16>>2]|0)+2>>2);H[g+4>>2]=H[g+4>>2]-((H[i+20>>2]+H[g+20>>2]|0)+2>>2);H[g+8>>2]=H[g+8>>2]-((H[i+24>>2]+H[g+24>>2]|0)+2>>2);H[g+12>>2]=H[g+12>>2]-((H[i+28>>2]+H[g+28>>2]|0)+2>>2);i=b;b=b+1|0;if((n|0)!=(b|0)){continue}break}g=n}if((g|0)>=(E|0)){break va}while(1){b=o+(g<<5)|0;i=(g|0)<(ka|0);Ca:{if((g|0)<=0){h=H[Ra>>2];if((g|0)>=0){H[b>>2]=H[b>>2]-((h+H[(i?b+16|0:Ka)>>2]|0)+2>>2);H[b+4>>2]=H[b+4>>2]-((H[o+20>>2]+H[(i?b+20|0:Ga)>>2]|0)+2>>2);H[b+8>>2]=H[b+8>>2]-((H[o+24>>2]+H[(i?b+24|0:ya)>>2]|0)+2>>2);H[b+12>>2]=H[b+12>>2]-((H[o+28>>2]+H[(i?b+28|0:va)>>2]|0)+2>>2);break Ca}H[b>>2]=H[b>>2]-((h<<1)+2>>2);H[b+4>>2]=H[b+4>>2]-((H[o+20>>2]<<1)+2>>2);H[b+8>>2]=H[b+8>>2]-((H[o+24>>2]<<1)+2>>2);H[b+12>>2]=H[b+12>>2]-((H[o+28>>2]<<1)+2>>2);break Ca}h=o+((i?g:ka)<<5)|0;t=H[h-16>>2];if(!i){H[b>>2]=H[b>>2]-((t+H[Ka>>2]|0)+2>>2);H[b+4>>2]=H[b+4>>2]-((H[h-12>>2]+H[Ga>>2]|0)+2>>2);H[b+8>>2]=H[b+8>>2]-((H[h-8>>2]+H[ya>>2]|0)+2>>2);H[b+12>>2]=H[b+12>>2]-((H[h-4>>2]+H[va>>2]|0)+2>>2);break Ca}H[b>>2]=H[b>>2]-((t+H[b+16>>2]|0)+2>>2);H[b+4>>2]=H[b+4>>2]-((H[h-12>>2]+H[b+20>>2]|0)+2>>2);H[b+8>>2]=H[b+8>>2]-((H[h-8>>2]+H[b+24>>2]|0)+2>>2);H[b+12>>2]=H[b+12>>2]-((H[h-4>>2]+H[b+28>>2]|0)+2>>2)}g=g+1|0;if((E|0)!=(g|0)){continue}break}}if((j|0)>=(V|0)){break ua}g=j;if((xa|0)>(g|0)){while(1){b=o+(g<<5)|0;H[b+16>>2]=H[b+16>>2]+(H[b+32>>2]+H[b>>2]>>1);H[b+20>>2]=H[b+20>>2]+(H[b+36>>2]+H[b+4>>2]>>1);H[b+24>>2]=H[b+24>>2]+(H[b+40>>2]+H[b+8>>2]>>1);H[b+28>>2]=H[b+28>>2]+(H[b+44>>2]+H[b+12>>2]>>1);g=g+1|0;if(($a|0)>(g|0)){continue}break}}if((g|0)>=(V|0)){break ua}while(1){b=o+(g<<5)|0;Da:{Ea:{Fa:{if((g|0)<0){i=H[o>>2];if((g|0)!=-1){break Fa}if((u|0)<=0){H[b+16>>2]=H[b+16>>2]+(i+H[ba>>2]>>1);H[b+20>>2]=H[b+20>>2]+(H[ea>>2]+H[o+4>>2]>>1);H[b+24>>2]=H[b+24>>2]+(H[z>>2]+H[o+8>>2]>>1);t=H[o+12>>2];i=H[S>>2];break Ea}break Fa}i=g+1|0;Ga:{if((i|0)<(u|0)){g=o+(i<<5)|0;H[b+16>>2]=H[b+16>>2]+(H[g>>2]+H[b>>2]>>1);H[b+20>>2]=H[b+20>>2]+(H[g+4>>2]+H[b+4>>2]>>1);H[b+24>>2]=H[b+24>>2]+(H[g+8>>2]+H[b+8>>2]>>1);H[b+28>>2]=H[b+28>>2]+(H[g+12>>2]+H[b+12>>2]>>1);break Ga}if((g|0)>=(u|0)){H[b+16>>2]=H[b+16>>2]+H[ba>>2];H[b+20>>2]=H[b+20>>2]+H[ea>>2];H[b+24>>2]=H[b+24>>2]+H[z>>2];H[b+28>>2]=H[b+28>>2]+H[S>>2];break Ga}H[b+16>>2]=H[b+16>>2]+(H[ba>>2]+H[b>>2]>>1);H[b+20>>2]=H[b+20>>2]+(H[ea>>2]+H[b+4>>2]>>1);H[b+24>>2]=H[b+24>>2]+(H[z>>2]+H[b+8>>2]>>1);H[b+28>>2]=H[b+28>>2]+(H[S>>2]+H[b+12>>2]>>1)}g=i;break Da}H[b+16>>2]=i+H[b+16>>2];H[b+20>>2]=H[b+20>>2]+H[o+4>>2];H[b+24>>2]=H[b+24>>2]+H[o+8>>2];t=H[o+12>>2];i=t}H[b+28>>2]=H[b+28>>2]+(i+t>>1);g=g+1|0}if((V|0)!=(g|0)){continue}break}}if(Za(oa,m,mb,l,Ua,qb,1,4)){continue}break}break}break ba}Ca(o);g=1}b=H[ma-16>>2];i=H[gb>>2];h=H[hb>>2];q=H[ma-8>>2];Oa(oa,b-i|0,H[ma-12>>2]-h|0,q-i|0,H[ma-4>>2]-h|0,H[C+52>>2],1,q-b|0);Va(oa);break X}Va(oa);Ca(o);g=0;break X}Va(oa);g=0;break X}g=0;Sa(m);Ca(j)}na=_+32|0;if(g){break W}break b}h=0;J=na+-64|0;na=J;Ha:{Ia:{if(H[D+64>>2]){r=H[C+28>>2];i=r+N(H[C+24>>2],152)|0;k=H[i-152>>2];o=1;x=H[D+44>>2];M=H[x+4>>2];if((j|0)==1){break Ha}t=j-1|0;b=r;Ja:{if((j|0)!=2){q=t&1;n=t&-2;g=0;while(1){j=H[b+160>>2]-H[b+152>>2]|0;h=h>>>0>j>>>0?h:j;j=H[b+164>>2]-H[b+156>>2]|0;h=h>>>0>j>>>0?h:j;j=H[b+312>>2]-H[b+304>>2]|0;h=h>>>0>j>>>0?h:j;j=H[b+316>>2]-H[b+308>>2]|0;h=h>>>0>j>>>0?h:j;b=b+304|0;g=g+2|0;if((n|0)!=(g|0)){continue}break}if(!q){break Ja}}g=H[b+160>>2]-H[b+152>>2]|0;g=g>>>0>>0?h:g;b=H[b+164>>2]-H[b+156>>2]|0;h=b>>>0>>0?g:b}o=0;if(h>>>0>134217727){break Ha}b=H[i-144>>2];g=H[r+4>>2];i=H[r+12>>2];n=H[r>>2];j=H[r+8>>2];$=h<<5;E=Ia($);H[J+32>>2]=E;if(!E){break Ha}q=i-g|0;i=j-n|0;g=M>>>1|0;ea=g>>>0<=2?2:g;u=b-k|0;aa=u<<5;ga=N(u,28);_=N(u,24);da=N(u,20);ka=u<<4;W=N(u,12);Z=u<<3;H[J>>2]=E;ba=E+32|0;b=H[C+36>>2];while(1){l=q;H[J+8>>2]=l;h=i;H[J+40>>2]=h;Y=H[r+156>>2];w=H[r+164>>2];n=H[r+160>>2];g=H[r+152>>2];H[J+56>>2]=0;H[J+52>>2]=h;H[J+48>>2]=0;R=(g|0)%2|0;H[J+44>>2]=R;i=n-g|0;j=i-h|0;H[J+60>>2]=j;H[J+36>>2]=j;S=(M|0)<2;q=w-Y|0;Ka:{if(!(!S&q>>>0>15)){o=0;k=b;if(q>>>0<8){break Ka}m=i&-2;Q=i&1;j=0;R=(n|0)==(g+1|0);while(1){g=J+32|0;zb(g,k,u,8);Ta(g);if(i){h=0;o=0;La:{if(!R){while(1){g=(h<<2)+k|0;n=E+(h<<5)|0;L[g>>2]=L[n>>2];z=u<<2;L[z+g>>2]=L[n+4>>2];L[g+Z>>2]=L[n+8>>2];L[g+W>>2]=L[n+12>>2];n=h|1;g=(n<<2)+k|0;n=E+(n<<5)|0;L[g>>2]=L[n>>2];L[g+z>>2]=L[n+4>>2];L[g+Z>>2]=L[n+8>>2];L[g+W>>2]=L[n+12>>2];h=h+2|0;o=o+2|0;if((m|0)!=(o|0)){continue}break}if(!Q){break La}}g=(h<<2)+k|0;h=E+(h<<5)|0;L[g>>2]=L[h>>2];L[g+(u<<2)>>2]=L[h+4>>2];L[g+Z>>2]=L[h+8>>2];L[g+W>>2]=L[h+12>>2]}h=0;while(1){g=(h<<2)+k|0;n=E+(h<<5)|0;L[g+ka>>2]=L[n+16>>2];L[g+da>>2]=L[n+20>>2];L[g+_>>2]=L[n+24>>2];L[g+ga>>2]=L[n+28>>2];h=h+1|0;if((i|0)!=(h|0)){continue}break}}k=k+aa|0;g=j+15|0;o=j+8|0;j=o;if(g>>>0>>0){continue}break}break Ka}g=q>>>3|0;m=g>>>0>>0?g:M;Q=(q>>>0)/(m>>>0)&-8;o=q&-8;g=0;k=b;while(1){n=Fa(48);if(!n){break Ia}z=Ia($);H[n>>2]=z;if(!z){o=0;Sa(x);Ca(n);Ca(E);break Ha}H[n+40>>2]=k;H[n+36>>2]=u;H[n+32>>2]=i;H[n+28>>2]=j;H[n+24>>2]=0;H[n+20>>2]=h;H[n+16>>2]=0;H[n+12>>2]=R;H[n+8>>2]=h;H[n+4>>2]=j;V=o-N(g,Q)|0;g=g+1|0;z=(m|0)==(g|0)?V:Q;H[n+44>>2]=z;eb(x,12,n);k=(N(u,z)<<2)+k|0;if((g|0)!=(m|0)){continue}break}Sa(x)}Ma:{if(o>>>0>=q>>>0){break Ma}h=J+32|0;g=q-o|0;zb(h,k,u,g);Ta(h);if(!i){break Ma}R=g&-4;Q=g&3;m=0;z=Y+(o-w|0)>>>0>4294967292;while(1){j=(m<<2)+k|0;o=E+(m<<5)|0;h=0;n=0;g=0;Na:{if(!z){while(1){L[j+(N(h,u)<<2)>>2]=L[o+(h<<2)>>2];g=h|1;L[j+(N(g,u)<<2)>>2]=L[o+(g<<2)>>2];g=h|2;L[j+(N(g,u)<<2)>>2]=L[o+(g<<2)>>2];g=h|3;L[j+(N(g,u)<<2)>>2]=L[o+(g<<2)>>2];h=h+4|0;n=n+4|0;if((R|0)!=(n|0)){continue}break}g=h;if(!Q){break Na}}h=0;while(1){L[j+(N(g,u)<<2)>>2]=L[o+(g<<2)>>2];g=g+1|0;h=h+1|0;if((Q|0)!=(h|0)){continue}break}}m=m+1|0;if((m|0)!=(i|0)){continue}break}}n=q-l|0;H[J+4>>2]=n;g=H[r+156>>2];H[J+28>>2]=n;H[J+24>>2]=0;H[J+20>>2]=l;H[J+16>>2]=0;Q=(g|0)%2|0;H[J+12>>2]=Q;Oa:{if(!(!S&i>>>0>15)){g=b;if(i>>>0<8){break Oa}oa=q&-2;la=q&1;ia=n&-2;ha=n&1;V=l&-2;ma=l&1;h=Q<<5;R=ba-h|0;S=h+E|0;fa=N(l,u)<<2;pa=w-1|0;sa=(pa|0)==(l+Y|0);j=i;while(1){h=0;k=0;Pa:{Qa:{switch(l|0){default:while(1){m=(N(h,u)<<2)+g|0;z=H[m+28>>2];o=S+(h<<6)|0;H[o+24>>2]=H[m+24>>2];H[o+28>>2]=z;z=H[m+20>>2];H[o+16>>2]=H[m+16>>2];H[o+20>>2]=z;z=H[m+12>>2];H[o+8>>2]=H[m+8>>2];H[o+12>>2]=z;z=H[m+4>>2];H[o>>2]=H[m>>2];H[o+4>>2]=z;o=h|1;m=S+(o<<6)|0;o=(N(o,u)<<2)+g|0;z=H[o+28>>2];H[m+24>>2]=H[o+24>>2];H[m+28>>2]=z;z=H[o+20>>2];H[m+16>>2]=H[o+16>>2];H[m+20>>2]=z;z=H[o+12>>2];H[m+8>>2]=H[o+8>>2];H[m+12>>2]=z;z=H[o+4>>2];H[m>>2]=H[o>>2];H[m+4>>2]=z;h=h+2|0;k=k+2|0;if((V|0)!=(k|0)){continue}break};if(!ma){break Pa}break;case 0:break Pa;case 1:break Qa}}k=S+(h<<6)|0;h=(N(h,u)<<2)+g|0;m=H[h+28>>2];H[k+24>>2]=H[h+24>>2];H[k+28>>2]=m;m=H[h+20>>2];H[k+16>>2]=H[h+16>>2];H[k+20>>2]=m;m=H[h+12>>2];H[k+8>>2]=H[h+8>>2];H[k+12>>2]=m;m=H[h+4>>2];H[k>>2]=H[h>>2];H[k+4>>2]=m}Ra:{if((l|0)==(q|0)){break Ra}z=g+fa|0;h=0;m=0;if(!sa){while(1){k=z+(N(h,u)<<2)|0;ja=H[k+28>>2];o=R+(h<<6)|0;H[o+24>>2]=H[k+24>>2];H[o+28>>2]=ja;ja=H[k+20>>2];H[o+16>>2]=H[k+16>>2];H[o+20>>2]=ja;ja=H[k+12>>2];H[o+8>>2]=H[k+8>>2];H[o+12>>2]=ja;ja=H[k+4>>2];H[o>>2]=H[k>>2];H[o+4>>2]=ja;o=h|1;k=R+(o<<6)|0;o=z+(N(o,u)<<2)|0;ja=H[o+28>>2];H[k+24>>2]=H[o+24>>2];H[k+28>>2]=ja;ja=H[o+20>>2];H[k+16>>2]=H[o+16>>2];H[k+20>>2]=ja;ja=H[o+12>>2];H[k+8>>2]=H[o+8>>2];H[k+12>>2]=ja;ja=H[o+4>>2];H[k>>2]=H[o>>2];H[k+4>>2]=ja;h=h+2|0;m=m+2|0;if((ia|0)!=(m|0)){continue}break}if(!ha){break Ra}}k=R+(h<<6)|0;h=z+(N(h,u)<<2)|0;m=H[h+28>>2];H[k+24>>2]=H[h+24>>2];H[k+28>>2]=m;m=H[h+20>>2];H[k+16>>2]=H[h+16>>2];H[k+20>>2]=m;m=H[h+12>>2];H[k+8>>2]=H[h+8>>2];H[k+12>>2]=m;m=H[h+4>>2];H[k>>2]=H[h>>2];H[k+4>>2]=m}Ta(J);Sa:{if(!q){break Sa}h=0;k=0;if((Y|0)!=(pa|0)){while(1){m=E+(h<<5)|0;z=H[m+28>>2];o=(N(h,u)<<2)+g|0;H[o+24>>2]=H[m+24>>2];H[o+28>>2]=z;z=H[m+20>>2];H[o+16>>2]=H[m+16>>2];H[o+20>>2]=z;z=H[m+12>>2];H[o+8>>2]=H[m+8>>2];H[o+12>>2]=z;z=H[m+4>>2];H[o>>2]=H[m>>2];H[o+4>>2]=z;o=h|1;m=(N(o,u)<<2)+g|0;o=E+(o<<5)|0;z=H[o+28>>2];H[m+24>>2]=H[o+24>>2];H[m+28>>2]=z;z=H[o+20>>2];H[m+16>>2]=H[o+16>>2];H[m+20>>2]=z;z=H[o+12>>2];H[m+8>>2]=H[o+8>>2];H[m+12>>2]=z;z=H[o+4>>2];H[m>>2]=H[o>>2];H[m+4>>2]=z;h=h+2|0;k=k+2|0;if((oa|0)!=(k|0)){continue}break}if(!la){break Sa}}k=(N(h,u)<<2)+g|0;h=E+(h<<5)|0;m=H[h+28>>2];H[k+24>>2]=H[h+24>>2];H[k+28>>2]=m;m=H[h+20>>2];H[k+16>>2]=H[h+16>>2];H[k+20>>2]=m;m=H[h+12>>2];H[k+8>>2]=H[h+8>>2];H[k+12>>2]=m;m=H[h+4>>2];H[k>>2]=H[h>>2];H[k+4>>2]=m}g=g+32|0;j=j-8|0;if(j>>>0>7){continue}break}break Oa}g=i>>>3|0;k=g>>>0>>0?g:ea;m=(i>>>0)/(k>>>0)&-8;o=i&-8;j=0;g=b;while(1){h=Fa(48);if(!h){break Ia}R=Ia($);H[h>>2]=R;if(!R){o=0;Sa(x);Ca(h);Ca(E);break Ha}H[h+40>>2]=g;H[h+36>>2]=u;H[h+32>>2]=q;H[h+28>>2]=n;H[h+24>>2]=0;H[h+20>>2]=l;H[h+16>>2]=0;H[h+12>>2]=Q;H[h+8>>2]=l;H[h+4>>2]=n;V=o-N(j,m)|0;j=j+1|0;R=(k|0)==(j|0)?V:m;H[h+44>>2]=R;eb(x,13,h);g=(R<<2)+g|0;if((k|0)!=(j|0)){continue}break}Sa(x)}j=i&7;Ta:{if(!j){break Ta}Q=Q<<5;Ua:{if(!l){break Ua}m=E+Q|0;k=j<<2;h=0;if((l|0)!=1){R=l&1;S=l&-2;o=0;while(1){z=!k;if(!z){B(m+(h<<6)|0,(N(h,u)<<2)+g|0,k)}if(!z){z=h|1;B(m+(z<<6)|0,(N(u,z)<<2)+g|0,k)}h=h+2|0;o=o+2|0;if((S|0)!=(o|0)){continue}break}if(!R){break Ua}}if(!k){break Ua}B(m+(h<<6)|0,(N(h,u)<<2)+g|0,k)}Va:{if((l|0)==(q|0)){break Va}m=ba-Q|0;Q=(N(l,u)<<2)+g|0;k=j<<2;h=0;if((Y|0)!=(w+(l^-1)|0)){l=n&1;n=n&-2;o=0;while(1){R=!k;if(!R){B(m+(h<<6)|0,Q+(N(h,u)<<2)|0,k)}if(!R){R=h|1;B(m+(R<<6)|0,Q+(N(u,R)<<2)|0,k)}h=h+2|0;o=o+2|0;if((n|0)!=(o|0)){continue}break}if(!l){break Va}}if(!k){break Va}B(m+(h<<6)|0,Q+(N(h,u)<<2)|0,k)}Ta(J);if(!q){break Ta}k=j<<2;h=0;if((w|0)!=(Y+1|0)){n=q&1;j=q&-2;o=0;while(1){m=!k;if(!m){B((N(h,u)<<2)+g|0,E+(h<<5)|0,k)}if(!m){m=h|1;B((N(m,u)<<2)+g|0,E+(m<<5)|0,k)}h=h+2|0;o=o+2|0;if((j|0)!=(o|0)){continue}break}if(!n){break Ta}}if(!k){break Ta}B((N(h,u)<<2)+g|0,E+(h<<5)|0,k)}r=r+152|0;t=t-1|0;if(t){continue}break}o=1;Ca(E);break Ha}o=1;q=H[C+28>>2];Q=q+N(j,152)|0;da=Q-152|0;if(H[da>>2]==H[Q-144>>2]){break Ha}ka=Q-148|0;if(H[ka>>2]==H[Q-140>>2]){break Ha}g=H[q+4>>2];i=H[q+12>>2];k=H[q>>2];n=H[q+8>>2];t=H[C+68>>2];E=H[C+64>>2];x=H[C+60>>2];Y=H[C+56>>2];Z=_b(C,j);if(!Z){o=0;break Ha}if((j|0)==1){b=H[Q-16>>2];g=H[da>>2];i=H[ka>>2];h=H[Q-8>>2];Oa(Z,b-g|0,H[Q-12>>2]-i|0,h-g|0,H[Q-4>>2]-i|0,H[C+52>>2],1,h-b|0);Va(Z);break Ha}b=q;Wa:{if((j|0)!=2){h=j-1|0;m=h&1;l=h&-2;h=0;o=0;while(1){r=H[b+160>>2]-H[b+152>>2]|0;h=h>>>0>r>>>0?h:r;r=H[b+164>>2]-H[b+156>>2]|0;h=h>>>0>r>>>0?h:r;r=H[b+312>>2]-H[b+304>>2]|0;h=h>>>0>r>>>0?h:r;r=H[b+316>>2]-H[b+308>>2]|0;h=h>>>0>r>>>0?h:r;b=b+304|0;o=o+2|0;if((l|0)!=(o|0)){continue}break}if(!m){break Wa}}m=H[b+160>>2]-H[b+152>>2]|0;h=h>>>0>m>>>0?h:m;b=H[b+164>>2]-H[b+156>>2]|0;h=b>>>0>>0?h:b}Xa:{if(h>>>0>=134217728){break Xa}R=Ia(h<<5);H[J+32>>2]=R;if(!R){break Xa}H[J>>2]=R;Ya:{if(j){r=i-g|0;b=n-k|0;oa=R+32|0;W=j;la=H[C+20>>2];z=1;ea=0;while(1){H[J+8>>2]=r;H[J+40>>2]=b;i=H[q+164>>2];h=H[q+160>>2];g=H[q+156>>2];k=H[q+152>>2];$=(k|0)%2|0;H[J+44>>2]=$;ia=(g|0)%2|0;H[J+12>>2]=ia;M=h-k|0;ba=M-b|0;H[J+36>>2]=ba;k=i-g|0;ha=k-r|0;H[J+4>>2]=ha;i=Y;o=i;h=x;g=h;j=E;m=j;n=t;u=n;Za:{if(!ea&(z|0)==(la|0)){break Za}w=la-z|0;g=0;o=0;if(i){i=w&31;if((w&63)>>>0>=32){l=-1<>>32-i}i=Y+(h^-1)|0;h=l^-1;n=i>>>0>>0?h+1|0:h;h=w&31;if((w&63)>>>0>=32){o=n>>>h|0}else{o=((1<>>h}}if(x){g=w&31;if((w&63)>>>0>=32){l=-1<>>32-g}g=x+(i^-1)|0;i=l^-1;h=g>>>0>>0?i+1|0:i;i=w&31;if((w&63)>>>0>=32){g=h>>>i|0}else{g=((1<>>i}}n=0;j=0;if(E){i=w&31;if((w&63)>>>0>=32){l=-1<>>32-i}i=E+(h^-1)|0;h=l^-1;j=i>>>0>>0?h+1|0:h;h=w&31;if((w&63)>>>0>=32){j=j>>>h|0}else{j=((1<>>h}}if(t){i=w&31;if((w&63)>>>0>=32){l=-1<>>32-i}i=t+(h^-1)|0;h=l^-1;n=i>>>0>>0?h+1|0:h;h=w&31;if((w&63)>>>0>=32){n=n>>>h|0}else{n=((1<>>h}}m=0;i=0;S=1<>>0>>0){i=w&31;if((w&63)>>>0>=32){l=-1<>>32-i}h=h^-1;i=h+(Y-S|0)|0;l=l^-1;l=h>>>0>i>>>0?l+1|0:l;h=w&31;if((w&63)>>>0>=32){i=l>>>h|0}else{i=((1<>>h}}if(E>>>0>S>>>0){h=w&31;if((w&63)>>>0>=32){l=-1<>>32-h}m=m^-1;h=m+(E-S|0)|0;l=l^-1;l=h>>>0>>0?l+1|0:l;m=w&31;if((w&63)>>>0>=32){m=l>>>m|0}else{m=((1<>>m}}u=0;h=0;if(x>>>0>S>>>0){h=w&31;if((w&63)>>>0>=32){l=-1<>>32-h}aa=aa^-1;h=aa+(x-S|0)|0;l=l^-1;aa=h>>>0>>0?l+1|0:l;l=w&31;if((w&63)>>>0>=32){h=aa>>>l|0}else{h=((1<>>l}}if(t>>>0<=S>>>0){break Za}l=w&31;if((w&63)>>>0>=32){l=-1<>>32-l}aa=u^-1;u=aa+(t-S|0)|0;l=l^-1;S=u>>>0>>0?l+1|0:l;l=w&31;if((w&63)>>>0>=32){u=S>>>l|0}else{u=((1<>>l}}l=H[q+180>>2];w=m-l|0;m=m>>>0>=w>>>0?w:0;w=m+4|0;m=m>>>0>w>>>0?-1:w;ga=m>>>0>>0?m:ba;m=H[q+216>>2];w=j-m|0;j=j>>>0>=w>>>0?w:0;w=j+4|0;j=j>>>0>w>>>0?-1:w;_=b>>>0>j>>>0?j:b;j=($?ga:_)<<1;w=($?_:ga)<<1|1;j=j>>>0>w>>>0?j:w;S=j>>>0>>0;l=i-l|0;i=i>>>0>=l>>>0?l:0;l=i-4|0;ba=i>>>0>=l>>>0?l:0;i=o-m|0;i=i>>>0<=o>>>0?i:0;m=i-4|0;aa=i>>>0>=m>>>0?m:0;V=($?ba:aa)<<1;ma=($?aa:ba)<<1|1;fa=V>>>0>>0;m=H[q+184>>2];i=g-m|0;g=g>>>0>=i>>>0?i:0;i=g-4|0;i=g>>>0>=i>>>0?i:0;o=i;g=H[q+220>>2];l=h-g|0;h=h>>>0>=l>>>0?l:0;l=h-4|0;h=h>>>0>=l>>>0?l:0;l=h;m=n-m|0;n=m>>>0<=n>>>0?m:0;m=n+4|0;n=m>>>0>>0?-1:m;n=n>>>0>>0?n:r;m=n;g=u-g|0;g=g>>>0<=u>>>0?g:0;u=g+4|0;g=g>>>0>u>>>0?-1:u;w=g>>>0>>0?g:ha;u=w;if(ia){l=i;u=m;o=h;m=w}S=S?j:M;j=fa?V:ma;H[J+60>>2]=ga;H[J+56>>2]=ba;H[J+52>>2]=_;H[J+48>>2]=aa;_a:{if(k>>>0<8){b=7;g=0;break _a}g=$<<5;ha=(oa-g|0)+(ba<<6)|0;V=(g+R|0)+(aa<<6)|0;ga=b+ga|0;ma=b+ba|0;fa=r+w|0;pa=h+r|0;sa=R+(j<<5)|0;g=0;while(1){b=g|7;$a:{if(!(g>>>0>>0&b>>>0>=i>>>0|g>>>0>>0&b>>>0>=pa>>>0)){g=g+8|0;break $a}b=k-g|0;ja=b>>>0>=8?8:b;b=0;while(1){$=b+g|0;ba=$+1|0;wa=b<<2;Oa(Z,aa,$,_,ba,wa+V|0,16,0);Oa(Z,ma,$,ga,ba,ha+wa|0,16,0);b=b+1|0;if((ja|0)!=(b|0)){continue}break}Ta(J+32|0);b=g;g=g+8|0;if(!Za(Z,j,b,S,g,sa,8,1)){break Ya}}b=g|7;if(k>>>0>b>>>0){continue}break}}if(!(!(g>>>0>>0&b>>>0>=i>>>0)&(r+w>>>0<=g>>>0|h+r>>>0>b>>>0)|g>>>0>=k>>>0)){b=J+32|0;$=0;ga=k-g|0;if(ga){while(1){ba=g+$|0;aa=ba+1|0;_=H[b+16>>2];ha=$<<2;Oa(Z,_,ba,H[b+20>>2],aa,ha+((H[b>>2]+(H[b+12>>2]<<5)|0)+(_<<6)|0)|0,16,0);_=H[b+24>>2];V=H[b+8>>2];Oa(Z,_+V|0,ba,V+H[b+28>>2]|0,aa,(ha+((H[b>>2]-(H[b+12>>2]<<5)|0)+(_<<6)|0)|0)+32|0,16,0);$=$+1|0;if((ga|0)!=($|0)){continue}break}}Ta(b);if(!Za(Z,j,g,S,k,R+(j<<5)|0,8,1)){break Ya}}H[J+28>>2]=w;H[J+24>>2]=h;H[J+20>>2]=n;H[J+16>>2]=i;if(j>>>0>>0){b=m<<1;g=u<<1|1;b=b>>>0>g>>>0?b:g;g=b>>>0>>0?b:k;b=ia<<5;m=(oa-b|0)+(h<<6)|0;u=(b+R|0)+(i<<6)|0;w=r+w|0;h=h+r|0;b=o<<1;l=l<<1|1;l=b>>>0>>0?b:l;r=R+(l<<5)|0;while(1){b=S-j|0;b=(b>>>0>=8?8:b)+j|0;Oa(Z,j,i,b,n,u,1,16);Oa(Z,j,h,b,w,m,1,16);Ta(J);if(!Za(Z,j,l,b,g,r,1,8)){break Ya}j=j+8|0;if(S>>>0>j>>>0){continue}break}}q=q+152|0;b=M;r=k;z=z+1|0;ea=z?ea:ea+1|0;if(ea|(z|0)!=(W|0)){continue}break}}o=1;b=H[Q-16>>2];g=H[da>>2];i=H[ka>>2];h=H[Q-8>>2];Oa(Z,b-g|0,H[Q-12>>2]-i|0,h-g|0,H[Q-4>>2]-i|0,H[C+52>>2],1,h-b|0);Va(Z);Ca(R);break Ha}Va(Z);Ca(R);o=0;break Ha}Va(Z);o=0;break Ha}o=0;Sa(x);Ca(E)}na=J- -64|0;if(o){break W}break b}s=s+1080|0;A=A+52|0;C=C+76|0;p=p+1|0;if(p>>>0>2]){continue}break}s=H[D+32>>2];v=H[H[D+20>>2]>>2]}k=H[s+16>>2];ab:{if(H[D+68>>2]|!k){break ab}A=H[v+20>>2];g=H[A+28>>2];bb:{cb:{i=H[D+64>>2];if(i){p=H[v+16>>2];if(p>>>0<3){break bb}b=H[A+24>>2];if(!((b|0)==H[A+100>>2]&(b|0)==H[A+176>>2])){Ba(f,1,10089,0);break b}h=H[H[D+24>>2]+24>>2];q=H[h+36>>2];db:{if((q|0)!=H[h+88>>2]|(q|0)!=H[h+140>>2]){break db}h=N(b,152);b=h+g|0;b=N(H[b-140>>2]-H[b-148>>2]|0,H[b-144>>2]-H[b-152>>2]|0);g=h+H[A+104>>2]|0;if((b|0)!=(N(H[g-140>>2]-H[g-148>>2]|0,H[g-144>>2]-H[g-152>>2]|0)|0)){break db}g=h+H[A+180>>2]|0;if((N(H[g-140>>2]-H[g-148>>2]|0,H[g-144>>2]-H[g-152>>2]|0)|0)==(b|0)){break cb}}Ba(f,1,10089,0);break b}p=H[v+16>>2];if(p>>>0<3){break bb}h=H[H[D+24>>2]+24>>2];b=H[h+36>>2];eb:{if((b|0)!=H[h+88>>2]){break eb}h=H[h+140>>2];if((h|0)!=(b|0)){break eb}q=N(b,152);b=g+q|0;b=N(H[b+148>>2]-H[b+140>>2]|0,H[b+144>>2]-H[b+136>>2]|0);g=q+H[A+104>>2]|0;if((b|0)!=(N(H[g+148>>2]-H[g+140>>2]|0,H[g+144>>2]-H[g+136>>2]|0)|0)){break eb}g=H[A+180>>2]+N(h,152)|0;if((N(H[g+148>>2]-H[g+140>>2]|0,H[g+144>>2]-H[g+136>>2]|0)|0)==(b|0)){break cb}}Ba(f,1,10089,0);break b}if((k|0)==2){if(!H[s+5608>>2]){break ab}i=Fa(p<<2);if(!i){break b}n=H[v+16>>2];fb:{if(!n){break fb}gb:{hb:{if(H[D+64>>2]){p=n&3;g=0;if(n>>>0>=4){break hb}C=0;break gb}p=n&3;g=0;ib:{if(n>>>0<4){C=0;break ib}k=n&-4;C=0;h=0;while(1){q=i+(C<<2)|0;H[q>>2]=H[A+52>>2];H[q+4>>2]=H[A+128>>2];H[q+8>>2]=H[A+204>>2];H[q+12>>2]=H[A+280>>2];C=C+4|0;A=A+304|0;h=h+4|0;if((k|0)!=(h|0)){continue}break}if(!p){break fb}}while(1){H[i+(C<<2)>>2]=H[A+52>>2];C=C+1|0;A=A+76|0;g=g+1|0;if((p|0)!=(g|0)){continue}break}break fb}k=n&-4;C=0;h=0;while(1){q=i+(C<<2)|0;H[q>>2]=H[A+36>>2];H[q+4>>2]=H[A+112>>2];H[q+8>>2]=H[A+188>>2];H[q+12>>2]=H[A+264>>2];C=C+4|0;A=A+304|0;h=h+4|0;if((k|0)!=(h|0)){continue}break}if(!p){break fb}}while(1){H[i+(C<<2)>>2]=H[A+36>>2];C=C+1|0;A=A+76|0;g=g+1|0;if((p|0)!=(g|0)){continue}break}}h=H[s+5608>>2];g=i;k=0;s=Fa(n<<3);i=0;jb:{if(!s){break jb}if(!(!b|!n)){i=b;u=s+(n<<2)|0;r=n&-4;m=n&3;o=n-1|0;while(1){v=0;p=0;b=0;t=o>>>0<3;kb:{if(!t){while(1){b=v<<2;L[b+s>>2]=L[H[b+g>>2]>>2];q=b|4;L[q+s>>2]=L[H[g+q>>2]>>2];q=b|8;L[q+s>>2]=L[H[g+q>>2]>>2];b=b|12;L[b+s>>2]=L[H[b+g>>2]>>2];v=v+4|0;p=p+4|0;if((r|0)!=(p|0)){continue}break}b=v;if(!m){break kb}}v=0;while(1){q=b<<2;L[q+s>>2]=L[H[g+q>>2]>>2];b=b+1|0;v=v+1|0;if((m|0)!=(v|0)){continue}break}}q=0;b=h;while(1){E=q<<2;j=E+u|0;H[j>>2]=0;ca=O(0);v=0;p=0;lb:{if(!t){while(1){l=s+(v<<2)|0;ca=O(O(L[b>>2]*L[l>>2])+ca);L[j>>2]=ca;ca=O(O(L[b+4>>2]*L[l+4>>2])+ca);L[j>>2]=ca;ca=O(O(L[b+8>>2]*L[l+8>>2])+ca);L[j>>2]=ca;ca=O(O(L[b+12>>2]*L[l+12>>2])+ca);L[j>>2]=ca;v=v+4|0;b=b+16|0;p=p+4|0;if((r|0)!=(p|0)){continue}break}p=v;if(!m){break lb}}v=0;while(1){ca=O(O(L[b>>2]*L[s+(p<<2)>>2])+ca);L[j>>2]=ca;p=p+1|0;b=b+4|0;v=v+1|0;if((m|0)!=(v|0)){continue}break}}v=g+E|0;p=H[v>>2];H[v>>2]=p+4;L[p>>2]=ca;q=q+1|0;if((n|0)!=(q|0)){continue}break}k=k+1|0;if((i|0)!=(k|0)){continue}break}}Ca(s);i=1}b=i;Ca(g);if(b){break ab}break b}if(H[H[s+5584>>2]+20>>2]==1){if(i){cc(H[A+36>>2],H[A+112>>2],H[A+188>>2],b);break ab}cc(H[A+52>>2],H[A+128>>2],H[A+204>>2],b);break ab}if(i){bc(H[A+36>>2],H[A+112>>2],H[A+188>>2],b);break ab}bc(H[A+52>>2],H[A+128>>2],H[A+204>>2],b);break ab}H[ra>>2]=p;Ba(f,1,10150,ra)}m=H[H[D+20>>2]>>2];if(!H[m+16>>2]){X=1;break b}l=H[D+68>>2];k=H[m+20>>2];b=H[H[D+32>>2]+5584>>2];q=H[H[D+24>>2]+24>>2];i=0;while(1){mb:{if(H[l+(i<<2)>>2]?0:l){break mb}h=H[k+28>>2];g=h+N(H[q+36>>2],152)|0;nb:{if(!H[D+64>>2]){h=H[g+148>>2]-H[g+140>>2]|0;v=H[g+144>>2]-H[g+136>>2]|0;r=0;p=52;break nb}h=h+N(H[k+24>>2],152)|0;v=H[g+8>>2]-H[g>>2]|0;r=H[h-144>>2]-(v+H[h-152>>2]|0)|0;h=H[g+12>>2]-H[g+4>>2]|0;p=36}g=H[q+24>>2];ob:{if(H[q+32>>2]){g=1<>2];if(H[b+20>>2]==1){n=v&-2;j=v&1;A=0;r=r<<2;while(1){p=0;pb:{if((v|0)!=1){while(1){g=H[b+1076>>2]+H[X>>2]|0;H[X>>2]=(g|0)<(s|0)?s:(g|0)<(C|0)?g:C;g=H[b+1076>>2]+H[X+4>>2]|0;H[X+4>>2]=(g|0)<(s|0)?s:(g|0)<(C|0)?g:C;X=X+8|0;p=p+2|0;if((n|0)!=(p|0)){continue}break}if(!j){break pb}}g=H[b+1076>>2]+H[X>>2]|0;H[X>>2]=(g|0)<(s|0)?s:(g|0)<(C|0)?g:C;X=X+4|0}X=r+X|0;A=A+1|0;if((A|0)!=(h|0)){continue}break}break mb}u=s>>31;g=0;while(1){p=0;while(1){ca=L[X>>2];j=C;qb:{if(ca>O(2147483648)){break qb}j=s;if(ca>2];j=n;za=ca;ca=O(T(ca));Pa=O(za-ca);if(!(PaO(.5)){break rb}Pa=ca;ca=O(ca*O(.5));za=O(ca-O(T(ca)))==O(0)?Pa:za}ca=za}t=n>>31;if(O(P(ca))>31)|0;j=j+n|0;n=n>>>0>j>>>0?o+1|0:o;j=j>>>0>>0&(n|0)<=(u|0)|(n|0)<(u|0)?s:j>>>0>>0&(n|0)<=0|(n|0)<0?j:C}H[X>>2]=j;X=X+4|0;p=p+1|0;if((v|0)!=(p|0)){continue}break}X=(r<<2)+X|0;g=g+1|0;if((h|0)!=(g|0)){continue}break}}k=k+76|0;b=b+1080|0;q=q+52|0;X=1;i=i+1|0;if(i>>>0>2]){continue}break}break b}X=0;Ba(f,1,3372,0)}na=ra+16|0;if(!X){jb(ua);H[a+8>>2]=H[a+8>>2]|32768;Ba(f,1,11451,0);break a}sb:{if(!c){break sb}b=0;q=H[a+232>>2];g=Rb(q,1);if(!((g|0)==-1|d>>>0>>0)){tb:{b=1;d=H[q+24>>2];if(!H[d+16>>2]){break tb}h=H[d+24>>2];k=H[H[H[q+20>>2]>>2]+20>>2];while(1){b=H[h+24>>2];i=b&7;v=b>>>3|0;d=H[k+28>>2];b=d+N(H[h+36>>2],152)|0;ub:{if(H[q+64>>2]){g=d+N(H[k+24>>2],152)|0;d=H[b+8>>2]-H[b>>2]|0;p=H[g-144>>2]-(d+H[g-152>>2]|0)|0;g=H[b+12>>2]-H[b+4>>2]|0;b=36;break ub}g=H[b+148>>2]-H[b+140>>2]|0;d=H[b+144>>2]-H[b+136>>2]|0;p=0;b=52}b=H[b+k>>2];vb:{wb:{xb:{yb:{i=v+((i|0)!=0)|0;switch(((i|0)==3?4:i)-1|0){case 0:break xb;case 1:break wb;case 3:break yb;default:break vb}}if(!g){break vb}d=d<<2;if((g|0)!=1){i=g&1;v=g&-2;g=0;while(1){s=!d;if(!s){B(c,b,d)}n=p<<2;b=n+(b+d|0)|0;c=c+d|0;if(!s){B(c,b,d)}c=c+d|0;b=n+(b+d|0)|0;g=g+2|0;if((v|0)!=(g|0)){continue}break}if(!i){break vb}}if(d){B(c,b,d)}c=c+d|0;break vb}i=!g|!d;if(H[h+32>>2]){if(i){break vb}s=d&-8;v=d&7;i=0;n=d-1>>>0<7;while(1){d=0;zb:{if(!n){while(1){F[c|0]=H[b>>2];F[c+1|0]=H[b+4>>2];F[c+2|0]=H[b+8>>2];F[c+3|0]=H[b+12>>2];F[c+4|0]=H[b+16>>2];F[c+5|0]=H[b+20>>2];F[c+6|0]=H[b+24>>2];F[c+7|0]=H[b+28>>2];c=c+8|0;b=b+32|0;d=d+8|0;if((s|0)!=(d|0)){continue}break}if(!v){break zb}}d=0;while(1){F[c|0]=H[b>>2];c=c+1|0;b=b+4|0;d=d+1|0;if((v|0)!=(d|0)){continue}break}}b=(p<<2)+b|0;i=i+1|0;if((i|0)!=(g|0)){continue}break}break vb}if(i){break vb}s=d&-8;v=d&7;i=0;n=d-1>>>0<7;p=p<<2;while(1){d=0;Ab:{if(!n){while(1){F[c|0]=H[b>>2];F[c+1|0]=H[b+4>>2];F[c+2|0]=H[b+8>>2];F[c+3|0]=H[b+12>>2];F[c+4|0]=H[b+16>>2];F[c+5|0]=H[b+20>>2];F[c+6|0]=H[b+24>>2];F[c+7|0]=H[b+28>>2];c=c+8|0;b=b+32|0;d=d+8|0;if((s|0)!=(d|0)){continue}break}if(!v){break Ab}}d=0;while(1){F[c|0]=H[b>>2];c=c+1|0;b=b+4|0;d=d+1|0;if((v|0)!=(d|0)){continue}break}}b=b+p|0;i=i+1|0;if((i|0)!=(g|0)){continue}break}break vb}i=!g|!d;if(H[h+32>>2]){if(i){break vb}s=d&-8;v=d&7;i=0;n=d-1>>>0<7;while(1){d=0;Bb:{if(!n){while(1){G[c>>1]=H[b>>2];G[c+2>>1]=H[b+4>>2];G[c+4>>1]=H[b+8>>2];G[c+6>>1]=H[b+12>>2];G[c+8>>1]=H[b+16>>2];G[c+10>>1]=H[b+20>>2];G[c+12>>1]=H[b+24>>2];G[c+14>>1]=H[b+28>>2];c=c+16|0;b=b+32|0;d=d+8|0;if((s|0)!=(d|0)){continue}break}if(!v){break Bb}}d=0;while(1){G[c>>1]=H[b>>2];c=c+2|0;b=b+4|0;d=d+1|0;if((v|0)!=(d|0)){continue}break}}b=(p<<2)+b|0;i=i+1|0;if((i|0)!=(g|0)){continue}break}break vb}if(i){break vb}s=d&-8;v=d&7;i=0;n=d-1>>>0<7;while(1){d=0;Cb:{if(!n){while(1){G[c>>1]=H[b>>2];G[c+2>>1]=H[b+4>>2];G[c+4>>1]=H[b+8>>2];G[c+6>>1]=H[b+12>>2];G[c+8>>1]=H[b+16>>2];G[c+10>>1]=H[b+20>>2];G[c+12>>1]=H[b+24>>2];G[c+14>>1]=H[b+28>>2];c=c+16|0;b=b+32|0;d=d+8|0;if((s|0)!=(d|0)){continue}break}if(!v){break Cb}}d=0;while(1){G[c>>1]=H[b>>2];c=c+2|0;b=b+4|0;d=d+1|0;if((v|0)!=(d|0)){continue}break}}b=(p<<2)+b|0;i=i+1|0;if((i|0)!=(g|0)){continue}break}}k=k+76|0;h=h+52|0;b=1;pb=pb+1|0;if(pb>>>0>2]+16>>2]){continue}break}}}if(!b){break a}b=H[ua+5596>>2];if(!b){break sb}Ca(b);H[ua+5596>>2]=0;H[ua+5600>>2]=0}F[a+92|0]=I[a+92|0]&254;H[a+8>>2]=H[a+8>>2]&-129;fb=1;c=Qa(e);b=H[a+8>>2];if(!(c|qa)&(b|0)==64|(b|0)==256){break a}if((Ja(e,Aa+10|0,2,f)|0)!=2){Ba(f,H[a+208>>2]?1:2,2472,0);fb=!H[a+208>>2];break a}Da(Aa+10|0,Aa+12|0,2);b=H[Aa+12>>2];if((b|0)==65424){break a}if((b|0)==65497){H[a+8>>2]=256;H[a+228>>2]=0;break a}if(!(Qa(e)|qa)){H[a+8>>2]=64;Ba(f,2,8419,0);break a}fb=0;Ba(f,1,8306,0)}na=Aa+16|0;return fb|0}function cb(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,v=0,x=0,z=0,A=0,C=0,D=0,E=0,J=0,M=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=O(0),Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,oa=0,pa=0,sa=0,ta=0,ua=0,va=O(0);t=na-80|0;na=t;H[t+40>>2]=65424;v=N(H[a+132>>2],H[a+128>>2]);a:{b:{c:{l=H[a+8>>2];d:{if((l|0)!=8){j=0;if((l|0)!=256){break a}H[t+40>>2]=65497;break d}if(F[a+92|0]&1){break d}Q=v&-2;V=v&1;D=t+77|0;R=t+76|0;U=t+72|0;l=65424;e:{f:{while(1){g:{h:{i:{j:{k:{l:{m:{n:{p=H[a+84>>2];if(!p){break n}n=H[a+80>>2];if(p>>>0<=n>>>0){break n}l=H[a+88>>2]+(n<<3)|0;p=H[l>>2];l=H[l+4>>2];H[a+80>>2]=n+1;if(!bb(j,p,l,k)){Ba(k,1,5440,0);j=0;break a}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+40|0,2);if(H[t+40>>2]==65424){break m}Ba(k,1,4073,0);j=0;break a}if((l|0)==65427){break l}}while(1){if(!(Qa(j)|qa)){H[a+8>>2]=64;break l}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+36|0,2);if(K[t+36>>2]<=1){Ba(k,1,6048,0);j=0;break a}o:{if(H[t+40>>2]!=32896){break o}if(Qa(j)|qa){break o}H[a+8>>2]=64;break l}m=H[a+8>>2];p:{if(!(m&16)){l=H[t+36>>2];break p}l=H[t+36>>2];n=H[a+24>>2];if(!n){break p}p=l+2|0;if(p>>>0>n>>>0){Ba(k,1,8370,0);j=0;break a}H[a+24>>2]=n-p}p=l-2|0;H[t+36>>2]=p;l=24912;A=H[t+40>>2];while(1){n=l;o=H[l>>2];if(o){l=l+12|0;if((o|0)!=(A|0)){continue}}break}if(!(m&H[n+4>>2])){Ba(k,1,5397,0);j=0;break a}q:{if(K[a+20>>2]>=p>>>0){l=H[a+16>>2];break q}l=Qa(j);m=qa;if((m|0)<0){l=1}else{l=l>>>0

>>0&(m|0)<=0}if(l){Ba(k,1,5797,0);j=0;break a}l=Ha(H[a+16>>2],H[t+36>>2]);if(!l){Ca(H[a+16>>2]);H[a+16>>2]=0;H[a+20>>2]=0;Ba(k,1,4973,0);j=0;break a}H[a+16>>2]=l;p=H[t+36>>2];H[a+20>>2]=p}l=Ja(j,l,p,k);if((l|0)!=H[t+36>>2]){Ba(k,1,2472,0);j=0;break a}n=H[n+8>>2];if(!n){Ba(k,1,11725,0);j=0;break a}if(!(ra[n|0](a,H[a+16>>2],l,k)|0)){H[t+32>>2]=H[t+40>>2];Ba(k,1,13959,t+32|0);j=0;break a}q=H[j+56>>2];m=H[t+36>>2];A=H[a+224>>2];p=H[A+40>>2];x=H[a+228>>2];r=N(x,40);l=p+r|0;z=H[l+20>>2];E=z+1|0;n=H[l+28>>2];r:{if(E>>>0<=n>>>0){l=H[l+24>>2];break r}X=O(O(n>>>0)+O(100));if(X=O(0)){n=~~X>>>0}else{n=0}H[l+28>>2]=n;l=Ha(H[l+24>>2],N(n,24));p=H[A+40>>2];n=r+p|0;if(!l){break k}H[n+24>>2]=l;z=H[n+20>>2];E=z+1|0}l=N(z,24)+l|0;H[l+16>>2]=m+4;n=(q-m|0)-4|0;H[l+8>>2]=n;H[l+12>>2]=n>>31;G[l>>1]=o;l=p+r|0;H[l+20>>2]=E;s:{if((o|0)!=65424){break s}p=H[l+16>>2];t:{if(!p){break t}o=H[l+12>>2];if(o>>>0>=K[l+4>>2]){break t}l=p+N(o,24)|0;H[l>>2]=n;H[l+4>>2]=0}l=(H[j+56>>2]-H[t+36>>2]|0)-4|0;n=H[a+48>>2];p=H[a+52>>2];if((p|0)>0){m=1}else{m=l>>>0<=n>>>0&(p|0)>=0}if(m){break s}H[a+48>>2]=l;H[a+52>>2]=0}if(I[a+92|0]&4){if((rb(j,H[a+24>>2],k)|0)!=H[a+24>>2]|qa){Ba(k,1,2472,0);j=0;break a}H[t+40>>2]=65427;break l}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+40|0,2);if(H[t+40>>2]!=65427){continue}break}}if(!(!(Qa(j)|qa)&H[a+8>>2]==64)){l=I[a+92|0];if(!(l&4)){l=N(H[a+228>>2],5644);n=H[a+180>>2];u:{v:{if(H[a+56>>2]){q=Qa(j);break v}q=H[a+24>>2];if(q>>>0<2){break u}}q=q-2|0;H[a+24>>2]=q}n=l+n|0;if(!q){break j}l=Qa(j);p=qa;if((p|0)<0){l=1}else{l=l>>>0>>0&(p|0)<=0}if(l){if(H[a+208>>2]){Ba(k,1,5842,0);j=0;break a}Ba(k,2,5842,0)}l=H[a+24>>2];if(l>>>0>=4294967294){Ba(k,1,1480,0);j=0;break a}p=H[n+5596>>2];w:{if(p){o=H[n+5600>>2];if(o>>>0>-3-l>>>0){Ba(k,1,1211,0);j=0;break a}l=Ha(p,(l+o|0)+2|0);if(l){H[n+5596>>2]=l;break j}Ca(H[n+5596>>2]);H[n+5596>>2]=0;break w}l=Fa(l+2|0);H[n+5596>>2]=l;if(l){break j}}Ba(k,1,6176,0);j=0;break a}H[a+8>>2]=8;F[a+92|0]=l&250;break i}l=H[t+40>>2];break g}Ca(H[n+24>>2]);a=H[A+40>>2]+N(x,40)|0;H[a+28>>2]=0;H[a+20>>2]=0;H[a+24>>2]=0;Ba(k,1,3863,0);j=0;break a}m=H[j+56>>2];p=m-2|0;A=H[j+60>>2];z=A-(m>>>0<2)|0;r=H[a+224>>2];J=H[r+40>>2];M=H[a+228>>2];x=N(M,40);l=J+x|0;o=H[l+16>>2]+N(H[l+12>>2],24)|0;H[o+8>>2]=p;H[o+12>>2]=z;z=m;m=H[a+24>>2];z=z+m|0;H[o+16>>2]=z;H[o+20>>2]=m>>>0>z>>>0?A+1|0:A;m=H[a+24>>2];z=H[l+20>>2];E=z+1|0;o=H[l+28>>2];x:{if(E>>>0<=o>>>0){l=H[l+24>>2];break x}X=O(O(o>>>0)+O(100));if(X=O(0)){o=~~X>>>0}else{o=0}H[l+28>>2]=o;l=Ha(H[l+24>>2],N(o,24));J=H[r+40>>2];o=x+J|0;if(!l){break f}H[o+24>>2]=l;z=H[o+20>>2];E=z+1|0}l=N(z,24)+l|0;H[l+16>>2]=m+2;H[l+8>>2]=p;H[l+12>>2]=p>>31;G[l>>1]=65427;H[(x+J|0)+20>>2]=E;y:{if(q){q=Ja(j,H[n+5596>>2]+H[n+5600>>2]|0,H[a+24>>2],k);l=8;if((q|0)==H[a+24>>2]){break y}l=64;if((q|0)!=-1){break y}Ba(k,1,2472,0);j=0;break a}q=0;l=H[a+24>>2]?64:8}H[a+8>>2]=l;H[n+5600>>2]=H[n+5600>>2]+q;z:{if(F[a+92|0]&1){break z}l=H[a+44>>2];if(H[a+76>>2]|((l|0)<0|(l|0)!=H[a+228>>2])){break z}if(!Ab(j)){break z}n=H[a+228>>2];p=H[a+180>>2]+N(n,5644)|0;l=H[p+5592>>2];n=H[H[a+224>>2]+40>>2]+N(n,40)|0;if((l|0)!=H[n+4>>2]){break z}p=H[p+5588>>2]+1|0;if(l>>>0<=p>>>0){break z}A:{l=H[n+16>>2]+N(p,24)|0;n=H[l>>2];l=H[l+4>>2];if((n|0)==H[j+56>>2]&(l|0)==H[j+60>>2]){break A}if(bb(j,n,l,k)){break A}Ba(k,1,5440,0);j=0;break a}if((Ja(j,H[a+16>>2],2,k)|0)!=2){Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+40|0,2);if(H[t+40>>2]==65424){break h}Ba(k,1,4073,0);j=0;break a}l=I[a+92|0];if((l&9)!=1){break i}F[a+92|0]=l|8;p=H[a+228>>2];if(H[(H[a+180>>2]+N(p,5644)|0)+5592>>2]==1){break i}if(!Ab(j)){break i}l=H[j+60>>2];o=l;m=H[j+56>>2];if((l&m)==-1){break i}B:{while(1){l=1;n=t+70|0;if((Ja(j,n,2,k)|0)!=2){break B}Da(n,t- -64|0,2);if(H[t+64>>2]!=65424){break B}q=2472;if((Ja(j,n,2,k)|0)!=2){break c}Da(n,t+60|0,2);if(H[t+60>>2]!=10){q=6048;break c}H[t+60>>2]=8;n=Ja(j,t+70|0,8,k);if((n|0)!=H[t+60>>2]){break c}if((n|0)!=8){q=4047;break c}Da(t+70|0,t+56|0,2);Da(U,t+52|0,4);Da(R,t+48|0,1);Da(D,t+44|0,1);if((p|0)!=H[t+56>>2]){n=H[t+52>>2];if(n>>>0<14){break B}n=n-12|0;H[t+52>>2]=n;n=rb(j,n,k);if(!qa&H[t+52>>2]==(n|0)){continue}break B}break}l=H[t+48>>2]!=H[t+44>>2]}if(!nc(j,m,o,k)){break b}if(l){break i}F[a+92|0]=I[a+92|0]&238|16;C:{if(!v){break C}p=H[a+180>>2];q=0;l=0;if((v|0)!=1){while(1){n=p+N(q,5644)|0;o=H[n+5592>>2];if(o){H[n+5592>>2]=o+1}o=H[n+11236>>2];if(o){H[n+11236>>2]=o+1}q=q+2|0;l=l+2|0;if((Q|0)!=(l|0)){continue}break}if(!V){break C}}l=p+N(q,5644)|0;n=H[l+5592>>2];if(!n){break C}H[l+5592>>2]=n+1}Ba(k,2,9035,0)}if(F[a+92|0]&1){break h}if((Ja(j,H[a+16>>2],2,k)|0)!=2){if(!(!v|(v|0)!=(H[a+228>>2]+1|0))){j=H[a+180>>2];l=0;while(1){n=j+N(l,5644)|0;if(!(H[n+5588>>2]|H[n+5592>>2])){break e}l=l+1|0;if((v|0)!=(l|0)){continue}break}}Ba(k,1,2472,0);j=0;break a}Da(H[a+16>>2],t+40|0,2)}l=H[t+40>>2];if(F[a+92|0]&1){break g}if((l|0)!=65497){continue}}break}if(H[a+8>>2]==256|(l|0)!=65497){break d}H[a+8>>2]=256;H[a+228>>2]=0;break d}Ca(H[o+24>>2]);a=H[r+40>>2]+N(M,40)|0;H[a+28>>2]=0;H[a+20>>2]=0;H[a+24>>2]=0;Ba(k,1,3863,0);j=0;break a}H[t+16>>2]=l;Ba(k,4,11004,t+16|0);H[a+228>>2]=l;H[t+40>>2]=65497;H[a+8>>2]=256}l=H[a+228>>2];j=H[a+180>>2];D:{E:{if(F[a+92|0]&1){break E}F:{G:{if(l>>>0>=v>>>0){break G}q=j+N(l,5644)|0;while(1){if(H[q+5596>>2]){break G}l=l+1|0;H[a+228>>2]=l;q=q+5644|0;if((l|0)!=(v|0)){continue}break}break F}if((l|0)!=(v|0)){break E}}H[i>>2]=0;break D}H:{I:{n=j+N(l,5644)|0;if(H[n+5172>>2]){a=6837}else{if(!(I[n+5640|0]&2)){break H}p=H[n+5160>>2];J:{if(!p){q=0;break J}o=p&3;m=H[n+5164>>2];j=0;q=0;l=0;if(p>>>0>=4){A=p&-4;p=0;while(1){v=m+(l<<3)|0;q=H[v+28>>2]+(H[v+20>>2]+(H[v+12>>2]+(H[v+4>>2]+q|0)|0)|0)|0;l=l+4|0;p=p+4|0;if((A|0)!=(p|0)){continue}break}if(!o){break J}}while(1){q=H[(m+(l<<3)|0)+4>>2]+q|0;l=l+1|0;j=j+1|0;if((o|0)!=(j|0)){continue}break}}j=Fa(q);H[n+5172>>2]=j;if(j){break I}a=4009}Ba(k,1,a,0);Ba(k,1,8059,0);j=0;break a}H[n+5180>>2]=q;q=H[n+5164>>2];j=H[n+5160>>2];if(j){p=0;l=0;while(1){v=l<<3;o=v+q|0;m=H[o>>2];if(m){j=H[o+4>>2];if(j){B(H[n+5172>>2]+p|0,m,j)}j=v+H[n+5164>>2]|0;o=H[j+4>>2];Ca(H[j>>2]);q=H[n+5164>>2];j=v+q|0;H[j>>2]=0;H[j+4>>2]=0;p=o+p|0;j=H[n+5160>>2]}l=l+1|0;if(l>>>0>>0){continue}break}}H[n+5160>>2]=0;Ca(q);H[n+5164>>2]=0;H[n+5168>>2]=H[n+5172>>2];H[n+5176>>2]=H[n+5180>>2]}l=H[a+232>>2];Y=H[l+28>>2];n=H[a+228>>2];E=H[(H[Y+76>>2]+N(n,5644)|0)+5584>>2];j=H[l+24>>2];Z=H[j+24>>2];v=H[Y+24>>2];p=(n>>>0)/(v>>>0)|0;V=H[H[l+20>>2]>>2];o=H[Y+12>>2];l=H[Y+4>>2]+N(o,n-N(p,v)|0)|0;n=H[j>>2];n=l>>>0>n>>>0?l:n;H[V>>2]=n;v=l+o|0;l=l>>>0>v>>>0?-1:v;v=H[j+8>>2];l=l>>>0>>0?l:v;H[V+8>>2]=l;K:{L:{if(!((l|0)>(n|0)&(n|0)>=0)){Ba(k,1,6682,0);break L}q=H[V+20>>2];l=p;p=H[Y+16>>2];l=H[Y+8>>2]+N(l,p)|0;n=H[j+4>>2];n=l>>>0>n>>>0?l:n;H[V+4>>2]=n;p=l+p|0;l=l>>>0>p>>>0?-1:p;j=H[j+12>>2];j=j>>>0>l>>>0?l:j;H[V+12>>2]=j;if(!((j|0)>(n|0)&(n|0)>=0)){Ba(k,1,6644,0);break L}M:{if(H[E+4>>2]){if(H[V+16>>2]){break M}j=1;break K}Ba(k,1,5358,0);break L}N:{O:{while(1){H[Z+36>>2]=0;j=H[Z>>2];n=j>>31;o=j-1|0;l=H[V>>2];p=o+l|0;m=n-!j|0;v=m+(l>>31)|0;ta=q,ua=ue(p,l>>>0>p>>>0?v+1|0:v,j,n),H[ta>>2]=ua;l=H[Z+4>>2];p=l>>31;v=l-1|0;A=H[V+4>>2];r=v+A|0;x=p-!l|0;z=x+(A>>31)|0;ta=q,ua=ue(r,r>>>0>>0?z+1|0:z,l,p),H[ta+4>>2]=ua;z=o;o=H[V+8>>2];A=z+o|0;m=(o>>31)+m|0;ta=q,ua=ue(A,o>>>0>A>>>0?m+1|0:m,j,n),H[ta+8>>2]=ua;j=H[V+12>>2];H[q+16>>2]=fa;n=x+(j>>31)|0;j=j+v|0;n=j>>>0>>0?n+1|0:n;ta=q,ua=ue(j,n,l,p),H[ta+12>>2]=ua;j=H[E+4>>2];H[q+20>>2]=j;l=H[Y+80>>2];H[q+24>>2]=j>>>0>>0?1:j-l|0;Ca(H[q+52>>2]);H[q+68>>2]=0;H[q+60>>2]=0;H[q+64>>2]=0;H[q+52>>2]=0;H[q+56>>2]=0;j=N(j,152);l=H[q+28>>2];P:{if(!l){l=Fa(j);H[q+28>>2]=l;if(!l){break L}H[q+32>>2]=j;if(!j){break P}y(l,0,j);break P}if(j>>>0<=K[q+32>>2]){break P}l=Ha(l,j);if(!l){Ba(k,1,3090,0);Ca(H[q+28>>2]);H[q+28>>2]=0;H[q+32>>2]=0;break L}H[q+28>>2]=l;n=H[q+32>>2];p=j-n|0;if(p){y(l+n|0,0,p)}H[q+32>>2]=j}j=H[q+20>>2];if(j){ha=E+944|0;ia=E+812|0;da=E+28|0;z=H[q+28>>2];_=0;while(1){n=j-1|0;l=n&31;if((n&63)>>>0>=32){l=-1<>>32-l}p=p^-1;m=H[q>>2];o=p+m|0;v=l^-1;l=v+(m>>31)|0;m=m>>>0>o>>>0?l+1|0:l;l=n&31;if((n&63)>>>0>=32){r=m>>l}else{r=((1<>>l}H[z>>2]=r;o=H[q+4>>2];l=o+p|0;m=(o>>31)+v|0;m=l>>>0>>0?m+1|0:m;o=n&31;if((n&63)>>>0>=32){x=m>>o}else{x=((1<>>o}H[z+4>>2]=x;o=H[q+8>>2];l=o+p|0;m=(o>>31)+v|0;m=l>>>0>>0?m+1|0:m;o=n&31;if((n&63)>>>0>=32){m=m>>o}else{m=((1<>>o}H[z+8>>2]=m;o=H[q+12>>2];l=o+p|0;A=(o>>31)+v|0;A=l>>>0>>0?A+1|0:A;o=n&31;if((n&63)>>>0>=32){A=A>>o}else{A=((1<>>o}H[z+12>>2]=A;Q=m>>31;D=_<<2;J=H[D+ia>>2];l=J&31;if((J&63)>>>0>=32){l=1<>>32-l}R=o;o=R+m|0;U=o-1|0;l=l+Q|0;o=(o>>>0>>0?l+1|0:l)-!o|0;l=J&31;if((J&63)>>>0>=32){l=o>>l}else{l=((1<>>l}R=l<>31;Q=H[D+ha>>2];l=Q&31;if((Q&63)>>>0>=32){l=-1<>>32-l}D=o^-1;o=D+A|0;l=(l^-1)+U|0;D=o>>>0>>0?l+1|0:l;l=Q&31;if((Q&63)>>>0>=32){l=D>>l}else{l=((1<>>l}l=l<>Q:0;H[z+20>>2]=o;aa=r&-1<>J:0;H[z+16>>2]=l;re(l,0,o);if(!(!l|!qa)){break O}ba=N(l,o);if(ba>>>0>=107374183){break O}D=N(ba,40);if(_){Q=Q-1|0;J=J-1|0;l=$>>31;m=l;o=l+1|0;l=$+1|0;$=((l?m:o)&1)<<31|l>>>1;l=aa>>31;m=l;o=l+1|0;l=aa+1|0;aa=((l?m:o)&1)<<31|l>>>1;l=3}else{l=1}H[z+24>>2]=l;x=z+28|0;o=j;l=j&31;if((j&63)>>>0>=32){l=1<>>32-l}ga=j;A=l;j=H[E+12>>2];R=j>>>0>>0?j:Q;j=R&31;if((R&63)>>>0>=32){l=-1<>>32-j}ja=m^-1;ka=l^-1;j=H[E+8>>2];U=j>>>0>>0?j:J;j=U&31;if((U&63)>>>0>=32){l=-1<>>32-j}la=m^-1;ma=l^-1;ea=0;while(1){Q:{if(!_){l=H[q+4>>2];j=l+p|0;m=(l>>31)+v|0;m=j>>>0>>0?m+1|0:m;l=n&31;if((n&63)>>>0>=32){S=m>>l}else{S=((1<>>l}l=H[q>>2];j=l+p|0;m=(l>>31)+v|0;m=j>>>0>>0?m+1|0:m;l=n&31;if((n&63)>>>0>=32){C=m>>l}else{C=((1<>>l}j=0;m=p;M=m;l=v;T=l;r=n;break Q}j=ea+1|0;r=j>>>1|0;m=n&31;if((n&63)>>>0>=32){l=r<>>32-m;m=r<>2];m=M+r|0;l=(l^-1)+A|0;T=s>>>0>M>>>0?l+1|0:l;l=T+(r>>31)|0;r=m>>>0>>0?l+1|0:l;l=o&31;if((o&63)>>>0>=32){S=r>>l}else{S=((1<>>l}r=j&1;m=n&31;if((n&63)>>>0>=32){l=r<>>32-m;m=r<>2];r=m+s|0;l=(l^-1)+A|0;l=m>>>0>>0?l+1|0:l;C=l+(s>>31)|0;C=r>>>0>>0?C+1|0:C;s=o&31;if((o&63)>>>0>=32){C=C>>s}else{C=((1<>>s}r=o}s=r;P=H[q+8>>2];W=P>>31;r=H[q+12>>2];H[x+4>>2]=S;H[x>>2]=C;H[x+16>>2]=j;S=(r>>31)+T|0;C=r;r=r+M|0;S=C>>>0>r>>>0?S+1|0:S;M=s&31;if((s&63)>>>0>=32){r=S>>M}else{r=((1<>>M}H[x+12>>2]=r;l=l+W|0;C=l+1|0;r=l;l=m+P|0;r=l>>>0

>>0?C:r;m=s&31;if((s&63)>>>0>=32){l=r>>m}else{l=((1<>>m}H[x+8>>2]=l;ca=1;l=H[da>>2];j=(H[Z+24>>2]+(!H[E+20>>2]|!j?0:(j|0)==3?2:1)|0)-l|0;R:{if((j|0)>=1024){ca=898846567431158e293;if(j>>>0<2047){j=j-1023|0;break R}ca=Infinity;j=(j>>>0>=3069?3069:j)-2046|0;break R}if((j|0)>-1023){break R}ca=2004168360008973e-307;if(j>>>0>4294965304){j=j+969|0;break R}ca=0;j=(j>>>0<=4294964336?-2960:j)+1938|0}oa=+H[da+4>>2]*.00048828125+1;u(0,0);u(1,j+1023<<20);ta=x,va=O(oa*(ca*+w())),L[ta+32>>2]=va;H[x+28>>2]=(l+H[E+804>>2]|0)-1;j=H[x+20>>2];S:{T:{if(!(j|!ba)){j=Fa(D);H[x+20>>2]=j;if(!j){Ba(k,1,2854,0);break L}if(D){y(j,0,D)}H[x+24>>2]=D;break T}if(D>>>0>K[x+24>>2]){j=Ha(j,D);if(!j){Ba(k,1,2854,0);Ca(H[x+20>>2]);H[x+20>>2]=0;H[x+24>>2]=0;break L}H[x+20>>2]=j;l=H[x+24>>2];m=D-l|0;if(m){y(j+l|0,0,m)}H[x+24>>2]=D}if(!ba){break S}}j=H[x+20>>2];M=0;while(1){m=H[z+16>>2];l=(M>>>0)/(m>>>0)|0;m=M-N(l,m)|0;r=(m<>2];S=(r|0)>(s|0)?r:s;H[j>>2]=S;r=(l<>2];C=(r|0)>(s|0)?r:s;H[j+4>>2]=C;m=(m+1<>2];m=(m|0)<(r|0)?m:r;H[j+8>>2]=m;l=(l+1<>2];r=(l|0)<(r|0)?l:r;H[j+12>>2]=r;l=(m>>31)+ma|0;T=l+1|0;s=l;l=m+la|0;s=m>>>0>l>>>0?T:s;S=S>>U;m=U&31;if((U&63)>>>0>=32){l=s>>m}else{l=((1<>>m}s=l-S<>U;H[j+16>>2]=s;l=(r>>31)+ka|0;T=l+1|0;m=l;l=r+ja|0;r=l>>>0>>0?T:m;C=C>>R;m=R&31;if((R&63)>>>0>=32){l=r>>m}else{l=((1<>>m}l=l-C<>R;H[j+20>>2]=l;r=N(l,s);re(r,0,68);if(qa){Ba(k,1,2935,0);break L}l=N(r,68);m=H[j+24>>2];U:{V:{if(!(m|!r)){m=Fa(l);H[j+24>>2]=m;if(!m){break L}if(!l){break V}y(m,0,l);break V}if(l>>>0<=K[j+28>>2]){break U}m=Ha(m,l);if(!m){Ca(H[j+24>>2]);H[j+24>>2]=0;H[j+28>>2]=0;Ba(k,1,2549,0);break L}H[j+24>>2]=m;s=H[j+28>>2];T=l-s|0;if(!T){break V}y(m+s|0,0,T)}H[j+28>>2]=l}l=H[j+20>>2];m=H[j+16>>2];s=H[j+32>>2];W:{if(!s){l=gc(m,l,k);break W}l=ec(s,m,l,k)}H[j+32>>2]=l;l=H[j+20>>2];m=H[j+16>>2];s=H[j+36>>2];X:{if(!s){l=gc(m,l,k);break X}l=ec(s,m,l,k)}H[j+36>>2]=l;if(r){l=0;while(1){W=H[j+16>>2];T=(l>>>0)/(W>>>0)|0;m=H[j+24>>2]+N(l,68)|0;P=H[m>>2];Y:{if(P){pa=H[m+56>>2];sa=H[m+4>>2];s=H[m+48>>2];Ca(H[m+60>>2]);H[m+48>>2]=0;H[m+52>>2]=0;H[m+64>>2]=0;H[m+56>>2]=0;H[m+60>>2]=0;H[m+40>>2]=0;H[m+44>>2]=0;H[m+32>>2]=0;H[m+36>>2]=0;H[m+24>>2]=0;H[m+28>>2]=0;H[m+16>>2]=0;H[m+20>>2]=0;H[m+8>>2]=0;H[m+12>>2]=0;H[m>>2]=P;H[m+48>>2]=s;Z:{if(!s){break Z}s=N(s,24);if(!s){break Z}y(P,0,s)}H[m+56>>2]=pa;H[m+4>>2]=sa;break Y}s=Ea(10,24);H[m>>2]=s;if(!s){break L}H[m+48>>2]=10}s=(l-N(T,W)|0)+S|0;P=s<>2];H[m+8>>2]=(P|0)>(W|0)?P:W;T=C+T|0;P=T<>2];H[m+12>>2]=(P|0)>(W|0)?P:W;s=s+1<>2];H[m+16>>2]=(s|0)<(P|0)?s:P;P=m;m=T+1<>2];H[P+20>>2]=(m|0)<(s|0)?m:s;l=l+1|0;if((r|0)!=(l|0)){continue}break}}j=j+40|0;M=M+1|0;if((M|0)!=(ba|0)){continue}break}}da=da+8|0;x=x+36|0;ea=ea+1|0;if(ea>>>0>2]){continue}break}z=z+152|0;j=n;_=_+1|0;if(_>>>0>2]){continue}break}}Z=Z+52|0;q=q+76|0;E=E+1080|0;fa=fa+1|0;if(fa>>>0>2]){continue}break}j=1;break K}Ba(k,1,2982,0);break L}Ba(k,1,2373,0)}j=0}if(!j){Ba(k,1,3668,0);j=0;break a}j=H[a+228>>2];H[t+4>>2]=N(H[a+128>>2],H[a+132>>2]);H[t>>2]=j+1;Ba(k,4,11825,t);H[b>>2]=H[a+228>>2];H[i>>2]=1;if(c){b=Rb(H[a+232>>2],0);H[c>>2]=b;j=0;if((b|0)==-1){break a}}b=H[H[H[a+232>>2]+20>>2]>>2];H[d>>2]=H[b>>2];H[e>>2]=H[b+4>>2];H[f>>2]=H[b+8>>2];H[g>>2]=H[b+12>>2];H[h>>2]=H[b+16>>2];H[a+8>>2]=H[a+8>>2]|128}j=1;break a}Ba(k,1,q,0)}Ba(k,1,3702,0);j=0}a=j;na=t+80|0;return a|0}function Vb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,L=0,M=0,O=0,P=0,Q=0,R=0,S=0,T=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{switch(H[a+84>>2]){case 0:k:{c=H[a+52>>2];b=H[a+196>>2];if(c>>>0>>0){q=H[a+64>>2];if(q>>>0>>0){break k}}Ba(H[a+236>>2],1,8491,0);break b}if(!H[a+44>>2]){k=H[a+36>>2];b=0;break i}H[a+44>>2]=0;i=H[a+68>>2];b=1;break i;case 1:l:{c=H[a+52>>2];b=H[a+196>>2];if(c>>>0>>0){q=H[a+64>>2];if(q>>>0>>0){break l}}Ba(H[a+236>>2],1,8536,0);break b}if(!H[a+44>>2]){e=H[a+36>>2];b=0;break e}H[a+44>>2]=0;i=H[a+48>>2];b=1;break e;case 2:m:{A=H[a+52>>2];x=H[a+196>>2];if(A>>>0>>0){r=H[a+64>>2];if(r>>>0>>0){break m}}Ba(H[a+236>>2],1,8671,0);break b}if(!H[a+44>>2]){y=H[a+40>>2];break f}H[a+228>>2]=0;H[a+232>>2]=0;H[a+44>>2]=0;j=H[a+200>>2];while(1){O=j+(u<<4)|0;l=H[O+8>>2];if(l){q=H[O+12>>2];b=0;while(1){g=l+(b^-1)|0;d=q+(b<<4)|0;s=g+H[d>>2]|0;n:{if(s>>>0>31){break n}c=H[O>>2];if(c>>>0>-1>>>s>>>0){break n}c=c<>>0>k>>>0?k:c:c;H[a+228>>2]=k}g=g+H[d+4>>2]|0;o:{if(g>>>0>31){break o}c=H[O+4>>2];if(c>>>0>-1>>>g>>>0){break o}c=c<>>0>i>>>0?i:c:c;H[a+232>>2]=i}b=b+1|0;if((l|0)!=(b|0)){continue}break}}u=u+1|0;if((x|0)!=(u|0)){continue}break};if(!k|!i){break d}if(!I[a|0]){H[a+108>>2]=H[a+208>>2];H[a+100>>2]=H[a+204>>2];H[a+112>>2]=H[a+216>>2];H[a+104>>2]=H[a+212>>2]}o=H[a+48>>2];b=1;break f;case 3:p:{A=H[a+52>>2];l=H[a+196>>2];if(A>>>0>>0){P=H[a+64>>2];if(P>>>0>>0){break p}}Ba(H[a+236>>2],1,8626,0);break b}if(!H[a+44>>2]){B=H[a+200>>2];e=H[a+28>>2];y=B+(e<<4)|0;E=H[a+40>>2];break g}H[a+228>>2]=0;H[a+232>>2]=0;H[a+44>>2]=0;B=H[a+200>>2];while(1){x=(p<<4)+B|0;s=H[x+8>>2];if(s){q=H[x+12>>2];b=0;while(1){g=s+(b^-1)|0;d=q+(b<<4)|0;j=g+H[d>>2]|0;q:{if(j>>>0>31){break q}c=H[x>>2];if(c>>>0>-1>>>j>>>0){break q}c=c<>>0>k>>>0?k:c:c;H[a+228>>2]=k}g=g+H[d+4>>2]|0;r:{if(g>>>0>31){break r}c=H[x+4>>2];if(c>>>0>-1>>>g>>>0){break r}c=c<>>0>i>>>0?i:c:c;H[a+232>>2]=i}b=b+1|0;if((s|0)!=(b|0)){continue}break}}p=p+1|0;if((l|0)!=(p|0)){continue}break};if(!k|!i){break d}s:{if(I[a|0]){p=H[a+108>>2];break s}p=H[a+208>>2];H[a+108>>2]=p;H[a+100>>2]=H[a+204>>2];H[a+112>>2]=H[a+216>>2];H[a+104>>2]=H[a+212>>2]}b=1;break g;case 4:break j;default:break d}}t:{p=H[a+52>>2];b=H[a+196>>2];if(p>>>0>>0){r=H[a+64>>2];if(r>>>0>>0){break t}}Ba(H[a+236>>2],1,8581,0);break d}if(!H[a+44>>2]){p=H[a+28>>2];o=H[a+200>>2]+(p<<4)|0;u=H[a+40>>2];b=0;break h}H[a+28>>2]=p;H[a+44>>2]=0;b=1;break h}u:while(1){v:{w:{if(!b){k=k+1|0;break w}H[a+40>>2]=i;if(K[a+56>>2]<=i>>>0){break b}e=H[a+48>>2];b=0;break v}b=1}x:while(1){y:{z:{A:{B:{if(!b){H[a+32>>2]=e;if(K[a+60>>2]<=e>>>0){break B}H[a+28>>2]=c;b=c;o=0;break y}H[a+36>>2]=k;if(K[a+76>>2]<=k>>>0){b=H[a+28>>2];o=1;break y}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],H[a+40>>2])|0)+N(H[a+20>>2],H[a+28>>2])|0)+N(H[a+24>>2],k)|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break A}break a}i=H[a+40>>2]+1|0;break z}b=0;continue u}b=1;continue u}while(1){C:{D:{E:{if(!o){if(b>>>0>=q>>>0){break E}g=H[a+32>>2];d=H[a+200>>2]+(b<<4)|0;if(g>>>0>=K[d+8>>2]){break C}if(!I[a|0]){b=H[d+12>>2]+(g<<4)|0;H[a+76>>2]=N(H[b+12>>2],H[b+8>>2])}k=H[a+72>>2];b=1;continue x}b=b+1|0;H[a+28>>2]=b;break D}e=H[a+32>>2]+1|0;b=0;continue x}o=0;continue}o=1;continue}}}}F:while(1){G:{H:{if(!b){u=u+1|0;H[a+40>>2]=u;break H}if(p>>>0>=r>>>0){break b}H[a+228>>2]=0;H[a+232>>2]=0;o=H[a+200>>2]+(p<<4)|0;s=H[o+8>>2];if(!s){break b}q=H[o+12>>2];k=0;e=0;b=0;while(1){g=s+(b^-1)|0;d=q+(b<<4)|0;j=g+H[d>>2]|0;I:{if(j>>>0>31){break I}c=H[o>>2];if(c>>>0>-1>>>j>>>0){break I}c=c<>>0>e>>>0?e:c:c;H[a+228>>2]=e}g=g+H[d+4>>2]|0;J:{if(g>>>0>31){break J}c=H[o+4>>2];if(c>>>0>-1>>>g>>>0){break J}c=c<>>0>k>>>0?k:c:c;H[a+232>>2]=k}b=b+1|0;if((s|0)!=(b|0)){continue}break}if(!e|!k){break d}K:{if(I[a|0]){k=H[a+108>>2];break K}k=H[a+208>>2];H[a+108>>2]=k;H[a+100>>2]=H[a+204>>2];H[a+112>>2]=H[a+216>>2];H[a+104>>2]=H[a+212>>2]}b=0;break G}b=1}L:while(1){M:{N:{O:{P:{if(!b){H[a+224>>2]=k;if(K[a+112>>2]<=k>>>0){break P}B=H[a+100>>2];b=0;break M}if(K[a+56>>2]<=u>>>0){i=H[a+32>>2];b=1;break M}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],u)|0)+N(H[a+20>>2],p)|0)+N(H[a+24>>2],H[a+36>>2])|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break O}break a}p=p+1|0;H[a+28>>2]=p;break N}b=0;continue F}b=1;continue F}while(1){Q:{R:{S:{T:{if(!b){H[a+220>>2]=B;if(K[a+104>>2]<=B>>>0){break S}i=H[a+48>>2];break T}i=i+1|0}H[a+32>>2]=i;b=H[a+60>>2];d=H[o+8>>2];if((b>>>0>>0?b:d)>>>0>i>>>0){g=H[o>>2];c=g;n=d+(i^-1)|0;m=n;d=m&31;if((m&63)>>>0>=32){b=c<>>32-d;v=g<>>0>=32){b=b>>>d|0}else{b=((1<>>d}if((q|0)!=(b|0)){break Q}b=m&31;if((m&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}c=H[o+4>>2];if((b&c)!=(c|0)){break Q}d=m&31;if((m&63)>>>0>=32){b=c<>>32-d;w=c<>2];j=F+d|0;O=ve(j,d>>>0>j>>>0?h+1|0:h,w,b);b=h;L=H[a+208>>2];d=F+L|0;b=L>>>0>d>>>0?b+1|0:b;s=ve(d,b,w,C);A=v-1|0;j=H[a+212>>2];l=A+j|0;d=f-!v|0;b=d;x=ve(l,l>>>0>>0?b+1|0:b,v,f);D=H[a+204>>2];j=A+D|0;b=D>>>0>j>>>0?b+1|0:b;j=ve(j,b,v,f);z=H[o+12>>2]+(i<<4)|0;M=H[z>>2];t=M+n|0;b=t&31;if((t&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}if((g|0)!=(b&g)){break Q}h=c;P=H[z+4>>2];n=P+n|0;e=n&31;if((n&63)>>>0>=32){b=c<>>32-e;e=c<>>0>=32){c=b>>>l|0}else{c=((1<>>l}if((h|0)!=(c|0)){break Q}l=H[a+224>>2];e=!!(we(l,e,b)|qa);b=n&31;if((n&63)>>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=n<>>32-e|b<>2];if((t&63)>>>0>=32){b=g<>>32-n;e=g<>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=j<>>32-t|b<>2];if(!n|(!H[z+12>>2]|(j|0)==(x|0))){break Q}if((s|0)==(O|0)){break Q}u=H[a+68>>2];H[a+40>>2]=u;b=d;c=c+A|0;b=c>>>0>>0?b+1|0:b;g=(ve(c,b,v,f)>>>M)-(j>>>M)|0;b=q;c=l+F|0;b=c>>>0>>0?b+1|0:b;S=a,T=N(n,(ve(c,b,w,C)>>>P)-(s>>>P)|0)+g|0,H[S+36>>2]=T;b=1;continue L}c=H[a+220>>2];b=H[a+228>>2];B=c+b-(c>>>0)%(b>>>0)|0;break R}c=H[a+224>>2];b=H[a+232>>2];k=c+b-(c>>>0)%(b>>>0)|0;b=0;continue L}b=0;continue}b=1;continue}}}}U:while(1){V:{W:{if(!b){E=E+1|0;H[a+40>>2]=E;break W}H[a+224>>2]=p;if(K[a+112>>2]<=p>>>0){break b}v=H[a+100>>2];b=0;break V}b=1}X:while(1){Y:{Z:{_:{$:{if(!b){H[a+220>>2]=v;if(K[a+104>>2]<=v>>>0){break $}H[a+28>>2]=A;e=A;b=0;break Y}if(K[a+56>>2]<=E>>>0){u=H[a+32>>2];b=1;break Y}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],E)|0)+N(H[a+20>>2],e)|0)+N(H[a+24>>2],H[a+36>>2])|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break _}break a}c=H[a+224>>2];b=H[a+232>>2];p=c+b-(c>>>0)%(b>>>0)|0;break Z}b=0;continue U}b=1;continue U}while(1){aa:{ba:{ca:{da:{if(!b){if(e>>>0>=P>>>0){break ca}u=H[a+48>>2];H[a+32>>2]=u;y=(e<<4)+B|0;break da}u=u+1|0;H[a+32>>2]=u}b=H[a+60>>2];d=H[y+8>>2];if((b>>>0>>0?b:d)>>>0>u>>>0){g=H[y>>2];c=g;f=d+(u^-1)|0;i=f;d=f&31;if((f&63)>>>0>=32){b=c<>>32-d;k=g<>>0>=32){b=b>>>d|0}else{b=((1<>>d}if((q|0)!=(b|0)){break aa}b=i&31;if((i&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}c=H[y+4>>2];if((b&c)!=(c|0)){break aa}d=i&31;if((i&63)>>>0>=32){b=c<>>32-d;o=c<>2];j=F+d|0;O=ve(j,d>>>0>j>>>0?h+1|0:h,o,b);b=h;w=H[a+208>>2];d=w+F|0;b=w>>>0>d>>>0?b+1|0:b;s=ve(d,b,o,n);C=k-1|0;j=H[a+212>>2];l=C+j|0;d=t-!k|0;b=d;x=ve(l,l>>>0>>0?b+1|0:b,k,t);L=H[a+204>>2];j=C+L|0;b=L>>>0>j>>>0?b+1|0:b;j=ve(j,b,k,t);D=H[y+12>>2]+(u<<4)|0;z=H[D>>2];m=z+f|0;b=m&31;if((m&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}if((g|0)!=(b&g)){break aa}h=c;M=H[D+4>>2];f=M+f|0;r=f&31;if((f&63)>>>0>=32){b=c<>>32-r;r=c<>>0>=32){c=b>>>l|0}else{c=((1<>>l}if((h|0)!=(c|0)){break aa}l=H[a+224>>2];r=!!(we(l,r,b)|qa);b=f&31;if((f&63)>>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-r|b<>2];if((m&63)>>>0>=32){b=g<>>32-f;f=g<>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-m|b<>2];if(!f|(!H[D+12>>2]|(j|0)==(x|0))){break aa}if((s|0)==(O|0)){break aa}E=H[a+68>>2];H[a+40>>2]=E;b=d;c=c+C|0;b=c>>>0>>0?b+1|0:b;g=(ve(c,b,k,t)>>>z)-(j>>>z)|0;b=q;c=l+F|0;b=c>>>0>>0?b+1|0:b;S=a,T=N(f,(ve(c,b,o,n)>>>M)-(s>>>M)|0)+g|0,H[S+36>>2]=T;b=1;continue X}e=e+1|0;H[a+28>>2]=e;break ba}c=H[a+220>>2];b=H[a+228>>2];v=c+b-(c>>>0)%(b>>>0)|0;b=0;continue X}b=0;continue}b=1;continue}}}}ea:while(1){fa:{ga:{if(!b){y=y+1|0;H[a+40>>2]=y;break ga}H[a+32>>2]=o;if(K[a+60>>2]<=o>>>0){break b}E=H[a+108>>2];b=0;break fa}b=1}ha:while(1){ia:{ja:{ka:{la:{if(!b){H[a+224>>2]=E;if(K[a+112>>2]<=E>>>0){break la}B=H[a+100>>2];b=0;break ia}if(K[a+56>>2]<=y>>>0){p=H[a+28>>2];b=1;break ia}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],y)|0)+N(H[a+20>>2],H[a+28>>2])|0)+N(H[a+24>>2],H[a+36>>2])|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break ka}break a}o=H[a+32>>2]+1|0;break ja}b=0;continue ea}b=1;continue ea}while(1){ma:{na:{oa:{pa:{if(!b){H[a+220>>2]=B;if(K[a+104>>2]<=B>>>0){break oa}H[a+28>>2]=A;p=A;break pa}p=p+1|0;H[a+28>>2]=p}if(p>>>0>>0){m=H[a+32>>2];e=H[a+200>>2]+(p<<4)|0;b=H[e+8>>2];if(m>>>0>=b>>>0){break ma}g=H[e>>2];c=g;f=b+(m^-1)|0;i=f;d=f&31;if((f&63)>>>0>=32){b=c<>>32-d;v=g<>>0>=32){b=b>>>d|0}else{b=((1<>>d}if((q|0)!=(b|0)){break ma}b=i&31;if((i&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}c=H[e+4>>2];if((b&c)!=(c|0)){break ma}d=i&31;if((i&63)>>>0>=32){b=c<>>32-d;w=c<>2];j=F+d|0;O=ve(j,d>>>0>j>>>0?h+1|0:h,w,b);b=h;L=H[a+208>>2];d=F+L|0;b=L>>>0>d>>>0?b+1|0:b;s=ve(d,b,w,n);C=v-1|0;j=H[a+212>>2];l=C+j|0;d=t-!v|0;b=d;x=ve(l,l>>>0>>0?b+1|0:b,v,t);D=H[a+204>>2];j=C+D|0;b=D>>>0>j>>>0?b+1|0:b;j=ve(j,b,v,t);z=H[e+12>>2]+(m<<4)|0;M=H[z>>2];m=M+f|0;b=m&31;if((m&63)>>>0>=32){b=-1>>>b|0}else{b=(1<>>b}if((g|0)!=(b&g)){break ma}h=c;P=H[z+4>>2];f=P+f|0;e=f&31;if((f&63)>>>0>=32){b=c<>>32-e;e=c<>>0>=32){c=b>>>l|0}else{c=((1<>>l}if((h|0)!=(c|0)){break ma}l=H[a+224>>2];e=!!(we(l,e,b)|qa);b=f&31;if((f&63)>>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-e|b<>2];if((m&63)>>>0>=32){b=g<>>32-f;f=g<>>0>=32){h=-1<>>32-b;b=-1<>>0>=32){h=f<>>32-m|b<>2];if(!f|(!H[z+12>>2]|(j|0)==(x|0))){break ma}if((s|0)==(O|0)){break ma}y=H[a+68>>2];H[a+40>>2]=y;b=d;c=c+C|0;b=c>>>0>>0?b+1|0:b;g=(ve(c,b,v,t)>>>M)-(j>>>M)|0;b=q;c=l+F|0;b=c>>>0>>0?b+1|0:b;S=a,T=N(f,(ve(c,b,w,n)>>>P)-(s>>>P)|0)+g|0,H[S+36>>2]=T;b=1;continue ha}c=H[a+220>>2];b=H[a+228>>2];B=c+b-(c>>>0)%(b>>>0)|0;break na}c=H[a+224>>2];b=H[a+232>>2];E=c+b-(c>>>0)%(b>>>0)|0;b=0;continue ha}b=0;continue}b=1;continue}}}}qa:while(1){ra:{sa:{if(!b){e=e+1|0;break sa}H[a+32>>2]=i;if(K[a+60>>2]<=i>>>0){break b}k=H[a+68>>2];b=0;break ra}b=1}ta:while(1){ua:{va:{wa:{xa:{if(!b){H[a+40>>2]=k;if(K[a+56>>2]<=k>>>0){break xa}H[a+28>>2]=c;b=c;o=0;break ua}H[a+36>>2]=e;if(K[a+76>>2]<=e>>>0){b=H[a+28>>2];o=1;break ua}b=((N(H[a+16>>2],H[a+32>>2])+N(H[a+12>>2],H[a+40>>2])|0)+N(H[a+20>>2],H[a+28>>2])|0)+N(H[a+24>>2],e)|0;if(b>>>0>=K[a+8>>2]){break c}b=H[a+4>>2]+(b<<1)|0;if(J[b>>1]){break wa}break a}i=H[a+32>>2]+1|0;break va}b=0;continue qa}b=1;continue qa}while(1){ya:{za:{Aa:{if(!o){if(b>>>0>=q>>>0){break Aa}g=H[a+32>>2];d=H[a+200>>2]+(b<<4)|0;if(g>>>0>=K[d+8>>2]){break ya}if(!I[a|0]){b=H[d+12>>2]+(g<<4)|0;H[a+76>>2]=N(H[b+12>>2],H[b+8>>2])}e=H[a+72>>2];b=1;continue ta}b=b+1|0;H[a+28>>2]=b;break za}k=H[a+40>>2]+1|0;b=0;continue ta}o=0;continue}o=1;continue}}}}return 0}Ba(H[a+236>>2],1,1343,0)}return 0}G[b>>1]=1;return 1}function nd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=O(0),t=0,u=0,v=0,w=O(0),x=0,z=0,A=0,C=O(0),D=O(0),E=O(0),G=0,J=0,K=0,L=0,M=0,Q=O(0),R=0,S=0,T=0;n=na-8320|0;na=n;H[n+64>>2]=0;j=2;g=H[a>>2];a:{b:{if((g|0)==176622093){break b}if((g|0)!=1375686655){if(!((g|0)!=201326592|H[a+4>>2]!=538988650)&H[a+8>>2]==176622093){break b}Y(1101);j=1;break a}j=0}g=Ea(1,96);k=0;c:{if(!g){break c}H[g+76>>2]=1;d:{e:{f:{switch(j|0){case 0:H[g+88>>2]=68;H[g+84>>2]=69;H[g+80>>2]=70;H[g+16>>2]=71;H[g+4>>2]=72;H[g+28>>2]=73;H[g+24>>2]=74;H[g+20>>2]=75;H[g>>2]=76;H[g+92>>2]=77;H[g+44>>2]=78;H[g+40>>2]=79;H[g+36>>2]=80;H[g+32>>2]=81;H[g+12>>2]=82;H[g+8>>2]=83;i=Jb();H[g+48>>2]=i;if(i){break e}break d;case 2:break f;default:break d}}H[g+88>>2]=84;H[g+84>>2]=85;H[g+80>>2]=86;H[g+16>>2]=87;H[g+4>>2]=88;H[g+92>>2]=89;H[g+44>>2]=90;H[g+40>>2]=91;H[g+36>>2]=92;H[g+32>>2]=93;H[g+28>>2]=94;H[g+24>>2]=95;H[g+20>>2]=96;H[g+12>>2]=97;H[g+8>>2]=98;H[g>>2]=99;i=Ea(1,136);g:{if(i){k=Jb();H[i>>2]=k;h:{if(!k){break h}F[i+124|0]=0;H[i+116>>2]=0;H[i+120>>2]=0;H[i+108>>2]=0;H[i+112>>2]=0;k=qb();H[i+4>>2]=k;if(!k){break h}k=qb();H[i+8>>2]=k;if(!k){break h}break g}Fc(i)}i=0}H[g+48>>2]=i;if(!i){break d}}H[g+72>>2]=1;H[g+64>>2]=1;H[g+60>>2]=0;H[g+52>>2]=0;H[g+56>>2]=0;H[g+68>>2]=1;k=g;break c}Ca(g);k=0}g=k;if(g){H[g+60>>2]=0;H[g+72>>2]=100}if(g){H[g+56>>2]=0;H[g+68>>2]=101}if(g){H[g+52>>2]=0;H[g+64>>2]=102}i=n+68|0;if(i){y(i,0,8248);H[i+8248>>2]=0;H[i+8200>>2]=-1;H[i+8204>>2]=-1}if(d){H[n+8316>>2]=H[n+8316>>2]|1}H[n+60>>2]=b;H[n+56>>2]=a;H[n+52>>2]=a;j=1;b=0;i=n+52|0;i:{if(!i){break i}a=Ea(1,72);if(a){j:{H[a+64>>2]=1048576;k=Fa(1048576);H[a+32>>2]=k;if(!k){Ca(a);a=0;break j}H[a+36>>2]=k;H[a+28>>2]=2;H[a+24>>2]=3;H[a+20>>2]=4;H[a+16>>2]=5;H[a+44>>2]=6;H[a+40>>2]=8;H[a+68>>2]=H[a+68>>2]|2}}else{a=0}if(!a){break i}if(a){H[a+4>>2]=0;H[a>>2]=i}if(a){H[a+8>>2]=H[i+8>>2];H[a+12>>2]=0}if(!(!a|!(I[a+68|0]&2))){H[a+16>>2]=64}if(a){H[a+24>>2]=66}if(a){H[a+28>>2]=67}b=a}a=n+68|0;if(!g|!a){a=0}else{k:{if(!H[g+76>>2]){Ba(g+52|0,1,9902,0);a=0;break k}ra[H[g+24>>2]](H[g+48>>2],a);a=1}}if(!a){Y(1153);fb(b);hb(g);break a}if(!b|!g){a=0}else{l:{if(!H[g+76>>2]){Ba(g+52|0,1,9983,0);a=0;break l}a=ra[H[g>>2]](b,H[g+48>>2],n- -64|0,g+52|0)|0}}if(!a){Y(1181);fb(b);hb(g);Ua(H[n+64>>2]);break a}m:{if(!f){break m}if(g){a=ra[H[g+40>>2]](H[g+48>>2],f,g+52|0)|0}else{a=0}if(a){break m}Y(1116);fb(b);hb(g);Ua(H[n+64>>2]);break a}a=H[n+64>>2];n:{if(!H[g+76>>2]|(!g|!b)){a=0}else{a=ra[H[g+4>>2]](H[g+48>>2],b,a,g+52|0)|0}if(a){if(!H[g+76>>2]|(!g|!b)){a=0}else{a=ra[H[g+16>>2]](H[g+48>>2],b,g+52|0)|0}if(a){break n}}Y(1316);hb(g);fb(b);Ua(H[n+64>>2]);break a}fb(b);hb(g);l=H[n+64>>2];a=H[l+28>>2];if(a){Ca(a);l=H[n+64>>2];H[l+28>>2]=0;H[l+32>>2]=0}v=H[l+16>>2];o:{p:{if(!c){if(!(!e|(v|0)!=4)){p=1;v=4;break o}q:{b=H[l+20>>2];if(!((b|0)==3|(v|0)!=3)){a=H[l+24>>2];if(H[a>>2]!=H[a+4>>2]|H[a+52>>2]==1){break q}H[l+20>>2]=3;break p}if(v>>>0>2){break q}H[l+20>>2]=2;break o}r:{switch(b-3|0){case 2:s:{t:{if(v>>>0<4){break t}b=H[l+24>>2];a=H[b>>2];if((a|0)!=H[b+52>>2]|(a|0)!=H[b+104>>2]|(a|0)!=H[b+156>>2]){break t}a=H[b+4>>2];if((a|0)!=H[b+56>>2]|(a|0)!=H[b+108>>2]){break t}if((a|0)==H[b+160>>2]){break s}}H[n+20>>2]=1053;H[n+16>>2]=1373;Ga(26072,8179,n+16|0);break o}f=N(H[b+12>>2],H[b+8>>2]);C=O(O(1)/O((-1<>2]^-1)>>>0));D=O(O(1)/O((-1<>2]^-1)>>>0));w=O(O(1)/O((-1<>2]^-1)>>>0));Q=O(O(1)/O((-1<>2]^-1)>>>0));a=0;while(1){if((a|0)!=(f|0)){c=a<<2;g=c+H[b+148>>2]|0;i=H[g>>2];k=c+H[b+96>>2]|0;j=H[k>>2];m=c+H[b+44>>2]|0;s=O(O(1)-O(C*O(H[c+H[b+200>>2]>>2])));E=O(O(O(O(1)-O(Q*O(H[m>>2])))*O(255))*s);if(O(P(E))>2]=c;E=O(O(O(O(1)-O(w*O(j|0)))*O(255))*s);if(O(P(E))>2]=c;s=O(O(O(O(1)-O(D*O(i|0)))*O(255))*s);if(O(P(s))>2]=c;a=a+1|0;continue}break};Ca(H[b+200>>2]);a=H[l+24>>2];H[a+128>>2]=8;H[a+76>>2]=8;H[a+24>>2]=8;H[a+200>>2]=0;H[l+20>>2]=1;a=H[l+16>>2]-1|0;H[l+16>>2]=a;h=3;while(1){if(a>>>0<=h>>>0){break o}a=H[l+24>>2]+N(h,52)|0;B(a,a+52|0,52);h=h+1|0;a=H[l+16>>2];continue};case 0:break p;case 1:break r;default:break o}}b=H[l+24>>2];a=H[b>>2];u:{v:{if((a|0)!=H[b+52>>2]|(a|0)!=H[b+104>>2]){break v}a=H[b+4>>2];if((a|0)!=H[b+56>>2]){break v}if((a|0)==H[b+108>>2]){break u}}H[n+36>>2]=1115;H[n+32>>2]=1373;Ga(26072,8221,n+32|0);break o}a=H[b+24>>2];c=-1<>2]?0:a;i=H[b+84>>2]?0:a;k=N(H[b+12>>2],H[b+8>>2]);a=0;while(1){if((a|0)!=(k|0)){f=a<<2;j=f+H[b+44>>2]|0;m=f+H[b+148>>2]|0;s=O(H[m>>2]-g|0);h=f+H[b+96>>2]|0;C=O(H[h>>2]-i|0);D=O(H[j>>2]);w=O(O(O(s*O(1.4019900560379028))+O(O(C*O(-3680000008898787e-20))+D))+O(.5));if(O(P(w))>2]=(c|0)<(f|0)?c:(f|0)>0?f:0;w=O(O(O(s*O(-.7141128182411194))+O(O(D*O(1.0003000497817993))+O(C*O(-.34412500262260437))))+O(.5));if(O(P(w))>2]=(c|0)<(f|0)?c:(f|0)>0?f:0;s=O(O(O(s*O(-7999999979801942e-21))+O(O(D*O(.9998229742050171))+O(C*O(1.7720400094985962))))+O(.5));if(O(P(s))>2]=(c|0)<(f|0)?c:(f|0)>0?f:0;a=a+1|0;continue}break}H[l+20>>2]=1;break o}v=c>>>0>v>>>0?v:c;p=1;break o}w:{x:{c=H[l+24>>2];if(H[c>>2]!=1){break x}y:{switch(H[c+52>>2]-1|0){case 1:if(H[c+104>>2]!=2){break x}if(!(H[c+4>>2]!=1|H[c+56>>2]!=2|H[c+108>>2]!=2)){b=H[c+24>>2];h=H[c+148>>2];a=H[c+96>>2];j=H[c+44>>2];G=H[c+60>>2];q=H[c+8>>2];f=H[c+12>>2];c=N(q,f)<<2;g=Ia(c);i=Ia(c);k=Ia(c);if(!(!g|!i|!k)){m=-1<>2]&1;L=f-b|0;K=H[l>>2]&1;x=q-K|0;if(!b){c=k;f=i;b=g;break w}c=k;f=i;b=g;while(1){if((p|0)==(q|0)){break w}Ka(o,m,H[j>>2],0,0,b,f,c);p=p+1|0;c=c+4|0;f=f+4|0;b=b+4|0;j=j+4|0;continue}}Ca(g);Ca(i);Ca(k);break o}if(H[c+4>>2]!=1|H[c+56>>2]!=1|H[c+108>>2]!=1){break x}a=H[c+24>>2];f=H[c+148>>2];b=H[c+96>>2];h=H[c+44>>2];t=H[c+60>>2];g=H[c+8>>2];x=H[c+12>>2];c=N(g,x)<<2;i=Ia(c);k=Ia(c);m=Ia(c);if(!(!i|!k|!m)){o=-1<>2]&1;a=g-z|0;G=a&1;u=a>>>1|0;J=a&-2;a=m;j=k;c=i;while(1){if((q|0)!=(x|0)){if(z){Ka(r,o,H[h>>2],0,0,c,j,a);j=j+4|0;c=c+4|0;h=h+4|0;a=a+4|0}g=0;while(1){if(g>>>0>>0){Ka(r,o,H[h>>2],H[b>>2],H[f>>2],c,j,a);Ka(r,o,H[h+4>>2],H[b>>2],H[f>>2],c+4|0,j+4|0,a+4|0);g=g+2|0;f=f+4|0;b=b+4|0;a=a+8|0;j=j+8|0;c=c+8|0;h=h+8|0;continue}break}z:{if(!G){break z}g=H[h>>2];A:{if((t|0)==(u|0)){Ka(r,o,g,0,0,c,j,a);break A}Ka(r,o,g,H[b>>2],H[f>>2],c,j,a)}a=a+4|0;j=j+4|0;c=c+4|0;h=h+4|0;if(t>>>0<=u>>>0){break z}f=f+4|0;b=b+4|0}q=q+1|0;continue}break}Ca(H[H[l+24>>2]+44>>2]);a=H[l+24>>2];H[a+44>>2]=i;Ca(H[a+96>>2]);a=H[l+24>>2];H[a+96>>2]=k;Ca(H[a+148>>2]);a=H[l+24>>2];H[a+148>>2]=m;b=H[a+8>>2];H[a+112>>2]=b;H[a+60>>2]=b;b=H[a+12>>2];H[a+116>>2]=b;H[a+64>>2]=b;b=H[a>>2];H[a+104>>2]=b;H[a+52>>2]=b;b=H[a+4>>2];H[a+108>>2]=b;H[a+56>>2]=b;H[l+20>>2]=1;break o}Ca(i);Ca(k);Ca(m);break o;case 0:break y;default:break x}}if(H[c+104>>2]!=1|H[c+4>>2]!=1|(H[c+56>>2]!=1|H[c+108>>2]!=1)){break x}b=H[c+24>>2];h=H[c+148>>2];a=H[c+96>>2];j=H[c+44>>2];o=N(H[c+12>>2],H[c+8>>2]);c=o<<2;i=Ia(c);k=Ia(c);m=Ia(c);if(!(!i|!k|!m)){q=-1<>2],H[a>>2],H[h>>2],g,b,f);c=c+1|0;f=f+4|0;b=b+4|0;g=g+4|0;h=h+4|0;a=a+4|0;j=j+4|0;continue}break}Ca(H[H[l+24>>2]+44>>2]);a=H[l+24>>2];H[a+44>>2]=i;Ca(H[a+96>>2]);a=H[l+24>>2];H[a+96>>2]=k;Ca(H[a+148>>2]);H[H[l+24>>2]+148>>2]=m;H[l+20>>2]=1;break o}Ca(i);Ca(k);Ca(m);break o}H[n+4>>2]=463;H[n>>2]=1373;Ga(26072,8264,n);break o}J=x>>>1|0;z=x&-2;R=L&-2;u=q<<2;while(1){if(M>>>0>>0){p=c+u|0;r=f+u|0;q=b+u|0;t=j+u|0;if(K){Ka(o,m,H[j>>2],0,0,b,f,c);Ka(o,m,H[t>>2],H[a>>2],H[h>>2],q,r,p);p=p+4|0;r=r+4|0;q=q+4|0;t=t+4|0;c=c+4|0;f=f+4|0;j=j+4|0;b=b+4|0}A=0;while(1){if(z>>>0>A>>>0){Ka(o,m,H[j>>2],H[a>>2],H[h>>2],b,f,c);Ka(o,m,H[j+4>>2],H[a>>2],H[h>>2],b+4|0,f+4|0,c+4|0);Ka(o,m,H[t>>2],H[a>>2],H[h>>2],q,r,p);Ka(o,m,H[t+4>>2],H[a>>2],H[h>>2],q+4|0,r+4|0,p+4|0);A=A+2|0;h=h+4|0;a=a+4|0;p=p+8|0;r=r+8|0;q=q+8|0;t=t+8|0;c=c+8|0;f=f+8|0;b=b+8|0;j=j+8|0;continue}break}B:{if((x|0)==(z|0)){break B}A=H[j>>2];C:{if((G|0)==(J|0)){Ka(o,m,A,0,0,b,f,c);Ka(o,m,H[t>>2],0,0,q,r,p);break C}Ka(o,m,A,H[a>>2],H[h>>2],b,f,c);Ka(o,m,H[t>>2],H[a>>2],H[h>>2],q,r,p)}c=c+4|0;f=f+4|0;b=b+4|0;j=j+4|0;if(G>>>0<=J>>>0){break B}h=h+4|0;a=a+4|0}M=M+2|0;c=c+u|0;f=f+u|0;b=b+u|0;j=j+u|0;continue}break}D:{if(!(L&1)){break D}if(K){Ka(o,m,H[j>>2],0,0,b,f,c);c=c+4|0;f=f+4|0;j=j+4|0;b=b+4|0}p=0;while(1){if(p>>>0>>0){Ka(o,m,H[j>>2],H[a>>2],H[h>>2],b,f,c);Ka(o,m,H[j+4>>2],H[a>>2],H[h>>2],b+4|0,f+4|0,c+4|0);p=p+2|0;h=h+4|0;a=a+4|0;c=c+8|0;f=f+8|0;b=b+8|0;j=j+8|0;continue}break}if((x|0)==(z|0)){break D}j=H[j>>2];if((G|0)==(J|0)){Ka(o,m,j,0,0,b,f,c);break D}Ka(o,m,j,H[a>>2],H[h>>2],b,f,c)}Ca(H[H[l+24>>2]+44>>2]);a=H[l+24>>2];H[a+44>>2]=g;Ca(H[a+96>>2]);a=H[l+24>>2];H[a+96>>2]=i;Ca(H[a+148>>2]);a=H[l+24>>2];H[a+148>>2]=k;b=H[a+8>>2];H[a+112>>2]=b;H[a+60>>2]=b;b=H[a+12>>2];H[a+116>>2]=b;H[a+64>>2]=b;b=H[a>>2];H[a+104>>2]=b;H[a+52>>2]=b;b=H[a+4>>2];H[a+108>>2]=b;H[a+56>>2]=b;H[l+20>>2]=1;p=0}c=H[n+64>>2];E:{if(d){break E}b=0;while(1){if((b|0)==(v|0)){break E}a=H[c+24>>2]+N(b,52)|0;d=H[a+24>>2];if((d|0)!=8){F:{if(d>>>0<=7){f=N(H[a+12>>2],H[a+8>>2]);g=H[a+44>>2];if(H[a+32>>2]){i=1<>2];k=d>>31<<7|d>>>25;S=m,T=ue(d<<7,k,i,0),H[S>>2]=T;h=h+1|0;continue}}d=-1<>2],0,255),qa,d,0);H[i>>2]=k;h=h+1|0;continue}}d=d-8|0;f=N(H[a+12>>2],H[a+8>>2]);g=H[a+44>>2];h=0;if(H[a+32>>2]){while(1){if((f|0)==(h|0)){break F}i=g+(h<<2)|0;H[i>>2]=H[i>>2]>>d;h=h+1|0;continue}}while(1){if((f|0)==(h|0)){break F}i=g+(h<<2)|0;H[i>>2]=H[i>>2]>>>d;h=h+1|0;continue}}H[a+24>>2]=8}b=b+1|0;continue}}a=H[c+24>>2];b=N(H[a+12>>2],H[a+8>>2]);G:{if(!p){if(H[c+20>>2]==2){if(H[c+16>>2]==1){ma(H[a+44>>2],b|0);break G}if(!e){break G}da(H[a+44>>2],H[a+96>>2],b|0);break G}ca(H[a+44>>2],H[a+96>>2],H[a+148>>2],b|0);break G}H:{switch(v-1|0){case 0:ba(H[a+44>>2],b|0);break G;case 2:aa(H[a+44>>2],H[a+96>>2],H[a+148>>2],b|0);break G;case 3:break H;default:break G}}$(H[a+44>>2],H[a+96>>2],H[a+148>>2],H[a+200>>2],b|0)}Ua(H[n+64>>2]);j=0}na=n+8320|0;return j|0}function ac(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,L=0,M=0,O=0,P=0;j=H[a>>2];a:{if(j>>>0>>0|b>>>0>=d>>>0|b>>>0>=j>>>0){break a}j=H[a+4>>2];if(j>>>0>>0|c>>>0>=e>>>0|c>>>0>=j>>>0){break a}E=(c>>>0)/K[a+12>>2]|0;s=H[a+8>>2];G=(b>>>0)/(s>>>0)|0;M=(N(s,G)-b|0)+s|0;I=(g|0)!=8;z=c;while(1){k=H[a+12>>2];j=k;j=(c|0)==(z|0)?j-((c>>>0)%(j>>>0)|0)|0:j;t=e-z|0;r=j>>>0>>0?j:t;A=r&-4;u=r&3;O=r&-8;J=r&7;x=r-1|0;P=(g|0)==2&(r|0)==1;L=N(k-j|0,s);C=(N(z-c|0,h)<<2)+f|0;F=G;t=b;while(1){j=(b|0)==(t|0)?M:s;k=d-t|0;q=j>>>0>>0?j:k;k=s-j|0;l=F<<2;j=H[l+(H[a+24>>2]+(N(H[a+16>>2],E)<<2)|0)>>2];b:{c:{d:{e:{f:{g:{if(i){h:{i:{j:{k:{if(j){l=((L<<2)+j|0)+(k<<2)|0;j=t-b|0;if((g|0)==1){break h}m=(N(g,j)<<2)+C|0;if((q|0)==1){break i}if(P){break j}if(q>>>0<=7|I){break k}if(!r){break b}o=q&-4;k=0;while(1){j=0;while(1){H[(j<<5)+m>>2]=H[(j<<2)+l>>2];n=j|1;H[(n<<5)+m>>2]=H[(n<<2)+l>>2];n=j|2;H[(n<<5)+m>>2]=H[(n<<2)+l>>2];n=j|3;H[(n<<5)+m>>2]=H[(n<<2)+l>>2];j=j+4|0;if(o>>>0>j>>>0){continue}break}if(j>>>0>>0){while(1){H[(j<<5)+m>>2]=H[(j<<2)+l>>2];j=j+1|0;if((q|0)!=(j|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;k=k+1|0;if((r|0)!=(k|0)){continue}break}break b}if((g|0)!=1){if(!r){break b}p=q&-4;n=q&3;l=(N(t-b|0,g)<<2)+C|0;o=0;D=q-1>>>0<3;while(1){l:{if(!q){break l}m=0;j=0;k=0;if(!D){while(1){H[(N(g,j)<<2)+l>>2]=0;H[(N(j|1,g)<<2)+l>>2]=0;H[(N(j|2,g)<<2)+l>>2]=0;H[(N(j|3,g)<<2)+l>>2]=0;j=j+4|0;k=k+4|0;if((p|0)!=(k|0)){continue}break}if(!n){break l}}while(1){H[(N(g,j)<<2)+l>>2]=0;j=j+1|0;m=m+1|0;if((n|0)!=(m|0)){continue}break}}l=(h<<2)+l|0;o=o+1|0;if((r|0)!=(o|0)){continue}break}break b}if(!r){break b}l=q<<2;k=(t-b<<2)+C|0;o=0;if(x>>>0>=7){break g}break f}if(!r){break b}D=q&-4;p=q&3;n=0;v=q-1>>>0<3;break c}j=0;k=q&-4;if(k){while(1){H[(j<<3)+m>>2]=H[(j<<2)+l>>2];o=j|1;H[(o<<3)+m>>2]=H[(o<<2)+l>>2];o=j|2;H[(o<<3)+m>>2]=H[(o<<2)+l>>2];o=j|3;H[(o<<3)+m>>2]=H[(o<<2)+l>>2];j=j+4|0;if(k>>>0>j>>>0){continue}break}}if(j>>>0>=q>>>0){break b}o=0;k=j;n=q-j&3;if(n){while(1){H[(k<<3)+m>>2]=H[(k<<2)+l>>2];k=k+1|0;o=o+1|0;if((n|0)!=(o|0)){continue}break}}if(j-q>>>0>4294967292){break b}while(1){H[(k<<3)+m>>2]=H[(k<<2)+l>>2];j=k+1|0;H[(j<<3)+m>>2]=H[(j<<2)+l>>2];j=k+2|0;H[(j<<3)+m>>2]=H[(j<<2)+l>>2];j=k+3|0;H[(j<<3)+m>>2]=H[(j<<2)+l>>2];k=k+4|0;if((q|0)!=(k|0)){continue}break}break b}if(!r){break b}k=0;if(x>>>0>=3){while(1){H[m>>2]=H[l>>2];j=h<<2;m=j+m|0;p=l;l=s<<2;o=p+l|0;H[m>>2]=H[o>>2];m=j+m|0;o=l+o|0;H[m>>2]=H[o>>2];m=j+m|0;o=l+o|0;H[m>>2]=H[o>>2];l=l+o|0;m=j+m|0;k=k+4|0;if((A|0)!=(k|0)){continue}break}if(!u){break b}}j=0;while(1){H[m>>2]=H[l>>2];l=(s<<2)+l|0;m=(h<<2)+m|0;j=j+1|0;if((u|0)!=(j|0)){continue}break}break b}j=(j<<2)+C|0;if((q|0)!=4){if(!r){break b}m=q<<2;o=0;if(x>>>0>=3){break e}break d}if(!r){break b}o=0;if(x>>>0>=3){while(1){k=H[l+12>>2];H[j+8>>2]=H[l+8>>2];H[j+12>>2]=k;k=H[l+4>>2];H[j>>2]=H[l>>2];H[j+4>>2]=k;k=l;l=s<<2;k=k+l|0;n=H[k+12>>2];m=h<<2;j=m+j|0;H[j+8>>2]=H[k+8>>2];H[j+12>>2]=n;n=H[k+4>>2];H[j>>2]=H[k>>2];H[j+4>>2]=n;k=l+k|0;n=H[k+12>>2];j=j+m|0;H[j+8>>2]=H[k+8>>2];H[j+12>>2]=n;n=H[k+4>>2];H[j>>2]=H[k>>2];H[j+4>>2]=n;k=l+k|0;n=H[k+12>>2];j=j+m|0;H[j+8>>2]=H[k+8>>2];H[j+12>>2]=n;n=H[k+4>>2];H[j>>2]=H[k>>2];H[j+4>>2]=n;l=l+k|0;j=j+m|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}if(!u){break b}}m=0;while(1){k=H[l+12>>2];H[j+8>>2]=H[l+8>>2];H[j+12>>2]=k;k=H[l+4>>2];H[j>>2]=H[l>>2];H[j+4>>2]=k;l=(s<<2)+l|0;j=(h<<2)+j|0;m=m+1|0;if((u|0)!=(m|0)){continue}break}break b}if(!j){j=Ea(1,N(H[a+8>>2],H[a+12>>2])<<2);if(!j){return 0}H[l+(H[a+24>>2]+(N(H[a+16>>2],E)<<2)|0)>>2]=j}l=((L<<2)+j|0)+(k<<2)|0;j=t-b|0;m:{n:{o:{p:{q:{r:{if((g|0)!=1){m=(N(g,j)<<2)+C|0;if((q|0)==1){break r}if(q>>>0<=7|I){break q}if(!r){break b}o=q&-4;k=0;while(1){j=0;while(1){H[(j<<2)+l>>2]=H[(j<<5)+m>>2];n=j|1;H[(n<<2)+l>>2]=H[(n<<5)+m>>2];n=j|2;H[(n<<2)+l>>2]=H[(n<<5)+m>>2];n=j|3;H[(n<<2)+l>>2]=H[(n<<5)+m>>2];j=j+4|0;if(o>>>0>j>>>0){continue}break}if(j>>>0>>0){while(1){H[(j<<2)+l>>2]=H[(j<<5)+m>>2];j=j+1|0;if((q|0)!=(j|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;k=k+1|0;if((r|0)!=(k|0)){continue}break}break b}j=(j<<2)+C|0;if((q|0)==4){break p}if(!r){break b}m=q<<2;o=0;if(x>>>0>=3){break o}break n}if(!r){break b}o=0;if(x>>>0>=3){while(1){H[l>>2]=H[m>>2];j=s<<2;l=j+l|0;k=h<<2;m=k+m|0;H[l>>2]=H[m>>2];l=j+l|0;m=k+m|0;H[l>>2]=H[m>>2];l=j+l|0;m=k+m|0;H[l>>2]=H[m>>2];l=j+l|0;m=k+m|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}if(!u){break b}}j=0;while(1){H[l>>2]=H[m>>2];l=(s<<2)+l|0;m=(h<<2)+m|0;j=j+1|0;if((u|0)!=(j|0)){continue}break}break b}if(!r){break b}D=q&-4;p=q&3;n=0;break m}if(!r){break b}o=0;if(x>>>0>=3){while(1){k=H[j+12>>2];H[l+8>>2]=H[j+8>>2];H[l+12>>2]=k;k=H[j+4>>2];H[l>>2]=H[j>>2];H[l+4>>2]=k;m=h<<2;j=m+j|0;n=H[j+12>>2];k=l;l=s<<2;k=k+l|0;H[k+8>>2]=H[j+8>>2];H[k+12>>2]=n;n=H[j+4>>2];H[k>>2]=H[j>>2];H[k+4>>2]=n;j=j+m|0;n=H[j+12>>2];k=l+k|0;H[k+8>>2]=H[j+8>>2];H[k+12>>2]=n;n=H[j+4>>2];H[k>>2]=H[j>>2];H[k+4>>2]=n;j=j+m|0;n=H[j+12>>2];k=l+k|0;H[k+8>>2]=H[j+8>>2];H[k+12>>2]=n;n=H[j+4>>2];H[k>>2]=H[j>>2];H[k+4>>2]=n;j=j+m|0;l=l+k|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}if(!u){break b}}m=0;while(1){k=H[j+12>>2];H[l+8>>2]=H[j+8>>2];H[l+12>>2]=k;k=H[j+4>>2];H[l>>2]=H[j>>2];H[l+4>>2]=k;j=(h<<2)+j|0;l=(s<<2)+l|0;m=m+1|0;if((u|0)!=(m|0)){continue}break}break b}while(1){k=!m;if(!k){B(l,j,m)}p=j;j=h<<2;n=p+j|0;p=l;l=s<<2;p=p+l|0;if(!k){B(p,n,m)}n=j+n|0;p=l+p|0;if(!k){B(p,n,m)}n=j+n|0;p=l+p|0;if(!k){B(p,n,m)}j=j+n|0;l=l+p|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}if(!u){break b}}k=0;while(1){if(m){B(l,j,m)}j=(h<<2)+j|0;l=(s<<2)+l|0;k=k+1|0;if((u|0)!=(k|0)){continue}break}break b}while(1){s:{if(!q){break s}k=0;j=0;o=0;if(q>>>0>=4){while(1){H[(j<<2)+l>>2]=H[(N(g,j)<<2)+m>>2];v=j|1;H[(v<<2)+l>>2]=H[(N(g,v)<<2)+m>>2];v=j|2;H[(v<<2)+l>>2]=H[(N(g,v)<<2)+m>>2];v=j|3;H[(v<<2)+l>>2]=H[(N(g,v)<<2)+m>>2];j=j+4|0;o=o+4|0;if((D|0)!=(o|0)){continue}break}if(!p){break s}}while(1){H[(j<<2)+l>>2]=H[(N(g,j)<<2)+m>>2];j=j+1|0;k=k+1|0;if((p|0)!=(k|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;n=n+1|0;if((r|0)!=(n|0)){continue}break}break b}while(1){j=!l;if(!j){y(k,0,l)}p=k;k=h<<2;m=p+k|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}m=k+m|0;if(!j){y(m,0,l)}k=k+m|0;o=o+8|0;if((O|0)!=(o|0)){continue}break}if(!J){break b}}j=0;while(1){if(l){y(k,0,l)}k=(h<<2)+k|0;j=j+1|0;if((J|0)!=(j|0)){continue}break}break b}while(1){k=!m;if(!k){B(j,l,m)}p=l;l=s<<2;n=p+l|0;p=j;j=h<<2;p=p+j|0;if(!k){B(p,n,m)}n=l+n|0;p=j+p|0;if(!k){B(p,n,m)}n=l+n|0;p=j+p|0;if(!k){B(p,n,m)}l=l+n|0;j=j+p|0;o=o+4|0;if((A|0)!=(o|0)){continue}break}if(!u){break b}}k=0;while(1){if(m){B(j,l,m)}l=(s<<2)+l|0;j=(h<<2)+j|0;k=k+1|0;if((u|0)!=(k|0)){continue}break}break b}while(1){t:{if(!q){break t}k=0;j=0;o=0;if(!v){while(1){H[(N(g,j)<<2)+m>>2]=H[(j<<2)+l>>2];w=j|1;H[(N(w,g)<<2)+m>>2]=H[(w<<2)+l>>2];w=j|2;H[(N(w,g)<<2)+m>>2]=H[(w<<2)+l>>2];w=j|3;H[(N(w,g)<<2)+m>>2]=H[(w<<2)+l>>2];j=j+4|0;o=o+4|0;if((D|0)!=(o|0)){continue}break}if(!p){break t}}while(1){H[(N(g,j)<<2)+m>>2]=H[(j<<2)+l>>2];j=j+1|0;k=k+1|0;if((p|0)!=(k|0)){continue}break}}l=(s<<2)+l|0;m=(h<<2)+m|0;n=n+1|0;if((r|0)!=(n|0)){continue}break}}F=F+1|0;t=q+t|0;if(t>>>0>>0){continue}break}E=E+1|0;z=r+z|0;if(z>>>0>>0){continue}break}}return 1}function Od(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;if(!c){return 0}if(!Gb(H[a>>2],b,c,d)){Ba(d,1,6210,0);return 0}n=c;m=d;g=na-240|0;na=g;r=1;o=a;a:{if(H[H[a>>2]+60>>2]|H[a+128>>2]){break a}b:{c=H[a+116>>2];c:{if(!c){a=H[a+120>>2];break c}b=H[n+16>>2];a=H[o+120>>2];if(!(!a|!H[a+12>>2])){b=I[a+18|0]}d:{d=J[c+4>>1];if(d){c=H[c>>2];while(1){f=c+N(e,6)|0;h=J[f>>1];if(h>>>0>=b>>>0){H[g+180>>2]=b;H[g+176>>2]=h;Ba(m,1,13715,g+176|0);r=0;break a}e:{f=J[f+4>>1];if((f+1&65535)>>>0<2){break e}f=f-1|0;if(f>>>0>>0){break e}H[g+164>>2]=b;H[g+160>>2]=f;Ba(m,1,13715,g+160|0);r=0;break a}e=e+1|0;if((d|0)!=(e|0)){continue}break}break d}if(b){break b}break c}while(1){b=b-1|0;e=0;while(1){if(J[c+N(e,6)>>1]!=(b|0)){e=e+1|0;if((d|0)!=(e|0)){continue}break b}break}if(b){continue}break}}f:{if(!a){break f}c=H[a+12>>2];if(!c){break f}g:{b=I[a+18|0];h:{if(b){e=0;h=1;while(1){a=H[n+16>>2];d=J[c+(e<<2)>>1];if(a>>>0<=d>>>0){H[g+148>>2]=a;H[g+144>>2]=d;Ba(m,1,13715,g+144|0);h=0}e=e+1|0;if((b|0)!=(e|0)){continue}break}a=Ea(b,4);if(!a){break h}e=0;while(1){d=c+(e<<2)|0;f=I[d+2|0];i:{if(f>>>0>=2){H[g+68>>2]=f;H[g+64>>2]=e;Ba(m,1,12094,g- -64|0);h=0;break i}d=I[d+3|0];if(d>>>0>=b>>>0){H[g+128>>2]=d;Ba(m,1,12038,g+128|0);h=0;break i}j=(f|0)!=1;i=(d<<2)+a|0;if(!(j|!H[i>>2])){H[g+80>>2]=d;Ba(m,1,11527,g+80|0);h=0;break i}if(!(f|!d)){H[g+100>>2]=d;H[g+96>>2]=e;Ba(m,1,11901,g+96|0);h=0;break i}if(!(j|(d|0)==(e|0))){H[g+120>>2]=d;H[g+116>>2]=e;H[g+112>>2]=e;Ba(m,1,11937,g+112|0);h=0;break i}H[i>>2]=1}e=e+1|0;if((b|0)!=(e|0)){continue}break}h=!h;e=0;while(1){j:{d=e<<2;if(I[(c+d|0)+2|0]?H[d+a>>2]:1){e=e+1|0;if((b|0)!=(e|0)){continue}if(h&1){break j}if(H[n+16>>2]!=1){break g}e=0;while(1){if(H[(e<<2)+a>>2]){e=e+1|0;if((b|0)!=(e|0)){continue}break g}break}d=0;Ba(m,2,9253,0);f=b&3;e=0;if(b>>>0>=4){h=b&252;b=0;while(1){j=c+(e<<2)|0;F[j+3|0]=e;F[j+2|0]=1;j=e|1;i=c+(j<<2)|0;F[i+3|0]=j;F[i+2|0]=1;j=e|2;i=c+(j<<2)|0;F[i+3|0]=j;F[i+2|0]=1;j=e|3;i=c+(j<<2)|0;F[i+3|0]=j;F[i+2|0]=1;e=e+4|0;b=b+4|0;if((h|0)!=(b|0)){continue}break}if(!f){break g}}while(1){b=c+(e<<2)|0;F[b+3|0]=e;F[b+2|0]=1;e=e+1|0;d=d+1|0;if((f|0)!=(d|0)){continue}break}break g}H[g+48>>2]=e;h=1;Ba(m,1,11101,g+48|0);e=e+1|0;if((b|0)!=(e|0)){continue}}break}Ca(a);r=0;break a}a=Ea(b,4);if(a){break g}}r=0;Ba(m,1,12285,0);break a}Ca(a)}a=H[o+120>>2];k:{if(!a){break k}l=H[a+12>>2];if(!l){Ca(H[a+4>>2]);Ca(H[H[o+120>>2]+8>>2]);Ca(H[H[o+120>>2]>>2]);a=H[o+120>>2];b=H[a+12>>2];if(b){Ca(b);a=H[o+120>>2]}Ca(a);H[o+120>>2]=0;break k}j=H[n+24>>2];l:{c=I[a+18|0];m:{if(c){u=H[a>>2];h=H[a+4>>2];i=H[a+8>>2];e=0;n:{while(1){if(H[(j+N(J[l+(e<<2)>>1],52)|0)+44>>2]){e=e+1|0;if((c|0)!=(e|0)){continue}break n}break}H[g+32>>2]=e;Ba(m,1,13877,g+32|0);r=0;break a}f=Fa(N(c,52));if(!f){break m}d=0;while(1){a=l+(d<<2)|0;e=J[a>>1];b=N(I[a+2|0]?I[a+3|0]:d,52)+f|0;a=j+N(e,52)|0;H[b+48>>2]=H[a+48>>2];e=H[a+44>>2];H[b+40>>2]=H[a+40>>2];H[b+44>>2]=e;e=H[a+36>>2];H[b+32>>2]=H[a+32>>2];H[b+36>>2]=e;e=H[a+28>>2];H[b+24>>2]=H[a+24>>2];H[b+28>>2]=e;e=H[a+20>>2];H[b+16>>2]=H[a+16>>2];H[b+20>>2]=e;e=H[a+12>>2];H[b+8>>2]=H[a+8>>2];H[b+12>>2]=e;e=H[a+4>>2];H[b>>2]=H[a>>2];H[b+4>>2]=e;b=N(d,52)+f|0;a=Ia(N(H[a+8>>2],H[a+12>>2])<<2);H[b+44>>2]=a;if(!a){if(d){a=d&65535;while(1){Ca(H[(N(a,52)+f|0)-8>>2]);a=a-1|0;if(a){continue}break}}Ca(f);r=0;Ba(m,1,13825,0);break a}H[b+24>>2]=I[d+i|0];H[b+32>>2]=I[d+h|0];d=d+1|0;if((c|0)!=(d|0)){continue}break}h=J[H[o+120>>2]+16>>1]-1|0;while(1){a=N(q,52)+f|0;d=N(H[a+12>>2],H[a+8>>2]);b=l+(q<<2)|0;e=H[(j+N(J[b>>1],52)|0)+44>>2];o:{if(!I[b+2|0]){if(!d){break o}i=H[a+44>>2];p=d&3;a=0;b=0;if(d>>>0>=4){t=d&-4;k=0;while(1){d=b<<2;H[d+i>>2]=H[d+e>>2];s=d|4;H[s+i>>2]=H[e+s>>2];s=d|8;H[s+i>>2]=H[e+s>>2];d=d|12;H[d+i>>2]=H[d+e>>2];b=b+4|0;k=k+4|0;if((t|0)!=(k|0)){continue}break}if(!p){break o}}while(1){d=b<<2;H[d+i>>2]=H[d+e>>2];b=b+1|0;a=a+1|0;if((p|0)!=(a|0)){continue}break}break o}if(!d){break o}b=I[b+3|0];a=(b<<2)+u|0;i=H[(N(b,52)+f|0)+44>>2];b=0;if((d|0)!=1){t=d&1;s=d&-2;d=0;while(1){k=b<<2;p=H[k+e>>2];H[i+k>>2]=H[a+(N(c,(p|0)>=0?(h|0)>(p|0)?p:h:0)<<2)>>2];k=k|4;p=H[k+e>>2];H[i+k>>2]=H[a+(N(c,(p|0)>=0?(h|0)>(p|0)?p:h:0)<<2)>>2];b=b+2|0;d=d+2|0;if((s|0)!=(d|0)){continue}break}if(!t){break o}}d=b<<2;b=H[d+e>>2];H[d+i>>2]=H[a+(N(c,(b|0)>=0?(b|0)<(h|0)?b:h:0)<<2)>>2]}q=q+1|0;if((c|0)!=(q|0)){continue}break}break l}f=Fa(N(c,52));if(f){break l}}r=0;Ba(m,1,13825,0);break a}a=H[n+16>>2];if(a){e=0;while(1){b=H[(j+N(e,52)|0)+44>>2];if(b){Ca(b)}e=e+1|0;if((a|0)!=(e|0)){continue}break}}Ca(j);H[n+16>>2]=c;H[n+24>>2]=f}e=H[o+116>>2];if(!e){break a}h=H[e>>2];i=J[e+4>>1];if(i){e=0;p=i-2&65535;d=1;while(1){a=H[n+16>>2];q=N(e,6)+h|0;b=J[q>>1];p:{if(a>>>0<=b>>>0){H[g+20>>2]=a;H[g+16>>2]=b;Ba(m,2,7334,g+16|0);break p}c=J[q+4>>1];if((c+1&65535)>>>0<=1){G[(H[n+24>>2]+N(b,52)|0)+48>>1]=J[q+2>>1];break p}c=c-1|0;j=c&65535;if(j>>>0>=a>>>0){H[g+4>>2]=a;H[g>>2]=j;Ba(m,2,7293,g);break p}q:{if(J[q+2>>1]|(b|0)==(j|0)){break q}f=H[n+24>>2];a=f+N(b,52)|0;H[g+232>>2]=H[a+48>>2];l=H[a+44>>2];H[g+224>>2]=H[a+40>>2];H[g+228>>2]=l;l=H[a+36>>2];H[g+216>>2]=H[a+32>>2];H[g+220>>2]=l;l=H[a+28>>2];H[g+208>>2]=H[a+24>>2];H[g+212>>2]=l;l=H[a+20>>2];H[g+200>>2]=H[a+16>>2];H[g+204>>2]=l;l=H[a+12>>2];H[g+192>>2]=H[a+8>>2];H[g+196>>2]=l;l=H[a+4>>2];H[g+184>>2]=H[a>>2];H[g+188>>2]=l;l=N(j,52);f=l+f|0;H[a+48>>2]=H[f+48>>2];k=H[f+44>>2];H[a+40>>2]=H[f+40>>2];H[a+44>>2]=k;k=H[f+36>>2];H[a+32>>2]=H[f+32>>2];H[a+36>>2]=k;k=H[f+28>>2];H[a+24>>2]=H[f+24>>2];H[a+28>>2]=k;k=H[f+20>>2];H[a+16>>2]=H[f+16>>2];H[a+20>>2]=k;k=H[f+12>>2];H[a+8>>2]=H[f+8>>2];H[a+12>>2]=k;k=H[f+4>>2];H[a>>2]=H[f>>2];H[a+4>>2]=k;a=l+H[n+24>>2]|0;H[a+48>>2]=H[g+232>>2];f=H[g+228>>2];H[a+40>>2]=H[g+224>>2];H[a+44>>2]=f;f=H[g+220>>2];H[a+32>>2]=H[g+216>>2];H[a+36>>2]=f;f=H[g+212>>2];H[a+24>>2]=H[g+208>>2];H[a+28>>2]=f;f=H[g+204>>2];H[a+16>>2]=H[g+200>>2];H[a+20>>2]=f;f=H[g+196>>2];H[a+8>>2]=H[g+192>>2];H[a+12>>2]=f;f=H[g+188>>2];H[a>>2]=H[g+184>>2];H[a+4>>2]=f;if(i>>>0<=e+1>>>0){break q}f=d;if(!(e-i&1)){a=c;f=N(d,6)+h|0;l=J[f>>1];r:{if((l|0)!=(b|0)){a=b;if((l|0)!=(j|0)){break r}}G[f>>1]=a}f=d+1|0}if((p|0)==(e&65535)){break q}while(1){a=c;l=N(f,6)+h|0;k=J[l>>1];s:{if((k|0)!=(b|0)){a=b;if((k|0)!=(j|0)){break s}}G[l>>1]=a}a=c;k=J[l+6>>1];t:{if((k|0)!=(b|0)){a=b;if((k|0)!=(j|0)){break t}}G[l+6>>1]=a}f=f+2|0;if((i|0)!=(f&65535)){continue}break}}G[(H[n+24>>2]+N(b,52)|0)+48>>1]=J[q+2>>1]}d=d+1|0;e=e+1|0;if((i|0)!=(e|0)){continue}break}e=H[o+116>>2];h=H[e>>2]}if(h){Ca(h);e=H[o+116>>2]}Ca(e);H[o+116>>2]=0;break a}r=0;Ba(m,1,9499,0)}na=g+240|0;return r|0}function Tc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=O(0),p=0;k=na-48|0;na=k;H[a+8>>2]=1;a:{b:{d=k+40|0;c:{if((Ja(b,d,2,c)|0)!=2){break c}Da(d,k+44|0,2);if(H[k+44>>2]!=65359){break c}H[a+8>>2]=2;d=H[b+56>>2];e=d-2|0;d=H[b+60>>2]-(d>>>0<2)|0;g=H[a+224>>2];H[g>>2]=e;H[g+4>>2]=d;H[k+16>>2]=e;H[k+20>>2]=d;Ba(c,4,12769,k+16|0);f=H[a+224>>2];j=H[f>>2];e=H[f+24>>2];d=e+1|0;g=H[f+32>>2];if(d>>>0<=g>>>0){g=H[f+28>>2];break b}o=O(O(g>>>0)+O(100));if(o=O(0)){d=~~o>>>0}else{d=0}H[f+32>>2]=d;g=Ha(H[f+28>>2],N(d,24));if(g){H[f+28>>2]=g;e=H[f+24>>2];d=e+1|0;break b}Ca(H[f+28>>2]);H[f+32>>2]=0;H[f+24>>2]=0;H[f+28>>2]=0;Ba(c,1,3899,0)}Ba(c,1,15656,0);a=0;break a}e=N(e,24)+g|0;H[e+16>>2]=2;H[e+8>>2]=j;H[e+12>>2]=j>>31;G[e>>1]=65359;H[f+24>>2]=d;if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);a=0;break a}Da(H[a+16>>2],k+40|0,2);d:{e:{g=H[k+40>>2];if((g|0)!=65424){while(1){e=24912;if(g>>>0<=65279){H[k>>2]=g;Ba(c,1,2268,k);a=0;break a}while(1){d=e;f=H[d>>2];if(f){e=d+12|0;if((f|0)!=(g|0)){continue}}break}f:{g:{if(f){break g}h=2;Ba(c,2,3847,0);e=2472;h:{i:{if((Ja(b,H[a+16>>2],2,c)|0)!=2){break i}while(1){Da(H[a+16>>2],k+44|0,2);f=24912;g=H[k+44>>2];if(g>>>0>=65280){while(1){d=f;i=H[d>>2];if(i){f=d+12|0;if((g|0)!=(i|0)){continue}}break}if(!(H[d+4>>2]&H[a+8>>2])){e=5397;break i}if(i){if((i|0)==65424){H[k+40>>2]=65424;break f}j=H[b+56>>2];f=H[a+224>>2];g=H[f+24>>2];e=g+1|0;d=H[f+32>>2];if(e>>>0<=d>>>0){d=H[f+28>>2];break h}o=O(O(d>>>0)+O(100));if(o=O(0)){d=~~o>>>0}else{d=0}H[f+32>>2]=d;d=Ha(H[f+28>>2],N(d,24));if(d){H[f+28>>2]=d;g=H[f+24>>2];e=g+1|0;break h}Ca(H[f+28>>2]);H[f+32>>2]=0;H[f+24>>2]=0;H[f+28>>2]=0;e=3899;break i}h=h+2|0}if((Ja(b,H[a+16>>2],2,c)|0)==2){continue}break}}Ba(c,1,e,0);Ba(c,1,9847,0);a=0;break a}d=N(g,24)+d|0;H[d+16>>2]=h;g=j-h|0;H[d+8>>2]=g;H[d+12>>2]=g>>31;G[d>>1]=0;H[f+24>>2]=e;H[k+40>>2]=i;g=24912;if((i|0)==65424){break f}while(1){d=g;f=H[d>>2];if(!f){break g}g=d+12|0;if((f|0)!=(i|0)){continue}break}}if(!(H[d+4>>2]&H[a+8>>2])){Ba(c,1,5397,0);a=0;break a}if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);a=0;break a}Da(H[a+16>>2],k+36|0,2);e=H[k+36>>2];if(e>>>0<=1){Ba(c,1,6074,0);a=0;break a}e=e-2|0;H[k+36>>2]=e;g=H[a+16>>2];if(K[a+20>>2]>>0){g=Ha(g,e);if(!g){Ca(H[a+16>>2]);H[a+16>>2]=0;H[a+20>>2]=0;Ba(c,1,4973,0);a=0;break a}H[a+16>>2]=g;e=H[k+36>>2];H[a+20>>2]=e}e=Ja(b,g,e,c);if((e|0)!=H[k+36>>2]){Ba(c,1,2472,0);a=0;break a}if(!(ra[H[d+8>>2]](a,H[a+16>>2],e,c)|0)){Ba(c,1,2490,0);a=0;break a}j=H[b+56>>2];i=H[k+36>>2];d=H[a+224>>2];g=H[d+24>>2];h=g+1|0;e=H[d+32>>2];j:{if(h>>>0<=e>>>0){e=H[d+28>>2];break j}o=O(O(e>>>0)+O(100));if(o=O(0)){e=~~o>>>0}else{e=0}H[d+32>>2]=e;e=Ha(H[d+28>>2],N(e,24));if(!e){break d}H[d+28>>2]=e;g=H[d+24>>2];h=g+1|0}e=N(g,24)+e|0;H[e+16>>2]=i+4;g=(j-i|0)-4|0;H[e+8>>2]=g;H[e+12>>2]=g>>31;G[e>>1]=f;H[d+24>>2]=h;if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);a=0;break a}m=(f|0)==65372?1:m;l=(f|0)==65362?1:l;n=(f|0)==65361?1:n;Da(H[a+16>>2],k+40|0,2);g=H[k+40>>2];if((g|0)!=65424){continue}}break}if(n){break e}}Ba(c,1,4785,0);a=0;break a}if(!l){Ba(c,1,4831,0);a=0;break a}if(!m){Ba(c,1,4877,0);a=0;break a}d=0;e=0;h=0;j=na-16|0;na=j;m=1;k:{if(!(F[a+212|0]&1)){break k}l:{f=H[a+136>>2];if(!f){break l}m:{while(1){g=H[a+140>>2]+(h<<3)|0;l=H[g>>2];if(l){i=H[g+4>>2];g=d-i|0;g=d>>>0>=g>>>0?g:0;if(d>>>0>>0){f=i-d|0;l=d+l|0;while(1){if(f>>>0<4){d=5671;break m}Da(l,j+12|0,4);d=H[j+12>>2];if((d^-1)>>>0>>0){d=5645;break m}i=f-4|0;n=i>>>0>>0;g=n?d-i|0:g;e=d+e|0;f=i-d|0;l=((n?0:d)+l|0)+4|0;if(d>>>0>>0){continue}break}f=H[a+136>>2]}d=g}h=h+1|0;if(h>>>0>>0){continue}break}if(!d){break l}m=0;Ba(c,1,3067,0);break k}m=0;Ba(c,1,d,0);break k}d=Fa(e);H[a+160>>2]=d;if(!d){m=0;Ba(c,1,4337,0);break k}H[a+148>>2]=e;h=H[a+140>>2];n:{f=H[a+136>>2];if(f){e=0;d=0;g=0;while(1){l=g<<3;n=l+h|0;i=H[n>>2];if(i){h=H[a+160>>2]+d|0;f=H[n+4>>2];o:{if(f>>>0<=e>>>0){if(f){B(h,i,f)}d=d+f|0;e=e-f|0;break o}if(e){B(h,i,e)}d=d+e|0;h=f-e|0;e=e+i|0;while(1){if(h>>>0<4){break n}Da(e,j+8|0,4);e=e+4|0;i=H[a+160>>2]+d|0;f=h-4|0;h=H[j+8>>2];if(f>>>0>>0){if(f){B(i,e,f)}d=d+f|0;e=H[j+8>>2]-f|0;break o}if(h){B(i,e,h)}h=H[j+8>>2];d=h+d|0;e=e+h|0;h=f-h|0;if(h){continue}break}e=0}Ca(H[l+H[a+140>>2]>>2]);h=H[a+140>>2];f=l+h|0;H[f>>2]=0;H[f+4>>2]=0;f=H[a+136>>2]}g=g+1|0;if(g>>>0>>0){continue}break}e=H[a+148>>2];d=H[a+160>>2]}H[a+168>>2]=e;H[a+144>>2]=d;H[a+136>>2]=0;Ca(h);H[a+140>>2]=0;break k}m=0;Ba(c,1,5671,0)}na=j+16|0;if(!m){Ba(c,1,8085,0);a=0;break a}Ba(c,4,11754,0);d=H[a+224>>2];e=H[b+56>>2];e=e-2|0;H[d+8>>2]=e;H[d+12>>2]=0;b=0;h=0;i=na-16|0;na=i;g=H[a+68>>2];p:{if(!g){H[a+76>>2]=1;break p}if(H[a+76>>2]){break p}d=H[a+72>>2];j=H[a+224>>2];e=H[j+40>>2];q:{if((g|0)!=1){m=g&1;l=g&-2;while(1){n=(b<<3)+d|0;p=J[n>>1];f=e+N(p,40)|0;H[f>>2]=p;H[f+8>>2]=H[f+8>>2]+1;n=J[n+8>>1];f=e+N(n,40)|0;H[f>>2]=n;H[f+8>>2]=H[f+8>>2]+1;b=b+2|0;h=h+2|0;if((l|0)!=(h|0)){continue}break}if(!m){break q}}f=J[(b<<3)+d>>1];b=e+N(f,40)|0;H[b>>2]=f;H[b+8>>2]=H[b+8>>2]+1}f=H[j+36>>2];r:{if(f){b=0;while(1){if(!H[(e+N(b,40)|0)+8>>2]){H[i>>2]=b;Ba(c,1,9304,i);break r}b=b+1|0;if((f|0)!=(b|0)){continue}break}}f=H[j+8>>2];b=H[j+12>>2];e=0;while(1){s:{l=e<<3;m=H[H[a+224>>2]+40>>2]+N(J[l+d>>1],40)|0;h=H[m+16>>2];if(!h){h=Ea(H[m+8>>2],24);H[m+16>>2]=h;if(!h){break s}g=H[a+68>>2];d=H[a+72>>2]}p=h;h=H[m+4>>2];j=p+N(h,24)|0;H[j>>2]=f;H[j+4>>2]=b;l=H[(d+l|0)+4>>2];f=l+f|0;H[j+16>>2]=f;b=f>>>0>>0?b+1|0:b;H[j+20>>2]=b;H[m+4>>2]=h+1;e=e+1|0;if(g>>>0>e>>>0){continue}break p}break}Ba(c,1,6882,0)}H[a+76>>2]=1;if(!H[a+68>>2]){break p}d=H[H[a+224>>2]+40>>2];b=0;while(1){c=N(J[H[a+72>>2]+(b<<3)>>1],40);d=c+d|0;H[d+8>>2]=0;Ca(H[d+16>>2]);d=H[H[a+224>>2]+40>>2];H[(c+d|0)+16>>2]=0;b=b+1|0;if(b>>>0>2]){continue}break}}na=i+16|0;H[a+8>>2]=8;a=1;break a}Ca(H[d+28>>2]);H[d+32>>2]=0;H[d+24>>2]=0;H[d+28>>2]=0;Ba(c,1,3899,0);a=0}na=k+48|0;return a|0}function ge(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;f=na-160|0;na=f;a:{if(c>>>0<=35){c=0;Ba(d,1,6095,0);break a}j=H[a+96>>2];c=c-36|0;h=(c>>>0)/3|0;if((N(h,3)|0)!=(c|0)){c=0;Ba(d,1,6095,0);break a}c=f+156|0;Da(b,c,2);G[a+104>>1]=H[f+156>>2];Da(b+2|0,j+8|0,4);Da(b+6|0,j+12|0,4);Da(b+10|0,j,4);Da(b+14|0,j+4|0,4);Da(b+18|0,a+116|0,4);Da(b+22|0,a+120|0,4);Da(b+26|0,a+108|0,4);Da(b+30|0,a+112|0,4);Da(b+34|0,c,2);b:{c:{d:{c=H[f+156>>2];if(c>>>0<=16384){H[j+16>>2]=c;if((c|0)!=(h|0)){H[f+132>>2]=h;H[f+128>>2]=c;Ba(d,1,14980,f+128|0);c=0;break a}c=H[j+4>>2];g=H[j+12>>2];l=H[j+8>>2];e=H[j>>2];if(!(c>>>0>>0&l>>>0>e>>>0)){H[f+120>>2]=g-c;H[f+124>>2]=0-(c>>>0>g>>>0);H[f+112>>2]=l-e;H[f+116>>2]=0-(e>>>0>l>>>0);Ba(d,1,14542,f+112|0);c=0;break a}i=H[a+116>>2];k=H[a+120>>2];if(!(k?i:0)){H[f+4>>2]=k;H[f>>2]=i;Ba(d,1,15094,f);c=0;break a}e:{n=H[a+108>>2];f:{if(n>>>0>e>>>0){break f}i=i+n|0;if(e>>>0>=(i>>>0>>0?-1:i)>>>0){break f}i=H[a+112>>2];if(i>>>0>c>>>0){break f}k=i+k|0;if(c>>>0<(i>>>0>k>>>0?-1:k)>>>0){break e}}c=0;Ba(d,1,2792,0);break a}g:{if(H[a+248>>2]){break g}i=H[a+240>>2];if(!i){break g}k=H[a+244>>2];if(!k){break g}e=l-e|0;c=g-c|0;if((e|0)==(i|0)&(c|0)==(k|0)){break g}H[f+108>>2]=c;H[f+104>>2]=e;H[f+100>>2]=k;H[f+96>>2]=i;Ba(d,1,14006,f+96|0);c=0;break a}e=Ea(h,52);H[j+24>>2]=e;if(!e){break d}h:{if(!H[j+16>>2]){break h}c=f+152|0;Da(b+36|0,c,1);h=H[f+152>>2];k=h>>>7|0;H[e+32>>2]=k;n=(h&127)+1|0;H[e+24>>2]=n;l=H[a+248>>2];Da(b+37|0,c,1);H[e>>2]=H[f+152>>2];Da(b+38|0,c,1);g=H[f+152>>2];H[e+4>>2]=g;c=0;i=H[e>>2];if(i-256>>>0<4294967041){h=0;break b}h=0;if(g-256>>>0<4294967041){break b}g=H[e+24>>2];if(g>>>0>31){break c}H[e+36>>2]=0;H[e+40>>2]=H[a+184>>2];h=1;if(K[j+16>>2]<=1){break h}k=l?0:k;l=l?0:n;b=b+39|0;while(1){Da(b,f+152|0,1);i=H[f+152>>2];g=i>>>7|0;H[e+84>>2]=g;i=(i&127)+1|0;H[e+76>>2]=i;if(!(H[a+248>>2]|(I[a+212|0]&4|(i|0)==(l|0)&(g|0)==(k|0)))){H[f+84>>2]=g;H[f+80>>2]=i;H[f+76>>2]=h;H[f+72>>2]=k;H[f+68>>2]=l;H[f+64>>2]=h;Ba(d,2,14778,f- -64|0)}g=f+152|0;Da(b+1|0,g,1);H[e+52>>2]=H[f+152>>2];Da(b+2|0,g,1);g=H[f+152>>2];H[e+56>>2]=g;i=H[e+52>>2];if(i-256>>>0<4294967041|g-256>>>0<=4294967040){break b}g=H[e+76>>2];if(g>>>0>=32){break c}b=b+3|0;H[e+88>>2]=0;H[e+92>>2]=H[a+184>>2];e=e+52|0;h=h+1|0;if(h>>>0>2]){continue}break}}c=0;h=H[a+116>>2];if(!h){break a}g=H[a+120>>2];if(!g){break a}l=0-!h|0;e=l;p=H[a+108>>2];k=H[j+8>>2]-p|0;i=h-1|0;b=k+i|0;e=k>>>0>b>>>0?e+1|0:e;b=ve(b,e,h,0);H[a+128>>2]=b;n=0-!g|0;e=n;q=H[a+112>>2];o=H[j+12>>2]-q|0;m=o;k=g-1|0;o=o+k|0;e=m>>>0>o>>>0?e+1|0:e;e=ve(o,e,g,0);H[a+132>>2]=e;i:{if(!(!b|!e)){if(b>>>0<=65535/(e>>>0)>>>0){break i}}H[f+20>>2]=e;H[f+16>>2]=b;Ba(d,1,14120,f+16|0);break a}o=N(b,e);j:{if(I[a+92|0]&2){H[a+28>>2]=(H[a+28>>2]-p>>>0)/(h>>>0);H[a+32>>2]=(H[a+32>>2]-q>>>0)/(g>>>0);e=l;b=H[a+36>>2]-p|0;m=b;b=b+i|0;e=m>>>0>b>>>0?e+1|0:e;v=a,w=ve(b,e,h,0),H[v+36>>2]=w;e=n;b=H[a+40>>2]-q|0;m=b;b=b+k|0;e=m>>>0>b>>>0?e+1|0:e;v=a,w=ve(b,e,g,0),H[v+40>>2]=w;break j}H[a+40>>2]=e;H[a+36>>2]=b;H[a+28>>2]=0;H[a+32>>2]=0}b=Ea(o,5644);H[a+180>>2]=b;if(!b){Ba(d,1,3935,0);break a}b=Ea(H[j+16>>2],1080);H[H[a+12>>2]+5584>>2]=b;if(!H[H[a+12>>2]+5584>>2]){Ba(d,1,3935,0);break a}b=Ea(10,20);H[H[a+12>>2]+5616>>2]=b;b=H[a+12>>2];if(!H[b+5616>>2]){Ba(d,1,3935,0);break a}H[b+5624>>2]=10;b=Ea(10,20);H[H[a+12>>2]+5628>>2]=b;b=H[a+12>>2];if(!H[b+5628>>2]){Ba(d,1,3935,0);break a}H[b+5636>>2]=10;e=H[j+16>>2];k:{if(!e){break k}h=H[j+24>>2];b=0;if((e|0)!=1){g=e&1;l=e&-2;e=0;while(1){i=h+N(b,52)|0;if(!H[i+32>>2]){H[(H[H[a+12>>2]+5584>>2]+N(b,1080)|0)+1076>>2]=1<>2]-1}i=b|1;k=h+N(i,52)|0;if(!H[k+32>>2]){H[(H[H[a+12>>2]+5584>>2]+N(i,1080)|0)+1076>>2]=1<>2]-1}b=b+2|0;e=e+2|0;if((l|0)!=(e|0)){continue}break}if(!g){break k}}e=h+N(b,52)|0;if(H[e+32>>2]){break k}H[(H[H[a+12>>2]+5584>>2]+N(b,1080)|0)+1076>>2]=1<>2]-1}if(o){b=H[a+180>>2];e=0;while(1){h=Ea(H[j+16>>2],1080);H[b+5584>>2]=h;if(!h){Ba(d,1,3935,0);break a}b=b+5644|0;e=e+1|0;if(o>>>0>e>>>0){continue}break}}b=N(H[a+132>>2],H[a+128>>2]);H[H[a+224>>2]+36>>2]=b;b=Ea(b,40);d=H[a+224>>2];H[d+40>>2]=b;e=0;l:{if(!b){break l}e=1;if(!H[d+36>>2]){break l}d=0;while(1){m:{e=0;g=N(d,40);b=g+b|0;H[b+20>>2]=0;H[b+28>>2]=100;h=Ea(100,24);l=H[a+224>>2];b=H[l+40>>2];H[(g+b|0)+24>>2]=h;if(!h){break m}e=1;d=d+1|0;if(d>>>0>2]){continue}}break}}if(!e){break a}H[a+8>>2]=4;r=H[j+16>>2];if(r){b=H[a+112>>2];d=H[a+120>>2];c=b+N(d,H[a+132>>2]-1|0)|0;d=c+d|0;c=c>>>0>d>>>0?-1:d;d=H[j+12>>2];c=c>>>0>>0?c:d;l=c-1|0;k=0-!c|0;c=H[a+108>>2];d=H[a+116>>2];a=c+N(d,H[a+128>>2]-1|0)|0;d=a+d|0;a=a>>>0>d>>>0?-1:d;d=H[j+8>>2];a=a>>>0>>0?a:d;i=a-1|0;n=0-!a|0;a=H[j+4>>2];b=a>>>0>>0?b:a;o=b-1|0;p=0-!b|0;a=H[j>>2];b=a>>>0>>0?c:a;q=b-1|0;u=0-!b|0;a=H[j+24>>2];b=0;while(1){e=p;d=H[a+4>>2];c=d+o|0;j=ve(c,c>>>0>>0?e+1|0:e,d,0);H[a+20>>2]=j;e=u;h=H[a>>2];c=h+q|0;s=ve(c,c>>>0>>0?e+1|0:e,h,0);H[a+16>>2]=s;c=H[a+40>>2];g=c&31;if((c&63)>>>0>=32){e=-1<>>32-g}g=m^-1;e=e^-1;m=e;e=k;t=d+l|0;e=t>>>0>>0?e+1|0:e;e=ve(t,e,d,0)-j|0;d=m;j=e;e=e+g|0;d=j>>>0>e>>>0?d+1|0:d;j=e;e=c&31;if((c&63)>>>0>=32){d=d>>>e|0}else{d=((1<>>e}H[a+12>>2]=d;e=n;d=h+i|0;e=d>>>0>>0?e+1|0:e;d=ve(d,e,h,0)-s|0;e=m;d=d+g|0;e=d>>>0>>0?e+1|0:e;h=d;d=c&31;if((c&63)>>>0>=32){c=e>>>d|0}else{c=((1<>>d}H[a+8>>2]=c;a=a+52|0;b=b+1|0;if((r|0)!=(b|0)){continue}break}}c=1;break a}H[f+144>>2]=c;Ba(d,1,7932,f+144|0);c=0;break a}c=0;H[j+16>>2]=0;Ba(d,1,3935,0);break a}H[f+52>>2]=g;H[f+48>>2]=h;Ba(d,1,15402,f+48|0);break a}H[f+40>>2]=g;H[f+36>>2]=i;H[f+32>>2]=h;Ba(d,1,14340,f+32|0)}na=f+160|0;return c|0}function fd(a,b,c,d,e,f){a=a|0;b=+b;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,t=0,u=0,v=0,w=0,y=0,z=0,A=0,B=0,C=0;n=na-560|0;na=n;H[n+44>>2]=0;x(+b);i=s(1)|0;s(0)|0;a:{if((i|0)<0){r=1;y=1082;b=-b;x(+b);i=s(1)|0;s(0)|0;break a}if(e&2048){r=1;y=1085;break a}r=e&1;y=r?1088:1083;A=!r}b:{if((i&2146435072)==2146435072){d=r+3|0;Na(a,32,c,d,e&-65537);La(a,y,r);f=f&32;La(a,b!=b?f?1207:1435:f?1312:1476,3);Na(a,32,c,d,e^8192);l=(c|0)>(d|0)?c:d;break b}v=n+16|0;c:{d:{e:{b=pc(b,n+44|0);b=b+b;if(b!=0){g=H[n+44>>2];H[n+44>>2]=g-1;t=f|32;if((t|0)!=97){break e}break c}t=f|32;if((t|0)==97){break c}m=H[n+44>>2];break d}m=g-29|0;H[n+44>>2]=m;b=b*268435456}k=(d|0)<0?6:d;p=(n+48|0)+((m|0)>=0?288:0)|0;h=p;while(1){d=b<4294967295&b>=0?~~b>>>0:0;H[h>>2]=d;h=h+4|0;b=(b-+(d>>>0))*1e9;if(b!=0){continue}break}f:{if((m|0)<=0){i=m;g=h;j=p;break f}j=p;i=m;while(1){z=i>>>0>=29?29:i;g=h-4|0;g:{if(j>>>0>g>>>0){break g}d=0;i=0;while(1){w=H[g>>2];o=z&31;if((z&63)>>>0>=32){l=w<>>32-o;w=w<>>0>o>>>0?i+1|0:i;d=ve(o,l,1e9,0);i=qa;B=g,C=o+re(d,i,-1e9)|0,H[B>>2]=C;g=g-4|0;if(j>>>0<=g>>>0){continue}break}if(!l&o>>>0<1e9){break g}j=j-4|0;H[j>>2]=d}while(1){g=h;if(j>>>0>>0){h=g-4|0;if(!H[h>>2]){continue}}break}i=H[n+44>>2]-z|0;H[n+44>>2]=i;h=g;if((i|0)>0){continue}break}}if((i|0)<0){u=((k+25>>>0)/9|0)+1|0;l=(t|0)==102;while(1){d=0-i|0;d=d>>>0>=9?9:d;h:{if(g>>>0<=j>>>0){h=H[j>>2]?0:4;break h}o=1e9>>>d|0;z=-1<>2];H[h>>2]=w+(i>>>d|0);i=N(o,i&z);h=h+4|0;if(h>>>0>>0){continue}break}h=H[j>>2]?0:4;if(!i){break h}H[g>>2]=i;g=g+4|0}i=d+H[n+44>>2]|0;H[n+44>>2]=i;j=h+j|0;d=l?p:j;g=g-d>>2>(u|0)?d+(u<<2)|0:g;if((i|0)<0){continue}break}}i=0;i:{if(g>>>0<=j>>>0){break i}i=N(p-j>>2,9);h=10;d=H[j>>2];if(d>>>0<10){break i}while(1){i=i+1|0;h=N(h,10);if(d>>>0>=h>>>0){continue}break}}d=(k-((t|0)!=102?i:0)|0)-((t|0)==103&(k|0)!=0)|0;if((d|0)<(N(g-p>>2,9)-9|0)){h=(n+48|0)+((m|0)<0?-4092:-3804)|0;d=d+9216|0;m=(d|0)/9|0;l=h+(m<<2)|0;h=10;d=d+N(m,-9)|0;if((d|0)<=7){while(1){h=N(h,10);d=d+1|0;if((d|0)!=8){continue}break}}m=H[l>>2];u=(m>>>0)/(h>>>0)|0;d=N(u,h);o=l+4|0;j:{if((d|0)==(m|0)&(o|0)==(g|0)){break j}m=m-d|0;k:{if(!(u&1)){b=9007199254740992;if(!(F[l-4|0]&1)|((h|0)!=1e9|j>>>0>=l>>>0)){break k}}b=9007199254740994}q=(g|0)==(o|0)?1:1.5;o=h>>>1|0;q=m>>>0>>0?.5:(o|0)==(m|0)?q:1.5;if(!(I[y|0]!=45|A)){q=-q;b=-b}H[l>>2]=d;if(b+q==b){break j}d=d+h|0;H[l>>2]=d;if(d>>>0>=1e9){while(1){H[l>>2]=0;l=l-4|0;if(l>>>0>>0){j=j-4|0;H[j>>2]=0}d=H[l>>2]+1|0;H[l>>2]=d;if(d>>>0>999999999){continue}break}}i=N(p-j>>2,9);h=10;d=H[j>>2];if(d>>>0<10){break j}while(1){i=i+1|0;h=N(h,10);if(d>>>0>=h>>>0){continue}break}}d=l+4|0;g=d>>>0>>0?d:g}while(1){h=g;m=g>>>0<=j>>>0;if(!m){g=g-4|0;if(!H[g>>2]){continue}}break}l:{if((t|0)!=103){d=e&8;break l}d=k?k:1;g=(d|0)>(i|0)&(i|0)>-5;k=(g?i^-1:-1)+d|0;f=(g?-1:-2)+f|0;d=e&8;if(d){break l}g=-9;m:{if(m){break m}l=H[h-4>>2];if(!l){break m}d=10;g=0;if((l>>>0)%10|0){break m}while(1){m=g;g=g+1|0;d=N(d,10);if(!((l>>>0)%(d>>>0)|0)){continue}break}g=m^-1}m=N(h-p>>2,9);if((f&-33)==70){d=0;g=(g+m|0)-9|0;g=(g|0)>0?g:0;k=(g|0)>(k|0)?k:g;break l}d=0;g=((i+m|0)+g|0)-9|0;g=(g|0)>0?g:0;k=(g|0)>(k|0)?k:g}l=-1;t=d|k;if(((t?2147483645:2147483646)|0)<(k|0)){break b}m=(((t|0)!=0)+k|0)+1|0;o=f&-33;n:{if((o|0)==70){if((m^2147483647)<(i|0)){break b}g=(i|0)>0?i:0;break n}g=i>>31;g=$a((g^i)-g|0,0,v);if((v-g|0)<=1){while(1){g=g-1|0;F[g|0]=48;if((v-g|0)<2){continue}break}}u=g-2|0;F[u|0]=f;F[g-1|0]=(i|0)<0?45:43;g=v-u|0;if((g|0)>(m^2147483647)){break b}}f=g+m|0;if((f|0)>(r^2147483647)){break b}f=f+r|0;Na(a,32,c,f,e);La(a,y,r);Na(a,48,c,f,e^65536);o:{p:{q:{if((o|0)==70){d=n+16|9;i=j>>>0>p>>>0?p:j;j=i;while(1){g=$a(H[j>>2],0,d);r:{if((i|0)!=(j|0)){if(n+16>>>0>=g>>>0){break r}while(1){g=g-1|0;F[g|0]=48;if(n+16>>>0>>0){continue}break}break r}if((d|0)!=(g|0)){break r}g=g-1|0;F[g|0]=48}La(a,g,d-g|0);j=j+4|0;if(p>>>0>=j>>>0){continue}break}if(t){La(a,1684,1)}if((k|0)<=0|h>>>0<=j>>>0){break q}while(1){g=$a(H[j>>2],0,d);if(g>>>0>n+16>>>0){while(1){g=g-1|0;F[g|0]=48;if(n+16>>>0>>0){continue}break}}La(a,g,(k|0)>=9?9:k);g=k-9|0;j=j+4|0;if(h>>>0<=j>>>0){break p}i=(k|0)>9;k=g;if(i){continue}break}break p}s:{if((k|0)<0){break s}p=h>>>0>j>>>0?h:j+4|0;i=n+16|9;h=j;while(1){g=$a(H[h>>2],0,i);if((i|0)==(g|0)){g=g-1|0;F[g|0]=48}t:{if((h|0)!=(j|0)){if(n+16>>>0>=g>>>0){break t}while(1){g=g-1|0;F[g|0]=48;if(n+16>>>0>>0){continue}break}break t}La(a,g,1);g=g+1|0;if(!(d|k)){break t}La(a,1684,1)}m=g;g=i-g|0;La(a,m,(g|0)<(k|0)?g:k);k=k-g|0;h=h+4|0;if(p>>>0<=h>>>0){break s}if((k|0)>=0){continue}break}}Na(a,48,k+18|0,18,0);La(a,u,v-u|0);break o}g=k}Na(a,48,g+9|0,9,0)}Na(a,32,c,f,e^8192);l=(c|0)>(f|0)?c:f;break b}j=(f<<26>>31&9)+y|0;u:{if(d>>>0>11){break u}g=12-d|0;q=16;while(1){q=q*16;g=g-1|0;if(g){continue}break}if(I[j|0]==45){b=-(q+(-b-q));break u}b=b+q-q}h=H[n+44>>2];g=h>>31;g=$a((g^h)-g|0,0,v);if((v|0)==(g|0)){g=g-1|0;F[g|0]=48;h=H[n+44>>2]}k=f&32;i=g-2|0;F[i|0]=f+15;F[g-1|0]=(h|0)<0?45:43;g=!(e&8)&(d|0)<=0;h=n+16|0;while(1){f=h;p=P(b)<2147483647?~~b:-2147483648;F[h|0]=k|I[p+26048|0];b=(b-+(p|0))*16;h=h+1|0;if(!(g&b==0|(h-(n+16|0)|0)!=1)){F[f+1|0]=46;h=f+2|0}if(b!=0){continue}break}l=-1;g=v-i|0;if((2147483643-(g+r|0)|0)<(d|0)){break b}f=h;h=n+16|0;f=f-h|0;k=d?(f-2|0)<(d|0)?d+2|0:f:f;p=r|2;d=k+(p+g|0)|0;Na(a,32,c,d,e);La(a,j,p);Na(a,48,c,d,e^65536);La(a,h,f);Na(a,48,k-f|0,0,0);La(a,i,g);Na(a,32,c,d,e^8192);l=(c|0)>(d|0)?c:d}na=n+560|0;return l|0}function sc(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;j=na+-64|0;na=j;H[j+60>>2]=b;z=j+41|0;A=j+39|0;t=j+40|0;a:{b:{c:{d:{e:while(1){h=0;f:while(1){k=b;if((o^2147483647)<(h|0)){break d}o=h+o|0;g:{h:{i:{j:{h=b;i=I[h|0];if(i){while(1){k:{b=i&255;l:{if(!b){b=h;break l}if((b|0)!=37){break k}i=h;while(1){if(I[i+1|0]!=37){b=i;break l}h=h+1|0;n=I[i+2|0];b=i+2|0;i=b;if((n|0)==37){continue}break}}h=h-k|0;y=o^2147483647;if((h|0)>(y|0)){break d}if(a){La(a,k,h)}if(h){continue f}H[j+60>>2]=b;h=b+1|0;q=-1;i=F[b+1|0]-48|0;if(!(I[b+2|0]!=36|i>>>0>9)){w=1;q=i;h=b+3|0}H[j+60>>2]=h;l=0;i=F[h|0];b=i-32|0;m:{if(b>>>0>31){n=h;break m}n=h;b=1<>2]=n;l=b|l;i=F[h+1|0];b=i-32|0;if(b>>>0>=32){break m}h=n;b=1<>>0>9)){p:{if(!a){H[(b<<2)+e>>2]=10;b=0;break p}b=H[(b<<3)+d>>2]}p=b;b=n+3|0;i=1;break o}if(w){break j}b=n+1|0;if(!a){H[j+60>>2]=b;w=0;p=0;break n}h=H[c>>2];H[c>>2]=h+4;p=H[h>>2];i=0}w=i;H[j+60>>2]=b;if((p|0)>=0){break n}p=0-p|0;l=l|8192;break n}p=rc(j+60|0);if((p|0)<0){break d}b=H[j+60>>2]}h=0;m=-1;u=0;q:{if(I[b|0]!=46){break q}if(I[b+1|0]==42){i=F[b+2|0]-48|0;r:{if(!(I[b+3|0]!=36|i>>>0>9)){b=b+4|0;s:{if(!a){H[(i<<2)+e>>2]=10;m=0;break s}m=H[(i<<3)+d>>2]}break r}if(w){break j}b=b+2|0;m=0;if(!a){break r}i=H[c>>2];H[c>>2]=i+4;m=H[i>>2]}H[j+60>>2]=b;u=(m|0)>=0;break q}H[j+60>>2]=b+1;m=rc(j+60|0);b=H[j+60>>2];u=1}while(1){x=h;n=28;r=b;i=F[b|0];if(i-123>>>0<4294967238){break c}b=b+1|0;h=I[(i+N(h,58)|0)+25519|0];if((h-1&255)>>>0<8){continue}break}H[j+60>>2]=b;t:{if((h|0)!=27){if(!h){break c}if((q|0)>=0){if(!a){H[(q<<2)+e>>2]=h;continue e}h=(q<<3)+d|0;i=H[h+4>>2];H[j+48>>2]=H[h>>2];H[j+52>>2]=i;break t}if(!a){break g}qc(j+48|0,h,c,g);break t}if((q|0)>=0){break c}h=0;if(!a){continue f}}if(I[a|0]&32){break b}i=l&-65537;l=l&8192?i:l;q=0;v=1072;n=t;u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{H:{I:{J:{K:{r=I[r|0];h=r<<24>>24;h=x?(r&15)==3?h&-45:h:h;switch(h-88|0){case 0:case 32:break G;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 10:case 16:case 18:case 19:case 20:case 21:case 25:case 26:case 28:case 30:case 31:break h;case 9:case 13:case 14:case 15:break u;case 11:break B;case 12:case 17:break E;case 22:break I;case 23:break F;case 24:break H;case 27:break A;case 29:break J;default:break K}}L:{switch(h-65|0){case 1:case 3:break h;case 0:case 4:case 5:case 6:break u;case 2:break z;default:break L}}if((h|0)==83){break y}break h}i=H[j+48>>2];r=H[j+52>>2];v=1072;break D}h=0;M:{switch(x|0){case 0:H[H[j+48>>2]>>2]=o;continue f;case 1:H[H[j+48>>2]>>2]=o;continue f;case 2:k=H[j+48>>2];H[k>>2]=o;H[k+4>>2]=o>>31;continue f;case 3:G[H[j+48>>2]>>1]=o;continue f;case 4:F[H[j+48>>2]]=o;continue f;case 6:H[H[j+48>>2]>>2]=o;continue f;case 7:break M;default:continue f}}k=H[j+48>>2];H[k>>2]=o;H[k+4>>2]=o>>31;continue f}m=m>>>0<=8?8:m;l=l|8;h=120}b=t;k=H[j+52>>2];r=k;i=H[j+48>>2];s=i;if(i|k){x=h&32;while(1){b=b-1|0;F[b|0]=x|I[(s&15)+26048|0];s=(k&15)<<28|s>>>4;k=k>>>4|0;if(s|k){continue}break}}k=b;if(!(l&8)|!(i|r)){break C}v=(h>>>4|0)+1072|0;q=2;break C}b=t;k=H[j+52>>2];r=k;i=H[j+48>>2];s=i;if(i|k){while(1){b=b-1|0;F[b|0]=s&7|48;s=(k&7)<<29|s>>>3;k=k>>>3|0;if(s|k){continue}break}}k=b;if(!(l&8)){break C}b=z-b|0;m=(b|0)<(m|0)?m:b;break C}i=H[j+48>>2];b=H[j+52>>2];r=b;if((b|0)<0){h=0-(b+((i|0)!=0)|0)|0;r=h;i=0-i|0;H[j+48>>2]=i;H[j+52>>2]=h;q=1;v=1072;break D}if(l&2048){q=1;v=1073;break D}q=l&1;v=q?1074:1072}k=$a(i,r,t)}if((m|0)<0&u){break d}l=u?l&-65537:l;if(!((i|r)!=0|m)){k=t;m=0;break h}b=!(i|r)+(t-k|0)|0;m=(b|0)<(m|0)?m:b;break h}h=I[j+48|0];break i}h=m>>>0>=2147483647?2147483647:m;l=h;n=(h|0)!=0;b=H[j+48>>2];k=b?b:1686;b=k;N:{O:{P:{Q:{if(!(b&3)|!h){break Q}while(1){if(!I[b|0]){break P}l=l-1|0;n=(l|0)!=0;b=b+1|0;if(!(b&3)){break Q}if(l){continue}break}}if(!n){break O}if(!(!I[b|0]|l>>>0<4)){while(1){n=H[b>>2];if(((16843008-n|n)&-2139062144)!=-2139062144){break P}b=b+4|0;l=l-4|0;if(l>>>0>3){continue}break}}if(!l){break O}}while(1){if(!I[b|0]){break N}b=b+1|0;l=l-1|0;if(l){continue}break}}b=0}b=b?b-k|0:h;n=b+k|0;if((m|0)>=0){l=i;m=b;break h}l=i;m=b;if(I[n|0]){break d}break h}h=H[j+48>>2];if(h|H[j+52>>2]){break x}h=0;break i}if(m){i=H[j+48>>2];break w}h=0;Na(a,32,p,0,l);break v}H[j+12>>2]=0;H[j+8>>2]=h;i=j+8|0;H[j+48>>2]=i;m=-1}h=0;while(1){R:{k=H[i>>2];if(!k){break R}k=oc(j+4|0,k);if((k|0)<0){break b}if(k>>>0>m-h>>>0){break R}i=i+4|0;h=h+k|0;if(m>>>0>h>>>0){continue}}break}n=61;if((h|0)<0){break c}Na(a,32,p,h,l);if(!h){h=0;break v}n=0;i=H[j+48>>2];while(1){k=H[i>>2];if(!k){break v}m=j+4|0;k=oc(m,k);n=k+n|0;if(n>>>0>h>>>0){break v}La(a,m,k);i=i+4|0;if(h>>>0>n>>>0){continue}break}}Na(a,32,p,h,l^8192);h=(h|0)<(p|0)?p:h;continue f}if((m|0)<0&u){break d}n=61;h=ra[f|0](a,M[j+48>>3],p,m,l,h)|0;if((h|0)>=0){continue f}break c}i=I[h+1|0];h=h+1|0;continue}}if(a){break a}if(!w){break g}h=1;while(1){a=H[(h<<2)+e>>2];if(a){qc((h<<3)+d|0,a,c,g);o=1;h=h+1|0;if((h|0)!=10){continue}break a}break}if(h>>>0>=10){o=1;break a}while(1){if(H[(h<<2)+e>>2]){break j}o=1;h=h+1|0;if((h|0)!=10){continue}break}break a}n=28;break c}F[j+39|0]=h;m=1;k=A;l=i}i=n-k|0;m=(i|0)<(m|0)?m:i;if((m|0)>(q^2147483647)){break d}n=61;b=m+q|0;h=(b|0)<(p|0)?p:b;if(y>>>0>>0){break c}Na(a,32,h,b,l);La(a,v,q);Na(a,48,h,b,l^65536);Na(a,48,m,i,0);La(a,k,i);Na(a,32,h,b,l^8192);b=H[j+60>>2];continue}break}break}o=0;break a}n=61}H[6597]=n}o=-1}na=j- -64|0;return o}function Pc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;i=na-80|0;na=i;H[i+76>>2]=1;a:{b:{if(H[a+128>>2]!=1|H[a+132>>2]!=1|(H[a+108>>2]|H[a+112>>2])){break b}j=H[a+100>>2];if(H[j>>2]|H[j+4>>2]|(H[j+8>>2]!=H[a+116>>2]|H[j+12>>2]!=H[a+120>>2])){break b}if(!cb(a,i+72|0,0,i+68|0,i- -64|0,i+60|0,i+56|0,i+52|0,i+76|0,b,c)){break a}c:{d:{if(!H[i+76>>2]){break d}if(!ib(a,H[i+72>>2],0,0,b,c)){break d}b=H[a+100>>2];if(H[b+16>>2]){break c}d=1;break a}Ba(c,1,8776,0);break a}e=H[b+24>>2];while(1){b=N(g,52);Ca(H[(b+e|0)+44>>2]);c=H[a+100>>2];e=H[c+24>>2];j=b+e|0;m=H[a+232>>2];d=H[H[H[m+20>>2]>>2]+20>>2]+N(g,76)|0;H[j+44>>2]=H[d+36>>2];H[j+36>>2]=H[(b+H[H[m+24>>2]+24>>2]|0)+36>>2];H[d+36>>2]=0;d=1;g=g+1|0;if(g>>>0>2]){continue}break}break a}H[a+80>>2]=0;H[a+84>>2]=0;Ca(H[a+88>>2]);H[a+88>>2]=0;e:{if(!(H[a+28>>2]|H[a+32>>2]|H[a+36>>2]!=H[a+128>>2])){j=2;if(H[a+40>>2]==H[a+132>>2]){break e}}j=2;if(H[a+76>>2]){break e}if(!Ab(b)){break e}q=H[a+128>>2];j=N(q,H[a+132>>2]);if(j){h=H[H[a+224>>2]+40>>2];f:{g:{if((j|0)==1){j=0;break g}k=j&1;n=j&-2;j=0;while(1){d=h+N(g,40)|0;f=H[d+4>>2];if(f){l=(H[d+16>>2]+N(f,24)|0)-8|0;f=H[l>>2];o=f;p=f>>>0>j>>>0;f=H[l+4>>2];l=p&(f|0)>=(m|0)|(f|0)>(m|0);j=l?o:j;m=l?f:m}f=H[d+44>>2];if(f){f=(H[d+56>>2]+N(f,24)|0)-8|0;d=H[f>>2];o=d;l=d>>>0>j>>>0;d=H[f+4>>2];f=l&(d|0)>=(m|0)|(d|0)>(m|0);j=f?o:j;m=f?d:m}g=g+2|0;e=e+2|0;if((n|0)!=(e|0)){continue}break}if(!k){break f}}d=h+N(g,40)|0;h=H[d+4>>2];if(!h){break f}h=(H[d+16>>2]+N(h,24)|0)-8|0;d=H[h>>2];f=d;k=d>>>0>j>>>0;d=H[h+4>>2];h=k&(d|0)>=(m|0)|(d|0)>(m|0);j=h?f:j;m=h?d:m}j=j+2|0;m=j>>>0<2?m+1|0:m}else{j=2;m=0}g=0;k=H[a+32>>2];p=H[a+40>>2];h:{if(k>>>0>=p>>>0){break h}h=H[a+28>>2];f=H[a+36>>2];if(h>>>0>=f>>>0){break h}n=f-h&3;s=H[H[a+224>>2]+40>>2];t=h-f>>>0>4294967292;while(1){l=s+N(N(k,q),40)|0;d=h;e=0;if(n){while(1){g=H[(l+N(d,40)|0)+4>>2]+g|0;d=d+1|0;e=e+1|0;if((n|0)!=(e|0)){continue}break}}if(!t){while(1){e=l+N(d,40)|0;g=H[e+124>>2]+(H[e+84>>2]+(H[e+44>>2]+(H[e+4>>2]+g|0)|0)|0)|0;d=d+4|0;if((f|0)!=(d|0)){continue}break}}k=k+1|0;if((p|0)!=(k|0)){continue}break}}f=Fa(g<<3);H[a+88>>2]=f;if(!g|!f){break e}g=0;d=H[a+40>>2];n=H[a+32>>2];i:{if(d>>>0<=n>>>0){break i}e=H[a+36>>2];if(e>>>0<=K[a+28>>2]){break i}while(1){f=H[a+28>>2];if(e>>>0>f>>>0){s=H[H[a+224>>2]+40>>2]+N(N(H[a+128>>2],n),40)|0;while(1){h=s+N(f,40)|0;d=H[h+4>>2];if(d){q=d&3;p=H[h+16>>2];h=0;j:{k:{if(d>>>0<4){d=0;break k}t=d&-4;d=0;k=0;while(1){e=p+N(d,24)|0;r=H[e+4>>2];l=g<<3;o=l+H[a+88>>2]|0;H[o>>2]=H[e>>2];H[o+4>>2]=r;r=H[e+28>>2];o=l+H[a+88>>2]|0;H[o+8>>2]=H[e+24>>2];H[o+12>>2]=r;r=H[e+52>>2];o=l+H[a+88>>2]|0;H[o+16>>2]=H[e+48>>2];H[o+20>>2]=r;o=H[e+76>>2];l=l+H[a+88>>2]|0;H[l+24>>2]=H[e+72>>2];H[l+28>>2]=o;d=d+4|0;g=g+4|0;k=k+4|0;if((t|0)!=(k|0)){continue}break}if(!q){break j}}while(1){k=p+N(d,24)|0;l=H[k+4>>2];e=H[a+88>>2]+(g<<3)|0;H[e>>2]=H[k>>2];H[e+4>>2]=l;d=d+1|0;g=g+1|0;h=h+1|0;if((q|0)!=(h|0)){continue}break}}e=H[a+36>>2]}f=f+1|0;if(e>>>0>f>>>0){continue}break}d=H[a+40>>2]}n=n+1|0;if(n>>>0>>0){continue}break}f=H[a+88>>2]}H[a+84>>2]=g;e=na-208|0;na=e;H[e+8>>2]=1;H[e+12>>2]=0;h=g<<3;l:{if(!h){break l}H[e+16>>2]=8;H[e+20>>2]=8;d=2;while(1){g=(e+16|0)+(d<<2)|0;k=H[g-4>>2]+(H[g-8>>2]+8|0)|0;H[g>>2]=k;d=d+1|0;if(h>>>0>k>>>0){continue}break}d=h-8|0;m:{if((d|0)<=0){g=0;h=1;d=1;k=0;break m}g=d+f|0;h=1;d=1;while(1){n:{if((h&3)==3){Bb(f,d,e+16|0);ub(e+8|0,2);d=d+2|0;break n}n=e+16|0;k=d-1|0;o:{if(K[n+(k<<2)>>2]>=g-f>>>0){tb(f,h,H[e+12>>2],d,0,n);break o}Bb(f,d,e+16|0)}if((d|0)==1){sb(e+8|0,1);d=0;break n}sb(e+8|0,k);d=1}h=H[e+8>>2]|1;H[e+8>>2]=h;f=f+8|0;if(g>>>0>f>>>0){continue}break}g=H[e+12>>2];k=(g|0)!=0}tb(f,h,g,d,0,e+16|0);h=H[e+8>>2];if(!(k|((d|0)!=1|(h|0)!=1))){break l}while(1){p:{if((d|0)<=1){h=wc(h,g);ub(e+8|0,h);d=d+h|0;break p}g=e+8|0;sb(g,2);H[e+8>>2]=H[e+8>>2]^7;ub(g,1);n=f-8|0;k=e+16|0;h=d-2|0;tb(n-H[k+(h<<2)>>2]|0,H[e+8>>2],H[e+12>>2],d-1|0,1,k);sb(g,1);d=H[e+8>>2]|1;H[e+8>>2]=d;tb(n,d,H[e+12>>2],h,1,k);d=h}f=f-8|0;g=H[e+12>>2];h=H[e+8>>2];if(g|((d|0)!=1|(h|0)!=1)){continue}break}}na=e+208|0}d=H[a+128>>2];e=0;q:{while(1){r:{if(!(!H[H[a+180>>2]+5596>>2]|((d|0)!=1|H[a+132>>2]!=1))){H[i+72>>2]=0;H[a+228>>2]=0;H[a+8>>2]=H[a+8>>2]|128;d=0;break r}d=0;if(!cb(a,i+72|0,0,i+68|0,i- -64|0,i+60|0,i+56|0,i+52|0,i+76|0,b,c)){break a}if(!H[i+76>>2]){break q}d=H[i+72>>2]}h=d+1|0;f=ib(a,d,0,0,b,c);g=N(H[a+128>>2],H[a+132>>2]);if(!f){H[i+4>>2]=g;H[i>>2]=h;Ba(c,1,7537,i);d=0;break a}H[i+36>>2]=g;H[i+32>>2]=h;Ba(c,4,11795,i+32|0);if(!Hc(H[a+232>>2],H[H[a+100>>2]+24>>2])){d=0;break a}s:{if(!(H[a+128>>2]!=1|H[a+132>>2]!=1)){g=H[a+100>>2];f=H[a+96>>2];if(H[g>>2]!=H[f>>2]|H[g+4>>2]!=H[f+4>>2]|(H[g+8>>2]!=H[f+8>>2]|H[g+12>>2]!=H[f+12>>2])){break s}}d=H[a+180>>2]+N(d,5644)|0;g=H[d+5596>>2];if(!g){break s}Ca(g);H[d+5596>>2]=0;H[d+5600>>2]=0}H[i+16>>2]=h;Ba(c,4,16601,i+16|0);if(!(Qa(b)|qa)&H[a+8>>2]==64){break q}e=e+1|0;d=H[a+128>>2];if((e|0)==(N(d,H[a+132>>2])|0)){break q}h=H[a+84>>2];if(!h|(h|0)!=H[a+80>>2]){continue}break}nc(b,j,m,c)}d=Gc(a,c)}na=i+80|0;return d|0}function Ya(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=H[a+32>>2];a:{if(d){break a}b:{h=H[a+16>>2];if((h|0)>=6){b=H[a+8>>2];f=H[a+12>>2];d=h;break b}b=H[a+20>>2];c:{d:{if((b|0)>=5){c=H[a>>2];d=H[c>>2];H[a>>2]=c+4;g=b-4|0;break d}if((b|0)<=0){d=-1;break c}c=H[a>>2];e:{if((b|0)==1){e=-1;b=0;break e}d=0;f:{g:{if((b|0)==2){e=-1;i=b;break g}f=b-1|0;k=f&1;j=f&-2;e=-1;i=b;while(1){f=c;H[a>>2]=c+1;l=I[c|0];c=c+2|0;H[a>>2]=c;H[a+20>>2]=i-1;f=I[f+1|0];i=i-2|0;H[a+20>>2]=i;e=((255<>2]=f;c=I[c|0];H[a+20>>2]=i-1;e=(255<>2]=c+1;d=(255<>2]=g}b=H[a+24>>2];c=d>>>24|0;H[a+24>>2]=(c|0)==255;g=d>>>16&255;k=(g|0)==255;f=d&255;e=(f|0)==255;j=b+e|0;b=d>>>8&255;i=(b|0)==255;j=k+(j+i|0)|0;d=(h-j|0)+32|0;H[a+16>>2]=d;l=H[a+12>>2];b=c|(g|(b|f<<(e?7:8))<<(i?7:8))<<(k?7:8);f=(j-h|0)+32|0;c=f&31;if((f&63)>>>0>=32){i=b<>>32-c;g=b<>2];c=i|l;f=c;H[a+8>>2]=b;H[a+12>>2]=c;if((d|0)>=6){break b}d=0;break a}e=H[a+28>>2];i=H[(e<<2)+20752>>2];h:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break h}g=b;h=63-i|0;c=h&31;if((h&63)>>>0>=32){g=f>>>c|0}else{g=((1<>>c}c=(g&(-1<>2]=d;H[a+28>>2]=e;g=b;h=i&31;if((i&63)>>>0>=32){b=b<>>32-h|f<>2]=g;H[a+12>>2]=b;i=H[a+44>>2]|c>>31;j=H[a+40>>2]&-64|c;H[a+40>>2]=j;H[a+44>>2]=i;if((d|0)<6){d=1;break a}b=H[(e<<2)+20752>>2];i:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break i}k=g;h=63-b|0;c=h&31;if((h&63)>>>0>=32){k=f>>>c|0}else{k=((1<>>c}c=(k&(-1<>2]=d;H[a+28>>2]=e;k=g;h=b&31;if((b&63)>>>0>=32){b=g<>>32-h|f<>2]=k;H[a+12>>2]=b;b=c>>31<<7|c>>>25|i;h=b;j=j&-8065|c<<7;H[a+40>>2]=j;H[a+44>>2]=b;if((d|0)<6){d=2;break a}b=H[(e<<2)+20752>>2];j:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break j}g=k;i=63-b|0;c=i&31;if((i&63)>>>0>=32){g=f>>>c|0}else{g=((1<>>c}c=(g&(-1<>2]=d;H[a+28>>2]=e;l=k;g=b&31;if((b&63)>>>0>=32){i=k<>>32-g|f<>2]=g;f=i;H[a+12>>2]=f;b=c>>31<<14|c>>>18|h;i=b;k=j&-1032193|c<<14;H[a+40>>2]=k;H[a+44>>2]=b;if((d|0)<6){d=3;break a}b=H[(e<<2)+20752>>2];k:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:e)+1|0;break k}j=g;h=63-b|0;c=h&31;if((h&63)>>>0>=32){j=f>>>c|0}else{j=((1<>>c}c=(j&(-1<>2]=d;H[a+28>>2]=e;j=g;h=b&31;if((b&63)>>>0>=32){b=g<>>32-h|f<>2]=g;H[a+12>>2]=b;b=c>>31<<21|c>>>11|i;j=b;k=k&-132120577|c<<21;H[a+40>>2]=k;H[a+44>>2]=b;if((d|0)<6){d=4;break a}b=H[(e<<2)+20752>>2];l:{if((f|0)<0){c=(-1<=11?11:e)+1|0;d=d-1|0;break l}h=g;i=63-b|0;c=i&31;if((i&63)>>>0>=32){i=f>>>c|0}else{i=((1<>>c}c=(i&(-1<>2]=d;H[a+28>>2]=h;i=g;e=b&31;if((b&63)>>>0>=32){b=g<>>32-e|f<>2]=g;f=b;H[a+12>>2]=b;b=j&-4|(c>>31<<28|c>>>4);j=b;k=k&268435455|c<<28;H[a+40>>2]=k;H[a+44>>2]=b;if((d|0)<6){d=5;break a}b=H[(h<<2)+20752>>2];m:{if((f|0)<0){e=(-1<=11?11:h)+1|0;i=d-1|0;break m}i=g;e=63-b|0;c=e&31;if((e&63)>>>0>=32){i=f>>>c|0}else{i=((1<>>c}e=(i&(-1<>2]=i;H[a+28>>2]=h;d=g;c=b&31;if((b&63)>>>0>=32){b=d<>>32-c|f<>2]=g;H[a+12>>2]=b;b=j&-505|e<<3;l=b;H[a+40>>2]=k;H[a+44>>2]=b;d=6;if((i|0)<6){break a}b=H[(h<<2)+20752>>2];n:{if((c|0)<0){e=(-1<=11?11:h)+1|0;d=i-1|0;break n}d=g;e=63-b|0;f=e&31;if((e&63)>>>0>=32){f=c>>>f|0}else{f=((1<>>f}e=(f&(-1<>2]=d;H[a+28>>2]=h;j=g;f=b&31;if((b&63)>>>0>=32){i=g<>>32-f|c<>2]=g;f=i;H[a+12>>2]=f;i=k;b=l&-64513|e<<10;k=b;H[a+40>>2]=i;H[a+44>>2]=b;if((d|0)<6){d=7;break a}b=H[(h<<2)+20752>>2];o:{if((f|0)<0){d=d-1|0;c=(-1<=11?11:h)+1|0;break o}j=g;e=63-b|0;c=e&31;if((e&63)>>>0>=32){j=f>>>c|0}else{j=((1<>>c}c=(j&(-1<>2]=d;H[a+28>>2]=e;d=g;e=b&31;if((b&63)>>>0>=32){b=d<>>32-e|f<>2]=g;H[a+12>>2]=b;H[a+40>>2]=i;H[a+44>>2]=k&-8257537|c<<17;d=8}H[a+32>>2]=d-1;f=H[a+44>>2];b=f>>>7|0;c=H[a+40>>2];H[a+40>>2]=(f&127)<<25|c>>>7;H[a+44>>2]=b;return c&127}function Ub(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0;p=na-32|0;na=p;H[p+24>>2]=f;r=H[(N(H[d+28>>2],76)+b|0)+28>>2]+N(H[d+32>>2],152)|0;a:{if(!(H[d+40>>2]|!H[r+24>>2])){k=r+28|0;while(1){b:{if(Qb(k)){break b}b=H[d+36>>2];if(b>>>0>=K[k+24>>2]/40>>>0){Ba(i,1,2836,0);break a}b=H[k+20>>2]+N(b,40)|0;fc(H[b+32>>2]);fc(H[b+36>>2]);o=N(H[b+20>>2],H[b+16>>2]);if(!o){break b}q=o&7;b=H[b+24>>2];if(o>>>0>=8){o=o&-8;j=0;while(1){H[b+516>>2]=0;H[b+520>>2]=0;H[b+448>>2]=0;H[b+452>>2]=0;H[b+380>>2]=0;H[b+384>>2]=0;H[b+312>>2]=0;H[b+316>>2]=0;H[b+244>>2]=0;H[b+248>>2]=0;H[b+176>>2]=0;H[b+180>>2]=0;H[b+108>>2]=0;H[b+112>>2]=0;H[b+40>>2]=0;H[b+44>>2]=0;b=b+544|0;j=j+8|0;if((o|0)!=(j|0)){continue}break}if(!q){break b}}j=0;while(1){H[b+40>>2]=0;H[b+44>>2]=0;b=b+68|0;j=j+1|0;if((q|0)!=(j|0)){continue}break}}k=k+36|0;n=n+1|0;if(n>>>0>2]){continue}break}}q=f;c:{if(!(I[c|0]&2)){break c}if(h>>>0<=5){Ba(i,2,4196,0);break c}if(!(I[f|0]==255&I[f+1|0]==145)){Ba(i,2,4238,0);break c}q=f+6|0;H[p+24>>2]=q}l=Fa(20);if(!l){break a}d:{if(F[a+108|0]&1){q=H[a+40>>2];o=a+44|0;h=a+40|0;break d}if(I[c+5640|0]&2){q=H[c+5168>>2];o=c+5180|0;h=c+5168|0;break d}H[p+28>>2]=(f+h|0)-q;o=p+28|0;h=p+24|0}a=H[o>>2];H[l+12>>2]=0;H[l+16>>2]=0;H[l+8>>2]=q;H[l>>2]=q;H[l+4>>2]=a+q;if(!Ra(l,1)){hc(l);a=ic(l);db(l);a=a+q|0;b=H[h>>2];d=H[o>>2];if(I[c|0]&4){if(b+(d-a|0)>>>0<=1){Ba(i,1,4422,0);break a}if(!(I[a|0]==255&I[a+1|0]==146)){Ba(i,1,4401,0);break a}a=a+2|0}a=a-b|0;H[o>>2]=d-a;H[h>>2]=a+b;H[e>>2]=0;H[g>>2]=H[p+24>>2]-f;x=1;break a}if(H[r+24>>2]){t=r+28|0;while(1){a=H[d+36>>2];b=H[t+20>>2];e:{if(Qb(t)){break e}u=b+N(a,40)|0;z=N(H[u+20>>2],H[u+16>>2]);if(!z){break e}k=H[u+24>>2];v=0;while(1){f:{g:{if(!H[k+40>>2]){a=dc(l,H[u+32>>2],v,H[d+40>>2]+1|0);break g}a=Ra(l,1)}if(!a){H[k+36>>2]=0;break f}if(!H[k+40>>2]){b=0;while(1){a=b;b=b+1|0;if(!dc(l,H[u+36>>2],v,a)){continue}break}b=H[t+28>>2];H[k+32>>2]=3;H[k+24>>2]=b;H[k+28>>2]=(b-a|0)+1}a=1;h:{if(!Ra(l,1)){break h}a=2;if(!Ra(l,1)){break h}a=Ra(l,2);if((a|0)!=3){a=a+3|0;break h}a=Ra(l,5);if((a|0)!=31){a=a+6|0;break h}a=Ra(l,7)+37|0}H[k+36>>2]=a;b=0;while(1){a=b;b=b+1|0;if(Ra(l,1)){continue}break}H[k+32>>2]=a+H[k+32>>2];i:{a=H[k+40>>2];j:{k:{if(!a){a=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];if(!H[k+48>>2]){b=Ha(H[k>>2],240);if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=10}j=H[k>>2];kb(j);b=a&4?1:a&1?10:109;a=0;break k}b=H[k>>2];n=a-1|0;j=b+N(n,24)|0;if(H[j+4>>2]!=H[j+12>>2]){break j}n=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];j=H[k+48>>2];if(j>>>0>>0){j=j+10|0;b=Ha(b,N(j,24));if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=j;b=H[k>>2]}j=N(a,24)+b|0;kb(j);b=1;l:{if(n&4){break l}b=109;if(!(n&1)){break l}b=H[j-12>>2];b=(b|0)==1?2:(b|0)==10?2:1}}n=a;H[j+12>>2]=b}a=H[k+36>>2];if(I[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16|0]&64){while(1){m=N(n,24);s=n?a:1;H[(m+H[k>>2]|0)+16>>2]=s;w=H[k+32>>2];j=0;b=a;if(s>>>0>=2){while(1){j=j+1|0;s=b>>>0>3;b=b>>>1|0;if(s){continue}break}}b=j+w|0;if(b>>>0>=33){H[p+16>>2]=b;Ba(i,1,15535,p+16|0);break i}j=Ra(l,b);b=H[k>>2];m=m+b|0;H[m+20>>2]=j;a=a-H[m+16>>2]|0;if((a|0)<=0){break f}j=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];m=H[k+48>>2];if(m>>>0>>0){m=m+10|0;b=Ha(b,N(m,24));if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=m;b=H[k>>2]}n=n+1|0;b=b+N(n,24)|0;kb(b);if(j&4){H[b+12>>2]=1;continue}if(j&1){j=b;b=H[b-12>>2];H[j+12>>2]=(b|0)==1?2:(b|0)==10?2:1}else{H[b+12>>2]=109}continue}}while(1){m=N(n,24);j=m+H[k>>2]|0;b=H[j+12>>2]-H[j+4>>2]|0;b=(a|0)>(b|0)?b:a;H[j+16>>2]=b;s=H[k+32>>2];j=0;if(b>>>0>=2){while(1){j=j+1|0;w=b>>>0>3;b=b>>>1|0;if(w){continue}break}}b=j+s|0;if(b>>>0>=33){H[p>>2]=b;Ba(i,1,15535,p);break i}j=Ra(l,b);b=H[k>>2];m=m+b|0;H[m+20>>2]=j;a=a-H[m+16>>2]|0;if((a|0)<=0){break f}j=H[(H[c+5584>>2]+N(H[d+28>>2],1080)|0)+16>>2];m=H[k+48>>2];if(m>>>0>>0){m=m+10|0;b=Ha(b,N(m,24));if(!b){break i}H[k>>2]=b;y(b+N(H[k+48>>2],24)|0,0,240);H[k+48>>2]=m;b=H[k>>2]}n=n+1|0;b=b+N(n,24)|0;kb(b);if(j&4){H[b+12>>2]=1;continue}if(j&1){j=b;b=H[b-12>>2];H[j+12>>2]=(b|0)==1?2:(b|0)==10?2:1}else{H[b+12>>2]=109}continue}}db(l);break a}k=k+68|0;v=v+1|0;if((z|0)!=(v|0)){continue}break}}t=t+36|0;A=A+1|0;if(A>>>0>2]){continue}break}}if(!hc(l)){db(l);break a}a=ic(l);db(l);b=a+q|0;a=H[h>>2];if(I[c|0]&4){if(a+(H[o>>2]-b|0)>>>0<=1){Ba(i,1,4422,0);break a}if(!(I[b|0]==255&I[b+1|0]==146)){Ba(i,1,4401,0);break a}b=b+2|0}if((a|0)==(b|0)){break a}H[o>>2]=H[o>>2]+(a-b|0);H[h>>2]=b;x=1;H[e>>2]=1;H[g>>2]=H[p+24>>2]-f}na=p+32|0;return x}function Gb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;a:{if(!c){break a}b:{e=H[a+184>>2];if(!e){break b}f=H[a+96>>2];if(!f|!H[f+16>>2]|(e|0)!=H[H[f+24>>2]+40>>2]){break b}f=H[c+16>>2];if(!f){break b}n=H[c+24>>2];if(H[n+40>>2]|H[n+44>>2]){break b}i=f&7;c:{if(f>>>0>=8){p=f&-8;while(1){f=N(h,52)+n|0;H[f+404>>2]=e;H[f+352>>2]=e;H[f+300>>2]=e;H[f+248>>2]=e;H[f+196>>2]=e;H[f+144>>2]=e;H[f+92>>2]=e;H[f+40>>2]=e;h=h+8|0;g=g+8|0;if((g|0)!=(p|0)){continue}break}if(!i){break c}}while(1){H[(N(h,52)+n|0)+40>>2]=e;h=h+1|0;j=j+1|0;if((i|0)!=(j|0)){continue}break}}e=0;p=0;n=na-32|0;na=n;v=H[c+16>>2];d:{if(!v){e=1;break d}h=H[c>>2];f=h>>31;q=f;e:{if((f|0)<0){break e}i=H[c+4>>2];f=i>>31;m=f;if((f|0)<0){break e}g=H[c+8>>2];f=g>>31;s=f;if((f|0)<0){break e}j=H[c+12>>2];r=j>>31;if((r|0)<0){break e}f=H[c+24>>2];y=h-1|0;w=q-!h|0;z=i-1|0;x=m-!i|0;A=g-1|0;B=s-!g|0;C=j-1|0;D=r-!j|0;while(1){e=H[f>>2];h=e+y|0;i=e>>>0>h>>>0?w+1|0:w;j=ve(h,i,e,0);H[f+16>>2]=j;i=H[f+4>>2];h=i+z|0;g=i>>>0>h>>>0?x+1|0:x;r=ve(h,g,i,0);H[f+20>>2]=r;h=H[f+40>>2];g=h&31;if((h&63)>>>0>=32){q=1<>>32-g}s=m-1|0;g=q-!m|0;u=g;t=e>>31;l=t+B|0;o=l+1|0;g=l;l=e+A|0;g=ue(l,l>>>0>>0?o:g,e,t);e=u+(g>>31)|0;o=e+1|0;l=e;e=g+s|0;t=g>>>0>e>>>0?o:l;g=h&31;l=(j>>31)+u|0;E=l+1|0;o=l;l=j+s|0;j=j>>>0>l>>>0?E:o;if((h&63)>>>0>=32){g=t>>g}else{g=((1<>>g}e=h&31;if((h&63)>>>0>=32){e=j>>e}else{e=((1<>>e}e=g-e|0;if((e|0)<0){H[n+4>>2]=e;H[n>>2]=p;Ba(d,1,13510,n);e=0;break d}H[f+8>>2]=e;e=i>>31;g=e+D|0;o=g+1|0;l=g;g=i+C|0;j=g>>>0>>0?o:l;i=ue(g,j,i,e);e=(i>>31)+u|0;g=e+1|0;l=e;e=i+s|0;g=i>>>0>e>>>0?g:l;i=h&31;j=q+(r>>31)|0;o=j+1|0;l=j;j=m+r|0;q=j>>>0>>0?o:l;m=j-1|0;if((h&63)>>>0>=32){l=g>>i}else{l=((1<>>i}i=q-!j|0;e=h&31;if((h&63)>>>0>=32){m=i>>e}else{m=((1<>>e}e=l-m|0;if((e|0)<0){H[n+20>>2]=e;H[n+16>>2]=p;Ba(d,1,13579,n+16|0);e=0;break d}H[f+12>>2]=e;f=f+52|0;e=1;p=p+1|0;if((v|0)!=(p|0)){continue}break}break d}Ba(d,1,6720,0)}na=n+32|0;if(e){break b}return 0}e=H[a+100>>2];if(!e){e=Eb();H[a+100>>2]=e;if(!e){break a}}Ec(c,e);if(!Wa(H[a+216>>2],22,d)){break a}h=H[a+216>>2];f=H[h>>2];e=H[h+8>>2];f:{if(f){k=1;g:{if((f|0)!=1){n=f&1;i=f&-2;f=0;while(1){m=0;h:{if(!k){break h}m=0;if(!(ra[H[e>>2]](a,b,d)|0)){break h}m=(ra[H[e+4>>2]](a,b,d)|0)!=0}k=m;e=e+8|0;f=f+2|0;if((i|0)!=(f|0)){continue}break}if(!n){break g}}if(!k){k=0;break g}k=(ra[H[e>>2]](a,b,d)|0)!=0}Pa(h);if(k){break f}Ua(H[a+96>>2]);H[a+96>>2]=0;return 0}Pa(h)}f=0;b=0;d=0;i:{j:{k:{e=H[a+60>>2];if(!e){if(H[c+16>>2]){break k}k=1;break i}h=Fa(N(e,52));if(!h){break j}e=0;if(H[c+16>>2]){b=H[c+24>>2];while(1){e=N(d,52);Ca(H[(e+b|0)+44>>2]);b=H[c+24>>2];H[(e+b|0)+44>>2]=0;d=d+1|0;e=H[c+16>>2];if(d>>>0>>0){continue}break}}if(H[a+60>>2]){d=H[H[a+100>>2]+24>>2];e=0;while(1){b=h+N(e,52)|0;f=N(H[H[a+64>>2]+(e<<2)>>2],52);d=f+d|0;H[b+48>>2]=H[d+48>>2];k=H[d+44>>2];H[b+40>>2]=H[d+40>>2];H[b+44>>2]=k;k=H[d+36>>2];H[b+32>>2]=H[d+32>>2];H[b+36>>2]=k;k=H[d+28>>2];H[b+24>>2]=H[d+24>>2];H[b+28>>2]=k;k=H[d+20>>2];H[b+16>>2]=H[d+16>>2];H[b+20>>2]=k;k=H[d+12>>2];H[b+8>>2]=H[d+8>>2];H[b+12>>2]=k;k=H[d+4>>2];H[b>>2]=H[d>>2];H[b+4>>2]=k;d=H[H[a+100>>2]+24>>2];f=f+d|0;H[b+36>>2]=H[f+36>>2];H[b+44>>2]=H[f+44>>2];H[f+44>>2]=0;e=e+1|0;f=H[a+60>>2];if(e>>>0>>0){continue}break}e=H[c+16>>2]}if(e){b=H[H[a+100>>2]+24>>2];d=0;while(1){e=N(d,52);Ca(H[(e+b|0)+44>>2]);b=H[H[a+100>>2]+24>>2];H[(e+b|0)+44>>2]=0;d=d+1|0;if(d>>>0>2]){continue}break}f=H[a+60>>2]}H[c+16>>2]=f;Ca(H[c+24>>2]);H[c+24>>2]=h;k=1;break i}e=H[c+24>>2];d=H[H[a+100>>2]+24>>2];while(1){f=N(b,52);e=f+e|0;H[e+36>>2]=H[(d+f|0)+36>>2];Ca(H[e+44>>2]);e=H[c+24>>2];m=f+e|0;d=H[H[a+100>>2]+24>>2];f=f+d|0;H[m+44>>2]=H[f+44>>2];H[f+44>>2]=0;b=b+1|0;if(b>>>0>2]){continue}break}k=1;break i}Ua(H[a+96>>2]);H[a+96>>2]=0;k=0}}return k|0}function zb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=(c<<2)+b|0;e=H[a>>2];f=H[a+12>>2]<<5;i=e+f|0;l=e-f|0;e=H[a+16>>2];k=H[a+28>>2];h=H[a+20>>2];m=H[a+8>>2];a:{b:{if(i&15|(b&15|d>>>0<8)){if(e>>>0>=h>>>0){break a}c:{switch(d-1|0){case 1:f=e+1|0;if(h-e&1){j=i+(e<<6)|0;e=(e<<2)+b|0;L[j>>2]=L[e>>2];L[j+4>>2]=L[e+(c<<2)>>2];e=f}if((f|0)==(h|0)){break a}while(1){f=i+(e<<6)|0;j=(e<<2)+b|0;L[f>>2]=L[j>>2];g=f;f=c<<2;L[g+4>>2]=L[f+j>>2];j=e+1|0;g=i+(j<<6)|0;j=(j<<2)+b|0;L[g>>2]=L[j>>2];L[g+4>>2]=L[f+j>>2];e=e+2|0;if((h|0)!=(e|0)){continue}break};break a;case 0:break c;default:break b}}f=e;g=h-e&3;if(g){j=0;while(1){L[i+(f<<6)>>2]=L[(f<<2)+b>>2];f=f+1|0;j=j+1|0;if((g|0)!=(j|0)){continue}break}}if(e-h>>>0>4294967292){break a}while(1){L[i+(f<<6)>>2]=L[(f<<2)+b>>2];e=f+1|0;L[i+(e<<6)>>2]=L[(e<<2)+b>>2];e=f+2|0;L[i+(e<<6)>>2]=L[(e<<2)+b>>2];e=f+3|0;L[i+(e<<6)>>2]=L[(e<<2)+b>>2];f=f+4|0;if((h|0)!=(f|0)){continue}break}break a}if(e>>>0>=h>>>0){break a}while(1){f=i+(e<<6)|0;L[f>>2]=L[(e<<2)+b>>2];g=c+e|0;L[f+4>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+8>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+12>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+16>>2]=L[(g<<2)+b>>2];g=c+g<<2;L[f+20>>2]=L[g+b>>2];g=g+j|0;L[f+24>>2]=L[g>>2];L[f+28>>2]=L[g+(c<<2)>>2];e=e+1|0;if((h|0)!=(e|0)){continue}break}break a}while(1){f=i+(e<<6)|0;L[f>>2]=L[(e<<2)+b>>2];g=c+e|0;L[f+4>>2]=L[(g<<2)+b>>2];g=c+g|0;L[f+8>>2]=L[(g<<2)+b>>2];d:{if((d|0)==3){break d}g=c+g|0;L[f+12>>2]=L[(g<<2)+b>>2];if((d|0)==4){break d}g=c+g|0;L[f+16>>2]=L[(g<<2)+b>>2];if((d|0)==5){break d}g=c+g|0;L[f+20>>2]=L[(g<<2)+b>>2];if((d|0)==6){break d}g=j+(g<<2)|0;L[f+24>>2]=L[g>>2];if((d|0)==7){break d}L[f+28>>2]=L[g+(c<<2)>>2]}e=e+1|0;if((h|0)!=(e|0)){continue}break}}b=(m<<2)+b|0;f=b+(c<<2)|0;e=H[a+24>>2];i=l+32|0;e:{if(i&15|(b&15|d>>>0<8)){if(e>>>0>=k>>>0){break e}f:{switch(d-1|0){case 1:a=e+1|0;if(k-e&1){d=i+(e<<6)|0;e=b+(e<<2)|0;L[d>>2]=L[e>>2];L[d+4>>2]=L[e+(c<<2)>>2];e=a}if((a|0)==(k|0)){break e}while(1){a=i+(e<<6)|0;d=b+(e<<2)|0;L[a>>2]=L[d>>2];f=a;a=c<<2;L[f+4>>2]=L[a+d>>2];d=e+1|0;f=i+(d<<6)|0;d=b+(d<<2)|0;L[f>>2]=L[d>>2];L[f+4>>2]=L[a+d>>2];e=e+2|0;if((k|0)!=(e|0)){continue}break};break e;case 0:c=e;a=k-e&3;if(a){f=0;while(1){L[i+(c<<6)>>2]=L[b+(c<<2)>>2];c=c+1|0;f=f+1|0;if((a|0)!=(f|0)){continue}break}}if(e-k>>>0>4294967292){break e}while(1){L[i+(c<<6)>>2]=L[b+(c<<2)>>2];a=c+1|0;L[i+(a<<6)>>2]=L[b+(a<<2)>>2];a=c+2|0;L[i+(a<<6)>>2]=L[b+(a<<2)>>2];a=c+3|0;L[i+(a<<6)>>2]=L[b+(a<<2)>>2];c=c+4|0;if((k|0)!=(c|0)){continue}break};break e;default:break f}}while(1){a=i+(e<<6)|0;L[a>>2]=L[b+(e<<2)>>2];h=c+e|0;L[a+4>>2]=L[b+(h<<2)>>2];h=c+h|0;L[a+8>>2]=L[b+(h<<2)>>2];g:{if((d|0)==3){break g}h=c+h|0;L[a+12>>2]=L[b+(h<<2)>>2];if((d|0)==4){break g}h=c+h|0;L[a+16>>2]=L[b+(h<<2)>>2];if((d|0)==5){break g}h=c+h|0;L[a+20>>2]=L[b+(h<<2)>>2];if((d|0)==6){break g}h=f+(h<<2)|0;L[a+24>>2]=L[h>>2];if((d|0)==7){break g}L[a+28>>2]=L[h+(c<<2)>>2]}e=e+1|0;if((k|0)!=(e|0)){continue}break}break e}if(e>>>0>=k>>>0){break e}while(1){a=i+(e<<6)|0;L[a>>2]=L[b+(e<<2)>>2];d=c+e|0;L[a+4>>2]=L[b+(d<<2)>>2];d=c+d|0;L[a+8>>2]=L[b+(d<<2)>>2];d=c+d|0;L[a+12>>2]=L[b+(d<<2)>>2];d=c+d|0;L[a+16>>2]=L[b+(d<<2)>>2];d=c+d<<2;L[a+20>>2]=L[d+b>>2];d=d+f|0;L[a+24>>2]=L[d>>2];L[a+28>>2]=L[d+(c<<2)>>2];e=e+1|0;if((k|0)!=(e|0)){continue}break}}}function Ib(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=na-176|0;na=f;a:{if(b&384){Ac(5943,11,c);break a}b:{if(!(b&1)){break b}g=H[a+96>>2];if(!g){break b}d=na-80|0;na=d;Ac(1792,13,c);F[d+79|0]=0;F[d+78|0]=9;e=H[g+4>>2];H[d+68>>2]=H[g>>2];H[d+72>>2]=e;e=d+78|0;H[d+64>>2]=e;Ga(c,7520,d- -64|0);i=H[g+12>>2];H[d+52>>2]=H[g+8>>2];H[d+56>>2]=i;H[d+48>>2]=e;Ga(c,7503,d+48|0);H[d+36>>2]=H[g+16>>2];H[d+32>>2]=e;Ga(c,7277,d+32|0);if(!(!H[g+24>>2]|!H[g+16>>2])){while(1){l=d+78|0;H[d+16>>2]=l;H[d+20>>2]=j;Ga(c,1824,d+16|0);i=H[g+24>>2];e=na-48|0;na=e;F[e+46|0]=9;F[e+47|0]=0;F[e+45|0]=9;i=N(j,52)+i|0;k=H[i+4>>2];H[e+36>>2]=H[i>>2];H[e+40>>2]=k;k=e+45|0;H[e+32>>2]=k;Ga(c,7209,e+32|0);H[e+20>>2]=H[i+24>>2];H[e+16>>2]=k;Ga(c,7455,e+16|0);H[e+4>>2]=H[i+32>>2];H[e>>2]=k;Ga(c,7428,e);na=e+48|0;H[d>>2]=l;Ga(c,1702,d);j=j+1|0;if(j>>>0>2]){continue}break}}Ac(1710,2,c);na=d+80|0}if(!(!(b&2)|!H[a+96>>2])){Ac(1931,36,c);d=H[a+112>>2];H[f+160>>2]=H[a+108>>2];H[f+164>>2]=d;Ga(c,2425,f+160|0);d=H[a+120>>2];H[f+144>>2]=H[a+116>>2];H[f+148>>2]=d;Ga(c,2391,f+144|0);d=H[a+132>>2];H[f+128>>2]=H[a+128>>2];H[f+132>>2]=d;Ga(c,2409,f+128|0);Hb(H[a+12>>2],H[H[a+96>>2]+16>>2],c);Ac(1710,2,c)}c:{if(!(b&8)|!H[a+96>>2]){break c}e=N(H[a+128>>2],H[a+132>>2]);if(!e){break c}d=H[a+180>>2];while(1){Hb(d,H[H[a+96>>2]+16>>2],c);d=d+5644|0;h=h+1|0;if((e|0)!=(h|0)){continue}break}}if(!(b&16)){break a}a=H[a+224>>2];Ac(1893,37,c);b=H[a>>2];d=H[a+4>>2];e=H[a+12>>2];H[f+120>>2]=H[a+8>>2];H[f+124>>2]=e;H[f+112>>2]=b;H[f+116>>2]=d;Ga(c,5730,f+112|0);Ac(1875,17,c);if(!(!H[a+28>>2]|!H[a+24>>2])){d=0;while(1){b=H[a+28>>2]+N(d,24)|0;e=J[b>>1];h=H[b+8>>2];g=H[b+12>>2];H[f+96>>2]=H[b+16>>2];H[f+88>>2]=h;H[f+92>>2]=g;H[f+80>>2]=e;Ga(c,7397,f+80|0);d=d+1|0;if(d>>>0>2]){continue}break}}Ac(1708,4,c);e=H[a+40>>2];d:{if(!e){break d}g=H[a+36>>2];if(!g){break d}h=0;d=0;while(1){b=e+N(d,40)|0;j=H[b+4>>2];e:{if(!j){break e}b=H[b+16>>2];if(!b){break e}i=H[b>>2];k=H[b+4>>2];if((k|0)<0){i=1}else{i=!i&(k|0)<=0}if(i|(H[b+8>>2]|H[b+12>>2])){break e}if(xc(1439)){break d}}h=h+j|0;d=d+1|0;if((g|0)!=(d|0)){continue}break}if(!h){break d}Ac(1858,16,c);if(H[a+36>>2]){h=H[a+40>>2];g=0;while(1){b=N(g,40);j=H[(b+h|0)+4>>2];H[f+68>>2]=j;H[f+64>>2]=g;Ga(c,7467,f- -64|0);h=H[a+40>>2];f:{if(!j){break f}d=0;if(!H[(b+h|0)+16>>2]){break f}while(1){e=H[(b+H[a+40>>2]|0)+16>>2]+N(d,24)|0;h=H[e>>2];i=H[e+4>>2];k=H[e+8>>2];l=H[e+12>>2];m=H[e+20>>2];H[f+56>>2]=H[e+16>>2];H[f+60>>2]=m;H[f+48>>2]=k;H[f+52>>2]=l;H[f+40>>2]=h;H[f+44>>2]=i;H[f+32>>2]=d;Ga(c,10938,f+32|0);d=d+1|0;if((j|0)!=(d|0)){continue}break}h=H[a+40>>2]}e=b+h|0;g:{if(!H[e+24>>2]){break g}d=0;if(!H[e+20>>2]){break g}while(1){e=H[(b+h|0)+24>>2]+N(d,24)|0;h=J[e>>1];j=H[e+8>>2];i=H[e+12>>2];H[f+16>>2]=H[e+16>>2];H[f+8>>2]=j;H[f+12>>2]=i;H[f>>2]=h;Ga(c,7397,f);d=d+1|0;h=H[a+40>>2];if(d>>>0>2]){continue}break}}g=g+1|0;if(g>>>0>2]){continue}break}}Ac(1708,4,c)}Ac(1710,2,c)}na=f+176|0}function oe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=na-128|0;na=e;H[e+120>>2]=0;a:{if((c|0)!=8){Ba(d,1,4047,0);Ba(d,1,4047,0);break a}Da(b,a+228|0,2);Da(b+2|0,e+124|0,4);Da(b+6|0,e+116|0,1);Da(b+7|0,e+120|0,1);c=H[a+228>>2];i=H[a+128>>2];if(c>>>0>=N(i,H[a+132>>2])>>>0){H[e+112>>2]=c;Ba(d,1,7843,e+112|0);break a}f=H[a+180>>2]+N(c,5644)|0;h=(c>>>0)/(i>>>0)|0;b=H[e+116>>2];b:{g=H[a+44>>2];if((g|0)>=0&(c|0)!=(g|0)){break b}g=H[f+5588>>2]+1|0;if((g|0)==(b|0)){break b}H[e+104>>2]=g;H[e+100>>2]=b;H[e+96>>2]=c;Ba(d,1,7867,e+96|0);f=0;break a}H[f+5588>>2]=b;c:{b=H[e+124>>2];if(b-1>>>0<=12){if((b|0)!=12){break c}H[e+64>>2]=12;Ba(d,2,11864,e- -64|0);b=H[e+124>>2]}if(!b){Ba(d,4,10695,0);H[a+56>>2]=1}d:{e:{f:{g:{b=H[f+5592>>2];if(b){g=H[e+116>>2];if(g>>>0>>0){break g}H[e+52>>2]=b;H[e+48>>2]=g;Ba(d,1,5150,e+48|0);H[a+56>>2]=1;f=0;break a}g=H[e+120>>2];if(g){break f}break d}g=H[e+120>>2];if(!g){break e}}b=(I[a+92|0]>>>4&1)+g|0;H[e+120>>2]=b;g=H[e+116>>2];j=H[f+5592>>2];if(g>>>0>j-1>>>0){H[e+20>>2]=j;H[e+16>>2]=g;Ba(d,1,5051,e+16|0);H[a+56>>2]=1;f=0;break a}if(b>>>0<=g>>>0){H[e+36>>2]=b;H[e+32>>2]=g;Ba(d,1,5250,e+32|0);H[a+56>>2]=1;f=0;break a}H[f+5592>>2]=b}if((H[e+116>>2]+1|0)!=(b|0)){break d}F[a+92|0]=I[a+92|0]|1}b=H[e+124>>2];H[a+8>>2]=16;H[a+24>>2]=H[a+56>>2]?0:b-12|0;f=H[a+44>>2];h:{if((f|0)==-1){f=4;b=c-N(h,i)|0;if(!(b>>>0>2]|b>>>0>=K[a+36>>2]|h>>>0>2])){f=h>>>0>=K[a+40>>2]?4:0}F[a+92|0]=I[a+92|0]&251|f;b=H[a+228>>2];break h}b=H[a+228>>2];F[a+92|0]=I[a+92|0]&251|((f|0)!=(b|0)?4:0)}c=H[H[a+224>>2]+40>>2]+N(b,40)|0;H[c>>2]=b;H[c+12>>2]=H[e+116>>2];f=H[e+120>>2];if(!H[a+76>>2]){if(K[c+4>>2]>=f>>>0){f=1;break a}H[e>>2]=b;Ba(d,2,1612,e);H[a+76>>2]=1;f=H[e+120>>2]}c=H[H[a+224>>2]+40>>2];b=H[a+228>>2];h=c+N(b,40)|0;if(f){H[h+4>>2]=f;b=H[e+120>>2];H[h+8>>2]=b;c=H[h+16>>2];if(!c){b=Ea(b,24);H[(H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0)+16>>2]=b;if(b){f=1;break a}f=0;Ba(d,1,6947,0);break a}b=Ha(c,N(b,24));c=H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0;if(!b){Ca(H[c+16>>2]);f=0;H[(H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0)+16>>2]=0;Ba(d,1,6947,0);break a}H[c+16>>2]=b;f=1;break a}i:{g=H[h+16>>2];if(g){break i}H[h+8>>2]=10;g=Ea(10,24);c=H[H[a+224>>2]+40>>2];b=H[a+228>>2];h=c+N(b,40)|0;H[h+16>>2]=g;if(g){break i}f=0;H[h+8>>2]=0;Ba(d,1,6947,0);break a}f=1;b=N(b,40)+c|0;c=H[e+116>>2];if(K[b+8>>2]>c>>>0){break a}h=b;b=c+1|0;H[h+8>>2]=b;b=Ha(g,N(b,24));c=H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0;if(!b){Ca(H[c+16>>2]);f=0;a=H[H[a+224>>2]+40>>2]+N(H[a+228>>2],40)|0;H[a+8>>2]=0;H[a+16>>2]=0;Ba(d,1,6947,0);break a}H[c+16>>2]=b;break a}H[e+80>>2]=b;Ba(d,1,12133,e+80|0);f=0}na=e+128|0;return f|0}function nb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;f=H[a+8>>2];e=f+H[a+4>>2]|0;a:{if(!H[a+12>>2]){if((e|0)<2|(d|0)<=0){break a}q=e&2147483644;m=e&3;r=e&1;s=f+1|0;g=H[a>>2];o=g+(e<<2)|0;t=e-4>>>1|0;a=e-1|0;u=g+(a<<2)|0;v=N(c,f)<<2;l=e>>>0<4;w=N(a>>>1|0,c)<<2;while(1){f=H[b+v>>2];e=H[b>>2]-(f+1>>1)|0;h=0;a=0;if(!l){while(1){j=a+1|0;x=H[(N(j,c)<<2)+b>>2];i=H[(N(a+s|0,c)<<2)+b>>2];p=g+(h<<2)|0;H[p>>2]=e;k=e;e=x-((f+i|0)+2>>2)|0;H[p+4>>2]=(k+e>>1)+f;h=h+2|0;k=(a|0)!=(t|0);f=i;a=j;if(k){continue}break}}H[g+(h<<2)>>2]=e;if(r){a=H[b+w>>2]-(f+1>>1)|0;H[u>>2]=a;e=a+e>>1;a=-8}else{a=-4}H[a+o>>2]=e+f;f=0;a=0;h=0;e=0;b:{if(!l){while(1){H[(N(a,c)<<2)+b>>2]=H[g+(a<<2)>>2];e=a|1;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];e=a|2;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];e=a|3;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];a=a+4|0;h=h+4|0;if((q|0)!=(h|0)){continue}break}e=a;if(!m){break b}}while(1){H[(N(c,e)<<2)+b>>2]=H[g+(e<<2)>>2];e=e+1|0;f=f+1|0;if((m|0)!=(f|0)){continue}break}}b=b+4|0;n=n+1|0;if((n|0)!=(d|0)){continue}break}break a}c:{switch(e-1|0){case 0:if((d|0)<=0){break a}a=d&3;if(d>>>0>=4){d=d&2147483644;c=0;while(1){H[b>>2]=H[b>>2]/2;H[b+4>>2]=H[b+4>>2]/2;H[b+8>>2]=H[b+8>>2]/2;H[b+12>>2]=H[b+12>>2]/2;b=b+16|0;c=c+4|0;if((d|0)!=(c|0)){continue}break}if(!a){break a}}c=0;while(1){H[b>>2]=H[b>>2]/2;b=b+4|0;c=c+1|0;if((a|0)!=(c|0)){continue}break};break a;case 1:if((d|0)<=0){break a}a=H[a>>2];e=0;f=N(c,f)<<2;while(1){i=b+f|0;j=H[b>>2]-(H[i>>2]+1>>1)|0;H[a+4>>2]=j;i=j+H[i>>2]|0;H[a>>2]=i;H[b>>2]=i;H[(c<<2)+b>>2]=H[a+4>>2];b=b+4|0;e=e+1|0;if((e|0)!=(d|0)){continue}break};break a;default:break c}}if((e|0)<3|(d|0)<=0){break a}q=e&2147483644;m=e&3;g=H[a>>2];r=(g+(e<<2)|0)-4|0;a=e-2|0;s=g+(a<<2)|0;o=e&1;i=!o;t=((e-i|0)-4>>>1|0)+1|0;u=N(c,f)<<2;v=a-i>>>0<2;w=N((e>>>1|0)-1|0,c)<<2;x=e-1>>>0<3;while(1){l=b+u|0;f=H[l+(c<<2)>>2];a=H[l>>2];e=H[b>>2]-((f+a|0)+2>>2)|0;H[g>>2]=e+a;h=1;a=1;if(!v){while(1){p=H[(N(a,c)<<2)+b>>2];j=a+1|0;i=H[l+(N(j,c)<<2)>>2];y=g+(h<<2)|0;H[y>>2]=e;k=e;e=p-((f+i|0)+2>>2)|0;H[y+4>>2]=(k+e>>1)+f;h=h+2|0;k=(a|0)!=(t|0);a=j;f=i;if(k){continue}break}}H[g+(h<<2)>>2]=e;d:{if(!o){a=H[b+w>>2]-(f+1>>1)|0;H[s>>2]=(e+a>>1)+f;break d}a=e+f|0}H[r>>2]=a;f=0;a=0;h=0;e=0;e:{if(!x){while(1){H[(N(a,c)<<2)+b>>2]=H[g+(a<<2)>>2];e=a|1;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];e=a|2;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];e=a|3;H[(N(e,c)<<2)+b>>2]=H[g+(e<<2)>>2];a=a+4|0;h=h+4|0;if((q|0)!=(h|0)){continue}break}e=a;if(!m){break e}}while(1){H[(N(c,e)<<2)+b>>2]=H[g+(e<<2)>>2];e=e+1|0;f=f+1|0;if((m|0)!=(f|0)){continue}break}}b=b+4|0;n=n+1|0;if((n|0)!=(d|0)){continue}break}}}function Xb(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a:{n=N(e,3);h=H[b>>2]>>>n|0;if(h&2097168){break a}h=h&495;if(!h){break a}o=a+28|0;l=o+(I[h+H[a+108>>2]|0]<<2)|0;H[a+104>>2]=l;k=H[l>>2];i=H[k>>2];h=H[a+4>>2]-i|0;H[a+4>>2]=h;j=H[a>>2];b:{if(j>>>16>>>0>>0){m=H[k+4>>2];H[a+4>>2]=i;h=h>>>0>>0;H[l>>2]=H[k+(h?8:12)>>2];k=h?m:!m;h=H[a+8>>2];while(1){c:{if(h){break c}h=H[a+16>>2];m=h+1|0;l=I[h+1|0];if(I[h|0]==255){if(l>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;h=8;break c}H[a+16>>2]=m;j=(l<<9)+j|0;h=7;break c}H[a+16>>2]=m;h=8;j=(l<<8)+j|0}h=h-1|0;H[a+8>>2]=h;j=j<<1;H[a>>2]=j;i=i<<1;H[a+4>>2]=i;if(i>>>0<32768){continue}break}h=i;break b}j=j-(i<<16)|0;H[a>>2]=j;if(!(h&32768)){m=H[k+4>>2];i=h>>>0>>0;H[l>>2]=H[k+(i?12:8)>>2];k=i?!m:m;i=H[a+8>>2];while(1){d:{if(i){break d}i=H[a+16>>2];m=i+1|0;l=I[i+1|0];if(I[i|0]==255){if(l>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;i=8;break d}H[a+16>>2]=m;j=(l<<9)+j|0;i=7;break d}H[a+16>>2]=m;i=8;j=(l<<8)+j|0}i=i-1|0;H[a+8>>2]=i;j=j<<1;H[a>>2]=j;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}break b}k=H[k+4>>2]}e:{if(!k){break e}p=b-4|0;i=H[b>>2];k=H[b+4>>2]>>>n+17&4|(H[p>>2]>>>n+19&1|(i>>>n+16&64|i>>>n&170|i>>>(e?n+12|0:14)&16));m=o+(I[k+24384|0]<<2)|0;H[a+104>>2]=m;l=H[m>>2];i=H[l>>2];h=h-i|0;H[a+4>>2]=h;o=I[k+24640|0];f:{if(j>>>16>>>0>>0){k=H[l+4>>2];H[a+4>>2]=i;h=h>>>0>>0;H[m>>2]=H[l+(h?8:12)>>2];l=h?k:!k;h=H[a+8>>2];while(1){g:{if(h){break g}h=H[a+16>>2];m=h+1|0;k=I[h+1|0];if(I[h|0]==255){if(k>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;h=8;break g}H[a+16>>2]=m;j=(k<<9)+j|0;h=7;break g}H[a+16>>2]=m;h=8;j=(k<<8)+j|0}h=h-1|0;H[a+8>>2]=h;j=j<<1;H[a>>2]=j;i=i<<1;H[a+4>>2]=i;if(i>>>0<32768){continue}break}break f}k=j-(i<<16)|0;H[a>>2]=k;if(!(h&32768)){j=H[l+4>>2];i=h>>>0>>0;H[m>>2]=H[l+(i?12:8)>>2];l=i?!j:j;j=H[a+8>>2];while(1){h:{if(j){break h}j=H[a+16>>2];m=j+1|0;i=I[j+1|0];if(I[j|0]==255){if(i>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;k=k+65280|0;j=8;break h}H[a+16>>2]=m;k=(i<<9)+k|0;j=7;break h}H[a+16>>2]=m;j=8;k=(i<<8)+k|0}j=j-1|0;H[a+8>>2]=j;k=k<<1;H[a>>2]=k;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}break f}l=H[l+4>>2]}H[c>>2]=(l|0)==(o|0)?d:0-d|0;H[p>>2]=H[p>>2]|32<>2]=H[b>>2]|(c<<19|16)<>2]=H[b+4>>2]|8<>2]=H[a+4>>2]|32768;H[a>>2]=H[a>>2]|c<<31|65536;a=a-4|0;H[a>>2]=H[a>>2]|131072}if((e|0)!=3){break e}a=(f<<2)+b|0;H[a+4>>2]=H[a+4>>2]|1;H[a>>2]=H[a>>2]|c<<18|2;a=a-4|0;H[a>>2]=H[a>>2]|4}H[b>>2]=H[b>>2]|2097152<>2]>>>m|0;if(g&2097168){break a}n=a+28|0;k=n+(I[H[a+108>>2]+(g&495)|0]<<2)|0;H[a+104>>2]=k;j=H[k>>2];h=H[j>>2];g=H[a+4>>2]-h|0;H[a+4>>2]=g;i=H[a>>2];b:{if(i>>>16>>>0>>0){l=H[j+4>>2];H[a+4>>2]=h;g=g>>>0>>0;H[k>>2]=H[j+(g?8:12)>>2];j=g?l:!l;g=H[a+8>>2];while(1){c:{if(g){break c}g=H[a+16>>2];l=g+1|0;k=I[g+1|0];if(I[g|0]==255){if(k>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;i=i+65280|0;g=8;break c}H[a+16>>2]=l;i=(k<<9)+i|0;g=7;break c}H[a+16>>2]=l;g=8;i=(k<<8)+i|0}g=g-1|0;H[a+8>>2]=g;i=i<<1;H[a>>2]=i;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}g=h;break b}i=i-(h<<16)|0;H[a>>2]=i;if(!(g&32768)){l=H[j+4>>2];h=g>>>0>>0;H[k>>2]=H[j+(h?12:8)>>2];j=h?!l:l;h=H[a+8>>2];while(1){d:{if(h){break d}h=H[a+16>>2];l=h+1|0;k=I[h+1|0];if(I[h|0]==255){if(k>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;i=i+65280|0;h=8;break d}H[a+16>>2]=l;i=(k<<9)+i|0;h=7;break d}H[a+16>>2]=l;h=8;i=(k<<8)+i|0}h=h-1|0;H[a+8>>2]=h;i=i<<1;H[a>>2]=i;g=g<<1;H[a+4>>2]=g;if(g>>>0<32768){continue}break}break b}j=H[j+4>>2]}if(!j){break a}j=n;n=b-4|0;h=H[b>>2];o=H[b+4>>2]>>>m+17&4|(H[n>>2]>>>m+19&1|(h>>>m+16&64|h>>>m&170|h>>>(e?m+12|0:14)&16));l=j+(I[o+24384|0]<<2)|0;H[a+104>>2]=l;k=H[l>>2];h=H[k>>2];g=g-h|0;H[a+4>>2]=g;e:{if(i>>>16>>>0>>0){j=H[k+4>>2];H[a+4>>2]=h;g=g>>>0>>0;H[l>>2]=H[k+(g?8:12)>>2];k=g?j:!j;g=H[a+8>>2];while(1){f:{if(g){break f}g=H[a+16>>2];l=g+1|0;j=I[g+1|0];if(I[g|0]==255){if(j>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;i=i+65280|0;g=8;break f}H[a+16>>2]=l;i=(j<<9)+i|0;g=7;break f}H[a+16>>2]=l;g=8;i=(j<<8)+i|0}g=g-1|0;H[a+8>>2]=g;i=i<<1;H[a>>2]=i;h=h<<1;H[a+4>>2]=h;if(h>>>0<32768){continue}break}break e}j=i-(h<<16)|0;H[a>>2]=j;if(!(g&32768)){i=H[k+4>>2];h=g>>>0>>0;H[l>>2]=H[k+(h?12:8)>>2];k=h?!i:i;i=H[a+8>>2];while(1){g:{if(i){break g}i=H[a+16>>2];l=i+1|0;h=I[i+1|0];if(I[i|0]==255){if(h>>>0>=144){H[a+12>>2]=H[a+12>>2]+1;j=j+65280|0;i=8;break g}H[a+16>>2]=l;j=(h<<9)+j|0;i=7;break g}H[a+16>>2]=l;i=8;j=(h<<8)+j|0}i=i-1|0;H[a+8>>2]=i;j=j<<1;H[a>>2]=j;g=g<<1;H[a+4>>2]=g;if(g>>>0<32768){continue}break}break e}k=H[k+4>>2]}g=c;c=I[o+24640|0];H[g>>2]=(c|0)==(k|0)?d:0-d|0;H[n>>2]=H[n>>2]|32<>2]=H[b>>2]|(d<<19|16)<>2]=H[b+4>>2]|8<>2]<<2)+b|0;H[c+4>>2]=H[c+4>>2]|32768;H[c>>2]=H[c>>2]|d<<31|65536;c=c-4|0;H[c>>2]=H[c>>2]|131072}if((e|0)!=3){break a}a=(H[a+124>>2]<<2)+b|0;H[a+4>>2]=H[a+4>>2]|4;H[a+12>>2]=H[a+12>>2]|1;H[a+8>>2]=H[a+8>>2]|d<<18|2}}function Kd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=na-112|0;na=e;j=1024;a:{b:{h=Ea(1,1024);if(h){l=e+92|0;k=e+108|0;while(1){c:{d:{d=e+104|0;e:{if((Ja(b,d,8,c)|0)!=8){break e}Da(d,e+88|0,4);Da(k,l,4);f=8;f:{g:{h:{i:{switch(H[e+88>>2]){case 0:d=Qa(b);g=qa;if((g|0)<0){g=1}else{g=d>>>0<4294967288&(g|0)<=0}if(g){break h}Ba(c,1,8449,0);break e;case 1:break i;default:break f}}d=e+104|0;if((Ja(b,d,8,c)|0)!=8){break e}Da(d,e+100|0,4);if(!H[e+100>>2]){break g}Ba(c,1,8449,0);break e}H[e+88>>2]=d+8;break f}Da(k,e+88|0,4);f=16}d=H[e+92>>2];if((d|0)==1785737827){b=H[a+100>>2];if(b&4){H[a+100>>2]=b|8;break e}Ba(c,1,5702,0);Ca(h);a=0;break a}i=H[e+88>>2];if(!i){Ba(c,1,3268,0);Ca(h);a=0;break a}if(f>>>0>i>>>0){H[e+4>>2]=d;H[e>>2]=i;Ba(c,1,13933,e);break b}j:{k:{l:{m:{n:{o:{p:{q:{r:{s:{if((d|0)<=1668246641){if((d|0)==1651532643){break r}if((d|0)==1667523942){break p}if((d|0)!=1668112752){break s}g=25296;break n}if((d|0)<=1783635999){if((d|0)==1668246642){break o}g=25264;if((d|0)==1768449138){break n}if((d|0)!=1718909296){break s}g=25240;break l}if((d|0)==1885564018){break q}if((d|0)==1783636e3){break m}g=25248;if((d|0)==1785737832){break l}}d=H[a+100>>2];if(d&1){break j}Ba(c,1,2062,0);Ca(h);a=0;break a}g=25280;break n}g=25288;break n}g=25304;break n}g=25272}H[e+76>>2]=d&255;H[e+64>>2]=d>>>24;H[e+72>>2]=d>>>8&255;H[e+68>>2]=d>>>16&255;Ba(c,2,2011,e- -64|0);f=i-f|0;if(I[a+100|0]&4){break k}d=H[e+92>>2];H[e+48>>2]=d>>>24;H[e+60>>2]=d&255;H[e+52>>2]=d>>>16&255;H[e+56>>2]=d>>>8&255;Ba(c,2,6771,e+48|0);H[a+100>>2]=H[a+100>>2]|2147483647;d=rb(b,f,c);if(!qa&(d|0)==(f|0)){continue}Ba(c,1,3748,0);Ca(h);a=0;break a}g=25232}f=i-f|0}d=f;f=Qa(b);i=qa;if((i|0)<0){f=1}else{f=(i|0)<=0&d>>>0>f>>>0}if(f){f=H[e+88>>2];a=H[e+92>>2];m=e,n=Qa(b),H[m+40>>2]=n;H[e+36>>2]=d;H[e+32>>2]=a&255;H[e+20>>2]=a>>>24;H[e+16>>2]=f;H[e+28>>2]=a>>>8&255;H[e+24>>2]=a>>>16&255;Ba(c,1,15680,e+16|0);break b}if(d>>>0<=j>>>0){f=h;break c}j=d;f=Ha(h,d);if(f){break c}Ca(h);Ba(c,1,2193,0);a=0;break a}if(!(d&2)){Ba(c,1,2132,0);Ca(h);a=0;break a}H[a+100>>2]=d|2147483647;d=i-f|0;f=rb(b,d,c);if(!qa&(d|0)==(f|0)){continue}if(!(I[a+100|0]&8)){break d}Ba(c,2,3748,0)}Ca(h);a=1;break a}Ba(c,1,3748,0);Ca(h);a=0;break a}if((Ja(b,f,d,c)|0)!=(d|0)){Ba(c,1,3798,0);Ca(f);a=0;break a}h=f;if(ra[H[g+4>>2]](a,f,d,c)|0){continue}break}Ca(f);a=0;break a}Ba(c,1,4923,0);a=0;break a}Ca(h);a=0}na=e+112|0;return a|0}function Yd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=na-16|0;na=f;if(H[a+8>>2]==16){i=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{i=H[a+12>>2]}a:{if(c>>>0<=1){Ba(d,1,4721,0);a=0;break a}Da(b,f+12|0,2);if(H[f+12>>2]){Ba(d,2,5897,0);a=1;break a}if(c>>>0<=6){Ba(d,1,4721,0);a=0;break a}Da(b+2|0,f+8|0,1);e=H[i+5628>>2];h=H[i+5632>>2];b:{c:{if(!h){break c}j=H[f+8>>2];a=e;while(1){if((j|0)!=H[a>>2]){a=a+20|0;g=g+1|0;if((h|0)!=(g|0)){continue}break c}break}j=0;if((g|0)!=(h|0)){break b}}if(H[i+5636>>2]==(h|0)){a=h+10|0;H[i+5636>>2]=a;a=Ha(e,N(a,20));if(!a){Ca(H[i+5628>>2]);H[i+5636>>2]=0;H[i+5628>>2]=0;H[i+5632>>2]=0;Ba(d,1,4747,0);a=0;break a}H[i+5628>>2]=a;e=H[i+5632>>2];j=N(H[i+5636>>2]-e|0,20);if(j){y(a+N(e,20)|0,0,j)}h=H[i+5632>>2];e=H[i+5628>>2]}a=e+N(h,20)|0;j=1}H[a>>2]=H[f+8>>2];Da(b+3|0,f+12|0,2);if(H[f+12>>2]){Ba(d,2,5897,0);a=1;break a}Da(b+5|0,f+4|0,2);e=H[f+4>>2];if(e>>>0>=2){Ba(d,2,3130,0);a=1;break a}h=c-7|0;if(e){c=b+7|0;while(1){if(h>>>0<=2){Ba(d,1,4721,0);a=0;break a}Da(c,f+12|0,1);if(H[f+12>>2]!=1){Ba(d,2,5579,0);a=1;break a}Da(c+1|0,f,2);e=H[f>>2];b=e&32767;H[a+4>>2]=b;h=h-3|0;e=(e>>>15|0)+1|0;k=N(e,b)+2|0;if(h>>>0>>0){Ba(d,1,4721,0);a=0;break a}c=c+3|0;g=0;if(b){while(1){Da(c,f+12|0,e);if(H[f+12>>2]!=(g|0)){Ba(d,2,6259,0);a=1;break a}c=c+e|0;g=g+1|0;if(g>>>0>2]){continue}break}}Da(c,f,2);e=H[f>>2];b=e&32767;H[f>>2]=b;if((b|0)!=H[a+4>>2]){Ba(d,2,3306,0);a=1;break a}e=(e>>>15|0)+1|0;l=N(e,b)+3|0;k=h-k|0;if(l>>>0>k>>>0){Ba(d,1,4721,0);a=0;break a}c=c+2|0;g=0;if(b){while(1){Da(c,f+12|0,e);if(H[f+12>>2]!=(g|0)){Ba(d,2,6259,0);a=1;break a}c=c+e|0;g=g+1|0;if(g>>>0>2]){continue}break}}Da(c,f+12|0,3);e=H[f+12>>2];H[a+8>>2]=0;H[a+12>>2]=0;F[a+16|0]=!(e&65536)|I[a+16|0]&254;h=e&255;H[f+8>>2]=h;d:{if(!h){break d}m=H[i+5620>>2];if(m){g=H[i+5616>>2];b=0;while(1){if((h|0)==H[g+8>>2]){H[a+8>>2]=g;break d}g=g+20|0;b=b+1|0;if((m|0)!=(b|0)){continue}break}}Ba(d,1,4721,0);a=0;break a}e=e>>>8&255;H[f+8>>2]=e;e:{if(!e){break e}h=H[i+5620>>2];if(h){g=H[i+5616>>2];b=0;while(1){if((e|0)==H[g+8>>2]){H[a+12>>2]=g;break e}g=g+20|0;b=b+1|0;if((h|0)!=(b|0)){continue}break}}Ba(d,1,4721,0);a=0;break a}h=k-l|0;c=c+3|0;n=n+1|0;if(n>>>0>2]){continue}break}}if(h){Ba(d,1,4721,0);a=0;break a}a=1;if(!j){break a}H[i+5632>>2]=H[i+5632>>2]+1;a=1}na=f+16|0;return a|0}function _c(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(K[a+44>>2]>=8){i=H[a+40>>2];l=8;while(1){k=H[a+12>>2]<<5;e=H[a>>2];g=H[a+36>>2];b=H[a+16>>2];h=H[a+20>>2];a:{if(b>>>0>=h>>>0){break a}j=e+k|0;d=b+1|0;if(h-b&1){c=j+(b<<6)|0;b=(N(b,g)<<2)+i|0;f=H[b+28>>2];H[c+24>>2]=H[b+24>>2];H[c+28>>2]=f;f=H[b+20>>2];H[c+16>>2]=H[b+16>>2];H[c+20>>2]=f;f=H[b+12>>2];H[c+8>>2]=H[b+8>>2];H[c+12>>2]=f;f=H[b+4>>2];H[c>>2]=H[b>>2];H[c+4>>2]=f;b=d}if((d|0)==(h|0)){break a}while(1){d=(N(b,g)<<2)+i|0;f=H[d+28>>2];c=j+(b<<6)|0;H[c+24>>2]=H[d+24>>2];H[c+28>>2]=f;f=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=f;f=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=f;f=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=f;d=b+1|0;c=j+(d<<6)|0;d=(N(d,g)<<2)+i|0;f=H[d+28>>2];H[c+24>>2]=H[d+24>>2];H[c+28>>2]=f;f=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=f;f=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=f;f=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=f;b=b+2|0;if((h|0)!=(b|0)){continue}break}}b=H[a+24>>2];h=H[a+28>>2];b:{if(b>>>0>=h>>>0){break b}j=(e-k|0)+32|0;k=(N(g,H[a+8>>2])<<2)+i|0;d=b+1|0;if(h-b&1){c=j+(b<<6)|0;b=k+(N(b,g)<<2)|0;e=H[b+28>>2];H[c+24>>2]=H[b+24>>2];H[c+28>>2]=e;e=H[b+20>>2];H[c+16>>2]=H[b+16>>2];H[c+20>>2]=e;e=H[b+12>>2];H[c+8>>2]=H[b+8>>2];H[c+12>>2]=e;e=H[b+4>>2];H[c>>2]=H[b>>2];H[c+4>>2]=e;b=d}if((d|0)==(h|0)){break b}while(1){d=k+(N(b,g)<<2)|0;e=H[d+28>>2];c=j+(b<<6)|0;H[c+24>>2]=H[d+24>>2];H[c+28>>2]=e;e=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=e;e=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=e;e=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=e;d=b+1|0;c=j+(d<<6)|0;d=k+(N(d,g)<<2)|0;e=H[d+28>>2];H[c+24>>2]=H[d+24>>2];H[c+28>>2]=e;e=H[d+20>>2];H[c+16>>2]=H[d+16>>2];H[c+20>>2]=e;e=H[d+12>>2];H[c+8>>2]=H[d+8>>2];H[c+12>>2]=e;e=H[d+4>>2];H[c>>2]=H[d>>2];H[c+4>>2]=e;b=b+2|0;if((h|0)!=(b|0)){continue}break}}Ta(a);b=0;if(H[a+32>>2]){while(1){d=H[a>>2]+(b<<5)|0;c=H[d+28>>2];g=(N(H[a+36>>2],b)<<2)+i|0;H[g+24>>2]=H[d+24>>2];H[g+28>>2]=c;c=H[d+20>>2];H[g+16>>2]=H[d+16>>2];H[g+20>>2]=c;c=H[d+12>>2];H[g+8>>2]=H[d+8>>2];H[g+12>>2]=c;c=H[d+4>>2];H[g>>2]=H[d>>2];H[g+4>>2]=c;b=b+1|0;if(b>>>0>2]){continue}break}}i=i+32|0;l=l+8|0;if(l>>>0<=K[a+44>>2]){continue}break}}Ca(H[a>>2]);Ca(a)}function ed(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=b;b=H[b>>2]+7&-8;H[d>>2]=b+16;o=a;f=H[b>>2];a=H[b+4>>2];d=H[b+8>>2];c=H[b+12>>2];p=c;h=na-32|0;na=h;b=c&65535;e=c;c=d;d=e>>>16&32767;g=d;a:{if(d-15361>>>0<=2045){b=b<<4|c>>>28;d=c<<4|a>>>28;e=g-15360|0;a=a&268435455;b:{if((a|0)==134217728&(f|0)!=0|a>>>0>134217728){c=b;d=d+1|0;b=d?c:c+1|0;break b}if(f|(a|0)!=134217728){break b}a=d;d=d+(d&1)|0;b=a>>>0>d>>>0?b+1|0:b}c=b>>>0>1048575;f=c?0:d;a=c?0:b;b=0;c=c+e|0;b=c>>>0>>0?1:b;break a}if(!(!(c|f|(a|b))|((d|0)!=32767|(k|0)!=0))){e=b<<4|c>>>28;f=c<<4|a>>>28;a=e|524288;c=2047;b=0;break a}if(g>>>0>17406){f=0;a=0;c=2047;b=0;break a}e=!(d|k);l=e?15360:15361;k=l-g|0;if((k|0)>112){f=0;a=0;c=0;b=0;break a}d=c;b=e?b:b|65536;if((g|0)!=(l|0)){m=f;c=a;i=d;e=b;l=128-k|0;c:{if(l&64){g=f;e=l+-64|0;c=e&31;if((e&63)>>>0>=32){e=f<>>32-c|a<>>0>=32){g=i<>>32-j|e<>>0>=32){e=0;i=c>>>i|0}else{e=c>>>i|0;i=((1<>>i}i=n|i;e=e|g;n=m;j=l&31;if((l&63)>>>0>=32){g=m<>>32-j|c<>2]=m;H[h+20>>2]=c;H[h+24>>2]=i;H[h+28>>2]=e;m=(H[h+16>>2]|H[h+24>>2]|(H[h+20>>2]|H[h+28>>2]))!=0}d:{if(k&64){c=d;f=k+-64|0;a=f&31;if((f&63)>>>0>=32){e=0;f=b>>>a|0}else{e=b>>>a|0;f=((1<>>a}a=e;d=0;b=0;break d}if(!k){break d}g=d;c=64-k|0;e=c&31;if((c&63)>>>0>=32){c=d<>>32-e|b<>>0>=32){g=0;a=a>>>f|0}else{g=a>>>f|0;a=((1<>>f}f=i|a;a=c|g;e=d;d=k&31;if((k&63)>>>0>=32){c=0;d=b>>>d|0}else{c=b>>>d|0;d=((1<>>d}b=c}H[h>>2]=f;H[h+4>>2]=a;H[h+8>>2]=d;H[h+12>>2]=b;a=H[h+8>>2];d=H[h+4>>2];f=a<<4|d>>>28;a=H[h+12>>2]<<4|a>>>28;c=d&268435455;b=H[h>>2]|m;e:{if((c|0)==134217728&(b|0)!=0|c>>>0>134217728){f=f+1|0;a=f?a:a+1|0;break e}if(b|(c|0)!=134217728){break e}b=a;a=f;f=f+(f&1)|0;a=a>>>0>f>>>0?b+1|0:b}c=a>>>0>1048575;a=c?a^1048576:a;b=0}na=h+32|0;u(0,f|0);u(1,a|(p&-2147483648|c<<20));q=o,r=+w(),M[q>>3]=r}function Hc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;q=H[a+24>>2];if(!H[q+16>>2]){return 1}r=H[q+24>>2];o=H[H[H[a+20>>2]>>2]+20>>2];while(1){d=H[r+36>>2];H[b+36>>2]=d;f=H[o+28>>2];c=f+N(d,152)|0;t=H[a+64>>2];a:{if(t){d=f+N(H[o+24>>2],152)|0;p=H[d-144>>2]-H[d-152>>2]|0;f=c+12|0;e=c+4|0;d=H[c+8>>2];g=H[c>>2];c=36;break a}f=c+148|0;e=c+140|0;d=H[c+144>>2];g=H[c+136>>2];p=d-g|0;c=52}u=H[c+o>>2];b:{c:{if(!u){break c}k=H[e>>2];l=H[f>>2];f=d-g|0;e=H[b+40>>2];c=e&31;if((e&63)>>>0>=32){c=-1<>>32-c}m=h^-1;j=H[b+20>>2];h=m+j|0;i=c^-1;c=i;j=h>>>0>>0?c+1|0:c;c=e&31;if((e&63)>>>0>=32){h=j>>>c|0}else{h=((1<>>c}c=H[b+16>>2];j=c+m|0;m=c>>>0>j>>>0?i+1|0:i;i=e&31;c=H[b+8>>2];if((e&63)>>>0>=32){i=m>>>i|0}else{i=((1<>>i}e=c+i|0;d:{if(g>>>0>i>>>0){m=g-i|0;i=0;if(e>>>0>=d>>>0){j=0;d=f;break d}d=e-g|0;j=f-d|0;break d}i=i-g|0;if(e>>>0>=d>>>0){d=f-i|0;m=0;j=0;break d}j=d-e|0;m=0;d=c}f=l-k|0;e=H[b+12>>2];g=e+h|0;e:{if(h>>>0>>0){s=k-h|0;h=0;n=0;if(g>>>0>=l>>>0){break e}n=f;f=g-k|0;n=n-f|0;break e}h=h-k|0;if(g>>>0>=l>>>0){f=f-h|0;s=0;n=0;break e}s=0;f=e;n=l-g|0}k=n;g=0;if((h|i|(j|k)|(d|f))<0){break b}k=N(h,p)+i|0;l=H[b+44>>2];h=N(c,s)+m|0;f:{g:{if(!(k|l|(h|(c|0)!=(p|0))|(c|0)!=(d|0))){if((e|0)!=(f|0)){break g}d=(t?36:52)+o|0;H[b+44>>2]=H[d>>2];H[d>>2]=0;break c}if(l){break f}}re(e,0,c);if(qa|!e){break b}c=N(c,e);if(c>>>0>1073741823){break b}c=Ia(c<<2);H[b+44>>2]=c;if(!c){break b}e=H[b+8>>2];g=H[b+12>>2];if((e|0)==(d|0)&(g|0)==(f|0)){break f}e=N(e,g)<<2;if(!e){break f}y(c,0,e)}if(!f){break c}d=d<<2;g=H[b+44>>2]+(h<<2)|0;c=(k<<2)+u|0;if((f|0)!=1){k=f&1;l=f&2147483646;f=0;while(1){h=!d;if(!h){B(g,c,d)}i=p<<2;c=i+c|0;e=(H[b+8>>2]<<2)+g|0;if(!h){B(e,c,d)}c=c+i|0;g=e+(H[b+8>>2]<<2)|0;f=f+2|0;if((l|0)!=(f|0)){continue}break}if(!k){break c}}if(!d){break c}B(g,c,d)}o=o+76|0;r=r+52|0;b=b+52|0;g=1;v=v+1|0;if(v>>>0>2]){continue}}break}return g}function wb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;if(a){a:{if(H[a>>2]){b=H[a+12>>2];if(b){jb(b);Ca(H[a+12>>2]);H[a+12>>2]=0}b=H[a+16>>2];if(b){Ca(b);H[a+16>>2]=0;H[a+20>>2]=0}Ca(H[a+64>>2]);H[a+60>>2]=0;H[a+64>>2]=0;Ca(H[a+72>>2]);H[a+72>>2]=0;Ca(H[a+88>>2]);H[a+88>>2]=0;break a}b=H[a+44>>2];if(b){Ca(b);H[a+44>>2]=0}b=H[a+32>>2];if(b){Ca(b);H[a+32>>2]=0;H[a+36>>2]=0}b=H[a+52>>2];if(!b){break a}Ca(b);H[a+52>>2]=0;H[a+56>>2]=0}Tb(H[a+232>>2]);b=H[a+180>>2];if(b){e=N(H[a+128>>2],H[a+132>>2]);if(e){while(1){jb(b);b=b+5644|0;c=c+1|0;if((e|0)!=(c|0)){continue}break}b=H[a+180>>2]}Ca(b);H[a+180>>2]=0}b=H[a+140>>2];if(b){c=H[a+136>>2];if(c){b=0;while(1){e=H[H[a+140>>2]+(b<<3)>>2];if(e){Ca(e);c=H[a+136>>2]}b=b+1|0;if(c>>>0>b>>>0){continue}break}b=H[a+140>>2]}H[a+136>>2]=0;Ca(b);H[a+140>>2]=0}Ca(H[a+160>>2]);H[a+144>>2]=0;H[a+160>>2]=0;Ca(H[a+124>>2]);H[a+124>>2]=0;if(!(I[a+212|0]&2)){Ca(H[a+192>>2])}y(a+104|0,0,112);pb(H[a+216>>2]);H[a+216>>2]=0;pb(H[a+220>>2]);H[a+216>>2]=0;d=H[a+224>>2];if(d){b=H[d+28>>2];if(b){Ca(b);H[d+28>>2]=0}c=H[d+40>>2];if(c){if(H[d+36>>2]){while(1){e=N(g,40);b=H[(e+c|0)+36>>2];if(b){Ca(b);c=H[d+40>>2];H[(e+c|0)+36>>2]=0}b=H[(c+e|0)+16>>2];if(b){Ca(b);c=H[d+40>>2];H[(e+c|0)+16>>2]=0}b=H[(c+e|0)+24>>2];if(b){Ca(b);c=H[d+40>>2];H[(e+c|0)+24>>2]=0}g=g+1|0;if(g>>>0>2]){continue}break}}Ca(c);H[d+40>>2]=0}Ca(d)}H[a+224>>2]=0;Ua(H[a+96>>2]);H[a+96>>2]=0;Ua(H[a+100>>2]);H[a+100>>2]=0;f=H[a+236>>2];if(f){b:{if(!H[f+8>>2]){break b}if(H[f+12>>2]){H[f+40>>2]=0;while(1){if(H[f+24>>2]>0){continue}break}}H[f+16>>2]=1;Ca(H[f>>2]);c=H[f+28>>2];if(!c){break b}while(1){b=H[c+4>>2];Ca(c);H[f+28>>2]=b;c=b;if(b){continue}break}}d=H[f+36>>2];if(d){g=H[d+4>>2];if((g|0)>0){b=0;while(1){e=H[d>>2]+N(b,12)|0;c=H[e+8>>2];if(c){ra[c|0](H[e+4>>2]);g=H[d+4>>2]}b=b+1|0;if((g|0)>(b|0)){continue}break}}Ca(H[d>>2]);Ca(d)}Ca(f)}H[a+236>>2]=0;Ca(a)}}function ec(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;k=na-256|0;na=k;a:{if(!a){a=0;break a}if(!(H[a>>2]==(b|0)&H[a+4>>2]==(c|0))){H[a+4>>2]=c;H[a>>2]=b;H[k>>2]=c;H[k+128>>2]=b;e=c;g=b;while(1){o=h;h=h+1|0;j=h<<2;l=(e+1|0)/2|0;H[j+k>>2]=l;n=j+(k+128|0)|0;j=(g+1|0)/2|0;H[n>>2]=j;i=N(e,g);f=i+f|0;e=l;g=j;if(i>>>0>1){continue}break}H[a+8>>2]=f;b:{c:{d:{if(!f){b=H[a+12>>2];if(!b){break d}Ca(b);H[a+12>>2]=0;break d}f=f<<4;if(f>>>0<=K[a+16>>2]){break b}b=Ha(H[a+12>>2],f);if(b){break c}Ba(d,1,6451,0);b=H[a+12>>2];if(!b){break d}Ca(b);H[a+12>>2]=0}Ca(a);a=0;break a}H[a+12>>2]=b;c=H[a+16>>2];d=f-c|0;if(d){y(b+c|0,0,d)}H[a+16>>2]=f;c=H[a+4>>2];b=H[a>>2]}g=H[a+12>>2];if(o){l=0;e=(N(b,c)<<4)+g|0;f=e;while(1){b=l<<2;h=H[b+k>>2];e:{if((h|0)<=0){break e}j=h-1|0;d=0;f:{g:{b=H[b+(k+128|0)>>2];if((b|0)<=0){i=h&3;if(h>>>0>=4){break g}h=0;break f}while(1){c=f;f=b;while(1){h:{H[g>>2]=e;if((f|0)==1){g=g+16|0;e=e+16|0;break h}H[g+16>>2]=e;e=e+16|0;g=g+32|0;i=(f|0)>2;f=f-2|0;if(i){continue}}break}i=((d|0)==(j|0)|d)&1;f=i?e:c+(b<<4)|0;e=i?e:c;d=d+1|0;if((h|0)!=(d|0)){continue}break}break e}m=h&2147483644;h=0;c=0;while(1){n=(h|0)==(j|0);h=h+4|0;e=n?e:f;f=e;c=c+4|0;if((m|0)!=(c|0)){continue}break}if(i){break f}break e}while(1){c=f;m=((h|0)==(j|0)|h)&1;f=m?e:c+(b<<4)|0;e=m?e:c;h=h+1|0;d=d+1|0;if((i|0)!=(d|0)){continue}break}}l=l+1|0;if((o|0)!=(l|0)){continue}break}}H[g>>2]=0}b=H[a+8>>2];if(!b){break a}c=b&3;e=H[a+12>>2];if(b>>>0>=4){b=b&-4;g=0;while(1){H[e+60>>2]=0;H[e+52>>2]=999;H[e+56>>2]=0;H[e+44>>2]=0;H[e+36>>2]=999;H[e+40>>2]=0;H[e+28>>2]=0;H[e+20>>2]=999;H[e+24>>2]=0;H[e+12>>2]=0;H[e+4>>2]=999;H[e+8>>2]=0;e=e- -64|0;g=g+4|0;if((b|0)!=(g|0)){continue}break}if(!c){break a}}g=0;while(1){H[e+12>>2]=0;H[e+4>>2]=999;H[e+8>>2]=0;e=e+16|0;g=g+1|0;if((c|0)!=(g|0)){continue}break}}na=k+256|0;return a}function Xd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;g=na-16|0;na=g;if(H[a+8>>2]==16){h=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{h=H[a+12>>2]}a:{if(!c){Ba(d,1,4259,0);break a}i=H[a+96>>2];e=1;Da(b,g+8|0,1);f=H[g+8>>2];if(f>>>0>=2){Ba(d,2,9792,0);break a}if((f+1|0)!=(c|0)){e=0;Ba(d,2,4259,0);break a}c=H[i+16>>2];b:{if(!c){break b}d=c&7;e=H[h+5584>>2];if(c>>>0>=8){i=c&-8;c=0;while(1){H[e+8636>>2]=0;H[e+7556>>2]=0;H[e+6476>>2]=0;H[e+5396>>2]=0;H[e+4316>>2]=0;H[e+3236>>2]=0;H[e+2156>>2]=0;H[e+1076>>2]=0;e=e+8640|0;c=c+8|0;if((i|0)!=(c|0)){continue}break}if(!d){break b}}c=0;while(1){H[e+1076>>2]=0;e=e+1080|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}c=H[h+5608>>2];if(c){Ca(c);H[h+5608>>2]=0;f=H[g+8>>2]}if(!f){e=1;break a}i=0;while(1){b=b+1|0;Da(b,g+12|0,1);c:{if(!H[h+5632>>2]){break c}d=H[h+5628>>2];if(H[d>>2]!=H[g+12>>2]){break c}f=H[d+4>>2];j=H[a+96>>2];if((f|0)!=H[j+16>>2]){break c}c=H[d+8>>2];if(c){e=0;f=N(f,f);if(H[c+16>>2]!=(N(f,H[(H[c>>2]<<2)+24896>>2])|0)){break a}k=Fa(f<<2);H[h+5608>>2]=k;if(!k){break a}ra[H[(H[c>>2]<<2)+25200>>2]](H[c+12>>2],k,f)}c=H[d+12>>2];if(!c){break c}e=0;d=H[j+16>>2];if(H[c+16>>2]!=(N(d,H[(H[c>>2]<<2)+24896>>2])|0)){break a}f=Fa(d<<2);if(!f){break a}ra[H[(H[c>>2]<<2)+25216>>2]](H[c+12>>2],f,d);c=H[j+16>>2];d:{if(!c){break d}j=c&7;e=H[h+5584>>2];e:{if(c>>>0<8){c=f;break e}k=c&-8;d=0;c=f;while(1){H[e+1076>>2]=H[c>>2];H[e+2156>>2]=H[c+4>>2];H[e+3236>>2]=H[c+8>>2];H[e+4316>>2]=H[c+12>>2];H[e+5396>>2]=H[c+16>>2];H[e+6476>>2]=H[c+20>>2];H[e+7556>>2]=H[c+24>>2];H[e+8636>>2]=H[c+28>>2];e=e+8640|0;c=c+32|0;d=d+8|0;if((k|0)!=(d|0)){continue}break}if(!j){break d}}d=0;while(1){H[e+1076>>2]=H[c>>2];e=e+1080|0;c=c+4|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}}Ca(f)}e=1;i=i+1|0;if(i>>>0>2]){continue}break}}na=g+16|0;return e|0}function xb(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;m=H[H[a+24>>2]+24>>2]+N(b,52)|0;l=H[m+4>>2];k=l-1|0;o=H[a+60>>2];j=k+o|0;p=0-!l|0;i=p;r=H[H[H[a+20>>2]>>2]+20>>2]+N(b,76)|0;n=H[r+12>>2];i=ve(j,j>>>0>>0?i+1|0:i,l,0);q=i>>>0>n>>>0?n:i;j=H[m>>2];m=j-1|0;s=H[a+56>>2];n=m+s|0;o=0-!j|0;i=o;t=H[r+8>>2];i=ve(n,n>>>0>>0?i+1|0:i,j,0);n=i>>>0>t>>>0?t:i;i=p;t=H[r+4>>2];s=H[a+52>>2];k=s+k|0;i=ve(k,k>>>0>>0?i+1|0:i,l,0);k=i>>>0>>0?t:i;i=o;p=H[r>>2];l=m;m=H[a+48>>2];l=l+m|0;i=ve(l,l>>>0>>0?i+1|0:i,j,0);i=i>>>0

>>0?p:i;l=0;p=H[(H[H[a+32>>2]+5584>>2]+N(b,1080)|0)+20>>2];c=H[r+20>>2]+(c?0-c|0:-1)|0;a:{if(!c){a=n;l=i;b=k;break a}m=c-1|0;j=(d&1)<>>0>>0){a=c&31;l=i-j|0;if((c&63)>>>0>=32){i=-1<>>32-a;a=-1<>>0>>0?i+1|0:i;b=a;a=c&31;if((c&63)>>>0>=32){l=i>>>a|0}else{l=((1<>>a}}a=0;b=0;d=d>>>1<>>0>>0){b=c&31;o=k-d|0;if((c&63)>>>0>=32){i=-1<>>32-b;b=-1<>>0>>0?i+1|0:i;k=b;b=c&31;if((c&63)>>>0>=32){b=i>>>b|0}else{b=((1<>>b}}if(j>>>0>>0){a=c&31;k=n-j|0;if((c&63)>>>0>=32){i=-1<>>32-a;a=-1<>>0>>0?i+1|0:i;j=a;a=c&31;if((c&63)>>>0>=32){a=i>>>a|0}else{a=((1<>>a}}if(d>>>0>=q>>>0){q=0;break a}k=q-d|0;d=c&31;if((c&63)>>>0>=32){i=-1<>>32-d;d=-1<>>0>>0?i+1|0:i;j=d;d=c&31;if((c&63)>>>0>=32){q=i>>>d|0}else{q=((1<>>d}}c=(p|0)==1?2:3;d=c+a|0;d=(a>>>0>d>>>0?-1:d)>>>0>e>>>0;a=c+q|0;d=d&(a>>>0>>0?-1:a)>>>0>f>>>0;a=l-c|0;d=d&(a>>>0<=l>>>0?a:0)>>>0>>0;a=b-c|0;return d&(a>>>0<=b>>>0?a:0)>>>0>>0}function lb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=H[a+16>>2];if(g>>>0>=32){return H[a+8>>2]}b=H[a+20>>2];a:{if((b|0)>=4){d=H[a>>2];c=H[d-3>>2];e=b-4|0;H[a+20>>2]=e;H[a>>2]=d-4;break a}if((b|0)<=0){e=b;break a}f=H[a>>2];d=24;b:{if((b|0)==1){break b}l=b&1;k=b&2147483646;while(1){h=f-1|0;H[a>>2]=h;i=I[f|0];f=f-2|0;H[a>>2]=f;H[a+20>>2]=b-1;h=I[h|0];b=b-2|0;H[a+20>>2]=b;c=i<>2]=f-1;f=I[f|0];H[a+20>>2]=b-1;c=f<>2];k=c&255;H[a+24>>2]=k>>>0>143;b=b?(c&2130706432)==2130706432?7:8:8;h=b+(c>>>0<=2415919103?8:(c&8323072)==8323072?7:8)|0;f=c>>>16&255;i=h+(f>>>0<=143?8:(c&32512)==32512?7:8)|0;d=c>>>8&255;l=i+(g+(d>>>0<=143?8:(c&127)==127?7:8)|0)|0;H[a+16>>2]=l;j=H[a+12>>2];b=f<>>24|d<>>0>=32){d=b<>>32-c;b=b<>2];b=d|j;h=b;H[a+8>>2]=g;H[a+12>>2]=b;if(l>>>0<=31){c:{if((e|0)>=4){b=H[a>>2];c=H[b-3>>2];H[a+20>>2]=e-4;H[a>>2]=b-4;break c}if((e|0)<=0){c=0;break c}b=H[a>>2];d:{if((e|0)==1){d=24;c=0;break d}i=e&1;j=e&2147483646;d=24;c=0;f=0;while(1){m=b-1|0;H[a>>2]=m;n=I[b|0];b=b-2|0;H[a>>2]=b;H[a+20>>2]=e-1;m=I[m|0];e=e-2|0;H[a+20>>2]=e;c=n<>2]=b-1;b=I[b|0];H[a+20>>2]=e-1;c=b<>2]=e>>>0>143;k=k>>>0<=143?8:(c&2130706432)==2130706432?7:8;i=k+(c>>>0<=2415919103?8:(c&8323072)==8323072?7:8)|0;f=c>>>16&255;j=i+(f>>>0<=143?8:(c&32512)==32512?7:8)|0;d=c>>>8&255;H[a+16>>2]=j+(l+(d>>>0<=143?8:(c&127)==127?7:8)|0);b=a;a=f<>>24|d<>>0>=32){c=a<>>32-e;a=a<>2]=g;H[b+12>>2]=c|h}return g}function Sc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=H[a+96>>2];l=N(H[a+128>>2],H[a+132>>2]);a:{if(l){b=H[j+16>>2];m=N(b,1080);k=N(b,b)<<2;e=H[a+12>>2];b=H[a+180>>2];while(1){n=H[b+5584>>2];B(b,e,5644);H[b+5608>>2]=0;H[b+5588>>2]=-1;H[b+5168>>2]=0;H[b+5636>>2]=0;H[b+5616>>2]=0;H[b+5624>>2]=0;H[b+5628>>2]=0;H[b+5584>>2]=n;F[b+5640|0]=I[b+5640|0]&252;b:{if(!H[e+5608>>2]){break b}d=Fa(k);H[b+5608>>2]=d;if(!d){return 0}if(!k){break b}B(d,H[e+5608>>2],k)}d=N(H[e+5624>>2],20);f=Fa(d);H[b+5616>>2]=f;i=0;if(!f){break a}if(d){B(f,H[e+5616>>2],d)}g=H[e+5620>>2];if(g){d=H[e+5616>>2];f=H[b+5616>>2];h=0;while(1){if(H[d+12>>2]){g=Fa(H[d+16>>2]);H[f+12>>2]=g;if(!g){return 0}o=H[d+16>>2];if(o){B(g,H[d+12>>2],o)}g=H[e+5620>>2]}H[b+5624>>2]=H[b+5624>>2]+1;f=f+20|0;d=d+20|0;h=h+1|0;if(h>>>0>>0){continue}break}}d=N(H[e+5636>>2],20);f=Fa(d);H[b+5628>>2]=f;if(!f){break a}if(d){B(f,H[e+5628>>2],d)}i=H[e+5636>>2];H[b+5636>>2]=i;if(i){d=H[e+5628>>2];f=H[b+5628>>2];h=0;while(1){g=H[d+8>>2];if(g){H[f+8>>2]=H[b+5616>>2]+(g-H[e+5616>>2]|0)}g=H[d+12>>2];if(g){H[f+12>>2]=H[b+5616>>2]+(g-H[e+5616>>2]|0)}f=f+20|0;d=d+20|0;h=h+1|0;if((i|0)!=(h|0)){continue}break}}if(m){B(n,H[e+5584>>2],m)}b=b+5644|0;p=p+1|0;if((p|0)!=(l|0)){continue}break}}i=1;e=Ea(1,72);b=0;c:{if(!e){break c}F[e+40|0]=I[e+40|0]&254|1;d=Ea(1,4);H[e+20>>2]=d;b=e;if(d){break c}Ca(b);b=0}H[a+232>>2]=b;if(!b){return 0}f=H[a+236>>2];e=0;H[b+28>>2]=a+104;H[b+24>>2]=j;d=Ea(1,848);H[H[b+20>>2]>>2]=d;d:{if(!d){break d}d=Ea(H[j+16>>2],76);h=H[H[b+20>>2]>>2];H[h+20>>2]=d;if(!d){break d}H[h+16>>2]=H[j+16>>2];e=H[a+188>>2];H[b+44>>2]=f;H[b>>2]=e;e=1}if(e){break a}Tb(H[a+232>>2]);i=0;H[a+232>>2]=0;Ba(c,1,3668,0)}return i|0}function pe(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=na-80|0;na=e;H[e+76>>2]=1;j=H[a+44>>2];d=H[H[a+224>>2]+40>>2];a:{b:{if(!d|!H[d+16>>2]){break b}c:{d=d+N(j,40)|0;if(!H[d+4>>2]){d=H[a+52>>2];f=H[a+48>>2]+2|0;d=f>>>0<2?d+1|0:d;if(bb(b,f,d,c)){break c}d=0;Ba(c,1,5440,0);break a}d=H[d+16>>2];if(!bb(b,H[d>>2],H[d+4>>2],c)){Ba(c,1,5440,0);d=0;break a}if((Ja(b,H[a+16>>2],2,c)|0)!=2){Ba(c,1,2472,0);d=0;break a}Da(H[a+16>>2],e+72|0,2);if(H[e+72>>2]==65424){break c}Ba(c,1,4073,0);d=0;break a}if(H[a+8>>2]!=256){break b}H[a+8>>2]=8}f=N(H[a+132>>2],H[a+128>>2]);d:{if(!f){break d}i=f&7;h=H[a+180>>2];d=0;if(f>>>0>=8){k=f&-8;while(1){f=h+N(g,5644)|0;H[f+45096>>2]=-1;H[f+39452>>2]=-1;H[f+33808>>2]=-1;H[f+28164>>2]=-1;H[f+22520>>2]=-1;H[f+16876>>2]=-1;H[f+11232>>2]=-1;H[f+5588>>2]=-1;g=g+8|0;l=l+8|0;if((k|0)!=(l|0)){continue}break}if(!i){break d}}while(1){H[(h+N(g,5644)|0)+5588>>2]=-1;g=g+1|0;d=d+1|0;if((i|0)!=(d|0)){continue}break}}d=0;if(!cb(a,e+72|0,0,e+68|0,e- -64|0,e+60|0,e+56|0,e+52|0,e+76|0,b,c)){break a}i=j+1|0;while(1){e:{if(!H[e+76>>2]){break e}f=H[e+72>>2];if(!ib(a,f,0,0,b,c)){break a}h=H[a+128>>2];k=H[a+132>>2];g=f+1|0;H[e+32>>2]=g;H[e+36>>2]=N(h,k);Ba(c,4,11795,e+32|0);if(!Hc(H[a+232>>2],H[H[a+100>>2]+24>>2])){break a}d=H[a+180>>2]+N(f,5644)|0;h=H[d+5596>>2];if(h){Ca(h);H[d+5596>>2]=0;H[d+5600>>2]=0}H[e+16>>2]=g;Ba(c,4,16601,e+16|0);if((f|0)==(j|0)){d=H[a+224>>2];f=H[d+8>>2];d=H[d+12>>2];f=f+2|0;d=f>>>0<2?d+1|0:d;if(bb(b,f,d,c)){break e}d=0;Ba(c,1,5440,0);break a}H[e+4>>2]=i;H[e>>2]=g;Ba(c,2,13648,e);d=0;if(cb(a,e+72|0,0,e+68|0,e- -64|0,e+60|0,e+56|0,e+52|0,e+76|0,b,c)){continue}break a}break}d=Gc(a,c)}na=e+80|0;return d|0}function Ma(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;h=H[a+16>>2];if(h>>>0>=32){return H[a+8>>2]}c=H[a+24>>2];a:{if((c|0)>=4){b=H[a>>2];d=H[b>>2];e=c-4|0;H[a+24>>2]=e;H[a>>2]=b+4;break a}d=H[a+28>>2]?-1:0;if((c|0)<=0){e=c;break a}b=H[a>>2];if((c|0)!=1){j=c&1;i=c&2147483646;while(1){e=b;H[a>>2]=b+1;k=I[b|0];b=b+2|0;H[a>>2]=b;H[a+24>>2]=c-1;e=I[e+1|0];c=c-2|0;H[a+24>>2]=c;d=((255<>2]=b+1;b=I[b|0];H[a+24>>2]=c-1;d=(255<>2];i=d>>>24|0;H[a+20>>2]=(i|0)==255;c=d>>>16&255;f=d>>>8&255;b=b?7:8;d=d&255;g=b+((d|0)==255?7:8)|0;k=((f|0)==255?7:8)+g|0;j=(h+((c|0)==255?7:8)|0)+k|0;H[a+16>>2]=j;l=H[a+12>>2];b=d|(f<>>0>=32){d=b<>>32-c;b=b<>2];b=d|l;k=b;H[a+8>>2]=h;H[a+12>>2]=b;if(j>>>0<=31){b:{if((e|0)>=4){b=H[a>>2];d=H[b>>2];H[a+24>>2]=e-4;H[a>>2]=b+4;break b}f=0;d=H[a+28>>2]?-1:0;if((e|0)<=0){break b}b=H[a>>2];if((e|0)!=1){l=e&1;m=e&2147483646;g=0;while(1){c=b;H[a>>2]=b+1;n=I[b|0];b=b+2|0;H[a>>2]=b;H[a+24>>2]=e-1;c=I[c+1|0];e=e-2|0;H[a+24>>2]=e;d=((255<>2]=b+1;b=I[b|0];H[a+24>>2]=e-1;d=(255<>>24|0;H[a+20>>2]=(e|0)==255;c=d>>>16&255;f=d>>>8&255;g=(i|0)==255?7:8;d=d&255;i=g+((d|0)==255?7:8)|0;l=((f|0)==255?7:8)+i|0;H[a+16>>2]=(((c|0)==255?7:8)+j|0)+l;b=a;a=d|(f<>>0>=32){c=a<>>32-e;a=a<>2]=h;H[b+12>>2]=c|k}return h}function Lc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0;h=na-32|0;na=h;if(H[a+8>>2]==16){f=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{f=H[a+12>>2]}a:{if(K[d>>2]<=4){a=0;Ba(e,1,2607,0);break a}f=H[f+5584>>2]+N(b,1080)|0;Da(c,f+4|0,1);g=H[f+4>>2]+1|0;H[f+4>>2]=g;if(g>>>0>=34){H[h+4>>2]=33;H[h>>2]=g;Ba(e,1,7635,h);a=0;break a}j=H[a+184>>2];if(j>>>0>=g>>>0){H[h+24>>2]=g;H[h+20>>2]=j;H[h+16>>2]=b;Ba(e,1,16423,h+16|0);H[a+8>>2]=H[a+8>>2]|32768;a=0;break a}Da(c+1|0,f+8|0,1);H[f+8>>2]=H[f+8>>2]+2;Da(c+2|0,f+12|0,1);a=H[f+12>>2]+2|0;H[f+12>>2]=a;b=H[f+8>>2];if(!(!(b>>>0>10|a>>>0>10)&a+b>>>0<13)){a=0;Ba(e,1,5468,0);break a}Da(c+3|0,f+16|0,1);if(I[f+16|0]&128){a=0;Ba(e,1,6564,0);break a}Da(c+4|0,f+20|0,1);if(K[f+20>>2]>=2){a=0;Ba(e,1,6499,0);break a}b=H[d>>2]-5|0;H[d>>2]=b;a=1;g=H[f+4>>2];if(!(F[f|0]&1)){if(!g){break a}j=g&3;d=f+944|0;e=f+812|0;b=0;c=0;if(g>>>0>=4){k=g&-4;g=0;while(1){f=c<<2;H[f+e>>2]=15;H[d+f>>2]=15;i=f|4;H[i+e>>2]=15;H[d+i>>2]=15;i=f|8;H[i+e>>2]=15;H[d+i>>2]=15;f=f|12;H[f+e>>2]=15;H[d+f>>2]=15;c=c+4|0;g=g+4|0;if((k|0)!=(g|0)){continue}break}if(!j){break a}}while(1){a=c<<2;H[a+e>>2]=15;H[a+d>>2]=15;a=1;c=c+1|0;b=b+1|0;if((j|0)!=(b|0)){continue}break}break a}if(b>>>0>=g>>>0){b:{if(!g){g=0;break b}Da(c+5|0,h+28|0,1);a=H[h+28>>2];H[f+944>>2]=a>>>4;H[f+812>>2]=a&15;g=H[f+4>>2];if(g>>>0>=2){j=f+944|0;k=f+812|0;a=c+6|0;c=1;while(1){Da(a,h+28|0,1);c:{b=H[h+28>>2];if(b>>>0>=16){g=b&15;if(g){break c}}a=0;Ba(e,1,6025,0);break a}i=c<<2;H[i+k>>2]=g;H[j+i>>2]=b>>>4;a=a+1|0;c=c+1|0;g=H[f+4>>2];if(c>>>0>>0){continue}break}}b=H[d>>2]}H[d>>2]=b-g;a=1;break a}a=0;Ba(e,1,2607,0)}na=h+32|0;return a}function gc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;j=na-256|0;na=j;g=Ea(1,20);a:{if(!g){Ba(c,1,6413,0);g=0;break a}H[g+4>>2]=b;H[g>>2]=a;H[j>>2]=b;H[j+128>>2]=a;while(1){p=h;h=h+1|0;e=h<<2;d=(b+1|0)/2|0;H[e+j>>2]=d;i=e+(j+128|0)|0;e=(a+1|0)/2|0;H[i>>2]=e;i=N(a,b);f=i+f|0;b=d;a=e;if(i>>>0>1){continue}break}H[g+8>>2]=f;if(!f){Ca(g);g=0;break a}d=Ea(f,16);H[g+12>>2]=d;if(!d){Ba(c,1,3564,0);Ca(g);g=0;break a}l=H[g+8>>2];H[g+16>>2]=l<<4;a=d;if(p){f=(N(H[g+4>>2],H[g>>2])<<4)+d|0;b=f;while(1){c=n<<2;e=H[c+j>>2];b:{if((e|0)<=0){break b}o=e-1|0;i=0;c:{d:{c=H[c+(j+128|0)>>2];if((c|0)<=0){k=e&3;if(e>>>0>=4){break d}h=0;break c}while(1){h=f;f=c;while(1){e:{H[a>>2]=b;if((f|0)==1){a=a+16|0;b=b+16|0;break e}H[a+16>>2]=b;b=b+16|0;a=a+32|0;k=(f|0)>2;f=f-2|0;if(k){continue}}break}k=((i|0)==(o|0)|i)&1;f=k?b:h+(c<<4)|0;b=k?b:h;i=i+1|0;if((e|0)!=(i|0)){continue}break}break b}m=e&2147483644;h=0;e=0;while(1){q=(h|0)==(o|0);h=h+4|0;f=q?b:f;b=f;e=e+4|0;if((m|0)!=(e|0)){continue}break}if(k){break c}break b}while(1){e=f;m=((h|0)==(o|0)|h)&1;f=m?b:e+(c<<4)|0;b=m?b:e;h=h+1|0;i=i+1|0;if((k|0)!=(i|0)){continue}break}}n=n+1|0;if((n|0)!=(p|0)){continue}break}}H[a>>2]=0;f:{if(!l){break f}a=l&3;if(l>>>0>=4){c=l&-4;b=0;while(1){H[d+60>>2]=0;H[d+52>>2]=999;H[d+56>>2]=0;H[d+44>>2]=0;H[d+36>>2]=999;H[d+40>>2]=0;H[d+28>>2]=0;H[d+20>>2]=999;H[d+24>>2]=0;H[d+12>>2]=0;H[d+4>>2]=999;H[d+8>>2]=0;d=d- -64|0;b=b+4|0;if((c|0)!=(b|0)){continue}break}if(!a){break f}}b=0;while(1){H[d+12>>2]=0;H[d+4>>2]=999;H[d+8>>2]=0;d=d+16|0;b=b+1|0;if((a|0)!=(b|0)){continue}break}}}na=j+256|0;return g}function Zb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;H[a+8>>2]=0;H[a+12>>2]=0;H[a>>2]=b;H[a+16>>2]=0;H[a+20>>2]=0;H[a+28>>2]=d;h=c-1|0;H[a+24>>2]=h;n=b&3;a:{if((c|0)<=0){e=b;b=d;break a}e=b+1|0;H[a>>2]=e;b=I[b|0]}g=b;i=8;H[a+16>>2]=8;j=(g|0)==255;H[a+20>>2]=j;H[a+8>>2]=g;H[a+12>>2]=0;b:{if((n|0)==3){break b}k=c-2|0;H[a+24>>2]=k;c:{if((c|0)<2){b=e;e=d;break c}b=e+1|0;H[a>>2]=b;e=I[e|0]}j=(e|0)==255;H[a+20>>2]=j;i=(g|0)==255?15:16;H[a+16>>2]=i;g=g|e<<8;H[a+8>>2]=g;H[a+12>>2]=0;if((n|0)==2){e=b;c=h;h=k;break b}o=c-3|0;H[a+24>>2]=o;d:{if((c|0)<3){f=b;b=d;break d}f=b+1|0;H[a>>2]=f;b=I[b|0]}j=(b|0)==255;H[a+20>>2]=j;l=((e|0)==255?7:8)+i|0;H[a+16>>2]=l;e=i&31;if((i&63)>>>0>=32){m=b<>>32-e;e=b<>2]=g;H[a+12>>2]=m;if((n|0)==1){e=f;i=l;c=k;h=o;break b}h=c-4|0;H[a+24>>2]=h;e:{if((c|0)<4){e=f;c=d;break e}e=f+1|0;H[a>>2]=e;c=I[f|0]}j=(c|0)==255;H[a+20>>2]=j;i=l+((b|0)==255?7:8)|0;H[a+16>>2]=i;b=l&31;if((l&63)>>>0>=32){f=c<>>32-b;b=c<>2]=g;H[a+12>>2]=b;c=o}f:{if((c|0)>=5){d=H[e>>2];H[a+24>>2]=c-5;H[a>>2]=e+4;break f}b=0;d=d?-1:0;if((c|0)<2){break f}while(1){c=e+1|0;H[a>>2]=c;e=I[e|0];f=h-1|0;H[a+24>>2]=f;d=(255<>>0>1;e=c;h=f;if(k){continue}break}}b=d>>>24|0;H[a+20>>2]=(b|0)==255;c=d>>>16&255;e=d>>>8&255;h=j?7:8;d=d&255;f=h+((d|0)==255?7:8)|0;k=((e|0)==255?7:8)+f|0;H[a+16>>2]=(((c|0)==255?7:8)+i|0)+k;b=d|(e<>>0>=32){d=a<>>32-b;a=a<>2]=a|g;H[c+12>>2]=d|m}function Ha(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!b){return 0}a:{if(!a){a=gb(8,b);break a}if(!b){Ca(a);a=0;break a}b:{if(b>>>0>4294967239){break b}h=b>>>0<=8?8:b+3&-4;d=h+8|0;j=a-4|0;f=j;e=H[f>>2];b=e+f|0;c=H[b>>2];c:{d:{e:{if((c|0)!=H[(b+c|0)-4>>2]){c=c+e|0;if(c>>>0>=d+16>>>0){e=H[b+4>>2];b=H[b+8>>2];H[e+8>>2]=b;H[b+4>>2]=e;b=d+f|0;c=c-d|0;H[b>>2]=c;H[(b+(c&-4)|0)-4>>2]=c|1;e=H[b>>2]-8|0;f:{if(e>>>0<=127){g=(e>>>3|0)-1|0;break f}c=Q(e);g=((e>>>29-c^4)-(c<<2)|0)+110|0;if(e>>>0<=4095){break f}c=((e>>>30-c^2)-(c<<1)|0)+71|0;g=c>>>0>=63?63:c}c=g;e=c<<4;H[b+4>>2]=e+26400;e=e+26408|0;H[b+8>>2]=H[e>>2];H[e>>2]=b;H[H[b+8>>2]+4>>2]=b;e=H[6859];b=c&31;if((c&63)>>>0>=32){c=1<>>32-b}H[6858]=g|H[6858];H[6859]=c|e;H[f>>2]=d;H[(f+(d&-4)|0)-4>>2]=d;c=1;break c}if(c>>>0>>0){break e}d=H[b+4>>2];b=H[b+8>>2];H[d+8>>2]=b;H[b+4>>2]=d;H[f>>2]=c;H[(f+(c&-4)|0)-4>>2]=c;c=1;break c}if(e>>>0>=d+16>>>0){H[f>>2]=d;H[(f+(d&-4)|0)-4>>2]=d;b=d+f|0;c=e-d|0;H[b>>2]=c;H[(b+(c&-4)|0)-4>>2]=c|1;d=H[b>>2]-8|0;g:{if(d>>>0<=127){c=(d>>>3|0)-1|0;break g}f=Q(d);c=((d>>>29-f^4)-(f<<2)|0)+110|0;if(d>>>0<=4095){break g}c=((d>>>30-f^2)-(f<<1)|0)+71|0;c=c>>>0>=63?63:c}d=c<<4;H[b+4>>2]=d+26400;d=d+26408|0;H[b+8>>2]=H[d>>2];H[d>>2]=b;H[H[b+8>>2]+4>>2]=b;d=H[6859];b=c&31;if((c&63)>>>0>=32){c=1<>>32-b;b=e}H[6858]=b|H[6858];H[6859]=c|d;c=1;break c}c=1;if(d>>>0<=e>>>0){break d}}c=0}}if(c){break a}b=gb(8,h);if(!b){break b}i=H[j>>2]-8|0;ab(b,a,h>>>0>>0?h:i);Ca(a);i=b}a=i}return a}function ne(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=na-16|0;na=f;H[f+12>>2]=c;k=H[a+96>>2];if(H[a+8>>2]==16){e=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{e=H[a+12>>2]}F[e+5640|0]=I[e+5640|0]|1;a:{if(c>>>0<=4){c=0;Ba(d,1,4565,0);break a}Da(b,e,1);if(K[e>>2]>=8){c=0;Ba(d,1,4531,0);break a}Da(b+1|0,f+8|0,1);c=H[f+8>>2];H[e+4>>2]=c;if((c|0)>=5){Ba(d,1,4490,0);H[e+4>>2]=-1}Da(b+2|0,e+8|0,2);g=H[e+8>>2];if(g-65536>>>0<=4294901760){H[f>>2]=g;Ba(d,1,8111,f);c=0;break a}c=H[a+188>>2];H[e+12>>2]=c?c:g;Da(b+4|0,e+16|0,1);if(K[e+16>>2]>=2){c=0;Ba(d,1,5536,0);break a}g=b+5|0;H[f+12>>2]=H[f+12>>2]-5;c=H[k+16>>2];b:{if(!c){break b}k=c&7;h=H[e>>2]&1;e=H[e+5584>>2];b=0;if(c>>>0>=8){c=c&-8;while(1){i=e+N(b,1080)|0;H[i+7560>>2]=h;H[i+6480>>2]=h;H[i+5400>>2]=h;H[i+4320>>2]=h;H[i+3240>>2]=h;H[i+2160>>2]=h;H[i+1080>>2]=h;H[i>>2]=h;b=b+8|0;j=j+8|0;if((c|0)!=(j|0)){continue}break}if(!k){break b}}while(1){H[e+N(b,1080)>>2]=h;b=b+1|0;l=l+1|0;if((k|0)!=(l|0)){continue}break}}c=0;if(!Lc(a,0,g,f+12|0,d)){Ba(d,1,4565,0);break a}if(H[f+12>>2]){Ba(d,1,4565,0);break a}if(H[a+8>>2]==16){b=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{b=H[a+12>>2]}if(K[H[a+96>>2]+16>>2]>=2){b=H[b+5584>>2];g=H[b+4>>2]<<2;l=b+944|0;e=b+812|0;j=1;c=b;while(1){H[c+1084>>2]=H[b+4>>2];H[c+1088>>2]=H[b+8>>2];H[c+1092>>2]=H[b+12>>2];H[c+1096>>2]=H[b+16>>2];H[c+1100>>2]=H[b+20>>2];d=!g;if(!d){B(c+1892|0,e,g)}if(!d){B(c+2024|0,l,g)}c=c+1080|0;j=j+1|0;if(j>>>0>2]+16>>2]){continue}break}}c=1}na=f+16|0;return c|0}function gb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=a>>>0<=8?8:a;k=j+48|0;a:{b:{while(1){if(a-1&a|b>>>0>4294967239){break b}c=H[6859];e=c;h=H[6858];b=b>>>0<=8?8:b+3&-4;c:{if(b>>>0<=127){i=(b>>>3|0)-1|0;break c}d=Q(b);i=((b>>>29-d^4)-(d<<2)|0)+110|0;if(b>>>0<=4095){break c}d=((b>>>30-d^2)-(d<<1)|0)+71|0;i=d>>>0>=63?63:d}g=i;f=g&31;if((g&63)>>>0>=32){d=0;c=c>>>f|0}else{d=c>>>f|0;c=((1<>>f}if(c|d){while(1){f=d;d:{if(f|c){e=f-1|0;i=e+1|0;d=e;e=c-1|0;h=(e|0)!=-1?i:d;d=Q(f^h);d=(d|0)==32?Q(c^e)+32|0:d;e=63-d|0;qa=0-(d>>>0>63)|0;break d}qa=0;e=64}h=e;e=h&31;if((h&63)>>>0>=32){d=0;i=f>>>e|0}else{d=f>>>e|0;i=((1<>>e}g=g+h|0;c=g<<4;f=H[c+26408>>2];e=c+26400|0;e:{if((f|0)!=(e|0)){c=Cb(f,j,b);if(c){break a}c=H[f+4>>2];h=H[f+8>>2];H[c+8>>2]=h;H[h+4>>2]=c;H[f+8>>2]=e;H[f+4>>2]=H[e+4>>2];H[e+4>>2]=f;H[H[f+4>>2]+8>>2]=f;g=g+1|0;c=(d&1)<<31|i>>>1;d=d>>>1|0;break e}c=H[6859];l=27432,m=H[6858]&ye(-2,-1,g),H[l>>2]=m;H[6859]=qa&c;c=i^1}if(c|d){continue}break}h=H[6858];e=H[6859]}d=Q(e);f=63-((d|0)==32?Q(h)+32|0:d)|0;f:{if(!(e|h)){g=0;break f}c=f<<4;g=H[c+26408>>2];if(!e&h>>>0<1073741824){break f}d=98;e=c+26400|0;if((e|0)==(g|0)){break f}while(1){c=Cb(g,j,b);if(c){break a}g=H[g+8>>2];if((e|0)==(g|0)){break f}c=d;d=c-1|0;if(c){continue}break}}d=a>>>0>8;a=j;if(zc((d?k:48)+b|0)){continue}break}if(!g){break b}a=(f<<4)+26400|0;if((a|0)==(g|0)){break b}while(1){c=Cb(g,j,b);if(c){break a}g=H[g+8>>2];if((a|0)!=(g|0)){continue}break}}c=0}return c}function ud(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=H[a+48>>2];if(e>>>0>=b>>>0){H[a+48>>2]=e-b;H[a+36>>2]=H[a+36>>2]+b;e=c+H[a+60>>2]|0;d=b+H[a+56>>2]|0;e=d>>>0>>0?e+1|0:e;H[a+56>>2]=d;H[a+60>>2]=e;qa=c;return b|0}if(I[a+68|0]&4){H[a+48>>2]=0;H[a+36>>2]=e+H[a+36>>2];g=H[a+60>>2];c=H[a+56>>2];b=c+e|0;H[a+56>>2]=b;H[a+60>>2]=b>>>0>>0?g+1|0:g;qa=e?0:-1;return(e?e:-1)|0}if(e){H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];h=b;f=e;b=b-e|0;c=c-(e>>>0>h>>>0)|0}a:{if((c|0)>0){h=1}else{h=!!b&(c|0)>=0}if(h){while(1){h=H[a+12>>2];e=c+g|0;i=b+f|0;e=H[a+60>>2]+(i>>>0>>0?e+1|0:e)|0;j=i;i=i+H[a+56>>2]|0;e=j>>>0>i>>>0?e+1|0:e;if((e|0)==(h|0)&i>>>0>K[a+8>>2]|e>>>0>h>>>0){Ba(d,4,15630,0);H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];b=g+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b;d=H[a+8>>2];f=d-c|0;e=H[a+12>>2];g=e-((c>>>0>d>>>0)+b|0)|0;h=ra[H[a+28>>2]](d,e,H[a>>2])|0;i=H[a+68>>2];if(h){H[a+56>>2]=d;H[a+60>>2]=e}H[a+68>>2]=i|4;a=(c|0)==(d|0)&(b|0)==(e|0);b=a?-1:f;break a}e=ra[H[a+24>>2]](b,c,H[a>>2])|0;h=qa;i=h;if((e&i)==-1){Ba(d,4,15630,0);H[a+68>>2]=H[a+68>>2]|4;e=g+H[a+60>>2]|0;b=f+H[a+56>>2]|0;e=b>>>0>>0?e+1|0:e;H[a+56>>2]=b;H[a+60>>2]=e;a=!(g|f);b=a?-1:f;break a}g=g+i|0;f=e+f|0;g=f>>>0>>0?g+1|0:g;h=b;b=b-e|0;c=c-((e>>>0>h>>>0)+i|0)|0;if(!!b&(c|0)>=0|(c|0)>0){continue}break}}b=g+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b;qa=g;return f|0}qa=a?-1:g;return b|0}function yd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=na-80|0;na=e;a:{if(c>>>0<=2){Ba(d,1,14478,0);break a}if(I[a+124|0]){Ba(d,4,11193,0);g=1;break a}g=1;Da(b,a+40|0,1);Da(b+1|0,a+52|0,1);Da(b+2|0,a+44|0,1);f=b+3|0;b:{c:{d:{e:{f:{h=H[a+40>>2];switch(h-1|0){case 0:break f;case 1:break e;default:break d}}if(c>>>0<=6){H[e+16>>2]=c;Ba(d,1,15155,e+16|0);g=0;break a}if(!((c|0)==7|H[a+48>>2]==14)){H[e+48>>2]=c;Ba(d,2,15155,e+48|0)}Da(f,a+48|0,4);if(H[a+48>>2]!=14){break b}f=Fa(36);if(!f){g=0;Ba(d,1,7993,0);break a}H[f>>2]=14;H[e+64>>2]=0;H[e+56>>2]=0;H[e+72>>2]=0;H[e+60>>2]=0;H[e+68>>2]=0;H[e+76>>2]=0;g=4470064;H[e+52>>2]=4470064;H[f+4>>2]=1145390592;g:{if((c|0)!=7){if((c|0)==35){Da(b+7|0,e+76|0,4);Da(b+11|0,e+72|0,4);Da(b+15|0,e+68|0,4);Da(b+19|0,e- -64|0,4);Da(b+23|0,e+60|0,4);Da(b+27|0,e+56|0,4);Da(b+31|0,e+52|0,4);H[f+4>>2]=0;g=H[e+52>>2];c=H[e+56>>2];d=H[e+64>>2];i=H[e+68>>2];j=H[e+76>>2];h=H[e+72>>2];b=H[e+60>>2];break g}H[e+32>>2]=c;Ba(d,2,15191,e+32|0)}c=0;d=0;h=0;b=0}H[f+24>>2]=b;H[f+16>>2]=i;H[f+8>>2]=j;H[f+32>>2]=g;H[f+28>>2]=c;H[f+20>>2]=d;H[f+12>>2]=h;H[a+112>>2]=0;H[a+108>>2]=f;break b}b=c-3|0;H[a+112>>2]=b;d=Ea(1,b);H[a+108>>2]=d;if(!d){break c}if((c|0)<=3){break b}c=0;while(1){Da(f,e+76|0,1);F[H[a+108>>2]+c|0]=H[e+76>>2];f=f+1|0;c=c+1|0;if((b|0)!=(c|0)){continue}break}break b}if(h>>>0<3){break a}H[e>>2]=h;Ba(d,4,15950,e);break a}g=0;H[a+112>>2]=0;break a}g=1;F[a+124|0]=1}na=e+80|0;return g|0}function Ja(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;h=H[a+48>>2];if(h>>>0>=c>>>0){if(c){B(b,H[a+36>>2],c)}H[a+36>>2]=H[a+36>>2]+c;H[a+48>>2]=H[a+48>>2]-c;b=H[a+60>>2];d=H[a+56>>2]+c|0;b=d>>>0>>0?b+1|0:b;H[a+56>>2]=d;H[a+60>>2]=b;return c}if(I[a+68|0]&4){if(h){B(b,H[a+36>>2],h)}b=H[a+48>>2];H[a+48>>2]=0;H[a+36>>2]=b+H[a+36>>2];g=H[a+60>>2];c=b;b=H[a+56>>2]+b|0;g=c>>>0>b>>>0?g+1|0:g;H[a+56>>2]=b;H[a+60>>2]=g;return h?h:-1}a:{if(h){if(h){B(b,H[a+36>>2],h)}i=H[a+32>>2];H[a+36>>2]=i;e=H[a+48>>2];H[a+48>>2]=0;f=H[a+60>>2];g=H[a+56>>2]+e|0;f=g>>>0>>0?f+1|0:f;H[a+56>>2]=g;H[a+60>>2]=f;c=c-e|0;b=b+e|0;break a}i=H[a+32>>2];H[a+36>>2]=i}b:{while(1){c:{e=H[a>>2];f=H[a+16>>2];g=H[a+64>>2];d:{if(g>>>0>c>>>0){f=ra[f|0](i,g,e)|0;H[a+48>>2]=f;if((f|0)==-1){break b}if(c>>>0>f>>>0){if(f){B(b,H[a+36>>2],f)}i=H[a+32>>2];H[a+36>>2]=i;e=H[a+48>>2];break d}if(c){B(b,H[a+36>>2],c)}H[a+36>>2]=H[a+36>>2]+c;H[a+48>>2]=H[a+48>>2]-c;b=H[a+60>>2];d=H[a+56>>2]+c|0;b=d>>>0>>0?b+1|0:b;H[a+56>>2]=d;H[a+60>>2]=b;return c+h|0}e=ra[f|0](b,c,e)|0;H[a+48>>2]=e;if((e|0)==-1){break b}if(c>>>0<=e>>>0){break c}i=H[a+32>>2];H[a+36>>2]=i;f=e}H[a+48>>2]=0;g=H[a+60>>2];j=H[a+56>>2]+e|0;g=j>>>0>>0?g+1|0:g;H[a+56>>2]=j;H[a+60>>2]=g;b=b+e|0;c=c-e|0;h=f+h|0;continue}break}H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];f=H[a+60>>2];b=H[a+56>>2]+e|0;f=b>>>0>>0?f+1|0:f;H[a+56>>2]=b;H[a+60>>2]=f;return e+h|0}Ba(d,4,15630,0);H[a+48>>2]=0;H[a+68>>2]=H[a+68>>2]|4;return h?h:-1}function Ta(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{b:{if(!H[a+12>>2]){k=1;if(H[a+4>>2]>0|H[a+8>>2]>1){break b}break a}e=1;if(H[a+8>>2]>0){break b}if(H[a+4>>2]<2){break a}}b=H[a>>2];f=b+(e<<5)|0;g=H[a+16>>2];h=H[a+20>>2];if(g>>>0>>0){d=g;while(1){c=(d<<6)+f|0;L[c>>2]=L[c>>2]*O(1.2301740646362305);L[c+4>>2]=L[c+4>>2]*O(1.2301740646362305);L[c+8>>2]=L[c+8>>2]*O(1.2301740646362305);L[c+12>>2]=L[c+12>>2]*O(1.2301740646362305);L[c+16>>2]=L[c+16>>2]*O(1.2301740646362305);L[c+20>>2]=L[c+20>>2]*O(1.2301740646362305);L[c+24>>2]=L[c+24>>2]*O(1.2301740646362305);L[c+28>>2]=L[c+28>>2]*O(1.2301740646362305);d=d+1|0;if((h|0)!=(d|0)){continue}break}}i=b+(k<<5)|0;j=H[a+28>>2];c=H[a+24>>2];if(j>>>0>c>>>0){d=c;while(1){b=(d<<6)+i|0;L[b>>2]=L[b>>2]*O(1.625732421875);L[b+4>>2]=L[b+4>>2]*O(1.625732421875);L[b+8>>2]=L[b+8>>2]*O(1.625732421875);L[b+12>>2]=L[b+12>>2]*O(1.625732421875);L[b+16>>2]=L[b+16>>2]*O(1.625732421875);L[b+20>>2]=L[b+20>>2]*O(1.625732421875);L[b+24>>2]=L[b+24>>2]*O(1.625732421875);L[b+28>>2]=L[b+28>>2]*O(1.625732421875);d=d+1|0;if((j|0)!=(d|0)){continue}break}}b=f+32|0;d=H[a+8>>2];a=H[a+4>>2];e=a-e|0;e=(d|0)<(e|0)?d:e;mb(i,b,g,h,e,O(-.4435068666934967));l=i+32|0;d=d-k|0;a=(a|0)<(d|0)?a:d;mb(f,l,c,j,a,O(-.8829110860824585));mb(i,b,g,h,e,O(.05298011749982834));mb(f,l,c,j,a,O(1.5861343145370483))}}function _b(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=H[a+28>>2]+N(b,152)|0;c=H[e-144>>2]-H[e-152>>2]|0;d=H[e-140>>2]-H[e-148>>2]|0;f=d>>>0>=64?64:d;g=c>>>0>=64?64:c;a:{if(!(!c|!d|(!g|!f)|g>>>0>4294967295/(f>>>0)>>>2>>>0)){e=Ea(1,28);H[e+12>>2]=f;H[e+8>>2]=g;H[e+4>>2]=d;H[e>>2]=c;j=d;d=d+f|0;i=j>>>0>d>>>0;d=ve(d-1|0,i-!d|0,f,0);H[e+20>>2]=d;j=c;c=c+g|0;f=j>>>0>c>>>0;c=ve(c-1|0,f-!c|0,g,0);H[e+16>>2]=c;re(d,0,c);b:{if(qa){break b}c=Ea(4,N(c,d));H[e+24>>2]=c;if(!c){break b}break a}Ca(e)}e=0}if(!e){return 0}c:{if(b){while(1){q=N(p,152);g=q+H[a+28>>2]|0;c=H[g+24>>2];if(c){j=g+28|0;d=H[g+20>>2];f=H[g+16>>2];n=0;while(1){if(N(d,f)){i=N(n,36)+j|0;o=0;while(1){k=H[i+20>>2]+N(o,40)|0;c=H[k+20>>2];h=H[k+16>>2];if(N(c,h)){f=0;while(1){l=H[k+24>>2]+N(f,68)|0;r=H[l+60>>2];if(r){h=H[l+8>>2];d=h-H[i>>2]|0;m=H[i+16>>2];if(m&1){c=H[a+28>>2]+q|0;d=(H[c-144>>2]+d|0)-H[c-152>>2]|0}s=H[l+12>>2];c=s-H[i+4>>2]|0;if(m&2){m=H[a+28>>2]+q|0;c=(c+H[m-140>>2]|0)-H[m-148>>2]|0}h=H[l+16>>2]-h|0;if(!Za(e,d,c,d+h|0,(H[l+20>>2]-s|0)+c|0,r,1,h)){break c}h=H[k+16>>2];c=H[k+20>>2]}f=f+1|0;if(f>>>0>>0){continue}break}f=H[g+16>>2];d=H[g+20>>2]}o=o+1|0;if(o>>>0>>0){continue}break}c=H[g+24>>2]}n=n+1|0;if(n>>>0>>0){continue}break}}p=p+1|0;if((p|0)!=(b|0)){continue}break}}return e}Va(e);return 0}function $d(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=na-16|0;na=h;if(H[a+8>>2]==16){e=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{e=H[a+12>>2]}a:{if(c>>>0<=1){Ba(d,1,4132,0);a=0;break a}Da(b,h+12|0,2);b:{if(H[h+12>>2]){Ba(d,2,3608,0);break b}if(c>>>0<=6){Ba(d,1,4132,0);a=0;break a}Da(b+2|0,h+12|0,2);g=H[e+5616>>2];k=I[h+12|0];f=H[e+5620>>2];c:{d:{if(!f){break d}a=g;while(1){if(H[a+8>>2]!=(k|0)){a=a+20|0;i=i+1|0;if((i|0)!=(f|0)){continue}break d}break}if((f|0)!=(i|0)){break c}}if(H[e+5624>>2]==(f|0)){a=f+10|0;H[e+5624>>2]=a;a=Ha(g,N(a,20));g=H[e+5616>>2];if(!a){Ca(g);H[e+5624>>2]=0;H[e+5616>>2]=0;H[e+5620>>2]=0;Ba(d,1,4158,0);a=0;break a}e:{if((a|0)==(g|0)){break e}l=H[e+5632>>2];if(!l){break e}m=H[e+5628>>2];i=0;while(1){f=N(i,20)+m|0;j=H[f+8>>2];if(j){H[f+8>>2]=a+(j-g|0)}j=H[f+12>>2];if(j){H[f+12>>2]=a+(j-g|0)}i=i+1|0;if((l|0)!=(i|0)){continue}break}}H[e+5616>>2]=a;g=H[e+5620>>2];f=N(H[e+5624>>2]-g|0,20);if(f){y(a+N(g,20)|0,0,f)}f=H[e+5620>>2];g=H[e+5616>>2]}H[e+5620>>2]=f+1;a=N(f,20)+g|0}e=H[a+12>>2];if(e){Ca(e);H[a+12>>2]=0;H[a+16>>2]=0}H[a+8>>2]=k;e=H[h+12>>2];H[a>>2]=e>>>10&3;H[a+4>>2]=e>>>8&3;Da(b+4|0,h+12|0,2);if(H[h+12>>2]){Ba(d,2,3023,0);break b}c=c-6|0;e=Fa(c);H[a+12>>2]=e;if(!e){Ba(d,1,4132,0);a=0;break a}if(c){B(e,b+6|0,c)}H[a+16>>2]=c}a=1}na=h+16|0;return a|0}function Tb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(a){b=H[a+20>>2];if(b){g=H[b>>2];if(g){d=H[g+20>>2];if(H[g+16>>2]){i=F[a+40|0]&1?16:17;while(1){c=H[d+28>>2];if(c){b=H[d+32>>2];l=(b>>>0)/152|0;j=0;if(b>>>0>=152){while(1){b=H[c+48>>2];if(b){f=H[c+52>>2];h=(f>>>0)/40|0;e=0;if(f>>>0>=40){while(1){_a(H[b+32>>2]);H[b+32>>2]=0;_a(H[b+36>>2]);H[b+36>>2]=0;ra[i|0](b);b=b+40|0;e=e+1|0;if((h|0)!=(e|0)){continue}break}b=H[c+48>>2]}Ca(b);H[c+48>>2]=0}b=H[c+84>>2];if(b){f=H[c+88>>2];h=(f>>>0)/40|0;e=0;if(f>>>0>=40){while(1){_a(H[b+32>>2]);H[b+32>>2]=0;_a(H[b+36>>2]);H[b+36>>2]=0;ra[i|0](b);b=b+40|0;e=e+1|0;if((h|0)!=(e|0)){continue}break}b=H[c+84>>2]}Ca(b);H[c+84>>2]=0}b=H[c+120>>2];if(b){f=H[c+124>>2];h=(f>>>0)/40|0;e=0;if(f>>>0>=40){while(1){_a(H[b+32>>2]);H[b+32>>2]=0;_a(H[b+36>>2]);H[b+36>>2]=0;ra[i|0](b);b=b+40|0;e=e+1|0;if((h|0)!=(e|0)){continue}break}b=H[c+120>>2]}Ca(b);H[c+120>>2]=0}c=c+152|0;j=j+1|0;if((l|0)!=(j|0)){continue}break}c=H[d+28>>2]}Ca(c);H[d+28>>2]=0}a:{if(!H[d+40>>2]){break a}b=H[d+36>>2];if(!b){break a}Ca(b);H[d+44>>2]=0;H[d+48>>2]=0;H[d+36>>2]=0;H[d+40>>2]=0}Ca(H[d+52>>2]);d=d+76|0;k=k+1|0;if(k>>>0>2]){continue}break}d=H[g+20>>2]}Ca(d);H[g+20>>2]=0;Ca(H[H[a+20>>2]>>2]);b=H[a+20>>2];H[b>>2]=0}Ca(b);H[a+20>>2]=0}Ca(H[a+68>>2]);Ca(a)}}function Rb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=H[a+24>>2];j=H[e+16>>2];if(!j){return 0}f=H[e+24>>2];e=H[H[H[a+20>>2]>>2]+20>>2];a:{b:{if(!b){b=0;while(1){c=H[f+24>>2];a=H[e+28>>2]+N(H[e+24>>2],152)|0;d=H[a-140>>2];g=H[a-144>>2]-H[a-152>>2]|0;a=H[a-148>>2];h=d-a|0;re(g,0,h);if(!(!qa|(a|0)==(d|0))){break a}a=(c>>>3|0)+((c&7)!=0)|0;c=(a|0)==3?4:a;a=!c;d=N(g,h);re(c,0,d);if(!(!qa|a)){break a}a=-1;c=N(c,d);if(c>>>0>(b^-1)>>>0){break b}e=e+76|0;f=f+52|0;b=b+c|0;a=b;i=i+1|0;if((j|0)!=(i|0)){continue}break}break b}b=0;if(!H[a+64>>2]){while(1){c=H[f+24>>2];a=H[e+28>>2]+N(H[e+24>>2],152)|0;d=H[a-4>>2];g=H[a-8>>2]-H[a-16>>2]|0;a=H[a-12>>2];h=d-a|0;re(g,0,h);if(!(!qa|(a|0)==(d|0))){break a}a=(c>>>3|0)+((c&7)!=0)|0;c=(a|0)==3?4:a;a=!c;d=N(g,h);re(c,0,d);if(!(!qa|a)){break a}a=-1;c=N(c,d);if(c>>>0>(b^-1)>>>0){break b}e=e+76|0;f=f+52|0;b=b+c|0;a=b;i=i+1|0;if((j|0)!=(i|0)){continue}break}break b}while(1){c=H[f+24>>2];a=H[e+28>>2]+N(H[e+24>>2],152)|0;d=H[a-140>>2];g=H[a-144>>2]-H[a-152>>2]|0;a=H[a-148>>2];h=d-a|0;re(g,0,h);if(!(!qa|(a|0)==(d|0))){break a}a=(c>>>3|0)+((c&7)!=0)|0;c=(a|0)==3?4:a;a=!c;d=N(g,h);re(c,0,d);if(!(!qa|a)){break a}a=-1;c=N(c,d);if(c>>>0>(b^-1)>>>0){break b}e=e+76|0;f=f+52|0;b=b+c|0;a=b;i=i+1|0;if((j|0)!=(i|0)){continue}break}}return a}return-1}function $b(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;c=H[a+8>>2];e=c+H[a+4>>2]|0;a:{if(!H[a+12>>2]){if((e|0)<2){break a}h=(c<<2)+b|0;d=H[h>>2];c=H[b>>2]-(d+1>>1)|0;i=H[a>>2];if(e>>>0>=4){k=(e-4>>>1|0)+1|0;a=1;while(1){f=d;d=a<<2;m=H[d+b>>2];d=H[d+h>>2];j=c;l=i+(g<<2)|0;H[l>>2]=c;c=m-((d+f|0)+2>>2)|0;H[l+4>>2]=f+(j+c>>1);g=g+2|0;f=(a|0)!=(k|0);a=a+1|0;if(f){continue}break}}H[i+(g<<2)>>2]=c;if(e&1){f=e-1|0;a=H[(f<<1)+b>>2]-(d+1>>1)|0;H[i+(f<<2)>>2]=a;c=a+c>>1;j=-8}else{j=-4}a=e<<2;H[j+(a+i|0)>>2]=c+d;if(!a){break a}B(b,i,a);return}b:{switch(e-1|0){case 0:H[b>>2]=H[b>>2]/2;return;case 1:a=H[a>>2];c=(c<<2)+b|0;d=H[b>>2]-(H[c>>2]+1>>1)|0;H[a+4>>2]=d;H[a>>2]=d+H[c>>2];c=H[a+4>>2];H[b>>2]=H[a>>2];H[b+4>>2]=c;return;default:break b}}if((e|0)<3){break a}h=H[a>>2];k=(c<<2)+b|0;d=H[k+4>>2];a=H[k>>2];c=H[b>>2]-((d+a|0)+2>>2)|0;H[h>>2]=c+a;g=1;m=e-2|0;l=e&1;a=!l;if(m-a>>>0>=2){o=((e-a|0)-4>>>1|0)+1|0;a=1;while(1){f=d;p=H[(a<<2)+b>>2];j=a+1|0;d=H[k+(j<<2)>>2];i=c;n=h+(g<<2)|0;H[n>>2]=c;c=p-((d+f|0)+2>>2)|0;H[n+4>>2]=f+(i+c>>1);g=g+2|0;f=(a|0)!=(o|0);a=j;if(f){continue}break}}H[h+(g<<2)>>2]=c;c:{if(!l){g=H[((e<<1)+b|0)-4>>2]-(d+1>>1)|0;H[h+(m<<2)>>2]=(g+c>>1)+d;break c}g=c+d|0}a=e<<2;H[(a+h|0)-4>>2]=g;if(!a){break a}B(b,h,a)}}function Hb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=na-256|0;na=d;if(a){Ac(1806,17,c);H[d+240>>2]=H[a>>2];Ga(c,2348,d+240|0);H[d+224>>2]=H[a+4>>2];Ga(c,2361,d+224|0);H[d+208>>2]=H[a+8>>2];Ga(c,7260,d+208|0);H[d+192>>2]=H[a+16>>2];Ga(c,2319,d+192|0);if((b|0)>0){while(1){e=H[a+5584>>2];H[d+176>>2]=h;Ga(c,1844,d+176|0);e=e+N(h,1080)|0;H[d+160>>2]=H[e>>2];Ga(c,2347,d+160|0);H[d+144>>2]=H[e+4>>2];Ga(c,7374,d+144|0);H[d+128>>2]=H[e+8>>2];Ga(c,7162,d+128|0);H[d+112>>2]=H[e+12>>2];Ga(c,7178,d+112|0);H[d+96>>2]=H[e+16>>2];Ga(c,2330,d+96|0);H[d+80>>2]=H[e+20>>2];Ga(c,7440,d+80|0);Ac(1567,23,c);if(H[e+4>>2]){i=e+944|0;j=e+812|0;f=0;while(1){g=f<<2;k=H[j+g>>2];H[d+68>>2]=H[i+g>>2];H[d+64>>2]=k;Ga(c,1693,d- -64|0);f=f+1|0;if(f>>>0>2]){continue}break}}Bc(c);H[d+48>>2]=H[e+24>>2];Ga(c,7194,d+48|0);H[d+32>>2]=H[e+804>>2];Ga(c,7243,d+32|0);i=1;Ac(1591,20,c);a:{if(H[e+24>>2]!=1){f=H[e+4>>2];if((f|0)<=0){break a}i=N(f,3)-2|0}j=e+28|0;f=0;while(1){g=j+(f<<3)|0;l=d,m=ye(H[g>>2],H[g+4>>2],32),H[l+16>>2]=m;H[d+20>>2]=qa;Ga(c,1693,d+16|0);f=f+1|0;if((i|0)!=(f|0)){continue}break}}Bc(c);H[d>>2]=H[e+808>>2];Ga(c,7226,d);Ac(1707,5,c);h=h+1|0;if((h|0)!=(b|0)){continue}break}}Ac(1708,4,c)}na=d+256|0}function se(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{e=b;if(e){if(!c){break j}if(!d){break i}e=Q(d)-Q(e)|0;if(e>>>0<=31){break h}break b}if((d|0)==1|d>>>0>1){break b}b=(a>>>0)/(c>>>0)|0;oa=a-N(b,c)|0;pa=0;qa=0;return b}if(!a){break g}if(!d){break f}f=d-1|0;if(f&d){break f}oa=a;pa=e&f;a=e>>>te(d)|0;qa=0;return a}f=c-1|0;if(!(f&c)){break e}k=(Q(c)+33|0)-Q(e)|0;g=0-k|0;break c}k=e+1|0;g=63-e|0;break c}oa=0;a=(e>>>0)/(d>>>0)|0;pa=e-N(a,d)|0;qa=0;return a}e=Q(d)-Q(e)|0;if(e>>>0<31){break d}break b}oa=a&f;pa=0;if((c|0)==1){break a}c=te(c);d=c&31;if((c&63)>>>0>=32){e=0;a=b>>>d|0}else{e=b>>>d|0;a=((1<>>d}qa=e;return a}k=e+1|0;g=63-e|0}f=a;e=k&63;h=e&31;if((e&63)>>>0>=32){e=0;f=b>>>h|0}else{e=b>>>h|0;f=((1<>>h}h=g&63;g=a;i=h&31;if((h&63)>>>0>=32){j=a<>>32-i|b<>>31;f=f<<1|b>>>31;l=e;i=g-(e+(f>>>0>h>>>0)|0)|0;m=i>>31;j=m;e=f;i=c&j;f=e-i|0;e=l-((d&j)+(e>>>0>>0)|0)|0;j=b<<1|a>>>31;a=n|a<<1;b=j|o;l=m&1;n=l;k=k-1|0;if(k){continue}break}}oa=f;pa=e;j=b<<1|a>>>31;a=l|a<<1;qa=j|o;return a}oa=a;pa=b;a=0;b=0}qa=b;return a}function Kc(a,b,c,d,e){var f=0,g=0,h=0,i=0;h=na-16|0;na=h;if(H[a+8>>2]==16){a=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{a=H[a+12>>2]}f=H[d>>2];a:{if(!f){d=0;Ba(e,1,2642,0);break a}a=H[a+5584>>2];H[d>>2]=f-1;Da(c,h+12|0,1);g=N(b,1080)+a|0;a=H[h+12>>2];H[g+804>>2]=a>>>5;b=a&31;H[g+24>>2]=b;a=c+1|0;b:{c:{d:{e:{f:{switch(b|0){case 0:f=H[d>>2];break e;case 1:break d;default:break f}}f=H[d>>2]>>>1|0}if(f>>>0>=98){H[h+4>>2]=97;H[h+8>>2]=97;H[h>>2]=f;Ba(e,2,16056,h);b=H[g+24>>2]}if(b){b=f;if(b){break d}a=0;break c}if(f){b=g+28|0;c=0;while(1){Da(a,h+12|0,1);if(c>>>0<=96){e=H[h+12>>2];i=b+(c<<3)|0;H[i+4>>2]=0;H[i>>2]=e>>>3}a=a+1|0;c=c+1|0;if((f|0)!=(c|0)){continue}break}}a=H[d>>2];if(a>>>0>>0){d=0;break a}a=a-f|0;break b}e=g+28|0;c=0;while(1){Da(a,h+12|0,2);if(c>>>0<=96){f=e+(c<<3)|0;i=H[h+12>>2];H[f+4>>2]=i&2047;H[f>>2]=i>>>11}a=a+2|0;c=c+1|0;if((c|0)!=(b|0)){continue}break}a=b<<1}b=H[d>>2];if(a>>>0>b>>>0){d=0;break a}a=b-a|0}H[d>>2]=a;d=1;if(H[g+24>>2]!=1){break a}f=g+28|0;c=H[g+32>>2];e=H[g+28>>2];a=1;while(1){b=f+(a<<3)|0;H[b+12>>2]=c;H[b+4>>2]=c;g=e-((a>>>0)/3|0)|0;H[b+8>>2]=(g|0)>0?g:0;g=b;b=e-((a-1>>>0)/3|0)|0;H[g>>2]=(b|0)>0?b:0;a=a+2|0;if((a|0)!=97){continue}break}}na=h+16|0;return d}function fe(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=na-32|0;na=f;g=1;a:{if(c>>>0<=1){g=0;Ba(d,1,10062,0);break a}if(H[a+76>>2]){break a}Da(b,f+28|0,1);Da(b+1|0,f+24|0,1);e=H[f+24>>2];i=e>>>4&3;if((i|0)==3){H[a+76>>2]=1;Ba(d,2,11558,0);break a}c=c-2|0;j=(e>>>5&2)+2|0;h=i+j|0;e=(c>>>0)/(h>>>0)|0;if((c|0)!=(N(e,h)|0)){H[a+76>>2]=1;Ba(d,2,11139,0);break a}if(c>>>0>>0){break a}b:{c=H[a+68>>2];if(c>>>0<=(e^-1)>>>0){c=c+e|0;if(c>>>0<536870912){break b}}H[a+76>>2]=1;Ba(d,2,9400,0);break a}h=Ha(H[a+72>>2],c<<3);if(!h){H[a+76>>2]=1;Ba(d,2,9443,0);break a}c=b+2|0;H[a+72>>2]=h;c:{if(i){k=e>>>0<=1?1:e;e=0;while(1){Da(c,f+20|0,i);b=H[f+20>>2];if(b>>>0>=N(H[a+132>>2],H[a+128>>2])>>>0){break c}b=c+i|0;Da(b,f+16|0,j);c=H[a+68>>2];g=h+(c<<3)|0;G[g>>1]=H[f+20>>2];H[g+4>>2]=H[f+16>>2];g=1;H[a+68>>2]=c+1;c=b+j|0;e=e+1|0;if((k|0)!=(e|0)){continue}break}break a}i=e>>>0<=1?1:e;b=H[a+68>>2];e=0;while(1){H[f+20>>2]=b;if(N(H[a+132>>2],H[a+128>>2])>>>0<=b>>>0){break c}Da(c,f+16|0,j);k=H[a+68>>2];g=h+(k<<3)|0;G[g>>1]=b;H[g+4>>2]=H[f+16>>2];g=1;b=k+1|0;H[a+68>>2]=b;c=c+j|0;e=e+1|0;if((i|0)!=(e|0)){continue}break}break a}H[a+76>>2]=1;H[f>>2]=b;Ba(d,2,7799,f)}na=f+32|0;return g|0}function Ad(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;h=na-16|0;na=h;a:{if(!(I[a+100|0]&2)){Ba(d,1,11356,0);a=0;break a}H[a+104>>2]=0;b:{c:{d:{if(c){while(1){if(c>>>0<=7){Ba(d,1,3403,0);break b}g=h+12|0;Da(b,g,4);e=H[h+12>>2];Da(b+4|0,g,4);f=8;g=H[h+12>>2];e:{f:{g:{switch(e|0){case 1:if(c>>>0<16){e=3443;break c}Da(b+8|0,h+8|0,4);if(H[h+8>>2]){e=8449;break c}Da(b+12|0,h+12|0,4);e=H[h+12>>2];if(e){break f}e=3268;break c;case 0:break g;default:break e}}Ba(d,1,3268,0);break b}f=16}if(e>>>0>>0){Ba(d,1,9148,0);break b}if(c>>>0>>0){Ba(d,1,9076,0);a=0;break a}h:{i:{j=b+f|0;k=e-f|0;j:{k:{l:{m:{if((g|0)<=1668246641){if((g|0)==1651532643){break m}if((g|0)==1667523942){break k}if((g|0)!=1668112752){break i}f=25296;break j}if((g|0)==1885564018){break l}f=25264;if((g|0)==1768449138){break j}if((g|0)!=1668246642){break i}f=25272;break j}f=25280;break j}f=25288;break j}f=25304}if(ra[H[f+4>>2]](a,j,k,d)|0){break h}a=0;break a}H[a+104>>2]=H[a+104>>2]|2147483647}i=(g|0)==1768449138?1:i;b=b+e|0;c=c-e|0;if(c){continue}break}if(i){break d}}Ba(d,1,8976,0);a=0;break a}F[a+132|0]=1;H[a+100>>2]=H[a+100>>2]|4;a=1;break a}Ba(d,1,e,0)}Ba(d,1,1968,0);a=0}na=h+16|0;return a|0}function Jd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{if(!Wa(H[b+8>>2],54,d)){break a}i=H[b+4>>2];f=H[i>>2];e=H[i+8>>2];b:{if(f){g=1;c:{if((f|0)!=1){k=f&1;f=f&-2;while(1){h=0;d:{if(!g){break d}h=0;if(!(ra[H[e>>2]](b,a,d)|0)){break d}h=(ra[H[e+4>>2]](b,a,d)|0)!=0}g=h;e=e+8|0;j=j+2|0;if((f|0)!=(j|0)){continue}break}if(!k){break c}}if(!g){g=0;break c}g=(ra[H[e>>2]](b,a,d)|0)!=0}Pa(i);if(g){break b}break a}Pa(i)}i=H[b+8>>2];f=H[i>>2];e=H[i+8>>2];e:{if(f){g=1;f:{if((f|0)!=1){k=f&1;f=f&-2;j=0;while(1){h=0;g:{if(!g){break g}h=0;if(!(ra[H[e>>2]](b,a,d)|0)){break g}h=(ra[H[e+4>>2]](b,a,d)|0)!=0}g=h;e=e+8|0;j=j+2|0;if((f|0)!=(j|0)){continue}break}if(!k){break f}}if(!g){g=0;break f}g=(ra[H[e>>2]](b,a,d)|0)!=0}Pa(i);if(!g){break a}break e}Pa(i)}if(!I[b+132|0]){Ba(d,1,11696,0);return 0}if(!I[b+133|0]){Ba(d,1,11667,0);return 0}l=Mb(a,H[b>>2],c,d);if(!c|!l){break a}a=H[c>>2];if(!a){break a}e=1;h:{i:{switch(H[b+48>>2]-12|0){case 5:e=2;break h;case 6:e=3;break h;case 12:e=4;break h;case 0:e=5;break h;case 4:break h;default:break i}}e=-1}H[a+20>>2]=e;c=H[b+108>>2];if(!c){break a}H[a+28>>2]=c;H[a+32>>2]=H[b+112>>2];H[b+108>>2]=0}return l|0}function Mb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=Eb();H[b+96>>2]=e;a:{b:{if(!e){break b}c:{if(Wa(H[b+220>>2],18,d)){if(Wa(H[b+220>>2],19,d)){break c}}break a}i=H[b+220>>2];f=H[i>>2];g=H[i+8>>2];d:{if(f){e=1;e:{if((f|0)!=1){k=f&1;f=f&-2;while(1){h=0;f:{if(!e){break f}h=0;if(!(ra[H[g>>2]](b,a,d)|0)){break f}h=(ra[H[g+4>>2]](b,a,d)|0)!=0}e=h;g=g+8|0;j=j+2|0;if((f|0)!=(j|0)){continue}break}if(!k){break e}}if(!e){e=0;break e}e=(ra[H[g>>2]](b,a,d)|0)!=0}Pa(i);if(e){break d}break a}Pa(i)}g:{if(Wa(H[b+216>>2],20,d)){if(Wa(H[b+216>>2],21,d)){break g}}break a}i=H[b+216>>2];f=H[i>>2];g=H[i+8>>2];h:{if(f){e=1;i:{if((f|0)!=1){k=f&1;f=f&-2;j=0;while(1){h=0;j:{if(!e){break j}h=0;if(!(ra[H[g>>2]](b,a,d)|0)){break j}h=(ra[H[g+4>>2]](b,a,d)|0)!=0}e=h;g=g+8|0;j=j+2|0;if((f|0)!=(j|0)){continue}break}if(!k){break i}}if(!e){e=0;break i}e=(ra[H[g>>2]](b,a,d)|0)!=0}Pa(i);if(e){break h}break a}Pa(i)}a=Eb();H[c>>2]=a;if(!a){break b}Ec(H[b+96>>2],a);l=1}return l|0}Ua(H[b+96>>2]);H[b+96>>2]=0;return 0}function zc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0;b=H[6516];c=a+7&-8;a=c+7|0;d=a>>>0<7?1:d;e=a&-8;a=e+b|0;a:{b:{if(!(a>>>0>>0?d+1|0:d)){if(a>>>0<=sa()<<16>>>0){break b}if(ga(a|0)|0){break b}}H[6597]=48;b=-1;break a}H[6516]=a}d=b;if((d|0)!=-1){a=d+c|0;H[a-4>>2]=16;f=a-16|0;H[f>>2]=16;b=H[6856];if(b){e=H[b+8>>2]}else{e=0}c:{d:{if((e|0)==(d|0)){e=H[d-4>>2]&-2;g=d-e|0;h=H[g-4>>2];H[b+8>>2]=a;b=h&-2;a=g-b|0;if(H[(a+H[a>>2]|0)-4>>2]&1){f=H[a+4>>2];g=H[a+8>>2];H[f+8>>2]=g;H[g+4>>2]=f;b=(b+(c+e|0)|0)-16|0;H[a>>2]=b;break c}a=d-16|0;break d}H[d>>2]=16;H[d+8>>2]=a;H[d+4>>2]=b;H[d+12>>2]=16;H[6856]=d;a=d+16|0}b=f-a|0;H[a>>2]=b}H[((b&-4)+a|0)-4>>2]=b|1;c=H[a>>2]-8|0;e:{if(c>>>0<=127){b=(c>>>3|0)-1|0;break e}e=Q(c);b=((c>>>29-e^4)-(e<<2)|0)+110|0;if(c>>>0<=4095){break e}b=((c>>>30-e^2)-(e<<1)|0)+71|0;b=b>>>0>=63?63:b}c=b<<4;H[a+4>>2]=c+26400;c=c+26408|0;H[a+8>>2]=H[c>>2];H[c>>2]=a;H[H[a+8>>2]+4>>2]=a;c=H[6859];a=b&31;if((b&63)>>>0>=32){b=1<>>32-a}H[6858]=e|H[6858];H[6859]=b|c}return(d|0)!=-1}function Ec(a,b){var c=0,d=0,e=0,f=0,g=0;H[b>>2]=H[a>>2];H[b+4>>2]=H[a+4>>2];H[b+8>>2]=H[a+8>>2];H[b+12>>2]=H[a+12>>2];c=H[b+24>>2];if(c){d=H[b+16>>2];if(d){c=0;while(1){f=H[(H[b+24>>2]+N(c,52)|0)+44>>2];if(f){Ca(f);d=H[b+16>>2]}c=c+1|0;if(d>>>0>c>>>0){continue}break}c=H[b+24>>2]}Ca(c);H[b+24>>2]=0}c=H[a+16>>2];H[b+16>>2]=c;c=Fa(N(c,52));H[b+24>>2]=c;if(c){if(H[b+16>>2]){f=0;while(1){g=N(f,52);d=g+c|0;c=H[a+24>>2]+g|0;H[d+48>>2]=H[c+48>>2];e=H[c+44>>2];H[d+40>>2]=H[c+40>>2];H[d+44>>2]=e;e=H[c+36>>2];H[d+32>>2]=H[c+32>>2];H[d+36>>2]=e;e=H[c+28>>2];H[d+24>>2]=H[c+24>>2];H[d+28>>2]=e;e=H[c+20>>2];H[d+16>>2]=H[c+16>>2];H[d+20>>2]=e;e=H[c+12>>2];H[d+8>>2]=H[c+8>>2];H[d+12>>2]=e;e=H[c+4>>2];H[d>>2]=H[c>>2];H[d+4>>2]=e;c=H[b+24>>2];H[(g+c|0)+44>>2]=0;f=f+1|0;if(f>>>0>2]){continue}break}}H[b+20>>2]=H[a+20>>2];c=H[a+32>>2];H[b+32>>2]=c;a:{if(c){c=Fa(c);H[b+28>>2]=c;if(!c){H[b+28>>2]=0;H[b+32>>2]=0;return}b=H[a+32>>2];if(!b){break a}B(c,H[a+28>>2],b);return}H[b+28>>2]=0}return}H[b+16>>2]=0;H[b+24>>2]=0}function mb(a,b,c,d,e,f){var g=0,h=O(0),i=0,j=O(0);g=(c<<6)+b|0;b=c?g+-64|0:a;i=d>>>0>>0?d:e;if(i>>>0>c>>>0){h=L[b>>2];while(1){a=b;b=g;g=b-32|0;j=h;h=L[b>>2];L[g>>2]=O(O(j+h)*f)+L[g>>2];g=b-28|0;L[g>>2]=O(O(L[a+4>>2]+L[b+4>>2])*f)+L[g>>2];g=b-24|0;L[g>>2]=O(O(L[a+8>>2]+L[b+8>>2])*f)+L[g>>2];g=b-20|0;L[g>>2]=O(O(L[a+12>>2]+L[b+12>>2])*f)+L[g>>2];g=b-16|0;L[g>>2]=O(O(L[a+16>>2]+L[b+16>>2])*f)+L[g>>2];g=b-12|0;L[g>>2]=O(O(L[a+20>>2]+L[b+20>>2])*f)+L[g>>2];g=b-8|0;L[g>>2]=O(O(L[a+24>>2]+L[b+24>>2])*f)+L[g>>2];g=b-4|0;L[g>>2]=O(O(L[a+28>>2]+L[b+28>>2])*f)+L[g>>2];g=b- -64|0;c=c+1|0;if((i|0)!=(c|0)){continue}break}}if(d>>>0>e>>>0){a=g-32|0;f=O(f+f);L[a>>2]=O(L[b>>2]*f)+L[a>>2];a=g-28|0;L[a>>2]=O(L[b+4>>2]*f)+L[a>>2];a=g-24|0;L[a>>2]=O(L[b+8>>2]*f)+L[a>>2];a=g-20|0;L[a>>2]=O(L[b+12>>2]*f)+L[a>>2];a=g-16|0;L[a>>2]=O(L[b+16>>2]*f)+L[a>>2];a=g-12|0;L[a>>2]=O(L[b+20>>2]*f)+L[a>>2];a=g-8|0;L[a>>2]=O(L[b+24>>2]*f)+L[a>>2];a=g-4|0;L[a>>2]=O(L[b+28>>2]*f)+L[a>>2]}}function $c(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;if(K[a+44>>2]>=8){e=H[a+36>>2];n=e<<5;o=N(e,28);p=N(e,24);q=N(e,20);r=e<<4;i=N(e,12);j=e<<3;g=H[a+40>>2];k=8;while(1){zb(a,g,H[a+36>>2],8);Ta(a);h=H[a+32>>2];if(h){f=H[a>>2];b=0;a:{if((h|0)!=1){s=h&1;t=h&-2;l=0;while(1){c=(b<<2)+g|0;d=f+(b<<5)|0;L[c>>2]=L[d>>2];m=e<<2;L[c+m>>2]=L[d+4>>2];L[c+j>>2]=L[d+8>>2];L[c+i>>2]=L[d+12>>2];d=b|1;c=(d<<2)+g|0;d=f+(d<<5)|0;L[c>>2]=L[d>>2];L[c+m>>2]=L[d+4>>2];L[c+j>>2]=L[d+8>>2];L[c+i>>2]=L[d+12>>2];b=b+2|0;l=l+2|0;if((t|0)!=(l|0)){continue}break}if(!s){break a}}c=(b<<2)+g|0;b=f+(b<<5)|0;L[c>>2]=L[b>>2];L[c+(e<<2)>>2]=L[b+4>>2];L[c+j>>2]=L[b+8>>2];L[c+i>>2]=L[b+12>>2]}d=H[a>>2];b=0;while(1){f=(b<<2)+g|0;c=d+(b<<5)|0;L[f+r>>2]=L[c+16>>2];L[f+q>>2]=L[c+20>>2];L[f+p>>2]=L[c+24>>2];L[f+o>>2]=L[c+28>>2];b=b+1|0;if((h|0)!=(b|0)){continue}break}}g=g+n|0;k=k+8|0;if(k>>>0<=K[a+44>>2]){continue}break}}Ca(H[a>>2]);Ca(a)}function wd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=na-16|0;na=f;a:{if(H[a+120>>2]|c>>>0<3){break a}Da(b,f+12|0,2);k=J[f+12>>1];if(k-1025>>>0<=4294966271){H[f>>2]=k;Ba(d,1,3526,f);break a}Da(b+2|0,f+12|0,1);i=J[f+12>>1];if(!i){Ba(d,1,3174,0);break a}if(i+3>>>0>c>>>0){break a}h=Fa(N(i,k)<<2);if(!h){break a}j=Fa(i);if(!j){Ca(h);break a}l=Fa(i);if(!l){Ca(h);Ca(j);break a}g=Fa(20);if(!g){Ca(h);Ca(j);Ca(l);break a}d=b+3|0;H[g+8>>2]=j;H[g+4>>2]=l;G[g+16>>1]=k;H[g>>2]=h;m=H[f+12>>2];H[g+12>>2]=0;F[g+18|0]=m;H[a+120>>2]=g;while(1){Da(d,f+12|0,1);F[e+j|0]=(I[f+12|0]&127)+1;F[e+l|0]=(H[f+12>>2]&128)>>>7;d=d+1|0;e=e+1|0;if((i|0)!=(e|0)){continue}break}g=0;while(1){e=0;a=0;while(1){e=I[e+j|0]+7>>>3|0;e=e>>>0>=4?4:e;if((e+(d-b|0)|0)>(c|0)){e=0;break a}Da(d,f+12|0,e);H[h>>2]=H[f+12>>2];h=h+4|0;d=d+e|0;a=a+1|0;e=a&65535;if(i>>>0>e>>>0){continue}break}e=1;g=g+1|0;if((g&65535)>>>0>>0){continue}break}}na=f+16|0;return e|0}function od(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;f=-1;e=-1;if(!(I[a+68|0]&8)){f=H[a+32>>2];H[a+36>>2]=f;a:{b:{c:{e=H[a+48>>2];if(e){while(1){e=ra[H[a+20>>2]](f,e,H[a>>2])|0;if((e|0)==-1){break c}f=e+H[a+36>>2]|0;H[a+36>>2]=f;e=H[a+48>>2]-e|0;H[a+48>>2]=e;if(e){continue}break}f=H[a+32>>2]}H[a+36>>2]=f;if(!!b&(c|0)>=0|(c|0)>0){break b}f=0;e=0;break a}H[a+68>>2]=H[a+68>>2]|8;Ba(d,4,15604,0);H[a+48>>2]=0;H[a+68>>2]=H[a+68>>2]|8;qa=-1;return-1}f=0;e=0;while(1){g=ra[H[a+24>>2]](b,c,H[a>>2])|0;h=qa;i=h;if((g&h)==-1){Ba(d,4,15589,0);H[a+68>>2]=H[a+68>>2]|8;b=e+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b;a=!(e|f);b=a?-1:f;qa=a?-1:e;return b|0}e=e+i|0;f=f+g|0;e=f>>>0>>0?e+1|0:e;h=b;b=b-g|0;c=c-(i+(g>>>0>h>>>0)|0)|0;if(!!b&(c|0)>=0|(c|0)>0){continue}break}}b=e+H[a+60>>2]|0;c=f+H[a+56>>2]|0;b=c>>>0>>0?b+1|0:b;H[a+56>>2]=c;H[a+60>>2]=b}qa=e;return f|0}function xc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=a;a:{if(b&3){while(1){c=I[b|0];if(!c|(c|0)==61){break a}b=b+1|0;if(b&3){continue}break}}b:{c:{d=H[b>>2];if(((d|16843008-d)&-2139062144)!=-2139062144){break c}while(1){c=d^1027423549;if(((16843008-c|c)&-2139062144)!=-2139062144){break c}d=H[b+4>>2];c=b+4|0;b=c;if(((16843008-d|d)&-2139062144)==-2139062144){continue}break}break b}c=b}while(1){b=c;d=I[b|0];if(!d){break a}c=b+1|0;if((d|0)!=61){continue}break}}if((a|0)==(b|0)){return 0}g=b-a|0;d:{if(I[g+a|0]){break d}f=H[6860];if(!f){break d}b=H[f>>2];if(!b){break d}while(1){e:{d=a;c=b;h=g;e=0;f:{if(!g){break f}e=I[d|0];if(e){g:{while(1){i=I[c|0];if((i|0)!=(e|0)|!i){break g}h=h-1|0;if(!h){break g}c=c+1|0;e=I[d+1|0];d=d+1|0;if(e){continue}break}e=0}}else{e=0}e=e-I[c|0]|0}if(!e){b=b+g|0;if(I[b|0]==61){break e}}b=H[f+4>>2];f=f+4|0;if(b){continue}break d}break}j=b+1|0}return j}function be(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=na-16|0;na=g;a:{if(c>>>0<=1){Ba(d,1,3983,0);a=0;break a}if(F[a+212|0]&1){Ba(d,1,12668,0);a=0;break a}a=H[a+180>>2]+N(H[a+228>>2],5644)|0;F[a+5640|0]=I[a+5640|0]|2;Da(b,g+12|0,1);e=H[a+5164>>2];b:{if(!e){f=H[g+12>>2]+1|0;e=Ea(f,8);H[a+5164>>2]=e;if(!e){Ba(d,1,4009,0);a=0;break a}H[a+5160>>2]=f;break b}f=H[g+12>>2];if(f>>>0>2]){break b}h=e;e=f+1|0;f=Ha(h,e<<3);if(!f){Ba(d,1,4009,0);a=0;break a}H[a+5164>>2]=f;h=H[a+5160>>2];i=e-h<<3;if(i){y(f+(h<<3)|0,0,i)}H[a+5160>>2]=e;e=H[a+5164>>2]}h=e;e=H[g+12>>2];if(H[h+(e<<3)>>2]){H[g>>2]=e;Ba(d,1,7063,g);a=0;break a}c=c-1|0;e=Fa(c);a=H[a+5164>>2];f=a+(H[g+12>>2]<<3)|0;H[f>>2]=e;if(!e){Ba(d,1,4009,0);a=0;break a}H[f+4>>2]=c;if(c){B(H[a+(H[g+12>>2]<<3)>>2],b+1|0,c)}a=1}na=g+16|0;return a|0}function Cb(a,b,c){var d=0,e=0,f=0,g=0;e=a+4|0;d=(e+b|0)-1&0-b;b=H[a>>2];if(d+c>>>0<=(b+a|0)-4>>>0){f=H[a+4>>2];g=H[a+8>>2];H[f+8>>2]=g;H[g+4>>2]=f;if((d|0)!=(e|0)){d=d-e|0;f=a-(H[a-4>>2]&-2)|0;e=d+H[f>>2]|0;H[f>>2]=e;H[(f+(e&-4)|0)-4>>2]=e;a=a+d|0;b=b-d|0;H[a>>2]=b}a:{if(c+24>>>0<=b>>>0){e=a+c|0;b=(b-c|0)-8|0;H[e+8>>2]=b;g=e+8|0;H[(g+(b&-4)|0)-4>>2]=b|1;d=H[e+8>>2]-8|0;b:{if(d>>>0<=127){b=(d>>>3|0)-1|0;break b}f=Q(d);b=((d>>>29-f^4)-(f<<2)|0)+110|0;if(d>>>0<=4095){break b}b=((d>>>30-f^2)-(f<<1)|0)+71|0;b=b>>>0>=63?63:b}d=b<<4;H[e+12>>2]=d+26400;d=d+26408|0;H[e+16>>2]=H[d>>2];H[d>>2]=g;H[H[e+16>>2]+4>>2]=g;d=H[6858];f=H[6859];e=b&31;if((b&63)>>>0>=32){b=1<>>32-e}H[6858]=g|d;H[6859]=b|f;b=c+8|0;H[a>>2]=b;c=(b&-4)+a|0;break a}c=a+b|0}H[c-4>>2]=b;a=a+4|0}else{a=0}return a}function he(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=na-16|0;na=g;i=H[H[a+96>>2]+16>>2];h=i>>>0<257?1:2;e=(h<<1)+5|0;f=(c>>>0)/(e>>>0)|0;a:{if(!((N(e,f)|0)==(c|0)&c>>>0>=e>>>0)){Ba(d,1,4643,0);a=0;break a}if(H[a+8>>2]==16){e=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{e=H[a+12>>2]}a=0;c=I[e+5640|0];a=c&4?H[e+420>>2]+1|0:a;f=f+a|0;if(f>>>0>=32){H[g>>2]=f;Ba(d,1,7781,g);a=0;break a}F[e+5640|0]=c|4;if(a>>>0>>0){c=(e+N(a,148)|0)+424|0;while(1){Da(b,c,1);b=b+1|0;Da(b,c+4|0,h);b=b+h|0;Da(b,c+8|0,2);d=H[c+8>>2];j=H[e+8>>2];H[c+8>>2]=d>>>0>>0?d:j;Da(b+2|0,c+12|0,1);b=b+3|0;Da(b,c+16|0,h);b=b+h|0;Da(b,g+12|0,1);H[c+36>>2]=H[g+12>>2];d=H[c+16>>2];H[c+16>>2]=d>>>0>>0?d:i;c=c+148|0;b=b+1|0;a=a+1|0;if((f|0)!=(a|0)){continue}break}}H[e+420>>2]=f-1;a=1}na=g+16|0;return a|0}function jb(a){var b=0,c=0,d=0,e=0;a:{if(!a){break a}b=H[a+5164>>2];if(b){c=H[a+5160>>2];if(c){b=0;while(1){d=H[H[a+5164>>2]+(b<<3)>>2];if(d){Ca(d);c=H[a+5160>>2]}b=b+1|0;if(c>>>0>b>>>0){continue}break}b=H[a+5164>>2]}H[a+5160>>2]=0;Ca(b);H[a+5164>>2]=0}b=H[a+5172>>2];if(b){Ca(b);H[a+5172>>2]=0}b=H[a+5584>>2];if(b){Ca(b);H[a+5584>>2]=0}b=H[a+5612>>2];if(b){Ca(b);H[a+5612>>2]=0}b=H[a+5608>>2];if(b){Ca(b);H[a+5608>>2]=0}b=H[a+5628>>2];if(b){Ca(b);H[a+5636>>2]=0;H[a+5628>>2]=0;H[a+5632>>2]=0}b=H[a+5616>>2];if(b){e=H[a+5620>>2];if(e){c=0;while(1){d=H[b+12>>2];if(d){Ca(d);H[b+12>>2]=0;e=H[a+5620>>2]}b=b+20|0;c=c+1|0;if(e>>>0>c>>>0){continue}break}b=H[a+5616>>2]}Ca(b);H[a+5616>>2]=0}b=H[a+5604>>2];if(b){Ca(b);H[a+5604>>2]=0}b=H[a+5596>>2];if(!b){break a}Ca(b);H[a+5596>>2]=0;H[a+5600>>2]=0}}function zd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-32|0;na=e;a:{if(H[a+72>>2]){Ba(d,2,7015,0);c=1;break a}if((c|0)!=14){c=0;Ba(d,1,14445,0);break a}Da(b,a+16|0,4);Da(b+4|0,a+12|0,4);Da(b+8|0,a+20|0,2);f=H[a+12>>2];b:{g=H[a+16>>2];c=H[a+20>>2];c:{if(!g){break c}c=H[a+20>>2];if(!f){break c}if(c){break b}c=0}H[e+8>>2]=c;H[e+4>>2]=g;H[e>>2]=f;Ba(d,1,14289,e);c=0;break a}if(c>>>0>=16385){c=0;Ba(d,1,14203,0);break a}c=Ea(c,12);H[a+72>>2]=c;if(!c){c=0;Ba(d,1,14240,0);break a}c=1;Da(b+10|0,a+24|0,1);Da(b+11|0,a+28|0,1);f=H[a+28>>2];if((f|0)!=7){H[e+16>>2]=f;Ba(d,4,16272,e+16|0)}Da(b+12|0,a+32|0,1);Da(b+13|0,a+36|0,1);b=H[a>>2];F[b+212|0]=I[b+212|0]&251|(H[a+24>>2]==255?4:0);b=H[a>>2];H[b+240>>2]=H[a+12>>2];H[b+244>>2]=H[a+16>>2];F[a+133|0]=1}na=e+32|0;return c|0}function qc(a,b,c,d){a:{switch(b-9|0){case 0:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=H[b>>2];return;case 6:b=H[c>>2];H[c>>2]=b+4;b=G[b>>1];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 7:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=J[b>>1];H[a+4>>2]=0;return;case 8:b=H[c>>2];H[c>>2]=b+4;b=F[b|0];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 9:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=I[b|0];H[a+4>>2]=0;return;case 16:b=H[c>>2]+7&-8;H[c>>2]=b+8;M[a>>3]=M[b>>3];return;case 17:ra[d|0](a,c);default:return;case 1:case 4:case 14:b=H[c>>2];H[c>>2]=b+4;b=H[b>>2];H[a>>2]=b;H[a+4>>2]=b>>31;return;case 2:case 5:case 11:case 15:b=H[c>>2];H[c>>2]=b+4;H[a>>2]=H[b>>2];H[a+4>>2]=0;return;case 3:case 10:case 12:case 13:break a}}b=H[c>>2]+7&-8;H[c>>2]=b+8;c=H[b+4>>2];H[a>>2]=H[b>>2];H[a+4>>2]=c}function ce(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;g=na-16|0;na=g;a:{if(c>>>0<=1){Ba(d,1,4311,0);a=0;break a}F[a+212|0]=I[a+212|0]|1;Da(b,g+12|0,1);e=H[a+140>>2];b:{if(!e){f=H[g+12>>2]+1|0;e=Ea(f,8);H[a+140>>2]=e;if(!e){Ba(d,1,4337,0);a=0;break a}H[a+136>>2]=f;break b}f=H[g+12>>2];if(f>>>0>2]){break b}h=e;e=f+1|0;f=Ha(h,e<<3);if(!f){Ba(d,1,4337,0);a=0;break a}H[a+140>>2]=f;h=H[a+136>>2];i=e-h<<3;if(i){y(f+(h<<3)|0,0,i)}H[a+136>>2]=e;e=H[a+140>>2]}h=e;e=H[g+12>>2];if(H[h+(e<<3)>>2]){H[g>>2]=e;Ba(d,1,7085,g);a=0;break a}c=c-1|0;e=Fa(c);a=H[a+140>>2];f=a+(H[g+12>>2]<<3)|0;H[f>>2]=e;if(!e){Ba(d,1,4337,0);a=0;break a}H[f+4>>2]=c;if(c){B(H[a+(H[g+12>>2]<<3)>>2],b+1|0,c)}a=1}na=g+16|0;return a|0}function cd(a,b){a=a|0;b=+b;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;c=a<<3;i=c+28640|0;d=M[c+28672>>3];if(d!=0){e=M[i>>3];g=S(e,b);b=g-e;if(b<0x10000000000000000&b>=0){f=~~b>>>0;if(P(b)>=1){c=~~(b>0?R(T(b*2.3283064365386963e-10),4294967295):U((b-+(~~b>>>0>>>0))*2.3283064365386963e-10))>>>0}else{c=0}}else{c=0}if(d<0x10000000000000000&d>=0){j=~~d>>>0;if(P(d)>=1){h=~~(d>0?R(T(d*2.3283064365386963e-10),4294967295):U((d-+(~~d>>>0>>>0))*2.3283064365386963e-10))>>>0}else{h=0}}else{h=0}c=ve(f,c,j,h);f=qa;c=c+1|0;f=c?f:f+1|0;e=(+(c>>>0)+ +(f>>>0)*4294967296)*d+e;g=e-g}M[i>>3]=e;fa(a|0,+g)|0;c=(a|0)==2?27:(a|0)==1?26:14;a=c-1|0;a:{if(H[6892]>>>a&1){H[6894]=H[6894]|1<>2];if(a){ra[a|0](c)}}}function jd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=na-32|0;na=d;e=H[a+28>>2];H[d+16>>2]=e;f=H[a+20>>2];H[d+28>>2]=c;H[d+24>>2]=b;b=f-e|0;H[d+20>>2]=b;f=b+c|0;i=2;b=d+16|0;a:{while(1){b:{c:{d:{if(!yc(Z(H[a+60>>2],b|0,i|0,d+12|0)|0)){g=H[d+12>>2];if((g|0)==(f|0)){break d}if((g|0)>=0){break c}break b}if((f|0)!=-1){break b}}b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;H[a+16>>2]=b+H[a+48>>2];a=c;break a}h=H[b+4>>2];j=h>>>0>>0;e=(j?8:0)+b|0;h=g-(j?h:0)|0;H[e>>2]=h+H[e>>2];b=(j?12:4)+b|0;H[b>>2]=H[b>>2]-h;f=f-g|0;i=i-j|0;b=e;continue}break}H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;H[a>>2]=H[a>>2]|32;a=0;if((i|0)==2){break a}a=c-H[b+4>>2]|0}na=d+32|0;return a|0}function Ca(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;if(a){b=a-4|0;f=H[b>>2];c=f;d=b;e=H[a-8>>2];a=e&-2;if((a|0)!=(e|0)){d=b-a|0;c=H[d+4>>2];e=H[d+8>>2];H[c+8>>2]=e;H[e+4>>2]=c;c=a+f|0}a=b+f|0;b=H[a>>2];if((b|0)!=H[(a+b|0)-4>>2]){f=H[a+4>>2];a=H[a+8>>2];H[f+8>>2]=a;H[a+4>>2]=f;c=b+c|0}H[d>>2]=c;H[((c&-4)+d|0)-4>>2]=c|1;b=H[d>>2]-8|0;a:{if(b>>>0<=127){a=(b>>>3|0)-1|0;break a}c=Q(b);a=((b>>>29-c^4)-(c<<2)|0)+110|0;if(b>>>0<=4095){break a}a=((b>>>30-c^2)-(c<<1)|0)+71|0;a=a>>>0>=63?63:a}b=a<<4;H[d+4>>2]=b+26400;b=b+26408|0;H[d+8>>2]=H[b>>2];H[b>>2]=d;H[H[d+8>>2]+4>>2]=d;b=H[6858];c=H[6859];d=a&31;if((a&63)>>>0>=32){a=1<>>32-d}H[6858]=e|b;H[6859]=a|c}}function td(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=na-16|0;na=e;a:{if(H[a+116>>2]){break a}if(c>>>0<=1){Ba(d,1,8882,0);break a}Da(b,e+12|0,2);f=H[e+12>>2];h=f&65535;if(!h){Ba(d,1,8915,0);break a}if(N(h,6)+2>>>0>c>>>0){Ba(d,1,8882,0);break a}d=Fa(N(f,6));if(!d){break a}c=Fa(8);H[a+116>>2]=c;if(!c){Ca(d);break a}H[c>>2]=d;f=c;c=J[e+12>>1];G[f+4>>1]=c;if(!c){g=1;break a}c=0;while(1){g=e+12|0;Da(b+2|0,g,2);f=d+N(c,6)|0;G[f>>1]=H[e+12>>2];Da(b+4|0,g,2);G[f+2>>1]=H[e+12>>2];b=b+6|0;Da(b,g,2);G[f+4>>1]=H[e+12>>2];g=1;c=c+1|0;if(c>>>0>2]+4>>1]){continue}break}}na=e+16|0;return g|0}function Lb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;g=na-32|0;na=g;f=H[a+96>>2];a:{if(!f){Ba(d,1,13752,0);e=0;break a}f=Ea(4,H[f+16>>2]);e=0;if(!f){break a}if(b){j=H[a+96>>2];while(1){b:{e=H[(h<<2)+c>>2];c:{if(e>>>0>=K[j+16>>2]){H[g+16>>2]=e;Ba(d,1,2443,g+16|0);break c}i=f+(e<<2)|0;if(!H[i>>2]){break b}H[g>>2]=e;Ba(d,1,3487,g)}Ca(f);e=0;break a}H[i>>2]=1;h=h+1|0;if((h|0)!=(b|0)){continue}break}}Ca(f);Ca(H[a+64>>2]);d:{if(b){d=b<<2;e=Fa(d);H[a+64>>2]=e;if(!e){H[a+60>>2]=0;e=0;break a}if(!d){break d}B(e,c,d);break d}H[a+64>>2]=0}H[a+60>>2]=b;e=1}na=g+32|0;return e|0}function Fc(a){a=a|0;var b=0,c=0;if(a){wb(H[a>>2]);H[a>>2]=0;b=H[a+72>>2];if(b){Ca(b);H[a+72>>2]=0}b=H[a+68>>2];if(b){Ca(b);H[a+68>>2]=0}b=H[a+108>>2];if(b){Ca(b);H[a+108>>2]=0}b=H[a+116>>2];if(b){c=H[b>>2];if(c){Ca(c);b=H[a+116>>2];H[b>>2]=0}Ca(b);H[a+116>>2]=0}b=H[a+120>>2];if(b){c=H[b+12>>2];if(c){Ca(c);b=H[a+120>>2];H[b+12>>2]=0}c=H[b+4>>2];if(c){Ca(c);b=H[a+120>>2];H[b+4>>2]=0}c=H[b+8>>2];if(c){Ca(c);b=H[a+120>>2];H[b+8>>2]=0}c=H[b>>2];if(c){Ca(c);b=H[a+120>>2];H[b>>2]=0}Ca(b);H[a+120>>2]=0}b=H[a+4>>2];if(b){pb(b);H[a+4>>2]=0}b=H[a+8>>2];if(b){pb(b);H[a+8>>2]=0}Ca(a)}}function Jb(){var a=0,b=0,c=0;a:{a=Ea(1,256);if(a){H[a>>2]=1;H[a+208>>2]=1;F[a+212|0]=I[a+212|0]|6;b=Ea(1,5644);H[a+12>>2]=b;if(!b){break a}b=Ea(1,1e3);H[a+16>>2]=b;if(!b){break a}H[a+48>>2]=0;H[a+52>>2]=0;H[a+44>>2]=-1;H[a+20>>2]=1e3;b:{c=Ea(1,48);if(c){H[c+24>>2]=0;H[c+32>>2]=100;b=Ea(100,24);H[c+28>>2]=b;if(b){break b}Ca(c)}H[a+224>>2]=0;break a}H[c+40>>2]=0;H[a+224>>2]=c;b=qb();H[a+220>>2]=b;if(!b){break a}b=qb();H[a+216>>2]=b;if(!b){break a}c:{if(!xc(1419)){break c}}b=jc();H[a+236>>2]=b;if(!b){b=jc();H[a+236>>2]=b;if(!b){break a}}}else{a=0}return a}wb(a);return 0}function tb(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0;g=na-240|0;na=g;H[g+236>>2]=c;H[g+232>>2]=b;H[g>>2]=a;l=!e;a:{b:{c:{d:{if((b|0)!=1){h=a;i=1;break d}h=a;i=1;if(c){break d}e=a;break c}while(1){j=(d<<2)+f|0;e=h-H[j>>2]|0;if((Ic(e,a)|0)<=0){e=h;break c}k=l^-1;l=1;e:{if(!((k|(d|0)<2)&1)){j=H[j-8>>2];k=h-8|0;if((Ic(k,e)|0)>=0){break e}if((Ic(k-j|0,e)|0)>=0){break e}}H[(i<<2)+g>>2]=e;b=wc(b,c);ub(g+232|0,b);i=i+1|0;d=b+d|0;h=e;c=H[g+236>>2];b=H[g+232>>2];if(c|(b|0)!=1){continue}break b}break}e=h;break b}if(!l){break a}}vc(g,i);Bb(e,d,f)}na=g+240|0}function me(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=na-16|0;na=e;if(H[a+8>>2]==16){g=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{g=H[a+12>>2]}h=H[a+96>>2];f=K[h+16>>2]<257?1:2;a:{if(f>>>0>=c>>>0){c=0;Ba(d,1,4669,0);break a}H[e+12>>2]=(f^-1)+c;Da(b,e+8|0,f);i=H[e+8>>2];if(i>>>0>=K[h+16>>2]){c=0;Ba(d,1,14067,0);break a}c=1;b=b+f|0;Da(b,H[g+5584>>2]+N(i,1080)|0,1);if(!Lc(a,H[e+8>>2],b+1|0,e+12|0,d)){c=0;Ba(d,1,4669,0);break a}if(!H[e+12>>2]){break a}c=0;Ba(d,1,4669,0)}na=e+16|0;return c|0}function Gc(a,b){var c=0,d=0,e=0,f=0,g=0;f=na-32|0;na=f;c=H[a+60>>2];a:{b:{if(c){g=1;while(1){e=H[H[a+64>>2]+(d<<2)>>2];if(!H[(H[H[a+100>>2]+24>>2]+N(e,52)|0)+44>>2]){H[f+16>>2]=e;Ba(b,2,7604,f+16|0);g=0;c=H[a+60>>2]}d=d+1|0;if(c>>>0>d>>>0){continue}break}break b}g=1;c=H[a+100>>2];e=1;if(!H[c+16>>2]){break a}while(1){if(!H[(H[c+24>>2]+N(d,52)|0)+44>>2]){H[f>>2]=d;Ba(b,2,7604,f);g=0;c=H[a+100>>2]}d=d+1|0;if(d>>>0>2]){continue}break}}e=1;if(g){break a}Ba(b,1,2897,0);e=0}na=f+32|0;return e}function vd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;f=na-16|0;na=f;e=H[a+120>>2];a:{if(!e){Ba(d,1,8836,0);c=0;break a}if(H[e+12>>2]){Ba(d,1,11598,0);c=0;break a}e=I[e+18|0];g=e<<2;if(g>>>0>c>>>0){Ba(d,1,8803,0);c=0;break a}g=Fa(g);c=0;if(!g){break a}if(e){d=0;while(1){c=f+12|0;Da(b,c,2);h=g+(d<<2)|0;G[h>>1]=H[f+12>>2];Da(b+2|0,c,1);F[h+2|0]=H[f+12>>2];Da(b+3|0,c,1);F[h+3|0]=H[f+12>>2];b=b+4|0;d=d+1|0;if((e|0)!=(d|0)){continue}break}}H[H[a+120>>2]+12>>2]=g;c=1}na=f+16|0;return c|0}function Zd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=na-16|0;na=e;g=H[H[a+96>>2]+16>>2];a:{if((g+2|0)!=(c|0)){Ba(d,1,4617,0);break a}Da(b,e+12|0,2);if(H[e+12>>2]!=(g|0)){Ba(d,1,4617,0);break a}if(!g){f=1;break a}c=b+2|0;a=H[H[a+96>>2]+24>>2];b=0;while(1){Da(c,e+8|0,1);f=H[e+8>>2];h=f&127;i=h+1|0;H[a+24>>2]=i;H[a+32>>2]=f>>>7&1;if(h>>>0>=31){H[e+4>>2]=i;H[e>>2]=b;Ba(d,1,15402,e);f=0;break a}a=a+52|0;f=1;c=c+1|0;b=b+1|0;if((g|0)!=(b|0)){continue}break}}na=e+16|0;return f|0}function tc(a,b,c,d,e){var f=0,g=0;f=na-208|0;na=f;H[f+204>>2]=c;c=f+160|0;y(c,0,40);H[f+200>>2]=H[f+204>>2];if((sc(0,b,f+200|0,f+80|0,c,d,e)|0)>=0){c=H[a>>2];H[a>>2]=c&-33;a:{b:{c:{if(!H[a+48>>2]){H[a+48>>2]=80;H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0;g=H[a+44>>2];H[a+44>>2]=f;break c}if(H[a+16>>2]){break b}}if(Db(a)){break a}}sc(a,b,f+200|0,f+80|0,f+160|0,d,e)}if(g){ra[H[a+36>>2]](a,0,0)|0;H[a+48>>2]=0;H[a+44>>2]=g;H[a+28>>2]=0;H[a+16>>2]=0;H[a+20>>2]=0}H[a>>2]=H[a>>2]|c&32}na=f+208|0}function je(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=na-16|0;na=e;a:{b:{h=e+8|0;c:{if(K[H[a+96>>2]+16>>2]<=256){if(c){f=-1;g=1;break c}Ba(d,1,4695,0);a=0;break a}if(c>>>0<=1){break b}f=-2;g=2}Da(b,h,g);H[e+12>>2]=c+f;c=H[e+8>>2];f=H[H[a+96>>2]+16>>2];if(c>>>0>=f>>>0){H[e+4>>2]=f;H[e>>2]=c;Ba(d,1,7712,e);a=0;break a}if(!Kc(a,c,b+g|0,e+12|0,d)){Ba(d,1,4695,0);a=0;break a}a=1;if(!H[e+12>>2]){break a}Ba(d,1,4695,0);a=0;break a}Ba(d,1,4695,0);a=0}na=e+16|0;return a|0}function Ed(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=H[a+32>>2];H[a+36>>2]=f;a:{e=H[a+48>>2];if(e){while(1){e=ra[H[a+20>>2]](f,e,H[a>>2])|0;if((e|0)==-1){break a}f=e+H[a+36>>2]|0;H[a+36>>2]=f;e=H[a+48>>2]-e|0;H[a+48>>2]=e;if(e){continue}break}f=H[a+32>>2]}H[a+48>>2]=0;H[a+36>>2]=f;if(!(ra[H[a+28>>2]](b,c,H[a>>2])|0)){H[a+68>>2]=H[a+68>>2]|8;return 0}H[a+56>>2]=b;H[a+60>>2]=c;return 1}H[a+68>>2]=H[a+68>>2]|8;Ba(d,4,15604,0);H[a+68>>2]=H[a+68>>2]|8;return 0}function Ba(a,b,c,d){var e=0,f=0;e=na-528|0;na=e;a:{if(!a){break a}b:{c:{switch(b-1|0){case 0:b=a+12|0;break b;case 1:b=a+16|0;a=a+4|0;break b;case 3:break c;default:break a}}b=a+20|0;a=a+8|0}b=H[b>>2];if(!b|!c){break a}f=H[a>>2];y(e,0,512);H[e+524>>2]=d;a=na-160|0;na=a;H[a+148>>2]=e;H[a+152>>2]=511;y(a,0,144);H[a+76>>2]=-1;H[a+36>>2]=105;H[a+80>>2]=-1;H[a+44>>2]=a+159;H[a+84>>2]=a+148;F[e|0]=0;tc(a,c,d,103,104);na=a+160|0;F[e+511|0]=0;ra[b|0](e,f)}na=e+528|0}function fc(a){var b=0,c=0,d=0;a:{if(!a){break a}b=H[a+8>>2];if(!b){break a}c=b&3;a=H[a+12>>2];if(b>>>0>=4){d=b&-4;b=0;while(1){H[a+60>>2]=0;H[a+52>>2]=999;H[a+56>>2]=0;H[a+44>>2]=0;H[a+36>>2]=999;H[a+40>>2]=0;H[a+28>>2]=0;H[a+20>>2]=999;H[a+24>>2]=0;H[a+12>>2]=0;H[a+4>>2]=999;H[a+8>>2]=0;a=a- -64|0;b=b+4|0;if((d|0)!=(b|0)){continue}break}if(!c){break a}}b=0;while(1){H[a+12>>2]=0;H[a+4>>2]=999;H[a+8>>2]=0;a=a+16|0;b=b+1|0;if((c|0)!=(b|0)){continue}break}}}function Bd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if(H[a+100>>2]!=1){Ba(d,1,11401,0);return 0}a:{if(c>>>0<=7){break a}Da(b,a+56|0,4);Da(b+4|0,a+60|0,4);if(c&3){break a}c=c-8|0;e=c>>>2|0;H[a+64>>2]=e;b:{if(!c){break b}c=Ea(e,4);H[a+68>>2]=c;if(!c){Ba(d,1,2235,0);return 0}if(!H[a+64>>2]){break b}d=b+8|0;c=0;while(1){Da(d,H[a+68>>2]+(c<<2)|0,4);d=d+4|0;c=c+1|0;if(c>>>0>2]){continue}break}}H[a+100>>2]=H[a+100>>2]|2;return 1}Ba(d,1,5955,0);return 0}function ke(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-16|0;na=e;H[e+12>>2]=c;a:{if(!(!Kc(a,0,b,e+12|0,d)|H[e+12>>2])){if(H[a+8>>2]==16){b=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{b=H[a+12>>2]}f=1;if(K[H[a+96>>2]+16>>2]<2){break a}c=H[b+5584>>2];g=c+28|0;b=1;d=c;while(1){H[d+1104>>2]=H[c+24>>2];H[d+1884>>2]=H[c+804>>2];B(d+1108|0,g,776);d=d+1080|0;b=b+1|0;if(b>>>0>2]+16>>2]){continue}break}break a}Ba(d,1,4591,0)}na=e+16|0;return f|0}function dc(a,b,c,d){var e=0,f=0,g=0;f=na-128|0;na=f;e=f;b=H[b+12>>2]+(c<<4)|0;c=H[b>>2];if(c){while(1){H[e>>2]=b;e=e+4|0;b=c;c=H[c>>2];if(c){continue}break}}while(1){c=H[b+8>>2];if((g|0)>(c|0)){H[b+8>>2]=g;c=g}a:{if((c|0)>=(d|0)){break a}while(1){if(H[b+4>>2]<=(c|0)){break a}b:{if(Ra(a,1)){H[b+4>>2]=c;break b}c=c+1|0}if((c|0)<(d|0)){continue}break}}H[b+8>>2]=c;if((e|0)!=(f|0)){e=e-4|0;b=H[e>>2];g=c;continue}break}na=f+128|0;return H[b+4>>2]<(d|0)}function Ld(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:{if(!Wa(H[a+8>>2],54,c)){break a}h=H[a+8>>2];d=H[h>>2];f=H[h+8>>2];b:{if(d){e=1;c:{if((d|0)!=1){j=d&1;d=d&-2;while(1){g=0;d:{if(!e){break d}g=0;if(!(ra[H[f>>2]](a,b,c)|0)){break d}g=(ra[H[f+4>>2]](a,b,c)|0)!=0}e=g;f=f+8|0;i=i+2|0;if((d|0)!=(i|0)){continue}break}if(!j){break c}}if(!e){e=0;break c}e=(ra[H[f>>2]](a,b,c)|0)!=0}Pa(h);if(!e){break a}break b}Pa(h)}k=1}return k|0}function le(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-16|0;na=e;g=H[H[a+96>>2]+16>>2];f=g>>>0<257?1:2;a:{if((f+2|0)!=(c|0)){a=0;Ba(d,1,4285,0);break a}if(H[a+8>>2]==16){c=H[a+180>>2]+N(H[a+228>>2],5644)|0}else{c=H[a+12>>2]}Da(b,e+12|0,f);a=1;b=b+f|0;Da(b,e+8|0,1);f=H[e+12>>2];if(f>>>0>=g>>>0){H[e+4>>2]=g;H[e>>2]=f;Ba(d,1,14923,e);a=0;break a}Da(b+1|0,(H[c+5584>>2]+N(f,1080)|0)+808|0,1)}na=e+16|0;return a|0}function qe(){var a=0,b=0,c=0;while(1){b=a<<4;c=b+26400|0;H[b+26404>>2]=c;H[b+26408>>2]=c;a=a+1|0;if((a|0)!=64){continue}break}zc(48);a=na-16|0;na=a;a:{if(la(a+12|0,a+8|0)|0){break a}b=vb((H[a+12>>2]<<2)+4|0);H[6860]=b;if(!b){break a}b=vb(H[a+8>>2]);if(b){c=H[6860];H[c+(H[a+12>>2]<<2)>>2]=0;if(!(ka(c|0,b|0)|0)){break a}}H[6860]=0}na=a+16|0;H[6875]=8192;H[6873]=94240;H[6867]=42;H[6874]=65536}function ye(a,b,c){var d=0,e=0,f=0,g=0;g=c&63;f=g;e=f&31;if(f>>>0>=32){f=-1>>>e|0}else{d=-1>>>e|0;f=d|(1<>>0>=32){d=f<>>32-e|d<>>0>=32){d=-1<>>32-d}a=c&a;b=b&d;d=e&31;if(e>>>0>=32){c=0;a=b>>>d|0}else{c=b>>>d|0;a=((1<>>d}a=a|g;qa=c|f;return a} +function eb(a,b,c){var d=0;if(!H[a+12>>2]){ra[b|0](c,H[a+36>>2]);return}d=Fa(8);a:{if(!d){break a}H[d+4>>2]=c;H[d>>2]=b;b=Fa(8);if(!b){Ca(d);return}H[b>>2]=d;c=N(H[a+4>>2],100);H[a+40>>2]=c;while(1){if((c|0)>2]){continue}break}H[b+4>>2]=H[a+20>>2];H[a+20>>2]=b;H[a+24>>2]=H[a+24>>2]+1;b=H[a+28>>2];if(!b){break a}H[H[b>>2]+8>>2]=0;H[a+28>>2]=H[b+4>>2];H[a+32>>2]=H[a+32>>2]-1;Ca(b)}}function Mc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;H[a+184>>2]=b;d=H[a+96>>2];a:{if(!d){break a}f=H[d+24>>2];if(!f){break a}e=H[a+12>>2];if(!e|!H[e+5584>>2]){break a}e=H[d+16>>2];if(!e){return 1}d=0;while(1){if(K[(H[H[a+12>>2]+5584>>2]+N(d,1080)|0)+4>>2]<=b>>>0){Ba(c,1,9177,0);return 0}H[(N(d,52)+f|0)+40>>2]=b;g=1;d=d+1|0;if((e|0)!=(d|0)){continue}break}}return g|0}function Ac(a,b,c){var d=0,e=0,f=0;a:{d=H[c+16>>2];if(!d){if(Db(c)){break a}d=H[c+16>>2]}e=H[c+20>>2];if(d-e>>>0>>0){ra[H[c+36>>2]](c,a,b)|0;return}b:{c:{if(!b|H[c+80>>2]<0){break c}d=b;while(1){f=a+d|0;if(I[f-1|0]!=10){d=d-1|0;if(d){continue}break c}break}if(ra[H[c+36>>2]](c,a,d)>>>0>>0){break a}b=b-d|0;e=H[c+20>>2];break b}f=a}ab(e,f,b);H[c+20>>2]=H[c+20>>2]+b}}function Bc(a){var b=0,c=0;b=H[a+76>>2];if(!((b|0)>=0&(!b|H[6867]!=(b&1073741823)))){a:{if(H[a+80>>2]==10){break a}b=H[a+20>>2];if((b|0)==H[a+16>>2]){break a}H[a+20>>2]=b+1;F[b|0]=10;return}Cc(a);return}b=a+76|0;c=H[b>>2];H[b>>2]=c?c:1073741823;b:{c:{if(H[a+80>>2]==10){break c}c=H[a+20>>2];if((c|0)==H[a+16>>2]){break c}H[a+20>>2]=c+1;F[c|0]=10;break b}Cc(a)}H[b>>2]=0}function Ka(a,b,c,d,e,f,g,h){var i=0,j=0;i=+O(e-a|0);j=i*1.402;if(P(j)<2147483647){e=~~j}else{e=-2147483648}e=e+c|0;H[f>>2]=(e|0)>=0?(b|0)>(e|0)?e:b:0;j=+O(d-a|0);i=j*.344+i*.714;if(P(i)<2147483647){a=~~i}else{a=-2147483648}a=c-a|0;H[g>>2]=(a|0)>=0?(a|0)<(b|0)?a:b:0;i=j*1.772;if(P(i)<2147483647){a=~~i}else{a=-2147483648}a=a+c|0;H[h>>2]=(a|0)>=0?(a|0)<(b|0)?a:b:0}function yb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;if(a){c=H[a+4>>2];if(c){Ca(c);H[a+4>>2]=0}if(b){c=a;while(1){d=H[c+200>>2];if(d){e=0;f=H[c+196>>2];if(f){while(1){g=H[d+12>>2];if(g){Ca(g);H[d+12>>2]=0;f=H[c+196>>2]}d=d+16|0;e=e+1|0;if(e>>>0>>0){continue}break}d=H[c+200>>2]}Ca(d);H[c+200>>2]=0}c=c+240|0;h=h+1|0;if((h|0)!=(b|0)){continue}break}}Ca(a)}}function dd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;e=H[a+84>>2];f=H[e>>2];d=H[e+4>>2];h=H[a+28>>2];g=H[a+20>>2]-h|0;g=d>>>0>>0?d:g;if(g){ab(f,h,g);f=g+H[e>>2]|0;H[e>>2]=f;d=H[e+4>>2]-g|0;H[e+4>>2]=d}d=c>>>0>d>>>0?d:c;if(d){ab(f,b,d);f=d+H[e>>2]|0;H[e>>2]=f;H[e+4>>2]=H[e+4>>2]-d}F[f|0]=0;b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;return c|0}function rd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;e=H[c+8>>2];d=e>>>0<=1?1:e;f=H[c+4>>2];g=f-H[c>>2]|0;while(1){h=d;d=d<<1;if(h-g>>>0>>0){continue}break}if((e|0)!=(h|0)){d=Fa(h);if(!d){return-1}e=H[c>>2];if(e){if(g){B(d,e,g)}Ca(H[c>>2])}H[c+8>>2]=h;H[c>>2]=d;f=d+g|0;H[c+4>>2]=f}if(b){B(f,a,b)}H[c+4>>2]=H[c+4>>2]+b;return b|0}function Yb(a){H[a+100>>2]=20832;H[a+96>>2]=20832;H[a+92>>2]=20832;H[a+88>>2]=20832;H[a+84>>2]=20832;H[a+80>>2]=20832;H[a+76>>2]=20832;H[a+72>>2]=20832;H[a+68>>2]=20832;H[a+64>>2]=20832;H[a+60>>2]=20832;H[a+56>>2]=20832;H[a+52>>2]=20832;H[a+48>>2]=20832;H[a+44>>2]=20832;H[a+40>>2]=20832;H[a+36>>2]=20832;H[a+32>>2]=20832;H[a+28>>2]=20832}function Ra(a,b){var c=0,d=0,e=0,f=0;if((b|0)<=0){return 0}c=H[a+12>>2];d=H[a+16>>2];while(1){e=b;a:{if(d){break a}c=c<<8&65280;H[a+12>>2]=c;d=(c|0)==65280?7:8;H[a+16>>2]=d;b=H[a+8>>2];if(b>>>0>=K[a+4>>2]){break a}H[a+8>>2]=b+1;c=I[b|0]|c;H[a+12>>2]=c}d=d-1|0;H[a+16>>2]=d;b=e-1|0;f=(c>>>d&1)<>>0>1){continue}break}return f}function xd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=na-16|0;na=f;e=H[a+24>>2];if((e|0)!=255){H[f>>2]=e;Ba(d,2,2678,f)}a:{b:{if(H[a+20>>2]==(c|0)){if(c){break b}e=1;break a}e=0;Ba(d,1,14510,0);break a}c=0;while(1){e=1;Da(b,(H[a+72>>2]+N(c,12)|0)+8|0,1);b=b+1|0;c=c+1|0;if(c>>>0>2]){continue}break}}na=f+16|0;return e|0}function Da(a,b,c){var d=0,e=0;H[b>>2]=0;a:{if(!c){break a}d=c&3;b=b+c|0;if(c>>>0>=4){e=c&-4;c=0;while(1){F[b-1|0]=I[a|0];F[b-2|0]=I[a+1|0];F[b-3|0]=I[a+2|0];b=b-4|0;F[b|0]=I[a+3|0];a=a+4|0;c=c+4|0;if((e|0)!=(c|0)){continue}break}if(!d){break a}}c=0;while(1){b=b-1|0;F[b|0]=I[a|0];a=a+1|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}}function de(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=na-16|0;na=e;a:{if(!c){Ba(d,1,4106,0);a=0;break a}Da(b,e+12|0,1);f=c-1|0;a=1;if(!f){break a}a=0;c=0;while(1){b=b+1|0;Da(b,e+8|0,1);g=H[e+8>>2];c=g<<24>>31&(g&127|c)<<7;a=a+1|0;if((f|0)!=(a|0)){continue}break}a=1;if(!c){break a}Ba(d,1,4106,0);a=0}na=e+16|0;return a|0}function bc(a,b,c,d){var e=0,f=0,g=O(0),h=0,i=O(0),j=0,k=O(0);if(d){while(1){e=f<<2;h=e+b|0;i=L[h>>2];j=a+e|0;g=L[j>>2];e=c+e|0;k=L[e>>2];L[j>>2]=O(k*O(1.4019999504089355))+g;L[h>>2]=O(g+O(i*O(-.3441300094127655)))+O(k*O(-.714139997959137));L[e>>2]=g+O(i*O(1.7719999551773071));f=f+1|0;if((f|0)!=(d|0)){continue}break}}}function Bb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;f=na-240|0;na=f;H[f>>2]=a;g=1;a:{if((b|0)<2){break a}d=a;while(1){d=d-8|0;h=b-2|0;e=d-H[(h<<2)+c>>2]|0;if((Ic(a,e)|0)>=0){if((Ic(a,d)|0)>=0){break a}}i=e;e=(Ic(e,d)|0)>=0;d=e?i:d;H[(g<<2)+f>>2]=d;g=g+1|0;b=e?b-1|0:h;if((b|0)>1){continue}break}}vc(f,g);na=f+240|0}function vc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;c=8;f=na-256|0;na=f;if((b|0)>=2){h=(b<<2)+a|0;H[h>>2]=f;while(1){e=c>>>0>=256?256:c;ab(H[h>>2],H[a>>2],e);d=0;while(1){g=(d<<2)+a|0;d=d+1|0;ab(H[g>>2],H[(d<<2)+a>>2],e);H[g>>2]=H[g>>2]+e;if((b|0)!=(d|0)){continue}break}c=c-e|0;if(c){continue}break}}na=f+256|0}function Wc(a){a=a|0;var b=0,c=0,d=0,e=0;b=H[a+24>>2];if(b){c=H[a+28>>2];e=(c>>>0)/52|0;if(c>>>0>=52){while(1){c=H[b>>2];if(c){Ca(c-1|0);H[b>>2]=0}c=H[b+4>>2];if(c){Ca(c);H[b+4>>2]=0}c=H[b+8>>2];if(c){Ca(c);H[b+8>>2]=0}b=b+52|0;d=d+1|0;if((e|0)!=(d|0)){continue}break}b=H[a+24>>2]}Ca(b);H[a+24>>2]=0}}function Xc(a){a=a|0;var b=0,c=0,d=0,e=0;b=H[a+24>>2];if(b){c=H[a+28>>2];e=(c>>>0)/68|0;if(c>>>0>=68){while(1){c=H[b>>2];if(c){Ca(c);H[b>>2]=0}c=H[b+4>>2];if(c){Ca(c);H[b+4>>2]=0}Ca(H[b+60>>2]);H[b+60>>2]=0;b=b+68|0;d=d+1|0;if((e|0)!=(d|0)){continue}break}b=H[a+24>>2]}Ca(b);H[a+24>>2]=0}}function ad(a,b){a=a|0;b=b|0;var c=0,d=0;c=H[a+32>>2];b=H[a+28>>2];d=b+8|0;if(c>>>0>=d>>>0){while(1){nb(a,H[a+24>>2]+(b<<2)|0,H[a+20>>2],8);c=H[a+32>>2];b=d;d=b+8|0;if(c>>>0>=d>>>0){continue}break}}if(b>>>0>>0){nb(a,H[a+24>>2]+(b<<2)|0,H[a+20>>2],c-b|0)}Ca(H[a>>2]);Ca(a)}function Cd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=na-16|0;na=e;a:{if(H[a+100>>2]){Ba(d,1,11302,0);a=0;break a}if((c|0)!=4){Ba(d,1,5991,0);a=0;break a}Da(b,e+12|0,4);if(H[e+12>>2]!=218793738){Ba(d,1,5007,0);a=0;break a}H[a+100>>2]=H[a+100>>2]|1;a=1}na=e+16|0;return a|0}function Wa(a,b,c){var d=0,e=0;a:{d=H[a>>2];e=H[a+4>>2];b:{if((d|0)!=(e|0)){e=H[a+8>>2];break b}d=e+10|0;H[a+4>>2]=d;e=Ha(H[a+8>>2],d<<2);if(!e){break a}H[a+8>>2]=e;d=H[a>>2]}H[(d<<2)+e>>2]=b;H[a>>2]=d+1;return 1}Ca(H[a+8>>2]);H[a>>2]=0;H[a+4>>2]=0;Ba(c,1,6123,0);return 0}function $a(a,b,c){var d=0,e=0,f=0,g=0;if((b|0)==1|b>>>0>1){while(1){d=a;e=b;c=c-1|0;a=ve(a,b,10,0);b=qa;f=c,g=re(a,b,246)+d|48,F[f|0]=g;if(e>>>0>9){continue}break}}if(a|b){while(1){c=c-1|0;b=(a>>>0)/10|0;F[c|0]=N(b,246)+a|48;d=a>>>0>9;a=b;if(d){continue}break}}return c}function Cc(a){var b=0,c=0,d=0;c=na-16|0;na=c;F[c+15|0]=10;b=H[a+16>>2];a:{if(!b){if(Db(a)){break a}b=H[a+16>>2]}d=b;b=H[a+20>>2];if(!((d|0)==(b|0)|H[a+80>>2]==10)){H[a+20>>2]=b+1;F[b|0]=10;break a}if((ra[H[a+36>>2]](a,c+15|0,1)|0)!=1){break a}}na=c+16|0}function rc(a){var b=0,c=0,d=0,e=0,f=0;d=H[a>>2];b=F[d|0]-48|0;if(b>>>0>9){return 0}while(1){e=-1;if(c>>>0<=214748364){c=N(c,10);e=(c^2147483647)>>>0>>0?-1:c+b|0}b=d+1|0;H[a>>2]=b;f=F[d+1|0];c=e;d=b;b=f-48|0;if(b>>>0<10){continue}break}return c} +function pc(a,b){var c=0,d=0,e=0;x(+a);d=s(1)|0;e=s(0)|0;c=d>>>20&2047;if((c|0)!=2047){if(!c){if(a==0){c=0}else{a=pc(a*0x10000000000000000,b);c=H[b>>2]+-64|0}H[b>>2]=c;return a}H[b>>2]=c-1022;u(0,e|0);u(1,d&-2146435073|1071644672);a=+w()}return a}function Qd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=O(0),f=0,g=0;d=na-16|0;na=d;if(c){while(1){Nc(a,d+12|0);e=L[d+12>>2];if(O(P(e))>2]=f;b=b+4|0;a=a+4|0;g=g+1|0;if((g|0)!=(c|0)){continue}break}}na=d+16|0}function Ua(a){var b=0,c=0,d=0;if(a){b=H[a+24>>2];if(b){c=H[a+16>>2];if(c){b=0;while(1){d=H[(H[a+24>>2]+N(b,52)|0)+44>>2];if(d){Ca(d);c=H[a+16>>2]}b=b+1|0;if(c>>>0>b>>>0){continue}break}b=H[a+24>>2]}Ca(b)}b=H[a+28>>2];if(b){Ca(b)}Ca(a)}}function Pd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=na-16|0;na=d;if(c){while(1){Kb(a,d+8|0);e=M[d+8>>3];if(P(e)<2147483647){f=~~e}else{f=-2147483648}H[b>>2]=f;b=b+4|0;a=a+8|0;g=g+1|0;if((g|0)!=(c|0)){continue}break}}na=d+16|0}function qd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=H[c+4>>2];e=H[c>>2]+H[c+8>>2]|0;if((d|0)==(e|0)){qa=-1;return-1}H[c+4>>2]=a+d;f=a;c=e-d|0;d=c;e=a>>>0>>0;a=c>>31;c=e&(a|0)>=(b|0)|(a|0)>(b|0);d=c?f:d;qa=c?b:a;return d|0}function ue(a,b,c,d){var e=0,f=0,g=0,h=0;f=b^d;g=f>>31;e=b>>31;a=a^e;h=a-e|0;e=(b^e)-((a>>>0>>0)+e|0)|0;a=d>>31;b=c^a;f=f>>31;a=ve(h,e,b-a|0,(a^d)-((a>>>0>b>>>0)+a|0)|0)^f;b=a-f|0;qa=(g^qa)-((a>>>0>>0)+g|0)|0;return b}function Va(a){var b=0,c=0,d=0,e=0;if(a){b=H[a+20>>2];c=H[a+16>>2];if(N(b,c)){while(1){e=H[H[a+24>>2]+(d<<2)>>2];if(e){Ca(e);c=H[a+16>>2];b=H[a+20>>2]}d=d+1|0;if(d>>>0>>0){continue}break}}Ca(H[a+24>>2]);Ca(a)}}function cc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if(d){while(1){e=f<<2;g=e+a|0;h=c+e|0;i=H[h>>2];j=b+e|0;k=H[j>>2];e=H[g>>2]-(i+k>>2)|0;H[g>>2]=e+i;H[j>>2]=e;H[h>>2]=e+k;f=f+1|0;if((f|0)!=(d|0)){continue}break}}}function bb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;H[a+48>>2]=0;H[a+36>>2]=H[a+32>>2];e=ra[H[a+28>>2]](b,c,H[a>>2])|0;d=H[a+68>>2];if(!e){H[a+68>>2]=d|4;return 0}H[a+56>>2]=b;H[a+60>>2]=c;H[a+68>>2]=d&-5;return 1}function Na(a,b,c,d,e){var f=0;f=na-256|0;na=f;if(!(e&73728|(c|0)<=(d|0))){d=c-d|0;c=d>>>0<256;Dc(f,b,c?d:256);if(!c){while(1){La(a,f,256);d=d-256|0;if(d>>>0>255){continue}break}}La(a,f,d)}na=f+256|0}function re(a,b,c){var d=0,e=0,f=0,g=0,h=0;e=c>>>16|0;d=a>>>16|0;h=N(e,d);f=c&65535;a=a&65535;g=N(f,a);d=(g>>>16|0)+N(d,f)|0;a=(d&65535)+N(a,e)|0;qa=h+N(b,c)+(d>>>16)+(a>>>16)|0;return g&65535|a<<16}function Db(a){var b=0;b=H[a+72>>2];H[a+72>>2]=b-1|b;b=H[a>>2];if(b&8){H[a>>2]=b|32;return-1}H[a+4>>2]=0;H[a+8>>2]=0;b=H[a+44>>2];H[a+28>>2]=b;H[a+20>>2]=b;H[a+16>>2]=b+H[a+48>>2];return 0}function hc(a){var b=0,c=0;a:{if(I[a+12|0]==255){H[a+12>>2]=65280;H[a+16>>2]=7;b=H[a+8>>2];c=0;if(b>>>0>=K[a+4>>2]){break a}H[a+8>>2]=b+1;H[a+12>>2]=I[b|0]|65280}H[a+16>>2]=0;c=1}return c}function sd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=H[c+4>>2];d=H[c>>2]+H[c+8>>2]|0;if((e|0)==(d|0)){return-1}d=d-e|0;b=b>>>0>d>>>0?d:b;if(b){B(a,e,b)}H[c+4>>2]=b+H[c+4>>2];return b|0}function Ud(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=na-16|0;na=d;if(c){while(1){Nc(a,d+12|0);L[b>>2]=L[d+12>>2];b=b+4|0;a=a+4|0;e=e+1|0;if((e|0)!=(c|0)){continue}break}}na=d+16|0}function Td(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=na-16|0;na=d;if(c){while(1){Kb(a,d+8|0);L[b>>2]=M[d+8>>3];b=b+4|0;a=a+8|0;e=e+1|0;if((e|0)!=(c|0)){continue}break}}na=d+16|0}function bd(a,b){a=a|0;b=b|0;b=H[a+28>>2];if(b>>>0>2]){while(1){$b(a,H[a+24>>2]+(N(H[a+20>>2],b)<<2)|0);b=b+1|0;if(b>>>0>2]){continue}break}}Ca(H[a>>2]);Ca(a)}function Ic(a,b){a=a|0;b=b|0;var c=0,d=0;c=H[a>>2];d=H[b>>2];a=H[a+4>>2];b=H[b+4>>2];return(c>>>0>d>>>0&(a|0)>=(b|0)|(a|0)>(b|0))-(c>>>0>>0&(a|0)<=(b|0)|(a|0)<(b|0))|0}function kd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=na-16|0;na=e;a=yc(ea(H[a+60>>2],b|0,c|0,d&255,e+8|0)|0);na=e+16|0;qa=a?-1:H[e+12>>2];return(a?-1:H[e+8>>2])|0}function mc(a,b,c,d){var e=0,f=0;e=na-16|0;na=e;if(c){while(1){Da(a,e+12|0,d);L[b>>2]=K[e+12>>2];b=b+4|0;a=a+d|0;f=f+1|0;if((f|0)!=(c|0)){continue}break}}na=e+16|0}function lc(a,b,c,d){var e=0,f=0;e=na-16|0;na=e;if(c){while(1){Da(a,e+12|0,d);H[b>>2]=H[e+12>>2];b=b+4|0;a=a+d|0;f=f+1|0;if((f|0)!=(c|0)){continue}break}}na=e+16|0}function Kb(a,b){F[b+7|0]=I[a|0];F[b+6|0]=I[a+1|0];F[b+5|0]=I[a+2|0];F[b+4|0]=I[a+3|0];F[b+3|0]=I[a+4|0];F[b+2|0]=I[a+5|0];F[b+1|0]=I[a+6|0];F[b|0]=I[a+7|0]}function Qa(a){var b=0,c=0,d=0,e=0;b=H[a+12>>2];e=b;c=H[a+8>>2];if(!(b|c)){qa=0;return 0}d=H[a+56>>2];b=c-d|0;qa=e-(H[a+60>>2]+(c>>>0>>0)|0)|0;return b}function kc(a,b){var c=0;c=na-16|0;na=c;if(a){if(b&3){a=28}else{a=gb(b,a);H[c+12>>2]=a;a=a?0:48}a=a?0:H[c+12>>2]}else{a=0}na=c+16|0;return a}function Yc(a){a=a|0;var b=0;if(a){b=H[a+116>>2];if(b){Ca(b);H[a+116>>2]=0}b=H[a+120>>2];if(b){Ca(b);H[a+120>>2]=0}Ca(H[a+148>>2]);Ca(a)}} +function sb(a,b){var c=0,d=0;a:{if(b>>>0<=31){d=H[a>>2];c=a+4|0;break a}b=b-32|0;c=a}c=H[c>>2];H[a>>2]=d<>2]=c<>>32-b}function ub(a,b){var c=0,d=0;c=H[a+4>>2];a:{if(b>>>0<=31){d=H[a>>2];break a}b=b-32|0;d=c;c=0}H[a+4>>2]=c>>>b;H[a>>2]=c<<32-b|d>>>b}function ae(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(H[H[a+96>>2]+16>>2]<<2!=(c|0)){Ba(d,1,4464,0);a=0}else{a=1}return a|0}function jc(){var a=0,b=0;a=Ea(1,44);a:{if(a){H[a+16>>2]=0;b=Ea(1,8);H[a+36>>2]=b;if(b){break a}Ca(a)}a=0}return a}function Pb(a,b){a=a|0;b=b|0;if(!(!a|!b)){H[a+188>>2]=H[b+4>>2];H[a+184>>2]=H[b>>2];H[a+248>>2]=H[b+8248>>2]&2}}function qb(){var a=0,b=0;a=Ea(1,12);if(a){H[a+4>>2]=10;b=Ea(10,4);H[a+8>>2]=b;if(b){return a}Ca(a)}return 0}function Id(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;D()}function fb(a){var b=0;if(a){b=H[a+4>>2];if(b){ra[b|0](H[a>>2])}Ca(H[a+32>>2]);H[a+32>>2]=0;Ca(a)}}function Ob(a,b){a=a|0;b=b|0;a:{if(!a){break a}H[a+208>>2]=b;if(!b){break a}F[a+92|0]=I[a+92|0]|8}}function pd(a,b,c){a=a|0;b=b|0;c=c|0;b=H[c+8>>2];H[c+4>>2]=H[c>>2]+(a>>>0>b>>>0?b:a);return 1}function ee(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if(c){a=1}else{Ba(d,1,4375,0);a=0}return a|0}function oc(a,b){if(!((b&-128)==57216|b>>>0<=127)){H[6597]=25;return-1}F[a|0]=b;return 1}function kb(a){H[a+16>>2]=0;H[a+20>>2]=0;H[a+8>>2]=0;H[a+12>>2]=0;H[a>>2]=0;H[a+4>>2]=0}function Uc(a,b,c){a=a|0;b=b|0;c=c|0;return!H[a+8>>2]&(H[a+216>>2]!=0&H[a+220>>2]!=0)}function Sa(a){if(H[a+12>>2]){H[a+40>>2]=0;while(1){if(H[a+24>>2]>0){continue}break}}}function Nc(a,b){F[b+3|0]=I[a|0];F[b+2|0]=I[a+1|0];F[b+1|0]=I[a+2|0];F[b|0]=I[a+3|0]}function hb(a){if(a){ra[H[(H[a+76>>2]?20:16)+a>>2]](H[a+48>>2]);H[a+48>>2]=0;Ca(a)}}function Nd(a,b){a=a|0;b=b|0;Pb(H[a>>2],b);F[a+124|0]=0;H[a+128>>2]=H[b+8248>>2]&1}function Ea(a,b){if(!a|!b){a=0}else{b=N(a,b);a=gb(8,b);if(a){Dc(a,0,b)}}return a}function Ga(a,b,c){var d=0;d=na-16|0;na=d;H[d+12>>2]=c;tc(a,b,c,0,0);na=d+16|0}function xe(a){var b=0;while(1){if(a){a=a-1&a;b=b+1|0;continue}break}return b}function _a(a){var b=0;if(a){b=H[a+12>>2];if(b){Ca(b);H[a+12>>2]=0}Ca(a)}}function Rc(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;D()}function Gd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Lb(H[a>>2],b,c,d)|0}function Hd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;D()}function wc(a,b){a=uc(a-1|0);if(!a){a=uc(b);a=a?a|32:0}return a}function Qb(a){return H[a+12>>2]==H[a+4>>2]|H[a+8>>2]==H[a>>2]}function Dd(a,b,c){a=a|0;b=b|0;c=c|0;return Mc(H[a>>2],b,c)|0}function uc(a){var b=0,c=0,d=0;return b=te(a),c=0,d=a,d?b:c}function pb(a){var b=0;if(a){b=H[a+8>>2];if(b){Ca(b)}Ca(a)}}function gd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;qa=0;return 0}function Za(a,b,c,d,e,f,g,h){return ac(a,b,c,d,e,f,g,h,0)}function Oc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;D()}function nc(a,b,c,d){return ra[H[a+44>>2]](a,b,c,d)|0}function Xa(a,b,c){H[((b<<2)+a|0)+28>>2]=(c<<5)+20832}function Fb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return 1}function Fd(a,b,c){a=a|0;b=b|0;c=c|0;Ib(H[a>>2],b,c)}function te(a){if(a){return 31-Q(a-1^a)|0}return 32}function rb(a,b,c){return ra[H[a+40>>2]](a,b,0,c)|0}function _d(a,b,c){a=a|0;b=b|0;c=c|0;qa=-1;return-1}function Oa(a,b,c,d,e,f,g,h){ac(a,b,c,d,e,f,g,h,1)}function yc(a){if(!a){return 0}H[6597]=a;return-1}function Wd(a,b,c){a=a|0;b=b|0;c=c|0;mc(a,b,c,2)}function Vd(a,b,c){a=a|0;b=b|0;c=c|0;mc(a,b,c,4)}function Sd(a,b,c){a=a|0;b=b|0;c=c|0;lc(a,b,c,2)}function Rd(a,b,c){a=a|0;b=b|0;c=c|0;lc(a,b,c,4)}function we(a,b,c){se(a,0,b,c);qa=pa;return oa}function La(a,b,c){if(!(I[a|0]&32)){Ac(b,c,a)}}function ie(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function Nb(a,b,c){a=a|0;b=b|0;c=c|0;return 1}function Jc(a,b,c){a=a|0;b=b|0;c=c|0;return-1}function ve(a,b,c,d){a=se(a,b,c,d);return a}function Fa(a){if(!a){return 0}return vb(a)}function Md(a,b){a=a|0;b=b|0;Ob(H[a>>2],b)}function Dc(a,b,c){if(c){y(a,b<<24>>24,c)}}function ic(a){return H[a+8>>2]-H[a>>2]|0}function hd(a){a=a|0;ia();ha(a+128|0);D()}function vb(a){a=a|0;return gb(8,a)|0}function md(a,b){a=a|0;b=b|0;_(a|0)}function ld(a,b){a=a|0;b=b|0;Y(a|0)}function Ab(a){return H[a+28>>2]!=2}function ab(a,b,c){if(c){B(a,b,c)}}function Vc(a,b){a=a|0;b=b|0;D()}function ob(a){return kc(a,32)}function Ia(a){return kc(a,16)}function id(a){a=a|0;ja();D()}function Eb(){return Ea(1,36)}function Sb(a,b){a=a|0;b=b|0}function db(a){if(a){Ca(a)}}function Qc(a){a=a|0;D()}function Pa(a){H[a>>2]=0} +// EMSCRIPTEN_END_FUNCS +a=I;m(n);var ra=[null,Sb,ie,_d,Jc,Jc,bb,Ed,ud,od,bd,ad,$c,_c,Zc,Yc,Xc,Wc,Nb,Uc,Tc,Sc,Pc,Ic,pe,oe,ne,me,le,ke,je,he,ge,fe,ee,de,ce,be,ae,Fb,$d,Zd,Fb,Fb,Yd,Xd,Wd,Vd,Ud,Td,Sd,Rd,Qd,Pd,Kd,Cd,Bd,Ad,zd,yd,xd,wd,vd,td,sd,rd,qd,pd,Qc,Qc,Ib,Nb,Gb,Ob,Pb,wb,Mb,Vc,Lb,Mc,Oc,Rc,ib,cb,Qc,Qc,Fd,Ld,Od,Vc,Gd,Dd,Oc,Rc,Md,Nd,Fc,Hd,Id,Jd,Sb,md,ld,fd,ed,dd,hd,id,Qc,jd,kd,Qc,gd];function sa(){return E.byteLength>>16}function xa(ya){ya=ya|0;var ta=sa()|0;var ua=ta+ya|0;if(ta{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst,mod))})})}wasmBinaryFile??=findWasmBinary();var result=instantiateSync(wasmBinaryFile,info);return receiveInstance(result[0])}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var HEAP16;var HEAP32;var HEAP8;var HEAPF32;var HEAPF64;var HEAPU16;var HEAPU32;var HEAPU8;var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var noExitRuntime=true;var __abort_js=()=>abort("");var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{return func()}catch(e){handleException(e)}finally{maybeExit()}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};function _copy_pixels_1(compG_ptr,nb_pixels){compG_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);imageData.set(compG)}function _copy_pixels_3(compR_ptr,compG_ptr,compB_ptr,nb_pixels){compR_ptr>>=2;compG_ptr>>=2;compB_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*3);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);for(let i=0;i>=2;compG_ptr>>=2;compB_ptr>>=2;compA_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);const compA=HEAP32.subarray(compA_ptr,compA_ptr+nb_pixels);for(let i=0;i2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;i++}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var _environ_get=(__environ,environ_buf)=>{var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>2]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>2]=bufSize;return 0};var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);return 70}var printCharBuffers=[null,[],[]];var UTF8Decoder=new TextDecoder;var findStringEnd=(heapOrArray,idx,maxBytesToRead,ignoreNul)=>{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);return UTF8Decoder.decode(heapOrArray.buffer?heapOrArray.subarray(idx,endPtr):new Uint8Array(heapOrArray.slice(idx,endPtr)))};var printChar=(stream,curr)=>{var buffer=printCharBuffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer));buffer.length=0}else{buffer.push(curr)}};var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>{if(!ptr)return"";var end=findStringEnd(HEAPU8,ptr,maxBytesToRead,ignoreNul);return UTF8Decoder.decode(HEAPU8.subarray(ptr,end))};var _fd_write=(fd,iov,iovcnt,pnum)=>{var num=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0};function _gray_to_rgba(compG_ptr,nb_pixels){compG_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);for(let i=0;i>=2;compA_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compA=HEAP32.subarray(compA_ptr,compA_ptr+nb_pixels);for(let i=0;i>=2;compG_ptr>>=2;compB_ptr>>=2;const imageData=Module.imageData=new Uint8ClampedArray(nb_pixels*4);const compR=HEAP32.subarray(compR_ptr,compR_ptr+nb_pixels);const compG=HEAP32.subarray(compG_ptr,compG_ptr+nb_pixels);const compB=HEAP32.subarray(compB_ptr,compB_ptr+nb_pixels);for(let i=0;i{HEAP8.set(array,buffer)};{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}Module["writeArrayToMemory"]=writeArrayToMemory;var _malloc,_free,_jp2_decode,__emscripten_timeout,dynCall_iji,dynCall_jji,dynCall_iiji,dynCall_jiji,memory,__indirect_function_table,wasmMemory;function assignWasmExports(wasmExports){_malloc=Module["_malloc"]=wasmExports["t"];_free=Module["_free"]=wasmExports["u"];_jp2_decode=Module["_jp2_decode"]=wasmExports["v"];__emscripten_timeout=wasmExports["w"];dynCall_iji=wasmExports["dynCall_iji"];dynCall_jji=wasmExports["dynCall_jji"];dynCall_iiji=wasmExports["dynCall_iiji"];dynCall_jiji=wasmExports["dynCall_jiji"];memory=wasmMemory=wasmExports["r"];__indirect_function_table=wasmExports["__indirect_function_table"]}var wasmImports={n:__abort_js,m:__emscripten_runtime_keepalive_clear,j:__setitimer_js,f:_copy_pixels_1,e:_copy_pixels_3,d:_copy_pixels_4,k:_emscripten_resize_heap,o:_environ_get,p:_environ_sizes_get,i:_fd_seek,b:_fd_write,q:_gray_to_rgba,h:_graya_to_rgba,c:_jsPrintWarning,l:_proc_exit,g:_rgb_to_rgba,a:_storeErrorMessage};function run(){preRun();function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve?.(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}var wasmExports;wasmExports=createWasm();run();if(runtimeInitialized){moduleRtn=Module}else{moduleRtn=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject})} +;return moduleRtn}export default OpenJPEG; diff -Nru webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/wasm/quickjs-eval.js webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/quickjs-eval.js --- webkit2gtk-2.52.3/Source/ThirdParty/pdfjs/web/wasm/quickjs-eval.js 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/ThirdParty/pdfjs/web/wasm/quickjs-eval.js 2026-07-09 07:12:41.869084800 +0000 @@ -0,0 +1,16 @@ +/* THIS FILE IS GENERATED - DO NOT EDIT */ +async function QuickJS(moduleArg={}){var moduleRtn;var e=moduleArg,aa=import.meta.url,h="",m;try{h=(new URL(".",aa)).href}catch{}m=async a=>{a=await fetch(a,{credentials:"same-origin"});if(a.ok)return a.arrayBuffer();throw Error(a.status+" : "+a.url);};var q=console.error.bind(console),r,t=!1,u,v,w,x=!1;function y(){var a=z.buffer;A=new Int8Array(a);new Int16Array(a);B=new Uint8Array(a);new Uint16Array(a);C=new Int32Array(a);D=new Uint32Array(a);new Float32Array(a);new Float64Array(a);new BigInt64Array(a);new BigUint64Array(a)} +function E(a){e.onAbort?.(a);a=`Aborted(${a})`;q(a);t=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");w?.(a);throw a;}var F;async function ba(a){if(!r)try{var b=await m(a);return new Uint8Array(b)}catch{}if(a==F&&r)a=new Uint8Array(r);else throw"both async and sync fetching of the wasm failed";return a}async function ca(a,b){try{var c=await ba(a);return await WebAssembly.instantiate(c,b)}catch(d){q(`failed to asynchronously prepare wasm: ${d}`),E(d)}} +async function da(a){var b=F;if(!r)try{var c=fetch(b,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(c,a)}catch(d){q(`wasm streaming compile failed: ${d}`),q("falling back to ArrayBuffer instantiation")}return ca(b,a)}class G{name="ExitStatus";constructor(a){this.message=`Program terminated with exit(${a})`;this.status=a}} +var C,A,D,B,H=a=>{for(;a.length>0;)a.shift()(e)},I=[],J=[],ea=()=>{var a=e.preRun.shift();J.push(a)},K=!0,L=0,fa=[0,31,60,91,121,152,182,213,244,274,305,335],ha=[0,31,59,90,120,151,181,212,243,273,304,334],M={},N=a=>{if(!(a instanceof G||a=="unwind"))throw a;},O=a=>{u=a;K||L>0||(e.onExit?.(a),t=!0);throw new G(a);},ia=a=>{if(!t)try{a()}catch(b){N(b)}finally{if(!(K||L>0))try{u=a=u,O(a)}catch(b){N(b)}}},P=(a,b,c)=>{var d=B;if(c>0){c=b+c-1;for(var g=0;g= +c)break;d[b++]=f}else if(f<=2047){if(b+1>=c)break;d[b++]=192|f>>6;d[b++]=128|f&63}else if(f<=65535){if(b+2>=c)break;d[b++]=224|f>>12;d[b++]=128|f>>6&63;d[b++]=128|f&63}else{if(b+3>=c)break;d[b++]=240|f>>18;d[b++]=128|f>>12&63;d[b++]=128|f>>6&63;d[b++]=128|f&63;g++}}d[b]=0}},ja=new TextDecoder,Q=a=>{if(a){for(var b=a,c=B,d=b+void 0;c[b]&&!(b>=d);)++b;a=ja.decode(B.subarray(a,b))}else a="";return a},R=a=>{for(var b=0,c=0;c=55296&&d<=57343? +(b+=4,++c):b+=3}return b},T=a=>{var b=R(a)+1,c=S(b);c&&P(a,c,b);return c};function U(){}var la=(a,b,c,d)=>{var g={string:k=>{var n=0;if(k!==null&&k!==void 0&&k!==0){n=R(k)+1;var X=V(n);P(k,X,n);n=X}return n},array:k=>{var n=V(k.length);A.set(k,n);return n}};a=e["_"+a];var f=[],p=0;if(d)for(var l=0;l{a=Q(a);b=b!==null?JSON.parse(Q(b)):[];try{let d=e.externalCall(a,b);return d?T(d):null}catch(d){return e.HEAPU8[c]=1,T(d.message)}};e.noExitRuntime&&(K=e.noExitRuntime);e.printErr&&(q=e.printErr);e.wasmBinary&&(r=e.wasmBinary);if(e.preInit)for(typeof e.preInit=="function"&&(e.preInit=[e.preInit]);e.preInit.length>0;)e.preInit.shift()();e.ccall=la;e.cwrap=(a,b,c,d)=>{var g=!c||c.every(f=>f==="number"||f==="boolean");return b!=="string"&&g&&!d?e["_"+a]:(...f)=>la(a,b,c,f,d)}; +e.stringToNewUTF8=T; +var S,ma,ka,V,W,z,na={e:()=>E(""),a:()=>{K=!1;L=0},b:function(a,b){a=a<-9007199254740992||a>9007199254740992?NaN:Number(a);a=new Date(a*1E3);C[b>>2]=a.getSeconds();C[b+4>>2]=a.getMinutes();C[b+8>>2]=a.getHours();C[b+12>>2]=a.getDate();C[b+16>>2]=a.getMonth();C[b+20>>2]=a.getFullYear()-1900;C[b+24>>2]=a.getDay();var c=a.getFullYear();C[b+28>>2]=(c%4!==0||c%100===0&&c%400!==0?ha:fa)[a.getMonth()]+a.getDate()-1|0;C[b+36>>2]=-(a.getTimezoneOffset()*60);c=(new Date(a.getFullYear(),6,1)).getTimezoneOffset(); +var d=(new Date(a.getFullYear(),0,1)).getTimezoneOffset();C[b+32>>2]=(c!=d&&a.getTimezoneOffset()==Math.min(d,c))|0},i:(a,b)=>{M[a]&&(clearTimeout(M[a].id),delete M[a]);if(!b)return 0;var c=setTimeout(()=>{delete M[a];ia(()=>ma(a,performance.now()))},b);M[a]={id:c,A:b};return 0},c:(a,b,c,d)=>{var g=(new Date).getFullYear(),f=(new Date(g,0,1)).getTimezoneOffset();g=(new Date(g,6,1)).getTimezoneOffset();D[a>>2]=Math.max(f,g)*60;C[b>>2]=Number(f!=g);b=p=>{var l=Math.abs(p);return`UTC${p>=0?"-":"+"}${String(Math.floor(l/ +60)).padStart(2,"0")}${String(l%60).padStart(2,"0")}`};a=b(f);b=b(g);gDate.now(),j:a=>{var b=B.length;a>>>=0;if(a>2147483648)return!1;for(var c=1;c<=4;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);a:{d=(Math.min(2147483648,Math.ceil(Math.max(a,d)/65536)*65536)-z.buffer.byteLength+65535)/65536|0;try{z.grow(d);y();var g=1; +break a}catch(f){}g=void 0}if(g)return!0}return!1},m:function(a){a=Q(a);window.console.log(a)},h:function(a){a=Q(a);return Date.parse(a)},l:function(a,b,c,d){a=Q(a);b=Q(b);c=Q(c);c=`Quickjs -- ${a}: ${b}\n${c}`;d!==0?window.alert(c):window.console.error(c)},k:O},Z; +Z=await (async function(){function a(c){c=Z=c.exports;e._evalInSandbox=c.p;e._nukeSandbox=c.q;e._init=c.r;e._commFun=c.s;e._dumpMemoryUse=c.t;S=c.u;e._free=c.v;ma=c.w;ka=c.x;V=c.y;W=c.z;z=c.n;y();return Z}var b={a:na};if(e.instantiateWasm)return new Promise(c=>{e.instantiateWasm(b,(d,g)=>{c(a(d,g))})});F??=e.locateFile?e.locateFile?e.locateFile("quickjs-eval.wasm",h):h+"quickjs-eval.wasm":(new URL("quickjs-eval.wasm",import.meta.url)).href;return function(c){return a(c.instance)}(await da(b))}()); +(function(){function a(){e.calledRun=!0;if(!t){x=!0;Z.o();v?.(e);e.onRuntimeInitialized?.();if(e.postRun)for(typeof e.postRun=="function"&&(e.postRun=[e.postRun]);e.postRun.length;){var b=e.postRun.shift();I.push(b)}H(I)}}if(e.preRun)for(typeof e.preRun=="function"&&(e.preRun=[e.preRun]);e.preRun.length;)ea();H(J);e.setStatus?(e.setStatus("Running..."),setTimeout(()=>{setTimeout(()=>e.setStatus(""),1);a()},1)):a()})();x?moduleRtn=e:moduleRtn=new Promise((a,b)=>{v=a;w=b}); +;return moduleRtn}export default QuickJS; diff -Nru webkit2gtk-2.52.3/Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml webkit2gtk-2.52.5/Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml --- webkit2gtk-2.52.3/Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml 2026-03-25 16:38:32.904259700 +0000 +++ webkit2gtk-2.52.5/Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml 2026-07-09 07:12:41.869084800 +0000 @@ -314,6 +314,26 @@ default: false sharedPreferenceForWebProcess: true +AllowTestOnlyMockContentFilterIPC: + type: bool + status: embedder + exposed: [ WebKit ] + webcoreBinding: none + defaultValue: + WebKit: + default: false + sharedPreferenceForWebProcess: true + +AllowTestOnlyOriginAccessAllowListIPC: + type: bool + status: embedder + exposed: [ WebKit ] + webcoreBinding: none + defaultValue: + WebKit: + default: false + sharedPreferenceForWebProcess: true + AllowTopNavigationToDataURLs: type: bool humanReadableName: "Allow top navigation to data: URLs" @@ -5849,6 +5869,20 @@ "PLATFORM(COCOA) || PLATFORM(GTK) || PLATFORM(WPE)": true default: false +OpenPseudoClassEnabled: + type: bool + status: stable + humanReadableName: ":open pseudo-class" + humanReadableDescription: "Enable the :open CSS pseudo-class" + category: css + defaultValue: + WebKitLegacy: + default: true + WebKit: + default: true + WebCore: + default: true + OpenXRDMABufRelaxedForTesting: type: bool status: internal @@ -8419,7 +8453,7 @@ default: false WebCore: default: false - + UpdateSceneGeometryEnabled: type: bool status: internal diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/Assertions.h webkit2gtk-2.52.5/Source/WTF/wtf/Assertions.h --- webkit2gtk-2.52.3/Source/WTF/wtf/Assertions.h 2026-04-16 13:09:19.393996200 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/Assertions.h 2026-07-09 07:12:41.869084800 +0000 @@ -783,8 +783,11 @@ #define SENSITIVE_LOG_STRING "s" #define LOGF(channel, priority, fmt, ...) do { \ auto& logChannel = LOG_CHANNEL(channel); \ - if (logChannel.state != WTFLogChannelState::Off) \ - fprintf(stderr, "[" LOG_CHANNEL_WEBKIT_SUBSYSTEM ":%s:%i] " fmt "\n", logChannel.name, priority, ##__VA_ARGS__); \ + if (logChannel.state != WTFLogChannelState::Off) { \ + IGNORE_WARNINGS_BEGIN("unsafe-buffer-usage-in-libc-call") \ + fprintf(stderr, "[" LOG_CHANNEL_WEBKIT_SUBSYSTEM ":%s:%u] " fmt "\n", logChannel.name, static_cast(priority), ##__VA_ARGS__); \ + IGNORE_WARNINGS_END \ + } \ } while (0) #define RELEASE_LOG(channel, ...) LOGF(channel, 4, __VA_ARGS__) diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/CMakeLists.txt webkit2gtk-2.52.5/Source/WTF/wtf/CMakeLists.txt --- webkit2gtk-2.52.3/Source/WTF/wtf/CMakeLists.txt 2026-02-23 14:40:54.521305800 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/CMakeLists.txt 2026-07-09 07:12:41.869084800 +0000 @@ -802,14 +802,7 @@ WEBKIT_FRAMEWORK_DECLARE(WTF) WEBKIT_INCLUDE_CONFIG_FILES_IF_EXISTS() - -if (PORT STREQUAL GTK OR PORT STREQUAL WPE) - WEBKIT_ADD_TARGET_CXX_FLAGS(WTF - -Wunsafe-buffer-usage - -Wunsafe-buffer-usage-in-libc-call - -fsafe-buffer-usage-suggestions - ) -endif () +WEBKIT_ADD_TARGET_UNSAFE_BUFFER_WARNINGS(WTF) WEBKIT_COPY_FILES(WTF_CopyHeaders DESTINATION ${WTF_FRAMEWORK_HEADERS_DIR}/wtf diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/CheckedArithmetic.h webkit2gtk-2.52.5/Source/WTF/wtf/CheckedArithmetic.h --- webkit2gtk-2.52.3/Source/WTF/wtf/CheckedArithmetic.h 2026-02-23 14:40:54.521305800 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/CheckedArithmetic.h 2026-07-09 07:12:41.872801300 +0000 @@ -385,7 +385,9 @@ [[nodiscard]] static inline bool divide(LHS lhs, RHS rhs, ResultType& result) { - if (!rhs) + if (!rhs) [[unlikely]] + return false; + if (rhs == -1 && lhs == std::numeric_limits::min()) [[unlikely]] return false; result = lhs / rhs; @@ -519,10 +521,12 @@ static inline bool divide(int64_t lhs, int64_t rhs, ResultType& result) { - if (!rhs) + if (!rhs) [[unlikely]] return false; int64_t temp = lhs / rhs; + if (!isInBounds(temp)) [[unlikely]] + return false; result = static_cast(temp); return true; } diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/CheckedPtr.h webkit2gtk-2.52.5/Source/WTF/wtf/CheckedPtr.h --- webkit2gtk-2.52.3/Source/WTF/wtf/CheckedPtr.h 2026-03-25 22:14:04.953575100 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/CheckedPtr.h 2026-07-09 07:12:41.872801300 +0000 @@ -27,6 +27,7 @@ #include #include +#include namespace WTF { @@ -204,6 +205,19 @@ static constexpr bool isNullable = true; }; +template> + requires (HasCheckedPtrMemberFunctions::value && !HasRefPtrMemberFunctions::value) +ALWAYS_INLINE CLANG_POINTER_CONVERSION CheckedPtr protect(T* ptr) +{ + return CheckedPtr(ptr); +} + +template +ALWAYS_INLINE CLANG_POINTER_CONVERSION CheckedPtr protect(const CheckedPtr& ptr) +{ + return ptr; +} + template inline bool is(CheckedPtr& source) { @@ -242,4 +256,4 @@ using WTF::CheckedPtr; using WTF::PackedCheckedPtr; - +using WTF::protect; diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/CheckedRef.h webkit2gtk-2.52.5/Source/WTF/wtf/CheckedRef.h --- webkit2gtk-2.52.3/Source/WTF/wtf/CheckedRef.h 2026-03-25 22:14:04.953575100 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/CheckedRef.h 2026-07-09 07:12:41.872801300 +0000 @@ -31,6 +31,7 @@ #include #include #include +#include #if ASSERT_ENABLED #include @@ -263,6 +264,19 @@ return dynamicDowncast(source.get()); } +template> + requires (HasCheckedPtrMemberFunctions::value && !HasRefPtrMemberFunctions::value) +ALWAYS_INLINE CLANG_POINTER_CONVERSION CheckedRef protect(T& reference) +{ + return CheckedRef(reference); +} + +template +ALWAYS_INLINE CLANG_POINTER_CONVERSION CheckedRef protect(const CheckedRef& reference) +{ + return reference; +} + template struct CheckedRefHashTraits : SimpleClassHashTraits> { static constexpr bool emptyValueIsZero = true; static CheckedRef

emptyValue() { return HashTableEmptyValue; } @@ -386,3 +400,4 @@ using WTF::CanMakeCheckedPtr; using WTF::CanMakeThreadSafeCheckedPtr; using WTF::CheckedRef; +using WTF::protect; diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/Compiler.h webkit2gtk-2.52.5/Source/WTF/wtf/Compiler.h --- webkit2gtk-2.52.3/Source/WTF/wtf/Compiler.h 2026-02-23 14:40:54.523305700 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/Compiler.h 2026-07-09 07:12:41.872801300 +0000 @@ -504,7 +504,7 @@ #endif #define IGNORE_CLANG_STATIC_ANALYZER_WARNINGS_END } -#if COMPILER(APPLE_CLANG) || defined(CLANG_WEBKIT_BRANCH) || !defined __clang_major__ || __clang_major__ >= 19 +#if COMPILER(APPLE_CLANG) || defined(CLANG_WEBKIT_BRANCH) || (defined(__clang__) && (!defined __clang_major__ || __clang_major__ >= 19)) #define IGNORE_CLANG_STATIC_ANALYZER_WARNINGS_ATTRIBUTE_ON_MEMBER(...) IGNORE_CLANG_STATIC_ANALYZER_WARNINGS_ATTRIBUTE(__VA_ARGS__) #define IGNORE_CLANG_STATIC_ANALYZER_WARNINGS_ATTRIBUTE_ON_CLASS(...) IGNORE_CLANG_STATIC_ANALYZER_WARNINGS_ATTRIBUTE(__VA_ARGS__) #define IGNORE_CLANG_STATIC_ANALYZER_WARNINGS_ATTRIBUTE_ON_FUNCTION(...) IGNORE_CLANG_STATIC_ANALYZER_WARNINGS_ATTRIBUTE(__VA_ARGS__) @@ -556,7 +556,7 @@ #define SUPPRESS_UNCOUNTED_MEMBER \ IGNORE_CLANG_STATIC_ANALYZER_WARNINGS_ATTRIBUTE_ON_MEMBER("webkit.NoUncountedMemberChecker") -#if COMPILER(APPLE_CLANG) || defined(CLANG_WEBKIT_BRANCH) || !defined __clang_major__ || __clang_major__ >= 19 +#if COMPILER(APPLE_CLANG) || defined(CLANG_WEBKIT_BRANCH) || (defined(__clang__) && (!defined __clang_major__ || __clang_major__ >= 19)) #define SUPPRESS_UNCOUNTED_LAMBDA_CAPTURE \ IGNORE_CLANG_STATIC_ANALYZER_WARNINGS_ATTRIBUTE("webkit.UncountedLambdaCapturesChecker") #define SUPPRESS_UNRETAINED_LOCAL \ @@ -567,12 +567,14 @@ IGNORE_CLANG_STATIC_ANALYZER_WARNINGS_ATTRIBUTE("alpha.webkit.NoUnretainedMemberChecker") #define SUPPRESS_RETAINPTR_CTOR_ADOPT \ IGNORE_CLANG_STATIC_ANALYZER_WARNINGS_ATTRIBUTE("alpha.webkit.RetainPtrCtorAdoptChecker") +#define CLANG_POINTER_CONVERSION [[clang::annotate_type("webkit.pointerconversion")]] #else #define SUPPRESS_UNCOUNTED_LAMBDA_CAPTURE #define SUPPRESS_UNRETAINED_LOCAL #define SUPPRESS_UNRETAINED_ARG #define SUPPRESS_UNRETAINED_MEMBER #define SUPPRESS_RETAINPTR_CTOR_ADOPT +#define CLANG_POINTER_CONVERSION #endif // To suppress webkit.RefCntblBaseVirtualDtor, use NoVirtualDestructorBase instead. diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/CurrentTime.cpp webkit2gtk-2.52.5/Source/WTF/wtf/CurrentTime.cpp --- webkit2gtk-2.52.3/Source/WTF/wtf/CurrentTime.cpp 2026-02-23 14:40:54.525305700 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/CurrentTime.cpp 2026-07-09 07:12:41.872801300 +0000 @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -257,7 +258,7 @@ uint64_t MonotonicTime::toMachAbsoluteTime() const { auto& info = machTimebaseInfo(); - return static_cast((m_value * 1.0e9 * info.denom) / info.numer); + return truncateDoubleToUint64((m_value * 1.0e9 * info.denom) / info.numer); } ApproximateTime ApproximateTime::fromMachApproximateTime(uint64_t machApproximateTime) @@ -269,7 +270,7 @@ uint64_t ApproximateTime::toMachApproximateTime() const { auto& info = machTimebaseInfo(); - return static_cast((m_value * 1.0e9 * info.denom) / info.numer); + return truncateDoubleToUint64((m_value * 1.0e9 * info.denom) / info.numer); } ContinuousTime ContinuousTime::fromMachContinuousTime(uint64_t machContinuousTime) @@ -281,7 +282,7 @@ uint64_t ContinuousTime::toMachContinuousTime() const { auto& info = machTimebaseInfo(); - return static_cast((m_value * 1.0e9 * info.denom) / info.numer); + return truncateDoubleToUint64((m_value * 1.0e9 * info.denom) / info.numer); } ContinuousApproximateTime ContinuousApproximateTime::fromMachContinuousApproximateTime(uint64_t machContinuousApproximateTime) @@ -293,7 +294,7 @@ uint64_t ContinuousApproximateTime::toMachContinuousApproximateTime() const { auto& info = machTimebaseInfo(); - return static_cast((m_value * 1.0e9 * info.denom) / info.numer); + return truncateDoubleToUint64((m_value * 1.0e9 * info.denom) / info.numer); } #endif diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/FileSystem.cpp webkit2gtk-2.52.5/Source/WTF/wtf/FileSystem.cpp --- webkit2gtk-2.52.3/Source/WTF/wtf/FileSystem.cpp 2026-02-23 14:40:54.528305800 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/FileSystem.cpp 2026-07-09 07:12:41.872801300 +0000 @@ -40,6 +40,7 @@ #include #if !OS(WINDOWS) +#include #include #include #include @@ -326,11 +327,28 @@ if (!handle) return { }; + bool succeeded = false; + auto removeOrphanOnFailure = makeScopeExit([&] { + if (!succeeded) + FileSystem::deleteFile(path); + }); + if (!handle.truncate(bytesSize)) { RELEASE_LOG_FAULT(MemoryPressure, "Unable to truncate file"); return { }; } +#if HAVE(FALLOCATE) + // Reserve real blocks so a later mmap'd memcpy() can't SIGBUS on ENOSPC. + // EOPNOTSUPP: filesystem doesn't support pre-allocation -> preserve old behavior. + // posix_fallocate is avoided because it falls back to zero-filling when pre-allocation + // is not supported by the FS. + if (fallocate(handle.platformHandle(), 0, 0, bytesSize) == -1 && errno != EOPNOTSUPP) { + RELEASE_LOG_ERROR(MemoryPressure, "Unable to reserve %zu bytes for cache file (errno=%d)", bytesSize, errno); + return { }; + } +#endif + if (!FileSystem::makeSafeToUseMemoryMapForPath(path)) return { }; @@ -341,6 +359,7 @@ if (outputHandle) *outputHandle = WTF::move(handle); + succeeded = true; return WTF::move(*mappedFile); } @@ -699,7 +718,9 @@ possibleChildLexicallyNormal = possibleChildLexicallyNormal.left(possibleChildLexicallyNormal.length() - 1); if (possibleAncestorLexicallyNormal.endsWith(static_cast(std::filesystem::path::preferred_separator))) possibleAncestorLexicallyNormal = possibleAncestorLexicallyNormal.left(possibleAncestorLexicallyNormal.length() - 1); - return possibleChildLexicallyNormal.startsWith(possibleAncestorLexicallyNormal) && possibleChildLexicallyNormal.length() != possibleAncestorLexicallyNormal.length(); + return possibleChildLexicallyNormal.startsWith(possibleAncestorLexicallyNormal) + && possibleChildLexicallyNormal.length() > possibleAncestorLexicallyNormal.length() + && possibleChildLexicallyNormal[possibleAncestorLexicallyNormal.length()] == static_cast(std::filesystem::path::preferred_separator); } String createTemporaryFile(StringView prefix, StringView suffix) @@ -714,7 +735,8 @@ auto [p, handle] = openTemporaryFile(filename, extension); return WTF::move(handle); } - return openFile(makeString(path, pathSeparator, filename, extension), FileOpenMode::Truncate); + // Why ReadWrite? On linux, we need to mmap dump files so that perf can see them, which will fail without read permission. + return openFile(makeString(path, pathSeparator, filename, extension), FileOpenMode::ReadWrite); } #if !PLATFORM(PLAYSTATION) diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/FileSystem.h webkit2gtk-2.52.5/Source/WTF/wtf/FileSystem.h --- webkit2gtk-2.52.3/Source/WTF/wtf/FileSystem.h 2026-02-23 14:40:54.528305800 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/FileSystem.h 2026-07-09 07:12:41.872801300 +0000 @@ -138,7 +138,7 @@ WTF_EXPORT_PRIVATE std::optional overwriteEntireFile(const String& path, std::span); // Prefix is what the filename should be prefixed with, not the full path. -WTF_EXPORT_PRIVATE std::pair openTemporaryFile(StringView prefix, StringView suffix = { }); +WTF_EXPORT_PRIVATE std::pair openTemporaryFile(StringView prefix, StringView suffix = { }, const String& temporaryDirectory = { }); WTF_EXPORT_PRIVATE String createTemporaryFile(StringView prefix, StringView suffix = { }); #if PLATFORM(COCOA) WTF_EXPORT_PRIVATE std::pair createTemporaryFileInDirectory(const String& directory, const String& suffix); diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/Forward.h webkit2gtk-2.52.5/Source/WTF/wtf/Forward.h --- webkit2gtk-2.52.3/Source/WTF/wtf/Forward.h 2026-02-23 14:40:54.529305700 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/Forward.h 2026-07-09 07:12:41.872801300 +0000 @@ -122,7 +122,8 @@ template class EnumeratedArray; template class EnumSet; template class FixedVector; -template class SegmentedVector; +enum class SegmentedVectorGrowthPolicy : uint8_t { Constant, Doubling }; +template class SegmentedVector; template class Function; template struct FlatteningVariantTraits; template struct IsSmartPtr; @@ -161,7 +162,7 @@ template class InlineWeakPtr; template -using SaSegmentedVector = SegmentedVector; +using SaSegmentedVector = SegmentedVector; template using SaFixedVector = FixedVector; template diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/JSONValues.cpp webkit2gtk-2.52.5/Source/WTF/wtf/JSONValues.cpp --- webkit2gtk-2.52.3/Source/WTF/wtf/JSONValues.cpp 2026-02-23 14:40:54.534305600 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/JSONValues.cpp 2026-07-09 07:12:41.872801300 +0000 @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -574,7 +575,7 @@ if (auto* number = std::get_if(&m_value)) return *number; if (auto* number = std::get_if(&m_value)) - return static_cast(*number); + return truncateDoubleToInt32(*number); return std::nullopt; } diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/LazyRef.h webkit2gtk-2.52.5/Source/WTF/wtf/LazyRef.h --- webkit2gtk-2.52.3/Source/WTF/wtf/LazyRef.h 2026-02-23 14:40:54.534305600 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/LazyRef.h 2026-07-09 07:12:41.876801300 +0000 @@ -88,7 +88,7 @@ return std::bit_cast(m_pointer); } - T* ptr(OwnerType& owner) LIFETIME_BOUND RETURNS_NONNULL { &get(owner); } + T* ptr(OwnerType& owner) LIFETIME_BOUND RETURNS_NONNULL { return &get(owner); } T* ptr(const OwnerType& owner) const LIFETIME_BOUND RETURNS_NONNULL { return &get(owner); } template diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/LazyUniqueRef.h webkit2gtk-2.52.5/Source/WTF/wtf/LazyUniqueRef.h --- webkit2gtk-2.52.3/Source/WTF/wtf/LazyUniqueRef.h 2026-02-23 14:40:54.534305600 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/LazyUniqueRef.h 2026-07-09 07:12:41.876801300 +0000 @@ -88,7 +88,7 @@ return std::bit_cast(m_pointer); } - T* ptr(OwnerType& owner) LIFETIME_BOUND RETURNS_NONNULL { &get(owner); } + T* ptr(OwnerType& owner) LIFETIME_BOUND RETURNS_NONNULL { return &get(owner); } T* ptr(const OwnerType& owner) const LIFETIME_BOUND RETURNS_NONNULL { return &get(owner); } template diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/ListHashSet.h webkit2gtk-2.52.5/Source/WTF/wtf/ListHashSet.h --- webkit2gtk-2.52.3/Source/WTF/wtf/ListHashSet.h 2026-02-23 14:40:54.535305700 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/ListHashSet.h 2026-07-09 07:12:41.876801300 +0000 @@ -582,12 +582,14 @@ template inline T& ListHashSet::first() LIFETIME_BOUND { + RELEASE_ASSERT(!isEmpty()); return *begin(); } template inline const T& ListHashSet::first() const LIFETIME_BOUND { + RELEASE_ASSERT(!isEmpty()); return *begin(); } @@ -611,6 +613,7 @@ template inline T& ListHashSet::last() LIFETIME_BOUND { + RELEASE_ASSERT(!isEmpty()); auto last = --end(); return *last; } @@ -618,6 +621,7 @@ template inline const T& ListHashSet::last() const LIFETIME_BOUND { + RELEASE_ASSERT(!isEmpty()); auto last = --end(); return *last; } diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/Logger.h webkit2gtk-2.52.5/Source/WTF/wtf/Logger.h --- webkit2gtk-2.52.3/Source/WTF/wtf/Logger.h 2026-02-23 14:40:54.536305700 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/Logger.h 2026-07-09 07:12:41.876801300 +0000 @@ -378,7 +378,9 @@ #elif ENABLE(JOURNALD_LOG) sd_journal_send("WEBKIT_SUBSYSTEM=" LOG_CHANNEL_WEBKIT_SUBSYSTEM, "WEBKIT_CHANNEL=%s", channel.name, "MESSAGE=%s", logMessage.utf8().data(), nullptr); #else + IGNORE_WARNINGS_BEGIN("unsafe-buffer-usage-in-libc-call") fprintf(stderr, "[" LOG_CHANNEL_WEBKIT_SUBSYSTEM ":%s:-] %s\n", channel.name, logMessage.utf8().data()); + IGNORE_WARNINGS_END #endif sendMessageToObservers(channel, level, arguments...); diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/MappedFileData.h webkit2gtk-2.52.5/Source/WTF/wtf/MappedFileData.h --- webkit2gtk-2.52.3/Source/WTF/wtf/MappedFileData.h 2026-02-23 14:40:54.538305500 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/MappedFileData.h 2026-07-09 07:12:41.876801300 +0000 @@ -57,11 +57,19 @@ MappedFileData(MappedFileData&&) = default; MappedFileData& operator=(MappedFileData&&) = default; + static MappedFileData emptyFile() + { + MappedFileData result; + result.m_isValid = true; + return result; + } + + explicit operator bool() const { return m_isValid; } + #if HAVE(MMAP) explicit MappedFileData(MmapSpan&&); [[nodiscard]] std::span leakHandle() { return m_fileData.leakSpan(); } - explicit operator bool() const { return !!m_fileData; } size_t size() const { return m_fileData.span().size(); } std::span span() const LIFETIME_BOUND { return m_fileData.span(); } std::span mutableSpan() LIFETIME_BOUND { return m_fileData.mutableSpan(); } @@ -69,7 +77,6 @@ MappedFileData(std::span, Win32Handle&&); const Win32Handle& fileMapping() const { return m_fileMapping; } - explicit operator bool() const { return !!m_fileData.data(); } size_t size() const { return m_fileData.size(); } std::span span() const LIFETIME_BOUND { return m_fileData; } std::span mutableSpan() LIFETIME_BOUND { return m_fileData; } @@ -82,6 +89,7 @@ std::span m_fileData; Win32Handle m_fileMapping; #endif + bool m_isValid { false }; }; } // namespace FileSystemImpl diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/MathExtras.h webkit2gtk-2.52.5/Source/WTF/wtf/MathExtras.h --- webkit2gtk-2.52.3/Source/WTF/wtf/MathExtras.h 2026-04-07 13:12:48.029566500 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/MathExtras.h 2026-07-09 07:12:41.876801300 +0000 @@ -32,11 +32,19 @@ #include #include #include +#include #include #include #include #include +#if CPU(ARM64) +#include +#endif +#if CPU(X86_64) +#include +#endif + #if OS(OPENBSD) #include #include @@ -265,11 +273,6 @@ return static_cast(value); } -constexpr int clampToInteger(double value) -{ - return clampTo(value); -} - constexpr unsigned clampToUnsigned(double value) { return clampTo(value); @@ -285,21 +288,6 @@ return clampTo(value, 0); } -constexpr int clampToInteger(float value) -{ - return clampTo(value); -} - -template -constexpr int clampToInteger(T x) -{ - constexpr T intMax = static_cast(std::numeric_limits::max()); - - if (x >= intMax) - return std::numeric_limits::max(); - return static_cast(x); -} - // Explicitly accept 64bit result when clamping double value. // Keep in mind that double can only represent 53bit integer precisely. template @@ -840,6 +828,257 @@ return roundDownToMultipleOf(divisor, x); } +// The following truncation helpers perform a direct hardware truncation of +// floating-point values to integer types. Unlike ECMAScript ToInt32/ToInt64 +// (modular wrap-around), these produce architecture-defined results for +// out-of-range inputs (e.g., NaN, infinity, values exceeding the target +// range). They are intended for call sites that check the result after +// conversion (e.g., round-trip comparison) or that are fine with a +// deterministic but unspecified value on overflow. The inline-asm paths avoid +// C++ undefined behaviour that a plain static_cast would trigger for +// non-representable values. + +// Double-to-integer truncation helpers. + +#define WTF_PROVEN_TRUE(x) (__builtin_constant_p(x) && (x)) + +ALWAYS_INLINE int32_t truncateDoubleToInt32(double number) +{ +#if CPU(X86_64) + return _mm_cvttsd_si32(_mm_set_sd(number)); +#elif CPU(ARM64) + if (WTF_PROVEN_TRUE(number > -2147483649.0 && number < 2147483648.0)) + return static_cast(number); + // fcvtzs w0, d0 + int32_t result; + __asm__("fcvtzs %w0, %d1" : "=r"(result) : "w"(number)); + return result; +#else + if (WTF_PROVEN_TRUE(number > -2147483649.0 && number < 2147483648.0)) + return static_cast(number); + if (!std::isfinite(number)) + return 0; + if (number > 0) { + if (number >= static_cast(INT32_MAX) + 1.0) + return INT32_MIN; // Saturate/wrap matching cvttsd2si overflow sentinel. + return static_cast(number); + } + if (number < static_cast(INT32_MIN)) + return INT32_MIN; + return static_cast(number); +#endif +} + +ALWAYS_INLINE int64_t truncateDoubleToInt64(double number) +{ +#if CPU(X86_64) + return _mm_cvttsd_si64(_mm_set_sd(number)); +#elif CPU(ARM64) + return vcvtd_s64_f64(number); +#else + if (WTF_PROVEN_TRUE(number >= -9223372036854775808.0 && number < 9223372036854775808.0)) + return static_cast(number); + if (!std::isfinite(number)) + return 0; + if (number > 0) { + if (number >= static_cast(INT64_MAX) + 1.0) + return INT64_MIN; // Saturate/wrap matching cvttsd2si overflow sentinel. + return static_cast(number); + } + if (number < static_cast(INT64_MIN)) + return INT64_MIN; + return static_cast(number); +#endif +} + +ALWAYS_INLINE uint32_t truncateDoubleToUint32(double number) +{ +#if CPU(X86_64) + return static_cast(_mm_cvttsd_si64(_mm_set_sd(number))); +#elif CPU(ARM64) + if (WTF_PROVEN_TRUE(number >= 0.0 && number < 4294967296.0)) + return static_cast(number); + // fcvtzu w0, d0 + uint32_t result; + __asm__("fcvtzu %w0, %d1" : "=r"(result) : "w"(number)); + return result; +#else + if (WTF_PROVEN_TRUE(number >= 0.0 && number < 4294967296.0)) + return static_cast(number); + if (!std::isfinite(number)) + return 0; + // Mimic x86_64: cvttsd2si into int64, take low 32 bits. + int64_t wide = truncateDoubleToInt64(number); + return static_cast(wide); +#endif +} + +ALWAYS_INLINE uint64_t truncateDoubleToUint64(double number) +{ +#if CPU(X86_64) + // Branchless conversion matching compiler codegen for static_cast(double). + // cvttsd2si returns 0x8000000000000000 (negative) on overflow, including for + // values >= 2^63. When that happens, subtract 2^63 and convert again; the + // arithmetic-right-shift mask selects the adjusted result only on overflow. + constexpr double twoTo63 = 9223372036854775808.0; // 0x43e0000000000000 + int64_t direct = _mm_cvttsd_si64(_mm_set_sd(number)); + double shifted = number - twoTo63; + int64_t fromShifted = _mm_cvttsd_si64(_mm_set_sd(shifted)); + int64_t mask = direct >> 63; + return static_cast((fromShifted & mask) | direct); +#elif CPU(ARM64) + return vcvtd_u64_f64(number); +#else + if (WTF_PROVEN_TRUE(number >= 0.0 && number < 18446744073709551616.0)) + return static_cast(number); + if (!std::isfinite(number)) + return 0; + if (number < 0.0) + return 0; + if (number >= 18446744073709551616.0) + return UINT64_MAX; + // For values >= 2^63, split into high and low halves to avoid UB. + constexpr double twoTo63 = 9223372036854775808.0; + if (number >= twoTo63) { + int64_t lo = static_cast(number - twoTo63); + return static_cast(lo) + static_cast(twoTo63); + } + return static_cast(static_cast(number)); +#endif +} + +// Float-to-integer truncation helpers. + +ALWAYS_INLINE int32_t truncateFloatToInt32(float number) +{ +#if CPU(X86_64) + return _mm_cvttss_si32(_mm_set_ss(number)); +#elif CPU(ARM64) + return vcvts_s32_f32(number); +#else + if (WTF_PROVEN_TRUE(number > -2147483649.0f && number < 2147483648.0f)) + return static_cast(number); + if (!std::isfinite(number)) + return 0; + if (number > 0) { + if (number >= static_cast(INT32_MAX) + 1.0f) + return INT32_MIN; + return static_cast(number); + } + if (number < static_cast(INT32_MIN)) + return INT32_MIN; + return static_cast(number); +#endif +} + +ALWAYS_INLINE int64_t truncateFloatToInt64(float number) +{ +#if CPU(X86_64) + return _mm_cvttss_si64(_mm_set_ss(number)); +#elif CPU(ARM64) + if (WTF_PROVEN_TRUE(number >= -9223372036854775808.0f && number < 9223372036854775808.0f)) + return static_cast(number); + // fcvtzs x0, s0 + int64_t result; + __asm__("fcvtzs %x0, %s1" : "=r"(result) : "w"(number)); + return result; +#else + if (WTF_PROVEN_TRUE(number >= -9223372036854775808.0f && number < 9223372036854775808.0f)) + return static_cast(number); + if (!std::isfinite(number)) + return 0; + if (number > 0) { + if (number >= static_cast(INT64_MAX) + 1.0f) + return INT64_MIN; + return static_cast(number); + } + if (number < static_cast(INT64_MIN)) + return INT64_MIN; + return static_cast(number); +#endif +} + +ALWAYS_INLINE uint32_t truncateFloatToUint32(float number) +{ +#if CPU(X86_64) + return static_cast(_mm_cvttss_si64(_mm_set_ss(number))); +#elif CPU(ARM64) + return vcvts_u32_f32(number); +#else + if (WTF_PROVEN_TRUE(number >= 0.0f && number < 4294967296.0f)) + return static_cast(number); + if (!std::isfinite(number)) + return 0; + int64_t wide = truncateFloatToInt64(number); + return static_cast(wide); +#endif +} + +ALWAYS_INLINE uint64_t truncateFloatToUint64(float number) +{ +#if CPU(X86_64) + // Branchless conversion matching compiler codegen for static_cast(float). + constexpr float twoTo63 = 9223372036854775808.0f; // 0x5f000000 + int64_t direct = _mm_cvttss_si64(_mm_set_ss(number)); + float shifted = number - twoTo63; + int64_t fromShifted = _mm_cvttss_si64(_mm_set_ss(shifted)); + int64_t mask = direct >> 63; + return static_cast((fromShifted & mask) | direct); +#elif CPU(ARM64) + if (WTF_PROVEN_TRUE(number >= 0.0f && number < 18446744073709551616.0f)) + return static_cast(number); + // fcvtzu x0, s0 + uint64_t result; + __asm__("fcvtzu %x0, %s1" : "=r"(result) : "w"(number)); + return result; +#else + if (WTF_PROVEN_TRUE(number >= 0.0f && number < 18446744073709551616.0f)) + return static_cast(number); + if (!std::isfinite(number)) + return 0; + if (number < 0.0f) + return 0; + if (number >= 18446744073709551616.0f) + return UINT64_MAX; + constexpr float twoTo63 = 9223372036854775808.0f; + if (number >= twoTo63) { + int64_t lo = static_cast(number - twoTo63); + return static_cast(lo) + static_cast(twoTo63); + } + return static_cast(static_cast(number)); +#endif +} + +// tryConvertToStrictInt32: Attempts to convert a double to int32_t, returning +// std::nullopt if the value is not exactly representable as int32 (including +// -0.0, NaN, Infinity, non-integer values, and out-of-range values). +ALWAYS_INLINE std::optional tryConvertToStrictInt32(double value) +{ +#if HAVE(FJCVTZS_INSTRUCTION) + int32_t result; + bool isExact; + // Unlike other conversions on ARM, fjcvtzs sets the zero flag when no rounding occurred. + __asm__( + "fjcvtzs %w0, %d2" + : "=r" (result), "=@cceq" (isExact) + : "w" (value) + : "cc"); + if (isExact) + return result; + return std::nullopt; +#else + if (std::isinf(value) || std::isnan(value)) + return std::nullopt; + + // Note that -0.0 is not StrictInt32. + const int32_t asInt32 = truncateDoubleToInt32(value); + if (!(asInt32 != value || (!asInt32 && std::signbit(value)))) + return asInt32; + + return std::nullopt; +#endif +} + } // namespace WTF using WTF::shuffleVector; @@ -858,3 +1097,12 @@ using WTF::isIdentical; using WTF::isRepresentableAs; using WTF::isPowerOfTwo; +using WTF::truncateDoubleToInt32; +using WTF::truncateDoubleToInt64; +using WTF::truncateDoubleToUint32; +using WTF::truncateDoubleToUint64; +using WTF::truncateFloatToInt32; +using WTF::truncateFloatToInt64; +using WTF::truncateFloatToUint32; +using WTF::truncateFloatToUint64; +using WTF::tryConvertToStrictInt32; diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/MemoryPressureHandler.cpp webkit2gtk-2.52.5/Source/WTF/wtf/MemoryPressureHandler.cpp --- webkit2gtk-2.52.3/Source/WTF/wtf/MemoryPressureHandler.cpp 2026-02-23 14:40:54.539305700 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/MemoryPressureHandler.cpp 2026-07-09 07:12:41.876801300 +0000 @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -112,7 +113,7 @@ return baseThreshold + tabCount * GB; #else UNUSED_PARAM(tabCount); - return std::min(3 * GB, static_cast(ramSize() * 0.9)); + return std::min(3 * GB, static_cast(truncateDoubleToUint64(ramSize() * 0.9))); #endif } @@ -123,7 +124,7 @@ #else size_t baseThreshold = tabCount > 1 ? 3 * GB : 2 * GB; #endif - return std::min(baseThreshold, static_cast(ramSize() * 0.9)); + return std::min(baseThreshold, static_cast(truncateDoubleToUint64(ramSize() * 0.9))); } void MemoryPressureHandler::setPageCount(unsigned pageCount) diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/PlatformEnable.h webkit2gtk-2.52.5/Source/WTF/wtf/PlatformEnable.h --- webkit2gtk-2.52.3/Source/WTF/wtf/PlatformEnable.h 2026-02-23 14:40:54.545305500 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/PlatformEnable.h 2026-07-09 07:12:41.876801300 +0000 @@ -1006,7 +1006,7 @@ #define ENABLE_JIT_OPERATION_DISASSEMBLY 1 #endif -#if CPU(ARM64E) +#if CPU(ARM64E) && ENABLE(JIT) #define ENABLE_JIT_SIGN_ASSEMBLER_BUFFER 1 #endif diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/PlatformHave.h webkit2gtk-2.52.5/Source/WTF/wtf/PlatformHave.h --- webkit2gtk-2.52.3/Source/WTF/wtf/PlatformHave.h 2026-02-23 14:40:54.545305500 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/PlatformHave.h 2026-07-09 07:12:41.876801300 +0000 @@ -253,6 +253,10 @@ #define HAVE_DLADDR 1 #endif +#if OS(LINUX) +#define HAVE_FALLOCATE 1 +#endif + #if OS(WINDOWS) #define HAVE_ISDEBUGGERPRESENT 1 #endif @@ -269,15 +273,15 @@ #define HAVE_COMPUTED_GOTO 1 -#if (CPU(ARM64E) && OS(DARWIN)) || (COMPILER(CLANG) && defined(__ARM_FEATURE_JCVT) && __ARM_FEATURE_JCVT) +#if (CPU(ARM64E) && OS(DARWIN)) || (CPU(ARM64) && OS(MACOS)) || (COMPILER(CLANG) && defined(__ARM_FEATURE_JCVT) && __ARM_FEATURE_JCVT) #define HAVE_FJCVTZS_INSTRUCTION 1 #endif -#if (CPU(ARM64E) && OS(DARWIN)) || (COMPILER(CLANG) && defined(__ARM_FEATURE_ATOMICS) && __ARM_FEATURE_ATOMICS) +#if (CPU(ARM64E) && OS(DARWIN)) || (CPU(ARM64) && OS(MACOS)) || (COMPILER(CLANG) && defined(__ARM_FEATURE_ATOMICS) && __ARM_FEATURE_ATOMICS) #define HAVE_LSE_INSTRUCTION 1 #endif -#if (CPU(ARM64E) && OS(DARWIN)) || (CPU(ARM64) && PLATFORM(MAC)) || (COMPILER(CLANG) && defined(__ARM_FEATURE_FP16_SCALAR_ARITHMETIC) && __ARM_FEATURE_FP16_SCALAR_ARITHMETIC) +#if (CPU(ARM64E) && OS(DARWIN)) || (CPU(ARM64) && OS(MACOS)) || (COMPILER(CLANG) && defined(__ARM_FEATURE_FP16_SCALAR_ARITHMETIC) && __ARM_FEATURE_FP16_SCALAR_ARITHMETIC) #define HAVE_FLOAT16_INSTRUCTION 1 #endif diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/Ref.h webkit2gtk-2.52.5/Source/WTF/wtf/Ref.h --- webkit2gtk-2.52.3/Source/WTF/wtf/Ref.h 2026-02-23 14:40:54.549305400 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/Ref.h 2026-07-09 07:12:41.876801300 +0000 @@ -33,6 +33,7 @@ #include #include #include +#include #if ASAN_ENABLED extern "C" void __asan_poison_memory_region(void const volatile *addr, size_t size); @@ -113,6 +114,12 @@ ASSERT(m_ptr); } + template + Ref(const WeakRef& other) requires std::is_convertible_v + : m_ptr(&RefDerefTraits::ref(other.get())) + { + } + Ref& operator=(T&); Ref& operator=(Ref&&); template Ref& operator=(Ref&&); @@ -174,6 +181,10 @@ typename PtrTraits::StorageType m_ptr; } SWIFT_ESCAPABLE; +// Template deduction guide. +template Ref(const WeakRef&) -> Ref, DefaultRefDerefTraits>; +template Ref(WeakRef&) -> Ref, DefaultRefDerefTraits>; + template Ref adoptRef(T&); template @@ -319,6 +330,19 @@ return Ref(reference, Ref::Adopt); } +template, typename RefDerefTraits = DefaultRefDerefTraits> + requires HasRefPtrMemberFunctions::value +ALWAYS_INLINE CLANG_POINTER_CONVERSION Ref protect(T& reference) +{ + return Ref(reference); +} + +template +ALWAYS_INLINE CLANG_POINTER_CONVERSION Ref protect(const Ref& reference) +{ + return reference.copyRef(); +} + template inline bool is(const Ref& source) { @@ -364,5 +388,6 @@ using WTF::Ref; using WTF::adoptRef; using WTF::arePointingToEqualData; +using WTF::protect; using WTF::upcast; using WTF::unsafeRefDowncast; diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/RefPtr.h webkit2gtk-2.52.5/Source/WTF/wtf/RefPtr.h --- webkit2gtk-2.52.3/Source/WTF/wtf/RefPtr.h 2026-02-23 14:40:54.550305600 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/RefPtr.h 2026-07-09 07:12:41.876801300 +0000 @@ -27,6 +27,7 @@ #include #include #include +#include namespace WTF { @@ -54,6 +55,7 @@ ALWAYS_INLINE RefPtr(RefPtr&& o) : m_ptr(o.leakRef()) { } template RefPtr(RefPtr&& o) : m_ptr(o.leakRef()) { } template RefPtr(Ref&&); + template RefPtr(const WeakPtr& o) requires std::is_convertible_v : m_ptr(RefDerefTraits::refIfNotNull(o.get())) { } // Hash table deleted values, which are only constructed and never copied or destroyed. RefPtr(HashTableDeletedValueType) : m_ptr(PtrTraits::hashTableDeletedValue()) { } @@ -109,6 +111,8 @@ // Template deduction guide. template RefPtr(Ref&&) -> RefPtr>; +template RefPtr(const WeakPtr&) -> RefPtr, DefaultRefDerefTraits>; +template RefPtr(WeakPtr&) -> RefPtr, DefaultRefDerefTraits>; template template @@ -213,6 +217,19 @@ return RefPtr(p, RefPtr::Adopt); } +template, typename RefDerefTraits = DefaultRefDerefTraits> + requires HasRefPtrMemberFunctions::value +ALWAYS_INLINE CLANG_POINTER_CONVERSION RefPtr protect(T* ptr) +{ + return RefPtr(ptr); +} + +template +ALWAYS_INLINE CLANG_POINTER_CONVERSION RefPtr protect(const RefPtr& ptr) +{ + return ptr.copyRef(); +} + template, typename V = DefaultRefDerefTraits, typename X, typename Y, typename Z> inline RefPtr upcast(const RefPtr& p) { @@ -297,6 +314,7 @@ using WTF::RefPtr; using WTF::adoptRef; +using WTF::protect; using WTF::upcast; using WTF::unsafeRefPtrDowncast; using WTF::lazyInitialize; diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/RetainPtr.h webkit2gtk-2.52.5/Source/WTF/wtf/RetainPtr.h --- webkit2gtk-2.52.3/Source/WTF/wtf/RetainPtr.h 2026-02-23 14:40:54.551305500 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/RetainPtr.h 2026-07-09 07:12:41.876801300 +0000 @@ -318,6 +318,21 @@ return ptr; } +#ifdef __OBJC__ +template + requires IsNSType +ALWAYS_INLINE CLANG_POINTER_CONVERSION RetainPtr> protect(T ptr) +{ + return ptr; +} +#endif + +template +ALWAYS_INLINE CLANG_POINTER_CONVERSION RetainPtr protect(const RetainPtr& ptr) +{ + return ptr; +} + template struct IsSmartPtr> { static constexpr bool value = true; static constexpr bool isNullable = true; @@ -379,6 +394,7 @@ using WTF::RetainPtr; using WTF::adoptCF; using WTF::lazyInitialize; +using WTF::protect; using WTF::retainPtr; using WTF::safeCFEqual; using WTF::safeCFHash; diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/SegmentedVector.h webkit2gtk-2.52.5/Source/WTF/wtf/SegmentedVector.h --- webkit2gtk-2.52.3/Source/WTF/wtf/SegmentedVector.h 2026-02-23 14:40:54.554305600 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/SegmentedVector.h 2026-07-09 07:12:41.876801300 +0000 @@ -35,13 +35,13 @@ DECLARE_ALLOCATOR_WITH_HEAP_IDENTIFIER(SegmentedVector); // An iterator for SegmentedVector. It supports only the pre ++ operator - template class SegmentedVector; - template class SegmentedVectorIterator { + template class SegmentedVector; + template class SegmentedVectorIterator { WTF_MAKE_CONFIGURABLE_ALLOCATED(FastMalloc); private: - friend class SegmentedVector; + friend class SegmentedVector; public: - typedef SegmentedVectorIterator Iterator; + typedef SegmentedVectorIterator Iterator; using iterator_category = std::forward_iterator_tag; using value_type = T; @@ -66,7 +66,7 @@ return m_index == other.m_index && &m_vector == &other.m_vector; } - SegmentedVectorIterator& operator=(const SegmentedVectorIterator& other) + SegmentedVectorIterator& operator=(const SegmentedVectorIterator& other) { m_vector = other.m_vector; m_index = other.m_index; @@ -74,13 +74,13 @@ } private: - SegmentedVectorIterator(SegmentedVector& vector, size_t index) + SegmentedVectorIterator(SegmentedVector& vector, size_t index) : m_vector(vector) , m_index(index) { } - SegmentedVector& m_vector; + SegmentedVector& m_vector; size_t m_index; }; @@ -88,15 +88,23 @@ // stored in its buffer when it grows. Therefore, it is safe to keep // pointers into a SegmentedVector. The default tuning values are // optimized for segmented vectors that get large; you may want to use - // SegmentedVector if you don't expect a lot of entries. - template + // the inline storage option if you don't expect a lot of entries. + // + // When InlineCapacity > 0, the first InlineCapacity elements are stored + // inline within the vector object itself, avoiding heap allocation for + // small vectors. Additional elements are stored in heap-allocated segments + // of SegmentSize elements each. Vectors with inline storage are not + // movable, as moving would invalidate pointers to elements stored inline. + template class SegmentedVector final { - friend class SegmentedVectorIterator; + friend class SegmentedVectorIterator; WTF_MAKE_NONCOPYABLE(SegmentedVector); WTF_DEPRECATED_MAKE_FAST_ALLOCATED(SegmentedVector); + static constexpr bool hasInlineStorage = InlineCapacity > 0; + public: - using Iterator = SegmentedVectorIterator; + using Iterator = SegmentedVectorIterator; using value_type = T; using iterator = Iterator; @@ -114,12 +122,12 @@ T& at(size_t index) LIFETIME_BOUND { ASSERT_WITH_SECURITY_IMPLICATION(index < m_size); - return segmentFor(index)->entries()[subscriptFor(index)]; + return *addressAt(index); } const T& at(size_t index) const LIFETIME_BOUND { - return const_cast*>(this)->at(index); + return const_cast(this)->at(index); } T& operator[](size_t index) LIFETIME_BOUND @@ -162,25 +170,32 @@ } template - void append(Args&&... args) + ALWAYS_INLINE T& alloc(Args&&... args) { ++m_size; if (!segmentExistsFor(m_size - 1)) - allocateSegment(); - new (NotNull, &last()) T(std::forward(args)...); + ensureSegmentsFor(m_size); + T* ptr = addressAt(m_size - 1); + new (NotNull, ptr) T(std::forward(args)...); + return *ptr; } template - T& alloc(Args&&... args) + ALWAYS_INLINE void append(Args&&... args) + { + alloc(std::forward(args)...); + } + + ALWAYS_INLINE void append(value_type&& value) { - append(std::forward(args)...); - return last(); + alloc(WTF::move(value)); } - void removeLast() + ALWAYS_INLINE void removeLast() { - last().~T(); + ASSERT_WITH_SECURITY_IMPLICATION(!isEmpty()); --m_size; + std::destroy_at(addressAt(m_size)); } void grow(size_t size) @@ -190,7 +205,7 @@ size_t oldSize = m_size; m_size = size; for (size_t i = oldSize; i < m_size; ++i) - new (NotNull, &at(i)) T(); + new (NotNull, addressAt(i)) T(); } void clear() @@ -209,16 +224,67 @@ { return Iterator(*this, m_size); } - + void shrinkToFit() { m_segments.shrinkToFit(); } + unsigned removeAllMatching(NOESCAPE const Invocable auto& matches) + { + unsigned writeIndex = 0; + unsigned matchCount = 0; + for (unsigned readIndex = 0; readIndex < m_size; ++readIndex) { + T* readPtr = addressAt(readIndex); + if (matches(*readPtr)) { + std::destroy_at(readPtr); + ++matchCount; + } else { + if (writeIndex != readIndex) { + T* writePtr = addressAt(writeIndex); + new (NotNull, writePtr) T(WTF::move(*readPtr)); + std::destroy_at(readPtr); + } + ++writeIndex; + } + } + m_size = writeIndex; + shrinkToFit(); + return matchCount; + } + private: + struct SegmentLocation { + size_t segmentIndex; + size_t offsetInSegment; + }; + + ALWAYS_INLINE static SegmentLocation segmentLocationFor(size_t index) + { + if constexpr (GrowthPolicy == SegmentedVectorGrowthPolicy::Doubling) { + size_t n = index / SegmentSize + 1; + size_t segmentIndex = (sizeof(size_t) * CHAR_BIT - 1) - WTF::clz(n); + size_t offset = index - (SegmentSize * ((static_cast(1) << segmentIndex) - 1)); + return { segmentIndex, offset }; + } else + return { index / SegmentSize, index % SegmentSize }; + } + + ALWAYS_INLINE static size_t sizeOfSegment(size_t segmentIndex) + { + if constexpr (GrowthPolicy == SegmentedVectorGrowthPolicy::Doubling) + return SegmentSize << segmentIndex; + else + return SegmentSize; + } + class Segment { public: - std::span entries() { return unsafeMakeSpan(m_entries, SegmentSize); } + std::span entries() requires (GrowthPolicy == SegmentedVectorGrowthPolicy::Constant) + { + return unsafeMakeSpan(m_entries, SegmentSize); + } + T* data() { return m_entries; } private: T m_entries[0]; @@ -226,34 +292,78 @@ using SegmentPtr = std::unique_ptr>; - void destroyAllItems() + struct EmptyInlineStorage { }; + struct InlineStorageData { + AlignedStorage m_data[InlineCapacity]; + }; + + ALWAYS_INLINE T* inlineStorage() LIFETIME_BOUND { - for (size_t i = 0; i < m_size; ++i) - at(i).~T(); + static_assert(hasInlineStorage); + return m_inlineStorageMember.m_data[0].get(); } - bool segmentExistsFor(size_t index) + ALWAYS_INLINE const T* inlineStorage() const LIFETIME_BOUND { - return index / SegmentSize < m_segments.size(); + static_assert(hasInlineStorage); + return m_inlineStorageMember.m_data[0].get(); } - Segment* segmentFor(size_t index) LIFETIME_BOUND +WTF_ALLOW_UNSAFE_BUFFER_USAGE_BEGIN + + ALWAYS_INLINE T* addressAt(size_t index) LIFETIME_BOUND { - return m_segments[index / SegmentSize].get(); + if constexpr (hasInlineStorage) { + if (index < InlineCapacity) [[likely]] + return &inlineStorage()[index]; + index -= InlineCapacity; + } + auto [segmentIndex, offset] = segmentLocationFor(index); + return &m_segments[segmentIndex].get()->data()[offset]; } - static size_t subscriptFor(size_t index) +WTF_ALLOW_UNSAFE_BUFFER_USAGE_END + + void destroyAllItems() { - return index % SegmentSize; + for (size_t i = 0; i < m_size; ++i) + std::destroy_at(addressAt(i)); } - void ensureSegmentsFor(size_t size) + bool segmentExistsFor(size_t index) { - size_t segmentCount = (m_size + SegmentSize - 1) / SegmentSize; - size_t neededSegmentCount = (size + SegmentSize - 1) / SegmentSize; + if constexpr (hasInlineStorage) { + if (index < InlineCapacity) + return true; + return heapSegmentExistsFor(index); + } else + return segmentLocationFor(index).segmentIndex < m_segments.size(); + } - for (size_t i = segmentCount ? segmentCount - 1 : 0; i < neededSegmentCount; ++i) - ensureSegment(i); + ALWAYS_INLINE bool heapSegmentExistsFor(size_t index) + { + if constexpr (hasInlineStorage) { + ASSERT(index >= InlineCapacity); + return segmentLocationFor(index - InlineCapacity).segmentIndex < m_segments.size(); + } else + return segmentLocationFor(index).segmentIndex < m_segments.size(); + } + + void ensureSegmentsFor(size_t size) + { + if constexpr (hasInlineStorage) { + if (size <= InlineCapacity) + return; + size_t currentSegmentCount = m_segments.size(); + size_t requiredSegmentCount = segmentLocationFor(size - InlineCapacity - 1).segmentIndex + 1; + for (size_t i = currentSegmentCount; i < requiredSegmentCount; ++i) + allocateSegment(); + } else { + size_t segmentCount = m_size ? segmentLocationFor(m_size - 1).segmentIndex + 1 : 0; + size_t requiredSegmentCount = segmentLocationFor(size - 1).segmentIndex + 1; + for (size_t i = segmentCount ? segmentCount - 1 : 0; i < requiredSegmentCount; ++i) + ensureSegment(i); + } } void ensureSegment(size_t segmentIndex) @@ -265,14 +375,17 @@ void allocateSegment() { - auto* ptr = static_cast(Malloc::malloc(sizeof(T) * SegmentSize)); + size_t segSize = sizeOfSegment(m_segments.size()); + auto* ptr = static_cast(Malloc::malloc(sizeof(T) * segSize)); m_segments.append(SegmentPtr(ptr, { })); } size_t m_size { 0 }; Vector m_segments; + [[no_unique_address]] std::conditional_t m_inlineStorageMember; }; } // namespace WTF using WTF::SegmentedVector; +using WTF::SegmentedVectorGrowthPolicy; diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/StatisticsManager.cpp webkit2gtk-2.52.5/Source/WTF/wtf/StatisticsManager.cpp --- webkit2gtk-2.52.3/Source/WTF/wtf/StatisticsManager.cpp 2026-02-23 14:40:54.557305600 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/StatisticsManager.cpp 2026-07-09 07:12:41.880801000 +0000 @@ -27,6 +27,7 @@ #include "StatisticsManager.h" #include +#include #include #include #include @@ -62,7 +63,7 @@ double binSize = (max - min) / binCount; for (double value : values) { - size_t index = std::min(binCount - 1, static_cast((value - min) / binSize)); + size_t index = std::min(binCount - 1, static_cast(truncateDoubleToUint64((value - min) / binSize))); ++bins[index]; } diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/SuspendableWorkQueue.cpp webkit2gtk-2.52.5/Source/WTF/wtf/SuspendableWorkQueue.cpp --- webkit2gtk-2.52.3/Source/WTF/wtf/SuspendableWorkQueue.cpp 2026-02-23 14:40:54.559305400 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/SuspendableWorkQueue.cpp 2026-07-09 07:12:41.880801000 +0000 @@ -103,6 +103,15 @@ }); } +void SuspendableWorkQueue::dispatchWithQOS(Function&& function, QOS qos) +{ + RELEASE_ASSERT(function); + WorkQueue::dispatchWithQOS([protectedThis = Ref { *this }, function = WTF::move(function)] { + protectedThis->suspendIfNeeded(); + function(); + }, qos); +} + void SuspendableWorkQueue::dispatchAfter(Seconds seconds, Function&& function) { RELEASE_ASSERT(function); diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/SuspendableWorkQueue.h webkit2gtk-2.52.5/Source/WTF/wtf/SuspendableWorkQueue.h --- webkit2gtk-2.52.3/Source/WTF/wtf/SuspendableWorkQueue.h 2026-02-23 14:40:54.559305400 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/SuspendableWorkQueue.h 2026-07-09 07:12:41.880801000 +0000 @@ -41,6 +41,7 @@ void suspend(Function&& suspendFunction, CompletionHandler&& suspensionCompletionHandler); void resume(); void dispatch(Function&&) final; + void dispatchWithQOS(Function&&, QOS); void dispatchAfter(Seconds, Function&&) final; void dispatchSync(Function&&) final; bool isSuspended() const; diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/WallTime.cpp webkit2gtk-2.52.5/Source/WTF/wtf/WallTime.cpp --- webkit2gtk-2.52.3/Source/WTF/wtf/WallTime.cpp 2026-01-20 14:08:42.418682600 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/WallTime.cpp 2026-07-09 07:12:41.880801000 +0000 @@ -31,6 +31,16 @@ namespace WTF { +WallTime WallTime::fromSecondsSinceEpoch(Seconds seconds) +{ + return WallTime { seconds.value() }; +} + +Seconds WallTime::secondsSinceEpoch() const +{ + return Seconds { m_value }; +} + MonotonicTime WallTime::approximateMonotonicTime() const { if (isInfinity()) diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/WallTime.h webkit2gtk-2.52.5/Source/WTF/wtf/WallTime.h --- webkit2gtk-2.52.3/Source/WTF/wtf/WallTime.h 2026-01-20 14:08:42.418682600 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/WallTime.h 2026-07-09 07:12:41.880801000 +0000 @@ -47,7 +47,10 @@ constexpr WallTime() = default; WTF_EXPORT_PRIVATE static WallTime now(); - + + WTF_EXPORT_PRIVATE static WallTime fromSecondsSinceEpoch(Seconds); + WTF_EXPORT_PRIVATE Seconds secondsSinceEpoch() const; + WallTime approximateWallTime() const { return *this; } WTF_EXPORT_PRIVATE MonotonicTime approximateMonotonicTime() const; diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/WeakPtr.h webkit2gtk-2.52.5/Source/WTF/wtf/WeakPtr.h --- webkit2gtk-2.52.3/Source/WTF/wtf/WeakPtr.h 2026-02-23 14:40:54.567305600 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/WeakPtr.h 2026-07-09 07:12:41.884801000 +0000 @@ -118,6 +118,8 @@ return m_impl ? static_cast(m_impl->template get()) : nullptr; } + operator T*() const { return get(); } + WeakRef releaseNonNull() { return WeakRef { m_impl.releaseNonNull(), enableWeakPtrThreadingAssertions() }; diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/glib/FileSystemGlib.cpp webkit2gtk-2.52.5/Source/WTF/wtf/glib/FileSystemGlib.cpp --- webkit2gtk-2.52.3/Source/WTF/wtf/glib/FileSystemGlib.cpp 2026-04-02 11:17:43.701464400 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/glib/FileSystemGlib.cpp 2026-07-09 07:12:41.884801000 +0000 @@ -65,7 +65,7 @@ { static char readLinkBuffer[PATH_MAX]; ssize_t result = readlink("/proc/self/exe", readLinkBuffer, PATH_MAX); - if (result == -1) + if (result <= 0) return { }; WTF_ALLOW_UNSAFE_BUFFER_USAGE_BEGIN // Linux port return CString(std::span { readLinkBuffer, static_cast(result) }); @@ -85,16 +85,21 @@ int selfFd = open("/proc/self/exefile", O_RDONLY); ssize_t result = read(selfFd, readBuffer, sizeof(readBuffer)); close(selfFd); - if (result == -1) + if (result <= 0) return { }; return CString(unsafeMakeSpan(readBuffer, static_cast(result))); } #elif OS(UNIX) +#if OS(NETBSD) +#define _PROC_CURPROC_PATH "/proc/curproc/exe" +#else +#define _PROC_CURPROC_PATH "/proc/curproc/file" +#endif CString currentExecutablePath() { static char readLinkBuffer[PATH_MAX]; - ssize_t result = readlink("/proc/curproc/file", readLinkBuffer, PATH_MAX); - if (result == -1) + ssize_t result = readlink(_PROC_CURPROC_PATH, readLinkBuffer, PATH_MAX); + if (result <= 0) return { }; return CString(unsafeMakeSpan(readLinkBuffer, static_cast(result))); } diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/posix/FileHandlePOSIX.cpp webkit2gtk-2.52.5/Source/WTF/wtf/posix/FileHandlePOSIX.cpp --- webkit2gtk-2.52.3/Source/WTF/wtf/posix/FileHandlePOSIX.cpp 2026-02-23 14:40:54.583305400 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/posix/FileHandlePOSIX.cpp 2026-07-09 07:12:41.884801000 +0000 @@ -163,7 +163,7 @@ return { }; if (!size) - return MappedFileData { }; + return MappedFileData::emptyFile(); int pageProtection = PROT_READ; switch (openMode) { diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/posix/FileSystemPOSIX.cpp webkit2gtk-2.52.5/Source/WTF/wtf/posix/FileSystemPOSIX.cpp --- webkit2gtk-2.52.3/Source/WTF/wtf/posix/FileSystemPOSIX.cpp 2026-02-23 14:40:54.583305400 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/posix/FileSystemPOSIX.cpp 2026-07-09 07:12:41.884801000 +0000 @@ -166,14 +166,15 @@ #endif } -std::pair openTemporaryFile(StringView prefix, StringView suffix) +std::pair openTemporaryFile(StringView prefix, StringView suffix, const String& temporaryDirectory) { // Suffix is not supported because that's incompatible with mkostemp, mkostemps would be needed for that. // This is OK for now since the code using it is built on macOS only. ASSERT_UNUSED(suffix, suffix.isEmpty()); + const auto temporaryDirectoryUtf8 = temporaryDirectory.utf8(); IGNORE_CLANG_WARNINGS_BEGIN("unsafe-buffer-usage-in-libc-call") - const char* directory = temporaryFileDirectory(); + const char* directory = !temporaryDirectory.isEmpty() ? temporaryDirectoryUtf8.data() : temporaryFileDirectory(); CString prefixUTF8 = prefix.utf8(); size_t length = strlen(directory) + 1 + prefixUTF8.length() + 1 + 6 + 1; auto buffer = MallocSpan::malloc(length); diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/posix/MappedFileDataPOSIX.cpp webkit2gtk-2.52.5/Source/WTF/wtf/posix/MappedFileDataPOSIX.cpp --- webkit2gtk-2.52.3/Source/WTF/wtf/posix/MappedFileDataPOSIX.cpp 2026-02-23 14:40:54.583305400 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/posix/MappedFileDataPOSIX.cpp 2026-07-09 07:12:41.884801000 +0000 @@ -31,6 +31,7 @@ #if HAVE(MMAP) MappedFileData::MappedFileData(MmapSpan&& fileData) : m_fileData(WTF::move(fileData)) + , m_isValid(true) { } MappedFileData::~MappedFileData() = default; diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/text/CString.cpp webkit2gtk-2.52.5/Source/WTF/wtf/text/CString.cpp --- webkit2gtk-2.52.3/Source/WTF/wtf/text/CString.cpp 2026-02-23 14:40:54.594305300 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/text/CString.cpp 2026-07-09 07:12:41.884801000 +0000 @@ -141,6 +141,15 @@ return equal(byteCast(a.span()).data(), byteCast(b.span())); } +bool operator==(const CString& a, ASCIILiteral b) +{ + if (a.isNull() != b.isNull()) + return false; + if (a.length() != b.length()) + return false; + return equal(byteCast(a.span()).data(), b.span8()); +} + unsigned CString::hash() const { if (isNull()) diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/text/CString.h webkit2gtk-2.52.5/Source/WTF/wtf/text/CString.h --- webkit2gtk-2.52.3/Source/WTF/wtf/text/CString.h 2026-03-25 15:12:51.363839400 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/text/CString.h 2026-07-09 07:12:41.884801000 +0000 @@ -111,6 +111,7 @@ } SWIFT_ESCAPABLE; WTF_EXPORT_PRIVATE bool operator==(const CString&, const CString&); +WTF_EXPORT_PRIVATE bool operator==(const CString&, ASCIILiteral); WTF_EXPORT_PRIVATE bool operator<(const CString&, const CString&); WTF_EXPORT_PRIVATE CString convertToASCIILowercase(std::span); diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/text/StringCommon.h webkit2gtk-2.52.5/Source/WTF/wtf/text/StringCommon.h --- webkit2gtk-2.52.3/Source/WTF/wtf/text/StringCommon.h 2026-02-23 14:40:54.597305300 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/text/StringCommon.h 2026-07-09 07:12:41.888800900 +0000 @@ -1517,6 +1517,12 @@ WTF_ALLOW_UNSAFE_BUFFER_USAGE_END + +inline bool operator==(ASCIILiteral a, const char* b) +{ + return equalSpans(a.spanIncludingNullTerminator(), unsafeSpanIncludingNullTerminator(b)); +} + } using WTF::charactersContain; diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/text/StringImpl.cpp webkit2gtk-2.52.5/Source/WTF/wtf/text/StringImpl.cpp --- webkit2gtk-2.52.3/Source/WTF/wtf/text/StringImpl.cpp 2026-03-24 20:12:11.798818600 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/text/StringImpl.cpp 2026-07-09 07:12:41.888800900 +0000 @@ -305,7 +305,11 @@ std::span data; auto string = createUninitializedInternalNonEmpty(utf16Length, data); +#if CPU(BIG_ENDIAN) + size_t written = simdutf::convert_valid_utf8_to_utf16be(input, inputLength, data.data()); +#else size_t written = simdutf::convert_valid_utf8_to_utf16le(input, inputLength, data.data()); +#endif RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(written == utf16Length); return string; diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/text/StringImpl.h webkit2gtk-2.52.5/Source/WTF/wtf/text/StringImpl.h --- webkit2gtk-2.52.3/Source/WTF/wtf/text/StringImpl.h 2026-02-23 14:40:54.598305200 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/text/StringImpl.h 2026-07-09 07:12:41.888800900 +0000 @@ -1497,7 +1497,7 @@ return makeUnexpected(UTF8ConversionError::OutOfMemory); size_t bufferSize = characters.size() * 3; - bufferVector.grow(bufferSize); + bufferVector.resize(bufferSize); auto convertedSize = utf8ForCharactersIntoBuffer(characters, mode, bufferVector); if (!convertedSize) return makeUnexpected(convertedSize.error()); diff -Nru webkit2gtk-2.52.3/Source/WTF/wtf/text/TextStream.cpp webkit2gtk-2.52.5/Source/WTF/wtf/text/TextStream.cpp --- webkit2gtk-2.52.3/Source/WTF/wtf/text/TextStream.cpp 2026-02-23 14:40:54.600305300 +0000 +++ webkit2gtk-2.52.5/Source/WTF/wtf/text/TextStream.cpp 2026-07-09 07:12:41.888800900 +0000 @@ -26,6 +26,7 @@ #include "config.h" #include +#include #include #include #include @@ -41,7 +42,7 @@ static inline bool hasFractions(double val) { static constexpr double s_epsilon = 0.0001; - int ival = static_cast(val); + int ival = truncateDoubleToInt32(val); double dval = static_cast(ival); return std::abs(val - dval) > s_epsilon; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/CMakeLists.txt webkit2gtk-2.52.5/Source/WebCore/CMakeLists.txt --- webkit2gtk-2.52.3/Source/WebCore/CMakeLists.txt 2026-04-01 21:32:25.464707400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/CMakeLists.txt 2026-07-09 07:12:41.892800800 +0000 @@ -2728,14 +2728,7 @@ WEBKIT_FRAMEWORK_DECLARE(WebCore) WEBKIT_LIBRARY_DECLARE(WebCoreTestSupport) WEBKIT_INCLUDE_CONFIG_FILES_IF_EXISTS() - -if (PORT STREQUAL GTK OR PORT STREQUAL WPE) - WEBKIT_ADD_TARGET_CXX_FLAGS(WebCore - -Wunsafe-buffer-usage - -Wunsafe-buffer-usage-in-libc-call - -fsafe-buffer-usage-suggestions - ) -endif () +WEBKIT_ADD_TARGET_UNSAFE_BUFFER_WARNINGS(WebCore) if (ENABLE_MALLOC_HEAP_BREAKDOWN) list(APPEND WebCore_LIBRARIES ${MALLOC_HEAP_BREAKDOWN_LIBRARIES}) @@ -2753,7 +2746,7 @@ OUTPUT ${WebCore_DERIVED_SOURCES_DIR}/DOMJITAbstractHeapRepository.h MAIN_DEPENDENCY domjit/DOMJITAbstractHeapRepository.yaml DEPENDS ${WEBCORE_DIR}/domjit/generate-abstract-heap.rb - COMMAND ${RUBY_EXECUTABLE} ${WEBCORE_DIR}/domjit/generate-abstract-heap.rb ${WEBCORE_DIR}/domjit/DOMJITAbstractHeapRepository.yaml ${WebCore_DERIVED_SOURCES_DIR}/DOMJITAbstractHeapRepository.h + COMMAND ${Ruby_EXECUTABLE} ${WEBCORE_DIR}/domjit/generate-abstract-heap.rb ${WEBCORE_DIR}/domjit/DOMJITAbstractHeapRepository.yaml ${WebCore_DERIVED_SOURCES_DIR}/DOMJITAbstractHeapRepository.h VERBATIM) list(APPEND WebCore_SOURCES ${WebCore_DERIVED_SOURCES_DIR}/DOMJITAbstractHeapRepository.h) @@ -2893,7 +2886,7 @@ ${WebCore_DERIVED_SOURCES_DIR}/InternalSettingsGenerated.idl MAIN_DEPENDENCY ${WEBCORE_DIR}/page/Settings.yaml DEPENDS ${WEBCORE_DIR}/Scripts/GenerateSettings.rb ${SETTINGS_TEMPLATES} WTF_CopyPreferences ${WTF_WEB_PREFERENCES} - COMMAND ${RUBY_EXECUTABLE} ${WEBCORE_DIR}/Scripts/GenerateSettings.rb --outputDir ${WebCore_DERIVED_SOURCES_DIR} --template "$" ${WTF_WEB_PREFERENCES} ${WEBCORE_DIR}/page/Settings.yaml + COMMAND ${Ruby_EXECUTABLE} ${WEBCORE_DIR}/Scripts/GenerateSettings.rb --outputDir ${WebCore_DERIVED_SOURCES_DIR} --template "$" ${WTF_WEB_PREFERENCES} ${WEBCORE_DIR}/page/Settings.yaml COMMAND_EXPAND_LISTS VERBATIM) list(APPEND WebCore_SOURCES ${WebCore_DERIVED_SOURCES_DIR}/Settings.h) diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/async-clipboard/Clipboard.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/async-clipboard/Clipboard.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/async-clipboard/Clipboard.cpp 2026-02-23 14:40:54.663305000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/async-clipboard/Clipboard.cpp 2026-07-09 07:12:41.892800800 +0000 @@ -37,13 +37,13 @@ #include "JSBlob.h" #include "JSClipboardItem.h" #include "JSDOMPromiseDeferred.h" +#include "LocalDOMWindow.h" #include "LocalFrameInlines.h" #include "Navigator.h" #include "PagePasteboardContext.h" #include "Pasteboard.h" #include "Settings.h" #include "SharedBuffer.h" -#include "UserGestureIndicator.h" #include "WebContentReader.h" #include #include @@ -52,6 +52,16 @@ WTF_MAKE_TZONE_ALLOCATED_IMPL(Clipboard); +// https://w3c.github.io/clipboard-apis/ requires the relevant global object to have transient +// activation. Transient activation is not propagated to cross-origin iframes, so a user +// interaction on a top-level page cannot be used by a cross-origin iframe to access the +// clipboard via postMessage. +static bool frameHasTransientActivation(const LocalFrame& frame) +{ + RefPtr window = frame.window(); + return window && window->hasTransientActivation(); +} + static bool shouldProceedWithClipboardWrite(const LocalFrame& frame) { auto& settings = frame.settings(); @@ -62,7 +72,7 @@ case ClipboardAccessPolicy::Allow: return true; case ClipboardAccessPolicy::RequiresUserGesture: - return UserGestureIndicator::processingUserGesture(); + return frameHasTransientActivation(frame); case ClipboardAccessPolicy::Deny: return false; } @@ -105,7 +115,7 @@ void Clipboard::readText(Ref&& promise) { RefPtr frame = this->frame(); - if (!frame) { + if (!frame || !frameHasTransientActivation(*frame)) { promise->reject(ExceptionCode::NotAllowedError); return; } @@ -163,7 +173,7 @@ }; RefPtr frame = this->frame(); - if (!frame) { + if (!frame || !frameHasTransientActivation(*frame)) { rejectPromiseAndClearActiveSession(); return; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/async-clipboard/ClipboardItemBindingsDataSource.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/async-clipboard/ClipboardItemBindingsDataSource.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/async-clipboard/ClipboardItemBindingsDataSource.cpp 2026-04-10 22:04:01.637965000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/async-clipboard/ClipboardItemBindingsDataSource.cpp 2026-07-09 07:12:41.892800800 +0000 @@ -128,10 +128,9 @@ void ClipboardItemBindingsDataSource::clearItemTypeLoaders() { - for (auto& itemTypeLoader : m_itemTypeLoaders) + auto itemTypeLoaders = std::exchange(m_itemTypeLoaders, { }); + for (auto& itemTypeLoader : itemTypeLoaders) itemTypeLoader->invokeCompletionHandler(); - - m_itemTypeLoaders.clear(); } void ClipboardItemBindingsDataSource::collectDataForWriting(Clipboard& destination, CompletionHandler)>&& completion) diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/cache/CacheStorageConnection.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/cache/CacheStorageConnection.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/cache/CacheStorageConnection.cpp 2026-01-20 14:08:42.832450000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/cache/CacheStorageConnection.cpp 2026-07-09 07:12:41.892800800 +0000 @@ -71,7 +71,6 @@ uint64_t sizeWithPadding = realSize + static_cast(cryptographicallyRandomUnitInterval() * 128000); sizeWithPadding = ((sizeWithPadding / 32000) + 1) * 32000; - m_opaqueResponseToSizeWithPaddingMap.set(response.opaqueLoadIdentifier(), sizeWithPadding); return sizeWithPadding; }).iterator->value; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/encryptedmedia/MediaKeySession.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/encryptedmedia/MediaKeySession.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/encryptedmedia/MediaKeySession.cpp 2026-02-23 14:40:54.674305000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/encryptedmedia/MediaKeySession.cpp 2026-07-09 07:12:41.896800800 +0000 @@ -783,6 +783,12 @@ // W3C Editor's Draft 09 November 2016 ALWAYS_LOG(LOGIDENTIFIER); + // close(), stop(), and a CDM-reported close during update() each queue a task that lands here. They guard on + // m_closed before enqueuing, but it is only set when the task runs, so more than one task can already be queued. + // Update m_closed here to ensure the promise is only resolved once, and avoid an assertion in DOMPromiseProxy. + if (std::exchange(m_closed, true)) + return; + // 1. Let session be the associated MediaKeySession object. // 2. If session's session type is "persistent-usage-record", execute the following steps in parallel: if (m_sessionType == MediaKeySessionType::PersistentUsageRecord) { @@ -797,11 +803,16 @@ // 4. Run the Update Expiration algorithm on the session, providing NaN. updateExpiration(std::numeric_limits::quiet_NaN()); - // Let's consider the session closed before any promise on the 'closed' attribute is resolved. - m_closed = true; - // 5. Let promise be the closed attribute of the session. // 6. Resolve promise. + // Skip if the context is stopping (e.g. a back/forward-cached page being pruned); otherwise resolving the + // promise trips DeferredPromise's suspended-context assertion. + RefPtr context = scriptExecutionContext(); + if (!context || context->activeDOMObjectsAreStopped()) { + ALWAYS_LOG(LOGIDENTIFIER, "Context is stopping; not resolving closed promise"); + return; + } + m_closedPromise->resolve(); } @@ -845,6 +856,8 @@ if (!protectedThis) return; + // Run Session Closed synchronously to avoid the CDM session outliving the page and leaking into the next + // navigation. ALWAYS_LOG_WITH_THIS(protectedThis, logIdentifier, "::lambda, closed"); protectedThis->sessionClosed(); }); diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/fetch/FetchBody.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/fetch/FetchBody.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/fetch/FetchBody.cpp 2026-02-23 14:40:54.680304800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/fetch/FetchBody.cpp 2026-07-09 07:12:41.896800800 +0000 @@ -359,7 +359,9 @@ ASSERT(!clones.hasException()); if (!clones.hasException()) { auto pair = clones.releaseReturnValue(); + m_data = pair[0]; m_readableStream = WTF::move(pair[0]); + clone.m_data = pair[1]; clone.m_readableStream = WTF::move(pair[1]); } } diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp 2026-04-10 22:21:49.400998600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp 2026-07-09 07:12:41.896800800 +0000 @@ -212,8 +212,11 @@ return nullptr; skip(data, currentBoundaryIndex + boundaryLength); - if (spanHasPrefix(data, "--\r\n"_span)) + if (spanHasPrefix(data, "--\r\n"_span)) { + // FIXME: This is not valid as per RFC, but is consistent with how empty form data are serialized. return form; + } + skipWhile(data); if (!spanHasPrefix(data, "\r\n"_span)) return nullptr; @@ -222,8 +225,9 @@ parseMultipartPart(data.first(nextBoundaryIndex - oneNewLine.length()), form.get()); currentBoundaryIndex = nextBoundaryIndex; skip(data, nextBoundaryIndex + boundaryLength); - if (spanHasPrefix(data, "--\r\n"_span)) + if (spanHasPrefix(data, "--"_span)) return form; + skipWhile(data); if (!spanHasPrefix(data, "\r\n"_span)) return nullptr; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/fetch/FetchBodySource.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/fetch/FetchBodySource.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/fetch/FetchBodySource.cpp 2026-04-10 09:30:55.862679700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/fetch/FetchBodySource.cpp 2026-07-09 07:12:41.896800800 +0000 @@ -91,7 +91,7 @@ static JSDOMGlobalObject* globalObjectFromBodyOwner(RefPtr&& bodyOwner) { RefPtr context = bodyOwner ? bodyOwner->scriptExecutionContext() : nullptr; - return JSC::jsCast(context->globalObject()); + return context ? JSC::jsCast(context->globalObject()) : nullptr; } // FIXME: We should be able to take a FragmentedSharedBuffer diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/fetch/FetchRequest.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/fetch/FetchRequest.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/fetch/FetchRequest.cpp 2026-02-23 14:40:54.682304900 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/fetch/FetchRequest.cpp 2026-07-09 07:12:41.896800800 +0000 @@ -274,7 +274,7 @@ } if (RefPtr document = dynamicDowncast(context); document && document->settings().localNetworkAccessEnabled()) - m_targetAddressSpace = updateTargetAddressSpaceIfNeeded(*init.targetAddressSpace, m_request.url()); + m_targetAddressSpace = updateTargetAddressSpaceIfNeeded(init.targetAddressSpace.value_or(input.m_targetAddressSpace), m_request.url()); auto setBodyResult = init.body ? setBody(WTF::move(*init.body)) : setBody(input); if (setBodyResult.hasException()) diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/IDBKeyData.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/IDBKeyData.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/IDBKeyData.cpp 2026-02-23 14:40:54.697304700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/IDBKeyData.cpp 2026-07-09 07:12:41.896800800 +0000 @@ -256,8 +256,10 @@ if (aType == IndexedDB::KeyType::Invalid) { if (bType != IndexedDB::KeyType::Invalid) return std::weak_ordering::less; - if (bType == IndexedDB::KeyType::Invalid) - return std::weak_ordering::equivalent; + // Distinguish nullptr_t and Invalid{} to match operator==. + if (a.isNull() != b.isNull()) + return a.isNull() ? std::weak_ordering::less : std::weak_ordering::greater; + return std::weak_ordering::equivalent; } else if (bType == IndexedDB::KeyType::Invalid) return std::weak_ordering::greater; @@ -282,9 +284,15 @@ } case IndexedDB::KeyType::Binary: return compareBinaryKeyData(std::get(a.m_value), std::get(b.m_value)); - case IndexedDB::KeyType::String: - return codePointCompare(std::get(a.m_value), std::get(b.m_value)); - case IndexedDB::KeyType::Date: + case IndexedDB::KeyType::String: { + auto& aStr = std::get(a.m_value); + auto& bStr = std::get(b.m_value); + // Distinguish null String from empty String to match operator==; + // codePointCompare treats them as equivalent. + if (aStr.isNull() != bStr.isNull()) + return aStr.isNull() ? std::weak_ordering::less : std::weak_ordering::greater; + return codePointCompare(aStr, bStr); + } case IndexedDB::KeyType::Date: return weakOrderingCast(std::get(a.m_value).value <=> std::get(b.m_value).value); case IndexedDB::KeyType::Number: return weakOrderingCast(std::get(a.m_value) <=> std::get(b.m_value)); diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/IDBKeyData.h webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/IDBKeyData.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/IDBKeyData.h 2026-02-23 14:40:54.697304700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/IDBKeyData.h 2026-07-09 07:12:41.896800800 +0000 @@ -46,9 +46,9 @@ struct Min { Min isolatedCopy() const { return { }; } }; struct Max { Max isolatedCopy() const { return { }; } }; struct Invalid { Invalid isolatedCopy() const { return { }; } }; - using ValueVariant = Variant, String, double, Date, ThreadSafeDataBuffer, Min, Max>; enum IsolatedCopyTag { IsolatedCopy }; + using ValueVariant = Variant, String, double, Date, ThreadSafeDataBuffer, Min, Max>; IDBKeyData() = default; IDBKeyData(ValueVariant&& value) @@ -97,13 +97,13 @@ WEBCORE_EXPORT String loggingString() const; bool isNull() const { return std::holds_alternative(m_value); } - bool isValid() const; + WEBCORE_EXPORT bool isValid() const; WEBCORE_EXPORT static bool isValidValue(const ValueVariant&); - IndexedDB::KeyType type() const; + WEBCORE_EXPORT IndexedDB::KeyType type() const; WEBCORE_EXPORT friend std::weak_ordering operator<=>(const IDBKeyData&, const IDBKeyData&); - bool operator==(const IDBKeyData& other) const; + WEBCORE_EXPORT bool operator==(const IDBKeyData& other) const; String string() const { @@ -130,9 +130,9 @@ return std::get>(m_value); } - size_t size() const; + const ValueVariant& value() const { return m_value; } - const ValueVariant& value() const { return m_value; }; + size_t size() const;; private: friend struct IDBKeyDataHashTraits; @@ -152,10 +152,12 @@ case IndexedDB::KeyType::Min: break; case IndexedDB::KeyType::Number: - add(hasher, keyData.number()); + // Normalize negative 0. + add(hasher, keyData.number() + 0.0); break; case IndexedDB::KeyType::Date: - add(hasher, keyData.date()); + // Normalize negative 0. + add(hasher, keyData.date() + 0.0); break; case IndexedDB::KeyType::String: add(hasher, keyData.string()); diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h 2026-02-23 14:40:54.701304700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h 2026-07-09 07:12:41.896800800 +0000 @@ -159,7 +159,7 @@ typedef void (IDBConnectionToServer::*ResultFunction)(const IDBResultData&); void callResultFunctionWithErrorLater(ResultFunction, const IDBResourceIdentifier& requestIdentifier); - Ref protectedDelegate() const { return m_delegate.get(); } + Ref protectedDelegate() const { return m_delegate; } WeakRef m_delegate; bool m_serverConnectionIsValid { true }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.h webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.h 2026-02-23 14:40:54.703304800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.h 2026-07-09 07:12:41.900800700 +0000 @@ -48,7 +48,7 @@ public: WEBCORE_EXPORT static Ref create(IDBConnectionToClientDelegate&); - IDBConnectionIdentifier identifier() const; + WEBCORE_EXPORT IDBConnectionIdentifier identifier() const; void didDeleteDatabase(const IDBResultData&); void didOpenDatabase(const IDBResultData&); diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/server/MemoryIndex.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/MemoryIndex.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/server/MemoryIndex.cpp 2026-04-08 06:56:39.178426700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/MemoryIndex.cpp 2026-07-09 07:12:41.900800700 +0000 @@ -359,6 +359,8 @@ if (m_writeTransaction != &transaction) return; + notifyCursorsOfAllRecordsChanged(); + auto transactionModifiedRecords = std::exchange(m_transactionModifiedRecords, { }); for (auto& [key, valueKeys] : transactionModifiedRecords) { removeIndexRecord(key); diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/server/MemoryIndexCursor.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/MemoryIndexCursor.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/server/MemoryIndexCursor.cpp 2026-02-23 14:40:54.705304600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/MemoryIndexCursor.cpp 2026-07-09 07:12:41.900800700 +0000 @@ -220,7 +220,12 @@ void MemoryIndexCursor::indexValueChanged(const IDBKeyData& key, const IDBKeyData& primaryKey) { - if (m_currentKey != key || m_currentPrimaryKey != primaryKey) + // For Prev/Prevunique cursors, m_currentIterator wraps std::set reverse_iterators + // whose stored base() points one element past the logical position. Erasing that + // adjacent element leaves base() dangling even though m_currentKey/m_currentPrimaryKey + // are unchanged, so for reverse cursors we must invalidate on any index mutation + // and let iterate() re-seek via reverseFind(). + if (info().isDirectionForward() && (m_currentKey != key || m_currentPrimaryKey != primaryKey)) return; m_currentIterator.invalidate(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp 2026-02-23 14:40:54.707304700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp 2026-07-09 07:12:41.900800700 +0000 @@ -738,7 +738,7 @@ CheckedPtr manager = m_manager.get(); if (!manager) - transaction.didCreateIndexAsync(IDBError { ExceptionCode::InvalidStateError }); + return transaction.didCreateIndexAsync(IDBError { ExceptionCode::InvalidStateError }); auto taskSize = defaultWriteOperationCost + estimateSize(indexInfo); manager->requestSpace(m_identifier.origin(), taskSize, [weakThis = WeakPtr { *this }, weakTransaction = WeakPtr { transaction }, indexInfo](bool granted) mutable { @@ -1367,6 +1367,11 @@ handleTransactions(); } +bool UniqueIDBDatabase::isVersionChangeTransactionActive(const UniqueIDBDatabaseConnection& connection) const +{ + return m_versionChangeDatabaseConnection == &connection && m_versionChangeTransaction; +} + void UniqueIDBDatabase::connectionClosedFromServer(UniqueIDBDatabaseConnection& connection) { ASSERT(!isMainThread()); @@ -1666,5 +1671,13 @@ backingStore->handleLowMemoryWarning(); } +bool UniqueIDBDatabase::isVersionChangeTransactionFinishingOrFinished(const IDBResourceIdentifier& transactionIdentifier) const +{ + if (!m_versionChangeTransaction || m_versionChangeTransaction->info().identifier() != transactionIdentifier) + return true; + + return m_versionChangeTransaction->isFinishingOrFinished(); +} + } // namespace IDBServer } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h 2026-02-23 14:40:54.707304700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h 2026-07-09 07:12:41.900800700 +0000 @@ -93,6 +93,7 @@ Pass, Fail }; + enum class DidCreateIndexInBackingStore : bool { No, Yes }; void createObjectStore(UniqueIDBDatabaseTransaction&, const IDBObjectStoreInfo&, ErrorCallback&&, SpaceCheckResult = SpaceCheckResult::Unknown); void deleteObjectStore(UniqueIDBDatabaseTransaction&, const String& objectStoreName, ErrorCallback&&, SpaceCheckResult = SpaceCheckResult::Unknown); void renameObjectStore(UniqueIDBDatabaseTransaction&, IDBObjectStoreIdentifier, const String& newName, ErrorCallback&&, SpaceCheckResult = SpaceCheckResult::Unknown); @@ -114,6 +115,7 @@ void didFinishHandlingVersionChange(UniqueIDBDatabaseConnection&, const IDBResourceIdentifier& transactionIdentifier); void connectionClosedFromClient(UniqueIDBDatabaseConnection&); + WEBCORE_EXPORT bool isVersionChangeTransactionActive(const UniqueIDBDatabaseConnection&) const; void didFireVersionChangeEvent(UniqueIDBDatabaseConnection&, const IDBResourceIdentifier& requestIdentifier, IndexedDB::ConnectionClosedOnBehalfOfServer); WEBCORE_EXPORT void openDBRequestCancelled(const IDBResourceIdentifier& requestIdentifier); @@ -131,6 +133,8 @@ WEBCORE_EXPORT bool hasDataInMemory() const; WEBCORE_EXPORT void handleLowMemoryWarning(); + WEBCORE_EXPORT bool isVersionChangeTransactionFinishingOrFinished(const IDBResourceIdentifier& transactionIdentifier) const; + private: void handleDatabaseOperations(); void handleCurrentOperation(); @@ -160,7 +164,6 @@ void clearStalePendingOpenDBRequests(); void clearTransactionsOnConnection(UniqueIDBDatabaseConnection&); void createIndexAsyncAfterQuotaCheck(UniqueIDBDatabaseTransaction&, const IDBIndexInfo&, SpaceCheckResult); - enum class DidCreateIndexInBackingStore : bool { No, Yes }; void didCreateIndexAsyncForTransaction(UniqueIDBDatabaseTransaction&, const IDBIndexInfo&, const IDBError&, DidCreateIndexInBackingStore = DidCreateIndexInBackingStore::Yes); CheckedPtr checkedBackingStore() const; diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h 2026-02-23 14:40:54.707304700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h 2026-07-09 07:12:41.900800700 +0000 @@ -52,10 +52,10 @@ WEBCORE_EXPORT ~UniqueIDBDatabaseConnection(); const IDBResourceIdentifier& openRequestIdentifier() { return m_openRequestIdentifier; } + IDBConnectionToClient& connectionToClient() { return m_connectionToClient; } UniqueIDBDatabase* database() { return m_database.get(); } - CheckedPtr checkedDatabase(); + WEBCORE_EXPORT CheckedPtr checkedDatabase(); UniqueIDBDatabaseManager* manager(); - IDBConnectionToClient& connectionToClient() { return m_connectionToClient; } Ref protectedConnectionToClient(); WEBCORE_EXPORT void connectionPendingCloseFromClient(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp 2026-02-23 14:40:54.708304600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp 2026-07-09 07:12:41.900800700 +0000 @@ -84,7 +84,8 @@ void UniqueIDBDatabaseTransaction::abort() { LOG(IndexedDB, "UniqueIDBDatabaseTransaction::abort"); - + + setIsFinishingOrFinished(); CheckedPtr database = this->database(); if (!database) return; @@ -104,6 +105,7 @@ { LOG(IndexedDB, "UniqueIDBDatabaseTransaction::abortWithoutCallback"); + setIsFinishingOrFinished(); if (RefPtr databaseConnection = m_databaseConnection.get()) databaseConnection->abortTransactionWithoutCallback(*this); } @@ -145,6 +147,7 @@ { LOG(IndexedDB, "UniqueIDBDatabaseTransaction::commit"); + setIsFinishingOrFinished(); CheckedPtr database = this->database(); if (!database) return; diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h 2026-02-23 14:40:54.708304600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h 2026-07-09 07:12:41.900800700 +0000 @@ -62,7 +62,7 @@ WEBCORE_EXPORT ~UniqueIDBDatabaseTransaction(); - UniqueIDBDatabaseConnection* databaseConnection() const; + WEBCORE_EXPORT UniqueIDBDatabaseConnection* databaseConnection() const; UniqueIDBDatabase* database() const; CheckedPtr checkedDatabase() const; const IDBTransactionInfo& info() const { return m_transactionInfo; } @@ -104,8 +104,11 @@ bool generateIndexKeyForRecord(const IDBIndexInfo&, const std::optional&, const IDBKeyData&, const IDBValue&, std::optional recordID); WEBCORE_EXPORT void didGenerateIndexKeyForRecord(IDBResourceIdentifier createIndexRequestIdentifier, const IDBIndexInfo&, const IDBKeyData&, const IndexKey&, std::optional recordID); + bool isFinishingOrFinished() const { return m_isFinishingOrFinished; } + private: UniqueIDBDatabaseTransaction(UniqueIDBDatabaseConnection&, const IDBTransactionInfo&); + void setIsFinishingOrFinished() { m_isFinishingOrFinished = true; } WeakPtr m_databaseConnection; IDBTransactionInfo m_transactionInfo; @@ -119,6 +122,7 @@ uint64_t m_pendingGenerateIndexKeyRequests { 0 }; IDBResourceIdentifier m_createIndexRequestIdentifier; + bool m_isFinishingOrFinished { false }; }; } // namespace IDBServer diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediarecorder/BlobEvent.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/mediarecorder/BlobEvent.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediarecorder/BlobEvent.cpp 2026-02-23 14:40:54.714304700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediarecorder/BlobEvent.cpp 2026-07-09 07:12:41.900800700 +0000 @@ -43,7 +43,7 @@ BlobEvent::BlobEvent(const AtomString& type, Init&& init, IsTrusted isTrusted) : Event(EventInterfaceType::BlobEvent, type, init, isTrusted) , m_blob(init.data.releaseNonNull()) - , m_timecode(init.timecode) + , m_timecode(init.timecode.value_or(0)) { } diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediarecorder/BlobEvent.h webkit2gtk-2.52.5/Source/WebCore/Modules/mediarecorder/BlobEvent.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediarecorder/BlobEvent.h 2026-02-23 14:40:54.714304700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediarecorder/BlobEvent.h 2026-07-09 07:12:41.900800700 +0000 @@ -37,7 +37,7 @@ public: struct Init : EventInit { RefPtr data; - double timecode; + std::optional timecode; }; static Ref create(const AtomString&, Init&&, IsTrusted = IsTrusted::No); diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediasession/MediaMetadata.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/mediasession/MediaMetadata.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediasession/MediaMetadata.cpp 2026-02-23 14:40:54.716304500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediasession/MediaMetadata.cpp 2026-07-09 07:12:41.900800700 +0000 @@ -268,14 +268,17 @@ String artworkImageSrc = artworks[index].src; - m_artworkLoader = ArtworkImageLoader::create(*document, artworkImageSrc, [this, index, artworkImageSrc, artworks = WTF::move(artworks)](Image* image) mutable { + m_artworkLoader = ArtworkImageLoader::create(*document, artworkImageSrc, [weakThis = WeakPtr { *this }, index, artworkImageSrc, artworks = WTF::move(artworks)](Image* image) mutable { + RefPtr strongThis = weakThis; + if (!strongThis) + return; if (image && image->data() && image->width() && image->height()) { IntSize size { int(image->width()), int(image->height()) }; float imageScore = imageDimensionsScore(size.width(), size.height(), s_minimumSize, s_idealSize); - if (!index || (m_artworkImage && (imageDimensionsScore(m_artworkImage->width(), m_artworkImage->height(), s_minimumSize, s_idealSize) < imageScore))) { - m_artworkImageSrc = artworkImageSrc; - setArtworkImage(image); - metadataUpdated(); + if (!index || (strongThis->m_artworkImage && (imageDimensionsScore(strongThis->m_artworkImage->width(), strongThis->m_artworkImage->height(), s_minimumSize, s_idealSize) < imageScore))) { + strongThis->m_artworkImageSrc = artworkImageSrc; + strongThis->setArtworkImage(image); + strongThis->metadataUpdated(); } // If selection from `sizes` attribute yielded a valid image, or we have downloaded an image bigger than the ideal size we stop. if (artworks[index].score >= 0 || size.maxDimension() >= s_idealSize) @@ -283,7 +286,7 @@ } if (++index < artworks.size()) - tryNextArtworkImage(index, WTF::move(artworks)); + strongThis->tryNextArtworkImage(index, WTF::move(artworks)); }); m_artworkLoader->requestImageResource(); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediasession/MediaMetadata.h webkit2gtk-2.52.5/Source/WebCore/Modules/mediasession/MediaMetadata.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediasession/MediaMetadata.h 2026-02-23 14:40:54.716304500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediasession/MediaMetadata.h 2026-07-09 07:12:41.900800700 +0000 @@ -75,7 +75,7 @@ CachedResourceHandle m_cachedImage; }; -class MediaMetadata final : public RefCounted { +class MediaMetadata final : public RefCountedAndCanMakeWeakPtr { public: static ExceptionOr> create(ScriptExecutionContext&, std::optional&&); static Ref create(MediaSession&, Vector&&); diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediasource/MediaSource.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/mediasource/MediaSource.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediasource/MediaSource.cpp 2026-02-23 14:40:54.718304600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediasource/MediaSource.cpp 2026-07-09 07:12:41.900800700 +0000 @@ -1188,7 +1188,7 @@ } MediaPlayer::SupportsType supported; - callOnMainThreadAndWait([&] { + callOnMainThreadAndWait([&supported, parameters = crossThreadCopy(WTF::move(parameters))] { supported = MediaPlayer::supportsType(parameters); }); diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/RTCEncodedStreamProducer.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/RTCEncodedStreamProducer.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/RTCEncodedStreamProducer.cpp 2026-02-23 14:40:54.730304500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/RTCEncodedStreamProducer.cpp 2026-07-09 07:12:41.904800700 +0000 @@ -34,6 +34,7 @@ #include "JSRTCEncodedAudioFrame.h" #include "JSRTCEncodedVideoFrame.h" #include "Logging.h" +#include "RTCRtpScriptTransformer.h" #include "ReadableStreamSource.h" #include "ScriptExecutionContextInlines.h" #include "Settings.h" @@ -90,7 +91,7 @@ return { }; } -void RTCEncodedStreamProducer::start(Ref&& transformBackend, bool isVideo) +void RTCEncodedStreamProducer::start(Ref&& transformBackend, bool isVideo, RTCRtpScriptTransformer* transformer) { transformBackend->setTransformableFrameCallback([weakThis = WeakPtr { *this }, contextIdentifer = m_contextIdentifier](Ref&& frame) mutable { ScriptExecutionContext::postTaskTo(contextIdentifer, [weakThis, frame = WTF::move(frame)](auto&) mutable { @@ -100,6 +101,8 @@ }); m_transformBackend = WTF::move(transformBackend); m_isVideo = isVideo; + m_hasTransformer = !!transformer; + m_transformer = transformer; } void RTCEncodedStreamProducer::enqueueFrame(Ref&& frame) @@ -132,6 +135,7 @@ } #endif + frame->setTransformer(m_transformer); auto value = m_isVideo ? toJS(globalObject, globalObject, RTCEncodedVideoFrame::create(WTF::move(frame))) : toJS(globalObject, globalObject, RTCEncodedAudioFrame::create(WTF::move(frame))); m_readableSource->enqueue(value); @@ -154,13 +158,18 @@ if (frameConversionResult.hasException(scope)) [[unlikely]] return Exception { ExceptionCode::ExistingExceptionError }; + bool isVideo = false; auto frame = frameConversionResult.releaseReturnValue(); auto rtcFrame = WTF::switchOn(frame, [&](RefPtr& value) { return value->rtcFrame(vm); }, [&](RefPtr& value) { + isVideo = true; return value->rtcFrame(vm); }); + if (m_isVideo != isVideo || (m_hasTransformer && !rtcFrame->isFromTransformer(m_transformer.get()))) + return { }; + // If no data, skip the frame since there is nothing to packetize or decode. if (rtcFrame->data().data()) transformBackend->processTransformedFrame(rtcFrame.get()); diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/RTCEncodedStreamProducer.h webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/RTCEncodedStreamProducer.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/RTCEncodedStreamProducer.h 2026-02-23 14:40:54.730304500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/RTCEncodedStreamProducer.h 2026-07-09 07:12:41.904800700 +0000 @@ -38,6 +38,7 @@ class FrameRateMonitor; class JSDOMGlobalObject; +class RTCRtpScriptTransformer; class RTCRtpTransformBackend; class RTCRtpTransformableFrame; class ScriptExecutionContext; @@ -53,7 +54,7 @@ static ExceptionOr> create(ScriptExecutionContext&); ~RTCEncodedStreamProducer(); - void start(Ref&&, bool isVideo); + void start(Ref&&, bool isVideo, RTCRtpScriptTransformer* = nullptr); void clear(bool shouldClearCallback); void generateKeyFrame(ScriptExecutionContext&, const String&, Ref&&); @@ -82,6 +83,8 @@ RefPtr m_transformBackend; Vector> m_pendingKeyFramePromises; bool m_isVideo { false }; + bool m_hasTransformer { false }; + WeakPtr m_transformer; #if !RELEASE_LOG_DISABLED bool m_enableAdditionalLogging { false }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/RTCRtpScriptTransformer.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/RTCRtpScriptTransformer.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/RTCRtpScriptTransformer.cpp 2026-02-23 14:40:54.737304400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/RTCRtpScriptTransformer.cpp 2026-07-09 07:12:41.904800700 +0000 @@ -82,7 +82,7 @@ void RTCRtpScriptTransformer::start(Ref&& backend) { m_isSender = backend->side() == RTCRtpTransformBackend::Side::Sender; - m_streamProducer->start(WTF::move(backend), backend->mediaType() == RTCRtpTransformBackend::MediaType::Video); + m_streamProducer->start(WTF::move(backend), backend->mediaType() == RTCRtpTransformBackend::MediaType::Video, this); } void RTCRtpScriptTransformer::clear(ClearCallback clearCallback) diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp 2026-02-23 14:40:54.738304600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp 2026-07-09 07:12:41.904800700 +0000 @@ -132,6 +132,10 @@ if (!m_backend) return { }; + RefPtr connection = m_connection; + if (!connection || connection->isClosed()) + return { }; + RELEASE_LOG_INFO(WebRTC, "RTCRtpTransceiver::setCodecPreferences"); return m_backend->setCodecPreferences(codecs); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/RTCRtpTransformableFrame.h webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/RTCRtpTransformableFrame.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/RTCRtpTransformableFrame.h 2026-02-23 14:40:54.739304500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/RTCRtpTransformableFrame.h 2026-07-09 07:12:41.904800700 +0000 @@ -76,8 +76,8 @@ virtual void setOptions(const RTCEncodedAudioFrameMetadata&) = 0; virtual void setOptions(const RTCEncodedVideoFrameMetadata&) = 0; - void setTransformer(RTCRtpScriptTransformer&); - bool isFromTransformer(RTCRtpScriptTransformer& transformer) const { return &transformer == m_transformer.get(); } + void setTransformer(WeakPtr); + bool isFromTransformer(RTCRtpScriptTransformer* transformer) const { return transformer == m_transformer.get(); } virtual bool isLibWebRTCRtpTransformableFrame() const { return false; } @@ -85,10 +85,10 @@ WeakPtr m_transformer; }; -inline void RTCRtpTransformableFrame::setTransformer(RTCRtpScriptTransformer& transformer) +inline void RTCRtpTransformableFrame::setTransformer(WeakPtr transformer) { ASSERT(!m_transformer); - m_transformer = transformer; + m_transformer = WTF::move(transformer); }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceAgent.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceAgent.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceAgent.cpp 2026-03-20 08:14:20.374288000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceAgent.cpp 2026-07-09 07:12:41.904800700 +0000 @@ -28,7 +28,6 @@ #include "GStreamerWebRTCUtils.h" #include "GUniquePtrRice.h" #include "RiceGioBackend.h" -#include "RiceUtilities.h" #include "ScriptExecutionContext.h" #include "SharedMemory.h" #include "SocketProvider.h" @@ -66,6 +65,12 @@ using StreamHashMap = HashMap, WTF::IntHash, WTF::UnsignedWithZeroKeyHashTraits>; +enum class AgentState : uint8_t { + Open, + Closing, + Closed +}; + typedef struct _WebKitGstIceAgentPrivate { ~_WebKitGstIceAgentPrivate() { @@ -84,12 +89,14 @@ RefPtr socketProvider; GRefPtr agent; - StreamHashMap streams; + Lock streamsLock; + StreamHashMap streams WTF_GUARDED_BY_LOCK(streamsLock); RefPtr runLoop; - Atomic agentIsClosed; - GRefPtr closePromise; + Lock stateLock; + AgentState state WTF_GUARDED_BY_LOCK(stateLock) { AgentState::Open }; + GRefPtr closePromise WTF_GUARDED_BY_LOCK(stateLock); GstWebRTCICEOnCandidateFunc onCandidate; gpointer onCandidateData; @@ -101,7 +108,11 @@ String turnServer; HashSet turnServers; +#if RICE_CHECK_VERSION(0, 4, 0) + Vector> turnConfigs; +#else Vector> turnConfigs; +#endif GRefPtr recvSource; bool forceRelay { false }; @@ -262,11 +273,22 @@ for (unsigned i = 0; i < nRelay; i++) { // FIXME: Hardcoding UDP as allocation transport type for now. Our TURN support needs further work anyway. // https://bugs.webkit.org/show_bug.cgi?id=310005 +#if RICE_CHECK_VERSION(0, 4, 0) + GUniquePtr config(rice_turn_config_new(relays[i], riceAddress.get(), credentials.get())); + rice_turn_config_add_address_family(config.get(), family); + rice_turn_config_set_allocation_transport(config.get(), RICE_TRANSPORT_TYPE_UDP); + rice_turn_config_set_anonymous_username(config.get(), RICE_FEATURE_REQUIRED); + rice_turn_config_add_supported_integrity(config.get(), RICE_INTEGRITY_ALGORITHM_SHA1); + rice_turn_config_add_supported_integrity(config.get(), RICE_INTEGRITY_ALGORITHM_SHA256); + if (tlsConfig) + rice_turn_config_set_tls_config(config.get(), tlsConfig.get()); +#else auto config = adoptGRef(rice_turn_config_new(relays[i], riceAddress.get(), credentials.get(), #if RICE_CHECK_VERSION(0, 3, 0) RICE_TRANSPORT_TYPE_UDP, #endif 1, &family, tlsConfig.get())); +#endif // RICE_CHECK_VERSION(0, 4, 0) agent->priv->turnConfigs.append(WTF::move(config)); } } @@ -374,6 +396,7 @@ if (!backend->priv->iceBackend) return nullptr; + Locker locker { backend->priv->streamsLock }; if (backend->priv->streams.contains(sessionId)) { GST_ERROR_OBJECT(ice, "Stream already added for session %u", sessionId); return nullptr; @@ -382,6 +405,7 @@ auto riceStream = adoptGRef(rice_agent_add_stream(backend->priv->agent.get())); auto streamId = static_cast(rice_stream_get_id(riceStream.get())); [[maybe_unused]] auto component = adoptGRef(rice_stream_add_component(riceStream.get())); + GST_DEBUG_OBJECT(ice, "Component %zu added for stream %u", rice_component_get_id(component.get()), streamId); auto stream = adoptGRef(GST_WEBRTC_ICE_STREAM(webkitGstWebRTCCreateIceStream(backend, WTF::move(riceStream)))); backend->priv->streams.add(sessionId, WTF::makeUnique(streamId, WTF::move(stream))); @@ -614,39 +638,72 @@ void webkitGstWebRTCIceAgentClosed(WebKitGstIceAgent* agent) { - agent->priv->agentIsClosed.exchange(true); - agent->priv->streams.clear(); + GST_DEBUG_OBJECT(agent, "Agent successfully closed"); + auto priv = agent->priv; + + Locker locker { priv->stateLock }; + priv->state = AgentState::Closed; + + { + Locker locker { priv->streamsLock }; + priv->streams.clear(); + } - if (!agent->priv->closePromise) + if (!priv->closePromise) return; - gst_promise_reply(agent->priv->closePromise.get(), nullptr); - agent->priv->closePromise.clear(); + gst_promise_reply(priv->closePromise.get(), nullptr); + priv->closePromise.clear(); } -#if GST_CHECK_VERSION(1, 27, 0) +static bool webkitGstWebRTCIceAgentIsClosed(WebKitGstIceAgent* agent) +{ + Locker locker { agent->priv->stateLock }; + return agent->priv->state == AgentState::Closed; +} + +#if GST_CHECK_VERSION(1, 28, 0) static void webkitGstWebRTCIceAgentClose(GstWebRTCICE* ice, GstPromise* promise) { auto backend = WEBKIT_GST_WEBRTC_ICE_BACKEND(ice); - auto isClosed = backend->priv->agentIsClosed.load(); - if (isClosed) - return; + { + Locker locker { backend->priv->stateLock }; - bool shouldWait = promise == nullptr; - backend->priv->closePromise = promise; - auto now = WTF::MonotonicTime::now().secondsSinceEpoch(); - rice_agent_close(backend->priv->agent.get(), now.nanoseconds()); - webkitGstWebRTCIceAgentWakeup(backend); + GST_DEBUG_OBJECT(ice, "Attempting to close connection"); + if (backend->priv->state >= AgentState::Closing) { + GST_DEBUG_OBJECT(ice, "Agent %s, no need to close again", backend->priv->state == AgentState::Closed ? "was closed" : "is closing"); + return; + } - isClosed = backend->priv->agentIsClosed.load(); - if (!shouldWait || isClosed) - return; + backend->priv->closePromise = promise; + backend->priv->state = AgentState::Closing; + auto now = WTF::MonotonicTime::now().secondsSinceEpoch(); + rice_agent_close(backend->priv->agent.get(), now.nanoseconds()); + } + + { + Locker locker { backend->priv->stateLock }; - while (!isClosed) { + bool shouldWait = promise == nullptr; + auto isClosed = backend->priv->state == AgentState::Closed; + if (!shouldWait || isClosed) { + GST_DEBUG_OBJECT(ice, "No need to wait close procedure completion"); + backend->priv->state = AgentState::Closed; + return; + } + } + + GST_DEBUG_OBJECT(ice, "Waiting close procedure completion"); + webkitGstWebRTCIceAgentWakeup(backend); + + auto timeout = WTF::MonotonicTime::now().secondsSinceEpoch() + 2_s; + while (WTF::MonotonicTime::now().secondsSinceEpoch() < timeout) { + if (webkitGstWebRTCIceAgentIsClosed(backend)) + return; g_main_context_iteration(backend->priv->runLoop->mainContext(), FALSE); - isClosed = backend->priv->agentIsClosed.load(); } + GST_DEBUG_OBJECT(ice, "Agent failed to properly close connections"); } #endif @@ -657,8 +714,6 @@ auto backend = WEBKIT_GST_WEBRTC_ICE_BACKEND(object); auto priv = backend->priv; - priv->agentIsClosed.exchange(false); - static Atomic counter = 0; auto id = counter.load(); auto threadName = makeString("webrtc-rice-"_s, id); @@ -674,13 +729,16 @@ priv->agent = adoptGRef(rice_agent_new(true, true)); } -static void findStreamAndApply(const StreamHashMap& streams, unsigned streamId, Function callback) +static void findStreamAndApply(WebKitGstIceAgent* agent, unsigned streamId, Function callback) { - for (auto& riceStream : streams.values()) { + Locker locker { agent->priv->streamsLock }; + for (auto& riceStream : agent->priv->streams.values()) { if (riceStream->riceStreamId != streamId) continue; - callback(WEBKIT_GST_WEBRTC_ICE_STREAM(riceStream->stream.get())); + GRefPtr stream = riceStream->stream; + locker.unlockEarly(); + callback(WEBKIT_GST_WEBRTC_ICE_STREAM(stream.get())); return; } } @@ -699,7 +757,9 @@ auto self = weakThis.get(); if (!self) return; - findStreamAndApply(self->priv->streams, streamId, [protocol, from = WTF::move(from), to = WTF::move(to), data = WTF::move(data)](const auto* stream) mutable { + if (webkitGstWebRTCIceAgentIsClosed(self.get())) + return; + findStreamAndApply(self.get(), streamId, [protocol, from = WTF::move(from), to = WTF::move(to), data = WTF::move(data)](const auto* stream) mutable { webkitGstWebRTCIceStreamHandleIncomingData(stream, protocol, WTF::move(from), WTF::move(to), WTF::move(data)); }); }); @@ -762,6 +822,14 @@ return agent->priv->agent; } +#if RICE_CHECK_VERSION(0, 4, 0) +Vector> webkitGstWebRTCIceAgentGetTurnConfigs(WebKitGstIceAgent* agent) +{ + return agent->priv->turnConfigs.map([](const auto& config) { + return GUniquePtr(rice_turn_config_copy(config.get())); + }); +} +#else Vector> webkitGstWebRTCIceAgentGetTurnConfigs(WebKitGstIceAgent* agent) { Vector> result; @@ -771,6 +839,7 @@ return result; } +#endif // RICE_CHECK_VERSION(0, 4, 0) HashMap, String> webkitGstWebRTCIceAgentGatherSocketAddresses(WebKitGstIceAgent* agent, unsigned streamId) { @@ -816,38 +885,53 @@ void webkitGstWebRTCIceAgentGatheringDoneForStream(WebKitGstIceAgent* agent, unsigned streamId) { - findStreamAndApply(agent->priv->streams, streamId, [](const auto* stream) { + findStreamAndApply(agent, streamId, [](const auto* stream) { webkitGstWebRTCIceStreamGatheringDone(stream); }); } void webkitGstWebRTCIceAgentLocalCandidateGatheredForStream(WebKitGstIceAgent* agent, unsigned streamId, RiceAgentGatheredCandidate& candidate) { - findStreamAndApply(agent->priv->streams, streamId, [&](const auto* stream) { + auto priv = agent->priv; + { + Locker locker { priv->stateLock }; + + if (priv->state >= AgentState::Closing) { + GST_DEBUG_OBJECT(agent, "Agent %s, no need to notify gathered candidate anymore", priv->state == AgentState::Closed ? "was closed" : "is closing"); + return; + } + } + + findStreamAndApply(agent, streamId, [&](const auto* stream) { + Locker locker { priv->stateLock }; + if (priv->state >= AgentState::Closing) { + GST_DEBUG_OBJECT(agent, "Agent %s, no need to notify gathered candidate anymore", priv->state == AgentState::Closed ? "was closed" : "is closing"); + return; + } auto sdp = GMallocString::unsafeAdoptFromUTF8(rice_candidate_to_sdp_string(&candidate.gathered.candidate)); - if (agent->priv->forceRelay && candidate.gathered.candidate.candidate_type != RICE_CANDIDATE_TYPE_RELAYED) { + if (priv->forceRelay && candidate.gathered.candidate.candidate_type != RICE_CANDIDATE_TYPE_RELAYED) { GST_DEBUG_OBJECT(agent, "Ignoring non-relay ICE candidate %s", sdp.utf8()); return; } ASSERT(startsWith(sdp.span(), "a="_s)); String strippedSdp(sdp.span().subspan(2)); - agent->priv->onCandidate(GST_WEBRTC_ICE(agent), streamId, strippedSdp.utf8().data(), agent->priv->onCandidateData); + priv->onCandidate(GST_WEBRTC_ICE(agent), streamId, strippedSdp.utf8().data(), priv->onCandidateData); webkitGstWebRTCIceStreamAddLocalGatheredCandidate(stream, candidate.gathered); }); } void webkitGstWebRTCIceAgentNewSelectedPairForStream(WebKitGstIceAgent* agent, unsigned streamId, RiceAgentSelectedPair& selectedPair) { - findStreamAndApply(agent->priv->streams, streamId, [&](const auto* stream) { + findStreamAndApply(agent, streamId, [&](const auto* stream) { webkitGstWebRTCIceStreamNewSelectedPair(stream, selectedPair); }); } void webkitGstWebRTCIceAgentComponentStateChangedForStream(WebKitGstIceAgent* agent, unsigned streamId, RiceAgentComponentStateChange& change) { - findStreamAndApply(agent->priv->streams, streamId, [&](const auto* stream) { + findStreamAndApply(agent, streamId, [&](const auto* stream) { webkitGstWebRTCIceStreamComponentStateChanged(stream, change); }); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceAgent.h webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceAgent.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceAgent.h 2026-02-23 14:40:54.742304600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceAgent.h 2026-07-09 07:12:41.904800700 +0000 @@ -27,11 +27,11 @@ #include "RTCIceComponent.h" #include "RTCIceConnectionState.h" #include "RTCIceProtocol.h" +#include "RiceUtilities.h" #include "ScriptExecutionContextIdentifier.h" #include "SharedMemory.h" #include -#include #include #include #include @@ -59,7 +59,7 @@ class ScriptExecutionContext; class SocketProvider; -class RiceBackendClient : public RefCounted { +class RiceBackendClient : public ThreadSafeRefCounted { WTF_MAKE_NONCOPYABLE(RiceBackendClient); public: static Ref create() { return adoptRef(*new RiceBackendClient); } @@ -104,7 +104,12 @@ const GRefPtr& webkitGstWebRTCIceAgentGetRiceAgent(WebKitGstIceAgent*); +#if RICE_CHECK_VERSION(0, 4, 0) +Vector> webkitGstWebRTCIceAgentGetTurnConfigs(WebKitGstIceAgent*); +#else Vector> webkitGstWebRTCIceAgentGetTurnConfigs(WebKitGstIceAgent*); +#endif + HashMap, String> webkitGstWebRTCIceAgentGatherSocketAddresses(WebKitGstIceAgent*, unsigned); GstWebRTCICETransport *webkitGstWebRTCIceAgentCreateTransport(WebKitGstIceAgent*, GThreadSafeWeakPtr&&, WebCore::RTCIceComponent); diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceStream.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceStream.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceStream.cpp 2026-02-23 14:40:54.742304600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceStream.cpp 2026-07-09 07:12:41.904800700 +0000 @@ -104,6 +104,7 @@ void webkitGstWebRTCIceStreamAddLocalGatheredCandidate(const WebKitGstIceStream* ice, RiceGatheredCandidate& candidate) { auto stream = WEBKIT_GST_WEBRTC_ICE_STREAM(ice); + GST_DEBUG_OBJECT(ice, "Local candidate gathered for stream %u on component %zu", stream->priv->streamId, candidate.candidate.component_id); rice_stream_add_local_gathered_candidate(stream->priv->riceStream.get(), &candidate); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceTransport.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceTransport.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceTransport.cpp 2026-02-23 14:40:54.743304500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerIceTransport.cpp 2026-07-09 07:12:41.904800700 +0000 @@ -26,7 +26,6 @@ #include "GStreamerCommon.h" #include "GStreamerIceStream.h" #include "GUniquePtrRice.h" -#include "RiceUtilities.h" #include #include #include diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/gstreamer/GStreamerMediaEndpoint.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerMediaEndpoint.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/gstreamer/GStreamerMediaEndpoint.cpp 2026-02-27 22:37:23.771724700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerMediaEndpoint.cpp 2026-07-09 07:12:41.904800700 +0000 @@ -701,13 +701,16 @@ GST_DEBUG_OBJECT(m_pipeline.get(), "Looking-up outgoing source with msid %s in %zu unlinked sources", msid.utf8(), m_unlinkedOutgoingSources.size()); m_unlinkedOutgoingSources.removeFirstMatching([&, msid = String(msid.span())](auto& source) -> bool { - if (source->type() != sourceType) + if (source->type() != sourceType) { + GST_DEBUG_OBJECT(pipeline(), "Un-matched source type"); return false; - + } if (const auto& track = source->track()) { auto sourceMsid = makeString(source->mediaStreamID(), ' ', track->id()); - if (!msid.isEmpty() && sourceMsid != msid) + if (!msid.isEmpty() && sourceMsid != msid) { + GST_DEBUG_OBJECT(pipeline(), "Un-matched outgoing source msid: %s", sourceMsid.utf8().data()); return false; + } } auto allowedCaps = capsFromSDPMedia(media); @@ -2271,6 +2274,57 @@ }); } +void GStreamerMediaEndpoint::trackWasReplaced(const String& previousId, const String& newId) +{ + struct TrackIds { + String previousId; + String newId; + bool wasTrackFound; + }; + + TrackIds ids { previousId, newId, false }; + forEachTransceiver(m_webrtcBin, [&](auto&& transceiver) -> bool { + GRefPtr caps; + g_object_get(transceiver.get(), "codec-preferences", &caps.outPtr(), nullptr); + + if (!caps) + return false; + + auto newCaps = adoptGRef(gst_caps_make_writable(caps.leakRef())); + gst_caps_map_in_place(newCaps.get(), [](auto*, auto* structure, gpointer userData) -> gboolean { + auto msid = gstStructureGetString(structure, "a-msid"_s); + if (msid.isEmpty()) + return TRUE; + + String msidString = msid.span(); + auto parts = msidString.split(' '); + if (parts.size() != 2) + return TRUE; + + auto ids = static_cast(userData); + if (parts[1] != ids->previousId) + return TRUE; + + ids->wasTrackFound = true; + if (ids->newId.isEmpty()) + gst_structure_remove_field(structure, "a-msid"); + else { + auto newMsid = makeString(parts[0], ' ', ids->newId); + gst_structure_set(structure, "a-msid", G_TYPE_STRING, newMsid.utf8().data(), nullptr); + } + + return TRUE; + }, &ids); + + if (ids.wasTrackFound) { + g_object_freeze_notify(G_OBJECT(transceiver.get())); + g_object_set(transceiver.get(), "codec-preferences", newCaps.get(), nullptr); + g_object_thaw_notify(G_OBJECT(transceiver.get())); + } + return ids.wasTrackFound; + }); +} + void GStreamerMediaEndpoint::onIceConnectionChange() { GstWebRTCICEConnectionState state; diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/gstreamer/GStreamerMediaEndpoint.h webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerMediaEndpoint.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/gstreamer/GStreamerMediaEndpoint.h 2026-02-23 14:40:54.744304400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerMediaEndpoint.h 2026-07-09 07:12:41.904800700 +0000 @@ -125,6 +125,8 @@ void onNegotiationNeeded(); + void trackWasReplaced(const String& previousId, const String& newId); + protected: #if !RELEASE_LOG_DISABLED void onStatsDelivered(const GstStructure*); diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/gstreamer/GStreamerPeerConnectionBackend.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerPeerConnectionBackend.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/gstreamer/GStreamerPeerConnectionBackend.cpp 2026-02-23 14:40:54.744304400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerPeerConnectionBackend.cpp 2026-07-09 07:12:41.904800700 +0000 @@ -469,6 +469,11 @@ return m_peerConnection.get(); } +void GStreamerPeerConnectionBackend::trackWasReplaced(const String& previousId, const String& newId) +{ + m_endpoint->trackWasReplaced(previousId, newId); +} + void GStreamerPeerConnectionBackend::tearDown() { for (auto& transceiver : connection().currentTransceivers()) { diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/gstreamer/GStreamerPeerConnectionBackend.h webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerPeerConnectionBackend.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/gstreamer/GStreamerPeerConnectionBackend.h 2026-02-23 14:40:54.744304400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerPeerConnectionBackend.h 2026-07-09 07:12:41.904800700 +0000 @@ -115,6 +115,8 @@ void setReconfiguring(bool isReconfiguring) { m_isReconfiguring = isReconfiguring; } bool isReconfiguring() const { return m_isReconfiguring; } + void trackWasReplaced(const String& previousId, const String& newId); + void tearDown(); Ref m_endpoint; diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/gstreamer/GStreamerRtpSenderBackend.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerRtpSenderBackend.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/gstreamer/GStreamerRtpSenderBackend.cpp 2026-02-23 14:40:54.744304400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/gstreamer/GStreamerRtpSenderBackend.cpp 2026-07-09 07:12:41.904800700 +0000 @@ -149,7 +149,7 @@ m_rtcSender = nullptr; } -bool GStreamerRtpSenderBackend::replaceTrack(RTCRtpSender&, MediaStreamTrack* track) +bool GStreamerRtpSenderBackend::replaceTrack(RTCRtpSender& sender, MediaStreamTrack* track) { GST_DEBUG_OBJECT(m_rtcSender.get(), "Replacing sender track with track %p", track); @@ -161,6 +161,7 @@ // FIXME: We might want to set the reconfiguring flag back to false once the webrtcbin sink pad // has renegotiated its caps. Perhaps a pad probe can be used for this. + auto previousTrackId = sender.trackId(); RefPtr newTrack = track; switchOn(m_source, [&](Ref& source) { source->replaceTrack(newTrack); @@ -170,6 +171,7 @@ GST_DEBUG_OBJECT(m_rtcSender.get(), "No outgoing source yet"); }); + peerConnectionBackend->trackWasReplaced(previousTrackId, newTrack ? newTrack->id() : emptyString()); return true; } @@ -179,13 +181,15 @@ m_currentParameters = source->parameters(); }, [&](const Ref& source) { m_currentParameters = source->parameters(); - }, [](const std::nullptr_t&) { + }, [&](const std::nullptr_t&) { + GST_DEBUG_OBJECT(m_rtcSender.get(), "No outgoing source yet, unable to retrieve parameters"); }); GST_DEBUG_OBJECT(m_rtcSender.get(), "Current parameters: %" GST_PTR_FORMAT, m_currentParameters.get()); - if (!m_currentParameters) + if (!m_currentParameters) { + GST_DEBUG_OBJECT(m_rtcSender.get(), "Using init data: %" GST_PTR_FORMAT, m_initData.get()); return toRTCRtpSendParameters(m_initData.get()); - + } return toRTCRtpSendParameters(m_currentParameters.get()); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h 2026-02-23 14:40:54.747304400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h 2026-07-09 07:12:41.904800700 +0000 @@ -27,6 +27,7 @@ #if ENABLE(WEB_RTC) && USE(LIBWEBRTC) #include "PeerConnectionBackend.h" +#include "RTCPeerConnection.h" #include "RealtimeMediaSource.h" #include diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp 2026-02-23 14:40:54.747304400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp 2026-07-09 07:12:41.908800400 +0000 @@ -27,7 +27,7 @@ #if ENABLE(WEB_RTC) && USE(LIBWEBRTC) -#include "Document.h" +#include "DocumentPage.h" #include "LibWebRTCAudioModule.h" #include "LibWebRTCDtlsTransportBackend.h" #include "LibWebRTCProvider.h" diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderTransformBackend.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderTransformBackend.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderTransformBackend.cpp 2026-02-23 14:40:54.748304400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderTransformBackend.cpp 2026-07-09 07:12:41.908800400 +0000 @@ -24,11 +24,12 @@ #include "config.h" #include "LibWebRTCRtpSenderTransformBackend.h" -#include #if ENABLE(WEB_RTC) && USE(LIBWEBRTC) +#include "EventTarget.h" #include "LibWebRTCRtpTransformableFrame.h" +#include namespace WebCore { diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/notifications/Notification.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/notifications/Notification.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/notifications/Notification.cpp 2026-02-23 14:40:54.756304500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/notifications/Notification.cpp 2026-07-09 07:12:41.908800400 +0000 @@ -71,6 +71,13 @@ return map; } +static Seconds s_persistentNotificationMinimumLifetime { silentPushTimeoutForProduction }; + +void Notification::setOverridePersistentNotificationMinimumLifetime(Seconds lifetime) +{ + s_persistentNotificationMinimumLifetime = lifetime; +} + static void addNotificationToMapIfNecessary(Notification& notification) { if (notification.isPersistent()) @@ -130,6 +137,8 @@ auto notification = adoptRef(*new Notification(context, data.notificationID, WTF::move(data.title), WTF::move(options), SerializedScriptValue::createFromWireBytes(WTF::move(data.data)))); notification->suspendIfNeeded(); notification->m_serviceWorkerRegistrationURL = WTF::move(data.serviceWorkerRegistrationURL); + if (data.creationTime) + notification->m_creationTime = data.creationTime; addNotificationToMapIfNecessary(notification); return notification; } @@ -175,6 +184,7 @@ , m_dataForBindings(WTF::move(dataForBindings)) , m_silent(options.silent) , m_state(Idle) + , m_creationTime(WallTime::now()) { if (context.isDocument()) m_notificationSource = NotificationSource::Document; @@ -284,6 +294,11 @@ stopResourcesLoader(); break; case Showing: + if (isPersistent() && WallTime::now() - m_creationTime < s_persistentNotificationMinimumLifetime) { + if (RefPtr context = scriptExecutionContext()) + context->addConsoleMessage(MessageSource::Security, MessageLevel::Error, "Persistent notifications cannot be closed shortly after they are shown."_s); + return; + } if (auto* client = clientFromContext()) client->cancel(data()); break; @@ -473,7 +488,7 @@ identifier(), context->identifier(), *sessionID, - MonotonicTime::now(), + m_creationTime, m_dataForBindings->wireBytes(), m_silent }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/notifications/Notification.h webkit2gtk-2.52.5/Source/WebCore/Modules/notifications/Notification.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/notifications/Notification.h 2026-02-23 14:40:54.756304500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/notifications/Notification.h 2026-07-09 07:12:41.908800400 +0000 @@ -46,6 +46,7 @@ #include #include #include +#include namespace WebCore { @@ -131,6 +132,8 @@ bool isPersistent() const { return !m_serviceWorkerRegistrationURL.isNull(); } + WEBCORE_EXPORT static void setOverridePersistentNotificationMinimumLifetime(Seconds); + WEBCORE_EXPORT static void ensureOnNotificationThread(ScriptExecutionContextIdentifier, WTF::UUID notificationIdentifier, Function&&); WEBCORE_EXPORT static void ensureOnNotificationThread(const NotificationData&, Function&&); @@ -177,6 +180,7 @@ }; NotificationSource m_notificationSource; URL m_serviceWorkerRegistrationURL; + WallTime m_creationTime; std::unique_ptr m_resourcesLoader; RefPtr m_resources; }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/notifications/NotificationData.h webkit2gtk-2.52.5/Source/WebCore/Modules/notifications/NotificationData.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/notifications/NotificationData.h 2026-02-23 14:40:54.757304400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/notifications/NotificationData.h 2026-07-09 07:12:41.908800400 +0000 @@ -28,10 +28,10 @@ #include #include #include -#include #include #include #include +#include #include OBJC_CLASS NSDictionary; @@ -40,6 +40,9 @@ enum class NotificationDirection : uint8_t; +static constexpr Seconds silentPushTimeoutForProduction { 30_s }; +static constexpr Seconds silentPushTimeoutForTesting { 1_s }; + struct NotificationData { WEBCORE_EXPORT NotificationData isolatedCopy() const &; WEBCORE_EXPORT NotificationData isolatedCopy() &&; @@ -64,7 +67,7 @@ WTF::UUID notificationID { WTF::UUID::createVersion4() }; std::optional contextIdentifier; PAL::SessionID sourceSession { PAL::SessionID::defaultSessionID() }; - MonotonicTime creationTime; + WallTime creationTime; Vector data; std::optional silent; }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/permissions/Permissions.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/permissions/Permissions.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/permissions/Permissions.cpp 2026-02-23 14:40:54.763304500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/permissions/Permissions.cpp 2026-07-09 07:12:41.908800400 +0000 @@ -53,6 +53,7 @@ #include "WorkerLoaderProxy.h" #include "WorkerThread.h" #include +#include #include #include #include @@ -61,6 +62,34 @@ WTF_MAKE_TZONE_ALLOCATED_IMPL(Permissions); +#if ENABLE(GEOLOCATION) + +static std::optional determineGeolocationPermissionState(PermissionState permissionState, const Document& document) +{ + RefPtr window = document.window(); + if (!window) + return std::nullopt; + + RefPtr geolocation = NavigatorGeolocation::optionalGeolocation(window->protectedNavigator()); + + switch (permissionState) { + case PermissionState::Granted: + return PermissionState::Granted; + case PermissionState::Denied: + if (!geolocation || !geolocation->hasBeenRequested()) + return PermissionState::Prompt; + return PermissionState::Denied; + case PermissionState::Prompt: + if (!geolocation || !geolocation->hasBeenRequested()) + return PermissionState::Prompt; + return geolocation->isAllowed() ? PermissionState::Granted : PermissionState::Denied; + }; + + return std::nullopt; +} + +#endif // ENABLE(GEOLOCATION) + Ref Permissions::create(NavigatorBase& navigator) { return adoptRef(*new Permissions(navigator)); @@ -76,7 +105,12 @@ return m_navigator.get(); } -Permissions::~Permissions() = default; +Permissions::~Permissions() +{ + auto queryPromises = std::exchange(m_queryPromises, { }); + for (auto& promise : queryPromises.values()) + promise->reject(ExceptionCode::AbortError, "Promise was rejected because the browsing context is going away"_s); +} static bool isAllowedByPermissionsPolicy(const Document& document, PermissionName name) { @@ -125,24 +159,46 @@ return std::nullopt; } -void Permissions::query(JSC::Strong permissionDescriptorValue, DOMPromiseDeferred>&& promise) +static Expected processPermissionQueryResult(std::optional permissionState, const PermissionDescriptor& permissionDescriptor, const Document& document) +{ + if (!permissionState) + return makeUnexpected(Exception { ExceptionCode::NotSupportedError, "Permissions::query does not support this API"_s }); + +#if ENABLE(GEOLOCATION) + if (permissionDescriptor.name == PermissionName::Geolocation) { + if (auto geolocationPermissionState = determineGeolocationPermissionState(*permissionState, document)) + permissionState = geolocationPermissionState; + else + return makeUnexpected(Exception { ExceptionCode::InvalidStateError, "The Document does not have a Geolocation object"_s }); + } +#endif + +#if ENABLE(MEDIA_STREAM) + if (document.quirks().shouldEnableCameraAndMicrophonePermissionStateQuirk() && (permissionDescriptor.name == PermissionName::Camera || permissionDescriptor.name == PermissionName::Microphone) && *permissionState == PermissionState::Prompt) + permissionState = PermissionState::Granted; +#endif + + return *permissionState; +} + +void Permissions::query(JSC::Strong permissionDescriptorValue, Ref&& promise) { RefPtr context = m_navigator ? m_navigator->scriptExecutionContext() : nullptr; if (!context || !context->globalObject()) { - promise.reject(Exception { ExceptionCode::InvalidStateError, "The context is invalid"_s }); + promise->reject(Exception { ExceptionCode::InvalidStateError, "The context is invalid"_s }); return; } auto source = sourceFromContext(*context); if (!source) { - promise.reject(Exception { ExceptionCode::NotSupportedError, "Permissions::query is not supported in this context"_s }); + promise->reject(Exception { ExceptionCode::NotSupportedError, "Permissions::query is not supported in this context"_s }); return; } RefPtr document = dynamicDowncast(*context); if (document && !document->isFullyActive()) { - promise.reject(Exception { ExceptionCode::InvalidStateError, "The document is not fully active"_s }); - return; + promise->reject(Exception { ExceptionCode::InvalidStateError, "The document is not fully active"_s }); + return; } auto& vm = context->globalObject()->vm(); @@ -150,7 +206,7 @@ auto permissionDescriptorConversionResult = convert>(*context->globalObject(), permissionDescriptorValue.get()); if (permissionDescriptorConversionResult.hasException(scope)) [[unlikely]] { - promise.reject(Exception { ExceptionCode::ExistingExceptionError }); + promise->reject(Exception { ExceptionCode::ExistingExceptionError }); return; } @@ -159,119 +215,71 @@ RefPtr origin = context->securityOrigin(); auto originData = origin ? origin->data() : SecurityOriginData { }; - if (document) { - WeakPtr page = document->page(); - if (!page) { - promise.reject(Exception { ExceptionCode::InvalidStateError, "The page does not exist"_s }); - return; - } + auto contextIdentifier = context->identifier(); - if (!isAllowedByPermissionsPolicy(*document, permissionDescriptor.name)) { - promise.resolve(PermissionStatus::create(*context, PermissionState::Denied, permissionDescriptor, PermissionQuerySource::Window, *page)); - return; - } + auto promiseIdentifier = PromiseIdentifier::generate(); + m_queryPromises.add(promiseIdentifier, WTF::move(promise)); - PermissionController::singleton().query(ClientOrigin { document->topOrigin().data(), WTF::move(originData) }, permissionDescriptor, *page, *source, [document = Ref { *document }, page, permissionDescriptor, promise = WTF::move(promise)](auto permissionState) mutable { - if (!permissionState) { - promise.reject(Exception { ExceptionCode::NotSupportedError, "Permissions::query does not support this API"_s }); - return; - } + auto queryPermissionOnMainThread = [originData = WTF::move(originData).isolatedCopy(), permissionDescriptor, contextIdentifier, source = *source, promiseIdentifier, weakThis = WeakPtr { *this }] (ScriptExecutionContext& mainThreadContext) mutable { + ASSERT(isMainThread()); -#if ENABLE(GEOLOCATION) - if (permissionDescriptor.name == PermissionName::Geolocation) { - if (auto geolocationPermissionState = determineGeolocationPermissionState(*permissionState, document)) - permissionState = geolocationPermissionState; - else { - promise.reject(Exception { ExceptionCode::InvalidStateError, "The Document does not have a Geolocation object"_s }); + auto& document = downcast(mainThreadContext); + if (!document.page()) { + ScriptExecutionContext::ensureOnContextThread(contextIdentifier, [weakThis = WTF::move(weakThis), promiseIdentifier](auto&) mutable { + RefPtr protectedThis = weakThis; + if (!protectedThis) return; - } - } -#endif - -#if ENABLE(MEDIA_STREAM) - if (document->quirks().shouldEnableCameraAndMicrophonePermissionStateQuirk() && (permissionDescriptor.name == PermissionName::Camera || permissionDescriptor.name == PermissionName::Microphone) && *permissionState == PermissionState::Prompt) - permissionState = PermissionState::Granted; -#endif - promise.resolve(PermissionStatus::create(document, *permissionState, permissionDescriptor, PermissionQuerySource::Window, WTF::move(page))); - }); - return; - } - - Ref workerGlobalScope = downcast(*context); - auto completionHandler = [originData = WTF::move(originData).isolatedCopy(), permissionDescriptor, contextIdentifier = workerGlobalScope->identifier(), source = *source, promise = WTF::move(promise)] (auto& context) mutable { - ASSERT(isMainThread()); + if (RefPtr promise = protectedThis->m_queryPromises.take(promiseIdentifier)) + promise->reject(Exception { ExceptionCode::InvalidStateError, "The page does not exist"_s }); + }); + return; + } - Ref document = downcast(context); - if (!document->page()) { - ScriptExecutionContext::postTaskTo(contextIdentifier, [promise = WTF::move(promise)](auto&) mutable { - promise.reject(Exception { ExceptionCode::InvalidStateError, "The page does not exist"_s }); + if (source == PermissionQuerySource::Window && !isAllowedByPermissionsPolicy(document, permissionDescriptor.name)) { + ScriptExecutionContext::ensureOnContextThread(contextIdentifier, [weakThis = WTF::move(weakThis), promiseIdentifier, permissionDescriptor, page = WeakPtr { *document.page() }](auto& context) mutable { + RefPtr protectedThis = weakThis; + if (!protectedThis) + return; + if (RefPtr promise = protectedThis->m_queryPromises.take(promiseIdentifier)) + promise->resolve>(PermissionStatus::create(context, PermissionState::Denied, permissionDescriptor, PermissionQuerySource::Window, WTF::move(page))); }); return; } - auto page = source == PermissionQuerySource::DedicatedWorker ? WeakPtr { *document->page() } : nullptr; + auto page = source == PermissionQuerySource::DedicatedWorker || source == PermissionQuerySource::Window ? WeakPtr { *document.page() } : nullptr; - PermissionController::singleton().query(ClientOrigin { document->topOrigin().data(), WTF::move(originData) }, permissionDescriptor, page, source, [contextIdentifier, permissionDescriptor, promise = WTF::move(promise), source, page, document](auto permissionState) mutable { + PermissionController::singleton().query(ClientOrigin { document.topOrigin().data(), WTF::move(originData) }, permissionDescriptor, page, source, [contextIdentifier, permissionDescriptor, weakThis = WTF::move(weakThis), promiseIdentifier, source, page, document = Ref { document }](auto permissionState) mutable { ASSERT(isMainThread()); - if (!permissionState) { - ScriptExecutionContext::postTaskTo(contextIdentifier, [promise = WTF::move(promise)](auto&) mutable { - promise.reject(Exception { ExceptionCode::NotSupportedError, "Permissions::query does not support this API"_s }); + auto result = processPermissionQueryResult(permissionState, permissionDescriptor, document); + if (!result) { + ScriptExecutionContext::ensureOnContextThread(contextIdentifier, [weakThis = WTF::move(weakThis), promiseIdentifier, exception = result.error()](auto&) mutable { + RefPtr protectedThis = weakThis; + if (!protectedThis) + return; + if (RefPtr promise = protectedThis->m_queryPromises.take(promiseIdentifier)) + promise->reject(WTF::move(exception)); }); - return; } -#if ENABLE(GEOLOCATION) - if (permissionDescriptor.name == PermissionName::Geolocation) { - if (auto geolocationPermissionState = determineGeolocationPermissionState(*permissionState, document)) - permissionState = geolocationPermissionState; - else { - ScriptExecutionContext::postTaskTo(contextIdentifier, [promise = WTF::move(promise)](auto&) mutable { - promise.reject(Exception { ExceptionCode::InvalidStateError, "The Document does not have a Geolocation object"_s }); - }); - + ScriptExecutionContext::ensureOnContextThread(contextIdentifier, [weakThis = WTF::move(weakThis), promiseIdentifier, permissionState = *result, permissionDescriptor, source, page = WTF::move(page)](auto& context) mutable { + RefPtr protectedThis = weakThis; + if (!protectedThis) return; - } - } -#endif - - ScriptExecutionContext::postTaskTo(contextIdentifier, [promise = WTF::move(promise), permissionState, permissionDescriptor, source, page = WTF::move(page)](auto& context) mutable { - promise.resolve(PermissionStatus::create(context, *permissionState, permissionDescriptor, source, WTF::move(page))); + if (RefPtr promise = protectedThis->m_queryPromises.take(promiseIdentifier)) + promise->resolve>(PermissionStatus::create(context, permissionState, permissionDescriptor, source, WTF::move(page))); }); }); }; - if (CheckedPtr workerLoaderProxy = workerGlobalScope->thread()->workerLoaderProxy()) - workerLoaderProxy->postTaskToLoader(WTF::move(completionHandler)); -} - -#if ENABLE(GEOLOCATION) - -static std::optional determineGeolocationPermissionState(PermissionState permissionState, const Document& document) -{ - RefPtr window = document.window(); - if (!window) - return std::nullopt; - - RefPtr geolocation = NavigatorGeolocation::optionalGeolocation(window->protectedNavigator()); - - switch (permissionState) { - case PermissionState::Granted: - return PermissionState::Granted; - case PermissionState::Denied: - if (!geolocation || !geolocation->hasBeenRequested()) - return PermissionState::Prompt; - return PermissionState::Denied; - case PermissionState::Prompt: - if (!geolocation || !geolocation->hasBeenRequested()) - return PermissionState::Prompt; - return geolocation->isAllowed() ? PermissionState::Granted : PermissionState::Denied; - }; - - return std::nullopt; + if (document) + queryPermissionOnMainThread(*document); + else { + Ref workerGlobalScope = downcast(*context); + if (CheckedPtr workerLoaderProxy = workerGlobalScope->thread()->workerLoaderProxy()) + workerLoaderProxy->postTaskToLoader(WTF::move(queryPermissionOnMainThread)); + } } -#endif // ENABLE(GEOLOCATION) - } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/permissions/Permissions.h webkit2gtk-2.52.5/Source/WebCore/Modules/permissions/Permissions.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/permissions/Permissions.h 2026-02-23 14:40:54.763304500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/permissions/Permissions.h 2026-07-09 07:12:41.908800400 +0000 @@ -27,6 +27,9 @@ #include #include +#include +#include +#include #include #include @@ -50,14 +53,14 @@ template class DOMPromiseDeferred; -class Permissions : public RefCounted { +class Permissions : public RefCountedAndCanMakeWeakPtr { WTF_MAKE_TZONE_ALLOCATED(Permissions); public: static Ref create(NavigatorBase&); ~Permissions(); NavigatorBase* navigator(); - void query(JSC::Strong, DOMPromiseDeferred>&&); + void query(JSC::Strong, Ref&&); WEBCORE_EXPORT static std::optional sourceFromContext(const ScriptExecutionContext&); WEBCORE_EXPORT static std::optional toPermissionName(const String&); @@ -65,6 +68,10 @@ explicit Permissions(NavigatorBase&); WeakPtr m_navigator; + + enum class PromiseIdentifierType { }; + using PromiseIdentifier = AtomicObjectIdentifier; + HashMap> m_queryPromises; }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/speech/SpeechSynthesis.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/speech/SpeechSynthesis.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/speech/SpeechSynthesis.cpp 2026-03-17 20:48:12.340672000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/speech/SpeechSynthesis.cpp 2026-07-09 07:12:41.908800400 +0000 @@ -364,6 +364,18 @@ voicesDidChange(); } +void SpeechSynthesis::suspend(ReasonForSuspension) +{ + if (speaking()) + cancel(); +} + +void SpeechSynthesis::stop() +{ + if (speaking()) + cancel(); +} + bool SpeechSynthesis::virtualHasPendingActivity() const { return m_voiceList && m_hasEventListener; diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/speech/SpeechSynthesis.h webkit2gtk-2.52.5/Source/WebCore/Modules/speech/SpeechSynthesis.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/speech/SpeechSynthesis.h 2026-02-23 14:40:54.775304300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/speech/SpeechSynthesis.h 2026-07-09 07:12:41.908800400 +0000 @@ -101,6 +101,8 @@ void voicesChanged() override; // ActiveDOMObject + void suspend(ReasonForSuspension) final; + void stop() final; bool virtualHasPendingActivity() const final; void startSpeakingImmediately(SpeechSynthesisUtterance&); diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/speech/SpeechSynthesisUtterance.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/speech/SpeechSynthesisUtterance.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/speech/SpeechSynthesisUtterance.cpp 2026-02-23 14:40:54.776304200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/speech/SpeechSynthesisUtterance.cpp 2026-07-09 07:12:41.908800400 +0000 @@ -102,7 +102,8 @@ return; } - dispatchEvent(SpeechSynthesisEvent::create(type, { this, charIndex, charLength, static_cast((MonotonicTime::now() - startTime()).seconds()), name })); + if (isAllowedToRunScript()) + dispatchEvent(SpeechSynthesisEvent::create(type, { this, charIndex, charLength, static_cast((MonotonicTime::now() - startTime()).seconds()), name })); } void SpeechSynthesisUtterance::errorEventOccurred(const AtomString& type, SpeechSynthesisErrorCode errorCode) @@ -112,7 +113,8 @@ return; } - dispatchEvent(SpeechSynthesisErrorEvent::create(type, { { this, 0, 0, static_cast((MonotonicTime::now() - startTime()).seconds()), { } }, errorCode })); + if (isAllowedToRunScript()) + dispatchEvent(SpeechSynthesisErrorEvent::create(type, { { this, 0, 0, static_cast((MonotonicTime::now() - startTime()).seconds()), { } }, errorCode })); } void SpeechSynthesisUtterance::incrementActivityCountForEventDispatch() diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/streams/ReadableByteStreamController.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableByteStreamController.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/streams/ReadableByteStreamController.cpp 2026-02-23 14:40:54.779304300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableByteStreamController.cpp 2026-07-09 07:12:41.908800400 +0000 @@ -138,7 +138,7 @@ if (protectedStream()->state() != ReadableStream::State::Readable) return Exception { ExceptionCode::TypeError, "controller's stream is not readable"_s }; - close(globalObject); + close(globalObject, ShouldThrowOnError::Yes); return { }; } @@ -173,13 +173,8 @@ { if (!m_byobRequest && !m_pendingPullIntos.isEmpty()) { auto& firstDescriptor = m_pendingPullIntos.first(); - auto view = JSC::Uint8Array::create(firstDescriptor.buffer.ptr(), firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled); - Ref byobRequest = ReadableStreamBYOBRequest::create(); - - byobRequest->setController(const_cast(this)); - byobRequest->setView(view.ptr()); - - m_byobRequest = WTF::move(byobRequest); + Ref view = JSC::Uint8Array::create(firstDescriptor.buffer.ptr(), firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled); + m_byobRequest = ReadableStreamBYOBRequest::create(*const_cast(this), WTF::move(view)); } return m_byobRequest.get(); @@ -243,7 +238,12 @@ // Part of https://streams.spec.whatwg.org/#readablestream-close void ReadableByteStreamController::closeAndRespondToPendingPullIntos(JSDOMGlobalObject& globalObject) { - close(globalObject); + auto& vm = globalObject.vm(); + JSC::JSLockHolder lock(vm); + + if (!close(globalObject, ShouldThrowOnError::No)) + return; + while (!m_pendingPullIntos.isEmpty()) respond(globalObject, 0); } @@ -424,8 +424,8 @@ if (!byobRequest) return; - byobRequest->setController(nullptr); - byobRequest->setView(nullptr); + byobRequest->clearController(); + byobRequest->clearView(); m_byobRequest = nullptr; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/streams/ReadableByteStreamController.h webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableByteStreamController.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/streams/ReadableByteStreamController.h 2026-02-23 14:40:54.779304300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableByteStreamController.h 2026-07-09 07:12:41.908800400 +0000 @@ -92,7 +92,7 @@ void error(JSDOMGlobalObject&, JSC::JSValue); enum class ShouldThrowOnError : bool { No, Yes }; - bool close(JSDOMGlobalObject&, ShouldThrowOnError = ShouldThrowOnError::Yes); + bool close(JSDOMGlobalObject&, ShouldThrowOnError); void closeAndRespondToPendingPullIntos(JSDOMGlobalObject&); size_t pullFromBytes(JSDOMGlobalObject&, JSC::ArrayBuffer&, size_t offset); ExceptionOr enqueue(JSDOMGlobalObject&, JSC::ArrayBufferView&); diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/streams/ReadableStream.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStream.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/streams/ReadableStream.cpp 2026-02-23 14:40:54.779304300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStream.cpp 2026-07-09 07:12:41.908800400 +0000 @@ -437,7 +437,7 @@ return promise; } - auto* jsPromise = jsCast(result); + auto* jsPromise = jsDynamicCast(result); if (!jsPromise) return promise; diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/streams/ReadableStreamBYOBReader.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStreamBYOBReader.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/streams/ReadableStreamBYOBReader.cpp 2026-04-10 09:30:55.864679800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStreamBYOBReader.cpp 2026-07-09 07:12:41.908800400 +0000 @@ -60,7 +60,11 @@ ReadableStreamBYOBReader::~ReadableStreamBYOBReader() { - RefPtr stream = m_stream; + RefPtr stream; + { + Locker locker { m_streamLock }; + stream = m_stream; + } if (stream && stream->byobReader() == this) stream->setByobReader(nullptr); } @@ -95,18 +99,22 @@ return promise->reject(Exception { ExceptionCode::RangeError, "view's buffer is not large enough"_s }); } - if (!m_stream) - return promise->reject(Exception { ExceptionCode::TypeError, "reader has no stream"_s }); - + { + Locker locker { m_streamLock }; + if (!m_stream) + return promise->reject(Exception { ExceptionCode::TypeError, "reader has no stream"_s }); + } read(globalObject, view, options.min, ReadableStreamReadIntoRequest::create(WTF::move(promise))); } // https://streams.spec.whatwg.org/#byob-reader-release-lock void ReadableStreamBYOBReader::releaseLock(JSDOMGlobalObject& globalObject) { - if (!m_stream) - return; - + { + Locker locker { m_streamLock }; + if (!m_stream) + return; + } genericRelease(globalObject); errorReadIntoRequests(Exception { ExceptionCode::TypeError, "releasing stream"_s }); @@ -115,7 +123,12 @@ // https://streams.spec.whatwg.org/#generic-reader-cancel Ref ReadableStreamBYOBReader::cancel(JSDOMGlobalObject& globalObject, JSC::JSValue value) { - if (!m_stream) { + bool hasStream; + { + Locker locker { m_streamLock }; + hasStream = m_stream; + } + if (!hasStream) { auto [promise, deferred] = createPromiseAndWrapper(globalObject); deferred->reject(Exception { ExceptionCode::TypeError, "no stream"_s }); return promise; @@ -140,7 +153,10 @@ // https://streams.spec.whatwg.org/#set-up-readable-stream-byob-reader void ReadableStreamBYOBReader::initialize(JSDOMGlobalObject& globalObject, ReadableStream& stream) { - m_stream = &stream; + { + Locker locker { m_streamLock }; + m_stream = stream; + } stream.setByobReader(this); @@ -159,8 +175,11 @@ // https://streams.spec.whatwg.org/#readable-stream-byob-reader-read void ReadableStreamBYOBReader::read(JSDOMGlobalObject& globalObject, JSC::ArrayBufferView& view, size_t optionMin, Ref&& readRequest) { - ASSERT(m_stream); - Ref stream = *m_stream; + RefPtr stream; + { + Locker locker { m_streamLock }; + stream = m_stream; + } stream->markAsDisturbed(); if (stream->state() == ReadableStream::State::Errored) { @@ -175,8 +194,11 @@ // https://streams.spec.whatwg.org/#readable-stream-reader-generic-release void ReadableStreamBYOBReader::genericRelease(JSDOMGlobalObject& globalObject) { - ASSERT(m_stream); - Ref stream = *m_stream; + RefPtr stream; + { + Locker locker { m_streamLock }; + stream = m_stream; + } ASSERT(stream->byobReader() == this); @@ -193,7 +215,11 @@ controller->runReleaseSteps(); stream->setByobReader(nullptr); - m_stream = nullptr; + + { + Locker locker { m_streamLock }; + m_stream = nullptr; + } } // https://streams.spec.whatwg.org/#abstract-opdef-readablestreambyobreadererrorreadintorequests @@ -224,7 +250,11 @@ // https://streams.spec.whatwg.org/#readable-stream-reader-generic-cancel Ref ReadableStreamBYOBReader::genericCancel(JSDOMGlobalObject& globalObject, JSC::JSValue value) { - RefPtr stream = m_stream; + RefPtr stream; + { + Locker locker { m_streamLock }; + stream = m_stream; + } ASSERT(stream); ASSERT(stream->byobReader() == this); @@ -268,6 +298,7 @@ bool ReadableStreamBYOBReader::isReachableFromOpaqueRoots() const { + Locker locker { m_streamLock }; return readIntoRequestsSize() && m_stream && m_stream->isReachableFromOpaqueRoots(); } @@ -292,6 +323,7 @@ template void ReadableStreamBYOBReader::visitAdditionalChildren(Visitor& visitor) { + Locker locker { m_streamLock }; if (m_stream) SUPPRESS_UNCOUNTED_ARG m_stream->visitAdditionalChildren(visitor); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/streams/ReadableStreamBYOBReader.h webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStreamBYOBReader.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/streams/ReadableStreamBYOBReader.h 2026-02-23 14:40:54.779304300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStreamBYOBReader.h 2026-07-09 07:12:41.908800400 +0000 @@ -31,6 +31,7 @@ #include "ScriptWrappable.h" #include "WebCoreOpaqueRoot.h" #include +#include #include #include #include @@ -89,7 +90,8 @@ Ref m_closedPromise; Ref m_closedDeferred; - RefPtr m_stream; + mutable Lock m_streamLock; + RefPtr m_stream WTF_GUARDED_BY_LOCK(m_streamLock); Deque> m_readIntoRequests; ClosedCallback m_closedCallback; diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/streams/ReadableStreamBYOBRequest.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStreamBYOBRequest.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/streams/ReadableStreamBYOBRequest.cpp 2026-02-23 14:40:54.779304300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStreamBYOBRequest.cpp 2026-07-09 07:12:41.908800400 +0000 @@ -26,6 +26,7 @@ #include "config.h" #include "ReadableStreamBYOBRequest.h" +#include "JSReadableStream.h" #include "JSReadableStreamBYOBRequest.h" #include "ReadableByteStreamController.h" #include "ReadableStream.h" @@ -33,12 +34,23 @@ namespace WebCore { -Ref ReadableStreamBYOBRequest::create() +Ref ReadableStreamBYOBRequest::create(ReadableByteStreamController& controller, Ref&& view) { - return adoptRef(*new ReadableStreamBYOBRequest); + return adoptRef(*new ReadableStreamBYOBRequest(controller, WTF::move(view))); } -ReadableStreamBYOBRequest::ReadableStreamBYOBRequest() = default; +ReadableStreamBYOBRequest::ReadableStreamBYOBRequest(ReadableByteStreamController& controller, Ref&& view) + : m_controller(controller) + , m_view(WTF::move(view)) +{ + Ref stream = controller.stream(); + auto* globalObject = stream->globalObject(); + ASSERT(globalObject); + if (!globalObject) + return; + + m_streamWrapperForGC.set(globalObject->vm(), globalObject, toJS(globalObject, globalObject, stream.get())); +} JSC::ArrayBufferView* ReadableStreamBYOBRequest::view() const { @@ -72,21 +84,21 @@ return controller->respondWithNewView(globalObject, view); } -void ReadableStreamBYOBRequest::setController(ReadableByteStreamController* controller) +void ReadableStreamBYOBRequest::clearController() { - m_controller = controller; + m_controller = nullptr; + m_streamWrapperForGC.clear(); } -void ReadableStreamBYOBRequest::setView(JSC::ArrayBufferView* view) +void ReadableStreamBYOBRequest::clearView() { - m_view = view; + m_view = nullptr; } template void ReadableStreamBYOBRequest::visitAdditionalChildren(Visitor& visitor) { - if (m_controller) - SUPPRESS_UNCOUNTED_ARG m_controller->stream().visitAdditionalChildren(visitor); + m_streamWrapperForGC.visit(visitor); } DEFINE_VISIT_ADDITIONAL_CHILDREN(ReadableStreamBYOBRequest); diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/streams/ReadableStreamBYOBRequest.h webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStreamBYOBRequest.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/streams/ReadableStreamBYOBRequest.h 2026-02-23 14:40:54.780304200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStreamBYOBRequest.h 2026-07-09 07:12:41.908800400 +0000 @@ -26,6 +26,7 @@ #pragma once #include "ExceptionOr.h" +#include "JSValueInWrappedObject.h" #include #include @@ -40,22 +41,23 @@ class ReadableStreamBYOBRequest : public RefCounted { public: - static Ref create(); + static Ref create(ReadableByteStreamController&, Ref&&); JSC::ArrayBufferView* view() const; ExceptionOr respond(JSDOMGlobalObject&, size_t); ExceptionOr respondWithNewView(JSDOMGlobalObject&, JSC::ArrayBufferView&); - void setController(ReadableByteStreamController*); - void setView(JSC::ArrayBufferView*); + void clearController(); + void clearView(); template void visitAdditionalChildren(Visitor&); private: - ReadableStreamBYOBRequest(); + ReadableStreamBYOBRequest(ReadableByteStreamController&, Ref&&); WeakPtr m_controller; RefPtr m_view; + JSValueInWrappedObject m_streamWrapperForGC; }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/streams/ReadableStreamDefaultReader.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStreamDefaultReader.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/streams/ReadableStreamDefaultReader.cpp 2026-03-03 21:30:17.037498500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStreamDefaultReader.cpp 2026-07-09 07:12:41.908800400 +0000 @@ -75,7 +75,11 @@ ReadableStreamDefaultReader::~ReadableStreamDefaultReader() { - RefPtr stream = m_stream; + RefPtr stream; + { + Locker locker { m_streamLock }; + stream = m_stream; + } if (stream && stream->defaultReader() == this) stream->setDefaultReader(nullptr); } @@ -96,7 +100,7 @@ { if (RefPtr internalReader = this->internalDefaultReader()) { auto value = internalReader->readForBindings(globalObject); - auto* promise = jsCast(value); + auto* promise = jsDynamicCast(value); if (!promise) return; @@ -128,7 +132,11 @@ return; } - RefPtr stream = m_stream; + RefPtr stream; + { + Locker locker { m_streamLock }; + stream = m_stream; + } if (!stream) { readRequest->runErrorSteps(Exception { ExceptionCode::TypeError, "stream is undefined"_s }); return; @@ -154,17 +162,19 @@ // https://streams.spec.whatwg.org/#default-reader-release-lock ExceptionOr ReadableStreamDefaultReader::releaseLock(JSDOMGlobalObject& globalObject) { - if (!m_stream) - return { }; - - if (RefPtr internalReader = this->internalDefaultReader()) { - auto result = internalReader->releaseLock(); - if (!result.hasException()) { - RefPtr stream = std::exchange(m_stream, { }); - stream->setDefaultReader(nullptr); - stream = nullptr; + { + Locker locker { m_streamLock }; + if (!m_stream) + return { }; + + if (RefPtr internalReader = this->internalDefaultReader()) { + auto result = internalReader->releaseLock(); + if (!result.hasException()) { + RefPtr stream = std::exchange(m_stream, nullptr); + stream->setDefaultReader(nullptr); + } + return result; } - return result; } genericRelease(globalObject); @@ -175,7 +185,11 @@ // https://streams.spec.whatwg.org/#set-up-readable-stream-default-reader ExceptionOr ReadableStreamDefaultReader::setup(JSDOMGlobalObject& globalObject) { - RefPtr stream = m_stream; + RefPtr stream; + { + Locker locker { m_streamLock }; + stream = m_stream; + } if (!stream) return Exception { ExceptionCode::TypeError, "stream is undefined"_s }; @@ -202,7 +216,11 @@ // https://streams.spec.whatwg.org/#readable-stream-reader-generic-release void ReadableStreamDefaultReader::genericRelease(JSDOMGlobalObject& globalObject) { - RefPtr stream = m_stream; + RefPtr stream; + { + Locker locker { m_streamLock }; + stream = m_stream; + } ASSERT(stream); ASSERT(stream->defaultReader() == this); @@ -222,6 +240,8 @@ controller->runReleaseSteps(); stream->setDefaultReader(nullptr); + + Locker locker { m_streamLock }; m_stream = nullptr; } @@ -236,7 +256,12 @@ // https://streams.spec.whatwg.org/#generic-reader-cancel Ref ReadableStreamDefaultReader::cancel(JSDOMGlobalObject& globalObject, JSC::JSValue value) { - if (!m_stream) { + bool hasStream; + { + Locker locker { m_streamLock }; + hasStream = m_stream; + } + if (!hasStream) { auto [promise, deferred] = createPromiseAndWrapper(globalObject); deferred->reject(Exception { ExceptionCode::TypeError, "no stream"_s }); return promise; @@ -248,7 +273,11 @@ // https://streams.spec.whatwg.org/#readable-stream-reader-generic-cancel Ref ReadableStreamDefaultReader::genericCancel(JSDOMGlobalObject& globalObject, JSC::JSValue value) { - RefPtr stream = m_stream; + RefPtr stream; + { + Locker locker { m_streamLock }; + stream = m_stream; + } ASSERT(stream); ASSERT(stream->defaultReader() == this); @@ -350,8 +379,15 @@ }); } +ReadableStream* ReadableStreamDefaultReader::stream() +{ + Locker locker { m_streamLock }; + return m_stream.get(); +} + bool ReadableStreamDefaultReader::isReachableFromOpaqueRoots() const { + Locker locker { m_streamLock }; return getNumReadRequests() && m_stream && m_stream->isReachableFromOpaqueRoots(); } @@ -397,6 +433,7 @@ template void ReadableStreamDefaultReader::visitAdditionalChildren(Visitor& visitor) { + Locker locker { m_streamLock }; if (m_stream) SUPPRESS_UNCOUNTED_ARG m_stream->visitAdditionalChildren(visitor); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/streams/ReadableStreamDefaultReader.h webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStreamDefaultReader.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/streams/ReadableStreamDefaultReader.h 2026-02-23 14:40:54.780304200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/streams/ReadableStreamDefaultReader.h 2026-07-09 07:12:41.908800400 +0000 @@ -30,6 +30,7 @@ #include "ScriptWrappable.h" #include "WebCoreOpaqueRoot.h" #include +#include #include #include #include @@ -75,7 +76,7 @@ bool isReachableFromOpaqueRoots() const; template void visitAdditionalChildren(Visitor&); - ReadableStream* stream() { return m_stream.get(); } + ReadableStream* stream(); private: ReadableStreamDefaultReader(Ref&&, RefPtr&&, Ref&&, Ref&&); @@ -86,7 +87,8 @@ Ref m_closedPromise; Ref m_closedDeferred; - RefPtr m_stream; + mutable Lock m_streamLock; + RefPtr m_stream WTF_GUARDED_BY_LOCK(m_streamLock); Deque> m_readRequests; const RefPtr m_internalDefaultReader; diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/streams/StreamPipeToUtilities.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/streams/StreamPipeToUtilities.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/streams/StreamPipeToUtilities.cpp 2026-02-23 14:40:54.782304300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/streams/StreamPipeToUtilities.cpp 2026-07-09 07:12:41.908800400 +0000 @@ -233,7 +233,7 @@ if (!value) return nullptr; - auto* promise = jsCast(value); + auto* promise = jsDynamicCast(value); if (!promise) return nullptr; @@ -256,7 +256,12 @@ JSDOMGlobalObject* StreamPipeToState::globalObject() { RefPtr context = scriptExecutionContext(); - return context ? JSC::jsCast(context->globalObject()) : nullptr; + if (!context) + return nullptr; + auto* jsGlobalObject = context->globalObject(); + if (!jsGlobalObject) + return nullptr; + return JSC::jsDynamicCast(jsGlobalObject); } void StreamPipeToState::handleSignal() @@ -282,7 +287,7 @@ return nullptr; auto value = internalWritableStream->abort(*globalObject, signal->reason().getValue()); - auto* promise = jsCast(value); + auto* promise = jsDynamicCast(value); if (!promise) return nullptr; @@ -387,7 +392,7 @@ Ref internalWritableStream = protectedThis->m_destination->internalWritableStream(); auto value = internalWritableStream->abort(*globalObject, error.get()); - auto* promise = jsCast(value); + auto* promise = jsDynamicCast(value); if (!promise) { auto [result, deferred] = createPromiseAndWrapper(*globalObject); deferred->resolve(); @@ -535,7 +540,7 @@ }; auto [result, deferred] = createPromiseAndWrapper(*globalObject); - auto* promise = jsCast(value); + auto* promise = jsDynamicCast(value); if (!promise) deferred->rejectWithCallback(WTF::move(getError2), RejectAsHandled::Yes); else { diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/streams/StreamTeeUtilities.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/streams/StreamTeeUtilities.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/streams/StreamTeeUtilities.cpp 2026-02-23 14:40:54.782304300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/streams/StreamTeeUtilities.cpp 2026-07-09 07:12:41.908800400 +0000 @@ -441,10 +441,15 @@ RefPtr branch2 = m_state->branch2(); m_state->setReading(false); + + bool shouldStopSteps = false; if (!m_state->canceled1() && branch1) - branch1->controller()->close(*globalObject); + shouldStopSteps = !branch1->controller()->close(*globalObject, ReadableByteStreamController::ShouldThrowOnError::No); if (!m_state->canceled2() && branch2) - branch2->controller()->close(*globalObject); + shouldStopSteps |= !branch2->controller()->close(*globalObject, ReadableByteStreamController::ShouldThrowOnError::No); + + if (shouldStopSteps) + return; if (branch1 && branch1->protectedController()->hasPendingPullIntos()) branch1->protectedController()->respond(*globalObject, 0); diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/streams/TransformStream.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/streams/TransformStream.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/streams/TransformStream.cpp 2026-02-23 14:40:54.782304300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/streams/TransformStream.cpp 2026-07-09 07:12:41.908800400 +0000 @@ -117,9 +117,15 @@ return Exception { ExceptionCode::ExistingExceptionError }; auto results = resultsConversionResult.releaseReturnValue(); - ASSERT(results.size() == 3); + if (results.size() != 3) [[unlikely]] + return Exception { ExceptionCode::TypeError, "Internal TransformStream creation returned an unexpected number of values"_s }; - return CreateInternalTransformStreamResult { results[0].get(), JSC::jsDynamicCast(results[1].get())->wrapped(), JSC::jsDynamicCast(results[2].get())->wrapped() }; + auto* readable = JSC::jsDynamicCast(results[1].get()); + auto* writable = JSC::jsDynamicCast(results[2].get()); + if (!readable || !writable) [[unlikely]] + return Exception { ExceptionCode::TypeError, "Internal TransformStream creation returned values of unexpected types"_s }; + + return CreateInternalTransformStreamResult { results[0].get(), readable->wrapped(), writable->wrapped() }; } template diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/web-locks/WebLockManager.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/web-locks/WebLockManager.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/web-locks/WebLockManager.cpp 2026-02-23 14:40:54.786304200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/web-locks/WebLockManager.cpp 2026-07-09 07:12:41.912800300 +0000 @@ -85,8 +85,8 @@ void requestLock(WebLockIdentifier, const String& name, const Options&, Function&&, Function&& lockStolenHandler); void releaseLock(WebLockIdentifier, const String& name); - void abortLockRequest(WebLockIdentifier, const String& name, CompletionHandler&&); - void query(CompletionHandler&&); + void abortLockRequest(WebLockIdentifier, const String& name, Function&&); + void query(Function&&); void clientIsGoingAway(); private: @@ -126,23 +126,23 @@ }); } -void WebLockManager::MainThreadBridge::abortLockRequest(WebLockIdentifier lockIdentifier, const String& name, CompletionHandler&& completionHandler) +void WebLockManager::MainThreadBridge::abortLockRequest(WebLockIdentifier lockIdentifier, const String& name, Function&& callback) { - callOnMainThread([this, protectedThis = Ref { *this }, lockIdentifier, name = crossThreadCopy(name), completionHandler = WTF::move(completionHandler)]() mutable { - WebLockRegistry::singleton().abortLockRequest(m_sessionID, m_clientOrigin, lockIdentifier, m_clientID, name, [clientID = m_clientID, completionHandler = WTF::move(completionHandler)](bool wasAborted) mutable { - ScriptExecutionContext::ensureOnContextThread(clientID, [completionHandler = WTF::move(completionHandler), wasAborted](auto&) mutable { - completionHandler(wasAborted); + callOnMainThread([this, protectedThis = Ref { *this }, lockIdentifier, name = crossThreadCopy(name), callback = WTF::move(callback)]() mutable { + WebLockRegistry::singleton().abortLockRequest(m_sessionID, m_clientOrigin, lockIdentifier, m_clientID, name, [clientID = m_clientID, callback = WTF::move(callback)](bool wasAborted) mutable { + ScriptExecutionContext::ensureOnContextThread(clientID, [callback = WTF::move(callback), wasAborted](auto&) mutable { + callback(wasAborted); }); }); }); } -void WebLockManager::MainThreadBridge::query(CompletionHandler&& completionHandler) +void WebLockManager::MainThreadBridge::query(Function&& callback) { - callOnMainThread([this, protectedThis = Ref { *this }, completionHandler = WTF::move(completionHandler)]() mutable { - WebLockRegistry::singleton().snapshot(m_sessionID, m_clientOrigin, [clientID = m_clientID, completionHandler = WTF::move(completionHandler)](Snapshot&& snapshot) mutable { - ScriptExecutionContext::ensureOnContextThread(clientID, [completionHandler = WTF::move(completionHandler), snapshot = crossThreadCopy(snapshot)](auto&) mutable { - completionHandler(WTF::move(snapshot)); + callOnMainThread([this, protectedThis = Ref { *this }, callback = WTF::move(callback)]() mutable { + WebLockRegistry::singleton().snapshot(m_sessionID, m_clientOrigin, [clientID = m_clientID, callback = WTF::move(callback)](Snapshot&& snapshot) mutable { + ScriptExecutionContext::ensureOnContextThread(clientID, [callback = WTF::move(callback), snapshot = crossThreadCopy(snapshot)](auto&) mutable { + callback(WTF::move(snapshot)); }); }); }); @@ -307,11 +307,17 @@ return; } - m_mainThreadBridge->query([weakThis = WeakPtr { *this }, promise = WTF::move(promise)](Snapshot&& snapshot) mutable { + auto promiseIdentifier = WebLockIdentifier::generate(); + m_queryPromises.add(promiseIdentifier, WTF::move(promise)); + m_mainThreadBridge->query([weakThis = WeakPtr { *this }, promiseIdentifier](Snapshot&& snapshot) mutable { RefPtr protectedThis = weakThis.get(); if (!protectedThis) return; + auto promise = protectedThis->m_queryPromises.take(promiseIdentifier); + if (!promise) + return; + queueTaskKeepingObjectAlive(*protectedThis, TaskSource::DOMManipulation, [promise = WTF::move(promise), snapshot = WTF::move(snapshot)](auto&) mutable { promise->resolve>(WTF::move(snapshot)); }); @@ -356,13 +362,13 @@ void WebLockManager::clientIsGoingAway() { - if (m_pendingRequests.isEmpty() && m_releasePromises.isEmpty()) - return; - // Reject all pending promises before clearing - for (Ref promise : m_releasePromises.values()) + auto releasePromises = std::exchange(m_releasePromises, { }); + for (Ref promise : releasePromises.values()) + promise->reject(ExceptionCode::AbortError, "Promise was rejected because the browsing context is going away"_s); + auto queryPromises = std::exchange(m_queryPromises, { }); + for (Ref promise : queryPromises.values()) promise->reject(ExceptionCode::AbortError, "Promise was rejected because the browsing context is going away"_s); - m_pendingRequests.clear(); m_releasePromises.clear(); @@ -372,7 +378,7 @@ bool WebLockManager::virtualHasPendingActivity() const { - return !m_pendingRequests.isEmpty() || !m_releasePromises.isEmpty(); + return !m_pendingRequests.isEmpty() || !m_releasePromises.isEmpty() || !m_queryPromises.isEmpty(); } void WebLockManager::suspend(ReasonForSuspension reason) diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/web-locks/WebLockManager.h webkit2gtk-2.52.5/Source/WebCore/Modules/web-locks/WebLockManager.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/web-locks/WebLockManager.h 2026-02-23 14:40:54.786304200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/web-locks/WebLockManager.h 2026-07-09 07:12:41.912800300 +0000 @@ -83,6 +83,8 @@ struct LockRequest; HashMap m_pendingRequests; + + HashMap> m_queryPromises; }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/AudioBufferSourceNode.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/AudioBufferSourceNode.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/AudioBufferSourceNode.cpp 2026-02-23 14:40:54.789304300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/AudioBufferSourceNode.cpp 2026-07-09 07:12:41.912800300 +0000 @@ -214,6 +214,9 @@ double pitchRate = totalPitchRate(); bool reverse = pitchRate < 0; + if (!bufferLength) + return false; + // Avoid converting from time to sample-frames twice by computing // the grain end time first before computing the sample frame. unsigned maxFrame; @@ -249,7 +252,7 @@ // Wrap back to the beginning of the loop. m_virtualReadIndex = (m_loopStart < 0) ? 0 : (m_loopStart * m_buffer->sampleRate()); - m_virtualReadIndex = std::min(m_virtualReadIndex, static_cast(bufferLength - 1)); + m_virtualReadIndex = std::min(m_virtualReadIndex, static_cast(bufferLength) - 1); } // Sanity check that our playback rate isn't larger than the loop size. @@ -340,6 +343,9 @@ if (readIndex >= maxFrame) readIndex -= deltaFrames; + if (readIndex >= bufferLength) + return false; + for (unsigned i = 0; i < numberOfChannels; ++i) std::ranges::fill(m_destinationChannels[i].subspan(writeIndex).first(framesToProcess), m_sourceChannels[i][readIndex]); @@ -476,8 +482,7 @@ if (m_isGrain) adjustGrainParameters(); - if (isPlayingOrScheduled()) - acquireBufferContent(); + acquireBufferContent(); return { }; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/AudioNodeInput.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/AudioNodeInput.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/AudioNodeInput.cpp 2026-02-23 14:40:54.791304300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/AudioNodeInput.cpp 2026-07-09 07:12:41.912800300 +0000 @@ -88,6 +88,9 @@ } // Otherwise, try to disconnect from disabled connections. + // Heap allocations are forbidden on the audio thread for performance reasons so we need to + // explicitly allow the following allocation(s). + DisableMallocRestrictionsForCurrentThreadScope disableMallocRestrictions; if (m_disabledOutputs.remove(output)) { output->removeInput(this); // Note: it's important to return immediately after this since the node may be deleted. return; diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/AudioWorkletGlobalScope.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/AudioWorkletGlobalScope.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/AudioWorkletGlobalScope.cpp 2026-02-23 14:40:54.794304100 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/AudioWorkletGlobalScope.cpp 2026-07-09 07:12:41.912800300 +0000 @@ -57,6 +57,7 @@ return nullptr; auto scope = adoptRef(*new AudioWorkletGlobalScope(thread, vm.releaseNonNull(), parameters)); scope->addToContextsMap(); + scope->applyContentSecurityPolicyResponseHeaders(parameters.contentSecurityPolicyResponseHeaders); return scope; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/AudioWorkletMessagingProxy.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/AudioWorkletMessagingProxy.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/AudioWorkletMessagingProxy.cpp 2026-02-23 14:40:54.795304300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/AudioWorkletMessagingProxy.cpp 2026-07-09 07:12:41.912800300 +0000 @@ -35,6 +35,7 @@ #include "AudioWorkletThread.h" #include "BaseAudioContext.h" #include "CacheStorageConnection.h" +#include "ContentSecurityPolicy.h" #include "DocumentPage.h" #include "DocumentSettingsValues.h" #include "LocalFrame.h" @@ -60,7 +61,8 @@ document->referrerPolicy(), worklet.audioContext() ? !worklet.audioContext()->isOfflineContext() : false, document->advancedPrivacyProtections(), - document->noiseInjectionHashSalt() + document->noiseInjectionHashSalt(), + document->checkedContentSecurityPolicy()->responseHeaders() }; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/BiquadFilterNode.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/BiquadFilterNode.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/BiquadFilterNode.cpp 2026-02-23 14:40:54.796304200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/BiquadFilterNode.cpp 2026-07-09 07:12:41.912800300 +0000 @@ -28,6 +28,8 @@ #if ENABLE(WEB_AUDIO) #include "BiquadFilterNode.h" + +#include "BaseAudioContext.h" #include "ExceptionOr.h" #include #include @@ -70,6 +72,11 @@ void BiquadFilterNode::setType(BiquadFilterType type) { + ASSERT(isMainThread()); + + // Synchronize with any graph changes or changes to channel configuration since + // BiquadProcessor::setType() may iterate the processor's kernels via reset(). + Locker contextLocker { context().graphLock() }; checkedBiquadProcessor()->setType(type); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/WaveShaperDSPKernel.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/WaveShaperDSPKernel.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/WaveShaperDSPKernel.cpp 2026-01-20 14:08:43.267680600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/WaveShaperDSPKernel.cpp 2026-07-09 07:12:41.912800300 +0000 @@ -30,7 +30,6 @@ #include "AudioUtilities.h" #include "WaveShaperProcessor.h" -#include #include #include #include @@ -84,17 +83,13 @@ void WaveShaperDSPKernel::processCurve(std::span source, std::span destination) { - ASSERT(source.data() && destination.data() && waveShaperProcessor()); - assertIsHeld(waveShaperProcessor()->processLock()); - RefPtr curve = waveShaperProcessor()->curve(); - if (!curve) { - // Act as "straight wire" pass-through if no curve is set. - memcpySpan(destination, source); - return; - } + processCurveWithData(source, destination, waveShaperProcessor()->curve().span()); +} - auto curveData = curve->typedMutableSpan(); +void WaveShaperDSPKernel::processCurveWithData(std::span source, std::span destination, std::span curveData) +{ + ASSERT(source.data() && destination.data()); if (curveData.empty()) { memcpySpan(destination, source); @@ -103,7 +98,13 @@ // Apply waveshaping curve. for (auto [input, output] : zippedRange(source, destination)) { - float v = (curveData.size() - 1) * 0.5f * (input + 1); + if (!std::isfinite(input)) { + output = 0.0f; + continue; + } + + float clampedInput = std::clamp(input, -1.0f, 1.0f); + float v = (curveData.size() - 1) * 0.5f * (clampedInput + 1); if (v < 0) output = curveData[0]; else if (v >= curveData.size() - 1) @@ -111,7 +112,7 @@ else { float k = std::floor(v); float f = v - k; - unsigned kIndex = k; + unsigned kIndex = static_cast(k); output = (1 - f) * curveData[kIndex] + f * curveData[kIndex + 1]; } } diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/WaveShaperDSPKernel.h webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/WaveShaperDSPKernel.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/WaveShaperDSPKernel.h 2026-02-23 14:40:54.805304000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/WaveShaperDSPKernel.h 2026-07-09 07:12:41.912800300 +0000 @@ -50,12 +50,13 @@ // Oversampling requires more resources, so let's only allocate them if needed. void lazyInitializeOversampling(); + // Apply the shaping curve. + WEBCORE_EXPORT static void processCurveWithData(std::span source, std::span destination, std::span curveData); + private: bool isWaveShaperDSPKernel() const final { return true; } - // Apply the shaping curve. void processCurve(std::span source, std::span destination); - // Use up-sampling, process at the higher sample-rate, then down-sample. void processCurve2x(std::span source, std::span destination); void processCurve4x(std::span source, std::span destination); diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/WaveShaperNode.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/WaveShaperNode.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/WaveShaperNode.cpp 2026-02-23 14:40:54.805304000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/WaveShaperNode.cpp 2026-07-09 07:12:41.912800300 +0000 @@ -81,27 +81,22 @@ if (curve && curve->length() < 2) return Exception { ExceptionCode::InvalidStateError, "Length of curve array cannot be less than 2"_s }; - if (curve) { - // The specification states that we should maintain an internal copy of the curve so that - // subsequent modifications of the contents of the array have no effect. - auto clonedCurve = Float32Array::create(curve->data(), curve->length()); - curve = WTF::move(clonedCurve); - } - - waveShaperProcessor()->setCurveForBindings(curve.get()); + // The specification states that we should maintain an internal copy of the curve so that + // subsequent modifications of the contents of the array have no effect. + waveShaperProcessor()->setCurveForBindings(curve ? Vector(curve->typedSpan()) : Vector()); return { }; } RefPtr WaveShaperNode::curveForBindings() { ASSERT(isMainThread()); - RefPtr curve = waveShaperProcessor()->curveForBindings(); - if (!curve) + auto& curve = waveShaperProcessor()->curveForBindings(); + if (curve.isEmpty()) return nullptr; // Make a clone of our internal array so that JS cannot modify our internal array // on the main thread while the audio thread is using it for rendering. - return Float32Array::create(curve->data(), curve->length()); + return Float32Array::create(curve.span()); } static inline WaveShaperProcessor::OverSampleType processorType(OverSampleType type) @@ -149,8 +144,7 @@ return false; Locker locker { AdoptLock, waveShaperProcessor()->processLock() }; - RefPtr curve = waveShaperProcessor()->curve(); - return !curve || !curve->length(); + return waveShaperProcessor()->curve().isEmpty(); } } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/WaveShaperNode.h webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/WaveShaperNode.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/WaveShaperNode.h 2026-02-23 14:40:54.805304000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/WaveShaperNode.h 2026-07-09 07:12:41.912800300 +0000 @@ -30,6 +30,7 @@ #include "OverSampleType.h" #include "WaveShaperOptions.h" #include "WaveShaperProcessor.h" +#include #include namespace WebCore { diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/WaveShaperProcessor.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/WaveShaperProcessor.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/WaveShaperProcessor.cpp 2026-02-23 14:40:54.805304000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/WaveShaperProcessor.cpp 2026-07-09 07:12:41.912800300 +0000 @@ -29,7 +29,6 @@ #include "WaveShaperProcessor.h" #include "WaveShaperDSPKernel.h" -#include #include namespace WebCore { @@ -52,13 +51,13 @@ return makeUnique(this); } -void WaveShaperProcessor::setCurveForBindings(Float32Array* curve) +void WaveShaperProcessor::setCurveForBindings(Vector&& curve) { ASSERT(isMainThread()); // This synchronizes with process(). Locker locker { m_processLock }; - m_curve = curve; + m_curve = WTF::move(curve); } void WaveShaperProcessor::setOversampleForBindings(OverSampleType oversample) diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/WaveShaperProcessor.h webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/WaveShaperProcessor.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/webaudio/WaveShaperProcessor.h 2026-01-20 14:08:43.269680700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/webaudio/WaveShaperProcessor.h 2026-07-09 07:12:41.912800300 +0000 @@ -27,11 +27,10 @@ #include "AudioDSPKernel.h" #include "AudioDSPKernelProcessor.h" #include "AudioNode.h" -#include #include #include -#include #include +#include namespace WebCore { @@ -55,9 +54,9 @@ void process(const AudioBus& source, AudioBus& destination, size_t framesToProcess) final; - void setCurveForBindings(Float32Array*); - Float32Array* curveForBindings() WTF_IGNORES_THREAD_SAFETY_ANALYSIS { ASSERT(isMainThread()); return m_curve.get(); } // Doesn't grab the lock, only safe to call on the main thread. - Float32Array* curve() const WTF_REQUIRES_LOCK(m_processLock) { return m_curve.get(); } + void setCurveForBindings(Vector&&); + const Vector& curveForBindings() const LIFETIME_BOUND WTF_IGNORES_THREAD_SAFETY_ANALYSIS { ASSERT(isMainThread()); return m_curve; } // Doesn't grab the lock, only safe to call on the main thread. + const Vector& curve() const LIFETIME_BOUND WTF_REQUIRES_LOCK(m_processLock) { return m_curve; } void setOversampleForBindings(OverSampleType); OverSampleType oversampleForBindings() const WTF_IGNORES_THREAD_SAFETY_ANALYSIS { ASSERT(isMainThread()); return m_oversample; } // Doesn't grab the lock, only safe to call on the main thread. @@ -69,7 +68,7 @@ Type processorType() const final { return Type::WaveShaper; } // m_curve represents the non-linear shaping curve. - RefPtr m_curve WTF_GUARDED_BY_LOCK(m_processLock); + Vector m_curve WTF_GUARDED_BY_LOCK(m_processLock); OverSampleType m_oversample WTF_GUARDED_BY_LOCK(m_processLock) { OverSampleNone }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/webcodecs/WebCodecsAudioData.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/webcodecs/WebCodecsAudioData.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/webcodecs/WebCodecsAudioData.cpp 2026-02-23 14:40:54.816304200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/webcodecs/WebCodecsAudioData.cpp 2026-07-09 07:12:41.912800300 +0000 @@ -65,6 +65,7 @@ WebCodecsAudioData::WebCodecsAudioData(ScriptExecutionContext& context, WebCodecsAudioInternalData&& data) : ContextDestructionObserver(&context) , m_data(WTF::move(data)) + , m_memoryCost(m_data.memoryCost()) { } @@ -151,6 +152,7 @@ // https://www.w3.org/TR/webcodecs/#dom-audiodata-close void WebCodecsAudioData::close() { + m_memoryCost.store(0, std::memory_order_relaxed); m_data.audioData = nullptr; m_isDetached = true; diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/webcodecs/WebCodecsAudioData.h webkit2gtk-2.52.5/Source/WebCore/Modules/webcodecs/WebCodecsAudioData.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/webcodecs/WebCodecsAudioData.h 2026-02-23 14:40:54.816304200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/webcodecs/WebCodecsAudioData.h 2026-07-09 07:12:41.912800300 +0000 @@ -84,13 +84,16 @@ const WebCodecsAudioInternalData& data() const { return m_data; } - size_t memoryCost() const { return m_data.memoryCost(); } + // memoryCost() may be called from a GC thread by the JS wrapper's visitChildren, so it must + // not touch m_data.audioData (which close() may concurrently null on the main thread). + size_t memoryCost() const { return m_memoryCost.load(std::memory_order_relaxed); } private: explicit WebCodecsAudioData(ScriptExecutionContext&); WebCodecsAudioData(ScriptExecutionContext&, WebCodecsAudioInternalData&&); WebCodecsAudioInternalData m_data; + std::atomic m_memoryCost { 0 }; bool m_isDetached { false }; }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/websockets/WebSocketHandshake.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/websockets/WebSocketHandshake.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/websockets/WebSocketHandshake.cpp 2026-02-23 14:40:54.828304000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/websockets/WebSocketHandshake.cpp 2026-07-09 07:12:41.912800300 +0000 @@ -430,7 +430,7 @@ } statusCode = parseInteger(statusCodeString).value(); - statusText = String(byteCast(header.subspan(*secondSpaceIndex + 1, index - *secondSpaceIndex - 3))); // Exclude "\r\n". + statusText = String(byteCast(header.subspan(*secondSpaceIndex + 1, lineLength - *secondSpaceIndex - 3))); // Exclude "\r\n". return lineLength; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/webxr/WebXRSession.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/webxr/WebXRSession.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/webxr/WebXRSession.cpp 2026-02-23 14:40:54.841304000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/webxr/WebXRSession.cpp 2026-07-09 07:12:41.916800300 +0000 @@ -398,7 +398,9 @@ // 3. If the active immersive session is equal to session, set the active immersive session to null. // 4. Remove session from the list of inline sessions. - m_xrSystem.sessionEnded(*this); + RefPtr xrSystem = m_xrSystem.get(); + if (xrSystem) + xrSystem->sessionEnded(*this); m_inputSources->clear(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/webxr/WebXRSession.h webkit2gtk-2.52.5/Source/WebCore/Modules/webxr/WebXRSession.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/webxr/WebXRSession.h 2026-02-23 14:40:54.842304000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/webxr/WebXRSession.h 2026-07-09 07:12:41.916800300 +0000 @@ -168,7 +168,7 @@ bool m_shouldServiceRequestVideoFrameCallbacks { false }; std::unique_ptr m_endPromise; - WebXRSystem& m_xrSystem; + WeakPtr m_xrSystem; XRSessionMode m_mode; ThreadSafeWeakPtr m_device; FeatureList m_requestedFeatures; diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/webxr/WebXRSystem.cpp webkit2gtk-2.52.5/Source/WebCore/Modules/webxr/WebXRSystem.cpp --- webkit2gtk-2.52.3/Source/WebCore/Modules/webxr/WebXRSystem.cpp 2026-02-23 14:40:54.842304000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/webxr/WebXRSystem.cpp 2026-07-09 07:12:41.916800300 +0000 @@ -34,7 +34,6 @@ #include "ContextDestructionObserverInlines.h" #include "DocumentPage.h" #include "DocumentSecurityOrigin.h" -#include "IDLTypes.h" #include "JSDOMPromiseDeferred.h" #include "JSWebXRSession.h" #include "JSXRReferenceSpaceType.h" @@ -49,9 +48,6 @@ #include "WebXRSession.h" #include "XRReferenceSpaceType.h" #include "XRSessionInit.h" -#include -#include -#include #include #include @@ -138,11 +134,11 @@ }); } -void WebXRSystem::obtainCurrentDevice(XRSessionMode mode, const JSFeatureList& requiredFeatures, const JSFeatureList& optionalFeatures, CompletionHandler)>&& callback) +void WebXRSystem::obtainCurrentDevice(XRSessionMode mode, const Vector& requiredFeatures, const Vector& optionalFeatures, CompletionHandler)>&& callback) { if (isImmersive(mode)) { - ensureImmersiveXRDeviceIsSelected([this, callback = WTF::move(callback)]() mutable { - callback(m_activeImmersiveDevice); + ensureImmersiveXRDeviceIsSelected([protectedThis = protect(*this), callback = WTF::move(callback)]() mutable { + callback(protectedThis->m_activeImmersiveDevice); }); return; } @@ -175,9 +171,9 @@ // 4. Run the following steps in parallel: // 4.1 Ensure an immersive XR device is selected. - ensureImmersiveXRDeviceIsSelected([this, promise = WTF::move(promise), mode]() mutable { + ensureImmersiveXRDeviceIsSelected([protectedThis = protect(*this), promise = WTF::move(promise), mode]() mutable { // 4.2 If the immersive XR device is null, resolve promise with false and abort these steps. - auto activeImmersiveDevice = m_activeImmersiveDevice.get(); + RefPtr activeImmersiveDevice = protectedThis->m_activeImmersiveDevice.get(); if (!activeImmersiveDevice) { promise.resolve(false); return; @@ -223,12 +219,11 @@ // https://immersive-web.github.io/webxr/#inline-session-request-is-allowed bool WebXRSystem::inlineSessionRequestIsAllowedForGlobalObject(LocalDOMWindow& globalObject, Document& document, const XRSessionInit& init) const { - auto isEmptyOrViewer = [&document](const JSFeatureList& features) { + auto isEmptyOrViewer = [](const Vector& features) { if (features.isEmpty()) return true; - if (features.size() == 1 && document.globalObject()) { - auto featureString = features.first().toWTFString(document.globalObject()); - auto sessionFeature = PlatformXR::parseSessionFeatureDescriptor(featureString); + if (features.size() == 1) { + auto sessionFeature = PlatformXR::parseSessionFeatureDescriptor(features.first()); if (sessionFeature && *sessionFeature == PlatformXR::SessionFeature::ReferenceSpaceTypeViewer) return true; } @@ -333,7 +328,7 @@ } // https://immersive-web.github.io/webxr/#resolve-the-requested-features -std::optional WebXRSystem::resolveRequestedFeatures(XRSessionMode mode, const XRSessionInit& init, RefPtr device, JSC::JSGlobalObject& globalObject) const +std::optional WebXRSystem::resolveRequestedFeatures(XRSessionMode mode, const XRSessionInit& init, RefPtr device) const { // 1. Let consentRequired be an empty list of DOMString. // 2. Let consentOptional be an empty list of DOMString. @@ -353,19 +348,16 @@ // with mode to the indicated feature list if it is not already present. // https://immersive-web.github.io/webxr/#default-features auto requiredFeaturesWithDefaultFeatures = init.requiredFeatures; - { - JSC::JSLockHolder locker(&globalObject); - requiredFeaturesWithDefaultFeatures.append(JSC::jsStringWithCache(globalObject.vm(), PlatformXR::sessionFeatureDescriptor(PlatformXR::SessionFeature::ReferenceSpaceTypeViewer))); - if (isImmersive(mode)) - requiredFeaturesWithDefaultFeatures.append(JSC::jsStringWithCache(globalObject.vm(), PlatformXR::sessionFeatureDescriptor(PlatformXR::SessionFeature::ReferenceSpaceTypeLocal))); - } + requiredFeaturesWithDefaultFeatures.append(PlatformXR::sessionFeatureDescriptor(PlatformXR::SessionFeature::ReferenceSpaceTypeViewer)); + if (isImmersive(mode)) + requiredFeaturesWithDefaultFeatures.append(PlatformXR::sessionFeatureDescriptor(PlatformXR::SessionFeature::ReferenceSpaceTypeLocal)); // 8. For each feature in requiredFeatures|optionalFeatures perform the following steps: // 9. For each feature in optionalFeatures perform the following steps: // We're merging both loops in a single lambda. The only difference is that a failure on any required features // implies cancelling the whole process while failures in optional features are just skipped. enum class ParsingMode { Strict, Loose }; - auto parseFeatures = [this, &device, &globalObject, mode, &resolvedFeatures, &previouslyEnabled] (const JSFeatureList& sessionFeatures, ParsingMode parsingMode) -> bool { + auto parseFeatures = [this, &device, mode, &resolvedFeatures, &previouslyEnabled](const Vector& sessionFeatures, ParsingMode parsingMode) -> bool { bool returnOnFailure = parsingMode == ParsingMode::Strict; for (const auto& sessionFeature : sessionFeatures) { // 1. If the feature is null, continue to the next entry. @@ -379,8 +371,7 @@ // 2.1. Let s be the result of calling ? ToString(feature). // 2.2. If s is not a valid feature descriptor or is undefined, (return null|continue to next entry). // 2.3. Set feature to s. - auto featureString = sessionFeature.toWTFString(&globalObject); - auto feature = PlatformXR::parseSessionFeatureDescriptor(featureString); + auto feature = PlatformXR::parseSessionFeatureDescriptor(sessionFeature); if (!feature) RETURN_FALSE_OR_CONTINUE(returnOnFailure); @@ -432,7 +423,7 @@ } // https://immersive-web.github.io/webxr/#request-the-xr-permission -void WebXRSystem::resolveFeaturePermissions(XRSessionMode mode, const XRSessionInit& init, RefPtr device, JSC::JSGlobalObject& globalObject, CompletionHandler&&)>&& completionHandler) const +void WebXRSystem::resolveFeaturePermissions(XRSessionMode mode, const XRSessionInit& init, RefPtr device, CompletionHandler&&)>&& completionHandler) const { // 1. Set status's granted to an empty FrozenArray. // 2. Let requiredFeatures be descriptor's requiredFeatures. @@ -440,7 +431,7 @@ // 4. Let device be the result of obtaining the current device for mode, requiredFeatures, and optionalFeatures. // 5. Let result be the result of resolving the requested features given requiredFeatures,optionalFeatures, and mode. - auto resolvedFeatures = resolveRequestedFeatures(mode, init, device, globalObject); + auto resolvedFeatures = resolveRequestedFeatures(mode, init, device); // 6. If result is null, run the following steps: // 6.1. Set status's state to "denied". @@ -542,7 +533,7 @@ // 5.2 Let optionalFeatures be options' optionalFeatures. // 5.3 Set device to the result of obtaining the current device for mode, requiredFeatures, and optionalFeatures. // 5.4 Queue a task to perform the following steps: - obtainCurrentDevice(mode, init.requiredFeatures, init.optionalFeatures, [this, protectedDocument, immersive, init, mode, promise = WTF::move(promise)](ThreadSafeWeakPtr weakDevice) mutable { + obtainCurrentDevice(mode, init.requiredFeatures, init.optionalFeatures, [this, protectedThis = protect(*this), protectedDocument, immersive, init, mode, promise = WTF::move(promise)](ThreadSafeWeakPtr weakDevice) mutable { auto rejectPromiseWithNotSupportedError = makeScopeExit([&]() { promise.reject(Exception { ExceptionCode::NotSupportedError }); m_pendingImmersiveSession = false; @@ -556,10 +547,6 @@ if (!device || !device->supports(mode)) return; - auto* globalObject = protectedDocument->globalObject(); - if (!globalObject) - return; - rejectPromiseWithNotSupportedError.release(); // WebKit does not currently support the Permissions API. https://w3c.github.io/permissions/ @@ -571,8 +558,13 @@ // 5.4.5 Let status be an XRPermissionStatus, initially null // 5.4.6 Request the xr permission with descriptor and status. // 5.4.7 If status' state is "denied" run the following steps: (same as above in 5.4.1) - resolveFeaturePermissions(mode, init, device, *globalObject, [this, weakThis = WeakPtr { *this }, protectedDocument, device, immersive, mode, promise](std::optional&& requestedFeatures) mutable { - if (!weakThis || !requestedFeatures) { + resolveFeaturePermissions(mode, init, device, [this, weakThis = WeakPtr { *this }, protectedDocument, device, immersive, mode, promise](std::optional&& requestedFeatures) mutable { + RefPtr strongThis = weakThis; + if (!strongThis) { + promise.reject(Exception { ExceptionCode::NotSupportedError }); + return; + } + if (!requestedFeatures) { promise.reject(Exception { ExceptionCode::NotSupportedError }); m_pendingImmersiveSession = false; return; diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/webxr/WebXRSystem.h webkit2gtk-2.52.5/Source/WebCore/Modules/webxr/WebXRSystem.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/webxr/WebXRSystem.h 2026-02-23 14:40:54.843304000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/webxr/WebXRSystem.h 2026-07-09 07:12:41.916800300 +0000 @@ -44,10 +44,6 @@ #include #include -namespace JSC { -class JSGlobalObject; -} - namespace WebCore { class LocalDOMWindow; @@ -101,8 +97,7 @@ explicit WebXRSystem(Navigator&); using FeatureList = PlatformXR::Device::FeatureList; - using JSFeatureList = Vector; - void obtainCurrentDevice(XRSessionMode, const JSFeatureList& requiredFeatures, const JSFeatureList& optionalFeatures, CompletionHandler)>&&); + void obtainCurrentDevice(XRSessionMode, const Vector& requiredFeatures, const Vector& optionalFeatures, CompletionHandler)>&&); bool immersiveSessionRequestIsAllowedForGlobalObject(LocalDOMWindow&, Document&) const; bool inlineSessionRequestIsAllowedForGlobalObject(LocalDOMWindow&, Document&, const XRSessionInit&) const; @@ -110,8 +105,8 @@ bool isFeaturePermitted(PlatformXR::SessionFeature) const; bool isFeatureSupported(PlatformXR::SessionFeature, XRSessionMode, const PlatformXR::Device&) const; struct ResolvedRequestedFeatures; - std::optional resolveRequestedFeatures(XRSessionMode, const XRSessionInit&, RefPtr, JSC::JSGlobalObject&) const; - void resolveFeaturePermissions(XRSessionMode, const XRSessionInit&, RefPtr, JSC::JSGlobalObject&, CompletionHandler&&)>&&) const; + std::optional resolveRequestedFeatures(XRSessionMode, const XRSessionInit&, RefPtr) const; + void resolveFeaturePermissions(XRSessionMode, const XRSessionInit&, RefPtr, CompletionHandler&&)>&&) const; // https://immersive-web.github.io/webxr/#default-inline-xr-device class DummyInlineDevice final : public PlatformXR::Device, public ContextDestructionObserver { diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/webxr/XRSessionInit.h webkit2gtk-2.52.5/Source/WebCore/Modules/webxr/XRSessionInit.h --- webkit2gtk-2.52.3/Source/WebCore/Modules/webxr/XRSessionInit.h 2026-01-20 14:08:43.404680300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/webxr/XRSessionInit.h 2026-07-09 07:12:41.916800300 +0000 @@ -27,18 +27,13 @@ #if ENABLE(WEBXR) -#include #include -namespace JSC { -class JSValue; -} - namespace WebCore { struct XRSessionInit { - Vector requiredFeatures; - Vector optionalFeatures; + Vector requiredFeatures; + Vector optionalFeatures; }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/Modules/webxr/XRSessionInit.idl webkit2gtk-2.52.5/Source/WebCore/Modules/webxr/XRSessionInit.idl --- webkit2gtk-2.52.3/Source/WebCore/Modules/webxr/XRSessionInit.idl 2026-02-23 14:40:54.851303800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/Modules/webxr/XRSessionInit.idl 2026-07-09 07:12:41.916800300 +0000 @@ -29,6 +29,6 @@ EnabledBySetting=WebXREnabled, LegacyNativeDictionaryRequiredInterfaceNullability, ] dictionary XRSessionInit { - sequence requiredFeatures; - sequence optionalFeatures; + sequence requiredFeatures; + sequence optionalFeatures; }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/PAL/pal/CMakeLists.txt webkit2gtk-2.52.5/Source/WebCore/PAL/pal/CMakeLists.txt --- webkit2gtk-2.52.3/Source/WebCore/PAL/pal/CMakeLists.txt 2026-02-23 14:40:54.853304000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/PAL/pal/CMakeLists.txt 2026-07-09 07:12:41.916800300 +0000 @@ -80,14 +80,7 @@ WEBKIT_FRAMEWORK_DECLARE(PAL) WEBKIT_INCLUDE_CONFIG_FILES_IF_EXISTS() - -if (PORT STREQUAL GTK OR PORT STREQUAL WPE) - WEBKIT_ADD_TARGET_CXX_FLAGS(PAL - -Wunsafe-buffer-usage - -Wunsafe-buffer-usage-in-libc-call - -fsafe-buffer-usage-suggestions - ) -endif () +WEBKIT_ADD_TARGET_UNSAFE_BUFFER_WARNINGS(PAL) WEBKIT_COPY_FILES(PAL_CopyHeaders DESTINATION ${PAL_FRAMEWORK_HEADERS_DIR}/pal diff -Nru webkit2gtk-2.52.3/Source/WebCore/SaferCPPExpectations/UncheckedCallArgsCheckerExpectations webkit2gtk-2.52.5/Source/WebCore/SaferCPPExpectations/UncheckedCallArgsCheckerExpectations --- webkit2gtk-2.52.3/Source/WebCore/SaferCPPExpectations/UncheckedCallArgsCheckerExpectations 2026-02-23 14:40:54.891303800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/SaferCPPExpectations/UncheckedCallArgsCheckerExpectations 2026-07-09 07:12:41.916800300 +0000 @@ -186,11 +186,12 @@ html/LazyLoadImageObserver.cpp html/MediaElementSession.cpp html/ModelDocument.cpp +[ Mac ] html/RangeInputType.cpp +[ Mac ] html/ResetInputType.cpp html/ValidatedFormListedElement.cpp html/ValidationMessage.cpp html/canvas/CanvasRenderingContext2D.cpp html/canvas/CanvasRenderingContext2DBase.cpp -html/canvas/EXTDisjointTimerQuery.cpp html/canvas/OffscreenCanvasRenderingContext2D.cpp html/parser/HTMLConstructionSite.cpp html/parser/HTMLConstructionSite.h diff -Nru webkit2gtk-2.52.3/Source/WebCore/SaferCPPExpectations/UncountedCallArgsCheckerExpectations webkit2gtk-2.52.5/Source/WebCore/SaferCPPExpectations/UncountedCallArgsCheckerExpectations --- webkit2gtk-2.52.3/Source/WebCore/SaferCPPExpectations/UncountedCallArgsCheckerExpectations 2026-02-23 14:40:54.892303700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/SaferCPPExpectations/UncountedCallArgsCheckerExpectations 2026-07-09 07:12:41.920800200 +0000 @@ -383,6 +383,8 @@ html/ModelDocument.cpp html/OffscreenCanvas.cpp [ iOS ] html/TextFieldInputType.cpp +[ Mac ] html/RangeInputType.cpp +[ Mac ] html/ResetInputType.cpp html/ValidatedFormListedElement.cpp html/ValidationMessage.cpp html/canvas/CanvasFilterContextSwitcher.cpp @@ -390,9 +392,7 @@ html/canvas/CanvasRenderingContext2D.cpp html/canvas/CanvasRenderingContext2DBase.cpp html/canvas/CanvasStyle.cpp -html/canvas/EXTDisjointTimerQuery.cpp html/canvas/GPUCanvasContextCocoa.mm -html/canvas/ImageBitmapRenderingContext.cpp html/canvas/OffscreenCanvasRenderingContext2D.cpp html/canvas/PlaceholderRenderingContext.cpp html/parser/HTMLConstructionSite.cpp diff -Nru webkit2gtk-2.52.3/Source/WebCore/accessibility/AXCoreObject.h webkit2gtk-2.52.5/Source/WebCore/accessibility/AXCoreObject.h --- webkit2gtk-2.52.3/Source/WebCore/accessibility/AXCoreObject.h 2026-02-23 14:40:54.919303700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/accessibility/AXCoreObject.h 2026-07-09 07:12:41.964799400 +0000 @@ -1509,6 +1509,8 @@ namespace Accessibility { +constexpr unsigned maxDescendantTraversalIterations = 100000; + template T* crossFrameFindAncestor(const T& object, bool includeSelf, const MatchFunctionT& matches, const StopFunctionT& shouldStop) { @@ -1596,11 +1598,36 @@ if (includeSelf && matches(object) && !object.isIgnored()) return &object; - for (Ref child : object.childrenIncludingIgnored()) { - if (RefPtr descendant = findUnignoredDescendant(child.get(), /* includeSelf */ true, matches)) - return descendant.unsafeGet(); + Vector> stack; + for (const auto& child : object.childrenIncludingIgnored()) + stack.append(child); + + unsigned iterationCount = 0; +#if AX_ASSERTS_ENABLED + HashSet> visited; +#endif + + RefPtr result = nullptr; + while (!stack.isEmpty()) { + if (++iterationCount > maxDescendantTraversalIterations) + break; + + Ref current = stack.takeLast(); +#if AX_ASSERTS_ENABLED + bool foundCycle = !visited.add(current.copyRef()).isNewEntry; + AX_ASSERT(!foundCycle); + if (foundCycle) + break; +#endif + if (matches(current.get()) && !current->isIgnored()) { + result = current.ptr(); + break; + } + + for (const auto& child : current->childrenIncludingIgnored()) + stack.append(child); } - return nullptr; + return result.unsafeGet(); } template @@ -1629,8 +1656,30 @@ if (includeSelf) lambda(object); - for (const auto& child : object.childrenIncludingIgnored()) - enumerateDescendantsIncludingIgnored(child.get(), true, lambda); + unsigned iterationCount = 0; +#if AX_ASSERTS_ENABLED + HashSet> visited; +#endif + + Vector> stack; + for (auto& child : object.childrenIncludingIgnored()) + stack.append(child); + + while (!stack.isEmpty()) { + if (++iterationCount > maxDescendantTraversalIterations) + break; + + Ref current = stack.takeLast(); +#if AX_ASSERTS_ENABLED + bool foundCycle = !visited.add(current.copyRef()).isNewEntry; + AX_ASSERT(!foundCycle); + if (foundCycle) + break; +#endif + lambda(current.get()); + for (auto& child : current->childrenIncludingIgnored()) + stack.append(child); + } } template @@ -1639,11 +1688,30 @@ if (includeSelf) lambda(object); - // We have a reference to unignored children here, so it's possible that it will change when enumerating the unignored - // descendants, so copying here ensures they don't change. - auto children = object.unignoredChildren(); - for (const auto& child : children) - enumerateUnignoredDescendants(child.get(), true, lambda); + Vector> stack; + for (const auto& child : object.unignoredChildren()) + stack.append(child); + + unsigned iterationCount = 0; +#if AX_ASSERTS_ENABLED + HashSet> visited; +#endif + + while (!stack.isEmpty()) { + if (++iterationCount > maxDescendantTraversalIterations) + break; + + Ref current = stack.takeLast(); +#if AX_ASSERTS_ENABLED + bool foundCycle = !visited.add(current.copyRef()).isNewEntry; + AX_ASSERT(!foundCycle); + if (foundCycle) + break; +#endif + lambda(current.get()); + for (const auto& child : current->unignoredChildren()) + stack.append(child); + } } template inline void performFunctionOnMainThreadAndWait(U&& lambda) diff -Nru webkit2gtk-2.52.3/Source/WebCore/accessibility/AXLiveRegionManager.cpp webkit2gtk-2.52.5/Source/WebCore/accessibility/AXLiveRegionManager.cpp --- webkit2gtk-2.52.3/Source/WebCore/accessibility/AXLiveRegionManager.cpp 2026-02-23 14:40:54.920303600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/accessibility/AXLiveRegionManager.cpp 2026-07-09 07:12:41.964799400 +0000 @@ -179,19 +179,32 @@ postAnnouncementForChange(object, oldSnapshot, newSnapshot); } +// Limit on the number of objects visited during snapshot building to prevent +// web content from hanging the process with excessively large live regions. +static constexpr size_t maximumSnapshotObjects = 512; + LiveRegionSnapshot AXLiveRegionManager::buildLiveRegionSnapshot(AccessibilityObject& object) const { LiveRegionSnapshot snapshot; snapshot.liveRegionStatus = stringToLiveRegionStatus(object.liveRegionStatus()); snapshot.liveRegionRelevant = stringToLiveRegionRelevant(object.liveRegionRelevant()); - std::function buildObjectList = [this, &buildObjectList, &snapshot] (AccessibilityObject& object) { + size_t objectsVisited = 0; + std::function buildObjectList = [this, &buildObjectList, &snapshot, &objectsVisited] (AccessibilityObject& object) { + if (objectsVisited >= maximumSnapshotObjects) + return; + ++objectsVisited; + // Treat atomic objects as one object, so when they change the entire subtree is announced. if (object.liveRegionAtomic()) { HashSet descendants; // Collect all atomic-region descendants to detect when nodes are added/removed within the atomic region. - std::function collectDescendants = [&collectDescendants, &descendants] (AccessibilityObject& descendant) { + std::function collectDescendants = [&collectDescendants, &descendants, &objectsVisited] (AccessibilityObject& descendant) { + if (objectsVisited >= maximumSnapshotObjects) + return; + ++objectsVisited; + descendants.add(descendant.objectID()); for (auto& child : descendant.unignoredChildren()) collectDescendants(downcast(child.get())); diff -Nru webkit2gtk-2.52.3/Source/WebCore/accessibility/AXLogger.cpp webkit2gtk-2.52.5/Source/WebCore/accessibility/AXLogger.cpp --- webkit2gtk-2.52.3/Source/WebCore/accessibility/AXLogger.cpp 2026-02-23 14:40:54.921303500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/accessibility/AXLogger.cpp 2026-07-09 07:12:41.964799400 +0000 @@ -37,7 +37,9 @@ #include "AXSearchManager.h" #include "AXTextRun.h" #include "AXUtilities.h" +#include "AccessibilityNodeObject.h" #include "DocumentView.h" +#include "HTMLTableElement.h" #include "LocalFrameView.h" #include "LogInitialization.h" #include "Logging.h" diff -Nru webkit2gtk-2.52.3/Source/WebCore/accessibility/AXObjectCache.cpp webkit2gtk-2.52.5/Source/WebCore/accessibility/AXObjectCache.cpp --- webkit2gtk-2.52.3/Source/WebCore/accessibility/AXObjectCache.cpp 2026-04-16 12:20:31.605709600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/accessibility/AXObjectCache.cpp 2026-07-09 07:12:41.968799000 +0000 @@ -5672,7 +5672,7 @@ AXLOG(makeString("origin: "_s, origin.debugDescription(), " target: "_s, target.debugDescription(), " relation "_s, static_cast(relation))); if (!validRelation(origin, target, relation)) { - AX_ASSERT_NOT_REACHED(); + // Skip invalid relations (which can be created with legitimate markup, e.g. self-referential aria-owns. return false; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/accessibility/AccessibilityMenuList.cpp webkit2gtk-2.52.5/Source/WebCore/accessibility/AccessibilityMenuList.cpp --- webkit2gtk-2.52.3/Source/WebCore/accessibility/AccessibilityMenuList.cpp 2026-04-10 23:00:06.445353500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/accessibility/AccessibilityMenuList.cpp 2026-07-09 07:12:41.972799000 +0000 @@ -32,6 +32,7 @@ #include "AXObjectCache.h" #include "AccessibilityMenuListPopup.h" #include "FrameDestructionObserverInlines.h" +#include "HTMLSelectElement.h" #include "RenderMenuList.h" #include "RenderObjectDocument.h" #include @@ -61,17 +62,17 @@ return false; #if !PLATFORM(IOS_FAMILY) - RefPtr element = this->element(); + RefPtr selectElement = dynamicDowncast(element()); auto notification = AXNotification::PressDidFail; - if (CheckedPtr menuList = dynamicDowncast(renderer()); menuList && element && !element->isDisabledFormControl()) { - if (menuList->popupIsVisible()) - menuList->hidePopup(); + if (selectElement && !selectElement->isDisabledFormControl()) { + if (selectElement->popupIsVisible()) + selectElement->hidePopup(); else - menuList->showPopup(); + selectElement->showPopup(); notification = AXNotification::PressDidSucceed; } if (CheckedPtr cache = axObjectCache()) - cache->postNotification(element.get(), notification); + cache->postNotification(selectElement.get(), notification); return true; #endif return false; @@ -108,8 +109,8 @@ return true; #if !PLATFORM(IOS_FAMILY) - CheckedPtr menuList = dynamicDowncast(renderer()); - return !(menuList && menuList->popupIsVisible()); + RefPtr selectElement = dynamicDowncast(element()); + return !(selectElement && selectElement->usesMenuList() && selectElement->popupIsVisible()); #else return true; #endif diff -Nru webkit2gtk-2.52.3/Source/WebCore/accessibility/AccessibilityNodeObject.cpp webkit2gtk-2.52.5/Source/WebCore/accessibility/AccessibilityNodeObject.cpp --- webkit2gtk-2.52.3/Source/WebCore/accessibility/AccessibilityNodeObject.cpp 2026-04-15 22:37:20.119494200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/accessibility/AccessibilityNodeObject.cpp 2026-07-09 07:12:41.972799000 +0000 @@ -765,11 +765,20 @@ void AccessibilityNodeObject::updateOwnedChildrenIfNecessary() { - bool didRemoveChild = false; auto ownedObjects = this->ownedObjects(); if (ownedObjects.isEmpty()) return; + // Tracks the objects whose owned children are currently being resolved, so a re-entrant + // call for an object already on the stack can bail instead of recursing forever. + static NeverDestroyed> objectsCurrentlyResolvingOwnedChildren; + if (!objectsCurrentlyResolvingOwnedChildren->add(this).isNewEntry) + return; + auto removeOnExit = makeScopeExit([&] { + objectsCurrentlyResolvingOwnedChildren->remove(this); + }); + + bool didRemoveChild = false; for (const auto& child : ownedObjects) { if (m_children.removeFirst(child)) { // If the child already exists as a DOM child, but is also in the owned objects, then diff -Nru webkit2gtk-2.52.3/Source/WebCore/accessibility/AccessibilityObject.cpp webkit2gtk-2.52.5/Source/WebCore/accessibility/AccessibilityObject.cpp --- webkit2gtk-2.52.3/Source/WebCore/accessibility/AccessibilityObject.cpp 2026-04-10 22:57:51.450913700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/accessibility/AccessibilityObject.cpp 2026-07-09 07:12:41.976799000 +0000 @@ -698,6 +698,9 @@ auto insert = [this] (Ref&& object, unsigned index) { std::ignore = setChildIndexInParent(object.get(), index); m_children.insert(index, WTF::move(object)); + // Update child-index for children after the newly inserted object. + for (unsigned i = index + 1; i < m_children.size(); i++) + std::ignore = setChildIndexInParent(m_children[i].get(), i); }; auto thisAncestorFlags = computeAncestorFlags(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp webkit2gtk-2.52.5/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp --- webkit2gtk-2.52.3/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp 2026-03-13 11:55:51.093942900 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/accessibility/atspi/AccessibilityAtspi.cpp 2026-07-09 07:12:41.976799000 +0000 @@ -964,7 +964,7 @@ void AccessibilityAtspi::notifyLoadEvent(AccessibilityObjectAtspi& atspiObject, const CString& event) const { - if (event != "LoadComplete") + if (event != "LoadComplete"_s) return; notify(atspiObject, "AXLoadComplete", nullptr); diff -Nru webkit2gtk-2.52.3/Source/WebCore/accessibility/atspi/AccessibilityObjectComponentAtspi.cpp webkit2gtk-2.52.5/Source/WebCore/accessibility/atspi/AccessibilityObjectComponentAtspi.cpp --- webkit2gtk-2.52.3/Source/WebCore/accessibility/atspi/AccessibilityObjectComponentAtspi.cpp 2026-02-23 14:40:54.933303400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/accessibility/atspi/AccessibilityObjectComponentAtspi.cpp 2026-07-09 07:12:41.976799000 +0000 @@ -148,9 +148,10 @@ if (!m_coreObject) return false; - m_coreObject->setFocused(true); - m_coreObject->updateBackingStore(); - return m_coreObject->isFocused(); + Ref coreObject = *m_coreObject; + coreObject->setFocused(true); + coreObject->updateBackingStore(); + return coreObject->isFocused(); } float AccessibilityObjectAtspi::opacity() const diff -Nru webkit2gtk-2.52.3/Source/WebCore/accessibility/atspi/AccessibilityObjectTextAtspi.cpp webkit2gtk-2.52.5/Source/WebCore/accessibility/atspi/AccessibilityObjectTextAtspi.cpp --- webkit2gtk-2.52.3/Source/WebCore/accessibility/atspi/AccessibilityObjectTextAtspi.cpp 2026-02-23 14:40:54.934303500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/accessibility/atspi/AccessibilityObjectTextAtspi.cpp 2026-07-09 07:12:41.976799000 +0000 @@ -837,7 +837,7 @@ if (!m_coreObject->node()) return { WTF::move(defaultAttributes), -1, -1 }; - if (!*utf16Offset && m_hasListMarkerAtStart) { + if (!*utf16Offset && m_hasListMarkerAtStart && !m_coreObject->children().isEmpty()) { // Always consider list marker an independent run. auto attributes = accessibilityTextAttributes(m_coreObject->children()[0].get(), defaultAttributes); if (!includeDefault) @@ -849,7 +849,14 @@ } VisiblePosition offsetPosition = m_coreObject->visiblePositionForIndex(adjustInputOffset(*utf16Offset, m_hasListMarkerAtStart)); - RefPtr childNode = offsetPosition.deepEquivalent().deprecatedNode(); + auto deepPosition = offsetPosition.deepEquivalent(); + RefPtr childNode = deepPosition.deprecatedNode(); + // visiblePositionForIndex() may canonicalize to an equivalent position in preceding content; use + // the downstream position so childNode stays inside this object. + if (childNode && !m_coreObject->node()->contains(*childNode)) { + if (RefPtr downstreamNode = deepPosition.downstream().deprecatedNode(); m_coreObject->node()->contains(downstreamNode.get())) + childNode = WTF::move(downstreamNode); + } if (!childNode) return { WTF::move(defaultAttributes), -1, -1 }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/animation/AnimationTimelinesController.cpp webkit2gtk-2.52.5/Source/WebCore/animation/AnimationTimelinesController.cpp --- webkit2gtk-2.52.3/Source/WebCore/animation/AnimationTimelinesController.cpp 2026-02-23 14:40:54.943303300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/animation/AnimationTimelinesController.cpp 2026-07-09 07:12:41.980799000 +0000 @@ -289,7 +289,7 @@ m_cachedCurrentTimeClearanceTimer.stop(); - for (Ref timeline : m_timelines) + for (auto& timeline : copyToVectorOf>(m_timelines)) timeline->suspendAnimations(); m_isSuspended = true; diff -Nru webkit2gtk-2.52.3/Source/WebCore/animation/KeyframeEffect.cpp webkit2gtk-2.52.5/Source/WebCore/animation/KeyframeEffect.cpp --- webkit2gtk-2.52.3/Source/WebCore/animation/KeyframeEffect.cpp 2026-03-25 16:38:32.909259600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/animation/KeyframeEffect.cpp 2026-07-09 07:12:41.980799000 +0000 @@ -67,6 +67,7 @@ #include "RenderElement.h" #include "RenderObjectInlines.h" #include "RenderStyle+SettersInlines.h" +#include "ScrollTimeline.h" #include "Settings.h" #include "StyleAdjuster.h" #include "StyleEasingFunction.h" @@ -231,17 +232,19 @@ return nullptr; }; -static double computedOffset(Style::SingleAnimationRangeName rangeName, double offset, const ViewTimeline* viewTimeline, WebAnimation* animation) +static double computedOffset(Style::SingleAnimationRangeName rangeName, double offset, const ScrollTimeline* scrollTimeline, WebAnimation* animation) { if ((rangeName == Style::SingleAnimationRangeName::Normal || rangeName == Style::SingleAnimationRangeName::Omitted)) return offset; - if (!viewTimeline) + if (!scrollTimeline) return std::numeric_limits::quiet_NaN(); - Ref timeline { *viewTimeline }; + RefPtr viewTimeline = dynamicDowncast(scrollTimeline); + if (!viewTimeline) + return offset; - auto [namedRangeStartOffset, namedRangeEndOffset] = timeline->offsetIntervalForTimelineRangeName(rangeName); + auto [namedRangeStartOffset, namedRangeEndOffset] = viewTimeline->offsetIntervalForTimelineRangeName(rangeName); auto namedRangeOffsetDelta = namedRangeEndOffset - namedRangeStartOffset; auto computedOffsetWithinNamedRange = namedRangeStartOffset + offset * namedRangeOffsetDelta; @@ -252,12 +255,12 @@ if (attachmentRange.isDefault()) return computedOffsetWithinNamedRange; - auto [attachmentRangeStartOffset, attachmentRangeEndOffset] = timeline->offsetIntervalForAttachmentRange(attachmentRange); + auto [attachmentRangeStartOffset, attachmentRangeEndOffset] = viewTimeline->offsetIntervalForAttachmentRange(attachmentRange); auto attachmentRangeOffsetDelta = attachmentRangeEndOffset - attachmentRangeStartOffset; return (computedOffsetWithinNamedRange - attachmentRangeStartOffset) / attachmentRangeOffsetDelta; } -static inline void computeMissingKeyframeOffsets(Vector& keyframes, const ViewTimeline* viewTimeline, WebAnimation* animation) +static inline void computeMissingKeyframeOffsets(Vector& keyframes, const ScrollTimeline* scrollTimeline, WebAnimation* animation) { // https://drafts.csswg.org/web-animations-1/#compute-missing-keyframe-offsets @@ -276,7 +279,7 @@ auto rangeName = Style::convertRangeStringToSingleTimelineRangeName(timelineRangeOffset->rangeName); RefPtr offsetUnitValue = dynamicDowncast(timelineRangeOffset->offset); ASSERT(offsetUnitValue && offsetUnitValue->unitEnum() == CSSUnitType::CSS_PERCENTAGE); - keyframe.computedOffset = computedOffset(rangeName, offsetUnitValue->value() / 100, viewTimeline, animation); + keyframe.computedOffset = computedOffset(rangeName, offsetUnitValue->value() / 100, scrollTimeline, animation); } else { keyframesWithDoubleOrNullOffset.append(&keyframe); if (auto* doubleValue = std::get_if(&offset)) @@ -914,7 +917,7 @@ BlendingKeyframes computedBlendingKeyframes(m_blendingKeyframes.identifier()); computedBlendingKeyframes.copyKeyframes(m_blendingKeyframes); - if (computedBlendingKeyframes.hasKeyframeNotUsingRangeOffset() || activeViewTimeline()) + if (computedBlendingKeyframes.hasKeyframeNotUsingRangeOffset() || activeScrollTimeline()) computedBlendingKeyframes.fillImplicitKeyframes(*this, elementStyle); auto keyframeRules = [&]() -> const Vector> { @@ -1169,7 +1172,7 @@ // We take a slight detour from the spec text and compute the missing keyframe offsets right away // since they can be computed up-front. - computeMissingKeyframeOffsets(parsedKeyframes, activeViewTimeline().get(), animation()); + computeMissingKeyframeOffsets(parsedKeyframes, activeScrollTimeline().get(), animation()); CSSParserContext parserContext(document); @@ -2079,7 +2082,7 @@ invalidate(); updateAcceleratedActions(); - if (RefPtr viewTimeline = activeViewTimeline()) + if (RefPtr viewTimeline = activeScrollTimeline()) computeMissingKeyframeOffsets(m_parsedKeyframes, viewTimeline.get(), animation()); } @@ -2567,6 +2570,9 @@ continue; auto offset = keyframe.offset(); + if (std::isnan(offset)) + return false; + if (!offset) computedBoundsForFromKeyframe = true; if (offset == 1.0) @@ -3189,15 +3195,15 @@ }); } -RefPtr KeyframeEffect::activeViewTimeline() const +RefPtr KeyframeEffect::activeScrollTimeline() const { RefPtr animation = this->animation(); if (!animation) return nullptr; - RefPtr viewTimeline = dynamicDowncast(animation->timeline()); - if (viewTimeline && viewTimeline->currentTime()) - return viewTimeline; + RefPtr scrollTimeline = dynamicDowncast(animation->timeline()); + if (scrollTimeline && scrollTimeline->currentTime()) + return scrollTimeline; return nullptr; } @@ -3219,15 +3225,15 @@ if (!animation) return; - RefPtr viewTimeline = dynamicDowncast(animation->timeline()); - if (viewTimeline && !viewTimeline->currentTime()) + RefPtr scrollTimeline = dynamicDowncast(animation->timeline()); + if (scrollTimeline && !scrollTimeline->currentTime()) return; if (!m_parsedKeyframes.isEmpty()) - computeMissingKeyframeOffsets(m_parsedKeyframes, viewTimeline.get(), animation.get()); + computeMissingKeyframeOffsets(m_parsedKeyframes, scrollTimeline.get(), animation.get()); m_blendingKeyframes.updatedComputedOffsets([&](auto& specifiedOffset) { - return computedOffset(specifiedOffset.name, specifiedOffset.value, viewTimeline.get(), animation.get()); + return computedOffset(specifiedOffset.name, specifiedOffset.value, scrollTimeline.get(), animation.get()); }); m_needsComputedKeyframeOffsetsUpdate = false; diff -Nru webkit2gtk-2.52.3/Source/WebCore/animation/KeyframeEffect.h webkit2gtk-2.52.5/Source/WebCore/animation/KeyframeEffect.h --- webkit2gtk-2.52.3/Source/WebCore/animation/KeyframeEffect.h 2026-04-09 08:13:15.602994000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/animation/KeyframeEffect.h 2026-07-09 07:12:41.980799000 +0000 @@ -286,7 +286,7 @@ bool preventsAnimationReadiness() const final; void animationProgressBasedTimelineSourceDidChangeMetrics(const Style::SingleAnimationRange&) final; - RefPtr activeViewTimeline() const; + RefPtr activeScrollTimeline() const; void updateComputedKeyframeOffsetsIfNeeded(); // KeyframeInterpolation diff -Nru webkit2gtk-2.52.3/Source/WebCore/animation/StyleOriginatedTimelinesController.cpp webkit2gtk-2.52.5/Source/WebCore/animation/StyleOriginatedTimelinesController.cpp --- webkit2gtk-2.52.3/Source/WebCore/animation/StyleOriginatedTimelinesController.cpp 2026-03-17 13:12:55.271207800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/animation/StyleOriginatedTimelinesController.cpp 2026-07-09 07:12:41.980799000 +0000 @@ -253,13 +253,13 @@ } // Purge any inactive named timeline no longer attached to an animation. - for (auto& [name, timelines] : m_nameToTimelineMap) { + m_nameToTimelineMap.removeIf([](auto& keyValuePair) { + auto& timelines = keyValuePair.value; timelines.removeAllMatching([](auto& timeline) { return timeline->isInactiveStyleOriginatedTimeline() && timeline->relevantAnimations().isEmpty(); }); - if (timelines.isEmpty()) - m_nameToTimelineMap.remove(name); - } + return timelines.isEmpty(); + }); m_removedTimelines.clear(); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/bindings/IDLTypes.h webkit2gtk-2.52.5/Source/WebCore/bindings/IDLTypes.h --- webkit2gtk-2.52.3/Source/WebCore/bindings/IDLTypes.h 2026-02-23 14:40:54.953303300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/bindings/IDLTypes.h 2026-07-09 07:12:41.984799000 +0000 @@ -299,6 +299,7 @@ }; template struct IDLSequence : IDLType> { + static_assert(!std::is_same_v, "sequence is insecure; use a concrete type"); using InnerType = T; using ParameterType = const Vector&; @@ -306,6 +307,7 @@ }; template struct IDLFrozenArray : IDLType> { + static_assert(!std::is_same_v, "FrozenArray is insecure; use a concrete type"); using InnerType = T; using ParameterType = const Vector&; diff -Nru webkit2gtk-2.52.3/Source/WebCore/bindings/js/InternalReadableStreamDefaultReader.cpp webkit2gtk-2.52.5/Source/WebCore/bindings/js/InternalReadableStreamDefaultReader.cpp --- webkit2gtk-2.52.3/Source/WebCore/bindings/js/InternalReadableStreamDefaultReader.cpp 2026-02-23 14:40:54.955303400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/bindings/js/InternalReadableStreamDefaultReader.cpp 2026-07-09 07:12:41.984799000 +0000 @@ -159,7 +159,9 @@ return; Ref domPromise = DOMPromise::create(*globalObject, *promise); - domPromise->whenSettledWithResult([callback = WTF::move(callback)](auto* globalObject, bool isFulfilled, auto result) { + domPromise->whenSettledWithResult([domPromise, callback = WTF::move(callback)](auto* globalObject, bool isFulfilled, auto result) { + if (domPromise->activeDOMObjectAreStopped()) + return; if (isFulfilled || !globalObject) return; callback(*globalObject, result); @@ -189,7 +191,9 @@ return; Ref domPromise = DOMPromise::create(*globalObject, *promise); - domPromise->whenSettledWithResult([callback = WTF::move(callback)](auto*, bool isFulfilled, auto) { + domPromise->whenSettledWithResult([domPromise, callback = WTF::move(callback)](auto*, bool isFulfilled, auto) { + if (domPromise->activeDOMObjectAreStopped()) + return; if (isFulfilled) callback(); }); diff -Nru webkit2gtk-2.52.3/Source/WebCore/bindings/js/InternalWritableStreamWriter.cpp webkit2gtk-2.52.5/Source/WebCore/bindings/js/InternalWritableStreamWriter.cpp --- webkit2gtk-2.52.3/Source/WebCore/bindings/js/InternalWritableStreamWriter.cpp 2026-02-23 14:40:54.956303400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/bindings/js/InternalWritableStreamWriter.cpp 2026-07-09 07:12:41.984799000 +0000 @@ -168,7 +168,9 @@ return; Ref domPromise = DOMPromise::create(*globalObject, *promise); - domPromise->whenSettledWithResult([callback = WTF::move(callback)](auto* globalObject, bool isFulfilled, auto result) mutable { + domPromise->whenSettledWithResult([domPromise, callback = WTF::move(callback)](auto* globalObject, bool isFulfilled, auto result) mutable { + if (domPromise->activeDOMObjectAreStopped()) + return; if (isFulfilled || !globalObject) return; callback(*globalObject, result); @@ -196,7 +198,9 @@ return; Ref domPromise = DOMPromise::create(*globalObject, *promise); - domPromise->whenSettledWithResult([callback = WTF::move(callback)](auto*, bool isFulfilled, auto) mutable { + domPromise->whenSettledWithResult([domPromise, callback = WTF::move(callback)](auto*, bool isFulfilled, auto) mutable { + if (domPromise->activeDOMObjectAreStopped()) + return; if (!isFulfilled) return; callback(); @@ -224,7 +228,9 @@ return; Ref domPromise = DOMPromise::create(*globalObject, *promise); - domPromise->whenSettledWithResult([callback = WTF::move(callback)](auto*, bool isFulfilled, auto) mutable { + domPromise->whenSettledWithResult([domPromise, callback = WTF::move(callback)](auto*, bool isFulfilled, auto) mutable { + if (domPromise->activeDOMObjectAreStopped()) + return; callback(isFulfilled); }); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSAttrCustom.cpp webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSAttrCustom.cpp --- webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSAttrCustom.cpp 2026-02-23 14:40:54.956303400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSAttrCustom.cpp 2026-07-09 07:12:41.984799000 +0000 @@ -30,15 +30,13 @@ #include "JSAttr.h" #include "Element.h" -#include "WebCoreOpaqueRootInlines.h" namespace WebCore { template void JSAttr::visitAdditionalChildren(Visitor& visitor) { - if (SUPPRESS_UNCHECKED_LOCAL auto* element = wrapped().ownerElement()) - addWebCoreOpaqueRoot(visitor, *element); + wrapped().visitOwnerElementInGCThread(visitor); } DEFINE_VISIT_ADDITIONAL_CHILDREN(JSAttr); diff -Nru webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp --- webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp 2026-04-10 09:30:55.892680000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp 2026-07-09 07:12:41.984799000 +0000 @@ -603,10 +603,14 @@ auto compiler = JSC::Wasm::StreamingCompiler::create(vm, compilerMode, globalObject, jsCast(deferred->promise()), importObject, JSC::makeSource("handleResponseOnStreamingAction"_s, JSC::SourceOrigin(), JSC::SourceTaintedOrigin::Untainted)); if (inputResponse->isBodyReceivedByChunk()) { - inputResponse->consumeBodyReceivedByChunk([globalObject, compiler = WTF::move(compiler)](auto&& result) mutable { - VM& vm = globalObject->vm(); + inputResponse->consumeBodyReceivedByChunk([vmPtr = &vm, compiler = WTF::move(compiler)](auto&& result) mutable { + auto& vm = *vmPtr; JSLockHolder lock(vm); + auto* globalObject = compiler->globalObjectIfActive(); + if (!globalObject) + return; + if (result.hasException()) { auto exception = result.exception(); if (exception.code() == ExceptionCode::ExistingExceptionError) { diff -Nru webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSDOMOperationReturningPromise.h webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSDOMOperationReturningPromise.h --- webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSDOMOperationReturningPromise.h 2026-02-23 14:40:54.964303300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSDOMOperationReturningPromise.h 2026-07-09 07:12:41.984799000 +0000 @@ -56,10 +56,10 @@ } using Operation2 = JSC::EncodedJSValue(JSC::JSGlobalObject*, JSC::CallFrame*, ClassParameter, Ref&&, Ref&&); - template + template static JSC::EncodedJSValue callReturningPromisePair(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame& callFrame, const char* operationName) { - return callPromisePairFunction(lexicalGlobalObject, callFrame, [&operationName] (JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame& callFrame, Ref&& promise, Ref&& promise2) { + return callPromisePairFunction(lexicalGlobalObject, callFrame, [&operationName] (JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame& callFrame, Ref&& promise, Ref&& promise2) { auto* thisObject = IDLOperation::cast(lexicalGlobalObject, callFrame); if constexpr (shouldThrow != CastedThisErrorBehavior::Assert) { if (!thisObject) [[unlikely]] diff -Nru webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSDOMPromiseDeferred.cpp webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSDOMPromiseDeferred.cpp --- webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSDOMPromiseDeferred.cpp 2026-04-10 23:19:29.886143400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSDOMPromiseDeferred.cpp 2026-07-09 07:12:41.984799000 +0000 @@ -237,18 +237,30 @@ handleUncaughtException(scope, lexicalGlobalObject); } -void rejectPromiseWithExceptionIfAny(JSC::JSGlobalObject& lexicalGlobalObject, JSDOMGlobalObject& globalObject, JSPromise& promise, JSC::CatchScope& catchScope) +static JSValue takeNonTerminationException(CatchScope& catchScope) { - UNUSED_PARAM(lexicalGlobalObject); if (!catchScope.exception()) [[likely]] - return; + return { }; if (catchScope.vm().hasPendingTerminationException()) - return; + return { }; JSValue error = catchScope.exception()->value(); catchScope.clearException(); + return error; +} - DeferredPromise::create(globalObject, promise)->reject(error); +void rejectPromiseWithExceptionIfAny(JSC::JSGlobalObject&, JSDOMGlobalObject& globalObject, JSPromise& promise, JSC::CatchScope& catchScope) +{ + if (auto error = takeNonTerminationException(catchScope)) [[unlikely]] + DeferredPromise::create(globalObject, promise)->reject(error); +} + +void rejectPromisesWithExceptionIfAny(JSC::JSGlobalObject&, JSDOMGlobalObject& globalObject, JSPromise& promise1, JSPromise& promise2, JSC::CatchScope& catchScope) +{ + if (auto error = takeNonTerminationException(catchScope)) [[unlikely]] { + DeferredPromise::create(globalObject, promise1)->reject(error); + DeferredPromise::create(globalObject, promise2)->reject(error); + } } JSC::EncodedJSValue createRejectedPromiseWithTypeError(JSC::JSGlobalObject& lexicalGlobalObject, const String& errorMessage, RejectedPromiseWithTypeErrorCause cause) diff -Nru webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSDOMPromiseDeferred.h webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSDOMPromiseDeferred.h --- webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSDOMPromiseDeferred.h 2026-02-23 14:40:54.964303300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSDOMPromiseDeferred.h 2026-07-09 07:12:41.984799000 +0000 @@ -30,6 +30,7 @@ #include #include #include +#include #include namespace WebCore { @@ -358,6 +359,7 @@ void fulfillPromiseWithUint8Array(Ref&&, Uint8Array*); void fulfillPromiseWithUint8ArrayFromSpan(Ref&&, std::span); WEBCORE_EXPORT void rejectPromiseWithExceptionIfAny(JSC::JSGlobalObject&, JSDOMGlobalObject&, JSC::JSPromise&, JSC::CatchScope&); +WEBCORE_EXPORT void rejectPromisesWithExceptionIfAny(JSC::JSGlobalObject&, JSDOMGlobalObject&, JSC::JSPromise&, JSC::JSPromise&, JSC::CatchScope&); enum class RejectedPromiseWithTypeErrorCause { NativeGetter, InvalidThis }; JSC::EncodedJSValue createRejectedPromiseWithTypeError(JSC::JSGlobalObject&, const String&, RejectedPromiseWithTypeErrorCause); @@ -407,26 +409,42 @@ using PromisePairFunction = JSC::EncodedJSValue(JSC::JSGlobalObject&, JSC::CallFrame&, Ref&&, Ref&&); -template +template inline JSC::EncodedJSValue callPromisePairFunction(JSC::JSGlobalObject& lexicalGlobalObject, JSC::CallFrame& callFrame, PromisePairFunctor functor) { JSC::VM& vm = JSC::getVM(&lexicalGlobalObject); auto catchScope = DECLARE_CATCH_SCOPE(vm); auto& globalObject = *JSC::jsSecureCast(&lexicalGlobalObject); - auto* promise = JSC::JSPromise::create(vm, globalObject.promiseStructure()); - ASSERT(promise); + auto* promise1 = JSC::JSPromise::create(vm, globalObject.promiseStructure()); + ASSERT(promise1); auto* promise2 = JSC::JSPromise::create(vm, globalObject.promiseStructure()); ASSERT(promise2); - auto result = functor(globalObject, callFrame, DeferredPromise::create(globalObject, *promise, DeferredPromise::Mode::RetainPromiseOnResolve), DeferredPromise::create(globalObject, *promise2, DeferredPromise::Mode::RetainPromiseOnResolve)); + auto result = functor(globalObject, callFrame, DeferredPromise::create(globalObject, *promise1, DeferredPromise::Mode::RetainPromiseOnResolve), DeferredPromise::create(globalObject, *promise2, DeferredPromise::Mode::RetainPromiseOnResolve)); + + // The functor may have thrown — e.g. the generated missing-argument check + // returns throwVMError(...), which encodes a JSC::Exception* cell rather + // than an empty JSValue sentinel. Detect that before + // rejectPromisesWithExceptionIfAny clears the exception, so we never + // expose the raw Exception cell to JavaScript below. + bool functorThrew = !!catchScope.exception(); + + rejectPromisesWithExceptionIfAny(lexicalGlobalObject, globalObject, *promise1, *promise2, catchScope); - rejectPromiseWithExceptionIfAny(lexicalGlobalObject, globalObject, *promise, catchScope); - rejectPromiseWithExceptionIfAny(lexicalGlobalObject, globalObject, *promise2, catchScope); // FIXME: We could have error since any JS call can throw stack-overflow errors. // https://bugs.webkit.org/show_bug.cgi?id=203402 RETURN_IF_EXCEPTION(catchScope, JSC::encodedJSValue()); + // When the functor threw or returned an empty JSValue sentinel (e.g. IDL + // argument conversion failure), rebuild a valid result dictionary from the + // (now rejected) promises via convertDictionaryToJS rather than returning + // the functor's return value. + if (functorThrew || !JSC::JSValue::decode(result)) [[unlikely]] { + result = JSC::JSValue::encode(convertDictionaryToJS(lexicalGlobalObject, globalObject, DictionaryType { DOMPromise::create(globalObject, *promise1), DOMPromise::create(globalObject, *promise2) })); + RETURN_IF_EXCEPTION(catchScope, JSC::encodedJSValue()); + } + return result; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSRangeCustom.cpp webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSRangeCustom.cpp --- webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSRangeCustom.cpp 2026-01-20 14:08:44.166678700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSRangeCustom.cpp 2026-07-09 07:12:41.984799000 +0000 @@ -34,7 +34,7 @@ template void JSRange::visitAdditionalChildren(Visitor& visitor) { - wrapped().visitNodesConcurrently(visitor); + wrapped().visitNodesInGCThread(visitor); } DEFINE_VISIT_ADDITIONAL_CHILDREN(JSRange); diff -Nru webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSStyleSheetCustom.h webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSStyleSheetCustom.h --- webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSStyleSheetCustom.h 2026-02-23 14:40:54.972303200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSStyleSheetCustom.h 2026-07-09 07:12:41.984799000 +0000 @@ -35,11 +35,7 @@ inline WebCoreOpaqueRoot root(StyleSheet* styleSheet) { - if (SUPPRESS_UNCOUNTED_LOCAL CSSImportRule* ownerRule = styleSheet->ownerRule()) - return root(ownerRule); - if (SUPPRESS_UNCOUNTED_LOCAL Node* ownerNode = styleSheet->ownerNode()) - return root(ownerNode); - return WebCoreOpaqueRoot { styleSheet }; + return styleSheet->opaqueRootForGCThread(); } } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSSubscriberCustom.cpp webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSSubscriberCustom.cpp --- webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSSubscriberCustom.cpp 2026-01-20 14:08:44.170678600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSSubscriberCustom.cpp 2026-07-09 07:12:41.984799000 +0000 @@ -33,10 +33,7 @@ template void JSSubscriber::visitAdditionalChildren(Visitor& visitor) { - for (auto* teardown : wrapped().teardownCallbacksConcurrently()) - teardown->visitJSFunction(visitor); - - wrapped().observerConcurrently()->visitAdditionalChildren(visitor); + wrapped().visitAdditionalChildren(visitor); } DEFINE_VISIT_ADDITIONAL_CHILDREN(JSSubscriber); diff -Nru webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSTextTrackCueCustom.cpp webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSTextTrackCueCustom.cpp --- webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSTextTrackCueCustom.cpp 2026-02-23 14:40:54.972303200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSTextTrackCueCustom.cpp 2026-07-09 07:12:41.984799000 +0000 @@ -63,8 +63,7 @@ template void JSTextTrackCue::visitAdditionalChildren(Visitor& visitor) { - if (auto* textTrack = wrapped().track()) - addWebCoreOpaqueRoot(visitor, *textTrack); + wrapped().visitAdditionalChildren(visitor); } DEFINE_VISIT_ADDITIONAL_CHILDREN(JSTextTrackCue); diff -Nru webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp --- webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp 2026-02-23 14:40:54.973303300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSXMLHttpRequestCustom.cpp 2026-07-09 07:12:41.984799000 +0000 @@ -45,11 +45,7 @@ template void JSXMLHttpRequest::visitAdditionalChildren(Visitor& visitor) { - if (auto* upload = wrapped().optionalUpload()) - addWebCoreOpaqueRoot(visitor, *upload); - - if (SUPPRESS_UNCHECKED_LOCAL auto* responseDocument = wrapped().optionalResponseXML()) - addWebCoreOpaqueRoot(visitor, *responseDocument); + wrapped().visitAdditionalChildren(visitor); } DEFINE_VISIT_ADDITIONAL_CHILDREN(JSXMLHttpRequest); diff -Nru webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSXPathResultCustom.cpp webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSXPathResultCustom.cpp --- webkit2gtk-2.52.3/Source/WebCore/bindings/js/JSXPathResultCustom.cpp 2026-01-20 14:08:44.176678400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/bindings/js/JSXPathResultCustom.cpp 2026-07-09 07:12:41.988798900 +0000 @@ -27,21 +27,12 @@ #include "config.h" #include "JSXPathResult.h" -#include "JSNodeCustom.h" -#include "WebCoreOpaqueRootInlines.h" -#include "XPathValue.h" - namespace WebCore { template void JSXPathResult::visitAdditionalChildren(Visitor& visitor) { - auto& value = wrapped().value(); - if (value.isNodeSet()) { - // FIXME: This looks like it might race, but I'm not sure. - for (auto& node : value.toNodeSet()) - addWebCoreOpaqueRoot(visitor, node.get()); - } + wrapped().visitAdditionalChildren(visitor); } DEFINE_VISIT_ADDITIONAL_CHILDREN(JSXPathResult); diff -Nru webkit2gtk-2.52.3/Source/WebCore/bindings/js/ScriptModuleLoader.cpp webkit2gtk-2.52.5/Source/WebCore/bindings/js/ScriptModuleLoader.cpp --- webkit2gtk-2.52.3/Source/WebCore/bindings/js/ScriptModuleLoader.cpp 2026-04-10 09:30:55.894679800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/bindings/js/ScriptModuleLoader.cpp 2026-07-09 07:12:41.988798900 +0000 @@ -398,7 +398,12 @@ scriptFetcher = WorkerScriptFetcher::create(*parameters, FetchOptions::Credentials::SameOrigin, destination, ReferrerPolicy::EmptyString); } } - ASSERT(baseURL.isValid()); + + if (!baseURL.isValid()) { + scope.release(); + return rejectPromise(*m_context, globalObject, ExceptionCode::TypeError, "Cannot import a module from a document with no base URL."_s); + } + ASSERT(scriptFetcher); ASSERT(parameters); diff -Nru webkit2gtk-2.52.3/Source/WebCore/bindings/js/SerializedScriptValue.cpp webkit2gtk-2.52.5/Source/WebCore/bindings/js/SerializedScriptValue.cpp --- webkit2gtk-2.52.3/Source/WebCore/bindings/js/SerializedScriptValue.cpp 2026-04-08 07:00:10.396932400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/bindings/js/SerializedScriptValue.cpp 2026-07-09 07:12:41.988798900 +0000 @@ -36,6 +36,7 @@ #include "CryptoKeyRSA.h" #include "CryptoKeyRSAComponents.h" #include "CryptoKeyRaw.h" +#include "HTMLCanvasElement.h" #include "IDBValue.h" #include "ImageBuffer.h" #include "JSAudioWorkletGlobalScope.h" @@ -130,6 +131,7 @@ #if ENABLE(OFFSCREEN_CANVAS_IN_WORKERS) #include "JSOffscreenCanvas.h" #include "OffscreenCanvas.h" +#include "PlaceholderRenderingContext.h" #endif #if CPU(BIG_ENDIAN) || CPU(MIDDLE_ENDIAN) || CPU(NEEDS_ALIGNED_ACCESS) @@ -6053,6 +6055,70 @@ m_internals.memoryCost = computeMemoryCost(); } +static std::unique_ptr copyArrayBufferContentsArray(const std::unique_ptr& source) +{ + if (!source) + return nullptr; + auto result = makeUnique(); + result->reserveInitialCapacity(source->size()); + for (auto& content : *source) { + result->append(JSC::ArrayBufferContents()); + content.shareWith(result->last()); + } + return result; +} + +Ref SerializedScriptValue::clone() const +{ + return create(m_internals.clone()); +} + +SerializedScriptValue::Internals SerializedScriptValue::Internals::clone() const +{ + return Internals { + data, + copyArrayBufferContentsArray(arrayBufferContentsArray), +#if ENABLE(WEB_RTC) + detachedRTCDataChannels.map([](const auto& channel) { + return makeUnique(channel->identifier, channel->label.isolatedCopy(), channel->options.isolatedCopy(), channel->state); + }), +#endif +#if ENABLE(WEB_CODECS) + serializedVideoChunks, + serializedAudioChunks, + serializedVideoFrames, + serializedAudioData, +#endif +#if ENABLE(WEB_RTC) + serializedRTCEncodedAudioFrames.map([](const auto& frame) { return frame->clone(); }), + serializedRTCEncodedVideoFrames.map([](const auto& frame) { return frame->clone(); }), +#endif +#if ENABLE(MEDIA_SOURCE_IN_WORKERS) + detachedMediaSourceHandles, +#endif +#if ENABLE(MEDIA_STREAM) + serializedMediaStreamTracks.map([](const auto& track) { + return track->copy(); + }), +#endif + copyArrayBufferContentsArray(sharedBufferContentsArray), + detachedImageBitmaps, +#if ENABLE(OFFSCREEN_CANVAS_IN_WORKERS) + detachedOffscreenCanvases.map([](const auto& canvas) { + return makeUnique(canvas->size(), canvas->originClean(), RefPtr { canvas->placeholderSource() }); + }), + inMemoryOffscreenCanvases, +#endif + inMemoryMessagePorts, +#if ENABLE(WEBASSEMBLY) + wasmModulesArray ? makeUnique(*wasmModulesArray) : nullptr, + wasmMemoryHandlesArray ? makeUnique(*wasmMemoryHandlesArray) : nullptr, +#endif + blobHandles.map([](const auto& handle) { return handle.isolatedCopy(); }), + memoryCost + }; +} + SerializedScriptValue::SerializedScriptValue(Internals&& internals) : m_internals(WTF::move(internals)) { diff -Nru webkit2gtk-2.52.3/Source/WebCore/bindings/js/SerializedScriptValue.h webkit2gtk-2.52.5/Source/WebCore/bindings/js/SerializedScriptValue.h --- webkit2gtk-2.52.3/Source/WebCore/bindings/js/SerializedScriptValue.h 2026-02-23 14:40:54.977303300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/bindings/js/SerializedScriptValue.h 2026-07-09 07:12:41.988798900 +0000 @@ -149,6 +149,8 @@ enum class DeserializationBehavior : uint8_t { Fail, Succeed, LegacyMapToNull, LegacyMapToUndefined, LegacyMapToEmptyObject }; WEBCORE_EXPORT static DeserializationBehavior deserializationBehavior(JSC::JSObject&); + WEBCORE_EXPORT Ref clone() const; + private: friend struct IPC::ArgumentCoder; @@ -239,6 +241,8 @@ #endif Vector blobHandles { }; uint64_t memoryCost { 0 }; + + WEBCORE_EXPORT Internals clone() const; }; friend struct IPC::ArgumentCoder; diff -Nru webkit2gtk-2.52.3/Source/WebCore/bindings/js/WorkerModuleScriptLoader.cpp webkit2gtk-2.52.5/Source/WebCore/bindings/js/WorkerModuleScriptLoader.cpp --- webkit2gtk-2.52.3/Source/WebCore/bindings/js/WorkerModuleScriptLoader.cpp 2026-02-23 14:40:54.979303100 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/bindings/js/WorkerModuleScriptLoader.cpp 2026-07-09 07:12:41.988798900 +0000 @@ -89,7 +89,10 @@ ContentSecurityPolicyEnforcement contentSecurityPolicyEnforcement = ContentSecurityPolicyEnforcement::DoNotEnforce; if (!context.shouldBypassMainWorldContentSecurityPolicy()) { CheckedPtr contentSecurityPolicy = context.contentSecurityPolicy(); - if (fetchOptions.destination == FetchOptions::Destination::Script) { + // Worklets and scripts are governed by script-src; workers are governed by worker-src. + bool shouldEnforceScriptSrc = fetchOptions.destination == FetchOptions::Destination::Script + || isWorkletDestination(fetchOptions.destination); + if (shouldEnforceScriptSrc) { cspCheckFailed = contentSecurityPolicy && !contentSecurityPolicy->allowScriptFromSource(m_sourceURL); contentSecurityPolicyEnforcement = ContentSecurityPolicyEnforcement::EnforceScriptSrcDirective; } else { diff -Nru webkit2gtk-2.52.3/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm webkit2gtk-2.52.5/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm --- webkit2gtk-2.52.3/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm 2026-04-10 09:30:55.896679900 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm 2026-07-09 07:12:41.992798800 +0000 @@ -6480,6 +6480,11 @@ my @callFunctionTemplateArguments = (); push(@callFunctionTemplateArguments, $functionBodyName); + if ($operation->extendedAttributes->{ReturnsPromisePair}) { + my $dictClassName = GetDictionaryClassName($operation->type, $interface); + push(@callFunctionTemplateArguments, $dictClassName); + AddToImplIncludes("JSDOMPromise.h", $operation->extendedAttributes->{Conditional}); + } push(@callFunctionTemplateArguments, "CastedThisErrorBehavior::Assert") if ($operation->extendedAttributes->{PrivateIdentifier} and not $operation->extendedAttributes->{PublicIdentifier}); push(@$outputArray, "JSC_DEFINE_HOST_FUNCTION(${functionName}, (JSGlobalObject* lexicalGlobalObject, CallFrame* callFrame))\n"); diff -Nru webkit2gtk-2.52.3/Source/WebCore/contentextensions/ImmutableNFA.h webkit2gtk-2.52.5/Source/WebCore/contentextensions/ImmutableNFA.h --- webkit2gtk-2.52.3/Source/WebCore/contentextensions/ImmutableNFA.h 2026-02-23 14:40:55.018303000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/contentextensions/ImmutableNFA.h 2026-07-09 07:12:41.992798800 +0000 @@ -36,6 +36,8 @@ template struct ImmutableRange { + ImmutableRange() { zeroBytes(*this); } + uint32_t targetStart; uint32_t targetEnd; CharacterType first; diff -Nru webkit2gtk-2.52.3/Source/WebCore/contentextensions/ImmutableNFANodeBuilder.h webkit2gtk-2.52.5/Source/WebCore/contentextensions/ImmutableNFANodeBuilder.h --- webkit2gtk-2.52.3/Source/WebCore/contentextensions/ImmutableNFANodeBuilder.h 2026-02-23 14:40:55.018303000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/contentextensions/ImmutableNFANodeBuilder.h 2026-07-09 07:12:41.992798800 +0000 @@ -195,7 +195,12 @@ m_immutableNFA->targets.append(target); unsigned targetsEnd = m_immutableNFA->targets.size(); - m_immutableNFA->transitions.append(ImmutableRange { targetsStart, targetsEnd, range.first, range.last }); + ImmutableRange transition; + transition.targetStart = targetsStart; + transition.targetEnd = targetsEnd; + transition.first = range.first; + transition.last = range.last; + m_immutableNFA->transitions.append(WTF::move(transition)); } unsigned transitionsEnd = m_immutableNFA->transitions.size(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/css/CSSFontFace.cpp webkit2gtk-2.52.5/Source/WebCore/css/CSSFontFace.cpp --- webkit2gtk-2.52.3/Source/WebCore/css/CSSFontFace.cpp 2026-02-23 14:40:55.039302800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/css/CSSFontFace.cpp 2026-07-09 07:12:41.992798800 +0000 @@ -56,8 +56,10 @@ static void iterateClients(WeakHashSet& clients, NOESCAPE const Function& callback) { - for (auto& client : copyToVectorOf>(clients)) - callback(client); + for (auto& client : copyToVectorOf>(clients)) { + if (clients.contains(client)) + callback(client); + } } void CSSFontFace::appendSources(CSSFontFace& fontFace, CSSValueList& srcList, ScriptExecutionContext* context, bool isInitiatingElementInUserAgentShadowTree) diff -Nru webkit2gtk-2.52.3/Source/WebCore/css/CSSFontFaceSet.cpp webkit2gtk-2.52.5/Source/WebCore/css/CSSFontFaceSet.cpp --- webkit2gtk-2.52.3/Source/WebCore/css/CSSFontFaceSet.cpp 2026-02-23 14:40:55.040303000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/css/CSSFontFaceSet.cpp 2026-07-09 07:12:41.992798800 +0000 @@ -400,7 +400,7 @@ return result; } -ExceptionOr>> CSSFontFaceSet::matchingFacesExcludingPreinstalledFonts(ScriptExecutionContext& context, const String& fontShorthand, const String& string) +ExceptionOr>> CSSFontFaceSet::matchingFacesExcludingPreinstalledFonts(ScriptExecutionContext& context, const String& fontShorthand, const String& string) { auto font = CSSPropertyParserHelpers::parseUnresolvedFont(fontShorthand, context); if (!font) @@ -446,7 +446,7 @@ } } - return WTF::map(resultConstituents, [](auto* constituent) -> std::reference_wrapper { + return WTF::map(resultConstituents, [](auto* constituent) -> Ref { return *constituent; }); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/css/CSSFontFaceSet.h webkit2gtk-2.52.5/Source/WebCore/css/CSSFontFaceSet.h --- webkit2gtk-2.52.3/Source/WebCore/css/CSSFontFaceSet.h 2026-04-10 23:17:24.844883400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/css/CSSFontFaceSet.h 2026-07-09 07:12:41.992798800 +0000 @@ -90,7 +90,7 @@ size_t facesPartitionIndex() const { return m_facesPartitionIndex; } - ExceptionOr>> matchingFacesExcludingPreinstalledFonts(ScriptExecutionContext&, const String& font, const String& text); + ExceptionOr>> matchingFacesExcludingPreinstalledFonts(ScriptExecutionContext&, const String& font, const String& text); // FIXME: Should this be implemented? void updateStyleIfNeeded(CSSFontFace&) final { } diff -Nru webkit2gtk-2.52.3/Source/WebCore/css/CSSImportRule.cpp webkit2gtk-2.52.5/Source/WebCore/css/CSSImportRule.cpp --- webkit2gtk-2.52.3/Source/WebCore/css/CSSImportRule.cpp 2026-02-23 14:40:55.045302900 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/css/CSSImportRule.cpp 2026-07-09 07:12:41.992798800 +0000 @@ -35,6 +35,8 @@ namespace WebCore { +WTF_MAKE_TZONE_ALLOCATED_IMPL(CSSImportRule); + CSSImportRule::CSSImportRule(StyleRuleImport& importRule, CSSStyleSheet* parent) : CSSRule(parent) , m_importRule(importRule) diff -Nru webkit2gtk-2.52.3/Source/WebCore/css/CSSImportRule.h webkit2gtk-2.52.5/Source/WebCore/css/CSSImportRule.h --- webkit2gtk-2.52.3/Source/WebCore/css/CSSImportRule.h 2026-02-23 14:40:55.045302900 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/css/CSSImportRule.h 2026-07-09 07:12:41.992798800 +0000 @@ -22,6 +22,7 @@ #pragma once #include +#include namespace WebCore { @@ -33,7 +34,9 @@ using MediaQueryList = Vector; } -class CSSImportRule final : public CSSRule { +class CSSImportRule final : public CSSRule, public CanMakeCheckedPtr { + WTF_MAKE_TZONE_ALLOCATED(CSSImportRule); + WTF_OVERRIDE_DELETE_FOR_CHECKED_PTR(CSSImportRule); public: static Ref create(StyleRuleImport& rule, CSSStyleSheet* sheet) { return adoptRef(*new CSSImportRule(rule, sheet)); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/css/CSSPseudoSelectors.json webkit2gtk-2.52.5/Source/WebCore/css/CSSPseudoSelectors.json --- webkit2gtk-2.52.3/Source/WebCore/css/CSSPseudoSelectors.json 2026-02-23 14:40:55.051303000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/css/CSSPseudoSelectors.json 2026-07-09 07:12:41.996798500 +0000 @@ -189,6 +189,9 @@ }, "only-child": {}, "only-of-type": {}, + "open": { + "settings-flag": "openPseudoClassEnabled" + }, "optional": {}, "out-of-range": {}, "past": { diff -Nru webkit2gtk-2.52.3/Source/WebCore/css/CSSStyleSheet.cpp webkit2gtk-2.52.5/Source/WebCore/css/CSSStyleSheet.cpp --- webkit2gtk-2.52.3/Source/WebCore/css/CSSStyleSheet.cpp 2026-02-23 14:40:55.054302700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/css/CSSStyleSheet.cpp 2026-07-09 07:12:41.996798500 +0000 @@ -30,6 +30,7 @@ #include "HTMLStyleElement.h" #include "JSCSSStyleSheet.h" #include "JSDOMPromiseDeferred.h" +#include "JSNodeCustomInlines.h" #include "Logging.h" #include "MediaList.h" #include "MediaQueryParser.h" @@ -276,14 +277,33 @@ void CSSStyleSheet::clearOwnerNode() { + Locker locker { m_opaqueRootLockForGC }; m_ownerNode = nullptr; } +WebCoreOpaqueRoot CSSStyleSheet::opaqueRootForGCThread() +{ + Locker locker { m_opaqueRootLockForGC }; + if (m_ownerNode) + return root(m_ownerNode.get()); + if (auto* ownerRule = m_ownerRule.get()) { + if (auto* parentSheet = ownerRule->parentStyleSheet()) + return parentSheet->opaqueRootForGCThread(); + } + return WebCoreOpaqueRoot { this }; +} + CSSImportRule* CSSStyleSheet::ownerRule() const { return m_ownerRule.get(); } +void CSSStyleSheet::clearOwnerRule() +{ + Locker locker { m_opaqueRootLockForGC }; + m_ownerRule = nullptr; +} + void CSSStyleSheet::reattachChildRuleCSSOMWrappers() { for (unsigned i = 0; i < m_childRuleCSSOMWrappers.size(); ++i) { diff -Nru webkit2gtk-2.52.3/Source/WebCore/css/CSSStyleSheet.h webkit2gtk-2.52.5/Source/WebCore/css/CSSStyleSheet.h --- webkit2gtk-2.52.3/Source/WebCore/css/CSSStyleSheet.h 2026-02-23 14:40:55.054302700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/css/CSSStyleSheet.h 2026-07-09 07:12:41.996798500 +0000 @@ -26,8 +26,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -105,7 +107,7 @@ URL baseURL() const final; bool isLoading() const final; - void clearOwnerRule() { m_ownerRule = nullptr; } + void clearOwnerRule(); void removeAdoptingTreeScope(ContainerNode&); void addAdoptingTreeScope(ContainerNode&); @@ -162,6 +164,8 @@ String cssText(const CSS::SerializationContext&); void getChildStyleSheets(HashSet>&); + WebCoreOpaqueRoot opaqueRootForGCThread() override; + bool isDetached() const; private: @@ -188,8 +192,9 @@ WeakPtr m_constructorDocument; WeakHashSet m_adoptingTreeScopes; - WeakPtr m_ownerNode; - WeakPtr m_ownerRule; + mutable Lock m_opaqueRootLockForGC; + CheckedPtr m_ownerNode; + CheckedPtr m_ownerRule; TextPosition m_startPosition; diff -Nru webkit2gtk-2.52.3/Source/WebCore/css/FontFace.cpp webkit2gtk-2.52.5/Source/WebCore/css/FontFace.cpp --- webkit2gtk-2.52.3/Source/WebCore/css/FontFace.cpp 2026-02-23 14:40:55.061302700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/css/FontFace.cpp 2026-07-09 07:12:41.996798500 +0000 @@ -361,7 +361,7 @@ auto FontFace::loadForBindings() -> LoadedPromise& { m_mayLoadedPromiseBeScriptObservable = true; - m_backing->load(); + protect(m_backing)->load(); return m_loadedPromise.get(); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/css/FontFaceSet.cpp webkit2gtk-2.52.5/Source/WebCore/css/FontFaceSet.cpp --- webkit2gtk-2.52.3/Source/WebCore/css/FontFaceSet.cpp 2026-04-10 09:30:55.897679800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/css/FontFaceSet.cpp 2026-07-09 07:12:41.996798500 +0000 @@ -166,8 +166,8 @@ return; } - for (auto& face : matchingFaces) - face.get().load(); + for (Ref face : matchingFaces) + face->load(); if (auto document = dynamicDowncast(scriptExecutionContext())) { if (document->quirks().shouldEnableFontLoadingAPIQuirk()) { @@ -180,23 +180,23 @@ // See also: https://github.com/w3c/csswg-drafts/issues/7680 bool hasSource = false; - for (auto& face : matchingFaces) { - if (face.get().sourceCount()) { + for (Ref face : matchingFaces) { + if (face->sourceCount()) { hasSource = true; break; } } if (!hasSource) { promise.resolve(matchingFaces.map([scriptExecutionContext = CheckedPtr { scriptExecutionContext() }] (const auto& matchingFace) { - return matchingFace.get().wrapper(scriptExecutionContext.get()); + return matchingFace->wrapper(scriptExecutionContext.get()); })); return; } } } - for (auto& face : matchingFaces) { - if (face.get().status() == CSSFontFace::Status::Failure) { + for (Ref face : matchingFaces) { + if (face->status() == CSSFontFace::Status::Failure) { promise.reject(ExceptionCode::NetworkError); return; } @@ -205,13 +205,13 @@ auto pendingPromise = PendingPromise::create(WTF::move(promise)); bool waiting = false; - for (auto& face : matchingFaces) { + for (Ref face : matchingFaces) { pendingPromise->faces.append(face.get().wrapper(protectedScriptExecutionContext().get())); - if (face.get().status() == CSSFontFace::Status::Success) + if (face->status() == CSSFontFace::Status::Success) continue; waiting = true; - ASSERT(face.get().existingWrapper()); - m_pendingPromises.add(face.get().existingWrapper(), Vector>()).iterator->value.append(pendingPromise.copyRef()); + ASSERT(face->existingWrapper()); + m_pendingPromises.add(face->existingWrapper(), Vector>()).iterator->value.append(pendingPromise.copyRef()); } if (!waiting) diff -Nru webkit2gtk-2.52.3/Source/WebCore/css/SelectorChecker.cpp webkit2gtk-2.52.5/Source/WebCore/css/SelectorChecker.cpp --- webkit2gtk-2.52.3/Source/WebCore/css/SelectorChecker.cpp 2026-02-23 14:40:55.063302800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/css/SelectorChecker.cpp 2026-07-09 07:12:41.996798500 +0000 @@ -1216,6 +1216,9 @@ case CSSSelector::PseudoClass::InternalMediaDocument: return isMediaDocument(element); + case CSSSelector::PseudoClass::Open: + return matchesOpenPseudoClass(element); + case CSSSelector::PseudoClass::PopoverOpen: return matchesPopoverOpenPseudoClass(element); diff -Nru webkit2gtk-2.52.3/Source/WebCore/css/SelectorCheckerTestFunctions.h webkit2gtk-2.52.5/Source/WebCore/css/SelectorCheckerTestFunctions.h --- webkit2gtk-2.52.3/Source/WebCore/css/SelectorCheckerTestFunctions.h 2026-02-23 14:40:55.063302800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/css/SelectorCheckerTestFunctions.h 2026-07-09 07:12:41.996798500 +0000 @@ -30,12 +30,14 @@ #include "FocusController.h" #include "FrameDestructionObserverInlines.h" #include "FrameSelection.h" +#include "HTMLDetailsElement.h" #include "HTMLDialogElement.h" #include "HTMLFrameElement.h" #include "HTMLIFrameElement.h" #include "HTMLImageElement.h" #include "HTMLInputElement.h" #include "HTMLOptionElement.h" +#include "HTMLSelectElement.h" #include "InspectorInstrumentation.h" #include "LocalFrameInlines.h" #include "Page.h" @@ -589,6 +591,20 @@ return element.isPopoverShowing(); } +ALWAYS_INLINE bool matchesOpenPseudoClass(const Element& element) +{ + if (auto* dialog = dynamicDowncast(element)) + return dialog->isOpen(); + if (auto* details = dynamicDowncast(element)) + return details->isOpen(); + if (auto* select = dynamicDowncast(element)) + return select->isOpen(); + if (auto* input = dynamicDowncast(element)) + return input->isPresentingAttachedView(); + + return false; +} + ALWAYS_INLINE bool matchesUserInvalidPseudoClass(const Element& element) { return element.matchesUserInvalidPseudoClass(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/css/StyleSheet.h webkit2gtk-2.52.5/Source/WebCore/css/StyleSheet.h --- webkit2gtk-2.52.3/Source/WebCore/css/StyleSheet.h 2026-02-23 14:40:55.066302800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/css/StyleSheet.h 2026-07-09 07:12:41.996798500 +0000 @@ -34,6 +34,7 @@ class MediaList; class Node; class StyleSheet; +class WebCoreOpaqueRoot; class StyleSheet : public RefCounted { public: @@ -50,6 +51,7 @@ virtual CSSImportRule* ownerRule() const { return nullptr; } virtual void clearOwnerNode() = 0; + virtual WebCoreOpaqueRoot opaqueRootForGCThread() = 0; virtual URL baseURL() const = 0; virtual bool isLoading() const = 0; virtual bool isCSSStyleSheet() const { return false; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/css/calc/CSSCalcTree+Evaluation.cpp webkit2gtk-2.52.5/Source/WebCore/css/calc/CSSCalcTree+Evaluation.cpp --- webkit2gtk-2.52.3/Source/WebCore/css/calc/CSSCalcTree+Evaluation.cpp 2026-02-23 14:40:55.068302600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/css/calc/CSSCalcTree+Evaluation.cpp 2026-07-09 07:12:41.996798500 +0000 @@ -202,7 +202,7 @@ return { }; auto max = evaluate(root->max, options); - if (!min) + if (!max) return { }; auto step = evaluate(root->step, options); diff -Nru webkit2gtk-2.52.3/Source/WebCore/css/calc/CSSCalcTree+Parser.cpp webkit2gtk-2.52.5/Source/WebCore/css/calc/CSSCalcTree+Parser.cpp --- webkit2gtk-2.52.3/Source/WebCore/css/calc/CSSCalcTree+Parser.cpp 2026-02-23 14:40:55.068302600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/css/calc/CSSCalcTree+Parser.cpp 2026-07-09 07:12:41.996798500 +0000 @@ -996,6 +996,40 @@ return typedValue; } +// Parse the fallback value specified in anchor() and anchor-size() as a or +// . Additionally, unitless zero is allowed and gets treated as 0px. +static std::optional consumeAnchorFallback(CSSParserTokenRange& tokens, int depth, ParserState& state) +{ + auto typedFallback = consumeValueWithoutSimplifyingCalc(tokens, depth, state); + if (!typedFallback) + return { }; + + auto category = typedFallback->type.calculationCategory(); + if (!category) + return { }; + + switch (*category) { + case CSS::Category::Length: + case CSS::Category::LengthPercentage: + return typedFallback; + + case CSS::Category::Number: { + if (state.parserOptions.propertyOptions.unitlessZeroLength != UnitlessZeroQuirk::Allow) + return { }; + + // Allow unitless 0. + auto value = std::get(typedFallback->child.value); + if (value.value) + return { }; + + return TypedChild { makeNumeric(0, CSSUnitType::CSS_PX), Type::makeLength() }; + } + + default: + return { }; + } +} + static std::optional consumeAnchor(CSSParserTokenRange& tokens, int depth, ParserState& state) { // = anchor( ? && , ? ) @@ -1047,17 +1081,15 @@ std::optional fallback; if (CSSPropertyParserHelpers::consumeCommaIncludingWhitespace(tokens)) { - auto typedFallback = consumeValueWithoutSimplifyingCalc(tokens, depth, state); - if (!typedFallback) + auto maybeFallback = consumeAnchorFallback(tokens, depth, state); + if (!maybeFallback) return { }; - auto category = typedFallback->type.calculationCategory(); - if (!category) - return { }; - if (*category != CSS::Category::Length && *category != CSS::Category::LengthPercentage) - return { }; + fallback = WTF::move(maybeFallback->child); + + auto category = maybeFallback->type.calculationCategory(); + ASSERT(category && (category == CSS::Category::Length || category == CSS::Category::LengthPercentage)); - fallback = WTF::move(typedFallback->child); type.percentHint = Type::determinePercentHint(*category); } @@ -1122,7 +1154,7 @@ // if a comma follows... if (CSSPropertyParserHelpers::consumeCommaIncludingWhitespace(tokens)) { // it must be followed by the fallback value. - fallback = consumeValueWithoutSimplifyingCalc(tokens, depth, state); + fallback = consumeAnchorFallback(tokens, depth, state); if (!fallback) return { }; } @@ -1130,21 +1162,15 @@ } else { // if and is not present // then an optional fallback value follows - fallback = consumeValueWithoutSimplifyingCalc(tokens, depth, state); + fallback = consumeAnchorFallback(tokens, depth, state); } + // Return type of this function. It's a if it can be resolved, otherwise the + // fallback is resolved, which could be a percentage. auto type = Type::makeLength(); - - // anchor-size() resolves to a if it can be resolved, otherwise the fallback - // value is resolved, which is of type . Therefore the overall type - // of anchor-size() is or , depending on the type of the - // fallback value. if (fallback) { auto category = fallback->type.calculationCategory(); - if (!category) - return { }; - if (*category != CSS::Category::Length && *category != CSS::Category::LengthPercentage) - return { }; + ASSERT(category && (category == CSS::Category::Length || category == CSS::Category::LengthPercentage)); type.percentHint = Type::determinePercentHint(*category); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/css/parser/CSSParserContext.cpp webkit2gtk-2.52.5/Source/WebCore/css/parser/CSSParserContext.cpp --- webkit2gtk-2.52.3/Source/WebCore/css/parser/CSSParserContext.cpp 2026-04-08 07:45:11.647912700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/css/parser/CSSParserContext.cpp 2026-07-09 07:12:41.996798500 +0000 @@ -122,6 +122,7 @@ , cssTextTransformMathAutoEnabled { settings.cssTextTransformMathAutoEnabled() } , cssInternalAutoBaseParsingEnabled { settings.cssInternalAutoBaseParsingEnabled() } , cssMathDepthEnabled { settings.cssMathDepthEnabled() } + , openPseudoClassEnabled { settings.openPseudoClassEnabled() } , propertySettings { CSSPropertySettings { settings } } { } @@ -160,7 +161,8 @@ | context.cssTextDecorationLineErrorValues << 25 | context.cssTextTransformMathAutoEnabled << 26 | context.cssInternalAutoBaseParsingEnabled << 27 - | context.cssMathDepthEnabled << 28; + | context.cssMathDepthEnabled << 28 + | context.openPseudoClassEnabled << 29; add(hasher, context.baseURL, context.charset, context.propertySettings, context.mode, bits); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/css/parser/CSSParserContext.h webkit2gtk-2.52.5/Source/WebCore/css/parser/CSSParserContext.h --- webkit2gtk-2.52.3/Source/WebCore/css/parser/CSSParserContext.h 2026-02-23 14:40:55.072302800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/css/parser/CSSParserContext.h 2026-07-09 07:12:41.996798500 +0000 @@ -87,6 +87,7 @@ bool cssInternalAutoBaseParsingEnabled : 1 { false }; bool webkitMediaTextTrackDisplayQuirkEnabled : 1 { false }; bool cssMathDepthEnabled : 1 { false }; + bool openPseudoClassEnabled : 1 { false }; // Settings, those affecting properties. CSSPropertySettings propertySettings; diff -Nru webkit2gtk-2.52.3/Source/WebCore/css/parser/CSSSelectorParserContext.cpp webkit2gtk-2.52.5/Source/WebCore/css/parser/CSSSelectorParserContext.cpp --- webkit2gtk-2.52.3/Source/WebCore/css/parser/CSSSelectorParserContext.cpp 2026-02-23 14:40:55.081302600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/css/parser/CSSSelectorParserContext.cpp 2026-07-09 07:12:42.000798500 +0000 @@ -43,6 +43,7 @@ , thumbAndTrackPseudoElementsEnabled(context.thumbAndTrackPseudoElementsEnabled) , viewTransitionsEnabled(context.propertySettings.viewTransitionsEnabled) , webkitMediaTextTrackDisplayQuirkEnabled(context.webkitMediaTextTrackDisplayQuirkEnabled) + , openPseudoClassEnabled(context.openPseudoClassEnabled) { } @@ -56,6 +57,7 @@ , thumbAndTrackPseudoElementsEnabled(document.settings().thumbAndTrackPseudoElementsEnabled()) , viewTransitionsEnabled(document.settings().viewTransitionsEnabled()) , webkitMediaTextTrackDisplayQuirkEnabled(document.quirks().needsWebKitMediaTextTrackDisplayQuirk()) + , openPseudoClassEnabled(document.settings().openPseudoClassEnabled()) { } @@ -70,7 +72,8 @@ context.targetTextPseudoElementEnabled, context.thumbAndTrackPseudoElementsEnabled, context.viewTransitionsEnabled, - context.webkitMediaTextTrackDisplayQuirkEnabled + context.webkitMediaTextTrackDisplayQuirkEnabled, + context.openPseudoClassEnabled ); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/css/parser/CSSSelectorParserContext.h webkit2gtk-2.52.5/Source/WebCore/css/parser/CSSSelectorParserContext.h --- webkit2gtk-2.52.3/Source/WebCore/css/parser/CSSSelectorParserContext.h 2026-02-23 14:40:55.082302600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/css/parser/CSSSelectorParserContext.h 2026-07-09 07:12:42.000798500 +0000 @@ -44,6 +44,7 @@ bool thumbAndTrackPseudoElementsEnabled : 1 { false }; bool viewTransitionsEnabled : 1 { false }; bool webkitMediaTextTrackDisplayQuirkEnabled : 1 { false }; + bool openPseudoClassEnabled : 1 { false }; bool isHashTableDeletedValue : 1 { false }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/cssjit/SelectorCompiler.cpp webkit2gtk-2.52.5/Source/WebCore/cssjit/SelectorCompiler.cpp --- webkit2gtk-2.52.3/Source/WebCore/cssjit/SelectorCompiler.cpp 2026-02-23 14:40:55.110302400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/cssjit/SelectorCompiler.cpp 2026-07-09 07:12:42.000798500 +0000 @@ -127,6 +127,7 @@ v(operationHasAttachment) \ v(operationMatchesDir) \ v(operationMatchesLangPseudoClass) \ + v(operationMatchesOpenPseudoClass) \ v(operationMatchesPopoverOpenPseudoClass) \ v(operationMatchesModalPseudoClass) \ v(operationMatchesHtmlDocumentPseudoClass) \ @@ -283,6 +284,7 @@ static JSC_DECLARE_NOEXCEPT_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationHasAttachment, bool, (const Element&)); #endif static JSC_DECLARE_NOEXCEPT_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationMatchesHtmlDocumentPseudoClass, bool, (const Element&)); +static JSC_DECLARE_NOEXCEPT_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationMatchesOpenPseudoClass, bool, (const Element&)); static JSC_DECLARE_NOEXCEPT_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationMatchesPopoverOpenPseudoClass, bool, (const Element&)); static JSC_DECLARE_NOEXCEPT_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationMatchesModalPseudoClass, bool, (const Element&)); static JSC_DECLARE_NOEXCEPT_JIT_OPERATION_WITHOUT_WTF_INTERNAL(operationMatchesActiveViewTransitionPseudoClass, bool, (const Element&)); @@ -1029,6 +1031,12 @@ return matchesPopoverOpenPseudoClass(element); } +JSC_DEFINE_NOEXCEPT_JIT_OPERATION(operationMatchesOpenPseudoClass, bool, (const Element& element)) +{ + COUNT_SELECTOR_OPERATION(operationMatchesOpenPseudoClass); + return matchesOpenPseudoClass(element); +} + JSC_DEFINE_NOEXCEPT_JIT_OPERATION(operationMatchesModalPseudoClass, bool, (const Element& element)) { COUNT_SELECTOR_OPERATION(operationMatchesModalPseudoClass); @@ -1200,6 +1208,10 @@ fragment.unoptimizedPseudoClasses.append(CodePtr(operationMatchesPopoverOpenPseudoClass)); return FunctionType::SimpleSelectorChecker; + case CSSSelector::PseudoClass::Open: + fragment.unoptimizedPseudoClasses.append(CodePtr(operationMatchesOpenPseudoClass)); + return FunctionType::SimpleSelectorChecker; + case CSSSelector::PseudoClass::Modal: fragment.unoptimizedPseudoClasses.append(CodePtr(operationMatchesModalPseudoClass)); return FunctionType::SimpleSelectorChecker; diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/Attr.cpp webkit2gtk-2.52.5/Source/WebCore/dom/Attr.cpp --- webkit2gtk-2.52.3/Source/WebCore/dom/Attr.cpp 2026-02-23 14:40:55.112302500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/Attr.cpp 2026-07-09 07:12:42.000798500 +0000 @@ -39,10 +39,16 @@ #include "TextNodeTraversal.h" #include "TreeScopeInlines.h" #include "TrustedType.h" +#include "WebCoreOpaqueRootInlines.h" #include "XMLNSNames.h" #include #include +namespace JSC { +class AbstractSlotVisitor; +class SlotVisitor; +} + namespace WebCore { WTF_MAKE_TZONE_ALLOCATED_IMPL(Attr); @@ -170,16 +176,33 @@ ASSERT(m_element); ASSERT(m_standaloneValue.isNull()); m_standaloneValue = value; - m_element = nullptr; + { + Locker locker { m_elementLockForGC }; + m_element = nullptr; + } setTreeScopeRecursively(Ref { document() }); } void Attr::attachToElement(Element& element) { ASSERT(!m_element); - m_element = element; + { + Locker locker { m_elementLockForGC }; + m_element = &element; + } m_standaloneValue = nullAtom(); setTreeScopeRecursively(element.treeScope()); } +template +void Attr::visitOwnerElementInGCThread(Visitor& visitor) +{ + Locker locker { m_elementLockForGC }; + if (m_element) + addWebCoreOpaqueRoot(visitor, *m_element); +} + +template void Attr::visitOwnerElementInGCThread(JSC::AbstractSlotVisitor&); +template void Attr::visitOwnerElementInGCThread(JSC::SlotVisitor&); + } diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/Attr.h webkit2gtk-2.52.5/Source/WebCore/dom/Attr.h --- webkit2gtk-2.52.3/Source/WebCore/dom/Attr.h 2026-02-23 14:40:55.112302500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/Attr.h 2026-07-09 07:12:42.000798500 +0000 @@ -26,6 +26,7 @@ #include #include +#include namespace WebCore { @@ -50,14 +51,16 @@ const QualifiedName& qualifiedName() const { return m_name; } + const AtomString& namespaceURI() const final { return m_name.namespaceURI(); } + const AtomString& localName() const final { return m_name.localName(); } + const AtomString& prefix() const final { return m_name.prefix(); } + WEBCORE_EXPORT CSSStyleProperties* style(); void attachToElement(Element&); void detachFromElementWithValue(const AtomString&); - const AtomString& namespaceURI() const final { return m_name.namespaceURI(); } - const AtomString& localName() const final { return m_name.localName(); } - const AtomString& prefix() const final { return m_name.prefix(); } + template void visitOwnerElementInGCThread(Visitor&); private: Attr(Element&, const QualifiedName&); @@ -77,11 +80,11 @@ // Attr wraps either an element/name, or a name/value pair (when it's a standalone Node.) // Note that m_name is always set, but m_element/m_standaloneValue may be null. - WeakPtr m_element; + CheckedPtr m_element; QualifiedName m_name; AtomString m_standaloneValue; - RefPtr m_style; + mutable Lock m_elementLockForGC; }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/ContainerNode.cpp webkit2gtk-2.52.5/Source/WebCore/dom/ContainerNode.cpp --- webkit2gtk-2.52.3/Source/WebCore/dom/ContainerNode.cpp 2026-02-23 14:40:55.118302300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/ContainerNode.cpp 2026-07-09 07:12:42.000798500 +0000 @@ -827,7 +827,8 @@ Ref protectedThis { *this }; ChildListMutationScope mutation(*this); NodeVector removedChildren; - auto replacedAllChildren = is(*node) || removeAllChildrenWithScriptAssertionMaybeAsync(ChildChange::Source::API, removedChildren, DeferChildrenChanged::No).didRemoveElements == DidRemoveElements::Yes + auto removeResult = removeAllChildrenWithScriptAssertionMaybeAsync(ChildChange::Source::API, removedChildren, DeferChildrenChanged::No); + auto replacedAllChildren = is(*node) || removeResult.didRemoveElements == DidRemoveElements::Yes ? ReplacedAllChildren::YesIncludingElements : ReplacedAllChildren::YesNotIncludingElements; executeNodeInsertionWithScriptAssertion(*this, *node, nullptr, ChildChange::Source::API, replacedAllChildren, [&] { diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/ContainerNodeAlgorithms.cpp webkit2gtk-2.52.5/Source/WebCore/dom/ContainerNodeAlgorithms.cpp --- webkit2gtk-2.52.3/Source/WebCore/dom/ContainerNodeAlgorithms.cpp 2026-02-23 14:40:55.119302500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/ContainerNodeAlgorithms.cpp 2026-07-09 07:12:42.000798500 +0000 @@ -173,6 +173,7 @@ next = node->nextSibling(); node->setNextSibling(nullptr); node->setParentNode(nullptr); + node->resetShadowIncludingRoot(); container.setFirstChild(next.get()); if (next) next->setPreviousSibling(nullptr); @@ -180,6 +181,8 @@ node->setTreeScopeRecursively(Ref { container.document() }); if (node->isInTreeScope()) notifyChildNodeRemoved(container, *node); + else if (node->refCount() > 1) + node->updateShadowIncludingRootForSubtree(); ASSERT_WITH_SECURITY_IMPLICATION(!node->isInTreeScope()); } } diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/ContainerNodeInlines.h webkit2gtk-2.52.5/Source/WebCore/dom/ContainerNodeInlines.h --- webkit2gtk-2.52.3/Source/WebCore/dom/ContainerNodeInlines.h 2026-02-23 14:40:55.119302500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/ContainerNodeInlines.h 2026-07-09 07:12:42.000798500 +0000 @@ -34,7 +34,7 @@ { if (isInTreeScope()) return treeScope().rootNode(); - return traverseToRootNode(); + return downcast(shadowIncludingRoot()); } inline Ref ContainerNode::protectedRootNode() const diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/Document.cpp webkit2gtk-2.52.5/Source/WebCore/dom/Document.cpp --- webkit2gtk-2.52.3/Source/WebCore/dom/Document.cpp 2026-04-09 13:18:25.657725300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/Document.cpp 2026-07-09 07:12:42.004798400 +0000 @@ -1240,7 +1240,7 @@ ExceptionOr> Document::parseHTMLUnsafe(Document& context, Variant, String>&& html) { - auto stringValueHolder = trustedTypeCompliantString(context.contextDocument(), WTF::move(html), "Document parseHTMLUnsafe"_s); + auto stringValueHolder = trustedTypeCompliantString(protect(context.contextDocument()), WTF::move(html), "Document parseHTMLUnsafe"_s); if (stringValueHolder.hasException()) return stringValueHolder.releaseException(); @@ -4583,7 +4583,7 @@ } String textString = text.toString(); - auto stringValueHolder = trustedTypeCompliantString(TrustedType::TrustedHTML, contextDocument(), textString, lineFeed.isEmpty() ? "Document write"_s : "Document writeln"_s); + auto stringValueHolder = trustedTypeCompliantString(TrustedType::TrustedHTML, protect(contextDocument()), textString, lineFeed.isEmpty() ? "Document write"_s : "Document writeln"_s); if (stringValueHolder.hasException()) return stringValueHolder.releaseException(); SegmentedString trustedText(stringValueHolder.releaseReturnValue()); @@ -7996,7 +7996,7 @@ [&commandName, this](const String& str) -> ExceptionOr { if (commandName != "insertHTML"_s) return String(str); - return trustedTypeCompliantString(TrustedType::TrustedHTML, contextDocument(), str, "Document execCommand"_s); + return trustedTypeCompliantString(TrustedType::TrustedHTML, protect(contextDocument()), str, "Document execCommand"_s); }, [](const RefPtr& trustedHtml) -> ExceptionOr { return trustedHtml->toString(); @@ -8102,6 +8102,12 @@ if (transformSourceDocument() || !processingInstruction->sheet()) return; + // Don't attempt to compile a stylesheet whose import chain is still loading. + // Compiling a partially-loaded tree can cause libxslt to free imported docs + // that WebKit still references, leading to use-after-free. + if (processingInstruction->sheet()->isLoading()) + continue; + // If the Document has already been detached from the frame, or the frame is currently in the process of // changing to a new document, don't attempt to create a new Document from the XSLT. if (!frame() || frame()->documentIsBeingReplaced()) @@ -8736,7 +8742,7 @@ RefPtr element = getCSSCanvasElement(name); if (!element) return std::nullopt; - element->setCSSCanvasContextSize({ width, height }); + element->setSizeForControllingContext({ width, height }); auto context = element->getContext(type); if (!context) return std::nullopt; @@ -11408,7 +11414,7 @@ callback(ScheduleLocationChangeResult::Stopped); return; } - frame->protectedNavigationScheduler()->scheduleLocationChange(*weakThis, weakThis->securityOrigin(), url, frame->loader().outgoingReferrer(), LockHistory::Yes, LockBackForwardList::No, NavigationHistoryBehavior::Auto, [callback = WTF::move(callback)](auto result) mutable { + frame->protectedNavigationScheduler()->scheduleLocationChange(*weakThis, weakThis->protectedSecurityOrigin(), url, frame->loader().outgoingReferrer(), LockHistory::Yes, LockBackForwardList::No, NavigationHistoryBehavior::Auto, [callback = WTF::move(callback)](auto result) mutable { callback(result); }); }); diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/DocumentStorageAccess.cpp webkit2gtk-2.52.5/Source/WebCore/dom/DocumentStorageAccess.cpp --- webkit2gtk-2.52.3/Source/WebCore/dom/DocumentStorageAccess.cpp 2026-04-10 09:30:55.900679800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/DocumentStorageAccess.cpp 2026-07-09 07:12:42.004798400 +0000 @@ -237,8 +237,8 @@ if (!page->settings().storageAccessAPIPerPageScopeEnabled()) m_storageAccessScope = StorageAccessScope::PerFrame; - auto hasOrShouldIgnoreUserGesture = frame->requestSkipUserActivationCheckForStorageAccess(RegistrableDomain { document->url() }) || UserGestureIndicator::processingUserGesture() ? HasOrShouldIgnoreUserGesture::Yes : HasOrShouldIgnoreUserGesture::No; - page->chrome().client().requestStorageAccess(RegistrableDomain::uncheckedCreateFromHost(document->protectedSecurityOrigin()->host()), RegistrableDomain::uncheckedCreateFromHost(document->protectedTopOrigin()->host()), *frame, m_storageAccessScope, hasOrShouldIgnoreUserGesture, [weakThis = WeakPtr { *this }, promise = WTF::move(promise)] (RequestStorageAccessResult result) mutable { + auto hasUserGestureOrNoUserGestureRequired = frame->requestSkipUserActivationCheckForStorageAccess(RegistrableDomain { document->url() }) || UserGestureIndicator::processingUserGesture() ? HasUserGestureOrNoUserGestureRequired::Yes : HasUserGestureOrNoUserGestureRequired::No; + page->chrome().client().requestStorageAccess(RegistrableDomain::uncheckedCreateFromHost(document->protectedSecurityOrigin()->host()), RegistrableDomain::uncheckedCreateFromHost(document->protectedTopOrigin()->host()), *frame, m_storageAccessScope, hasUserGestureOrNoUserGestureRequired, [weakThis = WeakPtr { *this }, promise = WTF::move(promise), hasUserGestureOrNoUserGestureRequired] (RequestStorageAccessResult result) mutable { RefPtr protectedThis = weakThis.get(); if (!protectedThis) return; @@ -251,7 +251,8 @@ shouldPreserveUserGesture = true; break; case StorageAccessWasGranted::No: - shouldPreserveUserGesture = result.promptWasShown == StorageAccessPromptWasShown::No; + const bool promptNotShownButMayHaveUserGesture = result.promptWasShown == StorageAccessPromptWasShown::No && hasUserGestureOrNoUserGestureRequired == HasUserGestureOrNoUserGestureRequired::Yes; + shouldPreserveUserGesture = promptNotShownButMayHaveUserGesture; } Ref document = protectedThis->m_document.get(); @@ -352,7 +353,7 @@ auto topFrameDomain = RegistrableDomain(page->mainFrameURL()); RefPtr frame = document->frame(); - page->chrome().client().requestStorageAccess(WTF::move(requestingDomain), WTF::move(topFrameDomain), *frame, m_storageAccessScope, HasOrShouldIgnoreUserGesture::Yes, [weakThis = WeakPtr { *this }, completionHandler = WTF::move(completionHandler)] (RequestStorageAccessResult result) mutable { + page->chrome().client().requestStorageAccess(WTF::move(requestingDomain), WTF::move(topFrameDomain), *frame, m_storageAccessScope, HasUserGestureOrNoUserGestureRequired::Yes, [weakThis = WeakPtr { *this }, completionHandler = WTF::move(completionHandler)] (RequestStorageAccessResult result) mutable { RefPtr protectedThis = weakThis.get(); if (!protectedThis) return; @@ -389,7 +390,7 @@ void DocumentStorageAccess::enableTemporaryTimeUserGesture() { - m_temporaryUserGesture = makeUnique(IsProcessingUserGesture::Yes, protectedDocument().ptr()); + m_temporaryUserGesture = makeUnique(IsProcessingUserGesture::Yes, protectedDocument().ptr(), UserGestureType::ActivationTriggering, UserGestureIndicator::ProcessInteractionStyle::Never); } void DocumentStorageAccess::consumeTemporaryTimeUserGesture() diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/DocumentStorageAccess.h webkit2gtk-2.52.5/Source/WebCore/dom/DocumentStorageAccess.h --- webkit2gtk-2.52.3/Source/WebCore/dom/DocumentStorageAccess.h 2026-02-23 14:40:55.134302400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/DocumentStorageAccess.h 2026-07-09 07:12:42.004798400 +0000 @@ -41,7 +41,7 @@ enum class StorageAccessPromptWasShown : bool { No, Yes }; -enum class HasOrShouldIgnoreUserGesture : bool { No, Yes }; +enum class HasUserGestureOrNoUserGestureRequired : bool { No, Yes }; enum class StorageAccessScope : bool { PerFrame, diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/Element.cpp webkit2gtk-2.52.5/Source/WebCore/dom/Element.cpp --- webkit2gtk-2.52.3/Source/WebCore/dom/Element.cpp 2026-03-25 16:38:32.911259700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/Element.cpp 2026-07-09 07:12:42.004798400 +0000 @@ -629,7 +629,14 @@ bool Element::dispatchSimulatedClick(Event* underlyingEvent, SimulatedClickMouseEventOptions eventOptions, SimulatedClickVisualOptions visualOptions) { - return simulateClick(*this, underlyingEvent, eventOptions, visualOptions, SimulatedClickSource::UserAgent); + auto simulatedClickSource = [&] { + if (!underlyingEvent) + return SimulatedClickSource::UserAgent; + + return underlyingEvent->isTrusted() ? SimulatedClickSource::UserAgent : SimulatedClickSource::Bindings; + }(); + + return simulateClick(*this, underlyingEvent, eventOptions, visualOptions, simulatedClickSource); } Ref Element::cloneNodeInternal(Document& document, CloningOperation type, CustomElementRegistry* fallbackRegistry) const @@ -1387,8 +1394,8 @@ adjustForAbsoluteZoom(renderer->scrollTop(), *renderer) ); IntPoint scrollPosition( - clampToInteger(scrollToOptions.left.value() * renderer->style().usedZoom()), - clampToInteger(scrollToOptions.top.value() * renderer->style().usedZoom()) + clampTo(scrollToOptions.left.value() * renderer->style().usedZoom()), + clampTo(scrollToOptions.top.value() * renderer->style().usedZoom()) ); auto animated = useSmoothScrolling(scrollToOptions.behavior.value_or(ScrollBehavior::Auto), this) ? ScrollIsAnimated::Yes : ScrollIsAnimated::No; @@ -1725,14 +1732,14 @@ if (document->scrollingElement() == this) { if (RefPtr frame = documentFrameWithNonNullView()) { - IntPoint position(static_cast(newLeft * frame->pageZoomFactor() * frame->frameScaleFactor()), frame->view()->scrollY()); + IntPoint position(clampTo(newLeft * frame->pageZoomFactor() * frame->frameScaleFactor()), frame->view()->scrollY()); frame->protectedView()->setScrollPosition(position, options); } return; } if (CheckedPtr renderer = renderBox()) { - int clampedLeft = clampToInteger(newLeft * renderer->style().usedZoom()); + int clampedLeft = clampTo(newLeft * renderer->style().usedZoom()); renderer->setScrollLeft(clampedLeft, options); if (CheckedPtr scrollableArea = renderer && renderer->layer() ? renderer->layer()->scrollableArea() : nullptr) scrollableArea->setScrollShouldClearLatchedState(true); @@ -1751,14 +1758,14 @@ if (document->scrollingElement() == this) { if (RefPtr frame = documentFrameWithNonNullView()) { - IntPoint position(frame->view()->scrollX(), static_cast(newTop * frame->pageZoomFactor() * frame->frameScaleFactor())); + IntPoint position(frame->view()->scrollX(), clampTo(newTop * frame->pageZoomFactor() * frame->frameScaleFactor())); frame->protectedView()->setScrollPosition(position, options); } return; } if (CheckedPtr renderer = renderBox()) { - int clampedTop = clampToInteger(newTop * renderer->style().usedZoom()); + int clampedTop = clampTo(newTop * renderer->style().usedZoom()); renderer->setScrollTop(clampedTop, options); if (CheckedPtr scrollableArea = renderer && renderer->layer() ? renderer->layer()->scrollableArea() : nullptr) scrollableArea->setScrollShouldClearLatchedState(true); @@ -3279,6 +3286,12 @@ invalidateStyleInternal(); } +inline void ShadowRoot::setHost(Element* host) +{ + m_host = host; + m_shadowIncludingRoot = host ? &host->shadowIncludingRoot() : this; +} + void Element::addShadowRoot(Ref&& newShadowRoot) { ASSERT(!newShadowRoot->hasChildNodes()); @@ -3293,7 +3306,7 @@ ensureElementRareData().setShadowRoot(WTF::move(newShadowRoot)); - shadowRoot->setHost(*this); + shadowRoot->setHost(this); shadowRoot->setParentTreeScope(treeScope()); NodeVector postInsertionNotificationTargets; @@ -4401,7 +4414,7 @@ ExceptionOr Element::setHTMLUnsafe(Variant, String>&& html) { - auto stringValueHolder = trustedTypeCompliantString(document().contextDocument(), WTF::move(html), "Element setHTMLUnsafe"_s); + auto stringValueHolder = trustedTypeCompliantString(protect(document().contextDocument()), WTF::move(html), "Element setHTMLUnsafe"_s); if (stringValueHolder.hasException()) return stringValueHolder.releaseException(); @@ -4435,7 +4448,7 @@ ExceptionOr Element::setOuterHTML(Variant, String>&& html) { - auto stringValueHolder = trustedTypeCompliantString(document().contextDocument(), WTF::move(html), "Element outerHTML"_s); + auto stringValueHolder = trustedTypeCompliantString(protect(document().contextDocument()), WTF::move(html), "Element outerHTML"_s); if (stringValueHolder.hasException()) return stringValueHolder.releaseException(); @@ -4476,7 +4489,7 @@ ExceptionOr Element::setInnerHTML(Variant, String>&& html) { - auto stringValueHolder = trustedTypeCompliantString(document().contextDocument(), WTF::move(html), "Element innerHTML"_s); + auto stringValueHolder = trustedTypeCompliantString(protect(document().contextDocument()), WTF::move(html), "Element innerHTML"_s); if (stringValueHolder.hasException()) return stringValueHolder.releaseException(); @@ -6084,7 +6097,7 @@ ExceptionOr Element::insertAdjacentHTML(const String& where, Variant, String>&& markup) { - auto stringValueHolder = trustedTypeCompliantString(document().contextDocument(), WTF::move(markup), "Element insertAdjacentHTML"_s); + auto stringValueHolder = trustedTypeCompliantString(protect(document().contextDocument()), WTF::move(markup), "Element insertAdjacentHTML"_s); if (stringValueHolder.hasException()) return stringValueHolder.releaseException(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/MessagePort.cpp webkit2gtk-2.52.5/Source/WebCore/dom/MessagePort.cpp --- webkit2gtk-2.52.3/Source/WebCore/dom/MessagePort.cpp 2026-02-23 14:40:55.153302200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/MessagePort.cpp 2026-07-09 07:12:42.008798400 +0000 @@ -87,6 +87,31 @@ }); } +void MessagePort::notifyAllConnectionsClosed() +{ + ASSERT(isMainThread()); + Vector>> entries; + { + Locker locker { allMessagePortsLock }; + entries.reserveInitialCapacity(allMessagePorts().size()); + for (auto& [identifier, weakPort] : allMessagePorts()) { + if (auto contextIdentifier = portToContextIdentifier().getOptional(identifier)) + entries.append({ *contextIdentifier, weakPort }); + } + } + + for (auto& [contextIdentifier, weakPort] : entries) { + ScriptExecutionContext::ensureOnContextThread(contextIdentifier, [weakPort = WTF::move(weakPort)](auto&) { + RefPtr port = weakPort.get(); + if (!port || port->m_isDetached) + return; + port->m_isDetached = true; + port->m_entangled = false; + port->removeAllEventListeners(); + }); + } +} + Ref MessagePort::create(ScriptExecutionContext& scriptExecutionContext, const MessagePortIdentifier& local, const MessagePortIdentifier& remote) { Ref messagePort = adoptRef(*new MessagePort(scriptExecutionContext, local, remote)); diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/MessagePort.h webkit2gtk-2.52.5/Source/WebCore/dom/MessagePort.h --- webkit2gtk-2.52.3/Source/WebCore/dom/MessagePort.h 2026-02-23 14:40:55.153302200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/MessagePort.h 2026-07-09 07:12:42.008798400 +0000 @@ -73,6 +73,7 @@ WEBCORE_EXPORT static bool isMessagePortAliveForTesting(const MessagePortIdentifier&); WEBCORE_EXPORT static void notifyMessageAvailable(const MessagePortIdentifier&); + WEBCORE_EXPORT static void notifyAllConnectionsClosed(); WEBCORE_EXPORT void messageAvailable(); bool started() const { return m_started; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/Node.cpp webkit2gtk-2.52.5/Source/WebCore/dom/Node.cpp --- webkit2gtk-2.52.3/Source/WebCore/dom/Node.cpp 2026-04-09 08:25:32.346899700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/Node.cpp 2026-07-09 07:12:42.008798400 +0000 @@ -130,6 +130,7 @@ uint32_t stateFlags; void* parentNode; void* treeScope; + void* shadowIncludingRoot; void* previous; void* next; void* renderer; @@ -378,6 +379,7 @@ : EventTarget(ConstructNode) , m_typeBitFields(constructBitFieldsFromNodeTypeAndFlags(type, flags)) , m_treeScope((isDocumentNode() || isShadowRoot()) ? nullptr : &document) + , m_shadowIncludingRoot(this) { ASSERT(nodeType() == type); ASSERT(isMainThread()); @@ -1177,7 +1179,7 @@ // Return true if other is an ancestor of this. if (other.isTreeScope()) return &treeScope().rootNode() == &other && !isTreeScope() && isInTreeScope(); - if (!other.hasChildNodes() || isConnected() != other.isConnected()) + if (!other.hasChildNodes() || isConnected() != other.isConnected() || &shadowIncludingRoot() != &other.shadowIncludingRoot()) return false; for (auto ancestor = parentNode(); ancestor; ancestor = ancestor->parentNode()) { if (ancestor == &other) @@ -1189,6 +1191,9 @@ // https://dom.spec.whatwg.org/#concept-shadow-including-inclusive-ancestor bool Node::isShadowIncludingDescendantOf(const Node& other) const { + if (&shadowIncludingRoot() != &other.shadowIncludingRoot()) + return false; + if (isDescendantOf(other)) return true; @@ -1202,8 +1207,10 @@ bool Node::isComposedTreeDescendantOf(const Node& node) const { - for (CheckedPtr currentAncestor = parentElementInComposedTree(); currentAncestor; currentAncestor = currentAncestor->parentElementInComposedTree()) { - if (currentAncestor.get() == &node) + if (&shadowIncludingRoot() != &node.shadowIncludingRoot()) + return false; + for (auto* currentAncestor = parentElementInComposedTree(); currentAncestor; currentAncestor = currentAncestor->parentElementInComposedTree()) { + if (currentAncestor == &node) return true; } return false; @@ -1480,17 +1487,6 @@ return traverseToRootNodeInternal(*this); } -// https://dom.spec.whatwg.org/#concept-shadow-including-root -Node& Node::shadowIncludingRoot() const -{ - auto& root = this->rootNode(); - if (auto* shadowRoot = dynamicDowncast(root)) { - auto* host = shadowRoot->host(); - return host ? host->shadowIncludingRoot() : root; - } - return root; -} - Node& Node::getRootNode(const GetRootNodeOptions& options) const { return options.composed ? shadowIncludingRoot() : rootNode(); @@ -1510,6 +1506,29 @@ }); } +#if ASSERT_ENABLED +static Node* traverseToShadowIncludingRoot(Node* current) +{ + while (auto* parent = current->parentOrShadowHostNode()) + current = parent; + return current; +} +#endif + +ALWAYS_INLINE void Node::updateShadowIncludingRoot() +{ + if (auto* parent = parentNode()) + m_shadowIncludingRoot = parent->m_shadowIncludingRoot; + else if (auto* shadowRoot = dynamicDowncast(this)) [[unlikely]] { + auto* host = shadowRoot->host(); + auto* root = host ? host->m_shadowIncludingRoot : shadowRoot; + shadowRoot->setShadowIncludingRoot(root); + m_shadowIncludingRoot = root; + } else + m_shadowIncludingRoot = this; + ASSERT(traverseToShadowIncludingRoot(this) == m_shadowIncludingRoot); +} + Node::InsertedIntoAncestorResult Node::insertedIntoAncestor(InsertionType insertionType, ContainerNode& parentOfInsertedTree) { ASSERT(!containsSelectionEndPoint()); @@ -1518,6 +1537,8 @@ if (parentOfInsertedTree.isInShadowTree()) setEventTargetFlag(EventTargetFlag::IsInShadowTree); + updateShadowIncludingRoot(); + invalidateStyle(Style::Validity::SubtreeInvalid, Style::InvalidationMode::InsertedIntoAncestor); return InsertedIntoAncestorResult::Done; @@ -1530,12 +1551,24 @@ clearEventTargetFlag(EventTargetFlag::IsConnected); if (isInShadowTree() && !treeScope().rootNode().isShadowRoot()) clearEventTargetFlag(EventTargetFlag::IsInShadowTree); + + updateShadowIncludingRoot(); + if (removalType.disconnectedFromDocument) { if (CheckedPtr cache = oldParentOfRemovedTree.document().existingAXObjectCache()) cache->remove(*this); } } +void Node::updateShadowIncludingRootForSubtree() +{ + SUPPRESS_UNCOUNTED_LOCAL for (auto* current = this; current; current = NodeTraversal::next(*current, this)) { + current->updateShadowIncludingRoot(); + SUPPRESS_UNCOUNTED_LOCAL if (auto* shadowRoot = current->shadowRoot()) + shadowRoot->updateShadowIncludingRootForSubtree(); + } +} + bool Node::isRootEditableElement() const { return hasEditableStyle() && isElementNode() && (!parentNode() || !parentNode()->hasEditableStyle() @@ -2986,19 +3019,6 @@ return isConnected() && document().hasLivingRenderTree(); } -WebCoreOpaqueRoot Node::traverseToOpaqueRoot() const -{ - ASSERT_WITH_MESSAGE(!isConnected(), "Call opaqueRoot() or document() when the node is connected"); - const Node* node = this; - for (;;) { - const Node* nextNode = node->parentOrShadowHostNode(); - if (!nextNode) - break; - node = nextNode; - } - return WebCoreOpaqueRoot { const_cast(node) }; -} - void Node::notifyInspectorOfRendererChange() { InspectorInstrumentation::didChangeRendererForDOMNode(*this); diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/Node.h webkit2gtk-2.52.5/Source/WebCore/dom/Node.h --- webkit2gtk-2.52.3/Source/WebCore/dom/Node.h 2026-02-23 14:40:55.158302300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/Node.h 2026-07-09 07:12:42.008798400 +0000 @@ -334,7 +334,8 @@ inline Node& rootNode() const; inline Ref protectedRootNode() const; WEBCORE_EXPORT Node& traverseToRootNode() const; - Node& shadowIncludingRoot() const; + Node& shadowIncludingRoot() const { return *m_shadowIncludingRoot; } + void resetShadowIncludingRoot() { m_shadowIncludingRoot = this; } struct GetRootNodeOptions { bool composed; @@ -342,7 +343,6 @@ Node& getRootNode(const GetRootNodeOptions&) const; inline WebCoreOpaqueRoot opaqueRoot() const; - WebCoreOpaqueRoot traverseToOpaqueRoot() const; void queueTaskKeepingThisNodeAlive(TaskSource, Function&&); void queueTaskToDispatchEvent(TaskSource, Ref&&); @@ -542,6 +542,8 @@ }; virtual void removedFromAncestor(RemovalType, ContainerNode& oldParentOfRemovedTree); + void updateShadowIncludingRootForSubtree(); + virtual String description() const; virtual String debugDescription() const; @@ -809,6 +811,9 @@ void derefEventTarget() final; void trackForDebugging(); + + void updateShadowIncludingRoot(); + void materializeRareData(); Vector>* mutationObserverRegistry(); @@ -839,6 +844,7 @@ CheckedPtr m_parentNode; TreeScope* m_treeScope { nullptr }; + Node* m_shadowIncludingRoot { nullptr }; Node* m_previousSibling { nullptr }; CheckedPtr m_next; RenderObject* m_renderer { nullptr }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/NodeInlines.h webkit2gtk-2.52.5/Source/WebCore/dom/NodeInlines.h --- webkit2gtk-2.52.3/Source/WebCore/dom/NodeInlines.h 2026-02-23 14:40:55.158302300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/NodeInlines.h 2026-07-09 07:12:42.008798400 +0000 @@ -60,12 +60,7 @@ inline WebCoreOpaqueRoot Node::opaqueRoot() const { - if (isConnected()) { - Locker locker { TreeScope::treeScopeMutationLock() }; - return WebCoreOpaqueRoot { &treeScope().documentScope() }; - } - // FIXME: Possible race? - return traverseToOpaqueRoot(); + return WebCoreOpaqueRoot { m_shadowIncludingRoot }; } inline Ref Node::protectedTreeScope() const @@ -207,7 +202,7 @@ { if (isInTreeScope()) return treeScope().rootNode(); - return traverseToRootNode(); + return *m_shadowIncludingRoot; } inline Ref Node::protectedRootNode() const diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/Range.cpp webkit2gtk-2.52.5/Source/WebCore/dom/Range.cpp --- webkit2gtk-2.52.3/Source/WebCore/dom/Range.cpp 2026-04-09 08:14:56.047955800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/Range.cpp 2026-07-09 07:12:42.012798300 +0000 @@ -132,9 +132,14 @@ if (childNode.hasException()) return childNode.releaseException(); - m_start.set(WTF::move(container), offset, childNode.releaseReturnValue()); - if (!is_lteq(treeOrder(makeBoundaryPoint(m_start), makeBoundaryPoint(m_end)))) - m_end = m_start; + bool shouldAlsoSetEnd = !is_lteq(treeOrder(BoundaryPoint(container.copyRef(), offset), makeBoundaryPoint(m_end))); + { + Locker locker { m_boundaryPointLock }; + m_start.set(WTF::move(container), offset, childNode.releaseReturnValue()); + if (shouldAlsoSetEnd) + m_end = m_start; + } + updateAssociatedSelection(); updateDocument(); updateAssociatedHighlight(); @@ -147,9 +152,14 @@ if (childNode.hasException()) return childNode.releaseException(); - m_end.set(WTF::move(container), offset, childNode.releaseReturnValue()); - if (!is_lteq(treeOrder(makeBoundaryPoint(m_start), makeBoundaryPoint(m_end)))) - m_start = m_end; + bool shouldAlsoSetStart = !is_lteq(treeOrder(makeBoundaryPoint(m_start), BoundaryPoint(container.copyRef(), offset))); + { + Locker locker { m_boundaryPointLock }; + m_end.set(WTF::move(container), offset, childNode.releaseReturnValue()); + if (shouldAlsoSetStart) + m_start = m_end; + } + updateAssociatedSelection(); updateDocument(); updateAssociatedHighlight(); @@ -158,10 +168,13 @@ void Range::collapse(bool toStart) { - if (toStart) - m_end = m_start; - else - m_start = m_end; + { + Locker locker { m_boundaryPointLock }; + if (toStart) + m_end = m_start; + else + m_start = m_end; + } updateAssociatedSelection(); } @@ -745,8 +758,8 @@ // https://w3c.github.io/DOM-Parsing/#widl-Range-createContextualFragment-DocumentFragment-DOMString-fragment ExceptionOr> Range::createContextualFragment(Variant, String>&& markup) { - Node& node = startContainer(); - auto stringValueHolder = trustedTypeCompliantString(node.document().contextDocument(), WTF::move(markup), "Range createContextualFragment"_s); + Ref node = startContainer(); + auto stringValueHolder = trustedTypeCompliantString(protect(node->document().contextDocument()), WTF::move(markup), "Range createContextualFragment"_s); if (stringValueHolder.hasException()) return stringValueHolder.releaseException(); @@ -754,12 +767,12 @@ RefPtr element; if (is(node) || is(node)) element = nullptr; - else if (auto* maybeElement = dynamicDowncast(node)) + else if (auto* maybeElement = dynamicDowncast(node.get())) element = maybeElement; else - element = node.parentElement(); + element = node->parentElement(); if (!element || (element->document().isHTMLDocument() && is(*element))) - element = HTMLBodyElement::create(node.protectedDocument()); + element = HTMLBodyElement::create(node->protectedDocument()); return WebCore::createContextualFragment(*element, stringValueHolder.releaseReturnValue(), { ParserContentPolicy::AllowScriptingContent, ParserContentPolicy::DoNotMarkAlreadyStarted }); } @@ -838,8 +851,11 @@ { if (node.isDocumentTypeNode()) return Exception { ExceptionCode::InvalidNodeTypeError }; - m_start.setToBeforeContents(node); - m_end.setToAfterContents(node); + { + Locker locker { m_boundaryPointLock }; + m_start.setToBeforeContents(node); + m_end.setToAfterContents(node); + } updateAssociatedSelection(); updateDocument(); return { }; @@ -913,7 +929,7 @@ } #endif -static inline void boundaryNodeChildrenChanged(RangeBoundaryPoint& boundary, ContainerNode& container) +static inline void boundaryNodeChildrenChanged(Locker&, RangeBoundaryPoint& boundary, ContainerNode& container) { if (boundary.childBefore() && &boundary.container() == &container) boundary.invalidateOffset(); @@ -922,12 +938,13 @@ void Range::nodeChildrenChanged(ContainerNode& container) { ASSERT(&container.document() == m_ownerDocument.ptr()); - boundaryNodeChildrenChanged(m_start, container); - boundaryNodeChildrenChanged(m_end, container); + Locker locker { m_boundaryPointLock }; + boundaryNodeChildrenChanged(locker, m_start, container); + boundaryNodeChildrenChanged(locker, m_end, container); m_didChangeForHighlight = true; } -static inline void boundaryNodeChildrenWillBeRemoved(RangeBoundaryPoint& boundary, ContainerNode& containerOfNodesToBeRemoved) +static inline void boundaryNodeChildrenWillBeRemoved(Locker&, RangeBoundaryPoint& boundary, ContainerNode& containerOfNodesToBeRemoved) { if (containerOfNodesToBeRemoved.contains(&boundary.container())) boundary.setToBeforeContents(containerOfNodesToBeRemoved); @@ -936,12 +953,13 @@ void Range::nodeChildrenWillBeRemoved(ContainerNode& container) { ASSERT(&container.document() == m_ownerDocument.ptr()); - boundaryNodeChildrenWillBeRemoved(m_start, container); - boundaryNodeChildrenWillBeRemoved(m_end, container); + Locker locker { m_boundaryPointLock }; + boundaryNodeChildrenWillBeRemoved(locker, m_start, container); + boundaryNodeChildrenWillBeRemoved(locker, m_end, container); m_didChangeForHighlight = true; } -static inline void boundaryNodeWillBeRemoved(RangeBoundaryPoint& boundary, Node& nodeToBeRemoved) +static inline void boundaryNodeWillBeRemoved(Locker&, RangeBoundaryPoint& boundary, Node& nodeToBeRemoved) { if (boundary.childBefore() == &nodeToBeRemoved) boundary.childBeforeWillBeRemoved(); @@ -954,8 +972,10 @@ ASSERT(&node.document() == m_ownerDocument.ptr()); ASSERT(&node != m_ownerDocument.ptr()); ASSERT(node.parentNode()); - boundaryNodeWillBeRemoved(m_start, node); - boundaryNodeWillBeRemoved(m_end, node); + + Locker locker { m_boundaryPointLock }; + boundaryNodeWillBeRemoved(locker, m_start, node); + boundaryNodeWillBeRemoved(locker, m_end, node); m_didChangeForHighlight = true; } @@ -971,7 +991,7 @@ protectedOwnerDocument()->attachRange(*this); } -static inline void boundaryTextInserted(RangeBoundaryPoint& boundary, Node& text, unsigned offset, unsigned length) +static inline void boundaryTextInserted(Locker&, RangeBoundaryPoint& boundary, Node& text, unsigned offset, unsigned length) { if (&boundary.container() != &text) return; @@ -984,12 +1004,13 @@ void Range::textInserted(Node& text, unsigned offset, unsigned length) { ASSERT(&text.document() == m_ownerDocument.ptr()); - boundaryTextInserted(m_start, text, offset, length); - boundaryTextInserted(m_end, text, offset, length); + Locker locker { m_boundaryPointLock }; + boundaryTextInserted(locker, m_start, text, offset, length); + boundaryTextInserted(locker, m_end, text, offset, length); m_didChangeForHighlight = true; } -static inline void boundaryTextRemoved(RangeBoundaryPoint& boundary, Node& text, unsigned offset, unsigned length) +static inline void boundaryTextRemoved(Locker&, RangeBoundaryPoint& boundary, Node& text, unsigned offset, unsigned length) { if (&boundary.container() != &text) return; @@ -1005,12 +1026,13 @@ void Range::textRemoved(Node& text, unsigned offset, unsigned length) { ASSERT(&text.document() == m_ownerDocument.ptr()); - boundaryTextRemoved(m_start, text, offset, length); - boundaryTextRemoved(m_end, text, offset, length); + Locker locker { m_boundaryPointLock }; + boundaryTextRemoved(locker, m_start, text, offset, length); + boundaryTextRemoved(locker, m_end, text, offset, length); m_didChangeForHighlight = true; } -static inline void boundaryTextNodesMerged(RangeBoundaryPoint& boundary, NodeWithIndex& oldNode, unsigned offset) +static inline void boundaryTextNodesMerged(Locker&, RangeBoundaryPoint& boundary, NodeWithIndex& oldNode, unsigned offset) { if (&boundary.container() == oldNode.node()) boundary.set(oldNode.node()->protectedPreviousSibling().releaseNonNull(), boundary.offset() + offset, nullptr); @@ -1026,12 +1048,13 @@ ASSERT(oldNode.node()->isTextNode()); ASSERT(oldNode.node()->previousSibling()); ASSERT(oldNode.node()->previousSibling()->isTextNode()); - boundaryTextNodesMerged(m_start, oldNode, offset); - boundaryTextNodesMerged(m_end, oldNode, offset); + Locker locker { m_boundaryPointLock }; + boundaryTextNodesMerged(locker, m_start, oldNode, offset); + boundaryTextNodesMerged(locker, m_end, oldNode, offset); m_didChangeForHighlight = true; } -static inline void boundaryTextNodesSplit(RangeBoundaryPoint& boundary, Text& oldNode) +static inline void boundaryTextNodesSplit(Locker&, RangeBoundaryPoint& boundary, Text& oldNode) { RefPtr parent = oldNode.parentNode(); if (&boundary.container() == &oldNode) { @@ -1059,8 +1082,9 @@ ASSERT(&oldNode.document() == m_ownerDocument.ptr()); ASSERT(!oldNode.parentNode() || oldNode.nextSibling()); ASSERT(!oldNode.parentNode() || oldNode.nextSibling()->isTextNode()); - boundaryTextNodesSplit(m_start, oldNode); - boundaryTextNodesSplit(m_end, oldNode); + Locker locker { m_boundaryPointLock }; + boundaryTextNodesSplit(locker, m_start, oldNode); + boundaryTextNodesSplit(locker, m_end, oldNode); m_didChangeForHighlight = true; } @@ -1169,8 +1193,9 @@ return createLiveRange(*range); } -void Range::visitNodesConcurrently(JSC::AbstractSlotVisitor& visitor) const +void Range::visitNodesInGCThread(JSC::AbstractSlotVisitor& visitor) const { + Locker locker { m_boundaryPointLock }; addWebCoreOpaqueRoot(visitor, m_start.container()); addWebCoreOpaqueRoot(visitor, m_end.container()); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/Range.h webkit2gtk-2.52.5/Source/WebCore/dom/Range.h --- webkit2gtk-2.52.3/Source/WebCore/dom/Range.h 2026-02-23 14:40:55.165302300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/Range.h 2026-07-09 07:12:42.012798300 +0000 @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include namespace WebCore { @@ -131,7 +133,7 @@ String debugDescription() const; #endif - void visitNodesConcurrently(JSC::AbstractSlotVisitor&) const; + void visitNodesInGCThread(JSC::AbstractSlotVisitor&) const; enum ActionType : uint8_t { Delete, Extract, Clone }; @@ -149,6 +151,7 @@ Ref m_ownerDocument; RangeBoundaryPoint m_start; RangeBoundaryPoint m_end; + mutable Lock m_boundaryPointLock; bool m_isAssociatedWithSelection { false }; bool m_didChangeForHighlight { false }; bool m_isAssociatedWithHighlight { false }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/ShadowRoot.cpp webkit2gtk-2.52.5/Source/WebCore/dom/ShadowRoot.cpp --- webkit2gtk-2.52.3/Source/WebCore/dom/ShadowRoot.cpp 2026-04-10 09:30:55.905680000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/ShadowRoot.cpp 2026-07-09 07:12:42.012798300 +0000 @@ -62,6 +62,7 @@ struct SameSizeAsShadowRoot : public DocumentFragment, public TreeScope { uint8_t flagsAndModes[3]; WeakPtr host; + void* shadowIncludingRoot; void* styleSheetList; void* styleScope; void* slotAssignment; @@ -84,6 +85,7 @@ , m_hasScopedCustomElementRegistry(scopedRegistry == ShadowRootScopedCustomElementRegistry::Yes) , m_mode(mode) , m_slotAssignmentMode(assignmentMode) + , m_shadowIncludingRoot(this) , m_styleScope(makeUnique(*this)) , m_referenceTarget(referenceTarget) { @@ -248,7 +250,7 @@ ExceptionOr ShadowRoot::setHTMLUnsafe(Variant, String>&& html) { - auto stringValueHolder = trustedTypeCompliantString(document().contextDocument(), WTF::move(html), "ShadowRoot setHTMLUnsafe"_s); + auto stringValueHolder = trustedTypeCompliantString(protect(document().contextDocument()), WTF::move(html), "ShadowRoot setHTMLUnsafe"_s); if (stringValueHolder.hasException()) return stringValueHolder.releaseException(); @@ -268,7 +270,7 @@ ExceptionOr ShadowRoot::setInnerHTML(Variant, String>&& html) { - auto stringValueHolder = trustedTypeCompliantString(document().contextDocument(), WTF::move(html), "ShadowRoot innerHTML"_s); + auto stringValueHolder = trustedTypeCompliantString(protect(document().contextDocument()), WTF::move(html), "ShadowRoot innerHTML"_s); if (stringValueHolder.hasException()) return stringValueHolder.releaseException(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/ShadowRoot.h webkit2gtk-2.52.5/Source/WebCore/dom/ShadowRoot.h --- webkit2gtk-2.52.3/Source/WebCore/dom/ShadowRoot.h 2026-02-23 14:40:55.170302200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/ShadowRoot.h 2026-07-09 07:12:42.012798300 +0000 @@ -97,9 +97,13 @@ void setIsDeclarativeShadowRoot(bool flag) { m_isDeclarativeShadowRoot = flag; } Element* host() const { return m_host.get(); } + inline void setHost(Element*); // Defined and only used in Element.cpp RefPtr protectedHost() const { return m_host.get(); } void setHost(WeakPtr&& host) { m_host = WTF::move(host); } + Node* shadowIncludingRoot() const { return m_shadowIncludingRoot; } + inline void setShadowIncludingRoot(Node* root) { m_shadowIncludingRoot = root; } + bool hasScopedCustomElementRegistry() const { return m_hasScopedCustomElementRegistry; } CustomElementRegistry* registryForBindings() const; @@ -181,6 +185,7 @@ SlotAssignmentMode m_slotAssignmentMode { SlotAssignmentMode::Named }; WeakPtr m_host; + Node* m_shadowIncludingRoot { nullptr }; RefPtr m_styleSheetList; std::unique_ptr m_styleScope; diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/SlotAssignment.cpp webkit2gtk-2.52.5/Source/WebCore/dom/SlotAssignment.cpp --- webkit2gtk-2.52.3/Source/WebCore/dom/SlotAssignment.cpp 2026-04-11 01:19:00.413725400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/SlotAssignment.cpp 2026-07-09 07:12:42.012798300 +0000 @@ -265,6 +265,9 @@ return; } + if (!m_slotAssignmentsIsValid) + assignSlots(shadowRoot); + for (auto& slot : m_slots.values()) { if (slot->seenFirstElement) continue; @@ -276,7 +279,7 @@ // All slot elements have been removed for this slot. slot->seenFirstElement = true; ASSERT(slot->element); - if (hasAssignedNodes(shadowRoot, *slot)) + if (!slot->assignedNodes.isEmpty()) slot->oldElement = WTF::move(slot->element); slot->element = nullptr; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/Subscriber.cpp webkit2gtk-2.52.5/Source/WebCore/dom/Subscriber.cpp --- webkit2gtk-2.52.3/Source/WebCore/dom/Subscriber.cpp 2026-02-23 14:40:55.173302200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/Subscriber.cpp 2026-07-09 07:12:42.012798300 +0000 @@ -154,28 +154,20 @@ reportException(globalObject, JSC::Exception::create(vm, value)); } -Vector Subscriber::teardownCallbacksConcurrently() +template +void Subscriber::visitAdditionalChildren(Visitor& visitor) { - Locker locker { m_teardownsLock }; - return m_teardowns.map([](auto& callback) { - return callback.ptr(); - }); -} + // Do not ref anything in this function, which runs in a GC thread concurrently to the main thread. + { + Locker locker { m_teardownsLock }; + SUPPRESS_UNCOUNTED_LOCAL for (auto& teardown : m_teardowns) + SUPPRESS_UNCOUNTED_ARG teardown->visitJSFunction(visitor); + } -InternalObserver* Subscriber::observerConcurrently() -{ - return &m_observer.get(); + SUPPRESS_UNRETAINED_ARG m_observer->visitAdditionalChildren(visitor); } -void Subscriber::visitAdditionalChildren(JSC::AbstractSlotVisitor& visitor) -{ - // We cannot ref `teardown` here as this may get called from the GC thread. - SUPPRESS_UNRETAINED_ARG for (auto* teardown : teardownCallbacksConcurrently()) - teardown->visitJSFunction(visitor); - - // We cannot ref the observer here as this may get called from the GC thread. - SUPPRESS_UNRETAINED_ARG observerConcurrently()->visitAdditionalChildren(visitor); -} +DEFINE_VISIT_ADDITIONAL_CHILDREN(Subscriber); Subscriber::~Subscriber() = default; diff -Nru webkit2gtk-2.52.3/Source/WebCore/dom/Subscriber.h webkit2gtk-2.52.5/Source/WebCore/dom/Subscriber.h --- webkit2gtk-2.52.3/Source/WebCore/dom/Subscriber.h 2026-02-23 14:40:55.173302200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/dom/Subscriber.h 2026-07-09 07:12:42.012798300 +0000 @@ -58,10 +58,7 @@ void reportErrorObject(JSC::JSValue); - // JSCustomMarkFunction; for JSSubscriberCustom - Vector teardownCallbacksConcurrently(); - InternalObserver* observerConcurrently(); - void visitAdditionalChildren(JSC::AbstractSlotVisitor&); + template void visitAdditionalChildren(Visitor&); private: explicit Subscriber(ScriptExecutionContext&, Ref&&, const SubscribeOptions&); diff -Nru webkit2gtk-2.52.3/Source/WebCore/editing/CompositeEditCommand.cpp webkit2gtk-2.52.5/Source/WebCore/editing/CompositeEditCommand.cpp --- webkit2gtk-2.52.3/Source/WebCore/editing/CompositeEditCommand.cpp 2026-04-10 09:30:55.905680000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/editing/CompositeEditCommand.cpp 2026-07-09 07:12:42.016798300 +0000 @@ -66,6 +66,7 @@ #include "RemoveNodeCommand.h" #include "RemoveNodePreservingChildrenCommand.h" #include "RenderBlockFlow.h" +#include "RenderObjectStyle.h" #include "RenderStyle+GettersInlines.h" #include "RenderText.h" #include "RenderedDocumentMarker.h" diff -Nru webkit2gtk-2.52.3/Source/WebCore/editing/InsertParagraphSeparatorCommand.cpp webkit2gtk-2.52.5/Source/WebCore/editing/InsertParagraphSeparatorCommand.cpp --- webkit2gtk-2.52.3/Source/WebCore/editing/InsertParagraphSeparatorCommand.cpp 2026-04-10 09:30:55.909680000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/editing/InsertParagraphSeparatorCommand.cpp 2026-07-09 07:12:42.020798200 +0000 @@ -38,6 +38,7 @@ #include "NodeName.h" #include "NodeTraversal.h" #include "PositionInlines.h" +#include "RenderObjectStyle.h" #include "RenderText.h" #include "Text.h" #include "VisibleUnits.h" diff -Nru webkit2gtk-2.52.3/Source/WebCore/fileapi/AsyncFileStream.cpp webkit2gtk-2.52.5/Source/WebCore/fileapi/AsyncFileStream.cpp --- webkit2gtk-2.52.3/Source/WebCore/fileapi/AsyncFileStream.cpp 2026-02-23 14:40:55.213302000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/fileapi/AsyncFileStream.cpp 2026-07-09 07:12:42.024798200 +0000 @@ -164,12 +164,12 @@ }); } -void AsyncFileStream::read(std::span buffer) +void AsyncFileStream::read(const Box>& buffer, Function&& didRead) { - perform([buffer](FileStream& stream) -> Function { - int bytesRead = stream.read(buffer); - return [bytesRead](FileStreamClient& client) { - client.didRead(bytesRead); + perform([buffer, didRead = WTF::move(didRead)](FileStream& stream) mutable -> Function { + int bytesRead = stream.read(*buffer); + return [bytesRead, didRead = WTF::move(didRead)](FileStreamClient&) { + didRead(bytesRead); }; }); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/fileapi/AsyncFileStream.h webkit2gtk-2.52.5/Source/WebCore/fileapi/AsyncFileStream.h --- webkit2gtk-2.52.3/Source/WebCore/fileapi/AsyncFileStream.h 2026-01-20 14:08:44.899024000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/fileapi/AsyncFileStream.h 2026-07-09 07:12:42.024798200 +0000 @@ -31,6 +31,7 @@ #pragma once +#include #include #include #include @@ -50,7 +51,7 @@ void getSize(const String& path, std::optional expectedModificationTime); void openForRead(const String& path, long long offset, long long length); void close(); - void read(std::span buffer); + void read(const Box>& outputBuffer, Function&&); private: void start(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/history/CachedFrame.cpp webkit2gtk-2.52.5/Source/WebCore/history/CachedFrame.cpp --- webkit2gtk-2.52.3/Source/WebCore/history/CachedFrame.cpp 2026-04-10 09:30:55.912680000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/history/CachedFrame.cpp 2026-07-09 07:12:42.024798200 +0000 @@ -33,6 +33,7 @@ #include "DocumentPage.h" #include "DocumentView.h" #include "DocumentWindow.h" +#include "FrameDestructionObserverInlines.h" #include "FrameLoader.h" #include "LocalDOMWindow.h" #include "LocalFrame.h" diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/BaseDateAndTimeInputType.cpp webkit2gtk-2.52.5/Source/WebCore/html/BaseDateAndTimeInputType.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/BaseDateAndTimeInputType.cpp 2026-02-23 14:40:55.219302000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/BaseDateAndTimeInputType.cpp 2026-07-09 07:12:42.024798200 +0000 @@ -36,6 +36,7 @@ #include "BaseClickableWithKeyInputType.h" #include "Chrome.h" #include "ContainerNodeInlines.h" +#include "CSSSelector.h" #include "DateComponents.h" #include "DateTimeChooserParameters.h" #include "Decimal.h" @@ -51,6 +52,7 @@ #include "LocalFrameView.h" #include "NodeName.h" #include "PlatformLocale.h" +#include "PseudoClassChangeInvalidation.h" #include "RenderElement.h" #include "ScriptDisallowedScope.h" #include "Settings.h" @@ -269,16 +271,6 @@ return proposedValue; } -bool BaseDateAndTimeInputType::supportsReadOnly() const -{ - return true; -} - -bool BaseDateAndTimeInputType::shouldRespectListAttribute() -{ - return false; -} - bool BaseDateAndTimeInputType::valueMissing(const String& value) const { ASSERT(element()); @@ -377,8 +369,7 @@ if (auto* chrome = this->chrome()) { m_dateTimeChooser = chrome->createDateTimeChooser(*this); - if (RefPtr dateTimeChooser = m_dateTimeChooser) - dateTimeChooser->showChooser(parameters); + showDateTimeChooser(parameters); } } @@ -496,9 +487,22 @@ closeDateTimeChooser(); } -bool BaseDateAndTimeInputType::isPresentingAttachedView() const +void BaseDateAndTimeInputType::setPopupIsVisible(bool visible) { - return !!m_dateTimeChooser; + if (m_popupIsVisible == visible || !element()) + return; + Style::PseudoClassChangeInvalidation styleInvalidation(*protectedElement(), CSSSelector::PseudoClass::Open, visible); + m_popupIsVisible = visible; +} + +void BaseDateAndTimeInputType::showDateTimeChooser(const DateTimeChooserParameters& parameters) +{ + RefPtr dateTimeChooser = m_dateTimeChooser; + if (!dateTimeChooser) + return; + + setPopupIsVisible(true); + dateTimeChooser->showChooser(parameters); } auto BaseDateAndTimeInputType::handleKeydownEvent(KeyboardEvent& event) -> ShouldCallBaseEventHandler @@ -591,8 +595,7 @@ if (!setupDateTimeChooserParameters(parameters)) return; - if (RefPtr dateTimeChooser = m_dateTimeChooser) - dateTimeChooser->showChooser(parameters); + showDateTimeChooser(parameters); } void BaseDateAndTimeInputType::didReceiveSpaceKeyFromControl() @@ -601,15 +604,14 @@ m_pickerWasActivatedByKeyboard = true; m_didTransferFocusToPicker = true; - RefPtr chooser = m_dateTimeChooser; - if (!chooser) { + if (!m_dateTimeChooser) { showPicker(); return; } DateTimeChooserParameters parameters; if (setupDateTimeChooserParameters(parameters)) - chooser->showChooser(parameters); + showDateTimeChooser(parameters); } bool BaseDateAndTimeInputType::isEditControlOwnerDisabled() const @@ -636,11 +638,18 @@ protectedElement()->setValue(value.toString(), DispatchInputAndChangeEvent); } +void BaseDateAndTimeInputType::didEndChooser() +{ + m_dateTimeChooser = nullptr; + setPopupIsVisible(false); +} + bool BaseDateAndTimeInputType::setupDateTimeChooserParameters(DateTimeChooserParameters& parameters) { - ASSERT(element()); + RefPtr element = this->element(); + if (!element) + return false; - Ref element = *this->element(); Ref document = element->document(); if (!document->view()) @@ -700,6 +709,7 @@ { if (RefPtr dateTimeChooser = m_dateTimeChooser) dateTimeChooser->endChooser(); + setPopupIsVisible(false); m_didTransferFocusToPicker = false; m_pickerWasActivatedByKeyboard = false; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/BaseDateAndTimeInputType.h webkit2gtk-2.52.5/Source/WebCore/html/BaseDateAndTimeInputType.h --- webkit2gtk-2.52.3/Source/WebCore/html/BaseDateAndTimeInputType.h 2026-02-23 14:40:55.220301900 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/BaseDateAndTimeInputType.h 2026-07-09 07:12:42.024798200 +0000 @@ -55,6 +55,9 @@ bool typeMismatch() const final; bool hasBadInput() const final; + void ref() const final { InputType::ref(); } + void deref() const final { InputType::deref(); } + protected: enum class DateTimeFormatValidationResults : uint8_t { HasYear = 1 << 0, @@ -66,6 +69,18 @@ HasSecond = 1 << 6, HasMeridiem = 1 << 7, }; + class DateTimeFormatValidator final : public DateTimeFormat::TokenHandler { + public: + DateTimeFormatValidator() { } + + void visitField(DateTimeFormat::FieldType, int); + void visitLiteral(const String&) { } + + bool validateFormat(const String& format, const BaseDateAndTimeInputType&); + + private: + OptionSet m_results; + }; BaseDateAndTimeInputType(Type type, HTMLInputElement& element) : InputType(type, element) @@ -83,18 +98,6 @@ bool shouldHaveMillisecondField(const DateComponents&) const; private: - class DateTimeFormatValidator final : public DateTimeFormat::TokenHandler { - public: - DateTimeFormatValidator() { } - - void visitField(DateTimeFormat::FieldType, int); - void visitLiteral(const String&) { } - - bool validateFormat(const String& format, const BaseDateAndTimeInputType&); - - private: - OptionSet m_results; - }; virtual std::optional parseToDateComponents(StringView) const = 0; virtual std::optional setMillisecondToDateComponents(double) const = 0; @@ -113,8 +116,8 @@ ExceptionOr setValueAsDecimal(const Decimal&, TextFieldEventBehavior) const final; Decimal defaultValueForStepUp() const override; String localizeValue(const String&) const final; - bool supportsReadOnly() const final; - bool shouldRespectListAttribute() final; + bool supportsReadOnly() const final { return true; } + bool shouldRespectListAttribute() final { return false; } bool isKeyboardFocusable(const FocusEventData&) const final; bool isMouseFocusable() const final; @@ -125,7 +128,7 @@ void updateInnerTextValue() final; bool hasCustomFocusLogic() const final; void attributeChanged(const QualifiedName&) final; - bool isPresentingAttachedView() const final; + bool isPresentingAttachedView() const final { return m_popupIsVisible; } void elementDidBlur() final; void detach() final; @@ -147,9 +150,11 @@ // DateTimeChooserClient functions: void didChooseValue(StringView) final; - void didEndChooser() final { m_dateTimeChooser = nullptr; } + void didEndChooser() final; bool setupDateTimeChooserParameters(DateTimeChooserParameters&); + void showDateTimeChooser(const DateTimeChooserParameters&); + void setPopupIsVisible(bool); void closeDateTimeChooser(); void showPicker() override; @@ -159,6 +164,7 @@ RefPtr m_dateTimeChooser; RefPtr m_dateTimeEditElement; + bool m_popupIsVisible { false }; bool m_didTransferFocusToPicker { false }; bool m_pickerWasActivatedByKeyboard { false }; }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/CanvasBase.cpp webkit2gtk-2.52.5/Source/WebCore/html/CanvasBase.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/CanvasBase.cpp 2026-02-23 14:40:55.220301900 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/CanvasBase.cpp 2026-07-09 07:12:42.024798200 +0000 @@ -55,7 +55,6 @@ namespace WebCore { -constexpr InterpolationQuality defaultInterpolationQuality = InterpolationQuality::Low; static std::optional maxCanvasAreaForTesting; static std::optional canvasNoiseHashSaltIfNeeded(ScriptExecutionContext& context) @@ -79,17 +78,9 @@ { ASSERT(m_didNotifyObserversCanvasDestroyed); ASSERT(m_observers.isEmptyIgnoringNullReferences()); - ASSERT(!m_imageBuffer); m_canvasNoiseHashSalt = std::nullopt; } -ImageBuffer* CanvasBase::buffer() const -{ - if (!hasCreatedImageBuffer()) - createImageBuffer(); - return m_imageBuffer.get(); -} - RefPtr CanvasBase::makeRenderingResultsAvailable(ShouldApplyPostProcessingToDirtyRect shouldApplyPostProcessingToDirtyRect) { if (RefPtr context = renderingContext()) { @@ -98,23 +89,11 @@ m_canvasNoiseInjection.postProcessDirtyCanvasBuffer(buffer.get(), *m_canvasNoiseHashSalt, context->is2d() ? CanvasNoiseInjectionPostProcessArea::DirtyRect : CanvasNoiseInjectionPostProcessArea::FullBuffer); return buffer; } - return buffer(); -} - -size_t CanvasBase::memoryCost() const -{ - // May be called from GC threads. - return m_imageBufferMemoryCost.load(std::memory_order_relaxed); -} - -#if ENABLE(RESOURCE_USAGE) -size_t CanvasBase::externalMemoryCost() const -{ - // For the purposes of Web Inspector, external memory means memory reported as 1) being traceable from JS objects, i.e. GC owned memory - // 2) not allocated from "Page" category, e.g. from bmalloc. - return memoryCost(); + if (!validateArea()) + return nullptr; + // Currently we don't cache transparent black bitmaps of canvases that do not have a context. + return ImageBuffer::create(size(), RenderingMode::Unaccelerated, RenderingPurpose::Unspecified, 1, DestinationColorSpace::SRGB(), PixelFormat::BGRA8); } -#endif static inline size_t maxCanvasArea() { @@ -243,50 +222,15 @@ return; m_size = size; + m_hasWarnedExceedsArea = false; if (RefPtr context = renderingContext()) InspectorInstrumentation::didChangeCanvasSize(*context); } -RefPtr CanvasBase::setImageBuffer(RefPtr&& buffer) const -{ - m_contextStateSaver = nullptr; - RefPtr returnBuffer = std::exchange(m_imageBuffer, WTF::move(buffer)); - - IntSize oldSize = m_size; - size_t oldMemoryCost = m_imageBufferMemoryCost.load(std::memory_order_relaxed); - size_t newMemoryCost = 0; - if (RefPtr imageBuffer = m_imageBuffer) { - m_size = imageBuffer->truncatedLogicalSize(); - newMemoryCost = imageBuffer->memoryCost(); - imageBuffer->context().setShadowsIgnoreTransforms(true); - imageBuffer->context().setImageInterpolationQuality(defaultInterpolationQuality); - imageBuffer->context().setStrokeThickness(1); - m_contextStateSaver = makeUnique(imageBuffer->context()); - } - m_imageBufferMemoryCost.store(newMemoryCost, std::memory_order_relaxed); - if (newMemoryCost) { - if (RefPtr scriptExecutionContext = this->scriptExecutionContext()) { - JSC::JSLockHolder lock(scriptExecutionContext->vm()); - scriptExecutionContext->vm().heap.reportExtraMemoryAllocated(static_cast(nullptr), newMemoryCost); - } - } - if (RefPtr context = renderingContext()) { - if (oldSize != m_size) - InspectorInstrumentation::didChangeCanvasSize(*context); - if (oldMemoryCost != newMemoryCost) - InspectorInstrumentation::didChangeCanvasMemory(*context); - } - return returnBuffer; -} - -bool CanvasBase::shouldAccelerate(const IntSize& size) const -{ - return shouldAccelerate(size.unclampedArea()); -} - -bool CanvasBase::shouldAccelerate(uint64_t area) const +bool CanvasBase::shouldAccelerate() const { + size_t area = size().unclampedArea(); RefPtr scriptExecutionContext = this->scriptExecutionContext(); #if USE(CA) || USE(SKIA) if (!scriptExecutionContext->settingsValues().canvasUsesAcceleratedDrawing) @@ -304,31 +248,22 @@ #endif } -RefPtr CanvasBase::allocateImageBuffer() const +bool CanvasBase::validateArea() const { - uint64_t area = size().unclampedArea(); - RefPtr scriptExecutionContext = this->scriptExecutionContext(); + size_t area = size().unclampedArea(); if (!area) - return nullptr; + return false; if (area > maxCanvasArea()) { - auto message = makeString("Canvas area exceeds the maximum limit (width * height > "_s, maxCanvasArea(), ")."_s); - scriptExecutionContext->addConsoleMessage(MessageSource::JS, MessageLevel::Warning, message); - return nullptr; + if (!m_hasWarnedExceedsArea) { + if (RefPtr scriptExecutionContext = this->scriptExecutionContext()) { + auto message = makeString("Canvas area exceeds the maximum limit (width * height > "_s, maxCanvasArea(), ")."_s); + scriptExecutionContext->addConsoleMessage(MessageSource::JS, MessageLevel::Warning, message); + } + m_hasWarnedExceedsArea = true; + } + return false; } - - RefPtr context = renderingContext(); - bool willReadFrequently = context ? context->willReadFrequently() : false; - - RenderingMode renderingMode; - if (auto renderingModeForTesting = context ? context->renderingModeForTesting() : std::nullopt) - renderingMode = *renderingModeForTesting; - else - renderingMode = !willReadFrequently && shouldAccelerate(area) ? RenderingMode::Accelerated : RenderingMode::Unaccelerated; - - auto colorSpace = context ? context->colorSpace() : DestinationColorSpace::SRGB(); - auto pixelFormat = context ? context->pixelFormat() : PixelFormat::BGRA8; - - return ImageBuffer::create(size(), renderingMode, RenderingPurpose::Canvas, 1, colorSpace, pixelFormat, scriptExecutionContext->graphicsClient()); + return true; } bool CanvasBase::shouldInjectNoiseBeforeReadback() const @@ -398,15 +333,6 @@ return buffer; } -void CanvasBase::resetGraphicsContextState() const -{ - if (m_contextStateSaver) { - // Reset to the initial graphics context state. - m_contextStateSaver->restore(); - m_contextStateSaver->save(); - } -} - WebCoreOpaqueRoot root(CanvasBase* canvas) { return WebCoreOpaqueRoot { canvas }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/CanvasBase.h webkit2gtk-2.52.5/Source/WebCore/html/CanvasBase.h --- webkit2gtk-2.52.3/Source/WebCore/html/CanvasBase.h 2026-02-23 14:40:55.220301900 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/CanvasBase.h 2026-07-09 07:12:42.024798200 +0000 @@ -45,7 +45,6 @@ class Element; class Event; class GraphicsContext; -class GraphicsContextStateSaver; class Image; class ImageBuffer; class IntRect; @@ -73,18 +72,10 @@ virtual unsigned width() const { return m_size.width(); } virtual unsigned height() const { return m_size.height(); } const IntSize& size() const { return m_size; } - - ImageBuffer* buffer() const; - - virtual void setImageBufferAndMarkDirty(RefPtr&&) { } + virtual void setSizeForControllingContext(IntSize) = 0; RefPtr makeRenderingResultsAvailable(ShouldApplyPostProcessingToDirtyRect = ShouldApplyPostProcessingToDirtyRect::Yes); - size_t memoryCost() const; -#if ENABLE(RESOURCE_USAGE) - size_t externalMemoryCost() const; -#endif - void setOriginClean() { m_originClean = true; } void setOriginTainted() { m_originClean = false; } bool originClean() const { return m_originClean; } @@ -119,9 +110,10 @@ bool hasActiveInspectorCanvasCallTracer() const; - bool shouldAccelerate(const IntSize&) const; + bool shouldAccelerate() const; WEBCORE_EXPORT static void setMaxCanvasAreaForTesting(std::optional); + [[nodiscard]] bool validateArea() const; virtual void queueTaskKeepingObjectAlive(TaskSource, Function&&) = 0; virtual void dispatchEvent(Event&) = 0; @@ -129,17 +121,9 @@ bool postProcessPixelBufferResults(Ref&&) const; void recordLastFillText(const String&); - void resetGraphicsContextState() const; - void setNoiseInjectionSalt(NoiseInjectionHashSalt salt) { m_canvasNoiseHashSalt = salt; } bool havePendingCanvasNoiseInjection() const { return m_canvasNoiseInjection.haveDirtyRects(); } - // FIXME(https://bugs.webkit.org/show_bug.cgi?id=275100): The image buffer from CanvasBase should be moved to CanvasRenderingContext2DBase. - RefPtr allocateImageBuffer() const; - - void setHasCreatedImageBuffer(bool hasCreatedImageBuffer) { m_hasCreatedImageBuffer = hasCreatedImageBuffer; } - bool hasCreatedImageBuffer() const { return m_hasCreatedImageBuffer; } - RefPtr createImageForNoiseInjection() const; protected: @@ -151,20 +135,14 @@ void setSize(const IntSize&); - RefPtr setImageBuffer(RefPtr&&) const; String lastFillText() const { return m_lastFillText; } void addCanvasNeedingPreparationForDisplayOrFlush(); void removeCanvasNeedingPreparationForDisplayOrFlush(); private: bool shouldInjectNoiseBeforeReadback() const; - virtual void createImageBuffer() const { } - bool shouldAccelerate(uint64_t area) const; mutable IntSize m_size; - mutable RefPtr m_imageBuffer; - mutable std::atomic m_imageBufferMemoryCost { 0 }; - mutable std::unique_ptr m_contextStateSaver; mutable std::unique_ptr m_cssParserContext; String m_lastFillText; @@ -176,8 +154,7 @@ Markable::max()>> m_canvasNoiseHashSalt; bool m_originClean { true }; - // m_hasCreatedImageBuffer means we tried to malloc the buffer. We didn't necessarily get it. - bool m_hasCreatedImageBuffer { false }; + mutable bool m_hasWarnedExceedsArea { false }; #if ASSERT_ENABLED bool m_didNotifyObserversCanvasDestroyed { false }; #endif diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/ColorInputType.cpp webkit2gtk-2.52.5/Source/WebCore/html/ColorInputType.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/ColorInputType.cpp 2026-02-23 14:40:55.222302000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/ColorInputType.cpp 2026-07-09 07:12:42.024798200 +0000 @@ -34,6 +34,7 @@ #include "AXObjectCache.h" #include "CSSPropertyParserConsumer+ColorInlines.h" +#include "CSSSelector.h" #include "Chrome.h" #include "Color.h" #include "ColorSerialization.h" @@ -47,6 +48,7 @@ #include "HTMLInputElement.h" #include "HTMLOptionElement.h" #include "InputTypeNames.h" +#include "PseudoClassChangeInvalidation.h" #include "RenderTheme.h" #include "RenderView.h" #include "ScopedEventQueue.h" @@ -153,9 +155,12 @@ #endif } -bool ColorInputType::isPresentingAttachedView() const +void ColorInputType::setPopupIsVisible(bool visible) { - return !!m_chooser; + if (m_popupIsVisible == visible || !element()) + return; + Style::PseudoClassChangeInvalidation styleInvalidation(*protectedElement(), CSSSelector::PseudoClass::Open, visible); + m_popupIsVisible = visible; } const AtomString& ColorInputType::formControlType() const @@ -163,11 +168,6 @@ return InputTypeNames::color(); } -bool ColorInputType::supportsRequired() const -{ - return false; -} - ValueOrReference ColorInputType::fallbackValue() const { ASSERT(element()); @@ -261,17 +261,17 @@ void ColorInputType::showPicker() { - if (Chrome* chrome = this->chrome()) { - if (RefPtr chooser = m_chooser) - chooser->reattachColorChooser(valueAsColor()); - else - m_chooser = chrome->createColorChooser(*this, valueAsColor()); - } -} + auto* chrome = this->chrome(); + if (!chrome) + return; + + setPopupIsVisible(true); + + if (RefPtr chooser = m_chooser) + chooser->reattachColorChooser(valueAsColor()); + else + m_chooser = chrome->createColorChooser(*this, valueAsColor()); -bool ColorInputType::allowsShowPickerAcrossFrames() -{ - return true; } void ColorInputType::detach() @@ -284,16 +284,6 @@ endColorChooser(); } -bool ColorInputType::shouldRespectListAttribute() -{ - return true; -} - -bool ColorInputType::shouldResetOnDocumentActivation() -{ - return true; -} - void ColorInputType::didChooseColor(const Color& color) { ASSERT(element()); @@ -318,7 +308,8 @@ void ColorInputType::didEndChooser() { m_chooser = nullptr; - if (CheckedPtr renderer = protectedElement()->renderer()) + setPopupIsVisible(false); + if (CheckedPtr renderer = element()->renderer()) renderer->repaint(); } @@ -326,6 +317,7 @@ { if (RefPtr chooser = m_chooser) chooser->endChooser(); + setPopupIsVisible(false); } void ColorInputType::updateColorSwatch() diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/ColorInputType.h webkit2gtk-2.52.5/Source/WebCore/html/ColorInputType.h --- webkit2gtk-2.52.3/Source/WebCore/html/ColorInputType.h 2026-02-23 14:40:55.222302000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/ColorInputType.h 2026-07-09 07:12:42.024798200 +0000 @@ -71,9 +71,9 @@ std::optional rootFrameID() const final; bool isMouseFocusable() const final; bool isKeyboardFocusable(const FocusEventData&) const final; - bool isPresentingAttachedView() const final; + bool isPresentingAttachedView() const final { return m_popupIsVisible; } const AtomString& formControlType() const final; - bool supportsRequired() const final; + bool supportsRequired() const final { return false; } ValueOrReference fallbackValue() const final; ValueOrReference sanitizeValue(const String& value LIFETIME_BOUND) const final; void createShadowSubtree() final; @@ -81,16 +81,18 @@ void attributeChanged(const QualifiedName&) final; void handleDOMActivateEvent(Event&) final; void showPicker() final; - bool allowsShowPickerAcrossFrames() final; + bool allowsShowPickerAcrossFrames() final { return true; } void elementDidBlur() final; - bool shouldRespectListAttribute() final; - bool shouldResetOnDocumentActivation() final; + bool shouldRespectListAttribute() final { return true; } + bool shouldResetOnDocumentActivation() final { return true; } void endColorChooser(); + void setPopupIsVisible(bool); void updateColorSwatch(); HTMLElement* shadowColorSwatch() const; RefPtr m_chooser; + bool m_popupIsVisible { false }; }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/CustomPaintCanvas.cpp webkit2gtk-2.52.5/Source/WebCore/html/CustomPaintCanvas.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/CustomPaintCanvas.cpp 2026-02-23 14:40:55.222302000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/CustomPaintCanvas.cpp 2026-07-09 07:12:42.024798200 +0000 @@ -53,9 +53,6 @@ CustomPaintCanvas::~CustomPaintCanvas() { notifyObserversCanvasDestroyed(); - - m_context = nullptr; // Ensure this goes away before the ImageBuffer. - setImageBuffer(nullptr); } RefPtr CustomPaintCanvas::getContext() diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/CustomPaintCanvas.h webkit2gtk-2.52.5/Source/WebCore/html/CustomPaintCanvas.h --- webkit2gtk-2.52.3/Source/WebCore/html/CustomPaintCanvas.h 2026-02-23 14:40:55.222302000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/CustomPaintCanvas.h 2026-07-09 07:12:42.024798200 +0000 @@ -59,6 +59,7 @@ CanvasRenderingContext* renderingContext() const final { return m_context.get(); } void didDraw(const std::optional&, ShouldApplyPostProcessingToDirtyRect) final { } + void setSizeForControllingContext(IntSize) { }; Image* copiedImage() const final; void clearCopiedImage() const final; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/HTMLCanvasElement.cpp webkit2gtk-2.52.5/Source/WebCore/html/HTMLCanvasElement.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/HTMLCanvasElement.cpp 2026-02-23 14:40:55.230301900 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/HTMLCanvasElement.cpp 2026-07-09 07:12:42.028797900 +0000 @@ -151,9 +151,6 @@ // avoided in destructors, but works as long as it's done before HTMLCanvasElement destructs completely. notifyObserversCanvasDestroyed(); removeCanvasNeedingPreparationForDisplayOrFlush(); - - m_context = nullptr; // Ensure this goes away before the ImageBuffer. - setImageBuffer(nullptr); } bool HTMLCanvasElement::hasPresentationalHintsForAttribute(const QualifiedName& name) const @@ -175,8 +172,10 @@ void HTMLCanvasElement::attributeChanged(const QualifiedName& name, const AtomString& oldValue, const AtomString& newValue, AttributeModificationReason attributeModificationReason) { - if (name == widthAttr || name == heightAttr) - didUpdateSizeProperties(); + if (name == widthAttr || name == heightAttr) { + if (!isControlledByOffscreen()) + didUpdateSizeProperties(); + } HTMLElement::attributeChanged(name, oldValue, newValue, attributeModificationReason); } @@ -220,21 +219,21 @@ return { }; } -void HTMLCanvasElement::setCSSCanvasContextSize(const IntSize& newSize) +void HTMLCanvasElement::setSizeForControllingContext(IntSize newSize) { if (newSize == size()) return; - m_ignoreDidUpdateSizeProperties = true; - setWidth(newSize.width()); - setHeight(newSize.height()); + setAttributeWithoutSynchronization(widthAttr, AtomString::number(limitToOnlyHTMLNonNegative(newSize.width(), defaultWidth))); + setAttributeWithoutSynchronization(heightAttr, AtomString::number(limitToOnlyHTMLNonNegative(newSize.height(), defaultHeight))); m_ignoreDidUpdateSizeProperties = false; didUpdateSizeProperties(); } ExceptionOr> HTMLCanvasElement::getContext(JSC::JSGlobalObject& state, const String& contextId, FixedVector>&& arguments) { - if (m_context) { + auto getExistingContext = [&]() -> ExceptionOr> { + ASSERT(m_context); if (m_context->isPlaceholder()) return Exception { ExceptionCode::InvalidStateError }; @@ -271,7 +270,10 @@ ASSERT_NOT_REACHED(); return std::optional { std::nullopt }; - } + }; + + if (m_context) + return getExistingContext(); if (is2dType(contextId)) { Ref vm = state.vm(); @@ -281,6 +283,10 @@ if (settings.hasException(scope)) [[unlikely]] return Exception { ExceptionCode::ExistingExceptionError }; + // Dictionary conversion may run script, which may have set m_context via a re-entrant getContext(). + if (m_context) [[unlikely]] + return getExistingContext(); + RefPtr context = createContext2d(contextId, settings.releaseReturnValue()); if (!context) return std::optional { std::nullopt }; @@ -295,6 +301,10 @@ if (settings.hasException(scope)) [[unlikely]] return Exception { ExceptionCode::ExistingExceptionError }; + // Dictionary conversion may run script, which may have set m_context via a re-entrant getContext(). + if (m_context) [[unlikely]] + return getExistingContext(); + RefPtr context = createContextBitmapRenderer(contextId, settings.releaseReturnValue()); if (!context) return std::optional { std::nullopt }; @@ -310,6 +320,10 @@ if (attributes.hasException(scope)) [[unlikely]] return Exception { ExceptionCode::ExistingExceptionError }; + // Dictionary conversion may run script, which may have set m_context via a re-entrant getContext(). + if (m_context) [[unlikely]] + return getExistingContext(); + RefPtr context = createContextWebGL(toWebGLVersion(contextId), attributes.releaseReturnValue()); if (!context) return std::optional { std::nullopt }; @@ -363,7 +377,7 @@ CanvasRenderingContext2D* HTMLCanvasElement::createContext2d(const String& type, CanvasRenderingContext2DSettings&& settings) { ASSERT_UNUSED(HTMLCanvasElement::is2dType(type), type); - ASSERT(!m_context); + ASSERT_WITH_SECURITY_IMPLICATION(!m_context); m_context = CanvasRenderingContext2D::create(*this, WTF::move(settings), document().inQuirksMode()); if (!m_context) @@ -431,7 +445,7 @@ WebGLRenderingContextBase* HTMLCanvasElement::createContextWebGL(WebGLVersion type, WebGLContextAttributes&& attrs) { - ASSERT(!m_context); + ASSERT_WITH_SECURITY_IMPLICATION(!m_context); if (!shouldEnableWebGL(document().settings())) return nullptr; @@ -498,7 +512,7 @@ ImageBitmapRenderingContext* HTMLCanvasElement::createContextBitmapRenderer(const String& type, ImageBitmapRenderingContextSettings&& settings) { ASSERT_UNUSED(type, HTMLCanvasElement::isBitmapRendererType(type)); - ASSERT(!m_context); + ASSERT_WITH_SECURITY_IMPLICATION(!m_context); auto context = ImageBitmapRenderingContext::create(*this, WTF::move(settings)); WeakPtr weakContext = *context; @@ -530,7 +544,7 @@ GPUCanvasContext* HTMLCanvasElement::createContextWebGPU(const String& type, GPU* gpu) { ASSERT_UNUSED(type, HTMLCanvasElement::isWebGPUType(type)); - ASSERT(!m_context); + ASSERT_WITH_SECURITY_IMPLICATION(!m_context); if (!document().settings().webGPUEnabled() || !gpu) return nullptr; @@ -605,49 +619,27 @@ void HTMLCanvasElement::didUpdateSizeProperties() { - if (m_ignoreDidUpdateSizeProperties || isControlledByOffscreen()) + if (m_ignoreDidUpdateSizeProperties) return; - bool hadImageBuffer = hasCreatedImageBuffer(); - int w = limitToOnlyHTMLNonNegative(attributeWithoutSynchronization(widthAttr), defaultWidth); int h = limitToOnlyHTMLNonNegative(attributeWithoutSynchronization(heightAttr), defaultHeight); - if (RefPtr context = dynamicDowncast(m_context.get())) - context->reset(); - else - resetGraphicsContextState(); - IntSize oldSize = size(); IntSize newSize(w, h); - // If the size of an existing buffer matches, we can just clear it instead of reallocating. - // This optimization is only done for 2D canvases for now. - if (hasCreatedImageBuffer() && oldSize == newSize && m_context && m_context->is2d() && buffer() && m_context->colorSpace() == buffer()->colorSpace() && m_context->pixelFormat() == buffer()->pixelFormat()) { - if (!m_didClearImageBuffer) - clearImageBuffer(); - return; - } - - setSize(newSize); - setHasCreatedImageBuffer(false); - setImageBuffer(nullptr); + bool sizeChanged = oldSize != newSize; + CanvasBase::setSize(newSize); clearCopiedImage(); - - if (m_context) { - if (RefPtr context = dynamicDowncast(*m_context)) - context->reshape(); - } - + if (m_context) + m_context->didUpdateCanvasSizeProperties(sizeChanged); if (CheckedPtr canvasRenderer = dynamicDowncast(renderer())) { - if (oldSize != size()) { + if (sizeChanged) { canvasRenderer->canvasSizeChanged(); if (canvasRenderer->hasAcceleratedCompositing()) canvasRenderer->contentChanged(ContentChangeType::Canvas); } - if (hadImageBuffer) - canvasRenderer->repaint(); + canvasRenderer->repaint(); } - notifyObserversCanvasResized(); } @@ -894,49 +886,6 @@ return &protectedDocument()->securityOrigin(); } -void HTMLCanvasElement::createImageBuffer() const -{ - ASSERT(!hasCreatedImageBuffer()); - - const_cast(this)->setHasCreatedImageBuffer(true); - m_didClearImageBuffer = true; - setImageBuffer(allocateImageBuffer()); - -#if USE(CA) || USE(SKIA) - if (m_context && m_context->is2d()) { - // Recalculate compositing requirements if acceleration state changed. - const_cast(this)->invalidateStyleAndLayerComposition(); -#if USE(SKIA) - if (CheckedPtr renderer = renderBox()) { - if (usesContentsAsLayerContents()) - renderer->contentChanged(ContentChangeType::Canvas); - } -#endif - } -#endif -} - -void HTMLCanvasElement::setImageBufferAndMarkDirty(RefPtr&& buffer) -{ - IntSize oldSize = size(); - setHasCreatedImageBuffer(true); - setImageBuffer(WTF::move(buffer)); - - if (isControlledByOffscreen() && oldSize != size()) { - setAttributeWithoutSynchronization(widthAttr, AtomString::number(width())); - setAttributeWithoutSynchronization(heightAttr, AtomString::number(height())); - - if (CheckedPtr canvasRenderer = dynamicDowncast(renderer())) { - canvasRenderer->canvasSizeChanged(); - canvasRenderer->contentChanged(ContentChangeType::Canvas); - } - - notifyObserversCanvasResized(); - } - - CanvasBase::didDraw(FloatRect(FloatPoint(), size())); -} - Image* HTMLCanvasElement::copiedImage() const { if (!m_copiedImage) { @@ -947,24 +896,9 @@ return m_copiedImage.get(); } -void HTMLCanvasElement::clearImageBuffer() const -{ - ASSERT(hasCreatedImageBuffer()); - ASSERT(!m_didClearImageBuffer); - ASSERT(m_context); - - m_didClearImageBuffer = true; - - if (RefPtr canvas = dynamicDowncast(*m_context)) { - // No need to undo transforms/clip/etc. because we are called right after the context is reset. - canvas->clearRect(0, 0, width(), height()); - } -} - void HTMLCanvasElement::clearCopiedImage() const { m_copiedImage = nullptr; - m_didClearImageBuffer = false; } bool HTMLCanvasElement::virtualHasPendingActivity() const diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/HTMLCanvasElement.h webkit2gtk-2.52.5/Source/WebCore/html/HTMLCanvasElement.h --- webkit2gtk-2.52.3/Source/WebCore/html/HTMLCanvasElement.h 2026-02-23 14:40:55.230301900 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/HTMLCanvasElement.h 2026-07-09 07:12:42.028797900 +0000 @@ -77,7 +77,6 @@ WEBCORE_EXPORT ExceptionOr setWidth(unsigned); WEBCORE_EXPORT ExceptionOr setHeight(unsigned); - void setCSSCanvasContextSize(const IntSize& newSize); CanvasRenderingContext* renderingContext() const final { return m_context.get(); } ExceptionOr> getContext(JSC::JSGlobalObject&, const String& contextId, FixedVector>&& arguments); @@ -131,10 +130,6 @@ SecurityOrigin* securityOrigin() const final; - // FIXME(https://bugs.webkit.org/show_bug.cgi?id=275100): Only some canvas rendering contexts need an ImageBuffer. - // It would be better to have the contexts own the buffers. - void setImageBufferAndMarkDirty(RefPtr&&) final; - bool needsPreparationForDisplay(); void prepareForDisplay(); void dynamicRangeLimitDidChange(PlatformDynamicRangeLimit); @@ -154,6 +149,8 @@ using HTMLElement::scriptExecutionContext; + void setSizeForControllingContext(IntSize) final; + private: HTMLCanvasElement(const QualifiedName&, Document&); @@ -176,9 +173,6 @@ void didUpdateSizeProperties(); - void createImageBuffer() const final; - void clearImageBuffer() const; - bool usesContentsAsLayerContents() const; ScriptExecutionContext* canvasBaseScriptExecutionContext() const final { return HTMLElement::scriptExecutionContext(); } @@ -189,7 +183,6 @@ std::optional computeDirtyRectangleIfNeeded(const std::optional&) const; bool m_ignoreDidUpdateSizeProperties { false }; - mutable bool m_didClearImageBuffer { false }; #if ENABLE(WEBGL) bool m_hasRelevantWebGLEventListener { false }; #endif diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/HTMLCanvasElement.idl webkit2gtk-2.52.5/Source/WebCore/html/HTMLCanvasElement.idl --- webkit2gtk-2.52.3/Source/WebCore/html/HTMLCanvasElement.idl 2026-01-20 14:08:44.959676700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/HTMLCanvasElement.idl 2026-07-09 07:12:42.028797900 +0000 @@ -38,8 +38,6 @@ ActiveDOMObject, JSCustomMarkFunction, JSGenerateToNativeObject, - ReportExtraMemoryCost, - ReportExternalMemoryCost, Exposed=Window ] interface HTMLCanvasElement : HTMLElement { [CEReactions=NotNeeded, CallTracer=InspectorCanvasCallTracer] attribute unsigned long width; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/HTMLDetailsElement.cpp webkit2gtk-2.52.5/Source/WebCore/html/HTMLDetailsElement.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/HTMLDetailsElement.cpp 2026-02-23 14:40:55.231301800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/HTMLDetailsElement.cpp 2026-07-09 07:12:42.028797900 +0000 @@ -34,6 +34,7 @@ #include "HTMLSummaryElement.h" #include "LocalizedStrings.h" #include "MouseEvent.h" +#include "PseudoClassChangeInvalidation.h" #include "ShadowRoot.h" #include "ShouldNotFireMutationEventsScope.h" #include "SlotAssignment.h" @@ -164,6 +165,9 @@ RefPtr root = shadowRoot(); RefPtr defaultSlot = m_defaultSlot; ASSERT(root); + auto isOpen = !newValue.isNull(); + Style::PseudoClassChangeInvalidation styleInvalidation(*this, CSSSelector::PseudoClass::Open, isOpen); + m_isOpen = isOpen; if (!newValue.isNull()) { defaultSlot->removeInlineStyleProperty(CSSPropertyContentVisibility); queueDetailsToggleEventTask(ToggleState::Closed, ToggleState::Open); @@ -223,4 +227,9 @@ setBooleanAttribute(HTMLNames::openAttr, !hasAttributeWithoutSynchronization(HTMLNames::openAttr)); } +bool HTMLDetailsElement::isOpen() const +{ + return m_isOpen; +} + } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/HTMLDetailsElement.h webkit2gtk-2.52.5/Source/WebCore/html/HTMLDetailsElement.h --- webkit2gtk-2.52.3/Source/WebCore/html/HTMLDetailsElement.h 2026-02-23 14:40:55.231301800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/HTMLDetailsElement.h 2026-07-09 07:12:42.028797900 +0000 @@ -41,6 +41,8 @@ void queueDetailsToggleEventTask(ToggleState oldState, ToggleState newState); + bool isOpen() const; + private: HTMLDetailsElement(const QualifiedName&, Document&); @@ -57,6 +59,7 @@ WeakPtr m_summarySlot; WeakPtr m_defaultSummary; RefPtr m_defaultSlot; + bool m_isOpen { false }; RefPtr m_toggleEventTask; }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/HTMLDialogElement.cpp webkit2gtk-2.52.5/Source/WebCore/html/HTMLDialogElement.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/HTMLDialogElement.cpp 2026-04-10 09:30:55.915680000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/HTMLDialogElement.cpp 2026-07-09 07:12:42.028797900 +0000 @@ -217,11 +217,13 @@ if (isOpen()) { if (command == CommandType::Close) { - close(invoker.value().string()); + String value = invoker.value().string(); + close(value); return true; } if (command == CommandType::RequestClose) { - requestClose(invoker.value().string()); + String value = invoker.value().string(); + requestClose(value); return true; } } else { @@ -288,6 +290,16 @@ setIsModal(false); } +void HTMLDialogElement::attributeChanged(const QualifiedName& name, const AtomString& oldValue, const AtomString& newValue, AttributeModificationReason attributeModificationReason) +{ + HTMLElement::attributeChanged(name, oldValue, newValue, attributeModificationReason); + if (name == openAttr) { + auto isOpen = !newValue.isNull(); + Style::PseudoClassChangeInvalidation styleInvalidation(*this, CSSSelector::PseudoClass::Open, isOpen); + m_isOpen = isOpen; + } +} + void HTMLDialogElement::setIsModal(bool newValue) { if (m_isModal == newValue) @@ -306,7 +318,7 @@ bool HTMLDialogElement::isOpen() const { - return hasAttributeWithoutSynchronization(HTMLNames::openAttr); + return m_isOpen; } } diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/HTMLDialogElement.h webkit2gtk-2.52.5/Source/WebCore/html/HTMLDialogElement.h --- webkit2gtk-2.52.3/Source/WebCore/html/HTMLDialogElement.h 2026-02-23 14:40:55.231301800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/HTMLDialogElement.h 2026-07-09 07:12:42.028797900 +0000 @@ -64,8 +64,11 @@ void setIsModal(bool newValue); bool supportsFocus() const final; + void attributeChanged(const QualifiedName&, const AtomString& oldValue, const AtomString& newValue, AttributeModificationReason) final; + String m_returnValue; bool m_isModal { false }; + bool m_isOpen { false }; WeakPtr m_previouslyFocusedElement; RefPtr m_toggleEventTask; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/HTMLMediaElement.cpp webkit2gtk-2.52.5/Source/WebCore/html/HTMLMediaElement.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/HTMLMediaElement.cpp 2026-04-10 09:30:55.922680000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/HTMLMediaElement.cpp 2026-07-09 07:12:42.036797800 +0000 @@ -3205,9 +3205,15 @@ if (!protectedDocument()->quirks().needsAutoplayPlayPauseEvents()) return; + if (m_isDispatchingAutoplayPlayPauseQuirkEvents) + return; + ALWAYS_LOG(LOGIDENTIFIER); - scheduleEvent(eventNames().playingEvent); - scheduleEvent(eventNames().pauseEvent); + queueCancellableTaskKeepingObjectAlive(*this, TaskSource::MediaElement, m_asyncEventsCancellationGroup, [](auto& element) { + SetForScope dispatching(element.m_isDispatchingAutoplayPlayPauseQuirkEvents, true); + element.dispatchEvent(Event::create(eventNames().playingEvent, Event::CanBubble::No, Event::IsCancelable::Yes)); + element.dispatchEvent(Event::create(eventNames().pauseEvent, Event::CanBubble::No, Event::IsCancelable::Yes)); + }); } void HTMLMediaElement::durationChanged() @@ -9046,6 +9052,13 @@ bool HTMLMediaElement::canProduceAudio() const { + return m_cachedCanProduceAudio.load(std::memory_order_relaxed); +} + +bool HTMLMediaElement::computeCanProduceAudio() const +{ + ASSERT(isMainThread()); + #if ENABLE(WIRELESS_PLAYBACK_TARGET) // Because the remote target could unmute playback without notifying us, we must assume // that we may be playing audio. @@ -10262,6 +10275,7 @@ void HTMLMediaElement::canProduceAudioChanged() { + m_cachedCanProduceAudio.store(computeCanProduceAudio(), std::memory_order_relaxed); protectedMediaSession()->canProduceAudioChanged(); updateSleepDisabling(); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/HTMLMediaElement.h webkit2gtk-2.52.5/Source/WebCore/html/HTMLMediaElement.h --- webkit2gtk-2.52.3/Source/WebCore/html/HTMLMediaElement.h 2026-03-25 21:32:59.459017800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/HTMLMediaElement.h 2026-07-09 07:12:42.036797800 +0000 @@ -1059,6 +1059,7 @@ bool shouldOverrideBackgroundPlaybackRestriction(PlatformMediaSession::InterruptionType) const override; bool shouldOverrideBackgroundLoadingRestriction() const override; bool canProduceAudio() const final; + bool computeCanProduceAudio() const; bool isEnded() const final { return ended(); } MediaTime mediaSessionDuration() const final; bool hasMediaStreamSource() const final; @@ -1351,6 +1352,7 @@ ControlsState m_controlsState { ControlsState::None }; AutoplayEventPlaybackState m_autoplayEventPlaybackState { AutoplayEventPlaybackState::None }; + bool m_isDispatchingAutoplayPlayPauseQuirkEvents { false }; String m_subtitleTrackLanguage; std::optional m_languageOfPrimaryAudioTrack; @@ -1446,6 +1448,9 @@ bool m_showingStats { false }; + // Cached by canProduceAudioChanged() so virtualHasPendingActivity() can read it safely from the GC thread. + std::atomic m_cachedCanProduceAudio { false }; + #if ENABLE(SPEECH_SYNTHESIS) RefPtr m_speechSynthesis; #endif diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/HTMLOptGroupElement.cpp webkit2gtk-2.52.5/Source/WebCore/html/HTMLOptGroupElement.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/HTMLOptGroupElement.cpp 2026-04-11 00:10:05.674641100 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/HTMLOptGroupElement.cpp 2026-07-09 07:12:42.036797800 +0000 @@ -34,7 +34,6 @@ #include "HTMLOptionElement.h" #include "HTMLSelectElement.h" #include "PseudoClassChangeInvalidation.h" -#include "RenderMenuList.h" #include "NodeRenderStyle.h" #include "ScriptDisallowedScope.h" #include "ScriptElement.h" diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/HTMLOptionElement.cpp webkit2gtk-2.52.5/Source/WebCore/html/HTMLOptionElement.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/HTMLOptionElement.cpp 2026-04-11 00:12:28.036279200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/HTMLOptionElement.cpp 2026-07-09 07:12:42.036797800 +0000 @@ -40,7 +40,6 @@ #include "NodeRenderStyle.h" #include "NodeTraversal.h" #include "PseudoClassChangeInvalidation.h" -#include "RenderMenuList.h" #include "RenderStyle+GettersInlines.h" #include "RenderTheme.h" #include "ScriptElement.h" diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/HTMLPlugInElement.cpp webkit2gtk-2.52.5/Source/WebCore/html/HTMLPlugInElement.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/HTMLPlugInElement.cpp 2026-02-23 14:40:55.245301700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/HTMLPlugInElement.cpp 2026-07-09 07:12:42.036797800 +0000 @@ -89,6 +89,12 @@ #include #include +#if ENABLE(CONTENT_EXTENSIONS) +#include "ContentExtensionsBackend.h" +#include "ResourceLoadInfo.h" +#include "UserContentProvider.h" +#endif + #if PLATFORM(COCOA) #include "YouTubePluginReplacement.h" #endif @@ -550,6 +556,20 @@ return false; } +#if ENABLE(CONTENT_EXTENSIONS) + if (completeURL.isValid()) { + RefPtr page = document().page(); + RefPtr frame = document().frame(); + RefPtr documentLoader = frame ? frame->loader().documentLoader() : nullptr; + RefPtr userContentProvider = frame ? frame->userContentProvider() : nullptr; + if (page && documentLoader && userContentProvider) { + auto results = userContentProvider->processContentRuleListsForLoad(*page, completeURL, ContentExtensions::ResourceType::Other, *documentLoader); + if (results.shouldBlock()) + return false; + } + } +#endif + return !isProhibitedSelfReference(completeURL); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/HTMLSelectElement.cpp webkit2gtk-2.52.5/Source/WebCore/html/HTMLSelectElement.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/HTMLSelectElement.cpp 2026-02-23 14:40:55.247301800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/HTMLSelectElement.cpp 2026-07-09 07:12:42.040797700 +0000 @@ -37,6 +37,7 @@ #include "DocumentInlines.h" #include "DocumentPage.h" #include "DocumentSecurityOrigin.h" +#include "DocumentView.h" #include "ElementChildIteratorInlines.h" #include "ElementTraversal.h" #include "EventHandler.h" @@ -58,6 +59,7 @@ #include "MouseEvent.h" #include "NodeName.h" #include "NodeRareData.h" +#include "PseudoClassChangeInvalidation.h" #include "RenderListBox.h" #include "RenderMenuList.h" #include "RenderScrollbar.h" @@ -68,6 +70,10 @@ #include #include +#if !PLATFORM(IOS_FAMILY) +#include +#endif + namespace WebCore { WTF_MAKE_TZONE_ALLOCATED_IMPL(HTMLSelectElement); @@ -106,6 +112,19 @@ return adoptRef(*new HTMLSelectElement(selectTag, document, nullptr)); } +HTMLSelectElement::~HTMLSelectElement() = default; + +void HTMLSelectElement::didDetachRenderers() +{ +#if !PLATFORM(IOS_FAMILY) + if (RefPtr popup = m_popup) + popup->hide(); + m_popup = nullptr; + setPopupIsVisible(false); +#endif + HTMLFormControlElement::didDetachRenderers(); +} + HTMLSelectElement* HTMLSelectElement::findOwnerSelect(ContainerNode* startNode, ExcludeOptGroup excludeOptGroup) { if (!startNode) @@ -787,6 +806,15 @@ downcast(*renderer).setOptionsChanged(true); #endif } + + +#if !PLATFORM(IOS_FAMILY) + if (!m_popupIsVisible) + return; + + if (RefPtr popup = m_popup) + popup->updateFromElement(); +#endif } const Vector>& HTMLSelectElement::listItems() const @@ -1203,8 +1231,7 @@ // Calling focus() may cause us to lose our renderer. Return true so // that our caller doesn't process the event further, but don't set // the event as handled. - WeakPtr renderer = dynamicDowncast(this->renderer()); - if (!renderer) + if (!is(renderer())) return true; // Save the selection so it can be compared to the new selection @@ -1212,7 +1239,7 @@ // gets called from RenderMenuList::valueChanged, which gets called // after the user makes a selection from the menu. saveLastSelection(); - renderer->showPopup(); // showPopup() may run JS and cause the renderer to get destroyed. + showPopup(); // showPopup() may run JS and cause the renderer to get destroyed. event->setDefaultHandled(); } return true; @@ -1302,8 +1329,7 @@ protectedDocument()->updateStyleIfNeeded(); // Calling focus() may remove the renderer or change the renderer type. - WeakPtr renderer = dynamicDowncast(this->renderer()); - if (!renderer) + if (!is(renderer())) return; // Save the selection so it can be compared to the new selection @@ -1311,7 +1337,7 @@ // gets called from RenderMenuList::valueChanged, which gets called // after the user makes a selection from the menu. saveLastSelection(); - renderer->showPopup(); // showPopup() may run JS and cause the renderer to get destroyed. + showPopup(); // showPopup() may run JS and cause the renderer to get destroyed. handled = true; } } else if (RenderTheme::singleton().popsMenuByArrowKeys()) { @@ -1320,8 +1346,7 @@ protectedDocument()->updateStyleIfNeeded(); // Calling focus() may remove the renderer or change the renderer type. - WeakPtr renderer = dynamicDowncast(this->renderer()); - if (!renderer) + if (!is(renderer())) return; // Save the selection so it can be compared to the new selection @@ -1329,7 +1354,7 @@ // gets called from RenderMenuList::valueChanged, which gets called // after the user makes a selection from the menu. saveLastSelection(); - renderer->showPopup(); // showPopup() may run JS and cause the renderer to get destroyed. + showPopup(); // showPopup() may run JS and cause the renderer to get destroyed. handled = true; } else if (keyCode == '\r') { if (RefPtr form = this->form()) @@ -1348,15 +1373,15 @@ #if !PLATFORM(IOS_FAMILY) protectedDocument()->updateStyleIfNeeded(); - if (WeakPtr menuList = dynamicDowncast(renderer())) { - ASSERT(!menuList->popupIsVisible()); + if (is(renderer())) { + ASSERT(!m_popupIsVisible); // Save the selection so it can be compared to the new // selection when we call onChange during selectOption, // which gets called from RenderMenuList::valueChanged, // which gets called after the user makes a selection from // the menu. saveLastSelection(); - menuList->showPopup(); // showPopup() may run JS and cause the renderer to get destroyed. + showPopup(); // showPopup() may run JS and cause the renderer to get destroyed. } #endif event.setDefaultHandled(); @@ -1365,8 +1390,8 @@ #if !PLATFORM(IOS_FAMILY) if (event.type() == eventNames.blurEvent && !focused()) { CheckedRef menuList = downcast(*renderer()); - if (menuList->popupIsVisible()) - menuList->hidePopup(); + if (m_popupIsVisible) + hidePopup(); } #endif } @@ -1739,6 +1764,61 @@ return options; } +#if PLATFORM(IOS_FAMILY) +NO_RETURN_DUE_TO_ASSERT +void HTMLSelectElement::showPopup() +{ + ASSERT_NOT_REACHED(); +} +#else +void HTMLSelectElement::showPopup() +{ + if (m_popupIsVisible) + return; + + CheckedPtr renderer = dynamicDowncast(this->renderer()); + if (!renderer) + return; + + RefPtr frame = document().frame(); + if (!frame) + return; + + RefPtr frameView = frame->view(); + if (!frameView) + return; + + if (!m_popup) + m_popup = document().page()->chrome().createPopupMenu(*this); + setPopupIsVisible(true); + + // Compute the top left taking transforms into account, but use + // the actual width of the element to size the popup. + FloatPoint absTopLeft = renderer->localToAbsolute(FloatPoint(), UseTransforms); + IntRect absBounds = renderer->absoluteBoundingBoxRectIgnoringTransforms(); + absBounds.setLocation(roundedIntPoint(absTopLeft)); + + RefPtr { m_popup }->show(absBounds, *frameView, optionToListIndex(selectedIndex())); // May run JS. +} + +void HTMLSelectElement::hidePopup() +{ + if (RefPtr popup = m_popup) + popup->hide(); +} +#endif + +void HTMLSelectElement::setPopupIsVisible(bool visible) +{ + Style::PseudoClassChangeInvalidation styleInvalidation(*this, CSSSelector::PseudoClass::Open, visible); + m_popupIsVisible = visible; +} + +bool HTMLSelectElement::isOpen() const +{ + return m_popupIsVisible; +} + ExceptionOr HTMLSelectElement::showPicker() { RefPtr frame = document().frame(); @@ -1758,8 +1838,7 @@ return Exception { ExceptionCode::NotAllowedError, "Select showPicker() requires a user gesture."_s }; #if !PLATFORM(IOS_FAMILY) - if (WeakPtr renderMenuList = dynamicDowncast(renderer())) - renderMenuList->showPopup(); // showPopup() may run JS and cause the renderer to get destroyed. + showPopup(); // showPopup() may run JS and cause the renderer to get destroyed. #endif return { }; @@ -1853,8 +1932,8 @@ Color itemBackgroundColor; bool itemHasCustomBackgroundColor = false; - if (CheckedPtr renderer = this->renderer()) - downcast(*renderer).getItemBackgroundColor(listIndex, itemBackgroundColor, itemHasCustomBackgroundColor); + if (CheckedPtr menuList = dynamicDowncast(renderer())) + menuList->getItemBackgroundColor(listIndex, itemBackgroundColor, itemHasCustomBackgroundColor); CheckedPtr style = element->computedStyleForEditability(); if (!style) @@ -1880,6 +1959,8 @@ CheckedPtr renderer = dynamicDowncast(this->renderer()); CheckedRef outerStyle = renderer ? renderer->style() : defaultStyle; CheckedRef innerStyle = (renderer && renderer->innerRenderer()) ? renderer->innerRenderer()->style() : outerStyle.get(); + auto bounds = renderer->absoluteBoundingBoxRectIgnoringTransforms(); + auto popupSize = RenderTheme::singleton().popupMenuSize(outerStyle, bounds); return PopupMenuStyle( innerStyle->visitedDependentColorApplyingColorFilter(), innerStyle->visitedDependentBackgroundColorApplyingColorFilter(), @@ -1892,7 +1973,7 @@ isOverride(outerStyle->unicodeBidi()), PopupMenuStyle::DefaultBackgroundColor, PopupMenuStyle::SelectPopup, - renderer ? renderer->popupMenuSize(innerStyle) : PopupMenuStyle::Size::Normal + popupSize ); } @@ -1930,8 +2011,9 @@ void HTMLSelectElement::popupDidHide() { - if (CheckedPtr renderer = dynamicDowncast(this->renderer())) - renderer->popupDidHide(); +#if !PLATFORM(IOS_FAMILY) + setPopupIsVisible(false); +#endif } bool HTMLSelectElement::itemIsSeparator(unsigned listIndex) const diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/HTMLSelectElement.h webkit2gtk-2.52.5/Source/WebCore/html/HTMLSelectElement.h --- webkit2gtk-2.52.3/Source/WebCore/html/HTMLSelectElement.h 2026-02-23 14:40:55.247301800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/HTMLSelectElement.h 2026-07-09 07:12:42.040797700 +0000 @@ -41,7 +41,11 @@ class HTMLOptionsCollection; -class HTMLSelectElement : public HTMLFormControlElement, public PopupMenuClient, private TypeAheadDataSource { +#if !PLATFORM(IOS_FAMILY) +class PopupMenu; +#endif + +class HTMLSelectElement final : public HTMLFormControlElement, public PopupMenuClient, private TypeAheadDataSource { WTF_MAKE_TZONE_ALLOCATED(HTMLSelectElement); WTF_OVERRIDE_DELETE_FOR_CHECKED_PTR(HTMLSelectElement); public: @@ -56,8 +60,17 @@ static Ref create(const QualifiedName&, Document&, HTMLFormElement*); static Ref create(Document&); + ~HTMLSelectElement(); enum class ExcludeOptGroup : bool { No, Yes }; + + enum SelectOptionFlag { + DeselectOtherOptions = 1 << 0, + DispatchChangeEvent = 1 << 1, + UserDriven = 1 << 2, + }; + + enum SkipDirection { SkipBackwards = -1, SkipForwards = 1 }; static HTMLSelectElement* findOwnerSelect(ContainerNode*, ExcludeOptGroup); WEBCORE_EXPORT int selectedIndex() const; @@ -106,6 +119,16 @@ ExceptionOr showPicker(); + void showPopup(); +#if !PLATFORM(IOS_FAMILY) + void hidePopup(); +#endif + + bool popupIsVisible() const { return m_popupIsVisible; } + WEBCORE_EXPORT void setPopupIsVisible(bool); + + bool isOpen() const; + // PopupMenuClient methods void valueChanged(unsigned listIndex, bool fireOnChange = true) override; void selectionChanged(unsigned, bool) override { } @@ -213,12 +236,6 @@ bool isRequiredFormControl() const final; bool hasPlaceholderLabelOption() const; - - enum SelectOptionFlag { - DeselectOtherOptions = 1 << 0, - DispatchChangeEvent = 1 << 1, - UserDriven = 1 << 2, - }; typedef unsigned SelectOptionFlags; void selectOption(int optionIndex, SelectOptionFlags = 0); void deselectItemsWithoutValidation(HTMLElement* elementToExclude = nullptr); @@ -230,8 +247,6 @@ void listBoxDefaultEventHandler(Event&); void setOptionsChangedOnRenderer(); size_t searchOptionsForValue(const String&, size_t listIndexStart, size_t listIndexEnd) const; - - enum SkipDirection { SkipBackwards = -1, SkipForwards = 1 }; int nextValidIndex(int listIndex, SkipDirection, int skip) const; int nextSelectableListIndex(int startIndex) const; int previousSelectableListIndex(int startIndex) const; @@ -241,6 +256,8 @@ void childrenChanged(const ChildChange&) final; + void didDetachRenderers() final; + // TypeAheadDataSource functions. int indexOfSelectedOption() const final; int optionCount() const final; @@ -261,6 +278,11 @@ bool m_activeSelectionState; bool m_allowsNonContiguousSelection; mutable bool m_shouldRecalcListItems; + +#if !PLATFORM(IOS_FAMILY) + RefPtr m_popup; +#endif + bool m_popupIsVisible { false }; }; } // namespace diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/ImageBitmap.cpp webkit2gtk-2.52.5/Source/WebCore/html/ImageBitmap.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/ImageBitmap.cpp 2026-03-25 10:23:21.883028700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/ImageBitmap.cpp 2026-07-09 07:12:42.040797700 +0000 @@ -78,6 +78,14 @@ { } +DetachedImageBitmap::DetachedImageBitmap(const DetachedImageBitmap& other) + : m_bitmap(makeUniqueRefFromNonNullUniquePtr(other.m_bitmap->clone())) + , m_originClean(other.m_originClean) + , m_premultiplyAlpha(other.m_premultiplyAlpha) + , m_forciblyPremultiplyAlpha(other.m_forciblyPremultiplyAlpha) +{ +} + DetachedImageBitmap::DetachedImageBitmap(DetachedImageBitmap&&) = default; DetachedImageBitmap::~DetachedImageBitmap() = default; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/ImageBitmap.h webkit2gtk-2.52.5/Source/WebCore/html/ImageBitmap.h --- webkit2gtk-2.52.3/Source/WebCore/html/ImageBitmap.h 2026-02-23 14:40:55.254301800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/ImageBitmap.h 2026-07-09 07:12:42.040797700 +0000 @@ -73,6 +73,7 @@ class DetachedImageBitmap { public: + DetachedImageBitmap(const DetachedImageBitmap&); DetachedImageBitmap(DetachedImageBitmap&&); WEBCORE_EXPORT ~DetachedImageBitmap(); DetachedImageBitmap& operator=(DetachedImageBitmap&&); diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/ImageDocument.cpp webkit2gtk-2.52.5/Source/WebCore/html/ImageDocument.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/ImageDocument.cpp 2026-02-23 14:40:55.255301700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/ImageDocument.cpp 2026-07-09 07:12:42.040797700 +0000 @@ -55,6 +55,7 @@ #include "RenderElement.h" #include "Settings.h" #include "UserScriptTypes.h" +#include #include #include @@ -448,8 +449,8 @@ float scale = this->scale(); auto viewportSize = view->visibleSize(); - int scrollX = static_cast(x / scale - viewportSize.width() / 2.0f); - int scrollY = static_cast(y / scale - viewportSize.height() / 2.0f); + int scrollX = truncateFloatToInt32(x / scale - viewportSize.width() / 2.0f); + int scrollY = truncateFloatToInt32(y / scale - viewportSize.height() / 2.0f); view->setScrollPosition(IntPoint(scrollX, scrollY)); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/OffscreenCanvas.cpp webkit2gtk-2.52.5/Source/WebCore/html/OffscreenCanvas.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/OffscreenCanvas.cpp 2026-02-23 14:40:55.260301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/OffscreenCanvas.cpp 2026-07-09 07:12:42.044797700 +0000 @@ -35,6 +35,7 @@ #include "Chrome.h" #include "Document.h" #include "EventDispatcher.h" +#include "EventNames.h" #include "GPU.h" #include "GPUCanvasContext.h" #include "HTMLCanvasElement.h" @@ -130,42 +131,46 @@ { notifyObserversCanvasDestroyed(); removeCanvasNeedingPreparationForDisplayOrFlush(); - - m_context = nullptr; // Ensure this goes away before the ImageBuffer. - setImageBuffer(nullptr); } void OffscreenCanvas::setWidth(unsigned newWidth) { if (m_detached) return; - setSize(IntSize(newWidth, height())); - didUpdateSizeProperties(); + IntSize newSize(newWidth, height()); + bool sizeChanged = newSize != size(); + if (sizeChanged) + setSize(newSize); + didUpdateSizeProperties(sizeChanged); } void OffscreenCanvas::setHeight(unsigned newHeight) { if (m_detached) return; - setSize(IntSize(width(), newHeight)); - didUpdateSizeProperties(); + IntSize newSize(width(), newHeight); + bool sizeChanged = newSize != size(); + if (sizeChanged) + setSize(newSize); + didUpdateSizeProperties(sizeChanged); } -void OffscreenCanvas::didUpdateSizeProperties() +void OffscreenCanvas::setSizeForControllingContext(IntSize newSize) { - resetGraphicsContextState(); - if (RefPtr context = dynamicDowncast(m_context.get())) - context->reset(); + // Controlling context size change semantics are different to width, height assignment. + if (size() == newSize) + return; + setSize(newSize); + didUpdateSizeProperties(true); +} - setHasCreatedImageBuffer(false); - setImageBuffer(nullptr); +void OffscreenCanvas::didUpdateSizeProperties(bool sizeChanged) +{ clearCopiedImage(); - + if (m_context) + m_context->didUpdateCanvasSizeProperties(sizeChanged); notifyObserversCanvasResized(); scheduleCommitToPlaceholderCanvas(); - - if (RefPtr context = dynamicDowncast(m_context.get())) - context->reshape(); } #if ENABLE(WEBGL) @@ -206,6 +211,13 @@ if (m_detached) return Exception { ExceptionCode::InvalidStateError }; + // Dictionary conversion may run script, which may have detached this canvas. + auto shouldThrowForDetachedCanvas = [&]() -> ExceptionOr { + if (m_detached) [[unlikely]] + return Exception { ExceptionCode::InvalidStateError }; + return { }; + }; + if (contextType == RenderingContextType::_2d) { if (!m_context) { auto scope = DECLARE_THROW_SCOPE(state.vm()); @@ -214,7 +226,10 @@ if (settings.hasException(scope)) [[unlikely]] return Exception { ExceptionCode::ExistingExceptionError }; - m_context = OffscreenCanvasRenderingContext2D::create(*this, settings.releaseReturnValue()); + if (auto result = shouldThrowForDetachedCanvas(); result.hasException()) + return result.releaseException(); + if (!m_context) + m_context = OffscreenCanvasRenderingContext2D::create(*this, settings.releaseReturnValue()); } if (RefPtr context = dynamicDowncast(m_context.get())) return { { WTF::move(context) } }; @@ -228,8 +243,12 @@ if (settings.hasException(scope)) [[unlikely]] return Exception { ExceptionCode::ExistingExceptionError }; - m_context = ImageBitmapRenderingContext::create(*this, settings.releaseReturnValue()); - downcast(m_context.get())->transferFromImageBitmap(nullptr); + if (auto result = shouldThrowForDetachedCanvas(); result.hasException()) + return result.releaseException(); + if (!m_context) { + m_context = ImageBitmapRenderingContext::create(*this, settings.releaseReturnValue()); + downcast(m_context.get())->transferFromImageBitmap(nullptr); + } } if (RefPtr context = dynamicDowncast(m_context.get())) return { { WTF::move(context) } }; @@ -266,8 +285,10 @@ if (attributes.hasException(scope)) [[unlikely]] return Exception { ExceptionCode::ExistingExceptionError }; + if (auto result = shouldThrowForDetachedCanvas(); result.hasException()) + return result.releaseException(); RefPtr scriptExecutionContext = this->scriptExecutionContext(); - if (shouldEnableWebGL(scriptExecutionContext->settingsValues(), is(scriptExecutionContext))) + if (!m_context && shouldEnableWebGL(scriptExecutionContext->settingsValues(), is(scriptExecutionContext))) m_context = WebGLRenderingContextBase::create(*this, attributes.releaseReturnValue(), webGLVersion); } if (webGLVersion == WebGLVersion::WebGL1) { @@ -291,10 +312,11 @@ if (size().isEmpty()) return { RefPtr { nullptr } }; clearCopiedImage(); + bool bitmapOriginClean = originClean(); RefPtr buffer = m_context->transferToImageBuffer(); if (!buffer) return Exception { ExceptionCode::UnknownError }; // UnknownError is used for DOM out-of-memory. - return { ImageBitmap::create(buffer.releaseNonNull(), originClean()) }; + return { ImageBitmap::create(buffer.releaseNonNull(), bitmapOriginClean) }; } static String toEncodingMimeType(const String& mimeType) @@ -436,20 +458,6 @@ } } -void OffscreenCanvas::createImageBuffer() const -{ - const_cast(this)->setHasCreatedImageBuffer(true); - setImageBuffer(allocateImageBuffer()); -} - -void OffscreenCanvas::setImageBufferAndMarkDirty(RefPtr&& buffer) -{ - setHasCreatedImageBuffer(true); - setImageBuffer(WTF::move(buffer)); - - CanvasBase::didDraw(FloatRect(FloatPoint(), size())); -} - void OffscreenCanvas::queueTaskKeepingObjectAlive(TaskSource source, Function&& task) { ActiveDOMObject::queueTaskKeepingObjectAlive(*this, source, [task = WTF::move(task)](auto& canvas) mutable { @@ -478,6 +486,29 @@ return ContextDestructionObserver::scriptExecutionContext(); } +bool OffscreenCanvas::virtualHasPendingActivity() const +{ +#if ENABLE(WEBGL) + if (m_hasRelevantWebGLEventListener) { + // This runs on a GC thread. + SUPPRESS_UNCOUNTED_LOCAL auto* context = dynamicDowncast(m_context.get()); + // WebGL rendering context may fire contextlost / contextrestored events at any point. + return context && !context->isContextUnrecoverablyLost(); + } +#endif + + return false; +} + +void OffscreenCanvas::eventListenersDidChange() +{ +#if ENABLE(WEBGL) + auto& eventNames = WebCore::eventNames(); + m_hasRelevantWebGLEventListener = hasEventListeners(eventNames.webglcontextlostEvent) + || hasEventListeners(eventNames.webglcontextrestoredEvent); +#endif +} + } #endif diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/OffscreenCanvas.h webkit2gtk-2.52.5/Source/WebCore/html/OffscreenCanvas.h --- webkit2gtk-2.52.3/Source/WebCore/html/OffscreenCanvas.h 2026-02-23 14:40:55.260301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/OffscreenCanvas.h 2026-07-09 07:12:42.044797700 +0000 @@ -89,6 +89,7 @@ WEBCORE_EXPORT ~DetachedOffscreenCanvas(); const IntSize& size() const { return m_size; } bool originClean() const { return m_originClean; } + const RefPtr& placeholderSource() const { return m_placeholderSource; } RefPtr takePlaceholderSource(); private: @@ -127,8 +128,7 @@ void setWidth(unsigned); void setHeight(unsigned); - - void setImageBufferAndMarkDirty(RefPtr&&) final; + void setSizeForControllingContext(IntSize) final; CanvasRenderingContext* renderingContext() const final { return m_context.get(); } @@ -157,6 +157,12 @@ private: OffscreenCanvas(ScriptExecutionContext&, IntSize, RefPtr&&); + // ActiveDOMObject. + bool virtualHasPendingActivity() const final; + + // EventTarget. + void eventListenersDidChange() final; + bool isOffscreenCanvas() const final { return true; } ScriptExecutionContext* scriptExecutionContext() const final; @@ -166,8 +172,7 @@ void refEventTarget() final { RefCounted::ref(); } void derefEventTarget() final { RefCounted::deref(); } - void didUpdateSizeProperties(); - void createImageBuffer() const final; + void didUpdateSizeProperties(bool sizeChanged); void scheduleCommitToPlaceholderCanvas(); @@ -176,6 +181,9 @@ mutable RefPtr m_copiedImage; bool m_detached { false }; bool m_hasScheduledCommit { false }; +#if ENABLE(WEBGL) + bool m_hasRelevantWebGLEventListener { false }; +#endif }; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/OffscreenCanvas.idl webkit2gtk-2.52.5/Source/WebCore/html/OffscreenCanvas.idl --- webkit2gtk-2.52.3/Source/WebCore/html/OffscreenCanvas.idl 2026-02-23 14:40:55.260301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/OffscreenCanvas.idl 2026-07-09 07:12:42.044797700 +0000 @@ -56,8 +56,6 @@ Conditional=OFFSCREEN_CANVAS, ConditionalForWorker=OFFSCREEN_CANVAS_IN_WORKERS, EnabledForContext, - ReportExtraMemoryCost, - ReportExternalMemoryCost, Exposed=(Window,Worker) ] interface OffscreenCanvas : EventTarget { [CallWith=CurrentScriptExecutionContext] constructor([EnforceRange] unsigned long width, [EnforceRange] unsigned long height); diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/TextFieldInputType.cpp webkit2gtk-2.52.5/Source/WebCore/html/TextFieldInputType.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/TextFieldInputType.cpp 2026-02-23 14:40:55.264301800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/TextFieldInputType.cpp 2026-07-09 07:12:42.044797700 +0000 @@ -36,6 +36,7 @@ #include "Chrome.h" #include "ChromeClient.h" #include "ContainerNodeInlines.h" +#include "CSSSelector.h" #include "DOMFormData.h" #include "DocumentEventLoop.h" #include "DocumentPage.h" @@ -57,6 +58,7 @@ #include "LocalizedStrings.h" #include "NodeRenderStyle.h" #include "PlatformKeyboardEvent.h" +#include "PseudoClassChangeInvalidation.h" #include "RenderLayer.h" #include "RenderLayerScrollableArea.h" #include "RenderTextControlSingleLine.h" @@ -96,11 +98,12 @@ bool TextFieldInputType::isKeyboardFocusable(const FocusEventData&) const { ASSERT(element()); + Ref element = *this->element(); #if PLATFORM(IOS_FAMILY) - if (element()->isReadOnly()) + if (element->isReadOnly()) return false; #endif - return protectedElement()->isTextFormControlFocusable(); + return element->isTextFormControlFocusable(); } bool TextFieldInputType::isMouseFocusable() const @@ -303,11 +306,6 @@ SUPPRESS_UNCOUNTED_ARG return createRenderer(RenderObject::Type::TextControlSingleLine, *protectedElement(), WTF::move(style)); } -bool TextFieldInputType::needsContainer() const -{ - return false; -} - bool TextFieldInputType::shouldHaveSpinButton() const { ASSERT(element()); @@ -419,6 +417,8 @@ innerSpinButton->removeSpinButtonOwner(); m_innerSpinButton = nullptr; m_capsLockIndicator = nullptr; + if (RefPtr autoFillButton = m_autoFillButton.get()) + autoFillButton->removeOwner(); m_autoFillButton = nullptr; m_dataListDropdownIndicator = nullptr; m_container = nullptr; @@ -455,16 +455,6 @@ updateAutoFillButton(); } -bool TextFieldInputType::supportsReadOnly() const -{ - return true; -} - -bool TextFieldInputType::shouldUseInputMethod() const -{ - return true; -} - void TextFieldInputType::createDataListDropdownIndicator() { ASSERT(!m_dataListDropdownIndicator); @@ -986,39 +976,44 @@ m_cachedSuggestions = { }; if (RefPtr suggestionPicker = std::exchange(m_suggestionPicker, nullptr)) suggestionPicker->detach(); + setPopupIsVisible(false); if (CheckedPtr renderer = element()->renderer()) renderer->repaint(); } void TextFieldInputType::displaySuggestions(DataListSuggestionActivationType type) { - if (element()->isDisabledFormControl() || !element()->renderer()) + Ref element = *this->element(); + if (element->isDisabledFormControl() || !element->renderer()) return; if (!UserGestureIndicator::processingUserGesture() && !(type == DataListSuggestionActivationType::TextChanged || type == DataListSuggestionActivationType::DataListMayHaveChanged)) return; - if (!m_suggestionPicker && suggestions().size() > 0) + if (!m_suggestionPicker && suggestions().size() > 0) { + setPopupIsVisible(true); m_suggestionPicker = chrome()->createDataListSuggestionPicker(*this); + } - if (RefPtr suggestionPicker = m_suggestionPicker) + if (RefPtr suggestionPicker = m_suggestionPicker) { + setPopupIsVisible(true); suggestionPicker->displayWithActivationType(type); + } } void TextFieldInputType::closeSuggestions() { if (RefPtr suggestionPicker = m_suggestionPicker) suggestionPicker->close(); + setPopupIsVisible(false); } -bool TextFieldInputType::isPresentingAttachedView() const +void TextFieldInputType::setPopupIsVisible(bool visible) { - return !!m_suggestionPicker; -} - -bool TextFieldInputType::isFocusingWithDataListDropdown() const -{ - return m_isFocusingWithDataListDropdown; + if (m_popupIsVisible == visible || !element()) + return; + Style::PseudoClassChangeInvalidation styleInvalidation(*protectedElement(), CSSSelector::PseudoClass::Open, visible); + m_popupIsVisible = visible; } } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/TextFieldInputType.h webkit2gtk-2.52.5/Source/WebCore/html/TextFieldInputType.h --- webkit2gtk-2.52.3/Source/WebCore/html/TextFieldInputType.h 2026-02-23 14:40:55.264301800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/TextFieldInputType.h 2026-07-09 07:12:42.044797700 +0000 @@ -52,6 +52,9 @@ WTF_MAKE_TZONE_ALLOCATED(TextFieldInputType); WTF_OVERRIDE_DELETE_FOR_CHECKED_PTR(TextFieldInputType); public: + void ref() const override { InputType::ref(); } + void deref() const override { InputType::deref(); } + bool valueMissing(const String&) const final; protected: @@ -68,13 +71,13 @@ HTMLElement* autoFillButtonElement() const final; HTMLElement* dataListButtonElement() const final; - virtual bool needsContainer() const; + virtual bool needsContainer() const { return false; } void createShadowSubtree() override; void removeShadowSubtree() override; void attributeChanged(const QualifiedName&) override; void disabledStateChanged() final; void readOnlyStateChanged() final; - bool supportsReadOnly() const final; + bool supportsReadOnly() const final { return true; } void handleFocusEvent(Node* oldFocusedNode, FocusDirection) final; void handleBlurEvent() final; void setValue(const String&, bool valueChanged, TextFieldEventBehavior, TextControlSetValueSelection) override; @@ -92,7 +95,7 @@ void forwardEvent(Event&) final; bool shouldSubmitImplicitly(Event&) final; RenderPtr createInputRenderer(RenderStyle&&) override; - bool shouldUseInputMethod() const override; + bool shouldUseInputMethod() const override { return true; } bool shouldRespectListAttribute() override; HTMLElement* placeholderElement() const final; void updatePlaceholderText() final; @@ -121,8 +124,9 @@ void createAutoFillButton(AutoFillButtonType); void createDataListDropdownIndicator(); - bool isPresentingAttachedView() const final; - bool isFocusingWithDataListDropdown() const final; + bool isPresentingAttachedView() const final { return m_popupIsVisible; } + void setPopupIsVisible(bool); + bool isFocusingWithDataListDropdown() const final { return m_isFocusingWithDataListDropdown; } void dataListMayHaveChanged() final; void displaySuggestions(DataListSuggestionActivationType); void closeSuggestions(); @@ -137,6 +141,7 @@ void dataListButtonElementWasClicked() final; bool m_isFocusingWithDataListDropdown { false }; + bool m_popupIsVisible { false }; RefPtr m_dataListDropdownIndicator; std::pair> m_cachedSuggestions; @@ -148,7 +153,7 @@ RefPtr m_placeholder; RefPtr m_innerSpinButton; RefPtr m_capsLockIndicator; - RefPtr m_autoFillButton; + RefPtr m_autoFillButton; }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/CanvasRenderingContext.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/CanvasRenderingContext.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/CanvasRenderingContext.cpp 2026-02-23 14:40:55.267301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/CanvasRenderingContext.cpp 2026-07-09 07:12:42.044797700 +0000 @@ -36,6 +36,7 @@ #include "HTMLVideoElement.h" #include "Image.h" #include "ImageBitmap.h" +#include "InspectorInstrumentation.h" #include "OriginAccessPatterns.h" #include "PixelFormat.h" #include "SVGImageElement.h" @@ -93,17 +94,6 @@ m_canvas->deref(); } -RefPtr CanvasRenderingContext::surfaceBufferToImageBuffer(SurfaceBuffer) -{ - // This will be removed once all contexts store their own buffers. - return canvasBase().buffer(); -} - -bool CanvasRenderingContext::isSurfaceBufferTransparentBlack(SurfaceBuffer) const -{ - return false; -} - bool CanvasRenderingContext::delegatesDisplay() const { #if USE(SKIA) @@ -224,4 +214,34 @@ m_canvas->setOriginTainted(); } +void CanvasRenderingContext::updateMemoryCost(size_t newMemoryCost) const +{ + size_t oldMemoryCost = m_memoryCost.load(std::memory_order_relaxed); + m_memoryCost.store(newMemoryCost, std::memory_order_relaxed); + if (newMemoryCost) { + if (RefPtr scriptExecutionContext = canvasBase().scriptExecutionContext()) { + JSC::JSLockHolder lock(scriptExecutionContext->vm()); + scriptExecutionContext->vm().heap.reportExtraMemoryAllocated(static_cast(nullptr), newMemoryCost); + } + } + if (oldMemoryCost != newMemoryCost) + InspectorInstrumentation::didChangeCanvasMemory(*this); +} + +size_t CanvasRenderingContext::memoryCost() const +{ + // May be called from GC threads. + return m_memoryCost.load(std::memory_order_relaxed); +} + +#if ENABLE(RESOURCE_USAGE) +size_t CanvasRenderingContext::externalMemoryCost() const +{ + // For the purposes of Web Inspector, external memory means memory reported as 1) being traceable from JS objects, i.e. GC owned memory + // 2) not allocated from "Page" category, e.g. from bmalloc. + // Report the same value until we have implementations that differ. + return memoryCost(); +} +#endif + } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/CanvasRenderingContext.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/CanvasRenderingContext.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/CanvasRenderingContext.h 2026-02-23 14:40:55.268301700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/CanvasRenderingContext.h 2026-07-09 07:12:42.044797700 +0000 @@ -80,6 +80,10 @@ virtual void clearAccumulatedDirtyRect() { } + // Called when the canvas size properties are assigned. + // The canvas will already have the new size. + virtual void didUpdateCanvasSizeProperties(bool sizeChanged) = 0; + // Canvas 2DContext drawing buffer is the same as display buffer. // WebGL, WebGPU draws to drawing buffer. The draw buffer is then swapped to // display buffer during preparation and compositor composites the display buffer. @@ -91,8 +95,8 @@ }; // Draws the source buffer to the canvasBase().buffer(). - virtual RefPtr surfaceBufferToImageBuffer(SurfaceBuffer); - virtual bool isSurfaceBufferTransparentBlack(SurfaceBuffer) const; + virtual RefPtr surfaceBufferToImageBuffer(SurfaceBuffer) = 0; + virtual bool isSurfaceBufferTransparentBlack(SurfaceBuffer) const = 0; bool delegatesDisplay() const; virtual RefPtr layerContentsDisplayDelegate(); virtual void setContentsToLayer(GraphicsLayer&); @@ -129,6 +133,12 @@ void setIsInPreparationForDisplayOrFlush(bool flag) { m_isInPreparationForDisplayOrFlush = flag; } bool isInPreparationForDisplayOrFlush() const { return m_isInPreparationForDisplayOrFlush; } + void updateMemoryCost(size_t newMemoryCost) const; + size_t memoryCost() const; +#if ENABLE(RESOURCE_USAGE) + size_t externalMemoryCost() const; +#endif + protected: enum class Type : uint8_t { CanvasElement2D, @@ -159,6 +169,8 @@ void checkOrigin(const URL&); void checkOrigin(const CSSStyleImageValue&); + mutable std::atomic m_memoryCost { 0 }; + bool m_isInPreparationForDisplayOrFlush { false }; bool m_hasActiveInspectorCanvasCallTracer { false }; @@ -167,6 +179,7 @@ WeakRef m_canvas; const Type m_type; + }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/CanvasRenderingContext2D.idl webkit2gtk-2.52.5/Source/WebCore/html/canvas/CanvasRenderingContext2D.idl --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/CanvasRenderingContext2D.idl 2026-02-23 14:40:55.268301700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/CanvasRenderingContext2D.idl 2026-07-09 07:12:42.044797700 +0000 @@ -34,6 +34,8 @@ CustomIsReachable, JSCustomMarkFunction, CallTracer=InspectorCanvasCallTracer, + ReportExtraMemoryCost, + ReportExternalMemoryCost, Exposed=Window ] interface CanvasRenderingContext2D { // back-reference to the canvas diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp 2026-04-10 09:30:55.930680000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp 2026-07-09 07:12:42.044797700 +0000 @@ -57,6 +57,7 @@ #include "FloatQuad.h" #include "GeometryUtilities.h" #include "Gradient.h" +#include "GraphicsClient.h" #include "HTMLCanvasElement.h" #include "HTMLImageElement.h" #include "HTMLVideoElement.h" @@ -98,6 +99,8 @@ WTF_MAKE_TZONE_ALLOCATED_IMPL(CanvasRenderingContext2DBase); +static constexpr InterpolationQuality defaultInterpolationQuality = InterpolationQuality::Low; + static constexpr ImageSmoothingQuality defaultSmoothingQuality = ImageSmoothingQuality::Low; const int CanvasRenderingContext2DBase::DefaultFontSize = 10; @@ -256,48 +259,40 @@ ASSERT(is2dBase()); } -void CanvasRenderingContext2DBase::unwindStateStack() -{ - // Ensure that the state stack in the ImageBuffer's context - // is cleared before destruction, to avoid assertions in the - // GraphicsContext dtor. - size_t stackSize = m_stateStack.size(); - if (stackSize <= 1) - return; - - // We need to keep the last state because it is tracked by CanvasBase::m_contextStateSaver. - auto* context = existingDrawingContext(); - while (m_stateStack.size() > 1) { - m_stateStack.removeLast(); - if (context) - context->restore(); - } -} - CanvasRenderingContext2DBase::~CanvasRenderingContext2DBase() { #if ASSERT_ENABLED - unwindStateStack(); + m_unrealizedSaveCount = 0; + size_t restoreCount = m_stateStack.size() - 1; + for (size_t i = 0; i < restoreCount; ++i) + restore(); + m_stateStack.first() = State(); + if (RefPtr buffer = m_buffer) + buffer->context().restore(); #endif } bool CanvasRenderingContext2DBase::isAccelerated() const { - auto* context = existingDrawingContext(); - return context && context->renderingMode() == RenderingMode::Accelerated; + return m_buffer && m_buffer->context().renderingMode() == RenderingMode::Accelerated; +} + +RefPtr CanvasRenderingContext2DBase::surfaceBufferToImageBuffer(SurfaceBuffer) +{ + return buffer(); } bool CanvasRenderingContext2DBase::isSurfaceBufferTransparentBlack(SurfaceBuffer) const { // Before the first draw (or first access to the drawing buffer), the drawing buffer is transparent black. // Currently the canvas does not support alpha == false. - return !canvasBase().hasCreatedImageBuffer(); + return !m_hasCreatedImageBuffer; } #if USE(SKIA) RefPtr CanvasRenderingContext2DBase::layerContentsDisplayDelegate() { - if (auto buffer = canvasBase().buffer()) + if (RefPtr buffer = this->buffer()) return buffer->layerContentsDisplayDelegate(); return nullptr; } @@ -315,25 +310,43 @@ void CanvasRenderingContext2DBase::flushDeferredOperations() { m_hasDeferredOperations = false; - if (RefPtr buffer = canvasBase().buffer()) + if (RefPtr buffer = this->buffer()) buffer->flushDrawingContextAsync(); } void CanvasRenderingContext2DBase::reset() { - unwindStateStack(); + // CanvasRenderingContext2D.reset() behaves exactly like width/height self-assignment, + // `ctx.width = ctx.width`. + didUpdateCanvasSizeProperties(false); +} - ASSERT(m_stateStack.size() == 1); +void CanvasRenderingContext2DBase::didUpdateCanvasSizeProperties(bool sizeChanged) +{ + m_unrealizedSaveCount = 0; + size_t restoreCount = m_stateStack.size() - 1; + for (size_t i = 0; i < restoreCount; ++i) + restore(); m_stateStack.first() = State(); - m_path.clear(); - m_unrealizedSaveCount = 0; m_cachedContents.emplace(); m_hasDeferredOperations = false; clearAccumulatedDirtyRect(); - if (auto* c = existingDrawingContext()) { - canvasBase().resetGraphicsContextState(); - c->clearRect(FloatRect { { }, canvasBase().size() }); + if (sizeChanged) { + m_hasCreatedImageBuffer = false; + if (m_buffer) { +#if ASSERT_ENABLED + Ref { *m_buffer }->context().restore(); +#endif + m_buffer = nullptr; + updateMemoryCost(0); + } + InspectorInstrumentation::didChangeCanvasSize(*this); + } else if (RefPtr buffer = m_buffer) { + auto& context = buffer->context(); + context.restore(); + context.save(); + context.clearRect(FloatRect { { }, canvasBase().size() }); } } @@ -2436,20 +2449,13 @@ GraphicsContext* CanvasRenderingContext2DBase::drawingContext() const { - if (auto* paintContext = dynamicDowncast(*this)) - return paintContext->ensureDrawingContext(); - if (auto* buffer = canvasBase().buffer()) + if (auto* paintContext = dynamicDowncast(*this)) [[unlikely]] + return paintContext->drawingContext(); + if (RefPtr buffer = this->buffer()) return &buffer->context(); return nullptr; } -GraphicsContext* CanvasRenderingContext2DBase::existingDrawingContext() const -{ - if (!canvasBase().hasCreatedImageBuffer()) - return nullptr; - return drawingContext(); -} - GraphicsContext* CanvasRenderingContext2DBase::effectiveDrawingContext() const { auto context = drawingContext(); @@ -2462,14 +2468,15 @@ AffineTransform CanvasRenderingContext2DBase::baseTransform() const { - // FIXME(https://bugs.webkit.org/show_bug.cgi?id=275100): The image buffer from CanvasBase should be moved to CanvasRenderingContext2DBase. - ASSERT(canvasBase().hasCreatedImageBuffer()); - return canvasBase().buffer()->baseTransform(); + if (auto* paintContext = dynamicDowncast(*this)) [[unlikely]] + return paintContext->baseTransform(); + ASSERT(m_hasCreatedImageBuffer); + return buffer()->baseTransform(); } void CanvasRenderingContext2DBase::prepareForDisplay() { - if (auto buffer = canvasBase().buffer()) + if (RefPtr buffer = this->buffer()) buffer->prepareForDisplay(); } @@ -2660,7 +2667,7 @@ void CanvasRenderingContext2DBase::putImageData(ImageData& data, int dx, int dy, int dirtyX, int dirtyY, int dirtyWidth, int dirtyHeight) { - RefPtr buffer = canvasBase().buffer(); + RefPtr buffer = this->buffer(); if (!buffer) return; @@ -3102,7 +3109,7 @@ std::optional CanvasRenderingContext2DBase::getEffectiveRenderingModeForTesting() { - if (auto* buffer = canvasBase().buffer()) { + if (RefPtr buffer = this->buffer()) { buffer->ensureBackendCreated(); if (buffer->hasBackend()) return buffer->renderingMode(); @@ -3231,4 +3238,49 @@ modifiableState().font.setWordSpacing(pixels); } +RefPtr CanvasRenderingContext2DBase::buffer() const +{ + if (m_hasCreatedImageBuffer) + return m_buffer; + m_hasCreatedImageBuffer = true; + RefPtr buffer = allocateImageBuffer(); + if (!buffer) + return nullptr; + auto& context = buffer->context(); + context.setShadowsIgnoreTransforms(true); + context.setImageInterpolationQuality(defaultInterpolationQuality); + context.setStrokeThickness(1); + // Save the initial state, so that `reset()` can restore it. + context.save(); + updateMemoryCost(buffer->memoryCost()); + m_buffer = buffer; + +#if USE(CA) || USE(SKIA) + // Recalculate compositing requirements if acceleration state changed. + if (RefPtr canvasElement = dynamicDowncast(canvasBase())) { + canvasElement->invalidateStyleAndLayerComposition(); +#if USE(SKIA) + if (CheckedPtr renderer = canvasElement->renderBox()) { + if (renderer->hasAcceleratedCompositing() && delegatesDisplay()) + renderer->contentChanged(ContentChangeType::Canvas); + } +#endif + } +#endif + return buffer; +} + +RefPtr CanvasRenderingContext2DBase::allocateImageBuffer() const +{ + if (!canvasBase().validateArea()) + return nullptr; + RefPtr scriptExecutionContext = canvasBase().scriptExecutionContext(); + if (!scriptExecutionContext) + return nullptr; + RenderingMode renderingMode = !willReadFrequently() && canvasBase().shouldAccelerate() ? RenderingMode::Accelerated : RenderingMode::Unaccelerated; + if (auto renderingModeForTesting = this->renderingModeForTesting()) + renderingMode = *renderingModeForTesting; + return ImageBuffer::create(canvasBase().size(), renderingMode, RenderingPurpose::Canvas, 1, colorSpace(), pixelFormat(), scriptExecutionContext->graphicsClient()); +} + } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.h 2026-02-23 14:40:55.268301700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.h 2026-07-09 07:12:42.044797700 +0000 @@ -344,12 +344,9 @@ void realizeSaves(); State& modifiableState() { ASSERT(!m_unrealizedSaveCount || m_stateStack.size() >= MaxSaveCount); return m_stateStack.last(); } - // These methods are de-virtualized for performance reasons. GraphicsContext* drawingContext() const; GraphicsContext* effectiveDrawingContext() const; - - virtual GraphicsContext* existingDrawingContext() const; - virtual AffineTransform baseTransform() const; + AffineTransform baseTransform() const; enum class DidDrawOption { ApplyTransform = 1 << 0, @@ -398,6 +395,14 @@ bool usesCSSCompatibilityParseMode() const { return m_usesCSSCompatibilityParseMode; } void updateStateTransform(const AffineTransform&); + + RefPtr allocateImageBuffer() const; + bool hasCreatedImageBuffer() const { return m_hasCreatedImageBuffer; } + RefPtr buffer() const; + RefPtr makeRenderingResultsAvailable(ShouldApplyPostProcessingToDirtyRect = ShouldApplyPostProcessingToDirtyRect::Yes); + RefPtr createImageForNoiseInjection() const; + void didUpdateCanvasSizeProperties(bool) override; + private: struct CachedContentsTransparent { }; @@ -426,7 +431,6 @@ DestinationColorSpace colorSpace() const final; bool willReadFrequently() const final; - void unwindStateStack(); void realizeSavesLoop(); void setStrokeColorImpl(Color&& color, String&& unparsedColor = { }); void setFillColorImpl(Color&& color, String&& unparsedColor = { }); @@ -480,6 +484,7 @@ template void fullCanvasCompositedDrawImage(T&, const FloatRect&, const FloatRect&, CompositeOperator); + RefPtr surfaceBufferToImageBuffer(SurfaceBuffer) final; bool isSurfaceBufferTransparentBlack(SurfaceBuffer) const override; #if USE(SKIA) RefPtr layerContentsDisplayDelegate() override; @@ -498,13 +503,15 @@ void evictCachedImageData(); static constexpr unsigned MaxSaveCount = 1024 * 16; - Vector m_stateStack; + mutable RefPtr m_buffer; + Vector m_stateStack; // References go m_stateStack -> targetSwitcher -> m_buffer, so destroy state stack first. FloatRect m_dirtyRect; unsigned m_unrealizedSaveCount { 0 }; bool m_usesCSSCompatibilityParseMode; mutable Variant m_cachedContents; CanvasRenderingContext2DSettings m_settings; bool m_hasDeferredOperations { false }; + mutable bool m_hasCreatedImageBuffer { false }; }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/EXTDisjointTimerQuery.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/EXTDisjointTimerQuery.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/EXTDisjointTimerQuery.cpp 2026-02-23 14:40:55.270301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/EXTDisjointTimerQuery.cpp 2026-07-09 07:12:42.044797700 +0000 @@ -159,7 +159,7 @@ context->graphicsContextGL()->endQueryEXT(target); // A query's result must not be made available until control has returned to the user agent's main loop. - context->scriptExecutionContext()->eventLoop().queueMicrotask([query = WTF::move(context->m_activeQuery)] { + context->protectedScriptExecutionContext()->checkedEventLoop()->queueMicrotask([query = context->m_activeQuery.releaseNonNull()] { query->makeResultAvailable(); }); } @@ -190,8 +190,8 @@ context->graphicsContextGL()->queryCounterEXT(query.object(), target); // A query's result must not be made available until control has returned to the user agent's main loop. - context->scriptExecutionContext()->eventLoop().queueMicrotask([&] { - query.makeResultAvailable(); + context->protectedScriptExecutionContext()->checkedEventLoop()->queueMicrotask([query = Ref { query }] { + query->makeResultAvailable(); }); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/GPUBasedCanvasRenderingContext.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/GPUBasedCanvasRenderingContext.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/GPUBasedCanvasRenderingContext.h 2026-02-23 14:40:55.272301700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/GPUBasedCanvasRenderingContext.h 2026-07-09 07:12:42.044797700 +0000 @@ -41,7 +41,6 @@ void deref() const final { CanvasRenderingContext::deref(); } USING_CAN_MAKE_WEAKPTR(CanvasRenderingContext); - virtual void reshape() = 0; protected: explicit GPUBasedCanvasRenderingContext(CanvasBase&, CanvasRenderingContext::Type); diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/GPUCanvasContext.idl webkit2gtk-2.52.5/Source/WebCore/html/canvas/GPUCanvasContext.idl --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/GPUCanvasContext.idl 2026-01-20 14:08:45.082676400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/GPUCanvasContext.idl 2026-07-09 07:12:42.044797700 +0000 @@ -28,6 +28,8 @@ [ ActiveDOMObject, EnabledBySetting=WebGPUEnabled, + ReportExtraMemoryCost, + ReportExternalMemoryCost, Exposed=(Window,Worker), SecureContext, SkipVTableValidation, diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/GPUCanvasContextCocoa.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/GPUCanvasContextCocoa.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/GPUCanvasContextCocoa.h 2026-02-23 14:40:55.273301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/GPUCanvasContextCocoa.h 2026-07-09 07:12:42.048797600 +0000 @@ -58,10 +58,11 @@ void prepareForDisplay() override; PixelFormat pixelFormat() const override; bool isOpaque() const override; - void reshape() override; - + void didUpdateCanvasSizeProperties(bool) override; RefPtr surfaceBufferToImageBuffer(SurfaceBuffer) override; + bool isSurfaceBufferTransparentBlack(SurfaceBuffer) const final { return false; } + // GPUCanvasContext methods: CanvasType canvas() override; ExceptionOr configure(GPUCanvasConfiguration&&) override; @@ -94,6 +95,7 @@ void updateScreenHeadroom(float, bool suppressEDR); void updateScreenHeadroomFromScreenProperties(); #endif // HAVE(SUPPORT_HDR_DISPLAY) + void updateMemoryCost() const; struct Configuration { Ref device; @@ -123,6 +125,7 @@ bool m_suppressEDR { false }; #endif // HAVE(SUPPORT_HDR_DISPLAY) bool m_compositingResultsNeedsUpdating { false }; + RefPtr m_readDisplayBuffer; }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/ImageBitmapRenderingContext.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/ImageBitmapRenderingContext.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/ImageBitmapRenderingContext.cpp 2026-02-23 14:40:55.273301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/ImageBitmapRenderingContext.cpp 2026-07-09 07:12:42.048797600 +0000 @@ -64,100 +64,59 @@ return &downcast(base.get()); } -void ImageBitmapRenderingContext::setOutputBitmap(RefPtr imageBitmap) -{ - // 1. If a bitmap argument was not provided, then: - - if (!imageBitmap) { - // 1.1. Set context's bitmap mode to blank. - // 1.2. Let canvas be the canvas element to which context is bound. - // 1.3. Set context's output bitmap to be transparent black with an - // intrinsic width equal to the numeric value of canvas's width attribute - // and an intrinsic height equal to the numeric value of canvas's height - // attribute, those values being interpreted in CSS pixels. - setBlank(); - // 1.4. Set the output bitmap's origin-clean flag to true. - canvasBase().setOriginClean(); - return; - } - - // 2. If a bitmap argument was provided, then: - - // 2.1. Set context's bitmap mode to valid. - - m_bitmapMode = BitmapMode::Valid; - - // 2.2. Set context's output bitmap to refer to the same underlying - // bitmap data as bitmap, without making a copy. - // Note: the origin-clean flag of bitmap is included in the - // bitmap data to be referenced by context's output bitmap. - - if (imageBitmap->originClean()) - canvasBase().setOriginClean(); - else - canvasBase().setOriginTainted(); - canvasBase().setImageBufferAndMarkDirty(imageBitmap->takeImageBuffer()); -} - ExceptionOr ImageBitmapRenderingContext::transferFromImageBitmap(RefPtr imageBitmap) { - // 1. Let bitmapContext be the ImageBitmapRenderingContext object on which - // the transferFromImageBitmap() method was called. - - // 2. If imageBitmap is null, then run the steps to set an ImageBitmapRenderingContext's - // output bitmap, with bitmapContext as the context argument and no bitmap argument, - // then abort these steps. - - if (!imageBitmap) { - setOutputBitmap(nullptr); + RefPtr newBuffer; + bool originClean = true; + if (imageBitmap) { + if (imageBitmap->isDetached()) + return Exception { ExceptionCode::InvalidStateError }; + originClean = imageBitmap->originClean(); + newBuffer = imageBitmap->takeImageBuffer(); + } else if (!m_buffer) return { }; - } - - // 3. If the value of imageBitmap's [[Detached]] internal slot is set to true, - // then throw an "InvalidStateError" DOMException and abort these steps. - - if (imageBitmap->isDetached()) - return Exception { ExceptionCode::InvalidStateError }; - - // 4. Run the steps to set an ImageBitmapRenderingContext's output bitmap, - // with the context argument equal to bitmapContext, and the bitmap - // argument referring to imageBitmap's underlying bitmap data. - - setOutputBitmap(imageBitmap); - - // 5. Set the value of imageBitmap's [[Detached]] internal slot to true. - // 6. Unset imageBitmap's bitmap data. - - // Note that the algorithm in the specification is currently a bit - // muddy here. The setOutputBitmap step above had to transfer ownership - // from the imageBitmap to this object, which requires a detach and unset, - // so this step isn't necessary, but we'll do it anyway. - - imageBitmap->close(); + Ref canvasBase = this->canvasBase(); + if (originClean) + canvasBase->setOriginClean(); + else + canvasBase->setOriginTainted(); + if (newBuffer) { + IntSize newSize = newBuffer->truncatedLogicalSize(); + updateMemoryCost(newBuffer->memoryCost()); + m_buffer = newBuffer.releaseNonNull(); + canvasBase->setSizeForControllingContext(newSize); + } else { + m_buffer = nullptr; + updateMemoryCost(0); + } + canvasBase->didDraw(FloatRect { { }, canvasBase->size() }); return { }; } -void ImageBitmapRenderingContext::setBlank() +RefPtr ImageBitmapRenderingContext::transferToImageBuffer() { - m_bitmapMode = BitmapMode::Blank; - // FIXME: What is the point of creating a full size transparent buffer that - // can never be changed? Wouldn't a 1x1 buffer give the same rendering? The - // only reason I can think of is toDataURL(), but that doesn't seem like - // a good enough argument to waste memory. - auto buffer = ImageBuffer::create(FloatSize(canvasBase().width(), canvasBase().height()), RenderingMode::Unaccelerated, RenderingPurpose::Unspecified, 1, DestinationColorSpace::SRGB(), PixelFormat::BGRA8); - canvasBase().setImageBufferAndMarkDirty(WTF::move(buffer)); + Ref canvasBase = this->canvasBase(); + auto size = canvasBase->size(); + if (!m_buffer) + return ImageBuffer::create(size, RenderingMode::Unaccelerated, RenderingPurpose::Unspecified, 1, DestinationColorSpace::SRGB(), PixelFormat::BGRA8); + RefPtr result = std::exchange(m_buffer, { }); + updateMemoryCost(0); + canvasBase->setOriginClean(); + canvasBase->didDraw(FloatRect { { }, size }); + return result; } -RefPtr ImageBitmapRenderingContext::transferToImageBuffer() +RefPtr ImageBitmapRenderingContext::surfaceBufferToImageBuffer(SurfaceBuffer) { - if (!canvasBase().hasCreatedImageBuffer()) - return canvasBase().allocateImageBuffer(); - RefPtr result = canvasBase().buffer(); - if (!result) - return nullptr; - setBlank(); - return result; + if (!m_buffer) { + RefPtr buffer = ImageBuffer::create(Ref { canvasBase() }->size(), RenderingMode::Unaccelerated, RenderingPurpose::Unspecified, 1, DestinationColorSpace::SRGB(), PixelFormat::BGRA8); + if (buffer) { + updateMemoryCost(buffer->memoryCost()); + m_buffer = WTF::move(buffer); + } + } + return m_buffer; } } diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/ImageBitmapRenderingContext.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/ImageBitmapRenderingContext.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/ImageBitmapRenderingContext.h 2026-02-23 14:40:55.273301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/ImageBitmapRenderingContext.h 2026-07-09 07:12:42.048797600 +0000 @@ -48,30 +48,23 @@ WTF_MAKE_TZONE_ALLOCATED(ImageBitmapRenderingContext); public: static std::unique_ptr create(CanvasBase&, ImageBitmapRenderingContextSettings&&); - - enum class BitmapMode { - Valid, - Blank - }; - ~ImageBitmapRenderingContext(); ImageBitmapCanvas canvas(); ExceptionOr transferFromImageBitmap(RefPtr); - - BitmapMode bitmapMode() { return m_bitmapMode; } bool hasAlpha() { return m_settings.alpha; } + RefPtr surfaceBufferToImageBuffer(SurfaceBuffer) final; + bool isSurfaceBufferTransparentBlack(SurfaceBuffer) const final { return !m_buffer; } + void didUpdateCanvasSizeProperties(bool) final { } + private: ImageBitmapRenderingContext(CanvasBase&, ImageBitmapRenderingContextSettings&&); RefPtr transferToImageBuffer() final; - void setOutputBitmap(RefPtr); - void setBlank(); - - BitmapMode m_bitmapMode { BitmapMode::Blank }; + RefPtr m_buffer; ImageBitmapRenderingContextSettings m_settings; }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/ImageBitmapRenderingContext.idl webkit2gtk-2.52.5/Source/WebCore/html/canvas/ImageBitmapRenderingContext.idl --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/ImageBitmapRenderingContext.idl 2026-01-20 14:08:45.083676300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/ImageBitmapRenderingContext.idl 2026-07-09 07:12:42.048797600 +0000 @@ -30,6 +30,8 @@ #endif [ + ReportExtraMemoryCost, + ReportExternalMemoryCost, Exposed=(Window,Worker), CallTracer=InspectorCanvasCallTracer, ] interface ImageBitmapRenderingContext { diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/OESVertexArrayObject.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/OESVertexArrayObject.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/OESVertexArrayObject.cpp 2026-02-23 14:40:55.276301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/OESVertexArrayObject.cpp 2026-07-09 07:12:42.048797600 +0000 @@ -49,10 +49,10 @@ return context.supportsExtension(GCGLExtension::OES_vertex_array_object); } -RefPtr OESVertexArrayObject::createVertexArrayOES() +Ref OESVertexArrayObject::createVertexArrayOES() { if (isContextLost()) - return nullptr; + return WebGLVertexArrayObjectOES::createLost(); return WebGLVertexArrayObjectOES::createUser(context().get()); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/OESVertexArrayObject.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/OESVertexArrayObject.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/OESVertexArrayObject.h 2026-02-23 14:40:55.276301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/OESVertexArrayObject.h 2026-07-09 07:12:42.048797600 +0000 @@ -42,7 +42,7 @@ static bool supported(GraphicsContextGL&); - RefPtr createVertexArrayOES(); + Ref createVertexArrayOES(); void deleteVertexArrayOES(WebGLVertexArrayObjectOES*); GCGLboolean isVertexArrayOES(WebGLVertexArrayObjectOES*); void bindVertexArrayOES(WebGLVertexArrayObjectOES*); diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/OESVertexArrayObject.idl webkit2gtk-2.52.5/Source/WebCore/html/canvas/OESVertexArrayObject.idl --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/OESVertexArrayObject.idl 2026-02-23 14:40:55.276301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/OESVertexArrayObject.idl 2026-07-09 07:12:42.048797600 +0000 @@ -31,7 +31,7 @@ const unsigned long VERTEX_ARRAY_BINDING_OES = 0x85B5; // FIXME: https://github.com/KhronosGroup/WebGL/issues/3754. - WebGLVertexArrayObjectOES? createVertexArrayOES(); + WebGLVertexArrayObjectOES createVertexArrayOES(); undefined deleteVertexArrayOES(optional WebGLVertexArrayObjectOES? arrayObject = null); boolean isVertexArrayOES(optional WebGLVertexArrayObjectOES? arrayObject = null); undefined bindVertexArrayOES(optional WebGLVertexArrayObjectOES? arrayObject = null); diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/OffscreenCanvasRenderingContext2D.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/OffscreenCanvasRenderingContext2D.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/OffscreenCanvasRenderingContext2D.cpp 2026-02-23 14:40:55.276301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/OffscreenCanvasRenderingContext2D.cpp 2026-07-09 07:12:42.048797600 +0000 @@ -130,9 +130,9 @@ RefPtr OffscreenCanvasRenderingContext2D::transferToImageBuffer() { - if (!canvasBase().hasCreatedImageBuffer()) - return canvasBase().allocateImageBuffer(); - auto* buffer = canvasBase().buffer(); + if (!hasCreatedImageBuffer()) + return allocateImageBuffer(); + RefPtr buffer = this->buffer(); if (!buffer) return nullptr; // As the canvas context state is stored in GraphicsContext, which is owned diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/OffscreenCanvasRenderingContext2D.idl webkit2gtk-2.52.5/Source/WebCore/html/canvas/OffscreenCanvasRenderingContext2D.idl --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/OffscreenCanvasRenderingContext2D.idl 2026-02-23 14:40:55.277301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/OffscreenCanvasRenderingContext2D.idl 2026-07-09 07:12:42.048797600 +0000 @@ -29,6 +29,8 @@ Conditional=OFFSCREEN_CANVAS, ConditionalForWorker=OFFSCREEN_CANVAS_IN_WORKERS, EnabledForContext, + ReportExtraMemoryCost, + ReportExternalMemoryCost, Exposed=(Window,Worker), JSCustomMarkFunction, TaggedWrapper, diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/PaintRenderingContext2D.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/PaintRenderingContext2D.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/PaintRenderingContext2D.cpp 2026-02-23 14:40:55.277301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/PaintRenderingContext2D.cpp 2026-07-09 07:12:42.048797600 +0000 @@ -39,30 +39,43 @@ return std::unique_ptr(new PaintRenderingContext2D(canvas)); } +// Note: currently there is a structural mismatch where PaintRenderingContext2D : public CanvasRenderingContext2DBase, +// but at the same time CanvasRenderingContext2DBase has the m_buffer backing store and PaintRenderingContext2D has +// the m_recordingContext backing store. PaintRenderingContext2D is not a shipping class, and +// thus we do not want to spend code to make an extra CanvasRenderingContext2DBitmapBase : public CanvasRenderingContext2DBase. +// CanvasRenderingContext2DBase has dynamicCasting related to drawing context accessors. +// CanvasRenderingContext2DBase is written in a way that assumes m_buffer is used. +// PaintRenderingContext2D is written in a way to compensate so that the assumption does not affect the correctness. + PaintRenderingContext2D::PaintRenderingContext2D(CustomPaintCanvas& canvas) : CanvasRenderingContext2DBase(canvas, Type::Paint, { }, false) { } -PaintRenderingContext2D::~PaintRenderingContext2D() = default; +PaintRenderingContext2D::~PaintRenderingContext2D() +{ +#if ASSERT_ENABLED + // Call the user-induced restore()s. Restore through the restore() method + // to let the CanvasRenderingContext2DBase::~CanvasRenderingContext2DBase() + // code make sense. + size_t restoreCount = stateStack().size() - 1; + for (size_t i = 0; i < restoreCount; ++i) + restore(); +#endif +} CustomPaintCanvas& PaintRenderingContext2D::canvas() const { return downcast(canvasBase()); } -GraphicsContext* PaintRenderingContext2D::ensureDrawingContext() const +GraphicsContext* PaintRenderingContext2D::drawingContext() const { if (!m_recordingContext) m_recordingContext.emplace(canvasBase().size()); return &*m_recordingContext; } -GraphicsContext* PaintRenderingContext2D::existingDrawingContext() const -{ - return m_recordingContext ? &*m_recordingContext : nullptr; -} - AffineTransform PaintRenderingContext2D::baseTransform() const { // The base transform of the display list. @@ -79,4 +92,13 @@ target.drawDisplayList(m_recordingContext->takeDisplayList()); } +void PaintRenderingContext2D::didUpdateCanvasSizeProperties(bool sizeChanged) +{ + size_t restoreCount = stateStack().size() - 1; + for (size_t i = 0; i < restoreCount; ++i) + restore(); + m_recordingContext.reset(); + CanvasRenderingContext2DBase::didUpdateCanvasSizeProperties(sizeChanged); +} + } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/PaintRenderingContext2D.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/PaintRenderingContext2D.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/PaintRenderingContext2D.h 2026-02-23 14:40:55.277301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/PaintRenderingContext2D.h 2026-07-09 07:12:42.048797600 +0000 @@ -44,13 +44,15 @@ virtual ~PaintRenderingContext2D(); - GraphicsContext* ensureDrawingContext() const; - GraphicsContext* existingDrawingContext() const final; - AffineTransform baseTransform() const final; + GraphicsContext* drawingContext() const; + AffineTransform baseTransform() const; CustomPaintCanvas& canvas() const; void replayDisplayList(GraphicsContext& target) const; +protected: + void didUpdateCanvasSizeProperties(bool) final; + private: PaintRenderingContext2D(CustomPaintCanvas&); mutable std::optional m_recordingContext; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/PlaceholderRenderingContext.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/PlaceholderRenderingContext.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/PlaceholderRenderingContext.cpp 2026-02-23 14:40:55.277301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/PlaceholderRenderingContext.cpp 2026-07-09 07:12:42.048797600 +0000 @@ -129,32 +129,45 @@ void PlaceholderRenderingContext::setContentsToLayer(GraphicsLayer& layer) { - RefPtr buffer; - Ref canvas = this->canvas(); - if (canvas->hasCreatedImageBuffer()) - buffer = canvas->buffer(); - m_source->setContentsToLayer(layer, buffer.get(), m_opaque); + m_source->setContentsToLayer(layer, m_buffer.get(), m_opaque); } -void PlaceholderRenderingContext::setPlaceholderBuffer(Ref&& buffer, bool originClean, bool opaque) +void PlaceholderRenderingContext::setPlaceholderBuffer(Ref&& newBuffer, bool originClean, bool opaque) { m_opaque = opaque; - - // Transfer the drawn bitmap and its origin-clean flag to the output canvas. + IntSize newSize = newBuffer->truncatedLogicalSize(); + updateMemoryCost(newBuffer->memoryCost()); + m_buffer = WTF::move(newBuffer); + Ref canvas = this->canvas(); + canvas->setSizeForControllingContext(newSize); if (originClean) - canvasBase().setOriginClean(); + canvas->setOriginClean(); else - canvasBase().setOriginTainted(); - canvasBase().setImageBufferAndMarkDirty(WTF::move(buffer)); + canvas->setOriginTainted(); + canvas->didDraw(FloatRect { { }, newSize }, ShouldApplyPostProcessingToDirtyRect::No); } PixelFormat PlaceholderRenderingContext::pixelFormat() const { - if (Ref canvas = this->canvas(); canvas->buffer()) - return Ref { *canvas->buffer() }->pixelFormat(); + if (RefPtr buffer = m_buffer) + return buffer->pixelFormat(); return CanvasRenderingContext::pixelFormat(); } +RefPtr PlaceholderRenderingContext::surfaceBufferToImageBuffer(SurfaceBuffer) +{ + return m_buffer; +} + +bool PlaceholderRenderingContext::isSurfaceBufferTransparentBlack(SurfaceBuffer) const +{ + return !m_buffer; +} + +void PlaceholderRenderingContext::didUpdateCanvasSizeProperties(bool) +{ +} + } #endif diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/PlaceholderRenderingContext.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/PlaceholderRenderingContext.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/PlaceholderRenderingContext.h 2026-02-23 14:40:55.277301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/PlaceholderRenderingContext.h 2026-07-09 07:12:42.048797600 +0000 @@ -73,6 +73,10 @@ PlaceholderRenderingContextSource& source() const { return m_source; } + RefPtr surfaceBufferToImageBuffer(SurfaceBuffer) final; + bool isSurfaceBufferTransparentBlack(SurfaceBuffer) const final; + void didUpdateCanvasSizeProperties(bool) final; + private: PlaceholderRenderingContext(HTMLCanvasElement&); void setContentsToLayer(GraphicsLayer&) final; @@ -80,6 +84,7 @@ bool isOpaque() const final { return m_opaque; } const Ref m_source; + RefPtr m_buffer; bool m_opaque { false }; }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp 2026-03-25 16:38:32.914259700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp 2026-07-09 07:12:42.048797600 +0000 @@ -1160,6 +1160,8 @@ } if (!validateTexture2DBinding("compressedTexImage2D"_s, target)) return; + if (!validateCompressedTexFormat("compressedTexImage2D"_s, internalformat)) + return; graphicsContextGL()->compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, offset); } @@ -1175,6 +1177,8 @@ } if (!validateTexture2DBinding("compressedTexImage2D"_s, target)) return; + if (!validateCompressedTexFormat("compressedTexImage2D"_s, internalformat)) + return; auto slice = sliceArrayBufferView("compressedTexImage2D"_s, srcData, srcOffset, srcLengthOverride); if (!slice) return; @@ -1193,6 +1197,8 @@ } if (!validateTexture3DBinding("compressedTexImage3D"_s, target)) return; + if (!validateCompressedTexFormat("compressedTexImage3D"_s, internalformat)) + return; graphicsContextGL()->compressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, offset); } @@ -1208,6 +1214,8 @@ } if (!validateTexture3DBinding("compressedTexImage3D"_s, target)) return; + if (!validateCompressedTexFormat("compressedTexImage3D"_s, internalformat)) + return; auto slice = sliceArrayBufferView("compressedTexImage3D"_s, srcData, srcOffset, srcLengthOverride); if (!slice) return; @@ -1239,6 +1247,8 @@ } if (!validateTexture2DBinding("compressedTexImage2D"_s, target)) return; + if (!validateCompressedTexFormat("compressedTexSubImage2D"_s, format)) + return; graphicsContextGL()->compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, offset); } @@ -1254,6 +1264,8 @@ } if (!validateTexture2DBinding("compressedTexSubImage2D"_s, target)) return; + if (!validateCompressedTexFormat("compressedTexSubImage2D"_s, format)) + return; auto slice = sliceArrayBufferView("compressedTexSubImage2D"_s, srcData, srcOffset, srcLengthOverride); if (!slice) return; @@ -1272,6 +1284,8 @@ } if (!validateTexture3DBinding("compressedTexSubImage3D"_s, target)) return; + if (!validateCompressedTexFormat("compressedTexSubImage3D"_s, format)) + return; graphicsContextGL()->compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, offset); } @@ -1287,6 +1301,8 @@ } if (!validateTexture3DBinding("compressedTexSubImage3D"_s, target)) return; + if (!validateCompressedTexFormat("compressedTexSubImage3D"_s, format)) + return; auto slice = sliceArrayBufferView("compressedTexSubImage3D"_s, srcData, srcOffset, srcLengthOverride); if (!slice) return; @@ -1716,11 +1732,10 @@ graphicsContextGL()->clearBufferfi(buffer, drawbuffer, depth, stencil); } -RefPtr WebGL2RenderingContext::createQuery() +Ref WebGL2RenderingContext::createQuery() { if (isContextLost()) - return nullptr; - + return WebGLQuery::createLost(); return WebGLQuery::create(*this); } @@ -1809,7 +1824,7 @@ graphicsContextGL()->endQuery(target); // A query's result must not be made available until control has returned to the user agent's main loop. - protectedScriptExecutionContext()->checkedEventLoop()->queueMicrotask([query = WTF::move(m_activeQueries[*activeQueryKey])] { + protectedScriptExecutionContext()->checkedEventLoop()->queueMicrotask([query = m_activeQueries[*activeQueryKey].releaseNonNull()] { query->makeResultAvailable(); }); } @@ -1882,10 +1897,10 @@ return nullptr; } -RefPtr WebGL2RenderingContext::createSampler() +Ref WebGL2RenderingContext::createSampler() { if (isContextLost()) - return nullptr; + return WebGLSampler::createLost(); return WebGLSampler::create(*this); } @@ -1987,9 +2002,6 @@ RefPtr WebGL2RenderingContext::fenceSync(GCGLenum condition, GCGLbitfield flags) { - if (isContextLost()) - return nullptr; - if (condition != GraphicsContextGL::SYNC_GPU_COMMANDS_COMPLETE) { synthesizeGLError(GraphicsContextGL::INVALID_ENUM, "fenceSync"_s, "condition must be SYNC_GPU_COMMANDS_COMPLETE"_s); return nullptr; @@ -1998,9 +2010,7 @@ synthesizeGLError(GraphicsContextGL::INVALID_VALUE, "fenceSync"_s, "flags must be zero"_s); return nullptr; } - auto sync = WebGLSync::create(*this); - if (!sync) - return nullptr; + Ref sync = WebGLSync::create(*this); sync->scheduleAllowCacheUpdate(*this); return sync; } @@ -2083,11 +2093,10 @@ } } -RefPtr WebGL2RenderingContext::createTransformFeedback() +Ref WebGL2RenderingContext::createTransformFeedback() { if (isContextLost()) - return nullptr; - + return WebGLTransformFeedback::createLost(); return WebGLTransformFeedback::create(*this); } @@ -2542,11 +2551,10 @@ graphicsContextGL()->uniformBlockBinding(program.object(), uniformBlockIndex, uniformBlockBinding); } -RefPtr WebGL2RenderingContext::createVertexArray() +Ref WebGL2RenderingContext::createVertexArray() { if (isContextLost()) - return nullptr; - + return WebGLVertexArrayObject::createLost(); return WebGLVertexArrayObject::create(*this, WebGLVertexArrayObject::Type::User); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGL2RenderingContext.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGL2RenderingContext.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGL2RenderingContext.h 2026-02-23 14:40:55.278301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGL2RenderingContext.h 2026-07-09 07:12:42.048797600 +0000 @@ -188,7 +188,7 @@ void clearBufferfi(GCGLenum buffer, GCGLint drawbuffer, GCGLfloat depth, GCGLint stencil); // Query objects - RefPtr createQuery(); + Ref createQuery(); void deleteQuery(WebGLQuery*); GCGLboolean isQuery(WebGLQuery*); void beginQuery(GCGLenum target, WebGLQuery&); @@ -197,7 +197,7 @@ WebGLAny getQueryParameter(WebGLQuery&, GCGLenum pname); // Sampler objects - RefPtr createSampler(); + Ref createSampler(); void deleteSampler(WebGLSampler*); GCGLboolean isSampler(WebGLSampler*); void bindSampler(GCGLuint unit, WebGLSampler*); @@ -214,7 +214,7 @@ WebGLAny getSyncParameter(WebGLSync&, GCGLenum pname); // Transform feedback - RefPtr createTransformFeedback(); + Ref createTransformFeedback(); void deleteTransformFeedback(WebGLTransformFeedback* id); GCGLboolean isTransformFeedback(WebGLTransformFeedback* id); void bindTransformFeedback(GCGLenum target, WebGLTransformFeedback* id); @@ -237,7 +237,7 @@ void uniformBlockBinding(WebGLProgram&, GCGLuint uniformBlockIndex, GCGLuint uniformBlockBinding); // Vertex array objects - RefPtr createVertexArray(); + Ref createVertexArray(); void deleteVertexArray(WebGLVertexArrayObject* vertexArray); GCGLboolean isVertexArray(WebGLVertexArrayObject* vertexArray); void bindVertexArray(WebGLVertexArrayObject* vertexArray); @@ -261,7 +261,7 @@ private: using WebGLRenderingContextBase::WebGLRenderingContextBase; - void initializeContextState() final; + void initializeContextState() WTF_REQUIRES_LOCK(objectGraphLock()) final; RefPtr arrayBufferViewSliceFactory(ASCIILiteral functionName, const ArrayBufferView& data, unsigned startByte, unsigned bytelength); RefPtr sliceArrayBufferView(ASCIILiteral functionName, const ArrayBufferView& data, GCGLuint srcOffset, GCGLuint length); @@ -269,7 +269,7 @@ long long getInt64Parameter(GCGLenum) final; Vector getIndexedBooleanArrayParameter(GCGLenum pname, GCGLuint index); - void initializeDefaultObjects() final; + void initializeDefaultObjects() WTF_REQUIRES_LOCK(objectGraphLock()) final; bool validateBufferTarget(ASCIILiteral functionName, GCGLenum target) final; bool validateBufferTargetCompatibility(ASCIILiteral, GCGLenum, WebGLBuffer*); RefPtr validateBufferDataParameters(ASCIILiteral functionName, GCGLenum target, GCGLenum usage) final; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGL2RenderingContext.idl webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGL2RenderingContext.idl --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGL2RenderingContext.idl 2026-02-23 14:40:55.278301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGL2RenderingContext.idl 2026-07-09 07:12:42.048797600 +0000 @@ -63,6 +63,9 @@ GenerateIsReachable=ImplCanvasBase, JSCustomMarkFunction, DoNotCheckConstants, + ExportMacro=WEBCORE_EXPORT, + ReportExtraMemoryCost, + ReportExternalMemoryCost, Exposed=(Window,Worker), CallTracer=InspectorCanvasCallTracer, ] interface WebGL2RenderingContext { @@ -417,7 +420,7 @@ undefined clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); // Query Objects. - WebGLQuery? createQuery(); + WebGLQuery createQuery(); undefined deleteQuery(WebGLQuery? query); GLboolean isQuery(WebGLQuery? query); undefined beginQuery(GLenum target, WebGLQuery query); @@ -426,7 +429,7 @@ [OverrideIDLType=IDLWebGLAny] any getQueryParameter(WebGLQuery query, GLenum pname); // Sampler Objects. - WebGLSampler? createSampler(); + WebGLSampler createSampler(); undefined deleteSampler(WebGLSampler? sampler); GLboolean isSampler(WebGLSampler? sampler); undefined bindSampler(GLuint unit, WebGLSampler? sampler); @@ -443,7 +446,7 @@ [OverrideIDLType=IDLWebGLAny] any getSyncParameter(WebGLSync sync, GLenum pname); // Transform Feedback. - WebGLTransformFeedback? createTransformFeedback(); + WebGLTransformFeedback createTransformFeedback(); undefined deleteTransformFeedback(WebGLTransformFeedback? id); GLboolean isTransformFeedback(WebGLTransformFeedback? id); undefined bindTransformFeedback(GLenum target, WebGLTransformFeedback? id); @@ -466,7 +469,7 @@ undefined uniformBlockBinding(WebGLProgram program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); // Vertex Array Objects. - WebGLVertexArrayObject? createVertexArray(); + WebGLVertexArrayObject createVertexArray(); undefined deleteVertexArray(WebGLVertexArrayObject? vertexArray); GLboolean isVertexArray(WebGLVertexArrayObject? vertexArray); undefined bindVertexArray(WebGLVertexArrayObject? vertexArray); diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLBuffer.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLBuffer.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLBuffer.cpp 2026-02-23 14:40:55.278301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLBuffer.cpp 2026-07-09 07:12:42.048797600 +0000 @@ -35,19 +35,26 @@ namespace WebCore { -RefPtr WebGLBuffer::create(WebGLRenderingContextBase& context) +Ref WebGLBuffer::create(WebGLRenderingContextBase& context) { auto object = context.graphicsContextGL()->createBuffer(); if (!object) - return nullptr; + return createLost(); return adoptRef(*new WebGLBuffer { context, object }); } +Ref WebGLBuffer::createLost() +{ + return adoptRef(*new WebGLBuffer { }); +} + WebGLBuffer::WebGLBuffer(WebGLRenderingContextBase& context, PlatformGLObject object) : WebGLObject(context, object) { } +WebGLBuffer::WebGLBuffer() = default; + WebGLBuffer::~WebGLBuffer() { if (!m_context) diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLBuffer.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLBuffer.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLBuffer.h 2026-01-20 14:08:45.098676400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLBuffer.h 2026-07-09 07:12:42.048797600 +0000 @@ -39,7 +39,8 @@ class WebGLBuffer final : public WebGLObject { public: - static RefPtr create(WebGLRenderingContextBase&); + static Ref create(WebGLRenderingContextBase&); + static Ref createLost(); virtual ~WebGLBuffer(); GCGLenum getTarget() const { return m_target; } @@ -48,6 +49,7 @@ bool isInitialized() const { return m_target; } private: WebGLBuffer(WebGLRenderingContextBase&, PlatformGLObject); + WebGLBuffer(); void deleteObjectImpl(const AbstractLocker&, GraphicsContextGL*, PlatformGLObject) override; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLFramebuffer.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLFramebuffer.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLFramebuffer.cpp 2026-02-23 14:40:55.282301700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLFramebuffer.cpp 2026-07-09 07:12:42.048797600 +0000 @@ -120,11 +120,16 @@ }); } -RefPtr WebGLFramebuffer::create(WebGLRenderingContextBase& context) +Ref WebGLFramebuffer::createLost() +{ + return adoptRef(*new WebGLFramebuffer { }); +} + +Ref WebGLFramebuffer::create(WebGLRenderingContextBase& context) { auto object = context.graphicsContextGL()->createFramebuffer(); if (!object) - return nullptr; + return createLost(); return adoptRef(*new WebGLFramebuffer { context, object, Type::Plain }); } @@ -147,6 +152,13 @@ UNUSED_PARAM(type); } +WebGLFramebuffer::WebGLFramebuffer() +#if ENABLE(WEBXR) + : m_isOpaque(false) +#endif +{ +} + WebGLFramebuffer::~WebGLFramebuffer() { if (!context()) diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLFramebuffer.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLFramebuffer.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLFramebuffer.h 2026-02-23 14:40:55.283301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLFramebuffer.h 2026-07-09 07:12:42.048797600 +0000 @@ -53,7 +53,8 @@ public: virtual ~WebGLFramebuffer(); - static RefPtr create(WebGLRenderingContextBase&); + static Ref createLost(); + static Ref create(WebGLRenderingContextBase&); #if ENABLE(WEBXR) static RefPtr createOpaque(WebGLRenderingContextBase&); #endif @@ -114,6 +115,7 @@ #endif }; WebGLFramebuffer(WebGLRenderingContextBase&, PlatformGLObject, Type); + WebGLFramebuffer(); void deleteObjectImpl(const AbstractLocker&, GraphicsContextGL*, PlatformGLObject) override; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLObject.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLObject.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLObject.h 2026-02-23 14:40:55.283301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLObject.h 2026-07-09 07:12:42.048797600 +0000 @@ -69,6 +69,7 @@ T* operator->() const { return m_object.get(); } T& operator*() const { return *m_object; } operator RefPtr() const { return m_object; } + Ref releaseNonNull() { return m_object.releaseNonNull(); } private: void didBind(T& object) @@ -113,6 +114,7 @@ protected: WebGLObject(WebGLRenderingContextBase&, PlatformGLObject); + WebGLObject() = default; void runDestructor(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLProgram.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLProgram.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLProgram.cpp 2026-03-25 16:38:32.914259700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLProgram.cpp 2026-07-09 07:12:42.048797600 +0000 @@ -55,11 +55,16 @@ return s_instancesLock; } -RefPtr WebGLProgram::create(WebGLRenderingContextBase& context) +Ref WebGLProgram::createLost(WebGLRenderingContextBase& context) +{ + return adoptRef(*new WebGLProgram { context }); +} + +Ref WebGLProgram::create(WebGLRenderingContextBase& context) { auto object = context.graphicsContextGL()->createProgram(); if (!object) - return nullptr; + return createLost(context); return adoptRef(*new WebGLProgram { context, object }); } @@ -72,6 +77,16 @@ { Locker locker { instancesLock() }; instances().add(this, &context); + } +} + +WebGLProgram::WebGLProgram(WebGLRenderingContextBase& context) + : ContextDestructionObserver(context.scriptExecutionContext()) +{ + ASSERT(scriptExecutionContext()); + { + Locker locker { instancesLock() }; + instances().add(this, &context); } } diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLProgram.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLProgram.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLProgram.h 2026-03-25 16:38:32.915259600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLProgram.h 2026-07-09 07:12:42.048797600 +0000 @@ -50,7 +50,8 @@ class WebGLProgram final : public WebGLObject, public ContextDestructionObserver { public: - static RefPtr create(WebGLRenderingContextBase&); + static Ref createLost(WebGLRenderingContextBase&); + static Ref create(WebGLRenderingContextBase&); virtual ~WebGLProgram(); // ContextDestructionObserver. @@ -95,6 +96,7 @@ private: WebGLProgram(WebGLRenderingContextBase&, PlatformGLObject); + WebGLProgram(WebGLRenderingContextBase&); void deleteObjectImpl(const AbstractLocker&, GraphicsContextGL*, PlatformGLObject) override; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLQuery.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLQuery.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLQuery.cpp 2026-02-23 14:40:55.284301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLQuery.cpp 2026-07-09 07:12:42.048797600 +0000 @@ -33,12 +33,17 @@ #include namespace WebCore { - -RefPtr WebGLQuery::create(WebGLRenderingContextBase& context) + +Ref WebGLQuery::createLost() +{ + return adoptRef(*new WebGLQuery { }); +} + +Ref WebGLQuery::create(WebGLRenderingContextBase& context) { auto object = context.graphicsContextGL()->createQuery(); if (!object) - return nullptr; + return createLost(); return adoptRef(*new WebGLQuery { context, object }); } @@ -55,6 +60,8 @@ { } +WebGLQuery::WebGLQuery() = default; + void WebGLQuery::deleteObjectImpl(const AbstractLocker&, GraphicsContextGL* context3d, PlatformGLObject object) { context3d->deleteQuery(object); diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLQuery.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLQuery.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLQuery.h 2026-01-20 14:08:45.108676400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLQuery.h 2026-07-09 07:12:42.052797600 +0000 @@ -37,7 +37,8 @@ class WebGLQuery final : public WebGLObject { public: - static RefPtr create(WebGLRenderingContextBase&); + static Ref createLost(); + static Ref create(WebGLRenderingContextBase&); virtual ~WebGLQuery(); bool isResultAvailable() const { return m_isResultAvailable; } @@ -50,6 +51,7 @@ bool isInitialized() const { return true; } private: WebGLQuery(WebGLRenderingContextBase&, PlatformGLObject); + WebGLQuery(); void deleteObjectImpl(const AbstractLocker&, GraphicsContextGL*, PlatformGLObject) override; bool m_isResultAvailable { false }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLRenderbuffer.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderbuffer.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLRenderbuffer.cpp 2026-02-23 14:40:55.284301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderbuffer.cpp 2026-07-09 07:12:42.052797600 +0000 @@ -35,11 +35,17 @@ namespace WebCore { -RefPtr WebGLRenderbuffer::create(WebGLRenderingContextBase& context) + +Ref WebGLRenderbuffer::createLost() +{ + return adoptRef(*new WebGLRenderbuffer { }); +} + +Ref WebGLRenderbuffer::create(WebGLRenderingContextBase& context) { auto object = context.graphicsContextGL()->createRenderbuffer(); if (!object) - return nullptr; + return createLost(); return adoptRef(*new WebGLRenderbuffer { context, object }); } @@ -56,6 +62,8 @@ { } +WebGLRenderbuffer::WebGLRenderbuffer() = default; + void WebGLRenderbuffer::deleteObjectImpl(const AbstractLocker&, GraphicsContextGL* context3d, PlatformGLObject object) { context3d->deleteRenderbuffer(object); diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLRenderbuffer.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderbuffer.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLRenderbuffer.h 2026-01-20 14:08:45.109676400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderbuffer.h 2026-07-09 07:12:42.052797600 +0000 @@ -36,7 +36,8 @@ public: virtual ~WebGLRenderbuffer(); - static RefPtr create(WebGLRenderingContextBase&); + static Ref createLost(); + static Ref create(WebGLRenderingContextBase&); void setInternalFormat(GCGLenum internalformat) { @@ -63,6 +64,7 @@ private: WebGLRenderbuffer(WebGLRenderingContextBase&, PlatformGLObject); + WebGLRenderbuffer(); void deleteObjectImpl(const AbstractLocker&, GraphicsContextGL*, PlatformGLObject) override; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLRenderingContext.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderingContext.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLRenderingContext.h 2026-02-23 14:40:55.284301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderingContext.h 2026-07-09 07:12:42.052797600 +0000 @@ -50,7 +50,7 @@ GCGLint maxDrawBuffers() final; GCGLint maxColorAttachments() final; - void initializeDefaultObjects() final; + void initializeDefaultObjects() WTF_REQUIRES_LOCK(objectGraphLock()) final; void addMembersToOpaqueRoots(JSC::AbstractSlotVisitor&) final; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLRenderingContext.idl webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderingContext.idl --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLRenderingContext.idl 2026-02-23 14:40:55.284301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderingContext.idl 2026-07-09 07:12:42.052797600 +0000 @@ -47,6 +47,8 @@ JSCustomMarkFunction, DoNotCheckConstants, ExportMacro=WEBCORE_EXPORT, + ReportExtraMemoryCost, + ReportExternalMemoryCost, Exposed=(Window,Worker), CallTracer=InspectorCanvasCallTracer, ] interface WebGLRenderingContext { diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp 2026-03-25 16:38:32.916259500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp 2026-07-09 07:12:42.052797600 +0000 @@ -481,6 +481,7 @@ renderingContext->initializeNewContext(context.releaseNonNull()); renderingContext->suspendIfNeeded(); InspectorInstrumentation::didCreateCanvasRenderingContext(*renderingContext); + renderingContext->updateMemoryCost(); if (renderingContext->m_context->isContextLost()) renderingContext->forceContextLost(); return renderingContext; @@ -524,8 +525,11 @@ updateActiveOrdinal(); if (!wasActive) addActiveContext(*this); - initializeContextState(); - initializeDefaultObjects(); + { + Locker locker { objectGraphLock() }; + initializeContextState(); + initializeDefaultObjects(); + } // Next calls will receive the context lost callback. m_context->setClient(this); } @@ -533,7 +537,8 @@ void WebGLRenderingContextBase::initializeContextState() { m_errors = { }; - m_canvasBufferContents = SurfaceBuffer::DrawingBuffer; + m_readDisplayBuffer = nullptr; + m_readDrawingBuffer = nullptr; m_compositingResultsNeedUpdating = false; m_activeTextureUnit = 0; m_packParameters = { }; @@ -679,7 +684,10 @@ return; m_compositingResultsNeedUpdating = true; - m_canvasBufferContents = std::nullopt; + if (m_readDrawingBuffer) { + m_readDrawingBuffer = nullptr; + updateMemoryCost(); + } markCanvasChanged(); } @@ -757,19 +765,40 @@ return combinedClear; } +// Temporary function to create image buffer for backing store reads until NativeImages are used. +static RefPtr createImageBufferForWebGLContextReads(IntSize size, ScriptExecutionContext& scriptExecutionContext) +{ + return ImageBuffer::create(size, RenderingMode::Accelerated, RenderingPurpose::Canvas, 1, DestinationColorSpace::SRGB(), PixelFormat::BGRA8, scriptExecutionContext.graphicsClient()); +} RefPtr WebGLRenderingContextBase::surfaceBufferToImageBuffer(SurfaceBuffer sourceBuffer) { - RefPtr buffer = protectedCanvasBase()->buffer(); + RefPtr scriptExecutionContext = this->scriptExecutionContext(); + if (!scriptExecutionContext) + return nullptr; + auto size = clampedCanvasSize(); + if (size.isEmpty()) + return nullptr; + RefPtr buffer; + if (sourceBuffer == SurfaceBuffer::DrawingBuffer) { + if (m_readDrawingBuffer) + return m_readDrawingBuffer; + m_readDrawingBuffer = createImageBufferForWebGLContextReads(size, *scriptExecutionContext); + updateMemoryCost(); + buffer = m_readDrawingBuffer; + } else { + if (m_readDisplayBuffer) + return m_readDisplayBuffer; + m_readDisplayBuffer = createImageBufferForWebGLContextReads(size, *scriptExecutionContext); + updateMemoryCost(); + buffer = m_readDisplayBuffer; + } if (isContextLost()) return buffer; if (!buffer) return buffer; - if (m_canvasBufferContents == sourceBuffer) - return buffer; if (sourceBuffer == SurfaceBuffer::DrawingBuffer) clearIfComposited(CallerTypeOther); - m_canvasBufferContents = sourceBuffer; // FIXME: Remote ImageBuffers do not flush the buffers that are drawn to a buffer. // Avoid leaking the WebGL content in the cases where a WebGL canvas element is drawn to a Context2D // canvas element repeatedly. @@ -788,7 +817,7 @@ if (m_attributes.premultipliedAlpha) return nullptr; clearIfComposited(CallerTypeOther); - auto size = m_defaultFramebuffer->size(); + auto size = clampedCanvasSize(); if (size.isEmpty()) return nullptr; PixelBufferFormat format { AlphaPremultiplication::Unpremultiplied, PixelFormat::RGBA8, DestinationColorSpace::SRGB() }; @@ -833,7 +862,15 @@ RefPtr WebGLRenderingContextBase::transferToImageBuffer() { - auto buffer = protectedCanvasBase()->allocateImageBuffer(); + if (isContextLost()) + return nullptr; + RefPtr scriptExecutionContext = this->scriptExecutionContext(); + if (!scriptExecutionContext) + return nullptr; + auto size = clampedCanvasSize(); + if (size.isEmpty()) + return nullptr; + RefPtr buffer = createImageBufferForWebGLContextReads(size, *scriptExecutionContext); if (!buffer) return nullptr; if (compositingResultsNeedUpdating()) @@ -848,18 +885,24 @@ return buffer; } -void WebGLRenderingContextBase::reshape() +void WebGLRenderingContextBase::didUpdateCanvasSizeProperties(bool) { - if (isContextLost()) + if (isContextLost()) { + m_readDrawingBuffer = nullptr; + m_readDisplayBuffer = nullptr; + updateMemoryCost(); return; + } auto newSize = clampedCanvasSize(); if (newSize == m_defaultFramebuffer->size()) return; - // We don't have to mark the canvas as dirty, since the newly created image buffer will also start off - // clear (and this matches what reshape will do). + m_readDrawingBuffer = nullptr; + m_readDisplayBuffer = nullptr; + m_defaultFramebuffer->reshape(newSize); + updateMemoryCost(); auto& textureUnit = m_textureUnits[m_activeTextureUnit]; RefPtr context = m_context; @@ -1287,6 +1330,8 @@ return; if (!validateTexture2DBinding("compressedTexImage2D"_s, target)) return; + if (!validateCompressedTexFormat("compressedTexImage2D"_s, internalformat)) + return; graphicsContextGL()->compressedTexImage2D(target, level, internalformat, width, height, border, data.byteLength(), data.span()); } @@ -1296,6 +1341,8 @@ return; if (!validateTexture2DBinding("compressedTexSubImage2D"_s, target)) return; + if (!validateCompressedTexFormat("compressedTexSubImage2D"_s, format)) + return; graphicsContextGL()->compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, data.byteLength(), data.span()); } @@ -1330,54 +1377,53 @@ graphicsContextGL()->copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); } -RefPtr WebGLRenderingContextBase::createBuffer() +Ref WebGLRenderingContextBase::createBuffer() { if (isContextLost()) - return nullptr; + return WebGLBuffer::createLost(); return WebGLBuffer::create(*this); } -RefPtr WebGLRenderingContextBase::createFramebuffer() +Ref WebGLRenderingContextBase::createFramebuffer() { if (isContextLost()) - return nullptr; + return WebGLFramebuffer::createLost(); return WebGLFramebuffer::create(*this); } -RefPtr WebGLRenderingContextBase::createTexture() +Ref WebGLRenderingContextBase::createTexture() { if (isContextLost()) - return nullptr; + return WebGLTexture::createLost(); return WebGLTexture::create(*this); } -RefPtr WebGLRenderingContextBase::createProgram() +Ref WebGLRenderingContextBase::createProgram() { - if (isContextLost()) - return nullptr; - auto program = WebGLProgram::create(*this); - if (!program) - return nullptr; - InspectorInstrumentation::didCreateWebGLProgram(*this, *program); + Ref program = [&]() { + if (isContextLost()) + return WebGLProgram::createLost(*this); + return WebGLProgram::create(*this); + }(); + InspectorInstrumentation::didCreateWebGLProgram(*this, program); return program; } -RefPtr WebGLRenderingContextBase::createRenderbuffer() +Ref WebGLRenderingContextBase::createRenderbuffer() { if (isContextLost()) - return nullptr; + return WebGLRenderbuffer::createLost(); return WebGLRenderbuffer::create(*this); } RefPtr WebGLRenderingContextBase::createShader(GCGLenum type) { - if (isContextLost()) - return nullptr; if (type != GraphicsContextGL::VERTEX_SHADER && type != GraphicsContextGL::FRAGMENT_SHADER) { synthesizeGLError(GraphicsContextGL::INVALID_ENUM, "createShader"_s, "invalid shader type"_s); return nullptr; } - + if (isContextLost()) + return WebGLShader::createLost(type); return WebGLShader::create(*this, type); } @@ -3727,6 +3773,15 @@ return true; } +bool WebGLRenderingContextBase::validateCompressedTexFormat(ASCIILiteral functionName, GCGLenum format) +{ + if (!m_compressedTextureFormats.contains(format)) { + synthesizeGLError(GraphicsContextGL::INVALID_ENUM, functionName, "invalid format"_s); + return false; + } + return true; +} + void WebGLRenderingContextBase::texImage2D(GCGLenum target, GCGLint level, GCGLenum internalformat, GCGLsizei width, GCGLsizei height, GCGLint border, GCGLenum format, GCGLenum type, RefPtr&& pixels) { texImageArrayBufferViewHelper(TexImageFunctionID::TexImage2D, target, level, internalformat, width, height, 1, border, format, type, 0, 0, 0, WTF::move(pixels), NullAllowed, 0); @@ -5252,6 +5307,7 @@ if (auto context = graphicsClient->createGraphicsContextGL(resolveGraphicsContextGLAttributes(m_creationAttributes, isWebGL2(), *scriptExecutionContext))) { initializeNewContext(context.releaseNonNull()); + updateMemoryCost(); if (!m_context->isContextLost()) { // Context lost state is reset only here: context creation succeeded // and initialization calls did not observe context loss. This means @@ -5651,7 +5707,9 @@ m_defaultFramebuffer->markAllUnpreservedBuffersDirty(); m_compositingResultsNeedUpdating = false; - m_canvasBufferContents = std::nullopt; + m_readDisplayBuffer = nullptr; + m_readDrawingBuffer = nullptr; + updateMemoryCost(); if (hasActiveInspectorCanvasCallTracer()) [[unlikely]] InspectorInstrumentation::didFinishRecordingCanvasFrame(*this); @@ -5667,6 +5725,27 @@ return !m_attributes.alpha; } +void WebGLRenderingContextBase::updateMemoryCost() const +{ + // Computes only a rough ballpark figure to drive garbage collection. + size_t newMemoryCost = 0; + if (m_readDisplayBuffer) + newMemoryCost += Ref { *m_readDisplayBuffer }->memoryCost(); + if (m_readDrawingBuffer) + newMemoryCost += Ref { *m_readDrawingBuffer }->memoryCost(); + if (!isContextLost()) { + size_t area = m_defaultFramebuffer->size().unclampedArea(); + size_t bytesPerSample = 4; + if (m_attributes.depth) + bytesPerSample += 4; + else if (m_attributes.stencil) + bytesPerSample += 1; + size_t samplesPerPixel = m_attributes.antialias ? 4 : 1; + newMemoryCost += area * samplesPerPixel * bytesPerSample; + } + CanvasRenderingContext::updateMemoryCost(newMemoryCost); +} + WebCoreOpaqueRoot root(WebGLRenderingContextBase* context) { return WebCoreOpaqueRoot { context }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLRenderingContextBase.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderingContextBase.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLRenderingContextBase.h 2026-02-23 14:40:55.285301400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderingContextBase.h 2026-07-09 07:12:42.052797600 +0000 @@ -208,12 +208,12 @@ void copyTexImage2D(GCGLenum target, GCGLint level, GCGLenum internalformat, GCGLint x, GCGLint y, GCGLsizei width, GCGLsizei height, GCGLint border); void copyTexSubImage2D(GCGLenum target, GCGLint level, GCGLint xoffset, GCGLint yoffset, GCGLint x, GCGLint y, GCGLsizei width, GCGLsizei height); - RefPtr createBuffer(); - RefPtr createFramebuffer(); - RefPtr createProgram(); - RefPtr createRenderbuffer(); + Ref createBuffer(); + Ref createFramebuffer(); + Ref createProgram(); + Ref createRenderbuffer(); RefPtr createShader(GCGLenum type); - RefPtr createTexture(); + Ref createTexture(); void cullFace(GCGLenum mode); @@ -429,9 +429,10 @@ RefPtr layerContentsDisplayDelegate() override; - void reshape() override; + void didUpdateCanvasSizeProperties(bool) override; RefPtr surfaceBufferToImageBuffer(SurfaceBuffer) final; + bool isSurfaceBufferTransparentBlack(SurfaceBuffer) const final { return false; } RefPtr drawingBufferToPixelBuffer(); #if ENABLE(MEDIA_STREAM) || ENABLE(WEB_CODECS) @@ -528,8 +529,8 @@ friend class ScopedWebGLRestoreTexture; void initializeNewContext(Ref); - virtual void initializeContextState(); - virtual void initializeDefaultObjects(); + virtual void initializeContextState() WTF_REQUIRES_LOCK(objectGraphLock()); + virtual void initializeDefaultObjects() WTF_REQUIRES_LOCK(objectGraphLock()); // ActiveDOMObject void stop() override; @@ -588,6 +589,7 @@ virtual void uncacheDeletedBuffer(const AbstractLocker&, WebGLBuffer*); bool needsPreparationForDisplay() const final { return true; } void updateActiveOrdinal(); + void updateMemoryCost() const; struct ContextLostState { ContextLostState(LostContextMode mode) @@ -707,7 +709,8 @@ int m_numGLErrorsToConsoleAllowed; bool m_compositingResultsNeedUpdating { false }; - std::optional m_canvasBufferContents; + RefPtr m_readDrawingBuffer; + RefPtr m_readDisplayBuffer; // Enabled extension objects. // FIXME: Move some of these to WebGLRenderingContext, the ones not needed for WebGL2 @@ -905,6 +908,8 @@ bool validateTexFunc(TexImageFunctionID, TexFuncValidationSourceType, GCGLenum target, GCGLint level, GCGLenum internalformat, GCGLsizei width, GCGLsizei height, GCGLsizei depth, GCGLint border, GCGLenum format, GCGLenum type, GCGLint xoffset, GCGLint yoffset, GCGLint zoffset); + bool validateCompressedTexFormat(ASCIILiteral functionName, GCGLenum format); + // Helper function to check input parameters for functions {copy}Tex{Sub}Image. // Generates GL error and returns false if parameters are invalid. bool validateTexFuncParameters(TexImageFunctionID, diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLRenderingContextBase.idl webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderingContextBase.idl --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLRenderingContextBase.idl 2026-02-23 14:40:55.286301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLRenderingContextBase.idl 2026-07-09 07:12:42.052797600 +0000 @@ -520,12 +520,12 @@ undefined copyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); undefined copyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); - WebGLBuffer? createBuffer(); - WebGLFramebuffer? createFramebuffer(); - WebGLProgram? createProgram(); - WebGLRenderbuffer? createRenderbuffer(); + WebGLBuffer createBuffer(); + WebGLFramebuffer createFramebuffer(); + WebGLProgram createProgram(); + WebGLRenderbuffer createRenderbuffer(); WebGLShader? createShader(GLenum type); - WebGLTexture? createTexture(); + WebGLTexture createTexture(); undefined cullFace(GLenum mode); diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLSampler.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLSampler.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLSampler.cpp 2026-02-23 14:40:55.286301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLSampler.cpp 2026-07-09 07:12:42.052797600 +0000 @@ -34,11 +34,16 @@ namespace WebCore { -RefPtr WebGLSampler::create(WebGLRenderingContextBase& context) +Ref WebGLSampler::createLost() +{ + return adoptRef(*new WebGLSampler { }); +} + +Ref WebGLSampler::create(WebGLRenderingContextBase& context) { auto object = context.graphicsContextGL()->createSampler(); if (!object) - return nullptr; + return createLost(); return adoptRef(*new WebGLSampler { context, object }); } @@ -55,6 +60,8 @@ { } +WebGLSampler::WebGLSampler() = default; + void WebGLSampler::deleteObjectImpl(const AbstractLocker&, GraphicsContextGL* context3d, PlatformGLObject object) { context3d->deleteSampler(object); diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLSampler.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLSampler.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLSampler.h 2026-01-20 14:08:45.111676500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLSampler.h 2026-07-09 07:12:42.052797600 +0000 @@ -37,13 +37,15 @@ class WebGLSampler final : public WebGLObject { public: - static RefPtr create(WebGLRenderingContextBase&); + static Ref createLost(); + static Ref create(WebGLRenderingContextBase&); virtual ~WebGLSampler(); void didBind() { } bool isUsable() const { return object() && !isDeleted(); } bool isInitialized() const { return true; } private: - explicit WebGLSampler(WebGLRenderingContextBase&, PlatformGLObject); + WebGLSampler(WebGLRenderingContextBase&, PlatformGLObject); + WebGLSampler(); void deleteObjectImpl(const AbstractLocker&, GraphicsContextGL*, PlatformGLObject) final; }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLShader.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLShader.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLShader.cpp 2026-02-23 14:40:55.286301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLShader.cpp 2026-07-09 07:12:42.052797600 +0000 @@ -35,11 +35,16 @@ namespace WebCore { -RefPtr WebGLShader::create(WebGLRenderingContextBase& context, GCGLenum type) +Ref WebGLShader::createLost(GCGLenum type) +{ + return adoptRef(*new WebGLShader(type)); +} + +Ref WebGLShader::create(WebGLRenderingContextBase& context, GCGLenum type) { auto object = context.graphicsContextGL()->createShader(type); if (!object) - return nullptr; + return createLost(type); return adoptRef(*new WebGLShader(context, object, type)); } @@ -50,6 +55,11 @@ { } +WebGLShader::WebGLShader(GCGLenum type) + : m_type(type) +{ +} + WebGLShader::~WebGLShader() { if (!m_context) diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLShader.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLShader.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLShader.h 2026-01-20 14:08:45.111676500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLShader.h 2026-07-09 07:12:42.052797600 +0000 @@ -34,7 +34,8 @@ class WebGLShader final : public WebGLObject { public: - static RefPtr create(WebGLRenderingContextBase&, GCGLenum); + static Ref createLost(GCGLenum); + static Ref create(WebGLRenderingContextBase&, GCGLenum); virtual ~WebGLShader(); GCGLenum getType() const { return m_type; } @@ -46,6 +47,7 @@ bool isInitialized() const { return true; } private: WebGLShader(WebGLRenderingContextBase&, PlatformGLObject, GCGLenum); + WebGLShader(GCGLenum); void deleteObjectImpl(const AbstractLocker&, GraphicsContextGL*, PlatformGLObject) final; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLSync.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLSync.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLSync.cpp 2026-02-23 14:40:55.286301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLSync.cpp 2026-07-09 07:12:42.052797600 +0000 @@ -35,11 +35,16 @@ namespace WebCore { -RefPtr WebGLSync::create(WebGLRenderingContextBase& context) +Ref WebGLSync::createLost() +{ + return adoptRef(*new WebGLSync { }); +} + +Ref WebGLSync::create(WebGLRenderingContextBase& context) { auto object = context.graphicsContextGL()->fenceSync(GraphicsContextGL::SYNC_GPU_COMMANDS_COMPLETE, 0); if (!object) - return nullptr; + return createLost(); return adoptRef(*new WebGLSync { context, object }); } @@ -57,6 +62,11 @@ { } +WebGLSync::WebGLSync() + : m_sync(nullptr) +{ +} + void WebGLSync::deleteObjectImpl(const AbstractLocker&, GraphicsContextGL* context3d, PlatformGLObject) { context3d->deleteSync(m_sync); @@ -97,6 +107,8 @@ void WebGLSync::scheduleAllowCacheUpdate(WebGLRenderingContextBase& context) { + if (!m_sync) + return; context.protectedCanvasBase()->queueTaskKeepingObjectAlive(TaskSource::WebGL, [protectedThis = Ref { *this }](auto&) { protectedThis->m_allowCacheUpdate = true; }); diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLSync.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLSync.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLSync.h 2026-01-20 14:08:45.113676300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLSync.h 2026-07-09 07:12:42.052797600 +0000 @@ -35,8 +35,8 @@ class WebGLSync final : public WebGLObject { public: virtual ~WebGLSync(); - - static RefPtr create(WebGLRenderingContextBase&); + static Ref createLost(); + static Ref create(WebGLRenderingContextBase&); void updateCache(WebGLRenderingContextBase&); GCGLint getCachedResult(GCGLenum pname) const; @@ -47,6 +47,8 @@ bool isInitialized() const { return true; } private: WebGLSync(WebGLRenderingContextBase&, GCGLsync); + WebGLSync(); + void deleteObjectImpl(const AbstractLocker&, GraphicsContextGL*, PlatformGLObject) override; bool m_allowCacheUpdate = { false }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLTexture.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLTexture.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLTexture.cpp 2026-02-23 14:40:55.286301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLTexture.cpp 2026-07-09 07:12:42.052797600 +0000 @@ -34,11 +34,16 @@ namespace WebCore { -RefPtr WebGLTexture::create(WebGLRenderingContextBase& context) +Ref WebGLTexture::createLost() +{ + return adoptRef(*new WebGLTexture { }); +} + +Ref WebGLTexture::create(WebGLRenderingContextBase& context) { auto object = context.graphicsContextGL()->createTexture(); if (!object) - return nullptr; + return createLost(); return adoptRef(*new WebGLTexture { context, object }); } @@ -47,6 +52,8 @@ { } +WebGLTexture::WebGLTexture() = default; + WebGLTexture::~WebGLTexture() { if (!m_context) diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLTexture.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLTexture.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLTexture.h 2026-01-20 14:08:45.114676200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLTexture.h 2026-07-09 07:12:42.052797600 +0000 @@ -37,7 +37,8 @@ virtual ~WebGLTexture(); - static RefPtr create(WebGLRenderingContextBase&); + static Ref createLost(); + static Ref create(WebGLRenderingContextBase&); void didBind(GCGLenum); GCGLenum getTarget() const { return m_target; } @@ -49,6 +50,8 @@ private: WebGLTexture(WebGLRenderingContextBase&, PlatformGLObject); + WebGLTexture(); + void deleteObjectImpl(const AbstractLocker&, GraphicsContextGL*, PlatformGLObject) override; int mapTargetToIndex(GCGLenum) const; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLTransformFeedback.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLTransformFeedback.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLTransformFeedback.cpp 2026-02-23 14:40:55.286301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLTransformFeedback.cpp 2026-07-09 07:12:42.052797600 +0000 @@ -37,11 +37,16 @@ namespace WebCore { -RefPtr WebGLTransformFeedback::create(WebGL2RenderingContext& context) +Ref WebGLTransformFeedback::createLost() +{ + return adoptRef(*new WebGLTransformFeedback { }); +} + +Ref WebGLTransformFeedback::create(WebGL2RenderingContext& context) { auto object = context.graphicsContextGL()->createTransformFeedback(); if (!object) - return nullptr; + return createLost(); return adoptRef(*new WebGLTransformFeedback { context, object }); } @@ -59,6 +64,8 @@ m_boundIndexedTransformFeedbackBuffers.grow(context.maxTransformFeedbackSeparateAttribs()); } +WebGLTransformFeedback::WebGLTransformFeedback() = default; + void WebGLTransformFeedback::deleteObjectImpl(const AbstractLocker&, GraphicsContextGL* context3d, PlatformGLObject object) { context3d->deleteTransformFeedback(object); diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLTransformFeedback.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLTransformFeedback.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLTransformFeedback.h 2026-01-20 14:08:45.115676400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLTransformFeedback.h 2026-07-09 07:12:42.052797600 +0000 @@ -49,8 +49,8 @@ class WebGLTransformFeedback final : public WebGLObject { public: virtual ~WebGLTransformFeedback(); - - static RefPtr create(WebGL2RenderingContext&); + static Ref createLost(); + static Ref create(WebGL2RenderingContext&); bool isActive() const { return m_active; } bool isPaused() const { return m_paused; } @@ -83,6 +83,7 @@ private: WebGLTransformFeedback(WebGL2RenderingContext&, PlatformGLObject); + WebGLTransformFeedback(); void deleteObjectImpl(const AbstractLocker&, GraphicsContextGL*, PlatformGLObject) override; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLVertexArrayObject.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLVertexArrayObject.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLVertexArrayObject.cpp 2026-02-23 14:40:55.287301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLVertexArrayObject.cpp 2026-07-09 07:12:42.052797600 +0000 @@ -33,12 +33,18 @@ #include namespace WebCore { + + +Ref WebGLVertexArrayObject::createLost() +{ + return adoptRef(*new WebGLVertexArrayObject { }); +} -RefPtr WebGLVertexArrayObject::create(WebGLRenderingContextBase& context, Type type) +Ref WebGLVertexArrayObject::create(WebGLRenderingContextBase& context, Type type) { auto object = context.graphicsContextGL()->createVertexArray(); if (!object) - return nullptr; + return createLost(); return adoptRef(*new WebGLVertexArrayObject { context, object, type }); } @@ -55,6 +61,8 @@ { } +WebGLVertexArrayObject::WebGLVertexArrayObject() = default; + void WebGLVertexArrayObject::deleteObjectImpl(const AbstractLocker& locker, GraphicsContextGL* context3d, PlatformGLObject object) { switch (m_type) { diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLVertexArrayObject.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLVertexArrayObject.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLVertexArrayObject.h 2026-01-20 14:08:45.116676300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLVertexArrayObject.h 2026-07-09 07:12:42.052797600 +0000 @@ -39,10 +39,12 @@ class WebGLVertexArrayObject final : public WebGLVertexArrayObjectBase { public: - static RefPtr create(WebGLRenderingContextBase&, Type); + static Ref createLost(); + static Ref create(WebGLRenderingContextBase&, Type); virtual ~WebGLVertexArrayObject(); private: WebGLVertexArrayObject(WebGLRenderingContextBase&, PlatformGLObject, Type); + WebGLVertexArrayObject(); void deleteObjectImpl(const AbstractLocker&, GraphicsContextGL*, PlatformGLObject) final; ArrayObjectType arrayObjectType() const final { return ArrayObjectType::Object; } }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLVertexArrayObjectBase.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLVertexArrayObjectBase.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLVertexArrayObjectBase.cpp 2026-02-23 14:40:55.287301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLVertexArrayObjectBase.cpp 2026-07-09 07:12:42.052797600 +0000 @@ -42,6 +42,11 @@ m_vertexAttribState.grow(context.maxVertexAttribs()); } +WebGLVertexArrayObjectBase::WebGLVertexArrayObjectBase() + : m_type(Type::User) +{ +} + void WebGLVertexArrayObjectBase::setElementArrayBuffer(const AbstractLocker& locker, WebGLBuffer* buffer) { if (buffer) diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLVertexArrayObjectBase.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLVertexArrayObjectBase.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLVertexArrayObjectBase.h 2026-01-20 14:08:45.117676300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLVertexArrayObjectBase.h 2026-07-09 07:12:42.052797600 +0000 @@ -93,9 +93,11 @@ protected: WebGLVertexArrayObjectBase(WebGLRenderingContextBase&, PlatformGLObject, Type); + WebGLVertexArrayObjectBase(); + void deleteObjectImpl(const AbstractLocker&, GraphicsContextGL*, PlatformGLObject) override = 0; - Type m_type; + const Type m_type; bool m_hasEverBeenBound { false }; WebGLBindingPoint m_boundElementArrayBuffer; Vector m_vertexAttribState; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLVertexArrayObjectOES.cpp webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLVertexArrayObjectOES.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLVertexArrayObjectOES.cpp 2026-02-23 14:40:55.288301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLVertexArrayObjectOES.cpp 2026-07-09 07:12:42.052797600 +0000 @@ -33,16 +33,21 @@ namespace WebCore { +Ref WebGLVertexArrayObjectOES::createLost() +{ + return adoptRef(*new WebGLVertexArrayObjectOES { }); +} + Ref WebGLVertexArrayObjectOES::createDefault(WebGLRenderingContextBase& context) { return adoptRef(*new WebGLVertexArrayObjectOES(context, 0, Type::Default)); } -RefPtr WebGLVertexArrayObjectOES::createUser(WebGLRenderingContextBase& context) +Ref WebGLVertexArrayObjectOES::createUser(WebGLRenderingContextBase& context) { auto object = context.graphicsContextGL()->createVertexArray(); if (!object) - return nullptr; + return createLost(); return adoptRef(*new WebGLVertexArrayObjectOES { context, object, Type::User }); } @@ -51,6 +56,8 @@ { } +WebGLVertexArrayObjectOES::WebGLVertexArrayObjectOES() = default; + WebGLVertexArrayObjectOES::~WebGLVertexArrayObjectOES() { if (!context()) diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLVertexArrayObjectOES.h webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLVertexArrayObjectOES.h --- webkit2gtk-2.52.3/Source/WebCore/html/canvas/WebGLVertexArrayObjectOES.h 2026-01-20 14:08:45.117676300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/canvas/WebGLVertexArrayObjectOES.h 2026-07-09 07:12:42.052797600 +0000 @@ -33,11 +33,14 @@ class WebGLVertexArrayObjectOES final : public WebGLVertexArrayObjectBase { public: + static Ref createLost(); static Ref createDefault(WebGLRenderingContextBase&); - static RefPtr createUser(WebGLRenderingContextBase&); + static Ref createUser(WebGLRenderingContextBase&); + virtual ~WebGLVertexArrayObjectOES(); private: WebGLVertexArrayObjectOES(WebGLRenderingContextBase&, PlatformGLObject, Type); + WebGLVertexArrayObjectOES(); void deleteObjectImpl(const AbstractLocker&, GraphicsContextGL*, PlatformGLObject) final; ArrayObjectType arrayObjectType() const final { return ArrayObjectType::ObjectOES; } }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/closewatcher/CloseWatcher.cpp webkit2gtk-2.52.5/Source/WebCore/html/closewatcher/CloseWatcher.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/closewatcher/CloseWatcher.cpp 2026-02-23 14:40:55.288301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/closewatcher/CloseWatcher.cpp 2026-07-09 07:12:42.052797600 +0000 @@ -59,8 +59,8 @@ } else { watcher->m_signal = signal; watcher->m_signalAlgorithm = signal->addAlgorithm([weakWatcher = WeakPtr { watcher.get() }](JSC::JSValue) mutable { - if (weakWatcher) - weakWatcher->destroy(); + if (RefPtr watcher = weakWatcher.get()) + watcher->destroy(); }); } } diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/closewatcher/CloseWatcherManager.cpp webkit2gtk-2.52.5/Source/WebCore/html/closewatcher/CloseWatcherManager.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/closewatcher/CloseWatcherManager.cpp 2026-02-23 14:40:55.288301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/closewatcher/CloseWatcherManager.cpp 2026-07-09 07:12:42.052797600 +0000 @@ -52,13 +52,12 @@ void CloseWatcherManager::remove(CloseWatcher& watcher) { - for (auto& group : m_groups) { - group.removeFirstMatching([&watcher] (const Ref& current) { + m_groups.removeAllMatching([&watcher](auto& group) { + group.removeFirstMatching([&watcher](const Ref& current) { return current.ptr() == &watcher; }); - if (group.isEmpty()) - m_groups.removeFirst(group); - } + return group.isEmpty(); + }); } void CloseWatcherManager::notifyAboutUserActivation() diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/shadow/AutoFillButtonElement.cpp webkit2gtk-2.52.5/Source/WebCore/html/shadow/AutoFillButtonElement.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/shadow/AutoFillButtonElement.cpp 2026-02-23 14:40:55.293301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/shadow/AutoFillButtonElement.cpp 2026-07-09 07:12:42.056797300 +0000 @@ -60,7 +60,8 @@ } if (isAnyClick(*mouseEvent)) { - m_owner.autoFillButtonElementWasClicked(); + if (RefPtr owner = m_owner.get()) + owner->autoFillButtonElementWasClicked(); event.setDefaultHandled(); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/shadow/AutoFillButtonElement.h webkit2gtk-2.52.5/Source/WebCore/html/shadow/AutoFillButtonElement.h --- webkit2gtk-2.52.3/Source/WebCore/html/shadow/AutoFillButtonElement.h 2026-02-23 14:40:55.293301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/shadow/AutoFillButtonElement.h 2026-07-09 07:12:42.056797300 +0000 @@ -26,6 +26,7 @@ #pragma once #include "HTMLDivElement.h" +#include namespace WebCore { @@ -35,7 +36,7 @@ WTF_MAKE_TZONE_ALLOCATED(AutoFillButtonElement); WTF_OVERRIDE_DELETE_FOR_CHECKED_PTR(AutoFillButtonElement); public: - class AutoFillButtonOwner { + class AutoFillButtonOwner : public AbstractRefCountedAndCanMakeWeakPtr { public: virtual ~AutoFillButtonOwner() = default; virtual void autoFillButtonElementWasClicked() = 0; @@ -43,12 +44,14 @@ static Ref create(Document&, AutoFillButtonOwner&); + void removeOwner() { m_owner = nullptr; } + private: explicit AutoFillButtonElement(Document&, AutoFillButtonOwner&); void defaultEventHandler(Event&) override; - AutoFillButtonOwner& m_owner; + WeakPtr m_owner; }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/shadow/DateTimeEditElement.cpp webkit2gtk-2.52.5/Source/WebCore/html/shadow/DateTimeEditElement.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/shadow/DateTimeEditElement.cpp 2026-02-23 14:40:55.294301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/shadow/DateTimeEditElement.cpp 2026-07-09 07:12:42.056797300 +0000 @@ -236,9 +236,10 @@ void DateTimeEditElement::defaultEventHandler(Event& event) { if (RefPtr keyboardEvent = dynamicDowncast(event)) { - if (keyboardEvent->keyIdentifier() == "U+0020"_s && m_editControlOwner) { + RefPtr editControlOwner = m_editControlOwner.get(); + if (editControlOwner && keyboardEvent->keyIdentifier() == "U+0020"_s) { // Forward space keypresses to the owner to activate the date picker. - m_editControlOwner->didReceiveSpaceKeyFromControl(); + editControlOwner->didReceiveSpaceKeyFromControl(); // We want to mark the event as handled to avoid scrolling the page. event.setDefaultHandled(); return; @@ -314,7 +315,8 @@ void DateTimeEditElement::didBlurFromField(Event& event) { - if (!m_editControlOwner) + RefPtr editControlOwner = m_editControlOwner.get(); + if (!editControlOwner) return; if (RefPtr newFocusedElement = event.relatedTarget()) { @@ -326,13 +328,13 @@ return; } - m_editControlOwner->didBlurFromControl(); + editControlOwner->didBlurFromControl(); } void DateTimeEditElement::fieldValueChanged() { - if (m_editControlOwner) - m_editControlOwner->didChangeValueFromControl(); + if (RefPtr editControlOwner = m_editControlOwner.get()) + editControlOwner->didChangeValueFromControl(); } bool DateTimeEditElement::focusOnNextFocusableField(size_t startIndex) @@ -382,12 +384,16 @@ bool DateTimeEditElement::isFieldOwnerDisabled() const { - return m_editControlOwner && m_editControlOwner->isEditControlOwnerDisabled(); + if (RefPtr editControlOwner = m_editControlOwner.get()) + return editControlOwner->isEditControlOwnerDisabled(); + return false; } bool DateTimeEditElement::isFieldOwnerReadOnly() const { - return m_editControlOwner && m_editControlOwner->isEditControlOwnerReadOnly(); + if (RefPtr editControlOwner = m_editControlOwner.get()) + return editControlOwner->isEditControlOwnerReadOnly(); + return false; } bool DateTimeEditElement::isFieldOwnerHorizontal() const @@ -399,18 +405,22 @@ bool DateTimeEditElement::didFieldOwnerTransferFocusToPicker() { - return m_editControlOwner && m_editControlOwner->didEditControlOwnerTransferFocusToPicker(); + if (RefPtr editControlOwner = m_editControlOwner.get()) + return editControlOwner->didEditControlOwnerTransferFocusToPicker(); + return false; } void DateTimeEditElement::didSuppressBlurDueToPickerFocusTransfer() { - if (m_editControlOwner) - m_editControlOwner->didSuppressBlurDueToPickerFocusTransfer(); + if (RefPtr editControlOwner = m_editControlOwner.get()) + editControlOwner->didSuppressBlurDueToPickerFocusTransfer(); } AtomString DateTimeEditElement::localeIdentifier() const { - return m_editControlOwner ? m_editControlOwner->localeIdentifier() : nullAtom(); + if (RefPtr editControlOwner = m_editControlOwner.get()) + return editControlOwner->localeIdentifier(); + return nullAtom(); } const GregorianDateTime& DateTimeEditElement::placeholderDate() const @@ -439,12 +449,16 @@ String DateTimeEditElement::value() const { - return m_editControlOwner ? m_editControlOwner->formatDateTimeFieldsState(valueAsDateTimeFieldsState()) : emptyString(); + if (RefPtr editControlOwner = m_editControlOwner.get()) + return editControlOwner->formatDateTimeFieldsState(valueAsDateTimeFieldsState()); + return emptyString(); } String DateTimeEditElement::placeholderValue() const { - return m_editControlOwner ? m_editControlOwner->formatDateTimeFieldsState(valueAsDateTimeFieldsState(DateTimePlaceholderIfNoValue::Yes)) : emptyString(); + if (RefPtr editControlOwner = m_editControlOwner.get()) + return editControlOwner->formatDateTimeFieldsState(valueAsDateTimeFieldsState(DateTimePlaceholderIfNoValue::Yes)); + return emptyString(); } DateTimeFieldsState DateTimeEditElement::valueAsDateTimeFieldsState(DateTimePlaceholderIfNoValue placeholderIfNoValue) const diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/shadow/DateTimeEditElement.h webkit2gtk-2.52.5/Source/WebCore/html/shadow/DateTimeEditElement.h --- webkit2gtk-2.52.3/Source/WebCore/html/shadow/DateTimeEditElement.h 2026-02-23 14:40:55.294301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/shadow/DateTimeEditElement.h 2026-07-09 07:12:42.056797300 +0000 @@ -28,23 +28,13 @@ #include "DateComponents.h" #include "DateTimeFieldElement.h" - -#include - -namespace WebCore { -class DateTimeEditElementEditControlOwner; -} - -namespace WTF { -template struct IsDeprecatedWeakRefSmartPointerException; -template<> struct IsDeprecatedWeakRefSmartPointerException : std::true_type { }; -} +#include namespace WebCore { class Locale; -class DateTimeEditElementEditControlOwner : public CanMakeWeakPtr { +class DateTimeEditElementEditControlOwner : public AbstractRefCountedAndCanMakeWeakPtr { public: virtual ~DateTimeEditElementEditControlOwner(); virtual void didBlurFromControl() = 0; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/track/InbandDataTextTrack.h webkit2gtk-2.52.5/Source/WebCore/html/track/InbandDataTextTrack.h --- webkit2gtk-2.52.3/Source/WebCore/html/track/InbandDataTextTrack.h 2026-02-23 14:40:55.299301400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/track/InbandDataTextTrack.h 2026-07-09 07:12:42.056797300 +0000 @@ -36,6 +36,7 @@ class InbandDataTextTrack final : public InbandTextTrack { WTF_MAKE_TZONE_ALLOCATED(InbandDataTextTrack); + WTF_OVERRIDE_DELETE_FOR_CHECKED_PTR(InbandDataTextTrack); public: static Ref create(ScriptExecutionContext&, InbandTextTrackPrivate&); virtual ~InbandDataTextTrack(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/track/InbandGenericTextTrack.h webkit2gtk-2.52.5/Source/WebCore/html/track/InbandGenericTextTrack.h --- webkit2gtk-2.52.3/Source/WebCore/html/track/InbandGenericTextTrack.h 2026-02-23 14:40:55.299301400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/track/InbandGenericTextTrack.h 2026-07-09 07:12:42.056797300 +0000 @@ -52,6 +52,7 @@ class InbandGenericTextTrack final : public InbandTextTrack, private WebVTTParserClient { WTF_MAKE_TZONE_ALLOCATED(InbandGenericTextTrack); + WTF_OVERRIDE_DELETE_FOR_CHECKED_PTR(InbandGenericTextTrack); public: static Ref create(ScriptExecutionContext&, InbandTextTrackPrivate&); virtual ~InbandGenericTextTrack(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/track/InbandTextTrack.h webkit2gtk-2.52.5/Source/WebCore/html/track/InbandTextTrack.h --- webkit2gtk-2.52.3/Source/WebCore/html/track/InbandTextTrack.h 2026-02-23 14:40:55.299301400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/track/InbandTextTrack.h 2026-07-09 07:12:42.056797300 +0000 @@ -34,6 +34,7 @@ class InbandTextTrack : public TextTrack, private InbandTextTrackPrivateClient { WTF_MAKE_TZONE_ALLOCATED(InbandTextTrack); + WTF_OVERRIDE_DELETE_FOR_CHECKED_PTR(InbandTextTrack); public: static Ref create(ScriptExecutionContext&, InbandTextTrackPrivate&); virtual ~InbandTextTrack(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/track/InbandWebVTTTextTrack.h webkit2gtk-2.52.5/Source/WebCore/html/track/InbandWebVTTTextTrack.h --- webkit2gtk-2.52.3/Source/WebCore/html/track/InbandWebVTTTextTrack.h 2026-02-23 14:40:55.300301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/track/InbandWebVTTTextTrack.h 2026-07-09 07:12:42.056797300 +0000 @@ -35,6 +35,7 @@ class InbandWebVTTTextTrack final : public InbandTextTrack, private WebVTTParserClient { WTF_MAKE_TZONE_ALLOCATED(InbandWebVTTTextTrack); + WTF_OVERRIDE_DELETE_FOR_CHECKED_PTR(InbandWebVTTTextTrack); public: static Ref create(ScriptExecutionContext&, InbandTextTrackPrivate&); virtual ~InbandWebVTTTextTrack(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/track/LoadableTextTrack.h webkit2gtk-2.52.5/Source/WebCore/html/track/LoadableTextTrack.h --- webkit2gtk-2.52.3/Source/WebCore/html/track/LoadableTextTrack.h 2026-02-23 14:40:55.300301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/track/LoadableTextTrack.h 2026-07-09 07:12:42.056797300 +0000 @@ -36,6 +36,7 @@ class LoadableTextTrack final : public TextTrack, private TextTrackLoaderClient { WTF_MAKE_TZONE_ALLOCATED(LoadableTextTrack); + WTF_OVERRIDE_DELETE_FOR_CHECKED_PTR(LoadableTextTrack); public: static Ref create(HTMLTrackElement&, const AtomString& kind, const AtomString& label, const AtomString& language); diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/track/TextTrack.h webkit2gtk-2.52.5/Source/WebCore/html/track/TextTrack.h --- webkit2gtk-2.52.3/Source/WebCore/html/track/TextTrack.h 2026-02-23 14:40:55.300301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/track/TextTrack.h 2026-07-09 07:12:42.056797300 +0000 @@ -32,6 +32,7 @@ #include #include #include +#include #include namespace WebCore { @@ -43,8 +44,9 @@ class TextTrackCueList; class VTTRegionList; -class TextTrack : public TrackBase, public EventTarget, public ActiveDOMObject { +class TextTrack : public TrackBase, public EventTarget, public ActiveDOMObject, public CanMakeCheckedPtr { WTF_MAKE_TZONE_ALLOCATED(TextTrack); + WTF_OVERRIDE_DELETE_FOR_CHECKED_PTR(TextTrack); public: static Ref create(ScriptExecutionContext*, const AtomString& kind, TrackID, const AtomString& label, const AtomString& language); static Ref create(ScriptExecutionContext*, const AtomString& kind, const AtomString& id, const AtomString& label, const AtomString& language); diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/track/TextTrackCue.cpp webkit2gtk-2.52.5/Source/WebCore/html/track/TextTrackCue.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/track/TextTrackCue.cpp 2026-02-23 14:40:55.300301600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/track/TextTrackCue.cpp 2026-07-09 07:12:42.056797300 +0000 @@ -54,8 +54,10 @@ #include "UserAgentParts.h" #include "VTTCue.h" #include "VTTRegionList.h" +#include "WebCoreOpaqueRootInlines.h" #include #include +#include #include #include #include @@ -228,6 +230,8 @@ { } +TextTrackCue::~TextTrackCue() = default; + void TextTrackCue::didMoveToNewDocument(Document& newDocument) { ActiveDOMObject::didMoveToNewDocument(newDocument); @@ -257,7 +261,7 @@ if (++m_processingCueChanges > 1) return; - if (RefPtr track = m_track.get()) + if (RefPtr track = this->track()) track->cueWillChange(*this); } @@ -269,7 +273,7 @@ m_displayTreeNeedsUpdate = true; - if (RefPtr track = m_track.get()) + if (RefPtr track = this->track()) track->cueDidChange(*this, affectOrder); } @@ -280,11 +284,13 @@ RefPtr TextTrackCue::protectedTrack() const { + ASSERT(isMainThread()); return m_track.get(); } void TextTrackCue::setTrack(TextTrack* track) { + Locker locker { m_trackLockForGC }; m_track = track; } @@ -355,10 +361,11 @@ unsigned TextTrackCue::cueIndex() const { - ASSERT(m_track && m_track->cuesInternal()); - if (!m_track) + RefPtr track = this->track(); + ASSERT(track && track->cuesInternal()); + if (!track) return std::numeric_limits::max(); - RefPtr cuesInternal = m_track->cuesInternal(); + RefPtr cuesInternal = track->cuesInternal(); if (!cuesInternal) return std::numeric_limits::max(); @@ -396,7 +403,7 @@ bool TextTrackCue::hasEquivalentStartTime(const TextTrackCue& cue) const { MediaTime startTimeVariance = MediaTime::zeroTime(); - if (RefPtr track = m_track.get()) + if (RefPtr track = this->track()) startTimeVariance = track->startTimeVariance(); else if (RefPtr track = cue.track()) startTimeVariance = track->startTimeVariance(); @@ -539,6 +546,16 @@ m_displayTreeNeedsUpdate = false; } +template +void TextTrackCue::visitAdditionalChildren(Visitor& visitor) +{ + Locker locker { m_trackLockForGC }; + if (m_track) + addWebCoreOpaqueRoot(visitor, *m_track); +} + +DEFINE_VISIT_ADDITIONAL_CHILDREN(TextTrackCue); + } // namespace WebCore #endif diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/track/TextTrackCue.h webkit2gtk-2.52.5/Source/WebCore/html/track/TextTrackCue.h --- webkit2gtk-2.52.3/Source/WebCore/html/track/TextTrackCue.h 2026-02-23 14:40:55.301301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/track/TextTrackCue.h 2026-07-09 07:12:42.056797300 +0000 @@ -38,6 +38,7 @@ #include #include #include +#include #include namespace WebCore { @@ -70,6 +71,7 @@ WTF_MAKE_TZONE_ALLOCATED(TextTrackCue); public: static ExceptionOr> create(Document&, double start, double end, DocumentFragment&); + ~TextTrackCue(); // ContextDestructionObserver. void ref() const final { RefCounted::ref(); } @@ -82,6 +84,8 @@ RefPtr protectedTrack() const; void setTrack(TextTrack*); + template void visitAdditionalChildren(Visitor&); + const AtomString& id() const { return m_id; } void setId(const AtomString&); @@ -165,7 +169,8 @@ MediaTime m_endTime; int m_processingCueChanges { 0 }; - WeakPtr m_track; + Lock m_trackLockForGC; + CheckedPtr m_track; const RefPtr m_cueNode; const RefPtr m_displayTree; diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/track/TrackBase.cpp webkit2gtk-2.52.5/Source/WebCore/html/track/TrackBase.cpp --- webkit2gtk-2.52.3/Source/WebCore/html/track/TrackBase.cpp 2026-02-23 14:40:55.302301400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/track/TrackBase.cpp 2026-07-09 07:12:42.056797300 +0000 @@ -107,11 +107,13 @@ void TrackBase::setTrackList(TrackListBase& trackList) { m_trackList = trackList; + m_opaqueRoot = WebCoreOpaqueRoot { &trackList }; } void TrackBase::clearTrackList() { m_trackList = nullptr; + m_opaqueRoot = WebCoreOpaqueRoot { this }; } TrackListBase* TrackBase::trackList() const @@ -119,12 +121,12 @@ return m_trackList.get(); } -WebCoreOpaqueRoot TrackBase::opaqueRoot() +WebCoreOpaqueRoot TrackBase::opaqueRoot() const { // Runs on GC thread. if (SUPPRESS_UNCOUNTED_LOCAL auto* trackList = this->trackList()) return trackList->opaqueRoot(); - return WebCoreOpaqueRoot { this }; + return WebCoreOpaqueRoot { const_cast(this) }; } // See: https://tools.ietf.org/html/bcp47#section-2.1 diff -Nru webkit2gtk-2.52.3/Source/WebCore/html/track/TrackBase.h webkit2gtk-2.52.5/Source/WebCore/html/track/TrackBase.h --- webkit2gtk-2.52.3/Source/WebCore/html/track/TrackBase.h 2026-02-23 14:40:55.302301400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/html/track/TrackBase.h 2026-07-09 07:12:42.056797300 +0000 @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -78,7 +79,7 @@ void setTrackList(TrackListBase&); void clearTrackList(); TrackListBase* trackList() const; - WebCoreOpaqueRoot opaqueRoot(); + WebCoreOpaqueRoot opaqueRoot() const; virtual bool enabled() const = 0; @@ -121,6 +122,7 @@ uint64_t m_logIdentifier { 0 }; #endif WeakPtr m_trackList; + std::atomic m_opaqueRoot { WebCoreOpaqueRoot { this } }; size_t m_clientRegistrationId; }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/inspector/InspectorCanvas.cpp webkit2gtk-2.52.5/Source/WebCore/inspector/InspectorCanvas.cpp --- webkit2gtk-2.52.3/Source/WebCore/inspector/InspectorCanvas.cpp 2026-02-23 14:40:55.308301400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/inspector/InspectorCanvas.cpp 2026-07-09 07:12:42.056797300 +0000 @@ -423,7 +423,7 @@ if (auto attributes = buildObjectForCanvasContextAttributes(m_context.get())) canvas->setContextAttributes(attributes.releaseNonNull()); - if (size_t memoryCost = m_context->canvasBase().memoryCost()) + if (size_t memoryCost = m_context->memoryCost()) canvas->setMemoryCost(memoryCost); if (captureBacktrace) { diff -Nru webkit2gtk-2.52.3/Source/WebCore/inspector/InspectorInstrumentation.cpp webkit2gtk-2.52.5/Source/WebCore/inspector/InspectorInstrumentation.cpp --- webkit2gtk-2.52.3/Source/WebCore/inspector/InspectorInstrumentation.cpp 2026-02-23 14:40:55.311301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/inspector/InspectorInstrumentation.cpp 2026-07-09 07:12:42.056797300 +0000 @@ -1118,7 +1118,7 @@ canvasAgent->didChangeCanvasSize(context); } -void InspectorInstrumentation::didChangeCanvasMemoryImpl(InstrumentingAgents& instrumentingAgents, CanvasRenderingContext& context) +void InspectorInstrumentation::didChangeCanvasMemoryImpl(InstrumentingAgents& instrumentingAgents, const CanvasRenderingContext& context) { if (auto* canvasAgent = instrumentingAgents.enabledCanvasAgent()) canvasAgent->didChangeCanvasMemory(context); diff -Nru webkit2gtk-2.52.3/Source/WebCore/inspector/InspectorInstrumentation.h webkit2gtk-2.52.5/Source/WebCore/inspector/InspectorInstrumentation.h --- webkit2gtk-2.52.3/Source/WebCore/inspector/InspectorInstrumentation.h 2026-02-23 14:40:55.311301500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/inspector/InspectorInstrumentation.h 2026-07-09 07:12:42.056797300 +0000 @@ -316,7 +316,7 @@ static void didChangeCSSCanvasClientNodes(CanvasBase&); static void didCreateCanvasRenderingContext(CanvasRenderingContext&); static void didChangeCanvasSize(CanvasRenderingContext&); - static void didChangeCanvasMemory(CanvasRenderingContext&); + static void didChangeCanvasMemory(const CanvasRenderingContext&); static void didFinishRecordingCanvasFrame(CanvasRenderingContext&, bool forceDispatch = false); #if ENABLE(WEBGL) static void didEnableExtension(WebGLRenderingContextBase&, const String&); @@ -521,7 +521,7 @@ static void didChangeCSSCanvasClientNodesImpl(InstrumentingAgents&, CanvasBase&); static void didCreateCanvasRenderingContextImpl(InstrumentingAgents&, CanvasRenderingContext&); static void didChangeCanvasSizeImpl(InstrumentingAgents&, CanvasRenderingContext&); - static void didChangeCanvasMemoryImpl(InstrumentingAgents&, CanvasRenderingContext&); + static void didChangeCanvasMemoryImpl(InstrumentingAgents&, const CanvasRenderingContext&); static void didFinishRecordingCanvasFrameImpl(InstrumentingAgents&, CanvasRenderingContext&, bool forceDispatch = false); #if ENABLE(WEBGL) static void didEnableExtensionImpl(InstrumentingAgents&, WebGLRenderingContextBase&, const String&); @@ -1444,7 +1444,7 @@ didChangeCanvasSizeImpl(*agents, context); } -inline void InspectorInstrumentation::didChangeCanvasMemory(CanvasRenderingContext& context) +inline void InspectorInstrumentation::didChangeCanvasMemory(const CanvasRenderingContext& context) { FAST_RETURN_IF_NO_FRONTENDS(void()); if (RefPtr agents = instrumentingAgents(context.canvasBase().scriptExecutionContext())) diff -Nru webkit2gtk-2.52.3/Source/WebCore/inspector/agents/InspectorCSSAgent.cpp webkit2gtk-2.52.5/Source/WebCore/inspector/agents/InspectorCSSAgent.cpp --- webkit2gtk-2.52.3/Source/WebCore/inspector/agents/InspectorCSSAgent.cpp 2026-02-23 14:40:55.317301300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/inspector/agents/InspectorCSSAgent.cpp 2026-07-09 07:12:42.060797200 +0000 @@ -494,8 +494,8 @@ } // Matched rules. - auto& styleResolver = element->styleResolver(); - auto matchedRules = styleResolver.pseudoStyleRulesForElement(element, elementPseudoId, Style::Resolver::AllCSSRules); + Ref styleResolver = element->styleResolver(); + auto matchedRules = styleResolver->pseudoStyleRulesForElement(element, elementPseudoId, Style::Resolver::AllCSSRules); auto matchedCSSRules = buildArrayForMatchedRuleList(matchedRules, styleResolver, *element, elementPseudoId); RefPtr> pseudoElements; RefPtr> inherited; @@ -521,7 +521,8 @@ continue; if (auto protocolPseudoId = protocolValueForPseudoElementType(pseudoElementType)) { - auto matchedRules = styleResolver.pseudoStyleRulesForElement(element, pseudoElementType, Style::Resolver::AllCSSRules); + Ref styleResolver = element->styleResolver(); + auto matchedRules = styleResolver->pseudoStyleRulesForElement(element, pseudoElementType, Style::Resolver::AllCSSRules); if (!matchedRules.isEmpty()) { auto matches = Inspector::Protocol::CSS::PseudoIdMatches::create() .setPseudoId(protocolPseudoId.value()) @@ -535,9 +536,10 @@ if (!includeInherited || *includeInherited) { inherited = JSON::ArrayOf::create(); - for (auto& ancestor : ancestorsOfType(*element)) { - auto& parentStyleResolver = ancestor.styleResolver(); - auto parentMatchedRules = parentStyleResolver.styleRulesForElement(&ancestor, Style::Resolver::AllCSSRules); + for (Ref ancestor : ancestorsOfType(*element)) { + Ref parentStyleResolver = ancestor->styleResolver(); + auto parentMatchedRules = parentStyleResolver->styleRulesForElement(ancestor.ptr(), Style::Resolver::AllCSSRules); + Ref styleResolver = element->styleResolver(); auto entry = Inspector::Protocol::CSS::InheritedStyleEntry::create() .setMatchedCSSRules(buildArrayForMatchedRuleList(parentMatchedRules, styleResolver, ancestor, { })) .release(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp webkit2gtk-2.52.5/Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp --- webkit2gtk-2.52.3/Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp 2026-02-23 14:40:55.317301300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp 2026-07-09 07:12:42.060797200 +0000 @@ -366,7 +366,7 @@ m_frontendDispatcher->canvasSizeChanged(inspectorCanvas->identifier(), size.width(), size.height()); } -void InspectorCanvasAgent::didChangeCanvasMemory(CanvasRenderingContext& context) +void InspectorCanvasAgent::didChangeCanvasMemory(const CanvasRenderingContext& context) { RefPtr inspectorCanvas; @@ -377,7 +377,7 @@ if (!inspectorCanvas) return; - m_frontendDispatcher->canvasMemoryChanged(inspectorCanvas->identifier(), inspectorCanvas->canvasContext().canvasBase().memoryCost()); + m_frontendDispatcher->canvasMemoryChanged(inspectorCanvas->identifier(), inspectorCanvas->canvasContext().memoryCost()); } void InspectorCanvasAgent::canvasChanged(CanvasBase& canvasBase, const FloatRect&) @@ -707,7 +707,7 @@ return inspectorCanvas; } -RefPtr InspectorCanvasAgent::findInspectorCanvas(CanvasRenderingContext& context) +RefPtr InspectorCanvasAgent::findInspectorCanvas(const CanvasRenderingContext& context) { for (auto& inspectorCanvas : m_identifierToInspectorCanvas.values()) { if (&inspectorCanvas->canvasContext() == &context) diff -Nru webkit2gtk-2.52.3/Source/WebCore/inspector/agents/InspectorCanvasAgent.h webkit2gtk-2.52.5/Source/WebCore/inspector/agents/InspectorCanvasAgent.h --- webkit2gtk-2.52.3/Source/WebCore/inspector/agents/InspectorCanvasAgent.h 2026-02-23 14:40:55.317301300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/inspector/agents/InspectorCanvasAgent.h 2026-07-09 07:12:42.060797200 +0000 @@ -96,7 +96,7 @@ // InspectorInstrumentation void didCreateCanvasRenderingContext(CanvasRenderingContext&); void didChangeCanvasSize(CanvasRenderingContext&); - void didChangeCanvasMemory(CanvasRenderingContext&); + void didChangeCanvasMemory(const CanvasRenderingContext&); void didFinishRecordingCanvasFrame(CanvasRenderingContext&, bool forceDispatch = false); void consoleStartRecordingCanvas(CanvasRenderingContext&, JSC::JSGlobalObject&, JSC::JSObject* options); void consoleStopRecordingCanvas(CanvasRenderingContext&); @@ -111,7 +111,7 @@ void recordAction(CanvasRenderingContext&, String&&, InspectorCanvasProcessedArguments&& = { }); RefPtr assertInspectorCanvas(Inspector::Protocol::ErrorString&, const String& canvasId); - RefPtr findInspectorCanvas(CanvasRenderingContext&); + RefPtr findInspectorCanvas(const CanvasRenderingContext&); protected: InspectorCanvasAgent(WebAgentContext&); diff -Nru webkit2gtk-2.52.3/Source/WebCore/inspector/agents/InspectorLayerTreeAgent.cpp webkit2gtk-2.52.5/Source/WebCore/inspector/agents/InspectorLayerTreeAgent.cpp --- webkit2gtk-2.52.3/Source/WebCore/inspector/agents/InspectorLayerTreeAgent.cpp 2026-02-23 14:40:55.319301400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/inspector/agents/InspectorLayerTreeAgent.cpp 2026-07-09 07:12:42.064797200 +0000 @@ -360,7 +360,7 @@ FloatSize layerSize = graphicsLayer->size(); if (layerSize.isEmpty()) - return makeUnexpected("Layer has zero size"_s); + return emptyString(); constexpr float scaleFactor = 2.0; IntSize integralSize = IntSize(layerSize); diff -Nru webkit2gtk-2.52.3/Source/WebCore/layout/formattingContexts/FormattingGeometry.cpp webkit2gtk-2.52.5/Source/WebCore/layout/formattingContexts/FormattingGeometry.cpp --- webkit2gtk-2.52.3/Source/WebCore/layout/formattingContexts/FormattingGeometry.cpp 2026-02-23 14:40:55.327301300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/layout/formattingContexts/FormattingGeometry.cpp 2026-07-09 07:12:42.064797200 +0000 @@ -30,6 +30,7 @@ #include "BlockFormattingContext.h" #include "FloatingContext.h" #include "FormattingQuirks.h" +#include "LayoutBoxInlines.h" #include "LayoutContainingBlockChainIterator.h" #include "LayoutContext.h" #include "LayoutInitialContainingBlock.h" diff -Nru webkit2gtk-2.52.3/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp webkit2gtk-2.52.5/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp --- webkit2gtk-2.52.3/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp 2026-02-23 14:40:55.335301200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp 2026-07-09 07:12:42.068797000 +0000 @@ -439,26 +439,24 @@ auto boxes = InlineDisplayContentBuilder { *this, constraints, lineBox, displayLine }.build(lineLayoutResult); displayLine.setBoxCount(boxes.size()); - auto addTrailingEllipsisIfApplicable = [&] { - if (lineLayoutResult.isBlockContent()) { - // When a block line is clamped, its content gets clamped and not this line itself. - return; - } + auto ellipsis = std::optional { }; + // When a block line is clamped, its content gets clamped and not this line itself. + if (!lineLayoutResult.isBlockContent()) { auto isLegacyLineClamp = lineClamp && lineClamp->isLegacy; auto truncationPolicy = InlineFormattingUtils::lineEndingTruncationPolicy(root().style(), numberOfLinesWithInlineContent, numberOfVisibleLinesAllowed, lineBox.hasContent()); - auto ellipsis = InlineDisplayLineBuilder::applyEllipsisIfNeeded(truncationPolicy, displayLine, boxes, isLegacyLineClamp); + ellipsis = InlineDisplayLineBuilder::applyEllipsisIfNeeded(truncationPolicy, displayLine, boxes, isLegacyLineClamp); if (ellipsis) { - displayContent.setLineEllipsis(lineBox.lineIndex(), WTF::move(*ellipsis)); displayLine.setHasEllipsis(); auto lineHasLegacyLineClamp = isLegacyLineClamp && truncationPolicy == LineEndingTruncationPolicy::WhenContentOverflowsInBlockDirection; if (lineHasLegacyLineClamp) inlineLayoutState.setLegacyClampedLineIndex(lineBox.lineIndex()); } - }; - addTrailingEllipsisIfApplicable(); + } displayContent.boxes.appendVector(WTF::move(boxes)); displayContent.lines.append(displayLine); + if (ellipsis) + displayContent.setEllipsisOnTrailingLine(WTF::move(*ellipsis)); inlineLayoutState.setLineCountWithInlineContentIncludingNestedBlocks(numberOfLinesWithInlineContent); return InlineFormattingUtils::flipVisualRectToLogicalForWritingMode(displayContent.lines.last().lineBoxRect(), root().writingMode()); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContent.cpp webkit2gtk-2.52.5/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContent.cpp --- webkit2gtk-2.52.3/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContent.cpp 2026-04-11 00:29:21.139568600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContent.cpp 2026-07-09 07:12:42.072797000 +0000 @@ -95,6 +95,15 @@ lineEllipses->at(lineIndex) = WTF::move(ellipsis); } +void Content::setEllipsisOnTrailingLine(Line::Ellipsis&& ellipsis) +{ + if (lines.isEmpty()) { + ASSERT_NOT_REACHED(); + return; + } + setLineEllipsis(lines.size() - 1, WTF::move(ellipsis)); +} + std::optional Content::lineEllipsis(size_t lineIndex) const { if (!lines[lineIndex].hasEllipsis()) diff -Nru webkit2gtk-2.52.3/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContent.h webkit2gtk-2.52.5/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContent.h --- webkit2gtk-2.52.3/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContent.h 2026-02-23 14:40:55.341301200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayContent.h 2026-07-09 07:12:42.072797000 +0000 @@ -46,6 +46,7 @@ std::optional lineEllipsis(size_t) const; void setLineEllipsis(size_t line, Line::Ellipsis&&); + void setEllipsisOnTrailingLine(Line::Ellipsis&&); void moveLineInBlockDirection(size_t, float offset); void shrinkLineInBlockDirection(size_t, float delta); diff -Nru webkit2gtk-2.52.3/Source/WebCore/layout/integration/grid/LayoutIntegrationGridLayout.cpp webkit2gtk-2.52.5/Source/WebCore/layout/integration/grid/LayoutIntegrationGridLayout.cpp --- webkit2gtk-2.52.3/Source/WebCore/layout/integration/grid/LayoutIntegrationGridLayout.cpp 2026-02-23 14:40:55.348435900 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/layout/integration/grid/LayoutIntegrationGridLayout.cpp 2026-07-09 07:12:42.072797000 +0000 @@ -46,6 +46,13 @@ { } +GridLayout::~GridLayout() +{ + CheckedRef renderer = gridBoxRenderer(); + const_cast&>(m_gridBox) = nullptr; + BoxTreeUpdater { renderer }.tearDown(); +} + void GridLayout::updateFormattingContextGeometries() { auto boxGeometryUpdater = BoxGeometryUpdater { layoutState(), gridBox() }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/layout/integration/grid/LayoutIntegrationGridLayout.h webkit2gtk-2.52.5/Source/WebCore/layout/integration/grid/LayoutIntegrationGridLayout.h --- webkit2gtk-2.52.3/Source/WebCore/layout/integration/grid/LayoutIntegrationGridLayout.h 2026-02-23 14:40:55.348435900 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/layout/integration/grid/LayoutIntegrationGridLayout.h 2026-07-09 07:12:42.072797000 +0000 @@ -45,6 +45,7 @@ class GridLayout { public: GridLayout(RenderGrid&); + ~GridLayout(); void updateFormattingContextGeometries(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/loader/DocumentLoader.cpp webkit2gtk-2.52.5/Source/WebCore/loader/DocumentLoader.cpp --- webkit2gtk-2.52.3/Source/WebCore/loader/DocumentLoader.cpp 2026-04-10 09:30:55.947680000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/loader/DocumentLoader.cpp 2026-07-09 07:12:42.076797000 +0000 @@ -304,12 +304,6 @@ protectedFrameLoader()->protectedClient()->dispatchDidFailLoading(this, *m_identifierForLoadWithoutResourceLoader, error); } - // There is a bug in CFNetwork where callbacks can be dispatched even when loads are deferred. - // See for more details. -#if !USE(CF) - ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading()); -#endif - setMainDocumentError(error); clearMainResourceLoader(); protectedFrameLoader()->receivedMainResourceError(error, loadWillContinueInAnotherProcess); @@ -477,12 +471,6 @@ void DocumentLoader::finishedLoading() { - // There is a bug in CFNetwork where callbacks can be dispatched even when loads are deferred. - // See for more details. -#if !USE(CF) - ASSERT(!m_frame->page()->defersLoading() || protectedFrameLoader()->stateMachine().creatingInitialEmptyDocument() || InspectorInstrumentation::isDebuggerPaused(m_frame.get())); -#endif - Ref protectedThis(*this); if (m_identifierForLoadWithoutResourceLoader) { @@ -775,6 +763,18 @@ stopLoadingForPolicyChange(navigationPolicyDecision == NavigationPolicyDecision::LoadWillContinueInAnotherProcess ? LoadWillContinueInAnotherProcess::Yes : LoadWillContinueInAnotherProcess::No); break; case NavigationPolicyDecision::ContinueLoad: + // The client may have updated the User-Agent (via webView.customUserAgent, + // WKWebpagePreferences._customUserAgent, an Inspector override, or a quirk + // triggered by the redirect target URL) during the policy callback. The + // redirected request still carries the previous request's User-Agent + // header, so FrameLoader::applyUserAgentIfNeeded() would skip it. Re-apply + // the authoritative UA here so all sources — including URL-dependent + // quirks — take effect on the redirected request. + if (RefPtr frameLoader = this->frameLoader()) { + String userAgent = frameLoader->userAgent(request.url()); + if (!userAgent.isEmpty() && userAgent != request.httpUserAgent()) + request.setHTTPUserAgent(WTF::move(userAgent)); + } break; } @@ -978,12 +978,6 @@ } } - // There is a bug in CFNetwork where callbacks can be dispatched even when loads are deferred. - // See for more details. -#if !USE(CF) - ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading()); -#endif - if (m_isLoadingMultipartContent) { setupForMultipartReplace(); m_mainResource->clear(); @@ -1126,6 +1120,16 @@ return; } + // Defense-in-depth: refuse to download a data: URL through a top-frame navigation that + // wasn't initiated by the user or the API client, mirroring the existing check in the + // PolicyAction::Use branch. The primary defense lives in the UI process; this guards + // ports / future flows that don't share that boundary. + if (disallowDataRequest()) { + protectedFrameLoader()->policyChecker().cannotShowMIMEType(m_response); + stopLoadingForPolicyChange(); + return; + } + if (RefPtr mainResourceLoader = this->mainResourceLoader()) InspectorInstrumentation::continueWithPolicyDownload(*frame, *mainResourceLoader->identifier(), *this, m_response); @@ -1405,12 +1409,6 @@ ASSERT(!buffer.span().empty()); ASSERT(!m_response.isNull()); - // There is a bug in CFNetwork where callbacks can be dispatched even when loads are deferred. - // See for more details. -#if !USE(CF) - ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading()); -#endif - if (m_identifierForLoadWithoutResourceLoader) protectedFrameLoader()->notifier().dispatchDidReceiveData(this, *m_identifierForLoadWithoutResourceLoader, &buffer, buffer.size(), -1); diff -Nru webkit2gtk-2.52.3/Source/WebCore/loader/DocumentWriter.cpp webkit2gtk-2.52.5/Source/WebCore/loader/DocumentWriter.cpp --- webkit2gtk-2.52.3/Source/WebCore/loader/DocumentWriter.cpp 2026-04-11 01:11:22.574698000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/loader/DocumentWriter.cpp 2026-07-09 07:12:42.076797000 +0000 @@ -34,6 +34,7 @@ #include "DOMImplementation.h" #include "DocumentInlines.h" #include "DocumentLoader.h" +#include "DocumentPage.h" #include "DocumentSecurityOrigin.h" #include "DocumentView.h" #include "FrameLoader.h" diff -Nru webkit2gtk-2.52.3/Source/WebCore/loader/FetchOptions.h webkit2gtk-2.52.5/Source/WebCore/loader/FetchOptions.h --- webkit2gtk-2.52.3/Source/WebCore/loader/FetchOptions.h 2026-02-23 14:40:55.360301300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/loader/FetchOptions.h 2026-07-09 07:12:42.076797000 +0000 @@ -108,10 +108,15 @@ || destination == FetchOptions::Destination::Worker; } -inline bool isScriptLikeDestination(FetchOptions::Destination destination) +inline bool isWorkletDestination(FetchOptions::Destination destination) { return destination == FetchOptions::Destination::Audioworklet - || destination == FetchOptions::Destination::Paintworklet + || destination == FetchOptions::Destination::Paintworklet; +} + +inline bool isScriptLikeDestination(FetchOptions::Destination destination) +{ + return isWorkletDestination(destination) || destination == FetchOptions::Destination::Script || destination == FetchOptions::Destination::Serviceworker || destination == FetchOptions::Destination::Sharedworker diff -Nru webkit2gtk-2.52.3/Source/WebCore/loader/FrameLoader.cpp webkit2gtk-2.52.5/Source/WebCore/loader/FrameLoader.cpp --- webkit2gtk-2.52.3/Source/WebCore/loader/FrameLoader.cpp 2026-04-10 09:30:55.951680000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/loader/FrameLoader.cpp 2026-07-09 07:12:42.076797000 +0000 @@ -459,6 +459,10 @@ m_didCallImplicitClose = true; m_isComplete = true; m_state = FrameState::Complete; + // Synthesized documents bypass setState(FrameState::Complete), which normally + // stops recording responses on the DocumentLoader. + if (RefPtr documentLoader = m_documentLoader) + documentLoader->stopRecordingResponses(); m_needsClear = true; m_networkingContext = m_client->createNetworkingContext(); @@ -1202,8 +1206,19 @@ void FrameLoader::updateFirstPartyForCookies() { - if (RefPtr page = m_frame->page()) - setFirstPartyForCookies(page->mainFrameURL()); + RefPtr page = m_frame->page(); + if (!page) + return; + + auto firstPartyForCookies = page->mainFrameURL(); + if (SecurityPolicy::shouldInheritSecurityOriginFromOwner(firstPartyForCookies)) { + if (RefPtr opener = dynamicDowncast(page->mainFrame().opener())) { + if (RefPtr openerDocument = opener->document()) + firstPartyForCookies = openerDocument->firstPartyForCookies(); + } + } + + setFirstPartyForCookies(firstPartyForCookies); } void FrameLoader::setFirstPartyForCookies(const URL& url) @@ -1761,7 +1776,8 @@ if (auto advancedPrivacyProtections = request.advancedPrivacyProtections()) loader->setOriginatorAdvancedPrivacyProtections(*advancedPrivacyProtections); - addSameSiteInfoToRequestIfNeeded(loader->request()); + Ref initiator = request.requester(); + addSameSiteInfoToRequestIfNeeded(loader->request(), SecurityPolicy::shouldInheritSecurityOriginFromOwner(initiator->url()) ? nullptr : initiator.ptr()); applyShouldOpenExternalURLsPolicyToNewDocumentLoader(protectedFrame(), loader, request); loader->setIsHandledByAboutSchemeHandler(request.isHandledByAboutSchemeHandler()); diff -Nru webkit2gtk-2.52.3/Source/WebCore/loader/HistoryController.cpp webkit2gtk-2.52.5/Source/WebCore/loader/HistoryController.cpp --- webkit2gtk-2.52.3/Source/WebCore/loader/HistoryController.cpp 2026-04-10 09:30:55.951680000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/loader/HistoryController.cpp 2026-07-09 07:12:42.080797000 +0000 @@ -941,7 +941,7 @@ m_provisionalItem = item; } - for (Ref childItem : item.children()) { + for (Ref childItem : copyToVector(item.children())) { auto frameID = childItem->frameID(); if (!frameID) continue; @@ -963,7 +963,7 @@ return m_frame->loader().loadItem(item, fromItem, type, shouldTreatAsContinuingLoad); // Just iterate over the rest, looking for frames to navigate. - for (Ref childItem : item.children()) { + for (Ref childItem : copyToVector(item.children())) { auto frameID = childItem->frameID(); if (!frameID) continue; diff -Nru webkit2gtk-2.52.3/Source/WebCore/loader/NavigationAction.cpp webkit2gtk-2.52.5/Source/WebCore/loader/NavigationAction.cpp --- webkit2gtk-2.52.3/Source/WebCore/loader/NavigationAction.cpp 2026-02-23 14:40:55.366301000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/loader/NavigationAction.cpp 2026-07-09 07:12:42.080797000 +0000 @@ -35,7 +35,6 @@ #include "HistoryItem.h" #include "LocalFrame.h" #include "MouseEvent.h" -#include "OriginAccessPatterns.h" namespace WebCore { @@ -67,16 +66,6 @@ NavigationAction& NavigationAction::operator=(const NavigationAction&) = default; NavigationAction& NavigationAction::operator=(NavigationAction&&) = default; -static bool shouldTreatAsSameOriginNavigation(const Document& document, const URL& url) -{ - return url.protocolIsAbout() || url.protocolIsData() || (url.protocolIsBlob() && document.protectedSecurityOrigin()->canRequest(url, OriginAccessPatternsForWebProcess::singleton())); -} - -static bool shouldTreatAsSameOriginNavigation(const NavigationRequester& requester, const URL& url) -{ - return url.protocolIsAbout() || url.protocolIsData() || (url.protocolIsBlob() && Ref { requester.securityOrigin }->canRequest(url, OriginAccessPatternsForWebProcess::singleton())); -} - static std::optional keyStateDataForFirstEventWithKeyState(Event* event) { if (RefPtr uiEvent = findEventWithKeyState(event)) @@ -113,7 +102,6 @@ , m_mouseEventData { mouseEventDataForFirstMouseEvent(event) } , m_type { navigationType(frameLoadType, isFormSubmission, !!event) } { - m_treatAsSameOriginNavigation = shouldTreatAsSameOriginNavigation(requester, originalRequest.url()); setDownloadAttribute(downloadAttribute); setSourceElement(sourceElement); setShouldOpenExternalURLsPolicy(shouldOpenExternalURLsPolicy); @@ -127,7 +115,6 @@ , m_keyStateEventData { keyStateDataForFirstEventWithKeyState(event) } , m_mouseEventData { mouseEventDataForFirstMouseEvent(event) } , m_type { type } - , m_treatAsSameOriginNavigation { shouldTreatAsSameOriginNavigation(requester, originalRequest.url()) } { setDownloadAttribute(downloadAttribute); setSourceElement(sourceElement); @@ -147,7 +134,6 @@ , m_keyStateEventData { keyStateDataForFirstEventWithKeyState(event) } , m_mouseEventData { mouseEventDataForFirstMouseEvent(event) } , m_type { type } - , m_treatAsSameOriginNavigation { shouldTreatAsSameOriginNavigation(request.protectedRequester().get(), request.resourceRequest().url()) } { } diff -Nru webkit2gtk-2.52.3/Source/WebCore/loader/NavigationAction.h webkit2gtk-2.52.5/Source/WebCore/loader/NavigationAction.h --- webkit2gtk-2.52.3/Source/WebCore/loader/NavigationAction.h 2026-02-23 14:40:55.366301000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/loader/NavigationAction.h 2026-07-09 07:12:42.080797000 +0000 @@ -107,8 +107,6 @@ bool processingUserGesture() const { return m_userGestureToken ? m_userGestureToken->processingUserGesture() : false; } RefPtr userGestureToken() const { return m_userGestureToken; } - bool treatAsSameOriginNavigation() const { return m_treatAsSameOriginNavigation; } - bool hasOpenedFrames() const { return m_hasOpenedFrames; } void setHasOpenedFrames(bool value) { m_hasOpenedFrames = value; } @@ -148,7 +146,6 @@ NavigationType m_type; std::optional m_navigationAPIType; - bool m_treatAsSameOriginNavigation { false }; bool m_hasOpenedFrames { false }; bool m_openedByDOMWithOpener { false }; }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/loader/ResourceMonitor.cpp webkit2gtk-2.52.5/Source/WebCore/loader/ResourceMonitor.cpp --- webkit2gtk-2.52.3/Source/WebCore/loader/ResourceMonitor.cpp 2026-04-10 09:30:55.954680000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/loader/ResourceMonitor.cpp 2026-07-09 07:12:42.080797000 +0000 @@ -107,7 +107,7 @@ return; RefPtr frame = m_frame.get(); - RefPtr page = frame ? frame->mainFrame().page() : nullptr; + RefPtr page = frame ? frame->page() : nullptr; if (!page) return; @@ -134,7 +134,7 @@ void ResourceMonitor::continueAfterDidReceiveEligibility(Eligibility eligibility, const URL& url, OptionSet resourceType) { RefPtr frame = m_frame.get(); - RefPtr page = frame ? frame->mainFrame().page() : nullptr; + RefPtr page = frame ? frame->page() : nullptr; if (!page) return; diff -Nru webkit2gtk-2.52.3/Source/WebCore/loader/SubframeLoader.cpp webkit2gtk-2.52.5/Source/WebCore/loader/SubframeLoader.cpp --- webkit2gtk-2.52.3/Source/WebCore/loader/SubframeLoader.cpp 2026-02-23 14:40:55.373301000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/loader/SubframeLoader.cpp 2026-07-09 07:12:42.080797000 +0000 @@ -321,8 +321,6 @@ if (!frame->page() || frame->protectedPage()->subframeCount() >= Page::maxNumberOfFrames) return nullptr; - if (frame->tree().depth() >= Page::maxFrameDepth) - if (!canCreateSubFrame()) return nullptr; diff -Nru webkit2gtk-2.52.3/Source/WebCore/mathml/MathMLScriptsElement.cpp webkit2gtk-2.52.5/Source/WebCore/mathml/MathMLScriptsElement.cpp --- webkit2gtk-2.52.3/Source/WebCore/mathml/MathMLScriptsElement.cpp 2026-04-10 09:30:55.958680000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/mathml/MathMLScriptsElement.cpp 2026-07-09 07:12:42.084797000 +0000 @@ -29,6 +29,7 @@ #if ENABLE(MATHML) +#include "NodeDocument.h" #include "RenderMathMLScripts.h" #include "RenderStyle+GettersInlines.h" #include "Settings.h" diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/ChromeClient.h webkit2gtk-2.52.5/Source/WebCore/page/ChromeClient.h --- webkit2gtk-2.52.3/Source/WebCore/page/ChromeClient.h 2026-02-23 14:40:55.390301000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/ChromeClient.h 2026-07-09 07:12:42.084797000 +0000 @@ -674,7 +674,7 @@ virtual RefPtr createIconForFiles(const Vector& /* filenames */) = 0; virtual void hasStorageAccess(RegistrableDomain&& /*subFrameDomain*/, RegistrableDomain&& /*topFrameDomain*/, LocalFrame&, CompletionHandler&& completionHandler) { completionHandler(false); } - virtual void requestStorageAccess(RegistrableDomain&& subFrameDomain, RegistrableDomain&& topFrameDomain, LocalFrame&, StorageAccessScope scope, HasOrShouldIgnoreUserGesture, CompletionHandler&& completionHandler) { completionHandler({ StorageAccessWasGranted::No, StorageAccessPromptWasShown::No, scope, WTF::move(topFrameDomain), WTF::move(subFrameDomain) }); } + virtual void requestStorageAccess(RegistrableDomain&& subFrameDomain, RegistrableDomain&& topFrameDomain, LocalFrame&, StorageAccessScope scope, HasUserGestureOrNoUserGestureRequired, CompletionHandler&& completionHandler) { completionHandler({ StorageAccessWasGranted::No, StorageAccessPromptWasShown::No, scope, WTF::move(topFrameDomain), WTF::move(subFrameDomain) }); } virtual bool hasPageLevelStorageAccess(const RegistrableDomain& /*topLevelDomain*/, const RegistrableDomain& /*resourceDomain*/) const { return false; } virtual void setLoginStatus(RegistrableDomain&&, IsLoggedIn, CompletionHandler&&) { } diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/DOMTimer.h webkit2gtk-2.52.5/Source/WebCore/page/DOMTimer.h --- webkit2gtk-2.52.3/Source/WebCore/page/DOMTimer.h 2026-02-23 14:40:55.392300800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/DOMTimer.h 2026-07-09 07:12:42.088796600 +0000 @@ -96,7 +96,7 @@ ShouldNotThrottle }; - int m_timeoutId; + int m_timeoutId { 0 }; int m_nestingLevel; EventLoopTimerHandle m_timer; Function m_action; diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/FocusController.cpp webkit2gtk-2.52.5/Source/WebCore/page/FocusController.cpp --- webkit2gtk-2.52.3/Source/WebCore/page/FocusController.cpp 2026-04-10 09:30:55.964680000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/FocusController.cpp 2026-07-09 07:12:42.092796600 +0000 @@ -414,21 +414,22 @@ return; } - if (!focused && document->focusedElement()) { - if (document->focusedElement()->transferredFocusToPicker()) { + if (RefPtr focusedElement = document->focusedElement(); !focused && focusedElement) { + if (focusedElement->transferredFocusToPicker()) { // The webpage lost focus because the focused element transferred focus to // a non-web-content picker when it was activated. We don't want to post any // web-exposed events (e.g. blur) in these cases, so return. - document->focusedElement()->didSuppressBlurDueToPickerFocusTransfer(); + focusedElement->didSuppressBlurDueToPickerFocusTransfer(); return; } - document->focusedElement()->dispatchBlurEvent(nullptr); + if (RefPtr focusedElement = document->focusedElement()) + focusedElement->dispatchBlurEvent(nullptr); } document->dispatchWindowEvent(Event::create(focused ? eventNames().focusEvent : eventNames().blurEvent, Event::CanBubble::No, Event::IsCancelable::No)); - if (focused && document->focusedElement()) - document->focusedElement()->dispatchFocusEvent(nullptr, { }); + if (RefPtr focusedElement = document->focusedElement(); focused && focusedElement) + focusedElement->dispatchFocusEvent(nullptr, { }); } static inline bool isFocusableElementOrScopeOwner(Element& element, const FocusEventData& focusEventData) @@ -722,14 +723,14 @@ // that because some elements (e.g. HTMLInputElement and HTMLTextAreaElement) do extra work in // their focus() methods. - Document& newDocument = element->document(); + RefPtr newDocument = element->document(); - if (&newDocument != document) { + if (newDocument != document) { // Focus is going away from this document, so clear the focused node. document->setFocusedElement(nullptr); } - setFocusedFrame(newDocument.protectedFrame().get()); + setFocusedFrame(newDocument->protectedFrame().get()); if (caretBrowsing) { VisibleSelection newSelection(firstPositionInOrBeforeNode(element.get()), Affinity::Downstream); diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/Frame.cpp webkit2gtk-2.52.5/Source/WebCore/page/Frame.cpp --- webkit2gtk-2.52.3/Source/WebCore/page/Frame.cpp 2026-04-11 00:53:25.220714600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/Frame.cpp 2026-07-09 07:12:42.092796600 +0000 @@ -390,4 +390,12 @@ loaderClient().setPrinting(printing, pageSize, originalPageSize, maximumShrinkRatio, shouldAdjustViewSize); } +SecurityOrigin& Frame::topOrigin() const +{ + if (RefPtr page = this->page()) + return page->mainFrameOrigin(); + + return SecurityOrigin::opaqueOrigin(); +} + } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/Frame.h webkit2gtk-2.52.5/Source/WebCore/page/Frame.h --- webkit2gtk-2.52.3/Source/WebCore/page/Frame.h 2026-02-23 14:40:55.400301000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/Frame.h 2026-07-09 07:12:42.092796600 +0000 @@ -83,6 +83,7 @@ WEBCORE_EXPORT std::optional indexInFrameTreeSiblings() const; WEBCORE_EXPORT Vector pathToFrame() const; FrameIdentifier frameID() const { return m_frameID; } + WEBCORE_EXPORT SecurityOrigin& topOrigin() const; inline Page* page() const; // Defined in DocumentPage.h. inline RefPtr protectedPage() const; // Defined in DocumentPage.h. inline std::optional pageID() const; // Defined in DocumentPage.h. diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/FrameTree.cpp webkit2gtk-2.52.5/Source/WebCore/page/FrameTree.cpp --- webkit2gtk-2.52.3/Source/WebCore/page/FrameTree.cpp 2026-04-10 09:30:55.966680000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/FrameTree.cpp 2026-07-09 07:12:42.092796600 +0000 @@ -21,8 +21,9 @@ #include "config.h" #include "FrameTree.h" -#include "Document.h" #include "DocumentPage.h" +#include "DocumentView.h" +#include "FrameInlines.h" #include "FrameLoader.h" #include "HTMLFrameOwnerElement.h" #include "LocalFrame.h" diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/LocalDOMWindow.cpp webkit2gtk-2.52.5/Source/WebCore/page/LocalDOMWindow.cpp --- webkit2gtk-2.52.3/Source/WebCore/page/LocalDOMWindow.cpp 2026-04-10 09:30:55.968680100 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/LocalDOMWindow.cpp 2026-07-09 07:12:42.092796600 +0000 @@ -1000,6 +1000,9 @@ auto& vm = globalObject->vm(); auto scope = DECLARE_CATCH_SCOPE(vm); + if (userGestureToForward && userGestureToForward->hasExpired(UserGestureToken::maximumIntervalForUserGestureForwarding)) + userGestureToForward = nullptr; + UserGestureIndicator userGestureIndicator(userGestureToForward); InspectorInstrumentation::willDispatchPostMessage(frame, postMessageIdentifier); @@ -2706,7 +2709,14 @@ { auto processingEnd = performance().nowInReducedResolutionSeconds(); entry.processingEnd = processingEnd; - entry.target = event.target(); + // Per the Event Timing spec, the target must be retargeted to the document scope. + // Without this, when no event listeners are registered for a given event type, + // the event target may be an un-retargeted node inside a user-agent shadow tree + // (e.g., an internal node of ), leaking shadow DOM internals. + if (RefPtr targetNode = dynamicDowncast(event.target())) + entry.target = targetNode->document().retargetToScope(*targetNode).get(); + else + entry.target = event.target(); switch (type) { case EventType::pointerdown: { diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/LocalFrameView.cpp webkit2gtk-2.52.5/Source/WebCore/page/LocalFrameView.cpp --- webkit2gtk-2.52.3/Source/WebCore/page/LocalFrameView.cpp 2026-04-16 10:32:24.637686300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/LocalFrameView.cpp 2026-07-09 07:12:42.096796500 +0000 @@ -1851,11 +1851,11 @@ // The max stable layout viewport origin really depends on the size of the layout viewport itself, so we need to adjust the location of the layout viewport one final time to make sure it does not end up out of bounds of the document. // Without this adjustment (and with using the non-constrained unobscuredContentRect's size as the size of the layout viewport) the layout viewport can be pushed past the bounds of the document during rubber-banding, and cannot be pushed // back in until the user scrolls back in the other direction. - layoutViewportOrigin.setX(clampTo(layoutViewportOrigin.x().toFloat(), 0, documentRect.width() - layoutViewportRect.width())); - layoutViewportOrigin.setY(clampTo(layoutViewportOrigin.y().toFloat(), 0, documentRect.height() - layoutViewportRect.height())); + layoutViewportOrigin.setX(clampTo(layoutViewportOrigin.x().toFloat(), documentRect.x(), documentRect.maxX() - layoutViewportRect.width())); + layoutViewportOrigin.setY(clampTo(layoutViewportOrigin.y().toFloat(), documentRect.y(), documentRect.maxY() - layoutViewportRect.height())); } layoutViewportRect.setLocation(layoutViewportOrigin); - + return layoutViewportRect; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/LocalFrameViewLayoutContext.cpp webkit2gtk-2.52.5/Source/WebCore/page/LocalFrameViewLayoutContext.cpp --- webkit2gtk-2.52.3/Source/WebCore/page/LocalFrameViewLayoutContext.cpp 2026-03-03 21:30:17.044498700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/LocalFrameViewLayoutContext.cpp 2026-07-09 07:12:42.096796500 +0000 @@ -29,6 +29,7 @@ #include "DebugPageOverlays.h" #include "Document.h" #include "DocumentEnums.h" +#include "FrameInlines.h" #include "InspectorInstrumentation.h" #include "LayoutBoxGeometry.h" #include "LayoutContext.h" @@ -879,10 +880,15 @@ if (!renderView() || renderView()->renderTreeBeingDestroyed()) m_anchorScrollAdjusters.clear(); else { + HashSet> anchoredToUnregister; + for (auto& adjuster : m_anchorScrollAdjusters) { if (adjuster.invalidateForScroller(scroller)) - unregisterAnchorScrollAdjusterFor(*adjuster.anchored()); + anchoredToUnregister.add(*adjuster.anchored()); } + + for (CheckedRef anchored : anchoredToUnregister) + unregisterAnchorScrollAdjusterFor(anchored); } } diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/NavigateEvent.cpp webkit2gtk-2.52.5/Source/WebCore/page/NavigateEvent.cpp --- webkit2gtk-2.52.3/Source/WebCore/page/NavigateEvent.cpp 2026-03-10 22:54:48.235944700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/NavigateEvent.cpp 2026-07-09 07:12:42.096796500 +0000 @@ -137,7 +137,7 @@ if (m_navigationType == NavigationNavigationType::Reload) document.frame()->loader().history().restoreScrollPositionAndViewState(); else - document.frame()->view()->setScrollPosition({ 0, 0 }); + protect(document.frame()->view())->setScrollPosition({ 0, 0 }); return; } @@ -154,7 +154,7 @@ if (!document.haveStylesheetsLoaded()) document.setGotoAnchorNeededAfterStylesheetsLoad(true); else - document.frame()->view()->scrollToFragment(document.url()); + protect(document.frame()->view())->scrollToFragment(document.url()); } // https://html.spec.whatwg.org/multipage/nav-history-apis.html#dom-navigateevent-scroll diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/Navigation.cpp webkit2gtk-2.52.5/Source/WebCore/page/Navigation.cpp --- webkit2gtk-2.52.3/Source/WebCore/page/Navigation.cpp 2026-04-11 01:20:11.172692300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/Navigation.cpp 2026-07-09 07:12:42.096796500 +0000 @@ -386,7 +386,7 @@ state = currentEntry()->associatedHistoryItem().navigationAPIStateObject(); RefPtr window = this->window(); - if (!window->protectedDocument()->isFullyActive() || window->document()->unloadCounter()) + if (!window->protectedDocument()->isFullyActive() || frame()->loader().isDispatchingPageSwapEvent() || window->document()->unloadCounter()) return createErrorResult(WTF::move(committed), WTF::move(finished), ExceptionCode::InvalidStateError, "Invalid state"_s); RefPtr apiMethodTracker = maybeSetUpcomingNonTraversalTracker(WTF::move(committed), WTF::move(finished), WTF::move(options.info), WTF::move(state)); diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/Quirks.cpp webkit2gtk-2.52.5/Source/WebCore/page/Quirks.cpp --- webkit2gtk-2.52.3/Source/WebCore/page/Quirks.cpp 2026-04-16 11:15:13.905329700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/Quirks.cpp 2026-07-09 07:12:42.100796500 +0000 @@ -2164,12 +2164,12 @@ #endif } -// hotels.com rdar://126631968 -bool Quirks::needsHotelsAnimationQuirk(Element& element) const +// Expedia Group sites (hotels.com, expedia.*, orbitz.com, …) rdar://126631968 +bool Quirks::needsExpediaGroupAnimationQuirk(Element& element) const { QUIRKS_EARLY_RETURN_IF_DISABLED_WITH_VALUE(false); - if (!m_quirksData.quirkIsEnabled(QuirksData::SiteSpecificQuirk::NeedsHotelsAnimationQuirk)) + if (!m_quirksData.quirkIsEnabled(QuirksData::SiteSpecificQuirk::NeedsExpediaGroupAnimationQuirk)) return false; // Quick pre-filter to avoid running the full selector match on ~99% of elements. @@ -2991,12 +2991,36 @@ } } -static void handleHotelsQuirks(QuirksData& quirksData, const URL& /* quirksURL */, const String& quirksDomainString, const URL& /* documentURL */) +static bool isExpediaGroupRegistrableDomain(const String& registrableDomain) { - QUIRKS_EARLY_RETURN_IF_NOT_DOMAIN("hotels.com"_s); + static NeverDestroyed> expediaGroupDomains { HashSet { + "carrentals.com"_s, + "cheaptickets.com"_s, + "hoteis.com"_s, + "hoteles.com"_s, + "hotels.com"_s, + "mrjet.se"_s, + "orbitz.com"_s, + "travelocity.ca"_s, + "travelocity.com"_s, + "wotif.co.nz"_s, + "wotif.com"_s, + } }; - // hotels.com rdar://126631968 - quirksData.enableQuirk(QuirksData::SiteSpecificQuirk::NeedsHotelsAnimationQuirk); + if (expediaGroupDomains->contains(registrableDomain)) + return true; + + return registrableDomain.startsWith("ebookers."_s) + || registrableDomain.startsWith("expedia."_s); +} + +static void handleExpediaGroupQuirks(QuirksData& quirksData, const URL& /* quirksURL */, const String& quirksDomainString, const URL& /* documentURL */) +{ + if (!isExpediaGroupRegistrableDomain(quirksDomainString)) [[unlikely]] + return; + + // Expedia Group rdar://126631968 + quirksData.enableQuirk(QuirksData::SiteSpecificQuirk::NeedsExpediaGroupAnimationQuirk); } static void handleHuluQuirks(QuirksData& quirksData, const URL& /* quirksURL */, const String& quirksDomainString, const URL& /* documentURL */) @@ -3517,7 +3541,18 @@ { "geforcenow"_s, &handleGeforcenowQuirks }, { "google"_s, &handleGoogleQuirks }, { "hbomax"_s, &handleHBOMaxQuirks }, - { "hotels"_s, &handleHotelsQuirks }, + // Expedia Group rdar://126631968 + { "carrentals"_s, &handleExpediaGroupQuirks }, + { "cheaptickets"_s, &handleExpediaGroupQuirks }, + { "ebookers"_s, &handleExpediaGroupQuirks }, + { "expedia"_s, &handleExpediaGroupQuirks }, + { "hoteis"_s, &handleExpediaGroupQuirks }, + { "hoteles"_s, &handleExpediaGroupQuirks }, + { "hotels"_s, &handleExpediaGroupQuirks }, + { "mrjet"_s, &handleExpediaGroupQuirks }, + { "orbitz"_s, &handleExpediaGroupQuirks }, + { "travelocity"_s, &handleExpediaGroupQuirks }, + { "wotif"_s, &handleExpediaGroupQuirks }, { "hulu"_s, &handleHuluQuirks }, #if PLATFORM(IOS_FAMILY) || PLATFORM(MAC) { "icloud"_s, &handleICloudQuirks }, diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/Quirks.h webkit2gtk-2.52.5/Source/WebCore/page/Quirks.h --- webkit2gtk-2.52.3/Source/WebCore/page/Quirks.h 2026-04-16 10:32:24.643686300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/Quirks.h 2026-07-09 07:12:42.100796500 +0000 @@ -74,7 +74,7 @@ bool needsAutoplayPlayPauseEvents() const; bool needsSeekingSupportDisabled() const; bool needsPerDocumentAutoplayBehavior() const; - bool needsHotelsAnimationQuirk(Element&) const; + bool needsExpediaGroupAnimationQuirk(Element&) const; bool shouldAutoplayWebAudioForArbitraryUserGesture() const; bool hasBrokenEncryptedMediaAPISupportQuirk() const; #if ENABLE(TOUCH_EVENTS) diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/QuirksData.h webkit2gtk-2.52.5/Source/WebCore/page/QuirksData.h --- webkit2gtk-2.52.3/Source/WebCore/page/QuirksData.h 2026-04-16 11:15:13.906329600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/QuirksData.h 2026-07-09 07:12:42.100796500 +0000 @@ -96,7 +96,7 @@ NeedsGoogleTranslateScrollingQuirk, #endif NeedsGeforcenowWarningDisplayNoneQuirk, - NeedsHotelsAnimationQuirk, + NeedsExpediaGroupAnimationQuirk, NeedsMediaRewriteRangeRequestQuirk, NeedsMozillaFileTypeForDataTransferQuirk, NeedsNavigatorUserAgentDataQuirk, diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/SocketProvider.h webkit2gtk-2.52.5/Source/WebCore/page/SocketProvider.h --- webkit2gtk-2.52.3/Source/WebCore/page/SocketProvider.h 2026-02-23 14:40:55.431300600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/SocketProvider.h 2026-07-09 07:12:42.104796400 +0000 @@ -26,6 +26,7 @@ #pragma once #include +#include #include #include #include @@ -53,6 +54,8 @@ virtual RefPtr createWebSocketChannel(Document&, WebSocketChannelClient&) = 0; virtual std::pair, Ref> initializeWebTransportSession(ScriptExecutionContext&, WebTransportSessionClient&, const URL&, const WebTransportOptions&) = 0; + virtual void countWebSocketChannelsForTesting(CompletionHandler&& completionHandler) { completionHandler(0); } + #if USE(LIBRICE) virtual RefPtr createRiceBackend(RiceBackendClient&) = 0; #endif diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/csp/ContentSecurityPolicy.cpp webkit2gtk-2.52.5/Source/WebCore/page/csp/ContentSecurityPolicy.cpp --- webkit2gtk-2.52.3/Source/WebCore/page/csp/ContentSecurityPolicy.cpp 2026-02-27 12:36:40.424731500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/csp/ContentSecurityPolicy.cpp 2026-07-09 07:12:42.104796400 +0000 @@ -294,7 +294,13 @@ // security origin of its owner document. RefPtr securityOrigin = scriptExecutionContext->securityOrigin(); ASSERT(securityOrigin); - updateSourceSelf(*securityOrigin); + + // Skip for opaque origins (e.g. sandboxed iframes) to preserve the self-source + // established after CSP inheritance. Per the CSP spec §2.2 note, the self-origin + // concept exists to facilitate 'self' checks for opaque-origin documents that + // inherited their policy. + if (!securityOrigin->isOpaque()) + updateSourceSelf(*securityOrigin); bool requiresTrustedTypesForScript = false; bool requiresTrustedTypesForScriptEnforced = false; diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/csp/ContentSecurityPolicyResponseHeaders.cpp webkit2gtk-2.52.5/Source/WebCore/page/csp/ContentSecurityPolicyResponseHeaders.cpp --- webkit2gtk-2.52.3/Source/WebCore/page/csp/ContentSecurityPolicyResponseHeaders.cpp 2026-02-23 14:40:55.445300600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/csp/ContentSecurityPolicyResponseHeaders.cpp 2026-07-09 07:12:42.104796400 +0000 @@ -66,10 +66,10 @@ for (const auto& header : m_headers) { switch (header.second) { case ContentSecurityPolicyHeaderType::Enforce: - response.setHTTPHeaderField(HTTPHeaderName::ContentSecurityPolicy, header.first); + response.addHTTPHeaderField(HTTPHeaderName::ContentSecurityPolicy, header.first); break; case ContentSecurityPolicyHeaderType::Report: - response.setHTTPHeaderField(HTTPHeaderName::ContentSecurityPolicyReportOnly, header.first); + response.addHTTPHeaderField(HTTPHeaderName::ContentSecurityPolicyReportOnly, header.first); break; } } diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/csp/ContentSecurityPolicySource.cpp webkit2gtk-2.52.5/Source/WebCore/page/csp/ContentSecurityPolicySource.cpp --- webkit2gtk-2.52.3/Source/WebCore/page/csp/ContentSecurityPolicySource.cpp 2026-01-20 14:08:45.614675300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/csp/ContentSecurityPolicySource.cpp 2026-07-09 07:12:42.104796400 +0000 @@ -59,6 +59,16 @@ return hostMatches(url) && portMatches(url) && (didReceiveRedirectResponse || pathMatches(url)); } +// 'self' sources can upgrade to secure protocols (http->https, ws->wss) and +// side-grade insecure protocols (http->ws). Requires a non-empty scheme since +// opaque origins lack scheme/host/port tuple fields and should never match. +static bool isSelfSourceSchemeUpgrade(const String& scheme, StringView urlScheme) +{ + if (scheme.isEmpty()) + return false; + return (urlScheme == "https"_s || urlScheme == "wss"_s) || (scheme == "http"_s && urlScheme == "ws"_s); +} + bool ContentSecurityPolicySource::schemeMatches(const URL& url) const { // https://www.w3.org/TR/CSP3/#match-schemes. @@ -76,9 +86,7 @@ if (scheme == "wss"_s && urlScheme == "https"_s) return true; - // self-sources can always upgrade to secure protocols and side-grade insecure protocols. - if ((m_isSelfSource - && ((urlScheme == "https"_s || urlScheme == "wss"_s) || (scheme == "http"_s && urlScheme == "ws"_s)))) + if (m_isSelfSource && isSelfSourceSchemeUpgrade(scheme, urlScheme)) return true; return false; @@ -106,15 +114,48 @@ bool ContentSecurityPolicySource::pathMatches(const URL& url) const { + // https://www.w3.org/TR/CSP3/#match-paths + // Path A is the source expression's path (m_path, from the CSP directive). + // Path B is the URL's path being checked against the policy. + + // Step 1: empty path automatically matches. if (m_path.isEmpty()) return true; - auto path = PAL::decodeURLEscapeSequences(url.path()); + auto urlPath = url.path(); + + // Step 2: "/" matches empty path. + if (m_path == "/"_s && urlPath.isEmpty()) + return true; + + // Step 3: directory match if path A ends with '/'. + bool exactMatch = !m_path.endsWith('/'); - if (m_path.endsWith('/')) - return path.startsWith(m_path); + // Step 4: strictly split both on '/'. + auto pathListA = m_path.splitAllowingEmptyEntries('/'); + auto pathListB = urlPath.toString().splitAllowingEmptyEntries('/'); + + // Step 5: path A must not have more segments than path B. + if (pathListA.size() > pathListB.size()) + return false; + + // Step 6: exact match requires same number of segments. + if (exactMatch && pathListA.size() != pathListB.size()) + return false; + + // Step 7: for directory match, remove trailing empty segment from A. + if (!exactMatch) { + ASSERT(pathListA.last().isEmpty()); + pathListA.removeLast(); + } + + // Step 8: compare each segment after percent-decoding. + for (unsigned i = 0; i < pathListA.size(); ++i) { + if (PAL::decodeURLEscapeSequences(pathListA[i]) != PAL::decodeURLEscapeSequences(pathListB[i])) + return false; + } - return path == m_path; + return true; } bool ContentSecurityPolicySource::portMatches(const URL& url) const diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/csp/ContentSecurityPolicySourceList.cpp webkit2gtk-2.52.5/Source/WebCore/page/csp/ContentSecurityPolicySourceList.cpp --- webkit2gtk-2.52.3/Source/WebCore/page/csp/ContentSecurityPolicySourceList.cpp 2026-02-23 14:40:55.445300600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/csp/ContentSecurityPolicySourceList.cpp 2026-07-09 07:12:42.104796400 +0000 @@ -543,7 +543,7 @@ ASSERT(buffer.position() <= buffer.end()); ASSERT(buffer.atEnd() || (*buffer == '#' || *buffer == '?')); - return PAL::decodeURLEscapeSequences(begin.first(buffer.position() - begin.data())); + return String(begin.first(buffer.position() - begin.data())); } // port = ":" ( 1*DIGIT / "*" ) diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/linux/ResourceUsageThreadLinux.cpp webkit2gtk-2.52.5/Source/WebCore/page/linux/ResourceUsageThreadLinux.cpp --- webkit2gtk-2.52.3/Source/WebCore/page/linux/ResourceUsageThreadLinux.cpp 2026-02-23 14:40:55.447300700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/linux/ResourceUsageThreadLinux.cpp 2026-07-09 07:12:42.104796400 +0000 @@ -177,7 +177,6 @@ name++; info.name = String::fromUTF8({ name, position }); } - WTF_ALLOW_UNSAFE_BUFFER_USAGE_END // Move after state. position += 4; @@ -189,6 +188,7 @@ position++; position++; } + WTF_ALLOW_UNSAFE_BUFFER_USAGE_END unsigned long long utime = strtoull(position, &position, 10); unsigned long long stime = strtoull(position, &position, 10); diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/scrolling/ScrollingStateNode.h webkit2gtk-2.52.5/Source/WebCore/page/scrolling/ScrollingStateNode.h --- webkit2gtk-2.52.3/Source/WebCore/page/scrolling/ScrollingStateNode.h 2026-02-23 14:40:55.452300500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/scrolling/ScrollingStateNode.h 2026-07-09 07:12:42.108796400 +0000 @@ -116,14 +116,22 @@ LayerRepresentation& operator=(const LayerRepresentation& other) { + if (this == &other) + return *this; + + if (m_representation == PlatformLayerRepresentation && other.m_representation == PlatformLayerRepresentation) { + retainPlatformLayer(other.m_typelessPlatformLayer); + releasePlatformLayer(m_typelessPlatformLayer); + } else if (m_representation == PlatformLayerRepresentation) + releasePlatformLayer(m_typelessPlatformLayer); + else if (other.m_representation == PlatformLayerRepresentation) + retainPlatformLayer(other.m_typelessPlatformLayer); + m_graphicsLayer = other.m_graphicsLayer; m_typelessPlatformLayer = other.m_typelessPlatformLayer; m_layerID = other.m_layerID; m_representation = other.m_representation; - if (m_representation == PlatformLayerRepresentation) - retainPlatformLayer(m_typelessPlatformLayer); - return *this; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/scrolling/ThreadedScrollingTree.cpp webkit2gtk-2.52.5/Source/WebCore/page/scrolling/ThreadedScrollingTree.cpp --- webkit2gtk-2.52.3/Source/WebCore/page/scrolling/ThreadedScrollingTree.cpp 2026-02-23 14:40:55.459300500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/scrolling/ThreadedScrollingTree.cpp 2026-07-09 07:12:42.108796400 +0000 @@ -306,6 +306,12 @@ scrollingTreeNodeScrollUpdated(node, ScrollUpdateType::AnimatedScrollDidEnd); } +// Required so instant programmatic scrolls (e.g. scrollIntoView({behavior:'instant'})) fire 'scrollend'. +void ThreadedScrollingTree::scrollingTreeNodeDidStopProgrammaticScroll(ScrollingTreeScrollingNode& node) +{ + scrollingTreeNodeScrollUpdated(node, ScrollUpdateType::ProgrammaticScrollDidEnd); +} + void ThreadedScrollingTree::scrollingTreeNodeWillStartWheelEventScroll(ScrollingTreeScrollingNode& node) { scrollingTreeNodeScrollUpdated(node, ScrollUpdateType::WheelEventScrollWillStart); diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/scrolling/ThreadedScrollingTree.h webkit2gtk-2.52.5/Source/WebCore/page/scrolling/ThreadedScrollingTree.h --- webkit2gtk-2.52.3/Source/WebCore/page/scrolling/ThreadedScrollingTree.h 2026-02-23 14:40:55.459300500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/scrolling/ThreadedScrollingTree.h 2026-07-09 07:12:42.108796400 +0000 @@ -78,6 +78,7 @@ void scrollingTreeNodeDidStopAnimatedScroll(ScrollingTreeScrollingNode&) override; void scrollingTreeNodeWillStartWheelEventScroll(ScrollingTreeScrollingNode&) override; void scrollingTreeNodeDidStopWheelEventScroll(ScrollingTreeScrollingNode&) override; + void scrollingTreeNodeDidStopProgrammaticScroll(ScrollingTreeScrollingNode&) override; bool scrollingTreeNodeRequestsScroll(ScrollingNodeID, const RequestedScrollData&) override WTF_REQUIRES_LOCK(m_treeLock); bool scrollingTreeNodeRequestsKeyboardScroll(ScrollingNodeID, const RequestedKeyboardScrollData&) override WTF_REQUIRES_LOCK(m_treeLock); diff -Nru webkit2gtk-2.52.3/Source/WebCore/page/text-extraction/TextExtraction.cpp webkit2gtk-2.52.5/Source/WebCore/page/text-extraction/TextExtraction.cpp --- webkit2gtk-2.52.3/Source/WebCore/page/text-extraction/TextExtraction.cpp 2026-02-23 14:40:55.464300600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/page/text-extraction/TextExtraction.cpp 2026-07-09 07:12:42.108796400 +0000 @@ -193,6 +193,8 @@ using ClientNodeAttributesMap = WeakHashMap, WeakPtrImplWithEventTargetData>; +static constexpr unsigned maxExtractionRecursionDepth = 255; + struct TraversalContext { const Request originalRequest; const ClientNodeAttributesMap clientNodeAttributes; @@ -202,6 +204,8 @@ const FrameIdentifier frameIdentifier; Vector> enclosingBlocks; WeakHashMap enclosingBlockNumberMap; + WeakHashSet visitedContainers; + unsigned depth { 0 }; unsigned onlyCollectTextAndLinksCount { 0 }; bool mergeParagraphs { false }; bool skipNearlyTransparentContent { false }; @@ -679,9 +683,22 @@ static inline void extractRecursive(Node& node, Item& parentItem, TraversalContext& context) { + if (context.depth >= maxExtractionRecursionDepth) + return; + if (context.nodesToSkip.contains(node)) return; + if (RefPtr container = dynamicDowncast(node)) { + if (!context.visitedContainers.add(*container).isNewEntry) + return; + } + + ++context.depth; + auto depthScope = makeScopeExit([&] { + --context.depth; + }); + bool isBlock = WebCore::isBlock(node); if (isBlock) context.pushEnclosingBlock(node); @@ -1077,6 +1094,8 @@ .frameIdentifier = WTF::move(frameID), .enclosingBlocks = { }, .enclosingBlockNumberMap = { }, + .visitedContainers = { }, + .depth = 0, .onlyCollectTextAndLinksCount = 0, .mergeParagraphs = request.mergeParagraphs, .skipNearlyTransparentContent = request.skipNearlyTransparentContent, diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/FileStreamClient.h webkit2gtk-2.52.5/Source/WebCore/platform/FileStreamClient.h --- webkit2gtk-2.52.3/Source/WebCore/platform/FileStreamClient.h 2026-02-23 14:40:55.470300400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/FileStreamClient.h 2026-07-09 07:12:42.108796400 +0000 @@ -38,7 +38,6 @@ public: virtual void didOpen(bool) { } // false signals failure. virtual void didGetSize(long long) { } // -1 signals failure. - virtual void didRead(int) { } // -1 signals failure. virtual void didWrite(int) { } // -1 signals failure. virtual void didTruncate(bool) { } // false signals failure. diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/GStreamer.cmake webkit2gtk-2.52.5/Source/WebCore/platform/GStreamer.cmake --- webkit2gtk-2.52.3/Source/WebCore/platform/GStreamer.cmake 2026-02-23 14:40:55.471300600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/GStreamer.cmake 2026-07-09 07:12:42.108796400 +0000 @@ -143,6 +143,7 @@ platform/rice/GRefPtrRice.h platform/rice/GUniquePtrRice.h platform/rice/RiceUtilities.h + platform/rice/RiceVersioning.h ) list(APPEND WebCore_PRIVATE_INCLUDE_DIRECTORIES "${WEBCORE_DIR}/Modules/mediastream/gstreamer" diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/LayoutUnit.h webkit2gtk-2.52.5/Source/WebCore/platform/LayoutUnit.h --- webkit2gtk-2.52.3/Source/WebCore/platform/LayoutUnit.h 2026-02-23 14:40:55.473300500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/LayoutUnit.h 2026-07-09 07:12:42.108796400 +0000 @@ -82,7 +82,7 @@ } explicit LayoutUnit(double value) { - m_value = clampToInteger(value * kFixedPointDenominator); + m_value = clampTo(value * kFixedPointDenominator); } LayoutUnit& operator=(const LayoutUnit&) = default; @@ -92,12 +92,12 @@ static LayoutUnit fromFloatCeil(float value) { - return fromRawValue(clampToInteger(ceilf(value * kFixedPointDenominator))); + return fromRawValue(clampTo(ceilf(value * kFixedPointDenominator))); } static LayoutUnit fromFloatFloor(float value) { - return fromRawValue(clampToInteger(floorf(value * kFixedPointDenominator))); + return fromRawValue(clampTo(floorf(value * kFixedPointDenominator))); } static LayoutUnit fromFloatRound(float value) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/PlatformScreen.cpp webkit2gtk-2.52.5/Source/WebCore/platform/PlatformScreen.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/PlatformScreen.cpp 2026-01-20 14:08:45.694675000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/PlatformScreen.cpp 2026-07-09 07:12:42.108796400 +0000 @@ -29,56 +29,95 @@ #if PLATFORM(COCOA) || PLATFORM(GTK) || (PLATFORM(WPE) && ENABLE(WPE_PLATFORM)) #include "ScreenProperties.h" +#include #include namespace WebCore { -static ScreenProperties& screenProperties() +static Lock& platformScreenLock() { - static NeverDestroyed screenProperties; - return screenProperties; + static Lock lock; + return lock; } -const ScreenProperties& getScreenProperties() +Ref& PlatformScreen::instance() WTF_REQUIRES_LOCK(platformScreenLock()) { - return screenProperties(); + static NeverDestroyed> platformScreen = PlatformScreen::create({ }); + return platformScreen.get(); } -PlatformDisplayID primaryScreenDisplayID() +PlatformScreen::PlatformScreen(ScreenProperties&& properties) + : m_properties(WTF::move(properties)) { - return screenProperties().primaryDisplayID; } -void setScreenProperties(const ScreenProperties& properties) +Ref PlatformScreen::create(ScreenProperties&& properties) { - screenProperties() = properties; + return adoptRef(*new PlatformScreen(WTF::move(properties))); } -const ScreenData* screenData(PlatformDisplayID screenDisplayID) +Ref PlatformScreen::singleton() { - if (screenProperties().screenDataMap.isEmpty()) + Locker locker { platformScreenLock() }; + return instance().get(); +} + +const ScreenData* PlatformScreen::screenData(PlatformDisplayID screenDisplayID) const +{ + if (m_properties.screenDataMap.isEmpty()) return nullptr; // Return property of the first screen if the screen is not found in the map. if (auto displayID = screenDisplayID ? screenDisplayID : primaryScreenDisplayID()) { - auto properties = screenProperties().screenDataMap.find(displayID); - if (properties != screenProperties().screenDataMap.end()) + auto properties = m_properties.screenDataMap.find(displayID); + if (properties != m_properties.screenDataMap.end()) return &properties->value; } // Last resort: use the first item in the screen list. - return &screenProperties().screenDataMap.begin()->value; + return &m_properties.screenDataMap.begin()->value; +} + +PlatformDisplayID PlatformScreen::primaryScreenDisplayID() const +{ + return m_properties.primaryDisplayID; +} + +const ScreenProperties& PlatformScreen::screenProperties() const +{ + return m_properties; +} + +const ScreenDataMap& PlatformScreen::screenDatas() const +{ + return screenProperties().screenDataMap; } #if HAVE(SUPPORT_HDR_DISPLAY) -void setScreenContentsFormatsForTesting(OptionSet contentsFormats) +OptionSet PlatformScreen::screenContentsFormatsForTesting() const { - screenProperties().screenContentsFormatsForTesting = contentsFormats; + return m_properties.screenContentsFormatsForTesting; } +#endif -OptionSet screenContentsFormatsForTesting() +void PlatformScreen::updateSingletonProperties(ScreenProperties&& properties) +{ + Locker locker { platformScreenLock() }; + Ref& platformScreenRef = PlatformScreen::instance(); + + // If we have the only reference, we can update in place + if (platformScreenRef->hasOneRef()) + platformScreenRef->m_properties = WTF::move(properties); + else + platformScreenRef = PlatformScreen::create(WTF::move(properties)); +} + +#if HAVE(SUPPORT_HDR_DISPLAY) +void PlatformScreen::updateSingletonContentsFormatsForTesting(OptionSet contentsFormats) { - return screenProperties().screenContentsFormatsForTesting; + auto properties = singleton()->screenProperties(); + properties.screenContentsFormatsForTesting = contentsFormats; + updateSingletonProperties(WTF::move(properties)); } #endif diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/PlatformScreen.h webkit2gtk-2.52.5/Source/WebCore/platform/PlatformScreen.h --- webkit2gtk-2.52.3/Source/WebCore/platform/PlatformScreen.h 2026-02-23 14:40:55.479300500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/PlatformScreen.h 2026-07-09 07:12:42.108796400 +0000 @@ -26,8 +26,10 @@ #pragma once #include +#include #include #include +#include #if PLATFORM(MAC) OBJC_CLASS NSScreen; @@ -59,10 +61,6 @@ class FloatSize; class Widget; -using PlatformDisplayID = uint32_t; - -using PlatformGPUID = uint64_t; // On MAC, global IOKit registryID that can identify a GPU across process boundaries. - int screenDepth(Widget*); int screenDepthPerComponent(Widget*); bool screenIsMonochrome(Widget*); @@ -81,13 +79,6 @@ WEBCORE_EXPORT OptionSet screenContentsFormats(Widget* = nullptr); WEBCORE_EXPORT bool screenSupportsExtendedColor(Widget* = nullptr); -enum class DynamicRangeMode : uint8_t { - None, - Standard, - HLG, - HDR10, - DolbyVisionPQ, -}; #if HAVE(AVPLAYER_VIDEORANGEOVERRIDE) WEBCORE_EXPORT DynamicRangeMode preferredDynamicRangeMode(Widget* = nullptr); #else @@ -103,17 +94,34 @@ struct ScreenProperties; struct ScreenData; - -WEBCORE_EXPORT ScreenProperties collectScreenProperties(); -WEBCORE_EXPORT void setScreenProperties(const ScreenProperties&); -WEBCORE_EXPORT const ScreenProperties& getScreenProperties(); -WEBCORE_EXPORT const ScreenData* screenData(PlatformDisplayID screendisplayID); -WEBCORE_EXPORT PlatformDisplayID primaryScreenDisplayID(); + +class PlatformScreen : public ThreadSafeRefCounted { +public: + WEBCORE_EXPORT static Ref singleton(); + WEBCORE_EXPORT static void updateSingletonProperties(ScreenProperties&&); + + WEBCORE_EXPORT const ScreenData* screenData(PlatformDisplayID) const LIFETIME_BOUND; + WEBCORE_EXPORT PlatformDisplayID primaryScreenDisplayID() const; + WEBCORE_EXPORT const ScreenProperties& screenProperties() const LIFETIME_BOUND; + WEBCORE_EXPORT const ScreenDataMap& screenDatas() const LIFETIME_BOUND; #if HAVE(SUPPORT_HDR_DISPLAY) -WEBCORE_EXPORT void setScreenContentsFormatsForTesting(OptionSet); -OptionSet screenContentsFormatsForTesting(); + WEBCORE_EXPORT OptionSet screenContentsFormatsForTesting() const; + WEBCORE_EXPORT static void updateSingletonContentsFormatsForTesting(OptionSet); +#endif + +private: + static Ref create(ScreenProperties&&); + static Ref& instance(); + explicit PlatformScreen(ScreenProperties&&); + + ScreenProperties m_properties; +}; + +WEBCORE_EXPORT ScreenProperties collectScreenProperties(); + +#if HAVE(SUPPORT_HDR_DISPLAY) WEBCORE_EXPORT float currentEDRHeadroomForDisplay(PlatformDisplayID); WEBCORE_EXPORT float maxEDRHeadroomForDisplay(PlatformDisplayID); WEBCORE_EXPORT bool suppressEDRForDisplay(PlatformDisplayID); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/ScreenProperties.h webkit2gtk-2.52.5/Source/WebCore/platform/ScreenProperties.h --- webkit2gtk-2.52.3/Source/WebCore/platform/ScreenProperties.h 2026-02-23 14:40:55.483300400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/ScreenProperties.h 2026-07-09 07:12:42.108796400 +0000 @@ -27,7 +27,6 @@ #include #include -#include #include #include #include @@ -35,6 +34,18 @@ namespace WebCore { +using PlatformGPUID = uint64_t; // On MAC, global IOKit registryID that can identify a GPU across process boundaries. + +using PlatformDisplayID = uint32_t; + +enum class DynamicRangeMode : uint8_t { + None, + Standard, + HLG, + HDR10, + DolbyVisionPQ, +}; + struct ScreenData { FloatRect screenAvailableRect; FloatRect screenRect; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/ScrollView.cpp webkit2gtk-2.52.5/Source/WebCore/platform/ScrollView.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/ScrollView.cpp 2026-02-23 14:40:55.485300500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/ScrollView.cpp 2026-07-09 07:12:42.112796300 +0000 @@ -506,8 +506,7 @@ // We should not attempt to actually modify layer contents if the layout phase // is not complete. Instead, defer the scroll event until the layout finishes. if (shouldDeferScrollUpdateAfterContentSizeChange()) { - ASSERT(!m_deferredScrollDelta); - m_deferredScrollDelta = scrollDelta; + m_deferredScrollDelta = m_deferredScrollDelta ? *m_deferredScrollDelta + scrollDelta : scrollDelta; return; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/SharedBufferChunkReader.cpp webkit2gtk-2.52.5/Source/WebCore/platform/SharedBufferChunkReader.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/SharedBufferChunkReader.cpp 2026-02-23 14:40:55.489300500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/SharedBufferChunkReader.cpp 2026-07-09 07:12:42.112796300 +0000 @@ -135,9 +135,9 @@ requestedSize -= readBytesCount; auto currentSegment = m_iteratorCurrent; -WTF_ALLOW_UNSAFE_BUFFER_USAGE_END while (requestedSize && ++currentSegment != m_iteratorEnd) { +WTF_ALLOW_UNSAFE_BUFFER_USAGE_END size_t lengthInSegment = std::min(currentSegment->segment->size(), requestedSize); data.append(currentSegment->segment->span().first(lengthInSegment)); readBytesCount += lengthInSegment; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/SourcesSkia.txt webkit2gtk-2.52.5/Source/WebCore/platform/SourcesSkia.txt --- webkit2gtk-2.52.3/Source/WebCore/platform/SourcesSkia.txt 2026-01-20 14:08:45.720675000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/SourcesSkia.txt 2026-07-09 07:12:42.112796300 +0000 @@ -56,7 +56,7 @@ platform/graphics/skia/NativeImageSkia.cpp platform/graphics/skia/PathSkia.cpp platform/graphics/skia/PatternSkia.cpp -platform/graphics/skia/PlatformDisplaySkia.cpp +platform/graphics/skia/PlatformDisplaySkia.cpp @no-unify platform/graphics/skia/ShareableBitmapSkia.cpp platform/graphics/skia/SkiaHarfBuzzFont.cpp platform/graphics/skia/SkiaHarfBuzzFontCache.cpp diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/animation/AnimationUtilities.h webkit2gtk-2.52.5/Source/WebCore/platform/animation/AnimationUtilities.h --- webkit2gtk-2.52.3/Source/WebCore/platform/animation/AnimationUtilities.h 2026-02-23 14:40:55.497300400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/animation/AnimationUtilities.h 2026-07-09 07:12:42.112796300 +0000 @@ -30,6 +30,7 @@ #include #include #include +#include namespace WebCore { @@ -73,27 +74,27 @@ inline int blend(int from, int to, const BlendingContext& context) { if (context.iterationCompositeOperation == IterationCompositeOperation::Accumulate && context.currentIteration) { - auto iterationIncrement = static_cast(context.currentIteration * static_cast(to)); + auto iterationIncrement = truncateDoubleToInt32(context.currentIteration * static_cast(to)); from += iterationIncrement; to += iterationIncrement; } if (context.compositeOperation == CompositeOperation::Replace) - return static_cast(roundTowardsPositiveInfinity(from + (static_cast(to) - from) * context.progress)); - return static_cast(roundTowardsPositiveInfinity(static_cast(from) + static_cast(from) + static_cast(to - from) * context.progress)); + return truncateDoubleToInt32(roundTowardsPositiveInfinity(from + (static_cast(to) - from) * context.progress)); + return truncateDoubleToInt32(roundTowardsPositiveInfinity(static_cast(from) + static_cast(from) + static_cast(to - from) * context.progress)); } inline unsigned blend(unsigned from, unsigned to, const BlendingContext& context) { if (context.iterationCompositeOperation == IterationCompositeOperation::Accumulate && context.currentIteration) { - auto iterationIncrement = static_cast(context.currentIteration * static_cast(to)); + auto iterationIncrement = truncateDoubleToUint32(context.currentIteration * static_cast(to)); from += iterationIncrement; to += iterationIncrement; } if (context.compositeOperation == CompositeOperation::Replace) - return static_cast(lround(from + (static_cast(to) - from) * context.progress)); - return static_cast(lround(from + from + (static_cast(to) - from) * context.progress)); + return truncateDoubleToUint32(lround(from + (static_cast(to) - from) * context.progress)); + return truncateDoubleToUint32(lround(from + from + (static_cast(to) - from) * context.progress)); } inline double blend(double from, double to, const BlendingContext& context) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/audio/AudioResamplerKernel.cpp webkit2gtk-2.52.5/Source/WebCore/platform/audio/AudioResamplerKernel.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/audio/AudioResamplerKernel.cpp 2026-03-03 21:30:17.045498600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/audio/AudioResamplerKernel.cpp 2026-07-09 07:12:42.112796300 +0000 @@ -32,6 +32,7 @@ #include "AudioUtilities.h" #include #include +#include #include namespace WebCore { @@ -55,7 +56,7 @@ double nextFractionalIndex = m_virtualReadIndex + framesToProcess * rate(); // Because we're linearly interpolating between the previous and next sample we need to round up so we include the next sample. - int endIndex = static_cast(nextFractionalIndex + 1.0); // round up to next integer index + int endIndex = truncateDoubleToInt32(nextFractionalIndex + 1.0); // round up to next integer index // Determine how many input frames we'll need. // We need to fill the buffer up to and including endIndex (so add 1) but we've already buffered m_fillIndex frames from last time. diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/audio/FFTFrame.h webkit2gtk-2.52.5/Source/WebCore/platform/audio/FFTFrame.h --- webkit2gtk-2.52.3/Source/WebCore/platform/audio/FFTFrame.h 2026-01-20 14:08:45.749674800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/audio/FFTFrame.h 2026-07-09 07:12:42.112796300 +0000 @@ -42,7 +42,7 @@ #include #include #include -#include +#include namespace WebCore { @@ -108,7 +108,7 @@ #if USE(GSTREAMER) GUniquePtr m_fft; GUniquePtr m_inverseFft; - UniqueArray m_complexData; + Vector m_complexData; #endif // USE(GSTREAMER) AudioFloatArray m_realData; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/audio/gstreamer/AudioDecoderGStreamer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/audio/gstreamer/AudioDecoderGStreamer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/audio/gstreamer/AudioDecoderGStreamer.cpp 2026-02-23 14:40:55.508300300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/audio/gstreamer/AudioDecoderGStreamer.cpp 2026-07-09 07:12:42.112796300 +0000 @@ -274,11 +274,11 @@ Ref GStreamerInternalAudioDecoder::decode(std::span frameData, [[maybe_unused]] bool isKeyFrame, int64_t timestamp, std::optional duration) { - GST_DEBUG_OBJECT(m_harness->element(), "Decoding%s frame", isKeyFrame ? " key" : ""); + GST_DEBUG_OBJECT(m_harness->element(), "Decoding%s frame with size %zu bytes", isKeyFrame ? " key" : "", frameData.size_bytes()); auto encodedData = wrapSpanData(frameData); if (!encodedData) - return AudioDecoder::DecodePromise::createAndReject("Empty frame"_s); + return AudioDecoder::DecodePromise::createAndResolve(); GstSegment segment; gst_segment_init(&segment, GST_FORMAT_TIME); @@ -310,6 +310,12 @@ return; } + if (!m_harness->isStarted()) { + GST_DEBUG_OBJECT(m_harness->element(), "Decoder hasn't started yet, nothing to flush"); + return; + } + + GST_DEBUG_OBJECT(m_harness->element(), "Pushing an empty buffer with discont flag"); auto buffer = adoptGRef(gst_buffer_new()); GST_BUFFER_FLAG_SET(buffer.get(), GST_BUFFER_FLAG_DISCONT); m_harness->pushBuffer(WTF::move(buffer)); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/audio/gstreamer/FFTFrameGStreamer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/audio/gstreamer/FFTFrameGStreamer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/audio/gstreamer/FFTFrameGStreamer.cpp 2026-02-23 14:40:55.510300400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/audio/gstreamer/FFTFrameGStreamer.cpp 2026-07-09 07:12:42.112796300 +0000 @@ -45,7 +45,7 @@ FFTFrame::FFTFrame(unsigned fftSize) : m_FFTSize(fftSize) , m_log2FFTSize(static_cast(log2(fftSize))) - , m_complexData(makeUniqueArray(unpackedFFTDataSize(m_FFTSize))) + , m_complexData(unpackedFFTDataSize(m_FFTSize)) , m_realData(unpackedFFTDataSize(m_FFTSize)) , m_imagData(unpackedFFTDataSize(m_FFTSize)) { @@ -68,7 +68,7 @@ FFTFrame::FFTFrame(const FFTFrame& frame) : m_FFTSize(frame.m_FFTSize) , m_log2FFTSize(frame.m_log2FFTSize) - , m_complexData(makeUniqueArray(unpackedFFTDataSize(m_FFTSize))) + , m_complexData(unpackedFFTDataSize(m_FFTSize)) , m_realData(unpackedFFTDataSize(frame.m_FFTSize)) , m_imagData(unpackedFFTDataSize(frame.m_FFTSize)) { @@ -89,7 +89,7 @@ void FFTFrame::doFFT(std::span data) { - gst_fft_f32_fft(m_fft.get(), data.data(), m_complexData.get()); + gst_fft_f32_fft(m_fft.get(), data.data(), m_complexData.mutableSpan().data()); auto imagData = m_imagData.span(); auto realData = m_realData.span(); @@ -109,7 +109,7 @@ m_complexData[i].r = realData[i]; } - gst_fft_f32_inverse_fft(m_inverseFft.get(), m_complexData.get(), data.data()); + gst_fft_f32_inverse_fft(m_inverseFft.get(), m_complexData.mutableSpan().data(), data.data()); // Scale so that a forward then inverse FFT yields exactly the original data. VectorMath::multiplyByScalar(data.first(m_FFTSize), 1.0 / m_FFTSize, data); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/encryptedmedia/CDMPrivate.cpp webkit2gtk-2.52.5/Source/WebCore/platform/encryptedmedia/CDMPrivate.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/encryptedmedia/CDMPrivate.cpp 2026-02-23 14:40:55.524300300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/encryptedmedia/CDMPrivate.cpp 2026-07-09 07:12:42.112796300 +0000 @@ -432,7 +432,13 @@ continue; } - if (!supportsConfigurationWithRestrictions(accumulatedConfiguration, restrictions)) + // NOTE: step 3.13 evaluates the combination including the requested capability. + CDMKeySystemConfiguration probeConfiguration = accumulatedConfiguration; + if (type == AudioVideoType::Video) + probeConfiguration.videoCapabilities.append(requestedCapability); + else + probeConfiguration.audioCapabilities.append(requestedCapability); + if (!supportsConfigurationWithRestrictions(probeConfiguration, restrictions)) continue; // 3.13.1. Add requested media capability to supported media capabilities. diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/encryptedmedia/CDMProxy.h webkit2gtk-2.52.5/Source/WebCore/platform/encryptedmedia/CDMProxy.h --- webkit2gtk-2.52.3/Source/WebCore/platform/encryptedmedia/CDMProxy.h 2026-02-23 14:40:55.525300300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/encryptedmedia/CDMProxy.h 2026-07-09 07:12:42.116796000 +0000 @@ -174,6 +174,7 @@ } unsigned numKeys() const { return m_keys.size(); } + bool isEmpty() const { return m_keys.isEmpty(); } auto values() const { return m_keys.values(); } KeyStoreIDType id() const { return m_id; } @@ -241,7 +242,7 @@ // from background threads (i.e. decryptors). class CDMProxy : public ThreadSafeRefCounted { public: - static constexpr Seconds MaxKeyWaitTimeSeconds = 7_s; + static constexpr Seconds MaxKeyWaitTimeSeconds = 10_s; virtual ~CDMProxy() = default; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/generic/ScrollbarsControllerGeneric.cpp webkit2gtk-2.52.5/Source/WebCore/platform/generic/ScrollbarsControllerGeneric.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/generic/ScrollbarsControllerGeneric.cpp 2026-02-23 14:40:55.531300300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/generic/ScrollbarsControllerGeneric.cpp 2026-07-09 07:12:42.116796000 +0000 @@ -230,6 +230,11 @@ showOverlayScrollbars(); } +void ScrollbarsControllerGeneric::scrollbarWidthChanged(ScrollbarWidth) +{ + updateScrollbarsThickness(); +} + void ScrollbarsControllerGeneric::lockOverlayScrollbarStateToHidden(bool shouldLockState) { if (m_overlayScrollbarsLocked == shouldLockState) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/generic/ScrollbarsControllerGeneric.h webkit2gtk-2.52.5/Source/WebCore/platform/generic/ScrollbarsControllerGeneric.h --- webkit2gtk-2.52.3/Source/WebCore/platform/generic/ScrollbarsControllerGeneric.h 2026-02-23 14:40:55.531300300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/generic/ScrollbarsControllerGeneric.h 2026-07-09 07:12:42.116796000 +0000 @@ -55,6 +55,7 @@ void contentAreaDidHide() override; void notifyContentAreaScrolled(const FloatSize& delta) override; void lockOverlayScrollbarStateToHidden(bool) override; + void scrollbarWidthChanged(ScrollbarWidth) override; private: void overlayScrollbarAnimationTimerFired(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/glib/UserAgentGLib.cpp webkit2gtk-2.52.5/Source/WebCore/platform/glib/UserAgentGLib.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/glib/UserAgentGLib.cpp 2026-01-20 14:08:45.899674400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/glib/UserAgentGLib.cpp 2026-07-09 07:12:42.116796000 +0000 @@ -83,6 +83,8 @@ if (quirks.contains(UserAgentQuirks::NeedsMacintoshPlatform)) uaString.append(UserAgentQuirks::stringForQuirk(UserAgentQuirks::NeedsMacintoshPlatform)); + else if (quirks.contains(UserAgentQuirks::NeedsAndroidPlatform)) + uaString.append(UserAgentQuirks::stringForQuirk(UserAgentQuirks::NeedsAndroidPlatform)); else { uaString.append(platformForUAString(), "; "_s); #if defined(USER_AGENT_BRANDING) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/glib/UserAgentQuirks.cpp webkit2gtk-2.52.5/Source/WebCore/platform/glib/UserAgentQuirks.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/glib/UserAgentQuirks.cpp 2026-01-20 14:08:45.899674400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/glib/UserAgentQuirks.cpp 2026-07-09 07:12:42.116796000 +0000 @@ -92,6 +92,12 @@ #if ENABLE(THUNDER) if (domain == "www.netflix.com"_s) return true; + + if (domain == "www.disneyplus.com"_s) + return true; + + if (domain == "www.hbomax.com"_s || domain == "auth.hbomax.com"_s) + return true; #endif return false; @@ -154,6 +160,17 @@ return false; } +static bool urlRequiresAndroidPlatform([[maybe_unused]] const String& baseDomain) +{ +#if ENABLE(WEBXR) && PLATFORM(WPE) + // When WebXR is available the model viewer support provides a better UX. + if (baseDomain == "ikea.com"_s) + return true; +#endif + + return false; +} + static bool urlRequiresUnbrandedUserAgent(const String& domain) { // Google uses an ugly fallback login page if application branding is @@ -189,6 +206,8 @@ if (urlRequiresMacintoshPlatform(domain, baseDomain)) quirks.add(UserAgentQuirks::NeedsMacintoshPlatform); + else if (urlRequiresAndroidPlatform(baseDomain)) + quirks.add(UserAgentQuirks::NeedsAndroidPlatform); if (urlRequiresUnbrandedUserAgent(domain)) quirks.add(UserAgentQuirks::NeedsUnbrandedUserAgent); @@ -205,6 +224,8 @@ return "; rv:300.0) Gecko/20100101 Firefox/300.0"_s; case NeedsMacintoshPlatform: return "Macintosh; Intel Mac OS X 10_15"_s; + case NeedsAndroidPlatform: + return "Linux; Android 12.0.0"_s; case NeedsUnbrandedUserAgent: case NumUserAgentQuirks: ASSERT_NOT_REACHED(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/glib/UserAgentQuirks.h webkit2gtk-2.52.5/Source/WebCore/platform/glib/UserAgentQuirks.h --- webkit2gtk-2.52.3/Source/WebCore/platform/glib/UserAgentQuirks.h 2026-01-20 14:08:45.899674400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/glib/UserAgentQuirks.h 2026-07-09 07:12:42.116796000 +0000 @@ -36,6 +36,7 @@ NeedsChromeBrowser, NeedsFirefoxBrowser, NeedsMacintoshPlatform, + NeedsAndroidPlatform, NeedsUnbrandedUserAgent, NumUserAgentQuirks diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/AV1Utilities.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/AV1Utilities.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/AV1Utilities.cpp 2026-02-23 14:40:55.533300200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/AV1Utilities.cpp 2026-07-09 07:12:42.116796000 +0000 @@ -1311,7 +1311,7 @@ uint8_t dataByte = data[index++]; uint8_t decodedByte = dataByte & 0x7f; - value |= decodedByte << (7 * cptr); + value |= static_cast(decodedByte) << (7 * cptr); if (value >= std::numeric_limits::max()) return 0; if (!(dataByte & 0x80)) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/DestinationColorSpace.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/DestinationColorSpace.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/DestinationColorSpace.cpp 2026-02-23 14:40:55.539300200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/DestinationColorSpace.cpp 2026-07-09 07:12:42.116796000 +0000 @@ -181,6 +181,16 @@ #endif } +bool DestinationColorSpace::usesRGBColorModel() const +{ +#if USE(CG) + // Avoid refing color space here as this is performance-sensitive. + SUPPRESS_UNRETAINED_ARG return CGColorSpaceGetModel(platformColorSpace()) == kCGColorSpaceModelRGB; +#else + return true; +#endif +} + bool DestinationColorSpace::usesExtendedRange() const { #if USE(CG) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/DestinationColorSpace.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/DestinationColorSpace.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/DestinationColorSpace.h 2026-02-23 14:40:55.539300200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/DestinationColorSpace.h 2026-07-09 07:12:42.116796000 +0000 @@ -72,6 +72,7 @@ WEBCORE_EXPORT bool supportsOutput() const; + WEBCORE_EXPORT bool usesRGBColorModel() const; WEBCORE_EXPORT bool usesExtendedRange() const; bool usesITUR_2100TF() const; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/DoublePoint.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/DoublePoint.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/DoublePoint.h 2026-02-23 14:40:55.540300100 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/DoublePoint.h 2026-07-09 07:12:42.116796000 +0000 @@ -138,12 +138,12 @@ inline IntPoint flooredIntPoint(const DoublePoint& p) { - return IntPoint(clampToInteger(floor(p.x())), clampToInteger(floor(p.y()))); + return IntPoint(clampTo(floor(p.x())), clampTo(floor(p.y()))); } inline IntPoint roundedIntPoint(const DoublePoint& p) { - return IntPoint(clampToInteger(round(p.x())), clampToInteger(round(p.y()))); + return IntPoint(clampTo(round(p.x())), clampTo(round(p.y()))); } inline DoubleSize toDoubleSize(const DoublePoint& a) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/FloatPoint.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/FloatPoint.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/FloatPoint.h 2026-02-23 14:40:55.541300000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/FloatPoint.h 2026-07-09 07:12:42.116796000 +0000 @@ -266,29 +266,29 @@ inline IntSize flooredIntSize(const FloatPoint& p) { - return IntSize(clampToInteger(floorf(p.x())), clampToInteger(floorf(p.y()))); + return IntSize(clampTo(floorf(p.x())), clampTo(floorf(p.y()))); } #if USE(CG) inline IntPoint roundedIntPoint(const CGPoint& p) { - return IntPoint(clampToInteger(roundf(p.x)), clampToInteger(roundf(p.y))); + return IntPoint(clampTo(roundf(p.x)), clampTo(roundf(p.y))); } #endif inline IntPoint roundedIntPoint(const FloatPoint& p) { - return IntPoint(clampToInteger(roundf(p.x())), clampToInteger(roundf(p.y()))); + return IntPoint(clampTo(roundf(p.x())), clampTo(roundf(p.y()))); } inline IntPoint flooredIntPoint(const FloatPoint& p) { - return IntPoint(clampToInteger(floorf(p.x())), clampToInteger(floorf(p.y()))); + return IntPoint(clampTo(floorf(p.x())), clampTo(floorf(p.y()))); } inline IntPoint ceiledIntPoint(const FloatPoint& p) { - return IntPoint(clampToInteger(ceilf(p.x())), clampToInteger(ceilf(p.y()))); + return IntPoint(clampTo(ceilf(p.x())), clampTo(ceilf(p.y()))); } inline FloatPoint floorPointToDevicePixels(const FloatPoint& p, float deviceScaleFactor) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/FloatSize.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/FloatSize.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/FloatSize.h 2026-02-23 14:40:55.542300200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/FloatSize.h 2026-07-09 07:12:42.116796000 +0000 @@ -242,22 +242,22 @@ inline IntSize roundedIntSize(const FloatSize& p) { - return IntSize(clampToInteger(roundf(p.width())), clampToInteger(roundf(p.height()))); + return IntSize(clampTo(roundf(p.width())), clampTo(roundf(p.height()))); } inline IntSize flooredIntSize(const FloatSize& p) { - return IntSize(clampToInteger(floorf(p.width())), clampToInteger(floorf(p.height()))); + return IntSize(clampTo(floorf(p.width())), clampTo(floorf(p.height()))); } inline IntSize expandedIntSize(const FloatSize& p) { - return IntSize(clampToInteger(ceilf(p.width())), clampToInteger(ceilf(p.height()))); + return IntSize(clampTo(ceilf(p.width())), clampTo(ceilf(p.height()))); } inline IntPoint flooredIntPoint(const FloatSize& p) { - return IntPoint(clampToInteger(floorf(p.width())), clampToInteger(floorf(p.height()))); + return IntPoint(clampTo(floorf(p.width())), clampTo(floorf(p.height()))); } constexpr FloatSize FloatSize::nanSize() diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/FontCascade.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/FontCascade.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/FontCascade.cpp 2026-02-23 14:40:55.543300200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/FontCascade.cpp 2026-07-09 07:12:42.116796000 +0000 @@ -881,6 +881,10 @@ return CodePath::Complex; if (supplementaryCharacter < 0x11CC0) // Marchen return CodePath::Complex; + if (supplementaryCharacter < 0x16B00) + continue; + if (supplementaryCharacter < 0x16B90) // Pahawh Hmong + return CodePath::Complex; if (supplementaryCharacter < 0x1E900) continue; if (supplementaryCharacter < 0x1E960) // Adlam diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/FormatConverter.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/FormatConverter.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/FormatConverter.cpp 2026-01-20 14:08:45.929674400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/FormatConverter.cpp 2026-07-09 07:12:42.116796000 +0000 @@ -30,6 +30,7 @@ #if ENABLE(WEBGL) #include "FormatConverter.h" +#include #include #if HAVE(ARM_NEON_INTRINSICS) @@ -1123,9 +1124,9 @@ { for (unsigned i = 0; i < pixels_per_row; ++i) { double scaleFactor = static_cast(source[3]) / MaxUInt32Value; - destination[0] = static_cast(static_cast(source[0]) * scaleFactor); - destination[1] = static_cast(static_cast(source[1]) * scaleFactor); - destination[2] = static_cast(static_cast(source[2]) * scaleFactor); + destination[0] = truncateDoubleToUint32(static_cast(source[0]) * scaleFactor); + destination[1] = truncateDoubleToUint32(static_cast(source[1]) * scaleFactor); + destination[2] = truncateDoubleToUint32(static_cast(source[2]) * scaleFactor); destination[3] = source[3]; skip(source, 4); skip(destination, 4); @@ -1138,9 +1139,9 @@ for (unsigned i = 0; i < pixels_per_row; ++i) { destination[3] = clampMin(source[3]); double scaleFactor = static_cast(destination[3]) / MaxInt32Value; - destination[0] = static_cast(static_cast(clampMin(source[0])) * scaleFactor); - destination[1] = static_cast(static_cast(clampMin(source[1])) * scaleFactor); - destination[2] = static_cast(static_cast(clampMin(source[2])) * scaleFactor); + destination[0] = truncateDoubleToInt32(static_cast(clampMin(source[0])) * scaleFactor); + destination[1] = truncateDoubleToInt32(static_cast(clampMin(source[1])) * scaleFactor); + destination[2] = truncateDoubleToInt32(static_cast(clampMin(source[2])) * scaleFactor); skip(source, 4); skip(destination, 4); } @@ -1150,10 +1151,10 @@ void pack(std::span source, std::span destination, unsigned pixels_per_row) { for (unsigned i = 0; i < pixels_per_row; ++i) { - uint32_t r = static_cast(source[0] * 1023.0f); - uint32_t g = static_cast(source[1] * 1023.0f); - uint32_t b = static_cast(source[2] * 1023.0f); - uint32_t a = static_cast(source[3] * 3.0f); + uint32_t r = truncateFloatToUint32(source[0] * 1023.0f); + uint32_t g = truncateFloatToUint32(source[1] * 1023.0f); + uint32_t b = truncateFloatToUint32(source[2] * 1023.0f); + uint32_t a = truncateFloatToUint32(source[3] * 3.0f); destination[0] = (a << 30) | (b << 20) | (g << 10) | r; skip(source, 4); skip(destination, 1); @@ -1164,10 +1165,10 @@ void pack(std::span source, std::span destination, unsigned pixels_per_row) { for (unsigned i = 0; i < pixels_per_row; ++i) { - uint32_t r = static_cast(source[0] * source[3] * 1023.0f); - uint32_t g = static_cast(source[1] * source[3] * 1023.0f); - uint32_t b = static_cast(source[2] * source[3] * 1023.0f); - uint32_t a = static_cast(source[3] * 3.0f); + uint32_t r = truncateFloatToUint32(source[0] * source[3] * 1023.0f); + uint32_t g = truncateFloatToUint32(source[1] * source[3] * 1023.0f); + uint32_t b = truncateFloatToUint32(source[2] * source[3] * 1023.0f); + uint32_t a = truncateFloatToUint32(source[3] * 3.0f); destination[0] = (a << 30) | (b << 20) | (g << 10) | r; skip(source, 4); skip(destination, 1); @@ -1179,10 +1180,10 @@ { for (unsigned i = 0; i < pixels_per_row; ++i) { float scaleFactor = source[3] ? 1023.0f / source[3] : 1023.0f; - uint32_t r = static_cast(source[0] * scaleFactor); - uint32_t g = static_cast(source[1] * scaleFactor); - uint32_t b = static_cast(source[2] * scaleFactor); - uint32_t a = static_cast(source[3] * 3.0f); + uint32_t r = truncateFloatToUint32(source[0] * scaleFactor); + uint32_t g = truncateFloatToUint32(source[1] * scaleFactor); + uint32_t b = truncateFloatToUint32(source[2] * scaleFactor); + uint32_t a = truncateFloatToUint32(source[3] * 3.0f); destination[0] = (a << 30) | (b << 20) | (g << 10) | r; skip(source, 4); skip(destination, 1); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/GraphicsContext.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/GraphicsContext.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/GraphicsContext.cpp 2026-02-23 14:40:55.549300200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/GraphicsContext.cpp 2026-07-09 07:12:42.120796000 +0000 @@ -39,6 +39,7 @@ #include "SystemImage.h" #include "TextRunIterator.h" #include "VideoFrame.h" +#include #include #include @@ -564,8 +565,7 @@ void GraphicsContext::drawDisplayList(const DisplayList::DisplayList& displayList) { - Ref controlFactory = ControlFactory::singleton(); - drawDisplayList(displayList, controlFactory); + drawDisplayList(displayList, ControlFactory::singleton()); } void GraphicsContext::drawDisplayList(const DisplayList::DisplayList& displayList, ControlFactory& controlFactory) @@ -702,11 +702,11 @@ auto left = lineSegment.begin; auto width = lineSegment.length(); auto doubleWidth = 2 * dashWidth; - auto quotient = static_cast(left / doubleWidth); + auto quotient = truncateDoubleToInt32(left / doubleWidth); auto startOffset = left - quotient * doubleWidth; auto effectiveLeft = left + startOffset; - auto startParticle = static_cast(std::floor(effectiveLeft / doubleWidth)); - auto endParticle = static_cast(std::ceil((left + width) / doubleWidth)); + auto startParticle = truncateDoubleToInt32(std::floor(effectiveLeft / doubleWidth)); + auto endParticle = truncateDoubleToInt32(std::ceil((left + width) / doubleWidth)); for (auto j = startParticle; j < endParticle; ++j) { auto actualDashWidth = dashWidth; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/GraphicsContextSwitcher.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/GraphicsContextSwitcher.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/GraphicsContextSwitcher.h 2026-01-20 14:08:45.937674500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/GraphicsContextSwitcher.h 2026-07-09 07:12:42.120796000 +0000 @@ -27,6 +27,7 @@ #include "DestinationColorSpace.h" #include "FloatRect.h" +#include #include namespace WebCore { @@ -46,7 +47,7 @@ virtual bool hasSourceImage() const { return false; } - virtual void beginClipAndDrawSourceImage(GraphicsContext& destinationContext, const FloatRect& repaintRect, const FloatRect& clipRect) = 0; + virtual void beginClipAndDrawSourceImage(GraphicsContext& destinationContext, const FloatRect& repaintRect, const FloatRect& clipRect, NOESCAPE const Function& applyAdditionalDestinationClip = { }) = 0; virtual void endClipAndDrawSourceImage(GraphicsContext& destinationContext, const DestinationColorSpace&) = 0; virtual void beginDrawSourceImage(GraphicsContext& destinationContext, float opacity = 1.f) = 0; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/GraphicsLayerAnimation.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/GraphicsLayerAnimation.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/GraphicsLayerAnimation.cpp 2026-02-23 14:40:55.551300000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/GraphicsLayerAnimation.cpp 2026-07-09 07:12:42.120796000 +0000 @@ -64,7 +64,7 @@ TextStream& operator<<(TextStream& ts, const GraphicsLayerAnimation& animation) { - ts.dumpProperty("delay"_s, animation.iterationCount()); + ts.dumpProperty("delay"_s, animation.delay()); ts.dumpProperty("direction"_s, animation.direction()); ts.dumpProperty("duration"_s, animation.duration()); ts.dumpProperty("fill-mode"_s, animation.fillMode()); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/Image.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/Image.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/Image.cpp 2026-02-23 14:40:55.554300000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/Image.cpp 2026-07-09 07:12:42.120796000 +0000 @@ -424,6 +424,8 @@ RefPtr Image::toShareableBitmap() const { RefPtr bitmap = ShareableBitmap::create({ IntSize(size()) }); + if (!bitmap) + return nullptr; std::unique_ptr graphicsContext = bitmap->createGraphicsContext(); if (!graphicsContext) return nullptr; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/ImageBuffer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/ImageBuffer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/ImageBuffer.cpp 2026-02-23 14:40:55.555300000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/ImageBuffer.cpp 2026-07-09 07:12:42.120796000 +0000 @@ -185,6 +185,11 @@ return m_buffer->memoryCost(); } + std::unique_ptr clone() const final + { + return makeUnique(m_buffer.get()); + } + private: RefPtr m_buffer; }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/ImageBuffer.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/ImageBuffer.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/ImageBuffer.h 2026-02-23 14:40:55.555300000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/ImageBuffer.h 2026-07-09 07:12:42.120796000 +0000 @@ -279,6 +279,7 @@ virtual ~SerializedImageBuffer() = default; virtual size_t memoryCost() const = 0; + virtual std::unique_ptr clone() const { return nullptr; } WEBCORE_EXPORT static RefPtr sinkIntoImageBuffer(std::unique_ptr, GraphicsClient* = nullptr); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/ImageBufferContextSwitcher.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/ImageBufferContextSwitcher.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/ImageBufferContextSwitcher.cpp 2026-02-23 14:40:55.555300000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/ImageBufferContextSwitcher.cpp 2026-07-09 07:12:42.120796000 +0000 @@ -63,7 +63,7 @@ return m_sourceImage ? &m_sourceImage->context() : &context; } -void ImageBufferContextSwitcher::beginClipAndDrawSourceImage(GraphicsContext& destinationContext, const FloatRect& repaintRect, const FloatRect&) +void ImageBufferContextSwitcher::beginClipAndDrawSourceImage(GraphicsContext& destinationContext, const FloatRect& repaintRect, const FloatRect&, NOESCAPE const Function&) { if (auto* context = drawingContext(destinationContext)) { context->save(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/ImageBufferContextSwitcher.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/ImageBufferContextSwitcher.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/ImageBufferContextSwitcher.h 2026-01-20 14:08:45.945674400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/ImageBufferContextSwitcher.h 2026-07-09 07:12:42.120796000 +0000 @@ -42,7 +42,7 @@ bool hasSourceImage() const override { return m_sourceImage; } - void beginClipAndDrawSourceImage(GraphicsContext& destinationContext, const FloatRect& repaintRect, const FloatRect& clipRect) override; + void beginClipAndDrawSourceImage(GraphicsContext& destinationContext, const FloatRect& repaintRect, const FloatRect& clipRect, NOESCAPE const Function& applyAdditionalDestinationClip) override; void endClipAndDrawSourceImage(GraphicsContext& destinationContext, const DestinationColorSpace&) override; void beginDrawSourceImage(GraphicsContext&, float = 1.f) override { } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/ImageBufferDisplayListBackend.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/ImageBufferDisplayListBackend.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/ImageBufferDisplayListBackend.h 2026-02-23 14:40:55.556300200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/ImageBufferDisplayListBackend.h 2026-07-09 07:12:42.120796000 +0000 @@ -49,8 +49,8 @@ RefPtr copyNativeImage() final; RefPtr createNativeImageReference() final { return copyNativeImage(); } - void getPixelBuffer(const IntRect&, PixelBuffer&) final { ASSERT_NOT_REACHED(); } - void putPixelBuffer(const PixelBufferSourceView&, const IntRect&, const IntPoint&, AlphaPremultiplication) final { ASSERT_NOT_REACHED(); } + void getPixelBuffer(const IntRect&, PixelBuffer&) final { RELEASE_ASSERT_NOT_REACHED(); } + void putPixelBuffer(const PixelBufferSourceView&, const IntRect&, const IntPoint&, AlphaPremultiplication) final { RELEASE_ASSERT_NOT_REACHED(); } RefPtr sinkIntoPDFDocument() final; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/IntPoint.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/IntPoint.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/IntPoint.cpp 2026-01-20 14:08:45.950674300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/IntPoint.cpp 2026-07-09 07:12:42.120796000 +0000 @@ -33,8 +33,8 @@ namespace WebCore { IntPoint::IntPoint(const FloatPoint& p) - : m_x(clampToInteger(p.x())) - , m_y(clampToInteger(p.y())) + : m_x(clampTo(p.x())) + , m_y(clampTo(p.y())) { } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/IntRect.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/IntRect.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/IntRect.cpp 2026-01-20 14:08:45.951674500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/IntRect.cpp 2026-07-09 07:12:42.120796000 +0000 @@ -30,6 +30,7 @@ #include "LayoutRect.h" #include #include +#include #include #include @@ -38,8 +39,8 @@ WTF_MAKE_TZONE_ALLOCATED_IMPL(IntRect); IntRect::IntRect(const FloatRect& r) - : m_location(clampToInteger(r.x()), clampToInteger(r.y())) - , m_size(clampToInteger(r.width()), clampToInteger(r.height())) + : m_location(clampTo(r.x()), clampTo(r.y())) + , m_size(clampTo(r.width()), clampTo(r.height())) { } @@ -128,10 +129,10 @@ void IntRect::scale(float s) { - m_location.setX((int)(x() * s)); - m_location.setY((int)(y() * s)); - m_size.setWidth((int)(width() * s)); - m_size.setHeight((int)(height() * s)); + m_location.setX(truncateFloatToInt32(x() * s)); + m_location.setY(truncateFloatToInt32(y() * s)); + m_size.setWidth(truncateFloatToInt32(width() * s)); + m_size.setHeight(truncateFloatToInt32(height() * s)); } static inline int distanceToInterval(int pos, int start, int end) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/IntSize.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/IntSize.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/IntSize.cpp 2026-01-20 14:08:45.951674500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/IntSize.cpp 2026-07-09 07:12:42.120796000 +0000 @@ -33,8 +33,8 @@ namespace WebCore { IntSize::IntSize(const FloatSize& s) - : m_width(clampToInteger(s.width())) - , m_height(clampToInteger(s.height())) + : m_width(clampTo(s.width())) + , m_height(clampTo(s.height())) { } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/IntSize.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/IntSize.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/IntSize.h 2026-02-23 14:40:55.559300000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/IntSize.h 2026-07-09 07:12:42.120796000 +0000 @@ -31,6 +31,7 @@ #include #include #include +#include #include #if USE(CG) @@ -93,8 +94,8 @@ void scale(float widthScale, float heightScale) { - m_width = static_cast(static_cast(m_width) * widthScale); - m_height = static_cast(static_cast(m_height) * heightScale); + m_width = truncateFloatToInt32(static_cast(m_width) * widthScale); + m_height = truncateFloatToInt32(static_cast(m_height) * heightScale); } void scale(float scale) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/MIMESniffer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/MIMESniffer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/MIMESniffer.cpp 2026-02-23 14:40:55.560300000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/MIMESniffer.cpp 2026-07-09 07:12:42.120796000 +0000 @@ -156,7 +156,7 @@ // 5. If iter is less than length - 4, abort these steps. // TODO: this is a spec error. It will always be less than length - 4 unless an error occurred. // 6. Let matched be the result of matching a padded sequence 0x77 0x65 0x62 0x6D ("webm") on sequence at offset iter. - while (!sequence[iter] && iter < length) + while (iter < length && !sequence[iter]) iter++; if (iter >= length - 4) break; @@ -298,9 +298,9 @@ // The string "OggS" followed by NUL, the Ogg container signature. { span8("\x4F\x67\x67\x53\x00"), span8("\xFF\xFF\xFF\xFF\xFF"), "application/ogg"_s }, // The string "MThd" followed by four bytes representing the number 6 in 32 bits (big-endian), the MIDI signature. - { span8("\0x4D\x54\x68\x64\x00\x00\x00\x06"), span8("\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"), "audio/midi"_s }, + { span8("\x4D\x54\x68\x64\x00\x00\x00\x06"), span8("\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"), "audio/midi"_s }, // The string "RIFF" followed by four bytes followed by the string "AVI ", the AVI signature. - { span8("\0x52\x49\x46\x46\x00\x00\x00\x00\x41\x56\x49\x20"), span8("\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF"), "video/avi"_s }, + { span8("\x52\x49\x46\x46\x00\x00\x00\x00\x41\x56\x49\x20"), span8("\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF"), "video/avi"_s }, // The string "RIFF" followed by four bytes followed by the string "WAVE", the WAVE signature. { span8("\x52\x49\x46\x46\x00\x00\x00\x00\x57\x41\x56\x45"), span8("\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF"), "audio/wave"_s }, }); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/MIMETypeCache.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/MIMETypeCache.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/MIMETypeCache.cpp 2026-01-20 14:08:45.954674500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/MIMETypeCache.cpp 2026-07-09 07:12:42.120796000 +0000 @@ -33,13 +33,20 @@ WTF_MAKE_TZONE_ALLOCATED_IMPL(MIMETypeCache); -HashSet& MIMETypeCache::supportedTypes() +void MIMETypeCache::ensureSupportedTypes() { + Locker locker { m_supportedTypesLock }; if (!m_supportedTypes) { m_supportedTypes = HashSet { }; initializeCache(*m_supportedTypes); } +} + +HashSet MIMETypeCache::supportedTypes() +{ + ensureSupportedTypes(); + Locker locker { m_supportedTypesLock }; return *m_supportedTypes; } @@ -51,7 +58,13 @@ if (isUnsupportedContainerType(containerType)) return false; - return isStaticContainerType(containerType) || supportedTypes().contains(containerType); + if (isStaticContainerType(containerType)) + return true; + + ensureSupportedTypes(); + + Locker locker { m_supportedTypesLock }; + return m_supportedTypes->contains(containerType); } MediaPlayerEnums::SupportsType MIMETypeCache::canDecodeType(const String& mimeType) @@ -59,11 +72,8 @@ if (mimeType.isEmpty()) return MediaPlayerEnums::SupportsType::IsNotSupported; - if (m_cachedResults) { - auto it = m_cachedResults->find(mimeType); - if (it != m_cachedResults->end()) - return it->value; - } + if (auto supports = getCachedResult(mimeType)) + return *supports; auto result = MediaPlayerEnums::SupportsType::IsNotSupported; do { @@ -90,22 +100,36 @@ } while (0); - if (!m_cachedResults) - m_cachedResults = HashMap(); - m_cachedResults->add(mimeType, result); + addCachedResult(mimeType, result); return result; } void MIMETypeCache::addSupportedTypes(const Vector& newTypes) { - if (!m_supportedTypes) - m_supportedTypes = HashSet { }; + ensureSupportedTypes(); + Locker locker { m_supportedTypesLock }; for (auto& type : newTypes) m_supportedTypes->add(type); } +std::optional MIMETypeCache::getCachedResult(const String& mimeType) const +{ + Locker locker { m_cachedResultsLock }; + if (m_cachedResults) + return m_cachedResults->getOptional(mimeType); + return std::nullopt; +} + +void MIMETypeCache::addCachedResult(const String& mimeType, MediaPlayerEnums::SupportsType result) +{ + Locker locker { m_cachedResultsLock }; + if (!m_cachedResults) + m_cachedResults = HashMap(); + m_cachedResults->add(mimeType, result); +} + bool MIMETypeCache::isStaticContainerType(StringView) { return false; @@ -123,6 +147,7 @@ bool MIMETypeCache::isEmpty() const { + Locker locker { m_supportedTypesLock }; return m_supportedTypes && m_supportedTypes->isEmpty(); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/MIMETypeCache.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/MIMETypeCache.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/MIMETypeCache.h 2026-02-23 14:40:55.560300000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/MIMETypeCache.h 2026-07-09 07:12:42.120796000 +0000 @@ -44,7 +44,7 @@ virtual bool isAvailable() const; virtual MediaPlayerEnums::SupportsType canDecodeType(const String&); - virtual HashSet& supportedTypes(); + virtual HashSet supportedTypes(); bool isEmpty() const; bool supportsContainerType(const String&); @@ -53,6 +53,10 @@ void addSupportedTypes(const Vector&); private: + void ensureSupportedTypes(); + std::optional getCachedResult(const String&) const; + void addCachedResult(const String&, MediaPlayerEnums::SupportsType); + virtual bool isStaticContainerType(StringView); virtual bool isUnsupportedContainerType(const String&); virtual void initializeCache(HashSet&); @@ -60,8 +64,11 @@ bool shouldOverrideExtendedType(const ContentType&); - std::optional> m_supportedTypes; - std::optional> m_cachedResults; + mutable Lock m_supportedTypesLock; + std::optional> m_supportedTypes WTF_GUARDED_BY_LOCK(m_supportedTypesLock); + + mutable Lock m_cachedResultsLock; + std::optional> m_cachedResults WTF_GUARDED_BY_LOCK(m_cachedResultsLock); }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/MediaPlayer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/MediaPlayer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/MediaPlayer.cpp 2026-02-23 14:40:55.561300000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/MediaPlayer.cpp 2026-07-09 07:12:42.124796000 +0000 @@ -116,6 +116,24 @@ WTF_MAKE_TZONE_ALLOCATED_IMPL(MediaPlayer); WTF_MAKE_TZONE_ALLOCATED_IMPL(MediaPlayerFactory); +MediaEngineSupportParameters MediaEngineSupportParameters::isolatedCopy() && +{ + SUPPRESS_UNCOUNTED_ARG return { + crossThreadCopy(WTF::move(type)), + crossThreadCopy(WTF::move(url)), + isMediaSource, + isMediaStream, + requiresRemotePlayback, + supportsLimitedMatroska, + crossThreadCopy(WTF::move(contentTypesRequiringHardwareSupport)), + crossThreadCopy(WTF::move(allowedMediaContainerTypes)), + crossThreadCopy(WTF::move(allowedMediaCodecTypes)), + WTF::move(allowedMediaVideoCodecIDs), + WTF::move(allowedMediaAudioCodecIDs), + WTF::move(allowedMediaCaptionFormatTypes), + }; +} + // a null player to make MediaPlayer logic simpler class NullMediaPlayerPrivate final : public MediaPlayerPrivateInterface, public ThreadSafeRefCounted { diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/MediaPlayer.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/MediaPlayer.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/MediaPlayer.h 2026-02-23 14:40:55.562300000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/MediaPlayer.h 2026-07-09 07:12:42.124796000 +0000 @@ -122,6 +122,8 @@ std::optional> allowedMediaVideoCodecIDs; std::optional> allowedMediaAudioCodecIDs; std::optional> allowedMediaCaptionFormatTypes; + + [[nodiscard]] WEBCORE_EXPORT MediaEngineSupportParameters isolatedCopy() &&; }; struct SeekTarget { diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/PixelBufferConversion.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/PixelBufferConversion.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/PixelBufferConversion.cpp 2026-02-23 14:40:55.567300000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/PixelBufferConversion.cpp 2026-07-09 07:12:42.124796000 +0000 @@ -112,6 +112,12 @@ auto sourceVImageBuffer = makeVImageBuffer(source, destinationSize); auto destinationVImageBuffer = makeVImageBuffer(destination, destinationSize); + auto zeroFillDestination = [&] { + size_t rowFillBytes = static_cast(destinationSize.width()) * 4; + for (int y = 0; y < destinationSize.height(); ++y) + zeroSpan(destination.rows.subspan(static_cast(y) * destination.bytesPerRow, rowFillBytes)); + }; + if (source.format.colorSpace != destination.format.colorSpace) { // FIXME: Consider using vImageConvert_AnyToAny for all conversions, not just ones that need a color space conversion, // after judiciously performance testing them against each other. @@ -121,11 +127,20 @@ vImage_Error converterCreateError = kvImageNoError; auto converter = adoptCF(vImageConverter_CreateWithCGImageFormat(&sourceCGImageFormat, &destinationCGImageFormat, nullptr, kvImageNoFlags, &converterCreateError)); - if (converterCreateError != kvImageNoError) + if (converterCreateError != kvImageNoError) { + RELEASE_LOG_ERROR(Images, "%s: vImageConverter_CreateWithCGImageFormat() failed with error: %zd", __FUNCTION__, converterCreateError); + // The destination may be uninitialized; ensure no stale heap is exposed to callers. + zeroFillDestination(); return; + } vImage_Error converterConvertError = vImageConvert_AnyToAny(converter.get(), &sourceVImageBuffer, &destinationVImageBuffer, nullptr, kvImageNoFlags); - ASSERT_WITH_MESSAGE_UNUSED(converterConvertError, converterConvertError == kvImageNoError, "vImageConvert_AnyToAny failed conversion with error: %zd", converterConvertError); + if (converterConvertError != kvImageNoError) { + RELEASE_LOG_ERROR(Images, "%s: vImageConvert_AnyToAny() failed with error: %zd", __FUNCTION__, converterConvertError); + // The destination may be uninitialized; ensure no stale heap is exposed to callers. + zeroFillDestination(); + } + return; } @@ -342,8 +357,9 @@ static void convertImagePixelsFromFloat16ToFloat16(const ConstPixelBufferConversionView& source, const PixelBufferConversionView& destination, const IntSize& destinationSize) { - if (source.format.colorSpace != destination.format.colorSpace) - return; + // FIXME: Float16-to-Float16 color-space conversion is unimplemented; fall through and copy + // verbatim. Do not early-return on a color-space mismatch: the destination is allocated + // uninitialized, so skipping the write would leak heap bytes through getPixelBuffer(). auto sourceBytes = source.rows.size_bytes(); auto sourcePixelComponents = sourceBytes / 2; @@ -467,7 +483,15 @@ { #if ENABLE(PIXEL_FORMAT_RGBA16F) auto isSourceFloat = source.format.pixelFormat == PixelFormat::RGBA16F; + if (isSourceFloat && destinationSize.height() > 0 && destinationSize.width() > 0) { + RELEASE_ASSERT((source.rows.size_bytes() - destinationSize.width() * (4 * sizeof(Float16))) / source.bytesPerRow >= size_t(destinationSize.height() - 1), "Expected source size_bytes >= (height-1) * bytesPerRow + width*4*sizeof(Float16)"); + RELEASE_ASSERT(source.rows.size_bytes() / (4 * sizeof(Float16)) / destinationSize.width() >= size_t(destinationSize.height()), "Expected source size_bytes >= width * height * 4*sizeof(Float16)"); + } auto isDestinationFloat = destination.format.pixelFormat == PixelFormat::RGBA16F; + if (isDestinationFloat && destinationSize.height() > 0 && destinationSize.width() > 0) { + RELEASE_ASSERT((destination.rows.size_bytes() - destinationSize.width() * (4 * sizeof(Float16))) / destination.bytesPerRow >= size_t(destinationSize.height() - 1), "Expected destination size_bytes >= (height-1) * bytesPerRow + width*4*sizeof(Float16)"); + RELEASE_ASSERT(destination.rows.size_bytes() / (4 * sizeof(Float16)) / destinationSize.width() >= size_t(destinationSize.height()), "Expected destination size_bytes >= width * height * 4*sizeof(Float16)"); + } if (isSourceFloat && isDestinationFloat) return convertImagePixelsFromFloat16ToFloat16(source, destination, destinationSize); if (isSourceFloat) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/Region.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/Region.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/Region.cpp 2026-02-23 14:40:55.569300000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/Region.cpp 2026-07-09 07:12:42.124796000 +0000 @@ -166,7 +166,7 @@ uint64_t totalArea = 0; for (auto& rect : rects()) - totalArea += (rect.width() * rect.height()); + totalArea += static_cast(rect.width()) * rect.height(); return totalArea; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/ShadowBlur.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/ShadowBlur.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/ShadowBlur.cpp 2026-02-23 14:40:55.569300000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/ShadowBlur.cpp 2026-07-09 07:12:42.124796000 +0000 @@ -248,7 +248,7 @@ { int diameter; if (shadowsIgnoreTransforms) - diameter = std::max(2, static_cast(floorf((2 / 3.f) * blurRadius))); // Canvas shadow. FIXME: we should adjust the blur radius higher up. + diameter = std::max(2, truncateFloatToInt32(floorf((2 / 3.f) * blurRadius))); // Canvas shadow. FIXME: we should adjust the blur radius higher up. else { // http://dev.w3.org/csswg/css3-background/#box-shadow // Approximate a Gaussian blur with a standard deviation equal to half the blur radius, @@ -258,7 +258,7 @@ float stdDev = blurRadius / 2; const float gaussianKernelFactor = 3 / 4.f * sqrtf(2 * std::numbers::pi_v); const float fudgeFactor = 0.88f; - diameter = std::max(2, static_cast(floorf(stdDev * gaussianKernelFactor * fudgeFactor + 0.5f))); + diameter = std::max(2, truncateFloatToInt32(floorf(stdDev * gaussianKernelFactor * fudgeFactor + 0.5f))); } if (diameter & 1) { diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/SourceBufferPrivate.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/SourceBufferPrivate.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/SourceBufferPrivate.cpp 2026-02-23 14:40:55.571300000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/SourceBufferPrivate.cpp 2026-07-09 07:12:42.124796000 +0000 @@ -1526,6 +1526,10 @@ do { auto rangeStartBeforeCurrentTime = minimumBufferedTime(); + if (!rangeStartBeforeCurrentTime.isValid()) { + ASSERT_NOT_REACHED(); + break; + } auto rangeEndBeforeCurrentTime = std::min(rangeStartBeforeCurrentTime + timeChunk, maximumRangeEnd); if (rangeStartBeforeCurrentTime >= rangeEndBeforeCurrentTime) @@ -1558,6 +1562,10 @@ }); auto rangeEndAfterCurrentTime = buffered.maximumBufferedTime(); + if (!rangeEndAfterCurrentTime.isValid()) { + ASSERT_NOT_REACHED(); + break; + } auto rangeStartAfterCurrentTime = std::max(minimumRangeStartAfterCurrentTime, rangeEndAfterCurrentTime - timeChunk); if (rangeStartAfterCurrentTime >= rangeEndAfterCurrentTime) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/TrackPrivateBase.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/TrackPrivateBase.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/TrackPrivateBase.cpp 2026-02-23 14:40:55.573300000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/TrackPrivateBase.cpp 2026-07-09 07:12:42.124796000 +0000 @@ -110,7 +110,7 @@ void TrackPrivateBase::removeClient(uint32_t index) { Locker locker { m_lock }; - if (m_clients.size() > index) + if (m_clients.size() <= index) return; m_clients[index] = std::make_tuple, WeakPtr, bool>({ }, { }, false); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/TransparencyLayerContextSwitcher.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/TransparencyLayerContextSwitcher.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/TransparencyLayerContextSwitcher.cpp 2026-02-23 14:40:55.573300000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/TransparencyLayerContextSwitcher.cpp 2026-07-09 07:12:42.124796000 +0000 @@ -42,10 +42,16 @@ m_filterStyles = m_filter->createFilterStyles(destinationContext, sourceImageRect); } -void TransparencyLayerContextSwitcher::beginClipAndDrawSourceImage(GraphicsContext& destinationContext, const FloatRect&, const FloatRect& clipRect) +void TransparencyLayerContextSwitcher::beginClipAndDrawSourceImage(GraphicsContext& destinationContext, const FloatRect&, const FloatRect& clipRect, NOESCAPE const Function& applyAdditionalDestinationClip) { - destinationContext.save(); - destinationContext.beginTransparencyLayer(1); + // Workaround for a CG accelerated-drawing bug rdar://177036180: CGStyle filters fail if there's a + // non-rectangular clip, so apply the rounded clip in its own wrapping transparency layer. + if (applyAdditionalDestinationClip) { + destinationContext.save(); + applyAdditionalDestinationClip(destinationContext); + destinationContext.beginTransparencyLayer(1); + m_beganOuterClipLayer = true; + } for (auto& filterStyle : m_filterStyles) { destinationContext.save(); @@ -75,6 +81,12 @@ destinationContext.restore(); } + if (m_beganOuterClipLayer) { + destinationContext.endTransparencyLayer(); + destinationContext.restore(); + m_beganOuterClipLayer = false; + } + destinationContext.endTransparencyLayer(); destinationContext.restore(); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/TransparencyLayerContextSwitcher.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/TransparencyLayerContextSwitcher.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/TransparencyLayerContextSwitcher.h 2026-01-20 14:08:45.980674300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/TransparencyLayerContextSwitcher.h 2026-07-09 07:12:42.124796000 +0000 @@ -37,13 +37,14 @@ TransparencyLayerContextSwitcher(GraphicsContext& destinationContext, const FloatRect& sourceImageRect, RefPtr&&); private: - void beginClipAndDrawSourceImage(GraphicsContext& destinationContext, const FloatRect& repaintRect, const FloatRect& clipRect) override; + void beginClipAndDrawSourceImage(GraphicsContext& destinationContext, const FloatRect& repaintRect, const FloatRect& clipRect, NOESCAPE const Function& applyAdditionalDestinationClip) override; void endClipAndDrawSourceImage(GraphicsContext& destinationContext, const DestinationColorSpace& colorSpace) override { endDrawSourceImage(destinationContext, colorSpace); } void beginDrawSourceImage(GraphicsContext& destinationContext, float opacity = 1.f) override; void endDrawSourceImage(GraphicsContext& destinationContext, const DestinationColorSpace&) override; FilterStyleVector m_filterStyles; + bool m_beganOuterClipLayer { false }; }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/WOFFFileFormat.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/WOFFFileFormat.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/WOFFFileFormat.cpp 2026-02-23 14:40:55.574300000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/WOFFFileFormat.cpp 2026-07-09 07:12:42.124796000 +0000 @@ -261,11 +261,11 @@ // Write an sfnt table directory entry. WTF_ALLOW_UNSAFE_BUFFER_USAGE_BEGIN // GLib port uint32_t* sfntTableDirectoryPtr = reinterpret_cast_ptr(sfnt.mutableSpan().subspan(sfntTableDirectoryCursor).data()); - WTF_ALLOW_UNSAFE_BUFFER_USAGE_END *sfntTableDirectoryPtr++ = htonl(tableTag); *sfntTableDirectoryPtr++ = htonl(tableOrigChecksum); *sfntTableDirectoryPtr++ = htonl(sfnt.size()); *sfntTableDirectoryPtr++ = htonl(tableOrigLength); + WTF_ALLOW_UNSAFE_BUFFER_USAGE_END sfntTableDirectoryCursor += 4 * sizeof(uint32_t); if (tableCompLength == tableOrigLength) { diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/angle/GraphicsContextGLANGLE.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/angle/GraphicsContextGLANGLE.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/angle/GraphicsContextGLANGLE.cpp 2026-03-25 16:38:32.927259400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/angle/GraphicsContextGLANGLE.cpp 2026-07-09 07:12:42.124796000 +0000 @@ -41,6 +41,7 @@ #include "NotImplemented.h" #include #include +#include #include #include #include @@ -49,7 +50,6 @@ #include #include #include - #if ENABLE(VIDEO) && USE(AVFOUNDATION) #include "GraphicsContextGLCVCocoa.h" #endif @@ -723,9 +723,32 @@ { if (!makeContextCurrent()) return; + if (!m_isForWebGL2) { + addError(GCGLErrorCode::InvalidOperation); + return; + } + GCGLuint pixelPackBuffer = 0; + GL_GetIntegerv(GL_PIXEL_PACK_BUFFER_BINDING, reinterpret_cast(&pixelPackBuffer)); + if (!pixelPackBuffer) { + addError(GCGLErrorCode::InvalidOperation); + return; + } + + auto attrs = contextAttributes(); + if (attrs.antialias && m_state.boundReadFBO == m_multisampleFBO) { + resolveMultisamplingIfNecessary(rect); + GL_BindFramebuffer(GraphicsContextGL::READ_FRAMEBUFFER, m_fbo); + } + setPackParameters(alignment, rowLength, false); - std::span data(reinterpret_cast(offset), 0); - readPixelsImpl(rect, format, type, data); + + // ANGLE validates the read size against the PBO size. + GLsizei bufferSize = std::numeric_limits::max(); + + GL_ReadnPixelsRobustANGLE(rect.x(), rect.y(), rect.width(), rect.height(), format, type, bufferSize, nullptr, nullptr, nullptr, reinterpret_cast(offset)); + + if (attrs.antialias && m_state.boundReadFBO == m_multisampleFBO) + GL_BindFramebuffer(GraphicsContextGL::READ_FRAMEBUFFER, m_multisampleFBO); } std::optional GraphicsContextGLANGLE::readPixelsImpl(IntRect rect, GCGLenum format, GCGLenum type, std::span data) @@ -1588,7 +1611,19 @@ { if (!makeContextCurrent()) return; - + switch (pname) { + case UNPACK_ALIGNMENT: + case UNPACK_ROW_LENGTH: + case UNPACK_IMAGE_HEIGHT: + case UNPACK_SKIP_PIXELS: + case UNPACK_SKIP_ROWS: + case UNPACK_SKIP_IMAGES: + break; + default: + // Should be never set, rather passed to the commands that need these. + addError(GCGLErrorCode::InvalidOperation); + return; + } GL_PixelStorei(pname, param); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/controls/ControlFactory.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/controls/ControlFactory.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/controls/ControlFactory.h 2026-02-23 14:40:55.613299800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/controls/ControlFactory.h 2026-07-09 07:12:42.128795900 +0000 @@ -25,9 +25,9 @@ #pragma once -#include #include #include +#include namespace WebCore { @@ -52,7 +52,7 @@ class TextFieldPart; class ToggleButtonPart; -class ControlFactory : public RefCounted { +class ControlFactory : public ThreadSafeRefCounted { WTF_MAKE_TZONE_ALLOCATED(ControlFactory); public: virtual ~ControlFactory() = default; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/cpu/arm/filters/FEBlendNeonApplier.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/cpu/arm/filters/FEBlendNeonApplier.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/cpu/arm/filters/FEBlendNeonApplier.cpp 2026-01-20 14:08:46.146623400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/cpu/arm/filters/FEBlendNeonApplier.cpp 2026-07-09 07:12:42.128795900 +0000 @@ -187,6 +187,9 @@ auto effectBDrawingRect = result.absoluteImageRectRelativeTo(input2); auto sourcePixelArrayB = input2.getPixelBuffer(AlphaPremultiplication::Premultiplied, effectBDrawingRect); + if (!sourcePixelArrayA || !sourcePixelArrayB) + return false; + unsigned sourcePixelArrayLength = sourcePixelArrayA->bytes().size(); ASSERT(sourcePixelArrayLength == sourcePixelArrayB->bytes().size()); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/displaylists/DisplayListItem.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/displaylists/DisplayListItem.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/displaylists/DisplayListItem.cpp 2026-01-20 14:08:46.151820400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/displaylists/DisplayListItem.cpp 2026-07-09 07:12:42.128795900 +0000 @@ -39,6 +39,8 @@ WTF::switchOn(item, [&](const DrawControlPart& item) { item.apply(context, controlFactory); + }, [&](const DrawDisplayList& item) { + item.apply(context, controlFactory); }, [&](const auto& item) { item.apply(context); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp 2026-02-23 14:40:55.622299700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp 2026-07-09 07:12:42.128795900 +0000 @@ -318,9 +318,9 @@ return m_displayList; } -void DrawDisplayList::apply(GraphicsContext& context) const +void DrawDisplayList::apply(GraphicsContext& context, ControlFactory& controlFactory) const { - return context.drawDisplayList(m_displayList); + return context.drawDisplayList(m_displayList, controlFactory); } void DrawDisplayList::dump(TextStream& ts, OptionSet) const diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/displaylists/DisplayListItems.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/displaylists/DisplayListItems.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/displaylists/DisplayListItems.h 2026-03-02 11:44:30.007208300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/displaylists/DisplayListItems.h 2026-07-09 07:12:42.128795900 +0000 @@ -574,7 +574,7 @@ Ref displayList() const; - void apply(GraphicsContext&) const; + void apply(GraphicsContext&, ControlFactory&) const; void dump(TextStream&, OptionSet) const; private: diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/egl/GLContext.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/egl/GLContext.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/egl/GLContext.cpp 2026-03-11 21:45:10.597136500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/egl/GLContext.cpp 2026-07-09 07:12:42.128795900 +0000 @@ -360,7 +360,6 @@ { WTF_ALLOW_UNSAFE_BUFFER_USAGE_BEGIN // GLib / Windows ports. static EGLint contextAttributes[3]; - WTF_ALLOW_UNSAFE_BUFFER_USAGE_END static bool contextAttributesInitialized = false; if (!contextAttributesInitialized) { @@ -372,6 +371,7 @@ } return eglCreateContext(eglDisplay, config, sharingContext, contextAttributes); + WTF_ALLOW_UNSAFE_BUFFER_USAGE_END } bool GLContext::makeCurrentImpl() @@ -465,12 +465,12 @@ int extensionLen = strlen(extension); WTF_ALLOW_UNSAFE_BUFFER_USAGE_BEGIN // GLib / Windows ports. const char* extensionListPtr = extensionList; - WTF_ALLOW_UNSAFE_BUFFER_USAGE_END while ((extensionListPtr = strstr(extensionListPtr, extension))) { if (extensionListPtr[extensionLen] == ' ' || extensionListPtr[extensionLen] == '\0') return true; extensionListPtr += extensionLen; } + WTF_ALLOW_UNSAFE_BUFFER_USAGE_END return false; } IGNORE_CLANG_WARNINGS_END diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/filters/FEColorMatrix.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/FEColorMatrix.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/filters/FEColorMatrix.cpp 2026-02-23 14:40:55.629299600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/FEColorMatrix.cpp 2026-07-09 07:12:42.132795800 +0000 @@ -41,6 +41,7 @@ Ref FEColorMatrix::create(ColorMatrixType type, Vector&& values, DestinationColorSpace colorSpace) { + ASSERT(areValuesValidForType(type, values)); return adoptRef(*new FEColorMatrix(type, WTF::move(values), colorSpace)); } @@ -74,6 +75,22 @@ return true; } +bool FEColorMatrix::areValuesValidForType(ColorMatrixType type, const Vector& values) +{ + switch (type) { + case ColorMatrixType::FECOLORMATRIX_TYPE_MATRIX: + return values.size() == 20; + case ColorMatrixType::FECOLORMATRIX_TYPE_SATURATE: + case ColorMatrixType::FECOLORMATRIX_TYPE_HUEROTATE: + return values.size() == 1; + case ColorMatrixType::FECOLORMATRIX_TYPE_LUMINANCETOALPHA: + return true; + case ColorMatrixType::FECOLORMATRIX_TYPE_UNKNOWN: + return false; + } + RELEASE_ASSERT_NOT_REACHED(); +} + void FEColorMatrix::calculateSaturateComponents(std::span components, float value) { auto saturationMatrix = saturationColorMatrix(value); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/filters/FEColorMatrix.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/FEColorMatrix.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/filters/FEColorMatrix.h 2026-02-23 14:40:55.629299600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/FEColorMatrix.h 2026-07-09 07:12:42.132795800 +0000 @@ -49,6 +49,7 @@ const Vector& values() const { return m_values; } bool setValues(const Vector&); + WEBCORE_EXPORT static bool areValuesValidForType(ColorMatrixType, const Vector& values); static void calculateSaturateComponents(std::span components, float value); static void calculateHueRotateComponents(std::span components, float value); static Vector normalizedFloats(const Vector& values); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/filters/FilterImage.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/FilterImage.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/filters/FilterImage.cpp 2026-02-23 14:40:55.635299700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/FilterImage.cpp 2026-07-09 07:12:42.132795800 +0000 @@ -141,25 +141,26 @@ return m_imageBuffer.get(); } -static void copyImageBytes(const PixelBuffer& sourcePixelBuffer, PixelBuffer& destinationPixelBuffer) +static bool copyImageBytes(const PixelBuffer& sourcePixelBuffer, PixelBuffer& destinationPixelBuffer) { ASSERT(sourcePixelBuffer.size() == destinationPixelBuffer.size()); auto destinationSize = destinationPixelBuffer.size(); auto rowBytes = CheckedUint32(destinationSize.width()) * 4; if (rowBytes.hasOverflowed()) [[unlikely]] - return; + return false; ConstPixelBufferConversionView source { sourcePixelBuffer.format(), rowBytes, sourcePixelBuffer.bytes() }; PixelBufferConversionView destination { destinationPixelBuffer.format(), rowBytes, destinationPixelBuffer.bytes() }; convertImagePixels(source, destination, destinationSize); + return true; } -static void copyImageBytes(const PixelBuffer& sourcePixelBuffer, PixelBuffer& destinationPixelBuffer, const IntRect& sourceRect) +static bool copyImageBytes(const PixelBuffer& sourcePixelBuffer, PixelBuffer& destinationPixelBuffer, const IntRect& sourceRect) { - auto sourcePixelBufferRect = IntRect { { }, sourcePixelBuffer.size() }; - auto destinationPixelBufferRect = IntRect { { }, destinationPixelBuffer.size() }; + const auto sourcePixelBufferRect = IntRect { { }, sourcePixelBuffer.size() }; + const auto destinationPixelBufferRect = IntRect { { }, destinationPixelBuffer.size() }; auto sourceRectClipped = intersection(sourcePixelBufferRect, sourceRect); auto destinationRect = IntRect { { }, sourceRectClipped.size() }; @@ -173,13 +174,9 @@ destinationRect.intersect(destinationPixelBufferRect); sourceRectClipped.setSize(destinationRect.size()); - // Initialize the destination to transparent black, if not entirely covered by the source. - if (destinationRect.size() != destinationPixelBufferRect.size()) - destinationPixelBuffer.zeroFill(); - // Early return if the rect does not intersect with the source. if (destinationRect.isEmpty()) - return; + return false; auto size = CheckedUint32(sourceRectClipped.width()) * 4; auto destinationBytesPerRow = CheckedUint32(destinationPixelBufferRect.width()) * 4; @@ -188,7 +185,11 @@ auto sourceOffset = sourceRectClipped.y() * sourceBytesPerRow + CheckedUint32(sourceRectClipped.x()) * 4; if (size.hasOverflowed() || destinationBytesPerRow.hasOverflowed() || sourceBytesPerRow.hasOverflowed() || destinationOffset.hasOverflowed() || sourceOffset.hasOverflowed()) [[unlikely]] - return; + return false; + + // Initialize the destination to transparent black, if not entirely covered by the source. + if (destinationRect.size() != destinationPixelBufferRect.size()) + destinationPixelBuffer.zeroFill(); auto destinationPixel = destinationPixelBuffer.bytes().subspan(destinationOffset.value()); auto sourcePixel = sourcePixelBuffer.bytes().subspan(sourceOffset.value()); @@ -200,6 +201,8 @@ } memcpySpan(destinationPixel, sourcePixel.first(size)); } + + return true; } static RefPtr getConvertedPixelBuffer(ImageBuffer& imageBuffer, AlphaPremultiplication alphaFormat, const IntRect& sourceRect, DestinationColorSpace colorSpace, ImageBufferAllocator& allocator) @@ -272,11 +275,15 @@ return nullptr; if (alphaFormat == AlphaPremultiplication::Unpremultiplied) { - if (auto& sourcePixelBuffer = pixelBufferSlot(AlphaPremultiplication::Premultiplied)) - copyImageBytes(*sourcePixelBuffer, *pixelBuffer); + if (auto& sourcePixelBuffer = pixelBufferSlot(AlphaPremultiplication::Premultiplied)) { + if (!copyImageBytes(*sourcePixelBuffer, *pixelBuffer)) + return nullptr; + } } else { - if (auto& sourcePixelBuffer = pixelBufferSlot(AlphaPremultiplication::Unpremultiplied)) - copyImageBytes(*sourcePixelBuffer, *pixelBuffer); + if (auto& sourcePixelBuffer = pixelBufferSlot(AlphaPremultiplication::Unpremultiplied)) { + if (!copyImageBytes(*sourcePixelBuffer, *pixelBuffer)) + return nullptr; + } } return pixelBuffer.get(); @@ -292,11 +299,13 @@ if (!pixelBuffer) return nullptr; - copyPixelBuffer(*pixelBuffer, sourceRect); + if (!copyPixelBuffer(*pixelBuffer, sourceRect)) + return nullptr; + return pixelBuffer; } -void FilterImage::copyPixelBuffer(PixelBuffer& destinationPixelBuffer, const IntRect& sourceRect) +bool FilterImage::copyPixelBuffer(PixelBuffer& destinationPixelBuffer, const IntRect& sourceRect) { auto alphaFormat = destinationPixelBuffer.format().alphaFormat; auto& colorSpace = destinationPixelBuffer.format().colorSpace; @@ -309,8 +318,8 @@ if (m_imageBuffer) { IntRect rect { { }, m_absoluteImageRect.size() }; if (auto convertedPixelBuffer = getConvertedPixelBuffer(Ref { *m_imageBuffer }, alphaFormat, rect, colorSpace, m_allocator)) - copyImageBytes(*convertedPixelBuffer, destinationPixelBuffer, sourceRect); - return; + return copyImageBytes(*convertedPixelBuffer, destinationPixelBuffer, sourceRect); + return false; } } @@ -318,15 +327,15 @@ } if (!sourcePixelBuffer) - return; + return false; if (requiresPixelBufferColorSpaceConversion(colorSpace)) { if (auto convertedPixelBuffer = getConvertedPixelBuffer(*sourcePixelBuffer, alphaFormat, colorSpace, m_allocator)) - copyImageBytes(*convertedPixelBuffer, destinationPixelBuffer, sourceRect); - return; + return copyImageBytes(*convertedPixelBuffer, destinationPixelBuffer, sourceRect); + return false; } - copyImageBytes(*sourcePixelBuffer, destinationPixelBuffer, sourceRect); + return copyImageBytes(*sourcePixelBuffer, destinationPixelBuffer, sourceRect); } void FilterImage::correctPremultipliedPixelBuffer() diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/filters/FilterImage.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/FilterImage.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/filters/FilterImage.h 2026-02-23 14:40:55.636299600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/FilterImage.h 2026-07-09 07:12:42.132795800 +0000 @@ -75,7 +75,7 @@ PixelBuffer* pixelBuffer(AlphaPremultiplication); RefPtr getPixelBuffer(AlphaPremultiplication, const IntRect& sourceRect, std::optional = std::nullopt); - void copyPixelBuffer(PixelBuffer& destinationPixelBuffer, const IntRect& sourceRect); + bool copyPixelBuffer(PixelBuffer& destinationPixelBuffer, const IntRect& sourceRect); void correctPremultipliedPixelBuffer(); void transformToColorSpace(const DestinationColorSpace&); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/filters/software/FEGaussianBlurSoftwareApplier.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/software/FEGaussianBlurSoftwareApplier.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/filters/software/FEGaussianBlurSoftwareApplier.cpp 2026-02-23 14:40:55.639299600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/software/FEGaussianBlurSoftwareApplier.cpp 2026-07-09 07:12:42.132795800 +0000 @@ -345,6 +345,11 @@ } #endif + // boxBlurAlphaOnly() fills the alpha channel only. Make + // sure the other channels are initialized in this case. + if (isAlphaImage) + tempBuffer.zeroFill(); + boxBlurUnaccelerated(ioBuffer, tempBuffer, kernelSizeX, kernelSizeY, stride, paintSize, isAlphaImage, edgeMode); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/filters/software/FEMorphologySoftwareApplier.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/software/FEMorphologySoftwareApplier.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/filters/software/FEMorphologySoftwareApplier.cpp 2026-01-20 14:08:46.182674000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/software/FEMorphologySoftwareApplier.cpp 2026-07-09 07:12:42.132795800 +0000 @@ -4,7 +4,7 @@ * Copyright (C) 2005 Eric Seidel * Copyright (C) 2009 Dirk Schulze * Copyright (C) Research In Motion Limited 2010. All rights reserved. - * Copyright (C) Apple Inc. 2017-2022 All rights reserved. + * Copyright (C) Apple Inc. 2017-2026 All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -27,8 +27,8 @@ #include "FEMorphology.h" #include "Filter.h" +#include "FilterEffectSoftwareParallelApplier.h" #include "PixelBuffer.h" -#include #include #include @@ -44,12 +44,12 @@ return perComponentMax(a, b); } -inline ColorComponents FEMorphologySoftwareApplier::columnExtremum(const PixelBuffer& srcPixelBuffer, int x, int yStart, int yEnd, int width, MorphologyOperatorType type) +inline ColorComponents FEMorphologySoftwareApplier::columnExtremum(const PixelBuffer& sourceBuffer, int x, int yStart, int yEnd, int width, MorphologyOperatorType type) { - auto extremum = makeColorComponentsfromPixelValue(PackedColor::RGBA { reinterpretCastSpanStartTo(srcPixelBuffer.bytes().subspan(pixelArrayIndex(x, yStart, width))) }); + auto extremum = makeColorComponentsfromPixelValue(PackedColor::RGBA { reinterpretCastSpanStartTo(sourceBuffer.bytes().subspan(pixelArrayIndex(x, yStart, width))) }); for (int y = yStart + 1; y < yEnd; ++y) { - auto pixel = makeColorComponentsfromPixelValue(PackedColor::RGBA { reinterpretCastSpanStartTo(srcPixelBuffer.bytes().subspan(pixelArrayIndex(x, y, width))) }); + auto pixel = makeColorComponentsfromPixelValue(PackedColor::RGBA { reinterpretCastSpanStartTo(sourceBuffer.bytes().subspan(pixelArrayIndex(x, y, width))) }); extremum = minOrMax(extremum, pixel, type); } return extremum; @@ -64,93 +64,91 @@ return extremum; } -void FEMorphologySoftwareApplier::applyPlatformGeneric(const PaintingData& paintingData, int startY, int endY) +void FEMorphologySoftwareApplier::applyPlatformGeneric(PixelBuffer& sourceBuffer, PixelBuffer& destinationBuffer, const IntSize& sourceSize, const IntRect& destinationRect, MorphologyOperatorType type, const IntSize& radius) { - ASSERT(endY > startY); - - const auto& srcPixelBuffer = *paintingData.srcPixelBuffer; - auto& dstPixelBuffer = *paintingData.dstPixelBuffer; - - const int radiusX = paintingData.radiusX; - const int radiusY = paintingData.radiusY; - const int width = paintingData.width; - const int height = paintingData.height; - - ASSERT(radiusX <= width || radiusY <= height); - ASSERT(startY >= 0 && endY <= height && startY < endY); + const int radiusX = radius.width(); + const int radiusY = radius.height(); + const int startY = destinationRect.y(); + const int endY = destinationRect.maxY(); + const int sourceWidth = sourceSize.width(); + const int sourceHeight = sourceSize.height(); + + ASSERT(radiusX <= sourceWidth || radiusY <= sourceHeight); + ASSERT(destinationBuffer.size().width() <= sourceBuffer.size().width()); + ASSERT(destinationBuffer.size().height() <= sourceBuffer.size().height()); ColumnExtrema extrema; extrema.reserveInitialCapacity(2 * radiusX + 1); for (int y = startY; y < endY; ++y) { int yRadiusStart = std::max(0, y - radiusY); - int yRadiusEnd = std::min(height, y + radiusY + 1); + int yRadiusEnd = std::min(sourceHeight, y + radiusY + 1); extrema.shrink(0); // We start at the left edge, so compute extreme for the radiusX columns. for (int x = 0; x < radiusX; ++x) - extrema.append(columnExtremum(srcPixelBuffer, x, yRadiusStart, yRadiusEnd, width, paintingData.type)); + extrema.append(columnExtremum(sourceBuffer, x, yRadiusStart, yRadiusEnd, sourceWidth, type)); // Kernel is filled, get extrema of next column - for (int x = 0; x < width; ++x) { - if (x < width - radiusX) - extrema.append(columnExtremum(srcPixelBuffer, x + radiusX, yRadiusStart, yRadiusEnd, width, paintingData.type)); + for (int x = 0; x < sourceWidth; ++x) { + if (x < sourceWidth - radiusX) + extrema.append(columnExtremum(sourceBuffer, x + radiusX, yRadiusStart, yRadiusEnd, sourceWidth, type)); if (x > radiusX) extrema.removeAt(0); - unsigned& destPixel = reinterpretCastSpanStartTo(dstPixelBuffer.bytes().subspan(pixelArrayIndex(x, y, width))); - destPixel = makePixelValueFromColorComponents(kernelExtremum(extrema, paintingData.type)).value; + unsigned& destPixel = reinterpretCastSpanStartTo(destinationBuffer.bytes().subspan(pixelArrayIndex(x, y - startY, sourceWidth))); + destPixel = makePixelValueFromColorComponents(kernelExtremum(extrema, type)).value; } } } void FEMorphologySoftwareApplier::applyPlatformWorker(ApplyParameters* params) { - applyPlatformGeneric(*params->paintingData, params->startY, params->endY); + applyPlatformGeneric(*params->sourceBuffer, *params->destinationBuffer, params->sourceSize, params->destinationRect, params->type, params->radius); } -void FEMorphologySoftwareApplier::applyPlatform(const PaintingData& paintingData) +bool FEMorphologySoftwareApplier::applyPlatform(PixelBuffer& sourceBuffer, PixelBuffer& destinationBuffer, MorphologyOperatorType type, const IntSize& radius) { // Empirically, runtime is approximately linear over reasonable kernel sizes with a slope of about 0.65. - float kernelFactor = sqrt(paintingData.radiusX * paintingData.radiusY) * 0.65; + float kernelFactor = sqrt(radius.width() * radius.height()) * 0.65; + int kernelSizeY = 2 * radius.height(); + int extraHeight = 3 * kernelSizeY * 0.5f; static const int minimalArea = (160 * 160); // Empirical data limit for parallel jobs - - unsigned maxNumThreads = paintingData.height / 8; - unsigned optimalThreadNumber = std::min((paintingData.width * paintingData.height * kernelFactor) / minimalArea, maxNumThreads); + + IntSize paintSize = sourceBuffer.size(); + IntRect paintRect = { { }, paintSize }; + unsigned maxNumThreads = paintSize.height() / 8; + unsigned optimalThreadNumber = std::min((paintSize.unclampedArea() * kernelFactor) / (minimalArea + extraHeight * paintSize.width()), maxNumThreads); + if (optimalThreadNumber > 1) { - ParallelJobs parallelJobs(&applyPlatformWorker, optimalThreadNumber); - auto numOfThreads = parallelJobs.numberOfJobs(); - if (numOfThreads > 1) { - // Split the job into "jobSize"-sized jobs but there a few jobs that need to be slightly larger since - // jobSize * jobs < total size. These extras are handled by the remainder "jobsWithExtra". - int jobSize = paintingData.height / numOfThreads; - int jobsWithExtra = paintingData.height % numOfThreads; - int currentY = 0; - for (int job = numOfThreads - 1; job >= 0; --job) { - ApplyParameters& param = parallelJobs.parameter(job); - param.startY = currentY; - currentY += job < jobsWithExtra ? jobSize + 1 : jobSize; - param.endY = currentY; - param.paintingData = &paintingData; - } - parallelJobs.execute(); - return; - } + ApplyParameters params { + .sourceBuffer = sourceBuffer, + .destinationBuffer = destinationBuffer, + .sourceSize = paintSize, + .destinationRect = paintRect, + .type = type, + .radius = radius + }; + + if (applyPlatformParallel(&FEMorphologySoftwareApplier::applyPlatformWorker, optimalThreadNumber, params, extraHeight)) + return true; + // Fallback to single thread model } - applyPlatformGeneric(paintingData, 0, paintingData.height); + applyPlatformGeneric(sourceBuffer, destinationBuffer, paintSize, paintRect, type, radius); + return true; } bool FEMorphologySoftwareApplier::apply(const Filter& filter, std::span> inputs, FilterImage& result) const { auto& input = inputs[0].get(); - auto destinationPixelBuffer = result.pixelBuffer(AlphaPremultiplication::Premultiplied); - if (!destinationPixelBuffer) + auto destinationBuffer = result.pixelBuffer(AlphaPremultiplication::Premultiplied); + if (!destinationBuffer) return false; auto isDegenerate = [](const IntSize& absoluteRadius) -> bool { @@ -163,7 +161,7 @@ auto absoluteRadius = flooredIntSize(filter.scaledByFilterScale(radius)); if (isDegenerate(absoluteRadius)) { - input.copyPixelBuffer(*destinationPixelBuffer, effectDrawingRect); + input.copyPixelBuffer(*destinationBuffer, effectDrawingRect); return true; } @@ -171,25 +169,15 @@ int radiusY = std::min(effectDrawingRect.height() - 1, absoluteRadius.height()); if (isDegenerate({ radiusX, radiusY })) { - input.copyPixelBuffer(*destinationPixelBuffer, effectDrawingRect); + input.copyPixelBuffer(*destinationBuffer, effectDrawingRect); return true; } - auto sourcePixelBuffer = input.getPixelBuffer(AlphaPremultiplication::Premultiplied, effectDrawingRect, m_effect->operatingColorSpace()); - if (!sourcePixelBuffer) + RefPtr sourceBuffer = input.getPixelBuffer(AlphaPremultiplication::Premultiplied, effectDrawingRect, m_effect->operatingColorSpace()); + if (!sourceBuffer) return false; - PaintingData paintingData; - paintingData.type = m_effect->morphologyOperator(); - paintingData.srcPixelBuffer = &*sourcePixelBuffer; - paintingData.dstPixelBuffer = destinationPixelBuffer; - paintingData.width = effectDrawingRect.width(); - paintingData.height = effectDrawingRect.height(); - paintingData.radiusX = radiusX; - paintingData.radiusY = radiusY; - - applyPlatform(paintingData); - return true; + return applyPlatform(*sourceBuffer, *destinationBuffer, m_effect->morphologyOperator(), { radiusX, radiusY }); } } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/filters/software/FEMorphologySoftwareApplier.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/software/FEMorphologySoftwareApplier.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/filters/software/FEMorphologySoftwareApplier.h 2026-01-20 14:08:46.182674000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/software/FEMorphologySoftwareApplier.h 2026-07-09 07:12:42.132795800 +0000 @@ -2,7 +2,7 @@ * Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann * Copyright (C) 2004, 2005 Rob Buis * Copyright (C) 2005 Eric Seidel - * Copyright (C) 2021-2022 Apple, Inc. All rights reserved. + * Copyright (C) 2021-2026 Apple, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -25,6 +25,7 @@ #include "ColorComponents.h" #include "ColorTypes.h" #include "FilterEffectApplier.h" +#include "IntRect.h" #include "PixelBuffer.h" #include #include @@ -46,20 +47,14 @@ using ColumnExtrema = Vector, 16>; - struct PaintingData { - MorphologyOperatorType type; - int radiusX; - int radiusY; - const PixelBuffer* srcPixelBuffer; - PixelBuffer* dstPixelBuffer; - int width; - int height; - }; - struct ApplyParameters { - const PaintingData* paintingData; - int startY; - int endY; + RefPtr sourceBuffer; + RefPtr destinationBuffer; + IntSize sourceSize; + IntRect destinationRect; + + MorphologyOperatorType type; + IntSize radius; }; static inline int pixelArrayIndex(int x, int y, int width) { return (y * width + x) * 4; } @@ -67,12 +62,12 @@ static inline ColorComponents makeColorComponentsfromPixelValue(PackedColor::RGBA pixel) { return asColorComponents(asSRGBA(pixel).resolved()); } static inline ColorComponents minOrMax(const ColorComponents& a, const ColorComponents& b, MorphologyOperatorType); - static inline ColorComponents columnExtremum(const PixelBuffer& srcPixelBuffer, int x, int yStart, int yEnd, int width, MorphologyOperatorType); + static inline ColorComponents columnExtremum(const PixelBuffer& sourceBuffer, int x, int yStart, int yEnd, int width, MorphologyOperatorType); static inline ColorComponents kernelExtremum(const ColumnExtrema& kernel, MorphologyOperatorType); - static void applyPlatformGeneric(const PaintingData&, int startY, int endY); + static void applyPlatformGeneric(PixelBuffer& sourceBuffer, PixelBuffer& destinationBuffer, const IntSize& sourceSize, const IntRect& destinationRect, MorphologyOperatorType, const IntSize& radius); static void applyPlatformWorker(ApplyParameters*); - static void applyPlatform(const PaintingData&); + static bool applyPlatform(PixelBuffer& sourceBuffer, PixelBuffer& destinationBuffer, MorphologyOperatorType, const IntSize& radius); }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/filters/software/FilterEffectSoftwareParallelApplier.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/software/FilterEffectSoftwareParallelApplier.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/filters/software/FilterEffectSoftwareParallelApplier.h 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/filters/software/FilterEffectSoftwareParallelApplier.h 2026-07-09 07:12:42.132795800 +0000 @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2026 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include + +namespace WebCore { + +template +inline bool applyPlatformParallel(typename ParallelJobs::WorkerFunction func, int requestedJobNumber, const ApplyParameters& paintParameters, int extraHeight) +{ + if (requestedJobNumber <= 1) + return false; + + ParallelJobs parallelJobs(func, requestedJobNumber); + int jobs = parallelJobs.numberOfJobs(); + if (jobs <= 1) + return false; + + RefPtr sourceBuffer = paintParameters.sourceBuffer; + RefPtr destinationBuffer = paintParameters.destinationBuffer; + IntSize paintSize = destinationBuffer->size(); + + // Split the job into "blockHeight"-sized jobs but there a few jobs that need to be slightly larger since + // blockHeight * jobs < total size. These extras are handled by the remainder "jobsWithExtra". + const int blockHeight = paintSize.height() / jobs; + if (blockHeight <= extraHeight) + return false; + + const int jobsWithExtra = paintSize.height() % jobs; + const int scanline = 4 * paintSize.width(); + + auto calculateAdjustedBlockHeight = [&](int job) -> int { + return job < jobsWithExtra ? blockHeight + 1 : blockHeight; + }; + + int currentY = 0; + for (int job = 0; job < jobs; ++job) { + ApplyParameters& params = parallelJobs.parameter(job); + int adjustedBlockHeight = calculateAdjustedBlockHeight(job); + + IntRect sourceRect { 0, currentY, paintSize.width(), adjustedBlockHeight }; + IntRect destinationRect { { }, sourceRect.size() }; + + if (job) { + sourceRect.shiftYEdgeBy(-extraHeight); + destinationRect.setY(extraHeight); + } + + if (job < jobs - 1) + sourceRect.shiftMaxYEdgeBy(extraHeight); + + params = paintParameters; + params.sourceSize = sourceRect.size(); + params.destinationRect = destinationRect; + + if (job) { + params.sourceBuffer = sourceBuffer->createScratchPixelBuffer(params.sourceSize); + memcpySpan(params.sourceBuffer->bytes(), sourceBuffer->bytes().subspan(sourceRect.y() * scanline, params.sourceBuffer->bytes().size())); + params.destinationBuffer = sourceBuffer->createScratchPixelBuffer(params.destinationRect.size()); + } + + currentY += adjustedBlockHeight; + } + + parallelJobs.execute(); + + // Copy together the parts of the image. + currentY = 0; + int scratchHeight = calculateAdjustedBlockHeight(0); + for (int job = 1; job < jobs; ++job) { + ApplyParameters& params = parallelJobs.parameter(job); + + currentY += scratchHeight; + scratchHeight = calculateAdjustedBlockHeight(job); + + unsigned destinationOffset = currentY * scanline; + unsigned scratchSize = scratchHeight * scanline; + + // The final result of each job should be stored in ioBuffer. + ASSERT(params.destinationBuffer->bytes().size() >= scratchSize); + memcpySpan(destinationBuffer->bytes().subspan(destinationOffset), params.destinationBuffer->bytes().subspan(0, scratchSize)); + } + + return true; +} + +} // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.cpp 2026-02-23 14:40:55.642747200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.cpp 2026-07-09 07:12:42.132795800 +0000 @@ -50,32 +50,26 @@ } AudioTrackPrivateGStreamer::AudioTrackPrivateGStreamer(ThreadSafeWeakPtr&& player, unsigned index, GRefPtr&& pad, bool shouldHandleStreamStartEvent) - : TrackPrivateBaseGStreamer(TrackPrivateBaseGStreamer::TrackType::Audio, this, index, WTF::move(pad), shouldHandleStreamStartEvent) - , m_player(WTF::move(player)) + : TrackPrivateBaseGStreamer(WTF::move(player), GStreamerTrackType::Audio, this, index, WTF::move(pad), shouldHandleStreamStartEvent) { ensureDebugCategoryInitialized(); - installUpdateConfigurationHandlers(); } AudioTrackPrivateGStreamer::AudioTrackPrivateGStreamer(ThreadSafeWeakPtr&& player, unsigned index, GRefPtr&& pad, TrackID trackId) - : TrackPrivateBaseGStreamer(TrackPrivateBaseGStreamer::TrackType::Audio, this, index, WTF::move(pad), trackId) - , m_player(WTF::move(player)) + : TrackPrivateBaseGStreamer(WTF::move(player), GStreamerTrackType::Audio, this, index, WTF::move(pad), trackId) { ensureDebugCategoryInitialized(); - installUpdateConfigurationHandlers(); } AudioTrackPrivateGStreamer::AudioTrackPrivateGStreamer(ThreadSafeWeakPtr&& player, unsigned index, GstStream* stream) - : TrackPrivateBaseGStreamer(TrackPrivateBaseGStreamer::TrackType::Audio, this, index, stream) - , m_player(WTF::move(player)) + : TrackPrivateBaseGStreamer(WTF::move(player), GStreamerTrackType::Audio, this, index, stream) { ensureDebugCategoryInitialized(); - installUpdateConfigurationHandlers(); - auto caps = adoptGRef(gst_stream_get_caps(m_stream.get())); + auto caps = adoptGRef(gst_stream_get_caps(m_data->m_stream.get())); updateConfigurationFromCaps(WTF::move(caps)); - auto tags = adoptGRef(gst_stream_get_tags(m_stream.get())); + auto tags = adoptGRef(gst_stream_get_tags(m_data->m_stream.get())); updateConfigurationFromTags(WTF::move(tags)); } @@ -84,7 +78,7 @@ ASSERT(isMainThread()); updateConfigurationFromCaps(WTF::move(caps)); - RefPtr player = m_player.get(); + RefPtr player = m_data->m_player.get(); if (!player) return; @@ -92,7 +86,7 @@ if (codec.isEmpty()) return; - GST_DEBUG_OBJECT(objectForLogging(), "Setting codec to %s", codec.ascii().data()); + GST_DEBUG_OBJECT(m_data->objectForLogging(), "Setting codec to %s", codec.ascii().data()); auto configuration = this->configuration(); configuration.codec = WTF::move(codec); setConfiguration(WTF::move(configuration)); @@ -101,13 +95,13 @@ void AudioTrackPrivateGStreamer::updateConfigurationFromTags(GRefPtr&& tags) { ASSERT(isMainThread()); - GST_DEBUG_OBJECT(objectForLogging(), "Updating audio configuration from %" GST_PTR_FORMAT, tags.get()); if (!tags) return; - if (updateTrackIDFromTags(tags)) { - GST_DEBUG_OBJECT(objectForLogging(), "Audio track ID set from container-specific-track-id tag %" G_GUINT64_FORMAT, *m_trackID); - notifyClients([trackID = *m_trackID](auto& client) { + GST_DEBUG_OBJECT(m_data->objectForLogging(), "Updating audio configuration from %" GST_PTR_FORMAT, tags.get()); + if (m_data->updateTrackIDFromTags(tags)) { + GST_DEBUG_OBJECT(m_data->objectForLogging(), "Audio track ID set from container-specific-track-id tag %" G_GUINT64_FORMAT, *m_data->m_trackID); + notifyClients([trackID = *m_data->m_trackID](auto& client) { client.idChanged(trackID); }); } @@ -116,7 +110,7 @@ if (!gst_tag_list_get_uint(tags.get(), GST_TAG_BITRATE, &bitrate)) return; - GST_DEBUG_OBJECT(objectForLogging(), "Setting bitrate to %u", bitrate); + GST_DEBUG_OBJECT(m_data->objectForLogging(), "Setting bitrate to %u", bitrate); auto configuration = this->configuration(); configuration.bitrate = bitrate; setConfiguration(WTF::move(configuration)); @@ -128,7 +122,7 @@ if (!caps || !gst_caps_is_fixed(caps.get())) return; - GST_DEBUG_OBJECT(objectForLogging(), "Updating audio configuration from %" GST_PTR_FORMAT, caps.get()); + GST_DEBUG_OBJECT(m_data->objectForLogging(), "Updating audio configuration from %" GST_PTR_FORMAT, caps.get()); auto configuration = this->configuration(); auto scopeExit = makeScopeExit([&] { setConfiguration(WTF::move(configuration)); @@ -158,36 +152,52 @@ AudioTrackPrivate::Kind AudioTrackPrivateGStreamer::kind() const { - if (m_stream && gst_stream_get_stream_flags(m_stream.get()) & GST_STREAM_FLAG_SELECT) + if (m_data->m_stream && gst_stream_get_stream_flags(m_data->m_stream.get()) & GST_STREAM_FLAG_SELECT) return AudioTrackPrivate::Kind::Main; return AudioTrackPrivate::kind(); } -void AudioTrackPrivateGStreamer::disconnect() -{ - m_taskQueue.startAborting(); - - if (m_stream) - g_signal_handlers_disconnect_matched(m_stream.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this); - - m_player = nullptr; - TrackPrivateBaseGStreamer::disconnect(); - - m_taskQueue.finishAborting(); -} - void AudioTrackPrivateGStreamer::setEnabled(bool enabled) { if (enabled == this->enabled()) return; AudioTrackPrivate::setEnabled(enabled); - RefPtr player = m_player.get(); + RefPtr player = m_data->m_player.get(); if (player) player->updateEnabledAudioTrack(); } +int AudioTrackPrivateGStreamer::trackIndex() const +{ + return m_data->m_index; +} + +TrackID AudioTrackPrivateGStreamer::id() const +{ + return m_data->m_trackID.value_or(m_data->m_id); +} + +std::optional AudioTrackPrivateGStreamer::trackUID() const +{ + auto player = m_data->m_player.get(); + if (!player || !player->isMediaStreamPlayer()) + return std::nullopt; + + return m_data->m_gstStreamId; +} + +String AudioTrackPrivateGStreamer::label() const +{ + return m_data->m_label; +} + +String AudioTrackPrivateGStreamer::language() const +{ + return m_data->m_language; +} + #undef GST_CAT_DEFAULT } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.h 2026-02-23 14:40:55.642747200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.h 2026-07-09 07:12:42.132795800 +0000 @@ -55,30 +55,18 @@ Kind kind() const final; - void disconnect() final; - void setEnabled(bool) final; void setActive(bool enabled) final { setEnabled(enabled); } - int trackIndex() const final { return m_index; } - - TrackID id() const final { return m_trackID.value_or(m_id); } - std::optional trackUID() const final - { - auto player = m_player.get(); - - if (player && player->isMediaStreamPlayer()) - return m_gstStreamId; + int trackIndex() const final; - return std::nullopt; - } + TrackID id() const final; + std::optional trackUID() const final; - String label() const final { return m_label; } - String language() const final { return m_language; } + String label() const final; + String language() const final; void updateConfigurationFromCaps(GRefPtr&&) final; - -protected: void updateConfigurationFromTags(GRefPtr&&) final; void tagsChanged(GRefPtr&& tags) final { updateConfigurationFromTags(WTF::move(tags)); } @@ -88,8 +76,6 @@ AudioTrackPrivateGStreamer(ThreadSafeWeakPtr&&, unsigned index, GRefPtr&&, bool shouldHandleStreamStartEvent); AudioTrackPrivateGStreamer(ThreadSafeWeakPtr&&, unsigned index, GRefPtr&&, TrackID); AudioTrackPrivateGStreamer(ThreadSafeWeakPtr&&, unsigned index, GstStream*); - - ThreadSafeWeakPtr m_player; }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/GLVideoSinkGStreamer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/GLVideoSinkGStreamer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/GLVideoSinkGStreamer.cpp 2026-03-26 09:51:27.358736500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/GLVideoSinkGStreamer.cpp 2026-07-09 07:12:42.132795800 +0000 @@ -54,7 +54,12 @@ struct _WebKitGLVideoSinkPrivate { ~_WebKitGLVideoSinkPrivate() { - ASSERT(isMainThread()); + // Here we are either in the main thread or in a thread created by the gst_async_call_pool. + // The latter case happens when the player has been destructed while the sink was in an + // ASYNC state change. The last reference of the sink would then be held by the + // gst_object_call_async() call made from gstbin's bin_push_state_continue. After the async task + // completed there would be no reference left and the sink would be finalized, from a thread + // managed by the thread pool. webKitVideoSinkDisconnectSignalHandlers(appSink.get(), signalIdentifiers); GST_DEBUG_OBJECT(appSink.get(), "WebKitGLVideoSink finalized."); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.cpp 2026-03-18 19:21:53.890688700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.cpp 2026-07-09 07:12:42.132795800 +0000 @@ -645,11 +645,15 @@ return activePipelines.get(); } -void registerActivePipeline(const GRefPtr& pipeline) +void registerActivePipeline(const GRefPtr& pipeline, const String& pipelineName) { - auto name = GMallocString::unsafeAdoptFromUTF8(gst_object_get_name(GST_OBJECT_CAST(pipeline.get()))); + String key = pipelineName; + if (key.isEmpty()) { + auto name = GMallocString::unsafeAdoptFromUTF8(gst_object_get_name(GST_OBJECT_CAST(pipeline.get()))); + key = name.span(); + } Locker locker { s_activePipelinesMapLock }; - activePipelinesMap().add(name.span(), GRefPtr(pipeline)); + activePipelinesMap().add(key, GRefPtr(pipeline)); } void unregisterPipeline(const GRefPtr& pipeline) @@ -659,6 +663,12 @@ activePipelinesMap().remove(name.span()); } +void unregisterPipeline(const String& pipelineName) +{ + Locker locker { s_activePipelinesMapLock }; + activePipelinesMap().remove(pipelineName); +} + void WebCoreLogObserver::didLogMessage(const WTFLogChannel& channel, WTFLogLevel level, Vector&& values) { #ifndef GST_DISABLE_GST_DEBUG diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.h 2026-04-01 21:32:25.469707300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.h 2026-07-09 07:12:42.132795800 +0000 @@ -341,8 +341,9 @@ std::optional gstGetAutoplugSelectResult(ASCIILiteral); -void registerActivePipeline(const GRefPtr&); +void registerActivePipeline(const GRefPtr&, const String& = emptyString()); void unregisterPipeline(const GRefPtr&); +void unregisterPipeline(const String&); class WebCoreLogObserver : public Logger::Observer { WTF_MAKE_TZONE_ALLOCATED(WebCoreLogObserver); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/GStreamerRegistryScanner.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/GStreamerRegistryScanner.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/GStreamerRegistryScanner.cpp 2026-04-07 12:47:23.634867000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/GStreamerRegistryScanner.cpp 2026-07-09 07:12:42.132795800 +0000 @@ -44,7 +44,11 @@ #include "VideoEncoderPrivateGStreamer.h" #endif -namespace { +namespace WebCore { + +GST_DEBUG_CATEGORY_STATIC(webkit_media_gst_registry_scanner_debug); +#define GST_CAT_DEFAULT webkit_media_gst_registry_scanner_debug + struct VideoDecodingLimits { unsigned mediaMaxWidth = 0; unsigned mediaMaxHeight = 0; @@ -56,22 +60,18 @@ { } }; -} -#ifdef VIDEO_DECODING_LIMIT -static std::optional videoDecoderLimitsDefaults() +// Parses a video decoding limit string in format WIDTHxHEIGHT@FRAMERATE. +static std::optional parseVideoDecodingLimit(const StringView& videoDecodingLimit) { - // VIDEO_DECODING_LIMIT should be in format: WIDTHxHEIGHT@FRAMERATE. - String videoDecodingLimit(String::fromUTF8(VIDEO_DECODING_LIMIT)); - if (videoDecodingLimit.isEmpty()) return { }; Vector entries; - // Extract frame rate part from the VIDEO_DECODING_LIMIT: WIDTHxHEIGHT@FRAMERATE. - videoDecodingLimit.split('@', [&entries](StringView item) { - entries.append(item.toString()); + // Extract frame rate part: WIDTHxHEIGHT@FRAMERATE. + videoDecodingLimit.toStringWithoutCopying().split('@', [&entries](StringView item) { + entries.append(item.toStringWithoutCopying()); }); if (entries.size() != 2) @@ -99,12 +99,39 @@ return { VideoDecodingLimits(width.value(), height.value(), frameRate.value()) }; } -#endif - -namespace WebCore { -GST_DEBUG_CATEGORY_STATIC(webkit_media_gst_registry_scanner_debug); -#define GST_CAT_DEFAULT webkit_media_gst_registry_scanner_debug +// Returns the active VideoDecodingLimits, resolved once at first call. +// WEBKIT_GST_VIDEO_DECODING_LIMIT env var takes precedence over the compile-time VIDEO_DECODING_LIMIT. +// Format for both: WIDTHxHEIGHT@FRAMERATE (e.g. "1920x1080@30"). +static VideoDecodingLimits* resolveVideoDecodingLimits() +{ + static std::optional limits; + static std::once_flag onceFlag; + std::call_once(onceFlag, [] { + if (const char* envLimit = g_getenv("WEBKIT_GST_VIDEO_DECODING_LIMIT")) { + GST_DEBUG("WEBKIT_GST_VIDEO_DECODING_LIMIT env var is set: %s", envLimit); + limits = parseVideoDecodingLimit(StringView::fromLatin1(envLimit)); + if (!limits) + GST_WARNING("Parsing WEBKIT_GST_VIDEO_DECODING_LIMIT env var failed: %s", envLimit); + } +#ifdef VIDEO_DECODING_LIMIT + if (!limits) { + GST_DEBUG("VIDEO_DECODING_LIMIT compile-time definition is set: %s", VIDEO_DECODING_LIMIT); + limits = parseVideoDecodingLimit(String::fromLatin1(VIDEO_DECODING_LIMIT)); + if (!limits) { + GST_WARNING("Parsing VIDEO_DECODING_LIMIT failed: %s", VIDEO_DECODING_LIMIT); + ASSERT_NOT_REACHED(); + return; + } + } +#endif + if (limits) { + GST_DEBUG("Video decoding limits: max width=%u, max height=%u, max frame rate=%u", + limits->mediaMaxWidth, limits->mediaMaxHeight, limits->mediaMaxFrameRate); + } + }); + return limits ? &*limits : nullptr; +} // We shouldn't accept media that the player can't actually play. // AAC supports up to 96 channels. @@ -376,12 +403,12 @@ GST_DEBUG("%s registry scanner initialized", m_isMediaSource ? "MSE" : "Regular playback"); for (auto& mimeType : m_decoderMimeTypeSet) GST_DEBUG("Decoder mime-type registered: %s", mimeType.utf8().data()); - for (auto& [codec, isHardware] : m_decoderCodecMap) - GST_DEBUG("%s decoder codec pattern registered: %s", isHardware ? "Hardware" : "Software", codec.utf8().data()); + for (auto& [codec, result] : m_decoderCodecMap) + GST_DEBUG("%s decoder codec pattern registered: %s", result.isUsingHardware ? "Hardware" : "Software", codec.utf8().data()); for (auto& mimeType : m_encoderMimeTypeSet) GST_DEBUG("Encoder mime-type registered: %s", mimeType.utf8().data()); - for (auto& [codec, isHardware] : m_encoderCodecMap) - GST_DEBUG("%s encoder codec pattern registered: %s", isHardware ? "Hardware" : "Software", codec.utf8().data()); + for (auto& [codec, result] : m_encoderCodecMap) + GST_DEBUG("%s encoder codec pattern registered: %s", result.isUsingHardware ? "Hardware" : "Software", codec.utf8().data()); #endif } @@ -434,12 +461,13 @@ { m_decoderCodecMap.clear(); m_decoderMimeTypeSet.clear(); + + bool audioMpegSupported = false; if (auto result = factories.hasElementForMediaType(ElementFactories::Type::AudioDecoder, "audio/mpeg, mpegversion=(int)4"_s)) { + audioMpegSupported = true; m_decoderMimeTypeSet.add("audio/aac"_s); m_decoderMimeTypeSet.add("audio/mp4"_s); m_decoderMimeTypeSet.add("audio/x-m4a"_s); - m_decoderMimeTypeSet.add("audio/mpeg"_s); - m_decoderMimeTypeSet.add("audio/x-mpeg"_s); m_decoderCodecMap.add("mpeg"_s, result); // AAC has accumulated lots of extensions over the years. // Unfortunately, decoders don't generally provide an API for querying support level, and support is not necessarily @@ -451,7 +479,6 @@ // Syntax: "mp4a." oti [ "." aud-oti ] // oti is the ObjectTypeIndication from MPEG-4 Systems (ISO 14996-1). // For oti=40 (MPEG-4 Audio), aud-oti represents the AOT. - m_decoderCodecMap.add("mp4a.67"_s, result); // MPEG-2 AAC LC m_decoderCodecMap.add("mp4a.40.2"_s, result); // MPEG-4 AAC LC m_decoderCodecMap.add("mp4a.40.02"_s, result); // MPEG-4 AAC LC m_decoderCodecMap.add("mp4a.40.5"_s, result); // MPEG-4 HE-AAC v1 (AAC LC + SBR) @@ -466,6 +493,40 @@ m_decoderCodecMap.add("mp4a.40.42"_s, result); // MPEG-4 Extended HE-AAC and xHE-AAC (USAC AOT) } + if (auto result = factories.hasElementForMediaType(ElementFactories::Type::AudioDecoder, "audio/mpeg, mpegversion=(int)2"_s)) { + audioMpegSupported = true; + m_decoderMimeTypeSet.add("audio/mp2"_s); + m_decoderCodecMap.add("mp4a.67"_s, result); // MPEG-2 AAC LC + } + + if (auto result = factories.hasElementForMediaType(ElementFactories::Type::AudioDecoder, "audio/mpeg, mpegversion=(int)1, layer=(int)[1, 3]"_s)) { + audioMpegSupported = true; + m_decoderMimeTypeSet.add("audio/mp1"_s); + m_decoderMimeTypeSet.add("audio/mp3"_s); + m_decoderMimeTypeSet.add("audio/x-mp3"_s); + m_decoderCodecMap.add("audio/mp3"_s, result); + m_decoderCodecMap.add("mp3"_s, result); + m_decoderCodecMap.add("mp4a.6b"_s, result); // Audio ISO/IEC 11172-3 (MPEG-1 Part 3 Audio) + m_decoderCodecMap.add("mp4a.6B"_s, result); // Audio ISO/IEC 11172-3 (MPEG-1 Part 3 Audio) + // MPEG-2 Part 3 Audio just defines minor extensions of MP3 adding support for more channels and bitrates. + // GStreamer still considers it mpegversion=1, leaving mpegversion=2 for AAC (MPEG-2 Part 7 Advanced Audio Coding). + m_decoderCodecMap.add("mp4a.69"_s, result); // Audio ISO/IEC 13818-3 (MPEG-2 Part 3 Audio) + // MPEG-1 Audio can be carried inside MPEG-4 Audio, for which there are standard-defined MPEG-4 + // Audio Object Type (AOT) allocated. This is esoteric in practice and it has very limited player support. + // More commonly, some media manifests for MP3 in MP4 mistakingly use these MPEG-4 AOTs in their codec + // strings despite the MP4 bytestream actually using the (much more widely supported) MPEG-1 Object Type Indication(s) + // described above. + m_decoderCodecMap.add("mp4a.40.32"_s, result); // AOT 32: Layer-1 + m_decoderCodecMap.add("mp4a.40.33"_s, result); // AOT 33: Layer-2 + m_decoderCodecMap.add("mp4a.40.34"_s, result); // AOT 34: Layer-3 + } + + audioMpegSupported |= isContainerTypeSupported(Configuration::Decoding, "audio/mp4"_s); + if (audioMpegSupported) { + m_decoderMimeTypeSet.add("audio/mpeg"_s); + m_decoderMimeTypeSet.add("audio/x-mpeg"_s); + } + auto opusSupported = factories.hasElementForMediaType(ElementFactories::Type::AudioDecoder, "audio/x-opus"_s); if (opusSupported && (!m_isMediaSource || factories.hasElementForMediaType(ElementFactories::Type::AudioParser, "audio/x-opus"_s))) { m_decoderMimeTypeSet.add("audio/opus"_s); @@ -545,8 +606,8 @@ } Vector mseCompatibleMapping = { - { ElementFactories::Type::AudioDecoder, "audio/x-ac3"_s, { }, { "x-ac3"_s, "ac-3"_s, "ac3"_s } }, - { ElementFactories::Type::AudioDecoder, "audio/x-eac3"_s, { "audio/x-ac3"_s }, { "x-eac3"_s, "ec3"_s, "ec-3"_s, "eac3"_s } }, + { ElementFactories::Type::AudioDecoder, "audio/x-ac3"_s, { }, { "x-ac3"_s, "ac-3"_s, "ac3"_s, "mp4a.a5"_s, "mp4a.A5"_s } }, + { ElementFactories::Type::AudioDecoder, "audio/x-eac3"_s, { "audio/x-ac3"_s }, { "x-eac3"_s, "ec3"_s, "ec-3"_s, "eac3"_s, "mp4a.a6"_s, "mp4a.A6"_s } }, { ElementFactories::Type::AudioDecoder, "audio/x-flac"_s, { "audio/x-flac"_s, "audio/flac"_s }, { "x-flac"_s, "flac"_s, "fLaC"_s } }, }; fillMimeTypeSetFromCapsMapping(factories, mseCompatibleMapping); @@ -626,27 +687,6 @@ } } - bool audioMpegSupported = false; - if (auto result = factories.hasElementForMediaType(ElementFactories::Type::AudioDecoder, "audio/mpeg, mpegversion=(int)1, layer=(int)[1, 3]"_s)) { - audioMpegSupported = true; - m_decoderMimeTypeSet.add("audio/mp1"_s); - m_decoderMimeTypeSet.add("audio/mp3"_s); - m_decoderMimeTypeSet.add("audio/x-mp3"_s); - m_decoderCodecMap.add("audio/mp3"_s, result); - m_decoderCodecMap.add("mp3"_s, result); - } - - if (factories.hasElementForMediaType(ElementFactories::Type::AudioDecoder, "audio/mpeg, mpegversion=(int)2"_s)) { - audioMpegSupported = true; - m_decoderMimeTypeSet.add("audio/mp2"_s); - } - - audioMpegSupported |= isContainerTypeSupported(Configuration::Decoding, "audio/mp4"_s); - if (audioMpegSupported) { - m_decoderMimeTypeSet.add("audio/mpeg"_s); - m_decoderMimeTypeSet.add("audio/x-mpeg"_s); - } - if (matroskaSupported) { m_decoderMimeTypeSet.add("video/x-matroska"_s); @@ -829,22 +869,8 @@ MediaPlayerEnums::SupportsType GStreamerRegistryScanner::isContentTypeSupported(Configuration configuration, const ContentType& contentType, const Vector& contentTypesRequiringHardwareSupport, CaseSensitiveCodecName caseSensitive) const { VideoDecodingLimits* videoDecodingLimits = nullptr; -#ifdef VIDEO_DECODING_LIMIT - static std::optional videoDecodingLimitsDefaults; - static std::once_flag onceFlag; - if (configuration == Configuration::Decoding) { - std::call_once(onceFlag, [] { - videoDecodingLimitsDefaults = videoDecoderLimitsDefaults(); - if (!videoDecodingLimitsDefaults) { - GST_WARNING("Parsing VIDEO_DECODING_LIMIT failed"); - ASSERT_NOT_REACHED(); - return; - } - }); - if (videoDecodingLimitsDefaults) - videoDecodingLimits = &*videoDecodingLimitsDefaults; - } -#endif + if (configuration == Configuration::Decoding) + videoDecodingLimits = resolveVideoDecodingLimits(); using SupportsType = MediaPlayerEnums::SupportsType; @@ -1053,8 +1079,23 @@ videoConfiguration.bitrate, videoConfiguration.framerate); #endif + if (configuration == Configuration::Decoding) { + if (auto* videoDecodingLimits = resolveVideoDecodingLimits()) { + if (videoConfiguration.width > videoDecodingLimits->mediaMaxWidth + || videoConfiguration.height > videoDecodingLimits->mediaMaxHeight + || videoConfiguration.framerate > videoDecodingLimits->mediaMaxFrameRate) { + GST_DEBUG("Video configuration %ux%u@%f exceeds decoding limits %ux%u@%u", + videoConfiguration.width, videoConfiguration.height, videoConfiguration.framerate, + videoDecodingLimits->mediaMaxWidth, videoDecodingLimits->mediaMaxHeight, + videoDecodingLimits->mediaMaxFrameRate); + return { false, false, nullptr }; + } + } + } + #if ENABLE(WPE_PLATFORM) - auto* scrData = screenData(primaryScreenDisplayID()); + Ref platformScreen = PlatformScreen::singleton(); + auto* scrData = platformScreen->screenData(PlatformScreen::singleton()->primaryScreenDisplayID()); if (!scrData || !scrData->screenSupportsHighDynamicRange) { // Check HDR metadata field if (videoConfiguration.hdrMetadataType.has_value()) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/GStreamerVideoSinkCommon.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/GStreamerVideoSinkCommon.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/GStreamerVideoSinkCommon.cpp 2026-03-04 09:41:12.693700000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/GStreamerVideoSinkCommon.cpp 2026-07-09 07:12:42.132795800 +0000 @@ -209,7 +209,7 @@ GRefPtr pad = adoptGRef(gst_element_get_static_pad(appSink, "sink")); - gst_pad_add_probe(pad.get(), static_cast(GST_PAD_PROBE_TYPE_PUSH | GST_PAD_PROBE_TYPE_QUERY_DOWNSTREAM + identifiers.padProbeId = gst_pad_add_probe(pad.get(), static_cast(GST_PAD_PROBE_TYPE_PUSH | GST_PAD_PROBE_TYPE_QUERY_DOWNSTREAM | GST_PAD_PROBE_TYPE_EVENT_FLUSH | GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM), WebKitVideoSinkProbe::doProbe, new WebKitVideoSinkProbe(player), WebKitVideoSinkProbe::deleteUserData); @@ -234,11 +234,12 @@ g_signal_handler_disconnect(appSink, identifiers.newPreroll); g_signal_handler_disconnect(appSink, identifiers.newSample); - if (!identifiers.notifyCaps) - return; - auto pad = adoptGRef(gst_element_get_static_pad(appSink, "sink")); - g_signal_handler_disconnect(pad.get(), identifiers.notifyCaps); + if (identifiers.notifyCaps) + g_signal_handler_disconnect(pad.get(), identifiers.notifyCaps); + + if (identifiers.padProbeId) + gst_pad_remove_probe(pad.get(), identifiers.padProbeId); } #undef GST_CAT_DEFAULT diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/GStreamerVideoSinkCommon.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/GStreamerVideoSinkCommon.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/GStreamerVideoSinkCommon.h 2026-03-04 09:41:12.693700000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/GStreamerVideoSinkCommon.h 2026-07-09 07:12:42.132795800 +0000 @@ -30,6 +30,7 @@ unsigned long newSample { 0 }; unsigned long newPreroll { 0 }; unsigned long notifyCaps { 0 }; + unsigned long padProbeId { 0 }; }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp 2026-02-23 14:40:55.646299600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp 2026-07-09 07:12:42.132795800 +0000 @@ -47,33 +47,30 @@ InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer(unsigned index, GRefPtr&& pad, bool shouldHandleStreamStartEvent) : InbandTextTrackPrivate(CueFormat::WebVTT) - , TrackPrivateBaseGStreamer(TrackPrivateBaseGStreamer::TrackType::Text, this, index, WTF::move(pad), shouldHandleStreamStartEvent) + , TrackPrivateBaseGStreamer(nullptr, GStreamerTrackType::Text, this, index, WTF::move(pad), shouldHandleStreamStartEvent) , m_kind(Kind::Subtitles) { ensureTextTrackDebugCategoryInitialized(); - installUpdateConfigurationHandlers(); } InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer(unsigned index, GRefPtr&& pad, TrackID trackId) : InbandTextTrackPrivate(CueFormat::WebVTT) - , TrackPrivateBaseGStreamer(TrackPrivateBaseGStreamer::TrackType::Text, this, index, WTF::move(pad), trackId) + , TrackPrivateBaseGStreamer(nullptr, GStreamerTrackType::Text, this, index, WTF::move(pad), trackId) , m_kind(Kind::Subtitles) { ensureTextTrackDebugCategoryInitialized(); - installUpdateConfigurationHandlers(); } InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer(unsigned index, GstStream* stream) : InbandTextTrackPrivate(CueFormat::WebVTT) - , TrackPrivateBaseGStreamer(TrackPrivateBaseGStreamer::TrackType::Text, this, index, stream) + , TrackPrivateBaseGStreamer(nullptr, GStreamerTrackType::Text, this, index, stream) { ensureTextTrackDebugCategoryInitialized(); - installUpdateConfigurationHandlers(); - GST_INFO("Track %" PRIu64 " got stream start. GStreamer stream-id: %s", m_id, m_gstStreamId.utf8().data()); + GST_INFO("Track %" PRIu64 " got stream start. GStreamer stream-id: %s", m_data->m_id, m_data->m_gstStreamId.utf8().data()); - GST_DEBUG("Stream %" GST_PTR_FORMAT, m_stream.get()); - auto caps = adoptGRef(gst_stream_get_caps(m_stream.get())); + GST_DEBUG("Stream %" GST_PTR_FORMAT, m_data->m_stream.get()); + auto caps = adoptGRef(gst_stream_get_caps(m_data->m_stream.get())); m_kind = doCapsHaveType(caps.get(), "closedcaption/"_s) ? Kind::Captions : Kind::Subtitles; } @@ -83,11 +80,11 @@ if (!tags) return; - if (!updateTrackIDFromTags(tags)) + if (!m_data->updateTrackIDFromTags(tags)) return; - GST_DEBUG_OBJECT(objectForLogging(), "Text track ID set from container-specific-track-id tag %" G_GUINT64_FORMAT, *m_trackID); - notifyClients([trackID = *m_trackID](auto& client) { + GST_DEBUG_OBJECT(m_data->objectForLogging(), "Text track ID set from container-specific-track-id tag %" G_GUINT64_FORMAT, *m_data->m_trackID); + notifyClients([trackID = *m_data->m_trackID](auto& client) { client.idChanged(trackID); }); } @@ -100,7 +97,7 @@ } RefPtr protectedThis(this); - m_notifier->notify(MainThreadNotification::NewSample, [protectedThis] { + m_data->m_notifier->notify(TrackDataHolder::MainThreadNotification::NewSample, [protectedThis] { protectedThis->notifyTrackOfSample(); }); } @@ -116,17 +113,17 @@ for (auto& sample : samples) { GstBuffer* buffer = gst_sample_get_buffer(sample.get()); if (!buffer) { - GST_WARNING("Track %" PRIu64 " got sample with no buffer.", m_id); + GST_WARNING("Track %" PRIu64 " got sample with no buffer.", m_data->m_id); continue; } GstMappedBuffer mappedBuffer(buffer, GST_MAP_READ); ASSERT(mappedBuffer); if (!mappedBuffer) { - GST_WARNING("Track %" PRIu64 " unable to map buffer.", m_id); + GST_WARNING("Track %" PRIu64 " unable to map buffer.", m_data->m_id); continue; } - GST_INFO("Track %" PRIu64 " parsing sample: %.*s", m_id, static_cast(mappedBuffer.size()), + GST_INFO("Track %" PRIu64 " parsing sample: %.*s", m_data->m_id, static_cast(mappedBuffer.size()), reinterpret_cast(mappedBuffer.data())); ASSERT(isMainThread()); ASSERT(!hasClients() || hasOneClient()); @@ -136,6 +133,26 @@ } } +TrackID InbandTextTrackPrivateGStreamer::id() const +{ + return m_data->m_trackID.value_or(m_data->m_id); +} + +String InbandTextTrackPrivateGStreamer::label() const +{ + return m_data->m_label; +} + +String InbandTextTrackPrivateGStreamer::language() const +{ + return m_data->m_language; +} + +int InbandTextTrackPrivateGStreamer::trackIndex() const +{ + return m_data->m_index; +} + #undef GST_CAT_DEFAULT } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h 2026-02-23 14:40:55.646299600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h 2026-07-09 07:12:42.132795800 +0000 @@ -47,9 +47,9 @@ return adoptRef(*new InbandTextTrackPrivateGStreamer(index, WTF::move(pad), trackId)); } - static Ref create(ThreadSafeWeakPtr&&, unsigned index, GRefPtr pad) + static Ref create(ThreadSafeWeakPtr&&, unsigned index, GRefPtr pad, TrackID id) { - return create(index, WTF::move(pad)); + return create(index, WTF::move(pad), id); } static Ref create(ThreadSafeWeakPtr&&, unsigned index, GstStream* stream) @@ -58,15 +58,14 @@ } Kind kind() const final { return m_kind; } - TrackID id() const final { return m_trackID.value_or(m_id); } + TrackID id() const final; std::optional trackUID() const final { return std::nullopt; } - String label() const final { return m_label; } - String language() const final { return m_language; } - int trackIndex() const final { return m_index; } + String label() const final; + String language() const final; + int trackIndex() const final; void handleSample(GRefPtr&&); -protected: void tagsChanged(GRefPtr&&) final; private: diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp 2026-04-13 08:46:08.975497500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp 2026-07-09 07:12:42.136795800 +0000 @@ -25,6 +25,7 @@ #include "config.h" #include "MediaPlayerPrivateGStreamer.h" +#include "TrackPrivateBaseGStreamer.h" #if ENABLE(VIDEO) && USE(GSTREAMER) @@ -225,14 +226,9 @@ m_sinkTaskQueue.startAborting(); - for (auto& track : m_audioTracks.values()) - track->disconnect(); - - for (auto& track : m_textTracks.values()) - track->disconnect(); - - for (auto& track : m_videoTracks.values()) - track->disconnect(); + m_audioTracks.clear(); + m_videoTracks.clear(); + m_textTracks.clear(); if (m_fillTimer.isActive()) m_fillTimer.stop(); @@ -253,9 +249,6 @@ if (m_videoSink) g_signal_handlers_disconnect_matched(m_videoSink.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this); - if (m_volumeElement) - g_signal_handlers_disconnect_matched(m_volumeElement.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this); - // This will release the GStreamer thread from m_drawCondition in non AC mode in case there's an ongoing triggerRepaint call // waiting there, and ensure that any triggerRepaint call reaching the lock won't wait on m_drawCondition. cancelRepaint(true); @@ -270,14 +263,20 @@ // The change to GST_STATE_NULL state is always synchronous. So after this gets executed we don't need to worry // about handlers running in the GStreamer thread. if (m_pipeline) { - unregisterPipeline(m_pipeline); + unregisterPipeline(m_originalPipelineName); gst_element_set_state(m_pipeline.get(), GST_STATE_NULL); + m_source = nullptr; + auto bus = adoptGRef(gst_pipeline_get_bus(GST_PIPELINE(m_pipeline.get()))); gst_bus_disable_sync_message_emission(bus.get()); disconnectSimpleBusMessageCallback(m_pipeline.get()); g_signal_handlers_disconnect_matched(m_pipeline.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this); + m_source = nullptr; + m_videoSink = nullptr; + m_audioSink = nullptr; + m_textSink = nullptr; m_pipeline = nullptr; } @@ -388,13 +387,27 @@ m_isDelayingLoad = true; } - // Reset network and ready states. Those will be set properly once - // the pipeline pre-rolled. - m_networkState = m_isDelayingLoad ? MediaPlayer::NetworkState::Idle : MediaPlayer::NetworkState::Loading; - player->networkStateChanged(); - m_readyState = MediaPlayer::ReadyState::HaveNothing; - player->readyStateChanged(); + // Reset network and ready states. Those will be set properly once the pipeline pre-rolled. + // Those states are managed directly by the MSE player sub-class. + if (!isMediaSource()) { + m_networkState = m_isDelayingLoad ? MediaPlayer::NetworkState::Idle : MediaPlayer::NetworkState::Loading; + player->networkStateChanged(); + m_readyState = MediaPlayer::ReadyState::HaveNothing; + player->readyStateChanged(); + } + m_areVolumeAndMuteInitialized = false; + m_isEndReached = false; + m_isCachedPositionValid = false; + m_cachedDuration = MediaTime::invalidTime(); + m_isSeeking = false; + m_isSeekPending = false; + m_seekTarget = { }; + +#if ENABLE(ENCRYPTED_MEDIA) + if (m_cdmContext) + gst_element_set_context(GST_ELEMENT(m_pipeline.get()), m_cdmContext.get()); +#endif if (!m_isDelayingLoad) commitLoad(); @@ -605,8 +618,10 @@ } auto seekFlags = static_cast(flag | GST_SEEK_FLAG_ACCURATE); - if (rate >= 0.0 && startTime >= duration()) { - GST_DEBUG_OBJECT(pipeline(), "Seek requested beyond duration, triggering EOS handler"); + // Seeking towards the end is not well supported in oggdemux, sometimes it receives EOS + // while trying to retrieve a chain and thus disables seeking in push mode. + if (rate >= 0 && startTime == duration() && m_containerType == ContainerType::Ogg) { + GST_DEBUG_OBJECT(pipeline(), "Seek requested at duration for ogg media, triggering EOS handler"); didEnd(); return false; } @@ -1214,23 +1229,22 @@ ASSERT(m_isLegacyPlaybin); - using TrackType = TrackPrivateBaseGStreamer::TrackType; Variant>*, TrackIDHashMap>*, TrackIDHashMap>*> variantTracks = static_cast>*>(0); - auto type(static_cast(variantTracks.index())); + auto type(static_cast(variantTracks.index())); ASCIILiteral typeName; bool* hasType; switch (type) { - case TrackType::Audio: + case GStreamerTrackType::Audio: typeName = "audio"_s; hasType = &m_hasAudio; variantTracks = &m_audioTracks; break; - case TrackType::Video: + case GStreamerTrackType::Video: typeName = "video"_s; hasType = &m_hasVideo; variantTracks = &m_videoTracks; break; - case TrackType::Text: + case GStreamerTrackType::Text: typeName = "text"_s; hasType = nullptr; variantTracks = &m_textTracks; @@ -1241,7 +1255,7 @@ auto& tracks = *std::get>*>(variantTracks); // Ignore notifications after a EOS. We don't want the tracks to disappear when the video is finished. - if (m_isEndReached && (type == TrackType::Audio || type == TrackType::Video)) + if (m_isEndReached && (type == GStreamerTrackType::Audio || type == GStreamerTrackType::Video)) return; unsigned numberOfTracks = 0; @@ -1256,7 +1270,7 @@ if (oldHasType != *hasType) player->characteristicChanged(); - if (*hasType && type == TrackType::Video) + if (*hasType && type == GStreamerTrackType::Video) player->sizeChanged(); } @@ -1288,20 +1302,20 @@ } } - auto track = TrackPrivateType::create(*this, i, GRefPtr(pad)); + auto track = TrackPrivateType::create(*this, i, GRefPtr(pad), streamId); ASSERT(track->streamId() == streamId); - if (!track->trackIndex() && (type == TrackType::Audio || type == TrackType::Video)) + if (!track->trackIndex() && (type == GStreamerTrackType::Audio || type == GStreamerTrackType::Video)) track->setActive(true); Variant variantTrack(&track.get()); switch (variantTrack.index()) { - case TrackType::Audio: + case GStreamerTrackType::Audio: player->addAudioTrack(*std::get(variantTrack)); break; - case TrackType::Video: + case GStreamerTrackType::Video: player->addVideoTrack(*std::get(variantTrack)); break; - case TrackType::Text: + case GStreamerTrackType::Text: player->addTextTrack(*std::get(variantTrack)); break; } @@ -1375,8 +1389,9 @@ auto currentName = String(objectName.span()); auto tokens = currentName.split('-'); auto newName = makeString(tokens[0], '-', elementId, '-', tokens.last()); - GST_DEBUG_OBJECT(m_pipeline.get(), "Renaming to %s", newName.utf8().data()); - gst_object_set_name(GST_OBJECT_CAST(m_pipeline.get()), newName.utf8().data()); + auto nameCString = newName.utf8(); + GST_DEBUG_OBJECT(m_pipeline.get(), "Renaming to %s", nameCString.data()); + gst_object_set_name(GST_OBJECT_CAST(m_pipeline.get()), nameCString.data()); } void MediaPlayerPrivateGStreamer::handleTextSample(GRefPtr&& sample, TrackID streamId) @@ -1524,7 +1539,8 @@ void MediaPlayerPrivateGStreamer::timeChanged(const MediaTime& seekedTime) { - updateStates(); + if (!isMediaSource()) + updateStates(); GST_DEBUG_OBJECT(pipeline(), "Emitting timeChanged notification (seekCompleted:%d)", seekedTime.isValid()); if (RefPtr player = m_player.get()) { if (seekedTime.isValid()) @@ -1943,13 +1959,6 @@ return false; } -void MediaPlayerPrivateGStreamer::handleSyncErrorMessage(GstMessage*) -{ - GST_DEBUG_OBJECT(pipeline(), "Accounting queued sync error"); - // This attribute is decremented later from handleMessage() in the main thread. - m_queuedSyncErrors.exchangeAdd(1); -} - // Returns the size of the video. FloatSize MediaPlayerPrivateGStreamer::naturalSize() const { @@ -1992,20 +2001,22 @@ return; } - if (!m_volumeElement) + auto streamVolume = GST_STREAM_VOLUME(m_pipeline.get()); + if (!streamVolume) return; GST_DEBUG_OBJECT(pipeline(), "Setting volume: %f", volume); - gst_stream_volume_set_volume(m_volumeElement.get(), GST_STREAM_VOLUME_FORMAT_LINEAR, volume); + gst_stream_volume_set_volume(streamVolume, GST_STREAM_VOLUME_FORMAT_LINEAR, volume); configureMediaStreamAudioTracks(); } float MediaPlayerPrivateGStreamer::volume() const { - if (!m_volumeElement) + auto streamVolume = GST_STREAM_VOLUME(m_pipeline.get()); + if (!streamVolume) return 0; - auto volume = gst_stream_volume_get_volume(m_volumeElement.get(), GST_STREAM_VOLUME_FORMAT_LINEAR); + auto volume = gst_stream_volume_get_volume(streamVolume, GST_STREAM_VOLUME_FORMAT_LINEAR); GST_DEBUG_OBJECT(pipeline(), "Volume: %f", volume); return volume; } @@ -2013,7 +2024,7 @@ void MediaPlayerPrivateGStreamer::notifyPlayerOfVolumeChange() { RefPtr player = m_player.get(); - if (!player || !m_volumeElement) + if (!player) return; // get_volume() can return values superior to 1.0 if the user applies software user gain via @@ -2031,7 +2042,6 @@ if (player->isPlayerShuttingDown()) return; - // This is called when m_volumeElement receives the notify::volume signal. GST_DEBUG_OBJECT(player->pipeline(), "Volume changed to: %f", player->volume()); player->m_notifier->notify(MainThreadNotification::VolumeChanged, [player] { @@ -2053,23 +2063,31 @@ { GST_DEBUG_OBJECT(pipeline(), "Attempting to set muted state to %s", boolForPrinting(shouldMute)); - if (!m_volumeElement || shouldMute == isMuted()) + if (shouldMute == isMuted()) + return; + + auto streamVolume = GST_STREAM_VOLUME(m_pipeline.get()); + if (!streamVolume) return; GST_INFO_OBJECT(pipeline(), "Setting muted state to %s", boolForPrinting(shouldMute)); - g_object_set(m_volumeElement.get(), "mute", static_cast(shouldMute), nullptr); + g_object_set(streamVolume, "mute", static_cast(shouldMute), nullptr); configureMediaStreamAudioTracks(); } void MediaPlayerPrivateGStreamer::notifyPlayerOfMute() { RefPtr player = m_player.get(); - if (!player || !m_volumeElement) + if (!player) + return; + + auto streamVolume = GST_STREAM_VOLUME(m_pipeline.get()); + if (!streamVolume) return; gboolean value; bool isMuted; - g_object_get(m_volumeElement.get(), "mute", &value, nullptr); + g_object_get(streamVolume, "mute", &value, nullptr); isMuted = value; if (isMuted == m_isMuted) return; @@ -2081,7 +2099,6 @@ void MediaPlayerPrivateGStreamer::muteChangedCallback(MediaPlayerPrivateGStreamer* player) { - // This is called when m_volumeElement receives the notify::mute signal. player->m_notifier->notify(MainThreadNotification::MuteChanged, [player] { player->notifyPlayerOfMute(); }); @@ -2116,68 +2133,54 @@ GST_LOG_OBJECT(pipeline(), "Message %s received from element %s", GST_MESSAGE_TYPE_NAME(message), GST_MESSAGE_SRC_NAME(message)); switch (GST_MESSAGE_TYPE(message)) { - case GST_MESSAGE_ERROR: - { - auto onScopeExit = makeScopeExit([this] { - GST_DEBUG_OBJECT(pipeline(), "Decreasing m_queuedSyncErrors"); - m_queuedSyncErrors.exchangeSub(1); - }); - - gst_message_parse_error(message, &err.outPtr(), nullptr); - - if (m_shouldResetPipeline || m_didErrorOccur || m_ignoreErrors) { - GST_WARNING_OBJECT(pipeline(), "Ignoring error: %s (url=%s) (code=%d)", err->message, m_url.string().utf8().data(), err->code); - // Deferred reset of m_ignoreErrors because there were queued sync errors not yet processed and - // we're processing the last one now. - if (m_ignoreErrors && m_queuedSyncErrors.loadFullyFenced() == 1) { - m_ignoreErrors = false; - GST_DEBUG_OBJECT(pipeline(), "Last queued error processed while on ignoring state. Not ignoring errors anymore."); - } - break; - } + case GST_MESSAGE_ERROR: { + gst_message_parse_error(message, &err.outPtr(), nullptr); - GST_ERROR_OBJECT(pipeline(), "%s (url=%s) (code=%d)", err->message, m_url.string().utf8().data(), err->code); + if (m_shouldResetPipeline || m_didErrorOccur) { + GST_WARNING_OBJECT(pipeline(), "Ignoring error: %s (url=%s) (code=%d)", err->message, m_url.string().utf8().data(), err->code); + break; + } + + GST_ERROR_OBJECT(pipeline(), "%s (url=%s) (code=%d)", err->message, m_url.string().utf8().data(), err->code); - m_errorMessage = String(byteCast(unsafeSpan(err->message))); + m_errorMessage = String(byteCast(unsafeSpan(err->message))); #if ENABLE(MEDIA_TELEMETRY) - MediaTelemetryReport::singleton().reportPlaybackState(MediaTelemetryReport::AVPipelineState::PlaybackError, - m_errorMessage); + MediaTelemetryReport::singleton().reportPlaybackState(MediaTelemetryReport::AVPipelineState::PlaybackError, m_errorMessage); #endif - error = MediaPlayer::NetworkState::Empty; - if (g_error_matches(err.get(), GST_STREAM_ERROR, GST_STREAM_ERROR_CODEC_NOT_FOUND) - || g_error_matches(err.get(), GST_STREAM_ERROR, GST_STREAM_ERROR_DECRYPT) - || g_error_matches(err.get(), GST_STREAM_ERROR, GST_STREAM_ERROR_DECRYPT_NOKEY) - || g_error_matches(err.get(), GST_STREAM_ERROR, GST_STREAM_ERROR_WRONG_TYPE) - || g_error_matches(err.get(), GST_STREAM_ERROR, GST_STREAM_ERROR_FAILED) - || g_error_matches(err.get(), GST_CORE_ERROR, GST_CORE_ERROR_MISSING_PLUGIN) - || g_error_matches(err.get(), GST_CORE_ERROR, GST_CORE_ERROR_PAD) - || g_error_matches(err.get(), GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_NOT_FOUND)) - error = MediaPlayer::NetworkState::FormatError; - else if (g_error_matches(err.get(), GST_STREAM_ERROR, GST_STREAM_ERROR_TYPE_NOT_FOUND)) { - GST_ERROR_OBJECT(pipeline(), "Decode error, let the Media element emit a stalled event."); - m_loadingStalled = true; - error = MediaPlayer::NetworkState::DecodeError; - attemptNextLocation = true; - } else if (err->domain == GST_STREAM_ERROR - || g_error_matches(err.get(), GST_STREAM_ERROR, GST_STREAM_ERROR_DECODE)) { - error = MediaPlayer::NetworkState::DecodeError; - attemptNextLocation = true; - } else if (err->domain == GST_RESOURCE_ERROR) - error = MediaPlayer::NetworkState::NetworkError; - - if (attemptNextLocation) - issueError = !loadNextLocation(); - if (issueError) { - m_didErrorOccur = true; - if (m_networkState != error) { - m_networkState = error; - if (player) - player->networkStateChanged(); - } + error = MediaPlayer::NetworkState::Empty; + if (g_error_matches(err.get(), GST_STREAM_ERROR, GST_STREAM_ERROR_CODEC_NOT_FOUND) + || g_error_matches(err.get(), GST_STREAM_ERROR, GST_STREAM_ERROR_DECRYPT) + || g_error_matches(err.get(), GST_STREAM_ERROR, GST_STREAM_ERROR_DECRYPT_NOKEY) + || g_error_matches(err.get(), GST_STREAM_ERROR, GST_STREAM_ERROR_WRONG_TYPE) + || g_error_matches(err.get(), GST_STREAM_ERROR, GST_STREAM_ERROR_FAILED) + || g_error_matches(err.get(), GST_CORE_ERROR, GST_CORE_ERROR_MISSING_PLUGIN) + || g_error_matches(err.get(), GST_CORE_ERROR, GST_CORE_ERROR_PAD) + || g_error_matches(err.get(), GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_NOT_FOUND)) + error = MediaPlayer::NetworkState::FormatError; + else if (g_error_matches(err.get(), GST_STREAM_ERROR, GST_STREAM_ERROR_TYPE_NOT_FOUND)) { + GST_ERROR_OBJECT(pipeline(), "Decode error, let the Media element emit a stalled event."); + m_loadingStalled = true; + error = MediaPlayer::NetworkState::DecodeError; + attemptNextLocation = true; + } else if (err->domain == GST_STREAM_ERROR || g_error_matches(err.get(), GST_STREAM_ERROR, GST_STREAM_ERROR_DECODE)) { + error = MediaPlayer::NetworkState::DecodeError; + attemptNextLocation = true; + } else if (err->domain == GST_RESOURCE_ERROR) + error = MediaPlayer::NetworkState::NetworkError; + + if (attemptNextLocation) + issueError = !loadNextLocation(); + if (issueError) { + m_didErrorOccur = true; + if (m_networkState != error) { + m_networkState = error; + if (player) + player->networkStateChanged(); } - break; } + break; + } case GST_MESSAGE_WARNING: gst_message_parse_warning(message, &err.outPtr(), nullptr); GST_WARNING_OBJECT(pipeline(), "%s (url=%s) (code=%d)", err->message, m_url.string().utf8().data(), err->code); @@ -3475,7 +3478,9 @@ static Atomic pipelineId; - m_pipeline = makeGStreamerElement(playbinName, makeString(type, '-', elementId, '-', pipelineId.exchangeAdd(1))); + // Keep track of the original pipeline name because the MediaElement might be renamed, leading to the pipeline being renamed as well. + m_originalPipelineName = makeString(type, '-', elementId, '-', pipelineId.exchangeAdd(1)); + m_pipeline = makeGStreamerElement(playbinName, m_originalPipelineName); if (!m_pipeline) { GST_WARNING("%s not found, make sure to install gst-plugins-base", playbinName.characters()); loadingFailed(MediaPlayer::NetworkState::FormatError, MediaPlayer::ReadyState::HaveNothing, true); @@ -3486,7 +3491,7 @@ auto identifier = makeString(LOGIDENTIFIER.objectIdentifier); GST_INFO_OBJECT(m_pipeline.get(), "WebCore logs identifier for this pipeline is: %s", identifier.convertToASCIIUppercase().ascii().data()); #endif - registerActivePipeline(m_pipeline); + registerActivePipeline(m_pipeline, m_originalPipelineName); if (isMediaStream) { auto clock = adoptGRef(gst_system_clock_obtain()); @@ -3495,7 +3500,22 @@ gst_element_set_start_time(m_pipeline.get(), GST_CLOCK_TIME_NONE); } - setStreamVolumeElement(GST_STREAM_VOLUME(m_pipeline.get())); + auto streamVolume = GST_STREAM_VOLUME(m_pipeline.get()); + + // We don't set the initial volume because we trust the sink to keep it for us. See + // https://bugs.webkit.org/show_bug.cgi?id=118974 for more information. + if (!player->platformVolumeConfigurationRequired()) { + GST_DEBUG_OBJECT(pipeline(), "Setting stream volume to %f", player->volume()); + gst_stream_volume_set_volume(streamVolume, GST_STREAM_VOLUME_FORMAT_LINEAR, static_cast(player->volume())); + } else + GST_DEBUG_OBJECT(pipeline(), "Not setting stream volume, trusting system one"); + + m_isMuted = player->muted(); + GST_DEBUG_OBJECT(pipeline(), "Setting stream muted %s", boolForPrinting(m_isMuted)); + g_object_set(streamVolume, "mute", static_cast(m_isMuted), nullptr); + + g_signal_connect_swapped(streamVolume, "notify::volume", G_CALLBACK(volumeChangedCallback), this); + g_signal_connect_swapped(streamVolume, "notify::mute", G_CALLBACK(muteChangedCallback), this); GST_INFO_OBJECT(pipeline(), "Using legacy playbin element: %s", boolForPrinting(m_isLegacyPlaybin)); @@ -3536,10 +3556,6 @@ player->handleStreamCollectionMessage(message); }), this); - g_signal_connect_swapped(bus.get(), "sync-message::error", G_CALLBACK(+[](MediaPlayerPrivateGStreamer* player, GstMessage* message) { - player->handleSyncErrorMessage(message); - }), this); - g_object_set(m_pipeline.get(), "mute", static_cast(player->muted()), nullptr); // From GStreamer 1.22.0, uridecodebin3 is created in playbin3's _init(), so "element-setup" isn't called with it. @@ -4401,31 +4417,6 @@ return m_videoSink.get(); } -void MediaPlayerPrivateGStreamer::setStreamVolumeElement(GstStreamVolume* volume) -{ - RefPtr player = m_player.get(); - if (!player) - return; - - ASSERT(!m_volumeElement); - m_volumeElement = volume; - - // We don't set the initial volume because we trust the sink to keep it for us. See - // https://bugs.webkit.org/show_bug.cgi?id=118974 for more information. - if (!player->platformVolumeConfigurationRequired()) { - GST_DEBUG_OBJECT(pipeline(), "Setting stream volume to %f", player->volume()); - gst_stream_volume_set_volume(m_volumeElement.get(), GST_STREAM_VOLUME_FORMAT_LINEAR, static_cast(player->volume())); - } else - GST_DEBUG_OBJECT(pipeline(), "Not setting stream volume, trusting system one"); - - m_isMuted = player->muted(); - GST_DEBUG_OBJECT(pipeline(), "Setting stream muted %s", boolForPrinting(m_isMuted)); - g_object_set(m_volumeElement.get(), "mute", static_cast(m_isMuted), nullptr); - - g_signal_connect_swapped(m_volumeElement.get(), "notify::volume", G_CALLBACK(volumeChangedCallback), this); - g_signal_connect_swapped(m_volumeElement.get(), "notify::mute", G_CALLBACK(muteChangedCallback), this); -} - bool MediaPlayerPrivateGStreamer::updateVideoSinkStatistics() { if (!m_videoSink) @@ -4459,7 +4450,7 @@ std::optional MediaPlayerPrivateGStreamer::videoPlaybackQualityMetrics() { - if (!updateVideoSinkStatistics()) + if (!m_isEndReached && !updateVideoSinkStatistics()) return std::nullopt; uint32_t corruptedVideoFrames = 0; @@ -4578,10 +4569,12 @@ RELEASE_ASSERT(m_cdmInstance); m_cdmInstance->setPlayer(m_player.get()); - GRefPtr context = adoptGRef(gst_context_new("drm-cdm-proxy", FALSE)); - GstStructure* contextStructure = gst_context_writable_structure(context.get()); - gst_structure_set(contextStructure, "cdm-proxy", G_TYPE_POINTER, m_cdmInstance->proxy().get(), nullptr); - gst_element_set_context(GST_ELEMENT(m_pipeline.get()), context.get()); + if (!m_cdmContext) { + m_cdmContext = adoptGRef(gst_context_new("drm-cdm-proxy", TRUE)); + GstStructure* contextStructure = gst_context_writable_structure(m_cdmContext.get()); + gst_structure_set(contextStructure, "cdm-proxy", G_TYPE_POINTER, m_cdmInstance->proxy().get(), nullptr); + } + gst_element_set_context(GST_ELEMENT(m_pipeline.get()), m_cdmContext.get()); GST_DEBUG_OBJECT(m_pipeline.get(), "CDM proxy instance %p dispatched as context", m_cdmInstance->proxy().get()); @@ -4602,8 +4595,9 @@ ASSERT(m_cdmInstance == &instance); GST_DEBUG_OBJECT(m_pipeline.get(), "detaching CDM instance %p, setting empty context", m_cdmInstance.get()); m_cdmInstance = nullptr; - GRefPtr context = adoptGRef(gst_context_new("drm-cdm-proxy", FALSE)); - gst_element_set_context(GST_ELEMENT(m_pipeline.get()), context.get()); + m_cdmContext = nullptr; + auto emptyContext = adoptGRef(gst_context_new("drm-cdm-proxy", TRUE)); + gst_element_set_context(GST_ELEMENT(m_pipeline.get()), emptyContext.get()); } void MediaPlayerPrivateGStreamer::attemptToDecryptWithInstance([[maybe_unused]] CDMInstance& instance) @@ -4685,11 +4679,15 @@ metadata.presentedFrames = m_sampleCount; if (GST_BUFFER_PTS_IS_VALID(buffer)) { - auto segment = gst_sample_get_segment(m_sample.get()); - RELEASE_ASSERT(segment); - uint64_t streamTime; - if (int sign = gst_segment_to_stream_time_full(segment, GST_FORMAT_TIME, GST_BUFFER_PTS(buffer), &streamTime)) - metadata.mediaTime = sign * fromGstClockTime(streamTime).toDouble(); + if (isMediaStreamPlayer()) + metadata.mediaTime = currentTime().toDouble(); + else { + auto segment = gst_sample_get_segment(m_sample.get()); + RELEASE_ASSERT(segment); + uint64_t streamTime; + if (int sign = gst_segment_to_stream_time_full(segment, GST_FORMAT_TIME, GST_BUFFER_PTS(buffer), &streamTime)) + metadata.mediaTime = sign * fromGstClockTime(streamTime).toDouble(); + } } // FIXME: presentationTime and expectedDisplayTime might not always have the same value, we should try getting more precise values. diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h 2026-04-13 08:46:08.975497500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h 2026-07-09 07:12:42.136795800 +0000 @@ -220,7 +220,6 @@ bool handleNeedContextMessage(GstMessage*); void handleStreamCollectionMessage(GstMessage*); - void handleSyncErrorMessage(GstMessage*); void handleMessage(GstMessage*); void triggerRepaint(GRefPtr&&); @@ -325,8 +324,6 @@ GstElement* videoSink() const { return m_videoSink.get(); } - void setStreamVolumeElement(GstStreamVolume*); - void repaint(); void cancelRepaint(bool destroying = false); @@ -363,8 +360,10 @@ bool isPipelineWaitingPreroll(GstState current, GstState pending, GstStateChangeReturn) const; bool isPipelineWaitingPreroll() const; - void didEnd(); + virtual void didEnd(); + void tearDown(bool clearMediaPlayer); + URL m_url; Ref> m_notifier; ThreadSafeWeakPtr m_player; String m_referrer; @@ -415,12 +414,13 @@ OptionSet m_textureMapperFlags; #endif - GRefPtr m_volumeElement; GRefPtr m_audioSink; GRefPtr m_videoSink; GRefPtr m_pipeline; IntSize m_size; + String m_originalPipelineName; + MediaPlayer::ReadyState m_readyState { MediaPlayer::ReadyState::HaveNothing }; mutable MediaPlayer::NetworkState m_networkState { MediaPlayer::NetworkState::Empty }; @@ -448,8 +448,6 @@ #endif std::optional m_videoDecoderPlatform; - bool m_ignoreErrors { false }; - Atomic m_queuedSyncErrors { 0 }; TrackIDHashMap> m_audioTracks; TrackIDHashMap> m_videoTracks; @@ -497,7 +495,6 @@ Function m_task = Function(); }; - void tearDown(bool clearMediaPlayer); bool isPlayerShuttingDown() const { return m_isPlayerShuttingDown.load(); } MediaTime maxTimeLoaded() const; bool setVideoSourceOrientation(ImageOrientation); @@ -574,6 +571,8 @@ void initializationDataEncountered(InitData&&); InitData parseInitDataFromProtectionMessage(GstMessage*); bool waitForCDMAttachment(); + + GRefPtr m_cdmContext; #endif #if ENABLE(MEDIA_TELEMETRY) @@ -615,7 +614,6 @@ bool m_hasWebKitWebSrcSentEOS { false }; mutable unsigned long long m_totalBytes { 0 }; - URL m_url; bool m_shouldPreservePitch { false }; bool m_isLegacyPlaybin; #if ENABLE(MEDIA_STREAM) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp 2026-04-07 13:23:55.929015000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp 2026-07-09 07:12:42.136795800 +0000 @@ -42,6 +42,20 @@ namespace WebCore { +static GRefPtr getAllTags(const GRefPtr& pad) +{ + auto allTags = adoptGRef(gst_tag_list_new_empty()); + GstTagList* taglist = nullptr; + for (unsigned i = 0;; i++) { + GRefPtr tagsEvent = adoptGRef(gst_pad_get_sticky_event(pad.get(), GST_EVENT_TAG, i)); + if (!tagsEvent) + break; + gst_event_parse_tag(tagsEvent.get(), &taglist); + allTags = adoptGRef(gst_tag_list_merge(allTags.get(), taglist, GST_TAG_MERGE_APPEND)); + } + return allTags; +} + static GRefPtr findBestUpstreamPad(GRefPtr pad) { if (!pad) @@ -58,62 +72,109 @@ return sinkPad; } -TrackPrivateBaseGStreamer::TrackPrivateBaseGStreamer(TrackType type, TrackPrivateBase* owner, unsigned index, GRefPtr&& pad, bool shouldHandleStreamStartEvent) +static std::optional getTag(GstTagList* tags, ASCIILiteral tagName) +{ + GUniqueOutPtr tagValue; + if (!gst_tag_list_get_string(tags, tagName.characters(), &tagValue.outPtr())) + return std::nullopt; + + GST_DEBUG("Track got %s %s.", tagName.characters(), tagValue.get()); + return String(byteCast(unsafeSpan(tagValue.get()))); +} + +static std::optional getLanguageCode(GstTagList* tags) +{ + auto language = getTag(tags, ASCIILiteral::fromLiteralUnsafe(GST_TAG_LANGUAGE_CODE)); + if (!language) + return std::nullopt; + + auto convertedLanguage = CStringView::unsafeFromUTF8(gst_tag_get_language_code_iso_639_1(language->utf8().data())); + GST_DEBUG("Converted track's language code to %s.", convertedLanguage.utf8()); + return String(convertedLanguage.span()); +} + +TrackDataHolder::TrackDataHolder(TrackPrivateBaseGStreamer& track) : m_notifier(MainThreadNotifier::create()) - , m_index(index) - , m_type(type) - , m_owner(owner) - , m_shouldHandleStreamStartEvent(shouldHandleStreamStartEvent) + , m_track(track) { - setPad(WTF::move(pad)); - ASSERT(m_pad); +} + +TrackPrivateBaseGStreamer::TrackPrivateBaseGStreamer(ThreadSafeWeakPtr&& player, GStreamerTrackType type, TrackPrivateBase* owner, unsigned index, GRefPtr&& pad, bool shouldHandleStreamStartEvent) + : m_data(TrackDataHolder::create(*this)) +{ + m_data->m_player = WTF::move(player); + m_data->m_index = index; + m_data->m_type = type; + m_data->m_owner = owner; + m_data->m_shouldHandleStreamStartEvent = shouldHandleStreamStartEvent; + ASSERT(pad); + m_data->setPad(WTF::move(pad)); // We can't call notifyTrackOfTagsChanged() directly, because we need tagsChanged() to setup m_tags. - tagsChanged(); + m_data->tagsChanged(); + + m_data->installUpdateConfigurationHandlers(); } -TrackPrivateBaseGStreamer::TrackPrivateBaseGStreamer(TrackType type, TrackPrivateBase* owner, unsigned index, GRefPtr&& pad, TrackID trackId) - : m_notifier(MainThreadNotifier::create()) - , m_index(index) - , m_id(trackId) - , m_type(type) - , m_owner(owner) - , m_shouldUsePadStreamId(false) - , m_shouldHandleStreamStartEvent(false) +TrackPrivateBaseGStreamer::TrackPrivateBaseGStreamer(ThreadSafeWeakPtr&& player, GStreamerTrackType type, TrackPrivateBase* owner, unsigned index, GRefPtr&& pad, TrackID trackId) + : m_data(TrackDataHolder::create(*this)) { - setPad(WTF::move(pad)); - ASSERT(m_pad); + m_data->m_player = WTF::move(player); + m_data->m_index = index; + m_data->m_id = trackId; + m_data->m_type = type; + m_data->m_owner = owner; + m_data->m_shouldUsePadStreamId = false; + m_data->m_shouldHandleStreamStartEvent = false; + + ASSERT(pad); + m_data->setPad(WTF::move(pad)); // We can't call notifyTrackOfTagsChanged() directly, because we need tagsChanged() to setup m_tags. - tagsChanged(); + m_data->tagsChanged(); + + m_data->installUpdateConfigurationHandlers(); } -TrackPrivateBaseGStreamer::TrackPrivateBaseGStreamer(TrackType type, TrackPrivateBase* owner, unsigned index, GstStream* stream) - : m_notifier(MainThreadNotifier::create()) - , m_index(index) - , m_gstStreamId(byteCast(unsafeSpan(gst_stream_get_stream_id(stream)))) - , m_id(parseStreamId(m_gstStreamId).value_or(index)) - , m_stream(stream) - , m_type(type) - , m_owner(owner) -{ - ASSERT(m_stream); - - g_signal_connect_swapped(m_stream.get(), "notify::tags", G_CALLBACK(+[](TrackPrivateBaseGStreamer* track) { - track->tagsChanged(); - }), this); +TrackPrivateBaseGStreamer::TrackPrivateBaseGStreamer(ThreadSafeWeakPtr&& player, GStreamerTrackType type, TrackPrivateBase* owner, unsigned index, GstStream* stream) + : m_data(TrackDataHolder::create(*this)) +{ + ASSERT(stream); + + m_data->m_player = WTF::move(player); + m_data->m_index = index; + m_data->m_gstStreamId = byteCast(unsafeSpan(gst_stream_get_stream_id(stream))); + m_data->m_id = parseStreamId(m_data->m_gstStreamId).value_or(index); + m_data->m_type = type; + m_data->m_owner = owner; + + m_data->setStream(GRefPtr(stream)); // We can't call notifyTrackOfTagsChanged() directly, because we need tagsChanged() to setup m_tags. - tagsChanged(); + m_data->tagsChanged(); + + m_data->installUpdateConfigurationHandlers(); +} + +TrackPrivateBaseGStreamer::~TrackPrivateBaseGStreamer() +{ + disconnect(); } void TrackPrivateBaseGStreamer::setPad(GRefPtr&& pad) { + m_data->setPad(WTF::move(pad)); +} + +void TrackDataHolder::setPad(GRefPtr&& pad) +{ ASSERT(isMainThread()); if (m_bestUpstreamPad && m_eventProbe) gst_pad_remove_probe(m_bestUpstreamPad.get(), m_eventProbe); + g_clear_signal_handler(&m_padTagsNotifyHandlerId, m_pad.get()); + g_clear_signal_handler(&m_padCapsNotifyHandlerId, m_pad.get()); m_pad = WTF::move(pad); m_bestUpstreamPad = findBestUpstreamPad(m_pad); m_gstStreamId = byteCast(unsafeSpan(gst_pad_get_stream_id(m_pad.get()))); @@ -124,23 +185,31 @@ if (!m_bestUpstreamPad) return; - m_eventProbe = gst_pad_add_probe(m_bestUpstreamPad.get(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, reinterpret_cast(+[](GstPad*, GstPadProbeInfo* info, TrackPrivateBaseGStreamer* track) -> GstPadProbeReturn { - auto* event = gst_pad_probe_info_get_event(info); + m_eventProbe = gst_pad_add_probe(m_bestUpstreamPad.get(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, reinterpret_cast(+[](GstPad*, GstPadProbeInfo* info, gpointer userData) -> GstPadProbeReturn { + RefPtr holder = reinterpret_cast*>(userData)->get(); + if (!holder) + return GST_PAD_PROBE_REMOVE; + + auto event = gst_pad_probe_info_get_event(info); switch (GST_EVENT_TYPE(event)) { case GST_EVENT_TAG: - track->tagsChanged(); + holder->tagsChanged(); break; case GST_EVENT_STREAM_START: - if (track->m_shouldHandleStreamStartEvent) - track->streamChanged(); + if (holder->m_shouldHandleStreamStartEvent) + holder->streamChanged(); break; case GST_EVENT_CAPS: { - track->m_taskQueue.enqueueTask([track, event = GRefPtr(event)]() { + holder->m_taskQueue.enqueueTask([weakHolder = ThreadSafeWeakPtr { holder.get() }, event = GRefPtr(event)]() mutable { + RefPtr holder = weakHolder.get(); + if (!holder) + return; + GstCaps* caps; gst_event_parse_caps(event.get(), &caps); if (!caps) return; - track->capsChanged(track->m_id, GRefPtr(caps)); + holder->m_track.capsChanged(holder->m_id, GRefPtr(caps)); }); break; } @@ -148,16 +217,33 @@ break; } return GST_PAD_PROBE_OK; - }), this, nullptr); + }), new ThreadSafeWeakPtr { this }, reinterpret_cast(+[](gpointer data) { + delete static_cast*>(data); + })); +} + +void TrackDataHolder::setStream(GRefPtr&& stream) +{ + g_clear_signal_handler(&m_streamTagsNotifyHandlerId, m_stream.get()); + g_clear_signal_handler(&m_streamCapsNotifyHandlerId, m_stream.get()); + m_stream = WTF::move(stream); + m_streamTagsNotifyHandlerId = g_signal_connect_data(m_stream.get(), "notify::tags", G_CALLBACK(+[](GstStream*, GParamSpec*, gpointer userData) { + RefPtr holder = reinterpret_cast*>(userData)->get(); + if (!holder) + return; + holder->tagsChanged(); + }), new ThreadSafeWeakPtr { this }, [](gpointer data, GClosure*) { + delete static_cast*>(data); + }, static_cast(0)); } -TrackPrivateBaseGStreamer::~TrackPrivateBaseGStreamer() +TrackDataHolder::~TrackDataHolder() { disconnect(); m_notifier->invalidate(); } -GstObject* TrackPrivateBaseGStreamer::objectForLogging() const +GstObject* TrackDataHolder::objectForLogging() const { if (m_stream) return GST_OBJECT_CAST(m_stream.get()); @@ -166,10 +252,60 @@ return GST_OBJECT_CAST(m_pad.get()); } +GRefPtr TrackPrivateBaseGStreamer::pad() const +{ + return m_data->m_pad; +} + +unsigned TrackPrivateBaseGStreamer::index() +{ + return m_data->m_index; +} + +void TrackPrivateBaseGStreamer::setIndex(unsigned index) +{ + m_data->m_index = index; +} + +GRefPtr TrackPrivateBaseGStreamer::stream() const +{ + return m_data->m_stream; +} + +void TrackPrivateBaseGStreamer::setInitialCaps(GRefPtr&& caps) +{ + m_data->m_initialCaps = WTF::move(caps); +} + +GRefPtr TrackPrivateBaseGStreamer::initialCaps() +{ + return m_data->m_initialCaps; +} + +TrackID TrackPrivateBaseGStreamer::streamId() const +{ + return m_data->m_id; +} + +String TrackPrivateBaseGStreamer::gstStreamId() const +{ + return m_data->m_gstStreamId; +} + void TrackPrivateBaseGStreamer::disconnect() { - if (m_stream) - g_signal_handlers_disconnect_matched(m_stream.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this); + m_data->disconnect(); +} + +void TrackDataHolder::disconnect() +{ + m_taskQueue.startAborting(); + + if (m_stream) { + g_clear_signal_handler(&m_streamTagsNotifyHandlerId, m_stream.get()); + g_clear_signal_handler(&m_streamCapsNotifyHandlerId, m_stream.get()); + m_stream.clear(); + } m_tags.clear(); @@ -182,18 +318,22 @@ } if (m_pad) { - g_signal_handlers_disconnect_matched(m_pad.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this); + g_clear_signal_handler(&m_padTagsNotifyHandlerId, m_pad.get()); + g_clear_signal_handler(&m_padCapsNotifyHandlerId, m_pad.get()); m_pad.clear(); } + + m_player = nullptr; + m_taskQueue.finishAborting(); } -void TrackPrivateBaseGStreamer::tagsChanged() +void TrackDataHolder::tagsChanged() { // May be called by any thread, including the streaming thread. GRefPtr tags; if (m_bestUpstreamPad) { GRefPtr tagEvent; - guint i = 0; + unsigned i = 0; // Prefer the tag event having a language tag, if available. do { tagEvent = adoptGRef(gst_pad_get_sticky_event(m_bestUpstreamPad.get(), GST_EVENT_TAG, i)); @@ -224,28 +364,7 @@ }); } -std::optional TrackPrivateBaseGStreamer::getLanguageCode(GstTagList* tags) -{ - auto language = getTag(tags, ASCIILiteral::fromLiteralUnsafe(GST_TAG_LANGUAGE_CODE)); - if (language) { - auto convertedLanguage = CStringView::unsafeFromUTF8(gst_tag_get_language_code_iso_639_1(language->utf8().data())); - GST_DEBUG("Converted track %" PRIu64 "'s language code to %s.", m_id, convertedLanguage.utf8()); - return String(convertedLanguage.span()); - } - return std::nullopt; -} - -std::optional TrackPrivateBaseGStreamer::getTag(GstTagList* tags, ASCIILiteral tagName) -{ - GUniqueOutPtr tagValue; - if (gst_tag_list_get_string(tags, tagName.characters(), &tagValue.outPtr())) { - GST_DEBUG("Track %" PRIu64 " got %s %s.", m_id, tagName.characters(), tagValue.get()); - return String(byteCast(unsafeSpan(tagValue.get()))); - } - return std::nullopt; -} - -void TrackPrivateBaseGStreamer::notifyTrackOfTagsChanged() +void TrackDataHolder::notifyTrackOfTagsChanged() { ASSERT(isMainThread()); GRefPtr tags; @@ -257,12 +376,16 @@ if (!tags) return; - tagsChanged(GRefPtr(tags)); + m_track.tagsChanged(GRefPtr(tags)); + + RefPtr owner = m_owner.get(); + if (!owner) + return; auto label = getTag(tags.get(), ASCIILiteral::fromLiteralUnsafe(GST_TAG_TITLE)); if (label) { m_label = *label; - m_owner->notifyMainThreadClient([&](auto& client) { + owner->notifyMainThreadClient([&](auto& client) { client.labelChanged(m_label); }); } @@ -275,12 +398,12 @@ return; m_language = *language; - m_owner->notifyMainThreadClient([&](auto& client) { + owner->notifyMainThreadClient([&](auto& client) { client.languageChanged(m_language); }); } -void TrackPrivateBaseGStreamer::notifyTrackOfStreamChanged() +void TrackDataHolder::streamIdChanged() { if (!m_pad) return; @@ -296,75 +419,93 @@ GST_INFO("Track %" PRIu64 " got stream start. GStreamer stream-id: %s", m_id, m_gstStreamId.utf8().data()); } -void TrackPrivateBaseGStreamer::streamChanged() +void TrackDataHolder::streamChanged() { m_notifier->notify(MainThreadNotification::StreamChanged, [this] { - notifyTrackOfStreamChanged(); + streamIdChanged(); }); } -void TrackPrivateBaseGStreamer::installUpdateConfigurationHandlers() +void TrackDataHolder::installUpdateConfigurationHandlers() { if (m_pad) { - g_signal_connect_swapped(m_pad.get(), "notify::caps", G_CALLBACK(+[](TrackPrivateBaseGStreamer* track) { - if (!track->m_pad) + m_padCapsNotifyHandlerId = g_signal_connect_data(m_pad.get(), "notify::caps", G_CALLBACK(+[](GstPad*, GParamSpec*, gpointer userData) { + RefPtr holder = reinterpret_cast*>(userData)->get(); + if (!holder) + return; + if (!holder->m_pad) return; - auto caps = adoptGRef(gst_pad_get_current_caps(track->m_pad.get())); + auto caps = adoptGRef(gst_pad_get_current_caps(holder->m_pad.get())); // We will receive a synchronous notification for caps being unset during pipeline teardown. if (!caps) return; - track->m_taskQueue.enqueueTask([track, caps = WTF::move(caps)]() mutable { - track->capsChanged(getStreamIdFromPad(track->m_pad.get()).value_or(track->m_index), WTF::move(caps)); + holder->m_taskQueue.enqueueTask([weakHolder = ThreadSafeWeakPtr { holder.get() }, caps = WTF::move(caps)]() mutable { + auto holder = weakHolder.get(); + if (!holder) + return; + holder->m_track.capsChanged(getStreamIdFromPad(holder->m_pad.get()).value_or(holder->m_index), WTF::move(caps)); }); - }), this); - g_signal_connect_swapped(m_pad.get(), "notify::tags", G_CALLBACK(+[](TrackPrivateBaseGStreamer* track) { - track->m_taskQueue.enqueueTask([track]() { - if (!track->m_pad) + }), new ThreadSafeWeakPtr { this }, [](gpointer data, GClosure*) { + delete static_cast*>(data); + }, static_cast(0)); + m_padTagsNotifyHandlerId = g_signal_connect_data(m_pad.get(), "notify::tags", G_CALLBACK(+[](GstPad*, GParamSpec*, gpointer userData) { + RefPtr holder = reinterpret_cast*>(userData)->get(); + if (!holder) + return; + holder->m_taskQueue.enqueueTask([weakHolder = ThreadSafeWeakPtr { holder.get() }]() mutable { + auto holder = weakHolder.get(); + if (!holder) return; - track->updateConfigurationFromTags(getAllTags(track->m_pad)); + if (!holder->m_pad) + return; + holder->m_track.updateConfigurationFromTags(getAllTags(holder->m_pad)); }); - }), this); + }), new ThreadSafeWeakPtr { this }, [](gpointer data, GClosure*) { + delete static_cast*>(data); + }, static_cast(0)); } else if (m_stream) { - g_signal_connect_swapped(m_stream.get(), "notify::caps", G_CALLBACK(+[](TrackPrivateBaseGStreamer* track) { - track->m_taskQueue.enqueueTask([track]() { - auto caps = adoptGRef(gst_stream_get_caps(track->m_stream.get())); - track->capsChanged(getStreamIdFromStream(track->m_stream.get()).value_or(track->m_index), WTF::move(caps)); + m_streamCapsNotifyHandlerId = g_signal_connect_data(m_stream.get(), "notify::caps", G_CALLBACK(+[](GstStream*, GParamSpec*, gpointer userData) { + RefPtr holder = reinterpret_cast*>(userData)->get(); + if (!holder) + return; + holder->m_taskQueue.enqueueTask([weakHolder = ThreadSafeWeakPtr { holder.get() }]() mutable { + auto holder = weakHolder.get(); + if (!holder) + return; + auto caps = adoptGRef(gst_stream_get_caps(holder->m_stream.get())); + holder->m_track.capsChanged(getStreamIdFromStream(holder->m_stream.get()).value_or(holder->m_index), WTF::move(caps)); }); - }), this); + }), new ThreadSafeWeakPtr { this }, [](gpointer data, GClosure*) { + delete static_cast*>(data); + }, static_cast(0)); // This signal can be triggered from the main thread // (CanvasCaptureMediaStreamTrack::Source::captureCanvas() triggering the mediastreamsrc // InternalSource::videoFrameAvailable() which can update the stream tags.) - g_signal_connect_swapped(m_stream.get(), "notify::tags", G_CALLBACK(+[](TrackPrivateBaseGStreamer* track) { + m_streamTagsNotifyHandlerId = g_signal_connect_data(m_stream.get(), "notify::tags", G_CALLBACK(+[](GstStream*, GParamSpec*, gpointer userData) { + RefPtr holder = reinterpret_cast*>(userData)->get(); + if (!holder) + return; if (isMainThread()) { - auto tags = adoptGRef(gst_stream_get_tags(track->m_stream.get())); - track->updateConfigurationFromTags(WTF::move(tags)); + auto tags = adoptGRef(gst_stream_get_tags(holder->m_stream.get())); + holder->m_track.updateConfigurationFromTags(WTF::move(tags)); return; } - track->m_taskQueue.enqueueTask([track]() { - auto tags = adoptGRef(gst_stream_get_tags(track->m_stream.get())); - track->updateConfigurationFromTags(WTF::move(tags)); + holder->m_taskQueue.enqueueTask([weakHolder = ThreadSafeWeakPtr { holder.get() }]() mutable { + auto holder = weakHolder.get(); + if (!holder) + return; + auto tags = adoptGRef(gst_stream_get_tags(holder->m_stream.get())); + holder->m_track.updateConfigurationFromTags(WTF::move(tags)); }); - }), this); - } -} - -GRefPtr TrackPrivateBaseGStreamer::getAllTags(const GRefPtr& pad) -{ - auto allTags = adoptGRef(gst_tag_list_new_empty()); - GstTagList* taglist = nullptr; - for (guint i = 0;; i++) { - GRefPtr tagsEvent = adoptGRef(gst_pad_get_sticky_event(pad.get(), GST_EVENT_TAG, i)); - if (!tagsEvent) - break; - gst_event_parse_tag(tagsEvent.get(), &taglist); - allTags = adoptGRef(gst_tag_list_merge(allTags.get(), taglist, GST_TAG_MERGE_APPEND)); + }), new ThreadSafeWeakPtr { this }, [](gpointer data, GClosure*) { + delete static_cast*>(data); + }, static_cast(0)); } - return allTags; } -bool TrackPrivateBaseGStreamer::updateTrackIDFromTags(const GRefPtr& tags) +bool TrackDataHolder::updateTrackIDFromTags(const GRefPtr& tags) { ASSERT(isMainThread()); GUniqueOutPtr trackIDString; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h 2026-02-23 14:40:55.648299500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h 2026-07-09 07:12:42.136795800 +0000 @@ -30,64 +30,50 @@ #include "AbortableTaskQueue.h" #include "GStreamerCommon.h" #include "MainThreadNotifier.h" +#include "MediaPlayerPrivateGStreamer.h" #include #include +#include +#include #include namespace WebCore { class TrackPrivateBase; using TrackID = uint64_t; +enum GStreamerTrackType { + Audio, + Video, + Text, + Unknown +}; -class TrackPrivateBaseGStreamer { -public: - virtual ~TrackPrivateBaseGStreamer(); +class TrackPrivateBaseGStreamer; +class TrackDataHolder : public ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr { + WTF_MAKE_TZONE_ALLOCATED(TrackDataHolder); + WTF_MAKE_NONCOPYABLE(TrackDataHolder); - enum TrackType { - Audio, - Video, - Text, - Unknown - }; +public: + static Ref create(TrackPrivateBaseGStreamer& track) + { + return adoptRef(*new TrackDataHolder(track)); + } + virtual ~TrackDataHolder(); - GstPad* pad() const { return m_pad.get(); } void setPad(GRefPtr&&); + void setStream(GRefPtr&&); virtual void disconnect(); - virtual void setActive(bool) { } - - unsigned index() { return m_index; }; - void setIndex(unsigned index) { m_index = index; } - - GstStream* stream() const { return m_stream.get(); } - - // Used for MSE, where the initial caps of the pad are relevant for initializing the matching pad in the - // playback pipeline. - void setInitialCaps(GRefPtr&& caps) { m_initialCaps = WTF::move(caps); } - const GRefPtr& initialCaps() { return m_initialCaps; } - - TrackID streamId() const { return m_id; } - const String& gstStreamId() const { return m_gstStreamId; } - - virtual void updateConfigurationFromCaps(GRefPtr&&) { } - -protected: - TrackPrivateBaseGStreamer(TrackType, TrackPrivateBase*, unsigned index, GRefPtr&&, bool shouldHandleStreamStartEvent); - TrackPrivateBaseGStreamer(TrackType, TrackPrivateBase*, unsigned index, GRefPtr&&, TrackID); - TrackPrivateBaseGStreamer(TrackType, TrackPrivateBase*, unsigned index, GstStream*); - + void tagsChanged(); void notifyTrackOfTagsChanged(); - void notifyTrackOfStreamChanged(); - - GstObject* objectForLogging() const; - virtual void tagsChanged(GRefPtr&&) { } - virtual void capsChanged(TrackID, GRefPtr&&) { } + void streamIdChanged(); + void streamChanged(); void installUpdateConfigurationHandlers(); - virtual void updateConfigurationFromTags(GRefPtr&&) { } + bool updateTrackIDFromTags(const GRefPtr&); - static GRefPtr getAllTags(const GRefPtr&); + GstObject* objectForLogging() const; enum MainThreadNotification { TagsChanged = 1 << 1, @@ -96,7 +82,8 @@ }; Ref> m_notifier; - unsigned m_index; + // FIXME: this should be optional... + unsigned m_index { 0 }; String m_label; String m_language; String m_gstStreamId; @@ -111,23 +98,64 @@ // Track ID inferred from container-specific-track-id tag. std::optional m_trackID; - bool updateTrackIDFromTags(const GRefPtr&); -private: - std::optional getLanguageCode(GstTagList*); - static String generateUniquePlaybin2StreamID(TrackType, unsigned index); - static char prefixForType(TrackType); - std::optional getTag(GstTagList* tags, ASCIILiteral tagName); - - void streamChanged(); - void tagsChanged(); - - TrackType m_type; - TrackPrivateBase* m_owner; + GStreamerTrackType m_type; + ThreadSafeWeakPtr m_owner; Lock m_tagMutex; - GRefPtr m_tags; + GRefPtr m_tags WTF_GUARDED_BY_LOCK(m_tagMutex); bool m_shouldUsePadStreamId { true }; bool m_shouldHandleStreamStartEvent { true }; + + ThreadSafeWeakPtr m_player; + + // The owning track, its lifetime is the same as its TrackDataHolder reference. + TrackPrivateBaseGStreamer& m_track; +private: + TrackDataHolder(TrackPrivateBaseGStreamer&); + + gulong m_streamTagsNotifyHandlerId { 0 }; + gulong m_streamCapsNotifyHandlerId { 0 }; + gulong m_padTagsNotifyHandlerId { 0 }; + gulong m_padCapsNotifyHandlerId { 0 }; +}; + +class TrackPrivateBaseGStreamer { +public: + friend class AudioTrackPrivateGStreamer; + friend class InbandTextTrackPrivateGStreamer; + friend class VideoTrackPrivateGStreamer; + + void disconnect(); + void setPad(GRefPtr&&); + GRefPtr pad() const; + + virtual void setActive(bool) { } + + unsigned index(); + void setIndex(unsigned); + + GRefPtr stream() const; + + // Used for MSE, where the initial caps of the pad are relevant for initializing the matching pad in the + // playback pipeline. + void setInitialCaps(GRefPtr&&); + GRefPtr initialCaps(); + + TrackID streamId() const; + String gstStreamId() const; + + virtual void updateConfigurationFromCaps(GRefPtr&&) { } + virtual void tagsChanged(GRefPtr&&) { } + virtual void capsChanged(TrackID, GRefPtr&&) { } + virtual void updateConfigurationFromTags(GRefPtr&&) { } + +private: + TrackPrivateBaseGStreamer(ThreadSafeWeakPtr&&, GStreamerTrackType, TrackPrivateBase*, unsigned index, GRefPtr&&, bool shouldHandleStreamStartEvent); + TrackPrivateBaseGStreamer(ThreadSafeWeakPtr&&, GStreamerTrackType, TrackPrivateBase*, unsigned index, GRefPtr&&, TrackID); + TrackPrivateBaseGStreamer(ThreadSafeWeakPtr&&, GStreamerTrackType, TrackPrivateBase*, unsigned index, GstStream*); + ~TrackPrivateBaseGStreamer(); + + const Ref m_data; }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.h 2026-01-20 14:08:46.209674000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.h 2026-07-09 07:12:42.136795800 +0000 @@ -45,7 +45,7 @@ GstVideoSinkClass parentClass; }; -GType webkit_video_sink_get_type() G_GNUC_CONST; +GType webkit_video_sink_get_type(); GstElement* webkitVideoSinkNew(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.cpp 2026-02-23 14:40:55.649299600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.cpp 2026-07-09 07:12:42.136795800 +0000 @@ -51,32 +51,26 @@ } VideoTrackPrivateGStreamer::VideoTrackPrivateGStreamer(ThreadSafeWeakPtr&& player, unsigned index, GRefPtr&& pad, bool shouldHandleStreamStartEvent) - : TrackPrivateBaseGStreamer(TrackPrivateBaseGStreamer::TrackType::Video, this, index, WTF::move(pad), shouldHandleStreamStartEvent) - , m_player(WTF::move(player)) + : TrackPrivateBaseGStreamer(WTF::move(player), GStreamerTrackType::Video, this, index, WTF::move(pad), shouldHandleStreamStartEvent) { ensureVideoTrackDebugCategoryInitialized(); - installUpdateConfigurationHandlers(); } VideoTrackPrivateGStreamer::VideoTrackPrivateGStreamer(ThreadSafeWeakPtr&& player, unsigned index, GRefPtr&& pad, TrackID trackId) - : TrackPrivateBaseGStreamer(TrackPrivateBaseGStreamer::TrackType::Video, this, index, WTF::move(pad), trackId) - , m_player(WTF::move(player)) + : TrackPrivateBaseGStreamer(WTF::move(player), GStreamerTrackType::Video, this, index, WTF::move(pad), trackId) { ensureVideoTrackDebugCategoryInitialized(); - installUpdateConfigurationHandlers(); } VideoTrackPrivateGStreamer::VideoTrackPrivateGStreamer(ThreadSafeWeakPtr&& player, unsigned index, GstStream* stream) - : TrackPrivateBaseGStreamer(TrackPrivateBaseGStreamer::TrackType::Video, this, index, stream) - , m_player(WTF::move(player)) + : TrackPrivateBaseGStreamer(WTF::move(player), GStreamerTrackType::Video, this, index, stream) { ensureVideoTrackDebugCategoryInitialized(); - installUpdateConfigurationHandlers(); - auto caps = adoptGRef(gst_stream_get_caps(m_stream.get())); + auto caps = adoptGRef(gst_stream_get_caps(m_data->m_stream.get())); updateConfigurationFromCaps(WTF::move(caps)); - auto tags = adoptGRef(gst_stream_get_tags(m_stream.get())); + auto tags = adoptGRef(gst_stream_get_tags(m_data->m_stream.get())); updateConfigurationFromTags(WTF::move(tags)); } @@ -85,7 +79,7 @@ ASSERT(isMainThread()); updateConfigurationFromCaps(WTF::move(caps)); - RefPtr player = m_player.get(); + RefPtr player = m_data->m_player.get(); if (!player) return; @@ -94,7 +88,7 @@ return; auto configuration = this->configuration(); - GST_DEBUG_OBJECT(objectForLogging(), "Setting codec to %s", codec.ascii().data()); + GST_DEBUG_OBJECT(m_data->objectForLogging(), "Setting codec to %s", codec.ascii().data()); configuration.codec = WTF::move(codec); setConfiguration(WTF::move(configuration)); } @@ -102,13 +96,13 @@ void VideoTrackPrivateGStreamer::updateConfigurationFromTags(GRefPtr&& tags) { ASSERT(isMainThread()); - GST_DEBUG_OBJECT(objectForLogging(), "Updating video configuration from %" GST_PTR_FORMAT, tags.get()); if (!tags) return; - if (updateTrackIDFromTags(tags)) { - GST_DEBUG_OBJECT(objectForLogging(), "Video track ID set from container-specific-track-id tag %" G_GUINT64_FORMAT, *m_trackID); - notifyClients([trackID = *m_trackID](auto& client) { + GST_DEBUG_OBJECT(m_data->objectForLogging(), "Updating video configuration from %" GST_PTR_FORMAT, tags.get()); + if (m_data->updateTrackIDFromTags(tags)) { + GST_DEBUG_OBJECT(m_data->objectForLogging(), "Video track ID set from container-specific-track-id tag %" G_GUINT64_FORMAT, *m_data->m_trackID); + notifyClients([trackID = *m_data->m_trackID](auto& client) { client.idChanged(trackID); }); } @@ -117,7 +111,7 @@ if (!gst_tag_list_get_uint(tags.get(), GST_TAG_BITRATE, &bitrate)) return; - GST_DEBUG_OBJECT(objectForLogging(), "Setting bitrate to %u", bitrate); + GST_DEBUG_OBJECT(m_data->objectForLogging(), "Setting bitrate to %u", bitrate); auto configuration = this->configuration(); configuration.bitrate = bitrate; setConfiguration(WTF::move(configuration)); @@ -129,7 +123,7 @@ if (!caps || !gst_caps_is_fixed(caps.get())) return; - GST_DEBUG_OBJECT(objectForLogging(), "Updating video configuration from %" GST_PTR_FORMAT, caps.get()); + GST_DEBUG_OBJECT(m_data->objectForLogging(), "Updating video configuration from %" GST_PTR_FORMAT, caps.get()); auto configuration = this->configuration(); auto scopeExit = makeScopeExit([&] { setConfiguration(WTF::move(configuration)); @@ -173,39 +167,56 @@ VideoTrackPrivate::Kind VideoTrackPrivateGStreamer::kind() const { - if (m_stream && gst_stream_get_stream_flags(m_stream.get()) & GST_STREAM_FLAG_SELECT) + if (m_data->m_stream && gst_stream_get_stream_flags(m_data->m_stream.get()) & GST_STREAM_FLAG_SELECT) return VideoTrackPrivate::Kind::Main; return VideoTrackPrivate::kind(); } -void VideoTrackPrivateGStreamer::disconnect() +void VideoTrackPrivateGStreamer::setSelected(bool selected) { - m_taskQueue.startAborting(); + if (selected == this->selected()) + return; + VideoTrackPrivate::setSelected(selected); - if (m_stream) - g_signal_handlers_disconnect_matched(m_stream.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this); + RefPtr player = m_data->m_player.get(); + if (!player) + return; - m_player = nullptr; - TrackPrivateBaseGStreamer::disconnect(); + // On MSE, the player holds its own set of tracks, independent from the ones SourceBuffer + // reported to HTMLMediaElement. We need to synchronize the enabled status of the player + // mirror when the element one changed. Fortunately, both share the same trackId. + player->mirrorEnabledVideoTrackIfNeeded(*this); + player->updateEnabledVideoTrack(); +} - m_taskQueue.finishAborting(); +int VideoTrackPrivateGStreamer::trackIndex() const +{ + return m_data->m_index; } -void VideoTrackPrivateGStreamer::setSelected(bool selected) +TrackID VideoTrackPrivateGStreamer::id() const { - if (selected == this->selected()) - return; - VideoTrackPrivate::setSelected(selected); + return m_data->m_trackID.value_or(m_data->m_id); +} - RefPtr player = m_player.get(); - if (player) { - // On MSE, the player holds its own set of tracks, independent from the ones SourceBuffer - // reported to HTMLMediaElement. We need to synchronize the enabled status of the player - // mirror when the element one changed. Fortunately, both share the same trackId. - player->mirrorEnabledVideoTrackIfNeeded(*this); - player->updateEnabledVideoTrack(); - } +std::optional VideoTrackPrivateGStreamer::trackUID() const +{ + auto player = m_data->m_player.get(); + if (player && player->isMediaStreamPlayer()) + return m_data->m_gstStreamId; + + return std::nullopt; +} + +String VideoTrackPrivateGStreamer::label() const +{ + return m_data->m_label; +} + +String VideoTrackPrivateGStreamer::language() const +{ + return m_data->m_language; } #undef GST_CAT_DEFAULT diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.h 2026-02-23 14:40:55.649299600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.h 2026-07-09 07:12:42.136795800 +0000 @@ -56,26 +56,16 @@ Kind kind() const final; - void disconnect() final; - void setSelected(bool) final; void setActive(bool enabled) final { setSelected(enabled); } - int trackIndex() const final { return m_index; } - - TrackID id() const final { return m_trackID.value_or(m_id); } - std::optional trackUID() const final - { - auto player = m_player.get(); + int trackIndex() const final; - if (player && player->isMediaStreamPlayer()) - return m_gstStreamId; + TrackID id() const final; + std::optional trackUID() const final; - return std::nullopt; - } - - String label() const final { return m_label; } - String language() const final { return m_language; } + String label() const final; + String language() const final; void updateConfigurationFromCaps(GRefPtr&&) final; @@ -89,8 +79,6 @@ VideoTrackPrivateGStreamer(ThreadSafeWeakPtr&&, unsigned index, GRefPtr&&, bool shouldHandleStreamStartEvent); VideoTrackPrivateGStreamer(ThreadSafeWeakPtr&&, unsigned index, GRefPtr&&, TrackID); VideoTrackPrivateGStreamer(ThreadSafeWeakPtr&&, unsigned index, GstStream*); - - ThreadSafeWeakPtr m_player; }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/eme/CDMProxyThunder.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/CDMProxyThunder.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/eme/CDMProxyThunder.cpp 2026-02-23 14:40:55.650299500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/CDMProxyThunder.cpp 2026-07-09 07:12:42.136795800 +0000 @@ -28,6 +28,7 @@ #include "config.h" #include "CDMProxyThunder.h" +#include "GStreamerEMEUtilities.h" #if ENABLE(ENCRYPTED_MEDIA) && ENABLE(THUNDER) @@ -55,8 +56,15 @@ auto keyID = mappedKeyID.createVector(); auto keyHandle = getOrWaitForKeyHandle(keyID, WTF::move(in.cdmProxyDecryptionClient)); - if (!keyHandle.has_value() || !keyHandle.value()->isStatusCurrentlyValid()) + if (!keyHandle) { + GST_ERROR("No key handle"); return nullptr; + } + + if (!keyHandle.value()->isStatusCurrentlyValid()) { + GST_ERROR("Key handle has no usable key"); + return nullptr; + } KeyHandleValueVariant keyData = keyHandle.value()->value(); ASSERT(std::holds_alternative>(keyData)); @@ -80,12 +88,12 @@ return keyValue; } -bool CDMProxyThunder::decrypt(CDMProxyThunder::DecryptionContext& input, const GRefPtr& inputCaps) +DecryptionResult CDMProxyThunder::decrypt(CDMProxyThunder::DecryptionContext& input, const GRefPtr& inputCaps) { BoxPtr session = getDecryptionSession(input); if (!session) { GST_WARNING("there is no valid session to decrypt for the provided key ID (or the operation was aborted)"); - return false; + return DecryptionResult::Failure; } GST_TRACE("decrypting"); @@ -98,12 +106,22 @@ errorCode = opencdm_gstreamer_session_decrypt(session->get(), input.dataBuffer, input.subsamplesBuffer, input.numSubsamples, input.ivBuffer, input.keyIDBuffer, 0); #endif - if (errorCode) { - GST_ERROR("decryption failed, error code %X", errorCode); - return false; - } - return true; + DecryptionResult result; + switch (errorCode) { + case ERROR_NONE: + result = DecryptionResult::Success; + break; + case ERROR_INVALID_ACCESSOR: + GST_ERROR("Decryption failed, converting ERROR_INVALID_ACCESSOR to NoKey error"); + result = DecryptionResult::NoKey; + break; + default: + GST_ERROR("Decryption failed, error code 0x%X", errorCode); + result = DecryptionResult::Failure; + break; + }; + return result; } #undef GST_CAT_DEFAULT diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/eme/CDMProxyThunder.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/CDMProxyThunder.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/eme/CDMProxyThunder.h 2026-02-23 14:40:55.650299500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/CDMProxyThunder.h 2026-07-09 07:12:42.136795800 +0000 @@ -55,8 +55,8 @@ WeakPtr cdmProxyDecryptionClient; }; - bool decrypt(DecryptionContext&, const GRefPtr& inputCaps); - const String& keySystem() { return m_keySystem; } + DecryptionResult decrypt(DecryptionContext&, const GRefPtr& inputCaps); + const String& keySystem() const LIFETIME_BOUND { return m_keySystem; } private: BoxPtr getDecryptionSession(DecryptionContext&) const; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/eme/CDMThunder.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/CDMThunder.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/eme/CDMThunder.cpp 2026-02-23 14:40:55.651299500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/CDMThunder.cpp 2026-07-09 07:12:42.136795800 +0000 @@ -566,10 +566,16 @@ m_sessionChangedCallbacks.append([this, callback = WTF::move(callback)](bool success, RefPtr&& responseMessage) mutable { ASSERT(isMainThread()); if (success) { - if (!responseMessage) - callback(false, m_keyStore.convertToJSKeyStatusVector(), std::nullopt, std::nullopt, SuccessValue::Succeeded); - else { - // FIXME: Using JSON reponse messages is much cleaner than using string prefixes, I believe there + if (!responseMessage) { + GST_DEBUG("Empty response message"); + std::optional keyStatus; + // If the keystore is empty, generating an empty status vector would trigger a new + // keystatuses event potentially overriding the previous one. + if (!m_keyStore.isEmpty()) + keyStatus = m_keyStore.convertToJSKeyStatusVector(); + callback(false, WTF::move(keyStatus), std::nullopt, std::nullopt, SuccessValue::Succeeded); + } else { + // FIXME: Using JSON response messages is much cleaner than using string prefixes, I believe there // will even be other parts of the spec where not having structured data will be bad. ParsedResponseMessage parsedResponseMessage(responseMessage); ASSERT(parsedResponseMessage); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/eme/GStreamerEMEUtilities.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/GStreamerEMEUtilities.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/eme/GStreamerEMEUtilities.h 2026-02-23 14:40:55.651299500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/GStreamerEMEUtilities.h 2026-07-09 07:12:42.136795800 +0000 @@ -34,6 +34,12 @@ GST_DEBUG_CATEGORY_EXTERN(webkit_media_common_encryption_decrypt_debug_category); +enum DecryptionResult { + Success, + Failure, + NoKey +}; + namespace WebCore { class InitData { public: diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp 2026-02-23 14:40:55.651299500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp 2026-07-09 07:12:42.136795800 +0000 @@ -352,13 +352,13 @@ GST_TRACE_OBJECT(self, "decrypting"); - bool didDecryptionSucceed; + DecryptionResult result; // Temporarily release the lock while we don't need to access priv. The lower level API is used // in order to avoid creating several scopes with different Locker instances in each one. { DropLockForScope noLockScope { locker }; - didDecryptionSucceed = klass->decrypt(self, ivBuffer, keyIDBuffer, buffer, subSampleCount, subSamplesBuffer); + result = klass->decrypt(self, ivBuffer, keyIDBuffer, buffer, subSampleCount, subSamplesBuffer); } // Accessing priv members again. @@ -367,12 +367,20 @@ return GST_FLOW_FLUSHING; } - if (!didDecryptionSucceed) { - GST_ELEMENT_ERROR(self, STREAM, DECRYPT, ("Decryption failed"), (nullptr)); - return GST_FLOW_NOT_SUPPORTED; - } - - return GST_FLOW_OK; + GstFlowReturn flowReturn; + switch (result) { + case DecryptionResult::Success: + flowReturn = GST_FLOW_OK; + break; + case DecryptionResult::Failure: + flowReturn = GST_FLOW_NOT_SUPPORTED; + break; + case DecryptionResult::NoKey: + GST_ELEMENT_ERROR(GST_ELEMENT_CAST(self), STREAM, DECRYPT_NOKEY, ("No key found, decryption failed"), (nullptr)); + flowReturn = GST_FLOW_CUSTOM_ERROR; + break; + }; + return flowReturn; } static bool isCDMProxyAvailable(WebKitMediaCommonEncryptionDecrypt* self) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.h 2026-02-23 14:40:55.651299500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.h 2026-07-09 07:12:42.136795800 +0000 @@ -24,7 +24,9 @@ #if ENABLE(ENCRYPTED_MEDIA) && USE(GSTREAMER) -#include +#include "CDMProxy.h" +#include "GStreamerEMEUtilities.h" + #include #include #include @@ -59,7 +61,7 @@ ASCIILiteral (*protectionSystemId)(WebKitMediaCommonEncryptionDecrypt*); bool (*cdmProxyAttached)(WebKitMediaCommonEncryptionDecrypt*, const RefPtr&); - bool (*decrypt)(WebKitMediaCommonEncryptionDecrypt*, GstBuffer* ivBuffer, GstBuffer* keyIDBuffer, GstBuffer* buffer, unsigned subsamplesCount, GstBuffer* subsamplesBuffer); + DecryptionResult (*decrypt)(WebKitMediaCommonEncryptionDecrypt*, GstBuffer* ivBuffer, GstBuffer* keyIDBuffer, GstBuffer* buffer, unsigned subsamplesCount, GstBuffer* subsamplesBuffer); }; G_END_DECLS diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/eme/WebKitThunderDecryptorGStreamer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/WebKitThunderDecryptorGStreamer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/eme/WebKitThunderDecryptorGStreamer.cpp 2026-02-23 14:40:55.651299500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/eme/WebKitThunderDecryptorGStreamer.cpp 2026-07-09 07:12:42.136795800 +0000 @@ -21,6 +21,7 @@ #include "config.h" #include "WebKitThunderDecryptorGStreamer.h" +#include "WebKitCommonEncryptionDecryptorGStreamer.h" #if ENABLE(ENCRYPTED_MEDIA) && ENABLE(THUNDER) && USE(GSTREAMER) @@ -38,7 +39,7 @@ static ASCIILiteral protectionSystemId(WebKitMediaCommonEncryptionDecrypt*); static bool cdmProxyAttached(WebKitMediaCommonEncryptionDecrypt*, const RefPtr&); -static bool decrypt(WebKitMediaCommonEncryptionDecrypt*, GstBuffer* iv, GstBuffer* keyid, GstBuffer* sample, unsigned subSamplesCount, +static DecryptionResult decrypt(WebKitMediaCommonEncryptionDecrypt*, GstBuffer* iv, GstBuffer* keyid, GstBuffer* sample, unsigned subSamplesCount, GstBuffer* subSamples); GST_DEBUG_CATEGORY(webkitMediaThunderDecryptDebugCategory); @@ -146,7 +147,7 @@ return self->priv->cdmProxy; } -static bool decrypt(WebKitMediaCommonEncryptionDecrypt* decryptor, GstBuffer* ivBuffer, GstBuffer* keyIDBuffer, GstBuffer* buffer, unsigned subsampleCount, +static DecryptionResult decrypt(WebKitMediaCommonEncryptionDecrypt* decryptor, GstBuffer* ivBuffer, GstBuffer* keyIDBuffer, GstBuffer* buffer, unsigned subsampleCount, GstBuffer* subsamplesBuffer) { auto* self = WEBKIT_MEDIA_THUNDER_DECRYPT(decryptor); @@ -155,13 +156,13 @@ if (!ivBuffer || !keyIDBuffer || !buffer) { GST_ERROR_OBJECT(self, "invalid decrypt() parameter"); ASSERT_NOT_REACHED(); - return false; + return DecryptionResult::Failure; } if (subsampleCount && !subsamplesBuffer) { GST_ERROR_OBJECT(self, "invalid decrypt() subsamples parameter"); ASSERT_NOT_REACHED(); - return false; + return DecryptionResult::Failure; } CDMProxyThunder::DecryptionContext context = { }; @@ -171,9 +172,7 @@ context.numSubsamples = subsampleCount; context.subsamplesBuffer = subsampleCount ? subsamplesBuffer : nullptr; context.cdmProxyDecryptionClient = webKitMediaCommonEncryptionDecryptGetCDMProxyDecryptionClient(decryptor); - bool result = priv->cdmProxy->decrypt(context, priv->inputCaps); - - return result; + return priv->cdmProxy->decrypt(context, priv->inputCaps); } #undef GST_CAT_DEFAULT diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp 2026-04-07 11:56:56.889725400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp 2026-07-09 07:12:42.136795800 +0000 @@ -525,7 +525,7 @@ // Because a track presentation time starting at some close to zero, but not exactly zero time can cause unexpected // results for applications, we extend the duration of this first sample to the left so that it starts at zero. if (mediaSample->decodeTime() == MediaTime::zeroTime() && mediaSample->presentationTime() > MediaTime::zeroTime() - && mediaSample->presentationTime() <= MediaTime(1, 10) + && mediaSample->presentationTime() <= MediaTime(1, 1) && mediaSample->isSync()) { GST_DEBUG_OBJECT(pipeline(), "Extending first sample to make it start at PTS=0"); mediaSample->extendToTheBeginning(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp 2026-02-23 14:40:55.652299600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp 2026-07-09 07:12:42.136795800 +0000 @@ -134,8 +134,8 @@ void MediaPlayerPrivateGStreamerMSE::load(const URL& url, const LoadOptions&, MediaSourcePrivateClient& mediaSource) { - auto mseBlobURI = makeString("mediasource"_s, url.string().isEmpty() ? "blob://"_s : url.string()); - GST_DEBUG("Loading %s", mseBlobURI.ascii().data()); + auto urlString = makeString("mediasource"_s, url.string().isEmpty() ? "blob://"_s : url.string()); + GST_DEBUG("Loading %s", urlString.ascii().data()); if (RefPtr mediaSourcePrivate = downcast(mediaSource.mediaSourcePrivate())) { mediaSourcePrivate->setPlayer(this); m_mediaSourcePrivate = WTF::move(mediaSourcePrivate); @@ -143,12 +143,14 @@ } else m_mediaSourcePrivate = MediaSourcePrivateGStreamer::open(mediaSource, *this); - MediaPlayerPrivateGStreamer::load(mseBlobURI); + MediaPlayerPrivateGStreamer::load(urlString); } void MediaPlayerPrivateGStreamerMSE::play() { - GST_DEBUG_OBJECT(pipeline(), "Play requested"); + GST_INFO_OBJECT(pipeline(), "Play requested"); + if (!pipeline()) + rebuildPipeline(); m_isPaused = false; if (!m_playbackRate && m_playbackRatePausedState == PlaybackRatePausedState::ManuallyPaused) m_playbackRatePausedState = PlaybackRatePausedState::RatePaused; @@ -157,7 +159,7 @@ void MediaPlayerPrivateGStreamerMSE::pause() { - GST_DEBUG_OBJECT(pipeline(), "Pause requested"); + GST_INFO_OBJECT(pipeline(), "Pause requested"); if (m_playbackRatePausedState == PlaybackRatePausedState::ManuallyPaused) { GST_DEBUG_OBJECT(pipeline(), "Player is paused already."); return; @@ -242,8 +244,9 @@ void MediaPlayerPrivateGStreamerMSE::seekToTarget(const SeekTarget& target) { if (!m_pipeline) - return; - GST_DEBUG_OBJECT(pipeline(), "Requested seek to %s", target.time.toString().utf8().data()); + rebuildPipeline(); + + GST_INFO_OBJECT(pipeline(), "Requested seek to %s", target.time.toString().utf8().data()); doSeek(target, m_playbackRate); } @@ -251,7 +254,7 @@ { UNUSED_PARAM(isAsync); RefPtr player = m_player.get(); - if (!player) + if (!player || !m_source) return false; // This method should only be called outside of MediaPlayerPrivateGStreamerMSE by MediaPlayerPrivateGStreamer::setRate(). @@ -283,6 +286,7 @@ // Important: In order to ensure correct propagation whether pre-roll has happened or not, we send the seek directly // to the source element, rather than letting playbin do the routing. + RELEASE_ASSERT(m_source); { // Take the STATE_LOCK of the __pipeline__. // @@ -430,9 +434,9 @@ // c) At the end of a flush (forced quality change). These should not produce either of these outcomes. // We identify (a) and (b) by setting m_isWaitingForPreroll = true at the initialization of the player and // at the beginning of a seek. - GST_DEBUG("Pipeline prerolled. currentMediaTime = %s", currentTime().toString().utf8().data()); + GST_DEBUG_OBJECT(pipeline(), "Pipeline prerolled. currentMediaTime = %s", currentTime().toString().utf8().data()); if (!m_isWaitingForPreroll) { - GST_DEBUG("Preroll was consequence of a flush, nothing to do at this level."); + GST_DEBUG_OBJECT(pipeline(), "Preroll was consequence of a flush, nothing to do at this level."); return; } m_isWaitingForPreroll = false; @@ -453,6 +457,12 @@ propagateReadyStateToPlayer(); } +void MediaPlayerPrivateGStreamerMSE::didEnd() +{ + MediaPlayerPrivateGStreamer::didEnd(); + tearDown(false); +} + const PlatformTimeRanges& MediaPlayerPrivateGStreamerMSE::buffered() const { if (!m_source) @@ -487,7 +497,7 @@ bool shouldUpdatePlaybackState = false; bool shouldBePlaying = (!m_isPaused && !isPausedByViewport() && readyState() >= MediaPlayer::ReadyState::HaveFutureData && m_playbackRatePausedState != PlaybackRatePausedState::RatePaused) || m_playbackRatePausedState == PlaybackRatePausedState::ShouldMoveToPlaying; - GST_DEBUG_OBJECT(pipeline(), "shouldBePlaying = %s, m_isPipelinePlaying = %s, is seeking %s", boolForPrinting(shouldBePlaying), + GST_DEBUG_OBJECT(pipeline(), "shouldBePlaying = %s, m_isPipelinePlaying = %s, is waiting preroll = %s", boolForPrinting(shouldBePlaying), boolForPrinting(m_isPipelinePlaying), boolForPrinting(isWaitingPreroll)); if (!isWaitingPreroll && shouldBePlaying && !m_isPipelinePlaying) { auto result = changePipelineState(GST_STATE_PLAYING); @@ -503,11 +513,6 @@ GST_ERROR_OBJECT(pipeline(), "Setting the pipeline to PAUSED failed"); shouldUpdatePlaybackState = result == ChangePipelineStateResult::Ok; - } else if (m_isEosWithNoBuffers) { - if (auto player = m_player.get()) { - // Trigger playback end detection in HTMLMediaElement. - player->timeChanged(); - } } if (!shouldUpdatePlaybackState) @@ -574,7 +579,7 @@ if (!uniqueTracks.containsIf([&track](const auto& current) { return track->id() == current->id(); })) { uniqueTracks.append(track); - if (track->type() != TrackPrivateBaseGStreamer::Text) + if (track->type() != GStreamerTrackType::Text) playbackTracks.append(track); else GST_DEBUG("Ignoring text track with id %" PRIu64, track->id()); @@ -588,32 +593,21 @@ webKitMediaSrcEmitStreams(WEBKIT_MEDIA_SRC(m_source.get()), playbackTracks); } -void MediaPlayerPrivateGStreamerMSE::setEosWithNoBuffers(bool eosWithNoBuffers) +void MediaPlayerPrivateGStreamerMSE::rebuildPipeline() { - m_isEosWithNoBuffers = eosWithNoBuffers; - // Parsebin will trigger an error, instruct MediaPlayerPrivateGStreamer to ignore it. - if (eosWithNoBuffers) { - // On GStreamer, EOS with no buffers causes a parsebin error here: - // https://github.com/GStreamer/gst-plugins-base/blob/1.18.6/gst/playback/gstparsebin.c#L3495 - - m_ignoreErrors = true; - - GST_DEBUG_OBJECT(pipeline(), "EOS with no buffers, setting pipeline to READY state."); - changePipelineState(GST_STATE_READY); - - unsigned errorCount = m_queuedSyncErrors.loadFullyFenced(); - if (errorCount) { - GST_WARNING_OBJECT(pipeline(), "%u errors pending to process happened while processing EOS with" - " no buffers and should be ignored, manually reporting EOS", errorCount); - didEnd(); - // In the best case, m_ignoreErrors will be cleaned up (in the main thread) in MediaPlayerPrivateGStreamer::handleMessage() - // in the future, after the last pending error is processed on the main thread. In the worst case, didEnd() will trigger - // a pipeline teardown, which will trigger gst_bus_set_flushing() and the pending error message won't ever be processed - // by the main thread. That's not a problem, since the player itself will be destructed and nobody will care about the - // error count integrity anymore. - } else - m_ignoreErrors = false; + if (pipeline()) + return; + + if (!m_mediaSourcePrivate || !m_mediaSourcePrivate->hasAllTracks()) [[unlikely]] { + GST_ERROR("Not all tracks are ready, aborting rebuild."); + ASSERT_NOT_REACHED(); + return; } + + GST_DEBUG("Re-building the pipeline"); + m_isEndReached = false; + MediaPlayerPrivateGStreamer::load(m_url.string()); + changePipelineState(GST_STATE_PAUSED); } void MediaPlayerPrivateGStreamerMSE::getSupportedTypes(HashSet& types) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.h 2026-02-23 14:40:55.652299600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.h 2026-07-09 07:12:42.136795800 +0000 @@ -85,11 +85,12 @@ void setInitialVideoSize(const FloatSize&); void didPreroll() override; + void didEnd() final; void startSource(const Vector>& tracks); WebKitMediaSrc* webKitMediaSrc() { return reinterpret_cast(m_source.get()); } - void setEosWithNoBuffers(bool); + void rebuildPipeline(); #if !RELEASE_LOG_DISABLED WTFLogChannel& logChannel() const final { return WebCore::LogMediaSource; } @@ -134,7 +135,6 @@ Vector> m_tracks; bool m_isWaitingForPreroll = true; - bool m_isEosWithNoBuffers = false; MediaPlayer::ReadyState m_mediaSourceReadyState = MediaPlayer::ReadyState::HaveNothing; MediaPlayer::NetworkState m_mediaSourceNetworkState = MediaPlayer::NetworkState::Empty; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.cpp 2026-02-23 14:40:55.652299600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.cpp 2026-07-09 07:12:42.140795700 +0000 @@ -133,11 +133,12 @@ ASSERT(isMainThread()); MediaSourcePrivate::markEndOfStream(endOfStreamStatus); + +#ifndef GST_DISABLE_GST_DEBUG RefPtr player = platformPlayer(); if (!player) return; -#ifndef GST_DISABLE_GST_DEBUG ASCIILiteral statusString; switch (endOfStreamStatus) { case EndOfStreamStatus::NoError: @@ -150,15 +151,8 @@ statusString = "network-error"_s; break; } - GST_DEBUG_OBJECT(player->pipeline(), "Marking EOS, status is %s", statusString.characters()); + GST_DEBUG_OBJECT(player->pipeline(), "Marked EOS, status is %s", statusString.characters()); #endif - if (endOfStreamStatus == EndOfStreamStatus::NoError) { - auto bufferedRanges = buffered(); - if (!bufferedRanges.length()) { - GST_DEBUG("EOS with no buffers"); - player->setEosWithNoBuffers(true); - } - } } void MediaSourcePrivateGStreamer::unmarkEndOfStream() @@ -168,7 +162,7 @@ if (!player) return; - player->setEosWithNoBuffers(false); + player->rebuildPipeline(); MediaSourcePrivate::unmarkEndOfStream(); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.h 2026-02-23 14:40:55.652299600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.h 2026-07-09 07:12:42.140795700 +0000 @@ -74,7 +74,7 @@ void detach(); - // Similar to TrackPrivateBaseGStreamer::TrackType, but with a new value (Invalid) for when the codec is + // Similar to WebCore::GStreamerTrackType, but with a new value (Invalid) for when the codec is // not supported on this system, which should result in ParsingFailed error being thrown in SourceBuffer. enum StreamType { Audio, Video, Text, Unknown, Invalid }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourceTrackGStreamer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourceTrackGStreamer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourceTrackGStreamer.cpp 2026-02-23 14:40:55.653299600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourceTrackGStreamer.cpp 2026-07-09 07:12:42.140795700 +0000 @@ -39,7 +39,7 @@ namespace WebCore { -MediaSourceTrackGStreamer::MediaSourceTrackGStreamer(TrackPrivateBaseGStreamer::TrackType type, TrackID trackId, GRefPtr&& initialCaps) +MediaSourceTrackGStreamer::MediaSourceTrackGStreamer(GStreamerTrackType type, TrackID trackId, GRefPtr&& initialCaps) : m_type(type) , m_id(trackId) , m_initialCaps(WTF::move(initialCaps)) @@ -56,7 +56,7 @@ ASSERT(m_isRemoved); } -Ref MediaSourceTrackGStreamer::create(TrackPrivateBaseGStreamer::TrackType type, TrackID trackId, GRefPtr&& initialCaps) +Ref MediaSourceTrackGStreamer::create(GStreamerTrackType type, TrackID trackId, GRefPtr&& initialCaps) { return adoptRef(*new MediaSourceTrackGStreamer(type, trackId, WTF::move(initialCaps))); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourceTrackGStreamer.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourceTrackGStreamer.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourceTrackGStreamer.h 2026-02-23 14:40:55.653299600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/MediaSourceTrackGStreamer.h 2026-07-09 07:12:42.140795700 +0000 @@ -41,10 +41,10 @@ class MediaSourceTrackGStreamer final: public ThreadSafeRefCounted { public: - static Ref create(TrackPrivateBaseGStreamer::TrackType, TrackID, GRefPtr&& initialCaps); + static Ref create(GStreamerTrackType, TrackID, GRefPtr&& initialCaps); ~MediaSourceTrackGStreamer(); - TrackPrivateBaseGStreamer::TrackType type() const { return m_type; } + GStreamerTrackType type() const { return m_type; } TrackID id() const { return m_id; } GRefPtr& initialCaps() { return m_initialCaps; } DataMutex& queueDataMutex() { return m_queueDataMutex; } @@ -64,9 +64,9 @@ void remove(); private: - explicit MediaSourceTrackGStreamer(TrackPrivateBaseGStreamer::TrackType, TrackID, GRefPtr&& initialCaps); + explicit MediaSourceTrackGStreamer(GStreamerTrackType, TrackID, GRefPtr&& initialCaps); - TrackPrivateBaseGStreamer::TrackType m_type; + GStreamerTrackType m_type; TrackID m_id; GRefPtr m_initialCaps; DataMutex m_queueDataMutex; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/SourceBufferPrivateGStreamer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/SourceBufferPrivateGStreamer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/SourceBufferPrivateGStreamer.cpp 2026-04-07 11:49:37.724368000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/SourceBufferPrivateGStreamer.cpp 2026-07-09 07:12:42.140795700 +0000 @@ -165,7 +165,7 @@ return; } - if (track->type() == TrackPrivateBaseGStreamer::Text) { + if (track->type() == GStreamerTrackType::Text) { if (player) GST_DEBUG_OBJECT(player->pipeline(), "Track is a text stream, so we only need to clear the queue. trackId = '%" PRIu64 "'", track->id()); track->clearQueue(); @@ -175,7 +175,8 @@ if (!player) return; GST_DEBUG_OBJECT(player->pipeline(), "Source element has emitted tracks, let it handle the flush, which may cause a pipeline flush as well. trackId = '%" PRIu64 "'", track->id()); - webKitMediaSrcFlush(player->webKitMediaSrc(), track->id()); + if (auto source = player->webKitMediaSrc()) + webKitMediaSrcFlush(source, track->id()); } void SourceBufferPrivateGStreamer::enqueueSample(Ref&& sample, TrackID trackId) @@ -199,7 +200,7 @@ auto track = m_tracks[trackId]; #ifndef GST_DISABLE_GST_DEBUG - if (player && track->type() == TrackPrivateBaseGStreamer::Text) { + if (player && track->type() == GStreamerTrackType::Text) { GstMappedBuffer mappedBuffer(gst_sample_get_buffer(gstSample.get()), GST_MAP_READ); if (mappedBuffer) [[likely]] { @@ -254,21 +255,21 @@ GRefPtr initialCaps = videoTrackInfo->initialCaps(); ASSERT(initialCaps); if (!m_tracks.contains(videoTrackInfo->id())) - m_tracks.try_emplace(videoTrackInfo->id(), MediaSourceTrackGStreamer::create(TrackPrivateBaseGStreamer::TrackType::Video, videoTrackInfo->id(), WTF::move(initialCaps))); + m_tracks.try_emplace(videoTrackInfo->id(), MediaSourceTrackGStreamer::create(GStreamerTrackType::Video, videoTrackInfo->id(), WTF::move(initialCaps))); } for (auto& trackInfo : segment.audioTracks) { auto* audioTrackInfo = static_cast(trackInfo.track.get()); GRefPtr initialCaps = audioTrackInfo->initialCaps(); ASSERT(initialCaps); if (!m_tracks.contains(audioTrackInfo->id())) - m_tracks.try_emplace(audioTrackInfo->id(), MediaSourceTrackGStreamer::create(TrackPrivateBaseGStreamer::TrackType::Audio, audioTrackInfo->id(), WTF::move(initialCaps))); + m_tracks.try_emplace(audioTrackInfo->id(), MediaSourceTrackGStreamer::create(GStreamerTrackType::Audio, audioTrackInfo->id(), WTF::move(initialCaps))); } for (auto& trackInfo : segment.textTracks) { auto* textTrackInfo = static_cast(trackInfo.track.get()); GRefPtr initialCaps = textTrackInfo->initialCaps(); ASSERT(initialCaps); if (!m_tracks.contains(textTrackInfo->id())) - m_tracks.try_emplace(textTrackInfo->id(), MediaSourceTrackGStreamer::create(TrackPrivateBaseGStreamer::TrackType::Text, textTrackInfo->id(), WTF::move(initialCaps))); + m_tracks.try_emplace(textTrackInfo->id(), MediaSourceTrackGStreamer::create(GStreamerTrackType::Text, textTrackInfo->id(), WTF::move(initialCaps))); } return true; @@ -384,13 +385,13 @@ for (auto& [_, track] : m_tracks) { switch (track->type()) { - case TrackPrivateBaseGStreamer::Video: + case GStreamerTrackType::Video: hasVideo = true; break; - case TrackPrivateBaseGStreamer::Audio: + case GStreamerTrackType::Audio: hasAudio = true; break; - case TrackPrivateBaseGStreamer::Text: + case GStreamerTrackType::Text: hasText = true; break; default: diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/TrackQueue.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/TrackQueue.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/TrackQueue.h 2026-01-20 14:08:46.222673700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/TrackQueue.h 2026-07-09 07:12:42.140795700 +0000 @@ -67,14 +67,14 @@ // If we had no queue, the main thread would have to be awaken for every frame. On the other hand, if the // queue had unlimited size WebKit would end up requesting flushes more often than necessary when frames // in the future are re-appended. As a sweet spot between these extremes we choose to allow enqueueing a - // few seconds worth of samples. + // couple hundred milliseconds worth of samples. // `isReadyForMoreSamples` follows the classical two water levels strategy: initially it's true until the // high water level is reached, then it becomes false until the queue drains down to the low water level // and the cycle repeats. This way we avoid stalls and minimize context switches. - static const GstClockTime s_durationEnqueuedHighWaterLevel = 5 * GST_SECOND; - static const GstClockTime s_durationEnqueuedLowWaterLevel = 2 * GST_SECOND; + static const GstClockTime s_durationEnqueuedHighWaterLevel = 200 * GST_MSECOND; + static const GstClockTime s_durationEnqueuedLowWaterLevel = 100 * GST_MSECOND; GstClockTime durationEnqueued() const; void checkLowLevel(); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp 2026-02-23 14:40:55.653299600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp 2026-07-09 07:12:42.140795700 +0000 @@ -203,14 +203,14 @@ #endif } -static GstStreamType gstStreamType(TrackPrivateBaseGStreamer::TrackType type) +static GstStreamType gstStreamType(GStreamerTrackType type) { switch (type) { - case TrackPrivateBaseGStreamer::TrackType::Video: + case GStreamerTrackType::Video: return GST_STREAM_TYPE_VIDEO; - case TrackPrivateBaseGStreamer::TrackType::Audio: + case GStreamerTrackType::Audio: return GST_STREAM_TYPE_AUDIO; - case TrackPrivateBaseGStreamer::TrackType::Text: + case GStreamerTrackType::Text: return GST_STREAM_TYPE_TEXT; default: GST_ERROR("Received unexpected stream type"); @@ -219,17 +219,17 @@ } #ifndef GST_DISABLE_GST_DEBUG -static ASCIILiteral streamTypeToString(TrackPrivateBaseGStreamer::TrackType type) +static ASCIILiteral streamTypeToString(GStreamerTrackType type) { switch (type) { - case TrackPrivateBaseGStreamer::TrackType::Audio: + case GStreamerTrackType::Audio: return "Audio"_s; - case TrackPrivateBaseGStreamer::TrackType::Video: + case GStreamerTrackType::Video: return "Video"_s; - case TrackPrivateBaseGStreamer::TrackType::Text: + case GStreamerTrackType::Text: return "Text"_s; default: - case TrackPrivateBaseGStreamer::TrackType::Unknown: + case GStreamerTrackType::Unknown: return "Unknown"_s; } } @@ -588,6 +588,7 @@ } GRefPtr buffer = gst_sample_get_buffer(sample.get()); + auto isBufferEncrypted = areEncryptedCaps(gst_sample_get_caps(sample.get())); sample.clear(); bool pushingFirstBuffer = !streamingMembers->hasPushedFirstBuffer; @@ -603,22 +604,31 @@ ASSERT(GST_BUFFER_PTS_IS_VALID(buffer.get())); GST_TRACE_OBJECT(pad, "Pushing buffer downstream: %" GST_PTR_FORMAT, buffer.get()); GstFlowReturn result = gst_pad_push(pad, buffer.leakRef()); - if (result == GST_FLOW_NOT_LINKED && stream->track->type() == TrackPrivateBaseGStreamer::TrackType::Video) { + if (result == GST_FLOW_NOT_LINKED && stream->track->type() == GStreamerTrackType::Video) { // We allow multiple video tracks and all of them except one may be unlinked. Just drop the buffer. GST_TRACE_OBJECT(pad, "Buffer not pushed because pad is not-linked, ignoring"); } else if (result != GST_FLOW_OK && result != GST_FLOW_FLUSHING) { gst_pad_pause_task(pad); - GST_ELEMENT_ERROR(stream->source, CORE, PAD, ("Failed to push buffer"), ("gst_pad_push() returned %s", gst_flow_get_name(result))); + // Do not propagate NoKey decryption errors downstream, the decryptor should already have emitted an appropriate error message. + if (!isBufferEncrypted && result != GST_FLOW_CUSTOM_ERROR) + GST_ELEMENT_ERROR(stream->source, CORE, PAD, ("Failed to push buffer"), ("gst_pad_push() returned %s", gst_flow_get_name(result))); } else if (pushingFirstBuffer) { GST_DEBUG_OBJECT(pad, "First buffer on this pad was pushed (ret = %s).", gst_flow_get_name(result)); dumpPipeline("first-frame-after"_s, stream); } -IGNORE_WARNINGS_BEGIN("cast-align") + IGNORE_WARNINGS_BEGIN("cast-align"); } else if (GST_IS_EVENT(object.get())) { // EOS events and other enqueued events are also sent unlocked so they can react to flushes if necessary. GRefPtr event = GRefPtr(GST_EVENT(object.leakRef())); -IGNORE_WARNINGS_END + IGNORE_WARNINGS_END; + if (GST_EVENT_TYPE(event.get()) == GST_EVENT_EOS && !streamingMembers->hasPushedFirstBuffer) { + // parsebin emits errors if it receives EOS without prior buffer and those errors bubble + // up to our media player, leading to false-positive errors. Even if this parsebin + // behavior is acceptable in the general case, it is problematic for MSE. + GST_DEBUG_OBJECT(pad, "Ignoring EOS on non-prerolled pad"); + return; + } streamingMembers.unlockEarly(); GST_DEBUG_OBJECT(pad, "Pushing event downstream: %" GST_PTR_FORMAT, event.get()); bool eventHandled = gst_pad_push_event(pad, GRefPtr(event).leakRef()); @@ -773,7 +783,7 @@ webKitMediaSrcStreamFlush(stream.get(), true); } -static int countStreamsOfType(WebKitMediaSrc* source, WebCore::TrackPrivateBaseGStreamer::TrackType type) +static int countStreamsOfType(WebKitMediaSrc* source, WebCore::GStreamerTrackType type) { // Barring pipeline dumps someone may add during debugging, WebKit will only read these properties (n-video etc.) from the main thread. return std::count_if(source->priv->streams.begin(), source->priv->streams.end(), [type](auto item) { @@ -787,13 +797,13 @@ switch (propId) { case WEBKIT_MEDIA_SRC_PROP_N_AUDIO: - g_value_set_int(value, countStreamsOfType(source, WebCore::TrackPrivateBaseGStreamer::TrackType::Audio)); + g_value_set_int(value, countStreamsOfType(source, WebCore::GStreamerTrackType::Audio)); break; case WEBKIT_MEDIA_SRC_PROP_N_VIDEO: - g_value_set_int(value, countStreamsOfType(source, WebCore::TrackPrivateBaseGStreamer::TrackType::Video)); + g_value_set_int(value, countStreamsOfType(source, WebCore::GStreamerTrackType::Video)); break; case WEBKIT_MEDIA_SRC_PROP_N_TEXT: - g_value_set_int(value, countStreamsOfType(source, WebCore::TrackPrivateBaseGStreamer::TrackType::Text)); + g_value_set_int(value, countStreamsOfType(source, WebCore::GStreamerTrackType::Text)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, pspec); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/skia/ComplexTextControllerSkia.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/skia/ComplexTextControllerSkia.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/skia/ComplexTextControllerSkia.cpp 2026-02-23 14:40:55.660299500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/skia/ComplexTextControllerSkia.cpp 2026-07-09 07:12:42.140795700 +0000 @@ -64,7 +64,6 @@ WTF_ALLOW_UNSAFE_BUFFER_USAGE_BEGIN // GLib/Win port hb_glyph_info_t* glyphInfos = hb_buffer_get_glyph_infos(buffer, nullptr); hb_glyph_position_t* glyphPositions = hb_buffer_get_glyph_positions(buffer, nullptr); - WTF_ALLOW_UNSAFE_BUFFER_USAGE_END // HarfBuzz returns the shaping result in visual order. We don't need to flip for RTL. for (unsigned i = 0; i < m_glyphCount; ++i) { @@ -87,6 +86,7 @@ m_baseAdvances[i] = { advanceX, advanceY }; m_glyphOrigins[i] = { offsetX, offsetY }; } + WTF_ALLOW_UNSAFE_BUFFER_USAGE_END m_initialAdvance = toFloatSize(m_glyphOrigins[0]); } @@ -219,6 +219,7 @@ auto language = hb_language_from_string(m_fontCascade->fontDescription().computedLocale().string().utf8().data(), -1); auto shapeFunction = [&](const HBRun& run) { + hb_buffer_set_cluster_level(buffer.get(), HB_BUFFER_CLUSTER_LEVEL_CHARACTERS); hb_buffer_set_language(buffer.get(), language); hb_buffer_set_script(buffer.get(), hb_icu_script_to_script(run.script)); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/skia/FontCascadeSkia.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/skia/FontCascadeSkia.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/skia/FontCascadeSkia.cpp 2026-01-20 14:08:46.258673700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/skia/FontCascadeSkia.cpp 2026-07-09 07:12:42.140795700 +0000 @@ -167,7 +167,7 @@ } } - return nullptr; + return baseCharacterGlyphData.font.get(); } } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/skia/FontSkia.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/skia/FontSkia.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/skia/FontSkia.cpp 2026-02-23 14:40:55.660299500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/skia/FontSkia.cpp 2026-07-09 07:12:42.140795700 +0000 @@ -167,9 +167,15 @@ RefPtr Font::platformCreateHalfWidthFont() const { - // FIXME: https://bugs.webkit.org/show_bug.cgi?id=281333 : implement half width font for this platform. - notImplemented(); - return nullptr; + return Font::create(FontPlatformData(m_platformData.skFont().refTypeface(), m_platformData.size(), + m_platformData.syntheticBold(), + m_platformData.syntheticOblique(), + m_platformData.orientation(), + FontWidthVariant::HalfWidth, + m_platformData.textRenderingMode(), + Vector { m_platformData.features() }, + m_platformData.customPlatformData()), + origin(), IsInterstitial::No); } void Font::determinePitch() diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/texmap/GraphicsContextGLTextureMapperANGLE.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/texmap/GraphicsContextGLTextureMapperANGLE.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/texmap/GraphicsContextGLTextureMapperANGLE.cpp 2026-02-23 14:40:55.665299400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/texmap/GraphicsContextGLTextureMapperANGLE.cpp 2026-07-09 07:12:42.140795700 +0000 @@ -306,7 +306,7 @@ eglContextAttributes.append(0); #endif - if (contains(unsafeSpan(displayExtensions), "EGL_ANGLE_power_preference"_span)) { + if (WTF::contains(unsafeSpan(displayExtensions), "EGL_ANGLE_power_preference"_span)) { eglContextAttributes.append(EGL_POWER_PREFERENCE_ANGLE); // EGL_LOW_POWER_ANGLE is the default. Change to // EGL_HIGH_POWER_ANGLE if desired. diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/texmap/TextureMapper.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/texmap/TextureMapper.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/texmap/TextureMapper.cpp 2026-04-01 21:32:25.473707400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/texmap/TextureMapper.cpp 2026-07-09 07:12:42.140795700 +0000 @@ -397,7 +397,6 @@ WTF_ALLOW_UNSAFE_BUFFER_USAGE_BEGIN // GLib/Win port float fullKernel[GaussianKernelMaxHalfSize]; - WTF_ALLOW_UNSAFE_BUFFER_USAGE_END fullKernel[0] = 1; // gauss(0, radius); float sum = fullKernel[0]; @@ -432,6 +431,7 @@ kernel[i] = fullKernel[offset1] + fullKernel[offset2]; offset[i] = (fullKernel[offset1] * offset1 + fullKernel[offset2] * offset2) / kernel[i]; } + WTF_ALLOW_UNSAFE_BUFFER_USAGE_END return simplifiedKernelHalfSize; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp 2026-04-01 21:32:25.474707400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp 2026-07-09 07:12:42.140795700 +0000 @@ -812,7 +812,6 @@ vertex[2].w >= 0, vertex[3].w >= 0 }; - WTF_ALLOW_UNSAFE_BUFFER_USAGE_END auto findFirstPositiveVertex = [&]() { int i = 0; @@ -926,6 +925,7 @@ return clipped(xMinMax, yMinMax); } } + WTF_ALLOW_UNSAFE_BUFFER_USAGE_END ASSERT_NOT_REACHED(); return { }; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/texmap/TextureMapperShaderProgram.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/texmap/TextureMapperShaderProgram.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/texmap/TextureMapperShaderProgram.cpp 2026-02-23 14:40:55.667299500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/texmap/TextureMapperShaderProgram.cpp 2026-07-09 07:12:42.144795400 +0000 @@ -62,7 +62,7 @@ varying vec2 v_texCoord; varying vec2 v_transformedTexCoord; varying float v_antialias; - varying vec4 v_nonProjectedPosition; + varying highp vec4 v_nonProjectedPosition; ); static const char* vertexTemplateCommon = @@ -194,7 +194,7 @@ varying float v_antialias; varying vec2 v_texCoord; varying vec2 v_transformedTexCoord; - varying vec4 v_nonProjectedPosition; + varying highp vec4 v_nonProjectedPosition; ); // PQ tone-mapping function with conditional highp precision. @@ -274,8 +274,8 @@ uniform int u_gaussianKernelHalfSize; uniform vec2 u_blurDirection; uniform int u_roundedRectNumber; - uniform vec4 u_roundedRect[ROUNDED_RECT_ARRAY_SIZE]; - uniform mat4 u_roundedRectInverseTransformMatrix[ROUNDED_RECT_INVERSE_TRANSFORM_ARRAY_SIZE]; + uniform highp vec4 u_roundedRect[ROUNDED_RECT_ARRAY_SIZE]; + uniform highp mat4 u_roundedRectInverseTransformMatrix[ROUNDED_RECT_INVERSE_TRANSFORM_ARRAY_SIZE]; void noop(inout vec4 dummyParameter) { } void noop(inout vec4 dummyParameter, vec2 texCoord) { } @@ -480,32 +480,32 @@ void applySolidColor(inout vec4 color) { color *= u_color; } - float ellipsisDist(vec2 p, vec2 radius) + float ellipsisDist(highp vec2 p, highp vec2 radius) { if (radius == vec2(0, 0)) return 0.0; - vec2 p0 = p / radius; - vec2 p1 = 2.0 * p0 / radius; + highp vec2 p0 = p / radius; + highp vec2 p1 = 2.0 * p0 / radius; return (dot(p0, p0) - 1.0) / length (p1); } - float ellipsisCoverage(vec2 point, vec2 center, vec2 radius) + float ellipsisCoverage(highp vec2 point, highp vec2 center, highp vec2 radius) { - float d = ellipsisDist(point - center, radius); + highp float d = ellipsisDist(point - center, radius); return clamp(0.5 - d, 0.0, 1.0); } - float roundedRectCoverage(vec2 p, vec4 bounds, vec2 topLeftRadii, vec2 topRightRadii, vec2 bottomLeftRadii, vec2 bottomRightRadii) + float roundedRectCoverage(highp vec2 p, highp vec4 bounds, highp vec2 topLeftRadii, highp vec2 topRightRadii, highp vec2 bottomLeftRadii, highp vec2 bottomRightRadii) { if (p.x < bounds.x || p.y < bounds.y || p.x >= bounds.z || p.y >= bounds.w) return 0.0; - vec2 topLeftCenter = bounds.xy + topLeftRadii; - vec2 topRightCenter = bounds.zy + (topRightRadii * vec2(-1, 1)); - vec2 bottomLeftCenter = bounds.xw + (bottomLeftRadii * vec2(1, -1)); - vec2 bottomRightCenter = bounds.zw + (bottomRightRadii * vec2(-1, -1)); + highp vec2 topLeftCenter = bounds.xy + topLeftRadii; + highp vec2 topRightCenter = bounds.zy + (topRightRadii * vec2(-1, 1)); + highp vec2 bottomLeftCenter = bounds.xw + (bottomLeftRadii * vec2(1, -1)); + highp vec2 bottomRightCenter = bounds.zw + (bottomRightRadii * vec2(-1, -1)); if (p.x < topLeftCenter.x && p.y < topLeftCenter.y) return ellipsisCoverage(p, topLeftCenter, topLeftRadii); @@ -533,17 +533,24 @@ // // This implementation is not optimal, but it's done this way in order to overcome rpi3's // proprietary video driver limitations (see https://bugs.webkit.org/show_bug.cgi?id=219739). + // + // The round-clip data, varying and locals carry highp because some proprietary GLES + // drivers mishandle the (dot(p0,p0) - 1.0) / length(p1) form in ellipsisDist() under + // mediump (fp16): on PowerVR B-Series (Imagination DDK) ellipsisCoverage returns 0 + // for fragments deep inside the inscribed ellipse, turning the clipped descendant + // layers into solid coverage=0 (silent black). highp on the round-clip path only + // restores correct output and preserves mediump elsewhere. for (int rectIndex = 0; rectIndex < ROUNDED_RECT_MAX_RECTS; rectIndex++) { if (rectIndex >= u_roundedRectNumber) break; - vec4 fragCoord = u_roundedRectInverseTransformMatrix[rectIndex] * v_nonProjectedPosition; - vec4 bounds = vec4(u_roundedRect[rectIndex * 3].xy, u_roundedRect[rectIndex * 3].xy + u_roundedRect[rectIndex * 3].zw); - vec2 topLeftRadii = u_roundedRect[(rectIndex * 3) + 1].xy; - vec2 topRightRadii = u_roundedRect[(rectIndex * 3) + 1].zw; - vec2 bottomLeftRadii = u_roundedRect[(rectIndex * 3) + 2].xy; - vec2 bottomRightRadii = u_roundedRect[(rectIndex * 3) + 2].zw; + highp vec4 fragCoord = u_roundedRectInverseTransformMatrix[rectIndex] * v_nonProjectedPosition; + highp vec4 bounds = vec4(u_roundedRect[rectIndex * 3].xy, u_roundedRect[rectIndex * 3].xy + u_roundedRect[rectIndex * 3].zw); + highp vec2 topLeftRadii = u_roundedRect[(rectIndex * 3) + 1].xy; + highp vec2 topRightRadii = u_roundedRect[(rectIndex * 3) + 1].zw; + highp vec2 bottomLeftRadii = u_roundedRect[(rectIndex * 3) + 2].xy; + highp vec2 bottomRightRadii = u_roundedRect[(rectIndex * 3) + 2].zw; float coverage = roundedRectCoverage(fragCoord.xy, bounds, topLeftRadii, topRightRadii, bottomLeftRadii, bottomRightRadii); // Pixels outside the rect have coverage 0.0. diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/texmap/coordinated/GraphicsLayerCoordinated.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/texmap/coordinated/GraphicsLayerCoordinated.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/texmap/coordinated/GraphicsLayerCoordinated.cpp 2026-02-23 14:40:55.671299500 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/texmap/coordinated/GraphicsLayerCoordinated.cpp 2026-07-09 07:12:42.144795400 +0000 @@ -1066,7 +1066,7 @@ if (m_pendingChanges.contains(Change::ContentsTiling)) { m_platformLayer->setContentsTileSize(m_contentsTileSize); - m_platformLayer->setContentsTileSize(m_contentsTilePhase); + m_platformLayer->setContentsTilePhase(m_contentsTilePhase); } if (m_pendingChanges.contains(Change::ContentsClippingRect)) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/transforms/TransformOperation.cpp webkit2gtk-2.52.5/Source/WebCore/platform/graphics/transforms/TransformOperation.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/transforms/TransformOperation.cpp 2026-01-20 14:08:46.297673700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/transforms/TransformOperation.cpp 2026-07-09 07:12:42.144795400 +0000 @@ -50,7 +50,7 @@ case TransformOperation::Type::SkewY: ts << "skewY"_s; break; case TransformOperation::Type::Skew: ts << "skew"_s; break; case TransformOperation::Type::Matrix: ts << "matrix"_s; break; - case TransformOperation::Type::ScaleZ: ts << "scaleX"_s; break; + case TransformOperation::Type::ScaleZ: ts << "scaleZ"_s; break; case TransformOperation::Type::Scale3D: ts << "scale3d"_s; break; case TransformOperation::Type::TranslateZ: ts << "translateZ"_s; break; case TransformOperation::Type::Translate3D: ts << "translate3d"_s; break; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/graphics/x11/XErrorTrapper.h webkit2gtk-2.52.5/Source/WebCore/platform/graphics/x11/XErrorTrapper.h --- webkit2gtk-2.52.3/Source/WebCore/platform/graphics/x11/XErrorTrapper.h 2026-01-20 14:08:46.315673600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/graphics/x11/XErrorTrapper.h 2026-07-09 07:12:42.144795400 +0000 @@ -27,6 +27,9 @@ #if PLATFORM(X11) #include +#ifdef Success +#undef Success +#endif #include namespace WebCore { diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/gstreamer/WebKitFliteSourceGStreamer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/gstreamer/WebKitFliteSourceGStreamer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/gstreamer/WebKitFliteSourceGStreamer.cpp 2026-03-09 14:28:46.377746300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/gstreamer/WebKitFliteSourceGStreamer.cpp 2026-07-09 07:12:42.148795400 +0000 @@ -222,11 +222,13 @@ static Vector> voices; static std::once_flag onceFlag; std::call_once(onceFlag, [] { + WTF_ALLOW_UNSAFE_BUFFER_USAGE_BEGIN // GTK/WPE const unsigned voiceRegisterFunctionCount = sizeof(voiceRegisterFunctions) / sizeof(VoiceRegisterFunction); for (unsigned i = 0; i < voiceRegisterFunctionCount; ++i) { GUniquePtr voice(voiceRegisterFunctions[i](nullptr)); voices.append(WTF::move(voice)); } + WTF_ALLOW_UNSAFE_BUFFER_USAGE_END }); return voices; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/gtk/PlatformScreenGtk.cpp webkit2gtk-2.52.5/Source/WebCore/platform/gtk/PlatformScreenGtk.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/gtk/PlatformScreenGtk.cpp 2026-01-20 14:08:46.324748800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/gtk/PlatformScreenGtk.cpp 2026-07-09 07:12:42.148795400 +0000 @@ -59,13 +59,15 @@ int screenDepth(Widget* widget) { - auto* data = screenData(widgetDisplayID(widget)); + Ref platformScreen = PlatformScreen::singleton(); + auto* data = platformScreen->screenData(widgetDisplayID(widget)); return data ? data->screenDepth : 24; } int screenDepthPerComponent(Widget* widget) { - auto* data = screenData(widgetDisplayID(widget)); + Ref platformScreen = PlatformScreen::singleton(); + auto* data = platformScreen->screenData(widgetDisplayID(widget)); return data ? data->screenDepthPerComponent : 8; } @@ -90,27 +92,31 @@ if (xftDPI) return xftDPI.value() / 1024.0; - auto* data = screenData(primaryScreenDisplayID()); + Ref platformScreen = PlatformScreen::singleton(); + auto* data = platformScreen->screenData(platformScreen->primaryScreenDisplayID()); return data ? data->dpi : 96.; } double screenDPI(PlatformDisplayID screendisplayID) { - auto* data = screenData(screendisplayID); + Ref platformScreen = PlatformScreen::singleton(); + auto* data = platformScreen->screenData(screendisplayID); return data ? data->dpi : 96.; } FloatRect screenRect(Widget* widget) { - if (auto* data = screenData(widgetDisplayID(widget))) + Ref platformScreen = PlatformScreen::singleton(); + if (auto* data = platformScreen->screenData(widgetDisplayID(widget))) return data->screenRect; return { }; } FloatRect screenAvailableRect(Widget* widget) { - if (auto* data = screenData(widgetDisplayID(widget))) + Ref platformScreen = PlatformScreen::singleton(); + if (auto* data = platformScreen->screenData(widgetDisplayID(widget))) return data->screenAvailableRect; return { }; } @@ -123,7 +129,8 @@ #if ENABLE(TOUCH_EVENTS) bool screenHasTouchDevice() { - return getScreenProperties().screenHasTouchDevice; + Ref platformScreen = PlatformScreen::singleton(); + return platformScreen->screenProperties().screenHasTouchDevice; } #endif // ENABLE(TOUCH_EVENTS) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp webkit2gtk-2.52.5/Source/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp 2026-02-23 14:40:55.682299400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp 2026-07-09 07:12:42.148795400 +0000 @@ -599,7 +599,6 @@ { WTF_ALLOW_UNSAFE_BUFFER_USAGE_BEGIN // non-Apple ports JSAMPLE* jsample = *samples + column * (colorSpace == JCS_RGB ? 3 : 4); - WTF_ALLOW_UNSAFE_BUFFER_USAGE_END switch (colorSpace) { case JCS_RGB: @@ -619,6 +618,7 @@ buffer.backingStore()->setPixel(currentAddress[0], jsample[0] * k / 255, jsample[1] * k / 255, jsample[2] * k / 255, 0xFF); break; } + WTF_ALLOW_UNSAFE_BUFFER_USAGE_END } template diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp webkit2gtk-2.52.5/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp 2026-02-23 14:40:55.682299400 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/image-decoders/webp/WEBPImageDecoder.cpp 2026-07-09 07:12:42.148795400 +0000 @@ -279,11 +279,11 @@ auto& destinationPixel = buffer.backingStore()->pixelAt(canvasX, canvasY); WTF_ALLOW_UNSAFE_BUFFER_USAGE_BEGIN // non-Apple ports uint8_t* sourcePixels = decoderBuffer.u.RGBA.rgba + (y * frameRect.width() + x) * sizeof(uint32_t); - WTF_ALLOW_UNSAFE_BUFFER_USAGE_END if (blend && (sourcePixels[3] < 255)) buffer.backingStore()->blendPixel(destinationPixel, sourcePixels[0], sourcePixels[1], sourcePixels[2], sourcePixels[3]); else buffer.backingStore()->setPixel(destinationPixel, sourcePixels[0], sourcePixels[1], sourcePixels[2], sourcePixels[3]); + WTF_ALLOW_UNSAFE_BUFFER_USAGE_END } } } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/MediaStreamTrackDataHolder.cpp webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/MediaStreamTrackDataHolder.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/MediaStreamTrackDataHolder.cpp 2026-02-23 14:40:55.707299200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/MediaStreamTrackDataHolder.cpp 2026-07-09 07:12:42.148795400 +0000 @@ -103,6 +103,13 @@ { } +std::unique_ptr MediaStreamTrackDataHolder::copy() const +{ + auto holder = makeUnique(trackId.isolatedCopy(), label.isolatedCopy(), type, deviceType, isEnabled, isEnded, contentHint, isProducingData, isMuted, isInterrupted, settings.isolatedCopy(), capabilities.isolatedCopy(), source.copyRef()); + holder->preventSourceFromEndingObserverWrapper = preventSourceFromEndingObserverWrapper; + return holder; +} + } // namespace WebCore #endif // ENABLE(MEDIA_STREAM) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/MediaStreamTrackDataHolder.h webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/MediaStreamTrackDataHolder.h --- webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/MediaStreamTrackDataHolder.h 2026-02-23 14:40:55.707299200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/MediaStreamTrackDataHolder.h 2026-07-09 07:12:42.148795400 +0000 @@ -43,6 +43,7 @@ MediaStreamTrackDataHolder(const MediaStreamTrackDataHolder &) = delete; MediaStreamTrackDataHolder &operator=(const MediaStreamTrackDataHolder &) = delete; + WEBCORE_EXPORT std::unique_ptr copy() const; String trackId; String label; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/RealtimeIncomingAudioSource.cpp webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/RealtimeIncomingAudioSource.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/RealtimeIncomingAudioSource.cpp 2026-02-23 14:40:55.708299200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/RealtimeIncomingAudioSource.cpp 2026-07-09 07:12:42.148795400 +0000 @@ -49,7 +49,10 @@ RealtimeIncomingAudioSource::~RealtimeIncomingAudioSource() { - stop(); + // Subclasses must call stop() in their destructors to ensure the audio + // track sink is removed BEFORE derived members are destroyed. Otherwise, + // the OnData callback may access destroyed members on the audio thread. + ASSERT(!isProducingData()); m_audioTrack->UnregisterObserver(this); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.cpp webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.cpp 2026-02-23 14:40:55.709299300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.cpp 2026-07-09 07:12:42.148795400 +0000 @@ -73,7 +73,10 @@ RealtimeIncomingVideoSource::~RealtimeIncomingVideoSource() { - stop(); + // Subclasses must call stop() in their destructors to ensure the video + // track sink is removed BEFORE derived members are destroyed. Otherwise, + // the OnFrame callback may access destroyed members on the video thread. + ASSERT(!isProducingData()); m_videoTrack->UnregisterObserver(this); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/gstreamer/DesktopPortal.h webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/DesktopPortal.h --- webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/gstreamer/DesktopPortal.h 2026-02-23 14:40:55.713299300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/DesktopPortal.h 2026-07-09 07:12:42.148795400 +0000 @@ -38,6 +38,7 @@ WTF_DEPRECATED_MAKE_FAST_ALLOCATED(DesktopPortal); public: DesktopPortal(ASCIILiteral, GRefPtr&&); + virtual ~DesktopPortal() = default; GRefPtr getProperty(ASCIILiteral name); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/gstreamer/GStreamerCaptureDeviceManager.cpp webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/GStreamerCaptureDeviceManager.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/gstreamer/GStreamerCaptureDeviceManager.cpp 2026-03-04 09:43:16.440500700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/GStreamerCaptureDeviceManager.cpp 2026-07-09 07:12:42.152795300 +0000 @@ -342,7 +342,7 @@ #if GST_CHECK_VERSION(1, 28, 0) { auto bus = adoptGRef(gst_device_monitor_get_bus(m_deviceMonitor.get())); - [[maybe_unused]] auto message = adoptGRef(gst_bus_poll(bus.get(), GST_MESSAGE_DEVICE_MONITOR_STARTED, GST_CLOCK_TIME_NONE)); + [[maybe_unused]] auto message = adoptGRef(gst_bus_timed_pop_filtered(bus.get(), GST_CLOCK_TIME_NONE, GST_MESSAGE_DEVICE_MONITOR_STARTED)); GST_DEBUG_OBJECT(m_deviceMonitor.get(), "Device provider(s) successfully started"); } #endif diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/gstreamer/GStreamerIncomingTrackProcessor.h webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/GStreamerIncomingTrackProcessor.h --- webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/gstreamer/GStreamerIncomingTrackProcessor.h 2026-02-23 14:40:55.715299100 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/GStreamerIncomingTrackProcessor.h 2026-07-09 07:12:42.152795300 +0000 @@ -71,7 +71,7 @@ bool m_isDecoding { false }; IntSize m_videoSize; - double m_frameRate; + double m_frameRate { 0 }; uint64_t m_decodedVideoFrames { 0 }; uint64_t m_framesReceived { 0 }; uint64_t m_decodedKeyFrames { 0 }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp 2026-04-07 10:57:59.890994300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp 2026-07-09 07:12:42.152795300 +0000 @@ -797,7 +797,9 @@ if (timeStamp.isNaN()) m_frameRateStats = { now, 1 }; else if (now - timeStamp >= 1_s) { - gst_structure_set(m_stats.get(), "frames-per-second", G_TYPE_UINT, totalFramesSinceLastMeasurement + 1, nullptr); + auto delta = now - timeStamp; + double frameRate = (totalFramesSinceLastMeasurement + 1) / delta.seconds(); + gst_structure_set(m_stats.get(), "frames-per-second", G_TYPE_DOUBLE, frameRate, nullptr); m_frameRateStats = { now, 0 }; } else m_frameRateStats = { timeStamp, totalFramesSinceLastMeasurement + 1 }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/gstreamer/GStreamerWebRTCCommon.cpp webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/GStreamerWebRTCCommon.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/gstreamer/GStreamerWebRTCCommon.cpp 2026-01-20 14:08:46.444673300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/GStreamerWebRTCCommon.cpp 2026-07-09 07:12:42.152795300 +0000 @@ -48,7 +48,9 @@ } if (G_VALUE_TYPE(&value) == G_TYPE_INT) { + WTF_ALLOW_UNSAFE_BUFFER_USAGE_BEGIN; auto intSpec = G_PARAM_SPEC_INT(ptSpec); + WTF_ALLOW_UNSAFE_BUFFER_USAGE_END; if (pt > intSpec->maximum || pt < intSpec->minimum) { GST_ERROR_OBJECT(payloader.get(), "pt %d outside of valid range [%d, %d]", pt, intSpec->minimum, intSpec->maximum); return; @@ -58,7 +60,9 @@ } if (G_VALUE_TYPE(&value) == G_TYPE_UINT) { + WTF_ALLOW_UNSAFE_BUFFER_USAGE_BEGIN; auto uintSpec = G_PARAM_SPEC_UINT(ptSpec); + WTF_ALLOW_UNSAFE_BUFFER_USAGE_END; unsigned ptValue = static_cast(pt); if (ptValue > uintSpec->maximum || ptValue < uintSpec->minimum) { GST_ERROR_OBJECT(payloader.get(), "pt %u outside of valid range [%u, %u]", ptValue, uintSpec->minimum, uintSpec->maximum); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/gstreamer/RealtimeOutgoingMediaSourceGStreamer.cpp webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/RealtimeOutgoingMediaSourceGStreamer.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/gstreamer/RealtimeOutgoingMediaSourceGStreamer.cpp 2026-02-23 14:40:55.718299200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/RealtimeOutgoingMediaSourceGStreamer.cpp 2026-07-09 07:12:42.152795300 +0000 @@ -384,20 +384,52 @@ if (newTrack) trackPrivate = newTrack->privateTrack(); - if (m_outgoingSource) + if (m_outgoingSource) { webkitMediaStreamSrcReplaceTrack(WEBKIT_MEDIA_STREAM_SRC_CAST(m_outgoingSource.get()), RefPtr(trackPrivate)); - else { - if (trackPrivate) { - m_outgoingSource = webkitMediaStreamSrcNew(); - gst_bin_add(GST_BIN_CAST(m_bin.get()), m_outgoingSource.get()); - webkitMediaStreamSrcAddTrack(WEBKIT_MEDIA_STREAM_SRC_CAST(m_outgoingSource.get()), trackPrivate.get()); + auto srcPad = outgoingSourcePad(); + if (!gst_pad_is_linked(srcPad.get())) { gst_element_link(m_outgoingSource.get(), m_inputSelector.get()); gst_element_sync_state_with_parent(m_outgoingSource.get()); } - auto srcPad = outgoingSourcePad(); - auto activePad = adoptGRef(gst_pad_get_peer(srcPad.get())); - g_object_set(m_inputSelector.get(), "active-pad", activePad.get(), nullptr); + } else if (trackPrivate) { + m_outgoingSource = webkitMediaStreamSrcNew(); + gst_bin_add(GST_BIN_CAST(m_bin.get()), m_outgoingSource.get()); + webkitMediaStreamSrcAddTrack(WEBKIT_MEDIA_STREAM_SRC_CAST(m_outgoingSource.get()), trackPrivate.get()); + gst_element_link(m_outgoingSource.get(), m_inputSelector.get()); + gst_element_sync_state_with_parent(m_outgoingSource.get()); } + + auto srcPad = outgoingSourcePad(); + auto activePad = adoptGRef(gst_pad_get_peer(srcPad.get())); + RELEASE_ASSERT(activePad); + g_object_set(m_inputSelector.get(), "active-pad", activePad.get(), nullptr); + + if (m_transceiver) { + GRefPtr caps; + g_object_get(m_transceiver.get(), "codec-preferences", &caps.outPtr(), nullptr); + + m_pendingTrackId = trackPrivate ? trackPrivate->id() : emptyString(); + auto newCaps = adoptGRef(gst_caps_make_writable(caps.leakRef())); + gst_caps_map_in_place(newCaps.get(), [](auto*, auto* structure, gpointer userData) -> gboolean { + if (!gst_structure_has_field_typed(structure, "a-msid", G_TYPE_STRING)) [[unlikely]] + return TRUE; + + auto self = static_cast(userData); + if (self->m_pendingTrackId.isEmpty()) + gst_structure_remove_field(structure, "a-msid"); + else { + auto newMsid = makeString(self->m_mediaStreamId, ' ', self->m_pendingTrackId); + gst_structure_set(structure, "a-msid", G_TYPE_STRING, newMsid.utf8().data(), nullptr); + } + + return TRUE; + }, this); + g_object_freeze_notify(G_OBJECT(m_transceiver.get())); + g_object_set(m_transceiver.get(), "codec-preferences", newCaps.get(), nullptr); + m_pendingTrackId = emptyString(); + g_object_thaw_notify(G_OBJECT(m_transceiver.get())); + } + if (!newTrack) { m_isStopped = true; m_track = nullptr; @@ -405,6 +437,13 @@ } m_track = WTF::move(trackPrivate); + + const auto& webrtcSinkPad = pad(); + if (!webrtcSinkPad) + return; + if (!gst_pad_is_linked(webrtcSinkPad.get())) + return; + start(); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/gstreamer/RealtimeOutgoingMediaSourceGStreamer.h webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/RealtimeOutgoingMediaSourceGStreamer.h --- webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/gstreamer/RealtimeOutgoingMediaSourceGStreamer.h 2026-02-23 14:40:55.718299200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/gstreamer/RealtimeOutgoingMediaSourceGStreamer.h 2026-07-09 07:12:42.152795300 +0000 @@ -155,6 +155,8 @@ void stopUpdatingStats(); RefPtr getPacketizerForRid(const String&); + + String m_pendingTrackId { emptyString() }; }; } // namespace WebCore diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingAudioSourceLibWebRTC.cpp webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingAudioSourceLibWebRTC.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingAudioSourceLibWebRTC.cpp 2026-02-23 14:40:55.722299000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingAudioSourceLibWebRTC.cpp 2026-07-09 07:12:42.152795300 +0000 @@ -61,6 +61,11 @@ GST_DEBUG("Created incoming audio source with ID: %s", persistentID().utf8().data()); } +RealtimeIncomingAudioSourceLibWebRTC::~RealtimeIncomingAudioSourceLibWebRTC() +{ + stop(); +} + void RealtimeIncomingAudioSourceLibWebRTC::OnData(const void* audioData, int, int sampleRate, size_t numberOfChannels, size_t numberOfFrames) { #if GST_CHECK_VERSION(1, 22, 0) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingAudioSourceLibWebRTC.h webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingAudioSourceLibWebRTC.h --- webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingAudioSourceLibWebRTC.h 2026-02-23 14:40:55.722299000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingAudioSourceLibWebRTC.h 2026-07-09 07:12:42.152795300 +0000 @@ -38,6 +38,7 @@ class RealtimeIncomingAudioSourceLibWebRTC final : public RealtimeIncomingAudioSource { public: static Ref create(Ref&&, String&&); + ~RealtimeIncomingAudioSourceLibWebRTC(); private: RealtimeIncomingAudioSourceLibWebRTC(Ref&&, String&&); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.cpp webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.cpp 2026-02-23 14:40:55.723299300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.cpp 2026-07-09 07:12:42.152795300 +0000 @@ -62,6 +62,11 @@ GST_DEBUG("Created incoming video source with ID: %s", persistentID().utf8().data()); } +RealtimeIncomingVideoSourceLibWebRTC::~RealtimeIncomingVideoSourceLibWebRTC() +{ + stop(); +} + void RealtimeIncomingVideoSourceLibWebRTC::OnFrame(const webrtc::VideoFrame& frame) { if (!isProducingData()) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.h webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.h --- webkit2gtk-2.52.3/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.h 2026-02-23 14:40:55.723299300 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.h 2026-07-09 07:12:42.152795300 +0000 @@ -41,7 +41,7 @@ private: RealtimeIncomingVideoSourceLibWebRTC(Ref&&, String&&); - ~RealtimeIncomingVideoSourceLibWebRTC() { } + ~RealtimeIncomingVideoSourceLibWebRTC(); // rtc::VideoSinkInterface void OnFrame(const webrtc::VideoFrame&) final; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/mock/mediasource/MockBox.cpp webkit2gtk-2.52.5/Source/WebCore/platform/mock/mediasource/MockBox.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/mock/mediasource/MockBox.cpp 2026-01-20 14:08:46.477673000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/mock/mediasource/MockBox.cpp 2026-07-09 07:12:42.152795300 +0000 @@ -92,7 +92,7 @@ auto view = JSC::DataView::create(data, 0, data->byteLength()); int32_t timeValue = view->get(8, true); - int32_t timeScale = view->get(12, true); + uint32_t timeScale = view->get(12, true); m_duration = MediaTime(timeValue, timeScale); size_t offset = 16; @@ -120,7 +120,7 @@ ASSERT(m_length == 30); auto view = JSC::DataView::create(data, 0, data->byteLength()); - int32_t timeScale = view->get(8, true); + uint32_t timeScale = view->get(8, true); int32_t timeValue = view->get(12, true); m_presentationTimestamp = MediaTime(timeValue, timeScale); @@ -128,8 +128,8 @@ timeValue = view->get(16, true); m_decodeTimestamp = MediaTime(timeValue, timeScale); - timeValue = view->get(20, true); - m_duration = MediaTime(timeValue, timeScale); + uint32_t durationValue = view->get(20, true); + m_duration = MediaTime(durationValue, timeScale); m_trackID = view->get(24, true); m_flags = view->get(28, true); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/network/BlobData.cpp webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobData.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/network/BlobData.cpp 2026-02-23 14:40:55.733299000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobData.cpp 2026-07-09 07:12:42.152795300 +0000 @@ -39,6 +39,7 @@ BlobData::BlobData(const String& contentType) : m_contentType(contentType) { + ASSERT(isMainThread()); } const long long BlobDataItem::toEndOfFile = -1; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/network/BlobData.h webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobData.h --- webkit2gtk-2.52.3/Source/WebCore/platform/network/BlobData.h 2026-02-23 14:40:55.733299000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobData.h 2026-07-09 07:12:42.152795300 +0000 @@ -106,7 +106,7 @@ typedef Vector BlobDataItemList; -class BlobData : public ThreadSafeRefCounted { +class BlobData : public ThreadSafeRefCounted { public: static Ref create(const String& contentType) { diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/network/BlobDataFileReference.cpp webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobDataFileReference.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/network/BlobDataFileReference.cpp 2026-01-20 14:08:46.482673200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobDataFileReference.cpp 2026-07-09 07:12:42.152795300 +0000 @@ -35,6 +35,7 @@ : m_path(path) , m_replacementPath(replacementPath) { + ASSERT(isMainThread()); } BlobDataFileReference::~BlobDataFileReference() diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/network/BlobDataFileReference.h webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobDataFileReference.h --- webkit2gtk-2.52.3/Source/WebCore/platform/network/BlobDataFileReference.h 2026-02-23 14:40:55.733299000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobDataFileReference.h 2026-07-09 07:12:42.152795300 +0000 @@ -34,7 +34,7 @@ namespace WebCore { -class WEBCORE_EXPORT BlobDataFileReference : public RefCounted { +class WEBCORE_EXPORT BlobDataFileReference : public ThreadSafeRefCounted { public: static Ref create(const String& path, const String& replacementPath = { }) { diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/network/BlobResourceHandle.cpp webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobResourceHandle.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/network/BlobResourceHandle.cpp 2026-02-23 14:40:55.734299200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobResourceHandle.cpp 2026-07-09 07:12:42.152795300 +0000 @@ -272,7 +272,7 @@ void BlobResourceHandle::didReceiveResponse(ResourceResponse&& response) { client()->didReceiveResponseAsync(this, WTF::move(response), [this, protectedThis = Ref { *this }] { - buffer().resize(bufferSize); + resizeBuffer(bufferSize); readAsync(); }); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/network/BlobResourceHandleBase.cpp webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobResourceHandleBase.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/network/BlobResourceHandleBase.cpp 2026-02-23 14:40:55.734299200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobResourceHandleBase.cpp 2026-07-09 07:12:42.152795300 +0000 @@ -33,6 +33,7 @@ #include "ResourceRequest.h" #include "ResourceResponse.h" #include +#include namespace WebCore { @@ -43,6 +44,7 @@ BlobResourceHandleBase::BlobResourceHandleBase(bool async, RefPtr&& blobData) : m_blobData(WTF::move(blobData)) + , m_buffer(Box>::create()) { if (async) m_stream = makeUnique(*this); @@ -294,12 +296,25 @@ return consumeData(data); } +void BlobResourceHandleBase::resizeBuffer(size_t newSize) +{ + RELEASE_ASSERT(!m_isWritingIntoBuffer); + m_buffer->resize(newSize); +} + void BlobResourceHandleBase::readFileAsync(const BlobDataItem& item) { ASSERT(isMainThread()); if (m_isFileOpen) { - asyncStream()->read(buffer().mutableSpan()); + m_isWritingIntoBuffer = true; + asyncStream()->read(m_buffer, [weakThis = WeakPtr { *this }](int bytesRead) { + RefPtr protectedThis = weakThis.get(); + if (!protectedThis) + return; + protectedThis->m_isWritingIntoBuffer = false; + protectedThis->didRead(bytesRead); + }); return; } @@ -341,7 +356,7 @@ return; } - if (consumeData(m_buffer.subspan(0, bytesRead))) + if (consumeData(m_buffer->subspan(0, bytesRead))) readAsync(); } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/network/BlobResourceHandleBase.h webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobResourceHandleBase.h --- webkit2gtk-2.52.3/Source/WebCore/platform/network/BlobResourceHandleBase.h 2026-02-23 14:40:55.734299200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/network/BlobResourceHandleBase.h 2026-07-09 07:12:42.152795300 +0000 @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -73,8 +74,8 @@ WEBCORE_EXPORT BlobData* blobData() const; FileStream* syncStream() const; AsyncFileStream* asyncStream() const; - Vector& buffer() { return m_buffer; } - const Vector& buffer() const { return m_buffer; } + WEBCORE_EXPORT void resizeBuffer(size_t); + const Vector& buffer() const LIFETIME_BOUND { return *m_buffer; } private: void getSizeForNext(); @@ -85,6 +86,7 @@ void readFileAsync(const BlobDataItem&); void dispatchDidReceiveResponse(); void doStart(); + void didRead(int); // -1 in case of error. virtual void didReceiveResponse(ResourceResponse&&) = 0; virtual void didFail(Error) = 0; @@ -98,13 +100,13 @@ // FileStreamClient methods. WEBCORE_EXPORT void didOpen(bool) final; WEBCORE_EXPORT void didGetSize(long long) final; - WEBCORE_EXPORT void didRead(int) final; RefPtr m_blobData; // For Async or Sync loading. Variant, std::unique_ptr> m_stream; std::optional m_range; - Vector m_buffer; + bool m_isWritingIntoBuffer { false }; + const Box> m_buffer; Vector m_itemLengthList; uint64_t m_totalSize { 0 }; uint64_t m_totalRemainingSize { 0 }; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/network/HTTPHeaderMap.h webkit2gtk-2.52.5/Source/WebCore/platform/network/HTTPHeaderMap.h --- webkit2gtk-2.52.3/Source/WebCore/platform/network/HTTPHeaderMap.h 2026-02-23 14:40:55.736299000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/network/HTTPHeaderMap.h 2026-07-09 07:12:42.152795300 +0000 @@ -181,6 +181,18 @@ WEBCORE_EXPORT bool contains(HTTPHeaderName) const; WEBCORE_EXPORT bool remove(HTTPHeaderName); + // https://fetch.spec.whatwg.org/#request-body-header-name + // Content-Length is not a request-body-header name per spec, but is included + // here since in practice the body is always nulled alongside this call. + void removeRequestBodyHeaders() + { + remove(HTTPHeaderName::ContentEncoding); + remove(HTTPHeaderName::ContentLanguage); + remove(HTTPHeaderName::ContentLength); + remove(HTTPHeaderName::ContentLocation); + remove(HTTPHeaderName::ContentType); + } + // Instead of passing a string literal to any of these functions, just use a HTTPHeaderName instead. template String get(ASCIILiteral) const = delete; template void set(ASCIILiteral, const String&) = delete; diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/network/ParsedContentType.h webkit2gtk-2.52.5/Source/WebCore/platform/network/ParsedContentType.h --- webkit2gtk-2.52.3/Source/WebCore/platform/network/ParsedContentType.h 2026-02-23 14:40:55.738299100 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/network/ParsedContentType.h 2026-07-09 07:12:42.152795300 +0000 @@ -42,20 +42,20 @@ public: WEBCORE_EXPORT static std::optional create(const String&); ParsedContentType(ParsedContentType&&) = default; + ParsedContentType(const ParsedContentType&) = delete; String mimeType() const { return m_mimeType; } String charset() const; void setCharset(String&&); // Note that in the case of multiple values for the same name, the last value is returned. - String parameterValueForName(const String&) const; + WEBCORE_EXPORT String parameterValueForName(const String&) const; size_t parameterCount() const; WEBCORE_EXPORT String serialize() const; private: ParsedContentType(const String&); - ParsedContentType(const ParsedContentType&) = delete; ParsedContentType& operator=(const ParsedContentType&) = delete; bool parseContentType(); void setContentType(String&&); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/network/ResourceRequestBase.cpp webkit2gtk-2.52.5/Source/WebCore/platform/network/ResourceRequestBase.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/network/ResourceRequestBase.cpp 2026-02-23 14:40:55.740299000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/network/ResourceRequestBase.cpp 2026-07-09 07:12:42.152795300 +0000 @@ -148,17 +148,13 @@ return redirectResponse.httpStatusCode() == httpStatus303SeeOther; } -// https://fetch.spec.whatwg.org/#concept-http-redirect-fetch Step 11 +// https://fetch.spec.whatwg.org/#concept-http-redirect-fetch void ResourceRequestBase::redirectAsGETIfNeeded(const ResourceRequestBase &redirectRequest, const ResourceResponse& redirectResponse) { if (shouldUseGet(redirectRequest, redirectResponse)) { setHTTPMethod("GET"_s); setHTTPBody(nullptr); - m_requestData.m_httpHeaderFields.remove(HTTPHeaderName::ContentLength); - m_requestData.m_httpHeaderFields.remove(HTTPHeaderName::ContentLanguage); - m_requestData.m_httpHeaderFields.remove(HTTPHeaderName::ContentEncoding); - m_requestData.m_httpHeaderFields.remove(HTTPHeaderName::ContentLocation); - clearHTTPContentType(); + m_requestData.m_httpHeaderFields.removeRequestBodyHeaders(); } } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/network/soup/NetworkStorageSessionSoup.cpp webkit2gtk-2.52.5/Source/WebCore/platform/network/soup/NetworkStorageSessionSoup.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/network/soup/NetworkStorageSessionSoup.cpp 2026-02-23 14:40:55.758298900 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/network/soup/NetworkStorageSessionSoup.cpp 2026-07-09 07:12:42.156795300 +0000 @@ -878,7 +878,8 @@ { for (auto& host : hosts) { auto it = m_cookieChangeObservers.find(host); - ASSERT(it != m_cookieChangeObservers.end()); + if (it == m_cookieChangeObservers.end()) + continue; auto& observers = it->value; ASSERT(observers.contains(observer)); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/network/soup/SoupNetworkSession.cpp webkit2gtk-2.52.5/Source/WebCore/platform/network/soup/SoupNetworkSession.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/network/soup/SoupNetworkSession.cpp 2026-02-23 14:40:55.760299000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/network/soup/SoupNetworkSession.cpp 2026-07-09 07:12:42.156795300 +0000 @@ -103,9 +103,18 @@ static const int maxConnections = 256; static const int maxConnectionsPerHost = 6; + // libsoup's default idle-timeout is 60s. Raise it to 115s, matching + // Firefox's network.http.keep-alive.timeout default, to keep connections + // warm for same-origin renavigation within a browsing session. + // Firefox flags a problem with IIS7 servers' default timeout of 120s, so + // the timeout chosen is a little shorter to keep a reserve for cases + // when the packet is lost or delayed on the route. + static const int idleTimeout = 115; + m_soupSession = adoptGRef(soup_session_new_with_options( "max-conns", maxConnections, "max-conns-per-host", maxConnectionsPerHost, + "idle-timeout", idleTimeout, "timeout", 0, nullptr)); diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/rice/GRefPtrRice.h webkit2gtk-2.52.5/Source/WebCore/platform/rice/GRefPtrRice.h --- webkit2gtk-2.52.3/Source/WebCore/platform/rice/GRefPtrRice.h 2026-02-23 14:40:55.761299000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/rice/GRefPtrRice.h 2026-07-09 07:12:42.156795300 +0000 @@ -20,6 +20,7 @@ #pragma once #if USE(LIBRICE) +#include "RiceVersioning.h" #include #include @@ -31,9 +32,12 @@ WTF_DEFINE_GREF_TRAITS_INLINE(RiceComponent, rice_component_ref, rice_component_unref) WTF_DEFINE_GREF_TRAITS_INLINE(RiceUdpSocket, rice_udp_socket_ref, rice_udp_socket_unref) WTF_DEFINE_GREF_TRAITS_INLINE(RiceTlsConfig, rice_tls_config_ref, rice_tls_config_unref) -WTF_DEFINE_GREF_TRAITS_INLINE(RiceTurnConfig, rice_turn_config_ref, rice_turn_config_unref) WTF_DEFINE_GREF_TRAITS_INLINE(RiceTcpListener, rice_tcp_listener_ref, rice_tcp_listener_unref) +#if !RICE_CHECK_VERSION(0, 4, 0) +WTF_DEFINE_GREF_TRAITS_INLINE(RiceTurnConfig, rice_turn_config_ref, rice_turn_config_unref) +#endif + } // namespace WTF #endif // USE(LIBRICE) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/rice/GUniquePtrRice.h webkit2gtk-2.52.5/Source/WebCore/platform/rice/GUniquePtrRice.h --- webkit2gtk-2.52.3/Source/WebCore/platform/rice/GUniquePtrRice.h 2026-02-23 14:40:55.762216600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/rice/GUniquePtrRice.h 2026-07-09 07:12:42.156795300 +0000 @@ -21,6 +21,7 @@ #if USE(LIBRICE) +#include "RiceVersioning.h" #include #include @@ -29,6 +30,9 @@ WTF_DEFINE_GPTR_DELETER(RiceAddress, rice_address_free) WTF_DEFINE_GPTR_DELETER(RiceCandidate, rice_candidate_free) WTF_DEFINE_GPTR_DELETER(RiceCredentials, rice_credentials_free) +#if RICE_CHECK_VERSION(0, 4, 0) +WTF_DEFINE_GPTR_DELETER(RiceTurnConfig, rice_turn_config_free) +#endif } diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/rice/RiceUtilities.h webkit2gtk-2.52.5/Source/WebCore/platform/rice/RiceUtilities.h --- webkit2gtk-2.52.3/Source/WebCore/platform/rice/RiceUtilities.h 2026-03-20 08:14:20.381288000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/rice/RiceUtilities.h 2026-07-09 07:12:42.156795300 +0000 @@ -20,8 +20,8 @@ #pragma once #if USE(LIBRICE) - #include "GUniquePtrRice.h" +#include "RTCIceProtocol.h" #include "SharedMemory.h" #include #include @@ -29,13 +29,6 @@ #include #include -#ifndef RICE_CHECK_VERSION -#define RICE_CHECK_VERSION(major, minor, patch) \ - (RICE_PROTO_MAJOR > (major) || \ - (RICE_PROTO_MAJOR == (major) && RICE_PROTO_MINOR > (minor)) || \ - (RICE_PROTO_MAJOR == (major) && RICE_PROTO_MINOR == (minor) && RICE_PROTO_PATCH >= (patch))) -#endif - namespace WebCore { static inline String riceAddressToString(const RiceAddress* address, bool includePort = true) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/rice/RiceVersioning.h webkit2gtk-2.52.5/Source/WebCore/platform/rice/RiceVersioning.h --- webkit2gtk-2.52.3/Source/WebCore/platform/rice/RiceVersioning.h 1970-01-01 00:00:00.000000000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/rice/RiceVersioning.h 2026-07-09 07:12:42.156795300 +0000 @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2026 Igalia S.L. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#pragma once + +#if USE(LIBRICE) + +#include + +#ifndef RICE_CHECK_VERSION +#define RICE_CHECK_VERSION(major, minor, patch) \ + (RICE_PROTO_MAJOR > (major) || \ + (RICE_PROTO_MAJOR == (major) && RICE_PROTO_MINOR > (minor)) || \ + (RICE_PROTO_MAJOR == (major) && RICE_PROTO_MINOR == (minor) && RICE_PROTO_PATCH >= (patch))) +#endif + +#endif // USE(LIBRICE) diff -Nru webkit2gtk-2.52.3/Source/WebCore/platform/text/hyphen/HyphenationLibHyphen.cpp webkit2gtk-2.52.5/Source/WebCore/platform/text/hyphen/HyphenationLibHyphen.cpp --- webkit2gtk-2.52.3/Source/WebCore/platform/text/hyphen/HyphenationLibHyphen.cpp 2026-02-23 14:40:55.765298800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/platform/text/hyphen/HyphenationLibHyphen.cpp 2026-07-09 07:12:42.156795300 +0000 @@ -232,6 +232,9 @@ for (const auto& dictionaryPath : availableLocales().get(lowercaseLocaleIdentifier)) { RefPtr dictionary = TinyLRUCachePolicy>::cache().get(AtomString(dictionaryPath)); + if (!dictionary->libhyphenDictionary()) + continue; + char** replacements = nullptr; int* positions = nullptr; int* removedCharacterCounts = nullptr; diff -Nru webkit2gtk-2.52.3/Source/WebCore/rendering/EventRegion.cpp webkit2gtk-2.52.5/Source/WebCore/rendering/EventRegion.cpp --- webkit2gtk-2.52.3/Source/WebCore/rendering/EventRegion.cpp 2026-02-23 14:40:55.776298800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/rendering/EventRegion.cpp 2026-07-09 07:12:42.156795300 +0000 @@ -359,11 +359,12 @@ } auto finalRegionRectForTracking = enclosingIntRect(region.rectInLayerCoordinates); + auto originalIndex = i; for (auto& extraRegion : toAddAfterMerge) { auto extraRectForTracking = enclosingIntRect(extraRegion.rectInLayerCoordinates); // Do not insert a new region if it creates a duplicated Interaction Rect. if (finalRegionRectForTracking == extraRectForTracking) { - region.contentHint = m_interactionRectsAndContentHints.get(extraRectForTracking); + m_interactionRegions[originalIndex].contentHint = m_interactionRectsAndContentHints.get(extraRectForTracking); continue; } extraRegion.contentHint = m_interactionRectsAndContentHints.get(extraRectForTracking); diff -Nru webkit2gtk-2.52.3/Source/WebCore/rendering/OutlinePainter.cpp webkit2gtk-2.52.5/Source/WebCore/rendering/OutlinePainter.cpp --- webkit2gtk-2.52.3/Source/WebCore/rendering/OutlinePainter.cpp 2026-04-11 19:18:14.681157800 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/rendering/OutlinePainter.cpp 2026-07-09 07:12:42.160795200 +0000 @@ -45,6 +45,7 @@ #include "RenderBlockFlow.h" #include "RenderChildIterator.h" #include "RenderElementInlines.h" +#include "RenderElementStyleInlines.h" #include "RenderInline.h" #include "RenderListBox.h" #include "RenderObjectDocument.h" diff -Nru webkit2gtk-2.52.3/Source/WebCore/rendering/RenderBlockFlow.cpp webkit2gtk-2.52.5/Source/WebCore/rendering/RenderBlockFlow.cpp --- webkit2gtk-2.52.3/Source/WebCore/rendering/RenderBlockFlow.cpp 2026-02-23 14:40:55.793298700 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/rendering/RenderBlockFlow.cpp 2026-07-09 07:12:42.164795200 +0000 @@ -459,13 +459,17 @@ if (!style().hasInlineColumnAxis()) return true; - // Non-auto column-width or column-count always initiates MultiColumnFlow. - if (!style().columnWidth().isAuto() || !style().columnCount().isAuto()) + // Non-auto column-width always initiates MultiColumnFlow. + if (!style().columnWidth().isAuto()) return true; if (desiredColumnCount) return desiredColumnCount.value() > 1; + // column-count > 1 always initiates MultiColumnFlow. + if (auto columnCount = style().columnCount().tryValue()) + return columnCount->value > 1; + ASSERT_NOT_REACHED(); return false; } diff -Nru webkit2gtk-2.52.3/Source/WebCore/rendering/RenderBox.cpp webkit2gtk-2.52.5/Source/WebCore/rendering/RenderBox.cpp --- webkit2gtk-2.52.3/Source/WebCore/rendering/RenderBox.cpp 2026-04-10 09:30:55.984680200 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/rendering/RenderBox.cpp 2026-07-09 07:12:42.164795200 +0000 @@ -31,6 +31,7 @@ #include "BorderPainter.h" #include "BorderShape.h" #include "ContainerNodeInlines.h" +#include "CSSFilter.h" #include "CSSFontSelector.h" #include "Document.h" #include "EditingInlines.h" @@ -791,7 +792,7 @@ auto heightFromAspectRatio = blockSizeFromAspectRatio(borderAndPaddingLogicalWidth(), borderAndPaddingLogicalHeight(), style().logicalAspectRatio(), style().boxSizingForAspectRatio(), logicalWidth(), style().aspectRatio(), isRenderReplaced()) - borderAndPaddingLogicalHeight(); if (firstChild()) heightFromAspectRatio = std::max(heightFromAspectRatio, *intrinsicContentHeight); - logicalMinHeight = Style::MinimumSize::Fixed { heightFromAspectRatio }; + logicalMinHeight = Style::MinimumSize::Fixed { heightFromAspectRatio / styleToUse.usedZoomForLength().value }; minimumSizeType = MinimumSizeIsAutomaticContentBased::Yes; } if (logicalMinHeight.isMinContent() || logicalMinHeight.isMaxContent()) @@ -3668,9 +3669,6 @@ if (isPerpendicularWritingMode) return false; - if (containingBlock.isFlexItem() && downcast(containingBlock.parent())->canUseFlexItemForPercentageResolution(containingBlock)) - return false; - // Anonymous blocks should not impede percentage resolution on a child. // Examples of such anonymous blocks are blocks wrapped around inlines that // have block siblings (from the CSS spec) and multicol flow threads (an @@ -3683,7 +3681,21 @@ // For quirks mode, we skip most auto-height containing blocks when computing // percentages. - return document().inQuirksMode() && !containingBlock.isRenderTableCell() && !containingBlock.isOutOfFlowPositioned() && !containingBlock.isRenderGrid() && !containingBlock.isFlexibleBoxIncludingDeprecated() && containingBlock.style().logicalHeight().isAuto(); + auto shouldSkipContainingBlockInQuirksMode = [&] { + ASSERT(document().inQuirksMode()); + if (containingBlock.isFlexItem() && downcast(containingBlock.parent())->canUseFlexItemForPercentageResolution(containingBlock)) + return false; + if (containingBlock.isRenderTableCell()) + return false; + if (containingBlock.isOutOfFlowPositioned()) + return false; + if (containingBlock.isRenderGrid()) + return false; + if (containingBlock.isFlexibleBoxIncludingDeprecated()) + return false; + return containingBlock.style().logicalHeight().isAuto(); + }; + return document().inQuirksMode() && shouldSkipContainingBlockInQuirksMode(); } static bool tableCellShouldHaveZeroInitialSize(const RenderTableCell& tableCell, const RenderBox& child, bool scrollsOverflowY) @@ -4414,7 +4426,9 @@ bool hasBoxShadow = style().hasBoxShadow(); bool hasBorderImageOutsets = style().hasBorderImageOutsets(); bool hasOutline = outlineStyleForRepaint().hasOutlineInVisualOverflow(); - if (!hasBoxShadow && !hasBorderImageOutsets && !hasOutline) + bool hasInflatingFilters = hasFilter() && !filterOutsets().isZero(); + + if (!hasBoxShadow && !hasBorderImageOutsets && !hasOutline && !hasInflatingFilters) return; addVisualOverflow(applyVisualEffectOverflow(borderBoxRect())); @@ -4423,7 +4437,8 @@ fragmentedFlow->addFragmentsVisualEffectOverflow(*this); } -static void convertOutsetsToOverflowCoordinates(LayoutBoxExtent& outsets, WritingMode writingMode) +template +static void convertOutsetsToOverflowCoordinates(RectEdges& outsets, WritingMode writingMode) { switch (writingMode.blockDirection()) { case FlowDirection::TopToBottom: @@ -4438,7 +4453,7 @@ } } -LayoutRect RenderBox::applyVisualEffectOverflow(const LayoutRect& borderBox) const +LayoutRect RenderBox::applyVisualEffectOverflow(const LayoutRect& borderBox, EnumSet options) const { LayoutUnit overflowMinX = borderBox.x(); LayoutUnit overflowMaxX = borderBox.maxX(); @@ -4471,12 +4486,24 @@ } if (outlineStyleForRepaint().hasOutlineInVisualOverflow()) { - LayoutUnit outlineSize { outlineStyleForRepaint().usedOutlineSize() }; + auto outlineSize = LayoutUnit { outlineStyleForRepaint().usedOutlineSize() }; + overflowMinX = std::min(overflowMinX, borderBox.x() - outlineSize); overflowMaxX = std::max(overflowMaxX, borderBox.maxX() + outlineSize); overflowMinY = std::min(overflowMinY, borderBox.y() - outlineSize); overflowMaxY = std::max(overflowMaxY, borderBox.maxY() + outlineSize); } + + if (hasFilter() && !options.contains(VisualEffectOverflowOption::ExcludeFilterOutsets)) { + auto outsets = filterOutsets(); + convertOutsetsToOverflowCoordinates(outsets, writingMode()); + + overflowMinX = std::min(overflowMinX, borderBox.x() - outsets.left()); + overflowMaxX = std::max(overflowMaxX, borderBox.maxX() + outsets.right()); + overflowMinY = std::min(overflowMinY, borderBox.y() - outsets.top()); + overflowMaxY = std::max(overflowMaxY, borderBox.maxY() + outsets.bottom()); + } + // Add in the final overflow with shadows and outsets combined. return LayoutRect(overflowMinX, overflowMinY, overflowMaxX - overflowMinX, overflowMaxY - overflowMinY); } @@ -4566,6 +4593,14 @@ addVisualOverflow(*childVisualOverflowRect); } +bool RenderBox::hasLayoutOverflow() const +{ + if (!m_overflow) + return false; + + return !flippedClientBoxRect().contains(m_overflow->layoutOverflowRect()); +} + LayoutOptionalOutsets RenderBox::allowedLayoutOverflow() const { LayoutOptionalOutsets allowance; diff -Nru webkit2gtk-2.52.3/Source/WebCore/rendering/RenderBox.h webkit2gtk-2.52.5/Source/WebCore/rendering/RenderBox.h --- webkit2gtk-2.52.3/Source/WebCore/rendering/RenderBox.h 2026-02-23 14:40:55.794299000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/rendering/RenderBox.h 2026-07-09 07:12:42.164795200 +0000 @@ -156,6 +156,7 @@ // but it is on the right in vertical-rl. WEBCORE_EXPORT LayoutRect flippedClientBoxRect() const; LayoutRect layoutOverflowRect() const { return m_overflow ? m_overflow->layoutOverflowRect() : flippedClientBoxRect(); } + bool hasLayoutOverflow() const; inline LayoutUnit logicalLeftLayoutOverflow() const; inline LayoutUnit logicalRightLayoutOverflow() const; @@ -171,7 +172,10 @@ RenderOverflow& ensureOverflow(); void addVisualEffectOverflow(); - LayoutRect applyVisualEffectOverflow(const LayoutRect&) const; + enum class VisualEffectOverflowOption : uint8_t { + ExcludeFilterOutsets, + }; + LayoutRect applyVisualEffectOverflow(const LayoutRect&, EnumSet = { }) const; enum class ComputeOverflowOptions { None, diff -Nru webkit2gtk-2.52.3/Source/WebCore/rendering/RenderElement.cpp webkit2gtk-2.52.5/Source/WebCore/rendering/RenderElement.cpp --- webkit2gtk-2.52.3/Source/WebCore/rendering/RenderElement.cpp 2026-04-10 09:30:55.986680000 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/rendering/RenderElement.cpp 2026-07-09 07:12:42.168795000 +0000 @@ -1348,6 +1348,18 @@ clearNeedsLayout(); } +IntBoxExtent RenderElement::filterOutsets() const +{ + if (!hasFilter()) + return { }; + + if (auto outsets = style().filter().outsets()) + return *outsets; + + // FIXME: Need to compute outsets for reference filters: webkit.org/b/237538. + return { }; +} + template static bool mustRepaintFillLayers(const RenderElement& renderer, const FillLayers& layers) { // Nobody will use multiple layers without wanting fancy positioning. @@ -1394,10 +1406,13 @@ if (oldClippedOverflowRect.isEmpty() && newClippedOverflowRect.isEmpty()) return true; - auto mustRepaintBackgroundOrBorderOnSizeChange = [&](LayoutRect oldOutlineBounds, LayoutRect newOutlineBounds) { + auto mustFullRepaintOnSizeChange = [&](LayoutRect oldOutlineBounds, LayoutRect newOutlineBounds) { if (hasMask() && mustRepaintFillLayers(*this, style().maskLayers())) return true; + if (hasFilter() && !filterOutsets().isZero()) + return true; + if (style().hasBorderRadius()) { // If the border radius changed, repaints at style change time will take care of that. // This code is attempting to detect whether border-radius constraining based on box size @@ -1441,7 +1456,7 @@ // If our outline bounds rect resized (as a proxy for a border box resize), // we have to repaint if we paint content that scales with the size. - if (oldRects.outlineBoundsRect->size() != newRects.outlineBoundsRect->size() && mustRepaintBackgroundOrBorderOnSizeChange(*oldRects.outlineBoundsRect, *newRects.outlineBoundsRect)) + if (oldRects.outlineBoundsRect->size() != newRects.outlineBoundsRect->size() && mustFullRepaintOnSizeChange(*oldRects.outlineBoundsRect, *newRects.outlineBoundsRect)) return true; return false; diff -Nru webkit2gtk-2.52.3/Source/WebCore/rendering/RenderElement.h webkit2gtk-2.52.5/Source/WebCore/rendering/RenderElement.h --- webkit2gtk-2.52.3/Source/WebCore/rendering/RenderElement.h 2026-03-03 21:30:17.045498600 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/rendering/RenderElement.h 2026-07-09 07:12:42.168795000 +0000 @@ -22,6 +22,7 @@ #pragma once +#include #include #include #include @@ -225,6 +226,8 @@ inline bool hasBlendMode() const; // Defined in RenderElementStyleInlines.h. inline bool hasShapeOutside() const; // Defined in RenderElementStyleInlines.h. + IntBoxExtent filterOutsets() const; + #if HAVE(CORE_MATERIAL) inline bool hasAppleVisualEffect() const; // Defined in RenderElementStyleInlines.h. inline bool hasAppleVisualEffectRequiringBackdropFilter() const; // Defined in RenderElementStyleInlines.h. diff -Nru webkit2gtk-2.52.3/Source/WebCore/rendering/RenderFlexibleBox.cpp webkit2gtk-2.52.5/Source/WebCore/rendering/RenderFlexibleBox.cpp --- webkit2gtk-2.52.3/Source/WebCore/rendering/RenderFlexibleBox.cpp 2026-04-11 19:17:36.032065900 +0000 +++ webkit2gtk-2.52.5/Source/WebCore/rendering/RenderFlexibleBox.cpp 2026-07-09 07:12:42.168795000 +0000 @@ -2350,7 +2350,7 @@ // skipped for percentage height calculations in RenderBox::computePercentageLogicalHeight() and thus // addPercentHeightDescendant() is never called for them. This means that this method would always wrongly // return false for a child of a